]> 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 b37e0b2ab3f9b2ed5c05dd46e40eab5e0725ba80..74f92d0fdad62ffbd02a31a2b231b5a0de291205 100644 (file)
@@ -140,6 +140,7 @@ enum {
     SYSCALL_SEM_POST    = 105,
     SYSCALL_SEM_UNLINK  = 106,
     SYSCALL_SEM_GETVALUE = 107,
+    SYSCALL_GETADDRINFO  = 108,
 };
 
 #endif
index d1bc5161863891e740fe9f8b34aa8ec5257cce92..15e21445180597b89b6552d932398f4ea8ace695 100644 (file)
@@ -3695,6 +3695,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;
 }