mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 20:37:35 +00:00
UE: Add killpg, getsockname, getpeername, shutdown, sync syscalls
This commit is contained in:
parent
cf127b745e
commit
4915cf5ab0
2 changed files with 55 additions and 0 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue