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