Kernel environment access, preloaded module lookup.
This commit is contained in:
parent
d7a5acb5ec
commit
6ba9413b55
126
sys/kern/kern_environment.c
Normal file
126
sys/kern/kern_environment.c
Normal file
@ -0,0 +1,126 @@
|
||||
/*-
|
||||
* Copyright (c) 1998 Michael Smith
|
||||
* 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.
|
||||
*
|
||||
* $Id$
|
||||
|
||||
/*
|
||||
* The unified bootloader passes us a pointer to a preserved copy of
|
||||
* bootstrap/kernel environment variables.
|
||||
* We make these available using sysctl for both in-kernel and
|
||||
* out-of-kernel consumers.
|
||||
*
|
||||
* Note that the current sysctl infrastructure doesn't allow
|
||||
* dynamic insertion or traversal through handled spaces. Grr.
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/libkern.h>
|
||||
#include <machine/bootinfo.h>
|
||||
|
||||
char *kern_envp;
|
||||
|
||||
static char *kernenv_next(char *cp);
|
||||
|
||||
static void
|
||||
kernenv_init(void* arg)
|
||||
{
|
||||
if (bootinfo.bi_envp != 0)
|
||||
kern_envp = (char *)bootinfo.bi_envp;
|
||||
}
|
||||
|
||||
SYSINIT(kernenv, SI_SUB_CONSOLE, SI_ORDER_FIRST, kernenv_init, 0);
|
||||
|
||||
char *
|
||||
getenv(char *name)
|
||||
{
|
||||
char *cp, *ep;
|
||||
int len;
|
||||
|
||||
for (cp = kern_envp; cp != NULL; cp = kernenv_next(cp)) {
|
||||
for (ep = cp; (*ep != '=') && (*ep != 0); ep++)
|
||||
;
|
||||
len = ep - cp;
|
||||
if (*ep = '=')
|
||||
ep++;
|
||||
if (!strncmp(name, cp, len))
|
||||
return(ep);
|
||||
}
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
sysctl_kernenv SYSCTL_HANDLER_ARGS
|
||||
{
|
||||
int *name = (int *)arg1;
|
||||
u_int namelen = arg2;
|
||||
char *cp;
|
||||
int i, error;
|
||||
|
||||
if (kern_envp == NULL)
|
||||
return(ENOENT);
|
||||
|
||||
name++;
|
||||
namelen--;
|
||||
|
||||
if (namelen != 1)
|
||||
return(EINVAL);
|
||||
|
||||
cp = kern_envp;
|
||||
for (i = 0; i < name[0]; i++) {
|
||||
cp = kernenv_next(cp);
|
||||
if (cp == NULL)
|
||||
break;
|
||||
}
|
||||
|
||||
if (cp == NULL)
|
||||
return(ENOENT);
|
||||
|
||||
error = SYSCTL_OUT(req, cp, strlen(cp) + 1);
|
||||
return (error);
|
||||
}
|
||||
|
||||
SYSCTL_NODE(_kern, OID_AUTO, environment, CTLFLAG_RD, sysctl_kernenv, "kernel environment space");
|
||||
|
||||
/*
|
||||
* Find the next entry after the one which (cp) falls within, return a
|
||||
* pointer to its start or NULL if there are no more.
|
||||
*/
|
||||
static char *
|
||||
kernenv_next(char *cp)
|
||||
{
|
||||
if (cp != NULL) {
|
||||
while (*cp != 0)
|
||||
cp++;
|
||||
cp++;
|
||||
if (*cp == 0)
|
||||
cp = NULL;
|
||||
}
|
||||
return(cp);
|
||||
}
|
||||
|
144
sys/kern/subr_module.c
Normal file
144
sys/kern/subr_module.c
Normal file
@ -0,0 +1,144 @@
|
||||
/*-
|
||||
* Copyright (c) 1998 Michael Smith
|
||||
* 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.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/linker.h>
|
||||
|
||||
/*
|
||||
* Preloaded module support
|
||||
*/
|
||||
|
||||
caddr_t module_metadata;
|
||||
|
||||
/*
|
||||
* Search for the preloaded module (name)
|
||||
*/
|
||||
caddr_t
|
||||
module_search_by_name(const char *name)
|
||||
{
|
||||
caddr_t curp;
|
||||
u_int32_t *hdr;
|
||||
|
||||
if (module_metadata != NULL) {
|
||||
|
||||
curp = module_metadata;
|
||||
for (;;) {
|
||||
hdr = (u_int32_t *)curp;
|
||||
if (hdr[0] == 0)
|
||||
break;
|
||||
|
||||
/* Search for a MODINFO_NAME field */
|
||||
if ((hdr[0] == MODINFO_NAME) &&
|
||||
!strcmp(name, curp + sizeof(u_int32_t) * 2))
|
||||
return(curp);
|
||||
|
||||
/* skip to next field */
|
||||
curp += sizeof(u_int32_t) * 2 + hdr[1];
|
||||
}
|
||||
}
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Search for the first preloaded module of (type)
|
||||
*/
|
||||
caddr_t
|
||||
module_search_by_type(const char *type)
|
||||
{
|
||||
caddr_t curp, lname;
|
||||
u_int32_t *hdr;
|
||||
|
||||
if (module_metadata != NULL) {
|
||||
|
||||
curp = module_metadata;
|
||||
lname = NULL;
|
||||
for (;;) {
|
||||
hdr = (u_int32_t *)curp;
|
||||
if (hdr[0] == 0)
|
||||
break;
|
||||
|
||||
/* remember the start of each record */
|
||||
if (hdr[0] == MODINFO_NAME)
|
||||
lname = curp;
|
||||
|
||||
/* Search for a MODINFO_TYPE field */
|
||||
if ((hdr[0] == MODINFO_TYPE) &&
|
||||
!strcmp(type, curp + sizeof(u_int32_t) * 2))
|
||||
return(lname);
|
||||
|
||||
/* skip to next field */
|
||||
curp += sizeof(u_int32_t) * 2 + hdr[1];
|
||||
}
|
||||
}
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Given a preloaded module handle (mod), return a pointer
|
||||
* to the data for the attribute (inf).
|
||||
*/
|
||||
caddr_t
|
||||
module_search_info(caddr_t mod, int inf)
|
||||
{
|
||||
caddr_t curp;
|
||||
u_int32_t *hdr;
|
||||
u_int32_t type = 0;
|
||||
|
||||
curp = mod;
|
||||
for (;;) {
|
||||
hdr = (u_int32_t *)curp;
|
||||
/* end of module data? */
|
||||
if (hdr[0] == 0)
|
||||
break;
|
||||
/*
|
||||
* We give up once we've looped back to what we were looking at
|
||||
* first - this should normally be a MODINFO_NAME field.
|
||||
*/
|
||||
if (type == 0) {
|
||||
type = hdr[0];
|
||||
} else {
|
||||
if (hdr[0] == type)
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Attribute match? Return pointer to data.
|
||||
* Consumer may safely assume that size value preceeds
|
||||
* data.
|
||||
*/
|
||||
if (hdr[0] == inf)
|
||||
return(curp + (sizeof(u_int32_t) * 2));
|
||||
|
||||
/* skip to next field */
|
||||
curp += sizeof(u_int32_t) * 2 + hdr[1];
|
||||
}
|
||||
return(NULL);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user