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 ⅇ
}
- 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