From b32f24813369a9ef6ec8b7f7b5fb06b1997327f3 Mon Sep 17 00:00:00 2001 From: Maciej Slodczyk Date: Wed, 28 Nov 2018 15:54:44 +0100 Subject: [PATCH] dlogctl: allow empty priority when printing limits Change-Id: If2ed606bc3f99ba03cb87974f5ec7e09a2c3121b Signed-off-by: Maciej Slodczyk --- src/logctl/logctl.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 75 insertions(+), 8 deletions(-) diff --git a/src/logctl/logctl.c b/src/logctl/logctl.c index 678068e..905b491 100644 --- a/src/logctl/logctl.c +++ b/src/logctl/logctl.c @@ -43,7 +43,7 @@ bool parse_options(int argc, const char **argv, struct parsed_params *params, in assert(exit_value); params->tag = "*"; - params->prio = '*'; + params->prio = '\0'; params->plog_buffers_bitset = 0; bool use_global_action = true; // if neither tag not priority is specified @@ -143,6 +143,9 @@ bool parse_options(int argc, const char **argv, struct parsed_params *params, in break; } + if (params->action == ACTION_SET && params->prio == '\0') + params->prio = '*'; + return true; failure: @@ -398,13 +401,8 @@ static void print_limit(int limit, const char *tag, char prio, bool *shadowed, b *shadowed = true; } -int handle_get(const struct parsed_params *params, char *config_path, struct log_config *conf) +static void get_limits(const struct parsed_params *params, char *config_path, struct log_config *conf) { - if (!__log_limiter_create(conf)) { - ERR("error creating limiter\n"); - return EXIT_FAILURE; - } - struct limiter_limits lims_static = __log_limiter_get_limits(params->tag, params->prio); log_config_read_file(conf, config_path); // not an error on failure - config still valid if missing, static rules apply @@ -426,9 +424,78 @@ int handle_get(const struct parsed_params *params, char *config_path, struct log } print_limit(lims_dynamic.global, "*", '*', &shadowed, true); print_limit(lims_static.global, "*", '*', &shadowed, false); +} + +struct prio_applies_to { + char prios[DLOG_PRIO_MAX]; + size_t count; + struct limiter_limits lims[DLOG_PRIO_MAX]; +}; + +static void print_limits_for_prio(const struct parsed_params *params, const char prio[], struct prio_applies_to *applies, size_t prio_idx, bool *shadowed, int dynamic) +{ + assert(prio_idx < DLOG_PRIO_MAX); + + if (strcmp(params->tag, "*") && prio[prio_idx] != '*') { + if (applies->lims[prio_idx].tag_and_prio == -1) + applies->prios[applies->count++] = prio[prio_idx]; + else { + print_limit(applies->lims[prio_idx].tag_and_prio, params->tag, prio[prio_idx], shadowed, dynamic); + *shadowed = true; + } + } else if (prio[prio_idx] == '*') { + if (applies->count == 0) + *shadowed = true; + else if (applies->count != NELEMS(applies->prios) - 2) { + printf("[applies to "); + for (size_t i = 0; i < applies->count; i++) + printf("%c%c ", applies->prios[i], (i == applies->count-1) ? ']' : ','); + } + print_limit(applies->lims[prio_idx].tag, params->tag, '*', shadowed, dynamic); + *shadowed = true; + } else if (applies->lims[prio_idx].prio == -1) + applies->prios[applies->count++] = prio[prio_idx]; + else { + print_limit(applies->lims[prio_idx].prio, "*", prio[prio_idx], shadowed, dynamic); + *shadowed = true; + } +} + +static void get_prio_limits(const struct parsed_params *params, char *config_path, struct log_config *conf) +{ + static const char prio_list[] = {'V', 'D', 'I', 'W', 'E', 'F' , 'S' , '*'}; + struct prio_applies_to applies_dynamic = { .count = 0 }; + struct prio_applies_to applies_static = { .count = 0 }; + + for (size_t i = 0; i < NELEMS(prio_list); i++) + applies_static.lims[i] = __log_limiter_get_limits(params->tag, prio_list[i]); + + log_config_read_file(conf, config_path); // not an error on failure - config still valid if missing, static rules apply + __log_limiter_update(conf); + + for (size_t i = 0; i < NELEMS(prio_list); i++) { + applies_dynamic.lims[i] = __log_limiter_get_limits(params->tag, prio_list[i]); + bool shadowed = false; + + print_limits_for_prio(params, prio_list, &applies_dynamic, i, &shadowed, true); + print_limits_for_prio(params, prio_list, &applies_static, i, &shadowed, false); + } +} - __log_limiter_destroy(); +int handle_get(const struct parsed_params *params, char *config_path, struct log_config *conf) +{ + if (!__log_limiter_create(conf)) { + ERR("error creating limiter\n"); + return EXIT_FAILURE; + } + + if (params->prio == '\0') + get_prio_limits(params, config_path, conf); + else + get_limits(params, config_path, conf); + + __log_limiter_destroy(); return EXIT_SUCCESS; } -- 2.7.4