diff options
-rw-r--r-- | utils/nfsd/nfsd.c | 70 | ||||
-rw-r--r-- | utils/nfsd/nfssvc.c | 47 | ||||
-rw-r--r-- | utils/nfsd/nfssvc.h | 2 |
3 files changed, 29 insertions, 90 deletions
diff --git a/utils/nfsd/nfsd.c b/utils/nfsd/nfsd.c index 201bb13..2165744 100644 --- a/utils/nfsd/nfsd.c +++ b/utils/nfsd/nfsd.c @@ -52,50 +52,6 @@ static struct option longopts[] = { NULL, 0, 0, 0 } }; -/* given a family and ctlbits, disable any that aren't listed in netconfig */ -#ifdef HAVE_LIBTIRPC -static void -nfsd_enable_protos(unsigned int *proto4, unsigned int *proto6) -{ - struct netconfig *nconf; - unsigned int *famproto; - void *handle; - - xlog(D_GENERAL, "Checking netconfig for visible protocols."); - - handle = setnetconfig(); - while((nconf = getnetconfig(handle))) { - if (!(nconf->nc_flag & NC_VISIBLE)) - continue; - - if (!strcmp(nconf->nc_protofmly, NC_INET)) - famproto = proto4; - else if (!strcmp(nconf->nc_protofmly, NC_INET6)) - famproto = proto6; - else - continue; - - if (!strcmp(nconf->nc_proto, NC_TCP)) - NFSCTL_TCPSET(*famproto); - else if (!strcmp(nconf->nc_proto, NC_UDP)) - NFSCTL_UDPSET(*famproto); - - xlog(D_GENERAL, "Enabling %s %s.", nconf->nc_protofmly, - nconf->nc_proto); - } - endnetconfig(handle); - return; -} -#else /* HAVE_LIBTIRPC */ -static void -nfsd_enable_protos(unsigned int *proto4, unsigned int *proto6) -{ - /* Enable all IPv4 protocols if no TIRPC support */ - *proto4 = NFSCTL_ALLBITS; - *proto6 = 0; -} -#endif /* HAVE_LIBTIRPC */ - int main(int argc, char **argv) { @@ -108,8 +64,6 @@ main(int argc, char **argv) unsigned int minorversset = 0; unsigned int versbits = NFSCTL_VERDEFAULT; unsigned int protobits = NFSCTL_ALLBITS; - unsigned int proto4 = 0; - unsigned int proto6 = 0; int grace = -1; int lease = -1; @@ -278,18 +232,6 @@ main(int argc, char **argv) xlog_open(progname); - nfsd_enable_protos(&proto4, &proto6); - - if (!NFSCTL_TCPISSET(protobits)) { - NFSCTL_TCPUNSET(proto4); - NFSCTL_TCPUNSET(proto6); - } - - if (!NFSCTL_UDPISSET(protobits)) { - NFSCTL_UDPUNSET(proto4); - NFSCTL_UDPUNSET(proto6); - } - /* make sure that at least one version is enabled */ found_one = 0; for (c = NFSD_MINVERS; c <= NFSD_MAXVERS; c++) { @@ -302,8 +244,7 @@ main(int argc, char **argv) } if (NFSCTL_VERISSET(versbits, 4) && - !NFSCTL_TCPISSET(proto4) && - !NFSCTL_TCPISSET(proto6)) { + !NFSCTL_TCPISSET(protobits)) { xlog(L_ERROR, "version 4 requires the TCP protocol"); exit(1); } @@ -337,15 +278,10 @@ main(int argc, char **argv) i = 0; do { - error = nfssvc_set_sockets(AF_INET, proto4, haddr[i], port); - if (!error) - socket_up = 1; -#ifdef IPV6_SUPPORTED - error = nfssvc_set_sockets(AF_INET6, proto6, haddr[i], port); + error = nfssvc_set_sockets(protobits, haddr[i], port); if (!error) socket_up = 1; -#endif /* IPV6_SUPPORTED */ - } while (++i < hcounter); + } while (++i < hcounter); if (rdma_port) { error = nfssvc_set_rdmaport(rdma_port); diff --git a/utils/nfsd/nfssvc.c b/utils/nfsd/nfssvc.c index 027e5ac..a2b11d8 100644 --- a/utils/nfsd/nfssvc.c +++ b/utils/nfsd/nfssvc.c @@ -24,6 +24,7 @@ #include "nfslib.h" #include "xlog.h" +#include "nfssvc.h" #ifndef NFSD_FS_DIR #define NFSD_FS_DIR "/proc/fs/nfsd" @@ -124,22 +125,6 @@ nfssvc_setfds(const struct addrinfo *hints, const char *node, const char *port) if (fd < 0) return 0; - switch(hints->ai_family) { - 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); - rc = EAFNOSUPPORT; - goto error; - } - rc = getaddrinfo(node, port, hints, &addrhead); if (rc == EAI_NONAME && !strcmp(port, "nfs")) { snprintf(buf, sizeof(buf), "%d", NFS_PORT); @@ -147,10 +132,10 @@ nfssvc_setfds(const struct addrinfo *hints, const char *node, const char *port) } if (rc != 0) { - xlog(L_ERROR, "unable to resolve %s:%s to %s address: " - "%s", node ? node : "ANYADDR", port, family, - rc == EAI_SYSTEM ? strerror(errno) : - gai_strerror(rc)); + xlog(L_ERROR, "unable to resolve %s:%s: %s", + node ? node : "ANYADDR", port, + rc == EAI_SYSTEM ? strerror(errno) : + gai_strerror(rc)); goto error; } @@ -169,6 +154,20 @@ nfssvc_setfds(const struct addrinfo *hints, const char *node, const char *port) continue; } + switch(addr->ai_addr->sa_family) { + case AF_INET: + family = "AF_INET"; + break; +#ifdef IPV6_SUPPORTED + case AF_INET6: + family = "AF_INET6"; + break; +#endif /* IPV6_SUPPORTED */ + default: + addr = addr->ai_next; + continue; + } + xlog(D_GENERAL, "Creating %s %s socket.", family, proto); /* open socket and prepare to hand it off to kernel */ @@ -252,12 +251,16 @@ error: } int -nfssvc_set_sockets(const int family, const unsigned int protobits, +nfssvc_set_sockets(const unsigned int protobits, const char *host, const char *port) { struct addrinfo hints = { .ai_flags = AI_PASSIVE }; - hints.ai_family = family; +#ifdef IPV6_SUPPORTED + hints.ai_family = AF_UNSPEC; +#else /* IPV6_SUPPORTED */ + hints.ai_family = AF_INET; +#endif /* IPV6_SUPPORTED */ if (!NFSCTL_ANYPROTO(protobits)) return EPROTOTYPE; diff --git a/utils/nfsd/nfssvc.h b/utils/nfsd/nfssvc.h index fbb89b2..7d70f0d 100644 --- a/utils/nfsd/nfssvc.h +++ b/utils/nfsd/nfssvc.h @@ -22,7 +22,7 @@ void nfssvc_mount_nfsdfs(char *progname); int nfssvc_inuse(void); -int nfssvc_set_sockets(const int family, const unsigned int protobits, +int nfssvc_set_sockets(const unsigned int protobits, const char *host, const char *port); void nfssvc_set_time(const char *type, const int seconds); int nfssvc_set_rdmaport(const char *port); |