summaryrefslogtreecommitdiff
path: root/net/siproxd/files/patch-src_register.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/siproxd/files/patch-src_register.c')
-rw-r--r--net/siproxd/files/patch-src_register.c145
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);