about summary refs log tree commit homepage
path: root/nameinfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'nameinfo.c')
-rw-r--r--nameinfo.c43
1 files changed, 22 insertions, 21 deletions
diff --git a/nameinfo.c b/nameinfo.c
index 5d9122f..f5af802 100644
--- a/nameinfo.c
+++ b/nameinfo.c
@@ -3,45 +3,46 @@
  * License: GPLv3 or later (see COPYING for details)
  */
 #include "cmogstored.h"
+#include <arpa/inet.h>
 
 /*
- * small wrapper around getnameinfo(3), this only handles numeric types
+ * small replacement for getnameinfo(3), this only handles numeric types
  * for IPv4 and IPv6 and uses the compact mog_ni structure to reduce
  * stack usage in error reporting.
- *
- * returns the return value of getnameinfo(3)
  */
-int mog_nameinfo(struct sockaddr *sa, socklen_t len, struct mog_ni *ni)
+void mog_nameinfo(struct mog_packaddr *mpa, struct mog_ni *ni)
 {
         char *hostptr = ni->ni_host;
         size_t hostlen = sizeof(ni->ni_host) - (sizeof("[]") - 1);
-
         char *servptr = ni->ni_serv + 1; /* offset for ':' */
         size_t servlen = sizeof(ni->ni_serv) - 1; /* offset for ':' */
-
-        int flags = NI_NUMERICHOST | NI_NUMERICSERV;
         int rc;
+        const void *src;
+        const char *ret;
 
-        if (sa->sa_family == AF_INET6) {
+        if (mpa->sa_family == AF_INET6) {
                 hostptr[0] = '['; /* leading '[' */
+                src = mpa->as.in6_ptr;
                 hostptr++;
+        } else {
+                assert(mpa->sa_family == AF_INET && "bad family");
+                src = &mpa->as.in_addr;
         }
 
-        rc = getnameinfo(sa, len, hostptr, hostlen, servptr, servlen, flags);
+        ret = inet_ntop(mpa->sa_family, src, hostptr, (socklen_t)hostlen);
 
         /* terminate serv string on error */
-        if (rc != 0) {
-                ni->ni_serv[0] = 0;
-        } else {
-                ni->ni_serv[0] = ':';
-
-                /* add trailing ']' */
-                if (sa->sa_family == AF_INET6) {
-                        hostlen = strlen(hostptr);
-                        hostptr[hostlen] = ']';
-                        hostptr[hostlen + 1] = 0;
-                }
+        assert(ret == hostptr && "inet_ntop");
+        ni->ni_serv[0] = ':';
+
+        /* add trailing ']' */
+        if (mpa->sa_family == AF_INET6) {
+                hostlen = strlen(hostptr);
+                hostptr[hostlen] = ']';
+                hostptr[hostlen + 1] = 0;
         }
 
-        return rc;
+        /* port number */
+        rc = snprintf(servptr, servlen, "%u", (unsigned)ntohs(mpa->port));
+        assert(rc > 0 && rc < (int)servlen && "we suck at snprintf");
 }