]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/nfs/exports.c
Fix handling of explicit uuid
[nfs-utils.git] / support / nfs / exports.c
index c82bb0ef29433048bf4b5b3e1eccecc0be9d79b5..334c08e1642051210c10f35a1137b9ae5999e8fd 100644 (file)
@@ -176,13 +176,8 @@ getexportent(int fromkernel, int fromexports)
                if (!has_default_opts)
                        xlog(L_WARNING, "No options for %s %s: suggest %s(sync) to avoid warning", ee.e_path, exp, exp);
        }
-       if (strlen(hostname) >= sizeof(ee.e_hostname)) {
-               syntaxerr("client name too long");
-               export_errno = EINVAL;
-               return NULL;
-       }
-       strncpy(ee.e_hostname, hostname, sizeof (ee.e_hostname) - 1);
-       ee.e_hostname[sizeof (ee.e_hostname) - 1] = '\0';
+       xfree(ee.e_hostname);
+       ee.e_hostname = xstrdup(hostname);
 
        if (parseopts(opt, &ee, fromexports && !has_default_subtree_opts, NULL) < 0)
                return NULL;
@@ -335,6 +330,7 @@ dupexportent(struct exportent *dst, struct exportent *src)
                dst->e_mountpoint = strdup(src->e_mountpoint);
        if (src->e_fslocdata)
                dst->e_fslocdata = strdup(src->e_fslocdata);
+       dst->e_hostname = NULL;
 }
 
 struct exportent *
@@ -355,12 +351,9 @@ mkexportent(char *hname, char *path, char *options)
        ee.e_nsqgids = 0;
        ee.e_uuid = NULL;
 
-       if (strlen(hname) >= sizeof(ee.e_hostname)) {
-               xlog(L_WARNING, "client name %s too long", hname);
-               return NULL;
-       }
-       strncpy(ee.e_hostname, hname, sizeof (ee.e_hostname) - 1);
-       ee.e_hostname[sizeof (ee.e_hostname) - 1] = '\0';
+       xfree(ee.e_hostname);
+       ee.e_hostname = xstrdup(hname);
+
        if (strlen(path) >= sizeof(ee.e_path)) {
                xlog(L_WARNING, "path name %s too long", path);
                return NULL;
@@ -602,7 +595,7 @@ bad_option:
                                if (opt[5]!='\0' && *oe == '\0') 
                                        ep->e_flags |= NFSEXP_FSID;
                                else if (valid_uuid(opt+5))
-                                       ep->e_uuid = strdup(opt+7);
+                                       ep->e_uuid = strdup(opt+5);
                                else {
                                        xlog(L_ERROR, "%s: %d: bad fsid \"%s\"\n",
                                             flname, flline, opt);      
@@ -648,6 +641,12 @@ bad_option:
                while (isblank(*cp))
                        cp++;
        }
+       /*
+        * Turn on nohide which will allow this export to cross over
+        * the 'mount --bind' mount point.
+        */
+       if (ep->e_fslocdata)
+               ep->e_flags |= NFSEXP_NOHIDE;
 
        for (p = ep->e_secinfo; p->flav; p++)
                p->flags |= ep->e_flags & ~NFSEXP_SECINFO_FLAGS;