diff options
| author | Anders Betts <anders.betts@gmail.com> | 2026-09-18 10:35:11 +0200 |
|---|---|---|
| committer | Anders Betts <anders.betts@gmail.com> | 2026-09-18 10:35:11 +0200 |
| commit | 1e5b4927e5ae1d542d51158eb995d4f4b5a8b1c5 (patch) | |
| tree | 5d2b414abbe6550eaf403c6aa4b5f75eb703fa01 /src/bokfd.c | |
| parent | 7a0771215d9bd52dc9d6913abee56a9f62893d3e (diff) | |
| download | bokf-0.1.14.tar.gz bokf-0.1.14.zip | |
deploy: --dev hot-reloads the daemon via docker cp + SIGHUPv0.1.14
- bokfd re-execs its own binary on SIGHUP, closing listeners/db first
- scripts/deploy.sh --dev cross-builds and copies binaries into the
running container, then verifies the reported version
Diffstat (limited to 'src/bokfd.c')
| -rw-r--r-- | src/bokfd.c | 20 |
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; } |
