comparison src/core/ngx_resolver.c @ 665:0b460e61bdcd default tip

Merge with nginx 1.0.0.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 25 Apr 2011 04:22:17 +0400
parents be70f83b184f
children
comparison
equal deleted inserted replaced
572:06419a2298a9 665:0b460e61bdcd
85 static void *ngx_resolver_alloc(ngx_resolver_t *r, size_t size); 85 static void *ngx_resolver_alloc(ngx_resolver_t *r, size_t size);
86 static void *ngx_resolver_calloc(ngx_resolver_t *r, size_t size); 86 static void *ngx_resolver_calloc(ngx_resolver_t *r, size_t size);
87 static void ngx_resolver_free(ngx_resolver_t *r, void *p); 87 static void ngx_resolver_free(ngx_resolver_t *r, void *p);
88 static void ngx_resolver_free_locked(ngx_resolver_t *r, void *p); 88 static void ngx_resolver_free_locked(ngx_resolver_t *r, void *p);
89 static void *ngx_resolver_dup(ngx_resolver_t *r, void *src, size_t size); 89 static void *ngx_resolver_dup(ngx_resolver_t *r, void *src, size_t size);
90 90 static u_char *ngx_resolver_log_error(ngx_log_t *log, u_char *buf, size_t len);
91 91
92 /* STUB: ngx_peer_addr_t * */
93 92
94 ngx_resolver_t * 93 ngx_resolver_t *
95 ngx_resolver_create(ngx_conf_t *cf, ngx_peer_addr_t *addr) 94 ngx_resolver_create(ngx_conf_t *cf, ngx_addr_t *addr)
96 { 95 {
97 ngx_resolver_t *r; 96 ngx_resolver_t *r;
98 ngx_pool_cleanup_t *cln; 97 ngx_pool_cleanup_t *cln;
99 ngx_udp_connection_t *uc; 98 ngx_udp_connection_t *uc;
100 99
137 r->resend_timeout = 5; 136 r->resend_timeout = 5;
138 r->expire = 30; 137 r->expire = 30;
139 r->valid = 300; 138 r->valid = 300;
140 139
141 r->log = &cf->cycle->new_log; 140 r->log = &cf->cycle->new_log;
142 r->log_level = NGX_LOG_ALERT; 141 r->log_level = NGX_LOG_ERR;
143 142
144 if (addr) { 143 if (addr) {
145 uc = ngx_calloc(sizeof(ngx_udp_connection_t), cf->log); 144 uc = ngx_calloc(sizeof(ngx_udp_connection_t), cf->log);
146 if (uc == NULL) { 145 if (uc == NULL) {
147 return NULL; 146 return NULL;
150 r->udp_connection = uc; 149 r->udp_connection = uc;
151 150
152 uc->sockaddr = addr->sockaddr; 151 uc->sockaddr = addr->sockaddr;
153 uc->socklen = addr->socklen; 152 uc->socklen = addr->socklen;
154 uc->server = addr->name; 153 uc->server = addr->name;
155 uc->log = &cf->cycle->new_log; 154
155 uc->log = cf->cycle->new_log;
156 uc->log.handler = ngx_resolver_log_error;
157 uc->log.data = uc;
158 uc->log.action = "resolving";
156 } 159 }
157 160
158 return r; 161 return r;
159 } 162 }
160 163
462 465
463 if (rn->waiting) { 466 if (rn->waiting) {
464 467
465 ctx->next = rn->waiting; 468 ctx->next = rn->waiting;
466 rn->waiting = ctx; 469 rn->waiting = ctx;
470 ctx->state = NGX_AGAIN;
467 471
468 return NGX_AGAIN; 472 return NGX_AGAIN;
469 } 473 }
470 474
471 ngx_queue_remove(&rn->queue); 475 ngx_queue_remove(&rn->queue);
623 627
624 if (rn->waiting) { 628 if (rn->waiting) {
625 629
626 ctx->next = rn->waiting; 630 ctx->next = rn->waiting;
627 rn->waiting = ctx; 631 rn->waiting = ctx;
632 ctx->state = NGX_AGAIN;
628 633
629 /* unlock addr mutex */ 634 /* unlock addr mutex */
630 635
631 return NGX_OK; 636 return NGX_OK;
632 } 637 }
838 if (n == -1) { 843 if (n == -1) {
839 return NGX_ERROR; 844 return NGX_ERROR;
840 } 845 }
841 846
842 if ((size_t) n != (size_t) rn->qlen) { 847 if ((size_t) n != (size_t) rn->qlen) {
843 ngx_log_error(NGX_LOG_CRIT, uc->log, 0, "send() incomplete"); 848 ngx_log_error(NGX_LOG_CRIT, &uc->log, 0, "send() incomplete");
844 return NGX_ERROR; 849 return NGX_ERROR;
845 } 850 }
846 851
847 return NGX_OK; 852 return NGX_OK;
848 } 853 }
1715 1720
1716 static ngx_int_t 1721 static ngx_int_t
1717 ngx_resolver_create_name_query(ngx_resolver_node_t *rn, ngx_resolver_ctx_t *ctx) 1722 ngx_resolver_create_name_query(ngx_resolver_node_t *rn, ngx_resolver_ctx_t *ctx)
1718 { 1723 {
1719 u_char *p, *s; 1724 u_char *p, *s;
1720 size_t len; 1725 size_t len, nlen;
1721 ngx_uint_t ident; 1726 ngx_uint_t ident;
1722 ngx_resolver_qs_t *qs; 1727 ngx_resolver_qs_t *qs;
1723 ngx_resolver_query_t *query; 1728 ngx_resolver_query_t *query;
1724 1729
1725 len = sizeof(ngx_resolver_query_t) 1730 nlen = ctx->name.len ? (1 + ctx->name.len + 1) : 1;
1726 + 1 + ctx->name.len + 1 + sizeof(ngx_resolver_qs_t); 1731
1727 1732 len = sizeof(ngx_resolver_query_t) + nlen + sizeof(ngx_resolver_qs_t);
1728 p = ngx_resolver_calloc(ctx->resolver, len); 1733
1734 p = ngx_resolver_alloc(ctx->resolver, len);
1729 if (p == NULL) { 1735 if (p == NULL) {
1730 return NGX_ERROR; 1736 return NGX_ERROR;
1731 } 1737 }
1732 1738
1733 rn->qlen = (u_short) len; 1739 rn->qlen = (u_short) len;
1750 query->nqs_hi = 0; query->nqs_lo = 1; 1756 query->nqs_hi = 0; query->nqs_lo = 1;
1751 query->nan_hi = 0; query->nan_lo = 0; 1757 query->nan_hi = 0; query->nan_lo = 0;
1752 query->nns_hi = 0; query->nns_lo = 0; 1758 query->nns_hi = 0; query->nns_lo = 0;
1753 query->nar_hi = 0; query->nar_lo = 0; 1759 query->nar_hi = 0; query->nar_lo = 0;
1754 1760
1755 p += sizeof(ngx_resolver_query_t) + 1 + ctx->name.len + 1; 1761 p += sizeof(ngx_resolver_query_t) + nlen;
1756 1762
1757 qs = (ngx_resolver_qs_t *) p; 1763 qs = (ngx_resolver_qs_t *) p;
1758 1764
1759 /* query type */ 1765 /* query type */
1760 qs->type_hi = 0; qs->type_lo = (u_char) ctx->type; 1766 qs->type_hi = 0; qs->type_lo = (u_char) ctx->type;
1804 1810
1805 len = sizeof(ngx_resolver_query_t) 1811 len = sizeof(ngx_resolver_query_t)
1806 + sizeof(".255.255.255.255.in-addr.arpa.") - 1 1812 + sizeof(".255.255.255.255.in-addr.arpa.") - 1
1807 + sizeof(ngx_resolver_qs_t); 1813 + sizeof(ngx_resolver_qs_t);
1808 1814
1809 p = ngx_resolver_calloc(ctx->resolver, len); 1815 p = ngx_resolver_alloc(ctx->resolver, len);
1810 if (p == NULL) { 1816 if (p == NULL) {
1811 return NGX_ERROR; 1817 return NGX_ERROR;
1812 } 1818 }
1813 1819
1814 rn->query = p; 1820 rn->query = p;
1828 query->nns_hi = 0; query->nns_lo = 0; 1834 query->nns_hi = 0; query->nns_lo = 0;
1829 query->nar_hi = 0; query->nar_lo = 0; 1835 query->nar_hi = 0; query->nar_lo = 0;
1830 1836
1831 p += sizeof(ngx_resolver_query_t); 1837 p += sizeof(ngx_resolver_query_t);
1832 1838
1833 for (n = 0; n < 32; n += 8){ 1839 for (n = 0; n < 32; n += 8) {
1834 d = ngx_sprintf(&p[1], "%ud", (ctx->addr >> n) & 0xff); 1840 d = ngx_sprintf(&p[1], "%ud", (ctx->addr >> n) & 0xff);
1835 *p = (u_char) (d - &p[1]); 1841 *p = (u_char) (d - &p[1]);
1836 p = d; 1842 p = d;
1837 } 1843 }
1838 1844
1895 return NGX_ERROR; 1901 return NGX_ERROR;
1896 1902
1897 done: 1903 done:
1898 1904
1899 if (name == NULL) { 1905 if (name == NULL) {
1906 return NGX_OK;
1907 }
1908
1909 if (len == -1) {
1910 name->len = 0;
1911 name->data = NULL;
1900 return NGX_OK; 1912 return NGX_OK;
1901 } 1913 }
1902 1914
1903 dst = ngx_resolver_alloc(r, len); 1915 dst = ngx_resolver_alloc(r, len);
1904 if (dst == NULL) { 1916 if (dst == NULL) {
2062 2074
2063 return "Unknown error"; 2075 return "Unknown error";
2064 } 2076 }
2065 2077
2066 2078
2079 static u_char *
2080 ngx_resolver_log_error(ngx_log_t *log, u_char *buf, size_t len)
2081 {
2082 u_char *p;
2083 ngx_udp_connection_t *uc;
2084
2085 p = buf;
2086
2087 if (log->action) {
2088 p = ngx_snprintf(buf, len, " while %s", log->action);
2089 len -= p - buf;
2090 }
2091
2092 uc = log->data;
2093
2094 if (uc) {
2095 p = ngx_snprintf(p, len, ", resolver: %V", &uc->server);
2096 }
2097
2098 return p;
2099 }
2100
2101
2067 ngx_int_t 2102 ngx_int_t
2068 ngx_udp_connect(ngx_udp_connection_t *uc) 2103 ngx_udp_connect(ngx_udp_connection_t *uc)
2069 { 2104 {
2070 int rc; 2105 int rc;
2071 ngx_int_t event; 2106 ngx_int_t event;
2073 ngx_socket_t s; 2108 ngx_socket_t s;
2074 ngx_connection_t *c; 2109 ngx_connection_t *c;
2075 2110
2076 s = ngx_socket(AF_INET, SOCK_DGRAM, 0); 2111 s = ngx_socket(AF_INET, SOCK_DGRAM, 0);
2077 2112
2078 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, uc->log, 0, "UDP socket %d", s); 2113 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &uc->log, 0, "UDP socket %d", s);
2079 2114
2080 if (s == -1) { 2115 if (s == -1) {
2081 ngx_log_error(NGX_LOG_ALERT, uc->log, ngx_socket_errno, 2116 ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,
2082 ngx_socket_n " failed"); 2117 ngx_socket_n " failed");
2083 return NGX_ERROR; 2118 return NGX_ERROR;
2084 } 2119 }
2085 2120
2086 c = ngx_get_connection(s, uc->log); 2121 c = ngx_get_connection(s, &uc->log);
2087 2122
2088 if (c == NULL) { 2123 if (c == NULL) {
2089 if (ngx_close_socket(s) == -1) { 2124 if (ngx_close_socket(s) == -1) {
2090 ngx_log_error(NGX_LOG_ALERT, uc->log, ngx_socket_errno, 2125 ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,
2091 ngx_close_socket_n "failed"); 2126 ngx_close_socket_n "failed");
2092 } 2127 }
2093 2128
2094 return NGX_ERROR; 2129 return NGX_ERROR;
2095 } 2130 }
2096 2131
2097 if (ngx_nonblocking(s) == -1) { 2132 if (ngx_nonblocking(s) == -1) {
2098 ngx_log_error(NGX_LOG_ALERT, uc->log, ngx_socket_errno, 2133 ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,
2099 ngx_nonblocking_n " failed"); 2134 ngx_nonblocking_n " failed");
2100 2135
2101 ngx_free_connection(c); 2136 ngx_free_connection(c);
2102 2137
2103 if (ngx_close_socket(s) == -1) { 2138 if (ngx_close_socket(s) == -1) {
2104 ngx_log_error(NGX_LOG_ALERT, uc->log, ngx_socket_errno, 2139 ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,
2105 ngx_close_socket_n " failed"); 2140 ngx_close_socket_n " failed");
2106 } 2141 }
2107 2142
2108 return NGX_ERROR; 2143 return NGX_ERROR;
2109 } 2144 }
2110 2145
2111 rev = c->read; 2146 rev = c->read;
2112 wev = c->write; 2147 wev = c->write;
2113 2148
2114 rev->log = uc->log; 2149 rev->log = &uc->log;
2115 wev->log = uc->log; 2150 wev->log = &uc->log;
2116 2151
2117 uc->connection = c; 2152 uc->connection = c;
2118 2153
2119 c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1); 2154 c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);
2120 2155
2127 rev->own_lock = &c->lock; 2162 rev->own_lock = &c->lock;
2128 wev->own_lock = &c->lock; 2163 wev->own_lock = &c->lock;
2129 2164
2130 #endif 2165 #endif
2131 2166
2132 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, uc->log, 0, 2167 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, &uc->log, 0,
2133 "connect to %V, fd:%d #%d", &uc->server, s, c->number); 2168 "connect to %V, fd:%d #%d", &uc->server, s, c->number);
2134 2169
2135 rc = connect(s, uc->sockaddr, uc->socklen); 2170 rc = connect(s, uc->sockaddr, uc->socklen);
2136 2171
2137 /* TODO: aio, iocp */ 2172 /* TODO: aio, iocp */
2138 2173
2139 if (rc == -1) { 2174 if (rc == -1) {
2140 ngx_log_error(NGX_LOG_CRIT, uc->log, ngx_socket_errno, 2175 ngx_log_error(NGX_LOG_CRIT, &uc->log, ngx_socket_errno,
2141 "connect() to %V failed", &uc->server); 2176 "connect() failed");
2142 2177
2143 return NGX_ERROR; 2178 return NGX_ERROR;
2144 } 2179 }
2145 2180
2146 /* UDP sockets are always ready to write */ 2181 /* UDP sockets are always ready to write */