aboutsummaryrefslogtreecommitdiffstats
path: root/src/cli/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/cli/main.cpp')
-rw-r--r--src/cli/main.cpp186
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);
}