diff options
Diffstat (limited to 'nameinfo.c')
-rw-r--r-- | nameinfo.c | 43 |
1 files changed, 22 insertions, 21 deletions
@@ -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"); } |