summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDimitri Staessens <[email protected]>2016-03-15 15:48:28 +0100
committerDimitri Staessens <[email protected]>2016-03-15 15:48:28 +0100
commit7ca8145790db15d7da3c2f1b260ad3421993b67c (patch)
tree168c30a3090d14c654967d0942b4718cd4a979a9 /src
parent74dc5818ac8586fcc36915874592c9f4fbb4e6f6 (diff)
parentbd7a8ea8a1adbd6763aea857e72623929b7ad7a4 (diff)
downloadouroboros-7ca8145790db15d7da3c2f1b260ad3421993b67c.tar.gz
ouroboros-7ca8145790db15d7da3c2f1b260ad3421993b67c.zip
Merged in sandervrijders/ouroboros/be-ipcp (pull request #31)
irmd, lib: Create and destroy IPC Processes
Diffstat (limited to 'src')
-rw-r--r--src/ipcpd/main.c5
-rw-r--r--src/irmd/main.c27
-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
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 <[email protected]>
+ *
+ * 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;
+}