Mercurial > hg > nginx-mail
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 */ |