Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Oct 2017 15:30:30 +0000 (UTC)
From:      Warner Losh <imp@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r324985 - head/sbin/shutdown
Message-ID:  <201710251530.v9PFUUeU018324@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: imp
Date: Wed Oct 25 15:30:30 2017
New Revision: 324985
URL: https://svnweb.freebsd.org/changeset/base/324985

Log:
  Add power cycle support (-c) to shutdown.
  
  Sponsored by: Netflix

Modified:
  head/sbin/shutdown/shutdown.8
  head/sbin/shutdown/shutdown.c

Modified: head/sbin/shutdown/shutdown.8
==============================================================================
--- head/sbin/shutdown/shutdown.8	Wed Oct 25 15:30:25 2017	(r324984)
+++ head/sbin/shutdown/shutdown.8	Wed Oct 25 15:30:30 2017	(r324985)
@@ -28,7 +28,7 @@
 .\"     @(#)shutdown.8	8.2 (Berkeley) 4/27/95
 .\" $FreeBSD$
 .\"
-.Dd September 21, 2016
+.Dd October 23, 2017
 .Dt SHUTDOWN 8
 .Os
 .Sh NAME
@@ -39,7 +39,7 @@
 .Nm
 .Op Fl
 .Oo
-.Fl h | Fl p |
+.Fl c | Fl h | Fl p |
 .Fl r | Fl k
 .Oc
 .Oo
@@ -59,12 +59,22 @@ would otherwise not bother with such niceties.
 .Pp
 The following options are available:
 .Bl -tag -width indent
+.It Fl c
+The system is power cycled (power turned off and then back on)
+at the specified time.
+If the hardware doesn't support power cycle, the system will be
+halted.
+At the present time, only systems with BMC supported by the
+.Xr ipmi 4
+driver that implement this functionality support this flag.
+The amount of time the system is off is dependent on the device
+that implements this feature.
 .It Fl h
 The system is halted at the specified
 .Ar time .
 .It Fl p
 The system is halted and the power is turned off
-(hardware support required)
+(hardware support required, otherwise the system is halted)
 at the specified
 .Ar time .
 .It Fl r
@@ -79,6 +89,7 @@ does not actually halt the system, but leaves the
 system multi-user with logins disabled (for all but super-user).
 .It Fl o
 If one of the
+.Fl c ,
 .Fl h ,
 .Fl p
 or

Modified: head/sbin/shutdown/shutdown.c
==============================================================================
--- head/sbin/shutdown/shutdown.c	Wed Oct 25 15:30:25 2017	(r324984)
+++ head/sbin/shutdown/shutdown.c	Wed Oct 25 15:30:30 2017	(r324985)
@@ -89,7 +89,7 @@ static struct interval {
 #undef S
 
 static time_t offset, shuttime;
-static int dohalt, dopower, doreboot, killflg, mbuflen, oflag;
+static int docycle, dohalt, dopower, doreboot, killflg, mbuflen, oflag;
 static char mbuf[BUFSIZ];
 static const char *nosync, *whom;
 
@@ -141,11 +141,14 @@ main(int argc, char **argv)
 		goto poweroff;
 	}
 
-	while ((ch = getopt(argc, argv, "-hknopr")) != -1)
+	while ((ch = getopt(argc, argv, "-chknopr")) != -1)
 		switch (ch) {
 		case '-':
 			readstdin = 1;
 			break;
+		case 'c':
+			docycle = 1;
+			break;
 		case 'h':
 			dohalt = 1;
 			break;
@@ -174,11 +177,11 @@ main(int argc, char **argv)
 	if (argc < 1)
 		usage((char *)NULL);
 
-	if (killflg + doreboot + dohalt + dopower > 1)
-		usage("incompatible switches -h, -k, -p and -r");
+	if (killflg + doreboot + dohalt + dopower + docycle > 1)
+		usage("incompatible switches -c, -h, -k, -p and -r");
 
-	if (oflag && !(dohalt || dopower || doreboot))
-		usage("-o requires -h, -p or -r");
+	if (oflag && !(dohalt || dopower || doreboot || docycle))
+		usage("-o requires -c, -h, -p or -r");
 
 	if (nosync != NULL && !oflag)
 		usage("-n requires -o");
@@ -356,8 +359,8 @@ die_you_gravy_sucking_pig_dog(void)
 	char *empty_environ[] = { NULL };
 
 	syslog(LOG_NOTICE, "%s by %s: %s",
-	    doreboot ? "reboot" : dohalt ? "halt" : dopower ? "power-down" : 
-	    "shutdown", whom, mbuf);
+	    doreboot ? "reboot" : dohalt ? "halt" : dopower ? "power-down" :
+	    docycle ? "power-cycle" : "shutdown", whom, mbuf);
 
 	(void)printf("\r\nSystem shutdown time has arrived\007\007\r\n");
 	if (killflg) {
@@ -367,6 +370,8 @@ die_you_gravy_sucking_pig_dog(void)
 #ifdef DEBUG
 	if (doreboot)
 		(void)printf("reboot");
+	else if (docycle)
+		(void)printf("power-cycle");
 	else if (dohalt)
 		(void)printf("halt");
 	else if (dopower)
@@ -379,6 +384,7 @@ die_you_gravy_sucking_pig_dog(void)
 		(void)kill(1, doreboot ? SIGINT :	/* reboot */
 			      dohalt ? SIGUSR1 :	/* halt */
 			      dopower ? SIGUSR2 :	/* power-down */
+			      docycle ? SIGWINCH :	/* power-cycle */
 			      SIGTERM);			/* single-user */
 	} else {
 		if (doreboot) {
@@ -397,6 +403,13 @@ die_you_gravy_sucking_pig_dog(void)
 		}
 		else if (dopower) {
 			execle(_PATH_HALT, "halt", "-l", "-p", nosync,
+				(char *)NULL, empty_environ);
+			syslog(LOG_ERR, "shutdown: can't exec %s: %m.",
+				_PATH_HALT);
+			warn(_PATH_HALT);
+		}
+		else if (docycle) {
+			execle(_PATH_HALT, "halt", "-l", "-c", nosync,
 				(char *)NULL, empty_environ);
 			syslog(LOG_ERR, "shutdown: can't exec %s: %m.",
 				_PATH_HALT);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201710251530.v9PFUUeU018324>