| Index: fusl/src/network/inet_aton.c
|
| diff --git a/fusl/src/network/inet_aton.c b/fusl/src/network/inet_aton.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0f9a45f66ddee9a0a747be77002208300c692388
|
| --- /dev/null
|
| +++ b/fusl/src/network/inet_aton.c
|
| @@ -0,0 +1,41 @@
|
| +#include <ctype.h>
|
| +#include <sys/socket.h>
|
| +#include <netinet/in.h>
|
| +#include <arpa/inet.h>
|
| +#include "libc.h"
|
| +
|
| +int __inet_aton(const char *s0, struct in_addr *dest)
|
| +{
|
| + const char *s = s0;
|
| + unsigned char *d = (void *)dest;
|
| + unsigned long a[4] = { 0 };
|
| + char *z;
|
| + int i;
|
| +
|
| + for (i=0; i<4; i++) {
|
| + a[i] = strtoul(s, &z, 0);
|
| + if (z==s || (*z && *z != '.') || !isdigit(*s))
|
| + return 0;
|
| + if (!*z) break;
|
| + s=z+1;
|
| + }
|
| + if (i==4) return 0;
|
| + switch (i) {
|
| + case 0:
|
| + a[1] = a[0] & 0xffffff;
|
| + a[0] >>= 24;
|
| + case 1:
|
| + a[2] = a[1] & 0xffff;
|
| + a[1] >>= 16;
|
| + case 2:
|
| + a[3] = a[2] & 0xff;
|
| + a[2] >>= 8;
|
| + }
|
| + for (i=0; i<4; i++) {
|
| + if (a[i] > 255) return 0;
|
| + d[i] = a[i];
|
| + }
|
| + return 1;
|
| +}
|
| +
|
| +weak_alias(__inet_aton, inet_aton);
|
|
|