+/*
+ * Copyright (c) 1980,1986 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+#ifndef lint
+char copyright[] =
+"@(#) Copyright (c) 1980,1986 Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif not lint
+
#ifndef lint
-static char *sccsid = "@(#)reboot.c 4.8 (Berkeley) 7/2/83";
-#endif
+static char sccsid[] = "@(#)reboot.c 5.4 (Berkeley) 5/26/86";
+#endif not lint
/*
* Reboot
#include <sys/reboot.h>
#include <errno.h>
#include <signal.h>
+#include <pwd.h>
#include <sys/types.h>
#include <sys/time.h>
-
-#define SHUTDOWNLOG "/usr/adm/shutdownlog"
+#include <sys/syslog.h>
main(argc, argv)
int argc;
register i;
register ok = 0;
register qflag = 0;
+ int needlog = 1;
+ char *user, *getlogin();
+ struct passwd *pw, *getpwuid();
+ openlog("reboot", 0, LOG_AUTH);
argc--, argv++;
howto = 0;
while (argc > 0) {
qflag++;
else if (!strcmp(*argv, "-n"))
howto |= RB_NOSYNC;
+ else if (!strcmp(*argv, "-l"))
+ needlog = 0;
else {
fprintf(stderr,
"usage: reboot [ -n ][ -q ]\n");
argc--, argv++;
}
+ if (needlog) {
+ user = getlogin();
+ if (user == (char *)0 && (pw = getpwuid(getuid())))
+ user = pw->pw_name;
+ if (user == (char *)0)
+ user = "root";
+ syslog(LOG_CRIT, "rebooted by %s", user);
+ }
+
signal(SIGHUP, SIG_IGN); /* for remote connections */
if (kill(1, SIGTSTP) == -1) {
fprintf(stderr, "reboot: can't idle init\n");
exit(1);
}
+ sleep(1);
+ (void) kill(-1, SIGTERM); /* one chance to catch it */
+ sleep(5);
if (!qflag) for (i = 1; ; i++) {
if (kill(-1, SIGKILL) == -1) {
exit(1);
}
if (i > 5) {
- fprintf(stderr, "CAUTION: some process(es) wouldn't die\n");
+ fprintf(stderr,
+ "CAUTION: some process(es) wouldn't die\n");
break;
}
setalarm(2 * i);
pause();
}
- if ((howto & RB_NOSYNC) == 0)
- log_entry();
- if (!qflag) {
- if (!(howto & RB_NOSYNC)) {
- markdown();
- sync();
- sync();
- }
+ if (!qflag && (howto & RB_NOSYNC) == 0) {
+ markdown();
+ sync();
setalarm(5);
pause();
}
close(f);
}
}
-
-char *days[] = {
- "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
-};
-
-char *months[] = {
- "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep",
- "Oct", "Nov", "Dec"
-};
-
-log_entry()
-{
- FILE *fp;
- struct tm *tm, *localtime();
- time_t now;
-
- time(&now);
- tm = localtime(&now);
- fp = fopen(SHUTDOWNLOG, "a");
- if (fp == 0)
- return;
- fseek(fp, 0L, 2);
- fprintf(fp, "%02d:%02d %s %s %2d, %4d. Halted for reboot.\n", tm->tm_hour,
- tm->tm_min, days[tm->tm_wday], months[tm->tm_mon],
- tm->tm_mday, tm->tm_year + 1900);
- fclose(fp);
-}