1
0

inet_aton.c 711 B

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