diff options
author | SUZUKI, Shinsuke <suz@kame.net> | 2006-07-29 01:42:09 +0000 |
---|---|---|
committer | SUZUKI, Shinsuke <suz@kame.net> | 2006-07-29 01:42:09 +0000 |
commit | 0f9655313ebb4d789165c167262d8becba6e5d01 (patch) | |
tree | 7a8f3fad456b0fe9880dcf87263e4198f0f2ee00 /dhcp6relay.c | |
parent | db29f46178d816efe4061a849903a51fca6becf3 (diff) |
dhcp6s and dhcp6relay dumps process-id file, like dhcp6c
Diffstat (limited to 'dhcp6relay.c')
-rw-r--r-- | dhcp6relay.c | 61 |
1 files changed, 57 insertions, 4 deletions
diff --git a/dhcp6relay.c b/dhcp6relay.c index 98bc5d2..8032879 100644 --- a/dhcp6relay.c +++ b/dhcp6relay.c @@ -32,6 +32,7 @@ #include <sys/socket.h> #include <sys/queue.h> #include <sys/uio.h> +#include <sys/signal.h> #include <net/if.h> #ifdef __FreeBSD__ @@ -60,11 +61,16 @@ #include <config.h> #include <common.h> +#define DHCP6RELAY_PIDFILE "/var/run/dhcp6relay.pid" +static char *pid_file = DHCP6RELAY_PIDFILE; + static int ssock; /* socket for relaying to servers */ static int csock; /* socket for clients */ static int maxfd; /* maxi file descriptor for select(2) */ static int debug = 0; +static u_long sig_flags = 0; +#define SIGF_TERM 0x1 static char *relaydevice; static char *boundaddr; @@ -102,6 +108,8 @@ static struct prefix_list *make_prefix __P((char *)); static void relay6_init __P((int, char *[])); static void relay6_loop __P((void)); static void relay6_recv __P((int, int)); +static void process_signals __P((void)); +static void relay6_signal __P((int)); static int make_msgcontrol __P((struct msghdr *, void *, socklen_t, struct in6_pktinfo *, int)); static void relay_to_server __P((struct dhcp6 *, ssize_t, @@ -114,7 +122,7 @@ usage() { fprintf(stderr, "usage: dhcp6relay [-dDf] [-b boundaddr] [-H hoplim] " - "[-r relay-IF] [-s serveraddr] IF ...\n"); + "[-r relay-IF] [-s serveraddr] [-p pidfile] IF ...\n"); exit(0); } @@ -123,16 +131,17 @@ main(argc, argv) int argc; char *argv[]; { - int ch; + int ch, pid; char *progname; char *p; + FILE *pidfp; if ((progname = strrchr(*argv, '/')) == NULL) progname = *argv; else progname++; - while((ch = getopt(argc, argv, "b:dDfH:r:s:")) != -1) { + while((ch = getopt(argc, argv, "b:dDfH:r:s:p:")) != -1) { switch(ch) { case 'b': boundaddr = optarg; @@ -164,6 +173,9 @@ main(argc, argv) case 's': serveraddr = optarg; break; + case 'p': + pid_file = optarg; + break; default: usage(); exit(0); @@ -193,6 +205,13 @@ main(argc, argv) } setloglevel(debug); + /* dump current PID */ + pid = getpid(); + if ((pidfp = fopen(pid_file, "w")) != NULL) { + fprintf(pidfp, "%d\n", pid); + fclose(pidfp); + } + relay6_init(argc, argv); dprintf(LOG_INFO, FNAME, "dhcp6relay started"); @@ -479,6 +498,11 @@ relay6_init(int ifnum, char *iflist[]) } #endif + if (signal(SIGTERM, relay6_signal) == SIG_ERR) { + dprintf(LOG_WARNING, FNAME, "failed to set signal: %s", + strerror(errno)); + exit(1); + } return; failexit: @@ -486,12 +510,38 @@ relay6_init(int ifnum, char *iflist[]) } static void +relay6_signal(sig) + int sig; +{ + + dprintf(LOG_INFO, FNAME, "received a signal (%d)", sig); + + switch (sig) { + case SIGTERM: + sig_flags |= SIGF_TERM; + break; + } +} + +static void +process_signals() +{ + if ((sig_flags & SIGF_TERM)) { + unlink(pid_file); + exit(0); + } +} + +static void relay6_loop() { fd_set readfds; int e; while(1) { + if (sig_flags) + process_signals(); + /* we'd rather use FD_COPY here, but it's not POSIX friendly */ FD_ZERO(&readfds); FD_SET(csock, &readfds); @@ -503,8 +553,11 @@ relay6_loop() errx(1, "select returned 0"); /* NOTREACHED */ case -1: - err(1, "select"); + if (errno != EINTR) { + err(1, "select"); /* NOTREACHED */ + } + continue; default: break; } |