Here's a patch I put together for the OpenPKG project. It includes the modifications by Marco d'Itri of linux.it, and others by myself which seem to bring version 2.3.3 to comply with the latest API changes in Berkeley db 4.1.24. It seems that the Berkeley folks unfortunately made changes to the API in the minor versions of db 4.X which aren't reflected in my patch, so be warned. Regards, Michael diff -Naur inn-2.3.3.orig/storage/ovdb/ovdb.c inn-2.3.3/storage/ovdb/ovdb.c --- inn-2.3.3.orig/storage/ovdb/ovdb.c Thu Oct 10 14:29:29 2002 +++ inn-2.3.3/storage/ovdb/ovdb.c Thu Oct 10 16:15:55 2002 @@ -99,7 +99,7 @@ #error Need BerkeleyDB 2.6.x, 2.7.x, or 3.x #endif #else -#if DB_VERSION_MAJOR != 3 +#if DB_VERSION_MAJOR != 3 && DB_VERSION_MAJOR != 4 #error Need BerkeleyDB 2.6.x, 2.7.x, or 3.x #endif #endif @@ -382,6 +382,9 @@ static int open_db_file(int which) { int ret; +#if DB_VERSION_MAJOR == 4 + DB_TXN *txnp = NULL; +#endif if(dbs[which] != NULL) return 0; @@ -401,13 +404,28 @@ if(ovdb_conf.pagesize > 0) (dbs[which])->set_pagesize(dbs[which], ovdb_conf.pagesize); +#if DB_VERSION_MAJOR == 4 +/* starting sometime early db 4.X, db->open gets a new parameter txnp */ + if (ret = OVDBenv->txn_begin(OVDBenv, NULL, &txnp, 0)) { + (dbs[which])->close(dbs[which], 0); + dbs[which] = NULL; + return ret; + } + if(ret = (dbs[which])->open(dbs[which], txnp, _dbnames[which], NULL, + DB_BTREE, _db_flags, 0666)) { + (dbs[which])->close(dbs[which], 0); + dbs[which] = NULL; + return ret; + } +#else if(ret = (dbs[which])->open(dbs[which], _dbnames[which], NULL, DB_BTREE, - _db_flags, 0666)) { + _db_flags, 0666)) { (dbs[which])->close(dbs[which], 0); dbs[which] = NULL; return ret; } -#endif +#endif /* #if DB_VERSION_MAJOR == 4 */ +#endif /* #if DB_VERSION_MAJOR == 2 */ return 0; } @@ -590,7 +608,7 @@ return TRUE; } -#if DB_VERSION_MAJOR == 3 +#if DB_VERSION_MAJOR >= 3 static int upgrade_database(char *name) { int ret; @@ -636,6 +654,8 @@ DB *vdb; #if DB_VERSION_MAJOR == 2 DB_INFO dbinfo; +#elif DB_VERSION_MAJOR == 4 + DB_TXN *txnp = NULL; #endif DBT key, val; @@ -659,7 +679,7 @@ if(flags & OVDB_RECOVER) ai_flags |= DB_RECOVER; -#if DB_VERSION_MAJOR == 2 || DB_VERSION_MINOR < 2 +#if DB_VERSION_MAJOR == 2 || (DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR < 2) if(ovdb_conf.txn_nosync) ai_flags |= DB_TXN_NOSYNC; #endif @@ -697,12 +717,12 @@ OVDBenv->set_errcall(OVDBenv, OVDBerror); OVDBenv->set_cachesize(OVDBenv, 0, ovdb_conf.cachesize, 1); -#if DB_VERSION_MINOR >= 2 +#if (DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR >= 2) || DB_VERSION_MAJOR == 4 if(ovdb_conf.txn_nosync) OVDBenv->set_flags(OVDBenv, DB_TXN_NOSYNC, 1); #endif -#if DB_VERSION_MINOR == 0 +#if DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR == 0 if(ret = OVDBenv->open(OVDBenv, ovdb_conf.home, NULL, ai_flags, 0666)) { #else if(ret = OVDBenv->open(OVDBenv, ovdb_conf.home, ai_flags, 0666)) { @@ -726,12 +746,27 @@ syslog(L_FATAL, "OVDB: open: db_create: %s", db_strerror(ret)); return ret; } - if(ret = vdb->open(vdb, "version", NULL, DB_BTREE, + +#if DB_VERSION_MAJOR == 4 +/* starting sometime early db 4.X, db->open gets a new parameter txnp */ + if (ret = OVDBenv->txn_begin(OVDBenv, NULL, &txnp, 0)) { + vdb->close(vdb, 0); + vdb = NULL; + return ret; + } + if(ret = vdb->open(vdb, txnp, "version", NULL, DB_BTREE, _db_flags, 0666)) { vdb->close(vdb, 0); syslog(L_FATAL, "OVDB: open: version->open: %s", db_strerror(ret)); return ret; } +#else + if(ret = vdb->open(vdb, "version", NULL, DB_BTREE, _db_flags, 0666)) { + vdb->close(vdb, 0); + syslog(L_FATAL, "OVDB: open: version->open: %s", db_strerror(ret)); + return ret; + } +#endif /* DB_VERSION_MAJOR == 4 */ #endif /* DB_VERSION_MAJOR == 2 */ memset(&key, 0, sizeof key); @@ -779,6 +814,8 @@ #if DB_VERSION_MAJOR == 2 DB_INFO dbinfo; +#elif DB_VERSION_MAJOR == 4 + DB_TXN *txnp = NULL; #endif if(OVDBenv != NULL) { @@ -841,33 +878,77 @@ syslog(L_FATAL, "OVDB: open: db_create: %s", db_strerror(ret)); return FALSE; } + +#if DB_VERSION_MAJOR == 4 +/* starting sometime early db 4.X, db->open gets a new parameter txnp */ + if (ret = OVDBenv->txn_begin(OVDBenv, NULL, &txnp, 0)) { + groupstats->close(groupstats, 0); + groupstats = NULL; + return ret; + } + if(ret = groupstats->open(groupstats, txnp, "groupstats", NULL, + DB_BTREE, _db_flags, 0666)) { + groupstats->close(groupstats, 0); + syslog(L_FATAL, "OVDB: open: groupstats->open: %s", db_strerror(ret)); + return FALSE; + } +#else if(ret = groupstats->open(groupstats, "groupstats", NULL, DB_BTREE, _db_flags, 0666)) { groupstats->close(groupstats, 0); syslog(L_FATAL, "OVDB: open: groupstats->open: %s", db_strerror(ret)); return FALSE; } +#endif /* #if DB_VERSION_MAJOR == 4 */ if(ret = db_create(&groupsbyname, OVDBenv, 0)) { syslog(L_FATAL, "OVDB: open: db_create: %s", db_strerror(ret)); return FALSE; } +#if DB_VERSION_MAJOR == 4 + if (ret = OVDBenv->txn_begin(OVDBenv, NULL, &txnp, 0)) { + groupsbyname->close(groupsbyname, 0); + groupsbyname = NULL; + return ret; + } + if(ret = groupsbyname->open(groupsbyname, txnp, "groupsbyname", NULL, DB_HASH, + _db_flags, 0666)) { + groupsbyname->close(groupsbyname, 0); + syslog(L_FATAL, "OVDB: open: groupsbyname->open: %s", db_strerror(ret)); + return FALSE; + } +#else if(ret = groupsbyname->open(groupsbyname, "groupsbyname", NULL, DB_HASH, _db_flags, 0666)) { groupsbyname->close(groupsbyname, 0); syslog(L_FATAL, "OVDB: open: groupsbyname->open: %s", db_strerror(ret)); return FALSE; } +#endif /* #if DB_VERSION_MAJOR == 4 */ if(ret = db_create(&groupaliases, OVDBenv, 0)) { syslog(L_FATAL, "OVDB: open: db_create: %s", db_strerror(ret)); return FALSE; } +#if DB_VERSION_MAJOR == 4 + if (ret = OVDBenv->txn_begin(OVDBenv, NULL, &txnp, 0)) { + groupaliases->close(groupaliases, 0); + groupaliases = NULL; + return ret; + } + if(ret = groupaliases->open(groupaliases, txnp, "groupaliases", NULL, DB_HASH, + _db_flags, 0666)) { + groupaliases->close(groupaliases, 0); + syslog(L_FATAL, "OVDB: open: groupaliases->open: %s", db_strerror(ret)); + return FALSE; + } +#else if(ret = groupaliases->open(groupaliases, "groupaliases", NULL, DB_HASH, _db_flags, 0666)) { groupaliases->close(groupaliases, 0); syslog(L_FATAL, "OVDB: open: groupaliases->open: %s", db_strerror(ret)); return FALSE; } -#endif +#endif /* #if DB_VERSION_MAJOR == 4 */ +#endif /* #if DB_VERSION_MAJOR == 2 */ Cutofflow = FALSE; return TRUE; -- Attached file included as plaintext by Ecartis -- -----BEGIN PGP SIGNATURE----- Version: 2.6.3ia+4K iQEVAgUBPaa6JFuYv80UoVTdAQHC6gf/byPvvkEFxaM0lKgOzKtSfYBVA8xf6WqP Vz9WbJw2GTxW3qFFiyoaU24OAUg2YgO2iDturCIhP7Qh0T0nKi9zBWEAi1m5x7yy 8oU+DUeRO40xi2D9sMoNoaffUlPm0H2e7N6BuX/atyaQ0khYY6O7fXYVaLqPXsdG 8E9iPdkWtp0olMCGSK++wVG55N78dPRo4gmtqmy6da/tw2NtQO23aHvqJhLduPED x8pTRG8G2wh5qTEgvACqSQUJsIxbi5a/LsMbG8SoXGod6Wk9Y3zIcuW+vgNjkiiJ Fun2kukRkpBJW/MkHlk7wEeyfcdNrrowj2L6qA6R7y2/rUToPb2SNw== =0w4F -----END PGP SIGNATURE-----