From 7099a86ca74fa637f26af38674f80fb8efd5f6fa Mon Sep 17 00:00:00 2001 From: Trumeet Date: Tue, 26 Jul 2022 17:36:20 -0700 Subject: refactor(libacron/acronc/helloworld): move to separate directories The corresponding CMakeLists.txt files are still rough. --- client/acronc/config.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 client/acronc/config.c (limited to 'client/acronc/config.c') diff --git a/client/acronc/config.c b/client/acronc/config.c new file mode 100644 index 0000000..046d931 --- /dev/null +++ b/client/acronc/config.c @@ -0,0 +1,100 @@ +/* + * Created by yuuta on 7/24/22. + */ + +#include "config.h" + +#include +#include +#include +#include +#include + +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] @\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 = ¶ms->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 -- cgit v1.2.3