|
|
|
@ -23,6 +23,8 @@
|
|
|
|
|
#include <errno.h>
|
|
|
|
|
#include <sys/wait.h>
|
|
|
|
|
#include <sys/stat.h>
|
|
|
|
|
#include <sys/stat.h>
|
|
|
|
|
#include <signal.h>
|
|
|
|
|
|
|
|
|
|
struct process
|
|
|
|
|
{
|
|
|
|
@ -104,16 +106,21 @@ int process_run_section( int id )
|
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void redirect_io( int section )
|
|
|
|
|
static const char* logfile_for_section( int section )
|
|
|
|
|
{
|
|
|
|
|
const char* filename = NULL;
|
|
|
|
|
switch( section ) {
|
|
|
|
|
case 0: filename = "data/logs/webserver.log"; break;
|
|
|
|
|
case 1: filename = "data/logs/inbox.log"; break;
|
|
|
|
|
case 2: filename = "data/logs/outbox.log"; break;
|
|
|
|
|
case 5: filename = "data/logs/fetch.log"; break;
|
|
|
|
|
case 6: filename = "data/logs/tor.log"; break;
|
|
|
|
|
case 0: return "data/logs/webserver.log";
|
|
|
|
|
case 1: return "data/logs/inbox.log";
|
|
|
|
|
case 2: return "data/logs/outbox.log";
|
|
|
|
|
case 5: return "data/logs/fetch.log";
|
|
|
|
|
case 6: return "data/logs/tor.log";
|
|
|
|
|
}
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void redirect_io( int section )
|
|
|
|
|
{
|
|
|
|
|
const char* filename = logfile_for_section(section);
|
|
|
|
|
|
|
|
|
|
if( !filename ) { return; }
|
|
|
|
|
|
|
|
|
@ -161,6 +168,39 @@ void process_stop()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool rotate_log( int section )
|
|
|
|
|
{
|
|
|
|
|
const char* logfile = logfile_for_section(section);
|
|
|
|
|
if(!logfile) { return false; }
|
|
|
|
|
|
|
|
|
|
struct stat s;
|
|
|
|
|
if( -1 == stat( logfile, &s ) ) { return false; }
|
|
|
|
|
|
|
|
|
|
if( s.st_size < 50000000 ) { return false; }
|
|
|
|
|
|
|
|
|
|
char buffer1[512];
|
|
|
|
|
char buffer2[512];
|
|
|
|
|
|
|
|
|
|
snprintf( buffer1,sizeof(buffer1), "%s.%d", logfile, 5 );
|
|
|
|
|
unlink( buffer1 );
|
|
|
|
|
|
|
|
|
|
snprintf( buffer2,sizeof(buffer2), "%s.%d", logfile, 4 );
|
|
|
|
|
rename( buffer2, buffer1 );
|
|
|
|
|
|
|
|
|
|
snprintf( buffer1,sizeof(buffer1), "%s.%d", logfile, 3 );
|
|
|
|
|
rename( buffer1, buffer2 );
|
|
|
|
|
|
|
|
|
|
snprintf( buffer1,sizeof(buffer2), "%s.%d", logfile, 2 );
|
|
|
|
|
rename( buffer2, buffer1 );
|
|
|
|
|
|
|
|
|
|
snprintf( buffer1,sizeof(buffer1), "%s.%d", logfile, 1 );
|
|
|
|
|
rename( buffer1, buffer2 );
|
|
|
|
|
|
|
|
|
|
rename( logfile, buffer1 );
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void process_wait_for_finished()
|
|
|
|
|
{
|
|
|
|
|
while( !terminate ) {
|
|
|
|
@ -183,6 +223,9 @@ void process_wait_for_finished()
|
|
|
|
|
printf( "Restarting...\n" );
|
|
|
|
|
process_start_section( section );
|
|
|
|
|
}
|
|
|
|
|
} else if( rotate_log( child->section ) ) {
|
|
|
|
|
// Interrupt child process (Ctrl+C) to force restart with new log file
|
|
|
|
|
kill( child->pid, SIGINT );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|