summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/asterisk/options.h27
-rw-r--r--main/asterisk.c1
-rw-r--r--main/libasteriskpj.c2
-rw-r--r--res/res_pjproject.c29
-rw-r--r--res/res_rtp_asterisk.c2
5 files changed, 50 insertions, 11 deletions
diff --git a/include/asterisk/options.h b/include/asterisk/options.h
index ff35c16c4..05ad6c560 100644
--- a/include/asterisk/options.h
+++ b/include/asterisk/options.h
@@ -143,6 +143,33 @@ enum ast_option_flags {
*/
#define DEFAULT_PJ_LOG_MAX_LEVEL 2
+/*!
+ * \brief Get maximum log level pjproject was compiled with.
+ *
+ * \details
+ * Determine the maximum log level the pjproject we are running
+ * with supports.
+ *
+ * When pjproject is initially loaded the default log level in
+ * effect is the maximum log level the library was compiled to
+ * generate. We must save this value off somewhere before we
+ * change it to what we want to use as the default level.
+ *
+ * \note This must be done before calling pj_init() so the level
+ * we want to use as the default level is in effect while the
+ * library initializes.
+ */
+#define AST_PJPROJECT_INIT_LOG_LEVEL() \
+ do { \
+ if (ast_pjproject_max_log_level < 0) { \
+ ast_pjproject_max_log_level = pj_log_get_level(); \
+ } \
+ pj_log_set_level(ast_option_pjproject_log_level); \
+ } while (0)
+
+/*! Current linked pjproject maximum logging level */
+extern int ast_pjproject_max_log_level;
+
/*! Current pjproject logging level */
extern int ast_option_pjproject_log_level;
diff --git a/main/asterisk.c b/main/asterisk.c
index 338c1f53b..69183c1f3 100644
--- a/main/asterisk.c
+++ b/main/asterisk.c
@@ -330,6 +330,7 @@ int ast_verb_sys_level;
int option_verbose; /*!< Verbosity level */
int option_debug; /*!< Debug level */
+int ast_pjproject_max_log_level = -1;/* Default to -1 to know if we have read the level from pjproject yet. */
int ast_option_pjproject_log_level;
double ast_option_maxload; /*!< Max load avg on system */
int ast_option_maxcalls; /*!< Max number of active calls */
diff --git a/main/libasteriskpj.c b/main/libasteriskpj.c
index 0f893a2cf..40efa9276 100644
--- a/main/libasteriskpj.c
+++ b/main/libasteriskpj.c
@@ -45,7 +45,7 @@
int ast_pj_init(void)
{
#ifdef HAVE_PJPROJECT_BUNDLED
- pj_log_set_level(ast_option_pjproject_log_level);
+ AST_PJPROJECT_INIT_LOG_LEVEL();
pj_init();
#endif
return 0;
diff --git a/res/res_pjproject.c b/res/res_pjproject.c
index 476defb41..1d9d73eaa 100644
--- a/res/res_pjproject.c
+++ b/res/res_pjproject.c
@@ -410,18 +410,22 @@ static char *handle_pjproject_set_log_level(struct ast_cli_entry *e, int cmd, st
}
/* Update pjproject logging level */
+ if (ast_pjproject_max_log_level < level_new) {
+ level_new = ast_pjproject_max_log_level;
+ ast_cli(a->fd,
+ "Asterisk built or linked with pjproject PJ_LOG_MAX_LEVEL=%d.\n"
+ "Lowering request to the max supported level.\n",
+ ast_pjproject_max_log_level);
+ }
level_old = ast_option_pjproject_log_level;
if (level_old == level_new) {
ast_cli(a->fd, "pjproject log level is still %d.\n", level_old);
} else {
ast_cli(a->fd, "pjproject log level was %d and is now %d.\n",
level_old, level_new);
+ ast_option_pjproject_log_level = level_new;
pj_log_set_level(level_new);
}
- ast_option_pjproject_log_level = pj_log_get_level();
- if (ast_option_pjproject_log_level != level_new) {
- ast_log(LOG_WARNING, "Asterisk built with pjproject PJ_LOG_MAX_LEVEL set too low.\n");
- }
return CLI_SUCCESS;
}
@@ -495,7 +499,7 @@ static int load_module(void)
ast_sorcery_load(pjproject_sorcery);
- pj_log_set_level(ast_option_pjproject_log_level);
+ AST_PJPROJECT_INIT_LOG_LEVEL();
pj_init();
decor_orig = pj_log_get_decor();
@@ -512,12 +516,19 @@ static int load_module(void)
pj_log_set_decor(0);
pj_log_set_level(MAX_PJ_LOG_MAX_LEVEL);/* Set level to guarantee the dump output. */
pj_dump_config();
- pj_log_set_level(ast_option_pjproject_log_level);
pj_log_set_decor(PJ_LOG_HAS_SENDER | PJ_LOG_HAS_INDENT);
pj_log_set_log_func(log_forwarder);
- if (!AST_VECTOR_SIZE(&buildopts)
- || ast_option_pjproject_log_level != pj_log_get_level()) {
- ast_log(LOG_WARNING, "Asterisk built or linked with pjproject PJ_LOG_MAX_LEVEL set too low.\n");
+ if (ast_pjproject_max_log_level < ast_option_pjproject_log_level) {
+ ast_log(LOG_WARNING,
+ "Asterisk built or linked with pjproject PJ_LOG_MAX_LEVEL=%d which is too low for startup level: %d.\n",
+ ast_pjproject_max_log_level, ast_option_pjproject_log_level);
+ ast_option_pjproject_log_level = ast_pjproject_max_log_level;
+ }
+ pj_log_set_level(ast_option_pjproject_log_level);
+ if (!AST_VECTOR_SIZE(&buildopts)) {
+ ast_log(LOG_NOTICE,
+ "Asterisk built or linked with pjproject PJ_LOG_MAX_LEVEL=%d which is too low to get buildopts.\n",
+ ast_pjproject_max_log_level);
}
ast_cli_register_multiple(pjproject_cli, ARRAY_LEN(pjproject_cli));
diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c
index 4c79f8f5b..b86463ebe 100644
--- a/res/res_rtp_asterisk.c
+++ b/res/res_rtp_asterisk.c
@@ -5666,7 +5666,7 @@ static int load_module(void)
#ifdef HAVE_PJPROJECT
pj_lock_t *lock;
- pj_log_set_level(ast_option_pjproject_log_level);
+ AST_PJPROJECT_INIT_LOG_LEVEL();
if (pj_init() != PJ_SUCCESS) {
return AST_MODULE_LOAD_DECLINE;
}