BSD 4_3_Reno release
[unix-history] / usr / src / sbin / reboot / reboot.c
index a5b8465..a07d595 100644 (file)
@@ -1,30 +1,44 @@
 /*
 /*
- * 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.
+ * Copyright (c) 1980, 1986 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that: (1) source distributions retain this entire copyright
+ * notice and comment, and (2) distributions including binaries display
+ * the following acknowledgement:  ``This product includes software
+ * developed by the University of California, Berkeley and its contributors''
+ * in the documentation or other materials provided with the distribution
+ * and in all advertising materials mentioning features or use of this
+ * software. Neither the name of the University nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
 #ifndef lint
 char copyright[] =
  */
 
 #ifndef lint
 char copyright[] =
-"@(#) Copyright (c) 1980 Regents of the University of California.\n\
+"@(#) Copyright (c) 1980, 1986 The Regents of the University of California.\n\
  All rights reserved.\n";
  All rights reserved.\n";
-#endif not lint
+#endif /* not lint */
 
 #ifndef lint
 
 #ifndef lint
-static char sccsid[] = "@(#)reboot.c   5.3 (Berkeley) %G%";
-#endif not lint
+static char sccsid[] = "@(#)reboot.c   5.9 (Berkeley) 6/1/90";
+#endif /* not lint */
 
 /*
  * Reboot
  */
 
 /*
  * Reboot
  */
-#include <stdio.h>
-#include <sys/reboot.h>
-#include <errno.h>
-#include <signal.h>
-#include <pwd.h>
 #include <sys/types.h>
 #include <sys/time.h>
 #include <sys/syslog.h>
 #include <sys/types.h>
 #include <sys/time.h>
 #include <sys/syslog.h>
+#include <sys/syscall.h>
+#include <sys/reboot.h>
+#include <sys/signal.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <errno.h>
 
 main(argc, argv)
        int argc;
 
 main(argc, argv)
        int argc;
@@ -35,6 +49,7 @@ main(argc, argv)
        register i;
        register ok = 0;
        register qflag = 0;
        register i;
        register ok = 0;
        register qflag = 0;
+       int needlog = 1;
        char *user, *getlogin();
        struct passwd *pw, *getpwuid();
 
        char *user, *getlogin();
        struct passwd *pw, *getpwuid();
 
@@ -46,6 +61,8 @@ main(argc, argv)
                        qflag++;
                else if (!strcmp(*argv, "-n"))
                        howto |= RB_NOSYNC;
                        qflag++;
                else if (!strcmp(*argv, "-n"))
                        howto |= RB_NOSYNC;
+               else if (!strcmp(*argv, "-l"))
+                       needlog = 0;
                else {
                        fprintf(stderr,
                            "usage: reboot [ -n ][ -q ]\n");
                else {
                        fprintf(stderr,
                            "usage: reboot [ -n ][ -q ]\n");
@@ -54,12 +71,14 @@ main(argc, argv)
                argc--, argv++;
        }
 
                argc--, argv++;
        }
 
-       user = getlogin();
-       if (user == (char *)0 && (pw = getpwuid(getuid())))
-               user = pw->pw_name;
-       if (user == (char *)0)
-               user = "root";
-       syslog(LOG_CRIT, "halted by %s", user);
+       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) {
 
        signal(SIGHUP, SIG_IGN);        /* for remote connections */
        if (kill(1, SIGTSTP) == -1) {
@@ -67,6 +86,8 @@ main(argc, argv)
                exit(1);
        }
        sleep(1);
                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) {
 
        if (!qflag) for (i = 1; ; i++) {
                if (kill(-1, SIGKILL) == -1) {
@@ -89,12 +110,12 @@ main(argc, argv)
        }
 
        if (!qflag && (howto & RB_NOSYNC) == 0) {
        }
 
        if (!qflag && (howto & RB_NOSYNC) == 0) {
-               markdown();
+               logwtmp("~", "shutdown", "");
                sync();
                setalarm(5);
                pause();
        }
                sync();
                setalarm(5);
                pause();
        }
-       syscall(55, howto);
+       syscall(SYS_reboot, howto);
        perror("reboot");
        kill(1, SIGHUP);
        exit(1);
        perror("reboot");
        kill(1, SIGHUP);
        exit(1);
@@ -110,22 +131,3 @@ setalarm(n)
        signal(SIGALRM, dingdong);
        alarm(n);
 }
        signal(SIGALRM, dingdong);
        alarm(n);
 }
-
-#include <utmp.h>
-#define SCPYN(a, b)    strncpy(a, b, sizeof(a))
-char   wtmpf[] = "/usr/adm/wtmp";
-struct utmp wtmp;
-
-markdown()
-{
-       register f = open(wtmpf, 1);
-       if (f >= 0) {
-               lseek(f, 0L, 2);
-               SCPYN(wtmp.ut_line, "~");
-               SCPYN(wtmp.ut_name, "shutdown");
-               SCPYN(wtmp.ut_host, "");
-               time(&wtmp.ut_time);
-               write(f, (char *)&wtmp, sizeof(wtmp));
-               close(f);
-       }
-}