major upgrade to the ldb attribute handling
[kamenim/samba.git] / source4 / libnet / libnet_vampire.c
index 1cc63a3fb0cbe8404c92be131d0db2985675252d..bd88b8ec81a313d5bfb280a6198358161b4c6855 100644 (file)
@@ -26,7 +26,7 @@
 #include "libnet/libnet.h"
 #include "lib/events/events.h"
 #include "dsdb/samdb/samdb.h"
-#include "lib/util/dlinklist.h"
+#include "../lib/util/dlinklist.h"
 #include "lib/ldb/include/ldb.h"
 #include "lib/ldb/include/ldb_errors.h"
 #include "librpc/ndr/libndr.h"
@@ -70,6 +70,7 @@ struct vampire_state {
        const char *targetdir;
 
        struct loadparm_context *lp_ctx;
+       struct tevent_context *event_ctx;
 };
 
 static NTSTATUS vampire_prepare_db(void *private_data,
@@ -135,7 +136,6 @@ static NTSTATUS vampire_apply_schema(struct vampire_state *s,
 {
        WERROR status;
        const struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr;
-       uint32_t total_object_count;
        uint32_t object_count;
        struct drsuapi_DsReplicaObjectListItemEx *first_object;
        struct drsuapi_DsReplicaObjectListItemEx *cur;
@@ -163,7 +163,6 @@ static NTSTATUS vampire_apply_schema(struct vampire_state *s,
        switch (c->ctr_level) {
        case 1:
                mapping_ctr                     = &c->ctr1->mapping_ctr;
-               total_object_count              = c->ctr1->total_object_count;
                object_count                    = s->schema_part.object_count;
                first_object                    = s->schema_part.first_object;
                linked_attributes_count         = 0;
@@ -175,7 +174,6 @@ static NTSTATUS vampire_apply_schema(struct vampire_state *s,
                break;
        case 6:
                mapping_ctr                     = &c->ctr6->mapping_ctr;
-               total_object_count              = c->ctr6->total_object_count;
                object_count                    = s->schema_part.object_count;
                first_object                    = s->schema_part.first_object;
                linked_attributes_count         = 0; /* TODO: ! */
@@ -245,7 +243,7 @@ static NTSTATUS vampire_apply_schema(struct vampire_state *s,
                        sa = talloc_zero(s->self_made_schema, struct dsdb_attribute);
                        NT_STATUS_HAVE_NO_MEMORY(sa);
 
-                       status = dsdb_attribute_from_drsuapi(s->self_made_schema, &cur->object, s, sa);
+                       status = dsdb_attribute_from_drsuapi(s->ldb, s->self_made_schema, &cur->object, s, sa);
                        if (!W_ERROR_IS_OK(status)) {
                                return werror_to_ntstatus(status);
                        }
@@ -335,7 +333,7 @@ static NTSTATUS vampire_apply_schema(struct vampire_state *s,
        s->schema = NULL;
 
        DEBUG(0,("Reopen the SAM LDB with system credentials and a already stored schema\n"));
-       s->ldb = samdb_connect(s, s->lp_ctx, 
+       s->ldb = samdb_connect(s, s->event_ctx, s->lp_ctx, 
                               system_session(s, s->lp_ctx));
        if (!s->ldb) {
                DEBUG(0,("Failed to reopen sam.ldb\n"));
@@ -369,34 +367,41 @@ static NTSTATUS vampire_schema_chunk(void *private_data,
        struct vampire_state *s = talloc_get_type(private_data, struct vampire_state);
        WERROR status;
        const struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr;
-       uint32_t total_object_count;
+       uint32_t nc_object_count;
        uint32_t object_count;
        struct drsuapi_DsReplicaObjectListItemEx *first_object;
        struct drsuapi_DsReplicaObjectListItemEx *cur;
+       uint32_t nc_linked_attributes_count;
+       uint32_t linked_attributes_count;
 
        switch (c->ctr_level) {
        case 1:
-               mapping_ctr             = &c->ctr1->mapping_ctr;
-               total_object_count      = c->ctr1->total_object_count;
-               object_count            = c->ctr1->object_count;
-               first_object            = c->ctr1->first_object;
+               mapping_ctr                     = &c->ctr1->mapping_ctr;
+               nc_object_count                 = c->ctr1->extended_ret; /* maybe w2k send this unexpected? */
+               object_count                    = c->ctr1->object_count;
+               first_object                    = c->ctr1->first_object;
+               nc_linked_attributes_count      = 0;
+               linked_attributes_count         = 0;
                break;
        case 6:
-               mapping_ctr             = &c->ctr6->mapping_ctr;
-               total_object_count      = c->ctr6->total_object_count;
-               object_count            = c->ctr6->object_count;
-               first_object            = c->ctr6->first_object;
+               mapping_ctr                     = &c->ctr6->mapping_ctr;
+               nc_object_count                 = c->ctr6->nc_object_count;
+               object_count                    = c->ctr6->object_count;
+               first_object                    = c->ctr6->first_object;
+               nc_linked_attributes_count      = c->ctr6->nc_linked_attributes_count;
+               linked_attributes_count         = c->ctr6->linked_attributes_count;
                break;
        default:
                return NT_STATUS_INVALID_PARAMETER;
        }
 
-       if (total_object_count) {
-               DEBUG(0,("Schema-DN[%s] objects[%u/%u]\n",
-                       c->partition->nc.dn, object_count, total_object_count));
+       if (nc_object_count) {
+               DEBUG(0,("Schema-DN[%s] objects[%u/%u] linked_values[%u/%u]\n",
+                       c->partition->nc.dn, object_count, nc_object_count,
+                       linked_attributes_count, nc_linked_attributes_count));
        } else {
-               DEBUG(0,("Schema-DN[%s] objects[%u]\n",
-               c->partition->nc.dn, object_count));
+               DEBUG(0,("Schema-DN[%s] objects[%u] linked_values[%u\n",
+               c->partition->nc.dn, object_count, linked_attributes_count));
        }
 
        if (!s->schema) {
@@ -428,7 +433,7 @@ static NTSTATUS vampire_schema_chunk(void *private_data,
        for (cur = first_object; cur->next_object; cur = cur->next_object) {}
        s->schema_part.last_object = cur;
 
-       if (c->partition->highwatermark.tmp_highest_usn == c->partition->highwatermark.highest_usn) {
+       if (!c->partition->more_data) {
                return vampire_apply_schema(s, c);
        }
 
@@ -441,9 +446,10 @@ static NTSTATUS vampire_store_chunk(void *private_data,
        struct vampire_state *s = talloc_get_type(private_data, struct vampire_state);
        WERROR status;
        const struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr;
-       uint32_t total_object_count;
+       uint32_t nc_object_count;
        uint32_t object_count;
        struct drsuapi_DsReplicaObjectListItemEx *first_object;
+       uint32_t nc_linked_attributes_count;
        uint32_t linked_attributes_count;
        struct drsuapi_DsReplicaLinkedAttribute *linked_attributes;
        const struct drsuapi_DsReplicaCursor2CtrEx *uptodateness_vector;
@@ -460,9 +466,10 @@ static NTSTATUS vampire_store_chunk(void *private_data,
        switch (c->ctr_level) {
        case 1:
                mapping_ctr                     = &c->ctr1->mapping_ctr;
-               total_object_count              = c->ctr1->total_object_count;
+               nc_object_count                 = c->ctr1->extended_ret; /* maybe w2k send this unexpected? */
                object_count                    = c->ctr1->object_count;
                first_object                    = c->ctr1->first_object;
+               nc_linked_attributes_count      = 0;
                linked_attributes_count         = 0;
                linked_attributes               = NULL;
                s_dsa->highwatermark            = c->ctr1->new_highwatermark;
@@ -472,9 +479,10 @@ static NTSTATUS vampire_store_chunk(void *private_data,
                break;
        case 6:
                mapping_ctr                     = &c->ctr6->mapping_ctr;
-               total_object_count              = c->ctr6->total_object_count;
+               nc_object_count                 = c->ctr6->nc_object_count;
                object_count                    = c->ctr6->object_count;
                first_object                    = c->ctr6->first_object;
+               nc_linked_attributes_count      = c->ctr6->nc_linked_attributes_count;
                linked_attributes_count         = c->ctr6->linked_attributes_count;
                linked_attributes               = c->ctr6->linked_attributes;
                s_dsa->highwatermark            = c->ctr6->new_highwatermark;
@@ -497,12 +505,13 @@ static NTSTATUS vampire_store_chunk(void *private_data,
        NT_STATUS_HAVE_NO_MEMORY(tmp_dns_name);
        s_dsa->other_info->dns_name = tmp_dns_name;
 
-       if (total_object_count) {
-               DEBUG(0,("Partition[%s] objects[%u/%u]\n",
-                       c->partition->nc.dn, object_count, total_object_count));
+       if (nc_object_count) {
+               DEBUG(0,("Partition[%s] objects[%u/%u] linked_values[%u/%u]\n",
+                       c->partition->nc.dn, object_count, nc_object_count,
+                       linked_attributes_count, nc_linked_attributes_count));
        } else {
-               DEBUG(0,("Partition[%s] objects[%u]\n",
-               c->partition->nc.dn, object_count));
+               DEBUG(0,("Partition[%s] objects[%u] linked_values[%u\n",
+               c->partition->nc.dn, object_count, linked_attributes_count));
        }
 
        status = dsdb_extended_replicated_objects_commit(s->ldb,
@@ -569,7 +578,6 @@ NTSTATUS libnet_Vampire(struct libnet_context *ctx, TALLOC_CTX *mem_ctx,
        struct libnet_JoinDomain *join;
        struct libnet_set_join_secrets *set_secrets;
        struct libnet_BecomeDC b;
-       struct libnet_UnbecomeDC u;
        struct vampire_state *s;
        struct ldb_message *msg;
        int ldb_ret;
@@ -581,12 +589,13 @@ NTSTATUS libnet_Vampire(struct libnet_context *ctx, TALLOC_CTX *mem_ctx,
        
        r->out.error_string = NULL;
 
-       s = talloc_zero(mem_ctx , struct vampire_state);
+       s = talloc_zero(mem_ctx, struct vampire_state);
        if (!s) {
                return NT_STATUS_NO_MEMORY;
        }
 
        s->lp_ctx = ctx->lp_ctx;
+       s->event_ctx = ctx->event_ctx;
 
        join = talloc_zero(s, struct libnet_JoinDomain);
        if (!join) {