diff options
-rw-r--r-- | src/arpa/inet/htonl.c | 16 | ||||
-rw-r--r-- | src/arpa/inet/htons.c | 14 | ||||
-rw-r--r-- | src/arpa/inet/inet_addr.c | 54 | ||||
-rw-r--r-- | src/arpa/inet/inet_ntoa.c | 14 | ||||
-rw-r--r-- | src/arpa/inet/inet_ntop.c | 34 | ||||
-rw-r--r-- | src/arpa/inet/inet_pton.c | 43 | ||||
-rw-r--r-- | src/arpa/inet/ntohl.c | 11 | ||||
-rw-r--r-- | src/arpa/inet/ntohs.c | 11 |
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]; +} |