diff options
author | Jakob Kaivo <jkk@ung.org> | 2020-10-29 15:57:00 -0400 |
---|---|---|
committer | Jakob Kaivo <jkk@ung.org> | 2020-10-29 15:57:00 -0400 |
commit | 972d2eee3a3518f18e0958e6f8a1b2ffafd6d39a (patch) | |
tree | 52fa9568b8c64e70ecbadc39ef63b35157731312 /src/arpa/inet/inet_addr.c | |
parent | 097e3e2dc18091096fc846fcc15402accf906448 (diff) |
outline stuff from arpa/inet.h
Diffstat (limited to 'src/arpa/inet/inet_addr.c')
-rw-r--r-- | src/arpa/inet/inet_addr.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/arpa/inet/inet_addr.c b/src/arpa/inet/inet_addr.c new file mode 100644 index 00000000..6073df80 --- /dev/null +++ b/src/arpa/inet/inet_addr.c @@ -0,0 +1,54 @@ +#include <arpa/inet.h> +#include <stdlib.h> + +in_addr_t inet_addr(const char *cp) +{ + unsigned long parts[4] = { 0 }; + in_addr_t addr = (in_addr_t)(-1); + size_t part = 0; + + while (*cp && part < sizeof(parts)) { + char *next = NULL; + parts[part] = strtoul(cp, &next, 0); + if (*next == '.') { + part++; + cp = next + 1; + } else { + cp = next; + } + + /* check for error */ + } + + switch (part) { + case 0: + addr = htonl(parts[0]); + break; + + case 1: + if (parts[0] > 0xff || parts[1] > 0xffffff) { + break; + } + addr = htonl((parts[0] << 24) | parts[1]); + break; + + case 2: + if (parts[0] > 0xff || parts[1] > 0xff || parts[2] > 0xffff) { + break; + } + addr = htonl((parts[0] << 24) | (parts[1] << 16) | parts[2]); + break; + + case 3: + if (parts[0] > 0xff || parts[1] > 0xff || parts[2] > 0xff || parts[3] > 0xff) { + break; + } + addr = htonl((parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3]); + break; + + default: + break; + } + + return addr; +} |