1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-10 13:57:47 +03:00

r2681: commit the first semi working search implementation

which exports data from a ldb.

I commit this code, so that someone can help me to find a strange
bug

metze
This commit is contained in:
Stefan Metzmacher 2004-09-27 08:52:31 +00:00 committed by Gerald (Jerry) Carter
parent c82a9cf750
commit 67bb491725
2 changed files with 89 additions and 3 deletions

View File

@ -8,6 +8,6 @@ INIT_OBJ_FILES = \
ldap_server/ldap_rootdse.o \
ldap_server/ldap_simple_ldb.o
REQUIRED_SUBSYSTEMS = \
LIBCLI_LDAP LIBLDB
LIBCLI_LDAP SAMDB
# End SUBSYSTEM SMB
#######################

View File

@ -20,14 +20,100 @@
#include "includes.h"
/* TODO: samdb_context is not a pulblic struct */
struct samdb_context {
struct ldb_context *ldb;
struct samdb_context **static_ptr;
};
#define ALLOC_CHECK(ptr, call) do {\
if (!(ptr)) {\
ldapsrv_terminate_connection(call->conn, "no memory");\
return NT_STATUS_NO_MEMORY;\
}\
} while(0)
static NTSTATUS sldb_Search(struct ldapsrv_partition *partition, struct ldapsrv_call *call,
struct ldap_SearchRequest *r)
{
struct ldap_Result *done;
struct ldapsrv_reply *done_r;
struct ldap_SearchResEntry *ent;
struct ldapsrv_reply *ent_r, *done_r;
int result = 32;
struct samdb_context *samdb;
struct ldb_message **res;
int i, j, y, count;
struct ldb_context *ldb;
enum ldb_scope scope = LDB_SCOPE_DEFAULT;
DEBUG(0, ("sldb_Search: %s\n", r->filter));
samdb = samdb_connect(call);
ldb = samdb->ldb;
switch (r->scope) {
case LDAP_SEARCH_SCOPE_BASE:
scope = LDB_SCOPE_BASE;
break;
case LDAP_SEARCH_SCOPE_SINGLE:
scope = LDB_SCOPE_ONELEVEL;
break;
case LDAP_SEARCH_SCOPE_SUB:
scope = LDB_SCOPE_SUBTREE;
break;
}
ldb_set_alloc(ldb, talloc_ldb_alloc, samdb);
count = ldb_search(ldb, r->basedn, scope, r->filter, r->attributes, &res);
if (count == 0) {
result = 32;
} else if (count == -1) {
result = 80;
}
for (i=0; i < count; i++) {
ent_r = ldapsrv_init_reply(call, LDAP_TAG_SearchResultEntry);
if (!ent_r) {
ldapsrv_terminate_connection(call->conn, "ldapsrv_init_reply() failed");
return NT_STATUS_NO_MEMORY;
}
ent = &ent_r->msg.r.SearchResultEntry;
ent->dn = talloc_steal(ent_r, res[i]->dn);
ALLOC_CHECK(ent->dn, call);
ent->num_attributes = res[i]->num_elements;
ent->attributes = talloc_array_p(ent_r, struct ldap_attribute, ent->num_attributes);
ALLOC_CHECK(ent->attributes, call);
for (j=0; j < ent->num_attributes; j++) {
ent->attributes[j].name = talloc_steal(ent->attributes, res[i]->elements[j].name);
ALLOC_CHECK(ent->attributes[j].name, call);
if (r->attributesonly) {
ent->attributes[j].num_values = 0;
ent->attributes[j].values = NULL;
continue;
}
ent->attributes[j].num_values = res[i]->elements[j].num_values;
ent->attributes[j].values = talloc_array_p(ent->attributes,
DATA_BLOB, ent->attributes[j].num_values);
ALLOC_CHECK(ent->attributes[j].values, call);
for (y=0; y < ent->attributes[j].num_values; y++) {
ent->attributes[j].values[y].length = res[i]->elements[j].values[y].length;
ent->attributes[j].values[y].data = talloc_steal(ent->attributes[j].values,
res[i]->elements[j].values[y].data);
ALLOC_CHECK(ent->attributes[j].values[y].data, call);
}
}
ldapsrv_queue_reply(call, ent_r);
}
ldb_set_alloc(ldb, talloc_ldb_alloc, call);
ldb_search_free(ldb, res);
talloc_free(samdb);
done_r = ldapsrv_init_reply(call, LDAP_TAG_SearchResultDone);
if (!done_r) {
ldapsrv_terminate_connection(call->conn, "ldapsrv_init_reply() failed");
@ -35,7 +121,7 @@ static NTSTATUS sldb_Search(struct ldapsrv_partition *partition, struct ldapsrv_
}
done = &done_r->msg.r.SearchResultDone;
done->resultcode = 32;
done->resultcode = result;
done->dn = NULL;
done->errormessage = NULL;
done->referral = NULL;