[asterisk-commits] dvossel: branch 1.6.2 r205986 - in /branches/1.6.2: ./ channels/chan_sip.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Fri Jul 10 16:46:42 CDT 2009
Author: dvossel
Date: Fri Jul 10 16:46:37 2009
New Revision: 205986
URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=205986
Log:
Merged revisions 205985 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
........
r205985 | dvossel | 2009-07-10 16:42:10 -0500 (Fri, 10 Jul 2009) | 16 lines
SIP register not using peer's outbound proxy
If callbackextension is defined for a peer it successfully causes
a registration to occur, but the registration ignores the
outboundproxy settings for the peer. This patch allows the
peer to be passed to obproxy_get() in transmit_register().
(closes issue #14344)
Reported by: Nick_Lewis
Patches:
callbackextension_peer_trunk.diff uploaded by dvossel (license 671)
Tested by: dvossel
Review: https://reviewboard.asterisk.org/r/294/
........
Modified:
branches/1.6.2/ (props changed)
branches/1.6.2/channels/chan_sip.c
Propchange: branches/1.6.2/
------------------------------------------------------------------------------
Binary property 'trunk-merged' - no diff available.
Modified: branches/1.6.2/channels/chan_sip.c
URL: http://svn.asterisk.org/svn-view/asterisk/branches/1.6.2/channels/chan_sip.c?view=diff&rev=205986&r1=205985&r2=205986
==============================================================================
--- branches/1.6.2/channels/chan_sip.c (original)
+++ branches/1.6.2/channels/chan_sip.c Fri Jul 10 16:46:37 2009
@@ -1935,6 +1935,7 @@
AST_STRING_FIELD(md5secret); /*!< Password in md5 */
AST_STRING_FIELD(callback); /*!< Contact extension */
AST_STRING_FIELD(random);
+ AST_STRING_FIELD(peername); /*!< Peer registering to */
);
enum sip_transport transport; /*!< Transport for this registration UDP, TCP or TLS */
int portno; /*!< Optional port override */
@@ -7202,26 +7203,34 @@
enum sip_transport transport = SIP_TRANSPORT_UDP;
char buf[256] = "";
char *username = NULL;
- char *hostname=NULL, *secret=NULL, *authuser=NULL, *expire=NULL, *buf2=NULL;
- char *callback=NULL;
+ char *hostname=NULL, *secret=NULL, *authuser=NULL, *expire=NULL, *tmp=NULL;
+ char *callback=NULL, *peername=NULL;
if (!value)
return -1;
-
ast_copy_string(buf, value, sizeof(buf));
- buf2 = strrchr(buf, '@');
+ tmp = strrchr(buf, '@');
/* split [/extension][~expiry] */
- expire = strchr(buf2, '~');
+ expire = strchr(tmp, '~');
if (expire)
*expire++ = '\0';
- callback = strrchr(buf2, '/');
+ callback = strrchr(tmp, '/');
if (callback)
*callback++ = '\0';
if (ast_strlen_zero(callback))
callback = "s";
- sip_parse_host(buf, lineno, &username, &portnum, &transport);
+ /* split [peername?][transport://] */
+ tmp = strchr(buf, '?');
+ if (tmp) {
+ *tmp++ = '\0';
+ peername = buf;
+ } else {
+ tmp = buf;
+ }
+ /* tmp is set at the beginning of [transport://] */
+ sip_parse_host(tmp, lineno, &username, &portnum, &transport);
/* First split around the last '@' then parse the two components. */
hostname = strrchr(username, '@'); /* allow @ in the first part */
@@ -7271,6 +7280,9 @@
ast_string_field_set(reg, authuser, authuser);
if (secret)
ast_string_field_set(reg, secret, secret);
+ if (peername) {
+ ast_string_field_set(reg, peername, peername);
+ }
reg->transport = transport;
reg->expire = -1;
reg->expiry = (expire ? atoi(expire) : default_expiry);
@@ -11056,6 +11068,8 @@
}
} else {
/* Build callid for registration if we haven't registered before */
+ struct sip_peer *peer = NULL;
+
if (!r->callid_valid) {
build_callid_registry(r, internip.sin_addr, default_fromdomain);
r->callid_valid = TRUE;
@@ -11069,8 +11083,15 @@
if (p->do_history)
append_history(p, "RegistryInit", "Account: %s@%s", r->username, r->hostname);
- ref_proxy(p, obproxy_get(p, NULL));
-
+ if (!ast_strlen_zero(r->peername)) {
+ if (!(peer = find_peer(r->peername, NULL, 1, FINDPEERS, FALSE))) {
+ ast_log(LOG_WARNING, "Could not find peer %s in transmit_register\n", r->peername);
+ }
+ }
+ ref_proxy(p, obproxy_get(p, peer)); /* it is ok to pass a NULL peer into obproxy_get() */
+ if (peer) {
+ unref_peer(peer, "transmit_registration: from find_peer operation");
+ }
/* Use port number specified if no SRV record was found */
if (!r->us.sin_port && r->portno)
r->us.sin_port = htons(r->portno);
@@ -23474,8 +23495,7 @@
ast_free_ha(oldha);
if (!ast_strlen_zero(callback)) { /* build string from peer info */
char *reg_string;
-
- if (asprintf(®_string, "%s:%s@%s/%s", peer->username, peer->remotesecret ? peer->remotesecret : peer->secret, peer->tohost, callback) < 0) {
+ if (asprintf(®_string, "%s?%s:%s@%s/%s", peer->name, peer->username, peer->remotesecret ? peer->remotesecret : peer->secret, peer->tohost, callback) < 0) {
ast_log(LOG_WARNING, "asprintf() failed: %s\n", strerror(errno));
} else if (reg_string) {
sip_register(reg_string, 0); /* XXX TODO: count in registry_count */
More information about the asterisk-commits
mailing list