53 lines
1.0 KiB
C
53 lines
1.0 KiB
C
|
/*
|
||
|
* 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;
|
||
|
}
|