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

📄 resolver.c

📁 这是一个完全开放的
💻 C
📖 第 1 页 / 共 2 页
字号:
                            snprintf(num, 10, "%d", ascan->ttl);                            nad_set_attr(nad, eip, -1, "ttl", num, 0);                            nres++;                        }                        dns_free(as);                    }                    /* resolve to AAAA records */                    if(r->resolve_aaaa) {                        for(srvscan = srvs; srvscan != NULL; srvscan = srvscan->next) {                            log_debug(ZONE, "%s has srv %s, doing AAAA lookup", zone, ((dns_srv_t) srvscan->rr)->name);                            as = dns_resolve(((dns_srv_t) srvscan->rr)->name, DNS_QUERY_TYPE_AAAA);                            for(ascan = as; ascan != NULL; ascan = ascan->next) {                                log_write(r->log, LOG_NOTICE, "[%s] resolved to [%s]:%d (%d seconds to live)", zone, (char *)ascan->rr, ((dns_srv_t) srvscan->rr)->port, ascan->ttl);                                eip = nad_insert_elem(nad, 1, NAD_ENS(nad, 1), "ip", (char *)ascan->rr);                                snprintf(num, 10, "%d", ((dns_srv_t) srvscan->rr)->port);                                nad_set_attr(nad, eip, -1, "port", num, 0);                                snprintf(num, 10, "%d", ascan->ttl);                                nad_set_attr(nad, eip, -1, "ttl", num, 0);                                nres++;                            }                            dns_free(as);                        }                    }                    dns_free(srvs);                }                srv++;            }            /* AAAA/A fallback */            if(nres == 0) {                snprintf(zone, 256, "%.*s", NAD_AVAL_L(nad, aname), NAD_AVAL(nad, aname));                /* A lookup */                log_debug(ZONE, "doing A lookup for %s", zone);                as = dns_resolve(zone, DNS_QUERY_TYPE_A);                for(ascan = as; ascan != NULL; ascan = ascan->next) {                    log_write(r->log, LOG_NOTICE, "[%s] resolved to [%s:5269] (%d seconds to live)", zone, (char *) ascan->rr, ascan->ttl);                    eip = nad_insert_elem(nad, 1, NAD_ENS(nad, 1), "ip", (char *) ascan->rr);                    nad_set_attr(nad, eip, -1, "port", "5269", 4);                    snprintf(num, 10, "%d", ascan->ttl);                    nad_set_attr(nad, eip, -1, "ttl", num, 0);                }                dns_free(as);                /* AAAA lookup */                if(r->resolve_aaaa) {                    log_debug(ZONE, "doing AAAA lookup for %s", zone);                    as = dns_resolve(zone, DNS_QUERY_TYPE_AAAA);                    for(ascan = as; ascan != NULL; ascan = ascan->next)                    {                        log_write(r->log, LOG_NOTICE, "[%s] resolved to [%s]:5269 (%d seconds to live)", zone, (char *)ascan->rr, ascan->ttl);                        eip = nad_insert_elem(nad, 1, NAD_ENS(nad, 1), "ip", (char *)ascan->rr);                        nad_set_attr(nad, eip, -1, "port", "5269", 4);                        snprintf(num, 10, "%d", ascan->ttl);                        nad_set_attr(nad, eip, -1, "ttl", num, 0);                    }                    dns_free(as);                }            }            nad_set_attr(nad, 1, -1, "type", "result", 6);            sx_nad_write(r->router, stanza_tofrom(nad, 0));            break;                case event_CLOSED:            mio_close(r->mio, r->fd);            break;    }    return 0;}static int _resolver_mio_callback(mio_t m, mio_action_t a, int fd, void *data, void *arg) {    resolver_t r = (resolver_t) arg;    int nbytes;    switch(a) {        case action_READ:            ioctl(fd, FIONREAD, &nbytes);            if(nbytes == 0) {                sx_kill(r->router);                return 0;            }            log_debug(ZONE, "read action on fd %d", fd);            return sx_can_read(r->router);        case action_WRITE:            log_debug(ZONE, "write action on fd %d", fd);            return sx_can_write(r->router);        case action_CLOSE:            log_debug(ZONE, "close action on fd %d", fd);            log_write(r->log, LOG_NOTICE, "connection to router closed");            resolver_lost_router = 1;            /* we're offline */            r->online = 0;            break;        case action_ACCEPT:            break;    }    return 0;}static int _resolver_router_connect(resolver_t r) {    log_write(r->log, LOG_NOTICE, "attempting connection to router at %s, port=%d", r->router_ip, r->router_port);    r->fd = mio_connect(r->mio, r->router_port, r->router_ip, _resolver_mio_callback, (void *) r);    if(r->fd < 0) {        if(errno == ECONNREFUSED)            resolver_lost_router = 1;        log_write(r->log, LOG_NOTICE, "connection attempt to router failed: %s (%d)", strerror(errno), errno);        return 1;    }    r->router = sx_new(r->sx_env, r->fd, _resolver_sx_callback, (void *) r);    sx_client_init(r->router, 0, NULL, NULL, NULL, "1.0");    return 0;}int main(int argc, char **argv){    resolver_t r;    char *config_file;    int optchar;#ifdef POOL_DEBUG    time_t pool_time = 0;#endif#ifdef HAVE_UMASK    umask((mode_t) 0027);#endif    srand(time(NULL));#ifdef HAVE_WINSOCK2_H/* get winsock running */	{		WORD wVersionRequested;		WSADATA wsaData;		int err;				wVersionRequested = MAKEWORD( 2, 2 );				err = WSAStartup( wVersionRequested, &wsaData );		if ( err != 0 ) {            /* !!! tell user that we couldn't find a usable winsock dll */			return 0;		}	}#endif    jabber_signal(SIGINT, _resolver_signal);    jabber_signal(SIGTERM, _resolver_signal);#ifdef SIGHUP    jabber_signal(SIGHUP, _resolver_signal_hup);#endif#ifdef SIGPIPE    jabber_signal(SIGPIPE, SIG_IGN);#endif    r = (resolver_t) malloc(sizeof(struct resolver_st));    memset(r, 0, sizeof(struct resolver_st));    /* load our config */    r->config = config_new();    config_file = CONFIG_DIR "/resolver.xml";    /* cmdline parsing */    while((optchar = getopt(argc, argv, "Dc:h?")) >= 0)    {        switch(optchar)        {            case 'c':                config_file = optarg;                break;            case 'D':#ifdef DEBUG                set_debug_flag(1);#else                printf("WARN: Debugging not enabled.  Ignoring -D.\n");#endif                break;            case 'h': case '?': default:                fputs(                    "resolver - jabberd asynchronous dns resolver (" VERSION ")\n"                    "Usage: resolver <options>\n"                    "Options are:\n"                    "   -c <config>     config file to use [default: " CONFIG_DIR "/resolver.xml]\n"#ifdef DEBUG                    "   -D              Show debug output\n"#endif                    ,                    stdout);                config_free(r->config);                free(r);                return 1;        }    }    if(config_load(r->config, config_file) != 0)    {        fputs("resolver: couldn't load config, aborting\n", stderr);        config_free(r->config);        free(r);        return 2;    }    _resolver_config_expand(r);    r->log = log_new(r->log_type, r->log_ident, r->log_facility);    log_write(r->log, LOG_NOTICE, "starting up");    _resolver_pidfile(r);    r->sx_env = sx_env_new();#ifdef HAVE_SSL    if(r->router_pemfile != NULL) {        r->sx_ssl = sx_env_plugin(r->sx_env, sx_ssl_init, r->router_pemfile, NULL);        if(r->sx_ssl == NULL) {            log_write(r->log, LOG_ERR, "failed to load SSL pemfile, SSL disabled");            r->router_pemfile = NULL;        }    }#endif    /* get sasl online */    r->sx_sasl = sx_env_plugin(r->sx_env, sx_sasl_init, NULL, NULL, 0);    if(r->sx_sasl == NULL) {        log_write(r->log, LOG_ERR, "failed to initialise SASL context, aborting");        exit(1);    }    r->mio = mio_new(1023);    r->retry_left = r->retry_init;    _resolver_router_connect(r);    while(!resolver_shutdown) {        mio_run(r->mio, 5);        if(resolver_logrotate) {            log_write(r->log, LOG_NOTICE, "reopening log ...");            log_free(r->log);            r->log = log_new(r->log_type, r->log_ident, r->log_facility);            log_write(r->log, LOG_NOTICE, "log started");            resolver_logrotate = 0;        }        if(resolver_lost_router) {            if(r->retry_left < 0) {                log_write(r->log, LOG_NOTICE, "attempting reconnect");                sleep(r->retry_sleep);                resolver_lost_router = 0;                _resolver_router_connect(r);            }            else if(r->retry_left == 0) {                resolver_shutdown = 1;            }            else {                log_write(r->log, LOG_NOTICE, "attempting reconnect (%d left)", r->retry_left);                r->retry_left--;                sleep(r->retry_sleep);                resolver_lost_router = 0;                _resolver_router_connect(r);            }        }#ifdef POOL_DEBUG        if(time(NULL) > pool_time + 60) {            pool_stat(1);            pool_time = time(NULL);        }#endif    }    log_write(r->log, LOG_NOTICE, "shutting down");        sx_free(r->router);    sx_env_free(r->sx_env);    mio_free(r->mio);        log_free(r->log);    config_free(r->config);    free(r);#ifdef POOL_DEBUG    pool_stat(1);#endif#ifdef HAVE_WINSOCK2_H    WSACleanup();#endif    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -