diff --git a/amprd.c b/amprd.c index 4eee8d2..5a3eb99 100644 --- a/amprd.c +++ b/amprd.c @@ -68,6 +68,7 @@ #include "commons.h" #define MAXPAYLOAD (2048) +#define PIDFILE "/var/run/amprd.pid" char *passwd = NULL; int debug = FALSE; @@ -83,6 +84,7 @@ uint32_t general_ampr_gw; uint32_t myips[MYIPSIZE]; +void (*sigterm_defhnd)(int); void on_alarm(int sig) { @@ -146,6 +148,16 @@ void on_hup(int sig) verbose = FALSE; } +void on_term(int sig) +{ + signal(SIGTERM, SIG_IGN); + + unlink(PIDFILE); + + signal(SIGTERM, sigterm_defhnd); + raise(SIGTERM); +} + uint32_t getip(const char *dev) { struct ifreq ifr; @@ -260,6 +272,7 @@ int main(int argc, char**argv) struct pollfd *pollfd; int i, j, payload, best, mask, bmask; Tunnel *tunnel; + FILE *pidfile; char *ip = malloc(MAXPAYLOAD + 18); /* eth header + tcp/ip frame + checksum */ char *rcv = malloc(MAXPAYLOAD + 20); /* ip header + tcp/ip frame */ @@ -343,7 +356,6 @@ int main(int argc, char**argv) sa.sa_handler = on_hup; sigaction(SIGHUP, &sa, 0); - if (FALSE == debug) { pid_t fork_res = -1; @@ -361,6 +373,12 @@ int main(int argc, char**argv) } } + sa.sa_handler = on_term; + sigaction(SIGTERM, &sa, 0); + pidfile = fopen(PIDFILE, "w"); + fprintf(pidfile, "%d\n", (int)getpid()); + fclose(pidfile); + pollfd = malloc(sizeof(struct pollfd) * (numtunnels + 1)); pollfd[0].fd = raw_socket;