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