diff options
Diffstat (limited to 'src/core/cmdline.c')
-rw-r--r-- | src/core/cmdline.c | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/src/core/cmdline.c b/src/core/cmdline.c new file mode 100644 index 0000000..b37e1d7 --- /dev/null +++ b/src/core/cmdline.c @@ -0,0 +1,122 @@ +/* BSD-2-Clause license + * + * Copyright (c) 2018-2023 NST <www.newinfosec.ru>, sss <sss at dark-alexandr dot net>. + * + */ + +#include <getopt.h> +#include <limits.h> +#include <stdbool.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "config_file.h" +#include "globals.h" + +static void +print_help(const char *prog_path) +{ + printf("Usage: %s [-c:d....]\nOptions:\n" + "\t-c\t--config_file\t\"Use settings from" + " specified file instead of default config file\"\n" + "\t-d\t--daemon\t\"Daemon mode (fork to background)\"\n" + "\t--http_port\t\"Set port for http/ws server\"\n" + "\t--help\t\"Print tthis help message\"\n", + prog_path); + exit(EXIT_FAILURE); +} + +void +handle_cmdline_args(int argc, char **argv) +{ + int c; + char config_file_path[_POSIX_PATH_MAX] = {0}; + bool daemon = false, wrong_options = false; + while (1) + { + int option_index = 0; + static struct option long_options[] = { + {"config_file", required_argument, 0, 0}, + {"daemon", no_argument, 0, 0}, + {"ws_port", required_argument, 0, 0}, + {"help", no_argument, 0, 0} + }; + c = getopt_long( + argc, argv, "c:dp:", long_options, &option_index); + if (c == -1) + break; + switch (c) + { + case 0: + { + if (!strcmp(long_options[option_index].name, + "config_file") + && optarg) + { + strncpy(config_file_path, optarg, + _POSIX_PATH_MAX - 1); + config_file_path[_POSIX_PATH_MAX - 1] + = 0; + } + else if (!strcmp( + long_options[option_index].name, + "ws_port") + && optarg) + g_globals.settings.ws_port + = atoi(optarg); + else if (!strcmp( + long_options[option_index].name, + "daemon")) + daemon = true; + else if (!strcmp( + long_options[option_index].name, + "help")) + print_help(argv[0]); + } + break; + case 'c': + { + if (optarg) //clang static analyzer... + { + strncpy(config_file_path, optarg, + _POSIX_PATH_MAX - 1); + config_file_path[_POSIX_PATH_MAX - 1] + = 0; + } + } + break; + case 'p': + { + if (optarg) //clang static analyzer... + { + g_globals.settings.ws_port + = atoi(optarg); + } + } + break; + case 'd': + { + daemon = true; + } + break; + case '?': + { + wrong_options = true; + } + break; + default: + break; + } + } + if (wrong_options) + { + print_help(argv[0]); + } + else + { + g_globals.settings.daemon = daemon; + find_config_file(config_file_path); + } +} |