summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordzwdz2023-12-25 20:12:44 +0100
committerdzwdz2023-12-25 20:12:44 +0100
commit4be1fd62131f7e186e6f92f1bb5a356dc1ac1951 (patch)
tree54de3a2d99fe9d6e93ad45c5107aff5420f9900d /src
parentb9f5f92bff69059471a76e73539780eedb356455 (diff)
user/libc: reorganize net stuff, basic hosts-only gethostbyname()
/usr/share/hosts because i don't have /etc/ yet and i don't feel like creating it.
Diffstat (limited to 'src')
-rw-r--r--src/cmd/netstack/util.c1
-rw-r--r--src/libc/arpainet.c20
-rw-r--r--src/libc/include/arpa/inet.h3
-rw-r--r--src/libc/net/arpainet.c38
-rw-r--r--src/libc/net/gethostbyname.c51
-rw-r--r--src/libc/net/socket.c (renamed from src/libc/socket.c)5
6 files changed, 93 insertions, 25 deletions
diff --git a/src/cmd/netstack/util.c b/src/cmd/netstack/util.c
index 68092aa..093c5ac 100644
--- a/src/cmd/netstack/util.c
+++ b/src/cmd/netstack/util.c
@@ -43,6 +43,7 @@ uint16_t ip_checksumphdr(
}
int ip_parse(const char *s, uint32_t *dest) {
+ // TODO use inet_aton
if (!s) return -1;
uint32_t ip = strtol(s, (char**)&s, 0);
diff --git a/src/libc/arpainet.c b/src/libc/arpainet.c
deleted file mode 100644
index 125a855..0000000
--- a/src/libc/arpainet.c
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <arpa/inet.h>
-
-uint32_t htonl(uint32_t n) {
- return ((n & 0xFF000000) >> 24)
- | ((n & 0x00FF0000) >> 8)
- | ((n & 0x0000FF00) << 8)
- | ((n & 0x000000FF) << 24);
-}
-
-uint16_t htons(uint16_t n) {
- return (n >> 8) | (n << 8);
-}
-
-uint32_t ntohl(uint32_t n) {
- return htonl(n);
-}
-
-uint16_t ntohs(uint16_t n) {
- return htons(n);
-}
diff --git a/src/libc/include/arpa/inet.h b/src/libc/include/arpa/inet.h
index d372467..1e4f97e 100644
--- a/src/libc/include/arpa/inet.h
+++ b/src/libc/include/arpa/inet.h
@@ -1,4 +1,5 @@
#pragma once
+#include <netinet/in.h>
#include <stdint.h>
uint32_t htonl(uint32_t n);
@@ -6,3 +7,5 @@ uint16_t htons(uint16_t n);
uint32_t ntohl(uint32_t n);
uint16_t ntohs(uint16_t n);
+
+int inet_aton(const char *s, struct in_addr *dest);
diff --git a/src/libc/net/arpainet.c b/src/libc/net/arpainet.c
new file mode 100644
index 0000000..62efb62
--- /dev/null
+++ b/src/libc/net/arpainet.c
@@ -0,0 +1,38 @@
+#include <arpa/inet.h>
+#include <stdlib.h>
+
+uint32_t htonl(uint32_t n) {
+ return ((n & 0xFF000000) >> 24)
+ | ((n & 0x00FF0000) >> 8)
+ | ((n & 0x0000FF00) << 8)
+ | ((n & 0x000000FF) << 24);
+}
+
+uint16_t htons(uint16_t n) {
+ return (n >> 8) | (n << 8);
+}
+
+uint32_t ntohl(uint32_t n) {
+ return htonl(n);
+}
+
+uint16_t ntohs(uint16_t n) {
+ return htons(n);
+}
+
+int inet_aton(const char *s, struct in_addr *dest) {
+ if (!s) return -1;
+
+ uint32_t ip = strtol(s, (char**)&s, 0);
+ int parts = 1;
+ for (; parts < 4; parts++) {
+ if (!*s) break;
+ if (*s++ != '.') return 0;
+ ip <<= 8;
+ ip += strtol(s, (char**)&s, 0);
+ }
+ if (parts > 1)
+ ip = ((ip & 0xFFFFFF00) << 8 * (4 - parts)) | (ip & 0xFF);
+ dest->s_addr = htonl(ip);
+ return 1;
+}
diff --git a/src/libc/net/gethostbyname.c b/src/libc/net/gethostbyname.c
new file mode 100644
index 0000000..f2b59c1
--- /dev/null
+++ b/src/libc/net/gethostbyname.c
@@ -0,0 +1,51 @@
+#include <arpa/inet.h>
+#include <ctype.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+struct hostent *gethostbyname(const char *name) {
+ // TODO ipv4 addresses should just get copied
+ static struct hostent he;
+ static struct in_addr addr;
+ static void *addrs[2] = {NULL, NULL};
+ bool found = false;
+ char buf[256];
+ FILE *fp;
+
+ if (he.h_name) {
+ free(he.h_name);
+ he.h_name = NULL;
+ }
+
+ if ((fp = fopen("/usr/share/hosts", "r")) == NULL) {
+ return NULL;
+ }
+ while (!found && fgets(buf, sizeof buf, fp)) {
+ char *s;
+ if (!isdigit(buf[0])) continue;
+ s = strtok(buf, " \t\n");
+ if (!inet_aton(s, &addr)) continue;
+ while ((s = strtok(NULL, " \t\n"))) {
+ if (strcmp(s, name) == 0) {
+ found = true;
+ break;
+ }
+ }
+ }
+ fclose(fp);
+ if (!found) {
+ return NULL;
+ }
+
+ he.h_name = strdup(name);
+ he.h_aliases = NULL;
+ he.h_addrtype = AF_INET;
+ he.h_length = 4;
+ he.h_addr_list = (void*)&addrs;
+ addrs[0] = &addr.s_addr;
+ return &he;
+}
diff --git a/src/libc/socket.c b/src/libc/net/socket.c
index 5ea7266..9eacbe5 100644
--- a/src/libc/socket.c
+++ b/src/libc/net/socket.c
@@ -89,8 +89,3 @@ int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen) {
addr->sa_family = AF_UNSPEC;
return 0;
}
-
-struct hostent *gethostbyname(const char *name) {
- (void)name;
- return NULL;
-}