summaryrefslogtreecommitdiff
path: root/res/res_pjsip.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2016-01-13 16:49:22 -0600
committerRichard Mudgett <rmudgett@digium.com>2016-01-21 12:39:28 -0600
commitf87c3275cc4d60871167283e621565d51b35ff8d (patch)
tree73aeb8cb0a5d48e2d442f12e0eecec70a704c50e /res/res_pjsip.c
parent09a6354f9e453c864426af0c7d79373f821983bf (diff)
res_pjsip: Add CLI "pjsip dump endpt [details]"
Dump the res_pjsip endpt internals. In non-developer mode we will not document or make easily accessible the "details" option even though it is still available. The user has to know it exists to use it. Presumably they would also be aware of the potential crash warning below. Warning: PJPROJECT documents that the function used by this CLI command may cause a crash when asking for details because it tries to access all active memory pools. Change-Id: If2d98a3641c9873364d1daaad971376311aef3cb
Diffstat (limited to 'res/res_pjsip.c')
-rw-r--r--res/res_pjsip.c64
1 files changed, 62 insertions, 2 deletions
diff --git a/res/res_pjsip.c b/res/res_pjsip.c
index b51d6dcb3..c94f6a9eb 100644
--- a/res/res_pjsip.c
+++ b/res/res_pjsip.c
@@ -42,9 +42,11 @@
#include "asterisk/res_pjsip_cli.h"
#include "asterisk/test.h"
#include "asterisk/res_pjsip_presence_xml.h"
+#include "asterisk/res_pjproject.h"
/*** MODULEINFO
<depend>pjproject</depend>
+ <depend>res_pjproject</depend>
<depend>res_sorcery_config</depend>
<depend>res_sorcery_memory</depend>
<depend>res_sorcery_astdb</depend>
@@ -2220,6 +2222,57 @@ struct ast_sip_endpoint *ast_sip_identify_endpoint(pjsip_rx_data *rdata)
return endpoint;
}
+static int do_cli_dump_endpt(void *v_a)
+{
+ struct ast_cli_args *a = v_a;
+
+ ast_pjproject_log_intercept_begin(a->fd);
+ pjsip_endpt_dump(ast_sip_get_pjsip_endpoint(), a->argc == 4 ? PJ_TRUE : PJ_FALSE);
+ ast_pjproject_log_intercept_end();
+
+ return 0;
+}
+
+static char *cli_dump_endpt(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
+{
+ switch (cmd) {
+ case CLI_INIT:
+#ifdef AST_DEVMODE
+ e->command = "pjsip dump endpt [details]";
+ e->usage =
+ "Usage: pjsip dump endpt [details]\n"
+ " Dump the res_pjsip endpt internals.\n"
+ "\n"
+ "Warning: PJPROJECT documents that the function used by this\n"
+ "CLI command may cause a crash when asking for details because\n"
+ "it tries to access all active memory pools.\n";
+#else
+ /*
+ * In non-developer mode we will not document or make easily accessible
+ * the details option even though it is still available. The user has
+ * to know it exists to use it. Presumably they would also be aware of
+ * the potential crash warning.
+ */
+ e->command = "pjsip dump endpt";
+ e->usage =
+ "Usage: pjsip dump endpt\n"
+ " Dump the res_pjsip endpt internals.\n";
+#endif /* AST_DEVMODE */
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (4 < a->argc
+ || (a->argc == 4 && strcasecmp(a->argv[3], "details"))) {
+ return CLI_SHOWUSAGE;
+ }
+
+ ast_sip_push_task_synchronous(NULL, do_cli_dump_endpt, a);
+
+ return CLI_SUCCESS;
+}
+
static char *cli_show_endpoint_identifiers(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
#define ENDPOINT_IDENTIFIER_FORMAT "%-20.20s\n"
@@ -2283,8 +2336,9 @@ static char *cli_show_settings(struct ast_cli_entry *e, int cmd, struct ast_cli_
}
static struct ast_cli_entry cli_commands[] = {
- AST_CLI_DEFINE(cli_show_settings, "Show global and system configuration options"),
- AST_CLI_DEFINE(cli_show_endpoint_identifiers, "List registered endpoint identifiers")
+ AST_CLI_DEFINE(cli_dump_endpt, "Dump the res_pjsip endpt internals"),
+ AST_CLI_DEFINE(cli_show_settings, "Show global and system configuration options"),
+ AST_CLI_DEFINE(cli_show_endpoint_identifiers, "List registered endpoint identifiers")
};
AST_RWLIST_HEAD_STATIC(endpoint_formatters, ast_sip_endpoint_formatter);
@@ -3861,6 +3915,8 @@ static int load_module(void)
pj_status_t status;
struct ast_threadpool_options options;
+ CHECK_PJPROJECT_MODULE_LOADED();
+
if (pj_init() != PJ_SUCCESS) {
return AST_MODULE_LOAD_DECLINE;
}
@@ -4022,6 +4078,8 @@ static int load_module(void)
AST_TEST_REGISTER(xml_sanitization_end_null);
AST_TEST_REGISTER(xml_sanitization_exceeds_buffer);
+ ast_pjproject_ref();
+
return AST_MODULE_LOAD_SUCCESS;
}
@@ -4076,6 +4134,8 @@ static int unload_module(void)
ast_threadpool_shutdown(sip_threadpool);
ast_sip_destroy_cli();
+ ast_pjproject_unref();
+
return 0;
}