aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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