diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2010-05-14 02:42:15 +0800 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2010-05-14 02:42:15 +0800 |
commit | 7373109abc9829c49eabf26e951a0ec6647666ac (patch) | |
tree | f508489f955c15fc36376374072cfb8ce6a9e6de /libosmocore/src/logging.c | |
parent | c1cb5eb38d5199de9049c59dc080051deba7aa53 (diff) | |
parent | cf5cc5bb5b472f470eb9584a32dee3c38413f93a (diff) |
Merge branch 'master' into on-waves/mgcp
Diffstat (limited to 'libosmocore/src/logging.c')
-rw-r--r-- | libosmocore/src/logging.c | 78 |
1 files changed, 76 insertions, 2 deletions
diff --git a/libosmocore/src/logging.c b/libosmocore/src/logging.c index 508ccfd3e..e72a6e204 100644 --- a/libosmocore/src/logging.c +++ b/libosmocore/src/logging.c @@ -20,11 +20,16 @@ * */ +#include "../config.h" + #include <stdarg.h> #include <stdlib.h> #include <stdio.h> #include <string.h> + +#ifdef HAVE_STRINGS_H #include <strings.h> +#endif #include <time.h> #include <errno.h> @@ -53,6 +58,11 @@ int log_parse_level(const char *lvl) return get_string_value(loglevel_strs, lvl); } +const char *log_level_str(unsigned int lvl) +{ + return get_value_string(loglevel_strs, lvl); +} + int log_parse_category(const char *category) { int i; @@ -302,31 +312,46 @@ void log_set_category_filter(struct log_target *target, int category, target->categories[category].loglevel = level; } +/* since C89/C99 says stderr is a macro, we can safely do this! */ +#ifdef stderr static void _stderr_output(struct log_target *target, const char *log) { fprintf(target->tgt_stdout.out, "%s", log); fflush(target->tgt_stdout.out); } +#endif struct log_target *log_target_create(void) { struct log_target *target; + unsigned int i; target = talloc_zero(tall_log_ctx, struct log_target); if (!target) return NULL; INIT_LLIST_HEAD(&target->entry); - memcpy(target->categories, log_info->cat, - sizeof(struct log_category)*log_info->num_cat); + + /* initialize the per-category enabled/loglevel from defaults */ + for (i = 0; i < log_info->num_cat; i++) { + struct log_category *cat = &target->categories[i]; + cat->enabled = log_info->cat[i].enabled; + cat->loglevel = log_info->cat[i].loglevel; + } + + /* global settings */ target->use_color = 1; target->print_timestamp = 0; + + /* global log level */ target->loglevel = 0; return target; } struct log_target *log_target_create_stderr(void) { +/* since C89/C99 says stderr is a macro, we can safely do this! */ +#ifdef stderr struct log_target *target; target = log_target_create(); @@ -336,6 +361,55 @@ struct log_target *log_target_create_stderr(void) target->tgt_stdout.out = stderr; target->output = _stderr_output; return target; +#else + return NULL; +#endif /* stderr */ +} + +const char *log_vty_level_string(struct log_info *info) +{ + const struct value_string *vs; + unsigned int len = 3; /* ()\0 */ + char *str; + + for (vs = loglevel_strs; vs->value || vs->str; vs++) + len += strlen(vs->str) + 1; + + str = talloc_zero_size(NULL, len); + if (!str) + return NULL; + + str[0] = '('; + for (vs = loglevel_strs; vs->value || vs->str; vs++) { + strcat(str, vs->str); + strcat(str, "|"); + } + str[strlen(str)-1] = ')'; + + return str; +} + +const char *log_vty_category_string(struct log_info *info) +{ + unsigned int len = 3; /* "()\0" */ + unsigned int i; + char *str; + + for (i = 0; i < info->num_cat; i++) + len += strlen(info->cat[i].name) + 1; + + str = talloc_zero_size(NULL, len); + if (!str) + return NULL; + + str[0] = '('; + for (i = 0; i < info->num_cat; i++) { + strcat(str, info->cat[i].name+1); + strcat(str, "|"); + } + str[strlen(str)-1] = ')'; + + return str; } void log_init(const struct log_info *cat) |