no logout time for reboot; minor format change
[unix-history] / usr / src / usr.bin / last / last.c
index 347bfe4..ea82d2a 100644 (file)
@@ -1,24 +1,30 @@
-static char *sccsid = "@(#)last.c      4.2 (Berkeley) %G%";
+#ifndef lint
+static char *sccsid = "@(#)last.c      4.8 (Berkeley) %G%";
+#endif
+
 /*
  * last
  */
 #include <sys/types.h>
 #include <stdio.h>
 #include <signal.h>
 /*
  * last
  */
 #include <sys/types.h>
 #include <stdio.h>
 #include <signal.h>
-#include <stat.h>
+#include <sys/stat.h>
 #include <utmp.h>
 
 #define NMAX   sizeof(buf[0].ut_name)
 #define LMAX   sizeof(buf[0].ut_line)
 #include <utmp.h>
 
 #define NMAX   sizeof(buf[0].ut_name)
 #define LMAX   sizeof(buf[0].ut_line)
+#define        HMAX    sizeof(buf[0].ut_host)
 #define        SECDAY  (24*60*60)
 
 #define        lineq(a,b)      (!strncmp(a,b,LMAX))
 #define        nameq(a,b)      (!strncmp(a,b,NMAX))
 #define        SECDAY  (24*60*60)
 
 #define        lineq(a,b)      (!strncmp(a,b,LMAX))
 #define        nameq(a,b)      (!strncmp(a,b,NMAX))
+#define        hosteq(a,b)     (!strncmp(a,b,HMAX))
 
 #define MAXTTYS 256
 
 char   **argv;
 int    argc;
 
 #define MAXTTYS 256
 
 char   **argv;
 int    argc;
+int    nameargs;
 
 struct utmp buf[128];
 char   ttnames[MAXTTYS][LMAX+1];
 
 struct utmp buf[128];
 char   ttnames[MAXTTYS][LMAX+1];
@@ -37,16 +43,28 @@ main(ac, av)
        long otime;
        struct stat stb;
        int print;
        long otime;
        struct stat stb;
        int print;
+       char * crmsg = (char *)0;
+       long crtime;
+       long outrec = 0;
+       long maxrec = 0x7fffffffL;
  
        time(&buf[0].ut_time);
        ac--, av++;
  
        time(&buf[0].ut_time);
        ac--, av++;
-       argc = ac;
+       nameargs = argc = ac;
        argv = av;
        for (i = 0; i < argc; i++) {
        argv = av;
        for (i = 0; i < argc; i++) {
+               if (argv[i][0] == '-' &&
+                   argv[i][1] >= '0' && argv[i][1] <= '9') {
+                       maxrec = atoi(argv[i]+1);
+                       nameargs--;
+                       continue;
+               }
                if (strlen(argv[i])>2)
                        continue;
                if (!strcmp(argv[i], "~"))
                        continue;
                if (strlen(argv[i])>2)
                        continue;
                if (!strcmp(argv[i], "~"))
                        continue;
+               if (!strcmp(argv[i], "ftp"))
+                       continue;
                if (getpwnam(argv[i]))
                        continue;
                argv[i] = strspl("tty", argv[i]);
                if (getpwnam(argv[i]))
                        continue;
                argv[i] = strspl("tty", argv[i]);
@@ -69,9 +87,11 @@ main(ac, av)
                        print = want(bp);
                        if (print) {
                                ct = ctime(&bp->ut_time);
                        print = want(bp);
                        if (print) {
                                ct = ctime(&bp->ut_time);
-                               printf("%-*.*s  %-*.*s  %10.10s %5.5s ",
+                               printf("%-*.*s  %-*.*s %-*.*s %10.10s %5.5s ",
                                    NMAX, NMAX, bp->ut_name,
                                    NMAX, NMAX, bp->ut_name,
-                                   LMAX, LMAX, bp->ut_line, ct, 11+ct);
+                                   LMAX, LMAX, bp->ut_line,
+                                   HMAX, HMAX, bp->ut_host,
+                                   ct, 11+ct);
                        }
                        for (i = 0; i < MAXTTYS; i++) {
                                if (ttnames[i][0] == 0) {
                        }
                        for (i = 0; i < MAXTTYS; i++) {
                                if (ttnames[i][0] == 0) {
@@ -88,13 +108,15 @@ main(ac, av)
                                }
                        }
                        if (print) {
                                }
                        }
                        if (print) {
-                               if (otime == 0)
+                               if (lineq(bp->ut_line, "~"))
+                                       printf("\n");
+                               else if (otime == 0)
                                        printf("  still logged in\n");
                                else {
                                        long delta;
                                        if (otime < 0) {
                                                otime = -otime;
                                        printf("  still logged in\n");
                                else {
                                        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);
@@ -108,10 +130,17 @@ main(ac, av)
                                                asctime(gmtime(&delta))+11);
                                }
                                fflush(stdout);
                                                asctime(gmtime(&delta))+11);
                                }
                                fflush(stdout);
+                               if (++outrec >= maxrec)
+                                       exit(0);
                        }
                        }
-                       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,17 +167,20 @@ 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 */
                strcpy(bp->ut_name, "reboot");          /* bandaid */
+       if (strncmp(bp->ut_line, "ftp", 3) == 0)
+               bp->ut_line[3] = '\0';
        if (bp->ut_name[0] == 0)
                return (0);
        if (bp->ut_name[0] == 0)
                return (0);
-       if (argc == 0)
+       if (nameargs == 0)
                return (1);
        av = argv;
                return (1);
        av = argv;
-       for (ac = 0; ac < argc; ac++) {
+       for (ac = 0; ac < argc; ac++, av++) {
+               if (av[0][0] == '-')
+                       continue;
                if (nameq(*av, bp->ut_name) || lineq(*av, bp->ut_line))
                        return (1);
                if (nameq(*av, bp->ut_name) || lineq(*av, bp->ut_line))
                        return (1);
-               av++;
        }
        return (0);
 }
        }
        return (0);
 }