* Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
*/
-#include "config.h"
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
#include <string.h>
#include <sys/types.h>
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 dupilcated export entries:");
+ xlog(L_ERROR, "incompatible duplicated export entries:");
xlog(L_ERROR, "\t%s:%s (0x%x) [IGNORED]", eep->e_hostname,
eep->e_path, eep->e_flags);
xlog(L_ERROR, "\t%s:%s (0x%x)", exp->m_export.e_hostname,
exp->m_export.e_path, exp->m_export.e_flags);
}
else {
- xlog(L_ERROR, "dupilcated export entries:");
+ xlog(L_ERROR, "duplicated export entries:");
xlog(L_ERROR, "\t%s:%s", eep->e_hostname, eep->e_path);
xlog(L_ERROR, "\t%s:%s", exp->m_export.e_hostname,
exp->m_export.e_path);
* 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;
}
struct exportent *e = &exp->m_export;
dupexportent(e, nep);
+ if (nep->e_hostname)
+ e->e_hostname = xstrdup(nep->e_hostname);
exp->m_exported = 0;
exp->m_xtabent = 0;
exp->m_mayexport = 0;
exp->m_changed = 0;
+ exp->m_warned = 0;
exp->m_client = clp;
clp->m_count++;
}
new = (nfs_export *) xmalloc(sizeof(*new));
memcpy(new, exp, sizeof(*new));
dupexportent(&new->m_export, &exp->m_export);
+ if (exp->m_export.e_hostname)
+ new->m_export.e_hostname = xstrdup(exp->m_export.e_hostname);
clp = client_dup(exp->m_client, hp);
clp->m_count++;
new->m_client = clp;
new->m_exported = 0;
new->m_xtabent = 0;
new->m_changed = 0;
+ new->m_warned = 0;
export_add(new);
return new;
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;
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;
/* 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, '/');
}
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))
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->m_export.e_hostname);
xfree(exp);
}
exportlist[i] = NULL;