diff options
author | dimitri staessens <dimitri.staessens@intec.ugent.be> | 2016-08-20 10:42:36 +0200 |
---|---|---|
committer | dimitri staessens <dimitri.staessens@intec.ugent.be> | 2016-08-21 18:32:12 +0200 |
commit | 0efb1ff527ce3fb50d4c72c02904fa1cdd1e3a66 (patch) | |
tree | 9c0adf0b6ef3b9350c13939f6d40c79eca7546fd /src/tools/irm/irm_bind.c | |
parent | ba27593e3e8406e109393ae383f17c7416675c1e (diff) | |
download | ouroboros-0efb1ff527ce3fb50d4c72c02904fa1cdd1e3a66.tar.gz ouroboros-0efb1ff527ce3fb50d4c72c02904fa1cdd1e3a66.zip |
irmd, lib: Rebuild the IRMd data model
The complete data model inside the IRMd has been restructured. The
bind operation was revised to allow binding of AP and AP instances and
register those names with different DIFs (see "irm bind" for details).
Server applications require to call ap_init with a server name
argument, client application that do not the be reachable over any DIF
can call ap_init(NULL). Calling ap_init for a client with a specified
name will not have adverse consequences for the application, but will
consume unnecessary resources in the IRMd.
Application servers can now be started at any point after the IRMd has
been started. Starting servers, binding AP names and registering names in
DIFs can be performed in any order that does not defy temporal logic.
Supports naming instances by their pid. In case of IPCP Instances
created with the IRM tool, the name assigned during "irm ipcp create"
can be used.
All the changes required updates in the tools.
Diffstat (limited to 'src/tools/irm/irm_bind.c')
-rw-r--r-- | src/tools/irm/irm_bind.c | 87 |
1 files changed, 35 insertions, 52 deletions
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 <dimitri.staessens@intec.ugent.be> * Sander Vrijders <sander.vrijders@intec.ugent.be> * * 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); } |