Jelajahi Sumber

Kernel+LibC: Implement sys$ioctl() FIONBIO

This is another (older) way of making a file descriptor non-blocking.
Andreas Kling 4 tahun lalu
induk
melakukan
5f71bf0cc7
2 mengubah file dengan 8 tambahan dan 1 penghapusan
  1. 5 0
      Kernel/Syscalls/ioctl.cpp
  2. 3 1
      Userland/Libraries/LibC/sys/ioctl_numbers.h

+ 5 - 0
Kernel/Syscalls/ioctl.cpp

@@ -26,6 +26,7 @@
 
 #include <Kernel/FileSystem/FileDescription.h>
 #include <Kernel/Process.h>
+#include <LibC/sys/ioctl_numbers.h>
 
 namespace Kernel {
 
@@ -34,6 +35,10 @@ KResultOr<int> Process::sys$ioctl(int fd, unsigned request, FlatPtr arg)
     auto description = file_description(fd);
     if (!description)
         return EBADF;
+    if (request == FIONBIO && arg != 0) {
+        description->set_blocking(false);
+        return KSuccess;
+    }
     return description->file().ioctl(*description, request, arg);
 }
 

+ 3 - 1
Userland/Libraries/LibC/sys/ioctl_numbers.h

@@ -68,7 +68,8 @@ enum IOCtlNumber {
     SIOCSIFNETMASK,
     SIOCADDRT,
     SIOCDELRT,
-    FIBMAP
+    FIBMAP,
+    FIONBIO,
 };
 
 #define TIOCGPGRP TIOCGPGRP
@@ -94,3 +95,4 @@ enum IOCtlNumber {
 #define SIOCADDRT SIOCADDRT
 #define SIOCDELRT SIOCDELRT
 #define FIBMAP FIBMAP
+#define FIONBIO FIONBIO