]> Projects (at) Tadryanom (dot) Me - AdrOS.git/commitdiff
feat: getaddrinfo syscall with built-in hosts table + DNS fallback
authorTulio A M Mendes <[email protected]>
Sun, 15 Feb 2026 01:13:29 +0000 (22:13 -0300)
committerTulio A M Mendes <[email protected]>
Sun, 15 Feb 2026 01:13:29 +0000 (22:13 -0300)
- SYSCALL_GETADDRINFO = 108
- Built-in localhost/localhost.localdomain -> 127.0.0.1
- Falls back to kernel dns_resolve() for other hostnames
- Returns IPv4 address in network byte order
- 35/35 smoke tests pass, cppcheck clean

include/syscall.h
src/kernel/syscall.c

index 52dbf2c41e59061c7eed1fc7464faef6db1980b4..f28bd052cc42d6bb98545779a005aa8dda064e4e 100644 (file)
@@ -131,6 +131,7 @@ enum {
     SYSCALL_SEM_POST    = 105,
     SYSCALL_SEM_UNLINK  = 106,
     SYSCALL_SEM_GETVALUE = 107,
+    SYSCALL_GETADDRINFO  = 108,
 };
 
 #endif
index 8dd98f679f5818a991c1b2f78546bd7f6634fb55..b98d244cb46b562dbbdd9644ca687881112a03d0 100644 (file)
@@ -3686,6 +3686,37 @@ static void socket_syscall_dispatch(struct registers* regs, uint32_t syscall_no)
         return;
     }
 
+    if (syscall_no == SYSCALL_GETADDRINFO) {
+        /* getaddrinfo(user_hostname, user_out_ip)
+         * Resolves hostname to IPv4 address (network byte order).
+         * Checks built-in hosts table first, then falls back to DNS. */
+        const char* user_host = (const char*)sc_arg0(regs);
+        uint32_t* user_out = (uint32_t*)sc_arg1(regs);
+        if (!user_host || !user_out) { sc_ret(regs) = (uint32_t)-EFAULT; return; }
+        if (user_range_ok(user_out, 4) == 0) { sc_ret(regs) = (uint32_t)-EFAULT; return; }
+
+        char host[128];
+        if (copy_from_user(host, user_host, 127) < 0) { sc_ret(regs) = (uint32_t)-EFAULT; return; }
+        host[127] = 0;
+
+        /* Built-in /etc/hosts equivalent */
+        uint32_t ip = 0;
+        if (strcmp(host, "localhost") == 0 || strcmp(host, "localhost.localdomain") == 0) {
+            ip = 0x0100007FU; /* 127.0.0.1 in network byte order (little-endian) */
+        }
+
+        if (ip == 0) {
+            /* Try kernel DNS resolver */
+            extern int dns_resolve(const char* hostname, uint32_t* out_ip);
+            int rc = dns_resolve(host, &ip);
+            if (rc < 0) { sc_ret(regs) = (uint32_t)-ENOENT; return; }
+        }
+
+        if (copy_to_user(user_out, &ip, 4) < 0) { sc_ret(regs) = (uint32_t)-EFAULT; return; }
+        sc_ret(regs) = 0;
+        return;
+    }
+
     sc_ret(regs) = (uint32_t)-ENOSYS;
 }