shutdown: add a -q(uiet) flag to suppress warning messages

The system-wide warning makes sense in multi-user environments, but
shutdown(8) may be used on systems or in scenarios where there's nobody
to warn and wall(1) just introduces unnecessary complexity and overhead
to the shutdown process.

Add an option to suppress the warning entirely for those contexts that
want to do so, which are anticipated to mainly be in appliance or
single-user desktop-style systems.

Reviewed by:	des
Reviewed by:	allanjude, imp (earlier version)
Sponsored by:	Klara, Inc.
Differential Revision:	https://reviews.freebsd.org/D46216
This commit is contained in:
Kyle Evans 2024-08-09 11:01:11 -05:00
parent 6ee6c7b146
commit 6c7ec630c2
2 changed files with 24 additions and 8 deletions

View File

@ -25,7 +25,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.Dd November 7, 2022
.Dd August 4, 2024
.Dt SHUTDOWN 8
.Os
.Sh NAME
@ -43,6 +43,7 @@
.Fl o
.Op Fl n
.Oc
.Op Fl q
.Ar time
.Op Ar warning-message ...
.Nm poweroff
@ -113,6 +114,12 @@ to
or
.Xr reboot 8 .
This option should probably not be used.
.It Fl q
Shut down quietly.
Suppress the warning message to all logged in users about system shutdown.
It is an error to supply a
.Ar warning-message
when warnings are suppressed.
.It Ar time
.Ar Time
is the time at which

View File

@ -43,6 +43,7 @@
#include <pwd.h>
#include <setjmp.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -86,7 +87,7 @@ static void badtime(void);
static void die_you_gravy_sucking_pig_dog(void);
static void finish(int);
static void getoffset(char *);
static void loop(void);
static void loop(bool);
static void nolog(void);
static void timeout(int);
static void timewarn(int);
@ -100,12 +101,14 @@ main(int argc, char **argv)
char *p, *endp;
struct passwd *pw;
int arglen, ch, len, readstdin;
bool dowarn;
#ifndef DEBUG
if (geteuid())
errx(1, "NOT super-user");
#endif
dowarn = true;
nosync = NULL;
readstdin = 0;
@ -130,7 +133,7 @@ main(int argc, char **argv)
goto poweroff;
}
while ((ch = getopt(argc, argv, "-chknopr")) != -1)
while ((ch = getopt(argc, argv, "-chknoprq")) != -1)
switch (ch) {
case '-':
readstdin = 1;
@ -156,6 +159,9 @@ main(int argc, char **argv)
case 'r':
doreboot = 1;
break;
case 'q':
dowarn = false;
break;
case '?':
default:
usage((char *)NULL);
@ -178,6 +184,8 @@ main(int argc, char **argv)
getoffset(*argv++);
poweroff:
if (!dowarn && *argv != NULL)
usage("warning-message supplied but suppressed with -q");
if (*argv) {
for (p = mbuf, len = sizeof(mbuf); *argv; ++argv) {
arglen = strlen(*argv);
@ -235,12 +243,12 @@ poweroff:
setsid();
#endif
openlog("shutdown", LOG_CONS, LOG_AUTH);
loop();
loop(dowarn);
return(0);
}
static void
loop(void)
loop(bool dowarn)
{
struct interval *tp;
u_int sltime;
@ -263,13 +271,14 @@ loop(void)
* the next wait time.
*/
if ((sltime = offset - tp->timeleft)) {
if (sltime > (u_int)(tp->timetowait / 5))
if (dowarn && sltime > (u_int)(tp->timetowait / 5))
timewarn(offset);
(void)sleep(sltime);
}
}
for (;; ++tp) {
timewarn(tp->timeleft);
if (dowarn)
timewarn(tp->timeleft);
if (!logged && tp->timeleft <= NOLOG_TIME) {
logged = 1;
nolog();
@ -584,7 +593,7 @@ usage(const char *cp)
if (cp != NULL)
warnx("%s", cp);
(void)fprintf(stderr,
"usage: shutdown [-] [-c | -h | -p | -r | -k] [-o [-n]] time [warning-message ...]\n"
"usage: shutdown [-] [-c | -h | -p | -r | -k] [-o [-n]] [-q] time [warning-message ...]\n"
" poweroff\n");
exit(1);
}