comparison src/http/ngx_http_upstream_round_robin.c @ 5475:07dd5bd222ac

Changed resolver API to use ngx_addr_t.
author Ruslan Ermilov <ru@nginx.com>
date Fri, 06 Dec 2013 14:30:27 +0400
parents 359f49a84f87
children efc84a5723b3
comparison
equal deleted inserted replaced
5474:b43b02bb54db 5475:07dd5bd222ac
264 ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r, 264 ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,
265 ngx_http_upstream_resolved_t *ur) 265 ngx_http_upstream_resolved_t *ur)
266 { 266 {
267 u_char *p; 267 u_char *p;
268 size_t len; 268 size_t len;
269 socklen_t socklen;
269 ngx_uint_t i, n; 270 ngx_uint_t i, n;
270 struct sockaddr_in *sin; 271 struct sockaddr *sockaddr;
271 ngx_http_upstream_rr_peers_t *peers; 272 ngx_http_upstream_rr_peers_t *peers;
272 ngx_http_upstream_rr_peer_data_t *rrp; 273 ngx_http_upstream_rr_peer_data_t *rrp;
273 274
274 rrp = r->upstream->peer.data; 275 rrp = r->upstream->peer.data;
275 276
304 305
305 } else { 306 } else {
306 307
307 for (i = 0; i < ur->naddrs; i++) { 308 for (i = 0; i < ur->naddrs; i++) {
308 309
309 len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1; 310 socklen = ur->addrs[i].socklen;
310 311
311 p = ngx_pnalloc(r->pool, len); 312 sockaddr = ngx_palloc(r->pool, socklen);
313 if (sockaddr == NULL) {
314 return NGX_ERROR;
315 }
316
317 ngx_memcpy(sockaddr, ur->addrs[i].sockaddr, socklen);
318
319 switch (sockaddr->sa_family) {
320 #if (NGX_HAVE_INET6)
321 case AF_INET6:
322 ((struct sockaddr_in6 *) sockaddr)->sin6_port = htons(ur->port);
323 break;
324 #endif
325 default: /* AF_INET */
326 ((struct sockaddr_in *) sockaddr)->sin_port = htons(ur->port);
327 }
328
329 p = ngx_pnalloc(r->pool, NGX_SOCKADDR_STRLEN);
312 if (p == NULL) { 330 if (p == NULL) {
313 return NGX_ERROR; 331 return NGX_ERROR;
314 } 332 }
315 333
316 len = ngx_inet_ntop(AF_INET, &ur->addrs[i], p, NGX_INET_ADDRSTRLEN); 334 len = ngx_sock_ntop(sockaddr, socklen, p, NGX_SOCKADDR_STRLEN, 1);
317 len = ngx_sprintf(&p[len], ":%d", ur->port) - p; 335
318 336 peers->peer[i].sockaddr = sockaddr;
319 sin = ngx_pcalloc(r->pool, sizeof(struct sockaddr_in)); 337 peers->peer[i].socklen = socklen;
320 if (sin == NULL) {
321 return NGX_ERROR;
322 }
323
324 sin->sin_family = AF_INET;
325 sin->sin_port = htons(ur->port);
326 sin->sin_addr.s_addr = ur->addrs[i];
327
328 peers->peer[i].sockaddr = (struct sockaddr *) sin;
329 peers->peer[i].socklen = sizeof(struct sockaddr_in);
330 peers->peer[i].name.len = len; 338 peers->peer[i].name.len = len;
331 peers->peer[i].name.data = p; 339 peers->peer[i].name.data = p;
332 peers->peer[i].weight = 1; 340 peers->peer[i].weight = 1;
333 peers->peer[i].effective_weight = 1; 341 peers->peer[i].effective_weight = 1;
334 peers->peer[i].current_weight = 0; 342 peers->peer[i].current_weight = 0;