]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_hep: Adds hostname resolution support for capture_address
authorMatthew Fredrickson <creslin@digium.com>
Fri, 4 May 2018 21:07:10 +0000 (16:07 -0500)
committerMatthew Fredrickson <creslin@digium.com>
Wed, 9 May 2018 20:14:30 +0000 (14:14 -0600)
Previously, only an IP address would be accepted for the capture_address config
setting in hep.conf.  This change allows capture_address to be a resolvable
hostname or an IP address.

ASTERISK-27796 #close
Reported-By: Sebastian Gutierrez
Change-Id: I33e1a37a8b86e20505dadeda760b861a9ef51f6f

res/res_hep.c

index 4e548e274f8a6db1f16958e1756cf793b04cb118..cc7028bd57d577cb86463a65b1669136abda11d5 100644 (file)
@@ -367,6 +367,27 @@ static void hepv3_data_dtor(void *obj)
        }
 }
 
+/*! \brief Pulls first resolved address and returns it */
+static int ast_sockaddr_resolve_first_af(struct ast_sockaddr *addr,
+                                     const char* name, int flag, int family)
+{
+       struct ast_sockaddr *addrs;
+       int addrs_cnt;
+
+       addrs_cnt = ast_sockaddr_resolve(&addrs, name, flag, family);
+       if (addrs_cnt <= 0) {
+               return 1;
+       }
+       if (addrs_cnt > 1) {
+               ast_debug(1, "Multiple addresses resolving %s, using the first one only\n", name);
+       }
+
+       ast_sockaddr_copy(addr, &addrs[0]);
+
+       ast_free(addrs);
+       return 0;
+}
+
 /*! \brief Allocate the HEPv3 run-time data */
 static struct hepv3_runtime_data *hepv3_data_alloc(struct hepv3_global_config *config)
 {
@@ -379,10 +400,11 @@ static struct hepv3_runtime_data *hepv3_data_alloc(struct hepv3_global_config *c
 
        data->sockfd = -1;
 
-       if (!ast_sockaddr_parse(&data->remote_addr, config->capture_address, PARSE_PORT_REQUIRE)) {
+       if (ast_sockaddr_resolve_first_af(&data->remote_addr, config->capture_address, PARSE_PORT_REQUIRE, AST_AF_UNSPEC)) {
                ast_log(AST_LOG_WARNING, "Failed to create address from %s\n", config->capture_address);
                ao2_ref(data, -1);
                return NULL;
+
        }
 
        data->sockfd = socket(ast_sockaddr_is_ipv6(&data->remote_addr) ? AF_INET6 : AF_INET, SOCK_DGRAM, 0);