Added dp8390 to /usr/etc/rc. Renamed get_mon_prm.c to env_get_prm.c.

Add env_setargs call for access to argc/argv.
This commit is contained in:
Philip Homburg
2005-08-05 14:20:05 +00:00
parent df831bf4a0
commit 473317e571
9 changed files with 117 additions and 164 deletions

View File

@@ -12,7 +12,7 @@ OBJECTS = \
$(LIBUTILS)(kputc.o) \
$(LIBUTILS)(tickdelay.o) \
$(LIBUTILS)(getuptime.o) \
$(LIBUTILS)(get_mon_prm.o) \
$(LIBUTILS)(env_get_prm.o) \
$(LIBUTILS)(env_parse.o) \
$(LIBUTILS)(env_panic.o) \
$(LIBUTILS)(env_prefix.o) \
@@ -41,8 +41,8 @@ $(LIBUTILS)(getuptime.o): getuptime.c
$(LIBUTILS)(tickdelay.o): tickdelay.c
$(CC1) tickdelay.c
$(LIBUTILS)(get_mon_prm.o): get_mon_prm.c
$(CC1) get_mon_prm.c
$(LIBUTILS)(env_get_prm.o): env_get_prm.c
$(CC1) env_get_prm.c
$(LIBUTILS)(env_parse.o): env_parse.c
$(CC1) env_parse.c

97
lib/sysutil/env_get_prm.c Normal file
View File

@@ -0,0 +1,97 @@
#include "sysutil.h"
#include <minix/config.h>
#include <string.h>
PRIVATE int argc = 0;
PRIVATE char **argv = NULL;
FORWARD _PROTOTYPE( char *find_key, (const char *params, const char *key));
/*===========================================================================*
* env_setargs *
*===========================================================================*/
PUBLIC void env_setargs(arg_c, arg_v)
int arg_c;
char *arg_v[];
{
argc= arg_c;
argv= arg_v;
}
/*===========================================================================*
* env_get_param *
*===========================================================================*/
PUBLIC int env_get_param(key, value, max_len)
char *key; /* which key to look up */
char *value; /* where to store value */
int max_len; /* maximum length of value */
{
message m;
static char mon_params[128*sizeof(char *)]; /* copy parameters here */
char *key_value;
int i, s, keylen;
if (key == NULL)
return EINVAL;
keylen= strlen(key);
for (i= 1; i<argc; i++)
{
if (strncmp(argv[i], key, keylen) != 0)
continue;
if (strlen(argv[i]) <= keylen)
continue;
if (argv[i][keylen] != '=')
continue;
key_value= argv[i]+keylen+1;
if (strlen(key_value)+1 > EP_BUF_SIZE)
return(E2BIG);
strcpy(value, key_value);
return OK;
}
/* Get copy of boot monitor parameters. */
m.m_type = SYS_GETINFO;
m.I_REQUEST = GET_MONPARAMS;
m.I_PROC_NR = SELF;
m.I_VAL_LEN = sizeof(mon_params);
m.I_VAL_PTR = mon_params;
if ((s=_taskcall(SYSTASK, SYS_GETINFO, &m)) != OK) {
printf("SYS_GETINFO: %d (size %u)\n", s, sizeof(mon_params));
return(s);
}
/* We got a copy, now search requested key. */
if ((key_value = find_key(mon_params, key)) == NULL)
return(ESRCH);
/* Value found, make the actual copy (as far as possible). */
strncpy(value, key_value, max_len);
/* See if it fits in the client's buffer. */
if ((strlen(key_value)+1) > max_len) return(E2BIG);
return(OK);
}
/*==========================================================================*
* find_key *
*==========================================================================*/
PRIVATE char *find_key(params,name)
const char *params;
const char *name;
{
register const char *namep;
register char *envp;
for (envp = (char *) params; *envp != 0;) {
for (namep = name; *namep != 0 && *namep == *envp; namep++, envp++)
;
if (*namep == '\0' && *envp == '=')
return(envp + 1);
while (*envp++ != 0)
;
}
return(NULL);
}

View File

@@ -9,7 +9,7 @@ char *key; /* environment variable whose value is bogus */
{
static char value[EP_BUF_SIZE] = "<unknown>";
int s;
if ((s=get_mon_param(key, value, sizeof(value))) == 0) {
if ((s=env_get_param(key, value, sizeof(value))) == 0) {
if (s != ESRCH) /* only error allowed */
printf("WARNING: get_mon_param() failed in env_panic(): %d\n", s);
}

View File

@@ -12,21 +12,6 @@ char *fmt; /* template to parse it with */
int field; /* field number of value to return */
long *param; /* address of parameter to get */
long min, max; /* minimum and maximum values for the parameter */
{
return env_parse_x(0, NULL, env, fmt, field, param, min, max);
}
/*=========================================================================*
* env_parse_x *
*=========================================================================*/
PUBLIC int env_parse_x(argc, argv, env, fmt, field, param, min, max)
int argc;
char *argv[];
char *env; /* environment variable to inspect */
char *fmt; /* template to parse it with */
int field; /* field number of value to return */
long *param; /* address of parameter to get */
long min, max; /* minimum and maximum values for the parameter */
{
/* Parse an environment variable setting, something like "DPETH0=300:3".
* Panic if the parsing fails. Return EP_UNSET if the environment variable
@@ -46,25 +31,7 @@ long min, max; /* minimum and maximum values for the parameter */
long newpar;
int s, i, radix, r, keylen;
keylen= strlen(env);
for (i= 0; i<argc; i++)
{
if (strncmp(argv[i], env, keylen) != 0)
continue;
if (strlen(argv[i]) <= keylen)
continue;
if (argv[i][keylen] != '=')
continue;
val= argv[i]+keylen+1;
if (strlen(val)+1 > EP_BUF_SIZE)
{
printf("WARNING: env_parse() failed: argument too long\n");
return(EP_EGETKENV);
}
strcpy(value, val);
}
if (i >= argc && (s=get_mon_param(env, value, sizeof(value))) != 0) {
if ((s=env_get_param(env, value, sizeof(value))) != 0) {
if (s == ESRCH) return(EP_UNSET); /* only error allowed */
printf("WARNING: get_mon_param() failed in env_parse(): %d\n",s);
return(EP_EGETKENV);

View File

@@ -8,19 +8,6 @@
PUBLIC int env_prefix(env, prefix)
char *env; /* environment variable to inspect */
char *prefix; /* prefix to test for */
{
return env_prefix_x(0, NULL, env, prefix);
}
/*=========================================================================*
* env_prefix_x *
*=========================================================================*/
PUBLIC int env_prefix_x(argc, argv, env, prefix)
int argc;
char *argv[];
char *env; /* environment variable to inspect */
char *prefix; /* prefix to test for */
{
/* An environment setting may be prefixed by a word, usually "pci".
* Return TRUE if a given prefix is used.
@@ -31,26 +18,7 @@ char *prefix; /* prefix to test for */
char *val;
size_t n;
keylen= strlen(env);
for (i= 0; i<argc; i++)
{
printf("env_prefix_x: argv[%d] = '%s'\n", i, argv[i]);
if (strncmp(argv[i], env, keylen) != 0)
continue;
if (strlen(argv[i]) <= keylen)
continue;
if (argv[i][keylen] != '=')
continue;
val= argv[i]+keylen+1;
if (strlen(val)+1 > EP_BUF_SIZE)
{
printf("WARNING: env_parse() failed: argument too long\n");
return(EP_EGETKENV);
}
strcpy(value, val);
}
if (i >= argc && (s = get_mon_param(env, value, sizeof(value))) != 0) {
if ((s = env_get_param(env, value, sizeof(value))) != 0) {
if (s != ESRCH) /* only error allowed */
printf("WARNING: get_mon_param() failed in env_prefix(): %d\n", s);
}

View File

@@ -1,67 +0,0 @@
#include "sysutil.h"
#include <minix/config.h>
#include <string.h>
FORWARD _PROTOTYPE( char *find_key, (const char *params, const char *key));
/*===========================================================================*
* get_mon_param *
*===========================================================================*/
PUBLIC int get_mon_param(key, value, max_len)
char *key; /* which key to look up */
char *value; /* where to store value */
int max_len; /* maximum length of value */
{
message m;
static char mon_params[128*sizeof(char *)]; /* copy parameters here */
char *key_value;
int s;
if (key != NULL) {
/* Get copy of boot monitor parameters. */
m.m_type = SYS_GETINFO;
m.I_REQUEST = GET_MONPARAMS;
m.I_PROC_NR = SELF;
m.I_VAL_LEN = sizeof(mon_params);
m.I_VAL_PTR = mon_params;
if ((s=_taskcall(SYSTASK, SYS_GETINFO, &m)) != OK) {
printf("SYS_GETINFO: %d (size %u)\n", s, sizeof(mon_params));
return(s);
}
/* We got a copy, now search requested key. */
if ((key_value = find_key(mon_params, key)) == NULL)
return(ESRCH);
/* Value found, make the actual copy (as far as possible). */
strncpy(value, key_value, max_len);
/* See if it fits in the client's buffer. */
if ((strlen(key_value)+1) > max_len) return(E2BIG);
return(OK);
}
return(EINVAL);
}
/*==========================================================================*
* find_key *
*==========================================================================*/
PRIVATE char *find_key(params,name)
const char *params;
const char *name;
{
register const char *namep;
register char *envp;
for (envp = (char *) params; *envp != 0;) {
for (namep = name; *namep != 0 && *namep == *envp; namep++, envp++)
;
if (*namep == '\0' && *envp == '=')
return(envp + 1);
while (*envp++ != 0)
;
}
return(NULL);
}