diff --git a/repertory/librepertory/include/types/repertory.hpp b/repertory/librepertory/include/types/repertory.hpp index 343b7026..4ede7062 100644 --- a/repertory/librepertory/include/types/repertory.hpp +++ b/repertory/librepertory/include/types/repertory.hpp @@ -282,6 +282,7 @@ enum class exit_code : std::int32_t { unpin_failed = -17, init_failed = -18, ui_mount_failed = -19, + exception = -20, }; enum http_error_codes : std::int32_t { diff --git a/repertory/repertory/main.cpp b/repertory/repertory/main.cpp index f31c23fb..c77f3c09 100644 --- a/repertory/repertory/main.cpp +++ b/repertory/repertory/main.cpp @@ -146,10 +146,17 @@ auto main(int argc, char **argv) -> int { (res == exit_code::option_not_found) && (idx < utils::cli::options::option_list.size()); idx++) { - res = cli::actions::perform_action( - utils::cli::options::option_list[idx], args, data_directory, prov, - unique_id, user, password); + try { + res = cli::actions::perform_action( + utils::cli::options::option_list[idx], args, data_directory, prov, + unique_id, user, password); + } catch (const std::exception &ex) { + res = exit_code::exception; + } catch (...) { + res = exit_code::exception; + } } + if (res == exit_code::option_not_found) { res = cli::actions::mount(args, data_directory, mount_result, prov, remote_host, remote_port, unique_id); diff --git a/repertory/repertory/src/ui/handlers.cpp b/repertory/repertory/src/ui/handlers.cpp index cf5a63d2..95a12008 100644 --- a/repertory/repertory/src/ui/handlers.cpp +++ b/repertory/repertory/src/ui/handlers.cpp @@ -69,6 +69,16 @@ handlers::handlers(mgmt_app_config *config, httplib::Server *server) }); event_system::instance().start(); + + static auto *this_server{server_}; + static const auto quit_handler = [](int /* sig */) { this_server->stop(); }; + + std::signal(SIGINT, quit_handler); +#if !defined(_WIN32) + std::signal(SIGQUIT, quit_handler); +#endif // !defined(_WIN32) + std::signal(SIGTERM, quit_handler); + server_->listen("127.0.0.1", config_->get_api_port()); }