diff options
author | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2016-03-15 15:43:17 +0100 |
---|---|---|
committer | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2016-03-15 15:43:17 +0100 |
commit | bd7a8ea8a1adbd6763aea857e72623929b7ad7a4 (patch) | |
tree | 168c30a3090d14c654967d0942b4718cd4a979a9 /src | |
parent | 74dc5818ac8586fcc36915874592c9f4fbb4e6f6 (diff) | |
download | ouroboros-bd7a8ea8a1adbd6763aea857e72623929b7ad7a4.tar.gz ouroboros-bd7a8ea8a1adbd6763aea857e72623929b7ad7a4.zip |
irmd, lib: Create and destroy IPC Processes
This adds the functionality to create and destroy IPCPs. Upon creation
a new process is forked and execve'd. Upon destruction the IPCP is
destroyed by killing it with SIGTERM.
Diffstat (limited to 'src')
-rw-r--r-- | src/ipcpd/main.c | 5 | ||||
-rw-r--r-- | src/irmd/main.c | 27 | ||||
-rw-r--r-- | src/lib/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/lib/ipcp.c | 103 | ||||
-rw-r--r-- | src/lib/rina_name.c | 13 | ||||
-rw-r--r-- | src/lib/utils.c | 33 |
6 files changed, 149 insertions, 33 deletions
diff --git a/src/ipcpd/main.c b/src/ipcpd/main.c index b67b0af9..7ffd1c48 100644 --- a/src/ipcpd/main.c +++ b/src/ipcpd/main.c @@ -1,10 +1,15 @@ #define OUROBOROS_PREFIX "ipcp" #include <ouroboros/logs.h> +#include <stdbool.h> int main() { LOG_DBG("Test of the IPCP"); + while (true) { + + } + return 0; } diff --git a/src/irmd/main.c b/src/irmd/main.c index 9a072382..b695519a 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -38,7 +38,7 @@ struct name_to_pid_entry { struct list_head next; - int pid; + pid_t pid; rina_name_t * name; }; @@ -46,8 +46,8 @@ struct irm { struct list_head name_to_pid; }; -static int find_pid_by_name(struct irm * instance, - rina_name_t * name) +static pid_t find_pid_by_name(struct irm * instance, + rina_name_t * name) { struct list_head * pos; @@ -68,11 +68,11 @@ static void create_ipcp(struct irm * instance, rina_name_t name, char * ipcp_type) { - int pid; + pid_t pid; struct name_to_pid_entry * tmp; pid = ipcp_create(name, ipcp_type); - if (pid == 0) { + if (pid == -1) { LOG_ERR("Failed to create IPCP"); return; } @@ -90,14 +90,17 @@ static void create_ipcp(struct irm * instance, return; } + LOG_DBG("Created IPC process with pid %d", pid); + list_add(&tmp->next, &instance->name_to_pid); } static void destroy_ipcp(struct irm * instance, rina_name_t name) { - int pid = 0; + pid_t pid = 0; struct list_head * pos; + struct list_head * n; pid = find_pid_by_name(instance, &name); if (pid == 0) { @@ -105,10 +108,12 @@ static void destroy_ipcp(struct irm * instance, return; } + LOG_DBG("Destroying ipcp with pid %d", pid); + if (ipcp_destroy(pid)) LOG_ERR("Could not destroy IPCP"); - list_for_each(pos, &instance->name_to_pid) { + list_for_each_safe(pos, n, &(instance->name_to_pid)) { struct name_to_pid_entry * tmp = list_entry(pos, struct name_to_pid_entry, next); @@ -121,7 +126,7 @@ static void bootstrap_ipcp(struct irm * instance, rina_name_t name, struct dif_config conf) { - int pid = 0; + pid_t pid = 0; pid = find_pid_by_name(instance, &name); if (pid == 0) { @@ -137,7 +142,7 @@ static void enroll_ipcp(struct irm * instance, rina_name_t name, char * dif_name) { - int pid = 0; + pid_t pid = 0; rina_name_t * member; char ** n_1_difs = NULL; ssize_t n_1_difs_size = 0; @@ -166,7 +171,7 @@ static void reg_ipcp(struct irm * instance, char ** difs, size_t difs_size) { - int pid = 0; + pid_t pid = 0; pid = find_pid_by_name(instance, &name); if (pid == 0) { @@ -183,7 +188,7 @@ static void unreg_ipcp(struct irm * instance, char ** difs, size_t difs_size) { - int pid = 0; + pid_t pid = 0; pid = find_pid_by_name(instance, &name); if (pid == 0) { diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 589c8769..eaff2ddb 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -15,6 +15,7 @@ set(SOURCE_FILES list.c rina_name.c sockets.c + utils.c ) add_library(ouroboros SHARED ${SOURCE_FILES}) diff --git a/src/lib/ipcp.c b/src/lib/ipcp.c index 935330d5..294d518c 100644 --- a/src/lib/ipcp.c +++ b/src/lib/ipcp.c @@ -20,41 +20,124 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#define OUROBOROS_PREFIX "lib-ipcp" + +#ifndef _POSIX_C_SOURCE +#define _POSIX_C_SOURCE 199506L +#endif + #include <ouroboros/ipcp.h> +#include <ouroboros/common.h> +#include <ouroboros/logs.h> +#include <ouroboros/config.h> +#include <ouroboros/utils.h> + +#include <stdlib.h> +#include <string.h> +#include <signal.h> +#include <sys/types.h> +#include <sys/wait.h> -int ipcp_create(rina_name_t name, - char * ipcp_type) +pid_t ipcp_create(rina_name_t name, + char * ipcp_type) { - /* zero means failure */ - return 0; + pid_t pid = 0; + char * api_id = NULL; + char * aei_id = NULL; + size_t len = 0; + char * ipcp_dir = "bin/ipcpd"; + char * full_name = NULL; + + pid = fork(); + if (pid == -1) { + LOG_ERR("Failed to fork"); + return pid; + } + + if (pid != 0) { + return pid; + } + + api_id = malloc(n_digits(name.api_id) + 1); + if (!api_id) { + LOG_ERR("Failed to malloc"); + exit(-1); + } + 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); + } + sprintf(aei_id, "%d", name.aei_id); + + len += strlen(INSTALL_DIR); + len += strlen(ipcp_dir); + len += 2; + full_name = malloc(len); + if (!full_name) { + LOG_ERR("Failed to malloc"); + exit(-1); + } + + strcpy(full_name, INSTALL_DIR); + strcat(full_name, "/"); + strcat(full_name, ipcp_dir); + + char * argv[] = {full_name, + name.ap_name, api_id, + name.ae_name, aei_id, + ipcp_type, 0}; + + char * envp[] = {0}; + + execve(argv[0], &argv[0], envp); + + LOG_DBG("%s", strerror(errno)); + LOG_ERR("Failed to load IPCP daemon"); + LOG_ERR("Make sure to run the installed version"); + exit(-1); } -int ipcp_destroy(int pid) +int ipcp_destroy(pid_t pid) { - return -1; + int status; + + if (kill(pid, SIGTERM)) { + LOG_ERR("Failed to destroy IPCP"); + return -1; + } + + if (waitpid(pid, &status, 0) < 0) { + LOG_ERR("Failed to destroy IPCP"); + return -1; + } + + return 0; } -int ipcp_reg(int pid, +int ipcp_reg(pid_t pid, char ** difs, size_t difs_size) { return -1; } -int ipcp_unreg(int pid, +int ipcp_unreg(pid_t pid, char ** difs, size_t difs_size) { return -1; } -int ipcp_bootstrap(int pid, +int ipcp_bootstrap(pid_t pid, struct dif_config conf) { return -1; } -int ipcp_enroll(int pid, +int ipcp_enroll(pid_t pid, char * dif_name, rina_name_t member, char ** n_1_difs, diff --git a/src/lib/rina_name.c b/src/lib/rina_name.c index b9044277..471f6fda 100644 --- a/src/lib/rina_name.c +++ b/src/lib/rina_name.c @@ -24,6 +24,7 @@ #include <ouroboros/logs.h> #include <ouroboros/common.h> #include <ouroboros/rina_name.h> +#include <ouroboros/utils.h> #include <string.h> #include <math.h> @@ -220,18 +221,6 @@ bool name_is_equal(const rina_name_t * a, const rina_name_t * b) { return name_cmp(NAME_CMP_ALL, a, b); } -static int n_digits(unsigned i) -{ - int n = 1; - - while (i > 9) { - n++; - i /= 10; - } - - return n; -} - #define DELIMITER "/" char * name_to_string(const rina_name_t * n) diff --git a/src/lib/utils.c b/src/lib/utils.c new file mode 100644 index 00000000..ca082642 --- /dev/null +++ b/src/lib/utils.c @@ -0,0 +1,33 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Handy utilities + * + * Sander Vrijders <sander.vrijders@intec.ugent.be> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +int n_digits(unsigned i) +{ + int n = 1; + + while (i > 9) { + n++; + i /= 10; + } + + return n; +} |