diff options
Diffstat (limited to 'sbin/shutdown/shutdown.c')
-rw-r--r-- | sbin/shutdown/shutdown.c | 86 |
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); } |