thin-provisioning-tools/base/application.cc

109 lines
2.0 KiB
C++
Raw Normal View History

2014-08-27 18:31:31 +05:30
#include "base/application.h"
#include <boost/lexical_cast.hpp>
#include <libgen.h>
2014-08-27 18:31:31 +05:30
#include <linux/limits.h>
#include <string.h>
#include <stdlib.h>
2014-08-27 18:31:31 +05:30
using namespace base;
using namespace boost;
2014-08-27 18:31:31 +05:30
using namespace std;
//----------------------------------------------------------------
command::command(string const &name)
: name_(name) {
}
void
command::die(string const &msg)
{
cerr << msg << endl;
usage(cerr);
exit(1);
}
2020-03-25 20:28:02 +05:30
::uint64_t
command::parse_uint64(char const *str, char const *desc)
{
if (!str) {
ostringstream out;
out << "Couldn't parse " << desc << ": NULL";
die(out.str());
}
try {
// FIXME: check trailing garbage is handled
2020-03-25 20:28:02 +05:30
return lexical_cast<::uint64_t>(str);
} catch (...) {
ostringstream out;
out << "Couldn't parse " << desc << ": '" << str << "'";
die(out.str());
}
return 0; // never get here
}
//----------------------------------------------------------------
2014-08-27 18:31:31 +05:30
int
application::run(int argc, char **argv)
{
string cmd = get_basename(argv[0]);
2014-08-27 18:31:31 +05:30
if (cmd.find("pdata_tools") == 0) {
2014-08-27 18:31:31 +05:30
argc--;
argv++;
if (!argc) {
usage();
return 1;
}
cmd = argv[0];
}
std::list<command::ptr>::const_iterator it;
2014-08-27 18:31:31 +05:30
for (it = cmds_.begin(); it != cmds_.end(); ++it) {
if (cmd == (*it)->get_name()) {
try {
return (*it)->run(argc, argv);
} catch (std::exception const &e) {
cerr << e.what() << "\n";
return 1;
}
}
2014-08-27 18:31:31 +05:30
}
std::cerr << "Unknown command '" << cmd << "'\n";
usage();
return 1;
}
void
application::usage()
{
std::cerr << "Usage: <command> <args>\n"
<< "commands:\n";
std::list<command::ptr>::const_iterator it;
2014-08-27 18:31:31 +05:30
for (it = cmds_.begin(); it != cmds_.end(); ++it) {
std::cerr << " " << (*it)->get_name() << "\n";
}
}
std::string
application::get_basename(std::string const &path) const
2014-08-27 18:31:31 +05:30
{
char buffer[PATH_MAX + 1];
memset(buffer, 0, sizeof(buffer));
strncpy(buffer, path.c_str(), PATH_MAX);
return ::basename(buffer);
}
//----------------------------------------------------------------