diff --git a/server.c b/server.c index abf3101..5e209a7 100644 --- a/server.c +++ b/server.c @@ -82,6 +82,7 @@ server_new(const char *cfg_file) { int i; struct server *s = calloc(1, sizeof(struct server)); + s->log.fd = -1; s->cfg = conf_read(cfg_file); /* workers */ @@ -178,6 +179,9 @@ server_start(struct server *s) { slog_init(s); + /* install signal handler to reload logs */ + signal(SIGHUP, slog_reload); + /* start worker threads */ for(i = 0; i < s->cfg->http_threads; ++i) { worker_start(s->w[i]); diff --git a/slog.c b/slog.c index d0539e5..6aaabd3 100644 --- a/slog.c +++ b/slog.c @@ -14,18 +14,30 @@ #include "server.h" #include "conf.h" +/* global pointer to the server objects, used to reload logs */ +static struct server *__server; + /** * Initialize log writer. */ void slog_init(struct server *s) { + __server = s; s->log.self = getpid(); if(s->cfg->logfile) { + + int old_fd = s->log.fd; + s->log.fd = open(s->cfg->logfile, O_WRONLY | O_APPEND | O_CREAT, S_IRUSR|S_IWUSR); + /* close old log */ + if (old_fd != -1) { + close(old_fd); + } + if (s->log.fd != -1) return; @@ -35,6 +47,14 @@ slog_init(struct server *s) { s->log.fd = 2; /* stderr */ } +/** + * Reload log file on SIGHUP + */ +void +slog_reload() { + slog_init(__server); +} + /** * Write log message to disk, or stderr. */ diff --git a/slog.h b/slog.h index b44804c..25d0d89 100644 --- a/slog.h +++ b/slog.h @@ -11,6 +11,9 @@ typedef enum { struct server; +void +slog_reload(); + void slog_init(struct server *s);