xref: /netbsd-src/usr.bin/finger/sprint.c (revision e9836e5e7e2a4dc7ea84eabb8c63005be195ca3c)
1*e9836e5eSchristos /*	$NetBSD: sprint.c,v 1.18 2015/11/21 15:22:17 christos Exp $	*/
29d225a17Stls 
361f28255Scgd /*
4987dbad8Smrg  * Copyright (c) 1989, 1993
5987dbad8Smrg  *	The Regents of the University of California.  All rights reserved.
661f28255Scgd  *
761f28255Scgd  * This code is derived from software contributed to Berkeley by
861f28255Scgd  * Tony Nardo of the Johns Hopkins University/Applied Physics Lab.
961f28255Scgd  *
1061f28255Scgd  * Redistribution and use in source and binary forms, with or without
1161f28255Scgd  * modification, are permitted provided that the following conditions
1261f28255Scgd  * are met:
1361f28255Scgd  * 1. Redistributions of source code must retain the above copyright
1461f28255Scgd  *    notice, this list of conditions and the following disclaimer.
1561f28255Scgd  * 2. Redistributions in binary form must reproduce the above copyright
1661f28255Scgd  *    notice, this list of conditions and the following disclaimer in the
1761f28255Scgd  *    documentation and/or other materials provided with the distribution.
1889aaa1bbSagc  * 3. Neither the name of the University nor the names of its contributors
1961f28255Scgd  *    may be used to endorse or promote products derived from this software
2061f28255Scgd  *    without specific prior written permission.
2161f28255Scgd  *
2261f28255Scgd  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2361f28255Scgd  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2461f28255Scgd  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2561f28255Scgd  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2661f28255Scgd  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2761f28255Scgd  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2861f28255Scgd  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2961f28255Scgd  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3061f28255Scgd  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3161f28255Scgd  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3261f28255Scgd  * SUCH DAMAGE.
3361f28255Scgd  */
3461f28255Scgd 
35987dbad8Smrg #include <sys/cdefs.h>
3661f28255Scgd #ifndef lint
37987dbad8Smrg #if 0
38987dbad8Smrg static char sccsid[] = "@(#)sprint.c	8.3 (Berkeley) 4/28/95";
39987dbad8Smrg #else
40*e9836e5eSchristos __RCSID("$NetBSD: sprint.c,v 1.18 2015/11/21 15:22:17 christos Exp $");
41987dbad8Smrg #endif
4261f28255Scgd #endif /* not lint */
4361f28255Scgd 
44987dbad8Smrg #include <sys/param.h>
4561f28255Scgd #include <sys/time.h>
46987dbad8Smrg 
47987dbad8Smrg #include <time.h>
4861f28255Scgd #include <tzfile.h>
49987dbad8Smrg #include <db.h>
50987dbad8Smrg #include <err.h>
51987dbad8Smrg #include <pwd.h>
52987dbad8Smrg #include <errno.h>
5361f28255Scgd #include <stdio.h>
543ccb8ba1Slukem #include <stdlib.h>
55987dbad8Smrg #include <string.h>
56987dbad8Smrg 
578bff4369Schristos #include "utmpentry.h"
588bff4369Schristos 
5961f28255Scgd #include "finger.h"
603ccb8ba1Slukem #include "extern.h"
6161f28255Scgd 
62ee5c979cSperry static void	  stimeprint(WHERE *);
63987dbad8Smrg 
643ccb8ba1Slukem void
sflag_print(void)65ee5c979cSperry sflag_print(void)
6661f28255Scgd {
673ccb8ba1Slukem 	PERSON *pn;
683ccb8ba1Slukem 	WHERE *w;
69987dbad8Smrg 	int sflag, r;
703ccb8ba1Slukem 	char *p;
71987dbad8Smrg 	PERSON *tmp;
72987dbad8Smrg 	DBT data, key;
7361f28255Scgd 
74a626c509Stron 	if (db == NULL)
75a626c509Stron 		return;
76a626c509Stron 
7761f28255Scgd 	/*
7861f28255Scgd 	 * short format --
7961f28255Scgd 	 *	login name
8061f28255Scgd 	 *	real name
8181726ab7Schristos 	 *	terminal name
821035faffSwiz 	 *	if terminal writable (add an '*' to the terminal name
8361f28255Scgd 	 *		if not)
8461f28255Scgd 	 *	if logged in show idle time and day logged in, else
853ccb8ba1Slukem 	 *		show last login date and time.  If > 6 months,
863ccb8ba1Slukem 	 *		show year instead of time.  If < 6 days,
873ccb8ba1Slukem 	 *		show day name instead of month & day.
883ccb8ba1Slukem 	 *	if -h given
893ccb8ba1Slukem 	 *		remote host
903ccb8ba1Slukem 	 *	else if -o given (overriding -h) (default)
9161f28255Scgd 	 *		office location
9261f28255Scgd 	 *		office phone
9361f28255Scgd 	 */
9481726ab7Schristos #define	MAXREALNAME	18
95*e9836e5eSchristos 	(void)printf("%-*s %-*s %s %s\n", (int)maxname, "Login", MAXREALNAME,
9627032902Smrg 	    "Name", " Tty      Idle  Login Time  ", (gflag) ? "" :
973ccb8ba1Slukem 	    (oflag) ? "Office     Office Phone" : "Where");
98987dbad8Smrg 
99987dbad8Smrg 	for (sflag = R_FIRST;; sflag = R_NEXT) {
100987dbad8Smrg 		r = (*db->seq)(db, &key, &data, sflag);
101987dbad8Smrg 		if (r == -1)
102987dbad8Smrg 			err(1, "db seq");
103987dbad8Smrg 		if (r == 1)
104987dbad8Smrg 			break;
105987dbad8Smrg 		memmove(&tmp, data.data, sizeof tmp);
106987dbad8Smrg 		pn = tmp;
107987dbad8Smrg 
10861f28255Scgd 		for (w = pn->whead; w != NULL; w = w->next) {
1093d5da4cfSchristos 			(void)printf("%-*.*s %-*.*s ", (int)maxname,
1103d5da4cfSchristos 			    (int)maxname,
11161f28255Scgd 			    pn->name, MAXREALNAME, MAXREALNAME,
11261f28255Scgd 			    pn->realname ? pn->realname : "");
11361f28255Scgd 			if (!w->loginat) {
11461f28255Scgd 				(void)printf("  *     *  No logins   ");
11561f28255Scgd 				goto office;
11661f28255Scgd 			}
11761f28255Scgd 			(void)putchar(w->info == LOGGEDIN && !w->writable ?
11861f28255Scgd 			    '*' : ' ');
11961f28255Scgd 			if (*w->tty)
12081726ab7Schristos 				(void)printf("%-7.7s ", w->tty);
12161f28255Scgd 			else
12261f28255Scgd 				(void)printf("        ");
12361f28255Scgd 			if (w->info == LOGGEDIN) {
12461f28255Scgd 				stimeprint(w);
12561f28255Scgd 				(void)printf("  ");
12661f28255Scgd 			} else
12761f28255Scgd 				(void)printf("    *  ");
12861f28255Scgd 			p = ctime(&w->loginat);
1293ccb8ba1Slukem 			if (now - w->loginat < SECSPERDAY * (DAYSPERWEEK - 1))
130f1bd8f53Stron 				(void)printf("%.3s %-8.5s", p, p + 11);
131f1bd8f53Stron 			else if (now - w->loginat
132f1bd8f53Stron 			      < SECSPERDAY * DAYSPERNYEAR / 2)
133f1bd8f53Stron 				(void)printf("%.6s %-5.5s", p + 4, p + 11);
1343ccb8ba1Slukem 			else
135f1bd8f53Stron 				(void)printf("%.6s %-5.4s", p + 4, p + 20);
1363ccb8ba1Slukem office:
13727032902Smrg 			if (gflag)
13827032902Smrg 				goto no_gecos;
1393ccb8ba1Slukem 			putchar(' ');
1403ccb8ba1Slukem 			if (oflag) {
1413ccb8ba1Slukem 				if (pn->office)
14261f28255Scgd 					(void)printf("%-10.10s", pn->office);
14361f28255Scgd 				else if (pn->officephone)
14461f28255Scgd 					(void)printf("%-10.10s", " ");
14561f28255Scgd 				if (pn->officephone)
14661f28255Scgd 					(void)printf(" %-.15s",
14761f28255Scgd 						    prphone(pn->officephone));
1483ccb8ba1Slukem 			} else
149987dbad8Smrg 				(void)printf("%.*s", MAXHOSTNAMELEN, w->host);
15027032902Smrg no_gecos:
15161f28255Scgd 			putchar('\n');
15261f28255Scgd 		}
15361f28255Scgd 	}
15461f28255Scgd }
15561f28255Scgd 
156987dbad8Smrg static void
stimeprint(WHERE * w)157ee5c979cSperry stimeprint(WHERE *w)
15861f28255Scgd {
1593ccb8ba1Slukem 	struct tm *delta;
16061f28255Scgd 
16161f28255Scgd 	delta = gmtime(&w->idletime);
1625d6b49eaSchristos 	if (!delta->tm_yday) {
1635d6b49eaSchristos 		if (!delta->tm_hour) {
16461f28255Scgd 			if (!delta->tm_min)
1656be6fca2Smycroft 				(void)printf("    -");
16661f28255Scgd 			else
16761f28255Scgd 				(void)printf("%5d", delta->tm_min);
1685d6b49eaSchristos 		} else
16961f28255Scgd 			(void)printf("%2d:%02d",
17061f28255Scgd 			    delta->tm_hour, delta->tm_min);
1715d6b49eaSchristos 	} else
17261f28255Scgd 		(void)printf("%4dd", delta->tm_yday);
17361f28255Scgd }
174