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 }