From 4ae79545470c374834487e5d5b2559ae7d430c43 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Fri, 5 Apr 2013 14:09:41 +0200 Subject: ape: inet_ntop() print v4 mapped addresses in v6 as dotted quad --- sys/src/ape/lib/bsd/inet_ntop.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/sys/src/ape/lib/bsd/inet_ntop.c b/sys/src/ape/lib/bsd/inet_ntop.c index 0f9c9e2b0..7f4e88c8f 100644 --- a/sys/src/ape/lib/bsd/inet_ntop.c +++ b/sys/src/ape/lib/bsd/inet_ntop.c @@ -15,16 +15,21 @@ char* inet_ntop(int af, void *src, char *dst, int size) { + static unsigned char v4prefix[12] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, }; + unsigned char *p; - char *t, *e; + char *t; int i; if(af == AF_INET){ + p = (unsigned char*)&(((struct in_addr*)src)->s_addr); +Dot4: if(size < INET_ADDRSTRLEN){ errno = ENOSPC; return 0; } - p = (unsigned char*)&(((struct in_addr*)src)->s_addr); snprintf(dst, size, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); return dst; } @@ -33,21 +38,26 @@ inet_ntop(int af, void *src, char *dst, int size) errno = EAFNOSUPPORT; return 0; } + + p = (unsigned char*)((struct in6_addr*)src)->s6_addr; + if(memcmp(p, v4prefix, 12) == 0){ + p += 12; + goto Dot4; + } + if(size < INET6_ADDRSTRLEN){ errno = ENOSPC; return 0; } - p = (unsigned char*)((struct in6_addr*)src)->s6_addr; t = dst; - e = t + size; for(i=0; i<16; i += 2){ unsigned int w; if(i > 0) *t++ = ':'; w = p[i]<<8 | p[i+1]; - snprintf(t, e - t, "%x", w); + sprintf(t, "%x", w); t += strlen(t); } return dst; -- cgit v1.2.3