summaryrefslogtreecommitdiff
path: root/src/module/module.c
diff options
context:
space:
mode:
authordautor <karlo98.m@gmail.com>2024-11-16 13:22:54 +0100
committerdautor <karlo98.m@gmail.com>2024-11-16 17:54:38 +0100
commit47778ccd67cbb3fb70dda706911d3166038ca010 (patch)
tree906bf0537d14f5ce8e2528736fb89a3499ada214 /src/module/module.c
Import project
Diffstat (limited to 'src/module/module.c')
-rw-r--r--src/module/module.c126
1 files changed, 126 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;
+}