Added the lastlogin utility.
Obtained from: NetBSD
This commit is contained in:
parent
c3b1026985
commit
4e5cd1b9b8
@ -43,6 +43,7 @@ SUBDIR= IPXrouted \
|
||||
kbdmap \
|
||||
kernbb \
|
||||
keyserv \
|
||||
lastlogin \
|
||||
manctl \
|
||||
memcontrol \
|
||||
mergemaster \
|
||||
|
7
usr.sbin/lastlogin/Makefile
Normal file
7
usr.sbin/lastlogin/Makefile
Normal file
@ -0,0 +1,7 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG= lastlogin
|
||||
MAN8= lastlogin.8
|
||||
CFLAGS+=-Wall
|
||||
|
||||
.include <bsd.prog.mk>
|
76
usr.sbin/lastlogin/lastlogin.8
Normal file
76
usr.sbin/lastlogin/lastlogin.8
Normal file
@ -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.
|
136
usr.sbin/lastlogin/lastlogin.c
Normal file
136
usr.sbin/lastlogin/lastlogin.c
Normal file
@ -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 <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
__RCSID("$FreeBSD$");
|
||||
__RCSID("$NetBSD: lastlogin.c,v 1.4 1998/02/03 04:45:35 perry Exp $");
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include <pwd.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <utmp.h>
|
||||
#include <unistd.h>
|
||||
|
||||
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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user