diff options
author | dimitri staessens <dimitri.staessens@intec.ugent.be> | 2016-06-13 13:48:17 +0200 |
---|---|---|
committer | dimitri staessens <dimitri.staessens@intec.ugent.be> | 2016-06-13 13:48:17 +0200 |
commit | 7834e92b218da69cd934679dec9c2d714d89d15e (patch) | |
tree | e2174dd2810a20e90050481e2fd54ce61e414baf /src/tools/irm/irm_register.c | |
parent | ddfc7091d2698d36c1cfec49eaaad96b278bb37b (diff) | |
download | ouroboros-7834e92b218da69cd934679dec9c2d714d89d15e.tar.gz ouroboros-7834e92b218da69cd934679dec9c2d714d89d15e.zip |
lib, irmd, tools, ipcpd: updates to dev API.
The registration function has been moved to the irm tool, applications
now need to be registered by an administrator. Currently only supports
one instance per registered name, and an AP can be registered under
only one name.
The irmd can now start a registered server application on demand.
For the full functionality of the tool, execute "irm register".
AP name removed from flow allocation. Flow allocation does not send
the source ap name as it is quite useless. The accept() call now only
returns the AE name.
Diffstat (limited to 'src/tools/irm/irm_register.c')
-rw-r--r-- | src/tools/irm/irm_register.c | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/src/tools/irm/irm_register.c b/src/tools/irm/irm_register.c new file mode 100644 index 00000000..67c81025 --- /dev/null +++ b/src/tools/irm/irm_register.c @@ -0,0 +1,123 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Register AP's in DIFs + * + * 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 + * 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 <ouroboros/config.h> +#include <stdio.h> +#include <ouroboros/irm.h> +#include <ouroboros/common.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <sys/types.h> +#include <signal.h> + +#include "irm_ops.h" +#include "irm_utils.h" + +#define MAX_DIFS 128 + +static void usage() +{ + printf("Usage: irm register\n" + " n <name>\n" + " apn <application process name>\n" + " [api <application instance id>]\n" + " [auto] (instantiate apn if not running)\n" + " [dif <dif name to register with>]\n" + " [... (maximum %d difs)]\n" + " [-- <application arguments>]\n" + , MAX_DIFS); +} + + +int do_register(int argc, char ** argv) +{ + char * name = NULL; + char ** args = NULL; + char * difs[MAX_DIFS]; + size_t difs_len = 0; + bool api_opt = false; + bool args_opt = false; + bool autoexec = false; + int i = argc; + + instance_name_t api = {NULL, 0}; + + while (i > 0) { + if (matches(*argv, "name") == 0) { + name = *(argv + 1); + } else if (matches(*argv, "apn") == 0) { + api.name = *(argv + 1); + } else if (matches(*argv, "api") == 0) { + api.id = atoi(*(argv + 1)); + api_opt = true; + } else if (strcmp(*argv, "auto") == 0) { + autoexec = true; + ++i; + --argv; + } else if (strcmp(*argv, "--") == 0) { + ++argv; + --i; + args_opt = true; + break; + } else if (matches(*argv, "dif") == 0) { + difs[difs_len++] = *(argv + 1); + if (difs_len > MAX_DIFS) { + printf("Too many difs specified\n"); + return -1; + } + } else { + printf("\"%s\" is unknown, try \"irm " + "register\".\n", *argv); + return -1; + } + + i -= 2; + argv += 2; + } + + if (name == NULL || api.name == NULL) { + usage(); + return -1; + } + + if (api_opt && kill(api.id, 0) < 0) { + printf("No application running with that pid."); + return -1; + } + + if (api_opt && autoexec) { + printf("Instance is given, auto disabled.\n"); + autoexec = false; + } + + args = argv; + + if (args_opt && api_opt) { + printf("Instance is given, args ignored.\n"); + args = NULL; + i = 0; + } + + return irm_reg(name, &api, i, args, autoexec, difs, difs_len); +} |