From dadf6337efd2eb0d28c5738c10ac36511bc0fadb Mon Sep 17 00:00:00 2001 From: Sergey Bugaev Date: Sat, 10 Aug 2019 19:10:36 +0300 Subject: [PATCH] Kernel: Customize absolute_path() for more file types --- Kernel/Net/IPv4Socket.cpp | 33 +++++++++++++++++++++++++++++++++ Kernel/Net/IPv4Socket.h | 2 ++ Kernel/Net/LocalSocket.cpp | 26 ++++++++++++++++++++++++++ Kernel/Net/LocalSocket.h | 2 ++ Kernel/Net/Socket.cpp | 36 +++++++++++++++++++++--------------- Kernel/TTY/MasterPTY.cpp | 5 +++++ Kernel/TTY/MasterPTY.h | 2 ++ 7 files changed, 91 insertions(+), 15 deletions(-) diff --git a/Kernel/Net/IPv4Socket.cpp b/Kernel/Net/IPv4Socket.cpp index 5621846934..cc1a0c7909 100644 --- a/Kernel/Net/IPv4Socket.cpp +++ b/Kernel/Net/IPv4Socket.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -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(); +} diff --git a/Kernel/Net/IPv4Socket.h b/Kernel/Net/IPv4Socket.h index dbdc717ee4..ced971f1cf 100644 --- a/Kernel/Net/IPv4Socket.h +++ b/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"; } diff --git a/Kernel/Net/LocalSocket.cpp b/Kernel/Net/LocalSocket.cpp index 11e18fd7e9..20345d611b 100644 --- a/Kernel/Net/LocalSocket.cpp +++ b/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(); +} diff --git a/Kernel/Net/LocalSocket.h b/Kernel/Net/LocalSocket.h index 5eac9f7d80..5ce1753653 100644 --- a/Kernel/Net/LocalSocket.h +++ b/Kernel/Net/LocalSocket.h @@ -15,6 +15,8 @@ public: static void for_each(Function); 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; diff --git a/Kernel/Net/Socket.cpp b/Kernel/Net/Socket.cpp index 5a28b660d8..91d5bc31cb 100644 --- a/Kernel/Net/Socket.cpp +++ b/Kernel/Net/Socket.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -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) diff --git a/Kernel/TTY/MasterPTY.cpp b/Kernel/TTY/MasterPTY.cpp index 897314f3b1..a3caf1b17b 100644 --- a/Kernel/TTY/MasterPTY.cpp +++ b/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()); +} diff --git a/Kernel/TTY/MasterPTY.h b/Kernel/TTY/MasterPTY.h index cb97f8f609..dbc4f46bff 100644 --- a/Kernel/TTY/MasterPTY.h +++ b/Kernel/TTY/MasterPTY.h @@ -18,6 +18,8 @@ public: void notify_slave_closed(Badge); 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;