diff --git a/Userland/DevTools/UserspaceEmulator/Emulator.h b/Userland/DevTools/UserspaceEmulator/Emulator.h index c0c3758a3e..8edc497835 100644 --- a/Userland/DevTools/UserspaceEmulator/Emulator.h +++ b/Userland/DevTools/UserspaceEmulator/Emulator.h @@ -143,6 +143,7 @@ private: int virt$clock_settime(uint32_t clock_id, FlatPtr user_ts); int virt$listen(int, int); int virt$kill(pid_t, int); + int virt$killpg(int pgrp, int sig); int virt$fstat(int, FlatPtr); u32 virt$fcntl(int fd, int, u32); int virt$getgroups(ssize_t count, FlatPtr); @@ -151,6 +152,8 @@ private: int virt$socket(int, int, int); int virt$getsockopt(FlatPtr); int virt$setsockopt(FlatPtr); + int virt$getsockname(FlatPtr); + int virt$getpeername(FlatPtr); int virt$select(FlatPtr); int virt$get_stack_bounds(FlatPtr, FlatPtr); int virt$accept(int sockfd, FlatPtr address, FlatPtr address_length); @@ -158,6 +161,8 @@ private: int virt$recvmsg(int sockfd, FlatPtr msg_addr, int flags); int virt$sendmsg(int sockfd, FlatPtr msg_addr, int flags); int virt$connect(int sockfd, FlatPtr address, socklen_t address_size); + int virt$shutdown(int sockfd, int how); + void virt$sync(); void virt$exit(int); ssize_t virt$getrandom(FlatPtr buffer, size_t buffer_size, unsigned int flags); int virt$chdir(FlatPtr, size_t); diff --git a/Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp b/Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp index ef8dba7895..8278abb3c1 100644 --- a/Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp +++ b/Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp @@ -192,10 +192,16 @@ u32 Emulator::virt_syscall(u32 function, u32 arg1, u32 arg2, u32 arg3) return virt$accept(arg1, arg2, arg3); case SC_setsockopt: return virt$setsockopt(arg1); + case SC_getsockname: + return virt$getsockname(arg1); + case SC_getpeername: + return virt$getpeername(arg1); case SC_bind: return virt$bind(arg1, arg2, arg3); case SC_connect: return virt$connect(arg1, arg2, arg3); + case SC_shutdown: + return virt$shutdown(arg1, arg2); case SC_listen: return virt$listen(arg1, arg2); case SC_select: @@ -206,8 +212,13 @@ u32 Emulator::virt_syscall(u32 function, u32 arg1, u32 arg2, u32 arg3) return virt$sendmsg(arg1, arg2, arg3); case SC_kill: return virt$kill(arg1, arg2); + case SC_killpg: + return virt$killpg(arg1, arg2); case SC_set_mmap_name: return virt$set_mmap_name(arg1); + case SC_sync: + virt$sync(); + return 0; case SC_exit: virt$exit((int)arg1); return 0; @@ -478,6 +489,11 @@ int Emulator::virt$connect(int sockfd, FlatPtr address, socklen_t address_size) return syscall(SC_connect, sockfd, buffer.data(), buffer.size()); } +int Emulator::virt$shutdown(int sockfd, int how) +{ + return syscall(SC_shutdown, sockfd, how); +} + int Emulator::virt$dbgputch(char ch) { dbgputch(ch); @@ -494,6 +510,11 @@ int Emulator::virt$kill(pid_t pid, int signal) return syscall(SC_kill, pid, signal); } +int Emulator::virt$killpg(int pgrp, int sig) +{ + return syscall(SC_killpg, pgrp, sig); +} + int Emulator::virt$gettimeofday(FlatPtr timeval) { struct timeval host_timeval; @@ -689,6 +710,30 @@ int Emulator::virt$getsockopt(FlatPtr params_addr) TODO(); } +int Emulator::virt$getsockname(FlatPtr params_addr) +{ + Syscall::SC_getsockname_params params; + mmu().copy_from_vm(¶ms, params_addr, sizeof(params)); + struct sockaddr addr = {}; + socklen_t addrlen = {}; + auto rc = getsockname(params.sockfd, &addr, &addrlen); + mmu().copy_to_vm((FlatPtr)params.addr, &addr, sizeof(addr)); + mmu().copy_to_vm((FlatPtr)params.addrlen, &addrlen, sizeof(addrlen)); + return rc; +} + +int Emulator::virt$getpeername(FlatPtr params_addr) +{ + Syscall::SC_getpeername_params params; + mmu().copy_from_vm(¶ms, params_addr, sizeof(params)); + struct sockaddr addr = {}; + socklen_t addrlen = {}; + auto rc = getpeername(params.sockfd, &addr, &addrlen); + mmu().copy_to_vm((FlatPtr)params.addr, &addr, sizeof(addr)); + mmu().copy_to_vm((FlatPtr)params.addrlen, &addrlen, sizeof(addrlen)); + return rc; +} + int Emulator::virt$getgroups(ssize_t count, FlatPtr groups) { if (!count) @@ -977,6 +1022,11 @@ u32 Emulator::virt$read(int fd, FlatPtr buffer, ssize_t size) return nread; } +void Emulator::virt$sync() +{ + syscall(SC_sync); +} + void Emulator::virt$exit(int status) { reportln("\n=={}== \033[33;1mSyscall: exit({})\033[0m, shutting down!", getpid(), status);