[SCM] Samba Shared Repository - branch master updated

Andrew Tridgell tridge at samba.org
Fri Jan 15 20:11:23 MST 2010


The branch, master has been updated
       via  ee73608... s4-kcc: added DsReplicaGetInfo pending ops call
       via  84b47d3... s4-provision: added w2k8r2 ldap capabilities
       via  637d50b... s4-devel: added rebuild_zone.sh
       via  a9808ae... s4-provision: added "check-names ignore;" to allow for _msdcs A records
       via  473345f... s4-kcc: added DsReplicaGetInfo CURSORS2 level
       via  93531a5... s4-idl: in DsReplicaGetInfo unknown2 is actually an enumeration_context
       via  c22973d... s4-kcc: added support for CURSORS info level in DsReplicaGetInfo
       via  8342d08... s4-dsdb: take advantage of local cursor and sort
       via  db7eba7... s4-dsdb: add our local cursor and sort in dsdb_load_udv_*()
       via  0bba440... s4-drs: use dsdb_load_udv_v2() in getncchanges code
       via  09d947f... s4-dsdb: use dsdb_load_udv_v2() in repl task
       via  4cef742... s4-dsdb: added dsdb_load_udv_v2() and dsdb_load_udv_v1()
       via  3ff3612... s4-kcc: simplify the ReplicaGetInfo implementation a bit
       via  900fea3... s4-kcc: squash a warning
       via  3a9b33b... s4-drs: better debug info when security checks fail
       via  5efff3a... s4-dsdb: require admin access for DsReplicaGetInfo
       via  5bfeed8... s4-drs: framework for DsGetReplInfo(), includes the DS_REPL_INFO_NEIGHBORS infoType.
       via  22d9215... s4-drs: give better debug info on unsupported DRS calls
       via  48bdf3e... s4-drs: torture test for DsGetReplInfo() (RPC-DSGETINFO test).
       via  51bf383... s4-dsdb: added isGlobalCatalogReady
      from  f85b6ee... Second part of bug 7045 - Bad (non memory copying) interfaces in smbc_setXXXX calls.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit ee736083c07e953a5fee944d3e048e2a38f98b30
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 16 13:40:51 2010 +1100

    s4-kcc: added DsReplicaGetInfo pending ops call
    
    Just return 0 pending ops for now

commit 84b47d33349ff12fa5951f3348db20a05879f614
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 16 13:20:46 2010 +1100

    s4-provision: added w2k8r2 ldap capabilities

commit 637d50b5d0eedced7c2cac6b0605a6c52eec2050
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 16 13:20:24 2010 +1100

    s4-devel: added rebuild_zone.sh
    
    This rebuilds a DNS zone file, including all DCs from sam.ldb

commit a9808ae83da936a2b93c9b8400ad2283a843ab4b
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 16 13:19:50 2010 +1100

    s4-provision: added "check-names ignore;" to allow for _msdcs A records

commit 473345f8003a89a365a80963c24cb90d932c4e31
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 16 12:10:40 2010 +1100

    s4-kcc: added DsReplicaGetInfo CURSORS2 level

commit 93531a52f030cad7d4237d7813fa1d73d641b35a
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 16 12:03:01 2010 +1100

    s4-idl: in DsReplicaGetInfo unknown2 is actually an enumeration_context

commit c22973d88dbfb46e5c387ff03b7bb66bada7cac3
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 16 11:49:39 2010 +1100

    s4-kcc: added support for CURSORS info level in DsReplicaGetInfo

commit 8342d08f5c3ffd02f54c5d5ace9e76cf551acb51
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 16 11:49:09 2010 +1100

    s4-dsdb: take advantage of local cursor and sort
    
    in getncchanges and repl task we don't need the extra load and sort
    any more.

commit db7eba7080e3f60da6751d638a31eaf3e36c9b12
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 16 11:48:25 2010 +1100

    s4-dsdb: add our local cursor and sort in dsdb_load_udv_*()
    
    This makes things much simpler for the callers

commit 0bba44094af9a1d88e0c2443d382993f1ebfb91e
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 16 11:08:59 2010 +1100

    s4-drs: use dsdb_load_udv_v2() in getncchanges code

commit 09d947f77cda4eb62c21cfd7acd539b8fe305a6a
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 16 11:08:44 2010 +1100

    s4-dsdb: use dsdb_load_udv_v2() in repl task

commit 4cef7427ec22df1a5c16a22820952f2f963dc1e3
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 16 11:08:15 2010 +1100

    s4-dsdb: added dsdb_load_udv_v2() and dsdb_load_udv_v1()

commit 3ff3612e29c16d7f3d87e06e6327d6b5bf530e2c
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 16 10:37:26 2010 +1100

    s4-kcc: simplify the ReplicaGetInfo implementation a bit

commit 900fea322cabaa279e016508c688107415ed0796
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 16 10:36:56 2010 +1100

    s4-kcc: squash a warning

commit 3a9b33b4876349165e7e16777fa283b128d525be
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 16 10:36:40 2010 +1100

    s4-drs: better debug info when security checks fail
    
    show the security token of the user at debug level 2

commit 5efff3ad6a7fdfe71101b2debe7d79678432c5c4
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 16 10:36:06 2010 +1100

    s4-dsdb: require admin access for DsReplicaGetInfo

commit 5bfeed89da6177adf9dfa49471adcbc25c7d0e7a
Author: Andrew Tridgell <tridge at samba.org>
Date:   Fri Jan 15 19:36:16 2010 +1100

    s4-drs: framework for DsGetReplInfo(), includes the DS_REPL_INFO_NEIGHBORS infoType.
    
    This patch includes the framework for the implementation of all infoTypes of
    the DsGetReplInfo() call, and includes the implementation for the first one,
    the DS_REPL_INFO_NEIGHBORS.
    
    Signed-off-by: Andrew Tridgell <tridge at samba.org>

commit 22d92157e35240b8b2f653a688dffd68a4b0e330
Author: Andrew Tridgell <tridge at samba.org>
Date:   Fri Jan 15 19:34:32 2010 +1100

    s4-drs: give better debug info on unsupported DRS calls

commit 48bdf3e608acf79926a7bc3acd9b0588216c7d64
Author: Erick Nogueira do Nascimento <erick.nogueira.nascimento at gmail.com>
Date:   Wed Dec 23 17:54:30 2009 -0200

    s4-drs: torture test for DsGetReplInfo() (RPC-DSGETINFO test).
    
    Signed-off-by: Andrew Tridgell <tridge at samba.org>

commit 51bf383c26cb3f867f376305c803dac04ff686a7
Author: Andrew Tridgell <tridge at samba.org>
Date:   Fri Jan 15 19:13:26 2010 +1100

    s4-dsdb: added isGlobalCatalogReady
    
    needed for dcdiag.exe

-----------------------------------------------------------------------

Summary of changes:
 librpc/gen_ndr/drsuapi.h                    |   14 +-
 librpc/gen_ndr/ndr_drsuapi.c                |   42 +-
 librpc/idl/drsuapi.idl                      |   14 +-
 source4/dsdb/common/util.c                  |  128 +++++++
 source4/dsdb/config.mk                      |    4 +-
 source4/dsdb/kcc/kcc_drs_replica_info.c     |  549 +++++++++++++++++++++++++++
 source4/dsdb/kcc/kcc_service.c              |   10 +-
 source4/dsdb/kcc/kcc_service.h              |    2 +
 source4/dsdb/repl/drepl_partitions.c        |   66 +---
 source4/dsdb/samdb/ldb_modules/rootdse.c    |   12 +
 source4/rpc_server/drsuapi/dcesrv_drsuapi.c |   46 ++-
 source4/rpc_server/drsuapi/drsutil.c        |   11 +-
 source4/rpc_server/drsuapi/getncchanges.c   |   93 +----
 source4/scripting/devel/rebuild_zone.sh     |  107 ++++++
 source4/setup/named.conf                    |    3 +
 source4/setup/provision_rootdse_add.ldif    |    2 +
 source4/torture/config.mk                   |    2 +-
 source4/torture/rpc/dsgetinfo.c             |  350 +++++++++++++++++
 source4/torture/rpc/rpc.c                   |    1 +
 19 files changed, 1251 insertions(+), 205 deletions(-)
 create mode 100644 source4/dsdb/kcc/kcc_drs_replica_info.c
 create mode 100755 source4/scripting/devel/rebuild_zone.sh
 create mode 100644 source4/torture/rpc/dsgetinfo.c


Changeset truncated at 500 lines:

diff --git a/librpc/gen_ndr/drsuapi.h b/librpc/gen_ndr/drsuapi.h
index 6cc62a8..a440b7a 100644
--- a/librpc/gen_ndr/drsuapi.h
+++ b/librpc/gen_ndr/drsuapi.h
@@ -1295,10 +1295,10 @@ struct drsuapi_DsReplicaGetInfoRequest2 {
 	enum drsuapi_DsReplicaInfoType info_type;
 	const char *object_dn;/* [unique,charset(UTF16)] */
 	struct GUID guid1;
-	uint32_t unknown1;
+	uint32_t flags;
 	const char *string1;/* [unique,charset(UTF16)] */
 	const char *string2;/* [unique,charset(UTF16)] */
-	uint32_t unknown2;
+	uint32_t enumeration_context;
 };
 
 union drsuapi_DsReplicaGetInfoRequest {
@@ -1420,13 +1420,13 @@ struct drsuapi_DsReplicaAttrValMetaData {
 
 struct drsuapi_DsReplicaAttrValMetaDataCtr {
 	uint32_t count;
-	int32_t enumeration_context;
+	uint32_t enumeration_context;
 	struct drsuapi_DsReplicaAttrValMetaData *array;/* [size_is(count)] */
 };
 
 struct drsuapi_DsReplicaCursor2Ctr {
 	uint32_t count;
-	int32_t enumeration_context;
+	uint32_t enumeration_context;
 	struct drsuapi_DsReplicaCursor2 *array;/* [size_is(count)] */
 };
 
@@ -1439,7 +1439,7 @@ struct drsuapi_DsReplicaCursor3 {
 
 struct drsuapi_DsReplicaCursor3Ctr {
 	uint32_t count;
-	int32_t enumeration_context;
+	uint32_t enumeration_context;
 	struct drsuapi_DsReplicaCursor3 *array;/* [size_is(count)] */
 };
 
@@ -1455,7 +1455,7 @@ struct drsuapi_DsReplicaObjMetaData2 {
 
 struct drsuapi_DsReplicaObjMetaData2Ctr {
 	uint32_t count;
-	int32_t enumeration_context;
+	uint32_t enumeration_context;
 	struct drsuapi_DsReplicaObjMetaData2 *array;/* [size_is(count)] */
 };
 
@@ -1476,7 +1476,7 @@ struct drsuapi_DsReplicaAttrValMetaData2 {
 
 struct drsuapi_DsReplicaAttrValMetaData2Ctr {
 	uint32_t count;
-	int32_t enumeration_context;
+	uint32_t enumeration_context;
 	struct drsuapi_DsReplicaAttrValMetaData2 *array;/* [size_is(count)] */
 };
 
diff --git a/librpc/gen_ndr/ndr_drsuapi.c b/librpc/gen_ndr/ndr_drsuapi.c
index 3b8ac3d..f18b9aa 100644
--- a/librpc/gen_ndr/ndr_drsuapi.c
+++ b/librpc/gen_ndr/ndr_drsuapi.c
@@ -9708,10 +9708,10 @@ static enum ndr_err_code ndr_push_drsuapi_DsReplicaGetInfoRequest2(struct ndr_pu
 		NDR_CHECK(ndr_push_drsuapi_DsReplicaInfoType(ndr, NDR_SCALARS, r->info_type));
 		NDR_CHECK(ndr_push_unique_ptr(ndr, r->object_dn));
 		NDR_CHECK(ndr_push_GUID(ndr, NDR_SCALARS, &r->guid1));
-		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->unknown1));
+		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->flags));
 		NDR_CHECK(ndr_push_unique_ptr(ndr, r->string1));
 		NDR_CHECK(ndr_push_unique_ptr(ndr, r->string2));
-		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->unknown2));
+		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->enumeration_context));
 		NDR_CHECK(ndr_push_trailer_align(ndr, 5));
 	}
 	if (ndr_flags & NDR_BUFFERS) {
@@ -9755,7 +9755,7 @@ static enum ndr_err_code ndr_pull_drsuapi_DsReplicaGetInfoRequest2(struct ndr_pu
 			r->object_dn = NULL;
 		}
 		NDR_CHECK(ndr_pull_GUID(ndr, NDR_SCALARS, &r->guid1));
-		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->unknown1));
+		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->flags));
 		NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_string1));
 		if (_ptr_string1) {
 			NDR_PULL_ALLOC(ndr, r->string1);
@@ -9768,7 +9768,7 @@ static enum ndr_err_code ndr_pull_drsuapi_DsReplicaGetInfoRequest2(struct ndr_pu
 		} else {
 			r->string2 = NULL;
 		}
-		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->unknown2));
+		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->enumeration_context));
 		NDR_CHECK(ndr_pull_trailer_align(ndr, 5));
 	}
 	if (ndr_flags & NDR_BUFFERS) {
@@ -9824,7 +9824,7 @@ _PUBLIC_ void ndr_print_drsuapi_DsReplicaGetInfoRequest2(struct ndr_print *ndr,
 	}
 	ndr->depth--;
 	ndr_print_GUID(ndr, "guid1", &r->guid1);
-	ndr_print_uint32(ndr, "unknown1", r->unknown1);
+	ndr_print_uint32(ndr, "flags", r->flags);
 	ndr_print_ptr(ndr, "string1", r->string1);
 	ndr->depth++;
 	if (r->string1) {
@@ -9837,7 +9837,7 @@ _PUBLIC_ void ndr_print_drsuapi_DsReplicaGetInfoRequest2(struct ndr_print *ndr,
 		ndr_print_string(ndr, "string2", r->string2);
 	}
 	ndr->depth--;
-	ndr_print_uint32(ndr, "unknown2", r->unknown2);
+	ndr_print_uint32(ndr, "enumeration_context", r->enumeration_context);
 	ndr->depth--;
 }
 
@@ -10969,7 +10969,7 @@ static enum ndr_err_code ndr_push_drsuapi_DsReplicaAttrValMetaDataCtr(struct ndr
 		NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->count));
 		NDR_CHECK(ndr_push_align(ndr, 8));
 		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count));
-		NDR_CHECK(ndr_push_int32(ndr, NDR_SCALARS, r->enumeration_context));
+		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->enumeration_context));
 		for (cntr_array_0 = 0; cntr_array_0 < r->count; cntr_array_0++) {
 			NDR_CHECK(ndr_push_drsuapi_DsReplicaAttrValMetaData(ndr, NDR_SCALARS, &r->array[cntr_array_0]));
 		}
@@ -10991,7 +10991,7 @@ static enum ndr_err_code ndr_pull_drsuapi_DsReplicaAttrValMetaDataCtr(struct ndr
 		NDR_CHECK(ndr_pull_array_size(ndr, &r->array));
 		NDR_CHECK(ndr_pull_align(ndr, 8));
 		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count));
-		NDR_CHECK(ndr_pull_int32(ndr, NDR_SCALARS, &r->enumeration_context));
+		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->enumeration_context));
 		NDR_PULL_ALLOC_N(ndr, r->array, ndr_get_array_size(ndr, &r->array));
 		_mem_save_array_0 = NDR_PULL_GET_MEM_CTX(ndr);
 		NDR_PULL_SET_MEM_CTX(ndr, r->array, 0);
@@ -11021,7 +11021,7 @@ _PUBLIC_ void ndr_print_drsuapi_DsReplicaAttrValMetaDataCtr(struct ndr_print *nd
 	ndr_print_struct(ndr, name, "drsuapi_DsReplicaAttrValMetaDataCtr");
 	ndr->depth++;
 	ndr_print_uint32(ndr, "count", r->count);
-	ndr_print_int32(ndr, "enumeration_context", r->enumeration_context);
+	ndr_print_uint32(ndr, "enumeration_context", r->enumeration_context);
 	ndr->print(ndr, "%s: ARRAY(%d)", "array", (int)r->count);
 	ndr->depth++;
 	for (cntr_array_0=0;cntr_array_0<r->count;cntr_array_0++) {
@@ -11042,7 +11042,7 @@ static enum ndr_err_code ndr_push_drsuapi_DsReplicaCursor2Ctr(struct ndr_push *n
 		NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->count));
 		NDR_CHECK(ndr_push_align(ndr, 8));
 		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count));
-		NDR_CHECK(ndr_push_int32(ndr, NDR_SCALARS, r->enumeration_context));
+		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->enumeration_context));
 		for (cntr_array_0 = 0; cntr_array_0 < r->count; cntr_array_0++) {
 			NDR_CHECK(ndr_push_drsuapi_DsReplicaCursor2(ndr, NDR_SCALARS, &r->array[cntr_array_0]));
 		}
@@ -11061,7 +11061,7 @@ static enum ndr_err_code ndr_pull_drsuapi_DsReplicaCursor2Ctr(struct ndr_pull *n
 		NDR_CHECK(ndr_pull_array_size(ndr, &r->array));
 		NDR_CHECK(ndr_pull_align(ndr, 8));
 		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count));
-		NDR_CHECK(ndr_pull_int32(ndr, NDR_SCALARS, &r->enumeration_context));
+		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->enumeration_context));
 		NDR_PULL_ALLOC_N(ndr, r->array, ndr_get_array_size(ndr, &r->array));
 		_mem_save_array_0 = NDR_PULL_GET_MEM_CTX(ndr);
 		NDR_PULL_SET_MEM_CTX(ndr, r->array, 0);
@@ -11085,7 +11085,7 @@ _PUBLIC_ void ndr_print_drsuapi_DsReplicaCursor2Ctr(struct ndr_print *ndr, const
 	ndr_print_struct(ndr, name, "drsuapi_DsReplicaCursor2Ctr");
 	ndr->depth++;
 	ndr_print_uint32(ndr, "count", r->count);
-	ndr_print_int32(ndr, "enumeration_context", r->enumeration_context);
+	ndr_print_uint32(ndr, "enumeration_context", r->enumeration_context);
 	ndr->print(ndr, "%s: ARRAY(%d)", "array", (int)r->count);
 	ndr->depth++;
 	for (cntr_array_0=0;cntr_array_0<r->count;cntr_array_0++) {
@@ -11177,7 +11177,7 @@ static enum ndr_err_code ndr_push_drsuapi_DsReplicaCursor3Ctr(struct ndr_push *n
 		NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->count));
 		NDR_CHECK(ndr_push_align(ndr, 8));
 		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count));
-		NDR_CHECK(ndr_push_int32(ndr, NDR_SCALARS, r->enumeration_context));
+		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->enumeration_context));
 		for (cntr_array_0 = 0; cntr_array_0 < r->count; cntr_array_0++) {
 			NDR_CHECK(ndr_push_drsuapi_DsReplicaCursor3(ndr, NDR_SCALARS, &r->array[cntr_array_0]));
 		}
@@ -11199,7 +11199,7 @@ static enum ndr_err_code ndr_pull_drsuapi_DsReplicaCursor3Ctr(struct ndr_pull *n
 		NDR_CHECK(ndr_pull_array_size(ndr, &r->array));
 		NDR_CHECK(ndr_pull_align(ndr, 8));
 		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count));
-		NDR_CHECK(ndr_pull_int32(ndr, NDR_SCALARS, &r->enumeration_context));
+		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->enumeration_context));
 		NDR_PULL_ALLOC_N(ndr, r->array, ndr_get_array_size(ndr, &r->array));
 		_mem_save_array_0 = NDR_PULL_GET_MEM_CTX(ndr);
 		NDR_PULL_SET_MEM_CTX(ndr, r->array, 0);
@@ -11229,7 +11229,7 @@ _PUBLIC_ void ndr_print_drsuapi_DsReplicaCursor3Ctr(struct ndr_print *ndr, const
 	ndr_print_struct(ndr, name, "drsuapi_DsReplicaCursor3Ctr");
 	ndr->depth++;
 	ndr_print_uint32(ndr, "count", r->count);
-	ndr_print_int32(ndr, "enumeration_context", r->enumeration_context);
+	ndr_print_uint32(ndr, "enumeration_context", r->enumeration_context);
 	ndr->print(ndr, "%s: ARRAY(%d)", "array", (int)r->count);
 	ndr->depth++;
 	for (cntr_array_0=0;cntr_array_0<r->count;cntr_array_0++) {
@@ -11360,7 +11360,7 @@ static enum ndr_err_code ndr_push_drsuapi_DsReplicaObjMetaData2Ctr(struct ndr_pu
 		NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->count));
 		NDR_CHECK(ndr_push_align(ndr, 8));
 		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count));
-		NDR_CHECK(ndr_push_int32(ndr, NDR_SCALARS, r->enumeration_context));
+		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->enumeration_context));
 		for (cntr_array_0 = 0; cntr_array_0 < r->count; cntr_array_0++) {
 			NDR_CHECK(ndr_push_drsuapi_DsReplicaObjMetaData2(ndr, NDR_SCALARS, &r->array[cntr_array_0]));
 		}
@@ -11382,7 +11382,7 @@ static enum ndr_err_code ndr_pull_drsuapi_DsReplicaObjMetaData2Ctr(struct ndr_pu
 		NDR_CHECK(ndr_pull_array_size(ndr, &r->array));
 		NDR_CHECK(ndr_pull_align(ndr, 8));
 		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count));
-		NDR_CHECK(ndr_pull_int32(ndr, NDR_SCALARS, &r->enumeration_context));
+		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->enumeration_context));
 		NDR_PULL_ALLOC_N(ndr, r->array, ndr_get_array_size(ndr, &r->array));
 		_mem_save_array_0 = NDR_PULL_GET_MEM_CTX(ndr);
 		NDR_PULL_SET_MEM_CTX(ndr, r->array, 0);
@@ -11412,7 +11412,7 @@ _PUBLIC_ void ndr_print_drsuapi_DsReplicaObjMetaData2Ctr(struct ndr_print *ndr,
 	ndr_print_struct(ndr, name, "drsuapi_DsReplicaObjMetaData2Ctr");
 	ndr->depth++;
 	ndr_print_uint32(ndr, "count", r->count);
-	ndr_print_int32(ndr, "enumeration_context", r->enumeration_context);
+	ndr_print_uint32(ndr, "enumeration_context", r->enumeration_context);
 	ndr->print(ndr, "%s: ARRAY(%d)", "array", (int)r->count);
 	ndr->depth++;
 	for (cntr_array_0=0;cntr_array_0<r->count;cntr_array_0++) {
@@ -11609,7 +11609,7 @@ static enum ndr_err_code ndr_push_drsuapi_DsReplicaAttrValMetaData2Ctr(struct nd
 		NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, r->count));
 		NDR_CHECK(ndr_push_align(ndr, 8));
 		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->count));
-		NDR_CHECK(ndr_push_int32(ndr, NDR_SCALARS, r->enumeration_context));
+		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->enumeration_context));
 		for (cntr_array_0 = 0; cntr_array_0 < r->count; cntr_array_0++) {
 			NDR_CHECK(ndr_push_drsuapi_DsReplicaAttrValMetaData2(ndr, NDR_SCALARS, &r->array[cntr_array_0]));
 		}
@@ -11631,7 +11631,7 @@ static enum ndr_err_code ndr_pull_drsuapi_DsReplicaAttrValMetaData2Ctr(struct nd
 		NDR_CHECK(ndr_pull_array_size(ndr, &r->array));
 		NDR_CHECK(ndr_pull_align(ndr, 8));
 		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->count));
-		NDR_CHECK(ndr_pull_int32(ndr, NDR_SCALARS, &r->enumeration_context));
+		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->enumeration_context));
 		NDR_PULL_ALLOC_N(ndr, r->array, ndr_get_array_size(ndr, &r->array));
 		_mem_save_array_0 = NDR_PULL_GET_MEM_CTX(ndr);
 		NDR_PULL_SET_MEM_CTX(ndr, r->array, 0);
@@ -11661,7 +11661,7 @@ _PUBLIC_ void ndr_print_drsuapi_DsReplicaAttrValMetaData2Ctr(struct ndr_print *n
 	ndr_print_struct(ndr, name, "drsuapi_DsReplicaAttrValMetaData2Ctr");
 	ndr->depth++;
 	ndr_print_uint32(ndr, "count", r->count);
-	ndr_print_int32(ndr, "enumeration_context", r->enumeration_context);
+	ndr_print_uint32(ndr, "enumeration_context", r->enumeration_context);
 	ndr->print(ndr, "%s: ARRAY(%d)", "array", (int)r->count);
 	ndr->depth++;
 	for (cntr_array_0=0;cntr_array_0<r->count;cntr_array_0++) {
diff --git a/librpc/idl/drsuapi.idl b/librpc/idl/drsuapi.idl
index 9a9df03..b538b7c 100644
--- a/librpc/idl/drsuapi.idl
+++ b/librpc/idl/drsuapi.idl
@@ -1416,10 +1416,10 @@ interface drsuapi
 		drsuapi_DsReplicaInfoType info_type;
 		[charset(UTF16),string] uint16 *object_dn;
 		GUID guid1;
-		uint32 unknown1;
+		uint32 flags;
 		[charset(UTF16),string] uint16 *string1;
 		[charset(UTF16),string] uint16 *string2;
-		uint32 unknown2;
+		uint32 enumeration_context;
 	} drsuapi_DsReplicaGetInfoRequest2;
 
 	typedef [switch_type(drsuapi_DsReplicaGetInfoLevel)] union {
@@ -1530,13 +1530,13 @@ interface drsuapi
 
 	typedef struct {
 		uint32 count;
-		int32 enumeration_context;
+		uint32 enumeration_context;
 		[size_is(count)] drsuapi_DsReplicaAttrValMetaData array[];
 	} drsuapi_DsReplicaAttrValMetaDataCtr;
 
 	typedef struct {
 		uint32 count;
-		int32 enumeration_context;
+		uint32 enumeration_context;
 		[size_is(count)] drsuapi_DsReplicaCursor2 array[];
 	} drsuapi_DsReplicaCursor2Ctr;
 
@@ -1549,7 +1549,7 @@ interface drsuapi
 
 	typedef struct {
 		uint32 count;
-		int32 enumeration_context;
+		uint32 enumeration_context;
 		[size_is(count)] drsuapi_DsReplicaCursor3 array[];
 	} drsuapi_DsReplicaCursor3Ctr;
 
@@ -1565,7 +1565,7 @@ interface drsuapi
 
 	typedef struct {
 		uint32 count;
-		int32 enumeration_context;
+		uint32 enumeration_context;
 		[size_is(count)] drsuapi_DsReplicaObjMetaData2 array[];
 	} drsuapi_DsReplicaObjMetaData2Ctr;
 
@@ -1586,7 +1586,7 @@ interface drsuapi
 
 	typedef struct {
 		uint32 count;
-		int32 enumeration_context;
+		uint32 enumeration_context;
 		[size_is(count)] drsuapi_DsReplicaAttrValMetaData2 array[];
 	} drsuapi_DsReplicaAttrValMetaData2Ctr;
 
diff --git a/source4/dsdb/common/util.c b/source4/dsdb/common/util.c
index 5dcbbd8..b57d383 100644
--- a/source4/dsdb/common/util.c
+++ b/source4/dsdb/common/util.c
@@ -3237,3 +3237,131 @@ int samdb_ldb_val_case_cmp(const char *s, struct ldb_val *v)
 	}
 	return 0;
 }
+
+
+/*
+  load the UDV for a partition in v2 format
+  The list is returned sorted, and with our local cursor added
+ */
+int dsdb_load_udv_v2(struct ldb_context *samdb, struct ldb_dn *dn, TALLOC_CTX *mem_ctx,
+		     struct drsuapi_DsReplicaCursor2 **cursors, uint32_t *count)
+{
+	static const char *attrs[] = { "replUpToDateVector", NULL };
+	struct ldb_result *r;
+	const struct ldb_val *ouv_value;
+	int ret, i;
+	uint64_t highest_usn;
+	const struct GUID *our_invocation_id;
+	struct timeval now = timeval_current();
+
+	ret = ldb_search(samdb, mem_ctx, &r, dn, LDB_SCOPE_BASE, attrs, NULL);
+	if (ret != LDB_SUCCESS) {
+		return ret;
+	}
+
+	ouv_value = ldb_msg_find_ldb_val(r->msgs[0], "replUpToDateVector");
+	if (ouv_value) {
+		enum ndr_err_code ndr_err;
+		struct replUpToDateVectorBlob ouv;
+
+		ndr_err = ndr_pull_struct_blob(ouv_value, r,
+					       lp_iconv_convenience(ldb_get_opaque(samdb, "loadparm")), &ouv,
+					       (ndr_pull_flags_fn_t)ndr_pull_replUpToDateVectorBlob);
+		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+			talloc_free(r);
+			return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
+		}
+		if (ouv.version != 2) {
+			/* we always store as version 2, and
+			 * replUpToDateVector is not replicated
+			 */
+			return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
+		}
+
+		*count = ouv.ctr.ctr2.count;
+		*cursors = talloc_steal(mem_ctx, ouv.ctr.ctr2.cursors);
+	} else {
+		*count = 0;
+		*cursors = NULL;
+	}
+
+	talloc_free(r);
+
+	our_invocation_id = samdb_ntds_invocation_id(samdb);
+	if (!our_invocation_id) {
+		DEBUG(0,(__location__ ": No invocationID on samdb - %s\n", ldb_errstring(samdb)));
+		talloc_free(*cursors);
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
+
+	ret = dsdb_load_partition_usn(samdb, dn, &highest_usn, NULL);
+	if (ret != LDB_SUCCESS) {
+		/* nothing to add - this can happen after a vampire */
+		qsort(*cursors, *count,
+		      sizeof(struct drsuapi_DsReplicaCursor2),
+		      (comparison_fn_t)drsuapi_DsReplicaCursor2_compare);
+		return LDB_SUCCESS;
+	}
+
+	for (i=0; i<*count; i++) {
+		if (GUID_equal(our_invocation_id, &(*cursors)[i].source_dsa_invocation_id)) {
+			(*cursors)[i].highest_usn = highest_usn;
+			(*cursors)[i].last_sync_success = timeval_to_nttime(&now);
+			qsort(*cursors, *count,
+			      sizeof(struct drsuapi_DsReplicaCursor2),
+			      (comparison_fn_t)drsuapi_DsReplicaCursor2_compare);
+			return LDB_SUCCESS;
+		}
+	}
+
+	(*cursors) = talloc_realloc(mem_ctx, *cursors, struct drsuapi_DsReplicaCursor2, (*count)+1);
+	if (! *cursors) {
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
+
+	(*cursors)[*count].source_dsa_invocation_id = *our_invocation_id;
+	(*cursors)[*count].highest_usn = highest_usn;
+	(*cursors)[*count].last_sync_success = timeval_to_nttime(&now);
+	(*count)++;
+
+	qsort(*cursors, *count,
+	      sizeof(struct drsuapi_DsReplicaCursor2),
+	      (comparison_fn_t)drsuapi_DsReplicaCursor2_compare);
+
+	return LDB_SUCCESS;
+}
+
+/*
+  load the UDV for a partition in version 1 format
+  The list is returned sorted, and with our local cursor added
+ */
+int dsdb_load_udv_v1(struct ldb_context *samdb, struct ldb_dn *dn, TALLOC_CTX *mem_ctx,
+		     struct drsuapi_DsReplicaCursor **cursors, uint32_t *count)
+{
+	struct drsuapi_DsReplicaCursor2 *v2;
+	int ret, i;
+
+	ret = dsdb_load_udv_v2(samdb, dn, mem_ctx, &v2, count);
+	if (ret != LDB_SUCCESS) {
+		return ret;
+	}
+
+	if (*count == 0) {
+		talloc_free(v2);
+		*cursors = NULL;
+		return LDB_SUCCESS;
+	}
+
+	*cursors = talloc_array(mem_ctx, struct drsuapi_DsReplicaCursor, *count);
+	if (*cursors == NULL) {
+		talloc_free(v2);
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
+
+	for (i=0; i<*count; i++) {
+		(*cursors)[i].source_dsa_invocation_id = v2[i].source_dsa_invocation_id;
+		(*cursors)[i].highest_usn = v2[i].highest_usn;
+	}
+	talloc_free(v2);
+	return LDB_SUCCESS;
+}
diff --git a/source4/dsdb/config.mk b/source4/dsdb/config.mk
index 3226c08..5ea31c3 100644
--- a/source4/dsdb/config.mk
+++ b/source4/dsdb/config.mk
@@ -85,6 +85,8 @@ KCC_SRV_OBJ_FILES = $(addprefix $(dsdbsrcdir)/kcc/, \
 		kcc_service.o \
 		kcc_connection.o \
 		kcc_deleted.o \
-		kcc_periodic.o)
+		kcc_periodic.o \
+		kcc_drs_replica_info.o)
 
 $(eval $(call proto_header_template,$(dsdbsrcdir)/kcc/kcc_service_proto.h,$(KCC_SRV_OBJ_FILES:.o=.c)))
+
diff --git a/source4/dsdb/kcc/kcc_drs_replica_info.c b/source4/dsdb/kcc/kcc_drs_replica_info.c
new file mode 100644
index 0000000..8c18293
--- /dev/null
+++ b/source4/dsdb/kcc/kcc_drs_replica_info.c
@@ -0,0 +1,549 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ DRS Replica Information
+
+ Copyright (C) Erick Nogueira do Nascimento 2009
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+ */
+
+#include "includes.h"
+#include "dsdb/samdb/samdb.h"
+#include "auth/auth.h"
+#include "smbd/service.h"
+#include "lib/events/events.h"
+#include "lib/messaging/irpc.h"
+#include "dsdb/kcc/kcc_service.h"
+#include "lib/ldb/include/ldb_errors.h"
+#include "../lib/util/dlinklist.h"
+#include "librpc/gen_ndr/ndr_misc.h"
+#include "librpc/gen_ndr/ndr_drsuapi.h"
+#include "librpc/gen_ndr/ndr_drsblobs.h"
+#include "param/param.h"
+


-- 
Samba Shared Repository


More information about the samba-cvs mailing list