]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/export/export.c
Make warning about host matching multiple exports more helpful.
[nfs-utils.git] / support / export / export.c
index 09efaa8214358e884076351145e0962e8297ac05..74e1d1b1bc46c68ace868e87775eed3580e46372 100644 (file)
@@ -6,7 +6,9 @@
  * 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>
@@ -32,20 +34,20 @@ 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 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);
@@ -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 &ee;
-               }
+               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;