diff options
-rw-r--r-- | source4/cldap_server/netlogon.c | 2 | ||||
-rw-r--r-- | source4/lib/db_wrap.c | 37 | ||||
-rw-r--r-- | source4/lib/ldb/Makefile.in | 2 | ||||
-rw-r--r-- | source4/lib/ldb/config.mk | 3 | ||||
-rw-r--r-- | source4/lib/ldb/ldb_tdb/ldb_tdb.c | 30 | ||||
-rw-r--r-- | source4/lib/ldb/ldb_tdb/ldb_tdb.h | 4 | ||||
-rw-r--r-- | source4/lib/ldb/ldb_tdb/ldb_tdb_wrap.c | 115 |
7 files changed, 132 insertions, 61 deletions
diff --git a/source4/cldap_server/netlogon.c b/source4/cldap_server/netlogon.c index 3f6c8d4972..3e99fe80b8 100644 --- a/source4/cldap_server/netlogon.c +++ b/source4/cldap_server/netlogon.c @@ -55,7 +55,7 @@ static NTSTATUS cldapd_netlogon_fill(struct cldapd_server *cldapd, const char *pdc_ip; if (cldapd->samctx == NULL) { - cldapd->samctx = samdb_connect(mem_ctx); + cldapd->samctx = samdb_connect(cldapd); if (cldapd->samctx == NULL) { DEBUG(2,("Unable to open sam in cldap netlogon reply\n")); return NT_STATUS_INTERNAL_DB_CORRUPTION; diff --git a/source4/lib/db_wrap.c b/source4/lib/db_wrap.c index 57055462ff..8698e9affd 100644 --- a/source4/lib/db_wrap.c +++ b/source4/lib/db_wrap.c @@ -33,14 +33,6 @@ #include "lib/ldb/include/ldb.h" #include "db_wrap.h" -struct ldb_wrap { - struct ldb_context *ldb; - - const char *url; - struct ldb_wrap *next, *prev; -}; - -static struct ldb_wrap *ldb_list; static struct tdb_wrap *tdb_list; /* @@ -62,14 +54,6 @@ static void ldb_wrap_debug(void *context, enum ldb_debug_level level, free(s); } -/* destroy the last connection to a ldb */ -static int ldb_wrap_destructor(void *ctx) -{ - struct ldb_wrap *w = ctx; - DLIST_REMOVE(ldb_list, w); - return 0; -} - /* wrapped connection to a ldb database to close just talloc_free() the returned ldb_context @@ -80,18 +64,11 @@ struct ldb_context *ldb_wrap_connect(TALLOC_CTX *mem_ctx, const char *options[]) { struct ldb_context *ldb; - struct ldb_wrap *w; int ret; struct event_context *ev; char *real_url = NULL; - for (w = ldb_list; w; w = w->next) { - if (strcmp(url, w->url) == 0) { - return talloc_reference(mem_ctx, w->ldb); - } - } - - ldb = ldb_init(talloc_autofree_context()); + ldb = ldb_init(mem_ctx); if (ldb == NULL) { return NULL; } @@ -126,20 +103,8 @@ struct ldb_context *ldb_wrap_connect(TALLOC_CTX *mem_ctx, talloc_free(real_url); - w = talloc(ldb, struct ldb_wrap); - if (w == NULL) { - talloc_free(ldb); - return NULL; - } - - w->ldb = ldb; - w->url = talloc_strdup(w, url); - - talloc_set_destructor(w, ldb_wrap_destructor); ldb_set_debug(ldb, ldb_wrap_debug, NULL); - DLIST_ADD(ldb_list, w); - return ldb; } diff --git a/source4/lib/ldb/Makefile.in b/source4/lib/ldb/Makefile.in index 2f82f63714..81e2b147d5 100644 --- a/source4/lib/ldb/Makefile.in +++ b/source4/lib/ldb/Makefile.in @@ -46,7 +46,7 @@ TALLOC_OBJ=$(TALLOCDIR)/talloc.o LDB_TDB_OBJ=ldb_tdb/ldb_tdb.o \ ldb_tdb/ldb_pack.o ldb_tdb/ldb_search.o ldb_tdb/ldb_index.o \ - ldb_tdb/ldb_cache.o + ldb_tdb/ldb_cache.o ldb_tdb/ldb_tdb_wrap.o COMMON_OBJ=common/ldb.o common/ldb_ldif.o \ diff --git a/source4/lib/ldb/config.mk b/source4/lib/ldb/config.mk index 83de5730d4..0844fd056e 100644 --- a/source4/lib/ldb/config.mk +++ b/source4/lib/ldb/config.mk @@ -50,7 +50,8 @@ ADD_OBJ_FILES = \ lib/ldb/ldb_tdb/ldb_search.o \ lib/ldb/ldb_tdb/ldb_pack.o \ lib/ldb/ldb_tdb/ldb_index.o \ - lib/ldb/ldb_tdb/ldb_cache.o + lib/ldb/ldb_tdb/ldb_cache.o \ + lib/ldb/ldb_tdb/ldb_tdb_wrap.o REQUIRED_SUBSYSTEMS = \ LIBTDB NOPROTO = YES diff --git a/source4/lib/ldb/ldb_tdb/ldb_tdb.c b/source4/lib/ldb/ldb_tdb/ldb_tdb.c index 0c8d2cea3e..40cfe97c29 100644 --- a/source4/lib/ldb/ldb_tdb/ldb_tdb.c +++ b/source4/lib/ldb/ldb_tdb/ldb_tdb.c @@ -819,16 +819,6 @@ static const struct ldb_module_ops ltdb_ops = { /* - destroy the ltdb context -*/ -static int ltdb_destructor(void *p) -{ - struct ltdb_private *ltdb = p; - tdb_close(ltdb->tdb); - return 0; -} - -/* connect to the database */ int ltdb_connect(struct ldb_context *ldb, const char *url, @@ -837,7 +827,6 @@ int ltdb_connect(struct ldb_context *ldb, const char *url, const char *path; int tdb_flags, open_flags; struct ltdb_private *ltdb; - TDB_CONTEXT *tdb; /* parse the url */ if (strchr(url, ':')) { @@ -858,24 +847,21 @@ int ltdb_connect(struct ldb_context *ldb, const char *url, open_flags = O_CREAT | O_RDWR; } - /* note that we use quite a large default hash size */ - tdb = tdb_open(path, 10000, tdb_flags, open_flags, 0666); - if (!tdb) { - ldb_debug(ldb, LDB_DEBUG_ERROR, "Unable to open tdb '%s'\n", path); - return -1; - } - ltdb = talloc_zero(ldb, struct ltdb_private); if (!ltdb) { - tdb_close(tdb); ldb_oom(ldb); return -1; } - ltdb->tdb = tdb; - ltdb->sequence_number = 0; + /* note that we use quite a large default hash size */ + ltdb->tdb = ltdb_wrap_open(ltdb, path, 10000, tdb_flags, open_flags, 0666); + if (!ltdb->tdb) { + ldb_debug(ldb, LDB_DEBUG_ERROR, "Unable to open tdb '%s'\n", path); + talloc_free(ltdb); + return -1; + } - talloc_set_destructor(ltdb, ltdb_destructor); + ltdb->sequence_number = 0; ldb->modules = talloc(ldb, struct ldb_module); if (!ldb->modules) { diff --git a/source4/lib/ldb/ldb_tdb/ldb_tdb.h b/source4/lib/ldb/ldb_tdb/ldb_tdb.h index 46c5843d60..9ee3bfb70f 100644 --- a/source4/lib/ldb/ldb_tdb/ldb_tdb.h +++ b/source4/lib/ldb/ldb_tdb/ldb_tdb.h @@ -105,3 +105,7 @@ int ltdb_unlock_read(struct ldb_module *module); int ltdb_index_del_value(struct ldb_module *module, const char *dn, struct ldb_message_element *el, int v_idx); +struct tdb_context *ltdb_wrap_open(TALLOC_CTX *mem_ctx, + const char *path, int hash_size, int tdb_flags, + int open_flags, mode_t mode); + diff --git a/source4/lib/ldb/ldb_tdb/ldb_tdb_wrap.c b/source4/lib/ldb/ldb_tdb/ldb_tdb_wrap.c new file mode 100644 index 0000000000..f58ec7f7ff --- /dev/null +++ b/source4/lib/ldb/ldb_tdb/ldb_tdb_wrap.c @@ -0,0 +1,115 @@ +/* + ldb database library + + Copyright (C) Andrew Tridgell 2005 + + ** NOTE! The following LGPL license applies to the ldb + ** library. This does NOT imply that all of Samba is released + ** under the LGPL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "includes.h" +#include "ldb/include/ldb.h" +#include "ldb/include/ldb_private.h" +#include "ldb/ldb_tdb/ldb_tdb.h" + +/* + the purpose of this code is to work around the braindead posix locking + rules, to allow us to have a ldb open more than once while allowing + locking to work +*/ + +struct ltdb_wrap { + struct ltdb_wrap *next, *prev; + struct tdb_context *tdb; + dev_t device; + ino_t inode; +}; + +static struct ltdb_wrap *tdb_list; + +/* destroy the last connection to a tdb */ +static int ltdb_wrap_destructor(void *ctx) +{ + struct ltdb_wrap *w = talloc_get_type(ctx, struct ltdb_wrap); + tdb_close(w->tdb); + if (w->next) { + w->next->prev = w->prev; + } + if (w->prev) { + w->prev->next = w->next; + } + if (w == tdb_list) { + tdb_list = w->next; + } + return 0; +} + +/* + wrapped connection to a tdb database. The caller should _not_ free + this as it is not a talloc structure (as tdb does not use talloc + yet). It will auto-close when the caller frees the mem_ctx that is + passed to this call + */ +struct tdb_context *ltdb_wrap_open(TALLOC_CTX *mem_ctx, + const char *path, int hash_size, int tdb_flags, + int open_flags, mode_t mode) +{ + struct ltdb_wrap *w; + struct stat st; + + if (stat(path, &st) == 0) { + for (w=tdb_list;w;w=w->next) { + if (st.st_dev == w->device && st.st_ino == w->inode) { + talloc_reference(mem_ctx, w); + return w->tdb; + } + } + } + + w = talloc(mem_ctx, struct ltdb_wrap); + if (w == NULL) { + return NULL; + } + + w->tdb = tdb_open(path, hash_size, tdb_flags, open_flags, mode); + if (w->tdb == NULL) { + talloc_free(w); + return NULL; + } + + if (fstat(w->tdb->fd, &st) != 0) { + tdb_close(w->tdb); + talloc_free(w); + return NULL; + } + + w->device = st.st_dev; + w->inode = st.st_ino; + + talloc_set_destructor(w, ltdb_wrap_destructor); + + w->next = tdb_list; + w->prev = NULL; + if (tdb_list) { + tdb_list->prev = w; + } + tdb_list = w; + + return w->tdb; +} + |