Outside of a few functions in `addrmap.c' and `servutil.c'. Name
resolution now fails softly if it encounters an unexpected address
family (which can happen because of numeric conversion through
`getaddrinfo'), and the ADNS query flags are now set via the `aftab'.
{ fam = "ANY"; af = AF_UNSPEC; i++; }
else for (j = 0; j < NADDRFAM; j++) {
if (mystrieq(av[i], aftab[j].name)) {
{ 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);
+ if (udpsock[j].fd < 0) {
+ a_fail(a, "disabled-address-family", "%s", aftab[j].name, A_END);
+ goto fail;
+ }
fam = aftab[j].name;
af = aftab[j].af;
i++;
fam = aftab[j].name;
af = aftab[j].af;
i++;
T( trace(T_ADMIN, "admin: %u, resop %s, hostname `%s', family `%s'",
a->seq, BGTAG(r), r->addr, fam); )
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 --- */
/* --- If the name is numeric, do it the easy way --- */
- aihint.ai_family = AF_INET;
aihint.ai_socktype = SOCK_DGRAM;
aihint.ai_protocol = IPPROTO_UDP;
aihint.ai_flags = AI_NUMERICHOST;
aihint.ai_socktype = SOCK_DGRAM;
aihint.ai_protocol = IPPROTO_UDP;
aihint.ai_flags = AI_NUMERICHOST;
tv.tv_sec += T_RESOLVE;
sel_addtimer(&sel, &r->t, &tv, a_restimer, r);
#ifdef HAVE_LIBADNS
tv.tv_sec += T_RESOLVE;
sel_addtimer(&sel, &r->t, &tv, a_restimer, r);
#ifdef HAVE_LIBADNS
- qf = adns_qf_search | adns_qf_want_ipv4;
+ qf = adns_qf_search;
+ for (j = 0; j < NADDRFAM; j++) {
+ if ((af == AF_UNSPEC || af == aftab[i].af) && udpsock[j].fd >= 0)
+ qf |= aftab[j].qf;
+ }
if ((err = adns_submit(ads, r->addr, adns_r_addr, qf, r, &r->q)) != 0) {
T( trace(T_ADMIN, "admin: resop %s adns_submit failed: %s",
BGTAG(r), strerror(err)); )
if ((err = adns_submit(ads, r->addr, adns_r_addr, qf, r, &r->q)) != 0) {
T( trace(T_ADMIN, "admin: resop %s adns_submit failed: %s",
BGTAG(r), strerror(err)); )
goto fail_release;
}
#else
goto fail_release;
}
#else
+ 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;
+ }
+ if (udpsock[AFIX_INET].fd < 0) {
+ a_bgfail(&r->bg, "disabled-address-family", "INET", A_END);
+ goto fail_release;
+ }
bres_byname(&r->r, r->addr, a_resolved, r);
#endif
return;
bres_byname(&r->r, r->addr, a_resolved, r);
#endif
return;
/*----- Address handling --------------------------------------------------*/
const struct addrfam aftab[] = {
/*----- Address handling --------------------------------------------------*/
const struct addrfam aftab[] = {
-#define DEF(af) { AF_##af, #af },
+#ifdef HAVE_LIBADNS
+# define DEF(af, qf) { AF_##af, #af, adns_qf_##qf },
+#else
+# define DEF(af, qf) { AF_##af, #af },
+#endif
ADDRFAM(DEF)
#undef DEF
};
ADDRFAM(DEF)
#undef DEF
};
/* --- The address-family table --- */
#define ADDRFAM(_) \
/* --- The address-family table --- */
#define ADDRFAM(_) \
-#define ENUM(af) AFIX_##af,
+#define ENUM(af, qf) AFIX_##af,
ADDRFAM(ENUM)
#undef ENUM
NADDRFAM
ADDRFAM(ENUM)
#undef ENUM
NADDRFAM
extern const struct addrfam {
int af;
const char *name;
extern const struct addrfam {
int af;
const char *name;
+#ifdef HAVE_LIBADNS
+ adns_queryflags qf;
+#endif
} aftab[NADDRFAM];
/* --- Socket addresses --- *
} aftab[NADDRFAM];
/* --- Socket addresses --- *