Improve exiting when signaled

This commit is contained in:
styan 2020-05-09 11:02:30 +00:00
parent db034d845f
commit a6bc875e82
1 changed files with 31 additions and 3 deletions

View File

@ -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)
{