diff --git a/socket/fmt_ip6.c b/socket/fmt_ip6.c index 63f6a18..a23104e 100644 --- a/socket/fmt_ip6.c +++ b/socket/fmt_ip6.c @@ -11,8 +11,10 @@ size_t fmt_ip6(char *s,const char ip[16]) for (k=0; k<16; k+=2) { if (ip[k]==0 && ip[k+1]==0) { if (!compr) { - compr=1; - pos1=k; + if (k==14 || (ip[k+2]==0 && ip[k+3]==0)) { + compr=1; + pos1=k; + } } if (k==14) { k=16; goto last; } } else if (compr) { diff --git a/test/fmt_ip6.c b/test/fmt_ip6.c index 8cbfe1d..727cf8f 100644 --- a/test/fmt_ip6.c +++ b/test/fmt_ip6.c @@ -1,14 +1,19 @@ #include "ip6.h" #include +#include int main() { char buf[100]; int i; - buf[i=fmt_ip6(buf,"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")]=0; assert(i==2 && !strcmp(buf,"::")); - buf[i=fmt_ip6(buf,"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01")]=0; assert(i==3 && !strcmp(buf,"::1")); + buf[i=fmt_ip6(buf,"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")]=0; + assert(i==2 && !strcmp(buf,"::")); + buf[i=fmt_ip6(buf,"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01")]=0; + assert(i==3 && !strcmp(buf,"::1")); buf[i=fmt_ip6(buf,"\xfe\xc0\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x01")]=0; assert(i==16 && !strcmp(buf,"fec0:0:0:ffff::1")); buf[i=fmt_ip6(buf,"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x7f\x00\x00\x01")]=0; assert(i==16 && !strcmp(buf,"::ffff:127.0.0.1")); + buf[i=fmt_ip6(buf,"\x20\x01\x0d\xb8\x00\x00\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01")]=0; + assert(i==20 && !strcmp(buf,"2001:db8:0:1:1:1:1:1")); return 0; }