From: Tulio A M Mendes Date: Sun, 15 Feb 2026 01:13:29 +0000 (-0300) Subject: feat: getaddrinfo syscall with built-in hosts table + DNS fallback X-Git-Url: https://projects.tadryanom.me/docs/static/git-logo.png?a=commitdiff_plain;h=3537569027cf9f92d7148801aeb56490c1252723;p=AdrOS.git feat: getaddrinfo syscall with built-in hosts table + DNS fallback - 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 --- diff --git a/include/syscall.h b/include/syscall.h index 52dbf2c..f28bd05 100644 --- a/include/syscall.h +++ b/include/syscall.h @@ -131,6 +131,7 @@ enum { SYSCALL_SEM_POST = 105, SYSCALL_SEM_UNLINK = 106, SYSCALL_SEM_GETVALUE = 107, + SYSCALL_GETADDRINFO = 108, }; #endif diff --git a/src/kernel/syscall.c b/src/kernel/syscall.c index 8dd98f6..b98d244 100644 --- a/src/kernel/syscall.c +++ b/src/kernel/syscall.c @@ -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; }