[commit] r5043 - in freeswitch/trunk: conf src src/mod/endpoints/mod_sofia
Author: anthm Date: Mon Apr 30 16:35:35 2007 New Revision: 5043 Modified: freeswitch/trunk/conf/directory.xml freeswitch/trunk/conf/sofia.conf.xml freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_reg.c freeswitch/trunk/src/switch_xml.c Log: more changes to sofia to make better use of the directories Modified: freeswitch/trunk/conf/directory.xml ============================================================================== --- freeswitch/trunk/conf/directory.xml (original) +++ freeswitch/trunk/conf/directory.xml Mon Apr 30 16:35:35 2007 @@ -2,61 +2,35 @@ <domain name="$${domain}"> <!--the user id (the left hand side of the @ in the addr--> <user id="stpeter"> + <!-- Outbound Registrations Related to this user --> + <gateways> + <!--<gateway name="asterlink.com">--> + <!--/// account username *required* ///--> + <!--<param name="username" value="cluecon"/>--> + <!--/// auth realm: *optional* same as gateway name, if blank ///--> + <!--<param name="realm" value="asterlink.com"/>--> + <!--/// account password *required* ///--> + <!--<param name="password" value="2007"/>--> + <!--/// replace the INVITE from user with the channel's caller-id ///--> + <!--<param name="caller-id-in-from" value="false"/>--> + <!--/// extension for inbound calls: *optional* same as username, if blank ///--> + <!--<param name="extension" value="cluecon"/>--> + <!--/// proxy host: *optional* same as realm, if blank ///--> + <!--<param name="proxy" value="asterlink.com"/>--> + <!--/// expire in seconds: *optional* 3600, if blank ///--> + <!--<param name="expire-seconds" value="60"/>--> + <!--/// do not register ///--> + <!--<param name="register" value="false"/>--> + <!--</gateway>--> + </gateways> <params> <!-- omit password for authless registration --> <param name="password" value="mypass"/> <!-- optionally use this instead if you want to store the hash of user:domain:pass--> <!--<param name="a1-hash" value="c6440e5de50b403206989679159de89a"/>--> </params> - - <!-- This is only for mod_dingaling so it can deliver vcards in component mode--> - <vcard xmlns='vcard-temp'> - <FN>Peter Saint-Andre</FN> - <N> - <FAMILY>Saint-Andre</FAMILY> - <GIVEN>Peter</GIVEN> - <MIDDLE/> - </N> - <NICKNAME>stpeter</NICKNAME> - <URL>http://www.jabber.org/people/stpeter.php</URL> - <BDAY>1966-08-06</BDAY> - <ORG> - <ORGNAME>Jabber Software Foundation</ORGNAME> - <ORGUNIT>Jabber Software Foundation</ORGUNIT> - </ORG> - <TITLE>Executive Director</TITLE> - <ROLE>Patron Saint</ROLE> - <TEL><WORK/><VOICE/><NUMBER>303-308-3282</NUMBER></TEL> - <TEL><WORK/><FAX/><NUMBER/></TEL> - <TEL><WORK/><MSG/><NUMBER/></TEL> - <ADR> - <WORK/> - <EXTADD>Suite 600</EXTADD> - <STREET>1899 Wynkoop Street</STREET> - <LOCALITY>Denver</LOCALITY> - <REGION>CO</REGION> - <PCODE>80202</PCODE> - <CTRY>USA</CTRY> - </ADR> - <TEL><HOME/><VOICE/><NUMBER>303-555-1212</NUMBER></TEL> - <TEL><HOME/><FAX/><NUMBER/></TEL> - <TEL><HOME/><MSG/><NUMBER/></TEL> - <ADR> - <HOME/> - <EXTADD/> - <STREET/> - <LOCALITY>Denver</LOCALITY> - <REGION>CO</REGION> - <PCODE>80209</PCODE> - <CTRY>USA</CTRY> - </ADR> - <EMAIL><INTERNET/><PREF/><USERID>stpeter@jabber.org</USERID></EMAIL> - <JABBERID>stpeter@jabber.org</JABBERID> - <DESC> - More information about me is located on my - personal website: http://www.saint-andre.com/ - </DESC> + <vcard> + <!-- insert optional compliant vcard xml here--> </vcard> - </user> </domain> Modified: freeswitch/trunk/conf/sofia.conf.xml ============================================================================== --- freeswitch/trunk/conf/sofia.conf.xml (original) +++ freeswitch/trunk/conf/sofia.conf.xml Mon Apr 30 16:35:35 2007 @@ -1,6 +1,10 @@ <configuration name="sofia.conf" description="sofia Endpoint"> <profiles> <profile name="$${sip_profile}"> + <!--aliases are other names that will work as a valid profile name for this profile--> + <aliases> + <alias name="default"/> + </aliases> <!-- Outbound Registrations --> <gateways> <!--<gateway name="asterlink.com">--> @@ -22,6 +26,12 @@ <!--<param name="register" value="false"/>--> <!--</gateway>--> </gateways> + + <domains> + <!-- indicator to parse the directory for domains with parse="true" to get gateways--> + <!--<domain name="$${domain}" parse="true"/>--> + </domains> + <settings> <param name="debug" value="1"/> <param name="rfc2833-pt" value="101"/> Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c ============================================================================== --- freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c (original) +++ freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c Mon Apr 30 16:35:35 2007 @@ -893,19 +893,35 @@ sofia_profile_t *profile = NULL; switch_hash_index_t *hi; void *val; + const void *vvar; int c = 0; + int ac = 0; + const char *line = "================================================================================"; + + + stream->write_function(stream, "%25s\t%s\t %32s\n", "Name", " Type", "Data"); + stream->write_function(stream, "%s\n", line); switch_mutex_lock(mod_sofia_globals.hash_mutex); for (hi = switch_hash_first(switch_hash_pool_get(mod_sofia_globals.profile_hash), mod_sofia_globals.profile_hash); hi; hi = switch_hash_next(hi)) { - switch_hash_this(hi, NULL, NULL, &val); + switch_hash_this(hi, &vvar, NULL, &val); profile = (sofia_profile_t *) val; if (sofia_test_pflag(profile, PFLAG_RUNNING)) { - stream->write_function(stream, "Profile %s\n", profile->name); - c++; + + if (strcmp(vvar, profile->name)) { + ac++; + stream->write_function(stream, "%25s\t%s\t %32s\n", vvar, " alias", profile->name); + } else { + stream->write_function(stream, "%25s\t%s\t %32s\n", profile->name, "profile", profile->url); + c++; + } + + } } switch_mutex_unlock(mod_sofia_globals.hash_mutex); - stream->write_function(stream, "%d profiles\n", c); + stream->write_function(stream, "%s\n", line); + stream->write_function(stream, "%d profiles %d aliases\n", c, ac); return SWITCH_STATUS_SUCCESS; } Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h ============================================================================== --- freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h (original) +++ freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h Mon Apr 30 16:35:35 2007 @@ -437,14 +437,14 @@ nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, sofia_private_t *sofia_private, sip_t const *sip, tagi_t tags[]); sofia_profile_t *sofia_glue_find_profile(char *key); -void sofia_glue_add_profile(char *key, sofia_profile_t *profile); +switch_status_t sofia_glue_add_profile(char *key, sofia_profile_t *profile); void sofia_glue_execute_sql(sofia_profile_t *profile, switch_bool_t master, char *sql, switch_mutex_t *mutex); void sofia_reg_check_expire(sofia_profile_t *profile, time_t now); void sofia_reg_check_gateway(sofia_profile_t *profile, time_t now); void sofia_reg_unregister(sofia_profile_t *profile); switch_status_t sofia_glue_ext_address_lookup(char **ip, switch_port_t *port, char *sourceip, switch_memory_pool_t *pool); sofia_gateway_t *sofia_reg_find_gateway(char *key); -void sofia_reg_add_gateway(char *key, sofia_gateway_t *gateway); +switch_status_t sofia_reg_add_gateway(char *key, sofia_gateway_t *gateway); void sofia_glue_pass_sdp(private_object_t *tech_pvt, char *sdp); int sofia_glue_get_user_host(char *in, char **user, char **host); switch_call_cause_t sofia_glue_sip_cause_to_freeswitch(int status); @@ -467,3 +467,4 @@ char *sofia_glue_execute_sql2str(sofia_profile_t *profile, switch_mutex_t *mutex, char *sql, char *resbuf, size_t len); void sofia_glue_check_video_codecs(private_object_t *tech_pvt); void sofia_reg_release_gateway(sofia_gateway_t *gateway); +void sofia_glue_del_profile(sofia_profile_t *profile); 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 Mon Apr 30 16:35:35 2007 @@ -380,9 +380,8 @@ su_root_destroy(profile->s_root); pool = profile->pool; - switch_mutex_lock(mod_sofia_globals.hash_mutex); - switch_core_hash_delete(mod_sofia_globals.profile_hash, profile->name); - switch_mutex_unlock(mod_sofia_globals.hash_mutex); + + sofia_glue_del_profile(profile); switch_thread_rwlock_unlock(profile->rwlock); @@ -436,14 +435,148 @@ } +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"; + + gateway->pool = profile->pool; + gateway->profile = profile; + gateway->name = switch_core_strdup(gateway->pool, name); + gateway->freq = 0; + + + 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; + } + } + + 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(extension)) { + extension = username; + } + + if (switch_strlen_zero(proxy)) { + proxy = realm; + } + + if (!switch_true(register_str)) { + gateway->state = REG_STATE_NOREG; + } + 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); + } + gateway->register_from = switch_core_sprintf(gateway->pool, "sip:%s@%s", username, realm); + gateway->register_contact = switch_core_sprintf(gateway->pool, "sip:%s@%s:%d", extension, profile->sipip, profile->sip_port); + + 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); + + 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; + + gateway->next = profile->gateways; + profile->gateways = gateway; + + 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 if ((gp=sofia_reg_find_gateway(gateway->register_from))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Ignoring duplicate uri '%s'\n", gateway->register_from); + sofia_reg_release_gateway(gp); + } else if ((gp=sofia_reg_find_gateway(gateway->register_contact))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Ignoring duplicate contact '%s'\n", gateway->register_from); + sofia_reg_release_gateway(gp); + } else { + sofia_reg_add_gateway(gateway->name, gateway); + sofia_reg_add_gateway(gateway->register_from, gateway); + sofia_reg_add_gateway(gateway->register_contact, gateway); + } + } + + skip: + 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, gateway_tag, gateways_tag; + 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] = ""; - sofia_gateway_t *gp; int profile_found = 0; if (!reload) { @@ -713,143 +846,52 @@ } } 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 ((gateways_tag = switch_xml_child(xprofile, "gateways"))) { - 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"; - - gateway->pool = profile->pool; - gateway->profile = profile; - gateway->name = switch_core_strdup(gateway->pool, name); - gateway->freq = 0; - - - 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; + 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); + } + } } } + 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 (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"); - switch_xml_free(xml); - goto skip; - } - - if (switch_strlen_zero(password)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ERROR: password param is REQUIRED!\n"); - switch_xml_free(xml); - goto skip; - } - - if (switch_strlen_zero(extension)) { - extension = username; - } - - if (switch_strlen_zero(proxy)) { - proxy = realm; - } - - if (!switch_true(register_str)) { - gateway->state = REG_STATE_NOREG; - } - 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); - } - gateway->register_from = switch_core_sprintf(gateway->pool, "sip:%s@%s", username, realm); - gateway->register_contact = switch_core_sprintf(gateway->pool, "sip:%s@%s:%d", extension, profile->sipip, profile->sip_port); - - 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); - - 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; - - gateway->next = profile->gateways; - profile->gateways = gateway; - - 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 if ((gp=sofia_reg_find_gateway(gateway->register_from))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Ignoring duplicate uri '%s'\n", gateway->register_from); - sofia_reg_release_gateway(gp); - } else if ((gp=sofia_reg_find_gateway(gateway->register_contact))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Ignoring duplicate contact '%s'\n", gateway->register_from); - sofia_reg_release_gateway(gp); + 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 { - sofia_reg_add_gateway(gateway->name, gateway); - sofia_reg_add_gateway(gateway->register_from, gateway); - sofia_reg_add_gateway(gateway->register_contact, gateway); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Adding Alias [%s] for profile [%s] (name in use)\n", + aname, profile->name); } } - - skip: - assert(gateway_tag); } } + 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); Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c ============================================================================== --- freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c (original) +++ freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c Mon Apr 30 16:35:35 2007 @@ -1437,11 +1437,48 @@ return profile; } -void sofia_glue_add_profile(char *key, sofia_profile_t *profile) +switch_status_t sofia_glue_add_profile(char *key, sofia_profile_t *profile) { + switch_status_t status = SWITCH_STATUS_FALSE; + + switch_mutex_lock(mod_sofia_globals.hash_mutex); + if (!switch_core_hash_find(mod_sofia_globals.profile_hash, key)) { + status = switch_core_hash_insert(mod_sofia_globals.profile_hash, key, profile); + } + switch_mutex_unlock(mod_sofia_globals.hash_mutex); + + return status; +} + +void sofia_glue_del_profile(sofia_profile_t *profile) +{ + switch_hash_index_t *hi; + void *vval; + const void *vvar; + sofia_profile_t *this_profile; + sofia_gateway_t *gp, *this_gateway; + + switch_mutex_lock(mod_sofia_globals.hash_mutex); - switch_core_hash_insert(mod_sofia_globals.profile_hash, key, profile); + for (hi = switch_hash_first(switch_hash_pool_get(mod_sofia_globals.profile_hash), mod_sofia_globals.profile_hash); hi; hi = switch_hash_next(hi)) { + switch_hash_this(hi, &vvar, NULL, &vval); + this_profile = (sofia_profile_t *) vval; + if (this_profile == profile) { + switch_core_hash_delete(mod_sofia_globals.profile_hash, vvar); + } + } + for (hi = switch_hash_first(switch_hash_pool_get(mod_sofia_globals.gateway_hash), mod_sofia_globals.gateway_hash); hi; hi = switch_hash_next(hi)) { + switch_hash_this(hi, &vvar, NULL, &vval); + this_gateway = (sofia_gateway_t *) vval; + + for (gp = profile->gateways; gp; gp = gp->next) { + if (gp == this_gateway) { + switch_core_hash_delete(mod_sofia_globals.gateway_hash, vvar); + } + } + } switch_mutex_unlock(mod_sofia_globals.hash_mutex); + } int sofia_glue_init_sql(sofia_profile_t *profile) Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_reg.c ============================================================================== --- freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_reg.c (original) +++ freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_reg.c Mon Apr 30 16:35:35 2007 @@ -838,13 +838,18 @@ switch_thread_rwlock_unlock(gateway->profile->rwlock); } -void sofia_reg_add_gateway(char *key, sofia_gateway_t * gateway) +switch_status_t sofia_reg_add_gateway(char *key, sofia_gateway_t *gateway) { + switch_status_t status = SWITCH_STATUS_FALSE; + switch_mutex_lock(mod_sofia_globals.hash_mutex); - switch_core_hash_insert(mod_sofia_globals.gateway_hash, key, gateway); + if (!switch_core_hash_find(mod_sofia_globals.gateway_hash, key)) { + status = switch_core_hash_insert(mod_sofia_globals.gateway_hash, key, gateway); + } switch_mutex_unlock(mod_sofia_globals.hash_mutex); -} + return status; +} Modified: freeswitch/trunk/src/switch_xml.c ============================================================================== --- freeswitch/trunk/src/switch_xml.c (original) +++ freeswitch/trunk/src/switch_xml.c Mon Apr 30 16:35:35 2007 @@ -1176,6 +1176,13 @@ SWITCH_DECLARE(switch_status_t) switch_xml_locate_domain(char *domain_name, char *params, switch_xml_t *root, switch_xml_t *domain) { *domain = NULL; + char my_params[512]; + + if (!params) { + snprintf(my_params, sizeof(my_params), "domain=%s", domain_name); + params = my_params; + } + return switch_xml_locate("directory", "domain", "name", domain_name, root, domain, params); }
participants (1)
-
Freeswitch SVN