1 #include "libc.h"
2 #include <arpa/inet.h>
3 #include <ctype.h>
4 #include <netinet/in.h>
5 #include <sys/socket.h>
6 
__inet_aton(const char * s0,struct in_addr * dest)7 int __inet_aton(const char* s0, struct in_addr* dest) {
8     const char* s = s0;
9     unsigned char* d = (void*)dest;
10     unsigned long a[4] = {};
11     char* z;
12     int i;
13 
14     for (i = 0; i < 4; i++) {
15         a[i] = strtoul(s, &z, 0);
16         if (z == s || (*z && *z != '.') || !isdigit(*s))
17             return 0;
18         if (!*z)
19             break;
20         s = z + 1;
21     }
22     if (i == 4)
23         return 0;
24     switch (i) {
25     case 0:
26         a[1] = a[0] & 0xffffff;
27         a[0] >>= 24;
28     case 1:
29         a[2] = a[1] & 0xffff;
30         a[1] >>= 16;
31     case 2:
32         a[3] = a[2] & 0xff;
33         a[2] >>= 8;
34     }
35     for (i = 0; i < 4; i++) {
36         if (a[i] > 255)
37             return 0;
38         d[i] = a[i];
39     }
40     return 1;
41 }
42 
43 weak_alias(__inet_aton, inet_aton);
44