10Sigor@sysoev.ru 20Sigor@sysoev.ru /* 30Sigor@sysoev.ru * Copyright (C) Igor Sysoev 40Sigor@sysoev.ru * Copyright (C) NGINX, Inc. 50Sigor@sysoev.ru */ 60Sigor@sysoev.ru 70Sigor@sysoev.ru #ifndef _NXT_SOCKADDR_H_INCLUDED_ 80Sigor@sysoev.ru #define _NXT_SOCKADDR_H_INCLUDED_ 90Sigor@sysoev.ru 100Sigor@sysoev.ru 110Sigor@sysoev.ru /* 120Sigor@sysoev.ru * The nxt_sockaddr_t should be allocated using nxt_sockaddr_alloc() 130Sigor@sysoev.ru * with actual "struct sockaddr_..." size: 140Sigor@sysoev.ru * nxt_sockaddr_alloc(pool, sizeof(struct sockaddr_in)) 150Sigor@sysoev.ru */ 160Sigor@sysoev.ru 17*13Sigor@sysoev.ru /* 18*13Sigor@sysoev.ru * A textual sockaddr representation is stored after struct sockaddr union 19*13Sigor@sysoev.ru * and allocated as a whole. 20*13Sigor@sysoev.ru */ 210Sigor@sysoev.ru 22*13Sigor@sysoev.ru struct nxt_sockaddr_s { 23*13Sigor@sysoev.ru /* Socket type: SOCKS_STREAM, SOCK_DGRAM, etc. */ 24*13Sigor@sysoev.ru uint8_t type; 25*13Sigor@sysoev.ru /* Size of struct sockaddr. */ 26*13Sigor@sysoev.ru uint8_t socklen; 270Sigor@sysoev.ru /* 28*13Sigor@sysoev.ru * Textual sockaddr representation, e.g.: "127.0.0.1:8000", 29*13Sigor@sysoev.ru * "[::1]:8000", and "unix:/path/to/socket". 300Sigor@sysoev.ru */ 31*13Sigor@sysoev.ru uint8_t start; 32*13Sigor@sysoev.ru uint8_t length; 33*13Sigor@sysoev.ru /* 34*13Sigor@sysoev.ru * Textual address representation, e.g: "127.0.0.1", "::1", 35*13Sigor@sysoev.ru * and "unix:/path/to/socket". 36*13Sigor@sysoev.ru */ 37*13Sigor@sysoev.ru uint8_t address_start; 38*13Sigor@sysoev.ru uint8_t address_length; 39*13Sigor@sysoev.ru /* 40*13Sigor@sysoev.ru * Textual port representation, e.g. "8000". 41*13Sigor@sysoev.ru * Port length is length - port_start. 42*13Sigor@sysoev.ru */ 43*13Sigor@sysoev.ru uint8_t port_start; 44*13Sigor@sysoev.ru /* 45*13Sigor@sysoev.ru * Size of the whole structure: struct sockaddr union and maximal textual 46*13Sigor@sysoev.ru * representation, used to place sockaddr into appropriate free list. 47*13Sigor@sysoev.ru */ 48*13Sigor@sysoev.ru uint8_t sockaddr_size; 490Sigor@sysoev.ru 500Sigor@sysoev.ru union { 510Sigor@sysoev.ru struct sockaddr sockaddr; 520Sigor@sysoev.ru struct sockaddr_in sockaddr_in; 530Sigor@sysoev.ru #if (NXT_INET6) 540Sigor@sysoev.ru struct sockaddr_in6 sockaddr_in6; 550Sigor@sysoev.ru #endif 560Sigor@sysoev.ru #if (NXT_HAVE_UNIX_DOMAIN) 570Sigor@sysoev.ru struct sockaddr_un sockaddr_un; 580Sigor@sysoev.ru #endif 590Sigor@sysoev.ru } u; 600Sigor@sysoev.ru }; 610Sigor@sysoev.ru 620Sigor@sysoev.ru 630Sigor@sysoev.ru typedef struct { 640Sigor@sysoev.ru nxt_job_resolve_t resolve; 650Sigor@sysoev.ru nxt_str_t addr; 660Sigor@sysoev.ru 670Sigor@sysoev.ru uint8_t wildcard; /* 1 bit */ 680Sigor@sysoev.ru uint8_t no_port; /* 1 bit */ 690Sigor@sysoev.ru } nxt_job_sockaddr_parse_t; 700Sigor@sysoev.ru 710Sigor@sysoev.ru 72*13Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_alloc(nxt_mem_pool_t *mp, 73*13Sigor@sysoev.ru socklen_t socklen, size_t address_length) 740Sigor@sysoev.ru NXT_MALLOC_LIKE; 750Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_create(nxt_mem_pool_t *mp, 76*13Sigor@sysoev.ru struct sockaddr *sockaddr, socklen_t socklen, size_t address_length) 770Sigor@sysoev.ru NXT_MALLOC_LIKE; 780Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_copy(nxt_mem_pool_t *mp, 790Sigor@sysoev.ru nxt_sockaddr_t *src) 800Sigor@sysoev.ru NXT_MALLOC_LIKE; 81*13Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_getsockname(nxt_task_t *task, 82*13Sigor@sysoev.ru nxt_mem_pool_t *mp, nxt_socket_t s) 830Sigor@sysoev.ru NXT_MALLOC_LIKE; 84*13Sigor@sysoev.ru NXT_EXPORT void nxt_sockaddr_text(nxt_sockaddr_t *sa); 850Sigor@sysoev.ru 860Sigor@sysoev.ru 87*13Sigor@sysoev.ru NXT_EXPORT uint32_t nxt_sockaddr_port_number(nxt_sockaddr_t *sa); 880Sigor@sysoev.ru NXT_EXPORT nxt_bool_t nxt_sockaddr_cmp(nxt_sockaddr_t *sa1, 890Sigor@sysoev.ru nxt_sockaddr_t *sa2); 900Sigor@sysoev.ru NXT_EXPORT size_t nxt_sockaddr_ntop(nxt_sockaddr_t *sa, u_char *buf, 91*13Sigor@sysoev.ru u_char *end, nxt_bool_t port); 920Sigor@sysoev.ru NXT_EXPORT void nxt_job_sockaddr_parse(nxt_job_sockaddr_parse_t *jbs); 930Sigor@sysoev.ru NXT_EXPORT in_addr_t nxt_inet_addr(u_char *buf, size_t len); 940Sigor@sysoev.ru #if (NXT_INET6) 950Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_inet6_addr(struct in6_addr *in6_addr, u_char *buf, 960Sigor@sysoev.ru size_t len); 970Sigor@sysoev.ru #endif 980Sigor@sysoev.ru 990Sigor@sysoev.ru 100*13Sigor@sysoev.ru #define NXT_INET_ADDR_STR_LEN (sizeof("255.255.255.255:65535") - 1) 1010Sigor@sysoev.ru 1020Sigor@sysoev.ru #define NXT_INET6_ADDR_STR_LEN \ 103*13Sigor@sysoev.ru (sizeof("[ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]:65535") - 1) 1040Sigor@sysoev.ru 1050Sigor@sysoev.ru 106*13Sigor@sysoev.ru #define nxt_sockaddr_start(sa) ((u_char *) (sa) + (sa)->start) 107*13Sigor@sysoev.ru #define nxt_sockaddr_address(sa) ((u_char *) (sa) + (sa)->address_start) 108*13Sigor@sysoev.ru #define nxt_sockaddr_port(sa) ((u_char *) (sa) + (sa)->port_start) 109*13Sigor@sysoev.ru #define nxt_sockaddr_length(sa) ((sa)->length - (sa)->port_start) 1100Sigor@sysoev.ru 1110Sigor@sysoev.ru 1120Sigor@sysoev.ru #endif /* _NXT_SOCKADDR_H_INCLUDED_ */ 113