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
break;
}
+ if (params->action == ACTION_SET && params->prio == '\0')
+ params->prio = '*';
+
return true;
failure:
*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
}
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;
}