summaryrefslogtreecommitdiffstats
path: root/bin/kenv
diff options
context:
space:
mode:
Diffstat (limited to 'bin/kenv')
-rw-r--r--bin/kenv/Makefile5
-rw-r--r--bin/kenv/Makefile.depend18
-rw-r--r--bin/kenv/kenv.1108
-rw-r--r--bin/kenv/kenv.c206
4 files changed, 337 insertions, 0 deletions
diff --git a/bin/kenv/Makefile b/bin/kenv/Makefile
new file mode 100644
index 0000000..33a6dfc
--- /dev/null
+++ b/bin/kenv/Makefile
@@ -0,0 +1,5 @@
+# $FreeBSD$
+
+PROG= kenv
+
+.include <bsd.prog.mk>
diff --git a/bin/kenv/Makefile.depend b/bin/kenv/Makefile.depend
new file mode 100644
index 0000000..3646e2e
--- /dev/null
+++ b/bin/kenv/Makefile.depend
@@ -0,0 +1,18 @@
+# $FreeBSD$
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+ gnu/lib/csu \
+ gnu/lib/libgcc \
+ include \
+ include/xlocale \
+ lib/${CSU_DIR} \
+ lib/libc \
+ lib/libcompiler_rt \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/bin/kenv/kenv.1 b/bin/kenv/kenv.1
new file mode 100644
index 0000000..ac6e4b9
--- /dev/null
+++ b/bin/kenv/kenv.1
@@ -0,0 +1,108 @@
+.\"-
+.\" Copyright (c) 2000 Peter Wemm <peter@FreeBSD.org>
+.\"
+.\" 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 AUTHORS 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 AUTHORS 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 May 11, 2012
+.Dt KENV 1
+.Os
+.Sh NAME
+.Nm kenv
+.Nd dump or modify the kernel environment
+.Sh SYNOPSIS
+.Nm
+.Op Fl hNq
+.Nm
+.Op Fl qv
+.Ar variable Ns Op = Ns Ar value
+.Nm
+.Op Fl q
+.Fl u
+.Ar variable
+.Sh DESCRIPTION
+The
+.Nm
+utility will dump the kernel environment if
+invoked without arguments.
+If the
+.Fl h
+option is specified, it will limit the report to kernel probe hints.
+If an optional
+.Ar variable
+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
+will delete the given environment variable.
+If the environment variable is followed by an optional
+.Ar value ,
+.Nm
+will set the environment variable to this value.
+.Pp
+If the
+.Fl q
+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
+.Pp
+.Dl Ic env Ar filename
+.Pp
+in the kernel config file.
+The file can contain lines of the form
+.Pp
+.Dl name = "value" # this is a comment
+.Pp
+where whitespace around name and '=', and
+everything after a '#' character, are ignored. Almost any printable
+character except '=' is acceptable as part of a name. Quotes
+are optional and necessary only if the value contains
+whitespace.
+.Sh SEE ALSO
+.Xr kenv 2 ,
+.Xr config 5 ,
+.Xr loader.conf 5 ,
+.Xr loader 8
+.Sh HISTORY
+The
+.Nm
+utility appeared in
+.Fx 4.1.1 .
diff --git a/bin/kenv/kenv.c b/bin/kenv/kenv.c
new file mode 100644
index 0000000..dad8a91
--- /dev/null
+++ b/bin/kenv/kenv.c
@@ -0,0 +1,206 @@
+/*-
+ * Copyright (c) 2000 Peter Wemm <peter@freebsd.org>
+ *
+ * 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 AUTHORS 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 AUTHORS 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.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <err.h>
+#include <kenv.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+static void usage(void);
+static int kdumpenv(void);
+static int kgetenv(const char *);
+static int ksetenv(const char *, char *);
+static int kunsetenv(const 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 [-hNq]",
+ " kenv [-qv] variable[=value]",
+ " kenv [-q] -u variable");
+ exit(1);
+}
+
+int
+main(int argc, char **argv)
+{
+ char *env, *eq, *val;
+ int ch, error;
+
+ error = 0;
+ val = NULL;
+ env = NULL;
+ 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();
+ }
+ }
+ argc -= optind;
+ argv += optind;
+ if (argc > 0) {
+ env = argv[0];
+ eq = strchr(env, '=');
+ if (eq != NULL) {
+ *eq++ = '\0';
+ val = eq;
+ }
+ argv++;
+ argc--;
+ }
+ if ((hflag || Nflag) && env != NULL)
+ usage();
+ if (argc > 0 || ((uflag || vflag) && env == NULL))
+ usage();
+ if (env == NULL) {
+ error = kdumpenv();
+ if (error && !qflag)
+ warn("kdumpenv");
+ } else if (val == NULL) {
+ if (uflag) {
+ error = kunsetenv(env);
+ if (error && !qflag)
+ warnx("unable to unset %s", env);
+ } else {
+ error = kgetenv(env);
+ if (error && !qflag)
+ warnx("unable to get %s", env);
+ }
+ } else {
+ error = ksetenv(env, val);
+ if (error && !qflag)
+ warnx("unable to set %s to %s", env, val);
+ }
+ return (error);
+}
+
+static int
+kdumpenv(void)
+{
+ char *buf, *cp;
+ int buflen, envlen;
+
+ envlen = kenv(KENV_DUMP, NULL, NULL, 0);
+ if (envlen < 0)
+ return (-1);
+ for (;;) {
+ buflen = envlen * 120 / 100;
+ buf = malloc(buflen + 1);
+ if (buf == NULL)
+ return (-1);
+ memset(buf, 0, buflen + 1); /* Be defensive */
+ envlen = kenv(KENV_DUMP, NULL, buf, buflen);
+ if (envlen < 0) {
+ free(buf);
+ return (-1);
+ }
+ if (envlen > buflen)
+ free(buf);
+ else
+ break;
+ }
+
+ for (; *buf != '\0'; buf += strlen(buf) + 1) {
+ if (hflag) {
+ if (strncmp(buf, "hint.", 5) != 0)
+ continue;
+ }
+ cp = strchr(buf, '=');
+ if (cp == NULL)
+ continue;
+ *cp++ = '\0';
+ if (Nflag)
+ printf("%s\n", buf);
+ else
+ printf("%s=\"%s\"\n", buf, cp);
+ buf = cp;
+ }
+ return (0);
+}
+
+static int
+kgetenv(const char *env)
+{
+ char buf[1024];
+ int ret;
+
+ ret = kenv(KENV_GET, env, buf, sizeof(buf));
+ if (ret == -1)
+ return (ret);
+ if (vflag)
+ printf("%s=\"%s\"\n", env, buf);
+ else
+ printf("%s\n", buf);
+ return (0);
+}
+
+static int
+ksetenv(const char *env, char *val)
+{
+ int ret;
+
+ ret = kenv(KENV_SET, env, val, strlen(val)+1);
+ if (ret == 0)
+ printf("%s=\"%s\"\n", env, val);
+ return (ret);
+}
+
+static int
+kunsetenv(const char *env)
+{
+ int ret;
+
+ ret = kenv(KENV_UNSET, env, NULL, 0);
+ return (ret);
+}
OpenPOWER on IntegriCloud