]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/nfs/exports.c
2000-03-21 Michael Weiser <michael@weiser.saale-net.de>
[nfs-utils.git] / support / nfs / exports.c
index 702df23097046e90a94e3fe29ef5a83f5fd0236d..3b34d4ee55e1f420a6923fada953aa15a30d51b3 100644 (file)
@@ -151,6 +151,8 @@ putexportent(struct exportent *ep)
                                "" : "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) {
@@ -253,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;
@@ -266,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)
@@ -305,6 +309,14 @@ parseopts(char *cp, struct exportent *ep)
                        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 */
@@ -316,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++;
        }
@@ -376,8 +394,8 @@ parsesquash(char *list, int **idp, int *lenp, char **ep)
                cp++;
        } while(1);
 
-       if (*cp == ',') *ep = cp+1;
-       
+       if (**ep == ',') (*ep)++;
+
        *lenp = len;
        *idp = id;
        return 1;