X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Futil.c;h=527a5800fec407d6cc096f66d22dc22cbfa6d7cf;hb=8481248b9fbddc6d5e6ff26eb23505ef13dc85f7;hp=50c4c08993e30f351ad1f2ffa1156564468a0297;hpb=6d0274f11547a0f11200bb82bf598a5a253e12cf;p=elogind.git diff --git a/src/shared/util.c b/src/shared/util.c index 50c4c0899..527a5800f 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -72,7 +72,7 @@ int saved_argc = 0; char **saved_argv = NULL; -static int parsed_columns = 0; +static volatile unsigned cached_columns = 0; size_t page_size(void) { static __thread size_t pgsz = 0; @@ -2175,28 +2175,25 @@ int read_one_char(FILE *f, char *ret, usec_t t, bool *need_nl) { } int ask(char *ret, const char *replies, const char *text, ...) { - bool on_tty; assert(ret); assert(replies); assert(text); - on_tty = isatty(STDOUT_FILENO); - for (;;) { va_list ap; char c; int r; bool need_nl = true; - if (on_tty) + if (on_tty()) fputs(ANSI_HIGHLIGHT_ON, stdout); va_start(ap, text); vprintf(text, ap); va_end(ap); - if (on_tty) + if (on_tty()) fputs(ANSI_HIGHLIGHT_OFF, stdout); fflush(stdout); @@ -3793,46 +3790,40 @@ int fd_columns(int fd) { return ws.ws_col; } -static unsigned columns_cached(bool cached) { - static __thread int env_columns = -1; +unsigned columns(void) { const char *e; + unsigned c; - if (_likely_(parsed_columns > 0 && cached)) - return parsed_columns; + if (_likely_(cached_columns > 0)) + return cached_columns; - if (_unlikely_(env_columns == -1)) { - e = getenv("COLUMNS"); - if (e) - env_columns = atoi(e); - else - env_columns = 0; - } - - if (env_columns > 0) { - parsed_columns = env_columns; - return parsed_columns; - } + c = 0; + e = getenv("COLUMNS"); + if (e) + safe_atou(e, &c); - if (parsed_columns <= 0 || !cached) - parsed_columns = fd_columns(STDOUT_FILENO); + if (c <= 0) + c = fd_columns(STDOUT_FILENO); - if (parsed_columns <= 0) - parsed_columns = 80; + if (c <= 0) + c = 80; - return parsed_columns; + cached_columns = c; + return c; } -unsigned columns(void) { - return columns_cached(true); +/* intended to be used as a SIGWINCH sighandler */ +void columns_cache_reset(int signum) { + cached_columns = 0; } -unsigned columns_uncached(void) { - return columns_cached(false); -} +bool on_tty(void) { + static int cached_on_tty = -1; -/* intended to be used as a SIGWINCH sighandler */ -void columns_cache_reset(int signum) { - parsed_columns = 0; + if (_unlikely_(cached_on_tty < 0)) + cached_on_tty = isatty(STDOUT_FILENO) > 0; + + return cached_on_tty; } int fd_lines(int fd) { @@ -5929,7 +5920,7 @@ bool string_is_safe(const char *p) { assert(p); for (t = p; *t; t++) { - if (*t < ' ') + if (*t > 0 && *t < ' ') return false; if (strchr("\\\"\'", *t))