commit 2f03742e05db4657dcef27541670e75620c7f633
parent 249b5b5c0ac75f116f40a28d73c0ef91c933dfff
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date: Thu, 16 Oct 2014 11:27:39 +0100
Add last and lastb
Diffstat:
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;
+}