make output line buffered if selecting only some of the entries
[unix-history] / usr / src / usr.bin / last / last.c
index f8881c8..257485b 100644 (file)
@@ -22,7 +22,7 @@ char copyright[] =
 #endif /* not lint */
 
 #ifndef lint
 #endif /* not lint */
 
 #ifndef lint
-static char sccsid[] = "@(#)last.c     5.12 (Berkeley) %G%";
+static char sccsid[] = "@(#)last.c     5.16 (Berkeley) %G%";
 #endif /* not lint */
 
 /*
 #endif /* not lint */
 
 /*
@@ -35,6 +35,7 @@ static char sccsid[] = "@(#)last.c    5.12 (Berkeley) %G%";
 #include <time.h>
 #include <utmp.h>
 #include <stdio.h>
 #include <time.h>
 #include <utmp.h>
 #include <stdio.h>
+#include <paths.h>
 
 #define        SECDAY  (24*60*60)                      /* seconds in a day */
 #define        NO      0                               /* false/no */
 
 #define        SECDAY  (24*60*60)                      /* seconds in a day */
 #define        NO      0                               /* false/no */
@@ -42,10 +43,6 @@ static char sccsid[] = "@(#)last.c   5.12 (Berkeley) %G%";
 
 static struct utmp     buf[1024];              /* utmp read buffer */
 
 
 static struct utmp     buf[1024];              /* utmp read buffer */
 
-#define        HMAX    sizeof(buf[0].ut_host)          /* size of utmp host field */
-#define        LMAX    sizeof(buf[0].ut_line)          /* size of utmp tty field */
-#define        NMAX    sizeof(buf[0].ut_name)          /* size of utmp name field */
-
 typedef struct arg {
        char    *name;                          /* argument */
 #define        HOST_TYPE       -2
 typedef struct arg {
        char    *name;                          /* argument */
 #define        HOST_TYPE       -2
@@ -58,25 +55,26 @@ ARG *arglist;                               /* head of linked list */
 
 typedef struct ttytab {
        long    logout;                         /* log out time */
 
 typedef struct ttytab {
        long    logout;                         /* log out time */
-       char    tty[LMAX + 1];                  /* terminal name */
+       char    tty[UT_LINESIZE + 1];           /* terminal name */
        struct ttytab   *next;                  /* linked list pointer */
 } TTY;
 TTY    *ttylist;                               /* head of linked list */
 
 static long    currentout,                     /* current logout value */
                maxrec;                         /* records to display */
        struct ttytab   *next;                  /* linked list pointer */
 } TTY;
 TTY    *ttylist;                               /* head of linked list */
 
 static long    currentout,                     /* current logout value */
                maxrec;                         /* records to display */
-static char    *file = "/usr/adm/wtmp";        /* wtmp file */
+static char    *file = _PATH_WTMP;             /* wtmp file */
 
 main(argc, argv)
 
 main(argc, argv)
-       int     argc;
-       char    **argv;
+       int argc;
+       char **argv;
 {
 {
-       extern int      optind;
-       extern char     *optarg;
-       int     ch;
-       long    atol();
-       char    *ttyconv();
+       extern int optind;
+       extern char *optarg;
+       int ch;
+       long atol();
+       char *p, *ttyconv();
 
 
+       maxrec = -1;
        while ((ch = getopt(argc, argv, "0123456789f:h:t:")) != EOF)
                switch((char)ch) {
                case '0': case '1': case '2': case '3': case '4':
        while ((ch = getopt(argc, argv, "0123456789f:h:t:")) != EOF)
                switch((char)ch) {
                case '0': case '1': case '2': case '3': case '4':
@@ -85,8 +83,15 @@ main(argc, argv)
                         * kludge: last was originally designed to take
                         * a number after a dash.
                         */
                         * kludge: last was originally designed to take
                         * a number after a dash.
                         */
-                       if (!maxrec)
-                               maxrec = atol(argv[optind - 1] + 1);
+                       if (maxrec == -1) {
+                               p = argv[optind - 1];
+                               if (p[0] == '-' && p[1] == ch && !p[2])
+                                       maxrec = atol(++p);
+                               else
+                                       maxrec = atol(argv[optind] + 1);
+                               if (!maxrec)
+                                       exit(0);
+                       }
                        break;
                case 'f':
                        file = optarg;
                        break;
                case 'f':
                        file = optarg;
@@ -103,13 +108,17 @@ main(argc, argv)
                        fputs("usage: last [-#] [-f file] [-t tty] [-h hostname] [user ...]\n", stderr);
                        exit(1);
                }
                        fputs("usage: last [-#] [-f file] [-t tty] [-h hostname] [user ...]\n", stderr);
                        exit(1);
                }
-       for (argv += optind; *argv; ++argv) {
+
+       if (argc) {
+               setlinebuf(stdout);
+               for (argv += optind; *argv; ++argv) {
 #define        COMPATIBILITY
 #ifdef COMPATIBILITY
 #define        COMPATIBILITY
 #ifdef COMPATIBILITY
-               /* code to allow "last p5" to work */
-               addarg(TTY_TYPE, ttyconv(*argv));
+                       /* code to allow "last p5" to work */
+                       addarg(TTY_TYPE, ttyconv(*argv));
 #endif
 #endif
-               addarg(USER_TYPE, *argv);
+                       addarg(USER_TYPE, *argv);
+               }
        }
        wtmp();
        exit(0);
        }
        wtmp();
        exit(0);
@@ -160,11 +169,12 @@ wtmp()
                                for (T = ttylist; T; T = T->next)
                                        T->logout = -bp->ut_time;
                                currentout = -bp->ut_time;
                                for (T = ttylist; T; T = T->next)
                                        T->logout = -bp->ut_time;
                                currentout = -bp->ut_time;
-                               crmsg = strncmp(bp->ut_name, "shutdown", NMAX) ? "crash" : "shutdown";
+                               crmsg = strncmp(bp->ut_name, "shutdown",
+                                   UT_NAMESIZE) ? "crash" : "shutdown";
                                if (want(bp, NO)) {
                                        ct = ctime(&bp->ut_time);
                                if (want(bp, NO)) {
                                        ct = ctime(&bp->ut_time);
-                                       printf("%-*.*s  %-*.*s %-*.*s %10.10s %5.5s \n", NMAX, NMAX, bp->ut_name, LMAX, LMAX, bp->ut_line, HMAX, HMAX, bp->ut_host, ct, ct + 11);
-                                       if (maxrec && !--maxrec)
+                                       printf("%-*.*s  %-*.*s %-*.*s %10.10s %5.5s \n", UT_NAMESIZE, UT_NAMESIZE, bp->ut_name, UT_LINESIZE, UT_LINESIZE, bp->ut_line, UT_HOSTSIZE, UT_HOSTSIZE, bp->ut_host, ct, ct + 11);
+                                       if (maxrec != -1 && !--maxrec)
                                                return;
                                }
                                continue;
                                                return;
                                }
                                continue;
@@ -177,7 +187,7 @@ wtmp()
                            && !bp->ut_line[1]) {
                                if (want(bp, NO)) {
                                        ct = ctime(&bp->ut_time);
                            && !bp->ut_line[1]) {
                                if (want(bp, NO)) {
                                        ct = ctime(&bp->ut_time);
-                                       printf("%-*.*s  %-*.*s %-*.*s %10.10s %5.5s \n", NMAX, NMAX, bp->ut_name, LMAX, LMAX, bp->ut_line, HMAX, HMAX, bp->ut_host, ct, ct + 11);
+                                       printf("%-*.*s  %-*.*s %-*.*s %10.10s %5.5s \n", UT_NAMESIZE, UT_NAMESIZE, bp->ut_name, UT_LINESIZE, UT_LINESIZE, bp->ut_line, UT_HOSTSIZE, UT_HOSTSIZE, bp->ut_host, ct, ct + 11);
                                        if (maxrec && !--maxrec)
                                                return;
                                }
                                        if (maxrec && !--maxrec)
                                                return;
                                }
@@ -190,12 +200,12 @@ wtmp()
                                        T = addtty(bp->ut_line);
                                        break;
                                }
                                        T = addtty(bp->ut_line);
                                        break;
                                }
-                               if (!strncmp(T->tty, bp->ut_line, LMAX))
+                               if (!strncmp(T->tty, bp->ut_line, UT_LINESIZE))
                                        break;
                        }
                        if (bp->ut_name[0] && want(bp, YES)) {
                                ct = ctime(&bp->ut_time);
                                        break;
                        }
                        if (bp->ut_name[0] && want(bp, YES)) {
                                ct = ctime(&bp->ut_time);
-                               printf("%-*.*s  %-*.*s %-*.*s %10.10s %5.5s ", NMAX, NMAX, bp->ut_name, LMAX, LMAX, bp->ut_line, HMAX, HMAX, bp->ut_host, ct, ct + 11);
+                               printf("%-*.*s  %-*.*s %-*.*s %10.10s %5.5s ", UT_NAMESIZE, UT_NAMESIZE, bp->ut_name, UT_LINESIZE, UT_LINESIZE, bp->ut_line, UT_HOSTSIZE, UT_HOSTSIZE, bp->ut_host, ct, ct + 11);
                                if (!T->logout)
                                        puts("  still logged in");
                                else {
                                if (!T->logout)
                                        puts("  still logged in");
                                else {
@@ -227,10 +237,10 @@ wtmp()
  */
 static
 want(bp, check)
  */
 static
 want(bp, check)
-       register struct utmp    *bp;
-       int     check;
+       register struct utmp *bp;
+       int check;
 {
 {
-       register ARG    *step;
+       register ARG *step;
 
        if (check)
                /*
 
        if (check)
                /*
@@ -248,15 +258,15 @@ want(bp, check)
        for (step = arglist; step; step = step->next)
                switch(step->type) {
                case HOST_TYPE:
        for (step = arglist; step; step = step->next)
                switch(step->type) {
                case HOST_TYPE:
-                       if (!strncasecmp(step->name, bp->ut_host, HMAX))
+                       if (!strncasecmp(step->name, bp->ut_host, UT_HOSTSIZE))
                                return(YES);
                        break;
                case TTY_TYPE:
                                return(YES);
                        break;
                case TTY_TYPE:
-                       if (!strncmp(step->name, bp->ut_line, LMAX))
+                       if (!strncmp(step->name, bp->ut_line, UT_LINESIZE))
                                return(YES);
                        break;
                case USER_TYPE:
                                return(YES);
                        break;
                case USER_TYPE:
-                       if (!strncmp(step->name, bp->ut_name, NMAX))
+                       if (!strncmp(step->name, bp->ut_name, UT_NAMESIZE))
                                return(YES);
                        break;
        }
                                return(YES);
                        break;
        }
@@ -269,11 +279,11 @@ want(bp, check)
  */
 static
 addarg(type, arg)
  */
 static
 addarg(type, arg)
-       int     type;
-       char    *arg;
+       int type;
+       char *arg;
 {
 {
-       register ARG    *cur;
-       char    *malloc();
+       register ARG *cur;
+       char *malloc();
 
        if (!(cur = (ARG *)malloc((u_int)sizeof(ARG)))) {
                fputs("last: malloc failure.\n", stderr);
 
        if (!(cur = (ARG *)malloc((u_int)sizeof(ARG)))) {
                fputs("last: malloc failure.\n", stderr);
@@ -291,10 +301,10 @@ addarg(type, arg)
  */
 static TTY *
 addtty(ttyname)
  */
 static TTY *
 addtty(ttyname)
-       char    *ttyname;
+       char *ttyname;
 {
 {
-       register TTY    *cur;
-       char    *malloc();
+       register TTY *cur;
+       char *malloc();
 
        if (!(cur = (TTY *)malloc((u_int)sizeof(TTY)))) {
                fputs("last: malloc failure.\n", stderr);
 
        if (!(cur = (TTY *)malloc((u_int)sizeof(TTY)))) {
                fputs("last: malloc failure.\n", stderr);
@@ -302,7 +312,7 @@ addtty(ttyname)
        }
        cur->next = ttylist;
        cur->logout = currentout;
        }
        cur->next = ttylist;
        cur->logout = currentout;
-       bcopy(ttyname, cur->tty, LMAX);
+       bcopy(ttyname, cur->tty, UT_LINESIZE);
        return(ttylist = cur);
 }
 
        return(ttylist = cur);
 }
 
@@ -314,12 +324,11 @@ addtty(ttyname)
  */
 static
 hostconv(arg)
  */
 static
 hostconv(arg)
-       char    *arg;
+       char *arg;
 {
 {
-       static int      first = 1;
-       static char     *hostdot,
-                       name[MAXHOSTNAMELEN];
-       char    *argdot, *index();
+       static int first = 1;
+       static char *hostdot, name[MAXHOSTNAMELEN];
+       char *argdot, *index();
 
        if (!(argdot = index(arg, '.')))
                return;
 
        if (!(argdot = index(arg, '.')))
                return;
@@ -341,10 +350,9 @@ hostconv(arg)
  */
 static char *
 ttyconv(arg)
  */
 static char *
 ttyconv(arg)
-       char    *arg;
+       char *arg;
 {
 {
-       char    *mval,
-               *malloc(), *strcpy();
+       char *mval, *malloc(), *strcpy();
 
        /*
         * kludge -- we assume that all tty's end with
 
        /*
         * kludge -- we assume that all tty's end with
@@ -364,7 +372,7 @@ ttyconv(arg)
                }
                return(mval);
        }
                }
                return(mval);
        }
-       if (!strncmp(arg, "/dev/", sizeof("/dev/") - 1))
+       if (!strncmp(arg, _PATH_DEV, sizeof(_PATH_DEV) - 1))
                return(arg + 5);
        return(arg);
 }
                return(arg + 5);
        return(arg);
 }
@@ -375,9 +383,9 @@ ttyconv(arg)
  */
 static
 onintr(signo)
  */
 static
 onintr(signo)
-       int     signo;
+       int signo;
 {
 {
-       char    *ct, *ctime();
+       char *ct, *ctime();
 
        ct = ctime(&buf[0].ut_time);
        printf("\ninterrupted %10.10s %5.5s \n", ct, ct + 11);
 
        ct = ctime(&buf[0].ut_time);
        printf("\ninterrupted %10.10s %5.5s \n", ct, ct + 11);