aboutsummaryrefslogtreecommitdiffstats
path: root/src/cli/main.cpp
diff options
context:
space:
mode:
authorSimon Warta <[email protected]>2015-12-08 17:25:03 +0100
committerSimon Warta <[email protected]>2015-12-09 15:28:07 +0100
commit1a0f3438a97b7913ccf444bc48510e0d145af551 (patch)
treebb4f275f5eba30076d9b48a9164c38b71e2a11e6 /src/cli/main.cpp
parent0261351f68674105a40d1938a001ba65dda756ed (diff)
Rename cmd/app -> cli
Diffstat (limited to 'src/cli/main.cpp')
-rw-r--r--src/cli/main.cpp187
1 files changed, 187 insertions, 0 deletions
diff --git a/src/cli/main.cpp b/src/cli/main.cpp
new file mode 100644
index 000000000..8d229ce0e
--- /dev/null
+++ b/src/cli/main.cpp
@@ -0,0 +1,187 @@
+/*
+* (C) 2009,2014 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 <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"
+
+namespace {
+
+int help(const std::vector<std::string> &args)
+ {
+ std::cout << "Usage: " << args[0] << " [subcommand] [subcommand-options]" << std::endl;
+
+ std::set<std::string> apps = AppRegistrations::instance().all_appnames();
+
+ std::cout << "Available commands:" << std::endl;
+
+ 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;
+ }
+
+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);
+
+ 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()));
+
+ std::cerr << "Unknown command " << cmd << std::endl;
+ return help(args);
+ }
+ catch(std::exception& e)
+ {
+ std::cerr << e.what() << std::endl;
+ return 1;
+ }
+ catch(...)
+ {
+ std::cerr << "Unknown exception caught" << std::endl;
+ return 1;
+ }
+
+ return 0;
+ }