⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ngx_resolver.c

📁 Nginx是一个高性能的HTTP和反向代理服务器
💻 C
📖 第 1 页 / 共 4 页
字号:
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 + -