Improve exiting when signaled
This commit is contained in:
parent
db034d845f
commit
a6bc875e82
|
@ -2,6 +2,7 @@
|
|||
#include <errno.h>
|
||||
#include <inttypes.h>
|
||||
#include <limits.h>
|
||||
#include <signal.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -102,6 +103,8 @@ struct connections {
|
|||
int timeout;
|
||||
};
|
||||
|
||||
static void exitsig(int);
|
||||
static void gracefulexitsig(int);
|
||||
static void rmpidfile(void);
|
||||
static uintmax_t strtou(const char *, uintmax_t, uintmax_t);
|
||||
static void oninput(struct connections *, size_t);
|
||||
|
@ -114,6 +117,8 @@ static size_t depct(char *, size_t, const char *, size_t);
|
|||
static size_t pctmatch(const char *, size_t, const char *);
|
||||
static int validurl(const char *, size_t);
|
||||
|
||||
static int sigexit = 0;
|
||||
static int siggracefulexit = 0;
|
||||
static const char *pidfile = NULL;
|
||||
|
||||
int
|
||||
|
@ -130,6 +135,7 @@ main(int argc, char *argv[])
|
|||
size_t max = MAXCONN;
|
||||
size_t slow = SLOWDOWN;
|
||||
size_t i;
|
||||
int timeout = INFTIM;
|
||||
int c;
|
||||
|
||||
#ifdef __OpenBSD__
|
||||
|
@ -215,14 +221,22 @@ main(int argc, char *argv[])
|
|||
(void)fclose(fp);
|
||||
(void)atexit(&rmpidfile);
|
||||
}
|
||||
(void)signal(SIGINT, &gracefulexitsig);
|
||||
(void)signal(SIGTERM, &exitsig);
|
||||
#ifdef __OpenBSD__
|
||||
if (pledge("stdio rpath cpath inet", NULL) != 0)
|
||||
err(EX_OSERR, "Could not pledge(2)");
|
||||
#endif
|
||||
conns.oninput = &oninput;
|
||||
c = INFTIM;
|
||||
while ((c = poll(conns.pfds, conns.count, c)) != -1 ||
|
||||
while ((c = poll(conns.pfds, conns.count, timeout)) != -1 ||
|
||||
errno == EINTR) {
|
||||
if (sigexit || (siggracefulexit && timeout == INFTIM)) {
|
||||
while (conns.count > 0)
|
||||
remconn(&conns, conns.count - 1);
|
||||
free(conns.list);
|
||||
free(conns.pfds);
|
||||
return (0);
|
||||
}
|
||||
/* Remove all connections that timed-out */
|
||||
now = time(NULL);
|
||||
for (i = 0; i < conns.count; i++)
|
||||
|
@ -253,7 +267,7 @@ main(int argc, char *argv[])
|
|||
for (i = 0; i < conns.count &&
|
||||
conns.list[i].state == CONN_STATE_LISTEN; i++)
|
||||
/* do nothing */;
|
||||
c = i < conns.count && conns.timeout > 0 ?
|
||||
timeout = i < conns.count && conns.timeout > 0 ?
|
||||
conns.timeout : INFTIM;
|
||||
}
|
||||
err(EX_OSERR, "poll(2) error");
|
||||
|
@ -269,6 +283,20 @@ usage:
|
|||
return (EX_USAGE);
|
||||
}
|
||||
|
||||
void
|
||||
exitsig(int sig)
|
||||
{
|
||||
|
||||
sigexit = 1;
|
||||
}
|
||||
|
||||
void
|
||||
gracefulexitsig(int sig)
|
||||
{
|
||||
|
||||
siggracefulexit = 1;
|
||||
}
|
||||
|
||||
void
|
||||
rmpidfile(void)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue