📄 resolver.c
字号:
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 + -