From 1b8e2de27e9bb66380d1370652003f2766a1e016 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Tue, 27 May 2008 01:43:37 +0000 Subject: [PATCH] Remember the last version of Berkeley DB that touched the database. Abort execution if someone tries to start up Citadel using an older version. --- citadel/database_sleepycat.c | 22 +++++++++++++++++++++- citadel/server.h | 1 + citadel/server_main.c | 1 + 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/citadel/database_sleepycat.c b/citadel/database_sleepycat.c index 731dc9133..907a15aff 100644 --- a/citadel/database_sleepycat.c +++ b/citadel/database_sleepycat.c @@ -52,6 +52,7 @@ #include "sysdep_decls.h" #include "threads.h" #include "config.h" +#include "control.h" #include "ctdl_module.h" @@ -269,11 +270,30 @@ void open_databases(void) int i; char dbfilename[SIZ]; u_int32_t flags = 0; + int dbversion_major, dbversion_minor, dbversion_patch; + int current_dbversion = 0; CtdlLogPrintf(CTDL_DEBUG, "cdb_*: open_databases() starting\n"); CtdlLogPrintf(CTDL_DEBUG, "Compiled db: %s\n", DB_VERSION_STRING); CtdlLogPrintf(CTDL_INFO, " Linked db: %s\n", - db_version(NULL, NULL, NULL)); + db_version(&dbversion_major, &dbversion_minor, &dbversion_patch)); + + current_dbversion = (dbversion_major * 1000000) + (dbversion_minor * 1000) + dbversion_patch; + + CtdlLogPrintf(CTDL_DEBUG, "Calculated dbversion: %d\n", current_dbversion); + CtdlLogPrintf(CTDL_DEBUG, " Previous dbversion: %d\n", CitControl.MMdbversion); + + if (CitControl.MMdbversion > current_dbversion) { + CtdlLogPrintf(CTDL_EMERG, "You are attempting to run the Citadel server using a version\n" + "of Berkeley DB that is older than that which last created or\n" + "updated the database. Because this would probably cause data\n" + "corruption or loss, the server is aborting execution now.\n"); + exit(CTDLEXIT_DB); + } + + CitControl.MMdbversion = current_dbversion; + put_control(); + #ifdef HAVE_ZLIB CtdlLogPrintf(CTDL_INFO, "Linked zlib: %s\n", zlibVersion()); #endif diff --git a/citadel/server.h b/citadel/server.h index e7c2d21a2..bf3c71f32 100644 --- a/citadel/server.h +++ b/citadel/server.h @@ -185,6 +185,7 @@ struct CitControl { int version; /* Server-hosted upgrade level */ int fulltext_wordbreaker; /* ID of wordbreaker in use */ long MMfulltext; /* highest message number indexed */ + int MMdbversion; /* Version of Berkeley DB used on previous server run */ }; extern struct CitContext *ContextList; diff --git a/citadel/server_main.c b/citadel/server_main.c index be547e12e..cfb7ce64f 100644 --- a/citadel/server_main.c +++ b/citadel/server_main.c @@ -215,6 +215,7 @@ int main(int argc, char **argv) get_config(); config.c_ipgm_secret = rand(); + /* get_control() MUST MUST MUST be called BEFORE the databases are opened!! */ CtdlLogPrintf(CTDL_INFO, "Acquiring control record\n"); get_control(); -- 2.30.2