summaryrefslogtreecommitdiff
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
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.
-rw-r--r--CMakeLists.txt9
-rw-r--r--include/ouroboros/CMakeLists.txt7
-rw-r--r--include/ouroboros/config.h.in31
-rw-r--r--include/ouroboros/ipcp.h16
-rw-r--r--include/ouroboros/utils.h27
-rwxr-xr-xinstall_debug.sh18
-rwxr-xr-xinstall_release.sh18
-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
13 files changed, 267 insertions, 41 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1041197c..243e5d6f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -19,6 +19,15 @@ set(PACKAGE_BUGREPORT "None"
set(PACKAGE_VERSION "${PACKAGE_VERSION_MAJOR}.${PACKAGE_VERSION_MINOR}"
CACHE STRING "Package version")
+SET(CMAKE_SKIP_BUILD_RPATH FALSE)
+SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
+SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
+
+LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir)
+IF("${isSystemDir}" STREQUAL "-1")
+ SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
+ENDIF("${isSystemDir}" STREQUAL "-1")
+
message(STATUS "Package name is: ${PACKAGE_NAME}")
message(STATUS "Package description is: ${PACKAGE_DESCRIPTION}")
message(STATUS "Package version is: ${PACKAGE_VERSION}")
diff --git a/include/ouroboros/CMakeLists.txt b/include/ouroboros/CMakeLists.txt
index e862de8c..167cf0e2 100644
--- a/include/ouroboros/CMakeLists.txt
+++ b/include/ouroboros/CMakeLists.txt
@@ -1,3 +1,7 @@
+configure_file(
+ "${CMAKE_CURRENT_SOURCE_DIR}/config.h.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/config.h")
+
set(HEADER_FILES
bitmap.h
cdap.h
@@ -11,7 +15,8 @@ set(HEADER_FILES
logs.h
rina_name.h
sockets.h
+ utils.h
)
-install(FILES ${HEADER_FILES}
+install(FILES ${HEADER_FILES} "${CMAKE_CURRENT_BINARY_DIR}/config.h"
DESTINATION include/ouroboros)
diff --git a/include/ouroboros/config.h.in b/include/ouroboros/config.h.in
new file mode 100644
index 00000000..0f5c2131
--- /dev/null
+++ b/include/ouroboros/config.h.in
@@ -0,0 +1,31 @@
+/*
+ * Ouroboros - Copyright (C) 2016
+ *
+ * Configuration information
+ *
+ * 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.
+ */
+
+#ifndef OUROBOROS_CONFIG
+#define OUROBOROS_CONFIG
+
+#define PROJECT_NAME "@CMAKE_PROJECT_NAME@"
+#define PROJECT_VERSION "@PACKAGE_VERSION@"
+#define INSTALL_DIR "@CMAKE_INSTALL_PREFIX@"
+#define BUILD_TYPE "@CMAKE_BUILD_TYPE@"
+
+#endif
diff --git a/include/ouroboros/ipcp.h b/include/ouroboros/ipcp.h
index 39e9c909..5e3e7f8c 100644
--- a/include/ouroboros/ipcp.h
+++ b/include/ouroboros/ipcp.h
@@ -23,26 +23,28 @@
#ifndef OUROBOROS_IPCP_H
#define OUROBOROS_IPCP_H
+#include <sys/types.h>
+
#include "common.h"
#include "rina_name.h"
struct ipcp;
/* Returns the process id */
-int ipcp_create(rina_name_t name,
- char * ipcp_type);
-int ipcp_destroy(int pid);
+pid_t ipcp_create(rina_name_t name,
+ char * ipcp_type);
+int ipcp_destroy(pid_t pid);
-int ipcp_reg(int pid,
+int ipcp_reg(pid_t pid,
char ** difs,
size_t difs_size);
-int ipcp_unreg(int pid,
+int ipcp_unreg(pid_t pid,
char ** difs,
size_t difs_size);
-int ipcp_bootstrap(int pid,
+int ipcp_bootstrap(pid_t pid,
struct dif_config conf);
-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/include/ouroboros/utils.h b/include/ouroboros/utils.h
new file mode 100644
index 00000000..0e50c039
--- /dev/null
+++ b/include/ouroboros/utils.h
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+/*
+ * Returns the number of characters a uint would
+ * need when represented as a string
+ */
+int n_digits(unsigned i);
diff --git a/install_debug.sh b/install_debug.sh
new file mode 100755
index 00000000..ef6b8a30
--- /dev/null
+++ b/install_debug.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+ME=install_debug
+
+if (($# == 1 ))
+then
+ PREFIX=`echo "$1"|sed -e "s,\/$,,"`
+else
+ PREFIX="/usr/local/ouroboros"
+fi
+
+BUILDDIR=build
+DEBUGDIR=debug
+
+bash compile_debug.sh $PREFIX
+
+cd $BUILDDIR/$DEBUGDIR
+make install
diff --git a/install_release.sh b/install_release.sh
new file mode 100755
index 00000000..afaee3d5
--- /dev/null
+++ b/install_release.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+ME=install_release
+
+if (($# == 1 ))
+then
+ PREFIX=`echo "$1"|sed -e "s,\/$,,"`
+else
+ PREFIX="/usr/local/ouroboros"
+fi
+
+BUILDDIR=build
+RELEASEDIR=release
+
+bash compile_debug.sh $PREFIX
+
+cd $BUILDDIR/$RELEASEDIR
+make install
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;
+}