ANSI fixes
[unix-history] / usr / src / sbin / reboot / halt.c
index 8259c9c..ead32b8 100644 (file)
@@ -1,45 +1,88 @@
-static char *sccsid = "@(#)halt.c      4.3 (Berkeley) %G%";
+/*
+ * Copyright (c) 1980, 1986 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * %sccs.include.redist.c%
+ */
+
+#ifndef lint
+char copyright[] =
+"@(#) Copyright (c) 1980, 1986 The Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+static char sccsid[] = "@(#)halt.c     5.9 (Berkeley) %G%";
+#endif /* not lint */
+
 /*
  * Halt
  */
 /*
  * Halt
  */
-#include <stdio.h>
+#include <sys/types.h>
 #include <sys/reboot.h>
 #include <sys/reboot.h>
+#include <sys/time.h>
+#include <sys/syslog.h>
+#include <sys/signal.h>
 #include <errno.h>
 #include <errno.h>
-#include <signal.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <paths.h>
 
 main(argc, argv)
        int argc;
        char **argv;
 {
 
 main(argc, argv)
        int argc;
        char **argv;
 {
-       int howto;
-       char *ttyn = (char *)ttyname(2);
-       register i;
-       register qflag;
+       register int i;
+       register int qflag = 0;
+       struct passwd *pw;
+       int ch, howto, needlog = 1;
+       char *user, *ttyn, *getlogin(), *ttyname();
 
        howto = RB_HALT;
 
        howto = RB_HALT;
-       argc--, argv++;
-       while (argc > 0) {
-               if (!strcmp(*argv, "-n"))
+       ttyn = ttyname(2);
+       while ((ch = getopt(argc, argv, "lnqy")) != EOF)
+               switch((char)ch) {
+               case 'l':               /* undocumented; for shutdown(8) */
+                       needlog = 0;
+                       break;
+               case 'n':
                        howto |= RB_NOSYNC;
                        howto |= RB_NOSYNC;
-               else if (!strcmp(*argv, "-y"))
-                       ttyn = 0;
-               else if (!strcmp(*argv, "-q"))
+                       break;
+               case 'q':
                        qflag++;
                        qflag++;
-               else {
-                       fprintf(stderr, "usage: halt [ -n ]\n");
+                       break;
+               case 'y':
+                       ttyn = 0;
+                       break;
+               case '?':
+               default:
+                       fprintf(stderr, "usage: halt [-nqy]\n");
                        exit(1);
                }
                        exit(1);
                }
-               argc--, argv++;
-       }
-       if (ttyn && *(ttyn+strlen("/dev/tty")) == 'd') {
+
+       if (ttyn && ttyn[sizeof(_PATH_TTY) - 1] == 'd') {
                fprintf(stderr, "halt: dangerous on a dialup; use ``halt -y'' if you are really sure\n");
                exit(1);
        }
 
                fprintf(stderr, "halt: dangerous on a dialup; use ``halt -y'' if you are really sure\n");
                exit(1);
        }
 
+       if (needlog) {
+               openlog("halt", 0, LOG_AUTH);
+               if ((user = getlogin()) == NULL)
+                       if ((pw = getpwuid(getuid())))
+                               user = pw->pw_name;
+                       else
+                               user = "???";
+               syslog(LOG_CRIT, "halted by %s", user);
+       }
+
+       signal(SIGHUP, SIG_IGN);                /* for network connections */
        if (kill(1, SIGTSTP) == -1) {
        if (kill(1, SIGTSTP) == -1) {
-               fprintf(stderr, "reboot: can't idle init\n");
+               fprintf(stderr, "halt: can't idle init\n");
                exit(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) {
@@ -48,56 +91,38 @@ main(argc, argv)
                        if (errno == ESRCH)
                                break;
 
                        if (errno == ESRCH)
                                break;
 
-                       perror("reboot: kill");
+                       perror("halt: kill");
                        kill(1, SIGHUP);
                        exit(1);
                }
                if (i > 5) {
                        kill(1, SIGHUP);
                        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();
        }
 
                        break;
                }
                setalarm(2 * i);
                pause();
        }
 
-       if (!qflag) {
-               if ((howto & RB_NOSYNC)==0) {
-                       markdown();
-                       sync();
-                       sync();
-               }
+       if (!qflag && (howto & RB_NOSYNC) == 0) {
+               logwtmp("~", "shutdown", "");
+               sync();
                setalarm(5);
                pause();
        }
        syscall(55, howto);
                setalarm(5);
                pause();
        }
        syscall(55, howto);
-       perror("reboot");
+       perror("halt");
 }
 
 }
 
+void
 dingdong()
 {
        /* RRRIIINNNGGG RRRIIINNNGGG */
 }
 
 setalarm(n)
 dingdong()
 {
        /* RRRIIINNNGGG RRRIIINNNGGG */
 }
 
 setalarm(n)
+       int 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");
-               time(&wtmp.ut_time);
-               write(f, (char *)&wtmp, sizeof(wtmp));
-               close(f);
-       }
-}