Hi, I've reworked nua_stack_init_transport (from nua_register.c) to look for multiple instances of NUTAG_URL and NUTAG_SIPS_URL in the tag list. The old nua_stack_init_transport ignored all but the last instance of NUTAG_URL and/or NUTAG_SIPS_URL.
This change makes the behaviour of nua_create consistent with the documentation for NUTAG_URL and NUTAG_SIPS_URL. Following is my implementation. I've tested it with NUTAG_URL, but I haven't tested it with NUTAG_SIPS_URL. Could someone please have a look over it? Cheers, --JT int nua_stack_init_transport(nua_t *nua, tagi_t const *tags) { char const *certificate_dir = NULL; int bind_count = 0; tagi_t const *t; /* Fetch the certificate directory path from the tag list (if provided) */ tl_gets(tags, NUTAG_CERTIFICATE_DIR_REF(certificate_dir), TAG_END()); /* Scan the tag list for instances of NUTAG_URL or NUTAG_SIPS_URL and bind to each specified contact URL */ for (t = tags; t; t = tl_next(t)) { tag_type_t tt = t->t_tag; if ((nutag_url == tt) || (nutag_sips_url == tt)) { char const *name; url_string_t const *contact = (url_string_t const *)t->t_value; if (url_is_string(contact) ? strncasecmp(contact->us_str, "sips:", 5) == 0 : contact->us_url->url_type == url_sips) { name = "sips"; } else { name = "sip"; } if (nta_agent_add_tport(nua->nua_nta, contact, TPTAG_IDENT(name), TPTAG_CERTIFICATE(certificate_dir), TAG_NEXT(nua->nua_args)) < 0) return -1; bind_count++; } } /* If no URLs were specified, bind to ALL (use wildcards). */ if (bind_count == 0) { if (nta_agent_add_tport(nua->nua_nta, NULL, TPTAG_IDENT("sip"), TPTAG_CERTIFICATE(certificate_dir), TAG_NEXT(nua->nua_args)) < 0 && nta_agent_add_tport(nua->nua_nta, URL_STRING_MAKE("sip:*:*"), TPTAG_IDENT("sip"), TPTAG_CERTIFICATE(certificate_dir), TAG_NEXT(nua->nua_args)) < 0) return -1; #if HAVE_SOFIA_STUN if (stun_is_requested(TAG_NEXT(nua->nua_args)) && nta_agent_add_tport(nua->nua_nta, URL_STRING_MAKE("sip:0.0.0.0:*"), TPTAG_IDENT("stun"), TPTAG_PUBLIC(tport_type_stun), /* use stun */ TPTAG_CERTIFICATE(certificate_dir), TAG_NEXT(nua->nua_args)) < 0) { SU_DEBUG_0(("nua: error initializing STUN transport\n")); } #endif } /* Assuming all the binds succeeded (because we would have returned already if any of the binds had failed), initialize the registrations. */ if (nua_stack_init_registrations(nua) < 0) return -1; return 0; }
------------------------------------------------------------------------------ This SF.Net email is sponsored by the Verizon Developer Community Take advantage of Verizon's best-in-class app development support A streamlined, 14 day to market process makes app distribution fast and easy Join now and get one step closer to millions of Verizon customers http://p.sf.net/sfu/verizon-dev2dev
_______________________________________________ Sofia-sip-devel mailing list Sofia-sip-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sofia-sip-devel