#include #include #include #include #include #include "common.h" #include "backend.h" #include "client.h" #include "airspy_adsb.h" #include "beast.h" #include "json.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 bool parse_opts(int argc, char *argv[]) { int opt; while ((opt = getopt(argc, argv, "d:")) != -1) { switch (opt) { case 'd': if (!add_dump(optarg)) { return false; } break; default: return false; } } return true; } static int loop(int epoll_fd) { while (1) { #define MAX_EVENTS 10 struct epoll_event events[MAX_EVENTS]; int nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, -1); if (nfds == -1) { perror("epoll_wait"); return -1; } for (int n = 0; n < nfds; n++) { struct peer *peer = events[n].data.ptr; switch (peer->type) { case PEER_BACKEND: if (!backend_read((struct backend *) peer)) { return -1; } break; default: fprintf(stderr, "Unpossible: unknown peer type.\n"); return -1; } } } } int main(int argc, char *argv[]) { server_init(); hex_init(); airspy_adsb_init(); beast_init(); json_init(); int epoll_fd = epoll_create1(0); if (epoll_fd == -1) { perror("epoll_create1"); return EXIT_FAILURE; } if (!parse_opts(argc, argv) || argc - optind < 2 || (argc - optind) % 2 != 0) { fprintf(stderr, "Usage: %s [ -d format ] localhost 30006 [ remotehost 30002 ... ]\n", argv[0]); 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)) { return EXIT_FAILURE; } } loop(epoll_fd); close(epoll_fd); return EXIT_SUCCESS; }