diff --git a/includes/cli.h b/includes/cli.h index b4f673b..0b641d9 100644 --- a/includes/cli.h +++ b/includes/cli.h @@ -45,4 +45,7 @@ int cli_handle_ttl(const char *arg, t_ping_config *config); int cli_handle_version(const char *arg, t_ping_config *config); int cli_handle_verbose(const char *arg, t_ping_config *config); +int cli_parse_uint64(const char *s, uint64_t *out); +int cli_parse_float(const char *s, float *out); + #endif diff --git a/sources.mk b/sources.mk index b15435a..5fb000b 100644 --- a/sources.mk +++ b/sources.mk @@ -13,6 +13,8 @@ SRCS = $(SRC_DIR)/main.c \ $(SRC_DIR)/cli/handlers/handle_ttl.c \ $(SRC_DIR)/cli/handlers/handle_version.c \ $(SRC_DIR)/cli/handlers/handle_verbose.c \ + $(SRC_DIR)/cli/utils/parse_int.c \ + $(SRC_DIR)/cli/utils/parse_float.c TESTS_DIR = tests TESTS= $(TESTS_DIR)/test_main.c diff --git a/src/cli/handlers/handle_count.c b/src/cli/handlers/handle_count.c index 0a0029a..7f08a98 100644 --- a/src/cli/handlers/handle_count.c +++ b/src/cli/handlers/handle_count.c @@ -1,10 +1,22 @@ +#include +#include +#include + #include "cli.h" #include "ft_ping.h" int cli_handle_count(const char *arg, t_ping_config *config) { - (void)arg; - (void)config; + uint64_t count; + + if (0 != cli_parse_uint64(arg, &count)) + { + dprintf(STDERR_FILENO, "Invalide count\n"); + return CLI_ERROR; + } + + config->count = count; return CLI_SUCCESS; } + diff --git a/src/cli/handlers/handle_help.c b/src/cli/handlers/handle_help.c index d143a26..c5a3b1c 100644 --- a/src/cli/handlers/handle_help.c +++ b/src/cli/handlers/handle_help.c @@ -1,9 +1,10 @@ -#include "cli.h" -#include "ft_ping.h" #include #include #include +#include "cli.h" +#include "ft_ping.h" + /* Forward declarations */ static const char * option_arg_type_to_str(t_option_arg_type type); /* -------------------- */ diff --git a/src/cli/handlers/handle_interval.c b/src/cli/handlers/handle_interval.c index 804e434..99b6324 100644 --- a/src/cli/handlers/handle_interval.c +++ b/src/cli/handlers/handle_interval.c @@ -1,10 +1,20 @@ #include "cli.h" #include "ft_ping.h" +#include +#include + int cli_handle_interval(const char *arg, t_ping_config *config) { - (void)arg; - (void)config; + float interval; + + if (0 != cli_parse_float(arg, &interval)) + { + dprintf(STDERR_FILENO, "Invalide interval\n"); + return CLI_ERROR; + } + + config->interval = interval; return CLI_SUCCESS; } diff --git a/src/cli/handlers/handle_size.c b/src/cli/handlers/handle_size.c index 0b9ca05..914f925 100644 --- a/src/cli/handlers/handle_size.c +++ b/src/cli/handlers/handle_size.c @@ -1,10 +1,21 @@ #include "cli.h" #include "ft_ping.h" +#include +#include +#include + int cli_handle_size(const char *arg, t_ping_config *config) { - (void)arg; - (void)config; + uint64_t size; + + if (0 != cli_parse_uint64(arg, &size) || size > (65535 - 8)) + { + dprintf(STDERR_FILENO, "Invalide size\n"); + return CLI_ERROR; + } + + config->count = size; return CLI_SUCCESS; } diff --git a/src/cli/handlers/handle_timeout.c b/src/cli/handlers/handle_timeout.c index 6963523..be75aa5 100644 --- a/src/cli/handlers/handle_timeout.c +++ b/src/cli/handlers/handle_timeout.c @@ -1,10 +1,20 @@ #include "cli.h" #include "ft_ping.h" +#include +#include + int cli_handle_timeout(const char *arg, t_ping_config *config) { - (void)arg; - (void)config; + float TO; + + if (0 != cli_parse_float(arg, &TO)) + { + dprintf(STDERR_FILENO, "Invalide timeout\n"); + return CLI_ERROR; + } + + config->timeout = TO; return CLI_SUCCESS; } diff --git a/src/cli/handlers/handle_ttl.c b/src/cli/handlers/handle_ttl.c index 18f9eb5..1e16c82 100644 --- a/src/cli/handlers/handle_ttl.c +++ b/src/cli/handlers/handle_ttl.c @@ -1,10 +1,21 @@ #include "cli.h" #include "ft_ping.h" +#include +#include +#include + int cli_handle_ttl(const char *arg, t_ping_config *config) { - (void)arg; - (void)config; + uint64_t ttl; + + if (0 != cli_parse_uint64(arg, &ttl) || ttl > 255) + { + dprintf(STDERR_FILENO, "Invalide ttl\n"); + return CLI_ERROR; + } + + config->ttl = (uint8_t)ttl; return CLI_SUCCESS; } diff --git a/src/cli/handlers/handler_map.c b/src/cli/handlers/handler_map.c index e2911fd..2e20c4d 100644 --- a/src/cli/handlers/handler_map.c +++ b/src/cli/handlers/handler_map.c @@ -1,6 +1,6 @@ +#include #include "cli.h" -#include const t_option_descriptor g_options[] = { { diff --git a/src/cli/parse.c b/src/cli/parse.c index 7e011e9..ad16060 100644 --- a/src/cli/parse.c +++ b/src/cli/parse.c @@ -1,6 +1,7 @@ #include #include #include + #include "cli.h" #include "ft_ping.h" #include "ft_ping_const.h" diff --git a/src/cli/utils/parse_float.c b/src/cli/utils/parse_float.c new file mode 100644 index 0000000..ef9c55c --- /dev/null +++ b/src/cli/utils/parse_float.c @@ -0,0 +1,22 @@ +#include +#include +#include +#include + +int +cli_parse_float(const char *s, float *out) +{ + char *end; + + if (NULL == s || '\0' == *s || '-' == *s) + return 1; + + errno = 0; + float v = strtof(s, &end); + + if (s == end || ERANGE == errno || '\0' != *end || 0 == isfinite(v)) + return 1; + + *out = v; + return 0; +} diff --git a/src/cli/utils/parse_int.c b/src/cli/utils/parse_int.c new file mode 100644 index 0000000..182010d --- /dev/null +++ b/src/cli/utils/parse_int.c @@ -0,0 +1,22 @@ +#include +#include +#include +#include + +int +cli_parse_uint64(const char *s, uint64_t *out) +{ + char *end; + + if ( NULL == s || '\0' == *s || '-' == *s) + return 1; + + errno = 0; + const uintmax_t v =(uintmax_t)strtoumax(s, &end, 10); + + if (s == end || ERANGE == errno || '\0' != *end || v > UINT64_MAX) + return 1; + + *out = (uint64_t)v; + return 0; +}