ubase

suckless linux base utils
git clone git://git.2f30.org/ubase.git
Log | Files | Refs | README | LICENSE

commit d8d1c3b72c6ba14e08616c8823193018ac805127
parent ad92689bfeaa460436e352c736987dc23cef7e37
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Thu, 16 Oct 2014 11:27:39 +0100

Add last and lastb

Diffstat:
Makefile | 6+++++-
config.def.h | 4++++
last.c | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 68 insertions(+), 1 deletion(-)

diff --git 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 @@ -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 @@ -0,0 +1,59 @@ +/* See LICENSE file for copyright and license details. */ +#include <errno.h> +#include <paths.h> +#include <pwd.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> +#include <utmp.h> +#include <unistd.h> + +#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; +}