diff --git a/adsbus.c b/adsbus.c index 3430a21..d91dc94 100644 --- a/adsbus.c +++ b/adsbus.c @@ -14,18 +14,9 @@ #include "stats.h" -static bool add_dump(char *format) { - struct serializer *serializer = client_get_serializer(format); - if (!serializer) { - fprintf(stderr, "Unknown dump format: %s\n", format); - return false; - } - client_add(1, serializer); - return true; -} - static void print_usage(char *argv[]) { fprintf(stderr, + "\n" "Usage: %s [OPTION]...\n" "\n" "Options:\n" @@ -35,6 +26,65 @@ static void print_usage(char *argv[]) { "\t--incoming=[HOST/]PORT\n" "\t--listen=FORMAT=[HOST/]PORT\n" , argv[0]); + backend_print_usage(); + client_print_usage(); +} + +static bool add_dump(char *arg) { + struct serializer *serializer = client_get_serializer(arg); + if (!serializer) { + fprintf(stderr, "Unknown --dump=FORMAT: %s\n", arg); + return false; + } + client_add(1, serializer); + return true; +} + +static bool add_backend(char *arg) { + char *port = strrchr(arg, '/'); + if (!port) { + fprintf(stderr, "Invalid --backend=HOST/PORT (missing \"/\"): %s\n", arg); + return false; + } + *(port++) = '\0'; + + backend_new(arg, port); + return true; +} + +static bool add_incoming(char *arg){ + char *port = strrchr(arg, '/'); + if (port) { + *(port++) = '\0'; + incoming_new(arg, port, backend_new_fd, NULL); + } else { + incoming_new(NULL, arg, backend_new_fd, NULL); + } + return true; +} + +static bool add_listener(char *arg) { + char *host_port = strchr(arg, '='); + if (!host_port) { + fprintf(stderr, "Invalid --listener=FORMAT=[HOST/]PORT (missing \"=\"): %s\n", arg); + return false; + } + *(host_port++) = '\0'; + + struct serializer *serializer = client_get_serializer(arg); + if (!serializer) { + fprintf(stderr, "Unknown --listener=FORMAT=[HOST/]PORT format: %s\n", arg); + return false; + } + + char *port = strrchr(host_port, '/'); + if (port) { + *(port++) = '\0'; + incoming_new(host_port, port, client_add_wrapper, serializer); + } else { + incoming_new(NULL, host_port, client_add_wrapper, serializer); + } + return true; } static bool parse_opts(int argc, char *argv[]) { @@ -47,26 +97,15 @@ static bool parse_opts(int argc, char *argv[]) { }; int opt; - char *delim1, *delim2; while ((opt = getopt_long_only(argc, argv, "", long_options, NULL)) != -1) { + bool (*handler)(char *) = NULL; switch (opt) { case 'b': - // It would be really nice if libc had a standard way to split host:port. - delim1 = strrchr(optarg, '/'); - if (delim1 == NULL) { - print_usage(argv); - return false; - } - *delim1 = '\0'; - delim1++; - - backend_new(optarg, delim1); + handler = add_backend; break; case 'd': - if (!add_dump(optarg)) { - return false; - } + handler = add_dump; break; case 'h': @@ -74,44 +113,24 @@ static bool parse_opts(int argc, char *argv[]) { return false; case 'i': - delim1 = strrchr(optarg, '/'); - if (delim1 == NULL) { - incoming_new(NULL, optarg, backend_new_fd, NULL); - } else { - *delim1 = '\0'; - delim1++; - incoming_new(optarg, delim1, backend_new_fd, NULL); - } + handler = add_incoming; break; case 'l': - delim1 = strchr(optarg, '='); - if (delim1 == NULL) { - print_usage(argv); - return false; - } - *delim1 = '\0'; - delim1++; - struct serializer *serializer = client_get_serializer(optarg); - if (!serializer) { - fprintf(stderr, "Unknown format: %s\n", optarg); - return false; - } - - delim2 = strrchr(delim1, '/'); - if (delim2 == NULL) { - incoming_new(NULL, delim1, client_add_wrapper, serializer); - } else { - *delim2 = '\0'; - delim2++; - incoming_new(delim1, delim2, client_add_wrapper, serializer); - } + handler = add_listener; break; default: print_usage(argv); return false; } + + if (handler) { + if (!handler(optarg)) { + print_usage(argv); + return false; + } + } } if (optind != argc) { diff --git a/backend.c b/backend.c index 2d001cd..439405a 100644 --- a/backend.c +++ b/backend.c @@ -178,3 +178,10 @@ static bool backend_autodetect_parse(struct backend *backend, struct packet *pac } return false; } + +void backend_print_usage() { + fprintf(stderr, "\nSupported input formats (autodetected):\n"); + for (int i = 0; i < NUM_PARSERS; i++) { + fprintf(stderr, "\t%s\n", parsers[i].name); + } +} diff --git a/backend.h b/backend.h index 39758ec..6959809 100644 --- a/backend.h +++ b/backend.h @@ -23,3 +23,4 @@ struct backend { void backend_new(char *, char *); void backend_new_fd(int, void *); +void backend_print_usage(); diff --git a/client.c b/client.c index 5617d03..4e93b24 100644 --- a/client.c +++ b/client.c @@ -138,3 +138,10 @@ void client_write(struct packet *packet) { } } } + +void client_print_usage() { + fprintf(stderr, "\nSupported output formats:\n"); + for (int i = 0; i < NUM_SERIALIZERS; i++) { + fprintf(stderr, "\t%s\n", serializers[i].name); + } +} diff --git a/client.h b/client.h index 70653b2..6e8375a 100644 --- a/client.h +++ b/client.h @@ -8,3 +8,4 @@ struct serializer *client_get_serializer(char *); void client_add(int, struct serializer *); void client_add_wrapper(int, void *); void client_write(struct packet *); +void client_print_usage();