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 Workervoid 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