diff --git a/configure b/configure index 8bce35d713..5ac2a1495b 100755 --- a/configure +++ b/configure @@ -23683,7 +23683,7 @@ if test "x${PBX_UNBOUND}" != "x1" -a "${USE_UNBOUND}" != "no"; then pbxlibdir="-L${UNBOUND_DIR}" fi fi - pbxfuncname="ub_ctx_add_ta_autr" + pbxfuncname="ub_ctx_delete" if test "x${pbxfuncname}" = "x" ; then # empty lib, assume only headers AST_UNBOUND_FOUND=yes else @@ -23777,6 +23777,49 @@ fi + if test "x${PBX_UNBOUND_CONST_PARAMS}" != "x1" -a "${USE_UNBOUND_CONST_PARAMS}" != "no"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for UNBOUND_VERSION_MAJOR declared in unbound.h" >&5 +$as_echo_n "checking for UNBOUND_VERSION_MAJOR declared in unbound.h... " >&6; } + saved_cppflags="${CPPFLAGS}" + if test "x${UNBOUND_CONST_PARAMS_DIR}" != "x"; then + UNBOUND_CONST_PARAMS_INCLUDE="-I${UNBOUND_CONST_PARAMS_DIR}/include" + fi + CPPFLAGS="${CPPFLAGS} ${UNBOUND_CONST_PARAMS_INCLUDE}" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main () +{ +#if !defined(UNBOUND_VERSION_MAJOR) + (void) UNBOUND_VERSION_MAJOR; + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + PBX_UNBOUND_CONST_PARAMS=1 + +$as_echo "#define HAVE_UNBOUND_CONST_PARAMS 1" >>confdefs.h + + + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + CPPFLAGS="${saved_cppflags}" + fi + + if test "x${PBX_UNIXODBC}" != "x1" -a "${USE_UNIXODBC}" != "no"; then pbxlibdir="" diff --git a/configure.ac b/configure.ac index ed6f8a8d45..8ea1cb038d 100644 --- a/configure.ac +++ b/configure.ac @@ -2101,7 +2101,8 @@ AST_EXT_LIB_CHECK([NEWT], [newt], [newtBell], [newt.h]) # script bug which does not find the ldns library. The bug is fixed in # v1.4.22 but that version is not easily detectable. # -AST_EXT_LIB_CHECK([UNBOUND], [unbound], [ub_ctx_add_ta_autr], [unbound.h], []) +AST_EXT_LIB_CHECK([UNBOUND], [unbound], [ub_ctx_delete], [unbound.h], []) +AST_C_DECLARE_CHECK([UNBOUND_CONST_PARAMS], [UNBOUND_VERSION_MAJOR], [unbound.h]) AST_EXT_LIB_CHECK([UNIXODBC], [odbc], [SQLConnect], [sql.h], []) diff --git a/include/asterisk/autoconfig.h.in b/include/asterisk/autoconfig.h.in index b48257ec0a..bdd93bb64c 100644 --- a/include/asterisk/autoconfig.h.in +++ b/include/asterisk/autoconfig.h.in @@ -1108,6 +1108,9 @@ /* Define to 1 if you have the unbound library. */ #undef HAVE_UNBOUND +/* Define if your system has UNBOUND_VERSION_MAJOR declared. */ +#undef HAVE_UNBOUND_CONST_PARAMS + /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H diff --git a/res/res_resolver_unbound.c b/res/res_resolver_unbound.c index 3eeb651697..40f3cfe4bf 100644 --- a/res/res_resolver_unbound.c +++ b/res/res_resolver_unbound.c @@ -79,6 +79,17 @@ ASTERISK_REGISTER_FILE() ***/ +/*! + * Unbound versions <= 1.4.20 declare string function parameters as 'char *' + * but versions >= 1.4.21 declare them as 'const char *'. Since CentOS6 is still + * at 1.4.20, we need to cast away the 'const' if we detect the earlier version. + */ +#ifdef HAVE_UNBOUND_CONST_PARAMS +#define UNBOUND_CHAR const char +#else +#define UNBOUND_CHAR char +#endif + /*! \brief Structure for an unbound resolver */ struct unbound_resolver { /*! \brief Resolver context itself */ @@ -292,7 +303,7 @@ static int unbound_resolver_resolve(struct ast_dns_query *query) data->resolver = ao2_bump(cfg->global->state->resolver); ast_dns_resolver_set_data(query, data); - res = ub_resolve_async(data->resolver->context, ast_dns_query_get_name(query), + res = ub_resolve_async(data->resolver->context, (UNBOUND_CHAR *)ast_dns_query_get_name(query), ast_dns_query_get_rr_type(query), ast_dns_query_get_rr_class(query), ao2_bump(query), unbound_resolver_callback, &data->id); @@ -404,7 +415,7 @@ static int unbound_config_preapply(struct unbound_config *cfg) if (!strcmp(cfg->global->hosts, "system")) { res = ub_ctx_hosts(cfg->global->state->resolver->context, NULL); } else if (!ast_strlen_zero(cfg->global->hosts)) { - res = ub_ctx_hosts(cfg->global->state->resolver->context, cfg->global->hosts); + res = ub_ctx_hosts(cfg->global->state->resolver->context, (UNBOUND_CHAR *)cfg->global->hosts); } if (res) { @@ -419,7 +430,7 @@ static int unbound_config_preapply(struct unbound_config *cfg) it_nameservers = ao2_iterator_init(cfg->global->nameservers, 0); while ((nameserver = ao2_iterator_next(&it_nameservers))) { - res = ub_ctx_set_fwd(cfg->global->state->resolver->context, nameserver); + res = ub_ctx_set_fwd(cfg->global->state->resolver->context, (UNBOUND_CHAR *)nameserver); if (res) { ast_log(LOG_ERROR, "Failed to add nameserver '%s' to unbound resolver: %s\n", @@ -434,7 +445,7 @@ static int unbound_config_preapply(struct unbound_config *cfg) if (!strcmp(cfg->global->resolv, "system")) { res = ub_ctx_resolvconf(cfg->global->state->resolver->context, NULL); } else if (!ast_strlen_zero(cfg->global->resolv)) { - res = ub_ctx_resolvconf(cfg->global->state->resolver->context, cfg->global->resolv); + res = ub_ctx_resolvconf(cfg->global->state->resolver->context, (UNBOUND_CHAR *)cfg->global->resolv); } if (res) { @@ -444,7 +455,7 @@ static int unbound_config_preapply(struct unbound_config *cfg) } if (!ast_strlen_zero(cfg->global->ta_file)) { - res = ub_ctx_add_ta_file(cfg->global->state->resolver->context, cfg->global->ta_file); + res = ub_ctx_add_ta_file(cfg->global->state->resolver->context, (UNBOUND_CHAR *)cfg->global->ta_file); if (res) { ast_log(LOG_ERROR, "Failed to set trusted anchor file to '%s' in unbound resolver: %s\n", @@ -740,13 +751,13 @@ static enum ast_test_result_state nominal_test(struct ast_test *test, resolve_fn static const size_t V4_SIZE = sizeof(struct in_addr); static const size_t V6_SIZE = sizeof(struct in6_addr); - static const char *DOMAIN1 = "goose.feathers"; - static const char *DOMAIN2 = "duck.feathers"; + static UNBOUND_CHAR *DOMAIN1 = "goose.feathers"; + static UNBOUND_CHAR *DOMAIN2 = "duck.feathers"; - static const char *ADDR1 = "127.0.0.2"; - static const char *ADDR2 = "127.0.0.3"; - static const char *ADDR3 = "::1"; - static const char *ADDR4 = "127.0.0.4"; + static UNBOUND_CHAR *ADDR1 = "127.0.0.2"; + static UNBOUND_CHAR *ADDR2 = "127.0.0.3"; + static UNBOUND_CHAR *ADDR3 = "::1"; + static UNBOUND_CHAR *ADDR4 = "127.0.0.4"; char addr1_buf[V4_SIZE]; char addr2_buf[V4_SIZE]; @@ -786,7 +797,7 @@ static enum ast_test_result_state nominal_test(struct ast_test *test, resolve_fn ub_ctx_zone_add(resolver->context, DOMAIN2, "static"); for (i = 0; i < ARRAY_LEN(records); ++i) { - ub_ctx_data_add(resolver->context, records[i].as_string); + ub_ctx_data_add(resolver->context, (UNBOUND_CHAR *)records[i].as_string); } for (i = 0; i < ARRAY_LEN(runs); ++i) { @@ -808,7 +819,7 @@ static enum ast_test_result_state nominal_test(struct ast_test *test, resolve_fn cleanup: for (i = 0; i < ARRAY_LEN(records); ++i) { - ub_ctx_data_remove(resolver->context, records[i].as_string); + ub_ctx_data_remove(resolver->context, (UNBOUND_CHAR *)records[i].as_string); } ub_ctx_zone_remove(resolver->context, DOMAIN1); ub_ctx_zone_remove(resolver->context, DOMAIN2); @@ -1012,10 +1023,10 @@ static enum ast_test_result_state off_nominal_test(struct ast_test *test, static const size_t V4_SIZE = sizeof(struct in_addr); - static const char *DOMAIN1 = "goose.feathers"; - static const char *DOMAIN2 = "duck.feathers"; + static UNBOUND_CHAR *DOMAIN1 = "goose.feathers"; + static UNBOUND_CHAR *DOMAIN2 = "duck.feathers"; - static const char *ADDR1 = "127.0.0.2"; + static UNBOUND_CHAR *ADDR1 = "127.0.0.2"; char addr1_buf[V4_SIZE]; @@ -1046,7 +1057,7 @@ static enum ast_test_result_state off_nominal_test(struct ast_test *test, ub_ctx_zone_add(resolver->context, DOMAIN2, "static"); for (i = 0; i < ARRAY_LEN(records); ++i) { - ub_ctx_data_add(resolver->context, records[i].as_string); + ub_ctx_data_add(resolver->context, (UNBOUND_CHAR *)records[i].as_string); } for (i = 0; i < ARRAY_LEN(runs); ++i) { @@ -1196,7 +1207,7 @@ AST_TEST_DEFINE(resolve_naptr) const struct ast_dns_record *record; - static const char * DOMAIN1 = "goose.feathers"; + static char * DOMAIN1 = "goose.feathers"; int i; enum ast_test_result_state res = AST_TEST_PASS; @@ -1234,7 +1245,7 @@ AST_TEST_DEFINE(resolve_naptr) ub_ctx_zone_add(resolver->context, DOMAIN1, "static"); for (i = 0; i < ARRAY_LEN(records); ++i) { - ub_ctx_data_add(resolver->context, records[i].zone_entry); + ub_ctx_data_add(resolver->context, (UNBOUND_CHAR *)records[i].zone_entry); } if (ast_dns_resolve(DOMAIN1, ns_t_naptr, ns_c_in, &result)) { @@ -1311,8 +1322,8 @@ AST_TEST_DEFINE(resolve_srv) RAII_VAR(struct unbound_config *, cfg, NULL, ao2_cleanup); RAII_VAR(struct ast_dns_result *, result, NULL, ast_dns_result_free); const struct ast_dns_record *record; - static const char *DOMAIN1 = "taco.bananas"; - static const char *DOMAIN1_SRV = "taco.bananas 12345 IN SRV 10 20 5060 sip.taco.bananas"; + static UNBOUND_CHAR *DOMAIN1 = "taco.bananas"; + static UNBOUND_CHAR *DOMAIN1_SRV = "taco.bananas 12345 IN SRV 10 20 5060 sip.taco.bananas"; enum ast_test_result_state res = AST_TEST_PASS; switch (cmd) {