From 8f55f7c3331a2e504f46d5ecaa2cd48d29b9048d Mon Sep 17 00:00:00 2001 From: Matthew Fredrickson Date: Fri, 4 May 2018 16:07:10 -0500 Subject: [PATCH] res_hep: Adds hostname resolution support for capture_address 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 | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/res/res_hep.c b/res/res_hep.c index 4e548e274f..cc7028bd57 100644 --- a/res/res_hep.c +++ b/res/res_hep.c @@ -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);