From bed729e8e1de1261e43c62b9581a37f19b9de7e1 Mon Sep 17 00:00:00 2001 From: starnakin Date: Tue, 16 Dec 2025 08:22:35 -0600 Subject: [PATCH] add: description to paring struct && create setting.c --- src/main.c | 64 ------------------------------------------------- src/parsing.h | 1 + src/setting.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/setting.h | 2 ++ 4 files changed, 69 insertions(+), 64 deletions(-) create mode 100644 src/setting.c diff --git a/src/main.c b/src/main.c index 8dded6a..a580056 100644 --- a/src/main.c +++ b/src/main.c @@ -1,7 +1,6 @@ #include "dns.h" #include "host.h" #include "packet.h" -#include "parsing.h" #include "print.h" #include "setting.h" #include "statistics.h" @@ -26,7 +25,6 @@ #include #include #include -#include #include bool loop = true; @@ -37,68 +35,6 @@ static void signal_handler(int code) loop = false; } -static int parsing_number(const char *str, size_t min, size_t max, size_t *out) -{ - size_t number = 0; - const char *start = str; - - while (*start != '\0') - { - if (!isdigit(*start)) - goto value_error; - size_t tmp = number * 10 + *start - '0'; - if (tmp < number) - goto range_error; - number = tmp; - start++; - } - - if (min > number || number > max) - goto range_error; - - *out = number; - - return 0; - -range_error: - print_err("invalid argument: '%s': out of range: %zu <= value <= %zu", str, min, max); - return 1; - -value_error: - print_err("invalid argument: in '%s' '%c' is not a digit", str, *start); - return 2; -} - -static int get_setting(char * const *av, struct setting *settings) -{ - struct param parameters[] = { - {NULL, "?", OPTION, false}, - {NULL, "v", OPTION, false}, - {NULL, "n", OPTION, false}, - {"ttl", NULL, ARGUMENT, "116"}, - {NULL, "s", ARGUMENT, "56"}, - {NULL, "p", ARGUMENT, "0"}, - {NULL, NULL, 0, NULL}, - }; - char *hostname = parsing(av, parameters); - if (hostname == NULL) - return 1; - settings->dest.hostname = hostname; - - settings->help = parameters[0].value; - settings->verbose = parameters[1].value; - settings->numeric_only = parameters[2].value; - size_t ttl; - if (parsing_number(parameters[3].value, 1, 255, &ttl)) - return 2; - settings->ttl = ttl; - if (parsing_number(parameters[4].value, 0, 2147483647, &settings->payload_size)) - return 3; - if (parsing_number(parameters[5].value, 0, 2147483647, &settings->preload)) - return 4; - return 0; -} - static int create_socket(struct setting const *settings) { int ret; diff --git a/src/parsing.h b/src/parsing.h index 1d7971f..8e5465a 100644 --- a/src/parsing.h +++ b/src/parsing.h @@ -10,6 +10,7 @@ struct param { const char *alias; e_type type; void *value; + const char *desc; }; char *parsing(char * const *av, struct param parameters[]); \ No newline at end of file diff --git a/src/setting.c b/src/setting.c new file mode 100644 index 0000000..ba6a013 --- /dev/null +++ b/src/setting.c @@ -0,0 +1,66 @@ +#include "setting.h" +#include "parsing.h" +#include "print.h" +#include + +static int parsing_number(const char *str, size_t min, size_t max, size_t *out) +{ + size_t number = 0; + const char *start = str; + + while (*start != '\0') + { + if (!isdigit(*start)) + goto value_error; + size_t tmp = number * 10 + *start - '0'; + if (tmp < number) + goto range_error; + number = tmp; + start++; + } + + if (min > number || number > max) + goto range_error; + + *out = number; + + return 0; + +range_error: + print_err("invalid argument: '%s': out of range: %zu <= value <= %zu", str, min, max); + return 1; + +value_error: + print_err("invalid argument: in '%s' '%c' is not a digit", str, *start); + return 2; +} + +int get_setting(char * const *av, struct setting *settings) +{ + struct param parameters[] = { + {NULL, "?", OPTION, false, "Display help"}, + {NULL, "v", OPTION, false, "Set verbose"}, + {NULL, "n", OPTION, false, "Numeric only, display only host ip"}, + {"ttl", NULL, ARGUMENT, "116", "Change ttl (defautl=116)"}, + {NULL, "s", ARGUMENT, "56", "send packets before get recv"}, + {NULL, "p", ARGUMENT, "0", "send packet with a specific payload size"}, + {NULL, NULL, 0, NULL, NULL}, + }; + char *hostname = parsing(av, parameters); + if (hostname == NULL) + return 1; + settings->dest.hostname = hostname; + + settings->help = parameters[0].value; + settings->verbose = parameters[1].value; + settings->numeric_only = parameters[2].value; + size_t ttl; + if (parsing_number(parameters[3].value, 1, 255, &ttl)) + return 2; + settings->ttl = ttl; + if (parsing_number(parameters[4].value, 0, 2147483647, &settings->payload_size)) + return 3; + if (parsing_number(parameters[5].value, 0, 2147483647, &settings->preload)) + return 4; + return 0; +} \ No newline at end of file diff --git a/src/setting.h b/src/setting.h index e35b925..23b1276 100644 --- a/src/setting.h +++ b/src/setting.h @@ -18,3 +18,5 @@ struct setting struct hostenv dest; size_t preload; }; + +int get_setting(char * const *av, struct setting *settings); \ No newline at end of file