int adns_processreadable(adns_state ads, int fd, const struct timeval *now) {
int want, dgramlen, r, i, udpaddrlen, serv, old_skip;
byte udpbuf[DNS_MAXUDP];
+ char addrbuf[MAX_ADDRSTRLEN];
struct udpsocket *udp;
adns_sockaddr udpaddr;
serv++);
if (serv >= ads->nservers) {
adns__warn(ads,-1,0,"datagram received from unknown nameserver %s",
- adns__sockaddr_ntoa(&udpaddr.sa, udpaddrlen));
+ adns__sockaddr_ntoa(&udpaddr.sa, udpaddrlen, addrbuf));
continue;
}
adns__procdgram(ads,udpbuf,r,serv,0,*now);
/* Core diagnostic functions */
-const char *adns__sockaddr_ntoa(struct sockaddr *sa, size_t n)
+const char *adns__sockaddr_ntoa(struct sockaddr *sa, size_t n, char *buf)
{
- static char buf[64];
int err;
- err = getnameinfo(sa, n, buf, sizeof(buf), 0, 0, NI_NUMERICHOST);
+ err = getnameinfo(sa, n, buf, MAX_ADDRSTRLEN, 0, 0, NI_NUMERICHOST);
assert(!err);
return buf;
}
void adns__vdiag(adns_state ads, const char *pfx, adns_initflags prevent,
int serv, adns_query qu, const char *fmt, va_list al) {
+ char buf[MAX_ADDRSTRLEN];
const char *bef, *aft;
vbuf vb;
if (serv>=0) {
adns__lprintf(ads,"%sNS=%s",bef,
adns__sockaddr_ntoa(&ads->servers[serv].addr.sa,
- ads->servers[serv].len));
+ ads->servers[serv].len, buf));
bef=", "; aft=")\n";
}
#define DNS_IP6_ARPA "ip6", "arpa"
#define ADDR_MAXRRTYPES 2
+#define MAX_ADDRSTRLEN 64
#define STRINGIFY(x) REALLY_STRINGIFY(x)
#define REALLY_STRINGIFY(x) #x
/* From general.c: */
-const char *adns__sockaddr_ntoa(struct sockaddr *sa, size_t n);
+const char *adns__sockaddr_ntoa(struct sockaddr *sa, size_t n, char *buf);
+/* Buffer must be at least MAX_ADDRSTRLEN bytes long. */
+
void adns__vlprintf(adns_state ads, const char *fmt, va_list al);
void adns__lprintf(adns_state ads, const char *fmt,
...) PRINTFFORMAT(2,3);
int i;
adns_rr_addr *ss;
const afinfo *ai;
+ char buf[MAX_ADDRSTRLEN];
ai = find_afinfo(sa->sa_family);
if (!ai) {
adns__diag(ads,-1,0,
"nameserver %s for unknown address family %d ignored",
- adns__sockaddr_ntoa(sa, n), sa->sa_family);
+ adns__sockaddr_ntoa(sa, n, buf), sa->sa_family);
}
for (i=0; i<ads->nservers; i++) {
if (ads->servers[i].addr.sa.sa_family == sa->sa_family &&
ai->sockaddr_equalp(sa, &ads->servers[i].addr.sa)) {
adns__debug(ads,-1,0,"duplicate nameserver %s ignored",
- adns__sockaddr_ntoa(sa, n));
+ adns__sockaddr_ntoa(sa, n, buf));
return;
}
}
if (ads->nservers>=MAXSERVERS) {
adns__diag(ads,-1,0,"too many nameservers, ignoring %s",
- adns__sockaddr_ntoa(sa, n));
+ adns__sockaddr_ntoa(sa, n, buf));
return;
}
static void ccf_nameserver(adns_state ads, const char *fn,
int lno, const char *buf) {
struct addrinfo *ai, ai_hint = { 0 };
+ char addrbuf[MAX_ADDRSTRLEN];
int err;
ai_hint.ai_family = AF_UNSPEC;
}
adns__debug(ads,-1,0,"using nameserver %s",
- adns__sockaddr_ntoa(ai->ai_addr, ai->ai_addrlen));
+ adns__sockaddr_ntoa(ai->ai_addr, ai->ai_addrlen, addrbuf));
addserver(ads, ai->ai_addr, ai->ai_addrlen);
freeaddrinfo(ai);
}