chiark / gitweb /
Make adns__sockaddr_ntop use a caller-supplied buffer.
[adns] / src / general.c
index 4404b31109191d4754f65246beb654bd2324fee4..7703254500c51b87bea4af19056f4f14e6f16a88 100644 (file)
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
+#include <netdb.h>
 
 #include "internal.h"
 
 /* Core diagnostic functions */
 
+const char *adns__sockaddr_ntoa(struct sockaddr *sa, size_t n, char *buf)
+{
+  int err;
+
+  err = getnameinfo(sa, n, buf, MAX_ADDRSTRLEN, 0, 0, NI_NUMERICHOST);
+  assert(!err);
+  return buf;
+}
+
 void adns__vlprintf(adns_state ads, const char *fmt, va_list al) {
   ads->logfn(ads,ads->logfndata,fmt,al);
 }
@@ -50,6 +60,7 @@ void adns__lprintf(adns_state ads, const char *fmt, ...) {
 
 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;
   
@@ -83,7 +94,9 @@ void adns__vdiag(adns_state ads, const char *pfx, adns_initflags prevent,
   }
   
   if (serv>=0) {
-    adns__lprintf(ads,"%sNS=%s",bef,inet_ntoa(ads->servers[serv].addr));
+    adns__lprintf(ads,"%sNS=%s",bef,
+                 adns__sockaddr_ntoa(&ads->servers[serv].addr.sa,
+                                     ads->servers[serv].len, buf));
     bef=", "; aft=")\n";
   }
 
@@ -209,7 +222,7 @@ adns_status adns_rr_info(adns_rrtype type,
 
   if (rrtname_r) *rrtname_r= typei->rrtname;
   if (fmtname_r) *fmtname_r= typei->fmtname;
-  if (len_r) *len_r= typei->rrsz;
+  if (len_r) *len_r= typei->getrrsz ? typei->getrrsz(type) : typei->rrsz;
 
   if (!datap) return adns_s_ok;