X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=utils%2Fnfsd%2Fnfssvc.c;h=12d3253228fadb0e074590b83d6e08808c2ec59e;hb=e4328bb8d13ae6dda33308557e6bbb352d5674bb;hp=106f6e7621305c43b34bb713ee7287f1fae73405;hpb=094b26031a376050d8610d055eb01c7949ad6547;p=nfs-utils.git diff --git a/utils/nfsd/nfssvc.c b/utils/nfsd/nfssvc.c index 106f6e7..12d3253 100644 --- a/utils/nfsd/nfssvc.c +++ b/utils/nfsd/nfssvc.c @@ -22,6 +22,15 @@ #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 "