diff options
Diffstat (limited to 'src/module')
| -rw-r--r-- | src/module/module.c | 126 | ||||
| -rw-r--r-- | src/module/module.h | 14 |
2 files changed, 140 insertions, 0 deletions
diff --git a/src/module/module.c b/src/module/module.c new file mode 100644 index 0000000..22f6142 --- /dev/null +++ b/src/module/module.c @@ -0,0 +1,126 @@ +#include "module.h" + +char const *Arg0; + +void __attribute__((noreturn)) usage(void) +{ + WARNINGS_IGNORE("-Wformat-nonliteral") + fprintf(stderr, Usage, Arg0); + WARNINGS_RESTORE + exit(EX_USAGE); +} + +static ucl_object_t * +Parse(char const *Arg) +{ + struct ucl_parser *Parser = ucl_parser_new(0); + if(ucl_parser_add_string(Parser, Arg, 0) == false) + { + fprintf(stderr, "Unable to parse state file: %s\n", ucl_parser_get_error(Parser)); + ucl_parser_free(Parser); + exit(EX_CONFIG); + } + ucl_object_t *root = ucl_parser_get_object(Parser); + ucl_parser_free(Parser); + return root; +} + +int +main(int ArgCount, char **Arg) +{ + Arg0 = Arg[0]; + int C; + while((C = getopt(ArgCount, Arg, "")) != -1) + { + switch(C) + { + case '?': + default: usage(); + } + } + ArgCount -= optind; + Arg += optind; + if(ArgCount == 0) usage(); + char const *Command = Arg[0]; + --ArgCount; + ++Arg; + int Result; + if(strcmp(Command, "start") == 0) + { + if(ArgCount != 2) usage(); + char const *Name = Arg[0]; + if(isprints(Name) == false) + { + fprintf(stderr, "Name is non-printable\n"); + return -1; + } + ucl_object_t *Configuration = Parse(Arg[1]); + Result = start(Name, Configuration); + ucl_object_unref(Configuration); + } else if(strcmp(Command, "stop") == 0) + { + if(ArgCount != 3) usage(); + char const *Name = Arg[0]; + if(isprints(Name) == false) + { + fprintf(stderr, "Name is non-printable\n"); + return -1; + } + ucl_object_t *Configuration = Parse(Arg[1]); + ucl_object_t *Data = Parse(Arg[2]); + Result = stop(Name, Configuration, Data); + ucl_object_unref(Configuration); + ucl_object_unref(Data); + } else if(strcmp(Command, "get-endpoint") == 0) + { + if(ArgCount != 4) usage(); + char const *Name = Arg[0]; + if(isprints(Name) == false) + { + fprintf(stderr, "Name is non-printable\n"); + return -1; + } + ucl_object_t *Configuration = Parse(Arg[1]); + ucl_object_t *Data = Parse(Arg[2]); + char const *Interface = Arg[3]; + Result = get_endpoint(Name, Configuration, Data, Interface); + ucl_object_unref(Configuration); + ucl_object_unref(Data); + } else if(strcmp(Command, "cmd") == 0) + { + if(ArgCount < 3) usage(); + char const *Name = Arg[0]; + if(isprints(Name) == false) + { + fprintf(stderr, "Name is non-printable\n"); + return -1; + } + ucl_object_t *Configuration = Parse(Arg[1]); + ucl_object_t *Data = Parse(Arg[2]); + Arg += 3; + ArgCount -= 3; + Result = cmd(Name, Configuration, Data, (size_t)ArgCount, Arg); + ucl_object_unref(Configuration); + ucl_object_unref(Data); + } else if(strcmp(Command, "mod") == 0) + { + if(ArgCount < 3) usage(); + char const *Name = Arg[0]; + if(isprints(Name) == false) + { + fprintf(stderr, "Name is non-printable\n"); + return -1; + } + ucl_object_t *Configuration = Parse(Arg[1]); + ucl_object_t *Data = Parse(Arg[2]); + Arg += 3; + ArgCount -= 3; + Result = mod(Name, Configuration, Data, (size_t)ArgCount, Arg); + ucl_object_unref(Configuration); + ucl_object_unref(Data); + } else + { + usage(); + } + return Result; +} diff --git a/src/module/module.h b/src/module/module.h new file mode 100644 index 0000000..c357faa --- /dev/null +++ b/src/module/module.h @@ -0,0 +1,14 @@ +#pragma once + +#include "../base.h" + +extern char const *Usage; +extern char const *Arg0; + +void __attribute__((noreturn)) usage(void); + +int start(char const *Name, ucl_object_t *Configuration); +int stop(char const *Name, ucl_object_t *Configuration, ucl_object_t *Data); +int get_endpoint(char const *Name, ucl_object_t *Configuration, ucl_object_t *Data, char const *Interface); +int cmd(char const *Name, ucl_object_t *Configuration, ucl_object_t *Data, size_t ArgCount, char **Arg); +int mod(char const *Name, ucl_object_t *Configuration, ucl_object_t *Data, size_t ArgCount, char **Arg); |
