/* * inet_ntop.c * * Simple version of inet_ntop() * */ #include "config.h" extern int errno; const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) { char *p; switch(af) { case AF_INET: p = inet_ntoa(*((struct in_addr *)src)); if (p) { if (cnt <= strlen(p)) { errno = ENOSPC; dst = NULL; } else strcpy(dst, p); } else dst = NULL; break; #ifdef HAVE_IPV6 case AF_INET6: if (cnt < 40) { errno = ENOSPC; dst = NULL; } else { struct in6_addr *a = src; int i; p = (char *)dst; /* we do not compress :0: to :: */ for (i = 0; i < 8; i++) p += sprintf(p, "%x:", ntohs(a->s6_addr16[i])); p--; *p = 0; } break; #endif default: errno = EAFNOSUPPORT; dst = NULL; } return dst; }