[PATCH] Shutdown cooloff feature

From: Xin LI <delphij_at_delphij.net>
Date: Mon, 28 Sep 2009 16:07:28 -0700
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi,

I'm not sure if anyone would find this useful:

 - If a shutdown is initiated from a tty -and-
 - It's not a restart -and-
 - The time parameter is set to "now"

Then, the shutdown(8) program would give something like this:

Shutting down <hostname> NOW, press ^C within 5 seconds to cancel...

So the user would get a chance to terminate it before it's too late.

Cheers,
- --
Xin LI <delphij_at_delphij.net>	http://www.delphij.net/
FreeBSD - The Power to Serve!
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.12 (FreeBSD)

iEYEARECAAYFAkrBQa8ACgkQi+vbBBjt66D5iQCgmISna2P4CbX9qob5SuetGuoy
nUUAn0BtA/67Lyy8+91JppokUE57c/Ew
=Aytq
-----END PGP SIGNATURE-----

Index: shutdown.c
===================================================================
--- shutdown.c	(revision 197578)
+++ shutdown.c	(working copy)
_at__at_ -103,6 +103,7 _at__at_ static void timewarn(int);
 static void usage(const char *);
 
 extern const char **environ;
+static char hostname[MAXHOSTNAMELEN];
 
 int
 main(int argc, char **argv)
_at__at_ -159,6 +160,7 _at__at_ main(int argc, char **argv)
 	if (nosync != NULL && !oflag)
 		usage("-n requires -o");
 
+	gethostname(hostname, sizeof(hostname));
 	getoffset(*argv++);
 
 	if (*argv) {
_at__at_ -193,8 +195,22 _at__at_ main(int argc, char **argv)
 
 	if (offset)
 		(void)printf("Shutdown at %.24s.\n", ctime(&shuttime));
-	else
+	else {
+		/*
+		 * Safe belt when the operation is going to happen
+		 * immediately from a tty.
+		 */
+		if (doreboot != 1) {
+			if (isatty(STDIN_FILENO)) {
+				printf("Shutting down %s NOW, press ^C within "
+				       "5 seconds to cancel...", hostname);
+				fflush(stdout);
+				sleep(5);
+				printf(" going ahead!\n");
+			}
+		}
 		(void)printf("Shutdown NOW!\n");
+	}
 
 	if (!(whom = getlogin()))
 		whom = (pw = getpwuid(getuid())) ? pw->pw_name : "???";
_at__at_ -271,14 +287,9 _at__at_ static const char *restricted_environ[] = {
 static void
 timewarn(int timeleft)
 {
-	static int first;
-	static char hostname[MAXHOSTNAMELEN + 1];
 	FILE *pf;
 	char wcmd[MAXPATHLEN + 4];
 
-	if (!first++)
-		(void)gethostname(hostname, sizeof(hostname));
-
 	/* undoc -n option to wall suppresses normal wall banner */
 	(void)snprintf(wcmd, sizeof(wcmd), "%s -n", _PATH_WALL);
 	environ = restricted_environ;
Received on Mon Sep 28 2009 - 21:07:38 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:56 UTC