summaryrefslogtreecommitdiff
path: root/src/irmd/configfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/irmd/configfile.c')
-rw-r--r--src/irmd/configfile.c126
1 files changed, 72 insertions, 54 deletions
diff --git a/src/irmd/configfile.c b/src/irmd/configfile.c
index 35f526a1..1537a1cc 100644
--- a/src/irmd/configfile.c
+++ b/src/irmd/configfile.c
@@ -25,27 +25,29 @@
#if defined (HAVE_TOML)
-#define _XOPEN_SOURCE 500
+#define _POSIX_C_SOURCE 200809L
+#define _XOPEN_SOURCE 500
#define OUROBOROS_PREFIX "irmd/configuration"
-#include <toml.h>
+#include <ouroboros/errno.h>
+#include <ouroboros/ipcp.h>
+#include <ouroboros/logs.h>
+#include <ouroboros/utils.h>
+
+#include "irmd.h"
+#include "configfile.h"
+
+#include "reg/reg.h"
#include <assert.h>
#include <errno.h>
#include <inttypes.h>
#include <stdlib.h>
#include <string.h>
+#include <toml.h>
#include <arpa/inet.h>
-#include <ouroboros/errno.h>
-#include <ouroboros/ipcp.h>
-#include <ouroboros/logs.h>
-
-#include "irmd.h"
-#include "configfile.h"
-#include "utils.h"
-
#define ERRBUFSZ 200
static int toml_hash(toml_table_t * table,
@@ -361,9 +363,12 @@ static int toml_autobind(toml_table_t * table,
static int toml_register(toml_table_t * table,
pid_t pid)
{
- toml_array_t * reg;
- int i;
- int ret = 0;
+ toml_array_t * reg;
+ int i;
+ int ret = 0;
+ struct name_info info = {
+ .pol_lb = LB_SPILL
+ };
reg = toml_array_in(table, "reg");
if (reg == NULL)
@@ -378,7 +383,9 @@ static int toml_register(toml_table_t * table,
log_dbg("Registering %s in %d", name.u.s, pid);
- ret = name_create(name.u.s, LB_SPILL);
+ strcpy(info.name, name.u.s);
+
+ ret = name_create(&info);
if (ret < 0 && ret != -ENAME) {
free(name.u.s);
break;
@@ -422,19 +429,17 @@ static int toml_connect(toml_table_t * table,
return ret;
}
-static int toml_ipcp(toml_table_t * table,
- const struct ipcp_info * info,
- struct ipcp_config * conf)
+static int toml_ipcp(toml_table_t * table,
+ struct ipcp_info * info,
+ struct ipcp_config * conf)
{
toml_datum_t bootstrap;
toml_datum_t enrol;
- pid_t pid;
int ret;
log_dbg("Found IPCP %s in configuration file.", info->name);
- pid = create_ipcp(info);
- if (pid < 0) {
+ if (create_ipcp(info) < 0) {
log_err("Failed to create IPCP %s.", info->name);
return -1;
}
@@ -454,26 +459,26 @@ static int toml_ipcp(toml_table_t * table,
}
if (enrol.ok) {
- char layer[LAYER_NAME_SIZE + 1];
- ret = enroll_ipcp(pid, enrol.u.s);
+ struct layer_info layer;
+ ret = enroll_ipcp(info->pid, enrol.u.s);
free(enrol.u.s);
if (ret < 0) {
log_err("Failed to enrol %s.", info->name);
return -1;
}
- if (get_layer_for_ipcp(pid, layer) < 0)
+ if (reg_get_ipcp(info, &layer) < 0)
return -1;
- if (toml_autobind(table, pid, info->name, layer))
+ if (toml_autobind(table, info->pid, info->name, layer.name))
return -1;
- if (toml_register(table, pid) < 0) {
+ if (toml_register(table, info->pid) < 0) {
log_err("Failed to register names.");
return -1;
}
- if (toml_connect(table, pid) < 0) {
+ if (toml_connect(table, info->pid) < 0) {
log_err("Failed to register names.");
return -1;
}
@@ -519,13 +524,14 @@ static int toml_ipcp(toml_table_t * table,
strcpy(conf->layer_info.name, bootstrap.u.s);
free(bootstrap.u.s);
- if (bootstrap_ipcp(pid, conf) < 0)
+ if (bootstrap_ipcp(info->pid, conf) < 0)
return -1;
- if (toml_autobind(table, pid, info->name, conf->layer_info.name) < 0)
+ if (toml_autobind(table, info->pid, info->name,
+ conf->layer_info.name) < 0)
return -1;
- if (toml_register(table, pid) < 0) {
+ if (toml_register(table, info->pid) < 0) {
log_err("Failed to register names.");
return -1;
}
@@ -544,6 +550,9 @@ static int toml_ipcp_list(toml_table_t * table,
struct ipcp_info info;
struct ipcp_config conf;
+ memset(&conf, 0, sizeof(conf));
+ memset(&info, 0, sizeof(info));
+
key = toml_key_in(table, i);
if (key == NULL)
break;
@@ -553,8 +562,6 @@ static int toml_ipcp_list(toml_table_t * table,
return -1;
}
- memset(&conf, 0, sizeof(conf));
-
info.type = type;
strcpy(info.name,key);
conf.type = type;
@@ -565,31 +572,37 @@ static int toml_ipcp_list(toml_table_t * table,
return ret;
}
-static int args_to_argv(const char * args,
+static int args_to_argv(const char * prog,
+ const char * args,
char *** argv)
{
char * tok;
char * str;
int argc = 0;
- if (args == NULL) {
- *argv = NULL;
- return 0;
- }
-
str = (char *) args;
- tok = str;
- while (*(tok += strspn(tok, " ")) != '\0') {
- tok += strcspn(tok, " ");
- argc++;
+ if (str != NULL) {
+ tok = str;
+ while (*(tok += strspn(tok, " ")) != '\0') {
+ tok += strcspn(tok, " ");
+ argc++;
+ }
}
- *argv = malloc((argc + 1) * sizeof(**argv));
+ *argv = malloc((argc + 2) * sizeof(**argv));
if (*argv == NULL)
goto fail_malloc;
- argc = 0;
+ (*argv)[0] = strdup(prog);
+ if ((*argv)[0] == NULL)
+ goto fail_malloc2;
+
+ argc++;
+
+ if (str == NULL)
+ goto finish;
+
tok = str;
while (*(tok += strspn(tok, " ")) != '\0') {
size_t toklen = strcspn(tok, " ");
@@ -602,6 +615,7 @@ static int args_to_argv(const char * args,
tok += toklen;
}
+ finish:
(*argv)[argc] = NULL;
return argc;
@@ -613,30 +627,30 @@ static int args_to_argv(const char * args,
}
-static int toml_prog(char * prog,
+static int toml_prog(const char * prog,
const char * args,
const char * name)
{
uint16_t flags = 0;
int argc;
- char ** argv;
+ char ** exec;
int ret;
if (args != NULL)
flags |= BIND_AUTO;
- argc = args_to_argv(args, &argv);
+ argc = args_to_argv(prog, args, &exec);
if (argc < 0) {
log_err("Failed to parse arguments: %s", args);
return -1;
}
- ret = bind_program(prog, name, flags, argc, argv);
+ ret = bind_program(exec, name, flags);
if (ret < 0)
log_err("Failed to bind program %s %s for name %s.",
prog, args, name);
- argvfree(argv);
+ argvfree(exec);
return ret;
}
@@ -683,27 +697,31 @@ static int toml_name(toml_table_t * table,
toml_array_t * progs;
toml_array_t * args;
toml_datum_t lb;
- enum pol_balance lb_pol = LB_SPILL;
+ struct name_info info = {
+ .pol_lb = LB_SPILL
+ };
log_dbg("Found service name %s in configuration file.", name);
lb = toml_string_in(table, "lb");
if (lb.ok) {
if (strcmp(lb.u.s, "spill") == 0)
- lb_pol = LB_SPILL;
+ info.pol_lb = LB_SPILL;
else if (strcmp(lb.u.s, "round-robin") == 0)
- lb_pol = LB_RR;
+ info.pol_lb = LB_RR;
else
- lb_pol = LB_INVALID;
+ info.pol_lb = LB_INVALID;
free(lb.u.s);
}
- if (lb_pol == LB_INVALID) {
+ if (info.pol_lb == LB_INVALID) {
log_err("Invalid load-balancing policy for %s.", name);
return -1;
}
- if (name_create(name, lb_pol) < 0) {
+ strcpy(info.name, name);
+
+ if (name_create(&info) < 0) {
log_err("Failed to create name %s.", name);
return -1;
}