diff options
Diffstat (limited to 'src/tools/irm')
-rw-r--r-- | src/tools/irm/CMakeLists.txt | 6 | ||||
-rw-r--r-- | src/tools/irm/irm.c | 4 | ||||
-rw-r--r-- | src/tools/irm/irm_bind.c | 87 | ||||
-rw-r--r-- | src/tools/irm/irm_bind_ap.c | 98 | ||||
-rw-r--r-- | src/tools/irm/irm_bind_api.c | 68 | ||||
-rw-r--r-- | src/tools/irm/irm_ipcp.c | 2 | ||||
-rw-r--r-- | src/tools/irm/irm_ops.h | 10 | ||||
-rw-r--r-- | src/tools/irm/irm_unbind.c | 58 | ||||
-rw-r--r-- | src/tools/irm/irm_unbind_ap.c | 68 | ||||
-rw-r--r-- | src/tools/irm/irm_unbind_api.c | 69 |
10 files changed, 390 insertions, 80 deletions
diff --git a/src/tools/irm/CMakeLists.txt b/src/tools/irm/CMakeLists.txt index 68297615..f59d9af0 100644 --- a/src/tools/irm/CMakeLists.txt +++ b/src/tools/irm/CMakeLists.txt @@ -7,10 +7,16 @@ include_directories(${CMAKE_BINARY_DIR}/include) set(SOURCE_FILES # Add source files here irm.c + irm_bind_ap.c + irm_bind_api.c + irm_bind_ipcp.c irm_ipcp_create.c irm_ipcp_destroy.c irm_ipcp_bootstrap.c irm_ipcp_enroll.c + irm_unbind_ap.c + irm_unbind_api.c + irm_unbind_ipcp.c irm_unbind.c irm_bind.c irm_ipcp.c diff --git a/src/tools/irm/irm.c b/src/tools/irm/irm.c index 14420207..c260feb9 100644 --- a/src/tools/irm/irm.c +++ b/src/tools/irm/irm.c @@ -46,8 +46,8 @@ static const struct cmd { int (* func)(int argc, char ** argv); } cmds[] = { { "ipcp", ipcp_cmd }, - { "bind", do_bind }, - { "unbind", do_unbind }, + { "bind", bind_cmd }, + { "unbind", unbind_cmd }, { "register", do_register }, { "unregister", do_unregister }, { "help", do_help }, diff --git a/src/tools/irm/irm_bind.c b/src/tools/irm/irm_bind.c index 061aeef5..9b37e800 100644 --- a/src/tools/irm/irm_bind.c +++ b/src/tools/irm/irm_bind.c @@ -1,8 +1,9 @@ /* * Ouroboros - Copyright (C) 2016 * - * Bind AP to a name + * Bind names in the processing system * + * Dimitri Staessens <[email protected]> * Sander Vrijders <[email protected]> * * This program is free software; you can redistribute it and/or modify @@ -21,75 +22,57 @@ */ #include <stdio.h> -#include <string.h> #include <ouroboros/irm.h> -#include <ouroboros/errno.h> #include "irm_ops.h" #include "irm_utils.h" static void usage() { - printf("Usage: irm bind\n" - " name <name>\n" - " apn <application process name>\n" - " [auto] (instantiate apn if not running)\n" - " [unique] (there can only be one instantiation)\n" - " [-- <application arguments>]\n"); + printf("Usage: irm bind [OPERATION]\n" + "where OPERATION = {ap api ipcp help}\n"); } - -int do_bind(int argc, char ** argv) +static int do_help(int argc, char **argv) { - char * name = NULL; - char * ap_name = NULL; - uint16_t flags = 0; - int ret = 0; + usage(); + return 0; +} - while (argc > 0) { - if (matches(*argv, "name") == 0) { - name = *(argv + 1); - ++argv; - --argc; - } else if (matches(*argv, "apn") == 0) { - ap_name = *(argv + 1); - ++argv; - --argc; - } else if (strcmp(*argv, "auto") == 0) { - flags |= BIND_AP_AUTO; - } else if (strcmp(*argv, "unique") == 0) { - flags |= BIND_AP_UNIQUE; - } else if (strcmp(*argv, "--") == 0) { - ++argv; - --argc; - break; - } else { - printf("\"%s\" is unknown, try \"irm " - "bind\".\n", *argv); - return -1; - } +static const struct cmd { + const char * cmd; + int (* func)(int argc, char ** argv); +} cmds[] = { + { "ap", do_bind_ap }, + { "api", do_bind_api }, + { "ipcp", do_bind_ipcp }, + { "help", do_help }, + { 0 } +}; - ++argv; - --argc; - } +static int do_cmd(const char * argv0, + int argc, + char ** argv) +{ + const struct cmd * c; - if (name == NULL || ap_name == NULL) { - usage(); - return -1; + for (c = cmds; c->cmd; ++c) { + if (!matches(argv0, c->cmd)) + return c->func(argc, argv); } - ret = irm_bind(name, ap_name, flags, argc, argv); - if (ret == -ENOENT) { - printf("%s does not exist.\n", ap_name); - return -1; - } + fprintf(stderr, "\"%s\" is unknown, try \"irm bind help\".\n", argv0); + + return -1; +} - if (ret == -EPERM) { - printf("Cannot execute %s, please check permissions.\n", - ap_name); +int bind_cmd(int argc, char ** argv) +{ + if (argc < 1) { + usage(); return -1; } - return ret; + return do_cmd(argv[0], argc, argv); } diff --git a/src/tools/irm/irm_bind_ap.c b/src/tools/irm/irm_bind_ap.c new file mode 100644 index 00000000..a525c077 --- /dev/null +++ b/src/tools/irm/irm_bind_ap.c @@ -0,0 +1,98 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Bind AP to a name + * + * Dimitri Staessens <[email protected]> + * Sander Vrijders <[email protected]> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <stdio.h> +#include <string.h> + +#include <ouroboros/irm.h> +#include <ouroboros/errno.h> + +#include "irm_ops.h" +#include "irm_utils.h" + +static void usage() +{ + printf("Usage: irm bind ap <ap>\n" + " name <name>\n" + " [auto] (instantiate apn if not running)\n" + " [loc] (location-dependent application)\n" + " [unique] (there can only be one instantiation)\n" + " [-- <application arguments>]\n"); +} + + +int do_bind_ap(int argc, char ** argv) +{ + char * name = NULL; + char * ap_name = NULL; + uint16_t flags = 0; + int ret = 0; + + while (argc > 0) { + if (matches(*argv, "name") == 0) { + name = *(argv + 1); + ++argv; + --argc; + } else if (matches(*argv, "ap") == 0) { + ap_name = *(argv + 1); + ++argv; + --argc; + } else if (strcmp(*argv, "auto") == 0) { + flags |= BIND_AP_AUTO; + } else if (strcmp(*argv, "unique") == 0) { + flags |= BIND_AP_UNIQUE; + } else if (strcmp(*argv, "loc") == 0) { + flags |= BIND_AP_LOC; + } else if (strcmp(*argv, "--") == 0) { + ++argv; + --argc; + break; + } else { + printf("\"%s\" is unknown, try \"irm " + "bind\".\n", *argv); + return -1; + } + + ++argv; + --argc; + } + + if (name == NULL || ap_name == NULL) { + usage(); + return -1; + } + + ret = irm_bind_ap(ap_name, name, flags, argc, argv); + if (ret == -ENOENT) { + printf("%s does not exist.\n", ap_name); + return -1; + } + + if (ret == -EPERM) { + printf("Cannot execute %s, please check permissions.\n", + ap_name); + return -1; + } + + return ret; +} diff --git a/src/tools/irm/irm_bind_api.c b/src/tools/irm/irm_bind_api.c new file mode 100644 index 00000000..b21d305c --- /dev/null +++ b/src/tools/irm/irm_bind_api.c @@ -0,0 +1,68 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Bind AP-I to a name + * + * Dimitri Staessens <[email protected]> + * Sander Vrijders <[email protected]> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <stdio.h> +#include <stdlib.h> + +#include <ouroboros/irm.h> +#include <ouroboros/errno.h> + +#include "irm_ops.h" +#include "irm_utils.h" + +static void usage() +{ + printf("Usage: irm bind api <pid> name <name>\n"); +} + +int do_bind_api(int argc, char ** argv) +{ + pid_t api = -1; + char * name = NULL; + + while (argc > 0) { + if (matches(*argv, "name") == 0) { + name = *(argv + 1); + ++argv; + --argc; + } else if (matches(*argv, "api") == 0) { + api = strtol(*(argv + 1), NULL, 10); + ++argv; + --argc; + } else { + printf("\"%s\" is unknown, try \"irm " + "bind api\".\n", *argv); + return -1; + } + + ++argv; + --argc; + } + + if (api < 0 || name == NULL) { + usage(); + return -1; + } + + return irm_bind_api(api, name); +} diff --git a/src/tools/irm/irm_ipcp.c b/src/tools/irm/irm_ipcp.c index f658ead5..1b523feb 100644 --- a/src/tools/irm/irm_ipcp.c +++ b/src/tools/irm/irm_ipcp.c @@ -29,7 +29,7 @@ static void usage() { printf("Usage: irm ipcp [OPERATION]\n\n" "where OPERATION = {create destroy\n" - " bootstrap enroll help\n"); + " bootstrap enroll help}\n"); } static int do_help(int argc, char **argv) diff --git a/src/tools/irm/irm_ops.h b/src/tools/irm/irm_ops.h index 24eee0df..9a59d69a 100644 --- a/src/tools/irm/irm_ops.h +++ b/src/tools/irm/irm_ops.h @@ -26,7 +26,13 @@ int do_destroy_ipcp(int argc, char ** argv); int do_bootstrap_ipcp(int argc, char ** argv); int do_enroll_ipcp(int argc, char ** argv); -int do_bind(int argc, char ** argv); -int do_unbind(int argc, char ** argv); +int bind_cmd(int argc, char ** argv); +int do_bind_ap(int argc, char ** argv); +int do_bind_api(int argc, char ** argv); +int do_bind_ipcp(int argc, char ** argv); +int unbind_cmd(int argc, char ** argv); +int do_unbind_ap(int argc, char ** argv); +int do_unbind_api(int argc, char ** argv); +int do_unbind_ipcp(int argc, char ** argv); int do_register(int argc, char ** argv); int do_unregister(int argc, char ** argv); diff --git a/src/tools/irm/irm_unbind.c b/src/tools/irm/irm_unbind.c index 9e8f3c9c..0290e678 100644 --- a/src/tools/irm/irm_unbind.c +++ b/src/tools/irm/irm_unbind.c @@ -3,6 +3,7 @@ * * Unbind names in the processing system * + * Dimitri Staessens <[email protected]> * Sander Vrijders <[email protected]> * * This program is free software; you can redistribute it and/or modify @@ -29,35 +30,46 @@ static void usage() { - printf("Usage: irm unbind\n" - " name <name>\n" - " ap <application process name>\n"); + printf("Usage: irm unbind [OPERATION]\n" + "where OPERATION = {ap api ipcp help}\n"); } -int do_unbind(int argc, char ** argv) +static int do_help(int argc, char **argv) { - char * name = NULL; - char * ap_name = NULL; - - while (argc > 0) { - if (matches(*argv, "name") == 0) { - name = *(argv + 1); - } else if (matches(*argv, "ap") == 0) { - ap_name = *(argv + 1); - } else { - printf("\"%s\" is unknown, try \"irm " - "unbind\".\n", *argv); - return -1; - } - - argc -= 2; - argv += 2; - } + usage(); + return 0; +} + +static const struct cmd { + const char * cmd; + int (* func)(int argc, char ** argv); +} cmds[] = { + { "ap", do_unbind_ap }, + { "api", do_unbind_api }, + { "ipcp", do_unbind_ipcp }, + { "help", do_help }, + { 0 } +}; + +static int do_cmd(const char * argv0, int argc, char ** argv) +{ + const struct cmd * c; - if (name == NULL && ap_name == NULL) { + for (c = cmds; c->cmd; ++c) + if (!matches(argv0, c->cmd)) + return c->func(argc, argv); + + fprintf(stderr, "\"%s\" is unknown, try \"irm unbind help\".\n", argv0); + + return -1; +} + +int unbind_cmd(int argc, char ** argv) +{ + if (argc < 1) { usage(); return -1; } - return irm_unbind(name, ap_name, 0); + return do_cmd(argv[0], argc, argv); } diff --git a/src/tools/irm/irm_unbind_ap.c b/src/tools/irm/irm_unbind_ap.c new file mode 100644 index 00000000..bdfcbaad --- /dev/null +++ b/src/tools/irm/irm_unbind_ap.c @@ -0,0 +1,68 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Unbind AP names + * + * Dimitri Staessens <[email protected]> + * Sander Vrijders <[email protected]> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <stdio.h> +#include <stdlib.h> + +#include <ouroboros/irm.h> + +#include "irm_ops.h" +#include "irm_utils.h" + +static void usage() +{ + printf("Usage: irm unbind ap <ap>\n" + " [name <name>, omit: remove all AP info]\n"); +} + +int do_unbind_ap(int argc, char ** argv) +{ + char * name = NULL; + char * ap_name = NULL; + + while (argc > 0) { + if (matches(*argv, "name") == 0) { + name = *(argv + 1); + ++argv; + --argc; + } else if (matches(*argv, "ap") == 0) { + ap_name = *(argv + 1); + ++argv; + --argc; + } else { + printf("\"%s\" is unknown, try \"irm " + "unbind ap\".\n", *argv); + return -1; + } + + ++argv; + --argc; + } + + if (ap_name == NULL) { + usage(); + return -1; + } + + return irm_unbind_ap(ap_name, name); +} diff --git a/src/tools/irm/irm_unbind_api.c b/src/tools/irm/irm_unbind_api.c new file mode 100644 index 00000000..b69a4579 --- /dev/null +++ b/src/tools/irm/irm_unbind_api.c @@ -0,0 +1,69 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Unbind AP-I names + * + * Dimitri Staessens <[email protected]> + * Sander Vrijders <[email protected]> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <sys/types.h> + +#include <ouroboros/irm.h> + +#include "irm_ops.h" +#include "irm_utils.h" + +static void usage() +{ + printf("Usage: irm unbind api <pid>\n" + " [name <name>, omit: remove all AP-I info]\n"); +} + +int do_unbind_api(int argc, char ** argv) +{ + pid_t api = -1; + char * name = NULL; + + while (argc > 0) { + if (matches(*argv, "name") == 0) { + name = *(argv + 1); + ++argv; + --argc; + } else if (matches(*argv, "api") == 0) { + api = strtol(*(argv + 1), NULL, 10); + ++argv; + --argc; + } else { + printf("\"%s\" is unknown, try \"irm " + "unbind api\".\n", *argv); + return -1; + } + + ++argv; + --argc; + } + + if (api < 0) { + usage(); + return -1; + } + + return irm_unbind_api(api, name); +} |