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 1713Sigor@sysoev.ru /* 1813Sigor@sysoev.ru * A textual sockaddr representation is stored after struct sockaddr union 1913Sigor@sysoev.ru * and allocated as a whole. 2013Sigor@sysoev.ru */ 210Sigor@sysoev.ru 2213Sigor@sysoev.ru struct nxt_sockaddr_s { 2313Sigor@sysoev.ru /* Socket type: SOCKS_STREAM, SOCK_DGRAM, etc. */ 2413Sigor@sysoev.ru uint8_t type; 2513Sigor@sysoev.ru /* Size of struct sockaddr. */ 2613Sigor@sysoev.ru uint8_t socklen; 270Sigor@sysoev.ru /* 2813Sigor@sysoev.ru * Textual sockaddr representation, e.g.: "127.0.0.1:8000", 2913Sigor@sysoev.ru * "[::1]:8000", and "unix:/path/to/socket". 300Sigor@sysoev.ru */ 3113Sigor@sysoev.ru uint8_t start; 3213Sigor@sysoev.ru uint8_t length; 3313Sigor@sysoev.ru /* 3413Sigor@sysoev.ru * Textual address representation, e.g: "127.0.0.1", "::1", 3513Sigor@sysoev.ru * and "unix:/path/to/socket". 3613Sigor@sysoev.ru */ 3713Sigor@sysoev.ru uint8_t address_start; 3813Sigor@sysoev.ru uint8_t address_length; 3913Sigor@sysoev.ru /* 4013Sigor@sysoev.ru * Textual port representation, e.g. "8000". 4113Sigor@sysoev.ru * Port length is length - port_start. 4213Sigor@sysoev.ru */ 4313Sigor@sysoev.ru uint8_t port_start; 4413Sigor@sysoev.ru /* 4513Sigor@sysoev.ru * Size of the whole structure: struct sockaddr union and maximal textual 4613Sigor@sysoev.ru * representation, used to place sockaddr into appropriate free list. 4713Sigor@sysoev.ru */ 4813Sigor@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 7265Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_alloc(nxt_mp_t *mp, socklen_t socklen, 7365Sigor@sysoev.ru size_t address_length) 740Sigor@sysoev.ru NXT_MALLOC_LIKE; 7565Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_create(nxt_mp_t *mp, 7613Sigor@sysoev.ru struct sockaddr *sockaddr, socklen_t socklen, size_t address_length) 770Sigor@sysoev.ru NXT_MALLOC_LIKE; 7865Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_copy(nxt_mp_t *mp, nxt_sockaddr_t *src) 790Sigor@sysoev.ru NXT_MALLOC_LIKE; 8065Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_getsockname(nxt_task_t *task, nxt_mp_t *mp, 8165Sigor@sysoev.ru nxt_socket_t s) 820Sigor@sysoev.ru NXT_MALLOC_LIKE; 8313Sigor@sysoev.ru NXT_EXPORT void nxt_sockaddr_text(nxt_sockaddr_t *sa); 840Sigor@sysoev.ru 850Sigor@sysoev.ru 8613Sigor@sysoev.ru NXT_EXPORT uint32_t nxt_sockaddr_port_number(nxt_sockaddr_t *sa); 870Sigor@sysoev.ru NXT_EXPORT nxt_bool_t nxt_sockaddr_cmp(nxt_sockaddr_t *sa1, 880Sigor@sysoev.ru nxt_sockaddr_t *sa2); 890Sigor@sysoev.ru NXT_EXPORT size_t nxt_sockaddr_ntop(nxt_sockaddr_t *sa, u_char *buf, 9013Sigor@sysoev.ru u_char *end, nxt_bool_t port); 91*99Sigor@sysoev.ru NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_parse(nxt_mp_t *mp, nxt_str_t *addr); 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 10013Sigor@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 \ 10313Sigor@sysoev.ru (sizeof("[ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]:65535") - 1) 1040Sigor@sysoev.ru 1050Sigor@sysoev.ru 10698Svbart@nginx.com #define nxt_sockaddr_start(sa) nxt_pointer_to(sa, (sa)->start) 10798Svbart@nginx.com #define nxt_sockaddr_address(sa) nxt_pointer_to(sa, (sa)->address_start) 10898Svbart@nginx.com #define nxt_sockaddr_port(sa) nxt_pointer_to(sa, (sa)->port_start) 10913Sigor@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