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