summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorSander Vrijders <sander.vrijders@intec.ugent.be>2016-03-15 15:43:17 +0100
committerSander Vrijders <sander.vrijders@intec.ugent.be>2016-03-15 15:43:17 +0100
commitbd7a8ea8a1adbd6763aea857e72623929b7ad7a4 (patch)
tree168c30a3090d14c654967d0942b4718cd4a979a9 /src/lib
parent74dc5818ac8586fcc36915874592c9f4fbb4e6f6 (diff)
downloadouroboros-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/lib')
-rw-r--r--src/lib/CMakeLists.txt1
-rw-r--r--src/lib/ipcp.c103
-rw-r--r--src/lib/rina_name.c13
-rw-r--r--src/lib/utils.c33
4 files changed, 128 insertions, 22 deletions
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;
+}