xref: /unit/src/nxt_sockaddr.h (revision 0)
1*0Sigor@sysoev.ru 
2*0Sigor@sysoev.ru /*
3*0Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
4*0Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
5*0Sigor@sysoev.ru  */
6*0Sigor@sysoev.ru 
7*0Sigor@sysoev.ru #ifndef _NXT_SOCKADDR_H_INCLUDED_
8*0Sigor@sysoev.ru #define _NXT_SOCKADDR_H_INCLUDED_
9*0Sigor@sysoev.ru 
10*0Sigor@sysoev.ru 
11*0Sigor@sysoev.ru /*
12*0Sigor@sysoev.ru  * The nxt_sockaddr_t should be allocated using nxt_sockaddr_alloc()
13*0Sigor@sysoev.ru  * with actual "struct sockaddr_..." size:
14*0Sigor@sysoev.ru  *    nxt_sockaddr_alloc(pool, sizeof(struct sockaddr_in))
15*0Sigor@sysoev.ru  */
16*0Sigor@sysoev.ru 
17*0Sigor@sysoev.ru struct nxt_sockaddr_s {
18*0Sigor@sysoev.ru     /*
19*0Sigor@sysoev.ru      * A sockaddr textual representation is optional and may be in two forms:
20*0Sigor@sysoev.ru      * with port or without port.  If a nxt_sockaddr_t is intended to listen(),
21*0Sigor@sysoev.ru      * bind() or connect() then the textual representation must be present and
22*0Sigor@sysoev.ru      * must include the port.  nxt_event_conn_accept() creates a textual
23*0Sigor@sysoev.ru      * representation without the port.
24*0Sigor@sysoev.ru      */
25*0Sigor@sysoev.ru     u_char                        *text;
26*0Sigor@sysoev.ru 
27*0Sigor@sysoev.ru     /*
28*0Sigor@sysoev.ru      * text_len, socket type and socklen are stored
29*0Sigor@sysoev.ru      * together on 64-bit platforms without sockaddr.sa_len.
30*0Sigor@sysoev.ru      */
31*0Sigor@sysoev.ru     uint16_t                      text_len;
32*0Sigor@sysoev.ru     uint16_t                      type;
33*0Sigor@sysoev.ru #if !(NXT_SOCKADDR_SA_LEN)
34*0Sigor@sysoev.ru     socklen_t                     _socklen;
35*0Sigor@sysoev.ru #endif
36*0Sigor@sysoev.ru 
37*0Sigor@sysoev.ru     union {
38*0Sigor@sysoev.ru         struct sockaddr           sockaddr;
39*0Sigor@sysoev.ru         struct sockaddr_in        sockaddr_in;
40*0Sigor@sysoev.ru #if (NXT_INET6)
41*0Sigor@sysoev.ru         struct sockaddr_in6       sockaddr_in6;
42*0Sigor@sysoev.ru #endif
43*0Sigor@sysoev.ru #if (NXT_HAVE_UNIX_DOMAIN)
44*0Sigor@sysoev.ru         struct sockaddr_un        sockaddr_un;
45*0Sigor@sysoev.ru #endif
46*0Sigor@sysoev.ru     } u;
47*0Sigor@sysoev.ru };
48*0Sigor@sysoev.ru 
49*0Sigor@sysoev.ru 
50*0Sigor@sysoev.ru typedef struct {
51*0Sigor@sysoev.ru     nxt_job_resolve_t             resolve;
52*0Sigor@sysoev.ru     nxt_str_t                     addr;
53*0Sigor@sysoev.ru 
54*0Sigor@sysoev.ru     uint8_t                       wildcard;   /* 1 bit */
55*0Sigor@sysoev.ru     uint8_t                       no_port;    /* 1 bit */
56*0Sigor@sysoev.ru } nxt_job_sockaddr_parse_t;
57*0Sigor@sysoev.ru 
58*0Sigor@sysoev.ru 
59*0Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_alloc(nxt_mem_pool_t *mp, socklen_t len)
60*0Sigor@sysoev.ru     NXT_MALLOC_LIKE;
61*0Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_create(nxt_mem_pool_t *mp,
62*0Sigor@sysoev.ru     struct sockaddr *sockaddr, socklen_t len)
63*0Sigor@sysoev.ru     NXT_MALLOC_LIKE;
64*0Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_copy(nxt_mem_pool_t *mp,
65*0Sigor@sysoev.ru     nxt_sockaddr_t *src)
66*0Sigor@sysoev.ru     NXT_MALLOC_LIKE;
67*0Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_getsockname(nxt_mem_pool_t *mp, nxt_socket_t s)
68*0Sigor@sysoev.ru     NXT_MALLOC_LIKE;
69*0Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_sockaddr_text(nxt_mem_pool_t *mp, nxt_sockaddr_t *sa,
70*0Sigor@sysoev.ru     nxt_bool_t port);
71*0Sigor@sysoev.ru 
72*0Sigor@sysoev.ru 
73*0Sigor@sysoev.ru #if (NXT_SOCKADDR_SA_LEN)
74*0Sigor@sysoev.ru 
75*0Sigor@sysoev.ru #define                                                                       \
76*0Sigor@sysoev.ru nxt_socklen_set(sa, len)                                                      \
77*0Sigor@sysoev.ru     (sa)->u.sockaddr.sa_len = (socklen_t) (len)
78*0Sigor@sysoev.ru 
79*0Sigor@sysoev.ru 
80*0Sigor@sysoev.ru #define                                                                       \
81*0Sigor@sysoev.ru nxt_socklen(sa)                                                               \
82*0Sigor@sysoev.ru     ((sa)->u.sockaddr.sa_len)
83*0Sigor@sysoev.ru 
84*0Sigor@sysoev.ru #else
85*0Sigor@sysoev.ru 
86*0Sigor@sysoev.ru #define                                                                       \
87*0Sigor@sysoev.ru nxt_socklen_set(sa, len)                                                      \
88*0Sigor@sysoev.ru     (sa)->_socklen = (socklen_t) (len)
89*0Sigor@sysoev.ru 
90*0Sigor@sysoev.ru 
91*0Sigor@sysoev.ru #define                                                                       \
92*0Sigor@sysoev.ru nxt_socklen(sa)                                                               \
93*0Sigor@sysoev.ru     ((sa)->_socklen)
94*0Sigor@sysoev.ru 
95*0Sigor@sysoev.ru #endif
96*0Sigor@sysoev.ru 
97*0Sigor@sysoev.ru 
98*0Sigor@sysoev.ru NXT_EXPORT uint32_t nxt_sockaddr_port(nxt_sockaddr_t *sa);
99*0Sigor@sysoev.ru NXT_EXPORT nxt_bool_t nxt_sockaddr_cmp(nxt_sockaddr_t *sa1,
100*0Sigor@sysoev.ru     nxt_sockaddr_t *sa2);
101*0Sigor@sysoev.ru NXT_EXPORT size_t nxt_sockaddr_ntop(nxt_sockaddr_t *sa, u_char *buf,
102*0Sigor@sysoev.ru     u_char *end,
103*0Sigor@sysoev.ru     nxt_bool_t port);
104*0Sigor@sysoev.ru NXT_EXPORT void nxt_job_sockaddr_parse(nxt_job_sockaddr_parse_t *jbs);
105*0Sigor@sysoev.ru NXT_EXPORT in_addr_t nxt_inet_addr(u_char *buf, size_t len);
106*0Sigor@sysoev.ru #if (NXT_INET6)
107*0Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_inet6_addr(struct in6_addr *in6_addr, u_char *buf,
108*0Sigor@sysoev.ru     size_t len);
109*0Sigor@sysoev.ru #endif
110*0Sigor@sysoev.ru 
111*0Sigor@sysoev.ru #if (NXT_HAVE_UNIX_DOMAIN)
112*0Sigor@sysoev.ru #define nxt_unix_addr_path_len(sa)                                            \
113*0Sigor@sysoev.ru     (nxt_socklen(sa) - offsetof(struct sockaddr_un, sun_path))
114*0Sigor@sysoev.ru #endif
115*0Sigor@sysoev.ru 
116*0Sigor@sysoev.ru 
117*0Sigor@sysoev.ru #define NXT_INET_ADDR_STR_LEN     (sizeof("255.255.255.255") - 1)
118*0Sigor@sysoev.ru 
119*0Sigor@sysoev.ru #define NXT_INET6_ADDR_STR_LEN                                                \
120*0Sigor@sysoev.ru     (sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") - 1)
121*0Sigor@sysoev.ru 
122*0Sigor@sysoev.ru #define NXT_UNIX_ADDR_STR_LEN                                                 \
123*0Sigor@sysoev.ru     ((sizeof("unix:") - 1)                                                    \
124*0Sigor@sysoev.ru      + (sizeof(struct sockaddr_un) - offsetof(struct sockaddr_un, sun_path)))
125*0Sigor@sysoev.ru 
126*0Sigor@sysoev.ru 
127*0Sigor@sysoev.ru #if (NXT_HAVE_UNIX_DOMAIN)
128*0Sigor@sysoev.ru #define NXT_SOCKADDR_STR_LEN      NXT_UNIX_ADDR_STR_LEN
129*0Sigor@sysoev.ru 
130*0Sigor@sysoev.ru #elif (NXT_INET6)
131*0Sigor@sysoev.ru #define NXT_SOCKADDR_STR_LEN      NXT_INET6_ADDR_STR_LEN
132*0Sigor@sysoev.ru 
133*0Sigor@sysoev.ru #else
134*0Sigor@sysoev.ru #define NXT_SOCKADDR_STR_LEN      NXT_INET_ADDR_STR_LEN
135*0Sigor@sysoev.ru #endif
136*0Sigor@sysoev.ru 
137*0Sigor@sysoev.ru 
138*0Sigor@sysoev.ru #if (NXT_INET6)
139*0Sigor@sysoev.ru #define NXT_SOCKPORT_STR_LEN      (sizeof("[]:65535") - 1)
140*0Sigor@sysoev.ru 
141*0Sigor@sysoev.ru #else
142*0Sigor@sysoev.ru #define NXT_SOCKPORT_STR_LEN      (sizeof(":65535") - 1)
143*0Sigor@sysoev.ru #endif
144*0Sigor@sysoev.ru 
145*0Sigor@sysoev.ru 
146*0Sigor@sysoev.ru nxt_inline size_t
147*0Sigor@sysoev.ru nxt_sockaddr_text_len(nxt_sockaddr_t *sa)
148*0Sigor@sysoev.ru {
149*0Sigor@sysoev.ru     switch (sa->u.sockaddr.sa_family) {
150*0Sigor@sysoev.ru 
151*0Sigor@sysoev.ru #if (NXT_INET6)
152*0Sigor@sysoev.ru     case AF_INET6:
153*0Sigor@sysoev.ru         return NXT_INET6_ADDR_STR_LEN;
154*0Sigor@sysoev.ru #endif
155*0Sigor@sysoev.ru 
156*0Sigor@sysoev.ru #if (NXT_HAVE_UNIX_DOMAIN)
157*0Sigor@sysoev.ru     case AF_UNIX:
158*0Sigor@sysoev.ru         return NXT_UNIX_ADDR_STR_LEN;
159*0Sigor@sysoev.ru #endif
160*0Sigor@sysoev.ru 
161*0Sigor@sysoev.ru     default:
162*0Sigor@sysoev.ru         return NXT_INET_ADDR_STR_LEN;
163*0Sigor@sysoev.ru     }
164*0Sigor@sysoev.ru }
165*0Sigor@sysoev.ru 
166*0Sigor@sysoev.ru 
167*0Sigor@sysoev.ru #endif /* _NXT_SOCKADDR_H_INCLUDED_ */
168