From 47778ccd67cbb3fb70dda706911d3166038ca010 Mon Sep 17 00:00:00 2001 From: dautor Date: Sat, 16 Nov 2024 13:22:54 +0100 Subject: Import project --- src/module/module.c | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 src/module/module.c (limited to 'src/module/module.c') 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; +} -- cgit v1.2.3