diff options
| author | Dimitri Staessens <dimitri@ouroboros.rocks> | 2026-08-16 18:36:34 +0000 |
|---|---|---|
| committer | Sander Vrijders <sander@ouroboros.rocks> | 2026-08-31 08:31:45 +0200 |
| commit | 251ee95294bd1554591c2a3b3d1d6428315dad52 (patch) | |
| tree | 383802e51108729ad71b27291230595c4b02acf2 /src/tools/irm | |
| parent | c63b6d3aed21f474080dd491f5583123448dd1ba (diff) | |
| download | ouroboros-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.c | 4 | ||||
| -rw-r--r-- | src/tools/irm/irm_bind_ipcp.c | 13 | ||||
| -rw-r--r-- | src/tools/irm/irm_bind_process.c | 22 | ||||
| -rw-r--r-- | src/tools/irm/irm_bind_program.c | 19 | ||||
| -rw-r--r-- | src/tools/irm/irm_name_create.c | 5 | ||||
| -rw-r--r-- | src/tools/irm/irm_name_list.c | 13 | ||||
| -rw-r--r-- | src/tools/irm/irm_name_reg.c | 5 | ||||
| -rw-r--r-- | src/tools/irm/irm_name_unreg.c | 5 | ||||
| -rw-r--r-- | src/tools/irm/irm_unbind.c | 4 | ||||
| -rw-r--r-- | src/tools/irm/irm_unbind_ipcp.c | 13 | ||||
| -rw-r--r-- | src/tools/irm/irm_unbind_process.c | 13 | ||||
| -rw-r--r-- | src/tools/irm/irm_unbind_program.c | 18 |
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); |
