Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 08 Dec 2025 10:31:12 +0000
From:      Dag-Erling=?utf-8?Q? Sm=C3=B8rg?=rav <des@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: de670c611b17 - main - nextboot: Reimplement missing -a option
Message-ID:  <6936a8f0.36f77.3976cdf6@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help

The branch main has been updated by des:

URL: https://cgit.FreeBSD.org/src/commit/?id=de670c611b17939712a81dc56f73a3ff84f6c178

commit de670c611b17939712a81dc56f73a3ff84f6c178
Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2025-12-08 10:30:17 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2025-12-08 10:30:17 +0000

    nextboot: Reimplement missing -a option
    
    * Reimplement the -a option which was available in the original shell
      script and is still documented.
    
    * Print the correct usage string when invoked as nextboot.
    
    * Add the -D option to the manual page synopsis.
    
    MFC after:      1 week
    Fixes:          fd6d47375a78 ("rescue,nextboot: Install nextboot as a link to reboot, rm nextboot.sh")
    Reviewed by:    imp
    Differential Revision:  https://reviews.freebsd.org/D54120
---
 sbin/reboot/nextboot.8 |  4 ++--
 sbin/reboot/reboot.c   | 44 ++++++++++++++++++++++++++++++++++----------
 2 files changed, 36 insertions(+), 12 deletions(-)

diff --git a/sbin/reboot/nextboot.8 b/sbin/reboot/nextboot.8
index 188063dbfd3b..52f77bb75ebd 100644
--- a/sbin/reboot/nextboot.8
+++ b/sbin/reboot/nextboot.8
@@ -22,7 +22,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd March 29, 2022
+.Dd December 8, 2025
 .Dt NEXTBOOT 8
 .Os
 .Sh NAME
@@ -30,7 +30,7 @@
 .Nd "specify an alternate kernel and boot flags for the next reboot"
 .Sh SYNOPSIS
 .Nm
-.Op Fl af
+.Op Fl aDf
 .Op Fl e Ar variable=value
 .Op Fl k Ar kernel
 .Op Fl o Ar options
diff --git a/sbin/reboot/reboot.c b/sbin/reboot/reboot.c
index f6065e80fb66..59ae83ef6f6a 100644
--- a/sbin/reboot/reboot.c
+++ b/sbin/reboot/reboot.c
@@ -112,12 +112,13 @@ zfsbootcfg(const char *pool, bool force)
 }
 
 static void
-write_nextboot(const char *fn, const char *env, bool force)
+write_nextboot(const char *fn, const char *env, bool append, bool force)
 {
 	char tmp[PATH_MAX];
 	FILE *fp;
 	struct statfs sfs;
-	int tmpfd;
+	ssize_t ret;
+	int fd, tmpfd;
 	bool supported = false;
 	bool zfs = false;
 
@@ -145,6 +146,7 @@ write_nextboot(const char *fn, const char *env, bool force)
 		E("Path too long %s", fn);
 	if (strlcat(tmp, ".XXXXXX", sizeof(tmp)) >= sizeof(tmp))
 		E("Path too long %s", fn);
+
 	tmpfd = mkstemp(tmp);
 	if (tmpfd == -1)
 		E("mkstemp %s", tmp);
@@ -153,6 +155,21 @@ write_nextboot(const char *fn, const char *env, bool force)
 	if (fp == NULL)
 		E("fdopen %s", tmp);
 
+	if (append) {
+		if ((fd = open(fn, O_RDONLY)) < 0) {
+			if (errno != ENOENT)
+				E("open %s", fn);
+		} else {
+			do {
+				ret = copy_file_range(fd, NULL, tmpfd, NULL,
+				    SSIZE_MAX, 0);
+				if (ret < 0)
+					E("copy %s to %s", fn, tmp);
+			} while (ret > 0);
+			close(fd);
+		}
+	}
+
 	if (fprintf(fp, "%s%s",
 	    supported ? "nextboot_enable=\"YES\"\n" : "",
 	    env != NULL ? env : "") < 0) {
@@ -216,7 +233,7 @@ add_env(char **env, const char *key, const char *value)
  * Different options are valid for different programs.
  */
 #define GETOPT_REBOOT "cDde:fk:lNno:pqr"
-#define GETOPT_NEXTBOOT "De:fk:o:"
+#define GETOPT_NEXTBOOT "aDe:fk:o:"
 
 int
 main(int argc, char *argv[])
@@ -225,7 +242,7 @@ main(int argc, char *argv[])
 	const struct passwd *pw;
 	struct stat st;
 	int ch, howto = 0, i, sverrno;
-	bool Dflag, fflag, lflag, Nflag, nflag, qflag;
+	bool aflag, Dflag, fflag, lflag, Nflag, nflag, qflag;
 	uint64_t pageins;
 	const char *user, *kernel = NULL, *getopts = GETOPT_REBOOT;
 	char *env = NULL, *v;
@@ -240,9 +257,12 @@ main(int argc, char *argv[])
 		/* reboot */
 		howto = 0;
 	}
-	Dflag = fflag = lflag = Nflag = nflag = qflag = false;
+	aflag = Dflag = fflag = lflag = Nflag = nflag = qflag = false;
 	while ((ch = getopt(argc, argv, getopts)) != -1) {
 		switch(ch) {
+		case 'a':
+			aflag = true;
+			break;
 		case 'c':
 			howto |= RB_POWERCYCLE;
 			break;
@@ -363,7 +383,7 @@ main(int argc, char *argv[])
 	}
 
 	if (env != NULL)
-		write_nextboot(PATH_NEXTBOOT, env, fflag);
+		write_nextboot(PATH_NEXTBOOT, env, aflag, fflag);
 	if (donextboot)
 		exit (0);
 
@@ -483,10 +503,14 @@ restart:
 static void
 usage(void)
 {
-
-	(void)fprintf(stderr, dohalt ?
-	    "usage: halt [-clNnpq] [-k kernel]\n" :
-	    "usage: reboot [-cdlNnpqr] [-k kernel]\n");
+	if (donextboot) {
+		fprintf(stderr, "usage: nextboot [-aDf] "
+		    "[-e name=value] [-k kernel] [-o options]\n");
+	} else {
+		fprintf(stderr, dohalt ?
+		    "usage: halt [-clNnpq] [-k kernel]\n" :
+		    "usage: reboot [-cdlNnpqr] [-k kernel]\n");
+	}
 	exit(1);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6936a8f0.36f77.3976cdf6>