Add utility functions for checking if a given kernel module is loaded,

and loading it.
This commit is contained in:
Dag-Erling Smørgrav 2006-02-18 11:25:28 +00:00
parent 3d48264f02
commit 501092bbc8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=155804
4 changed files with 180 additions and 2 deletions

View File

@ -6,19 +6,20 @@ SHLIB_MAJOR= 5
SHLIBDIR?= /lib
CFLAGS+=-DLIBC_SCCS -I${.CURDIR} -I${.CURDIR}/../libc/gen/
CFLAGS+=-DINET6
SRCS= _secure_path.c auth.c fparseln.c humanize_number.c login.c \
SRCS= _secure_path.c auth.c fparseln.c humanize_number.c kld.c login.c \
login_auth.c login_cap.c login_class.c login_crypt.c login_ok.c \
login_times.c login_tty.c logout.c logwtmp.c \
pidfile.c property.c pty.c pw_util.c realhostname.c stub.c \
trimdomain.c uucplock.c
INCS= libutil.h login_cap.h
MAN+= login.3 login_auth.3 login_tty.3 logout.3 logwtmp.3 pty.3 \
MAN+= kld.3 login.3 login_auth.3 login_tty.3 logout.3 logwtmp.3 pty.3 \
login_cap.3 login_class.3 login_times.3 login_ok.3 \
_secure_path.3 uucplock.3 property.3 auth.3 realhostname.3 \
realhostname_sa.3 trimdomain.3 fparseln.3 humanize_number.3 \
pidfile.3
MAN+= login.conf.5 auth.conf.5
MLINKS+= kld.3 kld_isloaded.3 kld.3 kld_load.3
MLINKS+= property.3 properties_read.3 property.3 properties_free.3
MLINKS+= property.3 property_find.3
MLINKS+= auth.3 auth_getval.3

98
lib/libutil/kld.3 Normal file
View File

@ -0,0 +1,98 @@
.\"-
.\" Copyright (c) 2006 Dag-Erling Coïdan Smørgrav
.\" 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 AUTHOR 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 AUTHOR 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.
.\"
.\" $FreeBSD$
.\"
.Dd February 18, 2006
.Os
.Dt KLD 3
.Sh NAME
.Nm kld_isloaded ,
.Nm kld_load
.Nd kld utility functions
.Sh LIBRARY
.Lb libutil
.Sh SYNOPSIS
.In libutil.h
.Ft int
.Fn kld_isloaded "const char *name"
.Ft int
.Fn kld_load "const char *name"
.Sh DESCRIPTION
These functions facilitate loading kernel modules from userland
applications.
.Pp
The
.Fn kld_isloaded
function takes a name and returns a non-zero value if a module of that
name is currently loaded.
The name can be either the name of a module file
.Po
.Va cpufreq.ko
.Pc ,
the same name without the
.Pa .ko
extension
.Po
.Va cpufreq
.Pc ,
or the name of a module contained within that file
.Po
.Va cpu/ichss
.Pc .
Only the latter will return correct results if the module is compiled
into the kernel.
.Pp
The
.Fn kld_load
function is a simple wrapper around the
.Fn kldload
function.
It returns zero if and only if the corresponding
.Fn kldload
call succeeded or returned
.Er EEXIST
(signifying that the requested module was already loaded).
.Sh SEE ALSO
.Xr kldfirstmod 2
.Xr kldload 2 ,
.Xr kldnext 2 ,
.Xr kldstat 2 ,
.Xr modfnext 2 ,
.Xr modstat 2
.Sh HISTORY
The
.Fn kld_isloaded
and
.Fn kld_load
functions first appeared in
.Fx 7.0 .
.Sh AUTHORS
The
.Fn kld_isloaded
and
.Fn kld_load
functions and this manual page were written by
.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org .

74
lib/libutil/kld.c Normal file
View File

@ -0,0 +1,74 @@
/*-
* Copyright (c) 2006 Dag-Erling Coïdan Smørgrav
* 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
* in this position and unchanged.
* 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 AUTHOR 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 AUTHOR 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.
*
* $FreeBSD$
*/
#include <sys/param.h>
#include <sys/linker.h>
#include <sys/module.h>
#include <errno.h>
int
kld_isloaded(const char *name)
{
struct kld_file_stat fstat;
struct module_stat mstat;
const char *ko;
int fid, mid;
for (fid = kldnext(0); fid > 0; fid = kldnext(fid)) {
fstat.version = sizeof(fstat);
if (kldstat(fid, &fstat) != 0)
continue;
/* check if the file name matches the supplied name */
if (strcmp(fstat.name, name) == 0)
return (1);
/* strip .ko and try again */
if ((ko = strstr(fstat.name, ".ko")) != NULL &&
strlen(name) == ko - fstat.name &&
strncmp(fstat.name, name, ko - fstat.name) == 0)
return (1);
/* look for a matching module within the file */
for (mid = kldfirstmod(fid); mid > 0; mid = modfnext(mid)) {
mstat.version = sizeof(mstat);
if (modstat(mid, &mstat) != 0)
continue;
if (strcmp(mstat.name, name) == 0)
return (1);
}
}
return (0);
}
int
kld_load(const char *name)
{
if (kldload(name) == -1 && errno != EEXIST)
return (-1);
return (0);
}

View File

@ -94,6 +94,10 @@ int realhostname(char *host, size_t hsize, const struct in_addr *ip);
struct sockaddr;
int realhostname_sa(char *host, size_t hsize, struct sockaddr *addr,
int addrlen);
int kld_isloaded(const char *name);
int kld_load(const char *name);
#ifdef _STDIO_H_ /* avoid adding new includes */
char *fparseln(FILE *, size_t *, size_t *, const char[3], int);
#endif
@ -119,6 +123,7 @@ int pidfile_write(struct pidfh *pfh);
int pidfile_close(struct pidfh *pfh);
int pidfile_remove(struct pidfh *pfh);
#endif
__END_DECLS
#define UU_LOCK_INUSE (1)