Add a -v and -N option to kenv(1), so it can be more easily used in

scripts the way sysctl(8) is.  The -N option, like in sysctl(8),
displays only the kenv names, not their values.  The -v option prints an
individual kenv variable name with its value as name="value".  This is
the inverse of sysctl(8)'s -n flag, since the default behaviour of
kenv(1) is already like sysctl(8) -n.

Submitted by:	Garrett Cooper < yanegomi AT gmail DOT com >
MFC after:	1 week
This commit is contained in:
Matthew D Fleming 2012-05-11 23:05:14 +00:00
parent 7f4211ddb9
commit af68c71a5e
2 changed files with 35 additions and 9 deletions

View File

@ -32,9 +32,9 @@
.Nd dump or modify the kernel environment
.Sh SYNOPSIS
.Nm
.Op Fl hq
.Op Fl hNq
.Nm
.Op Fl q
.Op Fl qv
.Ar variable Ns Op = Ns Ar value
.Nm
.Op Fl q
@ -54,6 +54,11 @@ name is specified,
.Nm
will only report that value.
If the
.Fl N
option is specified,
.Nm
will only display variable names and not their values.
If the
.Fl u
option is specified,
.Nm
@ -68,6 +73,13 @@ If the
option is set, warnings normally printed as a result of being unable to
perform the requested operation will be suppressed.
.Pp
If the
.Fl v
option is set, the variable name will be printed out for the
environment variable in addition to the value when
.Nm
is executed with a variable name.
.Pp
Variables can be added to the kernel environment using the
.Pa /boot/loader.conf
file, or also statically compiled into the kernel using the statement

View File

@ -42,15 +42,17 @@ static int ksetenv(char *, char *);
static int kunsetenv(char *);
static int hflag = 0;
static int Nflag = 0;
static int qflag = 0;
static int uflag = 0;
static int vflag = 0;
static void
usage(void)
{
(void)fprintf(stderr, "%s\n%s\n%s\n",
"usage: kenv [-hq]",
" kenv [-q] variable[=value]",
"usage: kenv [-hNq]",
" kenv [-qv] variable[=value]",
" kenv [-q] -u variable");
exit(1);
}
@ -64,17 +66,23 @@ main(int argc, char **argv)
error = 0;
val = NULL;
env = NULL;
while ((ch = getopt(argc, argv, "hqu")) != -1) {
while ((ch = getopt(argc, argv, "hNquv")) != -1) {
switch (ch) {
case 'h':
hflag++;
break;
case 'N':
Nflag++;
break;
case 'q':
qflag++;
break;
case 'u':
uflag++;
break;
case 'v':
vflag++;
break;
default:
usage();
}
@ -91,9 +99,9 @@ main(int argc, char **argv)
argv++;
argc--;
}
if (hflag && (env != NULL))
if ((hflag || Nflag) && env != NULL)
usage();
if ((argc > 0) || (uflag && (env == NULL)))
if (argc > 0 || ((uflag || vflag) && env == NULL))
usage();
if (env == NULL) {
error = kdumpenv();
@ -152,7 +160,10 @@ kdumpenv(void)
if (cp == NULL)
continue;
*cp++ = '\0';
printf("%s=\"%s\"\n", buf, cp);
if (Nflag)
printf("%s\n", buf);
else
printf("%s=\"%s\"\n", buf, cp);
buf = cp;
}
return (0);
@ -167,7 +178,10 @@ kgetenv(char *env)
ret = kenv(KENV_GET, env, buf, sizeof(buf));
if (ret == -1)
return (ret);
printf("%s\n", buf);
if (vflag)
printf("%s=\"%s\"\n", env, buf);
else
printf("%s\n", buf);
return (0);
}