sprint.c revision 1590
1132718Skan/*
2132718Skan * Copyright (c) 1989, 1993
352284Sobrien *	The Regents of the University of California.  All rights reserved.
490075Sobrien *
552284Sobrien * This code is derived from software contributed to Berkeley by
690075Sobrien * Tony Nardo of the Johns Hopkins University/Applied Physics Lab.
790075Sobrien *
890075Sobrien * Redistribution and use in source and binary forms, with or without
990075Sobrien * modification, are permitted provided that the following conditions
1052284Sobrien * are met:
1190075Sobrien * 1. Redistributions of source code must retain the above copyright
1290075Sobrien *    notice, this list of conditions and the following disclaimer.
1390075Sobrien * 2. Redistributions in binary form must reproduce the above copyright
1490075Sobrien *    notice, this list of conditions and the following disclaimer in the
1552284Sobrien *    documentation and/or other materials provided with the distribution.
1652284Sobrien * 3. All advertising materials mentioning features or use of this software
1790075Sobrien *    must display the following acknowledgement:
1890075Sobrien *	This product includes software developed by the University of
1990075Sobrien *	California, Berkeley and its contributors.
2052284Sobrien * 4. Neither the name of the University nor the names of its contributors
2190075Sobrien *    may be used to endorse or promote products derived from this software
2290075Sobrien *    without specific prior written permission.
2352284Sobrien *
24132718Skan * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2552284Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26132718Skan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2752284Sobrien * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28132718Skan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2952284Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30132718Skan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3152284Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32132718Skan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3352284Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34132718Skan * SUCH DAMAGE.
3552284Sobrien */
3690075Sobrien
3790075Sobrien#ifndef lint
3890075Sobrienstatic char sccsid[] = "@(#)sprint.c	8.1 (Berkeley) 6/6/93";
3990075Sobrien#endif /* not lint */
4090075Sobrien
4190075Sobrien#include <sys/types.h>
42132718Skan#include <sys/time.h>
43132718Skan#include <time.h>
44132718Skan#include <tzfile.h>
45132718Skan#include <db.h>
46132718Skan#include <pwd.h>
4790075Sobrien#include <errno.h>
4890075Sobrien#include <utmp.h>
4990075Sobrien#include <stdio.h>
50#include <stdlib.h>
51#include <string.h>
52#include "finger.h"
53
54static void	  stimeprint __P((WHERE *));
55
56void
57sflag_print()
58{
59	extern time_t now;
60	register PERSON *pn;
61	register WHERE *w;
62	register int sflag, r;
63	register char *p;
64	DBT data, key;
65
66	/*
67	 * short format --
68	 *	login name
69	 *	real name
70	 *	terminal name (the XX of ttyXX)
71	 *	if terminal writeable (add an '*' to the terminal name
72	 *		if not)
73	 *	if logged in show idle time and day logged in, else
74	 *		show last login date and time.  If > 6 moths,
75	 *		show year instead of time.
76	 *	office location
77	 *	office phone
78	 */
79#define	MAXREALNAME	20
80	(void)printf("%-*s %-*s %s\n", UT_NAMESIZE, "Login", MAXREALNAME,
81	    "Name", "Tty  Idle  Login Time   Office     Office Phone");
82
83	for (sflag = R_FIRST;; sflag = R_NEXT) {
84		r = (*db->seq)(db, &key, &data, sflag);
85		if (r == -1)
86			err("db seq: %s", strerror(errno));
87		if (r == 1)
88			break;
89		pn = *(PERSON **)data.data;
90
91		for (w = pn->whead; w != NULL; w = w->next) {
92			(void)printf("%-*.*s %-*.*s ", UT_NAMESIZE, UT_NAMESIZE,
93			    pn->name, MAXREALNAME, MAXREALNAME,
94			    pn->realname ? pn->realname : "");
95			if (!w->loginat) {
96				(void)printf("  *     *  No logins   ");
97				goto office;
98			}
99			(void)putchar(w->info == LOGGEDIN && !w->writable ?
100			    '*' : ' ');
101			if (*w->tty)
102				(void)printf("%-2.2s ",
103				    w->tty[0] != 't' || w->tty[1] != 't' ||
104				    w->tty[2] != 'y' ? w->tty : w->tty + 3);
105			else
106				(void)printf("   ");
107			if (w->info == LOGGEDIN) {
108				stimeprint(w);
109				(void)printf("  ");
110			} else
111				(void)printf("    *  ");
112			p = ctime(&w->loginat);
113			(void)printf("%.6s", p + 4);
114			if (now - w->loginat >= SECSPERDAY * DAYSPERNYEAR / 2)
115				(void)printf("  %.4s", p + 20);
116			else
117				(void)printf(" %.5s", p + 11);
118office:			if (pn->office)
119				(void)printf(" %-10.10s", pn->office);
120			else if (pn->officephone)
121				(void)printf(" %-10.10s", " ");
122			if (pn->officephone)
123				(void)printf(" %-.15s",
124				    prphone(pn->officephone));
125			putchar('\n');
126		}
127	}
128}
129
130static void
131stimeprint(w)
132	WHERE *w;
133{
134	register struct tm *delta;
135
136	delta = gmtime(&w->idletime);
137	if (!delta->tm_yday)
138		if (!delta->tm_hour)
139			if (!delta->tm_min)
140				(void)printf("     ");
141			else
142				(void)printf("%5d", delta->tm_min);
143		else
144			(void)printf("%2d:%02d",
145			    delta->tm_hour, delta->tm_min);
146	else
147		(void)printf("%4dd", delta->tm_yday);
148}
149