Author: metze
Date: 2006-12-08 18:13:49 +0000 (Fri, 08 Dec 2006)
New Revision: 20084

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=20084

Log:
pull the config partition

metze
Modified:
   branches/SAMBA_4_0/source/libnet/libnet_become_dc.c


Changeset:
Modified: branches/SAMBA_4_0/source/libnet/libnet_become_dc.c
===================================================================
--- branches/SAMBA_4_0/source/libnet/libnet_become_dc.c 2006-12-08 18:08:30 UTC 
(rev 20083)
+++ branches/SAMBA_4_0/source/libnet/libnet_become_dc.c 2006-12-08 18:13:49 UTC 
(rev 20084)
@@ -125,7 +125,7 @@
 
                struct drsuapi_DsReplicaObjectListItemEx *first_object;
                struct drsuapi_DsReplicaObjectListItemEx *last_object;
-       } schema;
+       } schema, config;
 
        struct becomeDC_fsmo {
                const char *dns_name;
@@ -1693,6 +1693,8 @@
                                             
becomeDC_drsuapi3_pull_schema_recv);
 }
 
+static void becomeDC_drsuapi3_pull_config_send(struct libnet_BecomeDC_state 
*s);
+
 static void becomeDC_drsuapi3_pull_schema_recv(struct rpc_request *req)
 {
        struct libnet_BecomeDC_state *s = talloc_get_type(req->async.private,
@@ -1719,6 +1721,56 @@
                return;
        }
 
+       becomeDC_drsuapi3_pull_config_send(s);
+}
+
+static void becomeDC_drsuapi3_pull_config_recv(struct rpc_request *req);
+
+static void becomeDC_drsuapi3_pull_config_send(struct libnet_BecomeDC_state *s)
+{
+       s->config.nc.guid       = GUID_zero();
+       s->config.nc.sid        = s->zero_sid;
+       s->config.nc.dn         = s->forest.config_dn_str;
+
+       s->config.destination_dsa_guid  = s->drsuapi2.bind_guid;
+
+       s->config.replica_flags = DRSUAPI_DS_REPLICA_NEIGHBOUR_WRITEABLE
+                               | DRSUAPI_DS_REPLICA_NEIGHBOUR_SYNC_ON_STARTUP
+                               | 
DRSUAPI_DS_REPLICA_NEIGHBOUR_DO_SCHEDULED_SYNCS
+                               | DRSUAPI_DS_REPLICA_NEIGHBOUR_FULL_IN_PROGRESS
+                               | DRSUAPI_DS_REPLICA_NEIGHBOUR_NEVER_SYNCED
+                               | DRSUAPI_DS_REPLICA_NEIGHBOUR_COMPRESS_CHANGES;
+
+       becomeDC_drsuapi_pull_partition_send(s, &s->drsuapi2, &s->drsuapi3, 
&s->config,
+                                            
becomeDC_drsuapi3_pull_config_recv);
+}
+
+static void becomeDC_drsuapi3_pull_config_recv(struct rpc_request *req)
+{
+       struct libnet_BecomeDC_state *s = talloc_get_type(req->async.private,
+                                         struct libnet_BecomeDC_state);
+       struct composite_context *c = s->creq;
+       struct drsuapi_DsGetNCChanges *r = talloc_get_type(req->ndr.struct_ptr,
+                                          struct drsuapi_DsGetNCChanges);
+       WERROR status;
+
+       c->status = dcerpc_ndr_request_recv(req);
+       if (!composite_is_ok(c)) return;
+
+       status = becomeDC_drsuapi_pull_partition_recv(s, &s->config, r);
+       if (!W_ERROR_IS_OK(status)) {
+               composite_error(c, werror_to_ntstatus(status));
+               return;
+       }
+
+       talloc_free(r);
+
+       if (s->config.highwatermark.tmp_highest_usn > 
s->config.highwatermark.highest_usn) {
+               becomeDC_drsuapi_pull_partition_send(s, &s->drsuapi2, 
&s->drsuapi3, &s->config,
+                                                    
becomeDC_drsuapi3_pull_config_recv);
+               return;
+       }
+
        becomeDC_connect_ldap2(s);
 }
 

Reply via email to