diff options
Diffstat (limited to 'src/cli/main.cpp')
-rw-r--r-- | src/cli/main.cpp | 186 |
1 files changed, 29 insertions, 157 deletions
diff --git a/src/cli/main.cpp b/src/cli/main.cpp index 8d229ce0e..f054e6005 100644 --- a/src/cli/main.cpp +++ b/src/cli/main.cpp @@ -1,187 +1,59 @@ /* -* (C) 2009,2014 Jack Lloyd +* (C) 2009,2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ -#include <vector> -#include <string> - -#include <iostream> -#include <cstdlib> -#include <exception> -#include <limits> -#include <memory> +#include "cli.h" #include <botan/version.h> -#include <botan/cpuid.h> - -#if defined(BOTAN_HAS_HTTP_UTIL) -#include <botan/http_util.h> -#endif - -using namespace Botan; - -#include "apps.h" +#include <botan/internal/stl_util.h> +#include <iterator> +#include <sstream> namespace { -int help(const std::vector<std::string> &args) +std::string main_help() { - std::cout << "Usage: " << args[0] << " [subcommand] [subcommand-options]" << std::endl; + const std::set<std::string> avail_commands = + Botan::map_keys_as_set(Botan_CLI::Command::global_registry()); - std::set<std::string> apps = AppRegistrations::instance().all_appnames(); + std::ostringstream oss; - std::cout << "Available commands:" << std::endl; + oss << "Usage: botan <cmd> <cmd-options>\n"; + oss << "Available commands: "; + std::copy(avail_commands.begin(), + avail_commands.end(), + std::ostream_iterator<std::string>(oss, " ")); + oss << "\n"; - size_t idx = 1; - for(auto&& app: apps) - { - std::cout << app; - - if(idx % 3 == 0) - std::cout << std::endl; - else - std::cout << std::string(18-app.size(), ' '); - - ++idx; - } - std::cout << std::endl; - - return 1; + return oss.str(); } -int config(const std::vector<std::string> &args) - { - if(args.size() != 2) - { - std::cout << "Usage: " << args[0] << " <what>\n" - << " prefix: Print install prefix\n" - << " cflags: Print include params\n" - << " ldflags: Print linker params\n" - << " libs: Print libraries" << std::endl; - return 1; - } - - const std::string arg = args[1]; - - if(arg == "prefix") - std::cout << BOTAN_INSTALL_PREFIX << std::endl; - - else if(arg == "cflags") - std::cout << "-I" << BOTAN_INSTALL_PREFIX << "/" << BOTAN_INSTALL_HEADER_DIR << std::endl; - - else if(arg == "ldflags") - std::cout << "-L" << BOTAN_INSTALL_PREFIX << "/" << BOTAN_INSTALL_LIB_DIR << std::endl; - - else if(arg == "libs") - std::cout << "-lbotan-" << version_major() << "." << version_minor() - << " " << BOTAN_LIB_LINK << std::endl; - - else - { - std::cerr << "Unknown option " << arg << " to botan config" << std::endl; - return 1; - } - - return 0; - } -REGISTER_APP(config); - -int version(const std::vector<std::string> &args) - { - if(BOTAN_VERSION_MAJOR != version_major() || - BOTAN_VERSION_MINOR != version_minor() || - BOTAN_VERSION_PATCH != version_patch()) - { - std::cerr << "Warning: linked version (" - << version_major() << '.' - << version_minor() << '.' - << version_patch() - << ") does not match version built against (" - << BOTAN_VERSION_MAJOR << '.' - << BOTAN_VERSION_MINOR << '.' - << BOTAN_VERSION_PATCH << ")" << std::endl; - } - - if(args.size() == 1) - { - std::cout << Botan::version_major() << "." - << Botan::version_minor() << "." - << Botan::version_patch() << std::endl; - } - else if(args.size() == 2 && args[1] == "--full") - { - std::cout << Botan::version_string() << std::endl; - } - else - { - std::cout << "Usage: " << args[0] << " version [--full]" << std::endl; - return 1; - } - - return 0; - } -REGISTER_APP(version); - -int cpuid(const std::vector<std::string> &args) - { - BOTAN_UNUSED(args); - CPUID::print(std::cout); - return 0; - } -REGISTER_APP(cpuid); - -#if defined(BOTAN_HAS_HTTP_UTIL) -int http_get(const std::vector<std::string> &args) - { - if(args.size() != 2) - { - std::cout << "Usage " << args[0] << " <url>" << std::endl; - return 1; - } - - auto resp = HTTP::GET_sync(args[1]); - std::cout << resp << std::endl; - return 0; - } -REGISTER_APP(http_get); - -#endif - } int main(int argc, char* argv[]) { - const std::vector<std::string> args(argv, argv + argc); + std::cerr << Botan::runtime_version_check(BOTAN_VERSION_MAJOR, + BOTAN_VERSION_MINOR, + BOTAN_VERSION_PATCH); - try - { - if(args.size() < 2) - return help(args); - - const std::string cmd = args[1]; - - if(cmd == "help" || cmd == "-h") - return help(args); - - AppRegistrations& apps = AppRegistrations::instance(); - if(apps.has(cmd)) - return apps.run(cmd, std::vector<std::string>(args.begin()+1, args.end())); + const std::string cmd_name = (argc <= 1) ? "help" : argv[1]; - std::cerr << "Unknown command " << cmd << std::endl; - return help(args); - } - catch(std::exception& e) + if(cmd_name == "help" || cmd_name == "--help") { - std::cerr << e.what() << std::endl; + std::cout << main_help(); return 1; } - catch(...) + + Botan_CLI::Command* cmd = Botan_CLI::Command::get_cmd(cmd_name); + + if(!cmd) { - std::cerr << "Unknown exception caught" << std::endl; + std::cout << "Unknown command " << cmd_name << " (try --help)\n"; return 1; } - return 0; + std::vector<std::string> args(argv + 2, argv + argc); + return cmd->run(args); } |