source: MondoRescue/branches/3.3/mindi-busybox/coreutils/who.c@ 3865

Last change on this file since 3865 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

File size: 3.5 KB
Line 
1/* vi: set sw=4 ts=4: */
2/*----------------------------------------------------------------------
3 * Mini who is used to display user name, login time,
4 * idle time and host name.
5 *
6 * Author: Da Chen <dchen@ayrnetworks.com>
7 *
8 * This is a free document; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation:
11 * http://www.gnu.org/copyleft/gpl.html
12 *
13 * Copyright (c) 2002 AYR Networks, Inc.
14 *
15 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
16 *
17 *----------------------------------------------------------------------
18 */
19/* BB_AUDIT SUSv3 _NOT_ compliant -- missing options -b, -d, -l, -m, -p, -q, -r, -s, -t, -T, -u; Missing argument 'file'. */
20
21//config:config WHO
22//config: bool "who"
23//config: default y
24//config: depends on FEATURE_UTMP
25//config: help
26//config: who is used to show who is logged on.
27
28//config:config USERS
29//config: bool "users"
30//config: default y
31//config: depends on FEATURE_UTMP
32//config: help
33//config: Print users currently logged on.
34
35//applet:IF_USERS(APPLET_ODDNAME(users, who, BB_DIR_USR_BIN, BB_SUID_DROP, users))
36//applet:IF_WHO( APPLET( who, BB_DIR_USR_BIN, BB_SUID_DROP))
37
38//kbuild:lib-$(CONFIG_USERS) += who.o
39//kbuild:lib-$(CONFIG_WHO) += who.o
40
41//usage:#define users_trivial_usage
42//usage: ""
43//usage:#define users_full_usage "\n\n"
44//usage: "Print the users currently logged on"
45
46//usage:#define who_trivial_usage
47//usage: "[-a]"
48//usage:#define who_full_usage "\n\n"
49//usage: "Show who is logged on\n"
50//usage: "\n -a Show all"
51//usage: "\n -H Print column headers"
52
53#include "libbb.h"
54
55static void idle_string(char *str6, time_t t)
56{
57 t = time(NULL) - t;
58
59 /*if (t < 60) {
60 str6[0] = '.';
61 str6[1] = '\0';
62 return;
63 }*/
64 if (t >= 0 && t < (24 * 60 * 60)) {
65 sprintf(str6, "%02d:%02d",
66 (int) (t / (60 * 60)),
67 (int) ((t % (60 * 60)) / 60));
68 return;
69 }
70 strcpy(str6, "old");
71}
72
73int who_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
74int who_main(int argc UNUSED_PARAM, char **argv)
75{
76 struct utmpx *ut;
77 unsigned opt;
78 int do_users = (ENABLE_USERS && (!ENABLE_WHO || applet_name[0] == 'u'));
79 const char *fmt = "%s";
80
81 opt_complementary = "=0";
82 opt = getopt32(argv, do_users ? "" : "aH");
83 if (opt & 2) // -H
84 puts("USER\t\tTTY\t\tIDLE\tTIME\t\t HOST");
85
86 setutxent();
87 while ((ut = getutxent()) != NULL) {
88 if (ut->ut_user[0]
89 && ((opt & 1) || ut->ut_type == USER_PROCESS)
90 ) {
91 if (!do_users) {
92 char str6[6];
93 char name[sizeof("/dev/") + sizeof(ut->ut_line) + 1];
94 struct stat st;
95 time_t seconds;
96
97 str6[0] = '?';
98 str6[1] = '\0';
99 strcpy(name, "/dev/");
100 safe_strncpy(ut->ut_line[0] == '/' ? name : name + sizeof("/dev/")-1,
101 ut->ut_line,
102 sizeof(ut->ut_line)+1
103 );
104 if (stat(name, &st) == 0)
105 idle_string(str6, st.st_atime);
106 /* manpages say ut_tv.tv_sec *is* time_t,
107 * but some systems have it wrong */
108 seconds = ut->ut_tv.tv_sec;
109 /* How wide time field can be?
110 * "Nov 10 19:33:20": 15 chars
111 * "2010-11-10 19:33": 16 chars
112 */
113 printf("%-15.*s %-15.*s %-7s %-16.16s %.*s\n",
114 (int)sizeof(ut->ut_user), ut->ut_user,
115 (int)sizeof(ut->ut_line), ut->ut_line,
116 str6,
117 ctime(&seconds) + 4,
118 (int)sizeof(ut->ut_host), ut->ut_host
119 );
120 } else {
121 printf(fmt, ut->ut_user);
122 fmt = " %s";
123 }
124 }
125 }
126 if (do_users)
127 bb_putchar('\n');
128 if (ENABLE_FEATURE_CLEAN_UP)
129 endutxent();
130 return EXIT_SUCCESS;
131}
Note: See TracBrowser for help on using the repository browser.