X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmountd%2Fcache.c;h=e32290b72be60c5e368c67d4a71059bf3b201f5c;hp=fa154725b95b809dfe88c9a727fd98e4e1160e8b;hb=48cf3539933f5b0ba9c891b4e4010c0b6651d648;hpb=3a340251597a5b0c579c31d8caf9aa3b53a77016 diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c index fa15472..e32290b 100644 --- a/utils/mountd/cache.c +++ b/utils/mountd/cache.c @@ -394,7 +394,7 @@ void nfsd_fh(FILE *f) /* Now determine export point for this fsid/domain */ for (i=0 ; i < MCL_MAXTYPES; i++) { nfs_export *next_exp; - for (exp = exportlist[i]; exp; exp = next_exp) { + for (exp = exportlist[i].p_head; exp; exp = next_exp) { struct stat stb; char u[16]; char *path; @@ -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,45 +614,17 @@ 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]; exp; exp = exp->m_next) { + for (exp = exportlist[i].p_head; exp; exp = exp->m_next) { if (!use_ipaddr && !client_member(dom, exp->m_client->m_hostname)) continue; if (exp->m_export.e_flags & NFSEXP_CROSSMOUNT) { @@ -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) {