#include "apps.h" #include #include #include #include #include namespace trygvis { namespace apps { using namespace log4cplus; using namespace std; namespace po = boost::program_options; const po::options_description logging_options() { po::options_description desc; return desc; } void setup_logging(po::variables_map vm) { Appender *console = new ConsoleAppender(true, true); PatternLayout* layout = new PatternLayout(LOG4CPLUS_TEXT("%-5p %r %-20c %m%n")); console->setLayout(auto_ptr(layout)); Hierarchy &h = Logger::getDefaultHierarchy(); h.getRoot().addAppender(SharedAppenderPtr(console)); } int launch_app(int argc, char *argv[], app &app) { po::options_description all("Options"); auto all_options = all.add_options(); app.add_options(all_options); all.add(logging_options()); app.add_extra_options(all); po::variables_map vm; try { auto parsed = po::parse_command_line(argc, argv, all); po::store(parsed, vm); po::notify(vm); auto unrecognized = po::collect_unrecognized(parsed.options, po::include_positional); if (vm.count("help")) { cerr << all << "\n"; return EXIT_FAILURE; } if (unrecognized.size()) { cerr << "Unrecognized option: " << unrecognized.at(0) << "\n"; return EXIT_FAILURE; } setup_logging(vm); app_execution execution(all, vm); return app.main(execution); } catch (po::required_option &e) { cerr << "Missing required option: " << e.get_option_name() << endl; cerr << all << endl; return EXIT_FAILURE; } catch (po::unknown_option &e) { cerr << e.what() << endl; return EXIT_FAILURE; } } std::string get_hostname() { struct addrinfo hints, *info, *p; // int gai_result; char hostname[1024]; hostname[1023] = '\0'; gethostname(hostname, 1023); memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_CANONNAME; if (getaddrinfo(hostname, "http", &hints, &info)) { return "uknown"; } string s = "unknown"; if (info) { s = string(info->ai_canonname); } freeaddrinfo(info); return s; } void app_execution::usage() { cerr << desc << endl; } } }