r20293: implement store chunk hook for libnet_BecomeDC()
authorStefan Metzmacher <metze@samba.org>
Wed, 20 Dec 2006 21:54:06 +0000 (21:54 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:29:33 +0000 (14:29 -0500)
metze
(This used to be commit aba497f2fdb79e4a61c028501d4d33a3f678ba73)

source4/libnet/libnet_become_dc.c
source4/libnet/libnet_become_dc.h
source4/torture/libnet/libnet_BecomeDC.c

index b906f312df53fb8112704d4840ef7f382b279d99..bc5031759498649c82b62c1f79d7bc14a242148a 100644 (file)
@@ -65,20 +65,7 @@ struct libnet_BecomeDC_state {
        struct libnet_BecomeDC_SourceDSA source_dsa;
        struct libnet_BecomeDC_DestDSA dest_dsa;
 
-       struct becomeDC_partition {
-               struct drsuapi_DsReplicaObjectIdentifier nc;
-               struct GUID destination_dsa_guid;
-               struct GUID source_dsa_guid;
-               struct GUID source_dsa_invocation_id;
-               struct drsuapi_DsReplicaHighWaterMark highwatermark;
-               struct drsuapi_DsReplicaCoursorCtrEx *uptodateness_vector;
-               uint32_t replica_flags;
-
-               struct drsuapi_DsReplicaObjectListItemEx *first_object;
-               struct drsuapi_DsReplicaObjectListItemEx *last_object;
-
-               NTSTATUS (*store_chunk)(void *private_data, void *todo);
-       } schema_part, config_part, domain_part;
+       struct libnet_BecomeDC_Partition schema_part, config_part, domain_part;
 
        struct becomeDC_fsmo {
                const char *dns_name;
@@ -91,6 +78,7 @@ struct libnet_BecomeDC_state {
 
        struct libnet_BecomeDC_CheckOptions _co;
        struct libnet_BecomeDC_PrepareDB _pp;
+       struct libnet_BecomeDC_StoreChunk _sc;
        struct libnet_BecomeDC_Callbacks callbacks;
 };
 
@@ -1555,7 +1543,7 @@ static void becomeDC_drsuapi3_connect_recv(struct composite_context *req)
 static void becomeDC_drsuapi_pull_partition_send(struct libnet_BecomeDC_state *s,
                                                 struct becomeDC_drsuapi *drsuapi_h,
                                                 struct becomeDC_drsuapi *drsuapi_p,
-                                                struct becomeDC_partition *partition,
+                                                struct libnet_BecomeDC_Partition *partition,
                                                 void (*recv_fn)(struct rpc_request *req))
 {
        struct composite_context *c = s->creq;
@@ -1572,7 +1560,7 @@ static void becomeDC_drsuapi_pull_partition_send(struct libnet_BecomeDC_state *s
                r->in.req.req8.source_dsa_invocation_id = partition->source_dsa_invocation_id;
                r->in.req.req8.naming_context           = &partition->nc;
                r->in.req.req8.highwatermark            = partition->highwatermark;
-               r->in.req.req8.uptodateness_vector      = partition->uptodateness_vector;
+               r->in.req.req8.uptodateness_vector      = NULL;
                r->in.req.req8.replica_flags            = partition->replica_flags;
                r->in.req.req8.max_object_count         = 133;
                r->in.req.req8.max_ndr_size             = 1336811;
@@ -1588,7 +1576,7 @@ static void becomeDC_drsuapi_pull_partition_send(struct libnet_BecomeDC_state *s
                r->in.req.req5.source_dsa_invocation_id = partition->source_dsa_invocation_id;
                r->in.req.req5.naming_context           = &partition->nc;
                r->in.req.req5.highwatermark            = partition->highwatermark;
-               r->in.req.req5.uptodateness_vector      = partition->uptodateness_vector;
+               r->in.req.req5.uptodateness_vector      = NULL;
                r->in.req.req5.replica_flags            = partition->replica_flags;
                r->in.req.req5.max_object_count         = 133;
                r->in.req.req5.max_ndr_size             = 1336770;
@@ -1596,11 +1584,6 @@ static void becomeDC_drsuapi_pull_partition_send(struct libnet_BecomeDC_state *s
                r->in.req.req5.h1                       = 0;
        }
 
-DEBUG(0,("start NC[%s] tmp_highest_usn[%llu] highest_usn[%llu]\n",
-       partition->nc.dn,
-       partition->highwatermark.tmp_highest_usn,
-       partition->highwatermark.highest_usn));
-
        /* 
         * we should try to use the drsuapi_p->pipe here, as w2k3 does
         * but it seems that some extra flags in the DCERPC Bind call
@@ -1612,52 +1595,49 @@ DEBUG(0,("start NC[%s] tmp_highest_usn[%llu] highest_usn[%llu]\n",
 }
 
 static WERROR becomeDC_drsuapi_pull_partition_recv(struct libnet_BecomeDC_state *s,
-                                                  struct becomeDC_partition *partition,
+                                                  struct libnet_BecomeDC_Partition *partition,
                                                   struct drsuapi_DsGetNCChanges *r)
 {
+       uint32_t ctr_level = 0;
        struct drsuapi_DsGetNCChangesCtr1 *ctr1 = NULL;
        struct drsuapi_DsGetNCChangesCtr6 *ctr6 = NULL;
-       uint32_t out_level = 0;
        struct GUID *source_dsa_guid;
        struct GUID *source_dsa_invocation_id;
        struct drsuapi_DsReplicaHighWaterMark *new_highwatermark;
-       struct drsuapi_DsReplicaObjectListItemEx *first_object;
-       struct drsuapi_DsReplicaObjectListItemEx *cur;
+       NTSTATUS nt_status;
 
        if (!W_ERROR_IS_OK(r->out.result)) {
                return r->out.result;
        }
 
        if (r->out.level == 1) {
-               out_level = 1;
+               ctr_level = 1;
                ctr1 = &r->out.ctr.ctr1;
        } else if (r->out.level == 2) {
-               out_level = 1;
+               ctr_level = 1;
                ctr1 = r->out.ctr.ctr2.ctr.mszip1.ctr1;
        } else if (r->out.level == 6) {
-               out_level = 6;
+               ctr_level = 6;
                ctr6 = &r->out.ctr.ctr6;
        } else if (r->out.level == 7 &&
                   r->out.ctr.ctr7.level == 6 &&
                   r->out.ctr.ctr7.type == DRSUAPI_COMPRESSION_TYPE_MSZIP) {
-               out_level = 6;
+               ctr_level = 6;
                ctr6 = r->out.ctr.ctr7.ctr.mszip6.ctr6;
        } else {
                return WERR_BAD_NET_RESP;
        }
 
-       switch (out_level) {
+       switch (ctr_level) {
        case 1:
                source_dsa_guid                 = &ctr1->source_dsa_guid;
                source_dsa_invocation_id        = &ctr1->source_dsa_invocation_id;
                new_highwatermark               = &ctr1->new_highwatermark;
-               first_object                    = ctr1->first_object;
                break;
        case 6:
                source_dsa_guid                 = &ctr6->source_dsa_guid;
                source_dsa_invocation_id        = &ctr6->source_dsa_invocation_id;
                new_highwatermark               = &ctr6->new_highwatermark;
-               first_object                    = ctr6->first_object;
                break;
        }
 
@@ -1665,26 +1645,20 @@ static WERROR becomeDC_drsuapi_pull_partition_recv(struct libnet_BecomeDC_state
        partition->source_dsa_guid              = *source_dsa_guid;
        partition->source_dsa_invocation_id     = *source_dsa_invocation_id;
 
-       if (!partition->first_object) {
-               partition->first_object = talloc_steal(s, first_object);
-       } else {
-               partition->last_object->next_object = talloc_steal(partition->last_object,
-                                                                  first_object);
-       }
-       for (cur = first_object; cur->next_object; cur = cur->next_object) {}
-       partition->last_object = cur;
-
-DEBUG(0,("end NC[%s] tmp_highest_usn[%llu] highest_usn[%llu]\n",
-       partition->nc.dn,
-       partition->highwatermark.tmp_highest_usn,
-       partition->highwatermark.highest_usn));
-
-       if (partition->store_chunk) {
-               NTSTATUS nt_status;
-               nt_status = partition->store_chunk(s->callbacks.private_data, NULL);
-               if (!NT_STATUS_IS_OK(nt_status)) {
-                       return ntstatus_to_werror(nt_status);
-               }
+       if (!partition->store_chunk) return WERR_OK;
+
+       s->_sc.domain           = &s->domain;
+       s->_sc.forest           = &s->forest;
+       s->_sc.source_dsa       = &s->source_dsa;
+       s->_sc.dest_dsa         = &s->dest_dsa;
+       s->_sc.partition        = partition;
+       s->_sc.ctr_level        = ctr_level;
+       s->_sc.ctr1             = ctr1;
+       s->_sc.ctr6             = ctr6;
+
+       nt_status = partition->store_chunk(s->callbacks.private_data, &s->_sc);
+       if (!NT_STATUS_IS_OK(nt_status)) {
+               return ntstatus_to_werror(nt_status);
        }
 
        return WERR_OK;
@@ -1821,7 +1795,7 @@ static void becomeDC_drsuapi3_pull_domain_send(struct libnet_BecomeDC_state *s)
 
 static void becomeDC_drsuapi_update_refs_send(struct libnet_BecomeDC_state *s,
                                              struct becomeDC_drsuapi *drsuapi,
-                                             struct becomeDC_partition *partition,
+                                             struct libnet_BecomeDC_Partition *partition,
                                              void (*recv_fn)(struct rpc_request *req));
 static void becomeDC_drsuapi2_update_refs_schema_recv(struct rpc_request *req);
 
@@ -1857,7 +1831,7 @@ static void becomeDC_drsuapi3_pull_domain_recv(struct rpc_request *req)
 
 static void becomeDC_drsuapi_update_refs_send(struct libnet_BecomeDC_state *s,
                                              struct becomeDC_drsuapi *drsuapi,
-                                             struct becomeDC_partition *partition,
+                                             struct libnet_BecomeDC_Partition *partition,
                                              void (*recv_fn)(struct rpc_request *req))
 {
        struct composite_context *c = s->creq;
index 7549e369e4fdabbb6437d356a103ebb496d6111c..1ddf2a30732d422593bc4665e1f494e244e6445f 100644 (file)
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
+#ifndef _LIBNET_BECOME_DC_H
+#define _LIBNET_BECOME_DC_H
+
+#include "librpc/gen_ndr/drsuapi.h"
+
 struct libnet_BecomeDC_Domain {
        /* input */
        const char *dns_name;
@@ -82,15 +87,43 @@ struct libnet_BecomeDC_PrepareDB {
        const struct libnet_BecomeDC_DestDSA *dest_dsa;
 };
 
+struct libnet_BecomeDC_StoreChunk;
+
+struct libnet_BecomeDC_Partition {
+       struct drsuapi_DsReplicaObjectIdentifier nc;
+       struct GUID destination_dsa_guid;
+       struct GUID source_dsa_guid;
+       struct GUID source_dsa_invocation_id;
+       struct drsuapi_DsReplicaHighWaterMark highwatermark;
+       uint32_t replica_flags;
+
+       NTSTATUS (*store_chunk)(void *private_data,
+                               const struct libnet_BecomeDC_StoreChunk *info);
+};
+
+struct libnet_BecomeDC_StoreChunk {
+       const struct libnet_BecomeDC_Domain *domain;
+       const struct libnet_BecomeDC_Forest *forest;
+       const struct libnet_BecomeDC_SourceDSA *source_dsa;
+       const struct libnet_BecomeDC_DestDSA *dest_dsa;
+       const struct libnet_BecomeDC_Partition *partition;
+       uint32_t ctr_level;
+       const struct drsuapi_DsGetNCChangesCtr1 *ctr1;
+       const struct drsuapi_DsGetNCChangesCtr6 *ctr6;
+};
+
 struct libnet_BecomeDC_Callbacks {
        void *private_data;
        NTSTATUS (*check_options)(void *private_data,
                                  const struct libnet_BecomeDC_CheckOptions *info);
        NTSTATUS (*prepare_db)(void *private_data,
                               const struct libnet_BecomeDC_PrepareDB *info);
-       NTSTATUS (*schema_chunk)(void *private_data, void *todo);
-       NTSTATUS (*config_chunk)(void *private_data, void *todo);
-       NTSTATUS (*domain_chunk)(void *private_data, void *todo);
+       NTSTATUS (*schema_chunk)(void *private_data,
+                                const struct libnet_BecomeDC_StoreChunk *info);
+       NTSTATUS (*config_chunk)(void *private_data,
+                                const struct libnet_BecomeDC_StoreChunk *info);
+       NTSTATUS (*domain_chunk)(void *private_data,
+                                const struct libnet_BecomeDC_StoreChunk *info);
 };
 
 struct libnet_BecomeDC {
@@ -108,3 +141,5 @@ struct libnet_BecomeDC {
                const char *error_string;
        } out;
 };
+
+#endif /* _LIBNET_BECOME_DC_H */
index 561ad622bbec094e4597867c5dfff95091edd53f..fdb2cc3214bb2701a5d20ee6df23ba2706387cfc 100644 (file)
@@ -77,6 +77,15 @@ static NTSTATUS test_become_dc_prepare_db(void *private_data,
        return NT_STATUS_OK;
 }
 
+static NTSTATUS test_become_dc_store_chunk(void *private_data,
+                                          const struct libnet_BecomeDC_StoreChunk *c)
+{
+       DEBUG(0,("Partition[%s]\n",
+               c->partition->nc.dn));
+
+       return NT_STATUS_OK;
+}
+
 BOOL torture_net_become_dc(struct torture_context *torture)
 {
        BOOL ret = True;
@@ -110,6 +119,9 @@ BOOL torture_net_become_dc(struct torture_context *torture)
        b.in.callbacks.private_data     = tj;
        b.in.callbacks.check_options    = test_become_dc_check_options;
        b.in.callbacks.prepare_db       = test_become_dc_prepare_db;
+       b.in.callbacks.schema_chunk     = test_become_dc_store_chunk;
+       b.in.callbacks.config_chunk     = test_become_dc_store_chunk;
+       b.in.callbacks.domain_chunk     = test_become_dc_store_chunk;
 
        status = libnet_BecomeDC(ctx, ctx, &b);
        if (!NT_STATUS_IS_OK(status)) {