last.c - ubase - suckless linux base utils
 (HTM) git clone git://git.suckless.org/ubase
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       last.c (1085B)
       ---
            1 /* See LICENSE file for copyright and license details. */
            2 #include <errno.h>
            3 #include <libgen.h>
            4 #include <paths.h>
            5 #include <pwd.h>
            6 #include <stdio.h>
            7 #include <stdlib.h>
            8 #include <string.h>
            9 #include <time.h>
           10 #include <utmp.h>
           11 #include <unistd.h>
           12 
           13 #include "config.h"
           14 #include "util.h"
           15 
           16 static void
           17 usage(void)
           18 {
           19         eprintf("usage: %s [user]\n", argv0);
           20 }
           21 
           22 int
           23 main(int argc, char **argv)
           24 {
           25         FILE *fp;
           26         struct utmp ut;
           27         char *user, *file, *prog;
           28         time_t t;
           29 
           30         ARGBEGIN {
           31         default:
           32                 usage();
           33         } ARGEND;
           34 
           35         switch (argc) {
           36         case 0:
           37                 user = NULL;
           38                 break;
           39         case 1:
           40                 user = argv[0];
           41                 break;
           42         default:
           43                 usage();
           44         }
           45 
           46         prog = basename(argv0);
           47         file = (!strcmp(prog, "last")) ? WTMP_PATH : BTMP_PATH;
           48         if ((fp = fopen(file, "r")) == NULL)
           49                 eprintf("fopen %s:", file);
           50 
           51         while (fread(&ut, sizeof(ut), 1, fp) == 1) {
           52                 if (ut.ut_type != USER_PROCESS ||
           53                     (user && strcmp(user, ut.ut_name))) {
           54                         continue;
           55                 }
           56 
           57                 t = ut.ut_time;
           58                 printf("%-8.8s %-8.8s %-16.16s %s",
           59                        ut.ut_user, ut.ut_line, ut.ut_host, ctime(&t));
           60         }
           61         if (fclose(fp))
           62                 eprintf("fclose %s:", file);
           63         return 0;
           64 }