blob: 89d914ad30ffbdba4eb8f7e3c57730ca511300ec [file] [log] [blame]
ArtHell357e6a02016-04-19 08:39:55 +03001#include "Child.h"
ArtHellb50b45c2016-04-18 23:36:58 +03002
ArtHellb50b45c2016-04-18 23:36:58 +03003
ArtHell357e6a02016-04-19 08:39:55 +03004void setLevel(int log_level)
ArtHellb50b45c2016-04-18 23:36:58 +03005{
ArtHell357e6a02016-04-19 08:39:55 +03006
7 time_t seconds = time(NULL);
8 tm* timeinfo = localtime(&seconds);
9 fstream file(FILE_NAME, ios::app);
ArtHellb50b45c2016-04-18 23:36:58 +030010 switch (log_level)
11 {
12 case LOG_DEBUG_LEVEL:
13 {
ArtHellb50b45c2016-04-18 23:36:58 +030014 file << asctime(timeinfo) << "some_debug_info" << endl;
15 file << asctime(timeinfo) << "Error: index out of range." << endl;
16 file << asctime(timeinfo) << "Error: could not find file." << endl;
17 file << asctime(timeinfo) << "Fatal_error: processes must be closed." << endl;
18 file.close();
19 cout << "some_debug_info" << endl;
20 cout << "Error: index out of range." << endl;
21 cout << "Error: could not find file." << endl;
22 cout << "Fatal_error: processes must be closed." << endl;
23 break;
24 }
25 case LOG_ERROR_LEVEL:
26 {
ArtHellb50b45c2016-04-18 23:36:58 +030027 file << asctime(timeinfo) << "Error: could not find file." << endl;
28 file << asctime(timeinfo) << "Fatal_error: processes must be closed." << endl;
29 file.close();
30 cout << "Error: could not find file." << endl;
31 cout << "Fatal_error: processes must be closed." << endl;
32 break;
33 }
34 case LOG_FATAL_LEVEL:
35 {
ArtHellb50b45c2016-04-18 23:36:58 +030036 file << asctime(timeinfo) << "Fatal_error: processes must be closed." << endl;
37 file.close();
38 cout << "Fatal_error: processes must be closed." << endl;
39 break;
40 }
41 }
42}
43
44#ifdef _MSC_VER
45
46#define UP_EVENT 'U'
47#define DOWN_EVENT 'D'
48#define EXIT_EVENT 'E'
49#define ACCESS_EVENT "A"
50
51#else
52
53void handler(int p)
54{
55 switch(p)
56 {
57 case SIGINT:
58 {
59 exit(0);
60 }
61 case SIGHUP:
62 {
63 setLevel();
64 cout << "getppid() = " << getppid() << endl;
65 kill(getppid(), SIGHUP);
66 return;
67 }
68 case SIGUSR1:
69 {
70 if (log_level < 2)
71 {
72 log_level++;
73 }
74 return;
75 }
76
77 case SIGUSR2:
78 {
79 cout << "Log level down" << endl;
80 if (log_level > 0)
81 {
82 log_level--;
83 }
84 return;
85 }
86 }
87}
88#endif
89
90int main(int argc, char * argv[])
91{
92
93#ifdef _MSC_VER
94
95 HANDLE up_event;
96 HANDLE down_event;
97 HANDLE exit_event;
98 HANDLE access_event;
99 DWORD check;
100 char buff[3];
101 buff[0] = argv[0][0];
102 buff[2] = '\0';
ArtHell357e6a02016-04-19 08:39:55 +0300103 int log_level = 2;
ArtHellb50b45c2016-04-18 23:36:58 +0300104
105 buff[1] = UP_EVENT;
106 if (!(up_event = OpenEventA(EVENT_ALL_ACCESS | EVENT_MODIFY_STATE, TRUE, buff)))
107 {
108 return 0;
109 }
110
111 buff[1] = DOWN_EVENT;
112 if (!(down_event = OpenEventA(EVENT_ALL_ACCESS | EVENT_MODIFY_STATE, TRUE, buff)))
113 {
114 return 0;
115 }
116
117 buff[1] = EXIT_EVENT;
118 if (!(exit_event = OpenEventA(EVENT_ALL_ACCESS | EVENT_MODIFY_STATE, TRUE, buff)))
119 {
120 return 0;
121 }
122
123 if (!(access_event = OpenEventA(EVENT_ALL_ACCESS | EVENT_MODIFY_STATE, TRUE, ACCESS_EVENT)))
124 {
125 return 0;
126 }
127
128 while (true)
129 {
130 check = WaitForSingleObject(up_event, NULL);
131 if (check == WAIT_OBJECT_0)
132 {
133 if (log_level < 2){
134 log_level++;
135 }
136 }
137
138 check = WaitForSingleObject(down_event, NULL);
139 if (check == WAIT_OBJECT_0)
140 {
141 if (log_level > 0){
142 log_level--;
143 }
144 }
145
146 check = WaitForSingleObject(exit_event, NULL);
147 if (check == WAIT_OBJECT_0)
148 {
149 return 0;
150 }
151
152 check = WaitForSingleObject(access_event, INFINITY);
153 if (check == WAIT_OBJECT_0)
154 {
ArtHell357e6a02016-04-19 08:39:55 +0300155 setLevel(log_level);
ArtHellb50b45c2016-04-18 23:36:58 +0300156 SetEvent(access_event);
157 }
158 Sleep(4000);
159 }
160
161#else
162
163 struct sigaction act;
164 memset(&act, 0, sizeof(act));
165 act.sa_handler = handler;
166 sigset_t set;
167 sigemptyset(&set);
168 sigaddset(&set, SIGUSR1);
169 sigaddset(&set, SIGUSR2);
170 sigaddset(&set, SIGINT);
171 sigaddset(&set, SIGHUP);
172 act.sa_mask = set;
173 sigaction(SIGUSR1, &act, NULL);
174 sigaction(SIGUSR2, &act, NULL);
175 sigaction(SIGINT, &act, NULL);
176 sigaction(SIGHUP, &act, NULL);
177
178#endif
179
180}