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