From c6f24e99f099f39710671b6eecc25478508b4014 Mon Sep 17 00:00:00 2001 From: Nicolas Williams Date: Mon, 1 Jun 2015 11:48:31 -0500 Subject: [PATCH] Revamp cf/db.m4; test LMDB --- appl/login/Makefile.am | 2 +- cf/db.m4 | 72 +++++++++++++++++++---------------- kadmin/Makefile.am | 2 +- kdc/Makefile.am | 8 ++-- kpasswd/Makefile.am | 2 +- lib/hdb/Makefile.am | 3 +- lib/hdb/db.c | 4 ++ lib/hdb/db3.c | 5 +++ lib/hdb/hdb-mdb.c | 14 ++++--- lib/hdb/hdb.c | 9 ++++- lib/kadm5/Makefile.am | 4 +- lib/otp/Makefile.am | 6 +-- tests/db/Makefile.am | 18 ++++++++- tests/db/add-modify-delete.in | 5 ++- tests/db/check-aliases.in | 3 ++ tests/db/have-db.in | 3 +- tests/db/loaddump-db.in | 12 +++--- tests/kdc/check-iprop.in | 3 ++ 18 files changed, 111 insertions(+), 64 deletions(-) diff --git a/appl/login/Makefile.am b/appl/login/Makefile.am index 3a91b85e7..05da1db72 100644 --- a/appl/login/Makefile.am +++ b/appl/login/Makefile.am @@ -31,7 +31,7 @@ LDADD = $(LIB_otp) \ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_roken) \ $(LIB_security) \ - $(DBLIB) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) $(srcdir)/login-protos.h: $(login_SOURCES) cd $(srcdir); perl ../../cf/make-proto.pl -o login-protos.h -q -P comment $(login_SOURCES) || rm -f login-protos.h diff --git a/cf/db.m4 b/cf/db.m4 index b2749d33e..4ccf8bee1 100644 --- a/cf/db.m4 +++ b/cf/db.m4 @@ -24,10 +24,12 @@ AC_ARG_ENABLE(ndbm-db, AC_ARG_ENABLE(mdb-db, AS_HELP_STRING([--disable-mdb-db], - [if you don't want OpenLDAP libmdb db]),[ + [if you don't want LMDB]),[ ]) -have_ndbm=no +have_db1=no +have_db3=no +have_lmdb=no db_type=unknown AS_IF([test "x$with_berkeley_db" != xno], @@ -70,11 +72,11 @@ dnl db_create is used by db3 and db4 and db5 ],[NULL, NULL, 0]) if test "$ac_cv_func_db_create" = "yes"; then - db_type=db3 + have_db3=yes if test "$ac_cv_funclib_db_create" != "yes"; then - DBLIB="$ac_cv_funclib_db_create" + DB3LIB="$ac_cv_funclib_db_create" else - DBLIB="" + DB3LIB="" fi AC_DEFINE(HAVE_DB3, 1, [define if you have a berkeley db3/4/5 library]) fi @@ -93,11 +95,11 @@ dnl dbopen is used by db1/db2 ],[NULL, 0, 0, 0, NULL]) if test "$ac_cv_func_dbopen" = "yes"; then - db_type=db1 + have_db1=yes if test "$ac_cv_funclib_dbopen" != "yes"; then - DBLIB="$ac_cv_funclib_dbopen" + DB1LIB="$ac_cv_funclib_dbopen" else - DBLIB="" + DB1LIB="" fi AC_DEFINE(HAVE_DB1, 1, [define if you have a berkeley db1/2 library]) fi @@ -114,9 +116,9 @@ dnl test for ndbm compatability if test "$ac_cv_func_dbm_firstkey" = "yes"; then if test "$ac_cv_funclib_dbm_firstkey" != "yes"; then - LIB_NDBM="$ac_cv_funclib_dbm_firstkey" + NDBMLIB="$ac_cv_funclib_dbm_firstkey" else - LIB_NDBM="" + NDBMLIB="" fi AC_DEFINE(HAVE_DB_NDBM, 1, [define if you have ndbm compat in db]) AC_DEFINE(HAVE_NEW_DB, 1, [Define if NDBM really is DB (creates files *.db)]) @@ -128,13 +130,15 @@ dnl test for ndbm compatability ]) # fi berkeley db -if test "$enable_mdb_db" != "no"; then - if test "$db_type" = "unknown"; then - AC_CHECK_HEADER(mdb.h, [ - AC_CHECK_LIB(mdb, mdb_env_create, db_type=mdb; DBLIB="-lmdb" - AC_DEFINE(HAVE_MDB, 1, [define if you have the OpenLDAP mdb library]))]) - fi -fi + +AS_IF([test "x$enable_mdb_db" != xno], + [AC_CHECK_HEADER(lmdb.h, [ + AC_CHECK_LIB(lmdb, mdb_env_create, have_lmdb=yes; LMDBLIB="-llmdb" + AC_DEFINE(HAVE_LMDB, 1, [define if you have the LMDB library]))])]) + +AS_IF([test "x$have_db3" = xyes -a "$db_type" = unknown], db_type=db3, db_type=unknown) +AS_IF([test "x$have_db1" = xyes -a "$db_type" = unknown], db_type=db1, db_type=unknown) +AS_IF([test "x$have_lmdb" = xyes -a "$db_type" = unknown], db_type=lmdb, db_type=unknown) if test "$enable_ndbm_db" != "no"; then @@ -157,16 +161,12 @@ if test "$enable_ndbm_db" != "no"; then if test "$ac_cv_func_dbm_firstkey" = "yes"; then if test "$ac_cv_funclib_dbm_firstkey" != "yes"; then - LIB_NDBM="$ac_cv_funclib_dbm_firstkey" + NDBMLIB="$ac_cv_funclib_dbm_firstkey" else - LIB_NDBM="" + NDBMLIB="" fi AC_DEFINE(HAVE_NDBM, 1, [define if you have a ndbm library])dnl have_ndbm=yes - if test "$db_type" = "unknown"; then - db_type=ndbm - DBLIB="$LIB_NDBM" - fi else $as_unset ac_cv_func_dbm_firstkey @@ -184,15 +184,14 @@ if test "$enable_ndbm_db" != "no"; then if test "$ac_cv_func_dbm_firstkey" = "yes"; then if test "$ac_cv_funclib_dbm_firstkey" != "yes"; then - LIB_NDBM="$ac_cv_funclib_dbm_firstkey" + NDBMLIB="$ac_cv_funclib_dbm_firstkey" else - LIB_NDBM="" + NDBMLIB="" fi AC_DEFINE(HAVE_NDBM, 1, [define if you have a ndbm library])dnl have_ndbm=yes if test "$db_type" = "unknown"; then db_type=ndbm - DBLIB="$LIB_NDBM" fi fi fi @@ -229,10 +228,10 @@ int main(int argc, char **argv) fi],[AC_MSG_RESULT([no])],[AC_MSG_RESULT([no-cross])]) fi -AM_CONDITIONAL(HAVE_DB1, test "$db_type" = db1)dnl -AM_CONDITIONAL(HAVE_DB3, test "$db_type" = db3)dnl -AM_CONDITIONAL(HAVE_MDB, test "$db_type" = mdb)dnl -AM_CONDITIONAL(HAVE_NDBM, test "$db_type" = ndbm)dnl +AM_CONDITIONAL(HAVE_DB1, test "$have_db1" = yes)dnl +AM_CONDITIONAL(HAVE_DB3, test "$have_db3" = yes)dnl +AM_CONDITIONAL(HAVE_LMDB, test "$have_lmdb" = yes)dnl +AM_CONDITIONAL(HAVE_NDBM, test "$have_ndbm" = yes)dnl AM_CONDITIONAL(HAVE_DBHEADER, test "$dbheader" != "")dnl ## it's probably not correct to include LDFLAGS here, but we might @@ -243,7 +242,14 @@ for i in $LDFLAGS; do -L*) z="$z $i";; esac done -DBLIB="$z $DBLIB" -AC_SUBST(DBLIB)dnl -AC_SUBST(LIB_NDBM)dnl +DB3LIB="$z $DB3LIB" +DB1LIB="$z $DB1LIB" +LMDBLIB="$z $LMDBLIB" +NDMBLIB="$z $NDBMLIB" +AC_SUBST(DB3LIB)dnl +AC_SUBST(DB1LIB)dnl +AC_SUBST(LMDBLIB)dnl +AC_SUBST(NDBMLIB)dnl +AC_SUBST(NDBMLIB)dnl +AC_SUBST(db_type)dnl ]) diff --git a/kadmin/Makefile.am b/kadmin/Makefile.am index 3ac6950a0..085a4dd62 100644 --- a/kadmin/Makefile.am +++ b/kadmin/Makefile.am @@ -65,7 +65,7 @@ LDADD_common = \ $(LIB_hcrypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_roken) \ - $(DBLIB) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) kadmind_LDADD = $(top_builddir)/lib/kadm5/libkadm5srv.la \ ../lib/gssapi/libgssapi.la \ diff --git a/kdc/Makefile.am b/kdc/Makefile.am index ecd50eff4..64bcd2017 100644 --- a/kdc/Makefile.am +++ b/kdc/Makefile.am @@ -86,7 +86,7 @@ hprop_LDADD = \ $(LIB_hcrypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_roken) \ - $(DBLIB) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) hpropd_LDADD = \ $(top_builddir)/lib/hdb/libhdb.la \ @@ -95,7 +95,7 @@ hpropd_LDADD = \ $(LIB_hcrypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_roken) \ - $(DBLIB) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) if PKINIT LIB_pkinit = $(top_builddir)/lib/hx509/libhx509.la @@ -110,14 +110,14 @@ libkdc_la_LIBADD = \ $(LIB_hcrypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_roken) \ - $(DBLIB) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) LDADD = $(top_builddir)/lib/hdb/libhdb.la \ $(top_builddir)/lib/krb5/libkrb5.la \ $(LIB_hcrypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_roken) \ - $(DBLIB) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) kdc_LDADD = libkdc.la $(LDADD) $(LIB_pidfile) $(CAPNG_LIBS) diff --git a/kpasswd/Makefile.am b/kpasswd/Makefile.am index 4965cea3c..c2bfb6588 100644 --- a/kpasswd/Makefile.am +++ b/kpasswd/Makefile.am @@ -22,7 +22,7 @@ kpasswdd_LDADD = \ $(LDADD) \ $(LIB_pidfile) \ $(LIB_dlopen) \ - $(DBLIB) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) LDADD = $(top_builddir)/lib/krb5/libkrb5.la \ $(LIB_hcrypto) \ diff --git a/lib/hdb/Makefile.am b/lib/hdb/Makefile.am index a0590d6b4..b8c50cce4 100644 --- a/lib/hdb/Makefile.am +++ b/lib/hdb/Makefile.am @@ -110,8 +110,7 @@ libhdb_la_LIBADD = \ $(LIBADD_roken) \ $(ldap_lib) \ $(LIB_dlopen) \ - $(DBLIB) \ - $(LIB_NDBM) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) HDB_PROTOS = $(srcdir)/hdb-protos.h $(srcdir)/hdb-private.h diff --git a/lib/hdb/db.c b/lib/hdb/db.c index 106e95f5a..0b9e84337 100644 --- a/lib/hdb/db.c +++ b/lib/hdb/db.c @@ -157,6 +157,10 @@ DB_rename(krb5_context context, HDB *db, const char *new_name) int ret; char *old, *new; + if (strncmp(new_name, "db:", sizeof("db:") - 1) == 0) + new_name += sizeof("db:") - 1; + else if (strncmp(new_name, "db1:", sizeof("db1:") - 1) == 0) + new_name += sizeof("db1:") - 1; asprintf(&old, "%s.db", db->hdb_name); asprintf(&new, "%s.db", new_name); ret = rename(old, new); diff --git a/lib/hdb/db3.c b/lib/hdb/db3.c index 891cf9877..f809febed 100644 --- a/lib/hdb/db3.c +++ b/lib/hdb/db3.c @@ -168,6 +168,11 @@ DB_rename(krb5_context context, HDB *db, const char *new_name) int ret; char *old, *new; + if (strncmp(new_name, "db:", sizeof("db:") - 1) == 0) + new_name += sizeof("db:") - 1; + else if (strncmp(new_name, "db3:", sizeof("db3:") - 1) == 0) + new_name += sizeof("db3:") - 1; + ret = asprintf(&old, "%s.db", db->hdb_name); if (ret == -1) return ENOMEM; diff --git a/lib/hdb/hdb-mdb.c b/lib/hdb/hdb-mdb.c index ed144ef53..8a2467992 100644 --- a/lib/hdb/hdb-mdb.c +++ b/lib/hdb/hdb-mdb.c @@ -34,11 +34,11 @@ #include "hdb_locl.h" -#if HAVE_MDB +#if HAVE_LMDB -/* OpenLDAP MDB */ +/* LMDB */ -#include +#include #define KILO 1024 @@ -172,12 +172,16 @@ DB_rename(krb5_context context, HDB *db, const char *new_name) int ret; char *old, *new; + if (strncmp(new_name, "mdb:", sizeof("mdb:") - 1) == 0) + new_name += sizeof("mdb:") - 1; + else if (strncmp(new_name, "lmdb:", sizeof("lmdb:") - 1) == 0) + new_name += sizeof("lmdb:") - 1; if (asprintf(&old, "%s.mdb", db->hdb_name) == -1) return ENOMEM; if (asprintf(&new, "%s.mdb", new_name) == -1) { free(old); return ENOMEM; - } + } ret = rename(old, new); free(old); free(new); @@ -394,4 +398,4 @@ hdb_mdb_create(krb5_context context, HDB **db, (*db)->hdb_destroy = DB_destroy; return 0; } -#endif /* HAVE_MDB */ +#endif /* HAVE_LMDB */ diff --git a/lib/hdb/hdb.c b/lib/hdb/hdb.c index 3a6dd44c4..3b94c9c1b 100644 --- a/lib/hdb/hdb.c +++ b/lib/hdb/hdb.c @@ -70,8 +70,9 @@ static struct hdb_method methods[] = { #if HAVE_DB1 { HDB_INTERFACE_VERSION, NULL, NULL, "mit-db:", hdb_mitdb_create}, #endif -#if HAVE_MDB +#if HAVE_LMDB { HDB_INTERFACE_VERSION, NULL, NULL, "mdb:", hdb_mdb_create}, + { HDB_INTERFACE_VERSION, NULL, NULL, "lmdb:", hdb_mdb_create}, #endif #if HAVE_NDBM { HDB_INTERFACE_VERSION, NULL, NULL, "ndbm:", hdb_ndbm_create}, @@ -90,6 +91,9 @@ static struct hdb_method methods[] = { #if HAVE_DB1 || HAVE_DB3 static struct hdb_method dbmetod = { HDB_INTERFACE_VERSION, NULL, NULL, "", hdb_db_create }; +#elif defined(HAVE_LMDB) +static struct hdb_method dbmetod = + { HDB_INTERFACE_VERSION, NULL, NULL, "", hdb_mdb_create }; #elif defined(HAVE_NDBM) static struct hdb_method dbmetod = { HDB_INTERFACE_VERSION, NULL, NULL, "", hdb_ndbm_create }; @@ -310,7 +314,8 @@ find_method (const char *filename, const char **rest) return h; } } -#if defined(HAVE_DB1) || defined(HAVE_DB3) || defined(HAVE_NDBM) +#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) diff --git a/lib/kadm5/Makefile.am b/lib/kadm5/Makefile.am index 8c7ba153b..b7f329fe7 100644 --- a/lib/kadm5/Makefile.am +++ b/lib/kadm5/Makefile.am @@ -133,7 +133,7 @@ LDADD = \ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_hcrypto) \ $(LIB_roken) \ - $(DBLIB) \ + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) \ $(LIB_dlopen) \ $(LIB_pidfile) @@ -146,7 +146,7 @@ iprop_log_LDADD = \ $(top_builddir)/lib/sl/libsl.la \ $(LIB_readline) \ $(LIB_roken) \ - $(DBLIB) \ + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) \ $(LIB_dlopen) \ $(LIB_pidfile) diff --git a/lib/otp/Makefile.am b/lib/otp/Makefile.am index 6627c0701..38681ef0c 100644 --- a/lib/otp/Makefile.am +++ b/lib/otp/Makefile.am @@ -21,14 +21,14 @@ libotp_la_LIBADD = $(LIB_hcrypto) $(LIB_roken) if HAVE_DB1 ndbm_wrap = ndbm_wrap.c ndbm_wrap.h -libotp_la_LIBADD += $(LIB_db_create) +libotp_la_LIBADD += $(DB1LIB) else if HAVE_DB3 ndbm_wrap = ndbm_wrap.c ndbm_wrap.h -libotp_la_LIBADD += $(LIB_db_create) +libotp_la_LIBADD += $(DB3LIB) else ndbm_wrap = -libotp_la_LIBADD += $(LIB_NDBM) +libotp_la_LIBADD += $(NDBMLIB) endif endif diff --git a/tests/db/Makefile.am b/tests/db/Makefile.am index 22f0568de..5c4ace0a3 100644 --- a/tests/db/Makefile.am +++ b/tests/db/Makefile.am @@ -2,7 +2,7 @@ include $(top_srcdir)/Makefile.am.common -noinst_DATA = krb5.conf krb5.conf-sqlite +noinst_DATA = krb5.conf krb5.conf-sqlite krb5.conf-db3 krb5.conf-db1 krb5.conf-lmdb noinst_SCRIPTS = have-db @@ -13,6 +13,7 @@ TESTS = $(check_SCRIPTS) do_subst = sed -e 's,[@]srcdir[@],$(srcdir),g' \ -e 's,[@]top_builddir[@],$(top_builddir),g' \ -e 's,[@]objdir[@],$(top_builddir)/tests/db,g' \ + -e 's,[@]default_db_type[@],$(db_type),g' \ -e 's,[@]EGREP[@],$(EGREP),g' loaddump-db: loaddump-db.in Makefile @@ -48,6 +49,18 @@ krb5.conf-sqlite: krb5.conf.in Makefile $(do_subst) -e 's,[@]type[@],sqlite:,g' < $(srcdir)/krb5.conf.in > krb5.conf-sqlite.tmp mv krb5.conf-sqlite.tmp krb5.conf-sqlite +krb5.conf-db3: krb5.conf.in Makefile + $(do_subst) -e 's,[@]type[@],db3:,g' < $(srcdir)/krb5.conf.in > krb5.conf-db3.tmp + mv krb5.conf-db3.tmp krb5.conf-db3 + +krb5.conf-db1: krb5.conf.in Makefile + $(do_subst) -e 's,[@]type[@],db1:,g' < $(srcdir)/krb5.conf.in > krb5.conf-db1.tmp + mv krb5.conf-db1.tmp krb5.conf-db1 + +krb5.conf-lmdb: krb5.conf.in Makefile + $(do_subst) -e 's,[@]type[@],lmdb:,g' < $(srcdir)/krb5.conf.in > krb5.conf-lmdb.tmp + mv krb5.conf-lmdb.tmp krb5.conf-lmdb + krb5-mit.conf: krb5-mit.conf.in Makefile $(do_subst) < $(srcdir)/krb5-mit.conf.in > krb5-mit.conf.tmp mv krb5-mit.conf.tmp krb5-mit.conf @@ -64,6 +77,9 @@ CLEANFILES= \ mkey.file* \ krb5.conf krb5.conf.tmp \ krb5.conf-sqlite krb5.conf-sqlite.tmp \ + krb5.conf-db3 krb5.conf-db3.tmp \ + krb5.conf-db1 krb5.conf-db1.tmp \ + krb5.conf-lmdb krb5.conf-lmdb.tmp \ krb5-mit.conf krb5-mit.conf.tmp \ tempfile \ log.current-db* \ diff --git a/tests/db/add-modify-delete.in b/tests/db/add-modify-delete.in index fe9160039..278a63596 100644 --- a/tests/db/add-modify-delete.in +++ b/tests/db/add-modify-delete.in @@ -38,6 +38,9 @@ srcdir="@srcdir@" objdir="@objdir@" EGREP="@EGREP@" +default_db_type=@default_db_type@ +db_type=${1:-${default_db_type}} + # If there is no useful db support compile in, disable test ./have-db || exit 77 @@ -46,7 +49,7 @@ R=EXAMPLE.ORG kadmin="${TESTS_ENVIRONMENT} ../../kadmin/kadmin -l -r $R" iproplog="${TESTS_ENVIRONMENT} ../../lib/kadm5/iprop-log" -KRB5_CONFIG="${objdir}/krb5.conf" +KRB5_CONFIG="${objdir}/krb5.conf-${db_type}" export KRB5_CONFIG rm -f current-db* diff --git a/tests/db/check-aliases.in b/tests/db/check-aliases.in index e62a3e162..47aa01067 100644 --- a/tests/db/check-aliases.in +++ b/tests/db/check-aliases.in @@ -36,6 +36,9 @@ srcdir="@srcdir@" objdir="@objdir@" EGREP="@EGREP@" +default_db_type=@default_db_type@ +db_type=${1:-${default_db_type}} + testfailed="echo test failed; cat messages.log; exit 1" # If there is no useful db support compile in, disable test diff --git a/tests/db/have-db.in b/tests/db/have-db.in index 9dbb1f408..667c408a3 100644 --- a/tests/db/have-db.in +++ b/tests/db/have-db.in @@ -47,10 +47,11 @@ IFS="$oldIFS" while [ $# != 0 ] ; do case $1 in db:*) exit 0 ;; + db1:*) exit 0 ;; gdbm:*) exit 0 ;; db4:*) exit 0 ;; db3:*) exit 0 ;; - ldb:*) exit 0 ;; + lmdb:*) exit 0 ;; esac shift done diff --git a/tests/db/loaddump-db.in b/tests/db/loaddump-db.in index 2616c9b27..472580aa9 100644 --- a/tests/db/loaddump-db.in +++ b/tests/db/loaddump-db.in @@ -47,15 +47,13 @@ kstash="../../kdc/kstash" hprop="../../kdc/hprop" hpropd="../../kdc/hpropd" -type="${1}" -typesep="${type:+:}" -typeconf="${type:+-}" +default_db_type=@default_db_type@ +db_type=${1:-${default_db_type}} +propdb="${hprop} --database=${db_type}:./current-db -n" +propddb="${hpropd} --database=${db_type}:./current-db -n" -propdb="${hprop} --database=${type}${typesep}./current-db -n" -propddb="${hpropd} --database=${type}${typesep}./current-db -n" - -KRB5_CONFIG="${objdir}/krb5.conf${typeconf}${type}" +KRB5_CONFIG="${objdir}/krb5.conf-${db_type}" export KRB5_CONFIG rm -f current-db* diff --git a/tests/kdc/check-iprop.in b/tests/kdc/check-iprop.in index b4773288c..f85d99a2d 100644 --- a/tests/kdc/check-iprop.in +++ b/tests/kdc/check-iprop.in @@ -35,6 +35,9 @@ top_builddir="@top_builddir@" env_setup="@env_setup@" objdir="@objdir@" +default_db_type=@default_db_type@ +db_type=${1:-${default_db_type}} + . ${env_setup} # If there is no useful db support compile in, disable test