xref: /minix3/usr.bin/w/pr_time.c (revision 11eaad3501b899a8ceddf856c90089fa8ebc1f3d)
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