diff options
Diffstat (limited to 'net/siproxd/files/patch-src_register.c')
-rw-r--r-- | net/siproxd/files/patch-src_register.c | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/net/siproxd/files/patch-src_register.c b/net/siproxd/files/patch-src_register.c new file mode 100644 index 000000000000..df8cf92d8dde --- /dev/null +++ b/net/siproxd/files/patch-src_register.c @@ -0,0 +1,145 @@ +--- src/register.c.orig Sat Jan 8 11:05:12 2005 ++++ src/register.c Sat Apr 9 16:16:48 2005 +@@ -35,7 +35,7 @@ + #include "siproxd.h" + #include "log.h" + +-static char const ident[]="$Id: register.c,v 1.46 2005/01/08 10:05:12 hb9xar Exp $"; ++static char const ident[]="$Id: register.c,v 1.50 2005/04/03 20:55:30 hb9xar Exp $"; + + /* configuration storage */ + extern struct siproxd_config configuration; +@@ -255,7 +255,7 @@ + */ + if (expires > 0) { + /* +- * First make sure, we have a prober Contact header: ++ * First make sure, we have a proper Contact header: + * - url + * - url -> hostname + * +@@ -367,57 +367,56 @@ + strlen(configuration.masked_host.string[j])+1); + strcpy(urlmap[i].masq_url->host, configuration.masked_host.string[j]); + } +- ++ } else { /* if new entry */ ++ /* This is an existing entry */ + /* +- * for transparent proxying: force device to be masqueraded +- * as with the outbound IP ++ * Some phones (like BudgeTones *may* dynamically grab a SIP port ++ * so we might want to update the true_url and reg_url each time ++ * we get an REGISTER + */ +- if (force_lcl_masq) { +- struct in_addr addr; +- char *addrstr; +- +- if (get_ip_by_ifname(configuration.outbound_if, &addr) != +- STS_SUCCESS) { +- ERROR("can't find outbound interface %s - configuration error?", +- configuration.outbound_if); +- return STS_FAILURE; +- } +- +- /* host part */ +- addrstr = utils_inet_ntoa(addr); +- DEBUGC(DBCLASS_REG,"masquerading UA %s@%s local %s@%s", +- (url1_contact->username) ? url1_contact->username : "*NULL*", +- (url1_contact->host) ? url1_contact->host : "*NULL*", +- (url1_contact->username) ? url1_contact->username : "*NULL*", +- addrstr); +- urlmap[i].masq_url->host=realloc(urlmap[i].masq_url->host, +- strlen(addrstr)+1); +- strcpy(urlmap[i].masq_url->host, addrstr); + +- /* port number if required */ +- if (configuration.sip_listen_port != SIP_PORT) { +- urlmap[i].masq_url->port=realloc(urlmap[i].masq_url->port, 16); +- sprintf(urlmap[i].masq_url->port, "%i", +- configuration.sip_listen_port); +- } +- } +- +- } else { /* if new entry */ +- /* +- * Some phones (like BudgeTones *may* dynamically grab a SIP port +- * so we might want to update the true_url and reg_url each time +- * we get an REGISTER +- */ +- /* Contact: field */ ++ /* Contact: field (true_url) */ + osip_uri_free(urlmap[i].true_url); + osip_uri_clone( ((osip_contact_t*) + (ticket->sipmsg->contacts->node->element))->url, +- &urlmap[i].true_url); +- /* To: field */ ++ &urlmap[i].true_url); ++ /* To: field (reg_url) */ + osip_uri_free(urlmap[i].reg_url); + osip_uri_clone( ticket->sipmsg->to->url, +- &urlmap[i].reg_url); ++ &urlmap[i].reg_url); + } ++ ++ /* ++ * for proxying: force device to be masqueraded ++ * as with the outbound IP (masq_url) ++ */ ++ if (force_lcl_masq) { ++ struct in_addr addr; ++ char *addrstr; ++ ++ if (get_interface_ip(IF_OUTBOUND, &addr) != STS_SUCCESS) { ++ return STS_FAILURE; ++ } ++ ++ /* host part */ ++ addrstr = utils_inet_ntoa(addr); ++ DEBUGC(DBCLASS_REG,"masquerading UA %s@%s local %s@%s", ++ (url1_contact->username) ? url1_contact->username : "*NULL*", ++ (url1_contact->host) ? url1_contact->host : "*NULL*", ++ (url1_contact->username) ? url1_contact->username : "*NULL*", ++ addrstr); ++ urlmap[i].masq_url->host=realloc(urlmap[i].masq_url->host, ++ strlen(addrstr)+1); ++ strcpy(urlmap[i].masq_url->host, addrstr); ++ ++ /* port number if required */ ++ if (configuration.sip_listen_port != SIP_PORT) { ++ urlmap[i].masq_url->port=realloc(urlmap[i].masq_url->port, 16); ++ sprintf(urlmap[i].masq_url->port, "%i", ++ configuration.sip_listen_port); ++ } ++ } ++ + /* give some safety margin for the next update */ + if (expires > 0) expires+=30; + +@@ -495,6 +494,7 @@ + osip_via_t *via; + int port; + char *buffer; ++ int buflen; + struct in_addr addr; + osip_header_t *expires_hdr; + +@@ -550,7 +550,7 @@ + } + } + +- sts = osip_message_to_str(response, &buffer); ++ sts = osip_message_to_str(response, &buffer, &buflen); + if (sts != 0) { + ERROR("register_response: msg_2char failed"); + return STS_FAILURE; +@@ -563,7 +563,7 @@ + port=configuration.sip_listen_port; + } + +- sipsock_send(addr, port, ticket->protocol, buffer, strlen(buffer)); ++ sipsock_send(addr, port, ticket->protocol, buffer, buflen); + + /* free the resources */ + osip_message_free(response); |