Allow interface names as scope-id in IPv6 link-local addresses.
authorflorian <florian@openbsd.org>
Fri, 19 Nov 2021 16:42:01 +0000 (16:42 +0000)
committerflorian <florian@openbsd.org>
Fri, 19 Nov 2021 16:42:01 +0000 (16:42 +0000)
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
usr.sbin/unbound/configure
usr.sbin/unbound/configure.ac
usr.sbin/unbound/util/net_help.c

index ea6afa4..ca2dfad 100644 (file)
 /* Define to 1 if you have the <ifaddrs.h> 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
 
index 1db58e3..0362aee 100644 (file)
@@ -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
index 35bd777..ea25c8a 100644 (file)
@@ -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])])
 
index 06bc1f5..f8b6090 100644 (file)
  */
 
 #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/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) {