.\" $NetBSD: modctl.2,v 1.19 2020/04/26 18:56:49 pgoyette Exp $ .\" .\" Copyright (c) 2009 The NetBSD Foundation, Inc. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED .\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR .\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS .\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR .\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF .\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS .\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN .\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" .Dd April 26, 2020 .Dt MODCTL 2 .Os .Sh NAME .Nm modctl .Nd module control .Sh LIBRARY .Lb libc .Sh SYNOPSIS .In sys/module.h .Ft int .Fn modctl "int operation" "void *argp" .Sh DESCRIPTION .Fn modctl provides control over loaded kernel modules. The argument .Fa operation is one of .Dv MODCTL_LOAD , .Dv MODCTL_UNLOAD , .Dv MODCTL_STAT , or .Dv MODCTL_EXISTS . The argument .Fa argp depends on the .Fa operation to be performed. .Pp Operations are: .Bl -tag -width MODCTL_UNLOAD .It Dv MODCTL_LOAD Load a module. The .Fa argp argument should be a pointer to a .Em modctl_load_t structure, described below. .It Dv MODCTL_UNLOAD Unload a module. In this case, .Fa argp should be a string containing the name of the module to be unloaded. .It Dv MODCTL_STAT Return a list of loaded modules. In this case, the .Fa argp argument should be a .Em struct iovec pointing to a suitable block of memory. The kernel will fill this block with .Bl -bullet .It a count of the number of modules loaded, .It an array of .Em modstat_t structures, one per loaded module, and .It a series of NUL-terminated strings containing the modules' required modules lists. .El .Pp If the block is not large enough, the data returned will be truncated to fit. The kernel will then update the .Fa iov_len member of the .Em iovec to reflect the size of the complete report, regardless of whether this is larger or smaller than the size passed in. .It Dv MODCTL_EXISTS Test to see if the kernel was compiled with .Dq options MODULAR and whether or not modules may be loaded at the moment. In this case, .Fa argp should be an integer. It should be .Dq 0 to test if a user can load a module via .Dv MODCTL_LOAD , or it should be .Dq 1 to test if the system can autoload modules. Note that this test does not consider the sysctl .Li kern.module.autoload . .El .Ss Data Types The .Em modctl_load_t structure used with .Dv MODCTL_LOAD contains the following elements, which should be filled in by the caller: .Bl -tag -width aaaaaaaa .It Fa "const char *ml_filename" The name/path of the module to load. .It Fa "int ml_flags" Zero or more of the following flag values: .Bl -tag -compact -width "MODCTL_LOAD_FORCE" .It Dv MODCTL_NO_PROP Don't load .Ao module Ac Ns Pa .plist . .It Dv MODCTL_LOAD_FORCE Ignore kernel version mismatch. .El .It Fa "const char *ml_props" Externalized proplib dictionary to pass to module. .It Fa "size_t ml_propslen" Size of the dictionary blob. .Fa ml_props may be .Dv NULL in which case .Fa ml_propslen must be .Dv 0 . An upper limit of 4096 bytes is imposed on the value of ml_propslen. Attempting to load a proplib dictionary larger than this size will return .Er ENOMEM . .El .Pp The .Em modstat_t structure used with .Dv MODCTL_STAT contains the following elements, which are filled in by the kernel: .Bl -tag -width aaaaaaaa .It Fa "char ms_name[MAXMODNAME]" The name of the module. .It Fa "modsrc_t ms_source" One of the following enumerated constants: .Bl -tag -compact -width "MODULE_SOURCE_FILESYS" .It Dv MODULE_SOURCE_KERNEL The module is compiled into the kernel. .It Dv MODULE_SOURCE_BOOT The module was provided by the bootstrap loader. .It Dv MODULE_SOURCE_FILESYS The module was loaded from the file system. .El .It Fa "modclass_t ms_class" One of the following enumerated constants: .Bl -tag -compact -width "MODULE_SOURCE_FILESYS" .It Dv MODULE_CLASS_SECMODEL Security model. .It Dv MODULE_CLASS_VFS File system. .It Dv MODULE_CLASS_DRIVER Device driver. .It Dv MODULE_CLASS_EXEC Executable file format. .It Dv MODULE_CLASS_MISC Miscellaneous. .El .It Fa "uint64_t ms_addr" The load address within the kernel of the module's text segment. (This value is available only for privileged users.) .It Fa "u_int ms_size" Loaded size of the module's text segment. (This value is available only for privileged users.) .It Fa "u_int ms_refcnt" Current number of live references to this module. .It Fa "u_int ms_flags" The module's flags: .Bl -tag -compact -width "MODFLAG_AUTO_LOADED" .It Dv MODFLAG_MUST_FORCE The "force" flag must be specified to reload this module. .It Dv MODFLAG_AUTO_LOADED The module was auto-loaded by the operating system. .El .It Fa "uint_ms_reqoffset" The offset (in bytes) from the beginning of the required-module data. .El .Sh RETURN VALUES Upon successful completion, the value returned is 0. .Pp Otherwise, a value of \-1 is returned and .Va errno is set to indicate the error. .Sh ERRORS .Fn modctl will fail if: .Bl -tag -width Er .It Bq Er EBUSY The argument .Fa operation is .Dv MODCTL_UNLOAD and the module is in use or the module is compiled into the kernel. .It Bq Er EDEADLK The argument .Fa operation is .Dv MODCTL_LOAD and there is a circular dependency in the module's dependency chain. .It Bq Er EEXIST The argument .Fa operation is .Dv MODCTL_LOAD and the module is already loaded. .It Bq Er EFAULT A bad address was given for .Fa argp . .It Bq Er EFBIG The argument .Fa operation is .Dv MODCTL_LOAD , the specified module resides in the file system, and the module's default proplib file was too large. .It Bq Er EINVAL The argument .Fa operation is invalid. .Pp The argument .Fa operation is .Dv MODCTL_LOAD and ml_props is not .Dv NULL and .Dq ml_propslen is .Dv 0 , or ml_props is .Dv NULL and .Dq ml_propslen is not .Dv 0 . The kernel is unable to internalize the plist. Or, there is a problem with the module or .plist. .It Bq Er ENAMETOOLONG A module name/path is too long. .It Bq Er ENOENT The argument .Fa operation is .Dv MODCTL_LOAD and the module or a dependency can't be found. .Pp The argument .Fa operation is .Dv MODCTL_UNLOAD and no module by the name of .Fa argp is loaded. .It Bq Er ENOEXEC The argument .Fa operation is .Dv MODCTL_LOAD and the module is not a valid object for the system. Most likely, one or more undefined symbols could not be resolved by the in-kernel linker. .It Bq Er ENOMEM There was not enough memory to perform the .Fa operation . .It Bq Er ENOSYS The argument .Fa operation is .Dv MODLOAD_EXIST and the kernel does not include .Dq options MODULAR . .It Bq Er EPERM Not allowed to perform the .Fa operation . .It Bq Er EPROGMISMATCH The argument .Fa operation is .Dv MODCTL_LOAD , the .Fa ml_flags field in the .Em modctl_load_t structure does not include .Dv MODCTL_LOAD_FORCE , and the requested module does not match the current kernel's version information. .El .Sh SEE ALSO .Xr module 7 , .Xr sysctl 7 , .Xr module 9 .Sh HISTORY The .Fn modctl function call first appeared in .Nx 5.0 .