X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=support%2Fexport%2Fexport.c;h=3e4da699091110645362457b3d2f3e264949233e;hp=e5e6cb0504158447d006c8855c58e54a4e5c581e;hb=5d954d871fb265af584faef5df6e2e7e6ada7c3b;hpb=4cacc965afc4fb03a465ffcc6cb3078aeadc3818 diff --git a/support/export/export.c b/support/export/export.c index e5e6cb0..3e4da69 100644 --- a/support/export/export.c +++ b/support/export/export.c @@ -28,6 +28,34 @@ static int export_check(nfs_export *, struct hostent *, char *); 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) { + 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, "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); + } +} + int export_read(char *fname) { @@ -36,27 +64,13 @@ export_read(char *fname) setexportent(fname, "r"); while ((eep = getexportent(0,1)) != NULL) { - exp = export_lookup(eep->e_hostname, eep->e_path, 0); - if (!exp) - export_create(eep,0); - else { - if (exp->m_export.e_flags != eep->e_flags) { - 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, "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); - } - } + exp = export_lookup(eep->e_hostname, eep->e_path, 0); + if (!exp) + export_create(eep, 0); + else + warn_duplicated_exports(exp, eep); } endexportent(); - return 0; } @@ -115,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 (clp == NULL) { + export_free(new); + return NULL; + } clp->m_count++; new->m_client = clp; new->m_mayexport = exp->m_mayexport; @@ -126,6 +144,7 @@ export_dup(nfs_export *exp, struct hostent *hp) return new; } + /* * Add export entry to hash table */ @@ -257,6 +276,10 @@ export_check(nfs_export *exp, struct hostent *hp, char *path) return client_check(exp->m_client, hp); } +/** + * export_freeall - deallocate all nfs_export records + * + */ void export_freeall(void) { @@ -267,22 +290,13 @@ export_freeall(void) 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(); }