xref: /unit/src/nxt_job_resolve.c (revision 1008:84f2370bd642)
10Sigor@sysoev.ru 
20Sigor@sysoev.ru /*
30Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
40Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
50Sigor@sysoev.ru  */
60Sigor@sysoev.ru 
70Sigor@sysoev.ru #include <nxt_main.h>
80Sigor@sysoev.ru 
90Sigor@sysoev.ru 
100Sigor@sysoev.ru void
nxt_job_resolve(nxt_job_resolve_t * jbr)110Sigor@sysoev.ru nxt_job_resolve(nxt_job_resolve_t *jbr)
120Sigor@sysoev.ru {
130Sigor@sysoev.ru     int                 err;
140Sigor@sysoev.ru     u_char              *host;
1510Sigor@sysoev.ru     size_t              length;
1665Sigor@sysoev.ru     nxt_mp_t            *mp;
170Sigor@sysoev.ru     nxt_uint_t          n;
180Sigor@sysoev.ru     nxt_sockaddr_t      *sa;
190Sigor@sysoev.ru     struct addrinfo     hint, *res, *r;
200Sigor@sysoev.ru     nxt_work_handler_t  handler;
210Sigor@sysoev.ru 
220Sigor@sysoev.ru     #define NXT_BUFSIZE  64
230Sigor@sysoev.ru     u_char               buf[NXT_BUFSIZE];
240Sigor@sysoev.ru 
250Sigor@sysoev.ru     handler = jbr->error_handler;
260Sigor@sysoev.ru     res = NULL;
270Sigor@sysoev.ru 
2810Sigor@sysoev.ru     length = jbr->name.length + 1;
290Sigor@sysoev.ru 
3010Sigor@sysoev.ru     if (nxt_fast_path(length <= NXT_BUFSIZE)) {
310Sigor@sysoev.ru         host = buf;
320Sigor@sysoev.ru 
330Sigor@sysoev.ru     } else {
3465Sigor@sysoev.ru         host = nxt_mp_alloc(jbr->job.mem_pool, length);
350Sigor@sysoev.ru         if (nxt_slow_path(host == NULL)) {
360Sigor@sysoev.ru             goto fail;
370Sigor@sysoev.ru         }
380Sigor@sysoev.ru     }
390Sigor@sysoev.ru 
4010Sigor@sysoev.ru     nxt_cpystrn(host, jbr->name.start, length);
410Sigor@sysoev.ru 
420Sigor@sysoev.ru     nxt_memzero(&hint, sizeof(struct addrinfo));
430Sigor@sysoev.ru     hint.ai_socktype = SOCK_STREAM;
440Sigor@sysoev.ru 
450Sigor@sysoev.ru     err = getaddrinfo((char *) host, NULL, &hint, &res);
460Sigor@sysoev.ru 
470Sigor@sysoev.ru     if (err != 0) {
480Sigor@sysoev.ru         nxt_thread_log_error(jbr->log_level,
490Sigor@sysoev.ru                              "getaddrinfo(\"%s\") failed (%d: %s)",
500Sigor@sysoev.ru                              host, err, gai_strerror(err));
510Sigor@sysoev.ru         goto fail;
520Sigor@sysoev.ru     }
530Sigor@sysoev.ru 
540Sigor@sysoev.ru     n = 0;
550Sigor@sysoev.ru     for (r = res; r != NULL; r = r->ai_next) {
560Sigor@sysoev.ru 
570Sigor@sysoev.ru         switch (r->ai_addr->sa_family) {
580Sigor@sysoev.ru #if (NXT_INET6)
590Sigor@sysoev.ru         case AF_INET6:
600Sigor@sysoev.ru #endif
610Sigor@sysoev.ru         case AF_INET:
62*1008Szelenkov@nginx.com             n++;
63*1008Szelenkov@nginx.com             break;
640Sigor@sysoev.ru 
650Sigor@sysoev.ru         default:
66*1008Szelenkov@nginx.com             break;
670Sigor@sysoev.ru         }
680Sigor@sysoev.ru     }
690Sigor@sysoev.ru 
700Sigor@sysoev.ru     jbr->count = n;
710Sigor@sysoev.ru     mp = jbr->job.mem_pool;
720Sigor@sysoev.ru 
7365Sigor@sysoev.ru     jbr->sockaddrs = nxt_mp_alloc(mp, n * sizeof(nxt_sockaddr_t *));
740Sigor@sysoev.ru     if (nxt_slow_path(jbr->sockaddrs == NULL)) {
750Sigor@sysoev.ru         goto fail;
760Sigor@sysoev.ru     }
770Sigor@sysoev.ru 
780Sigor@sysoev.ru     n = 0;
790Sigor@sysoev.ru     for (r = res; r != NULL; r = r->ai_next) {
800Sigor@sysoev.ru 
810Sigor@sysoev.ru         switch (r->ai_addr->sa_family) {
820Sigor@sysoev.ru #if (NXT_INET6)
830Sigor@sysoev.ru         case AF_INET6:
84*1008Szelenkov@nginx.com             length = NXT_INET6_ADDR_STR_LEN;
85*1008Szelenkov@nginx.com             break;
860Sigor@sysoev.ru #endif
870Sigor@sysoev.ru         case AF_INET:
88*1008Szelenkov@nginx.com             length = NXT_INET_ADDR_STR_LEN;
89*1008Szelenkov@nginx.com             break;
900Sigor@sysoev.ru 
910Sigor@sysoev.ru         default:
92*1008Szelenkov@nginx.com             continue;
930Sigor@sysoev.ru         }
940Sigor@sysoev.ru 
9513Sigor@sysoev.ru         sa = nxt_sockaddr_create(mp, r->ai_addr, r->ai_addrlen, length);
960Sigor@sysoev.ru         if (nxt_slow_path(sa == NULL)) {
970Sigor@sysoev.ru             goto fail;
980Sigor@sysoev.ru         }
990Sigor@sysoev.ru 
1000Sigor@sysoev.ru         jbr->sockaddrs[n++] = sa;
1010Sigor@sysoev.ru 
1020Sigor@sysoev.ru         if (jbr->port != 0) {
1030Sigor@sysoev.ru 
1040Sigor@sysoev.ru             switch (sa->u.sockaddr.sa_family) {
1050Sigor@sysoev.ru             case AF_INET:
1060Sigor@sysoev.ru                 sa->u.sockaddr_in.sin_port = jbr->port;
1070Sigor@sysoev.ru                 break;
1080Sigor@sysoev.ru #if (NXT_INET6)
1090Sigor@sysoev.ru             case AF_INET6:
1100Sigor@sysoev.ru                 sa->u.sockaddr_in6.sin6_port = jbr->port;
1110Sigor@sysoev.ru                 break;
1120Sigor@sysoev.ru #endif
1130Sigor@sysoev.ru             default:
1140Sigor@sysoev.ru                 break;
1150Sigor@sysoev.ru             }
1160Sigor@sysoev.ru         }
1170Sigor@sysoev.ru     }
1180Sigor@sysoev.ru 
1190Sigor@sysoev.ru     handler = jbr->ready_handler;
1200Sigor@sysoev.ru 
1210Sigor@sysoev.ru fail:
1220Sigor@sysoev.ru 
1230Sigor@sysoev.ru     if (nxt_fast_path(res != NULL)) {
1240Sigor@sysoev.ru         freeaddrinfo(res);
1250Sigor@sysoev.ru     }
1260Sigor@sysoev.ru 
12765Sigor@sysoev.ru     if (host != buf) {
12865Sigor@sysoev.ru         nxt_mp_free(jbr->job.mem_pool, host);
12965Sigor@sysoev.ru     }
13065Sigor@sysoev.ru 
1314Sigor@sysoev.ru     nxt_job_return(jbr->job.task, &jbr->job, handler);
1320Sigor@sysoev.ru }
133