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 fe80::20d:b9ff:fe46:c7f4%1.
This commit is contained in:
Florian Obser 2021-10-24 15:55:17 +02:00
parent ecb0b44ba8
commit 8756f1e4c7
4 changed files with 20 additions and 2 deletions

View file

@ -318,6 +318,9 @@
/* Define to 1 if you have the <ifaddrs.h> header file. */ /* Define to 1 if you have the <ifaddrs.h> header file. */
#undef HAVE_IFADDRS_H #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. */ /* Define to 1 if you have the `inet_aton' function. */
#undef HAVE_INET_ATON #undef HAVE_INET_ATON

6
configure vendored
View file

@ -21730,6 +21730,12 @@ if test "${with_libunbound_only+set}" = set; then :
INSTALLTARGET="install-lib" INSTALLTARGET="install-lib"
fi 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 fi
if test $ALLTARGET = "alltargets"; then if test $ALLTARGET = "alltargets"; then

View file

@ -1601,7 +1601,7 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([
AC_MSG_RESULT(no)) AC_MSG_RESULT(no))
AC_SEARCH_LIBS([setusercontext], [util]) 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([setresuid],,[AC_CHECK_FUNCS([setreuid])])
AC_CHECK_FUNCS([setresgid],,[AC_CHECK_FUNCS([setregid])]) AC_CHECK_FUNCS([setresgid],,[AC_CHECK_FUNCS([setregid])])

View file

@ -38,6 +38,12 @@
*/ */
#include "config.h" #include "config.h"
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif
#ifdef HAVE_NET_IF_H
#include <net/if.h>
#endif
#include "util/net_help.h" #include "util/net_help.h"
#include "util/log.h" #include "util/log.h"
#include "util/data/dname.h" #include "util/data/dname.h"
@ -266,7 +272,10 @@ ipstrtoaddr(const char* ip, int port, struct sockaddr_storage* addr,
return 0; return 0;
(void)strlcpy(buf, ip, sizeof(buf)); (void)strlcpy(buf, ip, sizeof(buf));
buf[s-ip]=0; 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; ip = buf;
} }
if(inet_pton((int)sa->sin6_family, ip, &sa->sin6_addr) <= 0) { if(inet_pton((int)sa->sin6_family, ip, &sa->sin6_addr) <= 0) {