diff --git a/src/kernel/emulation/linux/CMakeLists.txt b/src/kernel/emulation/linux/CMakeLists.txt index 6e1050efa..e43202035 100644 --- a/src/kernel/emulation/linux/CMakeLists.txt +++ b/src/kernel/emulation/linux/CMakeLists.txt @@ -72,6 +72,7 @@ set(emulation_sources network/sendmsg.c network/duct.c network/recvfrom.c + network/accept.c stat/fstat.c stat/lstat.c stat/stat.c diff --git a/src/kernel/emulation/linux/network/accept.c b/src/kernel/emulation/linux/network/accept.c new file mode 100644 index 000000000..53c3ffe2c --- /dev/null +++ b/src/kernel/emulation/linux/network/accept.c @@ -0,0 +1,35 @@ +#include "accept.h" +#include "../base.h" +#include "../errno.h" +#include +#include "socket.h" +#include "duct.h" + +long sys_accept(int fd, void* from, int* socklen) +{ + return sys_accept_nocancel(fd, from, socklen); +} + +long sys_accept_nocancel(int fd, void* from, int* socklen) +{ + int ret; + struct sockaddr_fixup* fixed; + +#ifdef __NR_socketcall + ret = LINUX_SYSCALL(__NR_socketcall, LINUX_SYS_ACCEPT, fd, from, socklen); +#else + ret = LINUX_SYSCALL(__NR_accept, fd, from, socklen); +#endif + + if (ret < 0) + ret = errno_linux_to_bsd(ret); + else + { + fixed = (struct sockaddr_fixup*) from; + fixed->bsd_family = sfamily_linux_to_bsd(fixed->linux_family); + fixed->bsd_length = *socklen; + } + + return ret; +} + diff --git a/src/kernel/emulation/linux/network/accept.h b/src/kernel/emulation/linux/network/accept.h new file mode 100644 index 000000000..3c970c5dd --- /dev/null +++ b/src/kernel/emulation/linux/network/accept.h @@ -0,0 +1,10 @@ +#ifndef LINUX_ACCEPT_H +#define LINUX_ACCEPT_H + +long sys_accept(int fd, void* from, int* socklen); +long sys_accept_nocancel(int fd, void* from, int* socklen); + +#define LINUX_SYS_ACCEPT 5 + +#endif + diff --git a/src/kernel/emulation/linux/syscalls.c b/src/kernel/emulation/linux/syscalls.c index 42d0b5170..09325a519 100644 --- a/src/kernel/emulation/linux/syscalls.c +++ b/src/kernel/emulation/linux/syscalls.c @@ -56,6 +56,7 @@ #include "network/recvmsg.h" #include "network/sendmsg.h" #include "network/recvfrom.h" +#include "network/accept.h" #include "dirent/getdirentries.h" #include "stat/fstat.h" #include "stat/stat.h" @@ -94,6 +95,7 @@ void* __bsd_syscall_table[512] = { [27] = sys_recvmsg, [28] = sys_sendmsg, [29] = sys_recvfrom, + [30] = sys_accept, [33] = sys_access, [36] = sys_sync, [37] = sys_kill, @@ -159,6 +161,7 @@ void* __bsd_syscall_table[512] = { [401] = sys_recvmsg_nocancel, [402] = sys_sendmsg_nocancel, [403] = sys_recvfrom_nocancel, + [404] = sys_accept_nocancel, [406] = sys_fcntl_nocancel, [408] = sys_fsync_nocancel, [409] = sys_connect_nocancel,