projects
/
musl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
mips clone: don't free stack space used to copy arg
[musl]
/
src
/
network
/
__ipparse.c
diff --git
a/src/network/__ipparse.c
b/src/network/__ipparse.c
index
ca9e589
..
b0647aa
100644
(file)
--- a/
src/network/__ipparse.c
+++ b/
src/network/__ipparse.c
@@
-2,11
+2,13
@@
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
+#include <arpa/inet.h>
#include "__dns.h"
#include <stdio.h>
#include "__dns.h"
#include <stdio.h>
-int __ipparse(void *dest, int family, const char *s)
+int __ipparse(void *dest, int family, const char *s
0
)
{
{
+ const char *s = s0;
unsigned char *d = dest;
unsigned long a[16] = { 0 };
const char *z;
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;
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;
a[i] = strtoul(s, (char **)&z, 0);
if (z==s || (*z && *z != '.')) goto not_v4;
+ if (!*z) break;
s=z+1;
}
switch (i) {
s=z+1;
}
switch (i) {
@@
-36,5
+39,7
@@
int __ipparse(void *dest, int family, const char *s)
return 0;
not_v4:
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;
}
}