diff options
-rw-r--r-- | Base/usr/share/man/man2/module_load.md | 35 | ||||
-rw-r--r-- | Base/usr/share/man/man2/module_unload.md | 32 | ||||
-rw-r--r-- | Base/usr/share/man/man7/kernel_modules.md | 65 | ||||
-rw-r--r-- | Base/usr/share/man/man8/modload.md | 25 | ||||
-rw-r--r-- | Base/usr/share/man/man8/modunload.md | 25 | ||||
-rw-r--r-- | Kernel/API/Syscall.h | 2 | ||||
-rw-r--r-- | Kernel/CMakeLists.txt | 2 | ||||
-rw-r--r-- | Kernel/GlobalProcessExposed.cpp | 36 | ||||
-rw-r--r-- | Kernel/Module.h | 26 | ||||
-rw-r--r-- | Kernel/Modules/CMakeLists.txt | 8 | ||||
-rw-r--r-- | Kernel/Modules/TestModule.cpp | 24 | ||||
-rw-r--r-- | Kernel/Modules/module_syms.h | 11 | ||||
-rw-r--r-- | Kernel/Process.cpp | 4 | ||||
-rw-r--r-- | Kernel/Process.h | 2 | ||||
-rw-r--r-- | Kernel/Syscalls/module.cpp | 168 | ||||
-rw-r--r-- | Userland/Libraries/LibC/serenity.cpp | 12 | ||||
-rw-r--r-- | Userland/Libraries/LibC/serenity.h | 3 | ||||
-rw-r--r-- | Userland/Utilities/modload.cpp | 25 | ||||
-rw-r--r-- | Userland/Utilities/modunload.cpp | 25 |
19 files changed, 0 insertions, 530 deletions
diff --git a/Base/usr/share/man/man2/module_load.md b/Base/usr/share/man/man2/module_load.md deleted file mode 100644 index 1e68344366..0000000000 --- a/Base/usr/share/man/man2/module_load.md +++ /dev/null @@ -1,35 +0,0 @@ -## Name - -module\_load - load a kernel module - -## Synopsis - -```**c++ -#include <serenity.h> - -int module_load(const char* path, size_t path_length); -``` - -## Description - -`module_load()` will load a kernel module from an ELF object file given its -path in the filesystem. - -## Return value - -If the module is successfully loaded, `module_load()` returns 0. Otherwise, it -returns -1 and sets `errno` to describe the error. - -## Errors - -* `EPERM`: The calling process does not have superuser permissions. -* `EFAULT`: `path` pointed to memory that was not accessible for the caller. -* `ENOEXEC`: The specified file could not be parsed as an ELF object. -* `EINVAL`: One or more symbols referred to by the module could not be resolved, or the module had no `.text` section, or didn't export a `module_init` function. -* `EEXIST`: A module with the same name was already loaded. - -## See also - -* [`module_unload`(2)](module_unload.md) -* [`modload`(8)](../man8/modload.md) -* [`kernel_modules`(7)](../man7/kernel_modules.md) diff --git a/Base/usr/share/man/man2/module_unload.md b/Base/usr/share/man/man2/module_unload.md deleted file mode 100644 index 1a3193a51d..0000000000 --- a/Base/usr/share/man/man2/module_unload.md +++ /dev/null @@ -1,32 +0,0 @@ -## Name - -module\_unload - unload a kernel module - -## Synopsis - -```**c++ -#include <serenity.h> - -int module_unload(const char* name, size_t name_length); -``` - -## Description - -`module_unload()` will unload a kernel module by name. - -## Return value - -If the module is successfully unloaded, `module_unload()` returns 0. -Otherwise, it returns -1 and sets `errno` to describe the error. - -## Errors - -* `EPERM`: The calling process does not have superuser permissions. -* `EFAULT`: `path` pointed to memory that was not accessible for the caller. -* `ENOENT`: There was no module loaded with the specified name. - -## See also - -* [`module_load`(2)](module_load.md) -* [`modunload`(8)](../man8/modunload.md) -* [`kernel_modules`(7)](../man7/kernel_modules.md) diff --git a/Base/usr/share/man/man7/kernel_modules.md b/Base/usr/share/man/man7/kernel_modules.md deleted file mode 100644 index 884e792ec9..0000000000 --- a/Base/usr/share/man/man7/kernel_modules.md +++ /dev/null @@ -1,65 +0,0 @@ -## Name - -Kernel Modules - runtime code loading for the kernel - -## Description - -Serenity's kernel supports loading modules at runtime. This functionality can -be used to implement optional features (e.g. drivers), and speed up your -development cycle. - -## Module format - -A kernel module is a regular ELF object file which must export several -symbols. Any symbols it refers to will be resolved when it is loaded. - -### `module_name` - -This should be a string like `const char module_name[]` containing the name of -the module. This is used to give the module a name in any informational -contexts, but also to ensure that the module is not loaded twice by accident, -and also used as a reference to unload the module later. - -### `module_init` - -This should be a function with the following signature: `void module_init()`. -It will be called when the module is loaded. - -### `module_fini` - -This is optional, but if defined it should be a function with the following -signature: `void module_fini()`. It will be called when the module is -unloaded. - -## Example: - -```c++ -#include <Kernel/kstdio.h> -#include <Kernel/Process.h> - -extern "C" const char module_name[] = "ExampleModule"; - -extern "C" void module_init() -{ - kprintf("ExampleModule has booted!\n"); - - for (int i = 0; i < 3; ++i) { - kprintf("i is now %d\n", i); - } - - kprintf("current pid: %d\n", current->process().sys$getpid()); - kprintf("current process name: %s\n", current->process().name().characters()); -} - -extern "C" void module_fini() -{ - kprintf("ExampleModule is being removed!\n"); -} -``` - -## See also - -* [`modload`(8)](../man8/modload.md) -* [`modunload`(8)](../man8/modunload.md) -* [`module_load`(2)](../man2/module_load.md) -* [`module_unload`(2)](../man2/module_unload.md) diff --git a/Base/usr/share/man/man8/modload.md b/Base/usr/share/man/man8/modload.md deleted file mode 100644 index 16bcc24dac..0000000000 --- a/Base/usr/share/man/man8/modload.md +++ /dev/null @@ -1,25 +0,0 @@ -## Name - -modload - load a kernel module - -## Synopsis - -```**sh -$ modload <path> -``` - -## Description - -Load a kernel module specified by *path*. - -## Examples - -```sh -$ modload /mod/TestModule.o -``` - -## See also - -* [`modunload`(1)](modunload.md) -* [`module_load`(2)](../man2/module_load.md) -* [`kernel_modules`(7)](../man7/kernel_modules.md) diff --git a/Base/usr/share/man/man8/modunload.md b/Base/usr/share/man/man8/modunload.md deleted file mode 100644 index 1408229305..0000000000 --- a/Base/usr/share/man/man8/modunload.md +++ /dev/null @@ -1,25 +0,0 @@ -## Name - -modunload - unload a kernel module - -## Synopsis - -```**sh -$ modunload <name> -``` - -## Description - -Unload a kernel module specified by *name*. - -## Examples - -```sh -$ modunload TestModule -``` - -## See also - -* [`modload`(8)](modload.md) -* [`module_unload`(2)](../man2/module_unload.md) -* [`kernel_modules`(7)](../man7/kernel_modules.md) diff --git a/Kernel/API/Syscall.h b/Kernel/API/Syscall.h index d2c9f33926..90b9d85c1e 100644 --- a/Kernel/API/Syscall.h +++ b/Kernel/API/Syscall.h @@ -121,8 +121,6 @@ enum class NeedsBigProcessLock { S(mkdir, NeedsBigProcessLock::Yes) \ S(mknod, NeedsBigProcessLock::Yes) \ S(mmap, NeedsBigProcessLock::Yes) \ - S(module_load, NeedsBigProcessLock::Yes) \ - S(module_unload, NeedsBigProcessLock::Yes) \ S(mount, NeedsBigProcessLock::Yes) \ S(mprotect, NeedsBigProcessLock::Yes) \ S(mremap, NeedsBigProcessLock::Yes) \ diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index b9abbe5a35..ea2487ebc1 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -219,7 +219,6 @@ set(KERNEL_SOURCES Syscalls/mkdir.cpp Syscalls/mknod.cpp Syscalls/mmap.cpp - Syscalls/module.cpp Syscalls/mount.cpp Syscalls/open.cpp Syscalls/perf_event.cpp @@ -528,4 +527,3 @@ serenity_install_headers(Kernel) serenity_install_sources(Kernel) add_subdirectory(Prekernel) -add_subdirectory(Modules) diff --git a/Kernel/GlobalProcessExposed.cpp b/Kernel/GlobalProcessExposed.cpp index ef4abe4799..bad352eef3 100644 --- a/Kernel/GlobalProcessExposed.cpp +++ b/Kernel/GlobalProcessExposed.cpp @@ -20,7 +20,6 @@ #include <Kernel/Interrupts/GenericInterruptHandler.h> #include <Kernel/Interrupts/InterruptManagement.h> #include <Kernel/KBufferBuilder.h> -#include <Kernel/Module.h> #include <Kernel/Net/LocalSocket.h> #include <Kernel/Net/NetworkAdapter.h> #include <Kernel/Net/NetworkingManagement.h> @@ -682,33 +681,7 @@ private: return KSuccess; } }; -class ProcFSModules final : public ProcFSGlobalInformation { -public: - static NonnullRefPtr<ProcFSModules> must_create(); - - virtual mode_t required_mode() const override { return 0400; } -private: - ProcFSModules(); - virtual KResult try_generate(KBufferBuilder& builder) override - { - extern HashMap<String, OwnPtr<Module>>* g_modules; - JsonArraySerializer array { builder }; - for (auto& it : *g_modules) { - auto obj = array.add_object(); - obj.add("name", it.value->name); - obj.add("module_init", it.value->module_init); - obj.add("module_fini", it.value->module_fini); - u32 size = 0; - for (auto& section : it.value->sections) { - size += section.capacity(); - } - obj.add("size", size); - } - array.finish(); - return KSuccess; - } -}; class ProcFSProfile final : public ProcFSGlobalInformation { public: static NonnullRefPtr<ProcFSProfile> must_create(); @@ -791,10 +764,6 @@ UNMAP_AFTER_INIT NonnullRefPtr<ProcFSCommandLine> ProcFSCommandLine::must_create { return adopt_ref_if_nonnull(new (nothrow) ProcFSCommandLine).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr<ProcFSModules> ProcFSModules::must_create() -{ - return adopt_ref_if_nonnull(new (nothrow) ProcFSModules).release_nonnull(); -} UNMAP_AFTER_INIT NonnullRefPtr<ProcFSProfile> ProcFSProfile::must_create() { return adopt_ref_if_nonnull(new (nothrow) ProcFSProfile).release_nonnull(); @@ -853,10 +822,6 @@ UNMAP_AFTER_INIT ProcFSCommandLine::ProcFSCommandLine() : ProcFSGlobalInformation("cmdline"sv) { } -UNMAP_AFTER_INIT ProcFSModules::ProcFSModules() - : ProcFSGlobalInformation("modules"sv) -{ -} UNMAP_AFTER_INIT ProcFSProfile::ProcFSProfile() : ProcFSGlobalInformation("profile"sv) { @@ -896,7 +861,6 @@ UNMAP_AFTER_INIT NonnullRefPtr<ProcFSRootDirectory> ProcFSRootDirectory::must_cr directory->m_components.append(ProcFSDevices::must_create()); directory->m_components.append(ProcFSUptime::must_create()); directory->m_components.append(ProcFSCommandLine::must_create()); - directory->m_components.append(ProcFSModules::must_create()); directory->m_components.append(ProcFSProfile::must_create()); directory->m_components.append(ProcFSKernelBase::must_create()); diff --git a/Kernel/Module.h b/Kernel/Module.h deleted file mode 100644 index 55893a620e..0000000000 --- a/Kernel/Module.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include <AK/String.h> -#include <AK/Vector.h> -#include <Kernel/KBuffer.h> - -namespace Kernel { - -typedef void* (*ModuleInitPtr)(); -typedef void* (*ModuleFiniPtr)(); - -struct Module { - String name; - NonnullOwnPtrVector<KBuffer> sections; - - ModuleInitPtr module_init { nullptr }; - ModuleFiniPtr module_fini { nullptr }; -}; - -} diff --git a/Kernel/Modules/CMakeLists.txt b/Kernel/Modules/CMakeLists.txt deleted file mode 100644 index c932b3123b..0000000000 --- a/Kernel/Modules/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -set(CMAKE_CXX_OUTPUT_EXTENSION_REPLACE 1) - -function(serenity_kernel_module name sources) - add_library(${name} STATIC ${sources}) - install(FILES $<TARGET_OBJECTS:${name}> DESTINATION mod) -endfunction() - -serenity_kernel_module(TestModule TestModule.cpp) diff --git a/Kernel/Modules/TestModule.cpp b/Kernel/Modules/TestModule.cpp deleted file mode 100644 index 831cdddc35..0000000000 --- a/Kernel/Modules/TestModule.cpp +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include <AK/Format.h> -#include <Kernel/Modules/module_syms.h> - -extern "C" const char module_name[] = "TestModule"; - -extern "C" void module_init() -{ - dmesgln("TestModule has booted!"); - - for (int i = 0; i < 3; ++i) { - dmesgln("i is now {}", i); - } -} - -extern "C" void module_fini() -{ - dmesgln("TestModule is being removed!"); -} diff --git a/Kernel/Modules/module_syms.h b/Kernel/Modules/module_syms.h deleted file mode 100644 index 28060f1f3d..0000000000 --- a/Kernel/Modules/module_syms.h +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright (c) 2020, the SerenityOS developers. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -extern "C" const char module_name[]; -extern "C" void module_init(); -extern "C" void module_fini(); diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 62014dfcc9..1b53fc2e7d 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -25,7 +25,6 @@ #include <Kernel/Memory/AnonymousVMObject.h> #include <Kernel/Memory/PageDirectory.h> #include <Kernel/Memory/SharedInodeVMObject.h> -#include <Kernel/Module.h> #include <Kernel/PerformanceEventBuffer.h> #include <Kernel/PerformanceManager.h> #include <Kernel/Process.h> @@ -45,7 +44,6 @@ static void create_signal_trampoline(); RecursiveSpinlock g_profiling_lock; static Atomic<pid_t> next_pid; static Singleton<SpinlockProtected<Process::List>> s_processes; -READONLY_AFTER_INIT HashMap<String, OwnPtr<Module>>* g_modules; READONLY_AFTER_INIT Memory::Region* g_signal_trampoline_region; static Singleton<MutexProtected<String>> s_hostname; @@ -72,8 +70,6 @@ ProcessID Process::allocate_pid() UNMAP_AFTER_INIT void Process::initialize() { - g_modules = new HashMap<String, OwnPtr<Module>>; - next_pid.store(0, AK::MemoryOrder::memory_order_release); // Note: This is called before scheduling is initialized, and before APs are booted. diff --git a/Kernel/Process.h b/Kernel/Process.h index 4b89e1954a..180a1d07d1 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -393,8 +393,6 @@ public: KResultOr<FlatPtr> sys$getrandom(Userspace<void*>, size_t, unsigned int); KResultOr<FlatPtr> sys$getkeymap(Userspace<const Syscall::SC_getkeymap_params*>); KResultOr<FlatPtr> sys$setkeymap(Userspace<const Syscall::SC_setkeymap_params*>); - KResultOr<FlatPtr> sys$module_load(Userspace<const char*> path, size_t path_length); - KResultOr<FlatPtr> sys$module_unload(Userspace<const char*> name, size_t name_length); KResultOr<FlatPtr> sys$profiling_enable(pid_t, u64); KResultOr<FlatPtr> sys$profiling_disable(pid_t); KResultOr<FlatPtr> sys$profiling_free_buffer(pid_t); diff --git a/Kernel/Syscalls/module.cpp b/Kernel/Syscalls/module.cpp deleted file mode 100644 index 538c6846d8..0000000000 --- a/Kernel/Syscalls/module.cpp +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include <Kernel/FileSystem/OpenFileDescription.h> -#include <Kernel/FileSystem/VirtualFileSystem.h> -#include <Kernel/KSyms.h> -#include <Kernel/Module.h> -#include <Kernel/Process.h> -#include <LibELF/Image.h> - -namespace Kernel { - -extern HashMap<String, OwnPtr<Module>>* g_modules; - -KResultOr<FlatPtr> Process::sys$module_load(Userspace<const char*> user_path, size_t path_length) -{ - VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) - if (!is_superuser()) - return EPERM; - - REQUIRE_NO_PROMISES; - - auto path = TRY(get_syscall_path_argument(user_path, path_length)); - auto description = TRY(VirtualFileSystem::the().open(path->view(), O_RDONLY, 0, current_directory())); - auto payload = TRY(description->read_entire_file()); - - auto storage = TRY(KBuffer::try_create_with_bytes(payload->bytes())); - - auto elf_image = try_make<ELF::Image>(storage->data(), storage->size()); - if (!elf_image) - return ENOMEM; - if (!elf_image->parse()) - return ENOEXEC; - - HashMap<String, u8*> section_storage_by_name; - - auto module = try_make<Module>(); - if (!module) - return ENOMEM; - - KResult section_loading_result = KSuccess; - elf_image->for_each_section_of_type(SHT_PROGBITS, [&](const ELF::Image::Section& section) { - if (!section.size() || !section_loading_result.is_error()) - return; - auto section_storage_or_error = KBuffer::try_create_with_bytes(ReadonlyBytes { section.raw_data(), section.size() }, Memory::Region::Access::ReadWriteExecute); - if (section_storage_or_error.is_error()) { - section_loading_result = section_storage_or_error.error(); - return; - } - auto section_storage = section_storage_or_error.release_value(); - section_storage_by_name.set(section.name(), section_storage->data()); - module->sections.append(move(section_storage)); - }); - if (section_loading_result.is_error()) - return section_loading_result; - - bool missing_symbols = false; - - elf_image->for_each_section_of_type(SHT_PROGBITS, [&](const ELF::Image::Section& section) { - if (!section.size()) - return; - - auto* section_storage = section_storage_by_name.get(section.name()).value_or(nullptr); - VERIFY(section_storage); - auto relocations = section.relocations(); - VERIFY(relocations.has_value()); - relocations->for_each_relocation([&](const ELF::Image::Relocation& relocation) { - auto& patch_ptr = *reinterpret_cast<ptrdiff_t*>(section_storage + relocation.offset()); - switch (relocation.type()) { - case R_386_PC32: { - // PC-relative relocation - dbgln("PC-relative relocation: {}", relocation.symbol().name()); - auto symbol_address = address_for_kernel_symbol(relocation.symbol().name()); - if (symbol_address == 0) - missing_symbols = true; - dbgln(" Symbol address: {:p}", symbol_address); - ptrdiff_t relative_offset = (FlatPtr)symbol_address - ((FlatPtr)&patch_ptr + 4); - patch_ptr = relative_offset; - break; - } - case R_386_32: // Absolute relocation - dbgln("Absolute relocation: '{}' value={}, index={}", relocation.symbol().name(), relocation.symbol().value(), relocation.symbol_index()); - - if (relocation.symbol().bind() == STB_LOCAL) { - auto* section_storage_containing_symbol = section_storage_by_name.get(relocation.symbol().section().name()).value_or(nullptr); - VERIFY(section_storage_containing_symbol); - u32 symbol_address = (ptrdiff_t)(section_storage_containing_symbol + relocation.symbol().value()); - if (symbol_address == 0) - missing_symbols = true; - dbgln(" Symbol address: {:p}", symbol_address); - patch_ptr += symbol_address; - } else if (relocation.symbol().bind() == STB_GLOBAL) { - u32 symbol_address = address_for_kernel_symbol(relocation.symbol().name()); - if (symbol_address == 0) - missing_symbols = true; - dbgln(" Symbol address: {:p}", symbol_address); - patch_ptr += symbol_address; - } else { - VERIFY_NOT_REACHED(); - } - break; - } - }); - }); - - if (missing_symbols) - return EINVAL; - - auto* text_base = section_storage_by_name.get(".text").value_or(nullptr); - if (!text_base) { - dbgln("No .text section found in module!"); - return EINVAL; - } - - elf_image->for_each_symbol([&](const ELF::Image::Symbol& symbol) { - dbgln(" - {} '{}' @ {:p}, size={}", symbol.type(), symbol.name(), symbol.value(), symbol.size()); - if (symbol.name() == "module_init") { - module->module_init = (ModuleInitPtr)(text_base + symbol.value()); - } else if (symbol.name() == "module_fini") { - module->module_fini = (ModuleFiniPtr)(text_base + symbol.value()); - } else if (symbol.name() == "module_name") { - const u8* storage = section_storage_by_name.get(symbol.section().name()).value_or(nullptr); - if (storage) - module->name = String((const char*)(storage + symbol.value())); - } - }); - - if (!module->module_init) - return EINVAL; - - if (g_modules->contains(module->name)) { - dbgln("a module with the name {} is already loaded; please unload it first", module->name); - return EEXIST; - } - - module->module_init(); - - auto name = module->name; - g_modules->set(name, move(module)); - - return 0; -} - -KResultOr<FlatPtr> Process::sys$module_unload(Userspace<const char*> user_name, size_t name_length) -{ - VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) - if (!is_superuser()) - return EPERM; - - REQUIRE_NO_PROMISES; - - auto module_name = TRY(try_copy_kstring_from_user(user_name, name_length)); - - auto it = g_modules->find(module_name->view()); - if (it == g_modules->end()) - return ENOENT; - - if (it->value->module_fini) - it->value->module_fini(); - - g_modules->remove(it); - return 0; -} - -} diff --git a/Userland/Libraries/LibC/serenity.cpp b/Userland/Libraries/LibC/serenity.cpp index 9120222fa9..628a8f3663 100644 --- a/Userland/Libraries/LibC/serenity.cpp +++ b/Userland/Libraries/LibC/serenity.cpp @@ -18,18 +18,6 @@ int disown(pid_t pid) __RETURN_WITH_ERRNO(rc, rc, -1); } -int module_load(const char* path, size_t path_length) -{ - int rc = syscall(SC_module_load, path, path_length); - __RETURN_WITH_ERRNO(rc, rc, -1); -} - -int module_unload(const char* name, size_t name_length) -{ - int rc = syscall(SC_module_unload, name, name_length); - __RETURN_WITH_ERRNO(rc, rc, -1); -} - int profiling_enable(pid_t pid, uint64_t event_mask) { int rc = syscall(SC_profiling_enable, pid, event_mask); diff --git a/Userland/Libraries/LibC/serenity.h b/Userland/Libraries/LibC/serenity.h index fc4f105dd7..b144746d4e 100644 --- a/Userland/Libraries/LibC/serenity.h +++ b/Userland/Libraries/LibC/serenity.h @@ -16,9 +16,6 @@ __BEGIN_DECLS int disown(pid_t); -int module_load(const char* path, size_t path_length); -int module_unload(const char* name, size_t name_length); - int profiling_enable(pid_t, uint64_t); int profiling_disable(pid_t); int profiling_free_buffer(pid_t); diff --git a/Userland/Utilities/modload.cpp b/Userland/Utilities/modload.cpp deleted file mode 100644 index 44c9b5ffae..0000000000 --- a/Userland/Utilities/modload.cpp +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include <LibCore/ArgsParser.h> -#include <serenity.h> -#include <string.h> - -int main(int argc, char** argv) -{ - const char* path = nullptr; - - Core::ArgsParser args_parser; - args_parser.add_positional_argument(path, "Path to the module to load", "path"); - args_parser.parse(argc, argv); - - int rc = module_load(path, strlen(path)); - if (rc < 0) { - perror("module_load"); - return 1; - } - return 0; -} diff --git a/Userland/Utilities/modunload.cpp b/Userland/Utilities/modunload.cpp deleted file mode 100644 index 2d7d039759..0000000000 --- a/Userland/Utilities/modunload.cpp +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include <LibCore/ArgsParser.h> -#include <serenity.h> -#include <string.h> - -int main(int argc, char** argv) -{ - const char* name = nullptr; - - Core::ArgsParser args_parser; - args_parser.add_positional_argument(name, "Name of the module to unload", "name"); - args_parser.parse(argc, argv); - - int rc = module_unload(name, strlen(name)); - if (rc < 0) { - perror("module_unload"); - return 1; - } - return 0; -} |