From de3eec47a011aede3f29d23a1433234c84149062 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Tue, 5 Aug 2025 15:45:45 -0500 Subject: [PATCH] cleanup --- .../include/drives/fuse/fuse_base.hpp | 7 +- .../src/drives/fuse/fuse_base.cpp | 32 ++++------ .../src/utils/unix/unix_utils.cpp | 64 ++++++++++++++----- 3 files changed, 65 insertions(+), 38 deletions(-) diff --git a/repertory/librepertory/include/drives/fuse/fuse_base.hpp b/repertory/librepertory/include/drives/fuse/fuse_base.hpp index 64f08f1d..dbe84ced 100644 --- a/repertory/librepertory/include/drives/fuse/fuse_base.hpp +++ b/repertory/librepertory/include/drives/fuse/fuse_base.hpp @@ -614,10 +614,9 @@ public: return mount_location_; } - [[nodiscard]] auto mount([[maybe_unused]] std::vector orig_args, - std::vector args, - [[maybe_unused]] provider_type prov, - [[maybe_unused]] std::string_view unique_id) -> int; + [[nodiscard]] auto mount(std::vector orig_args, + std::vector args, provider_type prov, + std::string_view unique_id) -> int; }; } // namespace repertory diff --git a/repertory/librepertory/src/drives/fuse/fuse_base.cpp b/repertory/librepertory/src/drives/fuse/fuse_base.cpp index ebb5d094..5fd74392 100644 --- a/repertory/librepertory/src/drives/fuse/fuse_base.cpp +++ b/repertory/librepertory/src/drives/fuse/fuse_base.cpp @@ -397,12 +397,13 @@ auto fuse_base::mkdir_(const char *path, mode_t mode) -> int { }); } -auto fuse_base::mount(std::vector orig_args, - std::vector args, provider_type prov, - std::string_view unique_id) -> int { - auto res = parse_args(args); - if (res != 0) { - return res; +auto fuse_base::mount([[maybe_unused]] std::vector orig_args, + std::vector args, + [[maybe_unused]] provider_type prov, + [[maybe_unused]] std::string_view unique_id) -> int { + auto ret{parse_args(args)}; + if (ret != 0) { + return ret; } std::vector fuse_argv(args.size()); @@ -476,20 +477,13 @@ auto fuse_base::mount(std::vector orig_args, notify_fuse_args_parsed(args); - const auto main_func = [&]() -> int { - auto ret = fuse_main( - static_cast(fuse_argv.size()), - reinterpret_cast(const_cast(fuse_argv.data())), - &fuse_ops_, this); - notify_fuse_main_exit(ret); - return ret; - }; + ret = fuse_main( + static_cast(fuse_argv.size()), + reinterpret_cast(const_cast(fuse_argv.data())), + &fuse_ops_, this); + notify_fuse_main_exit(ret); - if (foreground_) { - return main_func(); - } - - return utils::create_daemon(main_func); + return ret; } auto fuse_base::open_(const char *path, struct fuse_file_info *f_info) -> int { diff --git a/repertory/librepertory/src/utils/unix/unix_utils.cpp b/repertory/librepertory/src/utils/unix/unix_utils.cpp index cc7d2102..8bf55435 100644 --- a/repertory/librepertory/src/utils/unix/unix_utils.cpp +++ b/repertory/librepertory/src/utils/unix/unix_utils.cpp @@ -225,6 +225,28 @@ void windows_create_to_unix(const UINT32 &create_options, } auto create_daemon(std::function main_func) -> int { + const auto recreate_handles = []() -> int { + close(STDIN_FILENO); + close(STDOUT_FILENO); + close(STDERR_FILENO); + + auto file_desc = open("/dev/null", O_RDWR); + if (file_desc < 0) { + return 1; + } + + dup2(file_desc, STDIN_FILENO); + dup2(file_desc, STDOUT_FILENO); + dup2(file_desc, STDERR_FILENO); + + if (file_desc > STDERR_FILENO) { + close(file_desc); + } + + return 0; + }; + +#if defined(__APPLE__) auto pid = fork(); if (pid < 0) { return 1; @@ -247,31 +269,43 @@ auto create_daemon(std::function main_func) -> int { _exit(0); } - close(STDIN_FILENO); - close(STDOUT_FILENO); - close(STDERR_FILENO); - - auto file_desc = open("/dev/null", O_RDWR); - if (file_desc < 0) { + if (recreate_handles() != 0) { return 1; } - dup2(file_desc, STDIN_FILENO); - dup2(file_desc, STDOUT_FILENO); - dup2(file_desc, STDERR_FILENO); - - if (file_desc > STDERR_FILENO) { - close(file_desc); - } - signal(SIGCHLD, SIG_DFL); signal(SIGHUP, SIG_DFL); signal(SIGPIPE, SIG_IGN); umask(0); chdir("/"); - return main_func(); +#else // !defined(__APPLE__) + auto pid = fork(); + if (pid < 0) { + return 1; + } + + if (pid == 0) { + signal(SIGCHLD, SIG_DFL); + + if (setsid() < 0) { + return 1; + } + + if (recreate_handles() != 0) { + return 1; + } + + umask(0); + chdir("/"); + return main_func(); + } + + signal(SIGCHLD, SIG_IGN); +#endif // defined(__APPLE__) + + return 0; } #if defined(__APPLE__)