X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/d6dde5a3f49c7036a73f835fac1ece3144397fb7..1a4a6350a9033f0c2d1e2b7e6c1a029bdaa46da6:/server/trackdb.c diff --git a/server/trackdb.c b/server/trackdb.c index 59f755f..57ebb68 100644 --- a/server/trackdb.c +++ b/server/trackdb.c @@ -34,6 +34,7 @@ #include #include #include +#include #include "event.h" #include "mem.h" @@ -157,22 +158,12 @@ static int reap_db_deadlock(ev_source attribute((unused)) *ev, static pid_t subprogram(ev_source *ev, const char *prog, int outputfd) { pid_t pid; - int lfd; /* If we're in the background then trap subprocess stdout/stderr */ - if(!isatty(2)) - lfd = logfd(ev, prog); - else - lfd = -1; if(!(pid = xfork())) { exitfn = _exit; ev_signal_atfork(ev); signal(SIGPIPE, SIG_DFL); - if(lfd != -1) { - xdup2(lfd, 1); - xdup2(lfd, 2); - xclose(lfd); - } if(outputfd != -1) { xdup2(outputfd, 1); xclose(outputfd); @@ -182,10 +173,10 @@ static pid_t subprogram(ev_source *ev, const char *prog, setpriority(PRIO_PROCESS, 0, 0); execlp(prog, prog, "--config", configfile, debugging ? "--debug" : "--no-debug", + log_default == &log_syslog ? "--syslog" : "--no-syslog", (char *)0); fatal(errno, "error invoking %s", prog); } - if(lfd != -1) xclose(lfd); return pid; } @@ -1024,7 +1015,6 @@ static int stats_finished(ev_source attribute((unused)) *ev, static int stats_read(ev_source attribute((unused)) *ev, ev_reader *reader, - int attribute((unused)) fd, void *ptr, size_t bytes, int eof, @@ -1040,7 +1030,6 @@ static int stats_read(ev_source attribute((unused)) *ev, } static int stats_error(ev_source attribute((unused)) *ev, - int attribute((unused)) fd, int errno_value, void *u) { struct stats_details *const d = u; @@ -1838,14 +1827,21 @@ static int reap_rescan(ev_source attribute((unused)) *ev, } void trackdb_rescan(ev_source *ev) { + int w; if(rescan_pid != -1) { error(0, "rescan already underway"); return; } rescan_pid = subprogram(ev, RESCAN, -1); - ev_child(ev, rescan_pid, 0, reap_rescan, 0); - D(("started rescanner")); - + if(ev) { + ev_child(ev, rescan_pid, 0, reap_rescan, 0); + D(("started rescanner")); + } else { + /* This is the first rescan, we block until it is complete */ + while(waitpid(rescan_pid, &w, 0) < 0 && errno == EINTR) + ; + reap_rescan(0, rescan_pid, w, 0, 0); + } } int trackdb_rescan_cancel(void) {