From 620cddfc13fb2b2c9f1086ab201db5db3e25be1f Mon Sep 17 00:00:00 2001
From: Dave Reisner <d@falconindy.com>
Date: Mon, 13 Jun 2011 22:23:49 -0400
Subject: 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>
---
 src/pacman/callback.c |  4 ++--
 src/pacman/util.c     | 24 ++++++++++++++++--------
 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);
-- 
cgit v1.2.3-2-g168b