Permalink
Browse files

Import of lastlogin from John M. Vinopal, from PR #1932.

RCS ID changes from PR.  Updated man page for NetBSD 1.2 instead
of NetBSD 1.1.   If this program is merged with last(1), then
it will be removed.
  • Loading branch information...
1 parent a2bca40 commit 5bbcbac7b2c62407c3d14ceea98242413d380e72 phil committed Feb 11, 1997
Showing with 206 additions and 0 deletions.
  1. +6 −0 usr.sbin/lastlogin/Makefile
  2. +72 −0 usr.sbin/lastlogin/lastlogin.8
  3. +128 −0 usr.sbin/lastlogin/lastlogin.c
View
6 usr.sbin/lastlogin/Makefile
@@ -0,0 +1,6 @@
+# $NetBSD: Makefile,v 1.1.1.1 1997/02/11 18:36:51 phil Exp $
+
+PROG= lastlogin
+MAN= lastlogin.8
+
+.include <bsd.prog.mk>
View
72 usr.sbin/lastlogin/lastlogin.8
@@ -0,0 +1,72 @@
+.\" $NetBSD: lastlogin.8,v 1.1.1.1 1997/02/11 18:36:51 phil Exp $
+.\"
+.\" Copyright (c) 1996 John M. Vinopal
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\" must display the following acknowledgement:
+.\" This product includes software developed for the NetBSD Project
+.\" by John M. Vinopal.
+.\" 4. The name of the author may not be used to endorse or promote products
+.\" derived from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd January 11, 1996
+.Dt LASTLOGIN 8
+.Os NetBSD 1.2
+.Sh NAME
+.Nm lastlogin
+.Nd indicate last login time of users
+.Sh SYNOPSIS
+.Nm lastlogin
+.Op user ...
+.Sh DESCRIPTION
+.Nm Lastlogin
+will list the last login session of specified
+.Ar users ,
+or for all users by default. Each line of output contains
+the user name, the tty from which the session was conducted, any
+hostname, and the start time for the session.
+.Pp
+If multiple
+.Ar users
+are given, the session information for each user is printed in
+the order given on the command line. Otherwise, information
+for all users is printed, sorted by uid.
+.Pp
+.Nm Lastlogin
+differs from
+.Nm last
+in that it only prints information regarding the very last login session.
+The last login database is never turned over or deleted in standard usage.
+.Sh FILES
+.Bl -tag -width /var/log/lastlog -compact
+.It Pa /var/log/lastlog
+last login database
+.El
+.Sh SEE ALSO
+.Xr last 1 ,
+.Xr lastlog 5 ,
+.Xr ac 8
+.Sh AUTHOR
+John M. Vinopal wrote this program in January 1996 and contributed it
+to the NetBSD project.
View
128 usr.sbin/lastlogin/lastlogin.c
@@ -0,0 +1,128 @@
+/* $NetBSD: lastlogin.c,v 1.1.1.1 1997/02/11 18:36:51 phil Exp $ */
+/*
+ * Copyright (c) 1996 John M. Vinopal
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed for the NetBSD Project
+ * by John M. Vinopal.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <utmp.h>
+#include <errno.h>
+#include <err.h>
+#include <pwd.h>
+#include <time.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+extern char *__progname;
+static char *logfile = _PATH_LASTLOG;
+
+static void output __P((struct passwd *, struct lastlog *));
+static void usage __P((void));
+
+int
+main(argc, argv)
+ int argc;
+ char *argv[];
+{
+ int ch, i;
+ FILE *fp;
+ struct passwd *passwd;
+ struct lastlog last;
+
+ while ((ch = getopt(argc, argv, "")) != -1) {
+ usage();
+ }
+
+ fp = fopen(logfile, "r");
+ if (fp == NULL)
+ err(1, "%s", logfile);
+
+ setpassent(1); /* Keep passwd file pointers open */
+
+ /* Process usernames given on the command line. */
+ if (argc > 1) {
+ long offset;
+ for (i = 1; i < argc; ++i) {
+ if ((passwd = getpwnam(argv[i])) == NULL) {
+ warnx("user '%s' not found", argv[i]);
+ continue;
+ }
+ /* Calculate the offset into the lastlog file. */
+ offset = (long)(passwd->pw_uid * sizeof(last));
+ if (fseek(fp, offset, SEEK_SET)) {
+ warn("fseek error");
+ continue;
+ }
+ if (fread(&last, sizeof(last), 1, fp) != 1) {
+ warnx("fread error on '%s'", passwd->pw_name);
+ clearerr(fp);
+ continue;
+ }
+ output(passwd, &last);
+ }
+ }
+ /* Read all lastlog entries, looking for active ones */
+ else {
+ i = 0;
+ while (fread(&last, sizeof(last), 1, fp) == 1) {
+ passwd = getpwuid(i);
+ if (passwd != NULL && (last.ll_time != 0))
+ output(passwd, &last);
+ i++;
+ }
+ if (ferror(fp))
+ warnx("fread error");
+ }
+
+ setpassent(0); /* Close passwd file pointers */
+
+ fclose(fp);
+ exit(0);
+}
+
+/* Duplicate the output of last(1) */
+static void
+output(p, l)
+ struct passwd *p;
+ struct lastlog *l;
+{
+ printf("%-*.*s %-*.*s %-*.*s %s",
+ UT_NAMESIZE, UT_NAMESIZE, p->pw_name,
+ UT_LINESIZE, UT_LINESIZE, l->ll_line,
+ UT_HOSTSIZE, UT_HOSTSIZE, l->ll_host,
+ (l->ll_time) ? ctime(&(l->ll_time)) : "Never logged in\n");
+}
+
+static void
+usage()
+{
+ fprintf(stderr, "usage: %s [user ...]\n", __progname);
+ exit(1);
+}

0 comments on commit 5bbcbac

Please sign in to comment.