#include "apps.h" #include #include #include #include namespace trygvis { namespace apps { using namespace log4cplus; using namespace std; namespace po = boost::program_options; std::string get_hostname() { static string s = ""; if (!s.empty()) { return s; } 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"; } if (info) { s = info->ai_canonname; } freeaddrinfo(info); return s; } void app_execution::usage() { cerr << desc << endl; } const po::options_description logging_options() { po::options_description desc; return desc; } void setup_logging(const string &app_name) { Appender *console = new ConsoleAppender(true, true); string pattern = "%-5p %D{%Y-%m-%d %H:%M:%S} " + app_name + "/%-20c %m%n"; // add %M (function name) auto *layout = new PatternLayout(LOG4CPLUS_TEXT(pattern)); console->setLayout(auto_ptr(layout)); Hierarchy &h = Logger::getDefaultHierarchy(); h.getRoot().addAppender(SharedAppenderPtr(console)); } int launch_app(app *app, int argc, const char *argv[]) { po::options_description all("Options"); auto all_options = all.add_options(); all_options("help", "This help message"); 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.empty()) { cerr << "Unrecognized option: " << unrecognized.at(0) << "\n"; return EXIT_FAILURE; } setup_logging(app->app_name); Logger logger = Logger::getInstance(LOG4CPLUS_TEXT("main")); app_execution execution(all, vm, logger); int ret = app->main(execution); delete app; return ret; } 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; } } int real_main(app *app, int argc, const char *argv[]) { if (argc == 0) { return EXIT_FAILURE; } return launch_app(app, argc, argv); } } // namespace apps } // namespace trygvis