]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/export/export.c
libexport.a: Allow client_init() to fail instead of exit
[nfs-utils.git] / support / export / export.c
index 29434660a9a01008826dd8243a17ca44b84005ba..3e4da699091110645362457b3d2f3e264949233e 100644 (file)
@@ -28,6 +28,18 @@ static int   export_check(nfs_export *, struct hostent *, char *);
 static nfs_export *
                export_allowed_internal(struct hostent *hp, char *path);
 
 static nfs_export *
                export_allowed_internal(struct hostent *hp, char *path);
 
+static void
+export_free(nfs_export *exp)
+{
+       xfree(exp->m_export.e_squids);
+       xfree(exp->m_export.e_sqgids);
+       free(exp->m_export.e_mountpoint);
+       free(exp->m_export.e_fslocdata);
+
+       xfree(exp->m_export.e_hostname);
+       xfree(exp);
+}
+
 static void warn_duplicated_exports(nfs_export *exp, struct exportent *eep)
 {
        if (exp->m_export.e_flags != eep->e_flags) {
 static void warn_duplicated_exports(nfs_export *exp, struct exportent *eep)
 {
        if (exp->m_export.e_flags != eep->e_flags) {
@@ -117,6 +129,10 @@ export_dup(nfs_export *exp, struct hostent *hp)
        if (exp->m_export.e_hostname)
                new->m_export.e_hostname = xstrdup(exp->m_export.e_hostname);
        clp = client_dup(exp->m_client, hp);
        if (exp->m_export.e_hostname)
                new->m_export.e_hostname = xstrdup(exp->m_export.e_hostname);
        clp = client_dup(exp->m_client, hp);
+       if (clp == NULL) {
+               export_free(new);
+               return NULL;
+       }
        clp->m_count++;
        new->m_client = clp;
        new->m_mayexport = exp->m_mayexport;
        clp->m_count++;
        new->m_client = clp;
        new->m_mayexport = exp->m_mayexport;
@@ -128,6 +144,7 @@ export_dup(nfs_export *exp, struct hostent *hp)
 
        return new;
 }
 
        return new;
 }
+
 /*
  * Add export entry to hash table
  */
 /*
  * Add export entry to hash table
  */
@@ -259,6 +276,10 @@ export_check(nfs_export *exp, struct hostent *hp, char *path)
        return client_check(exp->m_client, hp);
 }
 
        return client_check(exp->m_client, hp);
 }
 
+/**
+ * export_freeall - deallocate all nfs_export records
+ *
+ */
 void
 export_freeall(void)
 {
 void
 export_freeall(void)
 {
@@ -269,22 +290,13 @@ export_freeall(void)
                for (exp = exportlist[i].p_head; exp; exp = nxt) {
                        nxt = exp->m_next;
                        client_release(exp->m_client);
                for (exp = exportlist[i].p_head; exp; exp = nxt) {
                        nxt = exp->m_next;
                        client_release(exp->m_client);
-                       if (exp->m_export.e_squids)
-                               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);
+                       export_free(exp);
+               }
+               for (j = 0; j < HASH_TABLE_SIZE; j++) {
+                       exportlist[i].entries[j].p_first = NULL;
+                       exportlist[i].entries[j].p_last = NULL;
                }
                }
-      for(j = 0; j < HASH_TABLE_SIZE; j++) {
-        exportlist[i].entries[j].p_first = NULL;
-        exportlist[i].entries[j].p_last = NULL;
-      }
-      exportlist[i].p_head = NULL;
+               exportlist[i].p_head = NULL;
        }
        client_freeall();
 }
        }
        client_freeall();
 }