diff --git a/Kernel/Bus/USB/SysFSUSB.cpp b/Kernel/Bus/USB/SysFSUSB.cpp index 27842eab57..ab8a57f387 100644 --- a/Kernel/Bus/USB/SysFSUSB.cpp +++ b/Kernel/Bus/USB/SysFSUSB.cpp @@ -23,7 +23,7 @@ SysFSUSBDeviceInformation::~SysFSUSBDeviceInformation() { } -bool SysFSUSBDeviceInformation::output(KBufferBuilder& builder) +KResult SysFSUSBDeviceInformation::try_generate(KBufferBuilder& builder) { VERIFY(m_lock.is_locked()); JsonArraySerializer array { builder }; @@ -44,7 +44,7 @@ bool SysFSUSBDeviceInformation::output(KBufferBuilder& builder) obj.add("num_configurations", m_device->device_descriptor().num_configurations); obj.finish(); array.finish(); - return true; + return KSuccess; } KResult SysFSUSBDeviceInformation::refresh_data(FileDescription& description) const @@ -55,8 +55,7 @@ KResult SysFSUSBDeviceInformation::refresh_data(FileDescription& description) co cached_data = TRY(adopt_nonnull_own_or_enomem(new (nothrow) SysFSInodeData)); } KBufferBuilder builder; - if (!const_cast(*this).output(builder)) - return ENOENT; + TRY(const_cast(*this).try_generate(builder)); auto& typed_cached_data = static_cast(*cached_data); typed_cached_data.buffer = builder.build(); if (!typed_cached_data.buffer) diff --git a/Kernel/Bus/USB/SysFSUSB.h b/Kernel/Bus/USB/SysFSUSB.h index 4ba0e20b09..674c0ff0d6 100644 --- a/Kernel/Bus/USB/SysFSUSB.h +++ b/Kernel/Bus/USB/SysFSUSB.h @@ -33,7 +33,7 @@ protected: NonnullRefPtr m_device; private: - bool output(KBufferBuilder& builder); + KResult try_generate(KBufferBuilder&); virtual KResult refresh_data(FileDescription& description) const override; mutable Mutex m_lock { "SysFSUSBDeviceInformation" }; }; diff --git a/Kernel/GlobalProcessExposed.cpp b/Kernel/GlobalProcessExposed.cpp index 1725632f06..5c3459f47d 100644 --- a/Kernel/GlobalProcessExposed.cpp +++ b/Kernel/GlobalProcessExposed.cpp @@ -40,7 +40,7 @@ public: private: ProcFSAdapters(); - virtual bool output(KBufferBuilder& builder) override + virtual KResult try_generate(KBufferBuilder& builder) override { JsonArraySerializer array { builder }; NetworkingManagement::the().for_each([&array](auto& adapter) { @@ -64,7 +64,7 @@ private: obj.add("mtu", adapter.mtu()); }); array.finish(); - return true; + return KSuccess; } }; @@ -74,7 +74,7 @@ public: private: ProcFSARP(); - virtual bool output(KBufferBuilder& builder) override + virtual KResult try_generate(KBufferBuilder& builder) override { JsonArraySerializer array { builder }; arp_table().for_each_shared([&](const auto& it) { @@ -83,7 +83,7 @@ private: obj.add("ip_address", it.key.to_string()); }); array.finish(); - return true; + return KSuccess; } }; @@ -93,7 +93,7 @@ public: private: ProcFSTCP(); - virtual bool output(KBufferBuilder& builder) override + virtual KResult try_generate(KBufferBuilder& builder) override { JsonArraySerializer array { builder }; TCPSocket::for_each([&array](auto& socket) { @@ -116,7 +116,7 @@ private: } }); array.finish(); - return true; + return KSuccess; } }; @@ -126,7 +126,7 @@ public: private: ProcFSLocalNet(); - virtual bool output(KBufferBuilder& builder) override + virtual KResult try_generate(KBufferBuilder& builder) override { JsonArraySerializer array { builder }; LocalSocket::for_each([&array](auto& socket) { @@ -140,7 +140,7 @@ private: obj.add("acceptor_gid", socket.acceptor_gid().value()); }); array.finish(); - return true; + return KSuccess; } }; @@ -150,7 +150,7 @@ public: private: ProcFSUDP(); - virtual bool output(KBufferBuilder& builder) override + virtual KResult try_generate(KBufferBuilder& builder) override { JsonArraySerializer array { builder }; UDPSocket::for_each([&array](auto& socket) { @@ -166,7 +166,7 @@ private: } }); array.finish(); - return true; + return KSuccess; } }; @@ -348,7 +348,7 @@ public: private: ProcFSDiskUsage(); - virtual bool output(KBufferBuilder& builder) override + virtual KResult try_generate(KBufferBuilder& builder) override { JsonArraySerializer array { builder }; VirtualFileSystem::the().for_each_mount([&array](auto& mount) { @@ -370,7 +370,7 @@ private: fs_object.add("source", "none"); }); array.finish(); - return true; + return KSuccess; } }; @@ -380,7 +380,7 @@ public: private: ProcFSMemoryStatus(); - virtual bool output(KBufferBuilder& builder) override + virtual KResult try_generate(KBufferBuilder& builder) override { InterruptDisabler disabler; @@ -407,7 +407,7 @@ private: json.add(String::formatted("{}_num_free", prefix), num_free); }); json.finish(); - return true; + return KSuccess; } }; @@ -417,7 +417,7 @@ public: private: ProcFSOverallProcesses(); - virtual bool output(KBufferBuilder& builder) override + virtual KResult try_generate(KBufferBuilder& builder) override { JsonObjectSerializer json { builder }; @@ -515,7 +515,7 @@ private: json.add("total_time", total_time_scheduled.total); json.add("total_time_kernel", total_time_scheduled.total_kernel); } - return true; + return KSuccess; } }; class ProcFSCPUInformation final : public ProcFSGlobalInformation { @@ -524,7 +524,7 @@ public: private: ProcFSCPUInformation(); - virtual bool output(KBufferBuilder& builder) override + virtual KResult try_generate(KBufferBuilder& builder) override { JsonArraySerializer array { builder }; Processor::for_each( @@ -546,7 +546,7 @@ private: obj.add("brandstr", info.brandstr()); }); array.finish(); - return true; + return KSuccess; } }; class ProcFSDmesg final : public ProcFSGlobalInformation { @@ -557,14 +557,13 @@ public: private: ProcFSDmesg(); - virtual bool output(KBufferBuilder& builder) override + virtual KResult try_generate(KBufferBuilder& builder) override { InterruptDisabler disabler; for (char ch : ConsoleDevice::the().logbuffer()) { - if (builder.append(ch).is_error()) - return false; + TRY(builder.append(ch)); } - return true; + return KSuccess; } }; class ProcFSInterrupts final : public ProcFSGlobalInformation { @@ -573,7 +572,7 @@ public: private: ProcFSInterrupts(); - virtual bool output(KBufferBuilder& builder) override + virtual KResult try_generate(KBufferBuilder& builder) override { JsonArraySerializer array { builder }; InterruptManagement::the().enumerate_interrupt_handlers([&array](GenericInterruptHandler& handler) { @@ -586,7 +585,7 @@ private: obj.add("call_count", (unsigned)handler.get_invoking_count()); }); array.finish(); - return true; + return KSuccess; } }; class ProcFSKeymap final : public ProcFSGlobalInformation { @@ -595,12 +594,12 @@ public: private: ProcFSKeymap(); - virtual bool output(KBufferBuilder& builder) override + virtual KResult try_generate(KBufferBuilder& builder) override { JsonObjectSerializer json { builder }; json.add("keymap", HIDManagement::the().keymap_name()); json.finish(); - return true; + return KSuccess; } }; @@ -611,7 +610,7 @@ public: private: ProcFSPCI(); - virtual bool output(KBufferBuilder& builder) override + virtual KResult try_generate(KBufferBuilder& builder) override { JsonArraySerializer array { builder }; PCI::enumerate([&array](PCI::Address address, PCI::ID id) { @@ -629,7 +628,7 @@ private: obj.add("subsystem_vendor_id", PCI::get_subsystem_vendor_id(address)); }); array.finish(); - return true; + return KSuccess; } }; @@ -639,7 +638,7 @@ public: private: ProcFSDevices(); - virtual bool output(KBufferBuilder& builder) override + virtual KResult try_generate(KBufferBuilder& builder) override { JsonArraySerializer array { builder }; Device::for_each([&array](auto& device) { @@ -656,7 +655,7 @@ private: VERIFY_NOT_REACHED(); }); array.finish(); - return true; + return KSuccess; } }; class ProcFSUptime final : public ProcFSGlobalInformation { @@ -665,11 +664,9 @@ public: private: ProcFSUptime(); - virtual bool output(KBufferBuilder& builder) override + virtual KResult try_generate(KBufferBuilder& builder) override { - if (builder.appendff("{}\n", TimeManagement::the().uptime_ms() / 1000).is_error()) - return false; - return true; + return builder.appendff("{}\n", TimeManagement::the().uptime_ms() / 1000); } }; class ProcFSCommandLine final : public ProcFSGlobalInformation { @@ -678,13 +675,11 @@ public: private: ProcFSCommandLine(); - virtual bool output(KBufferBuilder& builder) override + virtual KResult try_generate(KBufferBuilder& builder) override { - if (builder.append(kernel_command_line().string()).is_error()) - return false; - if (builder.append('\n').is_error()) - return false; - return true; + TRY(builder.append(kernel_command_line().string())); + TRY(builder.append('\n')); + return KSuccess; } }; class ProcFSModules final : public ProcFSGlobalInformation { @@ -695,7 +690,7 @@ public: private: ProcFSModules(); - virtual bool output(KBufferBuilder& builder) override + virtual KResult try_generate(KBufferBuilder& builder) override { extern HashMap>* g_modules; JsonArraySerializer array { builder }; @@ -711,7 +706,7 @@ private: obj.add("size", size); } array.finish(); - return true; + return KSuccess; } }; class ProcFSProfile final : public ProcFSGlobalInformation { @@ -722,13 +717,16 @@ public: private: ProcFSProfile(); - virtual bool output(KBufferBuilder& builder) override + virtual KResult try_generate(KBufferBuilder& builder) override { - extern PerformanceEventBuffer* g_global_perf_events; if (!g_global_perf_events) - return false; + return ENOENT; - return g_global_perf_events->to_json(builder); + // FIXME: to_json() should return a better error. + if (!g_global_perf_events->to_json(builder)) + return ENOMEM; + + return KSuccess; } }; @@ -741,13 +739,11 @@ private: virtual mode_t required_mode() const override { return 0400; } - virtual bool output(KBufferBuilder& builder) override + virtual KResult try_generate(KBufferBuilder& builder) override { if (!Process::current().is_superuser()) - return false; - if (builder.append(String::number(kernel_load_base)).is_error()) - return false; - return true; + return EPERM; + return builder.append(String::number(kernel_load_base)); } }; diff --git a/Kernel/ProcessExposed.cpp b/Kernel/ProcessExposed.cpp index c705634c26..34b979cdba 100644 --- a/Kernel/ProcessExposed.cpp +++ b/Kernel/ProcessExposed.cpp @@ -144,8 +144,7 @@ KResult ProcFSGlobalInformation::refresh_data(FileDescription& description) cons return ENOMEM; } KBufferBuilder builder; - if (!const_cast(*this).output(builder)) - return ENOENT; + TRY(const_cast(*this).try_generate(builder)); auto& typed_cached_data = static_cast(*cached_data); typed_cached_data.buffer = builder.build(); if (!typed_cached_data.buffer) diff --git a/Kernel/ProcessExposed.h b/Kernel/ProcessExposed.h index edc2c7d428..8cc95028e0 100644 --- a/Kernel/ProcessExposed.h +++ b/Kernel/ProcessExposed.h @@ -167,7 +167,7 @@ protected: { } virtual KResult refresh_data(FileDescription&) const override; - virtual bool output(KBufferBuilder& builder) = 0; + virtual KResult try_generate(KBufferBuilder&) = 0; mutable Mutex m_refresh_lock; }; @@ -182,11 +182,9 @@ protected: : ProcFSGlobalInformation(name) { } - virtual bool output(KBufferBuilder& builder) override + virtual KResult try_generate(KBufferBuilder& builder) override { - if (builder.appendff("{}\n", value()).is_error()) - return false; - return true; + return builder.appendff("{}\n", value()); } };