From 722b769e4d519f2428ee893a78cafa999151bb1c Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Thu, 17 Mar 2016 14:37:49 +0100 Subject: lib: Add communication with IPCP daemon This adds the messages required for the IRMd to communicate with an IPC Process through the library. --- src/lib/ipcp.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 104 insertions(+), 4 deletions(-) (limited to 'src/lib/ipcp.c') diff --git a/src/lib/ipcp.c b/src/lib/ipcp.c index 294d518c..7870e478 100644 --- a/src/lib/ipcp.c +++ b/src/lib/ipcp.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -38,6 +39,45 @@ #include #include +static int send_ipcp_msg(pid_t pid, + struct ipcp_msg * msg) +{ + int sockfd = 0; + buffer_t * buf = NULL; + char * sock_path; + + sock_path = ipcp_sock_path(pid); + if (sock_path == NULL) + return -1; + + sockfd = client_socket_open(sock_path); + if (sockfd < 0) { + free(sock_path); + return -1; + } + + buf = serialize_ipcp_msg(msg); + if (buf == NULL) { + free(sock_path); + close(sockfd); + return -1; + } + + if (write(sockfd, buf->data, buf->size) == -1) { + free(sock_path); + free(buf->data); + free(buf); + close(sockfd); + return -1; + } + + free(buf->data); + free(buf); + + close(sockfd); + return 0; +} + pid_t ipcp_create(rina_name_t name, char * ipcp_type) { @@ -48,6 +88,9 @@ pid_t ipcp_create(rina_name_t name, char * ipcp_dir = "bin/ipcpd"; char * full_name = NULL; + if (ipcp_type == NULL) + return -1; + pid = fork(); if (pid == -1) { LOG_ERR("Failed to fork"); @@ -121,20 +164,58 @@ int ipcp_reg(pid_t pid, char ** difs, size_t difs_size) { - return -1; + struct ipcp_msg msg; + + if (difs == NULL) + return -1; + + msg.code = IPCP_REG; + msg.difs = difs; + msg.difs_size = difs_size; + + if (send_ipcp_msg(pid, &msg)) { + LOG_ERR("Failed to send message to daemon"); + return -1; + } + + return 0; } int ipcp_unreg(pid_t pid, char ** difs, size_t difs_size) { - return -1; + struct ipcp_msg msg; + + if (difs == NULL) + return -1; + + msg.code = IPCP_UNREG; + msg.difs = difs; + msg.difs_size = difs_size; + + if (send_ipcp_msg(pid, &msg)) { + LOG_ERR("Failed to send message to daemon"); + return -1; + } + + return 0; } int ipcp_bootstrap(pid_t pid, struct dif_config conf) { - return -1; + struct ipcp_msg msg; + + msg.code = IPCP_BOOTSTRAP; + msg.conf = &conf; + + if (send_ipcp_msg(pid, &msg)) { + LOG_ERR("Failed to send message to daemon"); + return -1; + } + + return 0; } int ipcp_enroll(pid_t pid, @@ -143,5 +224,24 @@ int ipcp_enroll(pid_t pid, char ** n_1_difs, ssize_t n_1_difs_size) { - return -1; + struct ipcp_msg msg; + + if (n_1_difs == NULL) + return -1; + + if (dif_name == NULL) + return -1; + + msg.code = IPCP_ENROLL; + msg.dif_name = dif_name; + msg.member = &member; + msg.difs = n_1_difs; + msg.difs_size = n_1_difs_size; + + if (send_ipcp_msg(pid, &msg)) { + LOG_ERR("Failed to send message to daemon"); + return -1; + } + + return 0; } -- cgit v1.2.3 From 02681c391cbc1cc08f2dea5d8499f301d9321147 Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Thu, 17 Mar 2016 15:20:29 +0100 Subject: lib: Clean up memleaks Some allocations were not freed in case the creation of a new IPCP failed. --- src/lib/ipcp.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'src/lib/ipcp.c') diff --git a/src/lib/ipcp.c b/src/lib/ipcp.c index 7870e478..6bc3c75f 100644 --- a/src/lib/ipcp.c +++ b/src/lib/ipcp.c @@ -104,14 +104,15 @@ pid_t ipcp_create(rina_name_t name, api_id = malloc(n_digits(name.api_id) + 1); if (!api_id) { LOG_ERR("Failed to malloc"); - exit(-1); + exit(EXIT_FAILURE); } sprintf(api_id, "%d", name.api_id); aei_id = malloc(n_digits(name.aei_id) + 1); if (!aei_id) { LOG_ERR("Failed to malloc"); - exit(-1); + free(api_id); + exit(EXIT_FAILURE); } sprintf(aei_id, "%d", name.aei_id); @@ -121,7 +122,9 @@ pid_t ipcp_create(rina_name_t name, full_name = malloc(len); if (!full_name) { LOG_ERR("Failed to malloc"); - exit(-1); + free(api_id); + free(aei_id); + exit(EXIT_FAILURE); } strcpy(full_name, INSTALL_DIR); @@ -140,7 +143,10 @@ pid_t ipcp_create(rina_name_t name, LOG_DBG("%s", strerror(errno)); LOG_ERR("Failed to load IPCP daemon"); LOG_ERR("Make sure to run the installed version"); - exit(-1); + free(api_id); + free(aei_id); + free(full_name); + exit(EXIT_FAILURE); } int ipcp_destroy(pid_t pid) -- cgit v1.2.3