summaryrefslogtreecommitdiffstats
path: root/sbin/shutdown/shutdown.c
diff options
context:
space:
mode:
authorru <ru@FreeBSD.org>1999-06-21 16:06:21 +0000
committerru <ru@FreeBSD.org>1999-06-21 16:06:21 +0000
commiteba023799a120e4af79f68b707dd19fe36f7dee3 (patch)
treea049006b488cb1460e02471f854eb635c4c682b6 /sbin/shutdown/shutdown.c
parent7cd92321bdeead71e46ed6abfcf4036b05e4d013 (diff)
downloadFreeBSD-src-eba023799a120e4af79f68b707dd19fe36f7dee3.zip
FreeBSD-src-eba023799a120e4af79f68b707dd19fe36f7dee3.tar.gz
Signal init(8) instead of executing halt(8) or reboot(8)
when halting or rebooting the system. It benefits from running /etc/rc.shutdown by init(8). ``-o'' flag is provided for backward compatibility. PR: 5451 Discussed with: des
Diffstat (limited to 'sbin/shutdown/shutdown.c')
-rw-r--r--sbin/shutdown/shutdown.c86
1 files changed, 52 insertions, 34 deletions
diff --git a/sbin/shutdown/shutdown.c b/sbin/shutdown/shutdown.c
index 8f9e7c8..e81711a 100644
--- a/sbin/shutdown/shutdown.c
+++ b/sbin/shutdown/shutdown.c
@@ -42,7 +42,7 @@ static const char copyright[] =
static char sccsid[] = "@(#)shutdown.c 8.4 (Berkeley) 4/28/95";
#endif
static const char rcsid[] =
- "$Id: shutdown.c,v 1.17 1999/06/18 14:26:07 ru Exp $";
+ "$Id: shutdown.c,v 1.18 1999/06/21 06:21:05 jkoshy Exp $";
#endif /* not lint */
#include <sys/param.h>
@@ -93,7 +93,7 @@ struct interval {
#undef S
static time_t offset, shuttime;
-static int dohalt, dopower, doreboot, killflg, mbuflen;
+static int dohalt, dopower, doreboot, killflg, mbuflen, oflag;
static char *nosync, *whom, mbuf[BUFSIZ];
void badtime __P((void));
@@ -104,7 +104,7 @@ void loop __P((void));
void nolog __P((void));
void timeout __P((int));
void timewarn __P((int));
-void usage __P((void));
+void usage __P((const char *));
int
main(argc, argv)
@@ -121,7 +121,7 @@ main(argc, argv)
#endif
nosync = NULL;
readstdin = 0;
- while ((ch = getopt(argc, argv, "-hknpr")) != -1)
+ while ((ch = getopt(argc, argv, "-hknopr")) != -1)
switch (ch) {
case '-':
readstdin = 1;
@@ -135,6 +135,9 @@ main(argc, argv)
case 'n':
nosync = "-n";
break;
+ case 'o':
+ oflag = 1;
+ break;
case 'p':
dopower = 1;
break;
@@ -143,21 +146,22 @@ main(argc, argv)
break;
case '?':
default:
- usage();
+ usage((char *)NULL);
}
argc -= optind;
argv += optind;
if (argc < 1)
- usage();
+ usage((char *)NULL);
- if (killflg + doreboot + dohalt + dopower > 1) {
- warnx("incompatible switches -h, -k, -p and -r");
- usage();
- }
+ if (killflg + doreboot + dohalt + dopower > 1)
+ usage("incompatible switches -h, -k, -p and -r");
- if (killflg && nosync)
- warnx("option -n ignored with -k");
+ if (oflag && !(dohalt || dopower || doreboot))
+ usage("-o requires -h, -p or -r");
+
+ if (nosync != NULL && !oflag)
+ usage("-n requires -o");
getoffset(*argv++);
@@ -349,29 +353,39 @@ die_you_gravy_sucking_pig_dog()
(void)printf("halt");
else if (dopower)
(void)printf("power-down");
- if (nosync)
+ if (nosync != NULL)
(void)printf(" no sync");
(void)printf("\nkill -HUP 1\n");
#else
- if (doreboot) {
- execle(_PATH_REBOOT, "reboot", "-l", nosync,
- (char *)NULL, empty_environ);
- syslog(LOG_ERR, "shutdown: can't exec %s: %m.", _PATH_REBOOT);
- warn(_PATH_REBOOT);
- }
- else if (dohalt) {
- execle(_PATH_HALT, "halt", "-l", nosync,
- (char *)NULL, empty_environ);
- syslog(LOG_ERR, "shutdown: can't exec %s: %m.", _PATH_HALT);
- warn(_PATH_HALT);
- }
- 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);
+ if (!oflag) {
+ (void)kill(1, doreboot ? SIGINT : /* reboot */
+ dohalt ? SIGUSR1 : /* halt */
+ dopower ? SIGUSR2 : /* power-down */
+ SIGTERM); /* single-user */
+ } else {
+ if (doreboot) {
+ execle(_PATH_REBOOT, "reboot", "-l", nosync,
+ (char *)NULL, empty_environ);
+ syslog(LOG_ERR, "shutdown: can't exec %s: %m.",
+ _PATH_REBOOT);
+ warn(_PATH_REBOOT);
+ }
+ else if (dohalt) {
+ execle(_PATH_HALT, "halt", "-l", nosync,
+ (char *)NULL, empty_environ);
+ syslog(LOG_ERR, "shutdown: can't exec %s: %m.",
+ _PATH_HALT);
+ warn(_PATH_HALT);
+ }
+ 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);
+ }
+ (void)kill(1, SIGTERM); /* to single-user */
}
- (void)kill(1, SIGTERM); /* to single user */
#endif
finish(0);
}
@@ -499,9 +513,13 @@ badtime()
}
void
-usage()
+usage(cp)
+ const char *cp;
{
- fprintf(stderr,
- "usage: shutdown [-] [-hknpr] time [warning-message ...]\n");
+ if (cp != NULL)
+ warnx("%s", cp);
+ (void)fprintf(stderr,
+ "usage: shutdown [-] [-h | -p | -r | -k] [-o [-n]]"
+ " time [warning-message ...]\n");
exit(1);
}
OpenPOWER on IntegriCloud