]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/nfs/exports.c
Conserve sockets: Reuse RPC transports.
[nfs-utils.git] / support / nfs / exports.c
index 21b85be99ec3abbed770e4b24917ebfaf0089731..71420c825520bd856753584bdee3d650bb08f7b3 100644 (file)
@@ -141,12 +141,18 @@ putexportent(struct exportent *ep)
        fprintf(fp, "%ssync,", (ep->e_flags & NFSEXP_ASYNC)? "a" : "");
        fprintf(fp, "%swdelay,", (ep->e_flags & NFSEXP_GATHERED_WRITES)?
                                "" : "no_");
+       fprintf(fp, "%shide,", (ep->e_flags & NFSEXP_CROSSMNT)?
+                               "no" : "");
        fprintf(fp, "%ssecure,", (ep->e_flags & NFSEXP_INSECURE_PORT)?
                                "in" : "");
        fprintf(fp, "%sroot_squash,", (ep->e_flags & NFSEXP_ROOTSQUASH)?
                                "" : "no_");
        fprintf(fp, "%sall_squash,", (ep->e_flags & NFSEXP_ALLSQUASH)?
                                "" : "no_");
+       fprintf(fp, "%ssubtree_check,", (ep->e_flags & NFSEXP_NOSUBTREECHECK)?
+               "no_" : "");
+       fprintf(fp, "%ssecure_locks,", (ep->e_flags & NFSEXP_NOAUTHNLM)?
+               "in" : "");
 
        fprintf(fp, "mapping=");
        switch (ep->e_maptype) {
@@ -249,12 +255,11 @@ updateexportent(struct exportent *eep, char *options)
 }
 
 /*
- * Parse option string pointed to by s and set mount options accordingly.
+ * Parse option string pointed to by cp and set mount options accordingly.
  */
 static int
 parseopts(char *cp, struct exportent *ep)
 {
-       char    *opt;
 
        squids = ep->e_squids; nsquids = ep->e_nsquids;
        sqgids = ep->e_sqgids; nsqgids = ep->e_nsqgids;
@@ -262,11 +267,14 @@ parseopts(char *cp, struct exportent *ep)
        while (isblank(*cp))
                cp++;
        while (*cp) {
-               opt = cp;
+               char *opt = strdup(cp);
+               char *optstart = cp;
                while (*cp && *cp != ',')
                        cp++;
-               if (*cp)
-                       *cp++ = '\0';
+               if (*cp) {
+                       opt[cp-optstart] = '\0';
+                       cp++;
+               }
 
                /* process keyword */
                if (strcmp(opt, "ro") == 0)
@@ -281,6 +289,10 @@ parseopts(char *cp, struct exportent *ep)
                        ep->e_flags &= ~NFSEXP_ASYNC;
                else if (!strcmp(opt, "async"))
                        ep->e_flags |= NFSEXP_ASYNC;
+               else if (!strcmp(opt, "nohide"))
+                       ep->e_flags |= NFSEXP_CROSSMNT;
+               else if (!strcmp(opt, "hide"))
+                       ep->e_flags &= ~NFSEXP_CROSSMNT;
                else if (!strcmp(opt, "wdelay"))
                        ep->e_flags |= NFSEXP_GATHERED_WRITES;
                else if (!strcmp(opt, "no_wdelay"))
@@ -293,6 +305,18 @@ parseopts(char *cp, struct exportent *ep)
                        ep->e_flags |= NFSEXP_ALLSQUASH;
                else if (strcmp(opt, "no_all_squash") == 0)
                        ep->e_flags &= ~NFSEXP_ALLSQUASH;
+               else if (strcmp(opt, "subtree_check") == 0)
+                       ep->e_flags &= ~NFSEXP_NOSUBTREECHECK;
+               else if (strcmp(opt, "no_subtree_check") == 0)
+                       ep->e_flags |= NFSEXP_NOSUBTREECHECK;
+               else if (strcmp(opt, "auth_nlm") == 0)
+                       ep->e_flags &= ~NFSEXP_NOAUTHNLM;
+               else if (strcmp(opt, "no_auth_nlm") == 0)
+                       ep->e_flags |= NFSEXP_NOAUTHNLM;
+               else if (strcmp(opt, "secure_locks") == 0)
+                       ep->e_flags &= ~NFSEXP_NOAUTHNLM;
+               else if (strcmp(opt, "insecure_locks") == 0)
+                       ep->e_flags |= NFSEXP_NOAUTHNLM;
                else if (strncmp(opt, "mapping=", 8) == 0)
                        ep->e_maptype = parsemaptype(opt+8);
                else if (strcmp(opt, "map_identity") == 0)      /* old style */
@@ -304,18 +328,24 @@ parseopts(char *cp, struct exportent *ep)
                else if (strncmp(opt, "anongid=", 8) == 0)
                        ep->e_anongid = atoi(opt+8);
                else if (strncmp(opt, "squash_uids=", 12) == 0) {
-                       if (parsesquash(opt+12, &squids, &nsquids, &cp) < 0)
+                       if (parsesquash(opt+12, &squids, &nsquids, &cp) < 0) {
+                               free(opt);
                                return -1;
+                       }
                } else if (strncmp(opt, "squash_gids=", 12) == 0) {
-                       if (parsesquash(opt+12, &sqgids, &nsqgids, &cp) < 0)
+                       if (parsesquash(opt+12, &sqgids, &nsqgids, &cp) < 0) {
+                               free(opt);
                                return -1;
+                       }
                } else {
                        xlog(L_ERROR,
                                "Unknown keyword \"%s\" in export file\n",
                                opt);
                        ep->e_flags |= NFSEXP_ALLSQUASH | NFSEXP_READONLY;
+                       free(opt);
                        return -1;
                }
+               free(opt);
                while (isblank(*cp))
                        cp++;
        }