|
|
@ -23,6 +23,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
#include "asterisk/res_pjsip.h"
|
|
|
|
#include "asterisk/res_pjsip.h"
|
|
|
|
#include "include/res_pjsip_private.h"
|
|
|
|
#include "include/res_pjsip_private.h"
|
|
|
|
|
|
|
|
#include "asterisk/pbx.h"
|
|
|
|
#include "asterisk/sorcery.h"
|
|
|
|
#include "asterisk/sorcery.h"
|
|
|
|
#include "asterisk/taskprocessor.h"
|
|
|
|
#include "asterisk/taskprocessor.h"
|
|
|
|
#include "asterisk/ast_version.h"
|
|
|
|
#include "asterisk/ast_version.h"
|
|
|
@ -131,6 +132,46 @@ static void *global_alloc(const char *name)
|
|
|
|
return cfg;
|
|
|
|
return cfg;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
* There is ever only one global section, so we can use a single global
|
|
|
|
|
|
|
|
* value here to track the regcontext through reloads.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
static char *previous_regcontext = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int check_regcontext(const struct global_config *cfg)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
char *current = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (previous_regcontext && !strcmp(previous_regcontext, cfg->regcontext)) {
|
|
|
|
|
|
|
|
/* Nothing changed so nothing to do */
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!ast_strlen_zero(cfg->regcontext)) {
|
|
|
|
|
|
|
|
current = ast_strdup(cfg->regcontext);
|
|
|
|
|
|
|
|
if (!current) {
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (ast_sip_persistent_endpoint_add_to_regcontext(cfg->regcontext)) {
|
|
|
|
|
|
|
|
ast_free(current);
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!ast_strlen_zero(previous_regcontext)) {
|
|
|
|
|
|
|
|
ast_context_destroy_by_name(previous_regcontext, "PJSIP");
|
|
|
|
|
|
|
|
ast_free(previous_regcontext);
|
|
|
|
|
|
|
|
previous_regcontext = NULL;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (current) {
|
|
|
|
|
|
|
|
previous_regcontext = current;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int global_apply(const struct ast_sorcery *sorcery, void *obj)
|
|
|
|
static int global_apply(const struct ast_sorcery *sorcery, void *obj)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
struct global_config *cfg = obj;
|
|
|
|
struct global_config *cfg = obj;
|
|
|
@ -154,6 +195,10 @@ static int global_apply(const struct ast_sorcery *sorcery, void *obj)
|
|
|
|
ast_sip_add_global_request_header("User-Agent", cfg->useragent, 1);
|
|
|
|
ast_sip_add_global_request_header("User-Agent", cfg->useragent, 1);
|
|
|
|
ast_sip_add_global_response_header("Server", cfg->useragent, 1);
|
|
|
|
ast_sip_add_global_response_header("Server", cfg->useragent, 1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (check_regcontext(cfg)) {
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ao2_t_global_obj_replace_unref(global_cfg, cfg, "Applying global settings");
|
|
|
|
ao2_t_global_obj_replace_unref(global_cfg, cfg, "Applying global settings");
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -515,11 +560,17 @@ int ast_sip_destroy_sorcery_global(void)
|
|
|
|
|
|
|
|
|
|
|
|
ast_sorcery_instance_observer_remove(sorcery, &observer_callbacks_global);
|
|
|
|
ast_sorcery_instance_observer_remove(sorcery, &observer_callbacks_global);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (previous_regcontext) {
|
|
|
|
|
|
|
|
ast_context_destroy_by_name(previous_regcontext, "PJSIP");
|
|
|
|
|
|
|
|
ast_free(previous_regcontext);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ao2_t_global_obj_release(global_cfg, "Module is unloading");
|
|
|
|
ao2_t_global_obj_release(global_cfg, "Module is unloading");
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int ast_sip_initialize_sorcery_global(void)
|
|
|
|
int ast_sip_initialize_sorcery_global(void)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
struct ast_sorcery *sorcery = ast_sip_get_sorcery();
|
|
|
|
struct ast_sorcery *sorcery = ast_sip_get_sorcery();
|
|
|
|