blob: 377bab7bf2ef4975002a6e08e5d331e505dc19b2 [file] [log] [blame]
/*
* inet/inet_ntop.c
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <arpa/inet.h>
#include <netinet/in6.h>
const char *inet_ntop(int af, const void *cp, char *buf, size_t len)
{
size_t xlen;
switch ( af ) {
case AF_INET:
{
union {
uint8_t b[4];
uint32_t l;
} a;
a.l = ((const struct in_addr *)cp)->s_addr;
xlen = snprintf(buf, len, "%u.%u.%u.%u", a.b[0], a.b[1], a.b[2], a.b[3]);
}
break;
case AF_INET6:
{
const struct in6_addr *s = (const struct in6_addr *)cp;
xlen = snprintf(buf, len, "%x:%x:%x:%x:%x:%x:%x:%x",
ntohs(s->s6_addr16[0]), ntohs(s->s6_addr16[1]),
ntohs(s->s6_addr16[2]), ntohs(s->s6_addr16[3]),
ntohs(s->s6_addr16[4]), ntohs(s->s6_addr16[5]),
ntohs(s->s6_addr16[6]), ntohs(s->s6_addr16[7]));
}
break;
default:
errno = EAFNOSUPPORT;
return NULL;
}
if ( xlen > len ) {
errno = ENOSPC;
return NULL;
}
return buf;
}