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:
parent
2065ced8f6
commit
9db8a14264
5 changed files with 55 additions and 63 deletions
|
@ -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)
|
||||||
|
|
|
@ -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" };
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue