summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Reisner <dreisner@archlinux.org>2012-09-22 12:50:27 -0400
committerDave Reisner <dreisner@archlinux.org>2012-09-24 08:38:03 -0400
commit585314e84c1a2e8941309874088963985e063213 (patch)
treebdedaa2f07bc52ff5b02d6f51b3dde8f3e727d52
parentdd144c63e285e35149f80b1a41af548ad040c037 (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.c2
-rw-r--r--src/shared/util.c8
-rw-r--r--src/shared/util.h1
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);