18 #if defined(LIBC_SCCS) && !defined(lint)
19 static const char rcsid[] =
"$Id: inet_ntop.c,v 1.3.18.2 2005/11/03 23:02:22 marka Exp $";
21 #include <sys/cdefs.h>
24 #include <sys/param.h>
25 #include <sys/socket.h>
26 #include <sys/systm.h>
28 #include <netinet/in.h>
35 static char *
inet_ntop4(
const u_char *src,
char *dst, socklen_t size);
36 static char *
inet_ntop6(
const u_char *src,
char *dst, socklen_t size);
47 inet_ntop(
int af,
const void *src,
char *dst, socklen_t size)
74 static const char fmt[] =
"%u.%u.%u.%u";
75 char tmp[
sizeof "255.255.255.255"];
78 l = snprintf(tmp,
sizeof(tmp), fmt, src[0], src[1], src[2], src[3]);
79 if (l <= 0 || (socklen_t) l >= size) {
102 char tmp[
sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp;
103 struct {
int base, len; } best, cur;
104 #define NS_IN6ADDRSZ 16
114 memset(words,
'\0',
sizeof words);
116 words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3));
121 for (i = 0; i < (NS_IN6ADDRSZ /
NS_INT16SZ); i++) {
124 cur.base = i, cur.len = 1;
128 if (cur.base != -1) {
129 if (best.base == -1 || cur.len > best.len)
135 if (cur.base != -1) {
136 if (best.base == -1 || cur.len > best.len)
139 if (best.base != -1 && best.len < 2)
146 for (i = 0; i < (NS_IN6ADDRSZ /
NS_INT16SZ); i++) {
148 if (best.base != -1 && i >= best.base &&
149 i < (best.base + best.len)) {
158 if (i == 6 && best.base == 0 && (best.len == 6 ||
159 (best.len == 7 && words[7] != 0x0001) ||
160 (best.len == 5 && words[5] == 0xffff))) {
161 if (!
inet_ntop4(src+12, tp,
sizeof tmp - (tp - tmp)))
166 tp += sprintf(tp,
"%x", words[i]);
169 if (best.base != -1 && (best.base + best.len) ==
177 if ((socklen_t)(tp - tmp) > size) {
static char * inet_ntop6(const u_char *src, char *dst, socklen_t size)
size_t strlen(const char *str)
size_t strlcpy(char *__restrict dst, const char *__restrict src, size_t siz)
static char * inet_ntop4(const u_char *src, char *dst, socklen_t size)
void * memset(void *b, int c, size_t len)
char * strcpy(char *__restrict to, const char *__restrict from)
char * inet_ntop(int af, const void *src, char *dst, socklen_t size)