From 06a80bcf69feaec8fbb551ecda14f46bf2582dff Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 9 Nov 2019 22:15:35 +0100 Subject: [PATCH] Kernel+SystemMonitor: Publish can_read/write state for open files The can_read() and can_write() states for file descriptions are now published in /proc, allowing SystemMonitor to display it. --- .../SystemMonitor/ProcessFileDescriptorMapWidget.cpp | 6 ++++++ Kernel/FileSystem/ProcFS.cpp | 2 ++ Kernel/Net/LocalSocket.cpp | 4 ++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Applications/SystemMonitor/ProcessFileDescriptorMapWidget.cpp b/Applications/SystemMonitor/ProcessFileDescriptorMapWidget.cpp index 919f0d85ee..ce78c385c6 100644 --- a/Applications/SystemMonitor/ProcessFileDescriptorMapWidget.cpp +++ b/Applications/SystemMonitor/ProcessFileDescriptorMapWidget.cpp @@ -25,6 +25,12 @@ ProcessFileDescriptorMapWidget::ProcessFileDescriptorMapWidget(GWidget* parent) pid_fds_fields.empend("On exec", TextAlignment::CenterLeft, [](auto& object) { return object.get("cloexec").to_bool() ? "Close" : "Keep"; }); + pid_fds_fields.empend("Can read", TextAlignment::CenterLeft, [](auto& object) { + return object.get("can_read").to_bool() ? "Yes" : "No"; + }); + pid_fds_fields.empend("Can write", TextAlignment::CenterLeft, [](auto& object) { + return object.get("can_write").to_bool() ? "Yes" : "No"; + }); m_table_view->set_model(GJsonArrayModel::create({}, move(pid_fds_fields))); } diff --git a/Kernel/FileSystem/ProcFS.cpp b/Kernel/FileSystem/ProcFS.cpp index fc08632be7..c0fa49903c 100644 --- a/Kernel/FileSystem/ProcFS.cpp +++ b/Kernel/FileSystem/ProcFS.cpp @@ -226,6 +226,8 @@ Optional procfs$pid_fds(InodeIdentifier identifier) description_object.add("offset", description->offset()); description_object.add("cloexec", cloexec); description_object.add("blocking", description->is_blocking()); + description_object.add("can_read", description->can_read()); + description_object.add("can_write", description->can_write()); } array.finish(); return builder.build(); diff --git a/Kernel/Net/LocalSocket.cpp b/Kernel/Net/LocalSocket.cpp index 6f16fed2f5..babe57a023 100644 --- a/Kernel/Net/LocalSocket.cpp +++ b/Kernel/Net/LocalSocket.cpp @@ -195,7 +195,7 @@ bool LocalSocket::can_read(const FileDescription& description) const return !has_attached_peer(description) || !m_for_server.is_empty(); if (role == Role::Connected) return !has_attached_peer(description) || !m_for_client.is_empty(); - ASSERT_NOT_REACHED(); + return false; } bool LocalSocket::has_attached_peer(const FileDescription& description) const @@ -215,7 +215,7 @@ bool LocalSocket::can_write(const FileDescription& description) const return !has_attached_peer(description) || m_for_client.bytes_in_write_buffer() < 16384; if (role == Role::Connected) return !has_attached_peer(description) || m_for_server.bytes_in_write_buffer() < 16384; - ASSERT_NOT_REACHED(); + return false; } ssize_t LocalSocket::sendto(FileDescription& description, const void* data, size_t data_size, int, const sockaddr*, socklen_t)