On 2010/04/09 12:32, Alexey Suslikov wrote:
> There is a problem in setup with outbound proxy (maybe related to
> https://issues.asterisk.org/view.php?id=15827).

please try this diff from the bug you found:

(also at http://junkpile.org/asterisk-1.6.2.6p0.diff)

Index: Makefile
===================================================================
RCS file: /cvs/ports/telephony/asterisk/Makefile,v
retrieving revision 1.78
diff -u -p -r1.78 Makefile
--- Makefile    8 Apr 2010 16:18:00 -0000       1.78
+++ Makefile    9 Apr 2010 09:48:16 -0000
@@ -6,7 +6,7 @@ COMMENT-main=           open source multi-protoco
 VER=                   1.6.2.6
 # you can set PATCHVER=p0, p1 etc to bump everything,
 # this takes care of the subpackage/flavor maze
-#PATCHVER=             p0
+PATCHVER=              p0
 CORESOUNDS=            1.4.17
 DISTNAME=              asterisk-${VER:S/rc/-rc/}
 PKGNAME-main=          asterisk-${VER}${PATCHVER}
Index: patches/patch-include_asterisk_dnsmgr_h
===================================================================
RCS file: patches/patch-include_asterisk_dnsmgr_h
diff -N patches/patch-include_asterisk_dnsmgr_h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-include_asterisk_dnsmgr_h     9 Apr 2010 09:48:16 -0000
@@ -0,0 +1,30 @@
+$OpenBSD$
+
+https://issues.asterisk.org/view.php?id=15827
+
+--- include/asterisk/dnsmgr.h.orig     Mon Mar  9 20:58:17 2009
++++ include/asterisk/dnsmgr.h  Fri Apr  9 10:46:27 2010
+@@ -42,12 +42,12 @@ struct ast_dnsmgr_entry;
+  *
+  * \param name the hostname
+  * \param result where the DNS manager should store the IP address as it 
refreshes it.
+- *      it.
++ * \param service SRV prefix (optional, set to NULL to disable SRV)
+  *
+  * This function allocates a new DNS manager entry object, and fills it with 
the
+  * provided hostname and IP address.  This function does not force an initial 
lookup
+- * of the IP address.  So, generally, this should be used when the initial 
address
+- * is already known.
++ * of the IP address.  So, this should be used when the initial address
++ * is already known and stored in result.
+  *
+  * \return a DNS manager entry
+  * \version 1.6.1 result changed from struct in_addr to struct sockaddr_in to 
store port number
+@@ -69,6 +69,7 @@ void ast_dnsmgr_release(struct ast_dnsmgr_entry *entry
+  * \param name the hostname
+  * \param result where to store the IP address as the DNS manager refreshes it
+  * \param dnsmgr Where to store the allocate DNS manager entry
++ * \param service SRV prefix (optional, set to NULL to disable SRV)
+  *
+  * This function allocates a new DNS manager entry object, and fills it with
+  * the provided hostname and IP address.  This function _does_ force an 
initial
Index: patches/patch-main_acl_c
===================================================================
RCS file: patches/patch-main_acl_c
diff -N patches/patch-main_acl_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-main_acl_c    9 Apr 2010 09:48:16 -0000
@@ -0,0 +1,14 @@
+$OpenBSD$
+
+https://issues.asterisk.org/view.php?id=15827
+
+--- main/acl.c.orig    Thu Feb 25 22:42:53 2010
++++ main/acl.c Fri Apr  9 10:46:27 2010
+@@ -387,6 +387,7 @@ int ast_get_ip_or_srv(struct sockaddr_in *sin, const c
+               }
+       }
+       if ((hp = ast_gethostbyname(value, &ahp))) {
++              sin->sin_family = hp->h_addrtype;
+               memcpy(&sin->sin_addr, hp->h_addr, sizeof(sin->sin_addr));
+       } else {
+               ast_log(LOG_WARNING, "Unable to lookup '%s'\n", value);
Index: patches/patch-main_dnsmgr_c
===================================================================
RCS file: patches/patch-main_dnsmgr_c
diff -N patches/patch-main_dnsmgr_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-main_dnsmgr_c 9 Apr 2010 09:48:16 -0000
@@ -0,0 +1,95 @@
+$OpenBSD$
+
+https://issues.asterisk.org/view.php?id=15827
+
+--- main/dnsmgr.c.orig Mon Aug 10 20:36:38 2009
++++ main/dnsmgr.c      Fri Apr  9 10:46:27 2010
+@@ -52,8 +52,6 @@ static pthread_t refresh_thread = AST_PTHREADT_NULL;
+ struct ast_dnsmgr_entry {
+       /*! where we will store the resulting IP address and port number */
+       struct sockaddr_in *result;
+-      /*! the last result, used to check if address/port has changed */
+-      struct sockaddr_in last;
+       /*! SRV record to lookup, if provided. Composed of service, protocol, 
and domain name: _Service._Proto.Name */
+       char *service;
+       /*! Set to 1 if the entry changes */
+@@ -85,6 +83,9 @@ static struct refresh_info master_refresh_info = {
+       .verbose = 0,
+ };
+ 
++/* 
++ * Allocate a new DNS manager entry
++ */
+ struct ast_dnsmgr_entry *ast_dnsmgr_get(const char *name, struct sockaddr_in 
*result, const char *service)
+ {
+       struct ast_dnsmgr_entry *entry;
+@@ -96,7 +97,6 @@ struct ast_dnsmgr_entry *ast_dnsmgr_get(const char *na
+       entry->result = result;
+       ast_mutex_init(&entry->lock);
+       strcpy(entry->name, name);
+-      memcpy(&entry->last, result, sizeof(entry->last));
+       if (service) {
+               entry->service = ((char *) entry) + sizeof(*entry) + 
strlen(name);
+               strcpy(entry->service, service);
+@@ -109,6 +109,9 @@ struct ast_dnsmgr_entry *ast_dnsmgr_get(const char *na
+       return entry;
+ }
+ 
++/* 
++ * Free a DNS manager entry
++ */
+ void ast_dnsmgr_release(struct ast_dnsmgr_entry *entry)
+ {
+       if (!entry)
+@@ -123,6 +126,9 @@ void ast_dnsmgr_release(struct ast_dnsmgr_entry *entry
+       ast_free(entry);
+ }
+ 
++/* 
++ * Allocate a new DNS manager entry and perform the initial lookup before 
returning
++ */
+ int ast_dnsmgr_lookup(const char *name, struct sockaddr_in *result, struct 
ast_dnsmgr_entry **dnsmgr, const char *service)
+ {
+       if (ast_strlen_zero(name) || !result || !dnsmgr)
+@@ -133,8 +139,10 @@ int ast_dnsmgr_lookup(const char *name, struct sockadd
+ 
+       /* if it's actually an IP address and not a name,
+          there's no need for a managed lookup */
+-      if (inet_aton(name, &result->sin_addr))
++      if (inet_aton(name, &result->sin_addr)) {
++              result->sin_family = AF_INET;
+               return 0;
++              }
+ 
+       ast_verb(4, "doing dnsmgr_lookup for '%s'\n", name);
+ 
+@@ -151,7 +159,7 @@ int ast_dnsmgr_lookup(const char *name, struct sockadd
+ }
+ 
+ /*
+- * Refresh a dnsmgr entry
++ * Force a refresh of a dnsmgr entry
+  */
+ static int dnsmgr_refresh(struct ast_dnsmgr_entry *entry, int verbose)
+ {
+@@ -164,15 +172,15 @@ static int dnsmgr_refresh(struct ast_dnsmgr_entry *ent
+       if (verbose)
+               ast_verb(3, "refreshing '%s'\n", entry->name);
+ 
+-      tmp.sin_port = entry->last.sin_port;
++      memset(&tmp, 0, sizeof(tmp));
++      tmp.sin_port = entry->result->sin_port;
+       
+-      if (!ast_get_ip_or_srv(&tmp, entry->name, entry->service) && 
inaddrcmp(&tmp, &entry->last)) {
+-              ast_copy_string(iabuf, ast_inet_ntoa(entry->last.sin_addr), 
sizeof(iabuf));
++      if (!ast_get_ip_or_srv(&tmp, entry->name, entry->service) && 
inaddrcmp(&tmp, entry->result)) {
++              ast_copy_string(iabuf, ast_inet_ntoa(entry->result->sin_addr), 
sizeof(iabuf));
+               ast_copy_string(iabuf2, ast_inet_ntoa(tmp.sin_addr), 
sizeof(iabuf2));
+               ast_log(LOG_NOTICE, "dnssrv: host '%s' changed from %s:%d to 
%s:%d\n", 
+-                      entry->name, iabuf, ntohs(entry->last.sin_port), 
iabuf2, ntohs(tmp.sin_port));
++                      entry->name, iabuf, ntohs(entry->result->sin_port), 
iabuf2, ntohs(tmp.sin_port));
+               *entry->result = tmp;
+-              entry->last = tmp;
+               changed = entry->changed = 1;
+       }
+ 


Reply via email to