1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 20:17:41 +00:00

Kernel: Make SysFS and ProcFS generator functions return KResult

This allows us to propagate a whole bunch of KBufferBuilder errors.
This commit is contained in:
Andreas Kling 2021-09-06 18:41:16 +02:00
parent 2065ced8f6
commit 9db8a14264
5 changed files with 55 additions and 63 deletions

View file

@ -23,7 +23,7 @@ SysFSUSBDeviceInformation::~SysFSUSBDeviceInformation()
{ {
} }
bool SysFSUSBDeviceInformation::output(KBufferBuilder& builder) KResult SysFSUSBDeviceInformation::try_generate(KBufferBuilder& builder)
{ {
VERIFY(m_lock.is_locked()); VERIFY(m_lock.is_locked());
JsonArraySerializer array { builder }; JsonArraySerializer array { builder };
@ -44,7 +44,7 @@ bool SysFSUSBDeviceInformation::output(KBufferBuilder& builder)
obj.add("num_configurations", m_device->device_descriptor().num_configurations); obj.add("num_configurations", m_device->device_descriptor().num_configurations);
obj.finish(); obj.finish();
array.finish(); array.finish();
return true; return KSuccess;
} }
KResult SysFSUSBDeviceInformation::refresh_data(FileDescription& description) const 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)); cached_data = TRY(adopt_nonnull_own_or_enomem(new (nothrow) SysFSInodeData));
} }
KBufferBuilder builder; KBufferBuilder builder;
if (!const_cast<SysFSUSBDeviceInformation&>(*this).output(builder)) TRY(const_cast<SysFSUSBDeviceInformation&>(*this).try_generate(builder));
return ENOENT;
auto& typed_cached_data = static_cast<SysFSInodeData&>(*cached_data); auto& typed_cached_data = static_cast<SysFSInodeData&>(*cached_data);
typed_cached_data.buffer = builder.build(); typed_cached_data.buffer = builder.build();
if (!typed_cached_data.buffer) if (!typed_cached_data.buffer)

View file

@ -33,7 +33,7 @@ protected:
NonnullRefPtr<USB::Device> m_device; NonnullRefPtr<USB::Device> m_device;
private: private:
bool output(KBufferBuilder& builder); KResult try_generate(KBufferBuilder&);
virtual KResult refresh_data(FileDescription& description) const override; virtual KResult refresh_data(FileDescription& description) const override;
mutable Mutex m_lock { "SysFSUSBDeviceInformation" }; mutable Mutex m_lock { "SysFSUSBDeviceInformation" };
}; };

View file

@ -40,7 +40,7 @@ public:
private: private:
ProcFSAdapters(); ProcFSAdapters();
virtual bool output(KBufferBuilder& builder) override virtual KResult try_generate(KBufferBuilder& builder) override
{ {
JsonArraySerializer array { builder }; JsonArraySerializer array { builder };
NetworkingManagement::the().for_each([&array](auto& adapter) { NetworkingManagement::the().for_each([&array](auto& adapter) {
@ -64,7 +64,7 @@ private:
obj.add("mtu", adapter.mtu()); obj.add("mtu", adapter.mtu());
}); });
array.finish(); array.finish();
return true; return KSuccess;
} }
}; };
@ -74,7 +74,7 @@ public:
private: private:
ProcFSARP(); ProcFSARP();
virtual bool output(KBufferBuilder& builder) override virtual KResult try_generate(KBufferBuilder& builder) override
{ {
JsonArraySerializer array { builder }; JsonArraySerializer array { builder };
arp_table().for_each_shared([&](const auto& it) { arp_table().for_each_shared([&](const auto& it) {
@ -83,7 +83,7 @@ private:
obj.add("ip_address", it.key.to_string()); obj.add("ip_address", it.key.to_string());
}); });
array.finish(); array.finish();
return true; return KSuccess;
} }
}; };
@ -93,7 +93,7 @@ public:
private: private:
ProcFSTCP(); ProcFSTCP();
virtual bool output(KBufferBuilder& builder) override virtual KResult try_generate(KBufferBuilder& builder) override
{ {
JsonArraySerializer array { builder }; JsonArraySerializer array { builder };
TCPSocket::for_each([&array](auto& socket) { TCPSocket::for_each([&array](auto& socket) {
@ -116,7 +116,7 @@ private:
} }
}); });
array.finish(); array.finish();
return true; return KSuccess;
} }
}; };
@ -126,7 +126,7 @@ public:
private: private:
ProcFSLocalNet(); ProcFSLocalNet();
virtual bool output(KBufferBuilder& builder) override virtual KResult try_generate(KBufferBuilder& builder) override
{ {
JsonArraySerializer array { builder }; JsonArraySerializer array { builder };
LocalSocket::for_each([&array](auto& socket) { LocalSocket::for_each([&array](auto& socket) {
@ -140,7 +140,7 @@ private:
obj.add("acceptor_gid", socket.acceptor_gid().value()); obj.add("acceptor_gid", socket.acceptor_gid().value());
}); });
array.finish(); array.finish();
return true; return KSuccess;
} }
}; };
@ -150,7 +150,7 @@ public:
private: private:
ProcFSUDP(); ProcFSUDP();
virtual bool output(KBufferBuilder& builder) override virtual KResult try_generate(KBufferBuilder& builder) override
{ {
JsonArraySerializer array { builder }; JsonArraySerializer array { builder };
UDPSocket::for_each([&array](auto& socket) { UDPSocket::for_each([&array](auto& socket) {
@ -166,7 +166,7 @@ private:
} }
}); });
array.finish(); array.finish();
return true; return KSuccess;
} }
}; };
@ -348,7 +348,7 @@ public:
private: private:
ProcFSDiskUsage(); ProcFSDiskUsage();
virtual bool output(KBufferBuilder& builder) override virtual KResult try_generate(KBufferBuilder& builder) override
{ {
JsonArraySerializer array { builder }; JsonArraySerializer array { builder };
VirtualFileSystem::the().for_each_mount([&array](auto& mount) { VirtualFileSystem::the().for_each_mount([&array](auto& mount) {
@ -370,7 +370,7 @@ private:
fs_object.add("source", "none"); fs_object.add("source", "none");
}); });
array.finish(); array.finish();
return true; return KSuccess;
} }
}; };
@ -380,7 +380,7 @@ public:
private: private:
ProcFSMemoryStatus(); ProcFSMemoryStatus();
virtual bool output(KBufferBuilder& builder) override virtual KResult try_generate(KBufferBuilder& builder) override
{ {
InterruptDisabler disabler; InterruptDisabler disabler;
@ -407,7 +407,7 @@ private:
json.add(String::formatted("{}_num_free", prefix), num_free); json.add(String::formatted("{}_num_free", prefix), num_free);
}); });
json.finish(); json.finish();
return true; return KSuccess;
} }
}; };
@ -417,7 +417,7 @@ public:
private: private:
ProcFSOverallProcesses(); ProcFSOverallProcesses();
virtual bool output(KBufferBuilder& builder) override virtual KResult try_generate(KBufferBuilder& builder) override
{ {
JsonObjectSerializer<KBufferBuilder> json { builder }; JsonObjectSerializer<KBufferBuilder> json { builder };
@ -515,7 +515,7 @@ private:
json.add("total_time", total_time_scheduled.total); json.add("total_time", total_time_scheduled.total);
json.add("total_time_kernel", total_time_scheduled.total_kernel); json.add("total_time_kernel", total_time_scheduled.total_kernel);
} }
return true; return KSuccess;
} }
}; };
class ProcFSCPUInformation final : public ProcFSGlobalInformation { class ProcFSCPUInformation final : public ProcFSGlobalInformation {
@ -524,7 +524,7 @@ public:
private: private:
ProcFSCPUInformation(); ProcFSCPUInformation();
virtual bool output(KBufferBuilder& builder) override virtual KResult try_generate(KBufferBuilder& builder) override
{ {
JsonArraySerializer array { builder }; JsonArraySerializer array { builder };
Processor::for_each( Processor::for_each(
@ -546,7 +546,7 @@ private:
obj.add("brandstr", info.brandstr()); obj.add("brandstr", info.brandstr());
}); });
array.finish(); array.finish();
return true; return KSuccess;
} }
}; };
class ProcFSDmesg final : public ProcFSGlobalInformation { class ProcFSDmesg final : public ProcFSGlobalInformation {
@ -557,14 +557,13 @@ public:
private: private:
ProcFSDmesg(); ProcFSDmesg();
virtual bool output(KBufferBuilder& builder) override virtual KResult try_generate(KBufferBuilder& builder) override
{ {
InterruptDisabler disabler; InterruptDisabler disabler;
for (char ch : ConsoleDevice::the().logbuffer()) { for (char ch : ConsoleDevice::the().logbuffer()) {
if (builder.append(ch).is_error()) TRY(builder.append(ch));
return false;
} }
return true; return KSuccess;
} }
}; };
class ProcFSInterrupts final : public ProcFSGlobalInformation { class ProcFSInterrupts final : public ProcFSGlobalInformation {
@ -573,7 +572,7 @@ public:
private: private:
ProcFSInterrupts(); ProcFSInterrupts();
virtual bool output(KBufferBuilder& builder) override virtual KResult try_generate(KBufferBuilder& builder) override
{ {
JsonArraySerializer array { builder }; JsonArraySerializer array { builder };
InterruptManagement::the().enumerate_interrupt_handlers([&array](GenericInterruptHandler& handler) { InterruptManagement::the().enumerate_interrupt_handlers([&array](GenericInterruptHandler& handler) {
@ -586,7 +585,7 @@ private:
obj.add("call_count", (unsigned)handler.get_invoking_count()); obj.add("call_count", (unsigned)handler.get_invoking_count());
}); });
array.finish(); array.finish();
return true; return KSuccess;
} }
}; };
class ProcFSKeymap final : public ProcFSGlobalInformation { class ProcFSKeymap final : public ProcFSGlobalInformation {
@ -595,12 +594,12 @@ public:
private: private:
ProcFSKeymap(); ProcFSKeymap();
virtual bool output(KBufferBuilder& builder) override virtual KResult try_generate(KBufferBuilder& builder) override
{ {
JsonObjectSerializer<KBufferBuilder> json { builder }; JsonObjectSerializer<KBufferBuilder> json { builder };
json.add("keymap", HIDManagement::the().keymap_name()); json.add("keymap", HIDManagement::the().keymap_name());
json.finish(); json.finish();
return true; return KSuccess;
} }
}; };
@ -611,7 +610,7 @@ public:
private: private:
ProcFSPCI(); ProcFSPCI();
virtual bool output(KBufferBuilder& builder) override virtual KResult try_generate(KBufferBuilder& builder) override
{ {
JsonArraySerializer array { builder }; JsonArraySerializer array { builder };
PCI::enumerate([&array](PCI::Address address, PCI::ID id) { 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)); obj.add("subsystem_vendor_id", PCI::get_subsystem_vendor_id(address));
}); });
array.finish(); array.finish();
return true; return KSuccess;
} }
}; };
@ -639,7 +638,7 @@ public:
private: private:
ProcFSDevices(); ProcFSDevices();
virtual bool output(KBufferBuilder& builder) override virtual KResult try_generate(KBufferBuilder& builder) override
{ {
JsonArraySerializer array { builder }; JsonArraySerializer array { builder };
Device::for_each([&array](auto& device) { Device::for_each([&array](auto& device) {
@ -656,7 +655,7 @@ private:
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
}); });
array.finish(); array.finish();
return true; return KSuccess;
} }
}; };
class ProcFSUptime final : public ProcFSGlobalInformation { class ProcFSUptime final : public ProcFSGlobalInformation {
@ -665,11 +664,9 @@ public:
private: private:
ProcFSUptime(); 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 builder.appendff("{}\n", TimeManagement::the().uptime_ms() / 1000);
return false;
return true;
} }
}; };
class ProcFSCommandLine final : public ProcFSGlobalInformation { class ProcFSCommandLine final : public ProcFSGlobalInformation {
@ -678,13 +675,11 @@ public:
private: private:
ProcFSCommandLine(); ProcFSCommandLine();
virtual bool output(KBufferBuilder& builder) override virtual KResult try_generate(KBufferBuilder& builder) override
{ {
if (builder.append(kernel_command_line().string()).is_error()) TRY(builder.append(kernel_command_line().string()));
return false; TRY(builder.append('\n'));
if (builder.append('\n').is_error()) return KSuccess;
return false;
return true;
} }
}; };
class ProcFSModules final : public ProcFSGlobalInformation { class ProcFSModules final : public ProcFSGlobalInformation {
@ -695,7 +690,7 @@ public:
private: private:
ProcFSModules(); ProcFSModules();
virtual bool output(KBufferBuilder& builder) override virtual KResult try_generate(KBufferBuilder& builder) override
{ {
extern HashMap<String, OwnPtr<Module>>* g_modules; extern HashMap<String, OwnPtr<Module>>* g_modules;
JsonArraySerializer array { builder }; JsonArraySerializer array { builder };
@ -711,7 +706,7 @@ private:
obj.add("size", size); obj.add("size", size);
} }
array.finish(); array.finish();
return true; return KSuccess;
} }
}; };
class ProcFSProfile final : public ProcFSGlobalInformation { class ProcFSProfile final : public ProcFSGlobalInformation {
@ -722,13 +717,16 @@ public:
private: private:
ProcFSProfile(); 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) 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 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()) if (!Process::current().is_superuser())
return false; return EPERM;
if (builder.append(String::number(kernel_load_base)).is_error()) return builder.append(String::number(kernel_load_base));
return false;
return true;
} }
}; };

View file

@ -144,8 +144,7 @@ KResult ProcFSGlobalInformation::refresh_data(FileDescription& description) cons
return ENOMEM; return ENOMEM;
} }
KBufferBuilder builder; KBufferBuilder builder;
if (!const_cast<ProcFSGlobalInformation&>(*this).output(builder)) TRY(const_cast<ProcFSGlobalInformation&>(*this).try_generate(builder));
return ENOENT;
auto& typed_cached_data = static_cast<ProcFSInodeData&>(*cached_data); auto& typed_cached_data = static_cast<ProcFSInodeData&>(*cached_data);
typed_cached_data.buffer = builder.build(); typed_cached_data.buffer = builder.build();
if (!typed_cached_data.buffer) if (!typed_cached_data.buffer)

View file

@ -167,7 +167,7 @@ protected:
{ {
} }
virtual KResult refresh_data(FileDescription&) const override; virtual KResult refresh_data(FileDescription&) const override;
virtual bool output(KBufferBuilder& builder) = 0; virtual KResult try_generate(KBufferBuilder&) = 0;
mutable Mutex m_refresh_lock; mutable Mutex m_refresh_lock;
}; };
@ -182,11 +182,9 @@ protected:
: ProcFSGlobalInformation(name) : ProcFSGlobalInformation(name)
{ {
} }
virtual bool output(KBufferBuilder& builder) override virtual KResult try_generate(KBufferBuilder& builder) override
{ {
if (builder.appendff("{}\n", value()).is_error()) return builder.appendff("{}\n", value());
return false;
return true;
} }
}; };