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