1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
//! Load and unload kernel modules. //! //! For more details see use libc; use std::ffi::CStr; use std::os::unix::io::AsRawFd; use crate::errno::Errno; use crate::Result; /// Loads a kernel module from a buffer. /// /// It loads an ELF image into kernel space, /// performs any necessary symbol relocations, /// initializes module parameters to values provided by the caller, /// and then runs the module's init function. /// /// This function requires `CAP_SYS_MODULE` privilege. /// /// The `module_image` argument points to a buffer containing the binary image /// to be loaded. The buffer should contain a valid ELF image /// built for the running kernel. /// /// The `param_values` argument is a string containing space-delimited specifications /// of the values for module parameters. /// Each of the parameter specifications has the form: /// /// `name[=value[,value...]]` /// /// # Example /// /// ```no_run /// use std::fs::File; /// use std::io::Read; /// use std::ffi::CString; /// use nix::kmod::init_module; /// /// let mut f = File::open("mykernel.ko").unwrap(); /// let mut contents: Vec<u8> = Vec::new(); /// f.read_to_end(&mut contents).unwrap(); /// init_module(&mut contents, &CString::new("who=Rust when=Now,12").unwrap()).unwrap(); /// ``` /// /// See [`man init_module(2)`](https://man7.org/linux/man-pages/man2/init_module.2.html) for more information. pub fn init_module(module_image: &[u8], param_values: &CStr) -> Result<()> { let res = unsafe { libc::syscall( libc::SYS_init_module, module_image.as_ptr(), module_image.len(), param_values.as_ptr(), ) }; Errno::result(res).map(drop) } libc_bitflags!( /// Flags used by the `finit_module` function. pub struct ModuleInitFlags: libc::c_uint { /// Ignore symbol version hashes. MODULE_INIT_IGNORE_MODVERSIONS; /// Ignore kernel version magic. MODULE_INIT_IGNORE_VERMAGIC; } ); /// Loads a kernel module from a given file descriptor. /// /// # Example /// /// ```no_run /// use std::fs::File; /// use std::ffi::CString; /// use nix::kmod::{finit_module, ModuleInitFlags}; /// /// let f = File::open("mymod.ko").unwrap(); /// finit_module(&f, &CString::new("").unwrap(), ModuleInitFlags::empty()).unwrap(); /// ``` /// /// See [`man init_module(2)`](https://man7.org/linux/man-pages/man2/init_module.2.html) for more information. pub fn finit_module<T: AsRawFd>(fd: &T, param_values: &CStr, flags: ModuleInitFlags) -> Result<()> { let res = unsafe { libc::syscall( libc::SYS_finit_module, fd.as_raw_fd(), param_values.as_ptr(), flags.bits(), ) }; Errno::result(res).map(drop) } libc_bitflags!( /// Flags used by `delete_module`. /// /// See [`man delete_module(2)`](https://man7.org/linux/man-pages/man2/delete_module.2.html) /// for a detailed description how these flags work. pub struct DeleteModuleFlags: libc::c_int { O_NONBLOCK; O_TRUNC; } ); /// Unloads the kernel module with the given name. /// /// # Example /// /// ```no_run /// use std::ffi::CString; /// use nix::kmod::{delete_module, DeleteModuleFlags}; /// /// delete_module(&CString::new("mymod").unwrap(), DeleteModuleFlags::O_NONBLOCK).unwrap(); /// ``` /// /// See [`man delete_module(2)`](https://man7.org/linux/man-pages/man2/delete_module.2.html) for more information. pub fn delete_module(name: &CStr, flags: DeleteModuleFlags) -> Result<()> { let res = unsafe { libc::syscall(libc::SYS_delete_module, name.as_ptr(), flags.bits()) }; Errno::result(res).map(drop) }