blob: 1309feb26bf2f8f41037834186877ec63284932d [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:
{
uint32_t v = ((const struct in_addr *)cp)->s_addr;
xlen = snprintf(buf, len, "%u.%u.%u.%u",
(v >> 24), (v >> 16) & 0xff, (v >> 8) & 0xff, v & 0xff);
}
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;
}