---
 Makefile  |  2 ++
 lastlog.1 | 12 ++++++++++
 lastlog.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 93 insertions(+)
 create mode 100644 lastlog.1
 create mode 100644 lastlog.c

diff --git a/Makefile b/Makefile
index 5a3f0fd..e54e6fa 100644
--- a/Makefile
+++ b/Makefile
@@ -33,6 +33,7 @@ LIB = \
        util/tty.o
 
 SRC = \
+       lastlog.c           \
        chvt.c              \
        clear.c             \
        ctrlaltdel.c        \
@@ -80,6 +81,7 @@ SRC = \
        who.c
 
 MAN1 = \
+       lastlog.1           \
        chvt.1              \
        clear.1             \
        dd.1                \
diff --git a/lastlog.1 b/lastlog.1
new file mode 100644
index 0000000..ef0669b
--- /dev/null
+++ b/lastlog.1
@@ -0,0 +1,12 @@
+.TH LASTLOG 1 ubase-VERSION
+.SH NAME
+\fBlastlog\fR - Show last login of users
+.SH SYPNOSIS
+\fBlastlog\fI [user ...]
+.SH DESCRIPTION
+\fBlastlog\fR Show time, tty, and host (if it was a remote
+connexion) of last login of users. If some user names are passed
+as parameter then information about last login of these users is
+shown, otherwise is shown for all the users in /etc/passwd in the
+order they appear in it.
+
diff --git a/lastlog.c b/lastlog.c
new file mode 100644
index 0000000..f3fd221
--- /dev/null
+++ b/lastlog.c
@@ -0,0 +1,79 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <pwd.h>
+
+#ifdef USE_UTMPX
+# include <utmpx.h>
+#else
+# include <utmp.h>
+#endif
+
+#define LASTLOG  "/var/log/lastlog"
+#define PASSWD   "/etc/passwd"
+
+FILE *last;
+
+void
+lastlog(char *user)
+{
+       struct passwd *pwd;
+       struct lastlog ll;
+
+       if ((pwd = getpwnam(user)) == NULL) {
+               fprintf(stderr, "unknown user: %s\n", user);
+               return;
+       }
+
+       fseek(last, pwd->pw_uid * sizeof(struct lastlog), 0);
+       fread(&ll, sizeof(struct lastlog), 1, last);
+
+       if (ferror(last)) {
+               perror("error reading lastlog");
+               exit(-1);
+       }
+
+       printf("%-8.8s %-8.8s %-16.16s %s",
+              user, ll.ll_line, ll.ll_host, ctime(&ll.ll_time));
+}
+
+int
+main(int argc, char **argv)
+{
+       FILE *fp;
+       char line[512], *p;
+
+       if ((last = fopen(LASTLOG, "r")) == NULL) {
+           perror(LASTLOG);
+           exit(1);
+       }
+
+       if (argc > 1) {
+               while (*++argv)
+                       lastlog(*argv);
+       } else {
+               if ((fp = fopen(PASSWD, "r")) == NULL) {
+                       perror(PASSWD);
+                       exit(1);
+               }
+               while ((fgets(line, sizeof(line), fp)) != NULL) {
+                       if ((p = strchr(line, ':')) == NULL) {
+                               fputs("incorrect password file", stderr);
+                               exit(-1);
+                       }
+                       *p = '\0';
+                       lastlog(line);
+               }
+               if (fclose(fp))
+                       perror(PASSWD);
+       }
+
+       fclose(last);
+
+       return 0;
+}
+
-- 
1.9.3


Reply via email to