]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mountd/cache.c
fix regression with rmtab handling in newer nfs-utils code
[nfs-utils.git] / utils / mountd / cache.c
index fb2a8e7281c5832264e545ed18fe4f908ad1e856..15100d499e91edb442130d0afc1123108ce88e5a 100644 (file)
 #include "mountd.h"
 #include "xmalloc.h"
 #include "fsloc.h"
+#include "pseudoflavors.h"
 
+#ifdef USE_BLKID
 #include "blkid/blkid.h"
+#endif
 
 
 enum nfsd_fsid {
@@ -152,6 +155,7 @@ void auth_unix_gid(FILE *f)
                free(groups);
 }
 
+#if USE_BLKID
 int get_uuid(char *path, char *uuid, int uuidlen, char *u)
 {
        /* extract hex digits from uuidstr and compose a uuid
@@ -216,6 +220,7 @@ int get_uuid(char *path, char *uuid, int uuidlen, char *u)
        }
        return 1;
 }
+#endif
 
 /* Iterate through /etc/mtab, finding mountpoints
  * at or below a given path
@@ -393,6 +398,9 @@ void nfsd_fh(FILE *f)
                                dev_missing ++;
                        if (stat(path, &stb) != 0)
                                continue;
+                       if (!S_ISDIR(stb.st_mode) && !S_ISREG(stb.st_mode)) {
+                               continue;
+                       }
                        switch(fsidtype){
                        case FSID_DEV:
                        case FSID_MAJOR_MINOR:
@@ -418,6 +426,7 @@ void nfsd_fh(FILE *f)
                                if (!is_mountpoint(path))
                                        continue;
                        check_uuid:
+#if USE_BLKID
                                if (exp->m_export.e_uuid)
                                        get_uuid(NULL, exp->m_export.e_uuid,
                                                 uuidlen, u);
@@ -428,6 +437,9 @@ void nfsd_fh(FILE *f)
                                if (memcmp(u, fhuuid, uuidlen) != 0)
                                        continue;
                                break;
+#else
+                               continue;
+#endif
                        }
                        /* It's a match !! */
                        if (!found) {
@@ -461,7 +473,8 @@ void nfsd_fh(FILE *f)
        }
 
        if (found)
-               cache_export_ent(dom, found, found_path);
+               if (cache_export_ent(dom, found, found_path) < 0)
+                       found = 0;
 
        qword_print(f, dom);
        qword_printint(f, fsidtype);
@@ -506,6 +519,25 @@ static void write_fsloc(FILE *f, struct exportent *ep, char *path)
        release_replicas(servers);
 }
 
+static void write_secinfo(FILE *f, struct exportent *ep)
+{
+       struct sec_entry *p;
+
+       for (p = ep->e_secinfo; p->flav; p++)
+               ; /* Do nothing */
+       if (p == ep->e_secinfo) {
+               /* There was no sec= option */
+               return;
+       }
+       qword_print(f, "secinfo");
+       qword_printint(f, p - ep->e_secinfo);
+       for (p = ep->e_secinfo; p->flav; p++) {
+               qword_printint(f, p->flav->fnum);
+               qword_printint(f, p->flags);
+       }
+
+}
+
 static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *exp)
 {
        qword_print(f, domain);
@@ -517,6 +549,8 @@ static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *ex
                qword_printint(f, exp->e_anongid);
                qword_printint(f, exp->e_fsid);
                write_fsloc(f, exp, path);
+               write_secinfo(f, exp);
+#if USE_BLKID
                if (exp->e_uuid == NULL) {
                        char u[16];
                        if (get_uuid(path, NULL, 16, u)) {
@@ -527,6 +561,7 @@ static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *ex
                        qword_print(f, "uuid");
                        qword_printhex(f, exp->e_uuid, 16);
                }
+#endif
        }
        return qword_eol(f);
 }
@@ -609,8 +644,12 @@ void nfsd_export(FILE *f)
        }
 
        if (found) {
-               dump_to_cache(f, dom, path, &found->m_export);
-               mountlist_add(dom, path);
+               if (dump_to_cache(f, dom, path, &found->m_export) < 0) {
+                       xlog(L_WARNING,
+                            "Cannot export %s, possibly unsupported filesystem"
+                            " or fsid= required", path);
+                       dump_to_cache(f, dom, path, NULL);
+               }
        } else {
                dump_to_cache(f, dom, path, NULL);
        }
@@ -684,9 +723,13 @@ int cache_export_ent(char *domain, struct exportent *exp, char *path)
                return -1;
 
        err = dump_to_cache(f, domain, exp->e_path, exp);
-       mountlist_add(domain, exp->e_path);
+       if (err) {
+               xlog(L_WARNING,
+                    "Cannot export %s, possibly unsupported filesystem or"
+                    " fsid= required", exp->e_path);
+       }
 
-       while ((exp->e_flags & NFSEXP_CROSSMOUNT) && path) {
+       while (err == 0 && (exp->e_flags & NFSEXP_CROSSMOUNT) && path) {
                /* really an 'if', but we can break out of
                 * a 'while' more easily */
                /* Look along 'path' for other filesystems
@@ -704,16 +747,17 @@ int cache_export_ent(char *domain, struct exportent *exp, char *path)
                dev = stb.st_dev;
                while(path[l] == '/') {
                        char c;
-                       int err;
+                       /* errors for submount should fail whole filesystem */
+                       int err2;
 
                        l++;
                        while (path[l] != '/' && path[l])
                                l++;
                        c = path[l];
                        path[l] = 0;
-                       err = lstat(path, &stb);
+                       err2 = lstat(path, &stb);
                        path[l] = c;
-                       if (err < 0)
+                       if (err2 < 0)
                                break;
                        if (stb.st_dev == dev)
                                continue;