From 9bf40bea60a51889f77b8f5c8128b2bebe1a3284 Mon Sep 17 00:00:00 2001 From: wes Date: Fri, 26 Apr 2002 07:31:04 +0000 Subject: Add a -k option to reboot to specify the kernel to boot next time around. If the kernel boots successfully, the record of this kernel is erased, it is intended to be a one-shot option for testing kernels. This could be improved by having the loader remove the record of the next kernel to boot, it is currently removed in /etc/rc immediately after disks are mounted r/w. I'd like to MFC this before the 4.6 freeze unless there is violent objection. Reviewed by: Several on IRC MFC after: 4 days --- sbin/reboot/reboot.8 | 14 ++++++++++++++ sbin/reboot/reboot.c | 25 ++++++++++++++++++++----- 2 files changed, 34 insertions(+), 5 deletions(-) (limited to 'sbin/reboot') diff --git a/sbin/reboot/reboot.8 b/sbin/reboot/reboot.8 index a16eef1..bf914b1 100644 --- a/sbin/reboot/reboot.8 +++ b/sbin/reboot/reboot.8 @@ -44,12 +44,16 @@ .Sh SYNOPSIS .Nm halt .Op Fl lnqp +.Op Fl k Ar kernel .Nm .Op Fl dlnqp +.Op Fl k Ar kernel .Nm fasthalt .Op Fl lnqp +.Op Fl k Ar kernel .Nm fastboot .Op Fl dlnqp +.Op Fl k Ar kernel .Sh DESCRIPTION The .Nm halt @@ -72,6 +76,16 @@ The system is requested to create a crash dump. 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 k Ar kernel +Boot the specified +.Ar kernel +on the next system boot. If the kernel boots successfully, the +.Em default +kernel will be booted on succesive boots, this is a one-shot option. +If the boot fails, the system will continue attempting to boot +.Ar kernel +until the boot process is interrupted and a valid kernel booted. +This may change in the future. .It Fl l The halt or reboot is .Em not diff --git a/sbin/reboot/reboot.c b/sbin/reboot/reboot.c index 61f971d..be8911f 100644 --- a/sbin/reboot/reboot.c +++ b/sbin/reboot/reboot.c @@ -51,6 +51,7 @@ static const char rcsid[] = #include #include #include +#include #include #include #include @@ -68,9 +69,9 @@ int main(int argc, char *argv[]) { struct passwd *pw; - int ch, howto, i, lflag, nflag, qflag, pflag, sverrno; + int ch, howto, i, fd, kflag, lflag, nflag, qflag, pflag, sverrno; u_int pageins; - char *p; + char *kernel, *p; const char *user; if (strstr((p = rindex(*argv, '/')) ? p + 1 : *argv, "halt")) { @@ -78,12 +79,16 @@ main(int argc, char *argv[]) howto = RB_HALT; } else howto = 0; - lflag = nflag = qflag = 0; - while ((ch = getopt(argc, argv, "dlnpq")) != -1) + kflag = lflag = nflag = qflag = 0; + while ((ch = getopt(argc, argv, "dk:lnpq")) != -1) switch(ch) { case 'd': howto |= RB_DUMP; break; + case 'k': + kflag = 1; + kernel = optarg; + break; case 'l': lflag = 1; break; @@ -117,6 +122,16 @@ main(int argc, char *argv[]) err(1, NULL); } + if (kflag) { + fd = open("/boot/nextkernel", O_WRONLY | O_CREAT, 0444); + if (fd > -1) { + (void)write(fd, "kernel=\"", 8L); + (void)write(fd, kernel, strlen(kernel)); + (void)write(fd, "\"\n", 2); + close(fd); + } + } + /* Log the reboot. */ if (!lflag) { if ((user = getlogin()) == NULL) @@ -195,7 +210,7 @@ restart: void usage() { - (void)fprintf(stderr, "usage: %s [-dnpq]\n", + (void)fprintf(stderr, "usage: %s [-dnpq] [-k kernel]\n", dohalt ? "halt" : "reboot"); exit(1); } -- cgit v1.1