summaryrefslogtreecommitdiff
path: root/source4/rpc_server/samr/samdb.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2004-05-06 12:42:42 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:51:46 -0500
commit998aab3d29611b712dcf4ee69b07b5ec683a2ebe (patch)
tree27b70808df808a9074822f714398edab4feae813 /source4/rpc_server/samr/samdb.c
parent68293565de0b799dcc51e001dabf53adf88ee7ad (diff)
downloadsamba-998aab3d29611b712dcf4ee69b07b5ec683a2ebe.tar.gz
samba-998aab3d29611b712dcf4ee69b07b5ec683a2ebe.tar.bz2
samba-998aab3d29611b712dcf4ee69b07b5ec683a2ebe.zip
r514: added a context pointer to the samdb interface, as suggested by
metze. Also added a reference count so that a client can close the connection handle and still used a derived domain handle. (This used to be commit b1cd98188d6f1f8236f5dbc7a3605a39ae27fb73)
Diffstat (limited to 'source4/rpc_server/samr/samdb.c')
-rw-r--r--source4/rpc_server/samr/samdb.c96
1 files changed, 62 insertions, 34 deletions
diff --git a/source4/rpc_server/samr/samdb.c b/source4/rpc_server/samr/samdb.c
index c0e0d12a7b..d384c6ada7 100644
--- a/source4/rpc_server/samr/samdb.c
+++ b/source4/rpc_server/samr/samdb.c
@@ -22,15 +22,10 @@
#include "includes.h"
+struct samdb_context {
+ struct ldb_context *ldb;
+};
-/*
- the way that unix fcntl locking works forces us to have a static ldb
- handle here rather than a much more sensible approach of having the
- ldb handle as part of the samr_Connect() pipe state. Otherwise we
- would try to open the ldb more than once, and tdb would rightly
- refuse the second open due to the broken nature of unix locking.
-*/
-static struct ldb_context *sam_db;
/*
this is used to catch debug messages from ldb
@@ -49,22 +44,48 @@ void samdb_debug(void *context, enum ldb_debug_level level, const char *fmt, va_
/*
connect to the SAM database
- return 0 on success, -1 on failure
+ return an opaque context pointer on success, or NULL on failure
*/
-int samdb_connect(void)
+void *samdb_connect(void)
{
- if (sam_db != NULL) {
- return 0;
+ struct samdb_context *ctx;
+ /*
+ the way that unix fcntl locking works forces us to have a
+ static ldb handle here rather than a much more sensible
+ approach of having the ldb handle as part of the
+ samr_Connect() pipe state. Otherwise we would try to open
+ the ldb more than once, and tdb would rightly refuse the
+ second open due to the broken nature of unix locking.
+ */
+ static struct ldb_context *static_sam_db;
+
+ if (static_sam_db == NULL) {
+ static_sam_db = ldb_connect(lp_sam_url(), 0, NULL);
+ if (static_sam_db == NULL) {
+ return NULL;
+ }
}
- sam_db = ldb_connect(lp_sam_url(), 0, NULL);
- if (sam_db == NULL) {
- return -1;
+ ldb_set_debug(static_sam_db, samdb_debug, NULL);
+
+ ctx = malloc_p(struct samdb_context);
+ if (!ctx) {
+ errno = ENOMEM;
+ return NULL;
}
- ldb_set_debug(sam_db, samdb_debug, NULL);
+ ctx->ldb = static_sam_db;
+
+ return ctx;
+}
- return 0;
+/* close a connection to the sam */
+void samdb_close(void *ctx)
+{
+ struct samdb_context *sam_ctx = ctx;
+ /* we don't actually close due to broken posix locking semantics */
+ sam_ctx->ldb = NULL;
+ free(sam_ctx);
}
/*
@@ -78,12 +99,14 @@ static void *samdb_alloc(void *context, void *ptr, size_t size)
/*
search the sam for the specified attributes - va_list varient
*/
-int samdb_search_v(TALLOC_CTX *mem_ctx,
+int samdb_search_v(void *ctx,
+ TALLOC_CTX *mem_ctx,
struct ldb_message ***res,
char * const *attrs,
const char *format,
va_list ap)
{
+ struct samdb_context *sam_ctx = ctx;
char *expr = NULL;
int count;
@@ -92,9 +115,9 @@ int samdb_search_v(TALLOC_CTX *mem_ctx,
return -1;
}
- ldb_set_alloc(sam_db, samdb_alloc, mem_ctx);
+ ldb_set_alloc(sam_ctx->ldb, samdb_alloc, mem_ctx);
- count = ldb_search(sam_db, NULL, LDB_SCOPE_SUBTREE, expr, attrs, res);
+ count = ldb_search(sam_ctx->ldb, NULL, LDB_SCOPE_SUBTREE, expr, attrs, res);
free(expr);
@@ -105,7 +128,8 @@ int samdb_search_v(TALLOC_CTX *mem_ctx,
/*
search the sam for the specified attributes - varargs varient
*/
-int samdb_search(TALLOC_CTX *mem_ctx,
+int samdb_search(void *ctx,
+ TALLOC_CTX *mem_ctx,
struct ldb_message ***res,
char * const *attrs,
const char *format, ...)
@@ -114,7 +138,7 @@ int samdb_search(TALLOC_CTX *mem_ctx,
int count;
va_start(ap, format);
- count = samdb_search_v(mem_ctx, res, attrs, format, ap);
+ count = samdb_search_v(ctx, mem_ctx, res, attrs, format, ap);
va_end(ap);
return count;
@@ -123,17 +147,20 @@ int samdb_search(TALLOC_CTX *mem_ctx,
/*
free up a search result
*/
-int samdb_search_free(TALLOC_CTX *mem_ctx, struct ldb_message **res)
+int samdb_search_free(void *ctx,
+ TALLOC_CTX *mem_ctx, struct ldb_message **res)
{
- ldb_set_alloc(sam_db, samdb_alloc, mem_ctx);
- return ldb_search_free(sam_db, res);
+ struct samdb_context *sam_ctx = ctx;
+ ldb_set_alloc(sam_ctx->ldb, samdb_alloc, mem_ctx);
+ return ldb_search_free(sam_ctx->ldb, res);
}
/*
search the sam for a single string attribute in exactly 1 record
*/
-char *samdb_search_string(TALLOC_CTX *mem_ctx,
+char *samdb_search_string(void *ctx,
+ TALLOC_CTX *mem_ctx,
const char *attr_name,
const char *format, ...)
{
@@ -144,7 +171,7 @@ char *samdb_search_string(TALLOC_CTX *mem_ctx,
char *str = NULL;
va_start(ap, format);
- count = samdb_search_v(mem_ctx, &res, attrs, format, ap);
+ count = samdb_search_v(ctx, mem_ctx, &res, attrs, format, ap);
va_end(ap);
if (count == 0) {
@@ -158,7 +185,7 @@ char *samdb_search_string(TALLOC_CTX *mem_ctx,
res[0]->elements[0].values[0].data == NULL) {
DEBUG(1,("samdb: search for %s %s not single valued\n",
attr_name, format));
- samdb_search_free(mem_ctx, res);
+ samdb_search_free(ctx, mem_ctx, res);
return NULL;
}
@@ -166,7 +193,7 @@ char *samdb_search_string(TALLOC_CTX *mem_ctx,
res[0]->elements[0].values[0].data,
res[0]->elements[0].values[0].length);
- samdb_search_free(mem_ctx, res);
+ samdb_search_free(ctx, mem_ctx, res);
return str;
}
@@ -176,7 +203,8 @@ char *samdb_search_string(TALLOC_CTX *mem_ctx,
search the sam for multipe records each giving a single string attribute
return the number of matches, or -1 on error
*/
-int samdb_search_string_multiple(TALLOC_CTX *mem_ctx,
+int samdb_search_string_multiple(void *ctx,
+ TALLOC_CTX *mem_ctx,
char ***strs,
const char *attr_name,
const char *format, ...)
@@ -187,7 +215,7 @@ int samdb_search_string_multiple(TALLOC_CTX *mem_ctx,
struct ldb_message **res = NULL;
va_start(ap, format);
- count = samdb_search_v(mem_ctx, &res, attrs, format, ap);
+ count = samdb_search_v(ctx, mem_ctx, &res, attrs, format, ap);
va_end(ap);
if (count <= 0) {
@@ -201,14 +229,14 @@ int samdb_search_string_multiple(TALLOC_CTX *mem_ctx,
res[i]->elements[0].values[0].data == NULL) {
DEBUG(1,("samdb: search for %s %s not single valued\n",
attr_name, format));
- samdb_search_free(mem_ctx, res);
+ samdb_search_free(ctx, mem_ctx, res);
return -1;
}
}
*strs = talloc_array_p(mem_ctx, char *, count+1);
if (! *strs) {
- samdb_search_free(mem_ctx, res);
+ samdb_search_free(ctx, mem_ctx, res);
return -1;
}
@@ -219,7 +247,7 @@ int samdb_search_string_multiple(TALLOC_CTX *mem_ctx,
}
(*strs)[count] = NULL;
- samdb_search_free(mem_ctx, res);
+ samdb_search_free(ctx, mem_ctx, res);
return count;
}