summaryrefslogtreecommitdiff
path: root/src/arpa/inet/inet_addr.c
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2020-10-29 15:57:00 -0400
committerJakob Kaivo <jkk@ung.org>2020-10-29 15:57:00 -0400
commit972d2eee3a3518f18e0958e6f8a1b2ffafd6d39a (patch)
tree52fa9568b8c64e70ecbadc39ef63b35157731312 /src/arpa/inet/inet_addr.c
parent097e3e2dc18091096fc846fcc15402accf906448 (diff)
outline stuff from arpa/inet.h
Diffstat (limited to 'src/arpa/inet/inet_addr.c')
-rw-r--r--src/arpa/inet/inet_addr.c54
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;
+}