Page MenuHomeFreeBSD

D43827.id134126.diff
No OneTemporary

D43827.id134126.diff

diff --git a/sbin/reboot/reboot.8 b/sbin/reboot/reboot.8
--- a/sbin/reboot/reboot.8
+++ b/sbin/reboot/reboot.8
@@ -37,15 +37,19 @@
.Sh SYNOPSIS
.Nm halt
.Op Fl DflNnpq
+.Op Fl e Ar variable=value
.Op Fl k Ar kernel
.Nm
.Op Fl cDdflNnpqr
+.Op Fl e Ar variable=value
.Op Fl k Ar kernel
.Nm fasthalt
.Op Fl DflNnpq
+.Op Fl e Ar variable=value
.Op Fl k Ar kernel
.Nm fastboot
.Op Fl dDflNnpq
+.Op Fl e Ar variable=value
.Op Fl k Ar kernel
.Sh DESCRIPTION
The
diff --git a/sbin/reboot/reboot.c b/sbin/reboot/reboot.c
--- a/sbin/reboot/reboot.c
+++ b/sbin/reboot/reboot.c
@@ -88,7 +88,7 @@
}
static void
-write_nextboot(const char *fn, const char *kernel, bool force)
+write_nextboot(const char *fn, const char *kernel, const char *env, bool force)
{
FILE *fp;
struct statfs sfs;
@@ -114,8 +114,9 @@
if (fp == NULL)
E("Can't create %s to boot %s", fn, kernel);
- if (fprintf(fp,"%skernel=\"%s\"\n",
+ if (fprintf(fp,"%s%skernel=\"%s\"\n",
supported ? "nextboot_enable=\"YES\"\n" : "",
+ env ? env : "",
kernel) < 0) {
int e;
@@ -129,6 +130,49 @@
fclose(fp);
}
+static char *
+quoted(char *str)
+{
+ char *src, *dst, *rv;
+ int len = 0, slen;
+
+ src = str;
+ slen = strlen(str);
+ if (slen == 0)
+ return (NULL);
+ while ((src = strchr(src, '"')) != NULL) {
+ len++;
+ src++;
+ }
+ if (len == 2 && str[0] == '"' && str[slen - 1] == '"')
+ /* quoted string, no extra quotes, just strdup */
+ return (strdup(str));
+ dst = rv = malloc(len + slen + 1);
+ if (rv == NULL)
+ errx(1, "Can't allocate memory for string");
+ *dst++ = '"';
+ for (src = str; *src; src++) {
+ if (*src == '"')
+ *dst++ = '\\';
+ *dst++ = *src++;
+ }
+ *dst++ = '"';
+ *dst++ = '\0';
+ return (rv);
+}
+
+
+static char *
+build_kv(char *raw)
+{
+ char *eq;
+
+ eq = strchr(raw, '=');
+ if (eq == NULL)
+ return (NULL);
+ *eq++ = '\0';
+ return (quoted(eq));
+}
int
main(int argc, char *argv[])
@@ -139,6 +183,8 @@
bool Dflag, fflag, lflag, Nflag, nflag, qflag;
uint64_t pageins;
const char *user, *kernel = NULL;
+ char *env = NULL, *oldenv, *v;
+
if (strstr(getprogname(), "halt") != NULL) {
dohalt = true;
@@ -146,7 +192,7 @@
} else
howto = 0;
Dflag = fflag = lflag = Nflag = nflag = qflag = false;
- while ((ch = getopt(argc, argv, "cDdk:lNnpqr")) != -1)
+ while ((ch = getopt(argc, argv, "cDdek:lNnpqr")) != -1)
switch(ch) {
case 'c':
howto |= RB_POWERCYCLE;
@@ -157,6 +203,17 @@
case 'd':
howto |= RB_DUMP;
break;
+ case 'e':
+ oldenv = env;
+ v = build_kv(optarg);
+ if (v == NULL)
+ errx(1, "Malformed env arg: '%s'", optarg);
+ asprintf(&env, "%s%s=%s\n", oldenv ? oldenv : "", optarg, v);
+ if (env == NULL)
+ errx(1, "No memory to build env array");
+ free(v);
+ free(oldenv);
+ break;
case 'f':
fflag = true;
break;
@@ -234,7 +291,7 @@
errx(1, "%s is not a file", k);
free(k);
}
- write_nextboot(PATH_NEXTBOOT, kernel, fflag);
+ write_nextboot(PATH_NEXTBOOT, env, kernel, fflag);
}
/* Log the reboot. */

File Metadata

Mime Type
text/plain
Expires
Wed, Apr 29, 5:07 AM (1 h, 5 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
32325127
Default Alt Text
D43827.id134126.diff (2 KB)

Event Timeline