lastlogin.c revision 200303
1/*
2 * Copyright (c) 1996 John M. Vinopal
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 *    must display the following acknowledgement:
15 *	This product includes software developed for the NetBSD Project
16 *	by John M. Vinopal.
17 * 4. The name of the author may not be used to endorse or promote products
18 *    derived from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
25 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
33#include <sys/cdefs.h>
34#ifndef lint
35__RCSID("$FreeBSD: head/usr.sbin/lastlogin/lastlogin.c 200303 2009-12-09 20:05:37Z ed $");
36__RCSID("$NetBSD: lastlogin.c,v 1.4 1998/02/03 04:45:35 perry Exp $");
37#endif
38
39#include <err.h>
40#include <pwd.h>
41#include <stdio.h>
42#include <stdlib.h>
43#include <time.h>
44#include <ulog.h>
45#include <unistd.h>
46
47	int	main(int, char **);
48static	void	output(struct ulog_utmpx *);
49static	void	usage(void);
50
51int
52main(argc, argv)
53	int argc;
54	char *argv[];
55{
56	int	ch, i;
57	struct ulog_utmpx *u;
58
59	while ((ch = getopt(argc, argv, "")) != -1) {
60		usage();
61	}
62
63	if (ulog_setutxfile(UTXF_LASTLOG, NULL) != 0)
64		errx(1, "failed to open lastlog database");
65
66	setpassent(1);	/* Keep passwd file pointers open */
67
68	/* Process usernames given on the command line. */
69	if (argc > 1) {
70		for (i = 1; i < argc; ++i) {
71			if ((u = ulog_getutxuser(argv[i])) == NULL) {
72				warnx("user '%s' not found", argv[i]);
73				continue;
74			}
75			output(u);
76		}
77	}
78	/* Read all lastlog entries, looking for active ones */
79	else {
80		while ((u = ulog_getutxent()) != NULL) {
81			if (u->ut_type != USER_PROCESS)
82				continue;
83			output(u);
84		}
85	}
86
87	setpassent(0);	/* Close passwd file pointers */
88
89	ulog_endutxent();
90	exit(0);
91}
92
93/* Duplicate the output of last(1) */
94static void
95output(struct ulog_utmpx *u)
96{
97	time_t t = u->ut_tv.tv_sec;
98
99	printf("%-16s  %-8s %-16s   %s",
100		u->ut_user, u->ut_line, u->ut_host,
101		(u->ut_type == USER_PROCESS) ? ctime(&t) : "Never logged in\n");
102}
103
104static void
105usage()
106{
107	fprintf(stderr, "usage: lastlogin [user ...]\n");
108	exit(1);
109}
110