Support db1 and db3 at the same time

This commit is contained in:
Nicolas Williams
2016-11-08 15:41:38 -06:00
parent 033001e732
commit b83cf2f3bd
3 changed files with 35 additions and 20 deletions

View File

@@ -33,7 +33,7 @@
#include "hdb_locl.h"
#if defined(HAVE_DB1) && !defined(HAVE_DB3)
#if defined(HAVE_DB1)
#if defined(HAVE_DB_185_H)
#include <db_185.h>
@@ -336,8 +336,8 @@ DB_open(krb5_context context, HDB *db, int flags, mode_t mode)
}
krb5_error_code
hdb_db_create(krb5_context context, HDB **db,
const char *filename)
hdb_db1_create(krb5_context context, HDB **db,
const char *filename)
{
DB1_HDB **db1 = (DB1_HDB **)db;
*db = calloc(1, sizeof(**db1)); /* Allocate space for the larger db1 */
@@ -376,4 +376,4 @@ hdb_db_create(krb5_context context, HDB **db,
return 0;
}
#endif /* defined(HAVE_DB1) && !defined(HAVE_DB3) */
#endif /* defined(HAVE_DB1) */

View File

@@ -450,8 +450,8 @@ DB_open(krb5_context context, HDB *db, int flags, mode_t mode)
}
krb5_error_code
hdb_db_create(krb5_context context, HDB **db,
const char *filename)
hdb_db3_create(krb5_context context, HDB **db,
const char *filename)
{
DB3_HDB **db3 = (DB3_HDB **)db;
*db = calloc(1, sizeof(**db3)); /* Allocate space for the larger db3 */

View File

@@ -64,14 +64,17 @@
const int hdb_interface_version = HDB_INTERFACE_VERSION;
static struct hdb_method methods[] = {
#if HAVE_DB1 || HAVE_DB3
{ HDB_INTERFACE_VERSION, NULL, NULL, "db:", hdb_db_create},
/* "db:" should be db3 if we have db3, or db1 if we have db1 */
#if HAVE_DB3
{ HDB_INTERFACE_VERSION, NULL, NULL, "db:", hdb_db3_create},
#elif HAVE_DB1
{ HDB_INTERFACE_VERSION, NULL, NULL, "db:", hdb_db1_create},
#endif
#if HAVE_DB1
{ HDB_INTERFACE_VERSION, NULL, NULL, "db1:", hdb_db_create},
{ HDB_INTERFACE_VERSION, NULL, NULL, "db1:", hdb_db1_create},
#endif
#if HAVE_DB3
{ HDB_INTERFACE_VERSION, NULL, NULL, "db3:", hdb_db_create},
{ HDB_INTERFACE_VERSION, NULL, NULL, "db3:", hdb_db3_create},
#endif
#if HAVE_DB1
{ HDB_INTERFACE_VERSION, NULL, NULL, "mit-db:", hdb_mitdb_create},
@@ -94,14 +97,22 @@ static struct hdb_method methods[] = {
{ 0, NULL, NULL, NULL, NULL}
};
/*
* It'd be nice if we could try opening an HDB with each supported
* backend until one works or all fail. It may not be possible for all
* flavors, but where it's possible we should.
*/
#if defined(HAVE_LMDB)
static struct hdb_method dbmetod =
static struct hdb_method default_dbmethod =
{ HDB_INTERFACE_VERSION, NULL, NULL, "", hdb_mdb_create };
#elif defined(HAVE_DB1) || defined(HAVE_DB3)
static struct hdb_method dbmetod =
{ HDB_INTERFACE_VERSION, NULL, NULL, "", hdb_db_create };
#elif defined(HAVE_DB3)
static struct hdb_method default_dbmethod =
{ HDB_INTERFACE_VERSION, NULL, NULL, "", hdb_db3_create };
#elif defined(HAVE_DB1)
static struct hdb_method default_dbmethod =
{ HDB_INTERFACE_VERSION, NULL, NULL, "", hdb_db1_create };
#elif defined(HAVE_NDBM)
static struct hdb_method dbmetod =
static struct hdb_method default_dbmethod =
{ HDB_INTERFACE_VERSION, NULL, NULL, "", hdb_ndbm_create };
#endif
@@ -321,13 +332,17 @@ find_method (const char *filename, const char **rest)
}
}
#if defined(HAVE_DB1) || defined(HAVE_DB3) || defined(HAVE_LMDB) || defined(HAVE_NDBM)
/* XXX This doesn't handle Windows */
if (strncmp(filename, "/", 1) == 0
|| strncmp(filename, "./", 2) == 0
|| strncmp(filename, "../", 3) == 0)
if (strncmp(filename, "/", sizeof("/") - 1) == 0
|| strncmp(filename, "./", sizeof("./") - 1) == 0
|| strncmp(filename, "../", sizeof("../") - 1) == 0
#ifdef WIN32
|| strncmp(filename, "\\\\", sizeof("\\\\") - 1)
|| (isalpha(filename[0]) && filename[1] == ':')
#endif
)
{
*rest = filename;
return &dbmetod;
return &default_dbmethod;
}
#endif