SOURCES: nfs-utils-CITI_NFS4.patch - updated to latest patchset

baggins baggins at pld-linux.org
Tue Aug 14 16:12:46 CEST 2007


Author: baggins                      Date: Tue Aug 14 14:12:46 2007 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- updated to latest patchset

---- Files affected:
SOURCES:
   nfs-utils-CITI_NFS4.patch (1.4 -> 1.5) 

---- Diffs:

================================================================
Index: SOURCES/nfs-utils-CITI_NFS4.patch
diff -u SOURCES/nfs-utils-CITI_NFS4.patch:1.4 SOURCES/nfs-utils-CITI_NFS4.patch:1.5
--- SOURCES/nfs-utils-CITI_NFS4.patch:1.4	Thu Apr  5 18:56:32 2007
+++ SOURCES/nfs-utils-CITI_NFS4.patch	Tue Aug 14 16:12:41 2007
@@ -1,134 +1,217 @@
-Add secinfo processing.
 
-From: Fred Isaman <iisaman at citi.umich.edu>
 
-Signed-off-by: Fred Isaman <iisaman at citi.umich.edu>
+The complete set of CITI nfs-utils patches rolled into one patch.
 
-Add secinfo processing.
----
-
- support/include/nfslib.h  |    6 ++
- support/nfs/exports.c     |  145 ++++++++++++++++++++++++++++++++++++++++++++-
- utils/exportfs/exportfs.c |    3 +
- utils/mountd/cache.c      |   14 ++++
- 4 files changed, 164 insertions(+), 4 deletions(-)
-
-Try to use kernel function to determine supported Kerberos enctypes.
+Changes since 1.0.11-CITI_NFS4_ALL-1:
 
-From: Kevin Coffman <kwc at citi.umich.edu>
+ * Update to nfs-utils-1.1.0
 
-Signed-off-by: Kevin Coffman <kwc at citi.umich.edu>
-
-This patch replaces a hard-coded list with a function to obtain
-the Kerberos encryption types that the kernel's rpcsec_gss code
-can support.  Defaults to old behavior if kernel does not supply
-information.
----
+ * Include patches from git not yet in a release:
+   - Fix mount error messages
 
- utils/gssd/gssd.c      |    2 
- utils/gssd/krb5_util.c |  228 +++++++++++++++++++++++++++++++++++++-----------
- utils/gssd/krb5_util.h |    2 
- 3 files changed, 182 insertions(+), 50 deletions(-)
+ * Update gssd usage message to include new -n option.
 
-Add EXPERIMENTAL support for non-DES encryption types.
+ * Patches from Bruce Fields to clean up compile warning, and
+   move pseudoflavor code to a common location
 
-From: Kevin Coffman <kwc at citi.umich.edu>
+ * Patch from Bruce Fields and Fred Isaman that adds support
+   to exportfs for reading a sec= option and sending server
+   security data through cache via
+   "... secinfo n flavor1 flag1 ... flavorN flagN".
 
-Signed-off-by: Kevin Coffman <kwc at citi.umich.edu>
 
-Adds EXPERIMENTAL support for non-DES encryption types.  Sends a new
-format of context information to the kernel.
-(Requires kernel support to do anything useful.)
 ---
 
- utils/gssd/context.h       |    6 +
- utils/gssd/context_lucid.c |  391 ++++++++++++++++++++++++++++++++++++++++++--
- utils/gssd/context_mit.c   |  254 +++++++++++++++++++++++++----
- 3 files changed, 603 insertions(+), 48 deletions(-)
-
-diff --git a/support/include/nfslib.h b/support/include/nfslib.h
-index c085029..6d7743d 100644
---- a/support/include/nfslib.h
-+++ b/support/include/nfslib.h
-@@ -57,6 +57,9 @@ enum cle_maptypes {
- #define	_PATH_PROC_EXPORTS_ALT	"/proc/fs/nfsd/exports"
- #endif
+ nfs-utils-1.1.0-kwc/support/include/nfslib.h        |   10 +
+ nfs-utils-1.1.0-kwc/support/include/pseudoflavors.h |   17 ++
+ nfs-utils-1.1.0-kwc/support/nfs/exports.c           |  158 ++++++++++++++++++--
+ nfs-utils-1.1.0-kwc/utils/exportfs/exportfs.c       |    1 
+ nfs-utils-1.1.0-kwc/utils/gssd/gssd.c               |    2 
+ nfs-utils-1.1.0-kwc/utils/mount/mount.c             |   40 ++++-
+ nfs-utils-1.1.0-kwc/utils/mount/nfs4_mount.h        |   12 -
+ nfs-utils-1.1.0-kwc/utils/mount/nfs4mount.c         |   27 ---
+ nfs-utils-1.1.0-kwc/utils/mountd/cache.c            |   21 ++
+ 10 files changed, 240 insertions(+), 49 deletions(-)
+
+diff -puN utils/mount/mount.c~CITI_NFS4_ALL utils/mount/mount.c
+--- nfs-utils-1.1.0/utils/mount/mount.c~CITI_NFS4_ALL	2007-06-22 10:51:38.885022000 -0400
++++ nfs-utils-1.1.0-kwc/utils/mount/mount.c	2007-06-22 10:52:04.954241000 -0400
+@@ -285,22 +285,49 @@ static void parse_opts (const char *opti
+ 	}
+ }
  
-+#define SECFLAVOR_COUNT 7
-+extern char *secflavor_name[SECFLAVOR_COUNT];
+-static void mount_error(char *node)
++static void mount_error(char *mntpnt, char *node)
+ {
+ 	switch(errno) {
+ 		case ENOTDIR:
+-			fprintf(stderr, "%s: mount point %s is not a directory\n", progname, node);
++			fprintf(stderr, "%s: mount point %s is not a directory\n", 
++				progname, mntpnt);
+ 			break;
+ 		case EBUSY:
+-			fprintf(stderr, "%s: %s is already mounted or busy\n", progname, node);
++			fprintf(stderr, "%s: %s is already mounted or busy\n", 
++				progname, mntpnt);
+ 			break;
+ 		case ENOENT:
+-			fprintf(stderr, "%s: mount point %s does not exist\n", progname, node);
++			if (node) {
++				fprintf(stderr, "%s: %s failed, reason given by server: %s\n",
++					progname, node, strerror(errno));
++			} else
++				fprintf(stderr, "%s: mount point %s does not exist\n", 
++					progname, mntpnt);
+ 			break;
+ 		default:
+ 			fprintf(stderr, "%s: %s\n", progname, strerror(errno));
+ 	}
+ }
++static int chk_mountpoint(char *mount_point)
++{
++	struct stat sb;
 +
- /*
-  * Data related to a single exports entry as returned by getexportent.
-  * FIXME: export options should probably be parsed at a later time to
-@@ -83,6 +86,8 @@ struct exportent {
- 	int             e_fslocmethod;
- 	char *          e_fslocdata;
- 	char *		e_uuid;
-+	int		e_secinfo_order[SECFLAVOR_COUNT+1];
-+	int		e_secinfo_flags[SECFLAVOR_COUNT];
- };
++	if (stat(mount_point, &sb) < 0){
++		mount_error(mount_point, NULL);
++		return 1;
++	}
++	if (S_ISDIR(sb.st_mode) == 0){
++		errno = ENOTDIR;
++		mount_error(mount_point, NULL);
++		return 1;
++	}
++	if (access(mount_point, X_OK) < 0) {
++		mount_error(mount_point, NULL);
++		return 1;
++	}
++
++	return 0;
++}
  
- struct rmtabent {
-@@ -96,6 +101,7 @@ struct rmtabent {
-  */
- void			setexportent(char *fname, char *type);
- struct exportent *	getexportent(int,int);
-+void 			secinfo_show(FILE *fp, struct exportent *ep);
- void			putexportent(struct exportent *xep);
- void			endexportent(void);
- struct exportent *	mkexportent(char *hname, char *path, char *opts);
-diff --git a/support/nfs/exports.c b/support/nfs/exports.c
-index 294e1c9..af9ab2f 100644
---- a/support/nfs/exports.c
-+++ b/support/nfs/exports.c
-@@ -51,6 +51,10 @@ static int	parsenum(char **cpp);
- static int	parsenum(char **cpp);
- static void	freesquash(void);
- static void	syntaxerr(char *msg);
-+static unsigned int parse_flavors(char *str, struct exportent *ep);
-+static int	secinfo_default(struct exportent *ep);
-+static void	setflags(int mask, unsigned int *ap, struct exportent *ep);
-+static void	clearflags(int mask, unsigned int *ap, struct exportent *ep);
+ extern u_short getport(
+ 	struct sockaddr_in *saddr,
+@@ -508,6 +535,9 @@ int main(int argc, char *argv[])
+ 	    }
+ 	}
  
- void
- setexportent(char *fname, char *type)
-@@ -102,6 +106,7 @@ getexportent(int fromkernel, int fromexp
++	if (chk_mountpoint(mount_point))
++		exit(EX_FAIL);
++
+ 	if (nfs_mount_vers == 4)
+ 		mnt_err = nfs4mount(spec, mount_point, &flags, &extra_opts, &mount_opts, 0);
+ 	else {
+@@ -538,7 +568,7 @@ int main(int argc, char *argv[])
+ 					   mount_opts);
+ 
+ 		if (mnt_err) {
+-			mount_error(mount_point);
++			mount_error(mount_point, spec);
+ 			exit(EX_FAIL);
+ 		}
+ 	}
+diff -puN utils/gssd/gssd.c~CITI_NFS4_ALL utils/gssd/gssd.c
+--- nfs-utils-1.1.0/utils/gssd/gssd.c~CITI_NFS4_ALL	2007-06-22 10:51:53.782368000 -0400
++++ nfs-utils-1.1.0-kwc/utils/gssd/gssd.c	2007-06-22 10:51:56.521019000 -0400
+@@ -81,7 +81,7 @@ sig_hup(int signal)
+ static void
+ usage(char *progname)
+ {
+-	fprintf(stderr, "usage: %s [-f] [-n] [-v] [-r] [-p pipefsdir] [-k keytab] [-d ccachedir]\n",
++	fprintf(stderr, "usage: %s [-f] [-M] [-n] [-v] [-r] [-p pipefsdir] [-k keytab] [-d ccachedir]\n",
+ 		progname);
+ 	exit(1);
+ }
+diff -puN /dev/null support/include/pseudoflavors.h
+--- /dev/null	2007-06-21 19:03:53.875366737 -0400
++++ nfs-utils-1.1.0-kwc/support/include/pseudoflavors.h	2007-06-22 10:52:22.335293000 -0400
+@@ -0,0 +1,17 @@
++#define RPC_AUTH_GSS_KRB5       390003
++#define RPC_AUTH_GSS_KRB5I      390004
++#define RPC_AUTH_GSS_KRB5P      390005
++#define RPC_AUTH_GSS_LKEY       390006
++#define RPC_AUTH_GSS_LKEYI      390007
++#define RPC_AUTH_GSS_LKEYP      390008
++#define RPC_AUTH_GSS_SPKM       390009
++#define RPC_AUTH_GSS_SPKMI      390010
++#define RPC_AUTH_GSS_SPKMP      390011
++
++struct flav_info {
++	char    *flavour;
++	int     fnum;
++};
++
++extern struct flav_info flav_map[];
++extern const int flav_map_size;
+diff -puN support/nfs/exports.c~CITI_NFS4_ALL support/nfs/exports.c
+--- nfs-utils-1.1.0/support/nfs/exports.c~CITI_NFS4_ALL	2007-06-22 10:52:16.682999000 -0400
++++ nfs-utils-1.1.0-kwc/support/nfs/exports.c	2007-06-22 10:52:40.578175000 -0400
+@@ -30,10 +30,29 @@
+ #include "xmalloc.h"
+ #include "xlog.h"
+ #include "xio.h"
++#include "pseudoflavors.h"
+ 
+ #define EXPORT_DEFAULT_FLAGS	\
+   (NFSEXP_READONLY|NFSEXP_ROOTSQUASH|NFSEXP_GATHERED_WRITES|NFSEXP_NOSUBTREECHECK)
+ 
++struct flav_info flav_map[] = {
++	{ "krb5",	RPC_AUTH_GSS_KRB5	},
++	{ "krb5i",	RPC_AUTH_GSS_KRB5I	},
++	{ "krb5p",	RPC_AUTH_GSS_KRB5P	},
++	{ "lipkey",	RPC_AUTH_GSS_LKEY	},
++	{ "lipkey-i",	RPC_AUTH_GSS_LKEYI	},
++	{ "lipkey-p",	RPC_AUTH_GSS_LKEYP	},
++	{ "spkm3",	RPC_AUTH_GSS_SPKM	},
++	{ "spkm3i",	RPC_AUTH_GSS_SPKMI	},
++	{ "spkm3p",	RPC_AUTH_GSS_SPKMP	},
++	{ "unix",	AUTH_UNIX		},
++	{ "sys",	AUTH_SYS		},
++	{ "null",	AUTH_NULL		},
++	{ "none",	AUTH_NONE		},
++};
++
++const int flav_map_size = sizeof(flav_map)/sizeof(flav_map[0]);
++
+ int export_errno;
+ 
+ static char	*efname = NULL;
+@@ -100,6 +119,7 @@ getexportent(int fromkernel, int fromexp
  		def_ee.e_mountpoint = NULL;
  		def_ee.e_fslocmethod = FSLOC_NONE;
  		def_ee.e_fslocdata = NULL;
-+		def_ee.e_secinfo_order[0] = -1;
++		def_ee.e_secinfo[0].flav = NULL;
  		def_ee.e_nsquids = 0;
  		def_ee.e_nsqgids = 0;
  
-@@ -182,6 +187,19 @@ getexportent(int fromkernel, int fromexp
+@@ -179,6 +199,27 @@ getexportent(int fromkernel, int fromexp
+ 	return &ee;
  }
  
- void
-+secinfo_show(FILE *fp, struct exportent *ep)
++void secinfo_show(FILE *fp, struct exportent *ep)
 +{
-+	int *p1, *p2;
-+	for (p1=ep->e_secinfo_order; *p1>=0; p1=p2) {
-+		fprintf(fp, ",sec=%s", secflavor_name[*p1]);
-+		for (p2=p1+1; (*p2>=0) && (ep->e_secinfo_flags[*p1]==ep->e_secinfo_flags[*p2]); p2++) {
-+			fprintf(fp, ":%s", secflavor_name[*p2]);
++	struct sec_entry *p1, *p2;
++	int flags;
++
++	for (p1=ep->e_secinfo; p1->flav; p1=p2) {
++
++		fprintf(fp, ",sec=%s", p1->flav->flavour);
++		for (p2=p1+1; (p2->flav != NULL) && (p1->flags == p2->flags);
++								p2++) {
++			fprintf(fp, ":%s", p2->flav->flavour);
 +		}
-+		fprintf(fp, ",%s", (ep->e_secinfo_flags[*p1] & NFSEXP_READONLY)? "ro" : "rw");
++		flags = p1->flags;
++		fprintf(fp, ",%s", (flags & NFSEXP_READONLY) ? "ro" : "rw");
++		fprintf(fp, ",%sroot_squash", (flags & NFSEXP_ROOTSQUASH)?
++				"" : "no_");
++		fprintf(fp, ",%sall_squash", (flags & NFSEXP_ALLSQUASH)?
++				"" : "no_");
 +	}
 +}
 +
-+void
+ void
  putexportent(struct exportent *ep)
  {
- 	FILE	*fp;
-@@ -199,7 +217,6 @@ putexportent(struct exportent *ep)
- 			fprintf(fp, "%c", esc[i]);
- 
- 	fprintf(fp, "\t%s(", ep->e_hostname);
--	fprintf(fp, "%s,", (ep->e_flags & NFSEXP_READONLY)? "ro" : "rw");
- 	fprintf(fp, "%ssync,", (ep->e_flags & NFSEXP_ASYNC)? "a" : "");
- 	fprintf(fp, "%swdelay,", (ep->e_flags & NFSEXP_GATHERED_WRITES)?
- 				"" : "no_");
-@@ -276,7 +293,9 @@ #endif
+@@ -259,7 +300,9 @@ putexportent(struct exportent *ep)
  			else
  				fprintf(fp, "%d,", id[i]);
  	}
@@ -139,1298 +222,350 @@
  }
  
  void
-@@ -325,6 +344,7 @@ mkexportent(char *hname, char *path, cha
+@@ -307,6 +350,7 @@ mkexportent(char *hname, char *path, cha
  	ee.e_mountpoint = NULL;
  	ee.e_fslocmethod = FSLOC_NONE;
  	ee.e_fslocdata = NULL;
-+	ee.e_secinfo_order[0] = -1;
++	ee.e_secinfo[0].flav = NULL;
  	ee.e_nsquids = 0;
  	ee.e_nsqgids = 0;
  	ee.e_uuid = NULL;
-@@ -376,6 +396,9 @@ parseopts(char *cp, struct exportent *ep
- 	int	had_subtree_opt = 0;
- 	char 	*flname = efname?efname:"command line";
- 	int	flline = efp?efp->x_line:0;
-+	int	*p;
-+	unsigned int active = 0;
-+	int secmask = NFSEXP_READONLY;	/* options that can vary per flavor */
- 
- 	squids = ep->e_squids; nsquids = ep->e_nsquids;
- 	sqgids = ep->e_sqgids; nsqgids = ep->e_nsqgids;
-@@ -398,9 +421,9 @@ parseopts(char *cp, struct exportent *ep
- 
- 		/* process keyword */
- 		if (strcmp(opt, "ro") == 0)
--			ep->e_flags |= NFSEXP_READONLY;
-+			setflags(NFSEXP_READONLY, &active, ep);
- 		else if (strcmp(opt, "rw") == 0)
--			ep->e_flags &= ~NFSEXP_READONLY;
-+			clearflags(NFSEXP_READONLY, &active, ep);
- 		else if (!strcmp(opt, "secure"))
- 			ep->e_flags &= ~NFSEXP_INSECURE_PORT;
- 		else if (!strcmp(opt, "insecure"))
-@@ -522,6 +545,10 @@ #endif
- 		} else if (strncmp(opt, "replicas=", 9) == 0) {
- 			ep->e_fslocmethod = FSLOC_REPLICA;
- 			ep->e_fslocdata = strdup(opt+9);
-+		} else if (strncmp(opt, "sec=", 4) == 0) {
-+			active = parse_flavors(opt+4, ep);
-+			if (!active)
-+				goto bad_option;
- 		} else {
- 			xlog(L_ERROR, "%s:%d: unknown keyword \"%s\"\n",
- 					flname, flline, opt);
-@@ -533,6 +560,12 @@ #endif
- 			cp++;
- 	}
- 
-+	if (!active)
-+		active = secinfo_default(ep);
-+	for (p=ep->e_secinfo_order; *p>=0; p++)
-+		ep->e_secinfo_flags[*p] |= (ep->e_flags & ~secmask);
-+	/* If did not use sec= option, ensure e_flags is backward compatible */
-+	ep->e_flags = ep->e_secinfo_flags[ep->e_secinfo_order[0]];
- 	ep->e_squids = squids;
- 	ep->e_sqgids = sqgids;
- 	ep->e_nsquids = nsquids;
-@@ -663,3 +696,107 @@ syntaxerr(char *msg)
- 			efname, efp?efp->x_line:0, msg);
+@@ -350,18 +394,110 @@ static int valid_uuid(char *uuid)
  }
  
-+char *secflavor_name[SECFLAVOR_COUNT] = { "sys",
-+					  "krb5",
-+					  "krb5i",
-+					  "krb5p",
-+					  "spkm3",
-+					  "spkm3i",
-+					  "spkm3p"
-+};
-+
-+static void
-+secinfo_addflavor(int bit, struct exportent *ep)
+ /*
++ * Append the given flavor to the exportent's e_secinfo array, or
++ * do nothing if it's already there.  Returns the index of flavor
++ * in the resulting array in any case.
++ */
++static int secinfo_addflavor(struct flav_info *flav, struct exportent *ep)
 +{
-+	int *p;
-+	for (p=ep->e_secinfo_order; *p>=0; p++) {
-+		if (*p == bit)
-+			return;
++	struct sec_entry *p;
++
++	for (p=ep->e_secinfo; p->flav; p++) {
++		if (p->flav == flav)
++			return p - ep->e_secinfo;
 +	}
-+	*p++ = bit;
-+	*p = -1;
-+	ep->e_secinfo_flags[bit] = 0;
++	if (p - ep->e_secinfo >= SECFLAVOR_COUNT) {
++		xlog(L_ERROR, "more than %d security flavors on an export\n",
++			SECFLAVOR_COUNT);
++		return -1;
++	}
++	p->flav = flav;
++	p->flags = ep->e_flags;
++	(p+1)->flav = NULL;
++	return p - ep->e_secinfo;
 +}
 +
-+static int
-+secinfo_nameindex(char *name)
-+{
-+	int i;
-+	for (i=0; i<SECFLAVOR_COUNT; i++) {
-+		if (strcmp(secflavor_name[i], name) == 0)
-+			return i;
-+	}
-+	return -1;
++static struct flav_info *find_flavor(char *name)
++{
++	struct flav_info *flav;
++	for (flav = flav_map; flav < flav_map + flav_map_size; flav++)
++		if (strcmp(flav->flavour, name) == 0)
++			return flav;
++	return NULL;
 +}
 +
 +/* @str is a colon seperated list of security flavors.  Their order
 + * is recorded in @ep, and a bitmap corresponding to the list is returned.
 + * A zero return indicates an error.
 + */
-+static unsigned int
-+parse_flavors(char *str, struct exportent *ep)
++static unsigned int parse_flavors(char *str, struct exportent *ep)
 +{
 +	unsigned int out=0;
 +	char *flavor;
-+	int bit; 
++	int bit;
 +
 +	while ( (flavor=strsep(&str, ":")) ) {
-+		bit = secinfo_nameindex(flavor);
-+		if (bit == -1) {
++		struct flav_info *flav = find_flavor(flavor);
++		if (flav == NULL) {
 +			xlog(L_ERROR, "unknown flavor %s\n", flavor);
 +			return 0;
 +		}
++		bit = secinfo_addflavor(flav, ep);
++		if (bit < 0)
++			return 0;
 +		out |= 1<<bit;
-+		secinfo_addflavor(bit, ep);
 +	}
 +	return out;
 +}
 +
-+/* Determine a default security flavor based on ep->e_hostname. */
-+static int
-+secinfo_default(struct exportent *ep)
-+{
-+	int i=-1;
-+	if (strncmp(ep->e_hostname, "gss/", 4) == 0) {
-+		i = secinfo_nameindex(ep->e_hostname + 4);
-+		if (i < 0)
-+			xlog(L_WARNING, "unknown flavor %s\n", ep->e_hostname);
-+	}
-+	/* Default to auth_sys */
-+	if (i < 0)
-+		i = secinfo_nameindex("sys");
-+	secinfo_addflavor(i, ep);
-+	return 1<<i;
-+}
-+
 +/* Sets the bits in @mask for the appropriate security flavor flags. */
-+static void
-+setflags(int mask, unsigned int *ap, struct exportent *ep)
++static void setflags(int mask, unsigned int active, struct exportent *ep)
 +{
-+	int active, flavor=0;
-+	if (!*ap)
-+		*ap = secinfo_default(ep);
-+	active = *ap;
++	int bit=0;
++
++	ep->e_flags |= mask;
++
 +	while (active) {
 +		if (active & 1)
-+			ep->e_secinfo_flags[flavor] |= mask;
-+		flavor++;
++			ep->e_secinfo[bit].flags |= mask;
++		bit++;
 +		active >>= 1;
 +	}
 +}
 +
 +/* Clears the bits in @mask for the appropriate security flavor flags. */
-+static void
-+clearflags(int mask, unsigned int *ap, struct exportent *ep)
++static void clearflags(int mask, unsigned int active, struct exportent *ep)
 +{
-+	int active, flavor=0;
-+	if (!*ap)
-+		*ap = secinfo_default(ep);
-+	active = *ap;
++	int bit=0;
++
++	ep->e_flags &= ~mask;
++
 +	while (active) {
 +		if (active & 1)
-+			ep->e_secinfo_flags[flavor] &= ~mask;
-+		flavor++;
++			ep->e_secinfo[bit].flags &= ~mask;
++		bit++;
 +		active >>= 1;
 +	}
 +}
-diff --git a/utils/exportfs/exportfs.c b/utils/exportfs/exportfs.c
-index 22e13a3..30732b8 100644
---- a/utils/exportfs/exportfs.c
-+++ b/utils/exportfs/exportfs.c
-@@ -376,10 +376,12 @@ dump(int verbose)
- 				continue;
- 			}
- 			c = '(';
-+			/*
- 			if (ep->e_flags & NFSEXP_READONLY)
- 				c = dumpopt(c, "ro");
- 			else
- 				c = dumpopt(c, "rw");
-+			*/
- 			if (ep->e_flags & NFSEXP_ASYNC)
- 				c = dumpopt(c, "async");
- 			if (ep->e_flags & NFSEXP_GATHERED_WRITES)
-@@ -433,6 +435,7 @@ #ifdef DEBUG
- 				break;
- #endif
- 			}
-+			secinfo_show(stdout, ep);
- 			printf("%c\n", (c != '(')? ')' : ' ');
- 		}
- 	}
-diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c
-index 5f0d12a..78a8f75 100644
---- a/utils/mountd/cache.c
-+++ b/utils/mountd/cache.c
-@@ -445,6 +445,19 @@ static void write_fsloc(FILE *f, struct 
- 	release_replicas(servers);
- }
- 
-+static void write_secinfo(FILE *f, struct exportent *ep)
-+{
-+	int *p;
-+	qword_print(f, "secinfo");
-+	for (p=ep->e_secinfo_order; *p>=0; p++)
-+		; /* Do nothing */
-+	qword_printint(f, p - ep->e_secinfo_order);
-+	for (p=ep->e_secinfo_order; *p>=0; p++) {
-+		qword_print(f, secflavor_name[*p]);
-+		qword_printint(f, ep->e_secinfo_flags[*p]);
-+	}
-+}
 +
- static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *exp)
++/* options that can vary per flavor: */
++#define NFSEXP_SECINFO_FLAGS (NFSEXP_READONLY | NFSEXP_ROOTSQUASH \
++					| NFSEXP_ALLSQUASH)
++
++/*
+  * Parse option string pointed to by cp and set mount options accordingly.
+  */
+ static int
+ parseopts(char *cp, struct exportent *ep, int warn, int *had_subtree_opt_ptr)
  {
<<Diff was trimmed, longer than 597 lines>>

---- CVS-web:
    http://cvs.pld-linux.org/SOURCES/nfs-utils-CITI_NFS4.patch?r1=1.4&r2=1.5&f=u



More information about the pld-cvs-commit mailing list