aboutsummaryrefslogtreecommitdiff
path: root/src/bokfd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bokfd.c')
-rw-r--r--src/bokfd.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/bokfd.c b/src/bokfd.c
index 944e910..933b274 100644
--- a/src/bokfd.c
+++ b/src/bokfd.c
@@ -38,6 +38,7 @@ struct conn {
};
static volatile sig_atomic_t g_stop = 0;
+static volatile sig_atomic_t g_reload = 0;
static size_t g_line_limit = 1024 * 1024;
static SSL_CTX *g_tls_ctx = NULL;
static time_t g_tls_cert_mtime = 0;
@@ -50,6 +51,12 @@ static void on_signal(int sig)
g_stop = 1;
}
+static void on_reload(int sig)
+{
+ (void)sig;
+ g_reload = 1;
+}
+
static int mkdir_p(const char *path, mode_t mode)
{
char tmp[4096];
@@ -582,6 +589,7 @@ int main(int argc, char **argv)
signal(SIGINT, on_signal);
signal(SIGTERM, on_signal);
+ signal(SIGHUP, on_reload);
signal(SIGPIPE, SIG_IGN);
sessions_init(g_cfg.session_ttl);
@@ -599,7 +607,7 @@ int main(int argc, char **argv)
int lfds[3];
int ltls[3];
- while (!g_stop) {
+ while (!g_stop && !g_reload) {
int n = 0;
int nlisteners = 0;
lfds[nlisteners] = lfd;
@@ -670,7 +678,10 @@ int main(int argc, char **argv)
nconns = keep;
}
- log_info("shutting down");
+ if (g_reload)
+ log_info("reloading on SIGHUP");
+ else
+ log_info("shutting down");
for (size_t i = 0; i < nconns; i++) {
if (conns[i].ssl)
SSL_free(conns[i].ssl);
@@ -691,5 +702,10 @@ int main(int argc, char **argv)
sessions_free_all();
sqlite3_close(db);
config_free();
+ if (g_reload) {
+ execv(argv[0], argv);
+ log_error("re-exec %s failed: %s", argv[0], strerror(errno));
+ return 1;
+ }
return 0;
}