📄 ngx_resolver.c
字号:
static ngx_resolver_node_t *ngx_resolver_lookup_addr(ngx_resolver_t *r, in_addr_t addr){ ngx_rbtree_node_t *node, *sentinel; node = r->addr_rbtree.root; sentinel = r->addr_rbtree.sentinel; while (node != sentinel) { if (addr < node->key) { node = node->left; continue; } if (addr > node->key) { node = node->right; continue; } /* addr == node->key */ return (ngx_resolver_node_t *) node; } /* not found */ return NULL;}static voidngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp, ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel){ size_t len; ngx_rbtree_node_t **p; ngx_resolver_node_t *rn, *rn_temp; for ( ;; ) { if (node->key < temp->key) { p = &temp->left; } else if (node->key > temp->key) { p = &temp->right; } else { /* node->key == temp->key */ rn = (ngx_resolver_node_t *) node; rn_temp = (ngx_resolver_node_t *) temp; len = (rn->nlen > rn_temp->nlen) ? rn_temp->nlen : rn->nlen; p = (ngx_strncmp(rn->name, rn_temp->name, len) < 0) ? &temp->left : &temp->right; } if (*p == sentinel) { break; } temp = *p; } *p = node; node->parent = temp; node->left = sentinel; node->right = sentinel; ngx_rbt_red(node);}static ngx_int_tngx_resolver_create_name_query(ngx_resolver_node_t *rn, ngx_resolver_ctx_t *ctx){ u_char *p, *s; size_t len; ngx_uint_t ident; ngx_resolver_qs_t *qs; ngx_resolver_query_t *query; len = sizeof(ngx_resolver_query_t) + 1 + ctx->name.len + 1 + sizeof(ngx_resolver_qs_t); p = ngx_resolver_calloc(ctx->resolver, len); if (p == NULL) { return NGX_ERROR; } rn->qlen = (u_short) len; rn->query = p; query = (ngx_resolver_query_t *) p; ident = ngx_random(); ngx_log_debug2(NGX_LOG_DEBUG_CORE, ctx->resolver->log, 0, "resolve: \"%V\" %i", &ctx->name, ident & 0xffff); query->ident_hi = (u_char) ((ident >> 8) & 0xff); query->ident_lo = (u_char) (ident & 0xff); /* recursion query */ query->flags_hi = 1; query->flags_lo = 0; /* one question */ query->nqs_hi = 0; query->nqs_lo = 1; query->nan_hi = 0; query->nan_lo = 0; query->nns_hi = 0; query->nns_lo = 0; query->nar_hi = 0; query->nar_lo = 0; p += sizeof(ngx_resolver_query_t) + 1 + ctx->name.len + 1; qs = (ngx_resolver_qs_t *) p; /* query type */ qs->type_hi = 0; qs->type_lo = (u_char) ctx->type; /* IP query class */ qs->class_hi = 0; qs->class_lo = 1; /* convert "www.example.com" to "\3www\7example\3com\0" */ len = 0; p--; *p-- = '\0'; for (s = ctx->name.data + ctx->name.len - 1; s >= ctx->name.data; s--) { if (*s != '.') { *p = *s; len++; } else { if (len == 0) { return NGX_DECLINED; } *p = (u_char) len; len = 0; } p--; } *p = (u_char) len; return NGX_OK;}/* AF_INET only */static ngx_int_tngx_resolver_create_addr_query(ngx_resolver_node_t *rn, ngx_resolver_ctx_t *ctx){ u_char *p, *d; size_t len; ngx_int_t n; ngx_uint_t ident; ngx_resolver_query_t *query; len = sizeof(ngx_resolver_query_t) + sizeof(".255.255.255.255.in-addr.arpa.") - 1 + sizeof(ngx_resolver_qs_t); p = ngx_resolver_calloc(ctx->resolver, len); if (p == NULL) { return NGX_ERROR; } rn->query = p; query = (ngx_resolver_query_t *) p; ident = ngx_random(); query->ident_hi = (u_char) ((ident >> 8) & 0xff); query->ident_lo = (u_char) (ident & 0xff); /* recursion query */ query->flags_hi = 1; query->flags_lo = 0; /* one question */ query->nqs_hi = 0; query->nqs_lo = 1; query->nan_hi = 0; query->nan_lo = 0; query->nns_hi = 0; query->nns_lo = 0; query->nar_hi = 0; query->nar_lo = 0; p += sizeof(ngx_resolver_query_t); for (n = 0; n < 32; n += 8){ d = ngx_sprintf(&p[1], "%ud", (ctx->addr >> n) & 0xff); *p = (u_char) (d - &p[1]); p = d; } /* query type "PTR", IP query class */ ngx_memcpy(p, "\7in-addr\4arpa\0\0\14\0\1", 18); rn->qlen = (u_short) (p + sizeof("\7in-addr\4arpa") + sizeof(ngx_resolver_qs_t) - rn->query); return NGX_OK;}static ngx_int_tngx_resolver_copy(ngx_resolver_t *r, ngx_str_t *name, u_char *buf, u_char *src, u_char *last){ char *err; u_char *p, *dst; ssize_t len; ngx_uint_t i, n; p = src; len = -1; /* * compression pointers allow to create endless loop, so we set limit; * 128 pointers should be enough to store 255-byte name */ for (i = 0; i < 128; i++) { n = *p++; if (n == 0) { goto done; } if (n & 0xc0) { n = (n & 0x3f << 8) + *p; p = &buf[n]; } else { len += 1 + n; p = &p[n]; } if (p >= last) { err = "name is out of response"; goto invalid; } } err = "compression pointers loop";invalid: ngx_log_error(r->log_level, r->log, 0, err); return NGX_ERROR;done: if (name == NULL) { return NGX_OK; } dst = ngx_resolver_alloc(r, len); if (dst == NULL) { return NGX_ERROR; } name->data = dst; n = *src++; for ( ;; ) { if (n != 0xc0) { ngx_memcpy(dst, src, n); dst += n; src += n; n = *src++; if (n != 0) { *dst++ = '.'; } } else { n = (n & 0x3f << 8) + *src; src = &buf[n]; n = *src++; } if (n == 0) { name->len = dst - name->data; return NGX_OK; } }}static voidngx_resolver_timeout_handler(ngx_event_t *ev){ ngx_resolver_ctx_t *ctx; ctx = ev->data; ctx->state = NGX_RESOLVE_TIMEDOUT; ctx->handler(ctx);}static voidngx_resolver_free_node(ngx_resolver_t *r, ngx_resolver_node_t *rn){ /* lock alloc mutex */ if (rn->query) { ngx_resolver_free_locked(r, rn->query); } if (rn->name) { ngx_resolver_free_locked(r, rn->name); } if (rn->cnlen) { ngx_resolver_free_locked(r, rn->u.cname); } if (rn->naddrs > 1) { ngx_resolver_free_locked(r, rn->u.addrs); } ngx_resolver_free_locked(r, rn); /* unlock alloc mutex */}static void *ngx_resolver_alloc(ngx_resolver_t *r, size_t size){ u_char *p; /* lock alloc mutex */ p = ngx_alloc(size, r->log); /* unlock alloc mutex */ return p;}static void *ngx_resolver_calloc(ngx_resolver_t *r, size_t size){ u_char *p; p = ngx_resolver_alloc(r, size); if (p) { ngx_memzero(p, size); } return p;}static voidngx_resolver_free(ngx_resolver_t *r, void *p){ /* lock alloc mutex */ ngx_free(p); /* unlock alloc mutex */}static voidngx_resolver_free_locked(ngx_resolver_t *r, void *p){ ngx_free(p);}static void *ngx_resolver_dup(ngx_resolver_t *r, void *src, size_t size){ void *dst; dst = ngx_resolver_alloc(r, size); if (dst == NULL) { return dst; } ngx_memcpy(dst, src, size); return dst;}char *ngx_resolver_strerror(ngx_int_t err){ static char *errors[] = { "Format error", /* FORMERR */ "Server failure", /* SERVFAIL */ "Host not found", /* NXDOMAIN */ "Unimplemented", /* NOTIMP */ "Operation refused" /* REFUSED */ }; if (err > 0 && err < 6) { return errors[err - 1]; } if (err == NGX_RESOLVE_TIMEDOUT) { return "Operation timed out"; } return "Unknown error";}ngx_int_tngx_udp_connect(ngx_udp_connection_t *uc){ int rc; ngx_int_t event; ngx_event_t *rev, *wev; ngx_socket_t s; ngx_connection_t *c; s = ngx_socket(AF_INET, SOCK_DGRAM, 0); ngx_log_debug1(NGX_LOG_DEBUG_EVENT, uc->log, 0, "UDP socket %d", s); if (s == -1) { ngx_log_error(NGX_LOG_ALERT, uc->log, ngx_socket_errno, ngx_socket_n " failed"); return NGX_ERROR; } c = ngx_get_connection(s, uc->log); if (c == NULL) { if (ngx_close_socket(s) == -1) { ngx_log_error(NGX_LOG_ALERT, uc->log, ngx_socket_errno, ngx_close_socket_n "failed"); } return NGX_ERROR; } if (ngx_nonblocking(s) == -1) { ngx_log_error(NGX_LOG_ALERT, uc->log, ngx_socket_errno, ngx_nonblocking_n " failed"); ngx_free_connection(c); if (ngx_close_socket(s) == -1) { ngx_log_error(NGX_LOG_ALERT, uc->log, ngx_socket_errno, ngx_close_socket_n " failed"); } return NGX_ERROR; } rev = c->read; wev = c->write; rev->log = uc->log; wev->log = uc->log; uc->connection = c; c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);#if (NGX_THREADS) /* TODO: lock event when call completion handler */ rev->lock = &c->lock; wev->lock = &c->lock; rev->own_lock = &c->lock; wev->own_lock = &c->lock;#endif ngx_log_debug3(NGX_LOG_DEBUG_EVENT, uc->log, 0, "connect to %V, fd:%d #%d", &uc->server, s, c->number); rc = connect(s, uc->sockaddr, uc->socklen); /* TODO: aio, iocp */ if (rc == -1) { ngx_log_error(NGX_LOG_CRIT, uc->log, ngx_socket_errno, "connect() to %V failed", &uc->server); return NGX_ERROR; } /* UDP sockets are always ready to write */ wev->ready = 1; if (ngx_add_event) { event = (ngx_event_flags & NGX_USE_CLEAR_EVENT) ? /* kqueue, epoll */ NGX_CLEAR_EVENT: /* select, poll, /dev/poll */ NGX_LEVEL_EVENT; /* eventport event type has no meaning: oneshot only */ if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) { return NGX_ERROR; } } else { /* rtsig */ if (ngx_add_conn(c) == NGX_ERROR) { return NGX_ERROR; } } return NGX_OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -