comparison src/core/ngx_resolver.c @ 6559:adf25b8d0431

Introduced the ngx_sockaddr_t type. It's properly aligned and can hold any supported sockaddr.
author Ruslan Ermilov <ru@nginx.com>
date Mon, 23 May 2016 16:37:20 +0300
parents 7640d6c213e1
children b3b7e33083ac
comparison
equal deleted inserted replaced
6558:68854ce64ec7 6559:adf25b8d0431
2990 2990
2991 2991
2992 static void 2992 static void
2993 ngx_resolver_srv_names_handler(ngx_resolver_ctx_t *cctx) 2993 ngx_resolver_srv_names_handler(ngx_resolver_ctx_t *cctx)
2994 { 2994 {
2995 ngx_uint_t i; 2995 ngx_uint_t i;
2996 u_char (*sockaddr)[NGX_SOCKADDRLEN]; 2996 ngx_addr_t *addrs;
2997 ngx_addr_t *addrs; 2997 ngx_resolver_t *r;
2998 ngx_resolver_t *r; 2998 ngx_sockaddr_t *sockaddr;
2999 struct sockaddr_in *sin; 2999 struct sockaddr_in *sin;
3000 ngx_resolver_ctx_t *ctx; 3000 ngx_resolver_ctx_t *ctx;
3001 ngx_resolver_srv_name_t *srv; 3001 ngx_resolver_srv_name_t *srv;
3002 #if (NGX_HAVE_INET6) 3002 #if (NGX_HAVE_INET6)
3003 struct sockaddr_in6 *sin6; 3003 struct sockaddr_in6 *sin6;
3004 #endif 3004 #endif
3005 3005
3006 r = cctx->resolver; 3006 r = cctx->resolver;
3007 ctx = cctx->data; 3007 ctx = cctx->data;
3008 srv = cctx->srvs; 3008 srv = cctx->srvs;
3024 3024
3025 ctx->handler(ctx); 3025 ctx->handler(ctx);
3026 return; 3026 return;
3027 } 3027 }
3028 3028
3029 sockaddr = ngx_resolver_alloc(r, cctx->naddrs * NGX_SOCKADDRLEN); 3029 sockaddr = ngx_resolver_alloc(r, cctx->naddrs * sizeof(ngx_sockaddr_t));
3030 if (sockaddr == NULL) { 3030 if (sockaddr == NULL) {
3031 ngx_resolver_free(r, addrs); 3031 ngx_resolver_free(r, addrs);
3032 ngx_resolve_name_done(cctx); 3032 ngx_resolve_name_done(cctx);
3033 3033
3034 ctx->state = NGX_ERROR; 3034 ctx->state = NGX_ERROR;
3037 ctx->handler(ctx); 3037 ctx->handler(ctx);
3038 return; 3038 return;
3039 } 3039 }
3040 3040
3041 for (i = 0; i < cctx->naddrs; i++) { 3041 for (i = 0; i < cctx->naddrs; i++) {
3042 addrs[i].sockaddr = (struct sockaddr *) sockaddr[i]; 3042 addrs[i].sockaddr = &sockaddr[i].sockaddr;
3043 addrs[i].socklen = cctx->addrs[i].socklen; 3043 addrs[i].socklen = cctx->addrs[i].socklen;
3044 3044
3045 ngx_memcpy(sockaddr[i], cctx->addrs[i].sockaddr, 3045 ngx_memcpy(&sockaddr[i], cctx->addrs[i].sockaddr,
3046 addrs[i].socklen); 3046 addrs[i].socklen);
3047 3047
3048 switch (addrs[i].sockaddr->sa_family) { 3048 switch (addrs[i].sockaddr->sa_family) {
3049 #if (NGX_HAVE_INET6) 3049 #if (NGX_HAVE_INET6)
3050 case AF_INET6: 3050 case AF_INET6:
4159 4159
4160 static ngx_resolver_addr_t * 4160 static ngx_resolver_addr_t *
4161 ngx_resolver_export(ngx_resolver_t *r, ngx_resolver_node_t *rn, 4161 ngx_resolver_export(ngx_resolver_t *r, ngx_resolver_node_t *rn,
4162 ngx_uint_t rotate) 4162 ngx_uint_t rotate)
4163 { 4163 {
4164 ngx_uint_t d, i, j, n; 4164 ngx_uint_t d, i, j, n;
4165 u_char (*sockaddr)[NGX_SOCKADDRLEN]; 4165 in_addr_t *addr;
4166 in_addr_t *addr; 4166 ngx_sockaddr_t *sockaddr;
4167 struct sockaddr_in *sin; 4167 struct sockaddr_in *sin;
4168 ngx_resolver_addr_t *dst; 4168 ngx_resolver_addr_t *dst;
4169 #if (NGX_HAVE_INET6) 4169 #if (NGX_HAVE_INET6)
4170 struct in6_addr *addr6; 4170 struct in6_addr *addr6;
4171 struct sockaddr_in6 *sin6; 4171 struct sockaddr_in6 *sin6;
4172 #endif 4172 #endif
4173 4173
4174 n = rn->naddrs; 4174 n = rn->naddrs;
4175 #if (NGX_HAVE_INET6) 4175 #if (NGX_HAVE_INET6)
4176 n += rn->naddrs6; 4176 n += rn->naddrs6;
4179 dst = ngx_resolver_calloc(r, n * sizeof(ngx_resolver_addr_t)); 4179 dst = ngx_resolver_calloc(r, n * sizeof(ngx_resolver_addr_t));
4180 if (dst == NULL) { 4180 if (dst == NULL) {
4181 return NULL; 4181 return NULL;
4182 } 4182 }
4183 4183
4184 sockaddr = ngx_resolver_calloc(r, n * NGX_SOCKADDRLEN); 4184 sockaddr = ngx_resolver_calloc(r, n * sizeof(ngx_sockaddr_t));
4185 if (sockaddr == NULL) { 4185 if (sockaddr == NULL) {
4186 ngx_resolver_free(r, dst); 4186 ngx_resolver_free(r, dst);
4187 return NULL; 4187 return NULL;
4188 } 4188 }
4189 4189
4194 j = rotate ? ngx_random() % rn->naddrs : 0; 4194 j = rotate ? ngx_random() % rn->naddrs : 0;
4195 4195
4196 addr = (rn->naddrs == 1) ? &rn->u.addr : rn->u.addrs; 4196 addr = (rn->naddrs == 1) ? &rn->u.addr : rn->u.addrs;
4197 4197
4198 do { 4198 do {
4199 sin = (struct sockaddr_in *) sockaddr[d]; 4199 sin = &sockaddr[d].sockaddr_in;
4200 sin->sin_family = AF_INET; 4200 sin->sin_family = AF_INET;
4201 sin->sin_addr.s_addr = addr[j++]; 4201 sin->sin_addr.s_addr = addr[j++];
4202 dst[d].sockaddr = (struct sockaddr *) sin; 4202 dst[d].sockaddr = (struct sockaddr *) sin;
4203 dst[d++].socklen = sizeof(struct sockaddr_in); 4203 dst[d++].socklen = sizeof(struct sockaddr_in);
4204 4204
4217 j = rotate ? ngx_random() % rn->naddrs6 : 0; 4217 j = rotate ? ngx_random() % rn->naddrs6 : 0;
4218 4218
4219 addr6 = (rn->naddrs6 == 1) ? &rn->u6.addr6 : rn->u6.addrs6; 4219 addr6 = (rn->naddrs6 == 1) ? &rn->u6.addr6 : rn->u6.addrs6;
4220 4220
4221 do { 4221 do {
4222 sin6 = (struct sockaddr_in6 *) sockaddr[d]; 4222 sin6 = &sockaddr[d].sockaddr_in6;
4223 sin6->sin6_family = AF_INET6; 4223 sin6->sin6_family = AF_INET6;
4224 ngx_memcpy(sin6->sin6_addr.s6_addr, addr6[j++].s6_addr, 16); 4224 ngx_memcpy(sin6->sin6_addr.s6_addr, addr6[j++].s6_addr, 16);
4225 dst[d].sockaddr = (struct sockaddr *) sin6; 4225 dst[d].sockaddr = (struct sockaddr *) sin6;
4226 dst[d++].socklen = sizeof(struct sockaddr_in6); 4226 dst[d++].socklen = sizeof(struct sockaddr_in6);
4227 4227