#include "cmixclient.hpp" #include "logging.hpp" #include "uriparser.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include int main(int argc, char* argv[]) { namespace po = boost::program_options; init_logging(boost::log::trivial::severity_level::trace, "client"); BOOST_LOG_TRIVIAL(info) << "Started client"; po::options_description desc("Allowed options"); desc.add_options() ("help,h", "produce help message.") ("network,n", po::value>()->multitoken(), "The addresses of the network nodes in order") ("certdir", po::value(), "Directory containing trusted certificates.") ("nr_mixes,x", po::value()->default_value(1), "The number of simultanous mixes the network will perform.") ; po::variables_map vm; po::store(po::parse_command_line(argc, argv, desc), vm); po::notify(vm); if (vm.count("help")) { std::cout << desc << "\n"; return 0; } std::vector network; if(vm.count("network")) { network = vm["network"].as>(); } else { std::cerr << "network option is required." << std::endl; return -1; } std::vector node_details; for(auto&& node : network) { Uri uri = parse_uri(node); node_details.push_back({uri.host, uri.port}); } std::string certdir; if(vm.count("certdir")) { std::string filename = vm["certdir"].as(); if(boost::filesystem::is_directory(filename)) { certdir = filename; } else { std::cerr << "cert dir: \"" << filename << "\" is not a directory"; return -1; } } unsigned int nr_mixes = vm["nr_mixes"].as(); NetworkDetails details{node_details, certdir, nr_mixes}; CMixClient cmix_client(details); cmix_client.run(); }