new reboot scheme
authorBill Joy <wnj@ucbvax.Berkeley.EDU>
Sun, 1 Mar 1981 15:00:33 +0000 (07:00 -0800)
committerBill Joy <wnj@ucbvax.Berkeley.EDU>
Sun, 1 Mar 1981 15:00:33 +0000 (07:00 -0800)
SCCS-vsn: sbin/reboot/halt.c 4.3
SCCS-vsn: sbin/reboot/reboot.c 4.2
SCCS-vsn: usr.bin/last/last.c 4.3

usr/src/sbin/reboot/halt.c
usr/src/sbin/reboot/reboot.c
usr/src/usr.bin/last/last.c

index 501d939..8259c9c 100644 (file)
@@ -1,9 +1,11 @@
-static char *sccsid = "@(#)halt.c      4.2 (Berkeley) %G%";
+static char *sccsid = "@(#)halt.c      4.3 (Berkeley) %G%";
 /*
  * Halt
  */
 #include <stdio.h>
 #include <sys/reboot.h>
 /*
  * Halt
  */
 #include <stdio.h>
 #include <sys/reboot.h>
+#include <errno.h>
+#include <signal.h>
 
 main(argc, argv)
        int argc;
 
 main(argc, argv)
        int argc;
@@ -11,6 +13,8 @@ main(argc, argv)
 {
        int howto;
        char *ttyn = (char *)ttyname(2);
 {
        int howto;
        char *ttyn = (char *)ttyname(2);
+       register i;
+       register qflag;
 
        howto = RB_HALT;
        argc--, argv++;
 
        howto = RB_HALT;
        argc--, argv++;
@@ -19,6 +23,8 @@ main(argc, argv)
                        howto |= RB_NOSYNC;
                else if (!strcmp(*argv, "-y"))
                        ttyn = 0;
                        howto |= RB_NOSYNC;
                else if (!strcmp(*argv, "-y"))
                        ttyn = 0;
+               else if (!strcmp(*argv, "-q"))
+                       qflag++;
                else {
                        fprintf(stderr, "usage: halt [ -n ]\n");
                        exit(1);
                else {
                        fprintf(stderr, "usage: halt [ -n ]\n");
                        exit(1);
@@ -29,6 +35,69 @@ main(argc, argv)
                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 (kill(1, SIGTSTP) == -1) {
+               fprintf(stderr, "reboot: can't idle init\n");
+               exit(1);
+       }
+
+       if (!qflag) for (i = 1; ; i++) {
+               if (kill(-1, SIGKILL) == -1) {
+                       extern int errno;
+
+                       if (errno == ESRCH)
+                               break;
+
+                       perror("reboot: kill");
+                       kill(1, SIGHUP);
+                       exit(1);
+               }
+               if (i > 5) {
+       fprintf(stderr, "CAUTION: some process(es) wouldn't die\n");
+                       break;
+               }
+               setalarm(2 * i);
+               pause();
+       }
+
+       if (!qflag) {
+               if ((howto & RB_NOSYNC)==0) {
+                       markdown();
+                       sync();
+                       sync();
+               }
+               setalarm(5);
+               pause();
+       }
        syscall(55, howto);
        perror("reboot");
 }
        syscall(55, howto);
        perror("reboot");
 }
+
+dingdong()
+{
+       /* RRRIIINNNGGG RRRIIINNNGGG */
+}
+
+setalarm(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);
+       }
+}
index 2e71c1c..6736ed2 100644 (file)
@@ -1,9 +1,11 @@
-#include <stdio.h>
-#include <sys/reboot.h>
+static char *sccsid = "@(#)reboot.c    4.2 (Berkeley) %G%";
 /*
  * Reboot
  */
 /*
  * Reboot
  */
-static char *sccsid = "@(#)reboot.c    4.1 (Berkeley) %G%";
+#include <stdio.h>
+#include <sys/reboot.h>
+#include <errno.h>
+#include <signal.h>
 
 main(argc, argv)
        int argc;
 
 main(argc, argv)
        int argc;
@@ -11,23 +13,89 @@ main(argc, argv)
 {
        int howto;
        register char *argp;
 {
        int howto;
        register char *argp;
+       register i;
+       register ok = 0;
+       register qflag = 0;
 
        argc--, argv++;
        howto = 0;
        while (argc > 0) {
 
        argc--, argv++;
        howto = 0;
        while (argc > 0) {
-               if (!strcmp(*argv, "-s"))
-                       howto |= RB_SINGLE;
+               if (!strcmp(*argv, "-q"))
+                       qflag++;
                else if (!strcmp(*argv, "-n"))
                        howto |= RB_NOSYNC;
                else if (!strcmp(*argv, "-n"))
                        howto |= RB_NOSYNC;
-               else if (!strcmp(*argv, "-a"))
-                       howto |= RB_ASKNAME;
                else {
                        fprintf(stderr,
                else {
                        fprintf(stderr,
-                           "usage: reboot [ -a ] [ -n ] [ -s ]\n");
+                           "usage: reboot [ -n ][ -q ]\n");
                        exit(1);
                }
                argc--, argv++;
        }
                        exit(1);
                }
                argc--, argv++;
        }
+
+       if (kill(1, SIGTSTP) == -1) {
+               fprintf(stderr, "reboot: can't idle init\n");
+               exit(1);
+       }
+
+       if (!qflag) for (i = 1; ; i++) {
+               if (kill(-1, SIGKILL) == -1) {
+                       extern int errno;
+
+                       if (errno == ESRCH)
+                               break;
+
+                       perror("reboot: kill");
+                       kill(1, SIGHUP);
+                       exit(1);
+               }
+               if (i > 5) {
+       fprintf(stderr, "CAUTION: some process(es) wouldn't die\n");
+                       break;
+               }
+               setalarm(2 * i);
+               pause();
+       }
+
+       if (!qflag) {
+               if (!(howto & RB_NOSYNC)) {
+                       markdown();
+                       sync();
+                       sync();
+               }
+               setalarm(5);
+               pause();
+       }
        syscall(55, howto);
        perror("reboot");
        syscall(55, howto);
        perror("reboot");
+       kill(1, SIGHUP);
+       exit(1);
+}
+
+dingdong()
+{
+       /* RRRIIINNNGGG RRRIIINNNGGG */
+}
+
+setalarm(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);
+       }
 }
 }
index 347bfe4..d3430c5 100644 (file)
@@ -1,4 +1,4 @@
-static char *sccsid = "@(#)last.c      4.2 (Berkeley) %G%";
+static char *sccsid = "@(#)last.c      4.3 (Berkeley) %G%";
 /*
  * last
  */
 /*
  * last
  */
@@ -37,6 +37,8 @@ main(ac, av)
        long otime;
        struct stat stb;
        int print;
        long otime;
        struct stat stb;
        int print;
+       char * crmsg = (char *)0;
+       long crtime;
  
        time(&buf[0].ut_time);
        ac--, av++;
  
        time(&buf[0].ut_time);
        ac--, av++;
@@ -94,7 +96,7 @@ main(ac, av)
                                        long delta;
                                        if (otime < 0) {
                                                otime = -otime;
                                        long delta;
                                        if (otime < 0) {
                                                otime = -otime;
-                                               printf("- crash");
+                                               printf("- %s", crmsg);
                                        } else
                                                printf("- %5.5s",
                                                    ctime(&otime)+11);
                                        } else
                                                printf("- %5.5s",
                                                    ctime(&otime)+11);
@@ -109,9 +111,14 @@ main(ac, av)
                                }
                                fflush(stdout);
                        }
                                }
                                fflush(stdout);
                        }
-                       if (!strcmp(bp->ut_name, "reboot"))
+                       if (lineq(bp->ut_line, "~")) {
                                for (i = 0; i < MAXTTYS; i++)
                                        logouts[i] = -bp->ut_time;
                                for (i = 0; i < MAXTTYS; i++)
                                        logouts[i] = -bp->ut_time;
+                               if (nameq(bp->ut_name, "shutdown"))
+                                       crmsg = "down ";
+                               else
+                                       crmsg = "crash";
+                       }
                }
        }
        ct = ctime(&buf[0].ut_time);
                }
        }
        ct = ctime(&buf[0].ut_time);
@@ -138,7 +145,7 @@ want(bp)
        register char **av;
        register int ac;
 
        register char **av;
        register int ac;
 
-       if (bp->ut_line[0] == '~')
+       if (bp->ut_line[0] == '~' && bp->ut_name[0] == '\0')
                strcpy(bp->ut_name, "reboot");          /* bandaid */
        if (bp->ut_name[0] == 0)
                return (0);
                strcpy(bp->ut_name, "reboot");          /* bandaid */
        if (bp->ut_name[0] == 0)
                return (0);