r12608: Remove some unused #include lines.
[kai/samba.git] / source4 / ldap_server / ldap_backend.c
index f62657e5793472220ada5c1e66bdca1e3c6af484..637ce7bd6380419f74776207a48ef0128ce14be1 100644 (file)
 */
 
 #include "includes.h"
+#include "ldap_server/ldap_server.h"
+#include "dlinklist.h"
 
 
-struct ldapsrv_reply *ldapsrv_init_reply(struct ldapsrv_call *call, enum ldap_request_tag type)
+struct ldapsrv_reply *ldapsrv_init_reply(struct ldapsrv_call *call, uint8_t type)
 {
        struct ldapsrv_reply *reply;
 
-       reply = talloc_p(call, struct ldapsrv_reply);
+       reply = talloc(call, struct ldapsrv_reply);
        if (!reply) {
                return NULL;
        }
+       reply->msg = talloc(reply, struct ldap_message);
+       if (reply->msg == NULL) {
+               talloc_free(reply);
+               return NULL;
+       }
 
-       reply->prev = reply->next = NULL;
-       reply->state = LDAPSRV_REPLY_STATE_NEW;
-       reply->msg.messageid = call->request.messageid;
-       reply->msg.type = type;
-       reply->msg.mem_ctx = reply;
+       reply->msg->messageid = call->request->messageid;
+       reply->msg->type = type;
 
        return reply;
 }
 
-NTSTATUS ldapsrv_queue_reply(struct ldapsrv_call *call, struct ldapsrv_reply *reply)
+void ldapsrv_queue_reply(struct ldapsrv_call *call, struct ldapsrv_reply *reply)
 {
        DLIST_ADD_END(call->replies, reply, struct ldapsrv_reply *);
-       return NT_STATUS_OK;
 }
 
-struct ldapsrv_partition *ldapsrv_get_partition(struct ldapsrv_connection *conn, const char *dn)
+struct ldapsrv_partition *ldapsrv_get_partition(struct ldapsrv_connection *conn, const char *dn, uint8_t scope)
 {
-       if (strcasecmp("", dn) == 0) {
-               return conn->service->rootDSE;
-       }
-
-       return conn->service->default_partition;
+       return conn->default_partition;
 }
 
 NTSTATUS ldapsrv_unwilling(struct ldapsrv_call *call, int error)
@@ -59,14 +58,14 @@ NTSTATUS ldapsrv_unwilling(struct ldapsrv_call *call, int error)
        struct ldapsrv_reply *reply;
        struct ldap_ExtendedResponse *r;
 
-       DEBUG(10,("Unwilling type[%d] id[%d]\n", call->request.type, call->request.messageid));
+       DEBUG(10,("Unwilling type[%d] id[%d]\n", call->request->type, call->request->messageid));
 
        reply = ldapsrv_init_reply(call, LDAP_TAG_ExtendedResponse);
        if (!reply) {
                return NT_STATUS_NO_MEMORY;
        }
 
-       r = &reply->msg.r.ExtendedResponse;
+       r = &reply->msg->r.ExtendedResponse;
        r->response.resultcode = error;
        r->response.dn = NULL;
        r->response.errormessage = NULL;
@@ -75,19 +74,20 @@ NTSTATUS ldapsrv_unwilling(struct ldapsrv_call *call, int error)
        r->value.data = NULL;
        r->value.length = 0;
 
-       return ldapsrv_queue_reply(call, reply);
+       ldapsrv_queue_reply(call, reply);
+       return NT_STATUS_OK;
 }
 
 static NTSTATUS ldapsrv_SearchRequest(struct ldapsrv_call *call)
 {
-       struct ldap_SearchRequest *req = &call->request.r.SearchRequest;
+       struct ldap_SearchRequest *req = &call->request->r.SearchRequest;
        struct ldapsrv_partition *part;
 
        DEBUG(10, ("SearchRequest"));
        DEBUGADD(10, (" basedn: %s", req->basedn));
-       DEBUGADD(10, (" filter: %s\n", req->filter));
+       DEBUGADD(10, (" filter: %s\n", ldb_filter_from_tree(call, req->tree)));
 
-       part = ldapsrv_get_partition(call->conn, req->basedn);
+       part = ldapsrv_get_partition(call->conn, req->basedn, req->scope);
 
        if (!part->ops->Search) {
                struct ldap_Result *done;
@@ -98,13 +98,14 @@ static NTSTATUS ldapsrv_SearchRequest(struct ldapsrv_call *call)
                        return NT_STATUS_NO_MEMORY;
                }
 
-               done = &done_r->msg.r.SearchResultDone;
+               done = &done_r->msg->r.SearchResultDone;
                done->resultcode = 53;
                done->dn = NULL;
                done->errormessage = NULL;
                done->referral = NULL;
 
-               return ldapsrv_queue_reply(call, done_r);
+               ldapsrv_queue_reply(call, done_r);
+               return NT_STATUS_OK;
        }
 
        return part->ops->Search(part, call, req);
@@ -112,13 +113,13 @@ static NTSTATUS ldapsrv_SearchRequest(struct ldapsrv_call *call)
 
 static NTSTATUS ldapsrv_ModifyRequest(struct ldapsrv_call *call)
 {
-       struct ldap_ModifyRequest *req = &call->request.r.ModifyRequest;
+       struct ldap_ModifyRequest *req = &call->request->r.ModifyRequest;
        struct ldapsrv_partition *part;
 
        DEBUG(10, ("ModifyRequest"));
        DEBUGADD(10, (" dn: %s", req->dn));
 
-       part = ldapsrv_get_partition(call->conn, req->dn);
+       part = ldapsrv_get_partition(call->conn, req->dn, LDAP_SEARCH_SCOPE_SUB);
 
        if (!part->ops->Modify) {
                return ldapsrv_unwilling(call, 53);
@@ -129,13 +130,13 @@ static NTSTATUS ldapsrv_ModifyRequest(struct ldapsrv_call *call)
 
 static NTSTATUS ldapsrv_AddRequest(struct ldapsrv_call *call)
 {
-       struct ldap_AddRequest *req = &call->request.r.AddRequest;
+       struct ldap_AddRequest *req = &call->request->r.AddRequest;
        struct ldapsrv_partition *part;
 
        DEBUG(10, ("AddRequest"));
        DEBUGADD(10, (" dn: %s", req->dn));
 
-       part = ldapsrv_get_partition(call->conn, req->dn);
+       part = ldapsrv_get_partition(call->conn, req->dn, LDAP_SEARCH_SCOPE_SUB);
 
        if (!part->ops->Add) {
                return ldapsrv_unwilling(call, 53);
@@ -146,13 +147,13 @@ static NTSTATUS ldapsrv_AddRequest(struct ldapsrv_call *call)
 
 static NTSTATUS ldapsrv_DelRequest(struct ldapsrv_call *call)
 {
-       struct ldap_DelRequest *req = &call->request.r.DelRequest;
+       struct ldap_DelRequest *req = &call->request->r.DelRequest;
        struct ldapsrv_partition *part;
 
        DEBUG(10, ("DelRequest"));
        DEBUGADD(10, (" dn: %s", req->dn));
 
-       part = ldapsrv_get_partition(call->conn, req->dn);
+       part = ldapsrv_get_partition(call->conn, req->dn, LDAP_SEARCH_SCOPE_SUB);
 
        if (!part->ops->Del) {
                return ldapsrv_unwilling(call, 53);
@@ -163,14 +164,14 @@ static NTSTATUS ldapsrv_DelRequest(struct ldapsrv_call *call)
 
 static NTSTATUS ldapsrv_ModifyDNRequest(struct ldapsrv_call *call)
 {
-       struct ldap_ModifyDNRequest *req = &call->request.r.ModifyDNRequest;
+       struct ldap_ModifyDNRequest *req = &call->request->r.ModifyDNRequest;
        struct ldapsrv_partition *part;
 
        DEBUG(10, ("ModifyDNRequrest"));
        DEBUGADD(10, (" dn: %s", req->dn));
        DEBUGADD(10, (" newrdn: %s", req->newrdn));
 
-       part = ldapsrv_get_partition(call->conn, req->dn);
+       part = ldapsrv_get_partition(call->conn, req->dn, LDAP_SEARCH_SCOPE_SUB);
 
        if (!part->ops->ModifyDN) {
                return ldapsrv_unwilling(call, 53);
@@ -181,13 +182,13 @@ static NTSTATUS ldapsrv_ModifyDNRequest(struct ldapsrv_call *call)
 
 static NTSTATUS ldapsrv_CompareRequest(struct ldapsrv_call *call)
 {
-       struct ldap_CompareRequest *req = &call->request.r.CompareRequest;
+       struct ldap_CompareRequest *req = &call->request->r.CompareRequest;
        struct ldapsrv_partition *part;
 
        DEBUG(10, ("CompareRequest"));
        DEBUGADD(10, (" dn: %s", req->dn));
 
-       part = ldapsrv_get_partition(call->conn, req->dn);
+       part = ldapsrv_get_partition(call->conn, req->dn, LDAP_SEARCH_SCOPE_SUB);
 
        if (!part->ops->Compare) {
                return ldapsrv_unwilling(call, 53);
@@ -215,14 +216,15 @@ static NTSTATUS ldapsrv_ExtendedRequest(struct ldapsrv_call *call)
                return NT_STATUS_NO_MEMORY;
        }
 
-       ZERO_STRUCT(reply->msg.r);
+       ZERO_STRUCT(reply->msg->r);
 
-       return ldapsrv_queue_reply(call, reply);
+       ldapsrv_queue_reply(call, reply);
+       return NT_STATUS_OK;
 }
 
 NTSTATUS ldapsrv_do_call(struct ldapsrv_call *call)
 {
-       switch(call->request.type) {
+       switch(call->request->type) {
        case LDAP_TAG_BindRequest:
                return ldapsrv_BindRequest(call);
        case LDAP_TAG_UnbindRequest:
@@ -247,3 +249,5 @@ NTSTATUS ldapsrv_do_call(struct ldapsrv_call *call)
                return ldapsrv_unwilling(call, 2);
        }
 }
+
+