aboutsummaryrefslogtreecommitdiff
path: root/client/libacron/apps/acronc/config.c
diff options
context:
space:
mode:
Diffstat (limited to 'client/libacron/apps/acronc/config.c')
-rw-r--r--client/libacron/apps/acronc/config.c100
1 files changed, 100 insertions, 0 deletions
diff --git a/client/libacron/apps/acronc/config.c b/client/libacron/apps/acronc/config.c
new file mode 100644
index 0000000..046d931
--- /dev/null
+++ b/client/libacron/apps/acronc/config.c
@@ -0,0 +1,100 @@
+/*
+ * Created by yuuta on 7/24/22.
+ */
+
+#include "config.h"
+
+#include <libac.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+int config_parse(const int argc, const char **argv, ac_connection_parameters_t *params) {
+ if (argc <= 1) {
+ fprintf(stderr, "Usage: %s [-t token] [-p port] <ID>@<server>\n"
+ "Please refer to acronc(1) for more details.\n",
+ argv[0] ? "acronc" : argv[0]);
+ return 64;
+ }
+ bool svr_set = false;
+ for (int i = 1; i < argc; i++) {
+ const char *arg = argv[i];
+ if (arg[0] != '-') {
+ if (svr_set) {
+ fprintf(stderr, "Unexpected value: %s\n", arg);
+ return 64;
+ }
+ const char *id = strtok((char *) arg, "@");
+ if (!id) {
+ fprintf(stderr, "Malformed argument: should be ID@server.\n");
+ return 64;
+ }
+ const char *server = strtok(NULL, "");
+ if (!server) {
+ fprintf(stderr, "Malformed argument: should be ID@server.\n");
+ return 64;
+ }
+ params->host = (char *) server;
+ params->id = (char *) id;
+ svr_set = true;
+ continue;
+ }
+ char a = arg[1];
+ char **value_ptr;
+ char *port_str = NULL;
+ switch (a) {
+ case 't': {
+ value_ptr = &params->token;
+ goto read_value;
+ }
+ case 'p': {
+ value_ptr = &port_str;
+ goto read_value;
+ }
+ default: {
+ fprintf(stderr, "Unexpected switch -%c.\n", a);
+ return 64;
+ }
+ }
+ read_value:
+ {
+ if (i == (argc - 1)) {
+ fprintf(stderr, "-%c requires an argument.\n", a);
+ return 64;
+ }
+ *value_ptr = (char *) argv[++i];
+ }
+ if (port_str) {
+ errno = 0;
+ char *endptr;
+ unsigned long val = strtol(port_str, &endptr, 0);
+ if (errno) {
+ const int e = errno;
+ fprintf(stderr, "Cannot parse port: %s", strerror(e));
+ return e;
+ }
+ if (endptr == port_str) {
+ fprintf(stderr, "Illegal port.\n");
+ return 64;
+ }
+ if (val > UINT16_MAX) {
+ fprintf(stderr, "Illegal port.\n");
+ return 64;
+ }
+ params->port = (uint16_t) val;
+ port_str = NULL;
+ }
+ }
+ if (!params->host || !params->id) {
+ fprintf(stderr, "Usage: acronc ID@server[:port]\n");
+ return 64;
+ }
+ char tok[1024];
+ if (!params->token) {
+ printf("Token: ");
+ scanf("%1023[^\n]", tok);
+ params->token = tok;
+ }
+ return 0;
+} \ No newline at end of file