Przeglądaj źródła

strace: Add initial ioctl formatting

This is useful in general, but adding it is what finally helped
uncovering #10438.
Rodrigo Tobar 3 lat temu
rodzic
commit
78de54f0f1
1 zmienionych plików z 63 dodań i 0 usunięć
  1. 63 0
      Userland/Utilities/strace.cpp

+ 63 - 0
Userland/Utilities/strace.cpp

@@ -19,6 +19,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/ioctl.h>
 #include <sys/mman.h>
 #include <sys/ptrace.h>
 #include <sys/socket.h>
@@ -123,6 +124,55 @@ HANDLE(SEEK_CUR)
 HANDLE(SEEK_END)
 END_VALUES_TO_NAMES()
 
+VALUES_TO_NAMES(ioctl_request_name)
+HANDLE(TIOCGPGRP)
+HANDLE(TIOCSPGRP)
+HANDLE(TCGETS)
+HANDLE(TCSETS)
+HANDLE(TCSETSW)
+HANDLE(TCSETSF)
+HANDLE(TCFLSH)
+HANDLE(TIOCGWINSZ)
+HANDLE(TIOCSCTTY)
+HANDLE(TIOCSTI)
+HANDLE(TIOCNOTTY)
+HANDLE(TIOCSWINSZ)
+HANDLE(FB_IOCTL_GET_SIZE_IN_BYTES)
+HANDLE(FB_IOCTL_GET_RESOLUTION)
+HANDLE(FB_IOCTL_SET_RESOLUTION)
+HANDLE(FB_IOCTL_GET_BUFFER)
+HANDLE(FB_IOCTL_GET_BUFFER_OFFSET)
+HANDLE(FB_IOCTL_SET_BUFFER)
+HANDLE(FB_IOCTL_FLUSH_BUFFERS)
+HANDLE(KEYBOARD_IOCTL_GET_NUM_LOCK)
+HANDLE(KEYBOARD_IOCTL_SET_NUM_LOCK)
+HANDLE(KEYBOARD_IOCTL_GET_CAPS_LOCK)
+HANDLE(KEYBOARD_IOCTL_SET_CAPS_LOCK)
+HANDLE(SIOCSIFADDR)
+HANDLE(SIOCGIFADDR)
+HANDLE(SIOCGIFHWADDR)
+HANDLE(SIOCGIFNETMASK)
+HANDLE(SIOCSIFNETMASK)
+HANDLE(SIOCGIFBRDADDR)
+HANDLE(SIOCGIFMTU)
+HANDLE(SIOCGIFFLAGS)
+HANDLE(SIOCGIFCONF)
+HANDLE(SIOCADDRT)
+HANDLE(SIOCDELRT)
+HANDLE(SIOCSARP)
+HANDLE(SIOCDARP)
+HANDLE(FIBMAP)
+HANDLE(FIONBIO)
+HANDLE(FIONREAD)
+HANDLE(KCOV_SETBUFSIZE)
+HANDLE(KCOV_ENABLE)
+HANDLE(KCOV_DISABLE)
+HANDLE(SOUNDCARD_IOCTL_SET_SAMPLE_RATE)
+HANDLE(SOUNDCARD_IOCTL_GET_SAMPLE_RATE)
+HANDLE(STORAGE_DEVICE_GET_SIZE)
+HANDLE(STORAGE_DEVICE_GET_BLOCK_SIZE)
+END_VALUES_TO_NAMES()
+
 VALUES_TO_NAMES(domain_name)
 HANDLE(AF_UNSPEC)
 HANDLE(AF_UNIX)
@@ -354,6 +404,16 @@ static void format_open(FormattedSyscallBuilder& builder, Syscall::SC_open_param
         builder.add_argument("{:04o}", params.mode);
 }
 
+static void format_ioctl(FormattedSyscallBuilder& builder, int fd, unsigned request, void* arg)
+{
+    builder.add_arguments(fd, ioctl_request_name(request));
+    if (request == FIONBIO) {
+        auto value = copy_from_process(reinterpret_cast<int*>(arg));
+        builder.add_argument(value);
+    } else
+        builder.add_argument(PointerArgument { arg });
+}
+
 namespace AK {
 template<>
 struct Formatter<struct timespec> : StandardFormatter {
@@ -583,6 +643,9 @@ static void format_syscall(FormattedSyscallBuilder& builder, Syscall::Function s
     case SC_open:
         format_open(builder, (Syscall::SC_open_params*)arg1);
         break;
+    case SC_ioctl:
+        format_ioctl(builder, (int)arg1, (unsigned)arg2, (void*)arg3);
+        break;
     case SC_fstat:
         format_fstat(builder, (int)arg1, (struct stat*)arg2);
         result_type = Ssize;