summaryrefslogtreecommitdiff
path: root/src/irmd/main.c
diff options
context:
space:
mode:
authorSander Vrijders <sander.vrijders@intec.ugent.be>2016-04-02 14:06:40 +0200
committerSander Vrijders <sander.vrijders@intec.ugent.be>2016-04-02 14:06:40 +0200
commit4459045d1beb1478943d96c314e72c5ede18154a (patch)
tree30874b889e086dce7009d1edba140a52cd4b108c /src/irmd/main.c
parent8e1e865a25ec4e88f64b149764c239e286e42c49 (diff)
downloadouroboros-4459045d1beb1478943d96c314e72c5ede18154a.tar.gz
ouroboros-4459045d1beb1478943d96c314e72c5ede18154a.zip
irmd: Rename name_to_pid to ipcp_data
Did a rename of the struct so that it can hold all data related to an IPCP in the system. The DIF name an IPCP belongs to is set on bootstrap and enrolment.
Diffstat (limited to 'src/irmd/main.c')
-rw-r--r--src/irmd/main.c106
1 files changed, 75 insertions, 31 deletions
diff --git a/src/irmd/main.c b/src/irmd/main.c
index 0256248b..a900b0ed 100644
--- a/src/irmd/main.c
+++ b/src/irmd/main.c
@@ -30,31 +30,33 @@
#include <ouroboros/da.h>
#include <ouroboros/list.h>
#include <ouroboros/instance_name.h>
+#include <ouroboros/utils.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <errno.h>
-struct name_to_pid_entry {
+struct ipcp_entry {
struct list_head next;
pid_t pid;
instance_name_t * api;
+ char * dif_name;
};
struct irm {
- struct list_head name_to_pid;
+ struct list_head ipcps;
};
struct irm * instance = NULL;
-static pid_t find_pid_by_name(instance_name_t * api)
+static pid_t find_pid_by_ipcp_name(instance_name_t * api)
{
- struct list_head * pos;
+ struct list_head * pos = NULL;
- list_for_each(pos, &instance->name_to_pid) {
- struct name_to_pid_entry * tmp =
- list_entry(pos, struct name_to_pid_entry, next);
+ list_for_each(pos, &instance->ipcps) {
+ struct ipcp_entry * tmp =
+ list_entry(pos, struct ipcp_entry, next);
LOG_DBG("name is %s", api->name);
@@ -65,11 +67,27 @@ static pid_t find_pid_by_name(instance_name_t * api)
return 0;
}
+static struct ipcp_entry * find_ipcp_by_name(instance_name_t * api)
+{
+ struct ipcp_entry * tmp = NULL;
+ struct list_head * pos = NULL;
+
+ list_for_each(pos, &instance->ipcps) {
+ struct ipcp_entry * tmp =
+ list_entry(pos, struct ipcp_entry, next);
+
+ if (instance_name_cmp(api, tmp->api) == 0)
+ return tmp;
+ }
+
+ return tmp;
+}
+
static int create_ipcp(instance_name_t * api,
char * ipcp_type)
{
pid_t pid;
- struct name_to_pid_entry * tmp;
+ struct ipcp_entry * tmp = NULL;
pid = ipcp_create(api, ipcp_type);
if (pid == -1) {
@@ -90,19 +108,21 @@ static int create_ipcp(instance_name_t * api,
return -1;
}
+ tmp->dif_name = NULL;
+
LOG_DBG("Created IPC process with pid %d", pid);
- list_add(&tmp->next, &instance->name_to_pid);
+ list_add(&tmp->next, &instance->ipcps);
return 0;
}
static int destroy_ipcp(instance_name_t * api)
{
pid_t pid = 0;
- struct list_head * pos;
- struct list_head * n;
+ struct list_head * pos = NULL;
+ struct list_head * n = NULL;
- pid = find_pid_by_name(api);
+ pid = find_pid_by_ipcp_name(api);
if (pid == 0) {
LOG_ERR("No such IPCP");
return -1;
@@ -113,9 +133,9 @@ static int destroy_ipcp(instance_name_t * api)
if (ipcp_destroy(pid))
LOG_ERR("Could not destroy IPCP");
- 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);
+ list_for_each_safe(pos, n, &(instance->ipcps)) {
+ struct ipcp_entry * tmp =
+ list_entry(pos, struct ipcp_entry, next);
if (instance_name_cmp(api, tmp->api) == 0)
list_del(&tmp->next);
@@ -127,16 +147,24 @@ static int destroy_ipcp(instance_name_t * api)
static int bootstrap_ipcp(instance_name_t * api,
struct dif_config * conf)
{
- pid_t pid = 0;
+ struct ipcp_entry * entry = NULL;
- pid = find_pid_by_name(api);
- if (pid == 0) {
+ entry = find_ipcp_by_name(api);
+ if (entry == NULL) {
LOG_ERR("No such IPCP");
return -1;
}
- if (ipcp_bootstrap(pid, conf)) {
+ entry->dif_name = strdup( conf->dif_name);
+ if (entry->dif_name == NULL) {
+ LOG_ERR("Failed to strdup");
+ return -1;
+ }
+
+ if (ipcp_bootstrap(entry->pid, conf)) {
LOG_ERR("Could not bootstrap IPCP");
+ free(entry->dif_name);
+ entry->dif_name = NULL;
return -1;
}
@@ -146,29 +174,45 @@ static int bootstrap_ipcp(instance_name_t * api,
static int enroll_ipcp(instance_name_t * api,
char * dif_name)
{
- pid_t pid = 0;
- char * member;
+ char * member = NULL;
char ** n_1_difs = NULL;
ssize_t n_1_difs_size = 0;
+ struct ipcp_entry * entry = NULL;
- pid = find_pid_by_name(api);
- if (pid == 0) {
+ entry = find_ipcp_by_name(api);
+ if (entry == NULL) {
LOG_ERR("No such IPCP");
return -1;
}
+ entry->dif_name = strdup(dif_name);
+ if (entry->dif_name == NULL) {
+ LOG_ERR("Failed to strdup");
+ return -1;
+ }
+
member = da_resolve_daf(dif_name);
if (member == NULL) {
LOG_ERR("Could not find a member of that DIF");
+ free(entry->dif_name);
+ entry->dif_name = NULL;
return -1;
}
n_1_difs_size = da_resolve_dap(member, n_1_difs);
- if (n_1_difs_size != 0)
- if (ipcp_enroll(pid, member, n_1_difs[0])) {
- LOG_ERR("Could not enroll IPCP");
- return -1;
- }
+ if (n_1_difs_size < 1) {
+ LOG_ERR("Could not find N-1 DIFs");
+ free(entry->dif_name);
+ entry->dif_name = NULL;
+ return -1;
+ }
+
+ if (ipcp_enroll(entry->pid, member, n_1_difs[0])) {
+ LOG_ERR("Could not enroll IPCP");
+ free(entry->dif_name);
+ entry->dif_name = NULL;
+ return -1;
+ }
return 0;
}
@@ -179,7 +223,7 @@ static int reg_ipcp(instance_name_t * api,
{
pid_t pid = 0;
- pid = find_pid_by_name(api);
+ pid = find_pid_by_ipcp_name(api);
if (pid == 0) {
LOG_ERR("No such IPCP");
return -1;
@@ -199,7 +243,7 @@ static int unreg_ipcp(instance_name_t * api,
{
pid_t pid = 0;
- pid = find_pid_by_name(api);
+ pid = find_pid_by_ipcp_name(api);
if (pid == 0) {
LOG_ERR("No such IPCP");
return -1;
@@ -295,7 +339,7 @@ int main()
if (instance == NULL)
return -1;
- INIT_LIST_HEAD(&instance->name_to_pid);
+ INIT_LIST_HEAD(&instance->ipcps);
sockfd = server_socket_open(IRM_SOCK_PATH);
if (sockfd < 0)