X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fnetwork%2F__ipparse.c;h=b0647aacebe3d5098f67d04840779845f00add01;hb=8389520ed5ad6f0033d6426e21ef653fa5ca26a4;hp=ca9e58902189bd8a7313c83f0acc1caa3e5ded6f;hpb=0b44a0315b47dd8eced9f3b7f31580cf14bbfc01;p=musl diff --git a/src/network/__ipparse.c b/src/network/__ipparse.c index ca9e5890..b0647aac 100644 --- a/src/network/__ipparse.c +++ b/src/network/__ipparse.c @@ -2,11 +2,13 @@ #include #include #include +#include #include "__dns.h" #include -int __ipparse(void *dest, int family, const char *s) +int __ipparse(void *dest, int family, const char *s0) { + const char *s = s0; unsigned char *d = dest; unsigned long a[16] = { 0 }; const char *z; @@ -14,9 +16,10 @@ int __ipparse(void *dest, int family, const char *s) if (family == AF_INET6) goto not_v4; - for (i=0; i<4 && *s; i++) { + for (i=0; i<4; i++) { a[i] = strtoul(s, (char **)&z, 0); if (z==s || (*z && *z != '.')) goto not_v4; + if (!*z) break; s=z+1; } switch (i) { @@ -36,5 +39,7 @@ int __ipparse(void *dest, int family, const char *s) return 0; not_v4: - return -1; + s = s0; + ((struct sockaddr_in6 *)d)->sin6_family = AF_INET6; + return inet_pton(AF_INET6, s, (void *)&((struct sockaddr_in6 *)d)->sin6_addr) <= 0 ? -1 : 0; }