/* * Copyright (C) Igor Sysoev * Copyright (C) NGINX, Inc. */ #ifndef _NXT_SOCKADDR_H_INCLUDED_ #define _NXT_SOCKADDR_H_INCLUDED_ /* * The nxt_sockaddr_t should be allocated using nxt_sockaddr_alloc() * with actual "struct sockaddr_..." size: * nxt_sockaddr_alloc(pool, sizeof(struct sockaddr_in)) */ struct nxt_sockaddr_s { /* * A sockaddr textual representation is optional and may be in two forms: * with port or without port. If a nxt_sockaddr_t is intended to listen(), * bind() or connect() then the textual representation must be present and * must include the port. nxt_event_conn_accept() creates a textual * representation without the port. */ u_char *text; /* * text_len, socket type and socklen are stored * together on 64-bit platforms without sockaddr.sa_len. */ uint16_t text_len; uint16_t type; #if !(NXT_SOCKADDR_SA_LEN) socklen_t _socklen; #endif union { struct sockaddr sockaddr; struct sockaddr_in sockaddr_in; #if (NXT_INET6) struct sockaddr_in6 sockaddr_in6; #endif #if (NXT_HAVE_UNIX_DOMAIN) struct sockaddr_un sockaddr_un; #endif } u; }; typedef struct { nxt_job_resolve_t resolve; nxt_str_t addr; uint8_t wildcard; /* 1 bit */ uint8_t no_port; /* 1 bit */ } nxt_job_sockaddr_parse_t; NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_alloc(nxt_mem_pool_t *mp, socklen_t len) NXT_MALLOC_LIKE; NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_create(nxt_mem_pool_t *mp, struct sockaddr *sockaddr, socklen_t len) NXT_MALLOC_LIKE; NXT_EXPORT nxt_sockaddr_t *nxt_sockaddr_copy(nxt_mem_pool_t *mp, nxt_sockaddr_t *src) NXT_MALLOC_LIKE; NXT_EXPORT nxt_sockaddr_t *nxt_getsockname(nxt_mem_pool_t *mp, nxt_socket_t s) NXT_MALLOC_LIKE; NXT_EXPORT nxt_int_t nxt_sockaddr_text(nxt_mem_pool_t *mp, nxt_sockaddr_t *sa, nxt_bool_t port); #if (NXT_SOCKADDR_SA_LEN) #define \ nxt_socklen_set(sa, len) \ (sa)->u.sockaddr.sa_len = (socklen_t) (len) #define \ nxt_socklen(sa) \ ((sa)->u.sockaddr.sa_len) #else #define \ nxt_socklen_set(sa, len) \ (sa)->_socklen = (socklen_t) (len) #define \ nxt_socklen(sa) \ ((sa)->_socklen) #endif NXT_EXPORT uint32_t nxt_sockaddr_port(nxt_sockaddr_t *sa); NXT_EXPORT nxt_bool_t nxt_sockaddr_cmp(nxt_sockaddr_t *sa1, nxt_sockaddr_t *sa2); NXT_EXPORT size_t nxt_sockaddr_ntop(nxt_sockaddr_t *sa, u_char *buf, u_char *end, nxt_bool_t port); NXT_EXPORT void nxt_job_sockaddr_parse(nxt_job_sockaddr_parse_t *jbs); NXT_EXPORT in_addr_t nxt_inet_addr(u_char *buf, size_t len); #if (NXT_INET6) NXT_EXPORT nxt_int_t nxt_inet6_addr(struct in6_addr *in6_addr, u_char *buf, size_t len); #endif #if (NXT_HAVE_UNIX_DOMAIN) #define nxt_unix_addr_path_len(sa) \ (nxt_socklen(sa) - offsetof(struct sockaddr_un, sun_path)) #endif #define NXT_INET_ADDR_STR_LEN (sizeof("255.255.255.255") - 1) #define NXT_INET6_ADDR_STR_LEN \ (sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") - 1) #define NXT_UNIX_ADDR_STR_LEN \ ((sizeof("unix:") - 1) \ + (sizeof(struct sockaddr_un) - offsetof(struct sockaddr_un, sun_path))) #if (NXT_HAVE_UNIX_DOMAIN) #define NXT_SOCKADDR_STR_LEN NXT_UNIX_ADDR_STR_LEN #elif (NXT_INET6) #define NXT_SOCKADDR_STR_LEN NXT_INET6_ADDR_STR_LEN #else #define NXT_SOCKADDR_STR_LEN NXT_INET_ADDR_STR_LEN #endif #if (NXT_INET6) #define NXT_SOCKPORT_STR_LEN (sizeof("[]:65535") - 1) #else #define NXT_SOCKPORT_STR_LEN (sizeof(":65535") - 1) #endif nxt_inline size_t nxt_sockaddr_text_len(nxt_sockaddr_t *sa) { switch (sa->u.sockaddr.sa_family) { #if (NXT_INET6) case AF_INET6: return NXT_INET6_ADDR_STR_LEN; #endif #if (NXT_HAVE_UNIX_DOMAIN) case AF_UNIX: return NXT_UNIX_ADDR_STR_LEN; #endif default: return NXT_INET_ADDR_STR_LEN; } } #endif /* _NXT_SOCKADDR_H_INCLUDED_ */