r20053: implement the DsBind on the 1st drsuapi connection
authorStefan Metzmacher <metze@samba.org>
Wed, 6 Dec 2006 12:25:41 +0000 (12:25 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:28:55 +0000 (14:28 -0500)
metze
(This used to be commit f66f9c2150b36952ac56290db473167eab22ce97)

source4/libnet/libnet_become_dc.c

index 34022701d0ffa3f096de181471287fdd8b515a1a..66a61f63962219c2879fdbef923e0cb31b3f4a3d 100644 (file)
@@ -887,6 +887,11 @@ static void becomeDC_drsuapi_connect_send(struct libnet_BecomeDC_state *s,
        composite_continue(c, creq, recv_fn, s);
 }
 
+static void becomeDC_drsuapi_bind_send(struct libnet_BecomeDC_state *s,
+                                      struct becomeDC_drsuapi *drsuapi,
+                                      void (*recv_fn)(struct rpc_request *req));
+static void becomeDC_drsuapi1_bind_recv(struct rpc_request *req);
+
 static void becomeDC_drsuapi1_connect_recv(struct composite_context *req)
 {
        struct libnet_BecomeDC_state *s = talloc_get_type(req->async.private_data,
@@ -896,6 +901,40 @@ static void becomeDC_drsuapi1_connect_recv(struct composite_context *req)
        c->status = dcerpc_pipe_connect_b_recv(req, s, &s->drsuapi1.pipe);
        if (!composite_is_ok(c)) return;
 
+       becomeDC_drsuapi_bind_send(s, &s->drsuapi1, becomeDC_drsuapi1_bind_recv);
+}
+
+static void becomeDC_drsuapi_bind_send(struct libnet_BecomeDC_state *s,
+                                      struct becomeDC_drsuapi *drsuapi,
+                                      void (*recv_fn)(struct rpc_request *req))
+{
+       struct composite_context *c = s->creq;
+       struct rpc_request *req;
+
+       GUID_from_string(DRSUAPI_DS_BIND_GUID_W2K3, &drsuapi->bind_guid);
+
+       drsuapi->bind_r.in.bind_guid = &drsuapi->bind_guid;
+       drsuapi->bind_r.in.bind_info = NULL;
+       drsuapi->bind_r.out.bind_handle = &drsuapi->bind_handle;
+
+       req = dcerpc_drsuapi_DsBind_send(drsuapi->pipe, s, &drsuapi->bind_r);
+       composite_continue_rpc(c, req, recv_fn, s);
+}
+
+static void becomeDC_drsuapi1_bind_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;
+
+       c->status = dcerpc_ndr_request_recv(req);
+       if (!composite_is_ok(c)) return;
+
+       if (!W_ERROR_IS_OK(s->drsuapi1.bind_r.out.result)) {
+               composite_error(c, werror_to_ntstatus(s->drsuapi1.bind_r.out.result));
+               return;
+       }
+
        becomeDC_connect_ldap2(s);
 }