From 4e5cd1b9b82b74a0d9a00fed11ec31078d618515 Mon Sep 17 00:00:00 2001 From: ru Date: Tue, 14 Nov 2000 17:49:38 +0000 Subject: [PATCH] Added the lastlogin utility. Obtained from: NetBSD --- usr.sbin/Makefile | 1 + usr.sbin/lastlogin/Makefile | 7 ++ usr.sbin/lastlogin/lastlogin.8 | 76 ++++++++++++++++++ usr.sbin/lastlogin/lastlogin.c | 136 +++++++++++++++++++++++++++++++++ 4 files changed, 220 insertions(+) create mode 100644 usr.sbin/lastlogin/Makefile create mode 100644 usr.sbin/lastlogin/lastlogin.8 create mode 100644 usr.sbin/lastlogin/lastlogin.c diff --git a/usr.sbin/Makefile b/usr.sbin/Makefile index eaaacc7fce5b..02c4d468aeec 100644 --- a/usr.sbin/Makefile +++ b/usr.sbin/Makefile @@ -43,6 +43,7 @@ SUBDIR= IPXrouted \ kbdmap \ kernbb \ keyserv \ + lastlogin \ manctl \ memcontrol \ mergemaster \ diff --git a/usr.sbin/lastlogin/Makefile b/usr.sbin/lastlogin/Makefile new file mode 100644 index 000000000000..289e46e46390 --- /dev/null +++ b/usr.sbin/lastlogin/Makefile @@ -0,0 +1,7 @@ +# $FreeBSD$ + +PROG= lastlogin +MAN8= lastlogin.8 +CFLAGS+=-Wall + +.include diff --git a/usr.sbin/lastlogin/lastlogin.8 b/usr.sbin/lastlogin/lastlogin.8 new file mode 100644 index 000000000000..3a9929d2cade --- /dev/null +++ b/usr.sbin/lastlogin/lastlogin.8 @@ -0,0 +1,76 @@ +.\" $FreeBSD$ +.\" $NetBSD: lastlogin.8,v 1.3 1998/02/06 06:20:39 perry 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 +.Sh NAME +.Nm lastlogin +.Nd indicate last login time of users +.Sh SYNOPSIS +.Nm +.Op user ... +.Sh DESCRIPTION +.Nm +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 +differs from +.Xr last 1 +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 AUTHORS +.An John M. Vinopal +wrote this program in January 1996 and contributed it +to the +.Nx +project. diff --git a/usr.sbin/lastlogin/lastlogin.c b/usr.sbin/lastlogin/lastlogin.c new file mode 100644 index 000000000000..1d84cc35d19a --- /dev/null +++ b/usr.sbin/lastlogin/lastlogin.c @@ -0,0 +1,136 @@ +/* $FreeBSD$ */ +/* $NetBSD: lastlogin.c,v 1.4 1998/02/03 04:45:35 perry 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 +#ifndef lint +__RCSID("$FreeBSD$"); +__RCSID("$NetBSD: lastlogin.c,v 1.4 1998/02/03 04:45:35 perry Exp $"); +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern char *__progname; +static const char *logfile = _PATH_LASTLOG; + + int main __P((int, char **)); +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 { + for (i = 0; fread(&last, sizeof(last), 1, fp) == 1; i++) { + if (last.ll_time == 0) + continue; + if ((passwd = getpwuid((uid_t)i)) != NULL) + output(passwd, &last); + } + 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); +}