s4-drsserver: sort by DN to give tree order
authorAndrew Tridgell <tridge@samba.org>
Wed, 23 Sep 2009 00:07:33 +0000 (17:07 -0700)
committerAndrew Tridgell <tridge@samba.org>
Wed, 23 Sep 2009 00:10:06 +0000 (17:10 -0700)
This might help the windows client with ordered requests. Later we
need to support the "ancestors" mode flag.

source4/rpc_server/drsuapi/dcesrv_drsuapi.h
source4/rpc_server/drsuapi/drsutil.c
source4/rpc_server/drsuapi/getncchanges.c

index 685203360b514321b6d265e002bbbf66358ad2f2..a6b11c5dacd70e149d7840dce1fda6611d06cdf3 100644 (file)
@@ -54,7 +54,8 @@ int drsuapi_search_with_extended_dn(struct ldb_context *ldb,
                                    struct ldb_dn *basedn,
                                    enum ldb_scope scope,
                                    const char * const *attrs,
-                                   const char *format, ...) PRINTF_ATTRIBUTE(7,8);
+                                   const char *sort_attrib,
+                                   const char *format, ...) PRINTF_ATTRIBUTE(8,9);
 
 WERROR drs_security_level_check(struct dcesrv_call_state *dce_call,
                                const char* call);
index 03116f29d9e9a4464d47ea1174cfa75814c8e83c..ef48a9f0790a3442d691d50c574e40501857794f 100644 (file)
@@ -44,12 +44,13 @@ char *drs_ObjectIdentifier_to_string(TALLOC_CTX *mem_ctx,
 }
 
 int drsuapi_search_with_extended_dn(struct ldb_context *ldb,
-                               TALLOC_CTX *mem_ctx,
-                               struct ldb_result **_res,
-                               struct ldb_dn *basedn,
-                               enum ldb_scope scope,
-                               const char * const *attrs,
-                               const char *format, ...)
+                                   TALLOC_CTX *mem_ctx,
+                                   struct ldb_result **_res,
+                                   struct ldb_dn *basedn,
+                                   enum ldb_scope scope,
+                                   const char * const *attrs,
+                                   const char *sort_attrib,
+                                   const char *format, ...)
 {
        va_list ap;
        int ret;
@@ -93,6 +94,24 @@ int drsuapi_search_with_extended_dn(struct ldb_context *ldb,
                return ret;
        }
 
+       if (sort_attrib) {
+               struct ldb_server_sort_control *sort_control;
+               sort_control = talloc(req, struct ldb_server_sort_control);
+               if (sort_control == NULL) {
+                       talloc_free(tmp_ctx);
+                       return LDB_ERR_OPERATIONS_ERROR;
+               }
+               sort_control->attributeName = sort_attrib;
+               sort_control->orderingRule = NULL;
+               sort_control->reverse = 1;
+
+               ret = ldb_request_add_control(req, LDB_CONTROL_SERVER_SORT_OID, true, sort_control);
+               if (ret != LDB_SUCCESS) {
+                       return ret;
+               }
+       }
+
+
        ret = ldb_request(ldb, req);
        if (ret == LDB_SUCCESS) {
                ret = ldb_wait(req->handle, LDB_WAIT_ALL);
index 8538ea8ff14d4da9f7938fd4311dd6902ae4726d..56a37e99281d72378f50f74ea87a220d308db747 100644 (file)
@@ -268,7 +268,7 @@ WERROR dcesrv_drsuapi_DsGetNCChanges(struct dcesrv_call_state *dce_call, TALLOC_
        struct drsuapi_DsReplicaObjectListItemEx **currentObject;
        NTSTATUS status;
        DATA_BLOB session_key;
-       const char *attrs[] = { "*", "parentGUID", NULL };
+       const char *attrs[] = { "*", "parentGUID", "distinguishedName", NULL };
        WERROR werr;
        
        *r->out.level_out = 6;
@@ -322,6 +322,7 @@ WERROR dcesrv_drsuapi_DsGetNCChanges(struct dcesrv_call_state *dce_call, TALLOC_
        ncRoot_dn = ldb_dn_new(mem_ctx, sam_ctx, ncRoot->dn);
        ret = drsuapi_search_with_extended_dn(sam_ctx, mem_ctx, &site_res,
                                              ncRoot_dn, LDB_SCOPE_SUBTREE, attrs,
+                                             "distinguishedName",
                                              "(uSNChanged>=%llu)", 
                                              (unsigned long long)(r->in.req->req8.highwatermark.highest_usn+1));
        if (ret != LDB_SUCCESS) {