]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mountd/cache.c
mountd: move export lookup into separate function
[nfs-utils.git] / utils / mountd / cache.c
index 9bbbfb3c3a6cc3a4c616eefd64a3a0d300004f9b..e32290b72be60c5e368c67d4a71059bf3b201f5c 100644 (file)
@@ -564,7 +564,7 @@ static void write_fsloc(FILE *f, struct exportent *ep, char *path)
        release_replicas(servers);
 }
 
-static void write_secinfo(FILE *f, struct exportent *ep)
+static void write_secinfo(FILE *f, struct exportent *ep, int flag_mask)
 {
        struct sec_entry *p;
 
@@ -578,7 +578,7 @@ static void write_secinfo(FILE *f, struct exportent *ep)
        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);
+               qword_printint(f, p->flags & flag_mask);
        }
 
 }
@@ -590,16 +590,14 @@ static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *ex
        qword_printint(f, time(0)+30*60);
        if (exp) {
                int different_fs = strcmp(path, exp->e_path) != 0;
-               
-               if (different_fs)
-                       qword_printint(f, exp->e_flags & ~NFSEXP_FSID);
-               else
-                       qword_printint(f, exp->e_flags);
+               int flag_mask = different_fs ? ~NFSEXP_FSID : ~0;
+
+               qword_printint(f, exp->e_flags & flag_mask);
                qword_printint(f, exp->e_anonuid);
                qword_printint(f, exp->e_anongid);
                qword_printint(f, exp->e_fsid);
                write_fsloc(f, exp, path);
-               write_secinfo(f, exp);
+               write_secinfo(f, exp, flag_mask);
                if (exp->e_uuid == NULL || different_fs) {
                        char u[16];
                        if (get_uuid(path, NULL, 16, u)) {
@@ -616,42 +614,14 @@ static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *ex
        return qword_eol(f);
 }
 
-void nfsd_export(FILE *f)
+static nfs_export *lookup_export(char *dom, char *path, struct hostent *he)
 {
-       /* requests are:
-        *  domain path
-        * determine export options and return:
-        *  domain path expiry flags anonuid anongid fsid
-        */
-
-       char *cp;
-       int i;
-       char *dom, *path;
-       nfs_export *exp, *found = NULL;
+       nfs_export *exp;
+       nfs_export *found = NULL;
        int found_type = 0;
-       struct in_addr addr;
-       struct hostent *he = NULL;
-
-
-       if (readline(fileno(f), &lbuf, &lbuflen) != 1)
-               return;
-
-       xlog(D_CALL, "nfsd_export: inbuf '%s'", lbuf);
-
-       cp = lbuf;
-       dom = malloc(strlen(cp));
-       path = malloc(strlen(cp));
-
-       if (!dom || !path)
-               goto out;
-
-       if (qword_get(&cp, dom, strlen(lbuf)) <= 0)
-               goto out;
-       if (qword_get(&cp, path, strlen(lbuf)) <= 0)
-               goto out;
-
-       auth_reload();
+       int i;
 
+       found = lookup_export(dom, path, he);
        /* now find flags for this export point in this domain */
        for (i=0 ; i < MCL_MAXTYPES; i++) {
                for (exp = exportlist[i].p_head; exp; exp = exp->m_next) {
@@ -670,11 +640,6 @@ void nfsd_export(FILE *f)
                        } else if (strcmp(path, exp->m_export.e_path) != 0)
                                continue;
                        if (use_ipaddr) {
-                               if (he == NULL) {
-                                       if (!inet_aton(dom, &addr))
-                                               goto out;
-                                       he = client_resolve(addr);
-                               }
                                if (!client_check(exp->m_client, he))
                                        continue;
                        }
@@ -705,6 +670,50 @@ void nfsd_export(FILE *f)
                        }
                }
        }
+       return found;
+}
+
+void nfsd_export(FILE *f)
+{
+       /* requests are:
+        *  domain path
+        * determine export options and return:
+        *  domain path expiry flags anonuid anongid fsid
+        */
+
+       char *cp;
+       char *dom, *path;
+       nfs_export *found = NULL;
+       struct in_addr addr;
+       struct hostent *he = NULL;
+
+
+       if (readline(fileno(f), &lbuf, &lbuflen) != 1)
+               return;
+
+       xlog(D_CALL, "nfsd_export: inbuf '%s'", lbuf);
+
+       cp = lbuf;
+       dom = malloc(strlen(cp));
+       path = malloc(strlen(cp));
+
+       if (!dom || !path)
+               goto out;
+
+       if (qword_get(&cp, dom, strlen(lbuf)) <= 0)
+               goto out;
+       if (qword_get(&cp, path, strlen(lbuf)) <= 0)
+               goto out;
+
+       auth_reload();
+
+       if (use_ipaddr) {
+               if (!inet_aton(dom, &addr))
+                       goto out;
+               he = client_resolve(addr);
+       }
+
+       found = lookup_export(dom, path, he);
 
        if (found) {
                if (dump_to_cache(f, dom, path, &found->m_export) < 0) {