//Copyright 2022, FOSS-VG Developers and Contributers // // Author(s): // BodgeMaster, Shwoomple // //This program is free software: you can redistribute it and/or modify it //under the terms of the GNU Affero General Public License as published //by the Free Software Foundation, version 3. // //This program is distributed in the hope that it will be useful, //but WITHOUT ANY WARRANTY; without even the implied //warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. //See the GNU Affero General Public License for more details. // //You should have received a copy of the GNU Affero General Public License //version 3 along with this program. //If not, see https://www.gnu.org/licenses/agpl-3.0.en.html #include #include #include #include #include #include "../lib/cli.hpp" #include "../lib/error.hpp" #define EXIT_SUCCESS 0 #define EXIT_RUNTIME 1 #define EXIT_USAGE 2 #define EXIT_UNIMPLEMENTED 3 std::mutex mutexStdin; std::mutex mutexStdout; std::mutex mutexNetIncoming; std::mutex mutexNetOutgoing; bool ipv4 = false; bool ipv6 = false; bool tcp = false; bool udp = false; void signalHandler(int signal) { // shut down gracefully std::cerr << "Received signal " << signal << ", shutting down." << std::endl; std::exit(signal); } int main(int argc, char* argv[]) { std::signal(SIGINT, signalHandler); std::signal(SIGTERM, signalHandler); std::vector flags; flags.push_back(CLI::Flag('4', "ipv4", "use IPv4, either this or IPv6 has to be specified")); flags.push_back(CLI::Flag('6', "ipv6", "use IPv6, either this or IPv4 has to be specified")); flags.push_back(CLI::Flag('t', "tcp", "use TCP, either this or UDP has to be specified")); flags.push_back(CLI::Flag('u', "udp", "use UDP, either this or TCP has to be specified")); flags.push_back(CLI::Flag('h', "help", "print this information and exit")); flags.push_back(CLI::Flag('l', "license", "print license information and exit")); std::vector options; options.push_back(CLI::Option('c', "connect", "HOST", "make an outgoing connection to HOST instead of listening for an incoming connection")); std::vector arguments; arguments.push_back(CLI::Argument("PORT", "the port to lsiten on (or connect to)")); CLI::ArgumentsParser cliParser = CLI::ArgumentsParser(argc, argv, flags, options, arguments, "Arbitrary TCP/UDP connections in hex format"); if (cliParser.getFlag("help").value) { std::cout << cliParser.getUsage() << std::endl; return EXIT_SUCCESS; } if (cliParser.getFlag("license").value) { std::cout << "Copyright 2022, FOSS-VG Developers and Contributers\n" << "\n" << "Hexnet is part of the FOSS-VG development tool suite.\n" << "\n" << "This program is free software: you can redistribute it and/or modify it\n" << "under the terms of the GNU Affero General Public License as published\n" << "by the Free Software Foundation, version 3.\n" << "\n" << "This program is distributed in the hope that it will be useful,\n" << "but WITHOUT ANY WARRANTY; without even the implied\n" << "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" << "See the GNU Affero General Public License for more details.\n" << "\n" << "You should have received a copy of the GNU Affero General Public License\n" << "version 3 along with this program.\n" << "If not, see https://www.gnu.org/licenses/agpl-3.0.en.html" << std::endl; return EXIT_SUCCESS; } if (cliParser.wrongUsage) { std::cout << cliParser.getUsage() << std::endl; return EXIT_USAGE; } ipv4 = cliParser.getFlag("ipv4").value; ipv6 = cliParser.getFlag("ipv6").value; tcp = cliParser.getFlag("tcp").value; udp = cliParser.getFlag("udp").value; if (!(ipv4 || ipv6) || !(tcp || udp)) { std::cout << cliParser.getUsage() << std::endl; return EXIT_USAGE; } }