summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--support/export/export.c9
-rw-r--r--support/export/rmtab.c24
-rw-r--r--support/include/exportfs.h2
-rw-r--r--utils/exportfs/exportfs.c12
5 files changed, 37 insertions, 23 deletions
diff --git a/ChangeLog b/ChangeLog
index 0f490c1..3b93636 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2003-07-03 NeilBrown <neilb@cse.unsw.edu.au>
+ fumihiko kakuma <kakmy@mvh.biglobe.ne.jp>
+
+ * utils/exportfs/exportfs.c(unexportfs): improve host comparison
+ so as to only export the wildcard exports that were asked for.
+ * support/export/export.c(export_allowed): changed to return the
+ nfs_export rather than a "struct exportent", as m_changed is
+ needed by called
+ * support/export/rmtab.c(rmtab_read): modified to deal with
+ interface change for export_allowed(), and enhanced to preserve
+ m_changed flag when a wild-card export causes the creation of
+ a non-wildcard export.
+
2003-07-02 NeilBrown <neilb@cse.unsw.edu.au>
Steve Dickson <SteveD@redhat.com>
diff --git a/support/export/export.c b/support/export/export.c
index eef2c3b..eedbb75 100644
--- a/support/export/export.c
+++ b/support/export/export.c
@@ -172,10 +172,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 +187,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 &ee;
- }
+ if (exp)
+ return exp;
/* We have to treat the root, "/", specially. */
if (p == &epath[1]) break;
p = strrchr(epath, '/');
diff --git a/support/export/rmtab.c b/support/export/rmtab.c
index 3c55267..58e59f4 100644
--- a/support/export/rmtab.c
+++ b/support/export/rmtab.c
@@ -25,7 +25,6 @@ rmtab_read(void)
setrmtabent("r");
while ((rep = getrmtabent(1, NULL)) != NULL) {
- struct exportent *xp;
struct hostent *hp = NULL;
int htype;
@@ -33,22 +32,23 @@ rmtab_read(void)
if (htype == MCL_FQDN
&& (hp = gethostbyname (rep->r_client))
&& (hp = hostent_dup (hp),
- xp = export_allowed (hp, rep->r_path))) {
+ exp = export_allowed (hp, rep->r_path))) {
/* see if the entry already exists, otherwise this was an instantiated
* wild card, and we must add it
*/
- exp = export_lookup(rep->r_client, xp->e_path, 0);
- if (!exp) {
- strncpy (xp->e_hostname, rep->r_client,
- sizeof (xp->e_hostname) - 1);
- xp->e_hostname[sizeof (xp->e_hostname) -1] = '\0';
- exp = export_create(xp, 0);
+ nfs_export *exp2 = export_lookup(rep->r_client,
+ exp->m_export.e_path, 0);
+ if (!exp2) {
+ struct exportent ee;
+ dupexportent(&ee, &exp->m_export);
+ strncpy (ee.e_hostname, rep->r_client,
+ sizeof (ee.e_hostname) - 1);
+ ee.e_hostname[sizeof (ee.e_hostname) -1] = '\0';
+ exp2 = export_create(&ee, 0);
+ exp2->m_changed = exp->m_changed;
}
free (hp);
-
- if (!exp)
- continue;
- exp->m_mayexport = 1;
+ exp2->m_mayexport = 1;
} else if (hp) /* export_allowed failed */
free(hp);
}
diff --git a/support/include/exportfs.h b/support/include/exportfs.h
index dfd51f2..bf5bb67 100644
--- a/support/include/exportfs.h
+++ b/support/include/exportfs.h
@@ -62,7 +62,7 @@ void export_add(nfs_export *);
void export_reset(nfs_export *);
nfs_export * export_lookup(char *hname, char *path, int caconical);
nfs_export * export_find(struct hostent *, char *path);
-struct exportent * export_allowed(struct hostent *, char *path);
+nfs_export * export_allowed(struct hostent *, char *path);
nfs_export * export_create(struct exportent *, int canonical);
nfs_export * export_dup(nfs_export *, struct hostent *);
void export_freeall(void);
diff --git a/utils/exportfs/exportfs.c b/utils/exportfs/exportfs.c
index bd48e98..ab8a4a2 100644
--- a/utils/exportfs/exportfs.c
+++ b/utils/exportfs/exportfs.c
@@ -283,10 +283,14 @@ unexportfs(char *arg, int verbose)
for (exp = exportlist[htype]; exp; exp = exp->m_next) {
if (path && strcmp(path, exp->m_export.e_path))
continue;
- if (htype != exp->m_client->m_type
- || (htype == MCL_FQDN
- && !matchhostname(exp->m_export.e_hostname,
- hname)))
+ if (htype != exp->m_client->m_type)
+ continue;
+ if (htype == MCL_FQDN
+ && !matchhostname(exp->m_export.e_hostname,
+ hname))
+ continue;
+ if (htype != MCL_FQDN
+ && strcasecmp(exp->m_export.e_hostname, hname))
continue;
if (verbose) {
#if 0