[systemd-commits] src/journal src/shared

Dave Reisner dreisner at kemper.freedesktop.org
Mon Sep 24 05:39:50 PDT 2012


 src/journal/journalctl.c |    2 ++
 src/shared/util.c        |    8 +++++++-
 src/shared/util.h        |    1 +
 3 files changed, 10 insertions(+), 1 deletion(-)

New commits:
commit 585314e84c1a2e8941309874088963985e063213
Author: Dave Reisner <dreisner at archlinux.org>
Date:   Sat Sep 22 12:50:27 2012 -0400

    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.

diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c
index 6b580d4..e491c27 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 97f766c..e015686 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 e1d4735..61b88a8 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);



More information about the systemd-commits mailing list