diff --git a/src/lib/arch/Arch.h b/src/lib/arch/Arch.h index bd014cf92..e5b2a440e 100644 --- a/src/lib/arch/Arch.h +++ b/src/lib/arch/Arch.h @@ -36,7 +36,7 @@ #elif SYSAPI_UNIX -#include "arch/unix/ArchDaemonUnix.h" +#include "arch/ArchDaemonNone.h" #include "arch/unix/ArchLogUnix.h" #include "arch/unix/ArchMultithreadPosix.h" #include "arch/unix/ArchNetworkBSD.h" diff --git a/src/lib/arch/CMakeLists.txt b/src/lib/arch/CMakeLists.txt index 5f8cf3ee4..8c07b20ac 100644 --- a/src/lib/arch/CMakeLists.txt +++ b/src/lib/arch/CMakeLists.txt @@ -22,8 +22,6 @@ if(WIN32) elseif(UNIX) set(PLATFORM_CODE - unix/ArchDaemonUnix.cpp - unix/ArchDaemonUnix.h unix/ArchLogUnix.cpp unix/ArchLogUnix.h unix/ArchMultithreadPosix.cpp diff --git a/src/lib/arch/unix/ArchDaemonUnix.cpp b/src/lib/arch/unix/ArchDaemonUnix.cpp deleted file mode 100644 index 673b2468c..000000000 --- a/src/lib/arch/unix/ArchDaemonUnix.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Deskflow -- mouse and keyboard sharing utility - * SPDX-FileCopyrightText: (C) 2025 Deskflow Developers - * SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd. - * SPDX-FileCopyrightText: (C) 2002 Chris Schoeneman - * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception - */ - -#include "arch/unix/ArchDaemonUnix.h" - -#include "arch/ArchException.h" -#include "arch/unix/XArchUnix.h" -#include "base/Log.h" - -#include -#include -#include -#include -#include -#include - -#include -// -// ArchDaemonUnix -// - -#ifdef __APPLE__ - -// In Mac OS X, fork()'d child processes can't use most APIs (the frameworks -// that Deskflow uses in fact prevent it and make the process just up and die), -// so need to exec a copy of the program that doesn't fork so isn't limited. -int execSelfNonDaemonized() -{ - extern char **NXArgv; - char **selfArgv = NXArgv; - - setenv("_DESKFLOW_DAEMONIZED", "", 1); - - execvp(selfArgv[0], selfArgv); - return 0; -} - -bool alreadyDaemonized() -{ - return std::getenv("_DESKFLOW_DAEMONIZED") != nullptr; -} - -#endif - -int ArchDaemonUnix::daemonize(DaemonFunc const &func) -{ -#ifdef __APPLE__ - if (alreadyDaemonized()) { - return func(); - } -#endif - - // fork so shell thinks we're done and so we're not a process - // group leader - switch (fork()) { - case -1: - // failed - throw ArchDaemonFailedException(errorToString(errno)); - - case 0: - // child - break; - - default: - // parent exits - exit(0); - } - - // become leader of a new session - setsid(); - -#ifndef __APPLE__ - // NB: don't run chdir on apple; causes strange behaviour. - // chdir to root so we don't keep mounted filesystems points busy - // TODO: this is a bit of a hack - can we find a better solution? - if (int chdirErr = chdir("/"); chdirErr) - // NB: file logging actually isn't working at this point! - LOG_ERR("chdir error: %i", chdirErr); -#endif - - // mask off permissions for any but owner - umask(077); - - // close open files. we only expect stdin, stdout, stderr to be open. - close(0); - close(1); - close(2); - - // attach file descriptors 0, 1, 2 to /dev/null so inadvertent use - // of standard I/O safely goes in the bit bucket. - open("/dev/null", O_RDONLY); - open("/dev/null", O_RDWR); - - if (int dupErr = dup(1); dupErr < 0) { - // NB: file logging actually isn't working at this point! - LOG_ERR("dup error: %i", dupErr); - } - -#ifdef __APPLE__ - return execSelfNonDaemonized(); -#endif - - // invoke function - return func(); -} diff --git a/src/lib/arch/unix/ArchDaemonUnix.h b/src/lib/arch/unix/ArchDaemonUnix.h deleted file mode 100644 index 802dde344..000000000 --- a/src/lib/arch/unix/ArchDaemonUnix.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Deskflow -- mouse and keyboard sharing utility - * SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd. - * SPDX-FileCopyrightText: (C) 2002 Chris Schoeneman - * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception - */ - -#pragma once - -#include "arch/ArchDaemonNone.h" - -#undef ARCH_DAEMON -#define ARCH_DAEMON ArchDaemonUnix - -//! Unix implementation of IArchDaemon -class ArchDaemonUnix : public ArchDaemonNone -{ -public: - ArchDaemonUnix() = default; - ~ArchDaemonUnix() override = default; - - // IArchDaemon overrides - int daemonize(DaemonFunc const &func) override; -};