diff --git a/adsbus.c b/adsbus.c index f177b75..457c416 100644 --- a/adsbus.c +++ b/adsbus.c @@ -9,8 +9,7 @@ struct opts { - char *backend_node; - char *backend_service; + bool dump; }; struct client { @@ -20,14 +19,10 @@ struct client { static int parse_opts(int argc, char *argv[], struct opts *opts) { int opt; - while ((opt = getopt(argc, argv, "h:p:")) != -1) { + while ((opt = getopt(argc, argv, "d")) != -1) { switch (opt) { - case 'h': - opts->backend_node = optarg; - break; - - case 'p': - opts->backend_service = optarg; + case 'd': + opts->dump = true; break; default: @@ -69,11 +64,12 @@ int main(int argc, char *argv[]) { airspy_adsb_init(); struct opts opts = { - .backend_node = "localhost", - .backend_service = "30006", + .dump = false, }; - if (parse_opts(argc, argv, &opts)) { - fprintf(stderr, "Usage: %s [-h backend_host] [-p backend_port]\n", argv[0]); + if (parse_opts(argc, argv, &opts) || + argc - optind < 2 || + (argc - optind) % 2 != 0) { + fprintf(stderr, "Usage: %s -d localhost 30006 [ remotehost 30002 ... ]\n", argv[0]); return EXIT_FAILURE; } @@ -83,10 +79,14 @@ int main(int argc, char *argv[]) { return EXIT_FAILURE; } - struct backend backend = BACKEND_INIT; - if (!backend_connect(opts.backend_node, opts.backend_service, &backend, epoll_fd)) { - fprintf(stderr, "Unable to connect to %s/%s\n", opts.backend_node, opts.backend_service); - return EXIT_FAILURE; + int nbackends = (argc - optind) / 2; + struct backend backends[nbackends]; + for (int i = 0, j = optind; i < nbackends && j < argc; i++, j += 2) { + backend_init(&backends[i]); + if (!backend_connect(argv[j], argv[j + 1], &backends[i], epoll_fd)) { + fprintf(stderr, "Unable to connect to %s %s\n", argv[j], argv[j + 1]); + return EXIT_FAILURE; + } } loop(epoll_fd); diff --git a/backend.c b/backend.c index 3d38527..f8c1763 100644 --- a/backend.c +++ b/backend.c @@ -4,17 +4,29 @@ #include #include #include +#include #include "airspy_adsb.h" #include "backend.h" +bool backend_autodetect_parse(struct backend *, struct packet *); + + static parser parsers[] = { airspy_adsb_parse, }; #define NUM_PARSERS (sizeof(parsers) / sizeof(*parsers)) +void backend_init(struct backend *backend) { + backend->type = PEER_BACKEND; + backend->fd = -1; + buf_init(&backend->buf); + memset(backend->parser_state, 0, PARSER_STATE_LEN); + backend->parser = backend_autodetect_parse; +} + bool backend_connect(char *node, char *service, struct backend *backend, int epoll_fd) { assert(backend->type == PEER_BACKEND); @@ -28,7 +40,7 @@ bool backend_connect(char *node, char *service, struct backend *backend, int epo int gai_err = getaddrinfo(node, service, &hints, &addrs); if (gai_err) { - fprintf(stderr, "getaddrinfo(%s/%s): %s\n", node, service, gai_strerror(gai_err)); + fprintf(stderr, "getaddrinfo(%s %s): %s\n", node, service, gai_strerror(gai_err)); return false; } } @@ -51,13 +63,13 @@ bool backend_connect(char *node, char *service, struct backend *backend, int epo if (addr == NULL) { freeaddrinfo(addrs); - fprintf(stderr, "Can't connect to %s/%s\n", node, service); + fprintf(stderr, "Can't connect to %s %s\n", node, service); return false; } char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; if (getnameinfo(addr->ai_addr, addr->ai_addrlen, hbuf, sizeof(hbuf), sbuf, sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV) == 0) { - fprintf(stderr, "Connected to %s/%s\n", hbuf, sbuf); + fprintf(stderr, "Connected to %s %s\n", hbuf, sbuf); } } diff --git a/backend.h b/backend.h index afbb2a1..e4bff89 100644 --- a/backend.h +++ b/backend.h @@ -14,15 +14,7 @@ struct backend { parser parser; }; -#define BACKEND_INIT { \ - .type = PEER_BACKEND, \ - .fd = -1, \ - .buf = BUF_INIT, \ - .parser_state = { 0 }, \ - .parser = backend_autodetect_parse, \ -} - +void backend_init(struct backend *); bool backend_connect(char *, char *, struct backend *, int); bool backend_read(struct backend *); -bool backend_autodetect_parse(struct backend *, struct packet *); diff --git a/common.c b/common.c index c01b2f8..d33945d 100644 --- a/common.c +++ b/common.c @@ -7,6 +7,11 @@ #include "common.h" +void buf_init(struct buf *buf) { + buf->start = 0; + buf->length = 0; +} + ssize_t buf_fill(struct buf *buf, int fd) { if (buf->start + buf->length == BUF_LEN_MAX) { assert(buf->start > 0); diff --git a/common.h b/common.h index 79f046e..4d83171 100644 --- a/common.h +++ b/common.h @@ -23,14 +23,11 @@ struct buf { size_t start; size_t length; }; -#define BUF_INIT { \ - .start = 0, \ - .length = 0, \ -} #define buf_chr(buff, at) ((buff)->buf[(buff)->start + (at)]) #define buf_at(buff, at) (&buf_chr(buff, at)) +void buf_init(struct buf *); ssize_t buf_fill(struct buf *, int); void buf_consume(struct buf *, size_t);