[Freeswitch-trunk] [commit] r6863 - freeswitch/trunk/src/mod/endpoints/mod_sofia
Freeswitch SVN
brian at freeswitch.org
Tue Dec 18 11:31:06 EST 2007
Author: brian
Date: Tue Dec 18 11:31:05 2007
New Revision: 6863
Modified:
freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c
Log:
remove whitespace madness thx stkn
Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c (original)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c Tue Dec 18 11:31:05 2007
@@ -56,7 +56,8 @@
static void sofia_handle_sip_r_invite(switch_core_session_t *session, int status,
char const *phrase,
- nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, sofia_private_t *sofia_private, sip_t const *sip, tagi_t tags[]);
+ nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, sofia_private_t *sofia_private, sip_t const *sip, tagi_t tags[]);
+
void sofia_handle_sip_r_notify(switch_core_session_t *session, int status,
char const *phrase,
nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, sofia_private_t *sofia_private, sip_t const *sip, tagi_t tags[])
@@ -75,13 +76,13 @@
}
void sofia_handle_sip_i_notify(switch_core_session_t *session, int status,
- char const *phrase,
- nua_t *nua,
- sofia_profile_t *profile,
- nua_handle_t *nh,
- sofia_private_t *sofia_private,
- sip_t const *sip,
- tagi_t tags[])
+ char const *phrase,
+ nua_t *nua,
+ sofia_profile_t *profile,
+ nua_handle_t *nh,
+ sofia_private_t *sofia_private,
+ sip_t const *sip,
+ tagi_t tags[])
{
switch_channel_t *channel = NULL;
@@ -107,14 +108,14 @@
void sofia_event_callback(nua_event_t event,
- int status,
- char const *phrase,
- nua_t *nua,
- sofia_profile_t *profile,
- nua_handle_t *nh,
- sofia_private_t *sofia_private,
- sip_t const *sip,
- tagi_t tags[])
+ int status,
+ char const *phrase,
+ nua_t *nua,
+ sofia_profile_t *profile,
+ nua_handle_t *nh,
+ sofia_private_t *sofia_private,
+ sip_t const *sip,
+ tagi_t tags[])
{
struct private_object *tech_pvt = NULL;
auth_res_t auth_res = AUTH_FORBIDDEN;
@@ -266,137 +267,137 @@
sofia_handle_sip_i_info(nua, profile, nh, session, sip, tags);
break;
case nua_r_refer:
- break;
- case nua_i_refer:
- if (session) {
- sofia_handle_sip_i_refer(nua, profile, nh, session, sip, tags);
- }
- break;
- case nua_r_subscribe:
- sofia_presence_handle_sip_r_subscribe(status, phrase, nua, profile, nh, sofia_private, sip, tags);
- break;
- case nua_i_subscribe:
- sofia_presence_handle_sip_i_subscribe(status, phrase, nua, profile, nh, sofia_private, sip, tags);
- break;
- default:
- if (status > 100) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s: unknown event %d: %03d %s\n", nua_event_name(event), event, status, phrase);
- } else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s: unknown event %d\n", nua_event_name(event), event);
- }
- break;
- }
-
- done:
-
- if (gateway) {
- sofia_reg_release_gateway(gateway);
- }
-
- if (session) {
- switch_core_session_rwunlock(session);
-
- }
- }
-
-
- void event_handler(switch_event_t *event)
- {
- char *subclass, *sql;
-
- if ((subclass = switch_event_get_header(event, "orig-event-subclass")) && !strcasecmp(subclass, MY_EVENT_REGISTER)) {
- char *from_user = switch_event_get_header(event, "orig-from-user");
- char *from_host = switch_event_get_header(event, "orig-from-host");
- char *contact_str = switch_event_get_header(event, "orig-contact");
- char *exp_str = switch_event_get_header(event, "orig-expires");
- char *rpid = switch_event_get_header(event, "orig-rpid");
- char *call_id = switch_event_get_header(event, "orig-call-id");
- char *user_agent = switch_event_get_header(event, "user-agent");
- long expires = (long) time(NULL) + atol(exp_str);
- char *profile_name = switch_event_get_header(event, "orig-profile-name");
- sofia_profile_t *profile = NULL;
-
- if (!rpid) {
- rpid = "unknown";
- }
-
- if (!profile_name || !(profile = sofia_glue_find_profile(profile_name))) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Profile\n");
- return;
- }
- if (sofia_test_pflag(profile, PFLAG_MULTIREG)) {
- sql = switch_mprintf("delete from sip_registrations where call_id='%q'", call_id);
- } else {
- sql = switch_mprintf("delete from sip_registrations where sip_user='%q' and sip_host='%q'", from_user, from_host);
- }
-
- switch_mutex_lock(profile->ireg_mutex);
- sofia_glue_execute_sql(profile, SWITCH_FALSE, sql, NULL);
- switch_safe_free(sql);
+ break;
+ case nua_i_refer:
+ if (session) {
+ sofia_handle_sip_i_refer(nua, profile, nh, session, sip, tags);
+ }
+ break;
+ case nua_r_subscribe:
+ sofia_presence_handle_sip_r_subscribe(status, phrase, nua, profile, nh, sofia_private, sip, tags);
+ break;
+ case nua_i_subscribe:
+ sofia_presence_handle_sip_i_subscribe(status, phrase, nua, profile, nh, sofia_private, sip, tags);
+ break;
+ default:
+ if (status > 100) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s: unknown event %d: %03d %s\n", nua_event_name(event), event, status, phrase);
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s: unknown event %d\n", nua_event_name(event), event);
+ }
+ break;
+ }
+
+ done:
+
+ if (gateway) {
+ sofia_reg_release_gateway(gateway);
+ }
+
+ if (session) {
+ switch_core_session_rwunlock(session);
+
+ }
+}
+
+
+void event_handler(switch_event_t *event)
+{
+ char *subclass, *sql;
+
+ if ((subclass = switch_event_get_header(event, "orig-event-subclass")) && !strcasecmp(subclass, MY_EVENT_REGISTER)) {
+ char *from_user = switch_event_get_header(event, "orig-from-user");
+ char *from_host = switch_event_get_header(event, "orig-from-host");
+ char *contact_str = switch_event_get_header(event, "orig-contact");
+ char *exp_str = switch_event_get_header(event, "orig-expires");
+ char *rpid = switch_event_get_header(event, "orig-rpid");
+ char *call_id = switch_event_get_header(event, "orig-call-id");
+ char *user_agent = switch_event_get_header(event, "user-agent");
+ long expires = (long) time(NULL) + atol(exp_str);
+ char *profile_name = switch_event_get_header(event, "orig-profile-name");
+ sofia_profile_t *profile = NULL;
+
+ if (!rpid) {
+ rpid = "unknown";
+ }
+
+ if (!profile_name || !(profile = sofia_glue_find_profile(profile_name))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Profile\n");
+ return;
+ }
+ if (sofia_test_pflag(profile, PFLAG_MULTIREG)) {
+ sql = switch_mprintf("delete from sip_registrations where call_id='%q'", call_id);
+ } else {
+ sql = switch_mprintf("delete from sip_registrations where sip_user='%q' and sip_host='%q'", from_user, from_host);
+ }
+
+ switch_mutex_lock(profile->ireg_mutex);
+ sofia_glue_execute_sql(profile, SWITCH_FALSE, sql, NULL);
+ switch_safe_free(sql);
- sql = switch_mprintf("insert into sip_registrations values ('%q', '%q','%q','%q','Registered', '%q', %ld, '%q')",
+ sql = switch_mprintf("insert into sip_registrations values ('%q', '%q','%q','%q','Registered', '%q', %ld, '%q')",
call_id, from_user, from_host, contact_str, rpid, expires, user_agent);
- if (sql) {
- sofia_glue_execute_sql(profile, SWITCH_FALSE, sql, NULL);
- switch_safe_free(sql);
- sql = NULL;
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Propagating registration for %s@%s->%s\n", from_user, from_host, contact_str);
- }
- switch_mutex_unlock(profile->ireg_mutex);
-
-
- if (profile) {
- sofia_glue_release_profile(profile);
- }
- }
- }
+ if (sql) {
+ sofia_glue_execute_sql(profile, SWITCH_FALSE, sql, NULL);
+ switch_safe_free(sql);
+ sql = NULL;
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Propagating registration for %s@%s->%s\n", from_user, from_host, contact_str);
+ }
+ switch_mutex_unlock(profile->ireg_mutex);
+
+
+ if (profile) {
+ sofia_glue_release_profile(profile);
+ }
+ }
+}
+
+
+
+void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void *obj)
+{
+ sofia_profile_t *profile = (sofia_profile_t *) obj;
+ switch_memory_pool_t *pool;
+ sip_alias_node_t *node;
+ uint32_t ireg_loops = 0;
+ uint32_t gateway_loops = 0;
+ switch_event_t *s_event;
+ int tportlog = 0;
+
+ switch_mutex_lock(mod_sofia_globals.mutex);
+ mod_sofia_globals.threads++;
+ switch_mutex_unlock(mod_sofia_globals.mutex);
+
+ profile->s_root = su_root_create(NULL);
+ profile->home = su_home_new(sizeof(*profile->home));
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Creating agent for %s\n", profile->name);
+
+ if (!sofia_glue_init_sql(profile)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot Open SQL Database [%s]!\n", profile->name);
+ sofia_glue_del_profile(profile);
+ goto end;
+ }
+ if (switch_test_flag(profile, TFLAG_TPORT_LOG)) {
+ tportlog = 1;
+ }
+ profile->nua = nua_create(profile->s_root, /* Event loop */
+ sofia_event_callback, /* Callback for processing events */
+ profile, /* Additional data to pass to callback */
+ NUTAG_URL(profile->bindurl), NTATAG_UDP_MTU(65536), TAG_IF(tportlog,TPTAG_LOG(1)), TAG_END()); /* Last tag should always finish the sequence */
- void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void *obj)
- {
- sofia_profile_t *profile = (sofia_profile_t *) obj;
- switch_memory_pool_t *pool;
- sip_alias_node_t *node;
- uint32_t ireg_loops = 0;
- uint32_t gateway_loops = 0;
- switch_event_t *s_event;
- int tportlog = 0;
-
- switch_mutex_lock(mod_sofia_globals.mutex);
- mod_sofia_globals.threads++;
- switch_mutex_unlock(mod_sofia_globals.mutex);
-
- profile->s_root = su_root_create(NULL);
- profile->home = su_home_new(sizeof(*profile->home));
-
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Creating agent for %s\n", profile->name);
-
- if (!sofia_glue_init_sql(profile)) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot Open SQL Database [%s]!\n", profile->name);
- sofia_glue_del_profile(profile);
- goto end;
- }
-
- if (switch_test_flag(profile, TFLAG_TPORT_LOG)) {
- tportlog = 1;
- }
-
- profile->nua = nua_create(profile->s_root, /* Event loop */
- sofia_event_callback, /* Callback for processing events */
- profile, /* Additional data to pass to callback */
- NUTAG_URL(profile->bindurl), NTATAG_UDP_MTU(65536), TAG_IF(tportlog,TPTAG_LOG(1)), TAG_END()); /* Last tag should always finish the sequence */
-
- if (!profile->nua) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Creating SIP UA for profile: %s\n", profile->name);
- sofia_glue_del_profile(profile);
- goto end;
- }
+ if (!profile->nua) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Creating SIP UA for profile: %s\n", profile->name);
+ sofia_glue_del_profile(profile);
+ goto end;
+ }
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Created agent for %s\n", profile->name);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Created agent for %s\n", profile->name);
- nua_set_params(profile->nua,
+ nua_set_params(profile->nua,
NUTAG_APPL_METHOD("OPTIONS"),
NUTAG_APPL_METHOD("NOTIFY"),
NUTAG_APPL_METHOD("INFO"),
@@ -419,15 +420,15 @@
TAG_IF((profile->pflags & PFLAG_PRESENCE), NUTAG_ALLOW_EVENTS("message-summary")),
SIPTAG_SUPPORTED_STR("100rel, precondition, timer"), SIPTAG_USER_AGENT_STR(profile->user_agent), TAG_END());
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Set params for %s\n", profile->name);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Set params for %s\n", profile->name);
- for (node = profile->aliases; node; node = node->next) {
- node->nua = nua_create(profile->s_root, /* Event loop */
+ for (node = profile->aliases; node; node = node->next) {
+ node->nua = nua_create(profile->s_root, /* Event loop */
sofia_event_callback, /* Callback for processing events */
profile, /* Additional data to pass to callback */
NUTAG_URL(node->url), TAG_END()); /* Last tag should always finish the sequence */
- nua_set_params(node->nua,
+ nua_set_params(node->nua,
NUTAG_APPL_METHOD("OPTIONS"),
NUTAG_EARLY_MEDIA(1),
NUTAG_AUTOANSWER(0),
@@ -439,738 +440,738 @@
TAG_IF((profile->pflags & PFLAG_PRESENCE), NUTAG_ENABLEMESSAGE(1)),
SIPTAG_SUPPORTED_STR("100rel, precondition"), SIPTAG_USER_AGENT_STR(profile->user_agent), TAG_END());
- }
+ }
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "activated db for %s\n", profile->name);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "activated db for %s\n", profile->name);
- switch_mutex_init(&profile->ireg_mutex, SWITCH_MUTEX_NESTED, profile->pool);
- switch_mutex_init(&profile->gateway_mutex, SWITCH_MUTEX_NESTED, profile->pool);
+ switch_mutex_init(&profile->ireg_mutex, SWITCH_MUTEX_NESTED, profile->pool);
+ switch_mutex_init(&profile->gateway_mutex, SWITCH_MUTEX_NESTED, profile->pool);
- ireg_loops = IREG_SECONDS;
- gateway_loops = GATEWAY_SECONDS;
+ ireg_loops = IREG_SECONDS;
+ gateway_loops = GATEWAY_SECONDS;
- if (switch_event_create(&s_event, SWITCH_EVENT_PUBLISH) == SWITCH_STATUS_SUCCESS) {
- switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "service", "_sip._udp,_sip._tcp,_sip._sctp");
- switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "port", "%d", profile->sip_port);
- switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "module_name", "%s", "mod_sofia");
- switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "profile_name", "%s", profile->name);
- switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "profile_uri", "%s", profile->url);
- switch_event_fire(&s_event);
- }
+ if (switch_event_create(&s_event, SWITCH_EVENT_PUBLISH) == SWITCH_STATUS_SUCCESS) {
+ switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "service", "_sip._udp,_sip._tcp,_sip._sctp");
+ switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "port", "%d", profile->sip_port);
+ switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "module_name", "%s", "mod_sofia");
+ switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "profile_name", "%s", profile->name);
+ switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "profile_uri", "%s", profile->url);
+ switch_event_fire(&s_event);
+ }
- sofia_glue_add_profile(profile->name, profile);
+ sofia_glue_add_profile(profile->name, profile);
- if (profile->pflags & PFLAG_PRESENCE) {
- sofia_presence_establish_presence(profile);
- }
+ if (profile->pflags & PFLAG_PRESENCE) {
+ sofia_presence_establish_presence(profile);
+ }
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Starting thread for %s\n", profile->name);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Starting thread for %s\n", profile->name);
- profile->started = time(NULL);
- switch_yield(1000000);
+ profile->started = time(NULL);
+ switch_yield(1000000);
- sofia_set_pflag_locked(profile, PFLAG_RUNNING);
+ sofia_set_pflag_locked(profile, PFLAG_RUNNING);
- while (mod_sofia_globals.running == 1 && sofia_test_pflag(profile, PFLAG_RUNNING)) {
- if (++ireg_loops >= IREG_SECONDS) {
- sofia_reg_check_expire(profile, time(NULL));
- ireg_loops = 0;
- }
+ while (mod_sofia_globals.running == 1 && sofia_test_pflag(profile, PFLAG_RUNNING)) {
+ if (++ireg_loops >= IREG_SECONDS) {
+ sofia_reg_check_expire(profile, time(NULL));
+ ireg_loops = 0;
+ }
- if (++gateway_loops >= GATEWAY_SECONDS) {
- sofia_reg_check_gateway(profile, time(NULL));
- gateway_loops = 0;
- }
+ if (++gateway_loops >= GATEWAY_SECONDS) {
+ sofia_reg_check_gateway(profile, time(NULL));
+ gateway_loops = 0;
+ }
- su_root_step(profile->s_root, 1000);
- }
+ su_root_step(profile->s_root, 1000);
+ }
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Write lock %s\n", profile->name);
- switch_thread_rwlock_wrlock(profile->rwlock);
- sofia_reg_unregister(profile);
- nua_shutdown(profile->nua);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Write lock %s\n", profile->name);
+ switch_thread_rwlock_wrlock(profile->rwlock);
+ sofia_reg_unregister(profile);
+ nua_shutdown(profile->nua);
- su_root_run(profile->s_root);
- nua_destroy(profile->nua);
+ su_root_run(profile->s_root);
+ nua_destroy(profile->nua);
- switch_mutex_lock(profile->ireg_mutex);
- switch_mutex_unlock(profile->ireg_mutex);
+ switch_mutex_lock(profile->ireg_mutex);
+ switch_mutex_unlock(profile->ireg_mutex);
- if (switch_event_create(&s_event, SWITCH_EVENT_UNPUBLISH) == SWITCH_STATUS_SUCCESS) {
- switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "service", "_sip._udp,_sip._tcp,_sip._sctp");
- switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "port", "%d", profile->sip_port);
- switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "module_name", "%s", "mod_sofia");
- switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "profile_name", "%s", profile->name);
- switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "profile_uri", "%s", profile->url);
- switch_event_fire(&s_event);
- }
+ if (switch_event_create(&s_event, SWITCH_EVENT_UNPUBLISH) == SWITCH_STATUS_SUCCESS) {
+ switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "service", "_sip._udp,_sip._tcp,_sip._sctp");
+ switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "port", "%d", profile->sip_port);
+ switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "module_name", "%s", "mod_sofia");
+ switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "profile_name", "%s", profile->name);
+ switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "profile_uri", "%s", profile->url);
+ switch_event_fire(&s_event);
+ }
- sofia_glue_sql_close(profile);
- su_home_unref(profile->home);
- su_root_destroy(profile->s_root);
- pool = profile->pool;
+ sofia_glue_sql_close(profile);
+ su_home_unref(profile->home);
+ su_root_destroy(profile->s_root);
+ pool = profile->pool;
- sofia_glue_del_profile(profile);
- switch_core_hash_destroy(&profile->chat_hash);
- switch_core_hash_destroy(&profile->sub_hash);
+ sofia_glue_del_profile(profile);
+ switch_core_hash_destroy(&profile->chat_hash);
+ switch_core_hash_destroy(&profile->sub_hash);
- switch_thread_rwlock_unlock(profile->rwlock);
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Write unlock %s\n", profile->name);
+ switch_thread_rwlock_unlock(profile->rwlock);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Write unlock %s\n", profile->name);
- if (sofia_test_pflag(profile, PFLAG_RESPAWN)) {
- config_sofia(1, profile->name);
- }
+ if (sofia_test_pflag(profile, PFLAG_RESPAWN)) {
+ config_sofia(1, profile->name);
+ }
- switch_core_destroy_memory_pool(&pool);
+ switch_core_destroy_memory_pool(&pool);
end:
- switch_mutex_lock(mod_sofia_globals.mutex);
- mod_sofia_globals.threads--;
- switch_mutex_unlock(mod_sofia_globals.mutex);
-
- return NULL;
- }
-
- void launch_sofia_profile_thread(sofia_profile_t *profile)
- {
- switch_thread_t *thread;
- switch_threadattr_t *thd_attr = NULL;
-
- switch_threadattr_create(&thd_attr, profile->pool);
- switch_threadattr_detach_set(thd_attr, 1);
- switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
- switch_thread_create(&thread, thd_attr, sofia_profile_thread_run, profile, profile->pool);
- }
-
- static void logger(void *logarg, char const *fmt, va_list ap)
- {
- char *data = NULL;
-
- if (fmt) {
- #ifdef HAVE_VASPRINTF
- int ret;
- ret = vasprintf(&data, fmt, ap);
- if ((ret == -1) || !data) {
- return;
- }
- #else
- data = (char *) malloc(2048);
- if (data) {
- vsnprintf(data, 2048, fmt, ap);
- } else {
- return;
- }
- #endif
- }
- if (data) {
- switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_CONSOLE, (char *) "%s", data);
- free(data);
- }
- }
-
-
- static void parse_gateways(sofia_profile_t *profile, switch_xml_t gateways_tag)
- {
- switch_xml_t gateway_tag, param;
- sofia_gateway_t *gp;
-
- for (gateway_tag = switch_xml_child(gateways_tag, "gateway"); gateway_tag; gateway_tag = gateway_tag->next) {
- char *name = (char *) switch_xml_attr_soft(gateway_tag, "name");
- sofia_gateway_t *gateway;
-
- if (switch_strlen_zero(name)) {
- name = "anonymous";
- }
-
- if ((gateway = switch_core_alloc(profile->pool, sizeof(*gateway)))) {
- char *register_str = "true", *scheme = "Digest",
- *realm = NULL,
- *username = NULL,
- *password = NULL,
- *caller_id_in_from = "false",
- *extension = NULL,
- *proxy = NULL,
- *context = "default",
- *expire_seconds = "3600",
- *retry_seconds = "30",
- *from_user = "",
- *from_domain = "",
- *register_proxy = NULL,
- *contact_params = NULL,
- *params = NULL,
- *register_transport = "udp";
-
- gateway->pool = profile->pool;
- gateway->profile = profile;
- gateway->name = switch_core_strdup(gateway->pool, name);
- gateway->freq = 0;
- gateway->next = NULL;
-
- for (param = switch_xml_child(gateway_tag, "param"); param; param = param->next) {
- char *var = (char *) switch_xml_attr_soft(param, "name");
- char *val = (char *) switch_xml_attr_soft(param, "value");
-
- if (!strcmp(var, "register")) {
- register_str = val;
- } else if (!strcmp(var, "scheme")) {
- scheme = val;
- } else if (!strcmp(var, "realm")) {
- realm = val;
- } else if (!strcmp(var, "username")) {
- username = val;
- } else if (!strcmp(var, "password")) {
- password = val;
- } else if (!strcmp(var, "caller-id-in-from")) {
- caller_id_in_from = val;
- } else if (!strcmp(var, "extension")) {
- extension = val;
- } else if (!strcmp(var, "proxy")) {
- proxy = val;
- } else if (!strcmp(var, "context")) {
- context = val;
- } else if (!strcmp(var, "expire-seconds")) {
- expire_seconds = val;
- } else if (!strcmp(var, "retry-seconds")) {
- retry_seconds = val;
- } else if (!strcmp(var, "from-user")) {
- from_user = val;
- } else if (!strcmp(var, "from-domain")) {
- from_domain = val;
- } else if (!strcmp(var, "register-proxy")) {
- register_proxy = val;
- } else if (!strcmp(var, "contact-params")) {
- contact_params = val;
- } else if (!strcmp(var, "register-transport")) {
- if (!strcasecmp(val, "udp") || !strcasecmp(val, "tcp")) {
- register_transport = val;
- } else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ERROR: unsupported transport\n");
- goto skip;
- }
- }
- }
-
- if (switch_strlen_zero(realm)) {
- realm = name;
- }
-
- if (switch_strlen_zero(username)) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ERROR: username param is REQUIRED!\n");
- goto skip;
- }
-
- if (switch_strlen_zero(password)) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ERROR: password param is REQUIRED!\n");
- goto skip;
- }
-
- if (switch_strlen_zero(from_user)) {
- from_user = username;
- }
-
- if (switch_strlen_zero(extension)) {
- extension = username;
- }
-
- if (switch_strlen_zero(proxy)) {
- proxy = realm;
- }
-
- if (!switch_true(register_str)) {
- gateway->state = REG_STATE_NOREG;
- }
-
- if (switch_strlen_zero(from_domain)) {
- from_domain = realm;
- }
-
- if (switch_strlen_zero(register_proxy)) {
- register_proxy = proxy;
- }
-
- gateway->retry_seconds = atoi(retry_seconds);
- if (gateway->retry_seconds < 10) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "INVALID: retry_seconds correcting the value to 30\n");
- gateway->retry_seconds = 30;
- }
- gateway->register_scheme = switch_core_strdup(gateway->pool, scheme);
- gateway->register_context = switch_core_strdup(gateway->pool, context);
- gateway->register_realm = switch_core_strdup(gateway->pool, realm);
- gateway->register_username = switch_core_strdup(gateway->pool, username);
- gateway->register_password = switch_core_strdup(gateway->pool, password);
- if (switch_true(caller_id_in_from)) {
- switch_set_flag(gateway, REG_FLAG_CALLERID);
- }
- if (contact_params) {
- if (*contact_params == ';') {
- params = switch_core_sprintf(gateway->pool, "%s&transport=%s", contact_params, register_transport);
- } else {
- params = switch_core_sprintf(gateway->pool, ";%s&transport=%s", contact_params, register_transport);
- }
- } else {
- params = switch_core_sprintf(gateway->pool, ";transport=%s", register_transport);
- }
-
- gateway->register_url = switch_core_sprintf(gateway->pool, "sip:%s;transport=%s", register_proxy,register_transport);
- gateway->register_from = switch_core_sprintf(gateway->pool, "<sip:%s@%s;transport=%s>", from_user, from_domain, register_transport);
- gateway->register_contact = switch_core_sprintf(gateway->pool, "<sip:%s@%s:%d%s>", extension,
+ switch_mutex_lock(mod_sofia_globals.mutex);
+ mod_sofia_globals.threads--;
+ switch_mutex_unlock(mod_sofia_globals.mutex);
+
+ return NULL;
+}
+
+void launch_sofia_profile_thread(sofia_profile_t *profile)
+{
+ switch_thread_t *thread;
+ switch_threadattr_t *thd_attr = NULL;
+
+ switch_threadattr_create(&thd_attr, profile->pool);
+ switch_threadattr_detach_set(thd_attr, 1);
+ switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
+ switch_thread_create(&thread, thd_attr, sofia_profile_thread_run, profile, profile->pool);
+}
+
+static void logger(void *logarg, char const *fmt, va_list ap)
+{
+ char *data = NULL;
+
+ if (fmt) {
+#ifdef HAVE_VASPRINTF
+ int ret;
+ ret = vasprintf(&data, fmt, ap);
+ if ((ret == -1) || !data) {
+ return;
+ }
+#else
+ data = (char *) malloc(2048);
+ if (data) {
+ vsnprintf(data, 2048, fmt, ap);
+ } else {
+ return;
+ }
+#endif
+ }
+ if (data) {
+ switch_log_printf(SWITCH_CHANNEL_LOG_CLEAN, SWITCH_LOG_CONSOLE, (char *) "%s", data);
+ free(data);
+ }
+}
+
+
+static void parse_gateways(sofia_profile_t *profile, switch_xml_t gateways_tag)
+{
+ switch_xml_t gateway_tag, param;
+ sofia_gateway_t *gp;
+
+ for (gateway_tag = switch_xml_child(gateways_tag, "gateway"); gateway_tag; gateway_tag = gateway_tag->next) {
+ char *name = (char *) switch_xml_attr_soft(gateway_tag, "name");
+ sofia_gateway_t *gateway;
+
+ if (switch_strlen_zero(name)) {
+ name = "anonymous";
+ }
+
+ if ((gateway = switch_core_alloc(profile->pool, sizeof(*gateway)))) {
+ char *register_str = "true", *scheme = "Digest",
+ *realm = NULL,
+ *username = NULL,
+ *password = NULL,
+ *caller_id_in_from = "false",
+ *extension = NULL,
+ *proxy = NULL,
+ *context = "default",
+ *expire_seconds = "3600",
+ *retry_seconds = "30",
+ *from_user = "",
+ *from_domain = "",
+ *register_proxy = NULL,
+ *contact_params = NULL,
+ *params = NULL,
+ *register_transport = "udp";
+
+ gateway->pool = profile->pool;
+ gateway->profile = profile;
+ gateway->name = switch_core_strdup(gateway->pool, name);
+ gateway->freq = 0;
+ gateway->next = NULL;
+
+ for (param = switch_xml_child(gateway_tag, "param"); param; param = param->next) {
+ char *var = (char *) switch_xml_attr_soft(param, "name");
+ char *val = (char *) switch_xml_attr_soft(param, "value");
+
+ if (!strcmp(var, "register")) {
+ register_str = val;
+ } else if (!strcmp(var, "scheme")) {
+ scheme = val;
+ } else if (!strcmp(var, "realm")) {
+ realm = val;
+ } else if (!strcmp(var, "username")) {
+ username = val;
+ } else if (!strcmp(var, "password")) {
+ password = val;
+ } else if (!strcmp(var, "caller-id-in-from")) {
+ caller_id_in_from = val;
+ } else if (!strcmp(var, "extension")) {
+ extension = val;
+ } else if (!strcmp(var, "proxy")) {
+ proxy = val;
+ } else if (!strcmp(var, "context")) {
+ context = val;
+ } else if (!strcmp(var, "expire-seconds")) {
+ expire_seconds = val;
+ } else if (!strcmp(var, "retry-seconds")) {
+ retry_seconds = val;
+ } else if (!strcmp(var, "from-user")) {
+ from_user = val;
+ } else if (!strcmp(var, "from-domain")) {
+ from_domain = val;
+ } else if (!strcmp(var, "register-proxy")) {
+ register_proxy = val;
+ } else if (!strcmp(var, "contact-params")) {
+ contact_params = val;
+ } else if (!strcmp(var, "register-transport")) {
+ if (!strcasecmp(val, "udp") || !strcasecmp(val, "tcp")) {
+ register_transport = val;
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ERROR: unsupported transport\n");
+ goto skip;
+ }
+ }
+ }
+
+ if (switch_strlen_zero(realm)) {
+ realm = name;
+ }
+
+ if (switch_strlen_zero(username)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ERROR: username param is REQUIRED!\n");
+ goto skip;
+ }
+
+ if (switch_strlen_zero(password)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ERROR: password param is REQUIRED!\n");
+ goto skip;
+ }
+
+ if (switch_strlen_zero(from_user)) {
+ from_user = username;
+ }
+
+ if (switch_strlen_zero(extension)) {
+ extension = username;
+ }
+
+ if (switch_strlen_zero(proxy)) {
+ proxy = realm;
+ }
+
+ if (!switch_true(register_str)) {
+ gateway->state = REG_STATE_NOREG;
+ }
+
+ if (switch_strlen_zero(from_domain)) {
+ from_domain = realm;
+ }
+
+ if (switch_strlen_zero(register_proxy)) {
+ register_proxy = proxy;
+ }
+
+ gateway->retry_seconds = atoi(retry_seconds);
+ if (gateway->retry_seconds < 10) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "INVALID: retry_seconds correcting the value to 30\n");
+ gateway->retry_seconds = 30;
+ }
+ gateway->register_scheme = switch_core_strdup(gateway->pool, scheme);
+ gateway->register_context = switch_core_strdup(gateway->pool, context);
+ gateway->register_realm = switch_core_strdup(gateway->pool, realm);
+ gateway->register_username = switch_core_strdup(gateway->pool, username);
+ gateway->register_password = switch_core_strdup(gateway->pool, password);
+ if (switch_true(caller_id_in_from)) {
+ switch_set_flag(gateway, REG_FLAG_CALLERID);
+ }
+ if (contact_params) {
+ if (*contact_params == ';') {
+ params = switch_core_sprintf(gateway->pool, "%s&transport=%s", contact_params, register_transport);
+ } else {
+ params = switch_core_sprintf(gateway->pool, ";%s&transport=%s", contact_params, register_transport);
+ }
+ } else {
+ params = switch_core_sprintf(gateway->pool, ";transport=%s", register_transport);
+ }
+
+ gateway->register_url = switch_core_sprintf(gateway->pool, "sip:%s;transport=%s", register_proxy,register_transport);
+ gateway->register_from = switch_core_sprintf(gateway->pool, "<sip:%s@%s;transport=%s>", from_user, from_domain, register_transport);
+ gateway->register_contact = switch_core_sprintf(gateway->pool, "<sip:%s@%s:%d%s>", extension,
profile->extsipip ? profile->extsipip : profile->sipip, profile->sip_port, params);
- if (!strncasecmp(proxy, "sip:", 4)) {
- gateway->register_proxy = switch_core_strdup(gateway->pool, proxy);
- gateway->register_to = switch_core_sprintf(gateway->pool, "sip:%s@%s", username, proxy + 4);
- } else {
- gateway->register_proxy = switch_core_sprintf(gateway->pool, "sip:%s", proxy);
- gateway->register_to = switch_core_sprintf(gateway->pool, "sip:%s@%s", username, proxy);
- }
+ if (!strncasecmp(proxy, "sip:", 4)) {
+ gateway->register_proxy = switch_core_strdup(gateway->pool, proxy);
+ gateway->register_to = switch_core_sprintf(gateway->pool, "sip:%s@%s", username, proxy + 4);
+ } else {
+ gateway->register_proxy = switch_core_sprintf(gateway->pool, "sip:%s", proxy);
+ gateway->register_to = switch_core_sprintf(gateway->pool, "sip:%s@%s", username, proxy);
+ }
- gateway->expires_str = switch_core_strdup(gateway->pool, expire_seconds);
+ gateway->expires_str = switch_core_strdup(gateway->pool, expire_seconds);
- if ((gateway->freq = atoi(gateway->expires_str)) < 5) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING,
+ if ((gateway->freq = atoi(gateway->expires_str)) < 5) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING,
"Invalid Freq: %d. Setting Register-Frequency to 3600\n", gateway->freq);
- gateway->freq = 3600;
- }
- gateway->freq -= 2;
-
- if ((gp = sofia_reg_find_gateway(gateway->name))) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Ignoring duplicate gateway '%s'\n", gateway->name);
- sofia_reg_release_gateway(gp);
- } else {
- gateway->next = profile->gateways;
- profile->gateways = gateway;
- sofia_reg_add_gateway(gateway->name, gateway);
- }
- }
-
- skip:
- switch_assert(gateway_tag);
- }
-
- }
-
- switch_status_t config_sofia(int reload, char *profile_name)
- {
- char *cf = "sofia.conf";
- switch_xml_t cfg, xml = NULL, xprofile, param, settings, profiles, gateways_tag, domain_tag, domains_tag;
- switch_status_t status = SWITCH_STATUS_SUCCESS;
- sofia_profile_t *profile = NULL;
- char url[512] = "";
- int profile_found = 0;
-
- if (!reload) {
- su_init();
- if (sip_update_default_mclass(sip_extend_mclass(NULL)) < 0) {
- su_deinit();
- return SWITCH_STATUS_FALSE;
- }
-
- su_log_redirect(NULL, logger, NULL);
- su_log_redirect(tport_log, logger, NULL);
- }
-
- if (!switch_strlen_zero(profile_name) && (profile = sofia_glue_find_profile(profile_name))) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Profile [%s] Already exists.\n", switch_str_nil(profile_name));
- status = SWITCH_STATUS_FALSE;
- sofia_glue_release_profile(profile);
- return status;
- }
-
- switch_snprintf(url, sizeof(url), "profile=%s", switch_str_nil(profile_name));
-
- if (!(xml = switch_xml_open_cfg(cf, &cfg, url))) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
- status = SWITCH_STATUS_FALSE;
- goto done;
- }
-
- if ((settings = switch_xml_child(cfg, "global_settings"))) {
- for (param = switch_xml_child(settings, "param"); param; param = param->next) {
- char *var = (char *) switch_xml_attr_soft(param, "name");
- char *val = (char *) switch_xml_attr_soft(param, "value");
- if (!strcasecmp(var, "log-level")) {
- su_log_set_level(NULL, atoi(val));
- }
- }
- }
-
- if ((profiles = switch_xml_child(cfg, "profiles"))) {
- for (xprofile = switch_xml_child(profiles, "profile"); xprofile; xprofile = xprofile->next) {
- if (!(settings = switch_xml_child(xprofile, "settings"))) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No Settings, check the new config!\n");
- } else {
- char *xprofilename = (char *) switch_xml_attr_soft(xprofile, "name");
- switch_memory_pool_t *pool = NULL;
-
- if (!xprofilename) {
- xprofilename = "unnamed";
- }
-
- if (profile_name) {
- if (strcasecmp(profile_name, xprofilename)) {
- continue;
- } else {
- profile_found = 1;
- }
- }
-
- /* Setup the pool */
- if ((status = switch_core_new_memory_pool(&pool)) != SWITCH_STATUS_SUCCESS) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
- goto done;
- }
-
- if (!(profile = (sofia_profile_t *) switch_core_alloc(pool, sizeof(*profile)))) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Memory Error!\n");
- goto done;
- }
-
- profile->pool = pool;
- profile->user_agent = SOFIA_USER_AGENT;
-
- profile->name = switch_core_strdup(profile->pool, xprofilename);
- switch_snprintf(url, sizeof(url), "sofia_reg_%s", xprofilename);
-
- profile->dbname = switch_core_strdup(profile->pool, url);
- switch_core_hash_init(&profile->chat_hash, profile->pool);
- switch_core_hash_init(&profile->sub_hash, profile->pool);
- switch_thread_rwlock_create(&profile->rwlock, profile->pool);
- switch_mutex_init(&profile->flag_mutex, SWITCH_MUTEX_NESTED, profile->pool);
- profile->dtmf_duration = 100;
-
- for (param = switch_xml_child(settings, "param"); param; param = param->next) {
- char *var = (char *) switch_xml_attr_soft(param, "name");
- char *val = (char *) switch_xml_attr_soft(param, "value");
-
- if (!strcasecmp(var, "debug")) {
- profile->debug = atoi(val);
- } else if (!strcasecmp(var, "use-rtp-timer") && switch_true(val)) {
- switch_set_flag(profile, TFLAG_TIMER);
- } else if (!strcasecmp(var, "sip-trace") && switch_true(val)) {
- switch_set_flag(profile, TFLAG_TPORT_LOG);
- } else if (!strcasecmp(var, "odbc-dsn") && !switch_strlen_zero(val)) {
- #ifdef SWITCH_HAVE_ODBC
- profile->odbc_dsn = switch_core_strdup(profile->pool, val);
- if ((profile->odbc_user = strchr(profile->odbc_dsn, ':'))) {
- *profile->odbc_user++ = '\0';
- if ((profile->odbc_pass = strchr(profile->odbc_user, ':'))) {
- *profile->odbc_pass++ = '\0';
- }
- }
-
- #else
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ODBC IS NOT AVAILABLE!\n");
- #endif
-
- } else if (!strcasecmp(var, "user-agent-string")) {
- profile->user_agent = switch_core_strdup(profile->pool, val);;
- } else if (!strcasecmp(var, "inbound-no-media") && switch_true(val)) {
- switch_set_flag(profile, TFLAG_INB_NOMEDIA);
- } else if (!strcasecmp(var, "inbound-late-negotiation") && switch_true(val)) {
- switch_set_flag(profile, TFLAG_LATE_NEGOTIATION);
- } else if (!strcasecmp(var, "rfc2833-pt")) {
- profile->te = (switch_payload_t) atoi(val);
- } else if (!strcasecmp(var, "cng-pt")) {
- profile->cng_pt = (switch_payload_t) atoi(val);
- } else if (!strcasecmp(var, "sip-port")) {
- profile->sip_port = atoi(val);
- } else if (!strcasecmp(var, "vad")) {
- if (!strcasecmp(val, "in")) {
- switch_set_flag(profile, TFLAG_VAD_IN);
- } else if (!strcasecmp(val, "out")) {
- switch_set_flag(profile, TFLAG_VAD_OUT);
- } else if (!strcasecmp(val, "both")) {
- switch_set_flag(profile, TFLAG_VAD_IN);
- switch_set_flag(profile, TFLAG_VAD_OUT);
- } else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invald option %s for VAD\n", val);
- }
- } else if (!strcasecmp(var, "ext-rtp-ip")) {
- profile->extrtpip = switch_core_strdup(profile->pool, strcasecmp(val, "auto") ? val : mod_sofia_globals.guess_ip);
- } else if (!strcasecmp(var, "rtp-ip")) {
- profile->rtpip = switch_core_strdup(profile->pool, strcasecmp(val, "auto") ? val : mod_sofia_globals.guess_ip);
- } else if (!strcasecmp(var, "sip-ip")) {
- profile->sipip = switch_core_strdup(profile->pool, strcasecmp(val, "auto") ? val : mod_sofia_globals.guess_ip);
- } else if (!strcasecmp(var, "ext-sip-ip")) {
- if (!strcasecmp(val, "auto")) {
- profile->extsipip = switch_core_strdup(profile->pool, mod_sofia_globals.guess_ip);
- } else {
- char *ip = mod_sofia_globals.guess_ip;
- switch_port_t port = 0;
- if (sofia_glue_ext_address_lookup(&ip, &port, val, profile->pool) == SWITCH_STATUS_SUCCESS) {
-
- if (ip) {
- profile->extsipip = switch_core_strdup(profile->pool, ip);
- }
- }
- }
- } else if (!strcasecmp(var, "force-register-domain")) {
- profile->reg_domain = switch_core_strdup(profile->pool, val);
- } else if (!strcasecmp(var, "bind-params")) {
- profile->bind_params = switch_core_strdup(profile->pool, val);
- } else if (!strcasecmp(var, "sip-domain")) {
- profile->sipdomain = switch_core_strdup(profile->pool, val);
- } else if (!strcasecmp(var, "rtp-timer-name")) {
- profile->timer_name = switch_core_strdup(profile->pool, val);
- } else if (!strcasecmp(var, "hold-music")) {
- profile->hold_music = switch_core_strdup(profile->pool, val);
- } else if (!strcasecmp(var, "session-timeout")) {
- int v_session_timeout = atoi(val);
- if (v_session_timeout >= 0) {
- profile->session_timeout = v_session_timeout;
- }
- } else if (!strcasecmp(var, "max-proceeding")) {
- int v_max_proceeding = atoi(val);
- if (v_max_proceeding >= 0) {
- profile->max_proceeding = v_max_proceeding;
- }
- } else if (!strcasecmp(var, "rtp-timeout-sec")) {
- int v = atoi(val);
- if (v >= 0) {
- profile->rtp_timeout_sec = v;
- }
- } else if (!strcasecmp(var, "manage-presence")) {
- if (switch_true(val)) {
- profile->pflags |= PFLAG_PRESENCE;
- }
- } else if (!strcasecmp(var, "multiple-registrations")) {
- if (switch_true(val)) {
- profile->pflags |= PFLAG_MULTIREG;
- }
- } else if (!strcasecmp(var, "supress-cng")) {
- if (switch_true(val)) {
- profile->pflags |= PFLAG_SUPRESS_CNG;
- }
- } else if (!strcasecmp(var, "NDLB-to-in-200-contact")) {
- if (switch_true(val)) {
- profile->ndlb |= PFLAG_NDLB_TO_IN_200_CONTACT;
- }
- } else if (!strcasecmp(var, "NDLB-broken-auth-hash")) {
- if (switch_true(val)) {
- profile->ndlb |= PFLAG_NDLB_BROKEN_AUTH_HASH;
- }
- } else if (!strcasecmp(var, "pass-rfc2833")) {
- if (switch_true(val)) {
- profile->pflags |= PFLAG_PASS_RFC2833;
- }
- } else if (!strcasecmp(var, "inbound-codec-negotiation")) {
- if (!strcasecmp(val, "greedy")) {
- profile->pflags |= PFLAG_GREEDY;
- }
- } else if (!strcasecmp(var, "disable-transcoding")) {
- if (switch_true(val)) {
- profile->pflags |= PFLAG_DISABLE_TRANSCODING;
- }
- } else if (!strcasecmp(var, "rtp-rewrite-timestamps")) {
- if (switch_true(val)) {
- profile->pflags |= PFLAG_REWRITE_TIMESTAMPS;
- }
- } else if (!strcasecmp(var, "auth-calls")) {
- if (switch_true(val)) {
- profile->pflags |= PFLAG_AUTH_CALLS;
- }
- } else if (!strcasecmp(var, "nonce-ttl")) {
- profile->nonce_ttl = atoi(val);
- } else if (!strcasecmp(var, "accept-blind-reg")) {
- if (switch_true(val)) {
- profile->pflags |= PFLAG_BLIND_REG;
- }
- } else if (!strcasecmp(var, "auth-all-packets")) {
- if (switch_true(val)) {
- profile->pflags |= PFLAG_AUTH_ALL;
- }
- } else if (!strcasecmp(var, "full-id-in-dialplan")) {
- if (switch_true(val)) {
- profile->pflags |= PFLAG_FULL_ID;
- }
- } else if (!strcasecmp(var, "bitpacking")) {
- if (!strcasecmp(val, "aal2")) {
- profile->codec_flags = SWITCH_CODEC_FLAG_AAL2;
- }
- } else if (!strcasecmp(var, "username")) {
- profile->username = switch_core_strdup(profile->pool, val);
- } else if (!strcasecmp(var, "context")) {
- profile->context = switch_core_strdup(profile->pool, val);
- } else if (!strcasecmp(var, "alias")) {
- sip_alias_node_t *node;
- if ((node = switch_core_alloc(profile->pool, sizeof(*node)))) {
- if ((node->url = switch_core_strdup(profile->pool, val))) {
- node->next = profile->aliases;
- profile->aliases = node;
- }
- }
- } else if (!strcasecmp(var, "dialplan")) {
- profile->dialplan = switch_core_strdup(profile->pool, val);
- } else if (!strcasecmp(var, "max-calls")) {
- profile->max_calls = atoi(val);
- } else if (!strcasecmp(var, "codec-prefs")) {
- profile->codec_string = switch_core_strdup(profile->pool, val);
- } else if (!strcasecmp(var, "dtmf-duration")) {
- int dur = atoi(val);
- if (dur > 10 && dur < 8000) {
- profile->dtmf_duration = dur;
- } else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Duration out of bounds!\n");
- }
- }
- }
-
- if (!profile->cng_pt) {
- profile->cng_pt = SWITCH_RTP_CNG_PAYLOAD;
- }
-
- if (!profile->sipip) {
- profile->sipip = switch_core_strdup(profile->pool, mod_sofia_globals.guess_ip);
- }
-
- if (!profile->rtpip) {
- profile->rtpip = switch_core_strdup(profile->pool, mod_sofia_globals.guess_ip);
- }
-
- if (profile->nonce_ttl < 60) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Setting nonce TTL to 60 seconds\n");
- profile->nonce_ttl = 60;
- }
-
- if (switch_test_flag(profile, TFLAG_TIMER) && !profile->timer_name) {
- profile->timer_name = switch_core_strdup(profile->pool, "soft");
- }
-
- if (!profile->username) {
- profile->username = switch_core_strdup(profile->pool, "FreeSWITCH");
- }
-
- if (!profile->rtpip) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Setting ip to '127.0.0.1'\n");
- profile->rtpip = switch_core_strdup(profile->pool, "127.0.0.1");
- }
-
- if (!profile->sip_port) {
- profile->sip_port = atoi(SOFIA_DEFAULT_PORT);
- }
-
- if (!profile->dialplan) {
- profile->dialplan = switch_core_strdup(profile->pool, "XML");
- }
-
- if (!profile->sipdomain) {
- profile->sipdomain = switch_core_strdup(profile->pool, profile->sipip);
- }
- if (profile->extsipip) {
- profile->url = switch_core_sprintf(profile->pool, "sip:mod_sofia@%s:%d", profile->extsipip, profile->sip_port);
- profile->bindurl = switch_core_sprintf(profile->pool, "%s;maddr=%s", profile->url, profile->sipip);
- } else {
- profile->url = switch_core_sprintf(profile->pool, "sip:mod_sofia@%s:%d", profile->sipip, profile->sip_port);
- profile->bindurl = profile->url;
- }
-
- if (profile->bind_params) {
- char *bindurl = profile->bindurl;
- profile->bindurl = switch_core_sprintf(profile->pool, "%s;%s", bindurl, profile->bind_params);
- }
-
- }
- if (profile) {
- switch_xml_t aliases_tag, alias_tag;
+ gateway->freq = 3600;
+ }
+ gateway->freq -= 2;
+
+ if ((gp = sofia_reg_find_gateway(gateway->name))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Ignoring duplicate gateway '%s'\n", gateway->name);
+ sofia_reg_release_gateway(gp);
+ } else {
+ gateway->next = profile->gateways;
+ profile->gateways = gateway;
+ sofia_reg_add_gateway(gateway->name, gateway);
+ }
+ }
+
+ skip:
+ switch_assert(gateway_tag);
+ }
+
+}
+
+switch_status_t config_sofia(int reload, char *profile_name)
+{
+ char *cf = "sofia.conf";
+ switch_xml_t cfg, xml = NULL, xprofile, param, settings, profiles, gateways_tag, domain_tag, domains_tag;
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+ sofia_profile_t *profile = NULL;
+ char url[512] = "";
+ int profile_found = 0;
- if ((gateways_tag = switch_xml_child(xprofile, "registrations"))) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT,
+ if (!reload) {
+ su_init();
+ if (sip_update_default_mclass(sip_extend_mclass(NULL)) < 0) {
+ su_deinit();
+ return SWITCH_STATUS_FALSE;
+ }
+
+ su_log_redirect(NULL, logger, NULL);
+ su_log_redirect(tport_log, logger, NULL);
+ }
+
+ if (!switch_strlen_zero(profile_name) && (profile = sofia_glue_find_profile(profile_name))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Profile [%s] Already exists.\n", switch_str_nil(profile_name));
+ status = SWITCH_STATUS_FALSE;
+ sofia_glue_release_profile(profile);
+ return status;
+ }
+
+ switch_snprintf(url, sizeof(url), "profile=%s", switch_str_nil(profile_name));
+
+ if (!(xml = switch_xml_open_cfg(cf, &cfg, url))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
+ status = SWITCH_STATUS_FALSE;
+ goto done;
+ }
+
+ if ((settings = switch_xml_child(cfg, "global_settings"))) {
+ for (param = switch_xml_child(settings, "param"); param; param = param->next) {
+ char *var = (char *) switch_xml_attr_soft(param, "name");
+ char *val = (char *) switch_xml_attr_soft(param, "value");
+ if (!strcasecmp(var, "log-level")) {
+ su_log_set_level(NULL, atoi(val));
+ }
+ }
+ }
+
+ if ((profiles = switch_xml_child(cfg, "profiles"))) {
+ for (xprofile = switch_xml_child(profiles, "profile"); xprofile; xprofile = xprofile->next) {
+ if (!(settings = switch_xml_child(xprofile, "settings"))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No Settings, check the new config!\n");
+ } else {
+ char *xprofilename = (char *) switch_xml_attr_soft(xprofile, "name");
+ switch_memory_pool_t *pool = NULL;
+
+ if (!xprofilename) {
+ xprofilename = "unnamed";
+ }
+
+ if (profile_name) {
+ if (strcasecmp(profile_name, xprofilename)) {
+ continue;
+ } else {
+ profile_found = 1;
+ }
+ }
+
+ /* Setup the pool */
+ if ((status = switch_core_new_memory_pool(&pool)) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
+ goto done;
+ }
+
+ if (!(profile = (sofia_profile_t *) switch_core_alloc(pool, sizeof(*profile)))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Memory Error!\n");
+ goto done;
+ }
+
+ profile->pool = pool;
+ profile->user_agent = SOFIA_USER_AGENT;
+
+ profile->name = switch_core_strdup(profile->pool, xprofilename);
+ switch_snprintf(url, sizeof(url), "sofia_reg_%s", xprofilename);
+
+ profile->dbname = switch_core_strdup(profile->pool, url);
+ switch_core_hash_init(&profile->chat_hash, profile->pool);
+ switch_core_hash_init(&profile->sub_hash, profile->pool);
+ switch_thread_rwlock_create(&profile->rwlock, profile->pool);
+ switch_mutex_init(&profile->flag_mutex, SWITCH_MUTEX_NESTED, profile->pool);
+ profile->dtmf_duration = 100;
+
+ for (param = switch_xml_child(settings, "param"); param; param = param->next) {
+ char *var = (char *) switch_xml_attr_soft(param, "name");
+ char *val = (char *) switch_xml_attr_soft(param, "value");
+
+ if (!strcasecmp(var, "debug")) {
+ profile->debug = atoi(val);
+ } else if (!strcasecmp(var, "use-rtp-timer") && switch_true(val)) {
+ switch_set_flag(profile, TFLAG_TIMER);
+ } else if (!strcasecmp(var, "sip-trace") && switch_true(val)) {
+ switch_set_flag(profile, TFLAG_TPORT_LOG);
+ } else if (!strcasecmp(var, "odbc-dsn") && !switch_strlen_zero(val)) {
+#ifdef SWITCH_HAVE_ODBC
+ profile->odbc_dsn = switch_core_strdup(profile->pool, val);
+ if ((profile->odbc_user = strchr(profile->odbc_dsn, ':'))) {
+ *profile->odbc_user++ = '\0';
+ if ((profile->odbc_pass = strchr(profile->odbc_user, ':'))) {
+ *profile->odbc_pass++ = '\0';
+ }
+ }
+
+#else
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ODBC IS NOT AVAILABLE!\n");
+#endif
+
+ } else if (!strcasecmp(var, "user-agent-string")) {
+ profile->user_agent = switch_core_strdup(profile->pool, val);;
+ } else if (!strcasecmp(var, "inbound-no-media") && switch_true(val)) {
+ switch_set_flag(profile, TFLAG_INB_NOMEDIA);
+ } else if (!strcasecmp(var, "inbound-late-negotiation") && switch_true(val)) {
+ switch_set_flag(profile, TFLAG_LATE_NEGOTIATION);
+ } else if (!strcasecmp(var, "rfc2833-pt")) {
+ profile->te = (switch_payload_t) atoi(val);
+ } else if (!strcasecmp(var, "cng-pt")) {
+ profile->cng_pt = (switch_payload_t) atoi(val);
+ } else if (!strcasecmp(var, "sip-port")) {
+ profile->sip_port = atoi(val);
+ } else if (!strcasecmp(var, "vad")) {
+ if (!strcasecmp(val, "in")) {
+ switch_set_flag(profile, TFLAG_VAD_IN);
+ } else if (!strcasecmp(val, "out")) {
+ switch_set_flag(profile, TFLAG_VAD_OUT);
+ } else if (!strcasecmp(val, "both")) {
+ switch_set_flag(profile, TFLAG_VAD_IN);
+ switch_set_flag(profile, TFLAG_VAD_OUT);
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invald option %s for VAD\n", val);
+ }
+ } else if (!strcasecmp(var, "ext-rtp-ip")) {
+ profile->extrtpip = switch_core_strdup(profile->pool, strcasecmp(val, "auto") ? val : mod_sofia_globals.guess_ip);
+ } else if (!strcasecmp(var, "rtp-ip")) {
+ profile->rtpip = switch_core_strdup(profile->pool, strcasecmp(val, "auto") ? val : mod_sofia_globals.guess_ip);
+ } else if (!strcasecmp(var, "sip-ip")) {
+ profile->sipip = switch_core_strdup(profile->pool, strcasecmp(val, "auto") ? val : mod_sofia_globals.guess_ip);
+ } else if (!strcasecmp(var, "ext-sip-ip")) {
+ if (!strcasecmp(val, "auto")) {
+ profile->extsipip = switch_core_strdup(profile->pool, mod_sofia_globals.guess_ip);
+ } else {
+ char *ip = mod_sofia_globals.guess_ip;
+ switch_port_t port = 0;
+ if (sofia_glue_ext_address_lookup(&ip, &port, val, profile->pool) == SWITCH_STATUS_SUCCESS) {
+
+ if (ip) {
+ profile->extsipip = switch_core_strdup(profile->pool, ip);
+ }
+ }
+ }
+ } else if (!strcasecmp(var, "force-register-domain")) {
+ profile->reg_domain = switch_core_strdup(profile->pool, val);
+ } else if (!strcasecmp(var, "bind-params")) {
+ profile->bind_params = switch_core_strdup(profile->pool, val);
+ } else if (!strcasecmp(var, "sip-domain")) {
+ profile->sipdomain = switch_core_strdup(profile->pool, val);
+ } else if (!strcasecmp(var, "rtp-timer-name")) {
+ profile->timer_name = switch_core_strdup(profile->pool, val);
+ } else if (!strcasecmp(var, "hold-music")) {
+ profile->hold_music = switch_core_strdup(profile->pool, val);
+ } else if (!strcasecmp(var, "session-timeout")) {
+ int v_session_timeout = atoi(val);
+ if (v_session_timeout >= 0) {
+ profile->session_timeout = v_session_timeout;
+ }
+ } else if (!strcasecmp(var, "max-proceeding")) {
+ int v_max_proceeding = atoi(val);
+ if (v_max_proceeding >= 0) {
+ profile->max_proceeding = v_max_proceeding;
+ }
+ } else if (!strcasecmp(var, "rtp-timeout-sec")) {
+ int v = atoi(val);
+ if (v >= 0) {
+ profile->rtp_timeout_sec = v;
+ }
+ } else if (!strcasecmp(var, "manage-presence")) {
+ if (switch_true(val)) {
+ profile->pflags |= PFLAG_PRESENCE;
+ }
+ } else if (!strcasecmp(var, "multiple-registrations")) {
+ if (switch_true(val)) {
+ profile->pflags |= PFLAG_MULTIREG;
+ }
+ } else if (!strcasecmp(var, "supress-cng")) {
+ if (switch_true(val)) {
+ profile->pflags |= PFLAG_SUPRESS_CNG;
+ }
+ } else if (!strcasecmp(var, "NDLB-to-in-200-contact")) {
+ if (switch_true(val)) {
+ profile->ndlb |= PFLAG_NDLB_TO_IN_200_CONTACT;
+ }
+ } else if (!strcasecmp(var, "NDLB-broken-auth-hash")) {
+ if (switch_true(val)) {
+ profile->ndlb |= PFLAG_NDLB_BROKEN_AUTH_HASH;
+ }
+ } else if (!strcasecmp(var, "pass-rfc2833")) {
+ if (switch_true(val)) {
+ profile->pflags |= PFLAG_PASS_RFC2833;
+ }
+ } else if (!strcasecmp(var, "inbound-codec-negotiation")) {
+ if (!strcasecmp(val, "greedy")) {
+ profile->pflags |= PFLAG_GREEDY;
+ }
+ } else if (!strcasecmp(var, "disable-transcoding")) {
+ if (switch_true(val)) {
+ profile->pflags |= PFLAG_DISABLE_TRANSCODING;
+ }
+ } else if (!strcasecmp(var, "rtp-rewrite-timestamps")) {
+ if (switch_true(val)) {
+ profile->pflags |= PFLAG_REWRITE_TIMESTAMPS;
+ }
+ } else if (!strcasecmp(var, "auth-calls")) {
+ if (switch_true(val)) {
+ profile->pflags |= PFLAG_AUTH_CALLS;
+ }
+ } else if (!strcasecmp(var, "nonce-ttl")) {
+ profile->nonce_ttl = atoi(val);
+ } else if (!strcasecmp(var, "accept-blind-reg")) {
+ if (switch_true(val)) {
+ profile->pflags |= PFLAG_BLIND_REG;
+ }
+ } else if (!strcasecmp(var, "auth-all-packets")) {
+ if (switch_true(val)) {
+ profile->pflags |= PFLAG_AUTH_ALL;
+ }
+ } else if (!strcasecmp(var, "full-id-in-dialplan")) {
+ if (switch_true(val)) {
+ profile->pflags |= PFLAG_FULL_ID;
+ }
+ } else if (!strcasecmp(var, "bitpacking")) {
+ if (!strcasecmp(val, "aal2")) {
+ profile->codec_flags = SWITCH_CODEC_FLAG_AAL2;
+ }
+ } else if (!strcasecmp(var, "username")) {
+ profile->username = switch_core_strdup(profile->pool, val);
+ } else if (!strcasecmp(var, "context")) {
+ profile->context = switch_core_strdup(profile->pool, val);
+ } else if (!strcasecmp(var, "alias")) {
+ sip_alias_node_t *node;
+ if ((node = switch_core_alloc(profile->pool, sizeof(*node)))) {
+ if ((node->url = switch_core_strdup(profile->pool, val))) {
+ node->next = profile->aliases;
+ profile->aliases = node;
+ }
+ }
+ } else if (!strcasecmp(var, "dialplan")) {
+ profile->dialplan = switch_core_strdup(profile->pool, val);
+ } else if (!strcasecmp(var, "max-calls")) {
+ profile->max_calls = atoi(val);
+ } else if (!strcasecmp(var, "codec-prefs")) {
+ profile->codec_string = switch_core_strdup(profile->pool, val);
+ } else if (!strcasecmp(var, "dtmf-duration")) {
+ int dur = atoi(val);
+ if (dur > 10 && dur < 8000) {
+ profile->dtmf_duration = dur;
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Duration out of bounds!\n");
+ }
+ }
+ }
+
+ if (!profile->cng_pt) {
+ profile->cng_pt = SWITCH_RTP_CNG_PAYLOAD;
+ }
+
+ if (!profile->sipip) {
+ profile->sipip = switch_core_strdup(profile->pool, mod_sofia_globals.guess_ip);
+ }
+
+ if (!profile->rtpip) {
+ profile->rtpip = switch_core_strdup(profile->pool, mod_sofia_globals.guess_ip);
+ }
+
+ if (profile->nonce_ttl < 60) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Setting nonce TTL to 60 seconds\n");
+ profile->nonce_ttl = 60;
+ }
+
+ if (switch_test_flag(profile, TFLAG_TIMER) && !profile->timer_name) {
+ profile->timer_name = switch_core_strdup(profile->pool, "soft");
+ }
+
+ if (!profile->username) {
+ profile->username = switch_core_strdup(profile->pool, "FreeSWITCH");
+ }
+
+ if (!profile->rtpip) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Setting ip to '127.0.0.1'\n");
+ profile->rtpip = switch_core_strdup(profile->pool, "127.0.0.1");
+ }
+
+ if (!profile->sip_port) {
+ profile->sip_port = atoi(SOFIA_DEFAULT_PORT);
+ }
+
+ if (!profile->dialplan) {
+ profile->dialplan = switch_core_strdup(profile->pool, "XML");
+ }
+
+ if (!profile->sipdomain) {
+ profile->sipdomain = switch_core_strdup(profile->pool, profile->sipip);
+ }
+ if (profile->extsipip) {
+ profile->url = switch_core_sprintf(profile->pool, "sip:mod_sofia@%s:%d", profile->extsipip, profile->sip_port);
+ profile->bindurl = switch_core_sprintf(profile->pool, "%s;maddr=%s", profile->url, profile->sipip);
+ } else {
+ profile->url = switch_core_sprintf(profile->pool, "sip:mod_sofia@%s:%d", profile->sipip, profile->sip_port);
+ profile->bindurl = profile->url;
+ }
+
+ if (profile->bind_params) {
+ char *bindurl = profile->bindurl;
+ profile->bindurl = switch_core_sprintf(profile->pool, "%s;%s", bindurl, profile->bind_params);
+ }
+
+ }
+ if (profile) {
+ switch_xml_t aliases_tag, alias_tag;
+
+ if ((gateways_tag = switch_xml_child(xprofile, "registrations"))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT,
"The <registrations> syntax has been discontinued, please see the new syntax in the default configuration examples\n");
- } else if ((gateways_tag = switch_xml_child(xprofile, "gateways"))) {
- parse_gateways(profile, gateways_tag);
- }
-
- if ((domains_tag = switch_xml_child(xprofile, "domains"))) {
- for (domain_tag = switch_xml_child(domains_tag, "domain"); domain_tag; domain_tag = domain_tag->next) {
- switch_xml_t droot, actual_domain_tag, ut;
- char *dname = (char *) switch_xml_attr_soft(domain_tag, "name");
- char *parse = (char *) switch_xml_attr_soft(domain_tag, "parse");
-
- if (!switch_strlen_zero(dname)) {
- if (switch_true(parse)) {
- if (switch_xml_locate_domain(dname, NULL, &droot, &actual_domain_tag) == SWITCH_STATUS_SUCCESS) {
- for (ut = switch_xml_child(actual_domain_tag, "user"); ut; ut = ut->next) {
- if (((gateways_tag = switch_xml_child(ut, "gateways")))) {
- parse_gateways(profile, gateways_tag);
- }
- }
- switch_xml_free(droot);
- }
- }
- sofia_glue_add_profile(switch_core_strdup(profile->pool, dname), profile);
- }
- }
- }
-
- if ((aliases_tag = switch_xml_child(xprofile, "aliases"))) {
- for (alias_tag = switch_xml_child(aliases_tag, "alias"); alias_tag; alias_tag = alias_tag->next) {
- char *aname = (char *) switch_xml_attr_soft(alias_tag, "name");
- if (!switch_strlen_zero(aname)) {
-
- if (sofia_glue_add_profile(switch_core_strdup(profile->pool, aname), profile) == SWITCH_STATUS_SUCCESS) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Adding Alias [%s] for profile [%s]\n", aname, profile->name);
- } else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Adding Alias [%s] for profile [%s] (name in use)\n",
+ } else if ((gateways_tag = switch_xml_child(xprofile, "gateways"))) {
+ parse_gateways(profile, gateways_tag);
+ }
+
+ if ((domains_tag = switch_xml_child(xprofile, "domains"))) {
+ for (domain_tag = switch_xml_child(domains_tag, "domain"); domain_tag; domain_tag = domain_tag->next) {
+ switch_xml_t droot, actual_domain_tag, ut;
+ char *dname = (char *) switch_xml_attr_soft(domain_tag, "name");
+ char *parse = (char *) switch_xml_attr_soft(domain_tag, "parse");
+
+ if (!switch_strlen_zero(dname)) {
+ if (switch_true(parse)) {
+ if (switch_xml_locate_domain(dname, NULL, &droot, &actual_domain_tag) == SWITCH_STATUS_SUCCESS) {
+ for (ut = switch_xml_child(actual_domain_tag, "user"); ut; ut = ut->next) {
+ if (((gateways_tag = switch_xml_child(ut, "gateways")))) {
+ parse_gateways(profile, gateways_tag);
+ }
+ }
+ switch_xml_free(droot);
+ }
+ }
+ sofia_glue_add_profile(switch_core_strdup(profile->pool, dname), profile);
+ }
+ }
+ }
+
+ if ((aliases_tag = switch_xml_child(xprofile, "aliases"))) {
+ for (alias_tag = switch_xml_child(aliases_tag, "alias"); alias_tag; alias_tag = alias_tag->next) {
+ char *aname = (char *) switch_xml_attr_soft(alias_tag, "name");
+ if (!switch_strlen_zero(aname)) {
+
+ if (sofia_glue_add_profile(switch_core_strdup(profile->pool, aname), profile) == SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Adding Alias [%s] for profile [%s]\n", aname, profile->name);
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Adding Alias [%s] for profile [%s] (name in use)\n",
aname, profile->name);
- }
- }
- }
- }
-
- if (profile->sipip) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Started Profile %s [%s]\n", profile->name, url);
- launch_sofia_profile_thread(profile);
- } else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Unable to start Profile %s due to no configured sip-ip\n", profile->name);
- }
- profile = NULL;
- }
- if (profile_found) {
- break;
- }
- }
- }
- done:
- if (xml) {
- switch_xml_free(xml);
- }
-
- if (profile_name && !profile_found) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "No Such Profile '%s'\n", profile_name);
- status = SWITCH_STATUS_FALSE;
- }
+ }
+ }
+ }
+ }
- return status;
+ if (profile->sipip) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Started Profile %s [%s]\n", profile->name, url);
+ launch_sofia_profile_thread(profile);
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Unable to start Profile %s due to no configured sip-ip\n", profile->name);
+ }
+ profile = NULL;
+ }
+ if (profile_found) {
+ break;
+ }
+ }
+ }
+ done:
+ if (xml) {
+ switch_xml_free(xml);
+ }
+
+ if (profile_name && !profile_found) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "No Such Profile '%s'\n", profile_name);
+ status = SWITCH_STATUS_FALSE;
+ }
- }
+ return status;
- static void sofia_handle_sip_r_invite(switch_core_session_t *session, int status,
+}
+
+static void sofia_handle_sip_r_invite(switch_core_session_t *session, int status,
char const *phrase,
nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, sofia_private_t *sofia_private, sip_t const *sip, tagi_t tags[])
- {
+{
- if (sip && session && (status == 180 || status == 183 || status == 200)) {
- switch_channel_t *channel = switch_core_session_get_channel(session);
- const char *astate = "early";
- url_t *from = NULL, *to = NULL, *contact = NULL;
-
- if (sip->sip_to) {
- to = sip->sip_to->a_url;
- }
- if (sip->sip_from) {
- from = sip->sip_from->a_url;
- }
- if (sip->sip_contact) {
- contact = sip->sip_contact->m_url;
- }
-
- if (status == 200) {
- astate = "confirmed";
- }
+ if (sip && session && (status == 180 || status == 183 || status == 200)) {
+ switch_channel_t *channel = switch_core_session_get_channel(session);
+ const char *astate = "early";
+ url_t *from = NULL, *to = NULL, *contact = NULL;
+
+ if (sip->sip_to) {
+ to = sip->sip_to->a_url;
+ }
+ if (sip->sip_from) {
+ from = sip->sip_from->a_url;
+ }
+ if (sip->sip_contact) {
+ contact = sip->sip_contact->m_url;
+ }
+
+ if (status == 200) {
+ astate = "confirmed";
+ }
- if (!switch_channel_test_flag(channel, CF_EARLY_MEDIA) && !switch_channel_test_flag(channel, CF_ANSWERED) &&
- !switch_channel_test_flag(channel, CF_RING_READY)) {
+ if (!switch_channel_test_flag(channel, CF_EARLY_MEDIA) && !switch_channel_test_flag(channel, CF_ANSWERED) &&
+ !switch_channel_test_flag(channel, CF_RING_READY)) {
const char *from_user = "", *from_host = "", *to_user = "", *to_host = "", *contact_user = "", *contact_host = "";
const char *user_agent = "", *call_id = "";
char *sql = NULL;
More information about the Freeswitch-trunk
mailing list