Added the lastlogin utility.
Obtained from: NetBSD
This commit is contained in:
parent
c3b1026985
commit
4e5cd1b9b8
@ -43,6 +43,7 @@ SUBDIR= IPXrouted \
|
|||||||
kbdmap \
|
kbdmap \
|
||||||
kernbb \
|
kernbb \
|
||||||
keyserv \
|
keyserv \
|
||||||
|
lastlogin \
|
||||||
manctl \
|
manctl \
|
||||||
memcontrol \
|
memcontrol \
|
||||||
mergemaster \
|
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