diff options
-rw-r--r-- | include/Makefile.am | 5 | ||||
-rw-r--r-- | include/osmocom/core/logging.h | 4 | ||||
-rw-r--r-- | include/osmocom/core/logging_internal.h | 14 | ||||
-rw-r--r-- | src/logging.c | 164 | ||||
-rw-r--r-- | src/vty/logging_vty.c | 67 |
5 files changed, 82 insertions, 172 deletions
diff --git a/include/Makefile.am b/include/Makefile.am index ef8ec656..19695d1b 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -152,7 +152,10 @@ nobase_include_HEADERS += \ endif noinst_HEADERS = \ - osmocom/gsm/kasumi.h osmocom/gsm/gea.h + osmocom/gsm/kasumi.h \ + osmocom/gsm/gea.h \ + osmocom/core/logging_internal.h \ + $(NULL) osmocom/core/bit%gen.h: osmocom/core/bitXXgen.h.tpl $(AM_V_GEN)$(MKDIR_P) $(dir $@) diff --git a/include/osmocom/core/logging.h b/include/osmocom/core/logging.h index c60143d9..295e5a85 100644 --- a/include/osmocom/core/logging.h +++ b/include/osmocom/core/logging.h @@ -374,10 +374,6 @@ int log_targets_reopen(void); void log_add_target(struct log_target *target); void log_del_target(struct log_target *target); -/* Generate command string for VTY use */ -const char *log_vty_command_string() OSMO_DEPRECATED_OUTSIDE_LIBOSMOCORE; -const char *log_vty_command_description() OSMO_DEPRECATED_OUTSIDE_LIBOSMOCORE; - struct log_target *log_target_find(int type, const char *fname); extern struct llist_head osmo_log_target_list; diff --git a/include/osmocom/core/logging_internal.h b/include/osmocom/core/logging_internal.h new file mode 100644 index 00000000..55b1bbd8 --- /dev/null +++ b/include/osmocom/core/logging_internal.h @@ -0,0 +1,14 @@ +#pragma once + +/*! \defgroup logging_internal Osmocom logging internals + * @{ + * \file logging_internal.h */ + +#include <osmocom/core/utils.h> + +extern void *tall_log_ctx; +extern const struct log_info *osmo_log_info; + +void assert_loginfo(const char *src); + +/*! @} */ diff --git a/src/logging.c b/src/logging.c index de0f2b0f..7c2d61ff 100644 --- a/src/logging.c +++ b/src/logging.c @@ -35,7 +35,6 @@ #include <stdlib.h> #include <stdio.h> #include <string.h> -#include <ctype.h> #ifdef HAVE_STRINGS_H #include <strings.h> @@ -61,12 +60,10 @@ osmo_static_assert(_LOG_FLT_COUNT <= 8*sizeof(((struct log_target*)NULL)->filter struct log_info *osmo_log_info; static struct log_context log_context; -static void *tall_log_ctx = NULL; +void *tall_log_ctx = NULL; LLIST_HEAD(osmo_log_target_list); -#define LOGLEVEL_DEFS 6 /* Number of loglevels.*/ - -static const struct value_string loglevel_strs[LOGLEVEL_DEFS+1] = { +static const struct value_string loglevel_strs[] = { { 0, "EVERYTHING" }, { LOGL_DEBUG, "DEBUG" }, { LOGL_INFO, "INFO" }, @@ -175,19 +172,7 @@ static const struct log_info_cat internal_cat[OSMO_NUM_DLIB] = { }, }; -/*! descriptive string for each log level */ -/* You have to keep this in sync with the structure loglevel_strs. */ -static const char *loglevel_descriptions[LOGLEVEL_DEFS+1] = { - "Don't use. It doesn't log anything", - "Log debug messages and higher levels", - "Log informational messages and higher levels", - "Log noticeable messages and higher levels", - "Log error messages and higher levels", - "Log only fatal messages", - NULL, -}; - -static void assert_loginfo(const char *src) +void assert_loginfo(const char *src) { if (!osmo_log_info) { fprintf(stderr, "ERROR: osmo_log_info == NULL! " @@ -963,149 +948,6 @@ int log_targets_reopen(void) return rc; } -/*! Generates the logging command string for VTY - * \param[in] unused_info Deprecated parameter, no longer used! - * \returns vty command string for use by VTY command node - */ -const char *log_vty_command_string() -{ - struct log_info *info = osmo_log_info; - int len = 0, offset = 0, ret, i, rem; - int size = strlen("logging level (all|) ()") + 1; - char *str; - - assert_loginfo(__func__); - - for (i = 0; i < info->num_cat; i++) { - if (info->cat[i].name == NULL) - continue; - size += strlen(info->cat[i].name) + 1; - } - - for (i = 0; i < LOGLEVEL_DEFS; i++) - size += strlen(loglevel_strs[i].str) + 1; - - rem = size; - str = talloc_zero_size(tall_log_ctx, size); - if (!str) - return NULL; - - ret = snprintf(str + offset, rem, "logging level (all|"); - if (ret < 0) - goto err; - OSMO_SNPRINTF_RET(ret, rem, offset, len); - - for (i = 0; i < info->num_cat; i++) { - if (info->cat[i].name) { - int j, name_len = strlen(info->cat[i].name)+1; - char name[name_len]; - - for (j = 0; j < name_len; j++) - name[j] = tolower((unsigned char)info->cat[i].name[j]); - - name[name_len-1] = '\0'; - ret = snprintf(str + offset, rem, "%s|", name+1); - if (ret < 0) - goto err; - OSMO_SNPRINTF_RET(ret, rem, offset, len); - } - } - offset--; /* to remove the trailing | */ - rem++; - - ret = snprintf(str + offset, rem, ") ("); - if (ret < 0) - goto err; - OSMO_SNPRINTF_RET(ret, rem, offset, len); - - for (i = 0; i < LOGLEVEL_DEFS; i++) { - int j, loglevel_str_len = strlen(loglevel_strs[i].str)+1; - char loglevel_str[loglevel_str_len]; - - for (j = 0; j < loglevel_str_len; j++) - loglevel_str[j] = tolower((unsigned char)loglevel_strs[i].str[j]); - - loglevel_str[loglevel_str_len-1] = '\0'; - ret = snprintf(str + offset, rem, "%s|", loglevel_str); - if (ret < 0) - goto err; - OSMO_SNPRINTF_RET(ret, rem, offset, len); - } - offset--; /* to remove the trailing | */ - rem++; - - ret = snprintf(str + offset, rem, ")"); - if (ret < 0) - goto err; - OSMO_SNPRINTF_RET(ret, rem, offset, len); -err: - str[size-1] = '\0'; - return str; -} - -/*! Generates the logging command description for VTY - * \param[in] unused_info Deprecated parameter, no longer used! - * \returns logging command description for use by VTY command node - */ -const char *log_vty_command_description() -{ - struct log_info *info = osmo_log_info; - char *str; - int i, ret, len = 0, offset = 0, rem; - unsigned int size = - strlen(LOGGING_STR - "Set the log level for a specified category\n") + 1; - - assert_loginfo(__func__); - - for (i = 0; i < info->num_cat; i++) { - if (info->cat[i].name == NULL) - continue; - size += strlen(info->cat[i].description) + 1; - } - - for (i = 0; i < LOGLEVEL_DEFS; i++) - size += strlen(loglevel_descriptions[i]) + 1; - - size += strlen("Global setting for all subsystems") + 1; - rem = size; - str = talloc_zero_size(tall_log_ctx, size); - if (!str) - return NULL; - - ret = snprintf(str + offset, rem, LOGGING_STR - "Set the log level for a specified category\n"); - if (ret < 0) - goto err; - OSMO_SNPRINTF_RET(ret, rem, offset, len); - - ret = snprintf(str + offset, rem, - "Global setting for all subsystems\n"); - if (ret < 0) - goto err; - OSMO_SNPRINTF_RET(ret, rem, offset, len); - - for (i = 0; i < info->num_cat; i++) { - if (info->cat[i].name == NULL) - continue; - ret = snprintf(str + offset, rem, "%s\n", - info->cat[i].description); - if (ret < 0) - goto err; - OSMO_SNPRINTF_RET(ret, rem, offset, len); - } - for (i = 0; i < LOGLEVEL_DEFS; i++) { - ret = snprintf(str + offset, rem, "%s\n", - loglevel_descriptions[i]); - if (ret < 0) - goto err; - OSMO_SNPRINTF_RET(ret, rem, offset, len); - } -err: - str[size-1] = '\0'; - return str; -} - /*! Initialize the Osmocom logging core * \param[in] inf Information regarding logging categories * \param[in] ctx \ref talloc context for logging allocations diff --git a/src/vty/logging_vty.c b/src/vty/logging_vty.c index 7d97bb1d..2b001bc9 100644 --- a/src/vty/logging_vty.c +++ b/src/vty/logging_vty.c @@ -28,6 +28,7 @@ #include <osmocom/core/talloc.h> #include <osmocom/core/logging.h> +#include <osmocom/core/logging_internal.h> #include <osmocom/core/utils.h> #include <osmocom/core/strrb.h> #include <osmocom/core/loggingrb.h> @@ -40,6 +41,19 @@ #include <osmocom/vty/logging.h> #define LOG_STR "Configure logging sub-system\n" +#define LEVEL_STR "Set the log level for a specified category\n" + +#define CATEGORY_ALL_STR "Global setting for all subsystems\n" + +#define LOG_LEVEL_ARGS "debug|info|notice|error|fatal" +#define LOG_LEVEL_STRS \ + "Log debug messages and higher levels\n" \ + "Log informational messages and higher levels\n" \ + "Log noticeable messages and higher levels\n" \ + "Log error messages and higher levels\n" \ + "Log only fatal messages\n" + +#define EVERYTHING_STR "Don't use. It doesn't log anything\n" /*! \file logging_vty.c * Configuration of logging from VTY @@ -58,8 +72,6 @@ * */ -extern const struct log_info *osmo_log_info; - static void _vty_output(struct log_target *tgt, unsigned int level, const char *line) { @@ -268,6 +280,47 @@ DEFUN(logging_prnt_file, return CMD_SUCCESS; } +static void add_category_strings(char **cmd_str_p, char **doc_str_p, + const struct log_info *categories) +{ + int i; + for (i = 0; i < categories->num_cat; i++) { + if (categories->cat[i].name == NULL) + continue; + /* skip the leading 'D' in each category name, hence '+ 1' */ + osmo_talloc_asprintf(tall_log_ctx, *cmd_str_p, "%s%s", + i ? "|" : "", + osmo_str_tolower(categories->cat[i].name + 1)); + osmo_talloc_asprintf(tall_log_ctx, *doc_str_p, "%s\n", + categories->cat[i].description); + } +} + +static void gen_logging_level_cmd_strs(struct cmd_element *cmd, + const char *level_args, const char *level_strs) +{ + char *cmd_str = NULL; + char *doc_str = NULL; + + assert_loginfo(__func__); + + OSMO_ASSERT(cmd->string == NULL); + OSMO_ASSERT(cmd->doc == NULL); + + osmo_talloc_asprintf(tall_log_ctx, cmd_str, "logging level (all|"); + osmo_talloc_asprintf(tall_log_ctx, doc_str, + LOGGING_STR + LEVEL_STR + CATEGORY_ALL_STR); + add_category_strings(&cmd_str, &doc_str, osmo_log_info); + osmo_talloc_asprintf(tall_log_ctx, cmd_str, ") %s", level_args); + osmo_talloc_asprintf(tall_log_ctx, doc_str, "%s", level_strs); + + cmd->string = cmd_str; + cmd->doc = doc_str; +} + +/* logging level (all|<categories>) (everything|debug|...|fatal) */ DEFUN(logging_level, logging_level_cmd, NULL, /* cmdstr is dynamically set in logging_vty_add_cmds(). */ @@ -847,7 +900,7 @@ void logging_vty_add_deprecated_subsys(void *ctx, const char *name) name); printf("%s\n", cmd->string); cmd->func = log_deprecated_func; - cmd->doc = "Set the log level for a specified category\n" + cmd->doc = LEVEL_STR "Deprecated Category\n"; cmd->attr = CMD_ATTR_DEPRECATED; @@ -871,9 +924,11 @@ void logging_vty_add_cmds() install_element_ve(&logging_set_category_mask_cmd); install_element_ve(&logging_set_category_mask_old_cmd); - /* Logging level strings are generated dynamically. */ - logging_level_cmd.string = log_vty_command_string(); - logging_level_cmd.doc = log_vty_command_description(); + /* logging level (all|<categories>) (everything|debug|...|fatal) */ + gen_logging_level_cmd_strs(&logging_level_cmd, + "(everything|" LOG_LEVEL_ARGS ")", + EVERYTHING_STR LOG_LEVEL_STRS); + install_element_ve(&logging_level_cmd); install_element_ve(&show_logging_vty_cmd); install_element_ve(&show_alarms_cmd); |