dlogctl: allow empty priority when printing limits 61/194061/8
authorMaciej Slodczyk <m.slodczyk2@partner.samsung.com>
Wed, 28 Nov 2018 14:54:44 +0000 (15:54 +0100)
committerMaciej Slodczyk <m.slodczyk2@partner.samsung.com>
Mon, 10 Dec 2018 12:56:45 +0000 (13:56 +0100)
Change-Id: If2ed606bc3f99ba03cb87974f5ec7e09a2c3121b
Signed-off-by: Maciej Slodczyk <m.slodczyk2@partner.samsung.com>
src/logctl/logctl.c

index 678068e..905b491 100644 (file)
@@ -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;
 }