Просмотр исходного кода

UserspaceEmulator: Implement geteuid, getegid, ptsname syscalls

Brendan Coles 4 лет назад
Родитель
Сommit
c8fb00fe4d
2 измененных файлов с 25 добавлено и 0 удалено
  1. 22 0
      DevTools/UserspaceEmulator/Emulator.cpp
  2. 3 0
      DevTools/UserspaceEmulator/Emulator.h

+ 22 - 0
DevTools/UserspaceEmulator/Emulator.cpp

@@ -408,8 +408,12 @@ u32 Emulator::virt_syscall(u32 function, u32 arg1, u32 arg2, u32 arg3)
         return virt$unveil(arg1);
     case SC_getuid:
         return virt$getuid();
+    case SC_geteuid:
+        return virt$geteuid();
     case SC_getgid:
         return virt$getgid();
+    case SC_getegid:
+        return virt$getegid();
     case SC_setuid:
         return virt$setuid(arg1);
     case SC_setgid:
@@ -505,6 +509,8 @@ u32 Emulator::virt_syscall(u32 function, u32 arg1, u32 arg2, u32 arg3)
         return virt$clock_nanosleep(arg1);
     case SC_readlink:
         return virt$readlink(arg1);
+    case SC_ptsname:
+        return virt$ptsname(arg1, arg2, arg3);
     case SC_allocate_tls:
         return virt$allocate_tls(arg1);
     case SC_beep:
@@ -1061,11 +1067,21 @@ uid_t Emulator::virt$getuid()
     return getuid();
 }
 
+uid_t Emulator::virt$geteuid()
+{
+    return geteuid();
+}
+
 gid_t Emulator::virt$getgid()
 {
     return getgid();
 }
 
+gid_t Emulator::virt$getegid()
+{
+    return getegid();
+}
+
 int Emulator::virt$setuid(uid_t uid)
 {
     return syscall(SC_setuid, uid);
@@ -1690,6 +1706,12 @@ u32 Emulator::virt$allocate_tls(size_t size)
     return tls_base;
 }
 
+int Emulator::virt$ptsname(int fd, FlatPtr buffer, size_t buffer_size)
+{
+    auto pts = mmu().copy_buffer_from_vm(buffer, buffer_size);
+    return syscall(SC_ptsname, fd, pts.data(), pts.size());
+}
+
 int Emulator::virt$beep()
 {
     return syscall(SC_beep);

+ 3 - 0
DevTools/UserspaceEmulator/Emulator.h

@@ -105,7 +105,9 @@ private:
     u32 virt$unveil(u32);
     u32 virt$pledge(u32);
     uid_t virt$getuid();
+    uid_t virt$geteuid();
     gid_t virt$getgid();
+    gid_t virt$getegid();
     int virt$setuid(uid_t);
     int virt$setgid(gid_t);
     u32 virt$read(int, FlatPtr, ssize_t);
@@ -163,6 +165,7 @@ private:
     int virt$watch_file(FlatPtr, size_t);
     int virt$readlink(FlatPtr);
     u32 virt$allocate_tls(size_t);
+    int virt$ptsname(int fd, FlatPtr buffer, size_t buffer_size);
     int virt$beep();
 
     FlatPtr allocate_vm(size_t size, size_t alignment);