diff options
author | Dave Reisner <d@falconindy.com> | 2011-06-13 22:23:49 -0400 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2011-06-20 00:11:46 -0500 |
commit | 620cddfc13fb2b2c9f1086ab201db5db3e25be1f (patch) | |
tree | 71c145d9dbea2fd16a6cafc46053853a72667f29 | |
parent | 0f26e3aa5b91ffc0a5bef9a0f0bb9d40ec198407 (diff) |
pacman/util.c: support terminals with unknown width
Add detection for stdout being attached to a tty device. When this check
fails, return a default width of 0, which callers interpret to mean
"don't wrap". Conversely, when our term ioctl suceeds but returns 0, we
interpret this to mean a tty with an unknown width (e.g., a serial
console), in which case we default to a sane value of 80.
Signed-off-by: Dave Reisner <d@falconindy.com>
-rw-r--r-- | src/pacman/callback.c | 4 | ||||
-rw-r--r-- | src/pacman/util.c | 24 | ||||
-rw-r--r-- | src/pacman/util.h | 2 |
3 files changed, 19 insertions, 11 deletions
diff --git a/src/pacman/callback.c b/src/pacman/callback.c index 4ac3b56b..66b14cdd 100644 --- a/src/pacman/callback.c +++ b/src/pacman/callback.c @@ -355,7 +355,7 @@ void cb_trans_progress(pmtransprog_t event, const char *pkgname, int percent, int len, wclen, wcwid, padwid; wchar_t *wcstr; - const int cols = getcols(0); + const int cols = getcols(); if(config->noprogressbar || cols == 0) { return; @@ -504,7 +504,7 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total) const char *rate_label, *xfered_label; int file_percent = 0, total_percent = 0; - const int cols = getcols(0); + const int cols = getcols(); if(config->noprogressbar || cols == 0 || file_total == -1) { if(file_xfered == 0) { diff --git a/src/pacman/util.c b/src/pacman/util.c index 5d666e21..66f127c6 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -117,20 +117,28 @@ static int flush_term_input(void) { } /* gets the current screen column width */ -int getcols(int def) +int getcols() { + int termwidth = -1; + const int default_tty = 80; + const int default_notty = 0; + + if(!isatty(fileno(stdout))) { + return default_notty; + } + #ifdef TIOCGSIZE struct ttysize win; if(ioctl(1, TIOCGSIZE, &win) == 0) { - return win.ts_cols; + termwidth = win.ts_cols; } #elif defined(TIOCGWINSZ) struct winsize win; if(ioctl(1, TIOCGWINSZ, &win) == 0) { - return win.ws_col; + termwidth = win.ws_col; } #endif - return def; + return termwidth <= 0 ? default_tty : termwidth; } /* does the same thing as 'rm -rf' */ @@ -226,7 +234,7 @@ void indentprint(const char *str, int indent) wchar_t *wcstr; const wchar_t *p; int len, cidx; - const int cols = getcols(0); + const int cols = getcols(); if(!str) { return; @@ -516,8 +524,8 @@ static alpm_list_t *table_create_format(const alpm_list_t *header, alpm_list_free(longest_strs); /* return NULL if terminal is not wide enough */ - if(totalwidth > getcols(80)) { - pm_fprintf(stderr, PM_LOG_WARNING, _("insufficient columns available for table display\n")); + if(totalwidth > getcols()) { + fprintf(stderr, _("insufficient columns available for table display\n")); FREELIST(formats); return NULL; } @@ -578,7 +586,7 @@ void list_display(const char *title, const alpm_list_t *list) if(!list) { printf("%s\n", _("None")); } else { - const int maxcols = getcols(0); + const int maxcols = getcols(); int cols = len; const char *str = alpm_list_getdata(list); printf("%s", str); diff --git a/src/pacman/util.h b/src/pacman/util.h index 95c1ce92..d8ae7d80 100644 --- a/src/pacman/util.h +++ b/src/pacman/util.h @@ -42,7 +42,7 @@ int trans_init(pmtransflag_t flags); int trans_release(void); int needs_root(void); -int getcols(int def); +int getcols(void); int rmrf(const char *path); const char *mbasename(const char *path); char *mdirname(const char *path); |