blob: 69558db6c077e19fdb71431960523eacfd45607a [file] [log] [blame]
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#include <cstdlib>
#include <windows.h>
#else
#include <unistd.h>
#include <stdio.h>
#include <cstring>
#include <sys/types.h>
#include <signal.h>
#endif
#include <string>
#include <fstream>
#include <ctime>
#include <cstdlib>
#include <iostream>
using namespace std;
#define FILE_NAME "log.log"
#define LOG_DEBUG_LEVEL 2
#define LOG_ERROR_LEVEL 1
#define LOG_FATAL_LEVEL 0
int log_level = 2;
void setLevel()
{
switch (log_level)
{
case LOG_DEBUG_LEVEL:
{
time_t seconds = time(NULL);
tm* timeinfo = localtime(&seconds);
fstream file(FILE_NAME, ios::app);
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:
{
time_t seconds = time(NULL);
tm* timeinfo = localtime(&seconds);
fstream file(FILE_NAME, ios::app);
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:
{
time_t seconds = time(NULL);
tm* timeinfo = localtime(&seconds);
fstream file(FILE_NAME, ios::app);
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';
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();
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
}