From a4031fa3d1eb63c1ff83ba37e5e89d6b1a7d5d04 Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Tue, 6 Dec 2016 14:50:52 +0100 Subject: ipcpd: normal: Fix errors on IPCP shutdown This fixes several bad cleanups in the normal IPCP when it is shutting down. --- src/ipcpd/normal/fmgr.c | 6 +++--- src/ipcpd/normal/main.c | 3 --- src/ipcpd/normal/pol/flat.c | 18 ++++++++++-------- src/ipcpd/normal/ribmgr.c | 9 ++++++--- 4 files changed, 19 insertions(+), 17 deletions(-) (limited to 'src/ipcpd/normal') diff --git a/src/ipcpd/normal/fmgr.c b/src/ipcpd/normal/fmgr.c index 82163aef..44b73627 100644 --- a/src/ipcpd/normal/fmgr.c +++ b/src/ipcpd/normal/fmgr.c @@ -143,7 +143,7 @@ static void * fmgr_nm1_acceptor(void * o) fd = flow_accept(&ae_name, &qs); if (fd < 0) { - LOG_ERR("Failed to accept flow."); + LOG_WARN("Flow accept failed."); continue; } @@ -390,8 +390,8 @@ int fmgr_fini() for (i = 0; i < IRMD_MAX_FLOWS; i++) { if (fmgr.nm1_flows[i] == NULL) continue; - if (ribmgr_remove_flow(fmgr.nm1_flows[i]->fd)) - LOG_ERR("Failed to remove management flow."); + flow_dealloc(fmgr.nm1_flows[i]->fd); + free(fmgr.nm1_flows[i]); } pthread_rwlock_destroy(&fmgr.nm1_flows_lock); diff --git a/src/ipcpd/normal/main.c b/src/ipcpd/normal/main.c index 64138838..34cbc6b9 100644 --- a/src/ipcpd/normal/main.c +++ b/src/ipcpd/normal/main.c @@ -248,9 +248,6 @@ int main(int argc, char * argv[]) if (frct_fini()) LOG_ERR("Failed to finalize FRCT."); - if (dir_fini()) - LOG_ERR("Failed to finalize directory."); - close_logfile(); ap_fini(); diff --git a/src/ipcpd/normal/pol/flat.c b/src/ipcpd/normal/pol/flat.c index 06958222..7d489dd5 100644 --- a/src/ipcpd/normal/pol/flat.c +++ b/src/ipcpd/normal/pol/flat.c @@ -163,15 +163,17 @@ int flat_init(void) return -1; } - if (ro_create(name, &rattr, NULL, 0)) { - LOG_ERR("Could not create RO."); - pathname_destroy(name); - pthread_cond_destroy(&flat.cond); - pthread_mutex_destroy(&flat.lock); - ro_unsubscribe(flat.sid); - return -1; + if (!ro_exists(name)) { + rattr.enrol_sync = true; + if (ro_create(name, &rattr, NULL, 0)) { + LOG_ERR("Could not create RO."); + pathname_destroy(name); + pthread_cond_destroy(&flat.cond); + pthread_mutex_destroy(&flat.lock); + ro_unsubscribe(flat.sid); + return -1; + } } - pathname_destroy(name); return 0; diff --git a/src/ipcpd/normal/ribmgr.c b/src/ipcpd/normal/ribmgr.c index 02cbbbfd..cbf68d0c 100644 --- a/src/ipcpd/normal/ribmgr.c +++ b/src/ipcpd/normal/ribmgr.c @@ -1644,6 +1644,7 @@ int ro_subscribe(const char * name, struct ro_sub_ops * ops) { struct ro_sub * sub; + int sid; assert(name); assert(ops); @@ -1664,19 +1665,21 @@ int ro_subscribe(const char * name, pthread_mutex_lock(&rib.subs_lock); - sub->sid = bmp_allocate(rib.sids); - if (sub->sid < 0) { + sid = bmp_allocate(rib.sids); + if (sid < 0) { pthread_mutex_unlock(&rib.subs_lock); free(sub->name); free(sub); LOG_ERR("Failed to get sub id."); + return -1; } + sub->sid = sid; list_add(&sub->next, &rib.subs); pthread_mutex_unlock(&rib.subs_lock); - return 0; + return sid; } int ro_unsubscribe(int sid) -- cgit v1.2.3