186 program_handler(SIGTERM, term_handler); |
186 program_handler(SIGTERM, term_handler); |
187 program_handler(SIGINT, term_handler); |
187 program_handler(SIGINT, term_handler); |
188 program_handler(SIGHUP, reconfig_handler); |
188 program_handler(SIGHUP, reconfig_handler); |
189 } |
189 } |
190 |
190 |
|
191 static void check_pid() |
|
192 { |
|
193 int fh; |
|
194 char name[MAX_STRING]; |
|
195 char buffer[MAX_STRING]; |
|
196 int buffer_size; |
|
197 int pid, res; |
|
198 |
|
199 assert (get_config(PID_FILE, name, MAX_STRING) > 0); |
|
200 |
|
201 fh = open(name, O_RDONLY); |
|
202 if (fh == -1) |
|
203 { |
|
204 /* If the file doesn't exist, it's normal. */ |
|
205 return; |
|
206 } |
|
207 |
|
208 buffer_size = MAX_STRING; |
|
209 buffer_size = read(fh, buffer, buffer_size); |
|
210 if (buffer_size <= 0) |
|
211 { |
|
212 fprintf(stderr, "Error reading the pid file: %s\n", |
|
213 strerror(errno)); |
|
214 close(fh); |
|
215 return; |
|
216 } |
|
217 buffer[buffer_size] = '\0'; |
|
218 |
|
219 pid = atoi(buffer); |
|
220 |
|
221 if (pid > 0) |
|
222 { |
|
223 res = kill(pid, SIGHUP); |
|
224 if (res == 0) |
|
225 { |
|
226 /* The syslog_kernel seems to be running and restared */ |
|
227 fprintf(stderr,"syslog_kernel running. Restarted.\n"); |
|
228 close(fh); |
|
229 exit(0); |
|
230 } else if (res == -1) |
|
231 { |
|
232 fprintf(stderr,"An old pid file has been found. " |
|
233 "Ignoring it.\n"); |
|
234 } |
|
235 } |
|
236 |
|
237 close(fh); |
|
238 } |
|
239 |
|
240 static void write_pid() |
|
241 { |
|
242 int fh; |
|
243 char name[MAX_STRING]; |
|
244 char buffer[MAX_STRING]; |
|
245 int buffer_size; |
|
246 int res; |
|
247 |
|
248 assert (get_config(PID_FILE, name, MAX_STRING) > 0); |
|
249 |
|
250 fh = open(name, O_WRONLY | O_TRUNC | O_CREAT, 0644); |
|
251 if (fh == -1) |
|
252 { |
|
253 fprintf(stderr, "Error opening the pid file for write: %s\n", |
|
254 strerror(errno)); |
|
255 return; |
|
256 } |
|
257 |
|
258 buffer_size = snprintf(buffer, MAX_STRING, "%i", getpid()); |
|
259 if (buffer_size < MAX_STRING) |
|
260 { |
|
261 buffer[buffer_size++] = '\n'; |
|
262 } |
|
263 |
|
264 res = write(fh, buffer, buffer_size); |
|
265 if (buffer_size <= 0) |
|
266 fprintf(stderr, "Error writting the pid file: %s\n", |
|
267 strerror(errno)); |
|
268 |
|
269 close(fh); |
|
270 } |
|
271 |
|
272 static void remove_pid() |
|
273 { |
|
274 int res; |
|
275 char name[MAX_STRING]; |
|
276 |
|
277 assert (get_config(PID_FILE, name, MAX_STRING) > 0); |
|
278 res = unlink(name); |
|
279 |
|
280 if (res == -1) |
|
281 fprintf(stderr, "Error unlinking the pid file: %s\n", |
|
282 strerror(errno)); |
|
283 } |
|
284 |
|
285 |
|
286 |
191 int main(int argn, char *argv[]) |
287 int main(int argn, char *argv[]) |
192 { |
288 { |
193 int res; |
289 int res; |
|
290 |
|
291 check_pid(); |
|
292 write_pid(); |
194 |
293 |
195 install_signal_handlers(); |
294 install_signal_handlers(); |
196 |
295 |
197 do |
296 do |
198 { |
297 { |