diff --git a/Makefile b/Makefile index 3989a77..07c2de0 100644 --- a/Makefile +++ b/Makefile @@ -33,6 +33,7 @@ LIB = \ util/tty.o SRC = \ + last.c \ lastlog.c \ chvt.c \ clear.c \ @@ -131,7 +132,7 @@ MAN8 = \ umount.8 OBJ = $(SRC:.c=.o) $(LIB) -BIN = $(SRC:.c=) +BIN = $(SRC:.c=) lastb all: options binlib @@ -165,6 +166,9 @@ util.a: $(LIB) @$(AR) -r -c $@ $(LIB) @ranlib $@ +lastb: last + ln -f last lastb + install: all @echo installing executables to $(DESTDIR)$(PREFIX)/bin @mkdir -p $(DESTDIR)$(PREFIX)/bin diff --git a/config.def.h b/config.def.h index 1ea5ca5..577833e 100644 --- a/config.def.h +++ b/config.def.h @@ -5,3 +5,7 @@ #define PW_CIPHER "$6$" /* SHA-512 */ #undef UTMP_PATH #define UTMP_PATH "/var/run/utmp" +#undef BTMP_PATH +#define BTMP_PATH "/var/log/btmp" +#undef WTMP_PATH +#define WTMP_PATH "/var/log/wtmp" diff --git a/last.c b/last.c new file mode 100644 index 0000000..14fb386 --- /dev/null +++ b/last.c @@ -0,0 +1,59 @@ +/* See LICENSE file for copyright and license details. */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "config.h" +#include "util.h" + +void +usage(void) +{ + fputs("last [user]\n", stderr); + exit(1); +} + +int +main(int argc, char **argv) +{ + FILE *fp; + struct utmp ut; + char *user, *file, *prog; + time_t t; + + switch (argc) { + case 1: + user = NULL; + break; + case 2: + user = argv[1]; + break; + default: + usage(); + } + + prog = basename(argv[0]); + file = (!strcmp(prog, "last")) ? WTMP_PATH : BTMP_PATH; + if ((fp = fopen(file, "r")) == NULL) + eprintf("fopen %s:", file); + + while (fread(&ut, sizeof(ut), 1, fp) == 1) { + if (ut.ut_type != USER_PROCESS || + (user && strcmp(user, ut.ut_name))) { + continue; + } + + t = ut.ut_time; + printf("%-8.8s %-8.8s %-16.16s %s", + ut.ut_user, ut.ut_line, ut.ut_host, ctime(&t)); + } + if (fclose(fp)) + eprintf("fclose %s:", file); + return 0; +}