mirror of
https://github.com/nginx/nginx.git
synced 2025-06-08 02:02:38 +08:00
Introduced the ngx_sockaddr_t type.
It's properly aligned and can hold any supported sockaddr.
This commit is contained in:
parent
d650688ba5
commit
fd064d3b88
@ -151,12 +151,12 @@ ngx_set_inherited_sockets(ngx_cycle_t *cycle)
|
||||
ls = cycle->listening.elts;
|
||||
for (i = 0; i < cycle->listening.nelts; i++) {
|
||||
|
||||
ls[i].sockaddr = ngx_palloc(cycle->pool, NGX_SOCKADDRLEN);
|
||||
ls[i].sockaddr = ngx_palloc(cycle->pool, sizeof(ngx_sockaddr_t));
|
||||
if (ls[i].sockaddr == NULL) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
ls[i].socklen = NGX_SOCKADDRLEN;
|
||||
ls[i].socklen = sizeof(ngx_sockaddr_t);
|
||||
if (getsockname(ls[i].fd, ls[i].sockaddr, &ls[i].socklen) == -1) {
|
||||
ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_socket_errno,
|
||||
"getsockname() of the inherited "
|
||||
@ -1278,7 +1278,7 @@ ngx_connection_local_sockaddr(ngx_connection_t *c, ngx_str_t *s,
|
||||
{
|
||||
socklen_t len;
|
||||
ngx_uint_t addr;
|
||||
u_char sa[NGX_SOCKADDRLEN];
|
||||
ngx_sockaddr_t sa;
|
||||
struct sockaddr_in *sin;
|
||||
#if (NGX_HAVE_INET6)
|
||||
ngx_uint_t i;
|
||||
@ -1316,9 +1316,9 @@ ngx_connection_local_sockaddr(ngx_connection_t *c, ngx_str_t *s,
|
||||
|
||||
if (addr == 0) {
|
||||
|
||||
len = NGX_SOCKADDRLEN;
|
||||
len = sizeof(ngx_sockaddr_t);
|
||||
|
||||
if (getsockname(c->fd, (struct sockaddr *) &sa, &len) == -1) {
|
||||
if (getsockname(c->fd, &sa.sockaddr, &len) == -1) {
|
||||
ngx_connection_error(c, ngx_socket_errno, "getsockname() failed");
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
@ -763,7 +763,7 @@ ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u)
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
ngx_memcpy(sin, u->sockaddr, sizeof(struct sockaddr_in));
|
||||
ngx_memcpy(sin, &u->sockaddr, sizeof(struct sockaddr_in));
|
||||
|
||||
u->addrs[0].sockaddr = (struct sockaddr *) sin;
|
||||
u->addrs[0].socklen = sizeof(struct sockaddr_in);
|
||||
@ -790,7 +790,7 @@ ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u)
|
||||
|
||||
u->family = u->addrs[0].sockaddr->sa_family;
|
||||
u->socklen = u->addrs[0].socklen;
|
||||
ngx_memcpy(u->sockaddr, u->addrs[0].sockaddr, u->addrs[0].socklen);
|
||||
ngx_memcpy(&u->sockaddr, u->addrs[0].sockaddr, u->addrs[0].socklen);
|
||||
|
||||
switch (u->family) {
|
||||
|
||||
@ -920,7 +920,7 @@ ngx_parse_inet6_url(ngx_pool_t *pool, ngx_url_t *u)
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
ngx_memcpy(sin6, u->sockaddr, sizeof(struct sockaddr_in6));
|
||||
ngx_memcpy(sin6, &u->sockaddr, sizeof(struct sockaddr_in6));
|
||||
|
||||
u->addrs[0].sockaddr = (struct sockaddr *) sin6;
|
||||
u->addrs[0].socklen = sizeof(struct sockaddr_in6);
|
||||
|
@ -13,14 +13,6 @@
|
||||
#include <ngx_core.h>
|
||||
|
||||
|
||||
/*
|
||||
* TODO: autoconfigure NGX_SOCKADDRLEN and NGX_SOCKADDR_STRLEN as
|
||||
* sizeof(struct sockaddr_storage)
|
||||
* sizeof(struct sockaddr_un)
|
||||
* sizeof(struct sockaddr_in6)
|
||||
* sizeof(struct sockaddr_in)
|
||||
*/
|
||||
|
||||
#define NGX_INET_ADDRSTRLEN (sizeof("255.255.255.255") - 1)
|
||||
#define NGX_INET6_ADDRSTRLEN \
|
||||
(sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") - 1)
|
||||
@ -29,15 +21,26 @@
|
||||
|
||||
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||
#define NGX_SOCKADDR_STRLEN (sizeof("unix:") - 1 + NGX_UNIX_ADDRSTRLEN)
|
||||
#else
|
||||
#elif (NGX_HAVE_INET6)
|
||||
#define NGX_SOCKADDR_STRLEN (NGX_INET6_ADDRSTRLEN + sizeof("[]:65535") - 1)
|
||||
#else
|
||||
#define NGX_SOCKADDR_STRLEN (NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1)
|
||||
#endif
|
||||
|
||||
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||
#define NGX_SOCKADDRLEN sizeof(struct sockaddr_un)
|
||||
#else
|
||||
#define NGX_SOCKADDRLEN 512
|
||||
/* compatibility */
|
||||
#define NGX_SOCKADDRLEN sizeof(ngx_sockaddr_t)
|
||||
|
||||
|
||||
typedef union {
|
||||
struct sockaddr sockaddr;
|
||||
struct sockaddr_in sockaddr_in;
|
||||
#if (NGX_HAVE_INET6)
|
||||
struct sockaddr_in6 sockaddr_in6;
|
||||
#endif
|
||||
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||
struct sockaddr_un sockaddr_un;
|
||||
#endif
|
||||
} ngx_sockaddr_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
@ -92,7 +95,7 @@ typedef struct {
|
||||
unsigned wildcard:1;
|
||||
|
||||
socklen_t socklen;
|
||||
u_char sockaddr[NGX_SOCKADDRLEN];
|
||||
ngx_sockaddr_t sockaddr;
|
||||
|
||||
ngx_addr_t *addrs;
|
||||
ngx_uint_t naddrs;
|
||||
|
@ -2992,15 +2992,15 @@ failed:
|
||||
static void
|
||||
ngx_resolver_srv_names_handler(ngx_resolver_ctx_t *cctx)
|
||||
{
|
||||
ngx_uint_t i;
|
||||
u_char (*sockaddr)[NGX_SOCKADDRLEN];
|
||||
ngx_addr_t *addrs;
|
||||
ngx_resolver_t *r;
|
||||
struct sockaddr_in *sin;
|
||||
ngx_resolver_ctx_t *ctx;
|
||||
ngx_resolver_srv_name_t *srv;
|
||||
ngx_uint_t i;
|
||||
ngx_addr_t *addrs;
|
||||
ngx_resolver_t *r;
|
||||
ngx_sockaddr_t *sockaddr;
|
||||
struct sockaddr_in *sin;
|
||||
ngx_resolver_ctx_t *ctx;
|
||||
ngx_resolver_srv_name_t *srv;
|
||||
#if (NGX_HAVE_INET6)
|
||||
struct sockaddr_in6 *sin6;
|
||||
struct sockaddr_in6 *sin6;
|
||||
#endif
|
||||
|
||||
r = cctx->resolver;
|
||||
@ -3026,7 +3026,7 @@ ngx_resolver_srv_names_handler(ngx_resolver_ctx_t *cctx)
|
||||
return;
|
||||
}
|
||||
|
||||
sockaddr = ngx_resolver_alloc(r, cctx->naddrs * NGX_SOCKADDRLEN);
|
||||
sockaddr = ngx_resolver_alloc(r, cctx->naddrs * sizeof(ngx_sockaddr_t));
|
||||
if (sockaddr == NULL) {
|
||||
ngx_resolver_free(r, addrs);
|
||||
ngx_resolve_name_done(cctx);
|
||||
@ -3039,10 +3039,10 @@ ngx_resolver_srv_names_handler(ngx_resolver_ctx_t *cctx)
|
||||
}
|
||||
|
||||
for (i = 0; i < cctx->naddrs; i++) {
|
||||
addrs[i].sockaddr = (struct sockaddr *) sockaddr[i];
|
||||
addrs[i].sockaddr = &sockaddr[i].sockaddr;
|
||||
addrs[i].socklen = cctx->addrs[i].socklen;
|
||||
|
||||
ngx_memcpy(sockaddr[i], cctx->addrs[i].sockaddr,
|
||||
ngx_memcpy(&sockaddr[i], cctx->addrs[i].sockaddr,
|
||||
addrs[i].socklen);
|
||||
|
||||
switch (addrs[i].sockaddr->sa_family) {
|
||||
@ -4161,14 +4161,14 @@ static ngx_resolver_addr_t *
|
||||
ngx_resolver_export(ngx_resolver_t *r, ngx_resolver_node_t *rn,
|
||||
ngx_uint_t rotate)
|
||||
{
|
||||
ngx_uint_t d, i, j, n;
|
||||
u_char (*sockaddr)[NGX_SOCKADDRLEN];
|
||||
in_addr_t *addr;
|
||||
struct sockaddr_in *sin;
|
||||
ngx_resolver_addr_t *dst;
|
||||
ngx_uint_t d, i, j, n;
|
||||
in_addr_t *addr;
|
||||
ngx_sockaddr_t *sockaddr;
|
||||
struct sockaddr_in *sin;
|
||||
ngx_resolver_addr_t *dst;
|
||||
#if (NGX_HAVE_INET6)
|
||||
struct in6_addr *addr6;
|
||||
struct sockaddr_in6 *sin6;
|
||||
struct in6_addr *addr6;
|
||||
struct sockaddr_in6 *sin6;
|
||||
#endif
|
||||
|
||||
n = rn->naddrs;
|
||||
@ -4181,7 +4181,7 @@ ngx_resolver_export(ngx_resolver_t *r, ngx_resolver_node_t *rn,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sockaddr = ngx_resolver_calloc(r, n * NGX_SOCKADDRLEN);
|
||||
sockaddr = ngx_resolver_calloc(r, n * sizeof(ngx_sockaddr_t));
|
||||
if (sockaddr == NULL) {
|
||||
ngx_resolver_free(r, dst);
|
||||
return NULL;
|
||||
@ -4196,7 +4196,7 @@ ngx_resolver_export(ngx_resolver_t *r, ngx_resolver_node_t *rn,
|
||||
addr = (rn->naddrs == 1) ? &rn->u.addr : rn->u.addrs;
|
||||
|
||||
do {
|
||||
sin = (struct sockaddr_in *) sockaddr[d];
|
||||
sin = &sockaddr[d].sockaddr_in;
|
||||
sin->sin_family = AF_INET;
|
||||
sin->sin_addr.s_addr = addr[j++];
|
||||
dst[d].sockaddr = (struct sockaddr *) sin;
|
||||
@ -4219,7 +4219,7 @@ ngx_resolver_export(ngx_resolver_t *r, ngx_resolver_node_t *rn,
|
||||
addr6 = (rn->naddrs6 == 1) ? &rn->u6.addr6 : rn->u6.addrs6;
|
||||
|
||||
do {
|
||||
sin6 = (struct sockaddr_in6 *) sockaddr[d];
|
||||
sin6 = &sockaddr[d].sockaddr_in6;
|
||||
sin6->sin6_family = AF_INET6;
|
||||
ngx_memcpy(sin6->sin6_addr.s6_addr, addr6[j++].s6_addr, 16);
|
||||
dst[d].sockaddr = (struct sockaddr *) sin6;
|
||||
|
@ -28,10 +28,10 @@ ngx_event_accept(ngx_event_t *ev)
|
||||
ngx_uint_t level;
|
||||
ngx_socket_t s;
|
||||
ngx_event_t *rev, *wev;
|
||||
ngx_sockaddr_t sa;
|
||||
ngx_listening_t *ls;
|
||||
ngx_connection_t *c, *lc;
|
||||
ngx_event_conf_t *ecf;
|
||||
u_char sa[NGX_SOCKADDRLEN];
|
||||
#if (NGX_HAVE_ACCEPT4)
|
||||
static ngx_uint_t use_accept4 = 1;
|
||||
#endif
|
||||
@ -58,17 +58,16 @@ ngx_event_accept(ngx_event_t *ev)
|
||||
"accept on %V, ready: %d", &ls->addr_text, ev->available);
|
||||
|
||||
do {
|
||||
socklen = NGX_SOCKADDRLEN;
|
||||
socklen = sizeof(ngx_sockaddr_t);
|
||||
|
||||
#if (NGX_HAVE_ACCEPT4)
|
||||
if (use_accept4) {
|
||||
s = accept4(lc->fd, (struct sockaddr *) sa, &socklen,
|
||||
SOCK_NONBLOCK);
|
||||
s = accept4(lc->fd, &sa.sockaddr, &socklen, SOCK_NONBLOCK);
|
||||
} else {
|
||||
s = accept(lc->fd, (struct sockaddr *) sa, &socklen);
|
||||
s = accept(lc->fd, &sa.sockaddr, &socklen);
|
||||
}
|
||||
#else
|
||||
s = accept(lc->fd, (struct sockaddr *) sa, &socklen);
|
||||
s = accept(lc->fd, &sa.sockaddr, &socklen);
|
||||
#endif
|
||||
|
||||
if (s == (ngx_socket_t) -1) {
|
||||
@ -171,7 +170,7 @@ ngx_event_accept(ngx_event_t *ev)
|
||||
return;
|
||||
}
|
||||
|
||||
ngx_memcpy(c->sockaddr, sa, socklen);
|
||||
ngx_memcpy(c->sockaddr, &sa, socklen);
|
||||
|
||||
log = ngx_palloc(c->pool, sizeof(ngx_log_t));
|
||||
if (log == NULL) {
|
||||
@ -328,10 +327,10 @@ ngx_event_recvmsg(ngx_event_t *ev)
|
||||
ngx_event_t *rev, *wev;
|
||||
struct iovec iov[1];
|
||||
struct msghdr msg;
|
||||
ngx_sockaddr_t sa;
|
||||
ngx_listening_t *ls;
|
||||
ngx_event_conf_t *ecf;
|
||||
ngx_connection_t *c, *lc;
|
||||
u_char sa[NGX_SOCKADDRLEN];
|
||||
static u_char buffer[65535];
|
||||
|
||||
#if (NGX_HAVE_MSGHDR_MSG_CONTROL)
|
||||
@ -376,7 +375,7 @@ ngx_event_recvmsg(ngx_event_t *ev)
|
||||
iov[0].iov_len = sizeof(buffer);
|
||||
|
||||
msg.msg_name = &sa;
|
||||
msg.msg_namelen = sizeof(sa);
|
||||
msg.msg_namelen = sizeof(ngx_sockaddr_t);
|
||||
msg.msg_iov = iov;
|
||||
msg.msg_iovlen = 1;
|
||||
|
||||
|
@ -29,7 +29,7 @@ typedef struct {
|
||||
ngx_connection_t *connection;
|
||||
|
||||
socklen_t socklen;
|
||||
u_char sockaddr[NGX_SOCKADDRLEN];
|
||||
ngx_sockaddr_t sockaddr;
|
||||
|
||||
} ngx_http_upstream_keepalive_cache_t;
|
||||
|
||||
|
@ -3998,7 +3998,7 @@ ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||
|
||||
ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t));
|
||||
|
||||
ngx_memcpy(&lsopt.u.sockaddr, u.sockaddr, u.socklen);
|
||||
ngx_memcpy(&lsopt.u.sockaddr, &u.sockaddr, u.socklen);
|
||||
|
||||
lsopt.socklen = u.socklen;
|
||||
lsopt.backlog = NGX_LISTEN_BACKLOG;
|
||||
|
@ -58,17 +58,7 @@ typedef struct ngx_http_core_loc_conf_s ngx_http_core_loc_conf_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
union {
|
||||
struct sockaddr sockaddr;
|
||||
struct sockaddr_in sockaddr_in;
|
||||
#if (NGX_HAVE_INET6)
|
||||
struct sockaddr_in6 sockaddr_in6;
|
||||
#endif
|
||||
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||
struct sockaddr_un sockaddr_un;
|
||||
#endif
|
||||
} u;
|
||||
|
||||
ngx_sockaddr_t u;
|
||||
socklen_t socklen;
|
||||
|
||||
unsigned set:1;
|
||||
|
@ -27,17 +27,7 @@ typedef struct {
|
||||
|
||||
|
||||
typedef struct {
|
||||
union {
|
||||
struct sockaddr sockaddr;
|
||||
struct sockaddr_in sockaddr_in;
|
||||
#if (NGX_HAVE_INET6)
|
||||
struct sockaddr_in6 sockaddr_in6;
|
||||
#endif
|
||||
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||
struct sockaddr_un sockaddr_un;
|
||||
#endif
|
||||
} u;
|
||||
|
||||
ngx_sockaddr_t u;
|
||||
socklen_t socklen;
|
||||
|
||||
/* server ctx */
|
||||
|
@ -337,7 +337,7 @@ ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||
|
||||
ngx_memzero(ls, sizeof(ngx_mail_listen_t));
|
||||
|
||||
ngx_memcpy(&ls->u.sockaddr, u.sockaddr, u.socklen);
|
||||
ngx_memcpy(&ls->u.sockaddr, &u.sockaddr, u.socklen);
|
||||
|
||||
ls->socklen = u.socklen;
|
||||
ls->backlog = NGX_LISTEN_BACKLOG;
|
||||
|
@ -31,17 +31,7 @@ typedef struct {
|
||||
|
||||
|
||||
typedef struct {
|
||||
union {
|
||||
struct sockaddr sockaddr;
|
||||
struct sockaddr_in sockaddr_in;
|
||||
#if (NGX_HAVE_INET6)
|
||||
struct sockaddr_in6 sockaddr_in6;
|
||||
#endif
|
||||
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||
struct sockaddr_un sockaddr_un;
|
||||
#endif
|
||||
} u;
|
||||
|
||||
ngx_sockaddr_t u;
|
||||
socklen_t socklen;
|
||||
|
||||
/* server ctx */
|
||||
|
@ -280,7 +280,7 @@ ngx_stream_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||
|
||||
ngx_memzero(ls, sizeof(ngx_stream_listen_t));
|
||||
|
||||
ngx_memcpy(&ls->u.sockaddr, u.sockaddr, u.socklen);
|
||||
ngx_memcpy(&ls->u.sockaddr, &u.sockaddr, u.socklen);
|
||||
|
||||
ls->socklen = u.socklen;
|
||||
ls->backlog = NGX_LISTEN_BACKLOG;
|
||||
|
Loading…
Reference in New Issue
Block a user