From c1f742d7750a14b680d2ceb2c75d952ccb53585d Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Wed, 1 Jun 2011 13:28:00 -0500 Subject: Ensure list_display works on outputs of unknown width If getcols() returns 0, we were getting stuck before in a loop of no return. Teach getcols() to take a default value to return if the width is unknown, and use this everywhere as appropriate. Also make a few other cleanups while diagnosing this issue, such as const-ifying some variables. Noticed-by: Dave Reisner Signed-off-by: Dan McGee --- src/pacman/callback.c | 18 +++++++++++------- src/pacman/util.c | 20 +++++++++----------- src/pacman/util.h | 2 +- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/pacman/callback.c b/src/pacman/callback.c index 5edcc966..46ff2e88 100644 --- a/src/pacman/callback.c +++ b/src/pacman/callback.c @@ -351,7 +351,9 @@ void cb_trans_progress(pmtransprog_t event, const char *pkgname, int percent, int len, wclen, wcwid, padwid; wchar_t *wcstr; - if(config->noprogressbar) { + const int cols = getcols(0); + + if(config->noprogressbar || cols == 0) { return; } @@ -397,7 +399,7 @@ void cb_trans_progress(pmtransprog_t event, const char *pkgname, int percent, return; } - infolen = getcols() * 6 / 10; + infolen = cols * 6 / 10; if (infolen < 50) { infolen = 50; } @@ -454,7 +456,7 @@ void cb_trans_progress(pmtransprog_t event, const char *pkgname, int percent, free(wcstr); /* call refactored fill progress function */ - fill_progress(percent, percent, getcols() - infolen); + fill_progress(percent, percent, cols - infolen); if(percent == 100) { alpm_list_t *i = NULL; @@ -497,7 +499,9 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total) int file_percent = 0, total_percent = 0; char rate_size = 'K', xfered_size = 'K'; - if(config->noprogressbar || file_total == -1) { + const int cols = getcols(0); + + if(config->noprogressbar || cols == 0 || file_total == -1) { if(file_xfered == 0) { printf(_("downloading %s...\n"), filename); fflush(stdout); @@ -505,7 +509,7 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total) return; } - infolen = getcols() * 6 / 10; + infolen = cols * 6 / 10; if (infolen < 50) { infolen = 50; } @@ -662,9 +666,9 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total) free(wcfname); if(totaldownload) { - fill_progress(file_percent, total_percent, getcols() - infolen); + fill_progress(file_percent, total_percent, cols - infolen); } else { - fill_progress(file_percent, file_percent, getcols() - infolen); + fill_progress(file_percent, file_percent, cols - infolen); } return; } diff --git a/src/pacman/util.c b/src/pacman/util.c index 3d268031..508cc89f 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -101,7 +101,7 @@ int needs_root(void) } /* gets the current screen column width */ -int getcols(void) +int getcols(int def) { #ifdef TIOCGSIZE struct ttysize win; @@ -114,7 +114,7 @@ int getcols(void) return win.ws_col; } #endif - return 0; + return def; } /* does the same thing as 'rm -rf' */ @@ -209,14 +209,13 @@ void indentprint(const char *str, int indent) { wchar_t *wcstr; const wchar_t *p; - int len, cidx, cols; + int len, cidx; + const int cols = getcols(0); if(!str) { return; } - cols = getcols(); - /* if we're not a tty, print without indenting */ if(cols == 0) { printf("%s", str); @@ -425,8 +424,6 @@ static int string_length(const char *s) void string_display(const char *title, const char *string) { - int len = 0; - if(title) { printf("%s ", title); } @@ -434,7 +431,7 @@ void string_display(const char *title, const char *string) printf(_("None")); } else { /* compute the length of title + a space */ - len = string_length(title) + 1; + int len = string_length(title) + 1; indentprint(string, len); } printf("\n"); @@ -443,7 +440,7 @@ void string_display(const char *title, const char *string) void list_display(const char *title, const alpm_list_t *list) { const alpm_list_t *i; - int cols, len = 0; + int len = 0; if(title) { len = string_length(title) + 1; @@ -453,11 +450,12 @@ void list_display(const char *title, const alpm_list_t *list) if(!list) { printf("%s\n", _("None")); } else { + int cols; + const int maxcols = getcols(80); for(i = list, cols = len; i; i = alpm_list_next(i)) { char *str = alpm_list_getdata(i); int s = string_length(str); - int maxcols = getcols(); - if(maxcols > 0 && (cols + s + 2) >= maxcols) { + if(cols + s + 2 >= maxcols) { int j; cols = len; printf("\n"); diff --git a/src/pacman/util.h b/src/pacman/util.h index 234a631d..53176fae 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(void); +int getcols(int def); int rmrf(const char *path); const char *mbasename(const char *path); char *mdirname(const char *path); -- cgit v1.2.3-24-g4f1b From d63599719af6db4fa3e41b4129b4a5b1fef41cf8 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Thu, 2 Jun 2011 07:59:45 -0500 Subject: repo-add: anchor exclusion pattern when generating filelist Fixes FS#24534. Dotfiles, such as /etc/skel/.bash_profile, were not being included in generated files entries. bsdtar --exclude option supports anchors on the pattern, so using "^.*" instead of ".*" solves our problem and still excludes all root-level dotfiles (e.g. .PKGINFO). Signed-off-by: Dan McGee --- scripts/repo-add.sh.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/repo-add.sh.in b/scripts/repo-add.sh.in index dfc93974..02ab389c 100644 --- a/scripts/repo-add.sh.in +++ b/scripts/repo-add.sh.in @@ -292,7 +292,7 @@ db_write_entry() msg2 "$(gettext "Creating '%s' db entry...")" 'files' local files_path="$tmpdir/$pkgname-$pkgver/files" echo "%FILES%" >$files_path - bsdtar --exclude='.*' -tf "$pkgfile" >>$files_path + bsdtar --exclude='^.*' -tf "$pkgfile" >>$files_path fi # create a delta file -- cgit v1.2.3-24-g4f1b From 1744fe12d4b29eff681995441c9565403348aaa2 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Thu, 2 Jun 2011 16:33:43 -0500 Subject: 3.5.3 release preparation Signed-off-by: Dan McGee --- NEWS | 7 +++++++ configure.ac | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 99689e40..861f506a 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,12 @@ VERSION DESCRIPTION ----------------------------------------------------------------------------- +3.5.3 - segfault when creating lock in non-existent dir (FS#24292) + - segfault when uninstalling broken backed-up symlink (FS#24230) + - --print should not enable --noconfirm (FS#24287) + - fix default path substitution in documentation + - makepkg: quote variables that may contain spaces (FS#24002) + - repo-add: include dotfiles in filelists (FS#24534) + - minor translation updates: de, fi, sk 3.5.2 - ensure we show correct missing dependency info (FS#23424) - pacman usage/--help updates (FS#23433, FS#23369) - ensure stdout/stderr are flushed before prompts (FS#23492) diff --git a/configure.ac b/configure.ac index 52e375dc..c672c66c 100644 --- a/configure.ac +++ b/configure.ac @@ -42,12 +42,12 @@ AC_PREREQ(2.62) # pacman_version_micro += 1 m4_define([lib_current], [6]) -m4_define([lib_revision], [2]) +m4_define([lib_revision], [3]) m4_define([lib_age], [0]) m4_define([pacman_version_major], [3]) m4_define([pacman_version_minor], [5]) -m4_define([pacman_version_micro], [2]) +m4_define([pacman_version_micro], [3]) m4_define([pacman_version], [pacman_version_major.pacman_version_minor.pacman_version_micro]) -- cgit v1.2.3-24-g4f1b