From nobody Mon Feb 12 18:53:43 2024 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4TYYWq30PQz5BM4f; Mon, 12 Feb 2024 18:53:43 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4TYYWq1nzcz4mG7; Mon, 12 Feb 2024 18:53:43 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1707764023; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=0iI0NhWUtTByPPgG0VaSvmMDVMq1dFOh4B7d4YS7abY=; b=woG7qZYg4f7qkbQKeigFCOsyYFpA0dPjM1DhnAUKCelfL//LcoPUkC9sI9aPnOE6uj1LRy tV1K52tcpZmpzw+F7Qhj9Dw+EgtasVai7n66u8gS9lF868VnpHhKZTV+Ea1GM4hE+lTIkO JC+N2MwI3drt9xQf0ALJoWO7xeaPagh2YTT5CyrBI+4FWsLkJeujg/MRkwOpn/QLV38WLc 9KAaMfWi84SN2MkKmXsPjkRe8pm6OJJuhi+bSTJTaFmEwDQqikg7BPRVnn9wyP47XQNC5j P1EiZ98kDazc6yuDwqOTc6MXHiDVHH8Hyv/qJVuu3KPwjgHt4x3/NQfuXvDkuw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1707764023; a=rsa-sha256; cv=none; b=UtjAnrnK3a9L0+eSgyi6dIEILDRoArkiFnu1iIQSGkVxT9NBv9L10WYJyaysMVhywBq9BK Qm2Ko5aR/2HkQtWVI3rAslp7oskYqi/nADQyGuLQQfd1RwedREm/f9+IATb+V8R/2M960q dHdWB6/tDupGvAv9vdb1pzIQdU2qlt4XI0yYS1OWsuvT4PLEmPztXANb2hNJR8zhfCXcNx IXCkwpxKd78soSLIKKuyKR2KQ7S+hSf2sJNaK6w/maQsHenVl9VzQhYAnUCrsZaKEYpj/O vAKMoHPCYhw1ADSYEywM7xLMeUqjxAktnnFkwPW5QAsMhqusAgkmheH4XNUcpA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1707764023; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=0iI0NhWUtTByPPgG0VaSvmMDVMq1dFOh4B7d4YS7abY=; b=BVY5+gQNmUnSAInjL+0n9pZjBI1FfWfkJ0MNj5rB0PpYG3LKmZvEHE/TH28T7TBJ9w7HRn AYgIgIo/lDpCNJpBhdRQae7mWftxycg68kapO6aEwLqnNNzpAVHFI02ZMzQxzrSyQcW6KS 7igYPhJW5sJ4fUD80LmOS1Ys4QJ0LPsI9HjSLkQ3CVfA6ILAi1ENcH9ljd3rJwR9pQnzDs SOXj6wRfezdtEsSer0L29gFs97nogkcNdH4THCfAhypKFADJWbcR4a78wpsbBEj8gQDQty J36XDwgV+LjP6keJBK1bF8D+txIa2/M46zulJfOqpm0LtTsl6HPRale/GI4PiA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4TYYWq0vLhzjcJ; Mon, 12 Feb 2024 18:53:43 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 41CIrhV5030649; Mon, 12 Feb 2024 18:53:43 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 41CIrhvE030646; Mon, 12 Feb 2024 18:53:43 GMT (envelope-from git) Date: Mon, 12 Feb 2024 18:53:43 GMT Message-Id: <202402121853.41CIrhvE030646@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Warner Losh Subject: git: ecc834241fc3 - main - reboot: Implement -e from nextboot List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: ecc834241fc3ab23990291e7e99fd05a34af05f1 Auto-Submitted: auto-generated The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=ecc834241fc3ab23990291e7e99fd05a34af05f1 commit ecc834241fc3ab23990291e7e99fd05a34af05f1 Author: Warner Losh AuthorDate: 2024-02-12 18:45:48 +0000 Commit: Warner Losh CommitDate: 2024-02-12 18:45:48 +0000 reboot: Implement -e from nextboot Implement -e foo=bar to add loader environment variables to nextboot.conf. bar is enclosed in quotes if it isn't already. Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D43827 --- sbin/reboot/reboot.8 | 19 +++++++++++++++++++ sbin/reboot/reboot.c | 49 +++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/sbin/reboot/reboot.8 b/sbin/reboot/reboot.8 index e53de69e97ae..a60512fa0c59 100644 --- 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 @@ -87,6 +91,21 @@ This option is supported only when rebooting, and it has no effect unless a dump device has previously been specified with .Xr dumpon 8 . +.It Fl e Ar variable=value +Sets +.Va variable +to +.Va value +in the loader's and kernel's environment. +If +.Va value +is not already enclosed in double quotes, they will be added before writing to the +.Nm nextboot +configuration. +Care should be taken if +.Va value +contains any characters that are special to the shell or loader's configuration +parsing code. .It Fl k Ar kname Boot the specified kernel .Ar kname diff --git a/sbin/reboot/reboot.c b/sbin/reboot/reboot.c index d598c857d255..875f00c01ef9 100644 --- a/sbin/reboot/reboot.c +++ b/sbin/reboot/reboot.c @@ -88,7 +88,7 @@ zfsbootcfg(const char *pool, bool force) } static void -write_nextboot(const char *fn, const char *kernel, bool force) +write_nextboot(const char *fn, const char *env, const char *kernel, bool force) { FILE *fp; struct statfs sfs; @@ -114,8 +114,9 @@ write_nextboot(const char *fn, const char *kernel, bool force) 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 != NULL ? env : "", kernel) < 0) { int e; @@ -129,6 +130,40 @@ write_nextboot(const char *fn, const char *kernel, bool force) fclose(fp); } +static char * +split_kv(char *raw) +{ + char *eq; + int len; + + eq = strchr(raw, '='); + if (eq == NULL) + errx(1, "No = in environment string %s", raw); + *eq++ = '\0'; + len = strlen(eq); + if (len == 0) + errx(1, "Invalid null value %s=", raw); + if (eq[0] == '"') { + if (len < 2 || eq[len - 1] != '"') + errx(1, "Invalid string '%s'", eq); + eq[len - 1] = '\0'; + return (eq + 1); + } + return (eq); +} + +static void +add_env(char **env, const char *key, const char *value) +{ + char *oldenv; + + oldenv = *env; + asprintf(env, "%s%s=\"%s\"\n", oldenv != NULL ? oldenv : "", key, value); + if (env == NULL) + errx(1, "No memory to build env array"); + free(oldenv); +} + int main(int argc, char *argv[]) { @@ -138,6 +173,8 @@ main(int argc, char *argv[]) bool Dflag, fflag, lflag, Nflag, nflag, qflag; uint64_t pageins; const char *user, *kernel = NULL; + char *env = NULL, *v; + if (strstr(getprogname(), "halt") != NULL) { dohalt = true; @@ -145,7 +182,7 @@ main(int argc, char *argv[]) } else howto = 0; Dflag = fflag = lflag = Nflag = nflag = qflag = false; - while ((ch = getopt(argc, argv, "cDdk:lNnpqr")) != -1) + while ((ch = getopt(argc, argv, "cDde:k:lNnpqr")) != -1) switch(ch) { case 'c': howto |= RB_POWERCYCLE; @@ -156,6 +193,10 @@ main(int argc, char *argv[]) case 'd': howto |= RB_DUMP; break; + case 'e': + v = split_kv(optarg); + add_env(&env, optarg, v); + break; case 'f': fflag = true; break; @@ -233,7 +274,7 @@ main(int argc, char *argv[]) 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. */