From 436011fee88fb1f8e2941c518e5f7bd11d66559d Mon Sep 17 00:00:00 2001 From: "Alex Xu (Hello71)" Date: Thu, 14 Jul 2016 15:49:58 -0400 Subject: Rewrite args parsing to prepare for libpcap. --- src/udpastcp.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 73 insertions(+), 9 deletions(-) (limited to 'src/udpastcp.c') diff --git a/src/udpastcp.c b/src/udpastcp.c index fa8fea2..31d2d50 100644 --- a/src/udpastcp.c +++ b/src/udpastcp.c @@ -1,17 +1,78 @@ +#include #include #include #include #include +#include #include "common.h" #include "server.h" #include "client.h" int free_mem_on_exit = 0; +void *libpcap = NULL; + +void usage() { + puts("usage: udpintcp [OPTION]...\n" + "Make UDP look like TCP.\n" + "\n" + " -m MODE Client/server mode.\n" + " -h LISTEN_HOST -p LISTEN_PORT Listen on the specified host/port. Port is required.\n" + " -H REMOTE_HOST -P REMOTE_PORT Connect to the specified host/port. Always required.\n" + " -d DEVICE Use libpcap and listen on the specified interface.\n"); +} int main(int argc, char *argv[]) { - if (argc < 6) { - puts("usage: udpintcp client|server LISTEN_HOST LISTEN_PORT REMOTE_HOST REMOTE_PORT"); - return !(argc == 2 && !strcmp(argv[1], "--help")); + char ch; + struct common_data common_data = { + .listen_host = "::" + }; + const char *mode = NULL; + while ((ch = getopt(argc, argv, "m:h:p:H:P:d:")) != -1) { + switch (ch) { + case 'm': + mode = optarg; + break; + case 'h': + common_data.listen_host = optarg; + break; + case 'p': + common_data.listen_port = optarg; + break; + case 'H': + common_data.remote_host = optarg; + break; + case 'P': + common_data.remote_port = optarg; + break; + case 'd': + common_data.device = optarg; + break; + case '?': + usage(); + break; + default: + abort(); + } + if (optind > argc) { + fputs("extra arguments on command line\n", stderr); + exit(EXIT_FAILURE); + } + } + if (!mode) { + fputs("missing required argument: mode", stderr); + exit(EXIT_FAILURE); + } + if (!common_data.listen_port) { + fputs("missing required argument: listen port", stderr); + exit(EXIT_FAILURE); + } + if (!common_data.remote_host) { + fputs("missing required argument: remote host", stderr); + exit(EXIT_FAILURE); + } + if (!common_data.remote_port) { + fputs("missing required argument: remote port", stderr); + exit(EXIT_FAILURE); } srandom((unsigned int)time(NULL)); @@ -21,14 +82,17 @@ int main(int argc, char *argv[]) { free_mem_on_exit = 1; } - if (!strcmp(argv[1], "client")) { - DBG("starting client listening on [%s]:%s connecting to [%s]:%s", argv[2], argv[3], argv[4], argv[5]); - return start_client(argv[2], argv[3], argv[4], argv[5]) == 0; - } else if (!strcmp(argv[1], "server")) { - DBG("starting server listening on [%s]:%s connecting to [%s]:%s", argv[2], argv[3], argv[4], argv[5]); - return start_server(argv[2], argv[3], argv[4], argv[5]) == 0; + int (*startf)(struct common_data *); + + if (!strcmp(mode, "client")) { + startf = start_client; + } else if (!strcmp(mode, "server")) { + startf = start_server; } else { fputs("invalid mode\n", stderr); return 1; } + + DBG("starting %s listening on [%s]:%s connecting to [%s]:%s", mode, common_data.listen_host, common_data.listen_port, common_data.remote_host, common_data.remote_port); + return startf(&common_data); } -- cgit v1.2.3-54-g00ecf