blob: 89d914ad30ffbdba4eb8f7e3c57730ca511300ec [file] [log] [blame]
#include "Child.h"
void setLevel(int log_level)
{
time_t seconds = time(NULL);
tm* timeinfo = localtime(&seconds);
fstream file(FILE_NAME, ios::app);
switch (log_level)
{
case LOG_DEBUG_LEVEL:
{
file << asctime(timeinfo) << "some_debug_info" << endl;
file << asctime(timeinfo) << "Error: index out of range." << endl;
file << asctime(timeinfo) << "Error: could not find file." << endl;
file << asctime(timeinfo) << "Fatal_error: processes must be closed." << endl;
file.close();
cout << "some_debug_info" << endl;
cout << "Error: index out of range." << endl;
cout << "Error: could not find file." << endl;
cout << "Fatal_error: processes must be closed." << endl;
break;
}
case LOG_ERROR_LEVEL:
{
file << asctime(timeinfo) << "Error: could not find file." << endl;
file << asctime(timeinfo) << "Fatal_error: processes must be closed." << endl;
file.close();
cout << "Error: could not find file." << endl;
cout << "Fatal_error: processes must be closed." << endl;
break;
}
case LOG_FATAL_LEVEL:
{
file << asctime(timeinfo) << "Fatal_error: processes must be closed." << endl;
file.close();
cout << "Fatal_error: processes must be closed." << endl;
break;
}
}
}
#ifdef _MSC_VER
#define UP_EVENT 'U'
#define DOWN_EVENT 'D'
#define EXIT_EVENT 'E'
#define ACCESS_EVENT "A"
#else
void handler(int p)
{
switch(p)
{
case SIGINT:
{
exit(0);
}
case SIGHUP:
{
setLevel();
cout << "getppid() = " << getppid() << endl;
kill(getppid(), SIGHUP);
return;
}
case SIGUSR1:
{
if (log_level < 2)
{
log_level++;
}
return;
}
case SIGUSR2:
{
cout << "Log level down" << endl;
if (log_level > 0)
{
log_level--;
}
return;
}
}
}
#endif
int main(int argc, char * argv[])
{
#ifdef _MSC_VER
HANDLE up_event;
HANDLE down_event;
HANDLE exit_event;
HANDLE access_event;
DWORD check;
char buff[3];
buff[0] = argv[0][0];
buff[2] = '\0';
int log_level = 2;
buff[1] = UP_EVENT;
if (!(up_event = OpenEventA(EVENT_ALL_ACCESS | EVENT_MODIFY_STATE, TRUE, buff)))
{
return 0;
}
buff[1] = DOWN_EVENT;
if (!(down_event = OpenEventA(EVENT_ALL_ACCESS | EVENT_MODIFY_STATE, TRUE, buff)))
{
return 0;
}
buff[1] = EXIT_EVENT;
if (!(exit_event = OpenEventA(EVENT_ALL_ACCESS | EVENT_MODIFY_STATE, TRUE, buff)))
{
return 0;
}
if (!(access_event = OpenEventA(EVENT_ALL_ACCESS | EVENT_MODIFY_STATE, TRUE, ACCESS_EVENT)))
{
return 0;
}
while (true)
{
check = WaitForSingleObject(up_event, NULL);
if (check == WAIT_OBJECT_0)
{
if (log_level < 2){
log_level++;
}
}
check = WaitForSingleObject(down_event, NULL);
if (check == WAIT_OBJECT_0)
{
if (log_level > 0){
log_level--;
}
}
check = WaitForSingleObject(exit_event, NULL);
if (check == WAIT_OBJECT_0)
{
return 0;
}
check = WaitForSingleObject(access_event, INFINITY);
if (check == WAIT_OBJECT_0)
{
setLevel(log_level);
SetEvent(access_event);
}
Sleep(4000);
}
#else
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa_handler = handler;
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGUSR1);
sigaddset(&set, SIGUSR2);
sigaddset(&set, SIGINT);
sigaddset(&set, SIGHUP);
act.sa_mask = set;
sigaction(SIGUSR1, &act, NULL);
sigaction(SIGUSR2, &act, NULL);
sigaction(SIGINT, &act, NULL);
sigaction(SIGHUP, &act, NULL);
#endif
}