/* * 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; } static char tok[1024]; if (!params->token) { if (!(params->token = getenv("ACRONC_TOKEN"))) { printf("Token: "); #ifdef _WIN32 scanf("%1023[^\r\n]", tok); #else scanf("%1023[^\n]", tok); #endif params->token = tok; } } return 0; }