Module Name: src
Committed By: snj
Date: Sat May 30 06:45:39 UTC 2009
Modified Files:
src/sbin/shutdown [netbsd-3]: Makefile shutdown.c
Log Message:
Pull up following revision(s) (requested by jnemeth in ticket #2019):
sbin/shutdown/Makefile: revision 1.9
sbin/shutdown/shutdown.c: revision 1.45-1.48
Move WARNS=3 to the Makefile.inc, and add a little const to the remaining
programs that did not compile before.
PR/31531: Takahiro Kambe: shutdown(8) quietly exit if execed from login shell
- sprinkle static
- pass WARNS=4 and lint
- use size_t/time_t where appropriate
- get/setprogname()
- before executing rc.shutdown, set the real user id to 0, because shutdown
scripts may depend on it (for example su depends on being root).
- use warn instead of perror, and make sure we use the right errno.
PR/36626 - Jukka Salmi -- fails to compile if DEBUG is defined
To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.8.20.1 src/sbin/shutdown/Makefile
cvs rdiff -u -r1.44 -r1.44.2.1 src/sbin/shutdown/shutdown.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sbin/shutdown/Makefile
diff -u src/sbin/shutdown/Makefile:1.8 src/sbin/shutdown/Makefile:1.8.20.1
--- src/sbin/shutdown/Makefile:1.8 Sat Oct 11 11:05:38 1997
+++ src/sbin/shutdown/Makefile Sat May 30 06:45:38 2009
@@ -1,6 +1,7 @@
-# $NetBSD: Makefile,v 1.8 1997/10/11 11:05:38 mycroft Exp $
+# $NetBSD: Makefile,v 1.8.20.1 2009/05/30 06:45:38 snj Exp $
# @(#)Makefile 8.1 (Berkeley) 6/5/93
+WARNS= 4
PROG= shutdown
MAN= shutdown.8
BINOWN= root
Index: src/sbin/shutdown/shutdown.c
diff -u src/sbin/shutdown/shutdown.c:1.44 src/sbin/shutdown/shutdown.c:1.44.2.1
--- src/sbin/shutdown/shutdown.c:1.44 Sat Feb 5 13:17:54 2005
+++ src/sbin/shutdown/shutdown.c Sat May 30 06:45:38 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: shutdown.c,v 1.44 2005/02/05 13:17:54 xtraeme Exp $ */
+/* $NetBSD: shutdown.c,v 1.44.2.1 2009/05/30 06:45:38 snj Exp $ */
/*
* Copyright (c) 1988, 1990, 1993
@@ -39,7 +39,7 @@
#if 0
static char sccsid[] = "@(#)shutdown.c 8.4 (Berkeley) 4/28/95";
#else
-__RCSID("$NetBSD: shutdown.c,v 1.44 2005/02/05 13:17:54 xtraeme Exp $");
+__RCSID("$NetBSD: shutdown.c,v 1.44.2.1 2009/05/30 06:45:38 snj Exp $");
#endif
#endif /* not lint */
@@ -60,6 +60,7 @@
#include <time.h>
#include <tzfile.h>
#include <unistd.h>
+#include <errno.h>
#include "pathnames.h"
@@ -74,8 +75,8 @@
#define M *60
#define S *1
#define NOLOG_TIME 5*60
-struct interval {
- int timeleft, timetowait;
+static const struct interval {
+ time_t timeleft, timetowait;
} tlist[] = {
{ 10 H, 5 H }, { 5 H, 3 H }, { 2 H, 1 H }, { 1 H, 30 M },
{ 30 M, 10 M }, { 20 M, 10 M }, { 10 M, 5 M }, { 5 M, 3 M },
@@ -87,31 +88,34 @@
#undef S
static time_t offset, shuttime;
-static int dofast, dohalt, doreboot, killflg, mbuflen, nofork, nosync, dodump;
+static int dofast, dohalt, doreboot, killflg, nofork, nosync, dodump;
+static size_t mbuflen;
static int dopowerdown;
static const char *whom;
static char mbuf[BUFSIZ];
-char *bootstr;
+static char *bootstr;
-void badtime(void);
-void die_you_gravy_sucking_pig_dog(void);
-void doitfast(void);
+static void badtime(void) __attribute__((__noreturn__));
+static void die_you_gravy_sucking_pig_dog(void) __attribute__((__noreturn__));
+static void doitfast(void);
void dorcshutdown(void);
-void finish(int);
-void getoffset(char *);
-void loop(void);
-void nolog(void);
-void timeout(int);
-void timewarn(int);
-void usage(void);
+static void finish(int) __attribute__((__noreturn__));
+static void getoffset(char *);
+static void loop(void);
+static void nolog(void);
+static void timeout(int);
+static void timewarn(time_t);
+static void usage(void) __attribute__((__noreturn__));
int
main(int argc, char *argv[])
{
char *p, *endp;
struct passwd *pw;
- int arglen, ch, len;
+ size_t arglen, len;
+ int ch;
+ (void)setprogname(argv[0]);
#ifndef DEBUG
if (geteuid())
errx(1, "NOT super-user");
@@ -179,7 +183,7 @@
break;
if (p != mbuf)
*p++ = ' ';
- memmove(p, *argv, arglen);
+ (void)memmove(p, *argv, arglen);
p += arglen;
}
*p = '\n';
@@ -225,6 +229,7 @@
(void)printf("shutdown: [pid %d]\n", forkpid);
exit(0);
}
+ (void)setsid();
}
#endif
openlog("shutdown", LOG_CONS, LOG_AUTH);
@@ -238,7 +243,7 @@
void
loop(void)
{
- struct interval *tp;
+ const struct interval *tp;
u_int sltime;
int logged;
@@ -280,7 +285,7 @@
static jmp_buf alarmbuf;
void
-timewarn(int timeleft)
+timewarn(time_t timeleft)
{
static int first;
static char hostname[MAXHOSTNAMELEN + 1];
@@ -294,8 +299,9 @@
/* undoc -n option to wall suppresses normal wall banner */
(void)snprintf(wcmd, sizeof wcmd, "%s -n", _PATH_WALL);
- if (!(pf = popen(wcmd, "w"))) {
- syslog(LOG_ERR, "shutdown: can't find %s: %m", _PATH_WALL);
+ if ((pf = popen(wcmd, "w")) == NULL) {
+ syslog(LOG_ERR, "%s: Can't find `%s' (%m)", getprogname(),
+ _PATH_WALL);
return;
}
@@ -307,8 +313,8 @@
(void)fprintf(pf, "System going down at %5.5s\n\n",
ctime(&shuttime) + 11);
else if (timeleft > 59)
- (void)fprintf(pf, "System going down in %d minute%s\n\n",
- timeleft / 60, (timeleft > 60) ? "s" : "");
+ (void)fprintf(pf, "System going down in %ld minute%s\n\n",
+ (long)timeleft / 60, (timeleft > 60) ? "s" : "");
else if (timeleft)
(void)fprintf(pf, "System going down in 30 seconds\n\n");
else
@@ -330,13 +336,14 @@
}
}
-void
+static void
+/*ARGSUSED*/
timeout(int signo)
{
longjmp(alarmbuf, 1);
}
-void
+static void
die_you_gravy_sucking_pig_dog(void)
{
@@ -353,7 +360,11 @@
doitfast();
dorcshutdown();
if (doreboot || dohalt) {
- char *args[16], **arg, *path;
+ const char *args[16];
+ const char **arg, *path;
+#ifndef DEBUG
+ int serrno;
+#endif
arg = &args[0];
if (doreboot) {
@@ -374,9 +385,12 @@
*arg++ = bootstr;
*arg++ = 0;
#ifndef DEBUG
- execve(path, args, (char **)0);
- syslog(LOG_ERR, "shutdown: can't exec %s: %m", path);
- perror("shutdown");
+ (void)execve(path, __UNCONST(args), NULL);
+ serrno = errno;
+ syslog(LOG_ERR, "%s: Can't exec `%s' (%m)", getprogname(),
+ path);
+ errno = serrno;
+ warn("Can't exec `%s'", path);
#else
printf("%s", path);
for (arg = &args[0]; *arg; arg++)
@@ -430,7 +444,7 @@
badtime();
}
- unsetenv("TZ"); /* OUR timezone */
+ (void)unsetenv("TZ"); /* OUR timezone */
lt = localtime(&now); /* current time val */
lt->tm_sec = 0;
@@ -479,7 +493,10 @@
dorcshutdown(void)
{
(void)printf("\r\nAbout to run shutdown hooks...\r\n");
+#ifndef DEBUG
+ (void)setuid(0);
(void)system(". " _PATH_RCSHUTDOWN);
+#endif
(void)sleep(5); /* Give operator a chance to abort this. */
(void)printf("\r\nDone running shutdown hooks.\r\n");
}
@@ -520,7 +537,8 @@
}
}
-void
+static void
+/*ARGSUSED*/
finish(int signo)
{
@@ -529,7 +547,7 @@
exit(0);
}
-void
+static void
badtime(void)
{
@@ -537,11 +555,12 @@
usage();
}
-void
+static void
usage(void)
{
(void)fprintf(stderr,
- "usage: shutdown [-Ddfhknpr] time [message ... | -]\n");
+ "Usage: %s [-Ddfhknpr] time [message ... | -]\n",
+ getprogname());
exit(1);
}