diff options
author | Dave Reisner <dreisner@archlinux.org> | 2012-09-22 12:50:27 -0400 |
---|---|---|
committer | Dave Reisner <dreisner@archlinux.org> | 2012-09-24 08:38:03 -0400 |
commit | 585314e84c1a2e8941309874088963985e063213 (patch) | |
tree | bdedaa2f07bc52ff5b02d6f51b3dde8f3e727d52 | |
parent | dd144c63e285e35149f80b1a41af548ad040c037 (diff) |
journalctl: reset cached column count on SIGWINCH
This requires a little bit of tip-toeing around to explicitly avoid
touching the environment from a sig handler. Instead, simply create a
function to reset the var to its "unset" state, allowing the next call
to columns() to recalculate and cache the new value.
-rw-r--r-- | src/journal/journalctl.c | 2 | ||||
-rw-r--r-- | src/shared/util.c | 8 | ||||
-rw-r--r-- | src/shared/util.h | 1 |
3 files changed, 10 insertions, 1 deletions
diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 6b580d4307..e491c27662 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -29,6 +29,7 @@ #include <sys/poll.h> #include <time.h> #include <getopt.h> +#include <signal.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <linux/fs.h> @@ -175,6 +176,7 @@ static int parse_argv(int argc, char *argv[]) { case 'f': arg_follow = true; + signal(SIGWINCH, columns_cache_reset); break; case 'o': diff --git a/src/shared/util.c b/src/shared/util.c index 97f766c33c..e0156868ad 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -70,6 +70,7 @@ int saved_argc = 0; char **saved_argv = NULL; +int parsed_columns = 0; size_t page_size(void) { static __thread size_t pgsz = 0; @@ -3740,7 +3741,7 @@ int fd_columns(int fd) { } static unsigned columns_cached(bool cached) { - static __thread int parsed_columns = 0, env_columns = -1; + static __thread int env_columns = -1; const char *e; if (_likely_(parsed_columns > 0 && cached)) @@ -3776,6 +3777,11 @@ unsigned columns_uncached(void) { return columns_cached(false); } +/* intended to be used as a SIGWINCH sighandler */ +void columns_cache_reset(int signum) { + parsed_columns = 0; +} + int fd_lines(int fd) { struct winsize ws; zero(ws); diff --git a/src/shared/util.h b/src/shared/util.h index e1d4735ee3..61b88a8b2e 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -385,6 +385,7 @@ int status_welcome(void); int fd_columns(int fd); unsigned columns(void); unsigned columns_uncached(void); +void columns_cache_reset(int _unused_ signum); int fd_lines(int fd); unsigned lines(void); |