<p>Joshua Colp <strong>merged</strong> this change.</p><p><a href="https://gerrit.asterisk.org/8987">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Benjamin Keith Ford: Looks good to me, but someone else must approve
  Joshua Colp: Looks good to me, but someone else must approve; Approved for Submit
  George Joseph: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">netsock2: Add ast_sockaddr_resolve_first_af to netsock2 public API<br><br>This function originally was used in chan_sip to enable some simplifying<br>assumptions and eventually was copy and pasted into res_pjsip_logger and<br>res_hep.  Since it's replicated in three places, it's probably best to<br>move it into the public netsock2 API for these modules to use.<br><br>Change-Id: Id52e23be885601c51d70259f62de1a5e59d38d04<br>---<br>M channels/chan_sip.c<br>M include/asterisk/netsock2.h<br>M main/netsock2.c<br>M res/res_hep.c<br>M res/res_pjsip_logger.c<br>5 files changed, 59 insertions(+), 72 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">diff --git a/channels/chan_sip.c b/channels/chan_sip.c<br>index 46f9ad6..dc60deb 100644<br>--- a/channels/chan_sip.c<br>+++ b/channels/chan_sip.c<br>@@ -1380,8 +1380,6 @@<br> static int sip_addheader(struct ast_channel *chan, const char *data);<br> static int sip_do_reload(enum channelreloadreason reason);<br> static char *sip_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);<br>-static int ast_sockaddr_resolve_first_af(struct ast_sockaddr *addr,<br>-                                    const char *name, int flag, int family);<br> static int ast_sockaddr_resolve_first(struct ast_sockaddr *addr,<br>                                   const char *name, int flag);<br> static int ast_sockaddr_resolve_first_transport(struct ast_sockaddr *addr,<br>@@ -34330,30 +34328,6 @@<br> {<br>         sip_reload(0, 0, NULL);<br>       return AST_MODULE_LOAD_SUCCESS;<br>-}<br>-<br>-/*! \brief  Return the first entry from ast_sockaddr_resolve filtered by address family<br>- *<br>- * \warning Using this function probably means you have a faulty design.<br>- */<br>-static int ast_sockaddr_resolve_first_af(struct ast_sockaddr *addr,<br>-                               const char* name, int flag, int family)<br>-{<br>-    struct ast_sockaddr *addrs;<br>-  int addrs_cnt;<br>-<br>-    addrs_cnt = ast_sockaddr_resolve(&addrs, name, flag, family);<br>-    if (addrs_cnt <= 0) {<br>-             return 1;<br>-    }<br>-    if (addrs_cnt > 1) {<br>-              ast_debug(1, "Multiple addresses, using the first one only\n");<br>-    }<br>-<br>- ast_sockaddr_copy(addr, &addrs[0]);<br>-<br>-   ast_free(addrs);<br>-     return 0;<br> }<br> <br> /*! \brief  Return the first entry from ast_sockaddr_resolve filtered by family of binddaddr<br>diff --git a/include/asterisk/netsock2.h b/include/asterisk/netsock2.h<br>index 2d2cfdf..fc3a0c0 100644<br>--- a/include/asterisk/netsock2.h<br>+++ b/include/asterisk/netsock2.h<br>@@ -438,6 +438,44 @@<br>                     int flags, int family);<br> <br> /*!<br>+ * \since 16.0<br>+ *<br>+ * \brief<br>+ * Return the first entry from ast_sockaddr_resolve filtered by address family<br>+ *<br>+ * \details<br>+ * Parses a string containing a host name or an IPv4 or IPv6 address followed<br>+ * by an optional port (separated by a colon).  This function only returns the<br>+ * first address into the ast_sockaddr. Allowed formats for name are the following:<br>+ *<br>+ * hostname:port<br>+ * host.example.com:port<br>+ * a.b.c.d<br>+ * a.b.c.d:port<br>+ * a:b:c:...:d<br>+ * [a:b:c:...:d]<br>+ * [a:b:c:...:d]:port<br>+ *<br>+ * \param[out] addr The resulting ast_sockaddr<br>+ * \param name The string to parse<br>+ * \param flags If set to zero, a port MAY be present. If set to<br>+ * PARSE_PORT_IGNORE, a port MAY be present but will be ignored. If set to<br>+ * PARSE_PORT_REQUIRE, a port MUST be present. If set to PARSE_PORT_FORBID, a<br>+ * port MUST NOT be present.<br>+ *<br>+ * \param family Only addresses of the given family will be returned. Use 0 or<br>+ * AST_AF_UNSPEC to specify any address family.  Behavior is ultimately determined<br>+ * by getaddrinfo in how it orders return results.  First result is selected to<br>+ * be returned.<br>+ *<br>+ * \retval 0 Success<br>+ * \retval non-zero Failure<br>+ * \warning Using this function potentially means you have a faulty design.<br>+ */<br>+int ast_sockaddr_resolve_first_af(struct ast_sockaddr *addr,<br>+                                 const char* name, int flag, int family);<br>+<br>+/*!<br>  * \brief<br>  * Apply a netmask to an address and store the result in a separate structure.<br>  *<br>diff --git a/main/netsock2.c b/main/netsock2.c<br>index fedbd94..783a506 100644<br>--- a/main/netsock2.c<br>+++ b/main/netsock2.c<br>@@ -333,6 +333,27 @@<br>  return res_cnt;<br> }<br> <br>+/*! \brief Pulls first resolved address and returns it */<br>+int ast_sockaddr_resolve_first_af(struct ast_sockaddr *addr,<br>+                                  const char* name, int flag, int family)<br>+{<br>+    struct ast_sockaddr *addrs;<br>+  int addrs_cnt;<br>+<br>+    addrs_cnt = ast_sockaddr_resolve(&addrs, name, flag, family);<br>+    if (addrs_cnt <= 0) {<br>+             return 1;<br>+    }<br>+    if (addrs_cnt > 1) {<br>+              ast_debug(1, "Multiple addresses resolving %s, using the first one only\n", name);<br>+ }<br>+<br>+ ast_sockaddr_copy(addr, &addrs[0]);<br>+<br>+   ast_free(addrs);<br>+     return 0;<br>+}<br>+<br> int ast_sockaddr_apply_netmask(const struct ast_sockaddr *addr, const struct ast_sockaddr *netmask,<br>                struct ast_sockaddr *result)<br> {<br>diff --git a/res/res_hep.c b/res/res_hep.c<br>index cc7028b..376fc4e 100644<br>--- a/res/res_hep.c<br>+++ b/res/res_hep.c<br>@@ -367,27 +367,6 @@<br>   }<br> }<br> <br>-/*! \brief Pulls first resolved address and returns it */<br>-static int ast_sockaddr_resolve_first_af(struct ast_sockaddr *addr,<br>-                                 const char* name, int flag, int family)<br>-{<br>-    struct ast_sockaddr *addrs;<br>-  int addrs_cnt;<br>-<br>-    addrs_cnt = ast_sockaddr_resolve(&addrs, name, flag, family);<br>-    if (addrs_cnt <= 0) {<br>-             return 1;<br>-    }<br>-    if (addrs_cnt > 1) {<br>-              ast_debug(1, "Multiple addresses resolving %s, using the first one only\n", name);<br>- }<br>-<br>- ast_sockaddr_copy(addr, &addrs[0]);<br>-<br>-   ast_free(addrs);<br>-     return 0;<br>-}<br>-<br> /*! \brief Allocate the HEPv3 run-time data */<br> static struct hepv3_runtime_data *hepv3_data_alloc(struct hepv3_global_config *config)<br> {<br>diff --git a/res/res_pjsip_logger.c b/res/res_pjsip_logger.c<br>index 49ad6fa..fb58f2b 100644<br>--- a/res/res_pjsip_logger.c<br>+++ b/res/res_pjsip_logger.c<br>@@ -41,31 +41,6 @@<br> static enum pjsip_logging_mode logging_mode;<br> static struct ast_sockaddr log_addr;<br> <br>-/*! \brief  Return the first entry from ast_sockaddr_resolve filtered by address family<br>- *<br>- * \warning Using this function probably means you have a faulty design.<br>- * \note This function was taken from the function of the same name in chan_sip.c<br>- */<br>-static int ast_sockaddr_resolve_first_af(struct ast_sockaddr *addr,<br>-                                     const char* name, int flag, int family)<br>-{<br>-    struct ast_sockaddr *addrs;<br>-  int addrs_cnt;<br>-<br>-    addrs_cnt = ast_sockaddr_resolve(&addrs, name, flag, family);<br>-    if (addrs_cnt <= 0) {<br>-             return 1;<br>-    }<br>-    if (addrs_cnt > 1) {<br>-              ast_debug(1, "Multiple addresses, using the first one only\n");<br>-    }<br>-<br>- ast_sockaddr_copy(addr, &addrs[0]);<br>-<br>-   ast_free(addrs);<br>-     return 0;<br>-}<br>-<br> /*! \brief See if we pass debug IP filter */<br> static inline int pjsip_log_test_addr(const char *address, int port)<br> {<br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/8987">change 8987</a>. To unsubscribe, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/8987"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Id52e23be885601c51d70259f62de1a5e59d38d04 </div>
<div style="display:none"> Gerrit-Change-Number: 8987 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: Matthew Fredrickson <creslin@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Benjamin Keith Ford <bford@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: George Joseph <gjoseph@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins2 </div>
<div style="display:none"> Gerrit-Reviewer: Joshua Colp <jcolp@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Matthew Fredrickson <creslin@digium.com> </div>