diff options
author | Přemysl Janouch <p.janouch@gmail.com> | 2015-05-13 06:49:16 +0200 |
---|---|---|
committer | Přemysl Janouch <p.janouch@gmail.com> | 2015-05-13 06:49:16 +0200 |
commit | b2cc2709c6fcf8d3fdc123e6d926be2d02c1221f (patch) | |
tree | 0558310d35c425315bf4b4001febfb0c8ac87b80 | |
parent | 30997471e7826931717aaf26436e24568a4d7c3a (diff) | |
download | ponymap-b2cc2709c6fcf8d3fdc123e6d926be2d02c1221f.tar.gz ponymap-b2cc2709c6fcf8d3fdc123e6d926be2d02c1221f.tar.xz ponymap-b2cc2709c6fcf8d3fdc123e6d926be2d02c1221f.zip |
Add an option to list all services
-rw-r--r-- | ponymap.c | 42 |
1 files changed, 41 insertions, 1 deletions
@@ -323,6 +323,7 @@ static void on_generator_step_requested (struct app_context *ctx); struct app_context { struct str_map config; ///< User configuration + bool list_services; ///< Option flag, list all services unsigned connect_timeout; ///< Timeout for connect() in sec. unsigned scan_timeout; ///< Timeout for service scans in sec. @@ -1955,6 +1956,7 @@ parse_program_arguments (struct app_context *ctx, int argc, char **argv) "ports/port ranges, separated by commas" }, { 's', "service", "SERVICES", 0, "services to scan for, separated by commas" }, + { 'l', "list-services", NULL, 0, "list all known services" }, { 't', "connect-timeout", "TIMEOUT", 0, "timeout for connect, in seconds" " (default: " XSTRINGIFY (DEFAULT_CONNECT_TIMEOUT) ")" }, @@ -1974,6 +1976,7 @@ parse_program_arguments (struct app_context *ctx, int argc, char **argv) "{ ADDRESS [/MASK] }...", "Experimental network scanner."); int c; + bool need_no_args = false; while ((c = opt_handler_get (&oh)) != -1) switch (c) { @@ -1995,6 +1998,10 @@ parse_program_arguments (struct app_context *ctx, int argc, char **argv) if (!list_foreach (optarg, (list_foreach_fn) add_service, ctx)) exit (EXIT_FAILURE); break; + case 'l': + ctx->list_services = true; + need_no_args = true; + break; case 't': if (!xstrtoul (&ul, optarg, 10) || !ul) { @@ -2027,7 +2034,7 @@ parse_program_arguments (struct app_context *ctx, int argc, char **argv) argc -= optind; argv += optind; - if (!argc) + if (!need_no_args && !argc) { opt_handler_usage (&oh, stderr); exit (EXIT_FAILURE); @@ -2040,6 +2047,33 @@ parse_program_arguments (struct app_context *ctx, int argc, char **argv) opt_handler_free (&oh); } +static void +list_services (struct app_context *ctx) +{ + struct node *root = node_new (strdup ("Known services")); + struct node *s, **s_tail = &root->children; + root->bold = true; + + struct str_map_iter iter; + str_map_iter_init (&iter, &ctx->services); + struct service *service; + while ((service = str_map_iter_next (&iter))) + { + struct str line; + str_init (&line); + str_append (&line, service->name); + if (service->flags & SERVICE_SUPPORTS_TLS) + str_append (&line, " (supports TLS)"); + + *s_tail = s = node_new (str_steal (&line)); + s_tail = &s->next; + } + + node_print_tree (root); + node_delete (root); + putchar ('\n'); +} + int main (int argc, char *argv[]) { @@ -2086,6 +2120,12 @@ main (int argc, char *argv[]) if (!load_plugins (&ctx)) exit (EXIT_FAILURE); + if (ctx.list_services) + { + list_services (&ctx); + exit (EXIT_SUCCESS); + } + // TODO: make the order unimportant; this hopes all services support // the plain transport and that it is the first on the list initialize_tls (&ctx); |