]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
PJPROJECT logging: Fix detection of max supported log level. 68/4768/2
authorRichard Mudgett <rmudgett@digium.com>
Sat, 21 Jan 2017 03:13:34 +0000 (21:13 -0600)
committerRichard Mudgett <rmudgett@digium.com>
Tue, 24 Jan 2017 17:25:11 +0000 (11:25 -0600)
The mechanism used for detecting the maximum log level compiled into the
linked pjproject did not work.  The API call simply stores the requested
level into an integer and does no range checking.  Asterisk was assuming
that there was range checking and limited the new value to the allowable
range.  To get the actual maximum log level compiled into the linked
pjproject we need to get and save off the initial set log level from
pjproject.  This is the maximum log level supported.

* Get and save off the initial log level setting before altering it to the
desired level on startup.  This has to be done by a macro rather than
calling a core function to avoid incorrectly linking pjproject.

* Split the initial log level warning messages to warn if the linked
pjproject cannot support the requested startup level and if it is too low
to get the pjproject buildopts for "pjproject show buildopts".

* Adjust the CLI "pjproject set log level" to check the saved max log
level and to generate normal output messages instead of a warning message.

ASTERISK-26743 #close

Change-Id: I40aa76653e2a1dece66c3f8734594b4f0471cfb4

include/asterisk/options.h
main/asterisk.c
main/libasteriskpj.c
res/res_pjproject.c
res/res_rtp_asterisk.c

index ff35c16c435beaded9b7676f7e389789340028df..05ad6c56010c88e2bb0fbe9b08976c6dd0709529 100644 (file)
@@ -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;
 
index fb2ba0968135393fb953a537298a1f3e7b37f185..9babae68084ddc1eb7b85bed87e39511c605d8fc 100644 (file)
@@ -332,6 +332,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 */
index 2d92b599dcb5f3e9c50b3de6e7eebb6f7d0cf860..80c4d18962ff80307c39ce2074025e8070f6c931 100644 (file)
@@ -47,7 +47,7 @@ ASTERISK_REGISTER_FILE()
 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;
index d2bc0b47cf2b908676efb45a32436e3b5d22e8a4..2566baf784a513444476077f66869ff452bc4c9e 100644 (file)
@@ -412,18 +412,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;
 }
@@ -497,7 +501,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();
@@ -514,12 +518,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));
index 947f4a671e743a1676e6124685ae1785b084d997..32eefd94cd6412dede2d7b3c60d543153a6d92d0 100644 (file)
@@ -5668,7 +5668,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;
        }