From 6eb1180042a776779f0c3888266a8b246dd72277 Mon Sep 17 00:00:00 2001 From: florian Date: Fri, 19 Nov 2021 16:42:01 +0000 Subject: [PATCH] Allow interface names as scope-id in IPv6 link-local addresses. For example, this makes forward-zone: name: "." forward-addr: fe80::20d:b9ff:fe46:c7f4%vio0 forward-first: yes work instead of using fe80::20d:b9ff:fe46:c7f4%1 for the forward-addr. This has been submitted upstream. sthen@ is fine with carrying this as a local diff. Requested by & OK kn --- usr.sbin/unbound/config.h.in | 3 +++ usr.sbin/unbound/configure | 6 ++++++ usr.sbin/unbound/configure.ac | 2 +- usr.sbin/unbound/util/net_help.c | 11 ++++++++++- 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/usr.sbin/unbound/config.h.in b/usr.sbin/unbound/config.h.in index ea6afa4802e..ca2dfad9da3 100644 --- a/usr.sbin/unbound/config.h.in +++ b/usr.sbin/unbound/config.h.in @@ -315,6 +315,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_IFADDRS_H +/* Define to 1 if you have the `if_nametoindex' function. */ +#undef HAVE_IF_NAMETOINDEX + /* Define to 1 if you have the `inet_aton' function. */ #undef HAVE_INET_ATON diff --git a/usr.sbin/unbound/configure b/usr.sbin/unbound/configure index 1db58e32f6f..0362aeec8ed 100644 --- a/usr.sbin/unbound/configure +++ b/usr.sbin/unbound/configure @@ -23475,6 +23475,12 @@ then : INSTALLTARGET="install-lib" fi +fi +ac_fn_c_check_func "$LINENO" "if_nametoindex" "ac_cv_func_if_nametoindex" +if test "x$ac_cv_func_if_nametoindex" = xyes +then : + printf "%s\n" "#define HAVE_IF_NAMETOINDEX 1" >>confdefs.h + fi if test $ALLTARGET = "alltargets"; then diff --git a/usr.sbin/unbound/configure.ac b/usr.sbin/unbound/configure.ac index 35bd777f62f..ea25c8a1437 100644 --- a/usr.sbin/unbound/configure.ac +++ b/usr.sbin/unbound/configure.ac @@ -1594,7 +1594,7 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([ AC_MSG_RESULT(no)) AC_SEARCH_LIBS([setusercontext], [util]) -AC_CHECK_FUNCS([tzset sigprocmask fcntl getpwnam endpwent getrlimit setrlimit setsid chroot kill chown sleep usleep random srandom recvmsg sendmsg writev socketpair glob initgroups strftime localtime_r setusercontext _beginthreadex endservent endprotoent fsync shmget accept4 getifaddrs]) +AC_CHECK_FUNCS([tzset sigprocmask fcntl getpwnam endpwent getrlimit setrlimit setsid chroot kill chown sleep usleep random srandom recvmsg sendmsg writev socketpair glob initgroups strftime localtime_r setusercontext _beginthreadex endservent endprotoent fsync shmget accept4 getifaddrs if_nametoindex]) AC_CHECK_FUNCS([setresuid],,[AC_CHECK_FUNCS([setreuid])]) AC_CHECK_FUNCS([setresgid],,[AC_CHECK_FUNCS([setregid])]) diff --git a/usr.sbin/unbound/util/net_help.c b/usr.sbin/unbound/util/net_help.c index 06bc1f5dd7e..f8b60908fa7 100644 --- a/usr.sbin/unbound/util/net_help.c +++ b/usr.sbin/unbound/util/net_help.c @@ -38,6 +38,12 @@ */ #include "config.h" +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_NET_IF_H +#include +#endif #include "util/net_help.h" #include "util/log.h" #include "util/data/dname.h" @@ -266,7 +272,10 @@ ipstrtoaddr(const char* ip, int port, struct sockaddr_storage* addr, return 0; (void)strlcpy(buf, ip, sizeof(buf)); buf[s-ip]=0; - sa->sin6_scope_id = (uint32_t)atoi(s+1); +#ifdef HAVE_IF_NAMETOINDEX + if (!(sa->sin6_scope_id = if_nametoindex(s+1))) +#endif /* HAVE_IF_NAMETOINDEX */ + sa->sin6_scope_id = (uint32_t)atoi(s+1); ip = buf; } if(inet_pton((int)sa->sin6_family, ip, &sa->sin6_addr) <= 0) { -- 2.20.1