diff options
Diffstat (limited to 'sbin')
-rw-r--r-- | sbin/reboot/reboot.8 | 14 | ||||
-rw-r--r-- | sbin/reboot/reboot.c | 25 |
2 files changed, 34 insertions, 5 deletions
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 <signal.h> #include <err.h> #include <errno.h> +#include <fcntl.h> #include <libutil.h> #include <pwd.h> #include <syslog.h> @@ -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); } |