summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSander Vrijders <[email protected]>2016-12-06 14:50:52 +0100
committerSander Vrijders <[email protected]>2016-12-06 14:51:37 +0100
commita4031fa3d1eb63c1ff83ba37e5e89d6b1a7d5d04 (patch)
tree841b7c48c047afc1ad2bc44999158e0bdf657a9e
parent82ae7959d21c654fe9fd14de504f47d18b1ebcfc (diff)
downloadouroboros-a4031fa3d1eb63c1ff83ba37e5e89d6b1a7d5d04.tar.gz
ouroboros-a4031fa3d1eb63c1ff83ba37e5e89d6b1a7d5d04.zip
ipcpd: normal: Fix errors on IPCP shutdown
This fixes several bad cleanups in the normal IPCP when it is shutting down.
-rw-r--r--src/ipcpd/normal/fmgr.c6
-rw-r--r--src/ipcpd/normal/main.c3
-rw-r--r--src/ipcpd/normal/pol/flat.c18
-rw-r--r--src/ipcpd/normal/ribmgr.c9
4 files changed, 19 insertions, 17 deletions
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)