5 kx
5 kx #include <stdlib.h>
5 kx #include <stdio.h>
5 kx #include <signal.h>
5 kx #include <sys/types.h>
5 kx #include <unistd.h>
5 kx
5 kx #define PIDFILE "/var/run/icmpinfo.pid"
5 kx
5 kx extern char *pname;
5 kx
5 kx void sig_handler(int);
5 kx void pid_file(void);
5 kx void pid_kill(void);
5 kx
5 kx void pid_file(void)
5 kx {
5 kx FILE *fp;
5 kx
5 kx if ((fp = fopen(PIDFILE, "w")) != (FILE *)NULL) {
5 kx fprintf(fp, "%d\n", getpid());
5 kx fclose(fp);
5 kx }
5 kx else
5 kx {
5 kx fprintf(stderr, "\n%s: Could not write PID file `%s', terminating.\n",
5 kx pname, PIDFILE);
5 kx exit(1);
5 kx }
5 kx signal(SIGHUP, sig_handler);
5 kx signal(SIGINT, sig_handler);
5 kx signal(SIGTERM, sig_handler);
5 kx }
5 kx
5 kx void sig_handler(int sig)
5 kx {
5 kx unlink(PIDFILE);
5 kx exit(0);
5 kx }
5 kx
5 kx void pid_kill(void)
5 kx {
5 kx FILE *fp;
5 kx int pid;
5 kx
5 kx if ((fp = fopen(PIDFILE, "r")) != (FILE *)NULL)
5 kx {
5 kx if (fscanf(fp, "%d", &pid) == 1)
5 kx {
5 kx kill(pid, SIGHUP);
5 kx sleep(1);
5 kx }
5 kx fclose(fp);
5 kx }
5 kx }
5 kx