From 9b3b6e24019b81d8bd4d5e522b688e20ed7e209c Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 14 Dec 2022 18:00:54 +0100 Subject: [PATCH] pipewire: support global log level in PIPEWIRE_DEBUG Add support for PIPEWIRE_DEBUG=3,foo.bar:5 to set a global log level in addition to specific topics. Previously it would have to be done with *:3,foo.bar:5, which would not really set a global level but all topics to the custom level of 3. --- src/pipewire/pipewire.c | 45 ++++++++++++++++++++++++----------------- test/test-logger.c | 8 +++++--- 2 files changed, 32 insertions(+), 21 deletions(-) diff --git a/src/pipewire/pipewire.c b/src/pipewire/pipewire.c index fd1b45e6d..eb8600636 100644 --- a/src/pipewire/pipewire.c +++ b/src/pipewire/pipewire.c @@ -487,22 +487,30 @@ static struct spa_log *load_journal_logger(struct support *support, } #endif -static enum spa_log_level -parse_log_level(const char *str) +static bool +parse_log_level(const char *str, enum spa_log_level *l) { - enum spa_log_level l = SPA_LOG_LEVEL_NONE; - switch(str[0]) { - case 'X': l = SPA_LOG_LEVEL_NONE; break; - case 'E': l = SPA_LOG_LEVEL_ERROR; break; - case 'W': l = SPA_LOG_LEVEL_WARN; break; - case 'I': l = SPA_LOG_LEVEL_INFO; break; - case 'D': l = SPA_LOG_LEVEL_DEBUG; break; - case 'T': l = SPA_LOG_LEVEL_TRACE; break; + uint32_t lvl; + if (strlen(str) == 1) { + switch(str[0]) { + case 'X': lvl = SPA_LOG_LEVEL_NONE; break; + case 'E': lvl = SPA_LOG_LEVEL_ERROR; break; + case 'W': lvl = SPA_LOG_LEVEL_WARN; break; + case 'I': lvl = SPA_LOG_LEVEL_INFO; break; + case 'D': lvl = SPA_LOG_LEVEL_DEBUG; break; + case 'T': lvl = SPA_LOG_LEVEL_TRACE; break; default: - l = atoi(str); - break; + goto check_int; + } + } else { +check_int: + if (!spa_atou32(str, &lvl, 0)) + return false; + if (lvl > SPA_LOG_LEVEL_TRACE) + return false; } - return l; + *l = lvl; + return true; } static char * @@ -515,6 +523,7 @@ parse_pw_debug_env(void) char json[1024] = {0}; char *pos = json; char *end = pos + sizeof(json) - 1; + enum spa_log_level lvl; str = getenv("PIPEWIRE_DEBUG"); @@ -530,7 +539,8 @@ parse_pw_debug_env(void) /* We only have single-digit log levels, so any single-character * string is of the form PIPEWIRE_DEBUG= */ if (slen == 1) { - pw_log_set_level(parse_log_level(str)); + if (parse_log_level(str, &lvl)) + pw_log_set_level(lvl); goto out; } @@ -541,15 +551,14 @@ parse_pw_debug_env(void) int n_tok; char **tok; char *pattern; - enum spa_log_level lvl; tok = pw_split_strv(tokens[i], ":", 2, &n_tok); - if (n_tok == 2) { + if (n_tok == 2 && parse_log_level(tok[1], &lvl)) { pattern = tok[0]; - lvl = parse_log_level(tok[1]); - pos += spa_scnprintf(pos, end - pos, "{ %s = %d },", pattern, lvl); + } else if (n_tok == 1 && parse_log_level(tok[0], &lvl)) { + pw_log_set_level(lvl); } else { pw_log_warn("Ignoring invalid format in PIPEWIRE_DEBUG: '%s'\n", tokens[i]); } diff --git a/test/test-logger.c b/test/test-logger.c index 5aca7d199..b40445a3e 100644 --- a/test/test-logger.c +++ b/test/test-logger.c @@ -350,8 +350,10 @@ PWTEST(logger_debug_env_invalid) "invalid value", "*:5,some invalid value", "*:W,foo.bar:3,invalid:", - "*:W,1,foo.bar:D", - "*:W,D,foo.bar:3", + "*:W,2,foo.bar:Q", + "*:W,7,foo.bar:D", + "*:W,Q,foo.bar:5", + "*:W,D,foo.bar:8", }; pwtest_int_lt(which, SPA_N_ELEMENTS(envvars)); @@ -644,7 +646,7 @@ PWTEST_SUITE(logger) PWTEST_ARG_RANGE, SPA_LOG_LEVEL_NONE, SPA_LOG_LEVEL_TRACE + 1, PWTEST_NOARG); pwtest_add(logger_debug_env_invalid, - PWTEST_ARG_RANGE, 0, 5, /* see the test */ + PWTEST_ARG_RANGE, 0, 7, /* see the test */ PWTEST_NOARG); pwtest_add(logger_topics, PWTEST_NOARG); pwtest_add(logger_journal, PWTEST_NOARG);