get_terminal_width_height: do not pass insanely large values

This commit is contained in:
Denis Vlasenko 2006-10-27 09:03:24 +00:00
parent d3d004dd35
commit 621204bbf6
6 changed files with 33 additions and 23 deletions

View File

@ -58,7 +58,6 @@ int watch_main(int argc, char **argv)
time_t t; time_t t;
get_terminal_width_height(STDOUT_FILENO, &width, 0); get_terminal_width_height(STDOUT_FILENO, &width, 0);
if (width < 1) width = 1; // paranoia
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);

View File

@ -2039,7 +2039,7 @@ static void winch_sig(int sig ATTRIBUTE_UNUSED)
{ {
signal(SIGWINCH, winch_sig); signal(SIGWINCH, winch_sig);
if (ENABLE_FEATURE_VI_WIN_RESIZE) if (ENABLE_FEATURE_VI_WIN_RESIZE)
get_terminal_width_height(0, &columns, &rows); get_terminal_width_height(0, &columns, &rows);
new_screen(rows, columns); // get memory for virtual screen new_screen(rows, columns); // get memory for virtual screen
redraw(TRUE); // re-draw the screen redraw(TRUE); // re-draw the screen
} }

View File

@ -281,6 +281,8 @@ off_t fdlength(int fd)
if (ioctl(fd, BLKGETSIZE, &size) >= 0) return size*512; if (ioctl(fd, BLKGETSIZE, &size) >= 0) return size*512;
// FIXME: explain why lseek(SEEK_END) is not used here!
// If not, do a binary search for the last location we can read. (Some // If not, do a binary search for the last location we can read. (Some
// block devices don't do BLKGETSIZE right.) // block devices don't do BLKGETSIZE right.)
@ -382,7 +384,8 @@ DIR *xopendir(const char *path)
// Die with an error message if we can't daemonize. // Die with an error message if we can't daemonize.
void xdaemon(int nochdir, int noclose) void xdaemon(int nochdir, int noclose)
{ {
if (daemon(nochdir, noclose)) bb_perror_msg_and_die("daemon"); if (daemon(nochdir, noclose))
bb_perror_msg_and_die("daemon");
} }
#endif #endif
@ -416,23 +419,31 @@ void xstat(char *name, struct stat *stat_buf)
} }
/* 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(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);
if (!win.ws_row) {
char *s = getenv("LINES"); if (height) {
if (s) win.ws_row = atoi(s); if (!win.ws_row) {
char *s = getenv("LINES");
if (s) win.ws_row = atoi(s);
}
if (win.ws_row <= 1 || win.ws_row >= 30000)
win.ws_row = 24;
*height = (int) win.ws_row;
} }
if (win.ws_row <= 1) win.ws_row = 24;
if (!win.ws_col) { if (width) {
char *s = getenv("COLUMNS"); if (!win.ws_col) {
if (s) win.ws_col = atoi(s); char *s = getenv("COLUMNS");
if (s) win.ws_col = atoi(s);
}
if (win.ws_col <= 1 || win.ws_col >= 30000)
win.ws_col = 80;
*width = (int) win.ws_col;
} }
if (win.ws_col <= 1) win.ws_col = 80;
if (height) *height = (int) win.ws_row;
if (width) *width = (int) win.ws_col;
return ret; return ret;
} }

View File

@ -607,7 +607,7 @@ int telnet_main(int argc, char** argv)
#endif #endif
#ifdef CONFIG_FEATURE_TELNET_TTYPE #ifdef CONFIG_FEATURE_TELNET_TTYPE
ttype = getenv("TERM"); ttype = getenv("TERM");
#endif #endif
memset(&G, 0, sizeof G); memset(&G, 0, sizeof G);

View File

@ -676,7 +676,7 @@ getttywidth(void)
{ {
int width=0; int width=0;
get_terminal_width_height(0, &width, NULL); get_terminal_width_height(0, &width, NULL);
return (width); return width;
} }
static void static void

View File

@ -41,7 +41,7 @@ int ps_main(int argc, char **argv)
/* if w is given once, GNU ps sets the width to 132, /* if w is given once, GNU ps sets the width to 132,
* if w is given more than once, it is "unlimited" * if w is given more than once, it is "unlimited"
*/ */
if(w_count) { if (w_count) {
terminal_width = (w_count==1) ? 132 : INT_MAX; terminal_width = (w_count==1) ? 132 : INT_MAX;
} else { } else {
get_terminal_width_height(1, &terminal_width, NULL); get_terminal_width_height(1, &terminal_width, NULL);
@ -87,24 +87,24 @@ int ps_main(int argc, char **argv)
} }
else else
#endif #endif
if(p->rss == 0) if (p->rss == 0)
len = printf("%5d %-8s %s ", p->pid, p->user, p->state); len = printf("%5d %-8s %s ", p->pid, p->user, p->state);
else else
len = printf("%5d %-8s %6ld %s ", p->pid, p->user, p->rss, p->state); len = printf("%5d %-8s %6ld %s ", p->pid, p->user, p->rss, p->state);
i = terminal_width-len; i = terminal_width-len;
if(namecmd && namecmd[0]) { if (namecmd && namecmd[0]) {
if(i < 0) if (i < 0)
i = 0; i = 0;
if(strlen(namecmd) > (size_t)i) if (strlen(namecmd) > (size_t)i)
namecmd[i] = 0; namecmd[i] = 0;
printf("%s\n", namecmd); printf("%s\n", namecmd);
} else { } else {
namecmd = p->short_cmd; namecmd = p->short_cmd;
if(i < 2) if (i < 2)
i = 2; i = 2;
if(strlen(namecmd) > ((size_t)i-2)) if (strlen(namecmd) > ((size_t)i-2))
namecmd[i-2] = 0; namecmd[i-2] = 0;
printf("[%s]\n", namecmd); printf("[%s]\n", namecmd);
} }