summaryrefslogtreecommitdiff
path: root/src/lib/irm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/irm.c')
-rw-r--r--src/lib/irm.c322
1 files changed, 219 insertions, 103 deletions
diff --git a/src/lib/irm.c b/src/lib/irm.c
index 6a9f837e..d25101f3 100644
--- a/src/lib/irm.c
+++ b/src/lib/irm.c
@@ -1,10 +1,10 @@
/*
- * Ouroboros - Copyright (C) 2016 - 2018
+ * Ouroboros - Copyright (C) 2016 - 2024
*
* The API to instruct the IRM
*
- * Dimitri Staessens <dimitri.staessens@ugent.be>
- * Sander Vrijders <sander.vrijders@ugent.be>
+ * Dimitri Staessens <dimitri@ouroboros.rocks>
+ * Sander Vrijders <sander@ouroboros.rocks>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
@@ -20,35 +20,48 @@
* Foundation, Inc., http://www.fsf.org/about/contact/.
*/
+#if defined(__linux__) || defined(__CYGWIN__)
+#define _DEFAULT_SOURCE
+#else
#define _POSIX_C_SOURCE 200809L
+#endif
#include <ouroboros/errno.h>
#include <ouroboros/hash.h>
#include <ouroboros/irm.h>
#include <ouroboros/utils.h>
#include <ouroboros/sockets.h>
+#include <ouroboros/protobuf.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
-pid_t irm_create_ipcp(const char * name,
- enum ipcp_type type)
+int irm_create_ipcp(const char * name,
+ enum ipcp_type type)
{
- irm_msg_t msg = IRM_MSG__INIT;
- irm_msg_t * recv_msg = NULL;
- int ret = -1;
+ irm_msg_t msg = IRM_MSG__INIT;
+ irm_msg_t * recv_msg;
+ int ret;
+ struct ipcp_info info;
- if (name == NULL)
+ if (name == NULL || strlen(name) > IPCP_NAME_SIZE)
return -EINVAL;
- msg.code = IRM_MSG_CODE__IRM_CREATE_IPCP;
- msg.name = (char *) name;
- msg.has_ipcp_type = true;
- msg.ipcp_type = type;
+ memset(&info, 0, sizeof(info));
+
+ info.type = type;
+ strcpy(info.name, name);
+
+ msg.code = IRM_MSG_CODE__IRM_CREATE_IPCP;
+ msg.ipcp_info = ipcp_info_s_to_msg(&info);
+ if (msg.ipcp_info == NULL)
+ return -ENOMEM;
recv_msg = send_recv_irm_msg(&msg);
+ ipcp_info_msg__free_unpacked(msg.ipcp_info, NULL);
+
if (recv_msg == NULL)
return -EIRMD;
@@ -94,11 +107,9 @@ int irm_destroy_ipcp(pid_t pid)
int irm_bootstrap_ipcp(pid_t pid,
const struct ipcp_config * conf)
{
- irm_msg_t msg = IRM_MSG__INIT;
- ipcp_config_msg_t config = IPCP_CONFIG_MSG__INIT;
- layer_info_msg_t layer_info = LAYER_INFO_MSG__INIT;
- irm_msg_t * recv_msg = NULL;
- int ret = -1;
+ irm_msg_t msg = IRM_MSG__INIT;
+ irm_msg_t * recv_msg;
+ int ret;
if (pid == -1 || conf == NULL)
return -EINVAL;
@@ -106,51 +117,10 @@ int irm_bootstrap_ipcp(pid_t pid,
msg.code = IRM_MSG_CODE__IRM_BOOTSTRAP_IPCP;
msg.has_pid = true;
msg.pid = pid;
-
- config.layer_info = &layer_info;
- msg.conf = &config;
- layer_info.layer_name = (char *) conf->layer_info.layer_name;
-
- config.ipcp_type = conf->type;
-
- switch (conf->type) {
- case IPCP_NORMAL:
- config.has_addr_size = true;
- config.addr_size = conf->addr_size;
- config.has_eid_size = true;
- config.eid_size = conf->eid_size;
- config.has_max_ttl = true;
- config.max_ttl = conf->max_ttl;
- config.has_addr_auth_type = true;
- config.addr_auth_type = conf->addr_auth_type;
- config.has_routing_type = true;
- config.routing_type = conf->routing_type;
- config.has_pff_type = true;
- config.pff_type = conf->pff_type;
- layer_info.dir_hash_algo = conf->layer_info.dir_hash_algo;
- break;
- case IPCP_UDP:
- config.has_ip_addr = true;
- config.ip_addr = conf->ip_addr;
- config.has_dns_addr = true;
- config.dns_addr = conf->dns_addr;
- break;
- case IPCP_LOCAL:
- case IPCP_RAPTOR:
- break;
- case IPCP_ETH_LLC:
- config.dev = conf->dev;
- break;
- case IPCP_ETH_DIX:
- config.dev = conf->dev;
- config.has_ethertype = true;
- config.ethertype = conf->ethertype;
- break;
- default:
- return -EIPCPTYPE;
- }
+ msg.conf = ipcp_config_s_to_msg(conf);
recv_msg = send_recv_irm_msg(&msg);
+ ipcp_config_msg__free_unpacked(msg.conf, NULL);
if (recv_msg == NULL)
return -EIRMD;
@@ -167,19 +137,24 @@ int irm_bootstrap_ipcp(pid_t pid,
int irm_connect_ipcp(pid_t pid,
const char * dst,
- const char * component)
+ const char * component,
+ qosspec_t qs)
{
- irm_msg_t msg = IRM_MSG__INIT;
- irm_msg_t * recv_msg = NULL;
- int ret;
+ irm_msg_t msg = IRM_MSG__INIT;
+ irm_msg_t * recv_msg;
+ int ret;
+
msg.code = IRM_MSG_CODE__IRM_CONNECT_IPCP;
msg.dst = (char *) dst;
msg.comp = (char *) component;
msg.has_pid = true;
msg.pid = pid;
+ msg.qosspec = qos_spec_s_to_msg(&qs);
recv_msg = send_recv_irm_msg(&msg);
+ qosspec_msg__free_unpacked(msg.qosspec, NULL);
+
if (recv_msg == NULL)
return -EIRMD;
@@ -198,8 +173,8 @@ int irm_disconnect_ipcp(pid_t pid,
const char * dst,
const char * component)
{
- irm_msg_t msg = IRM_MSG__INIT;
- irm_msg_t * recv_msg = NULL;
+ irm_msg_t msg = IRM_MSG__INIT;
+ irm_msg_t * recv_msg;
int ret;
msg.code = IRM_MSG_CODE__IRM_DISCONNECT_IPCP;
@@ -223,12 +198,12 @@ int irm_disconnect_ipcp(pid_t pid,
return ret;
}
-ssize_t irm_list_ipcps(struct ipcp_info ** ipcps)
+ssize_t irm_list_ipcps(struct ipcp_list_info ** ipcps)
{
- irm_msg_t msg = IRM_MSG__INIT;
+ irm_msg_t msg = IRM_MSG__INIT;
irm_msg_t * recv_msg;
- size_t nr;
- size_t i;
+ size_t nr;
+ size_t i;
if (ipcps == NULL)
return -EINVAL;
@@ -315,10 +290,10 @@ static int check_prog(const char * prog)
static int check_prog_path(char ** prog)
{
- char * path = getenv("PATH");
- char * path_end = path + strlen(path) + 1;
+ char * path;
+ char * path_end;
char * pstart;
- char * pstop = path;
+ char * pstop;
char * tmp;
char * tstop;
char * tstart;
@@ -327,9 +302,15 @@ static int check_prog_path(char ** prog)
assert(prog);
- if (*prog == NULL || path == NULL)
+ if (*prog == NULL)
return -EINVAL;
+ path = getenv("PATH");
+ if (path == NULL)
+ return -ENOENT;
+
+ pstop = path;
+ path_end = path + strlen(path) + 1;
if (!strlen(path) || strchr(*prog, '/') != NULL) {
if ((ret = check_prog(*prog)) < 0)
return ret;
@@ -387,50 +368,69 @@ int irm_bind_program(const char * prog,
int argc,
char ** argv)
{
- irm_msg_t msg = IRM_MSG__INIT;
- irm_msg_t * recv_msg = NULL;
- int ret = -1;
- char * full_name;
+ irm_msg_t msg = IRM_MSG__INIT;
+ irm_msg_t * recv_msg;
+ char ** exec;
+ int ret;
+ int i;
if (prog == NULL || name == NULL)
return -EINVAL;
- full_name = strdup(prog);
- if (full_name == NULL)
- return -ENOMEM;
+ exec = malloc((argc + 2) * sizeof(*exec));
+ if (exec== NULL) {
+ ret = -ENOMEM;
+ goto fail_exec;
+ }
- if ((ret = check_prog_path(&full_name)) < 0) {
- free(full_name);
- return ret;
+ exec[0] = strdup(prog);
+ if (exec[0] == NULL) {
+ ret = -ENOMEM;
+ goto fail_exec0;
}
+ ret = check_prog_path(&exec[0]);
+ if (ret < 0)
+ goto fail;
+
+ for (i = 0; i < argc; i++)
+ exec[i + 1] = argv[i];
+
+ exec[argc + 1] = "";
+
msg.code = IRM_MSG_CODE__IRM_BIND_PROGRAM;
msg.name = (char *) name;
- msg.prog = full_name;
- if (argv != NULL) {
- msg.n_args = argc;
- msg.args = (char **) argv;
- }
+ msg.n_exec = argc + 2;
+ msg.exec = exec;
msg.has_opts = true;
msg.opts = opts;
recv_msg = send_recv_irm_msg(&msg);
-
- free(full_name);
-
- if (recv_msg == NULL)
- return -EIRMD;
+ if (recv_msg == NULL) {
+ ret = -EIRMD;
+ goto fail;
+ }
if (!recv_msg->has_result) {
irm_msg__free_unpacked(recv_msg, NULL);
- return -1;
+ ret = -EPERM;
+ goto fail;
}
ret = recv_msg->result;
irm_msg__free_unpacked(recv_msg, NULL);
+ free(exec[0]);
+ free(exec);
+
+ return ret;
+ fail:
+ free(exec[0]);
+ fail_exec0:
+ free(exec);
+ fail_exec:
return ret;
}
@@ -523,8 +523,48 @@ int irm_unbind_process(pid_t pid,
return ret;
}
-int irm_reg(pid_t pid,
- const char * name)
+int irm_create_name(const char * name,
+ enum pol_balance pol)
+{
+ irm_msg_t msg = IRM_MSG__INIT;
+ name_info_msg_t ni_msg = NAME_INFO_MSG__INIT;
+ irm_msg_t * recv_msg;
+ int ret;
+
+ if (name == NULL)
+ return -EINVAL;
+
+ msg.code = IRM_MSG_CODE__IRM_CREATE_NAME;
+ ni_msg.name = (char *) name;
+ ni_msg.pol_lb = pol;
+ msg.n_names = 1;
+
+ msg.names = malloc(sizeof(*msg.names));
+ if (msg.names == NULL) {
+ return -ENOMEM;
+ }
+
+ msg.names[0] = &ni_msg;
+
+ recv_msg = send_recv_irm_msg(&msg);
+
+ free(msg.names);
+
+ if (recv_msg == NULL)
+ return -EIRMD;
+
+ if (!recv_msg->has_result) {
+ irm_msg__free_unpacked(recv_msg, NULL);
+ return -1;
+ }
+
+ ret = recv_msg->result;
+ irm_msg__free_unpacked(recv_msg, NULL);
+
+ return ret;
+}
+
+int irm_destroy_name(const char * name)
{
irm_msg_t msg = IRM_MSG__INIT;
irm_msg_t * recv_msg = NULL;
@@ -533,7 +573,84 @@ int irm_reg(pid_t pid,
if (name == NULL)
return -EINVAL;
- msg.code = IRM_MSG_CODE__IRM_REG;
+ msg.code = IRM_MSG_CODE__IRM_DESTROY_NAME;
+ msg.name = (char *) name;
+
+ recv_msg = send_recv_irm_msg(&msg);
+ if (recv_msg == NULL)
+ return -EIRMD;
+
+ if (!recv_msg->has_result) {
+ irm_msg__free_unpacked(recv_msg, NULL);
+ return -1;
+ }
+
+ ret = recv_msg->result;
+ irm_msg__free_unpacked(recv_msg, NULL);
+
+ return ret;
+}
+
+ssize_t irm_list_names(struct name_info ** names)
+{
+ irm_msg_t msg = IRM_MSG__INIT;
+ irm_msg_t * recv_msg;
+ size_t nr;
+ size_t i;
+
+ if (names == NULL)
+ return -EINVAL;
+
+ *names = NULL;
+
+ msg.code = IRM_MSG_CODE__IRM_LIST_NAMES;
+
+ recv_msg = send_recv_irm_msg(&msg);
+ if (recv_msg == NULL)
+ return -EIRMD;
+
+ if (recv_msg->names == NULL) {
+ irm_msg__free_unpacked(recv_msg, NULL);
+ return 0;
+ }
+
+ nr = recv_msg->n_names;
+ if (nr == 0) {
+ irm_msg__free_unpacked(recv_msg, NULL);
+ return 0;
+ }
+
+ *names = malloc(nr * sizeof(**names));
+ if (*names == NULL) {
+ irm_msg__free_unpacked(recv_msg, NULL);
+ return -ENOMEM;
+ }
+
+ for (i = 0; i < nr; i++) {
+ (*names)[i].pol_lb = recv_msg->names[i]->pol_lb;
+ /* Truncate names > NAME_SIZE */
+ if (strlen(recv_msg->names[i]->name) >= NAME_SIZE)
+ recv_msg->names[i]->name[NAME_SIZE - 1] = 0;
+
+ strcpy((*names)[i].name, recv_msg->names[i]->name);
+ }
+
+ irm_msg__free_unpacked(recv_msg, NULL);
+
+ return nr;
+}
+
+int irm_reg_name(const char * name,
+ pid_t pid)
+{
+ irm_msg_t msg = IRM_MSG__INIT;
+ irm_msg_t * recv_msg = NULL;
+ int ret = -1;
+
+ if (name == NULL)
+ return -EINVAL;
+
+ msg.code = IRM_MSG_CODE__IRM_REG_NAME;
msg.has_pid = true;
msg.pid = pid;
msg.name = (char *) name;
@@ -553,9 +670,8 @@ int irm_reg(pid_t pid,
return ret;
}
-
-int irm_unreg(pid_t pid,
- const char * name)
+int irm_unreg_name(const char * name,
+ pid_t pid)
{
irm_msg_t msg = IRM_MSG__INIT;
irm_msg_t * recv_msg = NULL;
@@ -564,7 +680,7 @@ int irm_unreg(pid_t pid,
if (name == NULL)
return -EINVAL;
- msg.code = IRM_MSG_CODE__IRM_UNREG;
+ msg.code = IRM_MSG_CODE__IRM_UNREG_NAME;
msg.has_pid = true;
msg.pid = pid;
msg.name = (char *) name;