diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/network/inet_ntop.c | 22 | 
1 files changed, 14 insertions, 8 deletions
| diff --git a/src/network/inet_ntop.c b/src/network/inet_ntop.c index 76ae556c..e9e2823f 100644 --- a/src/network/inet_ntop.c +++ b/src/network/inet_ntop.c @@ -18,14 +18,20 @@ const char *inet_ntop(int af, const void *restrict a0, char *restrict s, socklen  			return s;  		break;  	case AF_INET6: -		memset(buf, 'x', sizeof buf); -		buf[sizeof buf-1]=0; -		snprintf(buf, sizeof buf, -			"%x:%x:%x:%x:%x:%x:%x:%x", -			256*a[0]+a[1],256*a[2]+a[3], -			256*a[4]+a[5],256*a[6]+a[7], -			256*a[8]+a[9],256*a[10]+a[11], -			256*a[12]+a[13],256*a[14]+a[15]); +		if (memcmp(a, "\0\0\0\0\0\0\0\0\0\0\377\377", 12)) +			snprintf(buf, sizeof buf, +				"%x:%x:%x:%x:%x:%x:%x:%x", +				256*a[0]+a[1],256*a[2]+a[3], +				256*a[4]+a[5],256*a[6]+a[7], +				256*a[8]+a[9],256*a[10]+a[11], +				256*a[12]+a[13],256*a[14]+a[15]); +		else +			snprintf(buf, sizeof buf, +				"%x:%x:%x:%x:%x:%x:%d.%d.%d.%d", +				256*a[0]+a[1],256*a[2]+a[3], +				256*a[4]+a[5],256*a[6]+a[7], +				256*a[8]+a[9],256*a[10]+a[11], +				a[12],a[13],a[14],a[15]);  		/* Replace longest /(^0|:)[:0]{2,}/ with "::" */  		for (i=best=0, max=2; buf[i]; i++) {  			if (i && buf[i] != ':') continue; | 
