X-Git-Url: https://git.distorted.org.uk/~mdw/tripe/blobdiff_plain/d98625f4404ba4fca4f395bc72f15d68043d75b4..870ff51ad8e7fd068afb22c25701577d54828edb:/server/admin.c diff --git a/server/admin.c b/server/admin.c index 0ec187ce..72f42f29 100644 --- a/server/admin.c +++ b/server/admin.c @@ -1100,17 +1100,29 @@ static void a_resolve(admin *a, admin_resop *r, const char *tag, { struct timeval tv; unsigned long pt; + int af = AF_UNSPEC; + const char *fam = "ANY"; char *p; - int i = 0; + int i = 0, j; /* --- Fill in the easy bits of address --- */ r->bg.tag = ""; r->addr = 0; r->func = func; - if (mystrieq(av[i], "inet")) i++; + if (mystrieq(av[i], "any")) + { fam = "ANY"; af = AF_UNSPEC; i++; } + else for (j = 0; j < NADDRFAM; j++) { + if (mystrieq(av[i], aftab[j].name)) { + assert(udpsock[j].fd >= 0); + fam = aftab[j].name; + af = aftab[j].af; + i++; + break; + } + } if (ac - i != 1 && ac - i != 2) { - a_fail(a, "bad-addr-syntax", "[inet] ADDRESS [PORT]", A_END); + a_fail(a, "bad-addr-syntax", "[FAMILY] ADDRESS [PORT]", A_END); goto fail; } r->addr = xstrdup(av[i]); @@ -1141,8 +1153,18 @@ static void a_resolve(admin *a, admin_resop *r, const char *tag, if (a_bgadd(a, &r->bg, tag, a_rescancel)) goto fail; - T( trace(T_ADMIN, "admin: %u, resop %s, hostname `%s'", - a->seq, BGTAG(r), r->addr); ) + T( trace(T_ADMIN, "admin: %u, resop %s, hostname `%s', family `%s'", + a->seq, BGTAG(r), r->addr, fam); ) + + /* --- Make sure the address family is something we can implement --- */ + + if (af != AF_UNSPEC && af != AF_INET) { + T( trace(T_ADMIN, "admin: resop %s failed: unsupported address family", + BGTAG(r)); ) + a_bgfail(&r->bg, "resolve-error", "%s", r->addr, A_END); + goto fail_release; + } + assert(udpsock[AFIX_INET].fd >= 0); /* --- If the name is numeric, do it the easy way --- */ @@ -1168,6 +1190,12 @@ fail: func(r, ARES_FAIL); if (r->addr) xfree(r->addr); xfree(r); + return; + +fail_release: + func(r, ARES_FAIL); + xfree(r->addr); + a_bgrelease(&r->bg); } /*----- Option parsing ----------------------------------------------------*/