瀏覽代碼

Kernel: Customize absolute_path() for more file types

Sergey Bugaev 6 年之前
父節點
當前提交
dadf6337ef
共有 7 個文件被更改,包括 91 次插入15 次删除
  1. 33 0
      Kernel/Net/IPv4Socket.cpp
  2. 2 0
      Kernel/Net/IPv4Socket.h
  3. 26 0
      Kernel/Net/LocalSocket.cpp
  4. 2 0
      Kernel/Net/LocalSocket.h
  5. 21 15
      Kernel/Net/Socket.cpp
  6. 5 0
      Kernel/TTY/MasterPTY.cpp
  7. 2 0
      Kernel/TTY/MasterPTY.h

+ 33 - 0
Kernel/Net/IPv4Socket.cpp

@@ -1,3 +1,4 @@
+#include <AK/StringBuilder.h>
 #include <Kernel/FileSystem/FileDescription.h>
 #include <Kernel/Net/ARP.h>
 #include <Kernel/Net/ICMP.h>
@@ -268,3 +269,35 @@ void IPv4Socket::did_receive(const IPv4Address& source_address, u16 source_port,
     kprintf("IPv4Socket(%p): did_receive %d bytes, total_received=%u, packets in queue: %d\n", this, packet_size, m_bytes_received, m_receive_queue.size_slow());
 #endif
 }
+
+String IPv4Socket::absolute_path(const FileDescription&) const
+{
+    if (m_role == Role::None)
+        return "socket";
+
+    StringBuilder builder;
+    builder.append("socket:");
+
+    builder.appendf("%s:%d", m_local_address.to_string().characters(), m_local_port);
+    if (m_role == Role::Accepted || m_role == Role::Connected)
+        builder.appendf(" / %s:%d", m_peer_address.to_string().characters(), m_peer_port);
+
+    switch (m_role) {
+    case Role::Listener:
+        builder.append(" (listening)");
+        break;
+    case Role::Accepted:
+        builder.append(" (accepted)");
+        break;
+    case Role::Connected:
+        builder.append(" (connected)");
+        break;
+    case Role::Connecting:
+        builder.append(" (connecting)");
+        break;
+    default:
+        ASSERT_NOT_REACHED();
+    }
+
+    return builder.to_string();
+}

+ 2 - 0
Kernel/Net/IPv4Socket.h

@@ -45,6 +45,8 @@ public:
 
     IPv4SocketTuple tuple() const { return IPv4SocketTuple(m_local_address, m_local_port, m_peer_address, m_peer_port); }
 
+    String absolute_path(const FileDescription& description) const override;
+
 protected:
     IPv4Socket(int type, int protocol);
     virtual const char* class_name() const override { return "IPv4Socket"; }

+ 26 - 0
Kernel/Net/LocalSocket.cpp

@@ -254,3 +254,29 @@ StringView LocalSocket::socket_path() const
     int len = strnlen(m_address.sun_path, sizeof(m_address.sun_path));
     return { m_address.sun_path, len };
 }
+
+String LocalSocket::absolute_path(const FileDescription& description) const
+{
+    StringBuilder builder;
+    builder.append("socket:");
+    builder.append(socket_path());
+
+    switch (role(description)) {
+    case Role::Listener:
+        builder.append(" (listening)");
+        break;
+    case Role::Accepted:
+        builder.appendf(" (accepted from pid %d)", origin_pid());
+        break;
+    case Role::Connected:
+        builder.appendf(" (connected to pid %d)", acceptor_pid());
+        break;
+    case Role::Connecting:
+        builder.append(" (connecting)");
+        break;
+    default:
+        break;
+    }
+
+    return builder.to_string();
+}

+ 2 - 0
Kernel/Net/LocalSocket.h

@@ -15,6 +15,8 @@ public:
     static void for_each(Function<void(LocalSocket&)>);
 
     StringView socket_path() const;
+    String absolute_path(const FileDescription& description) const override;
+
     // ^Socket
     virtual KResult bind(const sockaddr*, socklen_t) override;
     virtual KResult connect(FileDescription&, const sockaddr*, socklen_t, ShouldBlock = ShouldBlock::Yes) override;

+ 21 - 15
Kernel/Net/Socket.cpp

@@ -1,3 +1,4 @@
+#include <AK/StringBuilder.h>
 #include <Kernel/FileSystem/FileDescription.h>
 #include <Kernel/Net/IPv4Socket.h>
 #include <Kernel/Net/LocalSocket.h>
@@ -149,23 +150,28 @@ void Socket::load_send_deadline()
     m_send_deadline.tv_usec %= 1000000;
 }
 
-static const char* to_string(Socket::Role role)
-{
-    switch (role) {
-    case Socket::Role::Listener:
-        return "Listener";
-    case Socket::Role::Accepted:
-        return "Accepted";
-    case Socket::Role::Connected:
-        return "Connected";
-    default:
-        return "None";
-    }
-}
-
 String Socket::absolute_path(const FileDescription& description) const
 {
-    return String::format("socket:%x (role: %s)", this, ::to_string(role(description)));
+    StringBuilder builder;
+    builder.appendf("socket:%x", this);
+
+    switch (role(description)) {
+    case Role::None:
+        break;
+    case Role::Listener:
+        builder.append(" (listening)");
+        break;
+    case Role::Accepted:
+        builder.append(" (accepted)");
+        break;
+    case Role::Connected:
+        builder.append(" (connected)");
+        break;
+    case Role::Connecting:
+        builder.append(" (connecting)");
+        break;
+    }
+    return builder.to_string();
 }
 
 ssize_t Socket::read(FileDescription& description, u8* buffer, ssize_t size)

+ 5 - 0
Kernel/TTY/MasterPTY.cpp

@@ -102,3 +102,8 @@ int MasterPTY::ioctl(FileDescription& description, unsigned request, unsigned ar
         return m_slave->ioctl(description, request, arg);
     return -EINVAL;
 }
+
+String MasterPTY::absolute_path(const FileDescription&) const
+{
+    return String::format("ptm:%s", m_pts_name.characters());
+}

+ 2 - 0
Kernel/TTY/MasterPTY.h

@@ -18,6 +18,8 @@ public:
     void notify_slave_closed(Badge<SlavePTY>);
     bool is_closed() const { return m_closed; }
 
+    virtual String absolute_path(const FileDescription&) const override;
+
 private:
     // ^CharacterDevice
     virtual ssize_t read(FileDescription&, u8*, ssize_t) override;