diff --git a/source/includes/syscalls.h b/source/includes/syscalls.h index bc9e3be..edd6fac 100644 --- a/source/includes/syscalls.h +++ b/source/includes/syscalls.h @@ -37,6 +37,8 @@ #define LINUX_SYS_DUP2 33 #define LINUX_SYS_NANOSLEEP 35 #define LINUX_SYS_GETPID 39 +#define LINUX_SYS_SOCKET 41 +#define LINUX_SYS_CONNECT 42 #define LINUX_SYS_CLONE 56 #define LINUX_SYS_FORK 57 #define LINUX_SYS_WAIT4 61 @@ -103,6 +105,8 @@ #define LINUX_EINTR 4 #define LINUX_ETIMEDOUT 110 #define LINUX_ECHILD 10 +#define LINUX_ENOTSOCK 88 +#define LINUX_EAFNOSUPPORT 97 #define LINUX_PROT_NONE 0x0 #define LINUX_PROT_READ 0x1 diff --git a/source/kernel/C/syscalls-doc.dox b/source/kernel/C/syscalls-doc.dox index 66117c8..f5a6980 100644 --- a/source/kernel/C/syscalls-doc.dox +++ b/source/kernel/C/syscalls-doc.dox @@ -33,6 +33,10 @@ * - `set_robust_list(2)` -> `sys_set_robust_list()` -> ABI validation * - `tgkill(2)` -> `sys_tgkill()` -> argument validation + stubbed signal path * + * ## Socket compatibility + * - `socket(2)` -> `sys_socket()` -> returns `-EAFNOSUPPORT` (not wired yet) + * - `connect(2)` -> `sys_connect()` -> fd validation + `-ENOTSOCK` + * * ## Time and randomness * - `clock_gettime(2)` -> `sys_clock_gettime()` -> RTC-backed time fetch * - `nanosleep(2)` -> `sys_nanosleep()` -> `sleep()` diff --git a/source/kernel/C/syscalls.c b/source/kernel/C/syscalls.c index 0493ea9..f57245c 100644 --- a/source/kernel/C/syscalls.c +++ b/source/kernel/C/syscalls.c @@ -758,6 +758,26 @@ static int64 sys_writev(uint64_t fd, const linux_iovec_t* iov, uint64_t iovcnt) return total; } +static int64 sys_socket(uint64_t domain, uint64_t type, uint64_t protocol) { + (void)type; + (void)protocol; + + // Networking stack is not exposed through Linux sockets yet. + // Return Linux-like "address family not supported" instead of a fake fd. + if (domain == 1 || domain == 2 || domain == 10) + return -LINUX_EAFNOSUPPORT; + return -LINUX_EAFNOSUPPORT; +} + +static int64 sys_connect(uint64_t fd, const void* addr, uint64_t addrlen) { + (void)addr; + (void)addrlen; + + if (!fd_valid((int)fd)) + return -LINUX_EBADF; + return -LINUX_ENOTSOCK; +} + static int64 sys_ioctl(uint64_t fd, uint64_t req, uint64_t arg) { if (!fd_valid((int)fd)) return -LINUX_EBADF; @@ -1359,6 +1379,12 @@ uint64_t syscall_dispatch ( case LINUX_SYS_GETPID: return multitasking_current_pid() ? multitasking_current_pid() : 1; + case LINUX_SYS_SOCKET: + return sys_socket(arg1, arg2, arg3); + + case LINUX_SYS_CONNECT: + return sys_connect(arg1, (const void*)arg2, arg3); + case LINUX_SYS_CLONE: return sys_fork(); @@ -1449,8 +1475,6 @@ uint64_t syscall_dispatch ( return sys_futex((uint32_t*)arg1, arg2, arg3, (const linux_timespec_t*)arg4, (uint32_t*)arg5, arg6); - case 41: // getuid (32-bit ABI compatibility) - return 0; case 19: { linux_iovec_t* iov = (linux_iovec_t*)arg2;