[PATCH] Shutdown cooloff feature

Daniel Braniss danny at cs.huji.ac.il
Tue Sep 29 08:16:31 UTC 2009


> 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.
> 
I know we are living in a virtual world, where even shutting down
a computer is just a 'wish', but lets keep some sanity, now means now.
On the other hand, you could make it conditional, say an environment
variable 'GREENOPERATOR', in which case now would mean soon ... :-)

danny

> 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-----
> 
> --------------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
> Content-Type: text/plain; charset="us-ascii"
> MIME-Version: 1.0
> Content-Transfer-Encoding: 7bit
> Content-Disposition: inline
> 
> _______________________________________________
> freebsd-current at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to "freebsd-current-unsubscribe at freebsd.org"
> --------------090504090807040407080107--
> 




More information about the freebsd-current mailing list