diff --git a/includes/internal/cli/interactive.h b/includes/internal/cli/interactive.h new file mode 100644 index 0000000..77f7503 --- /dev/null +++ b/includes/internal/cli/interactive.h @@ -0,0 +1,8 @@ +#ifndef FT_SSL_INTERACTIVE_H +#define FT_SSL_INTERACTIVE_H + +#include + +enum cli_code run_interactive(void); + +#endif diff --git a/src/Makefile.am b/src/Makefile.am index 2d348e3..217dbfd 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -48,6 +48,7 @@ ft_ssl_SOURCES = \ ssl/digest.c \ ssl/output.c \ cli/parse.c \ + cli/interactive.c \ cli/handlers/option_map.c \ cli/handlers/handle_help.c \ cli/handlers/handle_version.c \ diff --git a/src/cli/interactive.c b/src/cli/interactive.c new file mode 100644 index 0000000..f5a7d3d --- /dev/null +++ b/src/cli/interactive.c @@ -0,0 +1,83 @@ +#include +#include +#include + +#include +#include + +#include "ft_ssl.h" +#include "internal/cli/interactive.h" + +#define INTERACTIVE_BUFSIZ 4096 + +static const struct digest_algo * const s_algos[] = { +#define DIGEST_ALGO(lower, ds, bs) &g_##lower, +#include +#undef DIGEST_ALGO + NULL +}; + +static const struct digest_algo *find_algo(const char *name); +static void print_available(void); + +enum cli_code +run_interactive(void) +{ + char buf[INTERACTIVE_BUFSIZ]; + char *sep; + const struct digest_algo *algo; + struct ssl_config config; + + while (fgets(buf, (int)sizeof(buf), stdin)) + { + buf[strcspn(buf, "\n")] = '\0'; + if (buf[0] == '\0') + continue; + sep = buf; + while (*sep && *sep != ' ' && *sep != '\t') + sep++; + if (*sep) + { + *sep = '\0'; + sep++; + while (*sep == ' ' || *sep == '\t') + sep++; + } + algo = find_algo(buf); + if (!algo) + { + fprintf(stderr, "ft_ssl: unknown command -- '%s'\n", buf); + print_available(); + continue; + } + memset(&config, 0, sizeof(config)); + config.algo = algo; + config.string = (*sep != '\0') ? sep : NULL; + ssl_run(&config); + } + return CLI_EXIT_SUCCESS; +} + +static const struct digest_algo * +find_algo(const char *name) +{ + size_t i; + + for (i = 0; s_algos[i]; i++) + { + if (strcmp(s_algos[i]->name, name) == 0) + return s_algos[i]; + } + return NULL; +} + +static void +print_available(void) +{ + size_t i; + + fprintf(stderr, "available commands:"); + for (i = 0; s_algos[i]; i++) + fprintf(stderr, " %s", s_algos[i]->name); + fprintf(stderr, "\n"); +} diff --git a/src/cli/parse.c b/src/cli/parse.c index 7c92d3f..cfac06b 100644 --- a/src/cli/parse.c +++ b/src/cli/parse.c @@ -7,6 +7,7 @@ #include "ft_ssl.h" #include "internal/cli/cli_handlers.h" +#include "internal/cli/interactive.h" #include "internal/cli/option.h" /* Forward declarations */ @@ -43,11 +44,7 @@ parse_subcommand(int argc, char **argv, int first_arg, struct ssl_config *config) { if (first_arg >= argc) - { - fprintf(stderr, "%s: missing command\n", argv[0]); - print_usage(argv[0]); - return CLI_ERROR; - } + return run_interactive(); config->algo = find_algo(argv[first_arg]); if (NULL == config->algo) {