diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index 0f115c25..e1f90398 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -1107,9 +1107,12 @@ int main(int argc, char *argv[]) cleanup(1); } - /* disable progressbar if the output is redirected */ if(!isatty(fileno(stdout))) { + /* disable progressbar if the output is redirected */ config->noprogressbar = 1; + } else { + /* install signal handler to update output width */ + install_winch_handler(); } /* Priority of options: diff --git a/src/pacman/sighandler.c b/src/pacman/sighandler.c index d488ecec..76f7e9d2 100644 --- a/src/pacman/sighandler.c +++ b/src/pacman/sighandler.c @@ -61,9 +61,6 @@ static void handler(int signum) /* a transaction is being interrupted, don't exit pacman yet. */ return; } - } else if(signum == SIGWINCH) { - columns_cache_reset(); - return; } /* SIGINT/SIGHUP: no committing transaction, release it now and then exit pacman */ alpm_unlock(config->handle); @@ -72,11 +69,27 @@ static void handler(int signum) _Exit(128 + signum); } +static void winch_handler(int signum) +{ + (void)signum; /* suppress unused variable warnings */ + columns_cache_reset(); +} + +void install_winch_handler(void) +{ + struct sigaction new_action; + new_action.sa_handler = winch_handler; + sigemptyset(&new_action.sa_mask); + new_action.sa_flags = SA_RESTART; + sigaction(SIGWINCH, &new_action, NULL); +} + void install_signal_handlers(void) { struct sigaction new_action; - const int signals[] = { SIGHUP, SIGINT, SIGSEGV, SIGWINCH }; + const int signals[] = { SIGHUP, SIGINT, SIGSEGV }; size_t i; + /* Set signal handlers */ /* Set up the structure to specify the new action. */ new_action.sa_handler = handler; diff --git a/src/pacman/sighandler.h b/src/pacman/sighandler.h index f7abc9ee..bcf7d88a 100644 --- a/src/pacman/sighandler.h +++ b/src/pacman/sighandler.h @@ -20,6 +20,7 @@ #ifndef _PM_SIGHANDLER_H #define _PM_SIGHANDLER_H +void install_winch_handler(void); void install_signal_handlers(void); #endif /* _PM_SIGHANDLER_H */