aboutsummaryrefslogtreecommitdiff
path: root/coreutils/who.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2010-04-04 23:45:09 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2010-04-04 23:45:09 +0200
commit4c721049c3114c946848fbbd38d6180aa7af537d (patch)
tree3355d5721cd131e5526caa3a47a517c3586d3ade /coreutils/who.c
parentf8fcc184b6e05cbf5f88aa4f4e716e137a69f97e (diff)
downloadbusybox-w32-4c721049c3114c946848fbbd38d6180aa7af537d.tar.gz
busybox-w32-4c721049c3114c946848fbbd38d6180aa7af537d.tar.bz2
busybox-w32-4c721049c3114c946848fbbd38d6180aa7af537d.zip
who: fix attempts to open '/dev/dev/ttyX'; make columns a bit wider, add -H
function old new delta who_main 292 363 +71 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'coreutils/who.c')
-rw-r--r--coreutils/who.c44
1 files changed, 28 insertions, 16 deletions
diff --git a/coreutils/who.c b/coreutils/who.c
index 85a0025c3..dfbb4c046 100644
--- a/coreutils/who.c
+++ b/coreutils/who.c
@@ -42,35 +42,47 @@ static void idle_string(char *str6, time_t t)
42int who_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 42int who_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
43int who_main(int argc UNUSED_PARAM, char **argv) 43int who_main(int argc UNUSED_PARAM, char **argv)
44{ 44{
45 char str6[6];
46 struct utmp *ut; 45 struct utmp *ut;
47 struct stat st;
48 char *name;
49 unsigned opt; 46 unsigned opt;
50 47
51 opt_complementary = "=0"; 48 opt_complementary = "=0";
52 opt = getopt32(argv, "a"); 49 opt = getopt32(argv, "aH");
50 if (opt & 2) // -H
51 printf("USER\t\tTTY\t\tIDLE\tTIME\t\t HOST\n");
53 52
54 setutent(); 53 setutent();
55 printf("USER TTY IDLE TIME HOST\n");
56 while ((ut = getutent()) != NULL) { 54 while ((ut = getutent()) != NULL) {
57 if (ut->ut_user[0] && (opt || ut->ut_type == USER_PROCESS)) { 55 if (ut->ut_user[0]
58 time_t tmp; 56 && ((opt & 1) || ut->ut_type == USER_PROCESS)
59 /* ut->ut_line is device name of tty - "/dev/" */ 57 ) {
60 name = concat_path_file("/dev", ut->ut_line); 58 char str6[6];
59 char name[sizeof("/dev/") + sizeof(ut->ut_line) + 1];
60 struct stat st;
61 time_t seconds;
62
61 str6[0] = '?'; 63 str6[0] = '?';
62 str6[1] = '\0'; 64 str6[1] = '\0';
65 strcpy(name, "/dev/");
66 safe_strncpy(ut->ut_line[0] == '/' ? name : name + sizeof("/dev/")-1,
67 ut->ut_line,
68 sizeof(ut->ut_line)+1
69 );
63 if (stat(name, &st) == 0) 70 if (stat(name, &st) == 0)
64 idle_string(str6, st.st_atime); 71 idle_string(str6, st.st_atime);
65 /* manpages say ut_tv.tv_sec *is* time_t, 72 /* manpages say ut_tv.tv_sec *is* time_t,
66 * but some systems have it wrong */ 73 * but some systems have it wrong */
67 tmp = ut->ut_tv.tv_sec; 74 seconds = ut->ut_tv.tv_sec;
68 /* 15 chars for time: Nov 10 19:33:20 */ 75 /* How wide time field can be?
69 printf("%-10s %-8s %-9s %-15.15s %s\n", 76 * "Nov 10 19:33:20": 15 chars
70 ut->ut_user, ut->ut_line, str6, 77 * "2010-11-10 19:33": 16 chars
71 ctime(&tmp) + 4, ut->ut_host); 78 */
72 if (ENABLE_FEATURE_CLEAN_UP) 79 printf("%-15.*s %-15.*s %-7s %-16.16s %.*s\n",
73 free(name); 80 (int)sizeof(ut->ut_user), ut->ut_user,
81 (int)sizeof(ut->ut_line), ut->ut_line,
82 str6,
83 ctime(&seconds) + 4,
84 (int)sizeof(ut->ut_host), ut->ut_host
85 );
74 } 86 }
75 } 87 }
76 if (ENABLE_FEATURE_CLEAN_UP) 88 if (ENABLE_FEATURE_CLEAN_UP)