aboutsummaryrefslogtreecommitdiff
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
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>
-rw-r--r--coreutils/who.c44
-rw-r--r--loginutils/login.c3
-rw-r--r--networking/telnetd.c4
3 files changed, 32 insertions, 19 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)
diff --git a/loginutils/login.c b/loginutils/login.c
index b5e348b66..256c7c475 100644
--- a/loginutils/login.c
+++ b/loginutils/login.c
@@ -61,7 +61,7 @@ static void read_or_build_utent(struct utmp *utptr, int run_by_root)
61 61
62 /* First, try to find a valid utmp entry for this process. */ 62 /* First, try to find a valid utmp entry for this process. */
63 /* If there is one, just use it. */ 63 /* If there is one, just use it. */
64 while ((ut = getutent()) != NULL) 64 while ((ut = getutent()) != NULL) {
65 if (ut->ut_pid == pid && ut->ut_line[0] && ut->ut_id[0] 65 if (ut->ut_pid == pid && ut->ut_line[0] && ut->ut_id[0]
66 && (ut->ut_type == LOGIN_PROCESS || ut->ut_type == USER_PROCESS) 66 && (ut->ut_type == LOGIN_PROCESS || ut->ut_type == USER_PROCESS)
67 ) { 67 ) {
@@ -70,6 +70,7 @@ static void read_or_build_utent(struct utmp *utptr, int run_by_root)
70 memset(utptr->ut_host, 0, sizeof(utptr->ut_host)); 70 memset(utptr->ut_host, 0, sizeof(utptr->ut_host));
71 return; 71 return;
72 } 72 }
73 }
73 74
74// Why? Do we require non-root to exec login from another 75// Why? Do we require non-root to exec login from another
75// former login process (e.g. login shell)? Some login's have 76// former login process (e.g. login shell)? Some login's have
diff --git a/networking/telnetd.c b/networking/telnetd.c
index dd59de9d4..cab94f0f7 100644
--- a/networking/telnetd.c
+++ b/networking/telnetd.c
@@ -74,11 +74,11 @@ struct globals {
74 string of characters fit for the terminal. Do this by packing 74 string of characters fit for the terminal. Do this by packing
75 all characters meant for the terminal sequentially towards the end of buf. 75 all characters meant for the terminal sequentially towards the end of buf.
76 76
77 Return a pointer to the beginning of the characters meant for the terminal. 77 Return a pointer to the beginning of the characters meant for the terminal
78 and make *num_totty the number of characters that should be sent to 78 and make *num_totty the number of characters that should be sent to
79 the terminal. 79 the terminal.
80 80
81 Note - If an IAC (3 byte quantity) starts before (bf + len) but extends 81 Note - if an IAC (3 byte quantity) starts before (bf + len) but extends
82 past (bf + len) then that IAC will be left unprocessed and *processed 82 past (bf + len) then that IAC will be left unprocessed and *processed
83 will be less than len. 83 will be less than len.
84 84