From: neilbrown Date: Thu, 3 Jul 2003 01:28:13 +0000 (+0000) Subject: Fixes to make unexporting and exporting with wildcards X-Git-Tag: nfs-utils-1-1-0-pre8^0 X-Git-Url: https://git.decadent.org.uk/gitweb/?a=commitdiff_plain;h=f68785e72129ab643d6c793bd5a11bdf0010eff9;p=nfs-utils.git Fixes to make unexporting and exporting with wildcards work more sensibly. --- diff --git a/ChangeLog b/ChangeLog index 0f490c1..3b93636 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2003-07-03 NeilBrown + fumihiko kakuma + + * 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 Steve Dickson 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 ⅇ - } + 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