work more sensibly.
+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>
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, '/');
setrmtabent("r");
while ((rep = getrmtabent(1, NULL)) != NULL) {
- struct exportent *xp;
struct hostent *hp = NULL;
int htype;
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);
}
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);
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