ls,ps,watch: measure terminal width on fd 0, not 1
authorDenis Vlasenko <vda.linux@googlemail.com>
Thu, 9 Aug 2007 08:27:24 +0000 (08:27 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Thu, 9 Aug 2007 08:27:24 +0000 (08:27 -0000)
coreutils/ls.c
include/libbb.h
libbb/xfuncs.c
procps/ps.c
procps/watch.c

index f47ec204c36e15ae4232cf7638d126e49729f603..920fad85e9656c5caee298c73aa0f4c4f6535e17 100644 (file)
@@ -811,7 +811,7 @@ int ls_main(int argc, char **argv)
 
 #if ENABLE_FEATURE_AUTOWIDTH
        /* Obtain the terminal width */
-       get_terminal_width_height(STDOUT_FILENO, &terminal_width, NULL);
+       get_terminal_width_height(STDIN_FILENO, &terminal_width, NULL);
        /* Go one less... */
        terminal_width--;
 #endif
index 546bbafc60c9b64488864f9e8782ce6519fef335..a14d6be4433e19ccc6601592b2d8a901eb258edf 100644 (file)
@@ -803,7 +803,8 @@ extern int crypt_make_salt(char *p, int cnt, int rnd);
 extern int update_passwd(const char *filename, const char *username,
                        const char *new_pw);
 
-int get_terminal_width_height(const int fd, int *width, int *height);
+/* NB: typically you want to pass fd 0, not 1. Think 'applet | grep something' */
+int get_terminal_width_height(int fd, int *width, int *height);
 
 int ioctl_or_perror(int fd, int request, void *argp, const char *fmt,...) __attribute__ ((format (printf, 4, 5)));
 void ioctl_or_perror_and_die(int fd, int request, void *argp, const char *fmt,...) __attribute__ ((format (printf, 4, 5)));
index 177247c6b33b5e56c33e83ac6d69bac5b4c98547..67c98664096c304ed3d228fac536b46b1116b0d1 100644 (file)
@@ -612,7 +612,7 @@ void selinux_or_die(void)
 
 /* It is perfectly ok to pass in a NULL for either width or for
  * height, in which case that value will not be set.  */
-int get_terminal_width_height(const int fd, int *width, int *height)
+int get_terminal_width_height(int fd, int *width, int *height)
 {
        struct winsize win = { 0, 0, 0, 0 };
        int ret = ioctl(fd, TIOCGWINSZ, &win);
index 50b6a6c94f7dc4b895c218fe675e3dd14b9be027..5150a08a2f77a191af4da2a5a5df6cc3595411db 100644 (file)
@@ -322,7 +322,7 @@ int ps_main(int argc, char **argv)
         * and such large widths */
        terminal_width = MAX_WIDTH;
        if (isatty(1)) {
-               get_terminal_width_height(1, &terminal_width, NULL);
+               get_terminal_width_height(0, &terminal_width, NULL);
                if (--terminal_width > MAX_WIDTH)
                        terminal_width = MAX_WIDTH;
        }
@@ -364,7 +364,7 @@ int ps_main(int argc, char **argv)
        if (w_count) {
                terminal_width = (w_count==1) ? 132 : MAX_WIDTH;
        } else {
-               get_terminal_width_height(1, &terminal_width, NULL);
+               get_terminal_width_height(0, &terminal_width, NULL);
                /* Go one less... */
                if (--terminal_width > MAX_WIDTH)
                        terminal_width = MAX_WIDTH;
index 2ad0564cd7c226d44d3396a699471b9160186d53..b2adcd5cee97db037ff15ffa5783ce68aef08606 100644 (file)
@@ -28,7 +28,7 @@ int watch_main(int argc, char **argv)
 {
        unsigned opt;
        unsigned period = 2;
-       unsigned cmdlen = 1; // 1 for terminal NUL
+       unsigned cmdlen;
        char *header = NULL;
        char *cmd;
        char *tmp;
@@ -42,6 +42,7 @@ int watch_main(int argc, char **argv)
        argv += optind;
 
        p = argv;
+       cmdlen = 1; // 1 for terminal NUL
        while (*p)
                cmdlen += strlen(*p++) + 1;
        tmp = cmd = xmalloc(cmdlen);
@@ -58,7 +59,7 @@ int watch_main(int argc, char **argv)
                        char *thyme;
                        time_t t;
 
-                       get_terminal_width_height(STDOUT_FILENO, &width, 0);
+                       get_terminal_width_height(STDIN_FILENO, &width, 0);
                        header = xrealloc(header, width--);
                        // '%-*s' pads header with spaces to the full width
                        snprintf(header, width, "Every %ds: %-*s", period, width, cmd);