diff --git a/includes/cli.h b/includes/cli.h new file mode 100644 index 0000000..73df681 --- /dev/null +++ b/includes/cli.h @@ -0,0 +1,19 @@ +#ifndef PING_CLI_H +#define PING_CLI_H + +#include "ft_ping.h" + +typedef int (*t_option_handler)(const char *arg, t_ping_config *config); + +int cli_handle_count(const char *arg, t_ping_config *config); +int cli_handle_flood(const char *arg, t_ping_config *config); +int cli_handle_help(const char *arg, t_ping_config *config); +int cli_handle_interval(const char *arg, t_ping_config *config); +int cli_handle_quiet(const char *arg, t_ping_config *config); +int cli_handle_size(const char *arg, t_ping_config *config); +int cli_handle_timeout(const char *arg, t_ping_config *config); +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); + +#endif diff --git a/includes/ft_ping.h b/includes/ft_ping.h new file mode 100644 index 0000000..4dfc751 --- /dev/null +++ b/includes/ft_ping.h @@ -0,0 +1,26 @@ +#ifndef FT_PING +#define FT_PING + +#include +#include + +typedef struct s_ping_config +{ + /* Target */ + char *destination; + + /* Options */ + uint64_t count; + double interval; + uint8_t ttl; + size_t packet_size; + double timeout; + + /* Flags */ + uint8_t flags; +} t_ping_config; + +int cli_parse_arguments(int argc, char **argv, t_ping_config *config); + + +#endif diff --git a/includes/ft_ping_const.h b/includes/ft_ping_const.h new file mode 100644 index 0000000..ffedf65 --- /dev/null +++ b/includes/ft_ping_const.h @@ -0,0 +1,15 @@ +#ifndef FT_PING_CONST +#define FT_PING_CONST + +/* Default configuration values */ +#define DEFAULT_COUNT 0 +#define DEFAULT_INTERVAL 1.0 +#define DEFAULT_TTL 64 +#define DEFAULT_PACKET_SIZE 56 +#define DEFAULT_TIMEOUT 1.0 + +/* Maximum values */ +#define MAX_PACKET_SIZE 65507 +#define MAX_TTL 255 + +#endif diff --git a/includes/ft_ping_flags.h b/includes/ft_ping_flags.h new file mode 100644 index 0000000..493917e --- /dev/null +++ b/includes/ft_ping_flags.h @@ -0,0 +1,13 @@ +#ifndef FT_PING_FLAGS +#define FT_PING_FLAGS + +#define FLAG_VERBOSE (1 << 0) +#define FLAG_QUIET (1 << 1) +#define FLAG_FLOOD (1 << 2) + +#define HAS_FLAG(flags, flag) ((flags) & (flag)) +#define SET_FLAG(flags, flag) ((flags) |= (flag)) +#define CLEAR_FLAG(flags, flag) ((flags) &= ~(flag)) +#define TOGGLE_FLAG(flags, flag) ((flags) ^= (flag)) + +#endif diff --git a/sources.mk b/sources.mk index 47b8ad4..f7a465a 100644 --- a/sources.mk +++ b/sources.mk @@ -1,6 +1,18 @@ SRC_DIR = srcs -SRCS = $(SRC_DIR)/main.c +SRCS = $(SRC_DIR)/main.c \ + $(SRC_DIR)/cli/parse.c \ + $(SRC_DIR)/cli/handlers/handle_count.c \ + $(SRC_DIR)/cli/handlers/handle_flood.c \ + $(SRC_DIR)/cli/handlers/handle_help.c \ + $(SRC_DIR)/cli/handlers/handle_interval.c \ + $(SRC_DIR)/cli/handlers/handle_quit.c \ + $(SRC_DIR)/cli/handlers/handler_map.c \ + $(SRC_DIR)/cli/handlers/handle_size.c \ + $(SRC_DIR)/cli/handlers/handle_timeout.c \ + $(SRC_DIR)/cli/handlers/handle_ttl.c \ + $(SRC_DIR)/cli/handlers/handle_version.c \ + $(SRC_DIR)/cli/handlers/hanlde_verbose.c \ TESTS_DIR = tests TESTS= $(TESTS_DIR)/test_main.c diff --git a/srcs/cli/handlers/handle_count.c b/srcs/cli/handlers/handle_count.c new file mode 100644 index 0000000..b182951 --- /dev/null +++ b/srcs/cli/handlers/handle_count.c @@ -0,0 +1,9 @@ +#include "ft_ping.h" + +int +cli_handle_count(const char *arg, t_ping_config *config) +{ + (void)arg; + (void)config; + return 0; +} diff --git a/srcs/cli/handlers/handle_flood.c b/srcs/cli/handlers/handle_flood.c new file mode 100644 index 0000000..c5c0d78 --- /dev/null +++ b/srcs/cli/handlers/handle_flood.c @@ -0,0 +1,9 @@ +#include "ft_ping.h" + +int +cli_handle_flood(const char *arg, t_ping_config *config) +{ + (void)arg; + (void)config; + return 0; +} diff --git a/srcs/cli/handlers/handle_help.c b/srcs/cli/handlers/handle_help.c new file mode 100644 index 0000000..02efcf4 --- /dev/null +++ b/srcs/cli/handlers/handle_help.c @@ -0,0 +1,9 @@ +#include "ft_ping.h" + +int +cli_handle_help(const char *arg, t_ping_config *config) +{ + (void)arg; + (void)config; + return 1; +} diff --git a/srcs/cli/handlers/handle_interval.c b/srcs/cli/handlers/handle_interval.c new file mode 100644 index 0000000..beccd9d --- /dev/null +++ b/srcs/cli/handlers/handle_interval.c @@ -0,0 +1,9 @@ +#include "ft_ping.h" + +int +cli_handle_interval(const char *arg, t_ping_config *config) +{ + (void)arg; + (void)config; + return 0; +} diff --git a/srcs/cli/handlers/handle_quit.c b/srcs/cli/handlers/handle_quit.c new file mode 100644 index 0000000..dc3eb1d --- /dev/null +++ b/srcs/cli/handlers/handle_quit.c @@ -0,0 +1,9 @@ +#include "ft_ping.h" + +int +cli_handle_quiet(const char *arg, t_ping_config *config) +{ + (void)arg; + (void)config; + return 0; +} diff --git a/srcs/cli/handlers/handle_size.c b/srcs/cli/handlers/handle_size.c new file mode 100644 index 0000000..a5edb58 --- /dev/null +++ b/srcs/cli/handlers/handle_size.c @@ -0,0 +1,9 @@ +#include "ft_ping.h" + +int +cli_handle_size(const char *arg, t_ping_config *config) +{ + (void)arg; + (void)config; + return 0; +} diff --git a/srcs/cli/handlers/handle_timeout.c b/srcs/cli/handlers/handle_timeout.c new file mode 100644 index 0000000..76740ad --- /dev/null +++ b/srcs/cli/handlers/handle_timeout.c @@ -0,0 +1,9 @@ +#include "ft_ping.h" + +int +cli_handle_timeout(const char *arg, t_ping_config *config) +{ + (void)arg; + (void)config; + return 0; +} diff --git a/srcs/cli/handlers/handle_ttl.c b/srcs/cli/handlers/handle_ttl.c new file mode 100644 index 0000000..c7ee5a1 --- /dev/null +++ b/srcs/cli/handlers/handle_ttl.c @@ -0,0 +1,9 @@ +#include "ft_ping.h" + +int +cli_handle_ttl(const char *arg, t_ping_config *config) +{ + (void)arg; + (void)config; + return 0; +} diff --git a/srcs/cli/handlers/handle_version.c b/srcs/cli/handlers/handle_version.c new file mode 100644 index 0000000..d83efb5 --- /dev/null +++ b/srcs/cli/handlers/handle_version.c @@ -0,0 +1,9 @@ +#include "ft_ping.h" + +int +cli_handle_version(const char *arg, t_ping_config *config) +{ + (void)arg; + (void)config; + return 1; +} diff --git a/srcs/cli/handlers/handler_map.c b/srcs/cli/handlers/handler_map.c new file mode 100644 index 0000000..1d7ab09 --- /dev/null +++ b/srcs/cli/handlers/handler_map.c @@ -0,0 +1,26 @@ + +#include "cli.h" +#include + +typedef struct s_option_descriptor +{ + int short_opt; + const char *long_opt; + int has_arg; + t_option_handler handler; + const char *description; +} t_option_descriptor; + +const t_option_descriptor g_options[] = { + {'h', "help", no_argument, cli_handle_help, "Display this help and exit"}, + {'V', "version", no_argument, cli_handle_version, "Display version information and exit"}, + {'v', "verbose", no_argument, cli_handle_verbose, "Verbose output"}, + {'q', "quiet", no_argument, cli_handle_quiet, "Quiet mode (only show summary)"}, + {'c', "count", required_argument, cli_handle_count, "Stop after sending N packets"}, + {'i', "interval", required_argument, cli_handle_interval, "Wait N seconds between packets"}, + {'t', "ttl", required_argument, cli_handle_ttl, "Set Time To Live"}, + {'s', "size", required_argument, cli_handle_size, "Packet size in bytes"}, + {'W', "timeout", required_argument, cli_handle_timeout, "Timeout for replies in seconds"}, + {'f', "flood", no_argument, cli_handle_flood, "Flood mode"}, + {0, NULL, 0, NULL, NULL} +}; diff --git a/srcs/cli/handlers/hanlde_verbose.c b/srcs/cli/handlers/hanlde_verbose.c new file mode 100644 index 0000000..0a25212 --- /dev/null +++ b/srcs/cli/handlers/hanlde_verbose.c @@ -0,0 +1,9 @@ +#include "ft_ping.h" + +int +cli_handle_verbose(const char *arg, t_ping_config *config) +{ + (void)arg; + (void)config; + return 0; +} diff --git a/srcs/cli/parse.c b/srcs/cli/parse.c new file mode 100644 index 0000000..18438be --- /dev/null +++ b/srcs/cli/parse.c @@ -0,0 +1,29 @@ +#include +#include +#include "ft_ping.h" +#include "ft_ping_const.h" + +/* Forward declatation */ +static void init_config(t_ping_config *config); +/* ------------------- */ + +int +cli_parse_arguments(int argc, char **argv, t_ping_config *config) +{ + (void)argc; + (void)argv; + init_config(config); + return 0; +} + +static void +init_config(t_ping_config *config) +{ + memset(config, 0, sizeof(t_ping_config)); + config->count = DEFAULT_COUNT; + config->interval = DEFAULT_INTERVAL; + config->ttl = DEFAULT_TTL; + config->packet_size = DEFAULT_PACKET_SIZE; + config->timeout = DEFAULT_TIMEOUT; +} + diff --git a/srcs/main.c b/srcs/main.c index 1bfb734..4483461 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -1,6 +1,18 @@ +#include +#include +#include "ft_ping.h" int -main(void) +main(int argc, char **argv) { - return 0; + t_ping_config config; + int ret; + + ret = cli_parse_arguments(argc, argv, &config); + if (ret != 0) + return (ret < 0) ? EXIT_FAILURE : EXIT_SUCCESS; + + printf("PING: Not yet implemented\n"); + + return EXIT_SUCCESS; }