summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Staessens <dimitri@ouroboros.rocks>2023-07-31 14:22:00 +0200
committerSander Vrijders <sander@ouroboros.rocks>2023-08-04 08:25:08 +0200
commitd99ab9755b08db8b6c021f8358dbb0b460ebd383 (patch)
tree0628b841684e8dda670fb0a5f849ab3ede6a0e47
parent26fe256c14c5d7b98682c6497e733c4a2dde9921 (diff)
downloadouroboros-d99ab9755b08db8b6c021f8358dbb0b460ebd383.tar.gz
ouroboros-d99ab9755b08db8b6c021f8358dbb0b460ebd383.zip
irmd: Simplify ipcp and name listing
These functions were too complex. This splits off the creation of the info messages for each ipcp/name. Signed-off-by: Dimitri Staessens <dimitri@ouroboros.rocks> Signed-off-by: Sander Vrijders <sander@ouroboros.rocks>
-rw-r--r--src/irmd/main.c110
1 files changed, 69 insertions, 41 deletions
diff --git a/src/irmd/main.c b/src/irmd/main.c
index f35b0513..33f65cf4 100644
--- a/src/irmd/main.c
+++ b/src/irmd/main.c
@@ -939,6 +939,38 @@ static int unbind_process(pid_t pid,
return 0;
}
+static int get_ipcp_info(ipcp_info_msg_t ** msg,
+ struct reg_ipcp * ipcp)
+{
+ *msg = malloc(sizeof(**msg));
+ if (*msg == NULL)
+ goto fail;
+
+ ipcp_info_msg__init(*msg);
+
+ (*msg)->name = strdup(ipcp->name);
+ if ((*msg)->name == NULL)
+ goto fail_name;
+
+ (*msg)->layer = strdup(
+ ipcp->layer != NULL ? ipcp->layer : "Not enrolled");
+ if ((*msg)->layer == NULL)
+ goto fail_layer;
+
+ (*msg)->pid = ipcp->pid;
+ (*msg)->type = ipcp->type;
+
+ return 0;
+
+ fail_layer:
+ free((*msg)->name);
+ fail_name:
+ free(*msg);
+ *msg = NULL;
+ fail:
+ return -1;
+}
+
static ssize_t list_ipcps(ipcp_info_msg_t *** ipcps,
size_t * n_ipcps)
{
@@ -962,25 +994,10 @@ static ssize_t list_ipcps(ipcp_info_msg_t *** ipcps,
list_for_each(p, &irmd.ipcps) {
struct reg_ipcp * e = list_entry(p, struct reg_ipcp, next);
- (*ipcps)[i] = malloc(sizeof(***ipcps));
- if ((*ipcps)[i] == NULL) {
- --i;
- goto fail;
- }
-
- ipcp_info_msg__init((*ipcps)[i]);
- (*ipcps)[i]->name = strdup(e->name);
- if ((*ipcps)[i]->name == NULL)
+ if (get_ipcp_info(&((*ipcps)[i]), e) < 0)
goto fail;
-
- (*ipcps)[i]->layer = strdup(
- e->layer != NULL ? e->layer : "Not enrolled");
- if ((*ipcps)[i]->layer == NULL)
- goto fail;
-
- (*ipcps)[i]->pid = e->pid;
- (*ipcps)[i++]->type = e->type;
- }
+ ++i;
+ }
pthread_rwlock_unlock(&irmd.reg_lock);
@@ -988,11 +1005,9 @@ static ssize_t list_ipcps(ipcp_info_msg_t *** ipcps,
fail:
pthread_rwlock_unlock(&irmd.reg_lock);
- while (i >= 0) {
- free((*ipcps)[i]->layer);
- free((*ipcps)[i]->name);
- free(*ipcps[i--]);
- }
+ while (i > 0)
+ ipcp_info_msg__free_unpacked((*ipcps)[--i], NULL);
+
free(*ipcps);
*n_ipcps = 0;
return -ENOMEM;
@@ -1080,6 +1095,30 @@ static int name_destroy(const char * name)
return 0;
}
+static int get_name_info(name_info_msg_t ** msg,
+ struct reg_name * n)
+{
+ *msg = malloc(sizeof(**msg));
+ if (*msg == NULL)
+ goto fail;
+
+ name_info_msg__init(*msg);
+
+ (*msg)->name = strdup(n->name);
+ if ((*msg)->name == NULL)
+ goto fail_name;
+
+ (*msg)->pol_lb = n->pol_lb;
+
+ return 0;
+
+ fail_name:
+ free(*msg);
+ *msg = NULL;
+ fail:
+ return -1;
+}
+
static ssize_t list_names(name_info_msg_t *** names,
size_t * n_names)
{
@@ -1102,21 +1141,11 @@ static ssize_t list_names(name_info_msg_t *** names,
}
list_for_each(p, &irmd.names) {
- struct reg_name * e = list_entry(p, struct reg_name, next);
-
- (*names)[i] = malloc(sizeof(***names));
- if ((*names)[i] == NULL) {
- --i;
- goto fail;
- }
-
- name_info_msg__init((*names)[i]);
- (*names)[i]->name = strdup(e->name);
- if ((*names)[i]->name == NULL)
+ struct reg_name * n = list_entry(p, struct reg_name, next);
+ if (get_name_info(&((*names)[i]), n) < 0)
goto fail;
-
- (*names)[i++]->pol_lb = e->pol_lb;
- }
+ ++i;
+ }
pthread_rwlock_unlock(&irmd.reg_lock);
@@ -1124,10 +1153,9 @@ static ssize_t list_names(name_info_msg_t *** names,
fail:
pthread_rwlock_unlock(&irmd.reg_lock);
- while (i >= 0) {
- free((*names)[i]->name);
- free(*names[i--]);
- }
+ while (i > 0)
+ name_info_msg__free_unpacked((*names)[--i], NULL);
+
free(*names);
*n_names = 0;
return -ENOMEM;