1*11eaad35SDavid van Moolenbroek /* $NetBSD: pr_time.c,v 1.18 2011/08/17 13:48:11 christos Exp $ */
2*11eaad35SDavid van Moolenbroek
3*11eaad35SDavid van Moolenbroek /*-
4*11eaad35SDavid van Moolenbroek * Copyright (c) 1990, 1993, 1994
5*11eaad35SDavid van Moolenbroek * The Regents of the University of California. All rights reserved.
6*11eaad35SDavid van Moolenbroek *
7*11eaad35SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without
8*11eaad35SDavid van Moolenbroek * modification, are permitted provided that the following conditions
9*11eaad35SDavid van Moolenbroek * are met:
10*11eaad35SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright
11*11eaad35SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer.
12*11eaad35SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright
13*11eaad35SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer in the
14*11eaad35SDavid van Moolenbroek * documentation and/or other materials provided with the distribution.
15*11eaad35SDavid van Moolenbroek * 3. Neither the name of the University nor the names of its contributors
16*11eaad35SDavid van Moolenbroek * may be used to endorse or promote products derived from this software
17*11eaad35SDavid van Moolenbroek * without specific prior written permission.
18*11eaad35SDavid van Moolenbroek *
19*11eaad35SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20*11eaad35SDavid van Moolenbroek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*11eaad35SDavid van Moolenbroek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*11eaad35SDavid van Moolenbroek * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23*11eaad35SDavid van Moolenbroek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24*11eaad35SDavid van Moolenbroek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25*11eaad35SDavid van Moolenbroek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26*11eaad35SDavid van Moolenbroek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27*11eaad35SDavid van Moolenbroek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28*11eaad35SDavid van Moolenbroek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29*11eaad35SDavid van Moolenbroek * SUCH DAMAGE.
30*11eaad35SDavid van Moolenbroek */
31*11eaad35SDavid van Moolenbroek
32*11eaad35SDavid van Moolenbroek #include <sys/cdefs.h>
33*11eaad35SDavid van Moolenbroek #ifndef lint
34*11eaad35SDavid van Moolenbroek #if 0
35*11eaad35SDavid van Moolenbroek static char sccsid[] = "@(#)pr_time.c 8.2 (Berkeley) 4/4/94";
36*11eaad35SDavid van Moolenbroek #else
37*11eaad35SDavid van Moolenbroek __RCSID("$NetBSD: pr_time.c,v 1.18 2011/08/17 13:48:11 christos Exp $");
38*11eaad35SDavid van Moolenbroek #endif
39*11eaad35SDavid van Moolenbroek #endif /* not lint */
40*11eaad35SDavid van Moolenbroek
41*11eaad35SDavid van Moolenbroek #include <sys/types.h>
42*11eaad35SDavid van Moolenbroek #include <sys/time.h>
43*11eaad35SDavid van Moolenbroek
44*11eaad35SDavid van Moolenbroek #include <stdio.h>
45*11eaad35SDavid van Moolenbroek #include <string.h>
46*11eaad35SDavid van Moolenbroek #include <time.h>
47*11eaad35SDavid van Moolenbroek #include <tzfile.h>
48*11eaad35SDavid van Moolenbroek
49*11eaad35SDavid van Moolenbroek #include "extern.h"
50*11eaad35SDavid van Moolenbroek
51*11eaad35SDavid van Moolenbroek /*
52*11eaad35SDavid van Moolenbroek * pr_attime --
53*11eaad35SDavid van Moolenbroek * Print the time since the user logged in.
54*11eaad35SDavid van Moolenbroek *
55*11eaad35SDavid van Moolenbroek * Note: SCCS forces the bizarre string manipulation, things like
56*11eaad35SDavid van Moolenbroek * %I% get replaced in the source code.
57*11eaad35SDavid van Moolenbroek */
58*11eaad35SDavid van Moolenbroek void
pr_attime(time_t * started,time_t * now)59*11eaad35SDavid van Moolenbroek pr_attime(time_t *started, time_t *now)
60*11eaad35SDavid van Moolenbroek {
61*11eaad35SDavid van Moolenbroek static char buf[256];
62*11eaad35SDavid van Moolenbroek int tnow_yday;
63*11eaad35SDavid van Moolenbroek struct tm *tp;
64*11eaad35SDavid van Moolenbroek time_t diff;
65*11eaad35SDavid van Moolenbroek
66*11eaad35SDavid van Moolenbroek tnow_yday = localtime(now)->tm_yday;
67*11eaad35SDavid van Moolenbroek tp = localtime(started);
68*11eaad35SDavid van Moolenbroek diff = *now - *started;
69*11eaad35SDavid van Moolenbroek
70*11eaad35SDavid van Moolenbroek if (diff > SECSPERDAY * DAYSPERWEEK) {
71*11eaad35SDavid van Moolenbroek /* If more than a week, use day-month-year. */
72*11eaad35SDavid van Moolenbroek (void)strftime(buf, sizeof(buf), "%d%b%y", tp);
73*11eaad35SDavid van Moolenbroek } else if (tp->tm_yday != tnow_yday) {
74*11eaad35SDavid van Moolenbroek /* If not today, use day-hour-am/pm. Damn SCCS */
75*11eaad35SDavid van Moolenbroek (void)strftime(buf, sizeof(buf), "%a%" "I%p", tp);
76*11eaad35SDavid van Moolenbroek } else {
77*11eaad35SDavid van Moolenbroek /* Default is hh:mm{am,pm}. Damn SCCS */
78*11eaad35SDavid van Moolenbroek (void)strftime(buf, sizeof(buf), "%l:%" "M%p", tp);
79*11eaad35SDavid van Moolenbroek }
80*11eaad35SDavid van Moolenbroek
81*11eaad35SDavid van Moolenbroek buf[sizeof(buf) - 1] = '\0';
82*11eaad35SDavid van Moolenbroek (void)fputs(buf, stdout);
83*11eaad35SDavid van Moolenbroek }
84*11eaad35SDavid van Moolenbroek
85*11eaad35SDavid van Moolenbroek /*
86*11eaad35SDavid van Moolenbroek * pr_idle --
87*11eaad35SDavid van Moolenbroek * Display the idle time.
88*11eaad35SDavid van Moolenbroek */
89*11eaad35SDavid van Moolenbroek void
pr_idle(time_t idle)90*11eaad35SDavid van Moolenbroek pr_idle(time_t idle)
91*11eaad35SDavid van Moolenbroek {
92*11eaad35SDavid van Moolenbroek int days;
93*11eaad35SDavid van Moolenbroek
94*11eaad35SDavid van Moolenbroek if (idle == (time_t)-1) {
95*11eaad35SDavid van Moolenbroek (void)printf(" ? ");
96*11eaad35SDavid van Moolenbroek return;
97*11eaad35SDavid van Moolenbroek }
98*11eaad35SDavid van Moolenbroek
99*11eaad35SDavid van Moolenbroek days = idle / SECSPERDAY;
100*11eaad35SDavid van Moolenbroek
101*11eaad35SDavid van Moolenbroek /* If idle more than 36 hours, print as a number of days. */
102*11eaad35SDavid van Moolenbroek if (idle >= 48 * SECSPERHOUR)
103*11eaad35SDavid van Moolenbroek printf(" %ddays ", days);
104*11eaad35SDavid van Moolenbroek else if (idle >= 36 * SECSPERHOUR)
105*11eaad35SDavid van Moolenbroek printf(" 1day ");
106*11eaad35SDavid van Moolenbroek
107*11eaad35SDavid van Moolenbroek /* If idle more than an hour, print as HH:MM. */
108*11eaad35SDavid van Moolenbroek else if (idle >= SECSPERHOUR)
109*11eaad35SDavid van Moolenbroek (void)printf(" %2d:%02d ",
110*11eaad35SDavid van Moolenbroek (int)(idle / SECSPERHOUR),
111*11eaad35SDavid van Moolenbroek (int)((idle % SECSPERHOUR) / SECSPERMIN));
112*11eaad35SDavid van Moolenbroek
113*11eaad35SDavid van Moolenbroek /* Else print the minutes idle. */
114*11eaad35SDavid van Moolenbroek else
115*11eaad35SDavid van Moolenbroek (void)printf(" %2d ", (int)(idle / SECSPERMIN));
116*11eaad35SDavid van Moolenbroek }
117