diff --git a/daemon/UnixDaemon.cpp b/daemon/UnixDaemon.cpp index 8c5ba05c..ba5dec90 100644 --- a/daemon/UnixDaemon.cpp +++ b/daemon/UnixDaemon.cpp @@ -60,7 +60,7 @@ void handle_signal(int sig) i2p::transport::transports.SetOnline(false); break; case SIGCONT: - LogPrint(eLogInfo, "Daemon: Got SIGCONT, restore connection to network..."); + LogPrint(eLogInfo, "Daemon: Got SIGCONT, restoring connection to network..."); i2p::transport::transports.SetOnline(true); break; } @@ -180,19 +180,27 @@ namespace i2p } gracefulShutdownInterval = 0; // not specified - // Signal handler - struct sigaction sa; - sa.sa_handler = handle_signal; - sigemptyset(&sa.sa_mask); - sa.sa_flags = SA_RESTART; - sigaction(SIGHUP, &sa, 0); - sigaction(SIGUSR1, &sa, 0); - sigaction(SIGABRT, &sa, 0); - sigaction(SIGTERM, &sa, 0); - sigaction(SIGINT, &sa, 0); - sigaction(SIGPIPE, &sa, 0); - - return Daemon_Singleton::start(); + // handle signal TSTP + bool handleTSTP; i2p::config::GetOption("unix.handle_sigtstp", handleTSTP); + + // Signal handler + struct sigaction sa; + sa.sa_handler = handle_signal; + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sigaction(SIGHUP, &sa, 0); + sigaction(SIGUSR1, &sa, 0); + sigaction(SIGABRT, &sa, 0); + sigaction(SIGTERM, &sa, 0); + sigaction(SIGINT, &sa, 0); + sigaction(SIGPIPE, &sa, 0); + if (handleTSTP) + { + sigaction(SIGTSTP, &sa, 0); + sigaction(SIGCONT, &sa, 0); + } + + return Daemon_Singleton::start(); } bool DaemonLinux::stop() diff --git a/libi2pd/Config.cpp b/libi2pd/Config.cpp index 36069b51..16ee6503 100644 --- a/libi2pd/Config.cpp +++ b/libi2pd/Config.cpp @@ -311,6 +311,19 @@ namespace config { ("meshnets.yggaddress", value()->default_value(""), "Yggdrasil address to publish") ; +#ifdef __linux__ + options_description unix_specific("UNIX-specific options"); + unix_specific.add_options() + ("unix.handle_sigtstp", bool_switch()->default_value(false), + "Switch to offline mode if received signal TSTP (SIGTSTP)" + "(you can send it by pressing CTRL+Z in terminal or with" + " help commapnd kill and others, a.e pkill, if i2pd in " + "daemon mode). If you need to switch to online mode, send" + " signal CONT (SIGCONT)") + ; +#endif + + m_OptionsDesc .add(general) .add(limits) @@ -334,6 +347,9 @@ namespace config { .add(persist) .add(cpuext) .add(meshnets) +#ifdef __linux__ + .add(unix_specific) +#endif ; }