diff options
Diffstat (limited to 'nameinfo.c')
-rw-r--r-- | nameinfo.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/nameinfo.c b/nameinfo.c new file mode 100644 index 0000000..3a086ae --- /dev/null +++ b/nameinfo.c @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2012-2013, Eric Wong <normalperson@yhbt.net> + * License: GPLv3 or later (see COPYING for details) + */ +#include "cmogstored.h" + +/* + * small wrapper around 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(union mog_sockaddr *any, socklen_t len, 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 ':' */ + + struct sockaddr *sa = mog_sockaddr_sa(any); + int flags = NI_NUMERICHOST | NI_NUMERICSERV; + int rc; + + rc = getnameinfo(sa, len, hostptr, hostlen, servptr, servlen, flags); + + /* terminate serv string on error */ + ni->ni_serv[0] = rc == 0 ? ':' : 0; + + return rc; +} |