diff --git a/socket/scan_ip4.c b/socket/scan_ip4.c index 18f4394..e375de2 100644 --- a/socket/scan_ip4.c +++ b/socket/scan_ip4.c @@ -13,7 +13,7 @@ unsigned int scan_ip4(const char *s,char ip[4]) len+=(j=scan_ulong(s,&u))+1; if (!j) return 0; ip[i]=u; s+=j; - if (*s!='.') return 0; ++s; + if (i<3 && *s!='.') return 0; ++s; } return len-1; } diff --git a/socket/scan_ip6.c b/socket/scan_ip6.c index 3598fc6..52f22b7 100644 --- a/socket/scan_ip6.c +++ b/socket/scan_ip6.c @@ -22,6 +22,10 @@ unsigned int scan_ip6(const char *s,char ip[16]) for (i=0; i<16; i++) ip[i]=0; + if ((i=scan_ip4(s,ip+12))) { + for (len=0; len<12; ++len) ip[len]=V4mappedprefix[len]; + return i; + } for (;;) { if (*s == ':') { len++; @@ -36,7 +40,7 @@ unsigned int scan_ip6(const char *s,char ip[16]) if (!i) return 0; if (prefixlen==12 && s[i]=='.') { /* the last 4 bytes may be written as IPv4 address */ - i=ip4_scan(s,ip+12); + i=scan_ip4(s,ip+12); if (i) return i+len; else @@ -64,7 +68,7 @@ unsigned int scan_ip6(const char *s,char ip[16]) break; } if (suffixlen+prefixlen<=12 && s[i]=='.') { - int j=ip4_scan(s,suffix+suffixlen); + int j=scan_ip4(s,suffix+suffixlen); if (j) { suffixlen+=4; len+=j; diff --git a/socket/socket_mcleave6.c b/socket/socket_mcleave6.c index 2e8e706..a5ce240 100644 --- a/socket/socket_mcleave6.c +++ b/socket/socket_mcleave6.c @@ -25,11 +25,7 @@ int socket_mcleave6(int s,const char ip[16]) return socket_mcleave4(s,ip+12); #ifdef LIBC_HAS_IP6 byte_copy(&opt.ipv6mr_multiaddr,16,ip); -#ifdef __GLIBC__ opt.ipv6mr_interface=0; -#else - opt.ipv6mr_ifindex=0; -#endif return setsockopt(s,IPPROTO_IPV6,IPV6_DROP_MEMBERSHIP,&opt,sizeof opt); #else errno=EPROTO; diff --git a/t.c b/t.c index 4a6e572..445b419 100644 --- a/t.c +++ b/t.c @@ -14,10 +14,19 @@ __asm__ __volatile__ ("rdtsc" : "=a" (low) : : "edx") int main(int argc,char* argv[]) { + char ip[16]; + int i; + if ((i=scan_ip6(argv[1],ip))) { + char buf[128]; + buf[fmt_ip6(buf,ip)]=0; + puts(buf); + } +#if 0 char buf[100]; strcpy(buf,"foobarbaz"); buf[fmt_fill(buf,3,5,100)]=0; printf("\"%s\"\n",buf); +#endif #if 0 unsigned long len; char *c=mmap_read("/etc/passwd",&len);