diff options
Diffstat (limited to '')
-rw-r--r-- | src/nxt_sockaddr.h | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/src/nxt_sockaddr.h b/src/nxt_sockaddr.h new file mode 100644 index 00000000..382e8fcb --- /dev/null +++ b/src/nxt_sockaddr.h @@ -0,0 +1,167 @@ + +/* + * 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_ */ |