X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmountd%2Fcache.c;h=2468bc5916084e06323341ed6aeab006378beef9;hp=e32290b72be60c5e368c67d4a71059bf3b201f5c;hb=0fe42a6e2cd7252c5c12a5f4edb4c27789b0c043;hpb=48cf3539933f5b0ba9c891b4e4010c0b6651d648 diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c index e32290b..2468bc5 100644 --- a/utils/mountd/cache.c +++ b/utils/mountd/cache.c @@ -614,6 +614,33 @@ static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *ex return qword_eol(f); } +static int is_subdirectory(char *subpath, char *path) +{ + int l = strlen(path); + + return strcmp(subpath, path) == 0 + || (strncmp(subpath, path, l) == 0 && path[l] == '/'); +} + +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; +} + +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); +} + +static int export_matches(nfs_export *exp, char *dom, char *path, struct hostent *he) +{ + return path_matches(exp, path) && client_matches(exp, dom, he); +} + static nfs_export *lookup_export(char *dom, char *path, struct hostent *he) { nfs_export *exp; @@ -621,28 +648,10 @@ static nfs_export *lookup_export(char *dom, char *path, struct hostent *he) int found_type = 0; 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) { - 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 (!client_check(exp->m_client, he)) - continue; - } if (!found) { found = exp; found_type = i;