X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmountd%2Fcache.c;h=e4e2f228f848a458a9d6e30a3c6e02ef8b43bec1;hp=02454ac62655043b2c6d4d4da93211760465278e;hb=9ccfe0fa5a43dfc4453b09e328565a6c8f999fe4;hpb=ec637de16210c1c6fcb3a0df34d7889592f577dc diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c index 02454ac..e4e2f22 100644 --- a/utils/mountd/cache.c +++ b/utils/mountd/cache.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -111,7 +112,7 @@ void auth_unix_ip(FILE *f) else if (client) qword_print(f, *client?client:"DEFAULT"); qword_eol(f); - xlog(D_CALL, "auth_unix_ip: client %p '%s'", client, *client?client: "DEFAULT"); + xlog(D_CALL, "auth_unix_ip: client %p '%s'", client, client?client: "DEFAULT"); if (client) free(client); free(he); @@ -158,13 +159,50 @@ void auth_unix_gid(FILE *f) qword_printint(f, ngroups); for (i=0; im_export.e_uuid) get_uuid(NULL, exp->m_export.e_uuid, uuidlen, u); - else if (get_uuid(path, NULL, - uuidlen, u) == 0) + else if (get_uuid(path, NULL, uuidlen, u) == 0) continue; if (memcmp(u, fhuuid, uuidlen) != 0) continue; break; -#else - continue; -#endif } if (use_ipaddr) { if (he == NULL) { @@ -516,8 +532,10 @@ void nfsd_fh(FILE *f) qword_print(f, found_path); qword_eol(f); out: - free(found_path); - free(he); + if (found_path) + free(found_path); + if (he) + free(he); free(dom); xlog(D_CALL, "nfsd_fh: found %p path %s", found, found ? found->e_path : NULL); return; @@ -546,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; @@ -560,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); } } @@ -571,24 +589,27 @@ static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *ex qword_print(f, path); qword_printint(f, time(0)+30*60); if (exp) { - qword_printint(f, exp->e_flags); + int different_fs = strcmp(path, exp->e_path) != 0; + 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); -#if USE_BLKID - if (exp->e_uuid == NULL) { + write_secinfo(f, exp, flag_mask); + if (exp->e_uuid == NULL || different_fs) { char u[16]; if (get_uuid(path, NULL, 16, u)) { qword_print(f, "uuid"); qword_printhex(f, u, 16); } - } else if (exp->e_uuid) { + } else { + char u[16]; + get_uuid(NULL, exp->e_uuid, 16, u); qword_print(f, "uuid"); - qword_printhex(f, exp->e_uuid, 16); + qword_printhex(f, u, 16); } -#endif } return qword_eol(f); } @@ -631,7 +652,7 @@ void nfsd_export(FILE *f) /* 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) { @@ -662,9 +683,9 @@ void nfsd_export(FILE *f) } /* If one is a CROSSMOUNT, then prefer the longest path */ if (((found->m_export.e_flags & NFSEXP_CROSSMOUNT) || - (found->m_export.e_flags & NFSEXP_CROSSMOUNT)) && + (exp->m_export.e_flags & NFSEXP_CROSSMOUNT)) && strlen(found->m_export.e_path) != - strlen(found->m_export.e_path)) { + strlen(exp->m_export.e_path)) { if (strlen(exp->m_export.e_path) > strlen(found->m_export.e_path)) {