diff options
author | Trumeet <yuuta@yuuta.moe> | 2022-07-26 17:36:20 -0700 |
---|---|---|
committer | Trumeet <yuuta@yuuta.moe> | 2022-07-26 17:36:20 -0700 |
commit | 7099a86ca74fa637f26af38674f80fb8efd5f6fa (patch) | |
tree | 33315c65e82170476cf3c80d976dfa4d16a304a3 /client/acronc/config.c | |
parent | 8b07bf593e54dd876e30d0cb1c7c7226d0d1b1e2 (diff) | |
download | acron-7099a86ca74fa637f26af38674f80fb8efd5f6fa.tar acron-7099a86ca74fa637f26af38674f80fb8efd5f6fa.tar.gz acron-7099a86ca74fa637f26af38674f80fb8efd5f6fa.tar.bz2 acron-7099a86ca74fa637f26af38674f80fb8efd5f6fa.zip |
refactor(libacron/acronc/helloworld): move to separate directories
The corresponding CMakeLists.txt files are still rough.
Diffstat (limited to 'client/acronc/config.c')
-rw-r--r-- | client/acronc/config.c | 100 |
1 files changed, 100 insertions, 0 deletions
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 <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 = ¶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 |