X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/d25c461540eadff2230653059ea2f692ee8dfc63..ad2f8275a5fc0dba29ca97bc02342d1f1627e590:/server/trackdb.c diff --git a/server/trackdb.c b/server/trackdb.c index 1e643ef..c977b6a 100644 --- a/server/trackdb.c +++ b/server/trackdb.c @@ -36,6 +36,7 @@ #include #include #include +#include #include "event.h" #include "mem.h" @@ -217,7 +218,8 @@ static pid_t subprogram(ev_source *ev, const char *prog, /* If we're in the background then trap subprocess stdout/stderr */ if(!(pid = xfork())) { exitfn = _exit; - ev_signal_atfork(ev); + if(ev) + ev_signal_atfork(ev); signal(SIGPIPE, SIG_DFL); if(outputfd != -1) { xdup2(outputfd, 1); @@ -305,6 +307,7 @@ static DB *open_db(const char *path, */ void trackdb_open(int flags) { int newdb, err; + pid_t pid; /* sanity checks */ assert(opened == 0); @@ -337,8 +340,15 @@ void trackdb_open(int flags) { oldversion, config->dbversion); case TRACKDB_CAN_UPGRADE: /* This database needs upgrading */ - fatal(0, "database needs upgrading from %ld to %ld, which is not yet supported", - oldversion, config->dbversion); + info("invoking disorder-dbupgrade to upgrade from %ld to %ld", + oldversion, config->dbversion); + pid = subprogram(0, "disorder-dbupgrade", -1); + while(waitpid(pid, &err, 0) == -1 && errno == EINTR) + ; + if(err) + fatal(0, "disorder-dbupgrade %s", wstat(err)); + info("disorder-dbupgrade succeeded"); + break; case TRACKDB_OPEN_FOR_UPGRADE: break; default: