1 #include <sys/socket.h>
7 const char *inet_ntop(int af
, const void *restrict a0
, char *restrict s
, socklen_t l
)
9 const unsigned char *a
= a0
;
15 if (snprintf(s
, l
, "%d.%d.%d.%d", a
[0],a
[1],a
[2],a
[3]) < l
)
19 if (memcmp(a
, "\0\0\0\0\0\0\0\0\0\0\377\377", 12))
20 snprintf(buf
, sizeof buf
,
21 "%x:%x:%x:%x:%x:%x:%x:%x",
22 256*a
[0]+a
[1],256*a
[2]+a
[3],
23 256*a
[4]+a
[5],256*a
[6]+a
[7],
24 256*a
[8]+a
[9],256*a
[10]+a
[11],
25 256*a
[12]+a
[13],256*a
[14]+a
[15]);
27 snprintf(buf
, sizeof buf
,
28 "%x:%x:%x:%x:%x:%x:%d.%d.%d.%d",
29 256*a
[0]+a
[1],256*a
[2]+a
[3],
30 256*a
[4]+a
[5],256*a
[6]+a
[7],
31 256*a
[8]+a
[9],256*a
[10]+a
[11],
32 a
[12],a
[13],a
[14],a
[15]);
33 /* Replace longest /(^0|:)[:0]{2,}/ with "::" */
34 for (i
=best
=0, max
=2; buf
[i
]; i
++) {
35 if (i
&& buf
[i
] != ':') continue;
36 j
= strspn(buf
+i
, ":0");
37 if (j
>max
) best
=i
, max
=j
;
40 buf
[best
] = buf
[best
+1] = ':';
41 memmove(buf
+best
+2, buf
+best
+max
, i
-best
-max
+1);
43 if (strlen(buf
) < l
) {