X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Fcommon%2Feal_common_log.c;h=c714a4bd26c5f4a70f4d41a9177ab8330cfcb68d;hb=4104b2a4854473798de0d03c86793518567deba6;hp=c04bcde87853850004ca52c5c66f956f16279816;hpb=fa20768905c3a8b36ebb9e828e1643dd86f85f8b;p=dpdk.git diff --git a/lib/librte_eal/common/eal_common_log.c b/lib/librte_eal/common/eal_common_log.c index c04bcde878..c714a4bd26 100644 --- a/lib/librte_eal/common/eal_common_log.c +++ b/lib/librte_eal/common/eal_common_log.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -28,6 +29,8 @@ struct rte_eal_opt_loglevel { TAILQ_ENTRY(rte_eal_opt_loglevel) next; /** Compiled regular expression obtained from the option */ regex_t re_match; + /** Glob match string option */ + char *pattern; /** Log level value obtained from the option */ uint32_t level; }; @@ -104,9 +107,9 @@ rte_log_set_level(uint32_t type, uint32_t level) return 0; } -/* set level */ +/* set log level by regular expression */ int -rte_log_set_level_regexp(const char *pattern, uint32_t level) +rte_log_set_level_regexp(const char *regex, uint32_t level) { regex_t r; size_t i; @@ -114,7 +117,7 @@ rte_log_set_level_regexp(const char *pattern, uint32_t level) if (level > RTE_LOG_DEBUG) return -1; - if (regcomp(&r, pattern, 0) != 0) + if (regcomp(&r, regex, 0) != 0) return -1; for (i = 0; i < rte_logs.dynamic_types_len; i++) { @@ -131,24 +134,30 @@ rte_log_set_level_regexp(const char *pattern, uint32_t level) } /* - * Save the type (regexp string) and the loglevel - * in the global storage so that it could be used - * to configure dynamic logtypes which are absent - * at the moment of EAL option processing but may - * be registered during runtime. + * Save the type string and the loglevel for later dynamic + * logtypes which may register later. */ -int rte_log_save_regexp(const char *regex, int tmp) +static int rte_log_save_level(int priority, + const char *regex, const char *pattern) { - struct rte_eal_opt_loglevel *opt_ll; + struct rte_eal_opt_loglevel *opt_ll = NULL; opt_ll = malloc(sizeof(*opt_ll)); if (opt_ll == NULL) - return -1; - - if (regcomp(&opt_ll->re_match, regex, 0) != 0) goto fail; - opt_ll->level = tmp; + opt_ll->level = priority; + + if (regex) { + opt_ll->pattern = NULL; + if (regcomp(&opt_ll->re_match, regex, 0) != 0) + goto fail; + } else if (pattern) { + opt_ll->pattern = strdup(pattern); + if (opt_ll->pattern == NULL) + goto fail; + } else + goto fail; TAILQ_INSERT_HEAD(&opt_loglevel_list, opt_ll, next); return 0; @@ -157,6 +166,36 @@ fail: return -1; } +int rte_log_save_regexp(const char *regex, int tmp) +{ + return rte_log_save_level(tmp, regex, NULL); +} + +/* set log level based on glob (file match) pattern */ +int +rte_log_set_level_pattern(const char *pattern, uint32_t level) +{ + size_t i; + + if (level > RTE_LOG_DEBUG) + return -1; + + for (i = 0; i < rte_logs.dynamic_types_len; i++) { + if (rte_logs.dynamic_types[i].name == NULL) + continue; + + if (fnmatch(pattern, rte_logs.dynamic_types[i].name, 0) == 0) + rte_logs.dynamic_types[i].loglevel = level; + } + + return 0; +} + +int rte_log_save_pattern(const char *pattern, int priority) +{ + return rte_log_save_level(priority, NULL, pattern); +} + /* get the current loglevel for the message being processed */ int rte_log_cur_msg_loglevel(void) { @@ -244,8 +283,13 @@ rte_log_register_type_and_pick_level(const char *name, uint32_t level_def) if (opt_ll->level > RTE_LOG_DEBUG) continue; - if (regexec(&opt_ll->re_match, name, 0, NULL, 0) == 0) - level = opt_ll->level; + if (opt_ll->pattern) { + if (fnmatch(opt_ll->pattern, name, 0)) + level = opt_ll->level; + } else { + if (regexec(&opt_ll->re_match, name, 0, NULL, 0) == 0) + level = opt_ll->level; + } } rte_logs.dynamic_types[type].loglevel = level; @@ -291,9 +335,7 @@ static const struct logtype logtype_strings[] = { }; /* Logging should be first initializer (before drivers and bus) */ -RTE_INIT_PRIO(rte_log_init, LOG); -static void -rte_log_init(void) +RTE_INIT_PRIO(rte_log_init, LOG) { uint32_t i;