ls,ps,watch: measure terminal width on fd 0, not 1

This commit is contained in:
Denis Vlasenko 2007-08-09 08:27:24 +00:00
parent 501bfe2630
commit f893da875a
5 changed files with 9 additions and 7 deletions

View File

@ -811,7 +811,7 @@ int ls_main(int argc, char **argv)
#if ENABLE_FEATURE_AUTOWIDTH #if ENABLE_FEATURE_AUTOWIDTH
/* Obtain the terminal width */ /* 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... */ /* Go one less... */
terminal_width--; terminal_width--;
#endif #endif

View 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, extern int update_passwd(const char *filename, const char *username,
const char *new_pw); 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))); 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))); void ioctl_or_perror_and_die(int fd, int request, void *argp, const char *fmt,...) __attribute__ ((format (printf, 4, 5)));

View File

@ -612,7 +612,7 @@ void selinux_or_die(void)
/* It is perfectly ok to pass in a NULL for either width or for /* It is perfectly ok to pass in a NULL for either width or for
* height, in which case that value will not be set. */ * 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 }; struct winsize win = { 0, 0, 0, 0 };
int ret = ioctl(fd, TIOCGWINSZ, &win); int ret = ioctl(fd, TIOCGWINSZ, &win);

View File

@ -322,7 +322,7 @@ int ps_main(int argc, char **argv)
* and such large widths */ * and such large widths */
terminal_width = MAX_WIDTH; terminal_width = MAX_WIDTH;
if (isatty(1)) { if (isatty(1)) {
get_terminal_width_height(1, &terminal_width, NULL); get_terminal_width_height(0, &terminal_width, NULL);
if (--terminal_width > MAX_WIDTH) if (--terminal_width > MAX_WIDTH)
terminal_width = MAX_WIDTH; terminal_width = MAX_WIDTH;
} }
@ -364,7 +364,7 @@ int ps_main(int argc, char **argv)
if (w_count) { if (w_count) {
terminal_width = (w_count==1) ? 132 : MAX_WIDTH; terminal_width = (w_count==1) ? 132 : MAX_WIDTH;
} else { } else {
get_terminal_width_height(1, &terminal_width, NULL); get_terminal_width_height(0, &terminal_width, NULL);
/* Go one less... */ /* Go one less... */
if (--terminal_width > MAX_WIDTH) if (--terminal_width > MAX_WIDTH)
terminal_width = MAX_WIDTH; terminal_width = MAX_WIDTH;

View File

@ -28,7 +28,7 @@ int watch_main(int argc, char **argv)
{ {
unsigned opt; unsigned opt;
unsigned period = 2; unsigned period = 2;
unsigned cmdlen = 1; // 1 for terminal NUL unsigned cmdlen;
char *header = NULL; char *header = NULL;
char *cmd; char *cmd;
char *tmp; char *tmp;
@ -42,6 +42,7 @@ int watch_main(int argc, char **argv)
argv += optind; argv += optind;
p = argv; p = argv;
cmdlen = 1; // 1 for terminal NUL
while (*p) while (*p)
cmdlen += strlen(*p++) + 1; cmdlen += strlen(*p++) + 1;
tmp = cmd = xmalloc(cmdlen); tmp = cmd = xmalloc(cmdlen);
@ -58,7 +59,7 @@ int watch_main(int argc, char **argv)
char *thyme; char *thyme;
time_t t; time_t t;
get_terminal_width_height(STDOUT_FILENO, &width, 0); get_terminal_width_height(STDIN_FILENO, &width, 0);
header = xrealloc(header, width--); header = xrealloc(header, width--);
// '%-*s' pads header with spaces to the full width // '%-*s' pads header with spaces to the full width
snprintf(header, width, "Every %ds: %-*s", period, width, cmd); snprintf(header, width, "Every %ds: %-*s", period, width, cmd);