X-Git-Url: https://git.distorted.org.uk/~mdw/tripe/blobdiff_plain/cb2c2bfcff87c4d6959fe3ccf47a4b509f933e9c..8d513103f66617e96234d19813ab655ed9d5d13d:/server/admin.c?ds=sidebyside diff --git a/server/admin.c b/server/admin.c index aafe0b9c..c5fed8b0 100644 --- a/server/admin.c +++ b/server/admin.c @@ -1020,13 +1020,17 @@ static void a_resolved(struct hostent *h, void *v) { admin_resop *r = v; - T( trace(T_ADMIN, "admin: resop %s resolved", BGTAG(r)); ) QUICKRAND; if (!h) { + T( trace(T_ADMIN, "admin: resop %s failed: %s", + BGTAG(r), hstrerror(h_errno)); ) a_bgfail(&r->bg, "resolve-error", "%s", r->addr, A_END); r->func(r, ARES_FAIL); } else { + T( trace(T_ADMIN, "admin: resop %s ok", BGTAG(r)); ) + r->sa.sin.sin_family = AF_INET; memcpy(&r->sa.sin.sin_addr, h->h_addr, sizeof(struct in_addr)); + r->sa.sin.sin_port = htons(r->port); r->func(r, ARES_OK); } sel_rmtimer(&r->t); @@ -1128,7 +1132,7 @@ static void a_resolve(admin *a, admin_resop *r, const char *tag, a_fail(a, "invalid-port", "%lu", pt, A_END); goto fail; } - r->sa.sin.sin_port = htons(pt); + r->port = pt; /* --- Report backgrounding --- * * @@ -1145,6 +1149,8 @@ static void a_resolve(admin *a, admin_resop *r, const char *tag, if (inet_aton(av[i], &r->sa.sin.sin_addr)) { T( trace(T_ADMIN, "admin: resop %s done the easy way", BGTAG(r)); ) + r->sa.sin.sin_family = AF_INET; + r->sa.sin.sin_port = htons(r->port); func(r, ARES_OK); xfree(r->addr); a_bgrelease(&r->bg); @@ -1666,7 +1672,24 @@ static void acmd_warn(admin *a, unsigned ac, char *av[]) { alertcmd(a, AF_WARN, AF_WARN, "WARN", av); } static void acmd_port(admin *a, unsigned ac, char *av[]) - { a_info(a, "%u", p_port(), A_END); a_ok(a); } +{ + int i; + + if (ac) { + for (i = 0; i < NADDRFAM; i++) + if (mystrieq(av[0], aftab[i].name)) goto found; + a_fail(a, "unknown-address-family", "%s", av[0], A_END); + return; + found: + assert(udpsock[i].fd >= 0); + } else { + for (i = 0; i < NADDRFAM; i++) + if (udpsock[i].fd >= 0) goto found; + abort(); + } + a_info(a, "%u", p_port(i), A_END); + a_ok(a); +} static void acmd_daemon(admin *a, unsigned ac, char *av[]) { @@ -1829,7 +1852,6 @@ static void acmd_addr(admin *a, unsigned ac, char *av[]) if ((p = a_findpeer(a, av[0])) != 0) { ad = p_addr(p); - assert(ad->sa.sa_family == AF_INET); a_info(a, "?ADDR", ad, A_END); a_ok(a); } @@ -1977,7 +1999,7 @@ static const acmd acmdtab[] = { { "notify", "MESSAGE ...", 1, 0xffff, acmd_notify }, { "peerinfo", "PEER", 1, 1, acmd_peerinfo }, { "ping", "[OPTIONS] PEER", 1, 0xffff, acmd_ping }, - { "port", 0, 0, 0, acmd_port }, + { "port", "[FAMILY]", 0, 1, acmd_port }, { "quit", 0, 0, 0, acmd_quit }, { "reload", 0, 0, 0, acmd_reload }, { "servinfo", 0, 0, 0, acmd_servinfo }, @@ -2361,7 +2383,6 @@ again: sig_add(&s_term, SIGTERM, a_sigdie, 0); sig_add(&s_hup, SIGHUP, a_sighup, 0); - signal(SIGPIPE, SIG_IGN); sigaction(SIGINT, 0, &sa); if (sa.sa_handler != SIG_IGN) sig_add(&s_int, SIGINT, a_sigdie, 0);