summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2011-01-13 17:18:24 +0100
committerStefan Metzmacher <metze@samba.org>2011-02-02 15:45:20 +0100
commitbf7a27c3975c3822e0de8ff15730e6d6d1f46457 (patch)
tree4fc41680c2bb80c1bec3555d093689b2c3795158
parentcecf54b32bf15b0e05af899ab12f06f110dd45ec (diff)
downloadsamba-bf7a27c3975c3822e0de8ff15730e6d6d1f46457.tar.gz
samba-bf7a27c3975c3822e0de8ff15730e6d6d1f46457.tar.bz2
samba-bf7a27c3975c3822e0de8ff15730e6d6d1f46457.zip
s3:libnet: add 'process_links' to dssync_ops
This allows the backend to handle linked attributes. metze
-rw-r--r--source3/libnet/libnet_dssync.c22
-rw-r--r--source3/libnet/libnet_dssync.h5
2 files changed, 27 insertions, 0 deletions
diff --git a/source3/libnet/libnet_dssync.c b/source3/libnet/libnet_dssync.c
index 3aed8b68ed..64a4df0f7f 100644
--- a/source3/libnet/libnet_dssync.c
+++ b/source3/libnet/libnet_dssync.c
@@ -451,6 +451,8 @@ static NTSTATUS libnet_dssync_getncchanges(TALLOC_CTX *mem_ctx,
for (y=0, last_query = false; !last_query; y++) {
struct drsuapi_DsReplicaObjectListItemEx *first_object = NULL;
struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr = NULL;
+ uint32_t linked_attributes_count = 0;
+ struct drsuapi_DsReplicaLinkedAttribute *linked_attributes = NULL;
if (level == 8) {
DEBUG(1,("start[%d] tmp_higest_usn: %llu , highest_usn: %llu\n",y,
@@ -537,6 +539,9 @@ static NTSTATUS libnet_dssync_getncchanges(TALLOC_CTX *mem_ctx,
first_object = ctr6->first_object;
mapping_ctr = &ctr6->mapping_ctr;
+ linked_attributes = ctr6->linked_attributes;
+ linked_attributes_count = ctr6->linked_attributes_count;
+
if (ctr6->more_data) {
req->req8.highwatermark = ctr6->new_highwatermark;
} else {
@@ -576,6 +581,23 @@ static NTSTATUS libnet_dssync_getncchanges(TALLOC_CTX *mem_ctx,
goto out;
}
}
+
+ if (linked_attributes_count == 0) {
+ continue;
+ }
+
+ if (ctx->ops->process_links) {
+ status = ctx->ops->process_links(ctx, mem_ctx,
+ linked_attributes_count,
+ linked_attributes,
+ mapping_ctr);
+ if (!NT_STATUS_IS_OK(status)) {
+ ctx->error_message = talloc_asprintf(ctx,
+ "Failed to call processing function: %s",
+ nt_errstr(status));
+ goto out;
+ }
+ }
}
*pnew_utdv = new_utdv;
diff --git a/source3/libnet/libnet_dssync.h b/source3/libnet/libnet_dssync.h
index 91f48f5e85..f47365263f 100644
--- a/source3/libnet/libnet_dssync.h
+++ b/source3/libnet/libnet_dssync.h
@@ -30,6 +30,11 @@ struct dssync_ops {
TALLOC_CTX *mem_ctx,
struct drsuapi_DsReplicaObjectListItemEx *objects,
struct drsuapi_DsReplicaOIDMapping_Ctr *mappings);
+ NTSTATUS (*process_links)(struct dssync_context *ctx,
+ TALLOC_CTX *mem_ctx,
+ uint32_t count,
+ struct drsuapi_DsReplicaLinkedAttribute *links,
+ struct drsuapi_DsReplicaOIDMapping_Ctr *mappings);
NTSTATUS (*finish)(struct dssync_context *ctx, TALLOC_CTX *mem_ctx,
struct replUpToDateVectorBlob *new_utdv);
};