summaryrefslogtreecommitdiffstats
path: root/src/pacman/util.c
diff options
context:
space:
mode:
authorDave Reisner <d@falconindy.com>2011-06-14 04:23:49 +0200
committerDan McGee <dan@archlinux.org>2011-06-20 07:11:46 +0200
commit620cddfc13fb2b2c9f1086ab201db5db3e25be1f (patch)
tree71c145d9dbea2fd16a6cafc46053853a72667f29 /src/pacman/util.c
parent0f26e3aa5b91ffc0a5bef9a0f0bb9d40ec198407 (diff)
downloadpacman-620cddfc13fb2b2c9f1086ab201db5db3e25be1f.tar.gz
pacman-620cddfc13fb2b2c9f1086ab201db5db3e25be1f.tar.xz
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>
Diffstat (limited to 'src/pacman/util.c')
-rw-r--r--src/pacman/util.c24
1 files changed, 16 insertions, 8 deletions
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);