|
|
@ -29,23 +29,29 @@ |
|
|
|
int running = 1; |
|
|
|
int running = 1; |
|
|
|
|
|
|
|
|
|
|
|
#ifndef _WIN32 |
|
|
|
#ifndef _WIN32 |
|
|
|
void handle_sighup(int n) |
|
|
|
void handle_signal(int sig) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (i2p::util::config::GetArg("daemon", 0) == 1) |
|
|
|
switch (sig) |
|
|
|
{ |
|
|
|
{ |
|
|
|
static bool first=true; |
|
|
|
case SIGHUP: |
|
|
|
if (first) |
|
|
|
if (i2p::util::config::GetArg("daemon", 0) == 1) |
|
|
|
{ |
|
|
|
{ |
|
|
|
first=false; |
|
|
|
static bool first=true; |
|
|
|
return; |
|
|
|
if (first) |
|
|
|
} |
|
|
|
{ |
|
|
|
|
|
|
|
first=false; |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
LogPrint("Reloading config."); |
|
|
|
|
|
|
|
i2p::util::filesystem::ReadConfigFile(i2p::util::config::mapArgs, i2p::util::config::mapMultiArgs); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case SIGABRT: |
|
|
|
|
|
|
|
case SIGTERM: |
|
|
|
|
|
|
|
case SIGINT: |
|
|
|
|
|
|
|
running = 0; // Exit loop
|
|
|
|
|
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
LogPrint("Reloading config."); |
|
|
|
|
|
|
|
i2p::util::filesystem::ReadConfigFile(i2p::util::config::mapArgs, i2p::util::config::mapMultiArgs); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
void handle_shutdown(int sig) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
running = 0; // Exit loop
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
@ -66,15 +72,6 @@ int main( int argc, char* argv[] ) |
|
|
|
i2p::util::filesystem::ReadConfigFile(i2p::util::config::mapArgs, i2p::util::config::mapMultiArgs); |
|
|
|
i2p::util::filesystem::ReadConfigFile(i2p::util::config::mapArgs, i2p::util::config::mapMultiArgs); |
|
|
|
|
|
|
|
|
|
|
|
#ifndef _WIN32 |
|
|
|
#ifndef _WIN32 |
|
|
|
struct sigaction sa; |
|
|
|
|
|
|
|
sa.sa_handler = handle_sighup; |
|
|
|
|
|
|
|
sigemptyset(&sa.sa_mask); |
|
|
|
|
|
|
|
sa.sa_flags = SA_RESTART; |
|
|
|
|
|
|
|
if (sigaction(SIGHUP,&sa,0) == -1) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
LogPrint("Failed to install SIGHUP handler."); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (i2p::util::config::GetArg("-daemon", 0) == 1) |
|
|
|
if (i2p::util::config::GetArg("-daemon", 0) == 1) |
|
|
|
{ |
|
|
|
{ |
|
|
|
pid_t pid; |
|
|
|
pid_t pid; |
|
|
@ -96,12 +93,36 @@ int main( int argc, char* argv[] ) |
|
|
|
LogPrint("Error, could not create process group."); |
|
|
|
LogPrint("Error, could not create process group."); |
|
|
|
return -1; |
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
chdir(i2p::util::filesystem::GetDataDir().string().c_str()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Handle shutdown
|
|
|
|
// Pidfile
|
|
|
|
signal(SIGABRT, &handle_shutdown); |
|
|
|
std::string pidfile = i2p::util::filesystem::GetDataDir().string(); |
|
|
|
signal(SIGTERM, &handle_shutdown); |
|
|
|
pidfile.append("/i2pd.pid"); |
|
|
|
signal(SIGINT, &handle_shutdown); |
|
|
|
int pidFilehandle = open(pidfile.c_str(), O_RDWR|O_CREAT, 0600); |
|
|
|
|
|
|
|
if (pidFilehandle == -1 ) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
LogPrint("Error, could not create pid file (", pidfile, ")\nIs an instance already running?"); |
|
|
|
|
|
|
|
return -1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (lockf(pidFilehandle,F_TLOCK,0) == -1) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
LogPrint("Error, could not lock pid file (", pidfile, ")\nIs an instance already running?"); |
|
|
|
|
|
|
|
return -1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
char pid[10]; |
|
|
|
|
|
|
|
sprintf(pid,"%d\n",getpid()); |
|
|
|
|
|
|
|
write(pidFilehandle, pid, strlen(pid)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Signal handler
|
|
|
|
|
|
|
|
struct sigaction sa; |
|
|
|
|
|
|
|
sa.sa_handler = handle_signal; |
|
|
|
|
|
|
|
sigemptyset(&sa.sa_mask); |
|
|
|
|
|
|
|
sa.sa_flags = SA_RESTART; |
|
|
|
|
|
|
|
sigaction(SIGHUP,&sa,0); |
|
|
|
|
|
|
|
sigaction(SIGABRT,&sa,0); |
|
|
|
|
|
|
|
sigaction(SIGTERM,&sa,0); |
|
|
|
|
|
|
|
sigaction(SIGINT,&sa,0); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
if (i2p::util::config::GetArg("-log", 0) == 1) |
|
|
|
if (i2p::util::config::GetArg("-log", 0) == 1) |
|
|
@ -144,5 +165,9 @@ int main( int argc, char* argv[] ) |
|
|
|
{ |
|
|
|
{ |
|
|
|
fclose (stdout); |
|
|
|
fclose (stdout); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#ifndef _WIN32 |
|
|
|
|
|
|
|
close(pidFilehandle); |
|
|
|
|
|
|
|
unlink(pidfile.c_str()); |
|
|
|
|
|
|
|
#endif |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|