소스 검색

Kernel: Make SysFS and ProcFS generator functions return KResult

This allows us to propagate a whole bunch of KBufferBuilder errors.
Andreas Kling 3 년 전
부모
커밋
9db8a14264
5개의 변경된 파일55개의 추가작업 그리고 63개의 파일을 삭제
  1. 3 4
      Kernel/Bus/USB/SysFSUSB.cpp
  2. 1 1
      Kernel/Bus/USB/SysFSUSB.h
  3. 47 51
      Kernel/GlobalProcessExposed.cpp
  4. 1 2
      Kernel/ProcessExposed.cpp
  5. 3 5
      Kernel/ProcessExposed.h

+ 3 - 4
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<SysFSUSBDeviceInformation&>(*this).output(builder))
-        return ENOENT;
+    TRY(const_cast<SysFSUSBDeviceInformation&>(*this).try_generate(builder));
     auto& typed_cached_data = static_cast<SysFSInodeData&>(*cached_data);
     typed_cached_data.buffer = builder.build();
     if (!typed_cached_data.buffer)

+ 1 - 1
Kernel/Bus/USB/SysFSUSB.h

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

+ 47 - 51
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<KBufferBuilder> 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<KBufferBuilder> 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<String, OwnPtr<Module>>* 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;
+
+        // FIXME: to_json() should return a better error.
+        if (!g_global_perf_events->to_json(builder))
+            return ENOMEM;
 
-        return g_global_perf_events->to_json(builder);
+        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));
     }
 };
 

+ 1 - 2
Kernel/ProcessExposed.cpp

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

+ 3 - 5
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());
     }
 };