summaryrefslogtreecommitdiff
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
parent097e3e2dc18091096fc846fcc15402accf906448 (diff)
outline stuff from arpa/inet.h
-rw-r--r--src/arpa/inet/htonl.c16
-rw-r--r--src/arpa/inet/htons.c14
-rw-r--r--src/arpa/inet/inet_addr.c54
-rw-r--r--src/arpa/inet/inet_ntoa.c14
-rw-r--r--src/arpa/inet/inet_ntop.c34
-rw-r--r--src/arpa/inet/inet_pton.c43
-rw-r--r--src/arpa/inet/ntohl.c11
-rw-r--r--src/arpa/inet/ntohs.c11
8 files changed, 197 insertions, 0 deletions
diff --git a/src/arpa/inet/htonl.c b/src/arpa/inet/htonl.c
new file mode 100644
index 00000000..c17f2470
--- /dev/null
+++ b/src/arpa/inet/htonl.c
@@ -0,0 +1,16 @@
+#include <arpa/inet.h>
+
+uint32_t htonl(uint32_t hostlong)
+{
+ union {
+ uint32_t u;
+ unsigned char c[sizeof(uint32_t)];
+ } u;
+
+ u.c[0] = (hostlong >> 24) & 0xff;
+ u.c[1] = (hostlong >> 16) & 0xff;
+ u.c[2] = (hostlong >> 8) & 0xff;
+ u.c[3] = (hostlong) & 0xff;
+
+ return u.u;
+}
diff --git a/src/arpa/inet/htons.c b/src/arpa/inet/htons.c
new file mode 100644
index 00000000..b6be02ed
--- /dev/null
+++ b/src/arpa/inet/htons.c
@@ -0,0 +1,14 @@
+#include <arpa/inet.h>
+
+uint16_t htons(uint16_t hostshort)
+{
+ union {
+ uint16_t u;
+ unsigned char c[sizeof(uint16_t)];
+ } u;
+
+ u.c[0] = (hostshort >> 8) & 0xff;
+ u.c[1] = (hostshort) & 0xff;
+
+ return u.u;
+}
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;
+}
diff --git a/src/arpa/inet/inet_ntoa.c b/src/arpa/inet/inet_ntoa.c
new file mode 100644
index 00000000..c2ca7fc6
--- /dev/null
+++ b/src/arpa/inet/inet_ntoa.c
@@ -0,0 +1,14 @@
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <stdio.h>
+
+char *inet_ntoa(struct in_addr in)
+{
+ static char s[INET_ADDRSTRLEN] = "";
+ sprintf(s, "%hhu.%hhu.%hhu.%hhu",
+ (in.s_addr >> 24) & 0xff,
+ (in.s_addr >> 16) & 0xff,
+ (in.s_addr >> 8) & 0xff,
+ (in.s_addr) & 0xff);
+ return s;
+}
diff --git a/src/arpa/inet/inet_ntop.c b/src/arpa/inet/inet_ntop.c
new file mode 100644
index 00000000..0a89cedf
--- /dev/null
+++ b/src/arpa/inet/inet_ntop.c
@@ -0,0 +1,34 @@
+#include <arpa/inet.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+
+const char *inet_ntop(int af, const void *restrict src, char *restrict dst, socklen_t size)
+{
+ if (af == AF_INET) {
+ in_addr_t *a = src;
+ char s[INET_ADDRSTRLEN] = "";
+ if (snprintf(s, sizeof(s), "%hhu.%hhu.%hhu.%hhu",
+ (*src >> 24) & 0xff,
+ (*src >> 16) & 0xff,
+ (*src >> 8) & 0xff,
+ (*src) & 0xff) > size) {
+ errno = ENOSPC;
+ return NULL;
+ }
+ strcpy(dst, s);
+ return dst;
+ }
+
+ if (af != AF_INET6) {
+ errno = EAFNOSUPPORT;
+ return NULL;
+ }
+
+ /*
+ char s[INET6_ADDRSTRLEN] = "";
+ unsigned char *a = src;
+ */
+ /* do IPv6 conversion */
+ return dst;
+}
diff --git a/src/arpa/inet/inet_pton.c b/src/arpa/inet/inet_pton.c
new file mode 100644
index 00000000..14e7219b
--- /dev/null
+++ b/src/arpa/inet/inet_pton.c
@@ -0,0 +1,43 @@
+#include <arpa/inet.h>
+#include <errno.h>
+#include <stdlib.h>
+
+int inet_pton(int af, const char *restrict src, void *restrict dst)
+{
+ if (af == AF_INET) {
+ in_addr_t *a = dst;
+ unsigned long parts[4] = { 0 };
+ size_t part = 0;
+
+ while (*src && part < sizeof(parts)) {
+ char *next = NULL;
+ parts[part] = strtoul(src, &next, 0);
+ if (parts[part] > 255) {
+ return 0;
+ }
+
+ if (*next == '.') {
+ part++;
+ src = next + 1;
+ } else {
+ src = next;
+ }
+
+ }
+
+ if (part != sizeof(parts) - 1) {
+ return 0;
+ }
+
+ *a = htonl((parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3]);
+ return 1;
+ }
+
+ if (af != AF_INET6) {
+ errno = EAFNOSUPPORT;
+ return -1;
+ }
+
+ /* do ipv6 conversion */
+ return 1;
+}
diff --git a/src/arpa/inet/ntohl.c b/src/arpa/inet/ntohl.c
new file mode 100644
index 00000000..9f0b1557
--- /dev/null
+++ b/src/arpa/inet/ntohl.c
@@ -0,0 +1,11 @@
+#include <arpa/inet.h>
+
+uint32_t ntohl(uint32_t netlong)
+{
+ union {
+ uint32_t u;
+ unsigned char c[sizeof(uint32_t)];
+ } u = { netlong };
+
+ return (u.c[0] << 24) | (u.c[1] << 16) | (u.c[2] << 8) | u.c[3];
+}
diff --git a/src/arpa/inet/ntohs.c b/src/arpa/inet/ntohs.c
new file mode 100644
index 00000000..20d117d2
--- /dev/null
+++ b/src/arpa/inet/ntohs.c
@@ -0,0 +1,11 @@
+#include <arpa/inet.h>
+
+uint16_t ntohs(uint16_t netshort)
+{
+ union {
+ uint16_t u;
+ unsigned char c[sizeof(uint16_t)];
+ } u = { netshort };
+
+ return (u.c[0] << 8) | u.c[1];
+}