From: Matthew Fredrickson Date: Fri, 4 May 2018 21:07:10 +0000 (-0500) Subject: res_hep: Adds hostname resolution support for capture_address X-Git-Tag: 15.5.0-rc1~75 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=61fc7e452b826ef61674850801746b4d30225aab;p=thirdparty%2Fasterisk.git 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 --- 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);