]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/nfsd/nfssvc.c
Remove the AI_ADDRCONFIG hint flag to getaddrinfo() when it's
[nfs-utils.git] / utils / nfsd / nfssvc.c
index 106f6e7621305c43b34bb713ee7287f1fae73405..b8028bbed3bca6e76d88d44506a6a495545ec5b6 100644 (file)
 #include "nfslib.h"
 #include "xlog.h"
 
+/*
+ * IPv6 support for nfsd was finished before some of the other daemons (mountd
+ * and statd in particular). That could be a problem in the future if someone
+ * were to boot a kernel that supports IPv6 serving with an older nfs-utils. For
+ * now, hardcode the IPv6 switch into the off position until the other daemons
+ * are functional.
+ */
+#undef IPV6_SUPPORTED
+
 #define NFSD_PORTS_FILE     "/proc/fs/nfsd/portlist"
 #define NFSD_VERS_FILE    "/proc/fs/nfsd/versions"
 #define NFSD_THREAD_FILE  "/proc/fs/nfsd/threads"
@@ -81,6 +90,11 @@ nfssvc_setfds(const struct addrinfo *hints, const char *node, const char *port)
        case AF_INET:
                family = "inet";
                break;
+#ifdef IPV6_SUPPORTED
+       case AF_INET6:
+               family = "inet6";
+               break;
+#endif /* IPV6_SUPPORTED */
        default:
                xlog(L_ERROR, "Unknown address family specified: %d\n",
                                hints->ai_family);
@@ -128,6 +142,15 @@ nfssvc_setfds(const struct addrinfo *hints, const char *node, const char *port)
                        rc = errno;
                        goto error;
                }
+#ifdef IPV6_SUPPORTED
+               if (addr->ai_family == AF_INET6 &&
+                   setsockopt(sockfd, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on))) {
+                       xlog(L_ERROR, "unable to set IPV6_V6ONLY: "
+                               "errno %d (%m)\n", errno);
+                       rc = errno;
+                       goto error;
+               }
+#endif /* IPV6_SUPPORTED */
                if (addr->ai_protocol == IPPROTO_TCP &&
                    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) {
                        xlog(L_ERROR, "unable to set SO_REUSEADDR on %s "
@@ -189,7 +212,7 @@ int
 nfssvc_set_sockets(const int family, const unsigned int protobits,
                   const char *host, const char *port)
 {
-       struct addrinfo hints = { .ai_flags = AI_PASSIVE | AI_ADDRCONFIG };
+       struct addrinfo hints = { .ai_flags = AI_PASSIVE };
 
        hints.ai_family = family;