]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mountd/cache.c
mountd: further split up lookup_export
[nfs-utils.git] / utils / mountd / cache.c
index e4e2f228f848a458a9d6e30a3c6e02ef8b43bec1..e3403901ebf543cb58059b0cf726408a407138a7 100644 (file)
@@ -614,68 +614,45 @@ static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *ex
        return qword_eol(f);
 }
 
-void nfsd_export(FILE *f)
+static int is_subdirectory(char *subpath, char *path)
 {
-       /* requests are:
-        *  domain path
-        * determine export options and return:
-        *  domain path expiry flags anonuid anongid fsid
-        */
+       int l = strlen(path);
 
-       char *cp;
-       int i;
-       char *dom, *path;
-       nfs_export *exp, *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);
+       return strcmp(subpath, path) == 0
+               || (strncmp(subpath, path, l) == 0 && path[l] == '/'
+                   && is_mountpoint(path));
+}
 
-       cp = lbuf;
-       dom = malloc(strlen(cp));
-       path = malloc(strlen(cp));
+static int path_matches(nfs_export *exp, char *path)
+{
+       if (exp->m_export.e_flags & NFSEXP_CROSSMOUNT)
+               return is_subdirectory(path, exp->m_export.e_path);
+       return strcmp(path, exp->m_export.e_path) == 0;
+}
 
-       if (!dom || !path)
-               goto out;
+static int client_matches(nfs_export *exp, char *dom, struct hostent *he)
+{
+       if (use_ipaddr)
+               return client_check(exp->m_client, he);
+       return client_member(dom, exp->m_client->m_hostname);
+}
 
-       if (qword_get(&cp, dom, strlen(lbuf)) <= 0)
-               goto out;
-       if (qword_get(&cp, path, strlen(lbuf)) <= 0)
-               goto out;
+static int export_matches(nfs_export *exp, char *dom, char *path, struct hostent *he)
+{
+       return path_matches(exp, path) && client_matches(exp, dom, he);
+}
 
-       auth_reload();
+static nfs_export *lookup_export(char *dom, char *path, struct hostent *he)
+{
+       nfs_export *exp;
+       nfs_export *found = NULL;
+       int found_type = 0;
+       int i;
 
-       /* 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) {
-                       if (!use_ipaddr && !client_member(dom, exp->m_client->m_hostname))
+                       if (!export_matches(exp, dom, path, he))
                                continue;
-                       if (exp->m_export.e_flags & NFSEXP_CROSSMOUNT) {
-                               /* if path is a mountpoint below e_path, then OK */
-                               int l = strlen(exp->m_export.e_path);
-                               if (strcmp(path, exp->m_export.e_path) == 0 ||
-                                   (strncmp(path, exp->m_export.e_path, l) == 0 &&
-                                    path[l] == '/' &&
-                                    is_mountpoint(path)))
-                                       /* ok */;
-                               else
-                                       continue;
-                       } 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;
-                       }
                        if (!found) {
                                found = exp;
                                found_type = i;
@@ -703,6 +680,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) {