int main(int argc, char **argv) { const char *host = NULL; char *homedir; char hist_file[1024] = ""; sdb_input_t input = SDB_INPUT_INIT; sdb_llist_t *commands = NULL; while (42) { int opt = getopt(argc, argv, "H:U:c:C:K:A:hV"); if (-1 == opt) break; switch (opt) { case 'H': host = optarg; break; case 'U': input.user = optarg; break; case 'c': { sdb_object_t *obj; if (! commands) commands = sdb_llist_create(); if (! commands) { sdb_log(SDB_LOG_ERR, "Failed to create list object"); exit(1); } if (! (obj = sdb_object_create_T(optarg, sdb_object_t))) { sdb_log(SDB_LOG_ERR, "Failed to create object"); exit(1); } if (sdb_llist_append(commands, obj)) { sdb_log(SDB_LOG_ERR, "Failed to append command to list"); sdb_object_deref(obj); exit(1); } sdb_object_deref(obj); } break; case 'C': ssl_options.cert_file = optarg; break; case 'K': ssl_options.key_file = optarg; break; case 'A': ssl_options.ca_file = optarg; break; case 'h': exit_usage(argv[0], 0); break; case 'V': exit_version(); break; default: exit_usage(argv[0], 1); } } if (optind < argc) exit_usage(argv[0], 1); if (! host) host = DEFAULT_SOCKET; if (! input.user) input.user = sdb_get_current_user(); else input.user = strdup(input.user); if (! input.user) exit(1); if (sdb_ssl_init()) exit(1); input.client = sdb_client_create(host); if (! input.client) { sdb_log(SDB_LOG_ERR, "Failed to create client object"); sdb_input_reset(&input); exit(1); } canonicalize_ssl_options(); if (sdb_client_set_ssl_options(input.client, &ssl_options)) { sdb_log(SDB_LOG_ERR, "Failed to apply SSL options"); sdb_input_reset(&input); sdb_ssl_free_options(&ssl_options); exit(1); } sdb_ssl_free_options(&ssl_options); if (sdb_client_connect(input.client, input.user)) { sdb_log(SDB_LOG_ERR, "Failed to connect to SysDBd"); sdb_input_reset(&input); exit(1); } if (commands) { int status = execute_commands(input.client, commands); sdb_llist_destroy(commands); sdb_input_reset(&input); if ((status != SDB_CONNECTION_OK) && (status != SDB_CONNECTION_DATA)) exit(1); exit(0); } sdb_log(SDB_LOG_INFO, "SysDB client "SDB_CLIENT_VERSION_STRING SDB_CLIENT_VERSION_EXTRA" (libsysdbclient %s%s)", sdb_client_version_string(), sdb_client_version_extra()); sdb_command_print_server_version(&input); printf("\n"); using_history(); if ((homedir = sdb_get_homedir())) { snprintf(hist_file, sizeof(hist_file) - 1, "%s/.sysdb_history", homedir); hist_file[sizeof(hist_file) - 1] = '\0'; free(homedir); homedir = NULL; errno = 0; if (read_history(hist_file) && (errno != ENOENT)) { char errbuf[1024]; sdb_log(SDB_LOG_WARNING, "Failed to load history (%s): %s", hist_file, sdb_strerror(errno, errbuf, sizeof(errbuf))); } } input.input = sdb_strbuf_create(2048); sdb_input_init(&input); sdb_input_mainloop(); sdb_client_shutdown(input.client, SHUT_WR); while (! sdb_client_eof(input.client)) { /* wait for remaining data to arrive */ sdb_command_print_reply(input.client); } if (hist_file[0] != '\0') { errno = 0; if (write_history(hist_file)) { char errbuf[1024]; sdb_log(SDB_LOG_WARNING, "Failed to store history (%s): %s", hist_file, sdb_strerror(errno, errbuf, sizeof(errbuf))); } } sdb_input_reset(&input); sdb_ssl_shutdown(); return 0; } /* main */
int main(int argc, char* argv[]) { QString logFileName; QString startupScript; bool help = false; bool vers = false; std::string theLogFileName; std::string startupScriptSource; bool panic = false; bool silent_overwrite = false; auto parser = clara::detail::Opt(help)["-h"]["--help"]("Show the help message.")| clara::detail::Opt(vers)["-v"]["--version"]("Print version.")| clara::detail::Opt(theLogFileName, "file")["-l"]("Write log to <file>.")| clara::detail::Opt(panic)["-p"]("Sets the file overwrite policy to 'panic'.")| clara::detail::Opt(silent_overwrite)["-s"]( "Sets the file overwrite policy to 'silent overwrite'.")| clara::detail::Arg(startupScriptSource, "file")("The path of the startup skript."); try { auto result = parser.parse(clara::detail::Args(argc, argv)); if (!result) { std::cerr << "Unsuported option or missing option argument.\n" << "Use '" APPLICATION_NAME " -h' for list of options\n"; exit(-1); } else if (help) exit_help(); else if (vers) exit_version(); else if (theLogFileName != "") logFileName = QString::fromStdString(theLogFileName); else if (panic) setFileOverwritePolicy(file_dialog::eFileOverwritePolicy::PANIC); else if (silent_overwrite) setFileOverwritePolicy(file_dialog::eFileOverwritePolicy::SILENT_OVERWRITE); startupScript = QString::fromStdString(startupScriptSource); } catch (std::exception const & e) { std::cerr << e.what(); exit(-1); } QApplication app(argc, argv); app.setApplicationName(APPLICATION_NAME); app.setApplicationVersion(VERSION); app.setOrganizationName(ORGANIZATION_NAME); app.setOrganizationDomain(ORGANIZATION_DOMAIN); #if defined(Q_OS_OSX) app.setStyle(QStyleFactory::create("Macintosh")); #elif defined(Q_OS_WIN) app.setStyle(QStyleFactory::create("Fusion")); #else app.setStyle(QStyleFactory::create("Fusion")); #endif if (logFileName=="") { logFileName = startupScript=="" ? qApp->applicationName() + ".log" : startupScript + ".log"; } else { if (logFileName==startupScript) { std::cerr << "Log file name coincides with startup script name\n"; exit(-1); } } std::cout << "Log file will be written to " << CSTRI(logFileName) << "\n"; Logger logger{logFileName}; Console console; QLoggingCategory::setFilterRules("*.debug=true\nqt.*.debug=false"); qInstallMessageHandler(messageHandler); Session session; new MainWin{startupScript}; // must be pointer, because it can be deleted by 'quit' trigger return app.exec(); }