X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=support%2Fexport%2Fexport.c;h=74e1d1b1bc46c68ace868e87775eed3580e46372;hp=ef12056dd226cee08e8e1c48e948eae1a2941869;hb=e3f2d2262fed12f0f6b77c5ac1c4072d82f1e754;hpb=acc4cade1891c0b07f3e0016ff3c5b604b042c86 diff --git a/support/export/export.c b/support/export/export.c index ef12056..74e1d1b 100644 --- a/support/export/export.c +++ b/support/export/export.c @@ -6,7 +6,9 @@ * Copyright (C) 1995, 1996 Olaf Kirch */ -#include "config.h" +#ifdef HAVE_CONFIG_H +#include +#endif #include #include @@ -32,10 +34,10 @@ export_read(char *fname) nfs_export *exp; setexportent(fname, "r"); - while ((eep = getexportent()) != NULL) { - exp = export_lookup(eep->e_hostname, eep->e_path); + while ((eep = getexportent(0,1)) != NULL) { + exp = export_lookup(eep->e_hostname, eep->e_path, 0); if (!exp) - export_create(eep); + export_create(eep,0); else { if (exp->m_export.e_flags != eep->e_flags) { xlog(L_ERROR, "incompatible duplicated export entries:"); @@ -61,12 +63,12 @@ export_read(char *fname) * Create an in-core export struct from an export entry. */ nfs_export * -export_create(struct exportent *xep) +export_create(struct exportent *xep, int canonical) { nfs_client *clp; nfs_export *exp; - if (!(clp = client_lookup(xep->e_hostname))) { + if (!(clp = client_lookup(xep->e_hostname, canonical))) { /* bad export entry; complaint already logged */ return NULL; } @@ -88,6 +90,7 @@ export_init(nfs_export *exp, nfs_client *clp, struct exportent *nep) exp->m_xtabent = 0; exp->m_mayexport = 0; exp->m_changed = 0; + exp->m_warned = 0; exp->m_client = clp; clp->m_count++; } @@ -113,6 +116,7 @@ export_dup(nfs_export *exp, struct hostent *hp) new->m_exported = 0; new->m_xtabent = 0; new->m_changed = 0; + new->m_warned = 0; export_add(new); return new; @@ -129,7 +133,7 @@ export_add(nfs_export *exp) xlog(L_FATAL, "unknown client type in export_add"); epp = exportlist + type; - while (*epp && slen < strlen((*epp)->m_export.e_path)) + while (*epp && slen <= strlen((*epp)->m_export.e_path)) epp = &((*epp)->m_next); exp->m_next = *epp; *epp = exp; @@ -172,10 +176,9 @@ export_allowed_internal (struct hostent *hp, char *path) return NULL; } -struct exportent * +nfs_export * export_allowed(struct hostent *hp, char *path) { - static struct exportent ee; nfs_export *exp; char epath[MAXPATHLEN+1]; char *p = NULL; @@ -188,10 +191,8 @@ export_allowed(struct hostent *hp, char *path) /* Try the longest matching exported pathname. */ while (1) { exp = export_allowed_internal (hp, epath); - if (exp) { - dupexportent(&ee, &exp->m_export); - return ⅇ - } + if (exp) + return exp; /* We have to treat the root, "/", specially. */ if (p == &epath[1]) break; p = strrchr(epath, '/'); @@ -203,12 +204,12 @@ export_allowed(struct hostent *hp, char *path) } nfs_export * -export_lookup(char *hname, char *path) +export_lookup(char *hname, char *path, int canonical) { nfs_client *clp; nfs_export *exp; - if (!(clp = client_lookup(hname))) + if (!(clp = client_lookup(hname, canonical))) return NULL; for (exp = exportlist[clp->m_type]; exp; exp = exp->m_next) if (exp->m_client == clp && !strcmp(exp->m_export.e_path, path)) @@ -239,6 +240,10 @@ export_freeall(void) xfree(exp->m_export.e_squids); if (exp->m_export.e_sqgids) xfree(exp->m_export.e_sqgids); + if (exp->m_export.e_mountpoint) + free(exp->m_export.e_mountpoint); + if (exp->m_export.e_fslocdata) + xfree(exp->m_export.e_fslocdata); xfree(exp); } exportlist[i] = NULL;