From: "Roberto E. Vargas Caballero" <k...@shike2.com>

---
 Makefile     |    6 +++++-
 config.def.h |    2 ++
 last.c       |   59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 66 insertions(+), 1 deletion(-)
 create mode 100644 last.c

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..636bc2d 100644
--- a/config.def.h
+++ b/config.def.h
@@ -5,3 +5,5 @@
 #define PW_CIPHER      "$6$"   /* SHA-512 */
 #undef UTMP_PATH
 #define UTMP_PATH      "/var/run/utmp"
+#undef BTMP_PATH
+#define BTMP_PATH      "/var/log/btmp"
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 <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;
+}
-- 
1.7.10.4


Reply via email to