- Added upstream 1.1.7-rc1 patch
- utils/nfsd: add support for minorvers4 - sm-notify: Don't orphan addrinfo structs - sm-notify: Failed DNS lookups should be retried - mount: remove legacy version of nfs_name_to_address() - compiling error in rpcgen - nfs-utils: Fix IPv6 support in support/nfs/rpc_socket.c - umount.nfs: Harden umount.nfs error reportin
This commit is contained in:
parent
9cff34f9ff
commit
95125b8914
600
nfs-utils-1.1.7-rc1.patch
Normal file
600
nfs-utils-1.1.7-rc1.patch
Normal file
@ -0,0 +1,600 @@
|
||||
diff --git a/support/export/client.c b/support/export/client.c
|
||||
index 1cb242f..5fcf355 100644
|
||||
--- a/support/export/client.c
|
||||
+++ b/support/export/client.c
|
||||
@@ -371,7 +371,7 @@ client_check(nfs_client *clp, struct hostent *hp)
|
||||
#ifdef HAVE_INNETGR
|
||||
{
|
||||
char *dot;
|
||||
- int match;
|
||||
+ int match, i;
|
||||
struct hostent *nhp = NULL;
|
||||
struct sockaddr_in addr;
|
||||
|
||||
@@ -380,6 +380,12 @@ client_check(nfs_client *clp, struct hostent *hp)
|
||||
if (innetgr(cname+1, hname, NULL, NULL))
|
||||
return 1;
|
||||
|
||||
+ /* try the aliases as well */
|
||||
+ for (i = 0; hp->h_aliases[i]; i++) {
|
||||
+ if (innetgr(cname+1, hp->h_aliases[i], NULL, NULL))
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
/* If hname is ip address convert to FQDN */
|
||||
if (inet_aton(hname, &addr.sin_addr) &&
|
||||
(nhp = gethostbyaddr((const char *)&(addr.sin_addr),
|
||||
diff --git a/support/include/nfs/nfs.h b/support/include/nfs/nfs.h
|
||||
index fc26f4e..00b0028 100644
|
||||
--- a/support/include/nfs/nfs.h
|
||||
+++ b/support/include/nfs/nfs.h
|
||||
@@ -13,6 +13,9 @@
|
||||
#define NFSD_MINVERS 2
|
||||
#define NFSD_MAXVERS 4
|
||||
|
||||
+#define NFSD_MINMINORVERS4 1
|
||||
+#define NFSD_MAXMINORVERS4 1
|
||||
+
|
||||
struct nfs_fh_len {
|
||||
int fh_size;
|
||||
u_int8_t fh_handle[NFS3_FHSIZE];
|
||||
diff --git a/support/include/nfslib.h b/support/include/nfslib.h
|
||||
index 9d0d39d..ae98650 100644
|
||||
--- a/support/include/nfslib.h
|
||||
+++ b/support/include/nfslib.h
|
||||
@@ -130,7 +130,7 @@ int wildmat(char *text, char *pattern);
|
||||
* nfsd library functions.
|
||||
*/
|
||||
int nfsctl(int, struct nfsctl_arg *, union nfsctl_res *);
|
||||
-int nfssvc(int port, int nrservs, unsigned int versbits, unsigned int portbits, char *haddr);
|
||||
+int nfssvc(int port, int nrservs, unsigned int versbits, int minorvers4, unsigned int portbits, char *haddr);
|
||||
int nfsaddclient(struct nfsctl_client *clp);
|
||||
int nfsdelclient(struct nfsctl_client *clp);
|
||||
int nfsexport(struct nfsctl_export *exp);
|
||||
diff --git a/support/nfs/nfssvc.c b/support/nfs/nfssvc.c
|
||||
index 9bbc9a5..33c15a7 100644
|
||||
--- a/support/nfs/nfssvc.c
|
||||
+++ b/support/nfs/nfssvc.c
|
||||
@@ -116,7 +116,7 @@ nfssvc_setfds(int port, unsigned int ctlbits, char *haddr)
|
||||
return;
|
||||
}
|
||||
static void
|
||||
-nfssvc_versbits(unsigned int ctlbits)
|
||||
+nfssvc_versbits(unsigned int ctlbits, int minorvers4)
|
||||
{
|
||||
int fd, n, off;
|
||||
char buf[BUFSIZ], *ptr;
|
||||
@@ -133,6 +133,11 @@ nfssvc_versbits(unsigned int ctlbits)
|
||||
else
|
||||
off += snprintf(ptr+off, BUFSIZ - off, "-%d ", n);
|
||||
}
|
||||
+ n = minorvers4 >= 0 ? minorvers4 : -minorvers4;
|
||||
+ if (n >= NFSD_MINMINORVERS4 && n <= NFSD_MAXMINORVERS4)
|
||||
+ off += snprintf(ptr+off, BUFSIZ - off, "%c4.%d",
|
||||
+ minorvers4 > 0 ? '+' : '-',
|
||||
+ n);
|
||||
snprintf(ptr+off, BUFSIZ - off, "\n");
|
||||
if (write(fd, buf, strlen(buf)) != strlen(buf)) {
|
||||
syslog(LOG_ERR, "nfssvc: Setting version failed: errno %d (%s)",
|
||||
@@ -143,8 +148,8 @@ nfssvc_versbits(unsigned int ctlbits)
|
||||
return;
|
||||
}
|
||||
int
|
||||
-nfssvc(int port, int nrservs, unsigned int versbits, unsigned protobits,
|
||||
- char *haddr)
|
||||
+nfssvc(int port, int nrservs, unsigned int versbits, int minorvers4,
|
||||
+ unsigned protobits, char *haddr)
|
||||
{
|
||||
struct nfsctl_arg arg;
|
||||
int fd;
|
||||
@@ -153,7 +158,7 @@ nfssvc(int port, int nrservs, unsigned int versbits, unsigned protobits,
|
||||
* the ports get registered with portmap against correct
|
||||
* versions
|
||||
*/
|
||||
- nfssvc_versbits(versbits);
|
||||
+ nfssvc_versbits(versbits, minorvers4);
|
||||
nfssvc_setfds(port, protobits, haddr);
|
||||
|
||||
fd = open(NFSD_THREAD_FILE, O_WRONLY);
|
||||
diff --git a/support/nfs/rpc_socket.c b/support/nfs/rpc_socket.c
|
||||
index 85e6064..cebf83d 100644
|
||||
--- a/support/nfs/rpc_socket.c
|
||||
+++ b/support/nfs/rpc_socket.c
|
||||
@@ -132,7 +132,7 @@ static int nfs_bind(const int sock, const sa_family_t family)
|
||||
return -1;
|
||||
}
|
||||
|
||||
-#ifdef IPV6_SUPPORT
|
||||
+#ifdef IPV6_SUPPORTED
|
||||
|
||||
/*
|
||||
* Bind a socket using an unused privileged source port.
|
||||
@@ -153,18 +153,16 @@ static int nfs_bindresvport(const int sock, const sa_family_t family)
|
||||
|
||||
switch (family) {
|
||||
case AF_INET:
|
||||
- return bindresvport_sa(sock, (struct sockaddr *)&sin,
|
||||
- (socklen_t)sizeof(sin));
|
||||
+ return bindresvport_sa(sock, (struct sockaddr *)&sin);
|
||||
case AF_INET6:
|
||||
- return bindresvport_sa(sock, (struct sockaddr *)&sin6,
|
||||
- (socklen_t)sizeof(sin6));
|
||||
+ return bindresvport_sa(sock, (struct sockaddr *)&sin6);
|
||||
}
|
||||
|
||||
errno = EAFNOSUPPORT;
|
||||
return -1;
|
||||
}
|
||||
|
||||
-#else /* !IPV6_SUPPORT */
|
||||
+#else /* !IPV6_SUPPORTED */
|
||||
|
||||
/*
|
||||
* Bind a socket using an unused privileged source port.
|
||||
@@ -182,7 +180,7 @@ static int nfs_bindresvport(const int sock, const sa_family_t family)
|
||||
return bindresvport(sock, NULL);
|
||||
}
|
||||
|
||||
-#endif /* !IPV6_SUPPORT */
|
||||
+#endif /* !IPV6_SUPPORTED */
|
||||
|
||||
/*
|
||||
* Perform a non-blocking connect on the socket fd.
|
||||
diff --git a/tools/rpcgen/rpc_main.c b/tools/rpcgen/rpc_main.c
|
||||
index 26f202b..e23caff 100644
|
||||
--- a/tools/rpcgen/rpc_main.c
|
||||
+++ b/tools/rpcgen/rpc_main.c
|
||||
@@ -550,7 +550,7 @@ s_output(int argc, char **argv, char *infile, char *define, int extend,
|
||||
f_print(fout, "#include <sys/ttycom.h>/* TIOCNOTTY */\n");
|
||||
#else
|
||||
if( !tirpcflag )
|
||||
- f_print(fout, "#include <sys/ttycom.h>/* TIOCNOTTY */\n");
|
||||
+ f_print(fout, "#include <sys/ioctl.h>/* TIOCNOTTY */\n");
|
||||
#endif
|
||||
if( Cflag && (inetdflag || pmflag ) ) {
|
||||
f_print(fout, "#ifdef __cplusplus\n");
|
||||
diff --git a/utils/mount/network.c b/utils/mount/network.c
|
||||
index 72f4b84..04a62ab 100644
|
||||
--- a/utils/mount/network.c
|
||||
+++ b/utils/mount/network.c
|
||||
@@ -185,39 +185,32 @@ static void nfs_set_port(struct sockaddr *sap, const unsigned short port)
|
||||
}
|
||||
}
|
||||
|
||||
-#ifdef HAVE_DECL_AI_ADDRCONFIG
|
||||
-/**
|
||||
- * nfs_name_to_address - resolve hostname to an IPv4 or IPv6 socket address
|
||||
- * @hostname: pointer to C string containing DNS hostname to resolve
|
||||
- * @af_hint: hint to restrict resolution to one address family
|
||||
- * @sap: pointer to buffer to fill with socket address
|
||||
- * @len: IN: size of buffer to fill; OUT: size of socket address
|
||||
- *
|
||||
- * Returns 1 and places a socket address at @sap if successful;
|
||||
- * otherwise zero.
|
||||
- */
|
||||
-int nfs_name_to_address(const char *hostname,
|
||||
- const sa_family_t af_hint,
|
||||
- struct sockaddr *sap, socklen_t *salen)
|
||||
+static int nfs_lookup(const char *hostname, const sa_family_t family,
|
||||
+ struct sockaddr *sap, socklen_t *salen)
|
||||
{
|
||||
struct addrinfo *gai_results;
|
||||
struct addrinfo gai_hint = {
|
||||
- .ai_family = af_hint,
|
||||
+#ifdef HAVE_DECL_AI_ADDRCONFIG
|
||||
.ai_flags = AI_ADDRCONFIG,
|
||||
+#endif /* HAVE_DECL_AI_ADDRCONFIG */
|
||||
+ .ai_family = family,
|
||||
};
|
||||
socklen_t len = *salen;
|
||||
int error, ret = 0;
|
||||
|
||||
- if (af_hint == AF_INET6)
|
||||
- gai_hint.ai_flags |= AI_V4MAPPED|AI_ALL;
|
||||
-
|
||||
*salen = 0;
|
||||
|
||||
error = getaddrinfo(hostname, NULL, &gai_hint, &gai_results);
|
||||
- if (error) {
|
||||
+ switch (error) {
|
||||
+ case 0:
|
||||
+ break;
|
||||
+ case EAI_SYSTEM:
|
||||
+ nfs_error(_("%s: DNS resolution failed for %s: %s"),
|
||||
+ progname, hostname, strerror(errno));
|
||||
+ return ret;
|
||||
+ default:
|
||||
nfs_error(_("%s: DNS resolution failed for %s: %s"),
|
||||
- progname, hostname, (error == EAI_SYSTEM ?
|
||||
- strerror(errno) : gai_strerror(error)));
|
||||
+ progname, hostname, gai_strerror(error));
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -240,61 +233,25 @@ int nfs_name_to_address(const char *hostname,
|
||||
freeaddrinfo(gai_results);
|
||||
return ret;
|
||||
}
|
||||
-#else /* HAVE_DECL_AI_ADDRCONFIG */
|
||||
+
|
||||
/**
|
||||
- * nfs_name_to_address - resolve hostname to an IPv4 socket address
|
||||
+ * nfs_name_to_address - resolve hostname to an IPv4 or IPv6 socket address
|
||||
* @hostname: pointer to C string containing DNS hostname to resolve
|
||||
- * @af_hint: hint to restrict resolution to one address family
|
||||
* @sap: pointer to buffer to fill with socket address
|
||||
* @len: IN: size of buffer to fill; OUT: size of socket address
|
||||
*
|
||||
* Returns 1 and places a socket address at @sap if successful;
|
||||
* otherwise zero.
|
||||
- *
|
||||
- * Some older getaddrinfo(3) implementations don't support
|
||||
- * AI_ADDRCONFIG or AI_V4MAPPED properly. For those cases, a DNS
|
||||
- * resolver based on the traditional gethostbyname(3) is provided.
|
||||
*/
|
||||
int nfs_name_to_address(const char *hostname,
|
||||
- const sa_family_t af_hint,
|
||||
struct sockaddr *sap, socklen_t *salen)
|
||||
{
|
||||
- struct sockaddr_in *sin = (struct sockaddr_in *)sap;
|
||||
- socklen_t len = *salen;
|
||||
- struct hostent *hp;
|
||||
-
|
||||
- *salen = 0;
|
||||
-
|
||||
- if (af_hint != AF_INET) {
|
||||
- nfs_error(_("%s: address family not supported by DNS resolver\n"),
|
||||
- progname, hostname);
|
||||
- return 0;
|
||||
- }
|
||||
-
|
||||
- sin->sin_family = AF_INET;
|
||||
- if (inet_aton(hostname, &sin->sin_addr)) {
|
||||
- *salen = sizeof(*sin);
|
||||
- return 1;
|
||||
- }
|
||||
-
|
||||
- hp = gethostbyname(hostname);
|
||||
- if (hp == NULL) {
|
||||
- nfs_error(_("%s: DNS resolution failed for %s: %s"),
|
||||
- progname, hostname, hstrerror(h_errno));
|
||||
- return 0;
|
||||
- }
|
||||
-
|
||||
- if (hp->h_length > len) {
|
||||
- nfs_error(_("%s: DNS resolution results too long for buffer\n"),
|
||||
- progname);
|
||||
- return 0;
|
||||
- }
|
||||
-
|
||||
- memcpy(&sin->sin_addr, hp->h_addr, hp->h_length);
|
||||
- *salen = sizeof(struct sockaddr_in);
|
||||
- return 1;
|
||||
+#ifdef IPV6_SUPPORTED
|
||||
+ return nfs_lookup(hostname, AF_UNSPEC, sap, salen);
|
||||
+#else /* !IPV6_SUPPORTED */
|
||||
+ return nfs_lookup(hostname, AF_INET, sap, salen);
|
||||
+#endif /* !IPV6_SUPPORTED */
|
||||
}
|
||||
-#endif /* HAVE_DECL_AI_ADDRCONFIG */
|
||||
|
||||
/**
|
||||
* nfs_gethostbyname - resolve a hostname to an IPv4 address
|
||||
@@ -307,8 +264,7 @@ int nfs_gethostbyname(const char *hostname, struct sockaddr_in *sin)
|
||||
{
|
||||
socklen_t len = sizeof(*sin);
|
||||
|
||||
- return nfs_name_to_address(hostname, AF_INET,
|
||||
- (struct sockaddr *)sin, &len);
|
||||
+ return nfs_lookup(hostname, AF_INET, (struct sockaddr *)sin, &len);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -863,17 +819,24 @@ int nfs_advise_umount(const struct sockaddr *sap, const socklen_t salen,
|
||||
CLIENT *client;
|
||||
enum clnt_stat res = 0;
|
||||
|
||||
- if (nfs_probe_mntport(sap, salen, &mnt_pmap) == 0)
|
||||
- return 0;
|
||||
-
|
||||
memcpy(saddr, sap, salen);
|
||||
+ if (nfs_probe_mntport(saddr, salen, &mnt_pmap) == 0) {
|
||||
+ if (verbose)
|
||||
+ nfs_error(_("%s: Failed to discover mountd port%s"),
|
||||
+ progname, clnt_spcreateerror(""));
|
||||
+ return 0;
|
||||
+ }
|
||||
nfs_set_port(saddr, mnt_pmap.pm_port);
|
||||
|
||||
client = nfs_get_priv_rpcclient(saddr, salen, mnt_pmap.pm_prot,
|
||||
mnt_pmap.pm_prog, mnt_pmap.pm_vers,
|
||||
&timeout);
|
||||
- if (client == NULL)
|
||||
+ if (client == NULL) {
|
||||
+ if (verbose)
|
||||
+ nfs_error(_("%s: Failed to create RPC client%s"),
|
||||
+ progname, clnt_spcreateerror(""));
|
||||
return 0;
|
||||
+ }
|
||||
|
||||
client->cl_auth = authunix_create_default();
|
||||
|
||||
@@ -881,13 +844,15 @@ int nfs_advise_umount(const struct sockaddr *sap, const socklen_t salen,
|
||||
(xdrproc_t)xdr_dirpath, (caddr_t)argp,
|
||||
(xdrproc_t)xdr_void, NULL,
|
||||
timeout);
|
||||
+ if (verbose && res != RPC_SUCCESS)
|
||||
+ nfs_error(_("%s: UMNT call failed: %s"),
|
||||
+ progname, clnt_sperrno(res));
|
||||
|
||||
auth_destroy(client->cl_auth);
|
||||
CLNT_DESTROY(client);
|
||||
|
||||
if (res != RPC_SUCCESS)
|
||||
return 0;
|
||||
-
|
||||
return 1;
|
||||
}
|
||||
|
||||
diff --git a/utils/mount/network.h b/utils/mount/network.h
|
||||
index 0dd90f8..b3f9bd2 100644
|
||||
--- a/utils/mount/network.h
|
||||
+++ b/utils/mount/network.h
|
||||
@@ -44,8 +44,7 @@ int nfs_probe_bothports(const struct sockaddr *, const socklen_t,
|
||||
struct pmap *, const struct sockaddr *,
|
||||
const socklen_t, struct pmap *);
|
||||
int nfs_gethostbyname(const char *, struct sockaddr_in *);
|
||||
-int nfs_name_to_address(const char *, const sa_family_t,
|
||||
- struct sockaddr *, socklen_t *);
|
||||
+int nfs_name_to_address(const char *, struct sockaddr *, socklen_t *);
|
||||
int nfs_string_to_sockaddr(const char *, const size_t,
|
||||
struct sockaddr *, socklen_t *);
|
||||
int nfs_present_sockaddr(const struct sockaddr *,
|
||||
diff --git a/utils/mount/nfsumount.c b/utils/mount/nfsumount.c
|
||||
index 78ebd4a..9b48cc9 100644
|
||||
--- a/utils/mount/nfsumount.c
|
||||
+++ b/utils/mount/nfsumount.c
|
||||
@@ -182,14 +182,15 @@ static int nfs_umount_do_umnt(struct mount_options *options,
|
||||
return EX_FAIL;
|
||||
}
|
||||
|
||||
- if (nfs_name_to_address(*hostname, AF_UNSPEC, sap, &salen)) {
|
||||
- if (nfs_advise_umount(sap, salen, &mnt_pmap, dirname) != 0)
|
||||
- return EX_SUCCESS;
|
||||
- else
|
||||
- nfs_error(_("%s: Server failed to unmount '%s:%s'"),
|
||||
- progname, *hostname, *dirname);
|
||||
- }
|
||||
- return EX_FAIL;
|
||||
+ if (nfs_name_to_address(*hostname, sap, &salen) == 0)
|
||||
+ /* nfs_name_to_address reports any errors */
|
||||
+ return EX_FAIL;
|
||||
+
|
||||
+ if (nfs_advise_umount(sap, salen, &mnt_pmap, dirname) == 0)
|
||||
+ /* nfs_advise_umount reports any errors */
|
||||
+ return EX_FAIL;
|
||||
+
|
||||
+ return EX_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c
|
||||
index c369136..ec95b78 100644
|
||||
--- a/utils/mount/stropts.c
|
||||
+++ b/utils/mount/stropts.c
|
||||
@@ -87,8 +87,6 @@ struct nfsmount_info {
|
||||
int flags, /* MS_ flags */
|
||||
fake, /* actually do the mount? */
|
||||
child; /* forked bg child? */
|
||||
-
|
||||
- sa_family_t family; /* supported address family */
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -198,8 +196,7 @@ static int nfs_append_clientaddr_option(const struct sockaddr *sap,
|
||||
* Resolve the 'mounthost=' hostname and append a new option using
|
||||
* the resulting address.
|
||||
*/
|
||||
-static int nfs_fix_mounthost_option(const sa_family_t family,
|
||||
- struct mount_options *options)
|
||||
+static int nfs_fix_mounthost_option(struct mount_options *options)
|
||||
{
|
||||
struct sockaddr_storage dummy;
|
||||
struct sockaddr *sap = (struct sockaddr *)&dummy;
|
||||
@@ -210,7 +207,7 @@ static int nfs_fix_mounthost_option(const sa_family_t family,
|
||||
if (!mounthost)
|
||||
return 1;
|
||||
|
||||
- if (!nfs_name_to_address(mounthost, family, sap, &salen)) {
|
||||
+ if (!nfs_name_to_address(mounthost, sap, &salen)) {
|
||||
nfs_error(_("%s: unable to determine mount server's address"),
|
||||
progname);
|
||||
return 0;
|
||||
@@ -270,14 +267,14 @@ static int nfs_validate_options(struct nfsmount_info *mi)
|
||||
if (!nfs_parse_devname(mi->spec, &mi->hostname, NULL))
|
||||
return 0;
|
||||
|
||||
- if (!nfs_name_to_address(mi->hostname, mi->family, sap, &salen))
|
||||
+ if (!nfs_name_to_address(mi->hostname, sap, &salen))
|
||||
return 0;
|
||||
|
||||
if (strncmp(mi->type, "nfs4", 4) == 0) {
|
||||
if (!nfs_append_clientaddr_option(sap, salen, mi->options))
|
||||
return 0;
|
||||
} else {
|
||||
- if (!nfs_fix_mounthost_option(mi->family, mi->options))
|
||||
+ if (!nfs_fix_mounthost_option(mi->options))
|
||||
return 0;
|
||||
if (!mi->fake && !nfs_verify_lock_option(mi->options))
|
||||
return 0;
|
||||
@@ -785,11 +782,6 @@ int nfsmount_string(const char *spec, const char *node, const char *type,
|
||||
.flags = flags,
|
||||
.fake = fake,
|
||||
.child = child,
|
||||
-#ifdef IPV6_SUPPORTED
|
||||
- .family = AF_UNSPEC, /* either IPv4 or v6 */
|
||||
-#else
|
||||
- .family = AF_INET, /* only IPv4 */
|
||||
-#endif
|
||||
};
|
||||
int retval = EX_FAIL;
|
||||
|
||||
diff --git a/utils/nfsd/nfsd.c b/utils/nfsd/nfsd.c
|
||||
index c97c81f..e3c0094 100644
|
||||
--- a/utils/nfsd/nfsd.c
|
||||
+++ b/utils/nfsd/nfsd.c
|
||||
@@ -41,6 +41,7 @@ static struct option longopts[] =
|
||||
};
|
||||
unsigned int protobits = NFSCTL_ALLBITS;
|
||||
unsigned int versbits = NFSCTL_ALLBITS;
|
||||
+int minorvers4 = NFSD_MAXMINORVERS4; /* nfsv4 minor version */
|
||||
char *haddr = NULL;
|
||||
|
||||
int
|
||||
@@ -49,6 +50,7 @@ main(int argc, char **argv)
|
||||
int count = 1, c, error, port, fd, found_one;
|
||||
struct servent *ent;
|
||||
struct hostent *hp;
|
||||
+ char *p;
|
||||
|
||||
ent = getservbyname ("nfs", "udp");
|
||||
if (ent != NULL)
|
||||
@@ -79,10 +81,14 @@ main(int argc, char **argv)
|
||||
}
|
||||
break;
|
||||
case 'N':
|
||||
- switch((c = atoi(optarg))) {
|
||||
- case 2:
|
||||
- case 3:
|
||||
+ switch((c = strtol(optarg, &p, 0))) {
|
||||
case 4:
|
||||
+ if (*p == '.') {
|
||||
+ minorvers4 = -atoi(p + 1);
|
||||
+ break;
|
||||
+ }
|
||||
+ case 3:
|
||||
+ case 2:
|
||||
NFSCTL_VERUNSET(versbits, c);
|
||||
break;
|
||||
default:
|
||||
@@ -158,7 +164,7 @@ main(int argc, char **argv)
|
||||
closeall(3);
|
||||
|
||||
openlog("nfsd", LOG_PID, LOG_DAEMON);
|
||||
- if ((error = nfssvc(port, count, versbits, protobits, haddr)) < 0) {
|
||||
+ if ((error = nfssvc(port, count, versbits, minorvers4, protobits, haddr)) < 0) {
|
||||
int e = errno;
|
||||
syslog(LOG_ERR, "nfssvc: %s", strerror(e));
|
||||
closelog();
|
||||
diff --git a/utils/statd/sm-notify.c b/utils/statd/sm-notify.c
|
||||
index f1fc619..72dcff4 100644
|
||||
--- a/utils/statd/sm-notify.c
|
||||
+++ b/utils/statd/sm-notify.c
|
||||
@@ -118,17 +118,33 @@ static void smn_set_port(struct sockaddr *sap, const unsigned short port)
|
||||
}
|
||||
}
|
||||
|
||||
-static struct addrinfo *smn_lookup(const sa_family_t family, const char *name)
|
||||
+static struct addrinfo *smn_lookup(const char *name)
|
||||
{
|
||||
struct addrinfo *ai, hint = {
|
||||
- .ai_family = family,
|
||||
+#if HAVE_DECL_AI_ADDRCONFIG
|
||||
+ .ai_flags = AI_ADDRCONFIG,
|
||||
+#endif /* HAVE_DECL_AI_ADDRCONFIG */
|
||||
+ .ai_family = AF_INET,
|
||||
.ai_protocol = IPPROTO_UDP,
|
||||
};
|
||||
+ int error;
|
||||
+
|
||||
+ error = getaddrinfo(name, NULL, &hint, &ai);
|
||||
+ switch (error) {
|
||||
+ case 0:
|
||||
+ return ai;
|
||||
+ case EAI_SYSTEM:
|
||||
+ if (opt_debug)
|
||||
+ nsm_log(LOG_ERR, "getaddrinfo(3): %s",
|
||||
+ strerror(errno));
|
||||
+ break;
|
||||
+ default:
|
||||
+ if (opt_debug)
|
||||
+ nsm_log(LOG_ERR, "getaddrinfo(3): %s",
|
||||
+ gai_strerror(error));
|
||||
+ }
|
||||
|
||||
- if (getaddrinfo(name, NULL, &hint, &ai) != 0)
|
||||
- return NULL;
|
||||
-
|
||||
- return ai;
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
static void smn_forget_host(struct nsm_host *host)
|
||||
@@ -291,7 +307,7 @@ notify(void)
|
||||
|
||||
/* Bind source IP if provided on command line */
|
||||
if (opt_srcaddr) {
|
||||
- struct addrinfo *ai = smn_lookup(AF_INET, opt_srcaddr);
|
||||
+ struct addrinfo *ai = smn_lookup(opt_srcaddr);
|
||||
if (!ai) {
|
||||
nsm_log(LOG_ERR,
|
||||
"Not a valid hostname or address: \"%s\"",
|
||||
@@ -402,13 +418,12 @@ notify_host(int sock, struct nsm_host *host)
|
||||
host->xid = xid++;
|
||||
|
||||
if (host->ai == NULL) {
|
||||
- host->ai = smn_lookup(AF_UNSPEC, host->name);
|
||||
+ host->ai = smn_lookup(host->name);
|
||||
if (host->ai == NULL) {
|
||||
nsm_log(LOG_WARNING,
|
||||
- "%s doesn't seem to be a valid address,"
|
||||
- " skipped", host->name);
|
||||
- smn_forget_host(host);
|
||||
- return 1;
|
||||
+ "DNS resolution of %s failed; "
|
||||
+ "retrying later", host->name);
|
||||
+ return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -424,19 +439,27 @@ notify_host(int sock, struct nsm_host *host)
|
||||
* point.
|
||||
*/
|
||||
if (host->retries >= 4) {
|
||||
- struct addrinfo *first = host->ai;
|
||||
- struct addrinfo **next = &host->ai;
|
||||
-
|
||||
- /* remove the first entry from the list */
|
||||
- host->ai = first->ai_next;
|
||||
- first->ai_next = NULL;
|
||||
- /* find the end of the list */
|
||||
- next = &first->ai_next;
|
||||
- while ( *next )
|
||||
- next = & (*next)->ai_next;
|
||||
- /* put first entry at end */
|
||||
- *next = first;
|
||||
- memcpy(&host->addr, first->ai_addr, first->ai_addrlen);
|
||||
+ /* don't rotate if there is only one addrinfo */
|
||||
+ if (host->ai->ai_next == NULL)
|
||||
+ memcpy(&host->addr, host->ai->ai_addr,
|
||||
+ host->ai->ai_addrlen);
|
||||
+ else {
|
||||
+ struct addrinfo *first = host->ai;
|
||||
+ struct addrinfo **next = &host->ai;
|
||||
+
|
||||
+ /* remove the first entry from the list */
|
||||
+ host->ai = first->ai_next;
|
||||
+ first->ai_next = NULL;
|
||||
+ /* find the end of the list */
|
||||
+ next = &first->ai_next;
|
||||
+ while ( *next )
|
||||
+ next = & (*next)->ai_next;
|
||||
+ /* put first entry at end */
|
||||
+ *next = first;
|
||||
+ memcpy(&host->addr, first->ai_addr,
|
||||
+ first->ai_addrlen);
|
||||
+ }
|
||||
+
|
||||
smn_set_port((struct sockaddr *)&host->addr, 0);
|
||||
host->retries = 0;
|
||||
}
|
@ -2,7 +2,7 @@ Summary: NFS utilities and supporting clients and daemons for the kernel NFS ser
|
||||
Name: nfs-utils
|
||||
URL: http://sourceforge.net/projects/nfs
|
||||
Version: 1.1.6
|
||||
Release: 2%{?dist}
|
||||
Release: 3%{?dist}
|
||||
Epoch: 1
|
||||
|
||||
# group all 32bit related archs
|
||||
@ -22,6 +22,8 @@ Patch00: nfs-utils-1.0.5-statdpath.patch
|
||||
Patch01: nfs-utils-1.1.0-smnotify-path.patch
|
||||
Patch02: nfs-utils-1.1.0-exp-subtree-warn-off.patch
|
||||
|
||||
Patch100: nfs-utils-1.1.7-rc1.patch
|
||||
|
||||
Group: System Environment/Daemons
|
||||
Provides: exportfs = %{epoch}:%{version}-%{release}
|
||||
Provides: nfsstat = %{epoch}:%{version}-%{release}
|
||||
@ -71,6 +73,8 @@ This package also contains the mount.nfs and umount.nfs program.
|
||||
%patch01 -p1
|
||||
%patch02 -p1
|
||||
|
||||
%patch100 -p1
|
||||
|
||||
# Remove .orig files
|
||||
find . -name "*.orig" | xargs rm -f
|
||||
|
||||
@ -229,6 +233,16 @@ fi
|
||||
%attr(4755,root,root) /sbin/umount.nfs4
|
||||
|
||||
%changelog
|
||||
* Mon May 18 2009 Steve Dickson <steved@redhat.com> 1.1.6-3
|
||||
- Added upstream 1.1.7-rc1 patch
|
||||
- utils/nfsd: add support for minorvers4
|
||||
- sm-notify: Don't orphan addrinfo structs
|
||||
- sm-notify: Failed DNS lookups should be retried
|
||||
- mount: remove legacy version of nfs_name_to_address()
|
||||
- compiling error in rpcgen
|
||||
- nfs-utils: Fix IPv6 support in support/nfs/rpc_socket.c
|
||||
- umount.nfs: Harden umount.nfs error reportin
|
||||
|
||||
* Mon Apr 27 2009 Steve Dickson <steved@redhat.com> 1.1.6-2
|
||||
- nfslock.init: options not correctly parsed (bz 459591)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user