Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 28 Sep 2009 16:07:28 -0700
From:      Xin LI <delphij@delphij.net>
To:        FreeBSD Current <freebsd-current@freebsd.org>
Subject:   [PATCH] Shutdown cooloff feature
Message-ID:  <4AC141B0.4090705@delphij.net>

next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------090504090807040407080107
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

-----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@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-----

--------------090504090807040407080107
Content-Type: text/plain;
 name="shutdown-cooloff.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="shutdown-cooloff.diff"

Index: shutdown.c
===================================================================
--- shutdown.c	(revision 197578)
+++ shutdown.c	(working copy)
@@ -103,6 +103,7 @@ static void timewarn(int);
 static void usage(const char *);
 
 extern const char **environ;
+static char hostname[MAXHOSTNAMELEN];
 
 int
 main(int argc, char **argv)
@@ -159,6 +160,7 @@ main(int argc, char **argv)
 	if (nosync != NULL && !oflag)
 		usage("-n requires -o");
 
+	gethostname(hostname, sizeof(hostname));
 	getoffset(*argv++);
 
 	if (*argv) {
@@ -193,8 +195,22 @@ 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 : "???";
@@ -271,14 +287,9 @@ 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;

--------------090504090807040407080107--



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