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 /* 18 * A textual sockaddr representation is stored after struct sockaddr union 19 * and allocated as a whole. 20 */ 21 22 struct nxt_sockaddr_s { 23 /* Socket type: SOCKS_STREAM, SOCK_DGRAM, etc. */ 24 uint8_t type; 25 /* Size of struct sockaddr. */ 26 uint8_t socklen; 27 /* 28 * Textual sockaddr representation, e.g.: "127.0.0.1:8000", 29 * "[::1]:8000", and "unix:/path/to/socket". 30 */ 31 uint8_t start; 32 uint8_t length; 33 /* 34 * Textual address representation, e.g: "127.0.0.1", "::1", 35 * and "unix:/path/to/socket". 36 */ 37 uint8_t address_start; 38 uint8_t address_length; 39 /* 40 * Textual port representation, e.g. "8000". 41 * Port length is (start + length) - port_start. 42 */ 43 uint8_t port_start; 44 45 /* A cache hist used to place sockaddr into appropriate free list. */ 46 uint8_t cache_hint; 47 48 union { 49 struct sockaddr sockaddr; 50 struct sockaddr_in sockaddr_in; 51 #if (NXT_INET6) 52 struct sockaddr_in6 sockaddr_in6; 53 #endif 54 #if (NXT_HAVE_UNIX_DOMAIN) 55 struct sockaddr_un sockaddr_un; 56 #endif 57 } u; 58 }; 59 60 61 nxt_sockaddr_t *nxt_sockaddr_cache_alloc(nxt_event_engine_t *engine, 62 nxt_listen_socket_t *ls); 63 void nxt_sockaddr_cache_free(nxt_event_engine_t *engine, nxt_conn_t *c); 64 65 NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_alloc(nxt_mp_t *mp, socklen_t socklen, 66 size_t address_length) 67 NXT_MALLOC_LIKE; 68 NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_create(nxt_mp_t *mp, 69 struct sockaddr *sockaddr, socklen_t socklen, size_t address_length) 70 NXT_MALLOC_LIKE; 71 NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_copy(nxt_mp_t *mp, nxt_sockaddr_t *src) 72 NXT_MALLOC_LIKE; 73 NXT_EXPORT nxt_sockaddr_t *nxt_getsockname(nxt_task_t *task, nxt_mp_t *mp, 74 nxt_socket_t s) 75 NXT_MALLOC_LIKE; 76 NXT_EXPORT void nxt_sockaddr_text(nxt_sockaddr_t *sa); 77 78 79 NXT_EXPORT uint32_t nxt_sockaddr_port_number(nxt_sockaddr_t *sa); 80 NXT_EXPORT nxt_bool_t nxt_sockaddr_cmp(nxt_sockaddr_t *sa1, 81 nxt_sockaddr_t *sa2); 82 NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_parse(nxt_mp_t *mp, nxt_str_t *addr); 83 NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_parse_optport(nxt_mp_t *mp, 84 nxt_str_t *addr); 85 NXT_EXPORT in_addr_t nxt_inet_addr(u_char *buf, size_t len); 86 #if (NXT_INET6) 87 NXT_EXPORT nxt_int_t nxt_inet6_addr(struct in6_addr *in6_addr, u_char *buf, 88 size_t len); 89 #endif 90 NXT_EXPORT nxt_bool_t nxt_inet6_probe(nxt_str_t *addr); 91 92 93 #define NXT_INET_ADDR_STR_LEN nxt_length("255.255.255.255:65535") 94 95 #define NXT_INET6_ADDR_STR_LEN \ 96 nxt_length("[ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]:65535") 97 98 99 #define nxt_sockaddr_size(sa) \ 100 (offsetof(nxt_sockaddr_t, u) + sa->socklen + sa->length) 101 #define nxt_sockaddr_start(sa) nxt_pointer_to(sa, (sa)->start) 102 #define nxt_sockaddr_address(sa) nxt_pointer_to(sa, (sa)->address_start) 103 #define nxt_sockaddr_port(sa) nxt_pointer_to(sa, (sa)->port_start) 104 #define nxt_sockaddr_port_length(sa) \ 105 (((sa)->start + (sa)->length) - (sa)->port_start) 106 107 108 #endif /* _NXT_SOCKADDR_H_INCLUDED_ */ 109