Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions source/includes/syscalls.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions source/kernel/C/syscalls-doc.dox
Original file line number Diff line number Diff line change
Expand Up @@ -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()`
Expand Down
28 changes: 26 additions & 2 deletions source/kernel/C/syscalls.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();

Expand Down Expand Up @@ -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;
Expand Down