aboutsummaryrefslogtreecommitdiff
path: root/bin/kenv
diff options
context:
space:
mode:
Diffstat (limited to 'bin/kenv')
-rw-r--r--bin/kenv/Makefile4
-rw-r--r--bin/kenv/Makefile.depend15
-rw-r--r--bin/kenv/kenv.1168
-rw-r--r--bin/kenv/kenv.c223
4 files changed, 410 insertions, 0 deletions
diff --git a/bin/kenv/Makefile b/bin/kenv/Makefile
new file mode 100644
index 000000000000..b5bc75c61e77
--- /dev/null
+++ b/bin/kenv/Makefile
@@ -0,0 +1,4 @@
+PACKAGE=runtime
+PROG= kenv
+
+.include <bsd.prog.mk>
diff --git a/bin/kenv/Makefile.depend b/bin/kenv/Makefile.depend
new file mode 100644
index 000000000000..6ef78fac5cbf
--- /dev/null
+++ b/bin/kenv/Makefile.depend
@@ -0,0 +1,15 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+ 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 000000000000..9b6d0e0b33f2
--- /dev/null
+++ b/bin/kenv/kenv.1
@@ -0,0 +1,168 @@
+.\"-
+.\" 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.
+.\"
+.Dd June 20, 2021
+.Dt KENV 1
+.Os
+.Sh NAME
+.Nm kenv
+.Nd list or modify the kernel environment
+.Sh SYNOPSIS
+.Nm
+.Op Fl l | s
+.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 list all variables in the kernel environment if
+invoked without arguments.
+.Pp
+If the
+.Fl l
+option is specified, then the static environment provided by
+.Xr loader 8
+will be listed instead.
+Similarly, the
+.Fl s
+option will list the static environment defined by the kernel config.
+Both of the
+.Fl l
+and
+.Fl s
+options are dependent on the kernel being configured to preserve early kernel
+environments.
+The default kernel configuration does not preserve these environments.
+.Pp
+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
+.Sq name
+and
+.Sq = ,
+and everything after a
+.Sq #
+character, are ignored.
+Almost any printable character except
+.Sq =
+is acceptable as part of a name.
+Quotes are optional and necessary only if the value contains whitespace.
+.Sh EXAMPLES
+Show kernel probe hints variable names and filter for the uart
+device
+.Bd -literal -offset indent
+$ kenv -h -N | grep uart
+hint.uart.0.at
+hint.uart.0.flags
+hint.uart.0.irq
+hint.uart.0.port
+hint.uart.1.at
+hint.uart.1.irq
+hint.uart.1.port
+.Ed
+.Pp
+Show the value of a specific variable:
+.Bd -literal -offset indent
+$ kenv hint.uart.1.at
+isa
+.Ed
+.Pp
+Same as above but adding the name of the variable in the report:
+.Bd -literal -offset indent
+$ kenv -v hint.uart.1.at
+hint.uart.1.at="isa"
+.Ed
+.Pp
+Try to delete a variable and suppress warnings if any:
+.Bd -literal -offset indent
+$ kenv -q -u hint.uart.1.at
+.Ed
+.Pp
+Set the value of the
+.Ev verbose_loading
+variable
+.Bd -literal -offset indent
+$ kenv verbose_loading="YES"
+verbose_loading="YES"
+.Ed
+.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 000000000000..fe7ec4236bfb
--- /dev/null
+++ b/bin/kenv/kenv.c
@@ -0,0 +1,223 @@
+/*-
+ * 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/types.h>
+#include <sys/sysctl.h>
+#include <err.h>
+#include <errno.h>
+#include <kenv.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+static void usage(void);
+static int kdumpenv(int dump_type);
+static int kgetenv(const char *);
+static int ksetenv(const char *, char *);
+static int kunsetenv(const char *);
+
+static int hflag = 0;
+static int lflag = 0;
+static int Nflag = 0;
+static int qflag = 0;
+static int sflag = 0;
+static int uflag = 0;
+static int vflag = 0;
+
+static void
+usage(void)
+{
+ (void)fprintf(stderr, "%s\n%s\n%s\n",
+ "usage: kenv [-l|-s] [-hNq]",
+ " kenv [-qv] variable[=value]",
+ " kenv [-q] -u variable");
+ exit(1);
+}
+
+int
+main(int argc, char **argv)
+{
+ char *env, *eq, *val;
+ int ch, error;
+
+ val = NULL;
+ env = NULL;
+ while ((ch = getopt(argc, argv, "hlNqsuv")) != -1) {
+ switch (ch) {
+ case 'h':
+ hflag++;
+ break;
+ case 'l':
+ lflag++;
+ break;
+ case 'N':
+ Nflag++;
+ break;
+ case 'q':
+ qflag++;
+ break;
+ case 's':
+ sflag++;
+ 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 (lflag && sflag)
+ usage();
+ if (argc > 0 || ((uflag || vflag) && env == NULL))
+ usage();
+ if (env == NULL) {
+ if (lflag)
+ error = kdumpenv(KENV_DUMP_LOADER);
+ else if (sflag)
+ error = kdumpenv(KENV_DUMP_STATIC);
+ else
+ error = kdumpenv(KENV_DUMP);
+ if (error && !qflag) {
+ if (errno == ENOENT)
+ warnx("requested environment is unavailable");
+ else
+ 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(int dump_type)
+{
+ char *buf, *bp, *cp;
+ int buflen, envlen;
+
+ envlen = kenv(dump_type, NULL, NULL, 0);
+ if (envlen < 0)
+ return (-1);
+ for (;;) {
+ buflen = envlen * 120 / 100;
+ buf = calloc(1, buflen + 1);
+ if (buf == NULL)
+ return (-1);
+ envlen = kenv(dump_type, NULL, buf, buflen);
+ if (envlen < 0) {
+ free(buf);
+ return (-1);
+ }
+ if (envlen > buflen)
+ free(buf);
+ else
+ break;
+ }
+
+ for (bp = buf; *bp != '\0'; bp += strlen(bp) + 1) {
+ if (hflag) {
+ if (strncmp(bp, "hint.", 5) != 0)
+ continue;
+ }
+ cp = strchr(bp, '=');
+ if (cp == NULL)
+ continue;
+ *cp++ = '\0';
+ if (Nflag)
+ printf("%s\n", bp);
+ else
+ printf("%s=\"%s\"\n", bp, cp);
+ bp = cp;
+ }
+
+ free(buf);
+ 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);
+}