xref: /aosp_15_r20/external/toybox/toys/posix/who.c (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
1*cf5a6c84SAndroid Build Coastguard Worker /* who.c - display who is on the system
2*cf5a6c84SAndroid Build Coastguard Worker  *
3*cf5a6c84SAndroid Build Coastguard Worker  * Copyright 2012 ProFUSION Embedded Systems
4*cf5a6c84SAndroid Build Coastguard Worker  *
5*cf5a6c84SAndroid Build Coastguard Worker  * by Luis Felipe Strano Moraes <[email protected]>
6*cf5a6c84SAndroid Build Coastguard Worker  *
7*cf5a6c84SAndroid Build Coastguard Worker  * See http://opengroup.org/onlinepubs/9699919799/utilities/who.html
8*cf5a6c84SAndroid Build Coastguard Worker  *
9*cf5a6c84SAndroid Build Coastguard Worker  * Posix says to support many options (-abdHlmpqrstTu) but this
10*cf5a6c84SAndroid Build Coastguard Worker  * isn't aimed at minicomputers with modem pools.
11*cf5a6c84SAndroid Build Coastguard Worker  *
12*cf5a6c84SAndroid Build Coastguard Worker  * TODO: -a doesn't know how to format other entries
13*cf5a6c84SAndroid Build Coastguard Worker 
14*cf5a6c84SAndroid Build Coastguard Worker USE_WHO(NEWTOY(who, "a", TOYFLAG_USR|TOYFLAG_BIN))
15*cf5a6c84SAndroid Build Coastguard Worker 
16*cf5a6c84SAndroid Build Coastguard Worker config WHO
17*cf5a6c84SAndroid Build Coastguard Worker   bool "who"
18*cf5a6c84SAndroid Build Coastguard Worker   default y
19*cf5a6c84SAndroid Build Coastguard Worker   help
20*cf5a6c84SAndroid Build Coastguard Worker     usage: who
21*cf5a6c84SAndroid Build Coastguard Worker 
22*cf5a6c84SAndroid Build Coastguard Worker     Print information about logged in users.
23*cf5a6c84SAndroid Build Coastguard Worker */
24*cf5a6c84SAndroid Build Coastguard Worker 
25*cf5a6c84SAndroid Build Coastguard Worker #define FOR_who
26*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
27*cf5a6c84SAndroid Build Coastguard Worker 
who_main(void)28*cf5a6c84SAndroid Build Coastguard Worker void who_main(void)
29*cf5a6c84SAndroid Build Coastguard Worker {
30*cf5a6c84SAndroid Build Coastguard Worker   struct utmpx *entry;
31*cf5a6c84SAndroid Build Coastguard Worker 
32*cf5a6c84SAndroid Build Coastguard Worker   setutxent();
33*cf5a6c84SAndroid Build Coastguard Worker   while ((entry = getutxent())) {
34*cf5a6c84SAndroid Build Coastguard Worker     if (FLAG(a) || entry->ut_type == USER_PROCESS) {
35*cf5a6c84SAndroid Build Coastguard Worker       time_t t = entry->ut_tv.tv_sec;
36*cf5a6c84SAndroid Build Coastguard Worker       struct tm *tm = localtime(&t);
37*cf5a6c84SAndroid Build Coastguard Worker 
38*cf5a6c84SAndroid Build Coastguard Worker       strftime(toybuf, sizeof(toybuf), "%F %H:%M", tm);
39*cf5a6c84SAndroid Build Coastguard Worker       printf("%s\t%s\t%s (%s)\n", entry->ut_user, entry->ut_line,
40*cf5a6c84SAndroid Build Coastguard Worker         toybuf, entry->ut_host);
41*cf5a6c84SAndroid Build Coastguard Worker     }
42*cf5a6c84SAndroid Build Coastguard Worker   }
43*cf5a6c84SAndroid Build Coastguard Worker   endutxent();
44*cf5a6c84SAndroid Build Coastguard Worker }
45