summaryrefslogtreecommitdiff
path: root/src/tools/irm
diff options
context:
space:
mode:
authorDimitri Staessens <dimitri@ouroboros.rocks>2026-08-16 18:36:34 +0000
committerSander Vrijders <sander@ouroboros.rocks>2026-08-31 08:31:45 +0200
commit251ee95294bd1554591c2a3b3d1d6428315dad52 (patch)
tree383802e51108729ad71b27291230595c4b02acf2 /src/tools/irm
parentc63b6d3aed21f474080dd491f5583123448dd1ba (diff)
downloadouroboros-251ee95294bd1554591c2a3b3d1d6428315dad52.tar.gz
ouroboros-251ee95294bd1554591c2a3b3d1d6428315dad52.zip
tools: Fix irm CLI arg parsing
Fixes "irm name list" matching "list" instead of "name" and improves guards against missing (last) arguments. Signed-off-by: Dimitri Staessens <dimitri@ouroboros.rocks> Signed-off-by: Sander Vrijders <sander@ouroboros.rocks>
Diffstat (limited to 'src/tools/irm')
-rw-r--r--src/tools/irm/irm_bind.c4
-rw-r--r--src/tools/irm/irm_bind_ipcp.c13
-rw-r--r--src/tools/irm/irm_bind_process.c22
-rw-r--r--src/tools/irm/irm_bind_program.c19
-rw-r--r--src/tools/irm/irm_name_create.c5
-rw-r--r--src/tools/irm/irm_name_list.c13
-rw-r--r--src/tools/irm/irm_name_reg.c5
-rw-r--r--src/tools/irm/irm_name_unreg.c5
-rw-r--r--src/tools/irm/irm_unbind.c4
-rw-r--r--src/tools/irm/irm_unbind_ipcp.c13
-rw-r--r--src/tools/irm/irm_unbind_process.c13
-rw-r--r--src/tools/irm/irm_unbind_program.c18
12 files changed, 97 insertions, 37 deletions
diff --git a/src/tools/irm/irm_bind.c b/src/tools/irm/irm_bind.c
index 3107837a..2d3fc554 100644
--- a/src/tools/irm/irm_bind.c
+++ b/src/tools/irm/irm_bind.c
@@ -78,8 +78,8 @@ static int do_cmd(const char * argv0,
const struct cmd * c;
for (c = cmds; c->cmd; ++c) {
- if (!matches(argv0, c->cmd))
- return c->func(argc, argv);
+ if (matches(argv0, c->cmd) == 0)
+ return c->func(argc - 1, argv + 1);
}
fprintf(stderr, "\"%s\" is unknown, try \"irm bind help\".\n", argv0);
diff --git a/src/tools/irm/irm_bind_ipcp.c b/src/tools/irm/irm_bind_ipcp.c
index 4c183534..b6223074 100644
--- a/src/tools/irm/irm_bind_ipcp.c
+++ b/src/tools/irm/irm_bind_ipcp.c
@@ -61,15 +61,20 @@ int do_bind_ipcp(int argc,
ssize_t len;
ssize_t i;
+ if (argc < 1) {
+ usage();
+ return -1;
+ }
+
+ ipcp = *argv;
+ ++argv;
+ --argc;
+
while (argc > 0) {
if (matches(*argv, "name") == 0) {
name = *(argv + 1);
++argv;
--argc;
- } else if (matches(*argv, "ipcp") == 0) {
- ipcp = *(argv + 1);
- ++argv;
- --argc;
} else {
printf("\"%s\" is unknown, try \"irm "
"bind ipcp\".\n", *argv);
diff --git a/src/tools/irm/irm_bind_process.c b/src/tools/irm/irm_bind_process.c
index fee0c46b..c401df14 100644
--- a/src/tools/irm/irm_bind_process.c
+++ b/src/tools/irm/irm_bind_process.c
@@ -61,20 +61,24 @@ int do_bind_process(int argc,
char * name = NULL;
char * t;
+ if (argc < 1) {
+ usage();
+ return -1;
+ }
+
+ pid = strtol(*argv, &t, 10);
+ if (*argv == t || *t != '\0' || kill(pid, 0)) {
+ printf("\"%s\" is not a valid process id.\n", *argv);
+ return -1;
+ }
+ ++argv;
+ --argc;
+
while (argc > 1) {
if (matches(*argv, "name") == 0) {
name = *(argv + 1);
++argv;
--argc;
- } else if (matches(*argv, "process") == 0) {
- pid = strtol(*(argv + 1), &t, 10);
- if (*(argv + 1) == t || *t != '\0' || kill(pid, 0)) {
- printf("\"%s\" is not a valid process id.\n",
- *(argv + 1));
- return -1;
- }
- ++argv;
- --argc;
} else {
printf("\"%s\" is unknown, try \"irm "
"bind process\".\n", *argv);
diff --git a/src/tools/irm/irm_bind_program.c b/src/tools/irm/irm_bind_program.c
index 14d09db7..592c2ec3 100644
--- a/src/tools/irm/irm_bind_program.c
+++ b/src/tools/irm/irm_bind_program.c
@@ -67,18 +67,23 @@ int do_bind_program(int argc,
int ret = 0;
char * temp = NULL;
+ if (argc < 1) {
+ usage();
+ return -1;
+ }
+
+ temp = realpath(*argv, NULL);
+ if (temp != NULL)
+ *argv = temp;
+ prog = *argv;
+ ++argv;
+ --argc;
+
while (argc > 0) {
if (matches(*argv, "name") == 0) {
name = *(argv + 1);
++argv;
--argc;
- } else if (matches(*argv, "program") == 0) {
- ++argv;
- temp = realpath(*argv, NULL);
- if (temp != NULL)
- *argv = temp;
- prog = *argv;
- --argc;
} else if (strcmp(*argv, "auto") == 0) {
flags |= BIND_AUTO;
} else if (strcmp(*argv, "--") == 0) {
diff --git a/src/tools/irm/irm_name_create.c b/src/tools/irm/irm_name_create.c
index 40a51193..034b4c99 100644
--- a/src/tools/irm/irm_name_create.c
+++ b/src/tools/irm/irm_name_create.c
@@ -117,6 +117,11 @@ int do_create_name(int argc,
--argc;
while (argc > 0) {
+ if (argc < 2) {
+ usage();
+ return -1;
+ }
+
if (matches(*argv, "lb") == 0) {
lb_pol = *(argv + 1);
} else if (matches(*argv, "ssecpath") == 0) {
diff --git a/src/tools/irm/irm_name_list.c b/src/tools/irm/irm_name_list.c
index 37e1f023..a5a33073 100644
--- a/src/tools/irm/irm_name_list.c
+++ b/src/tools/irm/irm_name_list.c
@@ -49,6 +49,12 @@
#define RR "round-robin"
#define SPILL "spillover"
+static void usage(void)
+{
+ printf("Usage: irm name list\n"
+ " [name <name>]\n");
+}
+
static char * str_pol(enum pol_balance p)
{
switch(p) {
@@ -70,7 +76,12 @@ int do_list_name(int argc,
ssize_t i;
while (argc > 0) {
- if (matches(*argv, "list") == 0) {
+ if (argc < 2) {
+ usage();
+ return -1;
+ }
+
+ if (matches(*argv, "name") == 0) {
name = *(argv + 1);
} else {
printf("\"%s\" is unknown, try \"irm "
diff --git a/src/tools/irm/irm_name_reg.c b/src/tools/irm/irm_name_reg.c
index 860f4a70..25e9fbb8 100644
--- a/src/tools/irm/irm_name_reg.c
+++ b/src/tools/irm/irm_name_reg.c
@@ -80,6 +80,11 @@ int do_reg_name(int argc,
--argc;
while (argc > 0) {
+ if (argc < 2) {
+ usage();
+ return -1;
+ }
+
if (matches(*argv, "layer") == 0) {
layers[layers_len++] = *(argv + 1);
if (layers_len > MAX_LAYERS) {
diff --git a/src/tools/irm/irm_name_unreg.c b/src/tools/irm/irm_name_unreg.c
index abf08548..1b2cf29c 100644
--- a/src/tools/irm/irm_name_unreg.c
+++ b/src/tools/irm/irm_name_unreg.c
@@ -76,6 +76,11 @@ int do_unreg_name(int argc,
--argc;
while (argc > 0) {
+ if (argc < 2) {
+ usage();
+ return -1;
+ }
+
if (matches(*argv, "layer") == 0) {
layers[layers_len++] = *(argv + 1);
if (layers_len > MAX_LAYERS) {
diff --git a/src/tools/irm/irm_unbind.c b/src/tools/irm/irm_unbind.c
index 4e5914a9..f98d0931 100644
--- a/src/tools/irm/irm_unbind.c
+++ b/src/tools/irm/irm_unbind.c
@@ -78,8 +78,8 @@ static int do_cmd(const char * argv0,
const struct cmd * c;
for (c = cmds; c->cmd; ++c)
- if (!matches(argv0, c->cmd))
- return c->func(argc, argv);
+ if (matches(argv0, c->cmd) == 0)
+ return c->func(argc - 1, argv + 1);
fprintf(stderr, "\"%s\" is unknown, try \"irm unbind help\".\n", argv0);
diff --git a/src/tools/irm/irm_unbind_ipcp.c b/src/tools/irm/irm_unbind_ipcp.c
index 23e25057..5d78603d 100644
--- a/src/tools/irm/irm_unbind_ipcp.c
+++ b/src/tools/irm/irm_unbind_ipcp.c
@@ -63,15 +63,20 @@ int do_unbind_ipcp(int argc,
ssize_t len;
ssize_t i;
+ if (argc < 1) {
+ usage();
+ return -1;
+ }
+
+ ipcp = *argv;
+ ++argv;
+ --argc;
+
while (argc > 0) {
if (matches(*argv, "name") == 0) {
name = *(argv + 1);
++argv;
--argc;
- } else if (matches(*argv, "ipcp") == 0) {
- ipcp = *(argv + 1);
- ++argv;
- --argc;
} else {
printf("\"%s\" is unknown, try \"irm "
"unbind ipcp\".\n", *argv);
diff --git a/src/tools/irm/irm_unbind_process.c b/src/tools/irm/irm_unbind_process.c
index bc7e545c..dfa91f4b 100644
--- a/src/tools/irm/irm_unbind_process.c
+++ b/src/tools/irm/irm_unbind_process.c
@@ -58,15 +58,20 @@ int do_unbind_process(int argc,
pid_t pid = -1;
char * name = NULL;
+ if (argc < 1) {
+ usage();
+ return -1;
+ }
+
+ pid = strtol(*argv, NULL, 10);
+ ++argv;
+ --argc;
+
while (argc > 1) {
if (matches(*argv, "name") == 0) {
name = *(argv + 1);
++argv;
--argc;
- } else if (matches(*argv, "process") == 0) {
- pid = strtol(*(argv + 1), NULL, 10);
- ++argv;
- --argc;
} else {
printf("\"%s\" is unknown, try \"irm "
"unbind process\".\n", *argv);
diff --git a/src/tools/irm/irm_unbind_program.c b/src/tools/irm/irm_unbind_program.c
index 031b9909..4ee8ce24 100644
--- a/src/tools/irm/irm_unbind_program.c
+++ b/src/tools/irm/irm_unbind_program.c
@@ -57,15 +57,25 @@ int do_unbind_program(int argc,
char * name = NULL;
char * prog = NULL;
+ if (argc < 1) {
+ usage();
+ return -1;
+ }
+
+ prog = *argv;
+ ++argv;
+ --argc;
+
while (argc > 0) {
+ if (argc < 2) {
+ usage();
+ return -1;
+ }
+
if (matches(*argv, "name") == 0) {
name = *(argv + 1);
++argv;
--argc;
- } else if (matches(*argv, "program") == 0) {
- prog = *(argv + 1);
- ++argv;
- --argc;
} else {
printf("\"%s\" is unknown, try \"irm "
"unbind program\".\n", *argv);