s4:librpc/rpc: make use of dcerpc_secondary_smb_send/recv() in dcerpc_secondary_context()
[mat/samba.git] / source4 / librpc / rpc / dcerpc_secondary.c
index 5e8dd955d32e279e417bec2eeedcd74f2ed5ed33..2787f0a3dce0b980a406631db3f4690a4c3f14e5 100644 (file)
 #include "libcli/composite/composite.h"
 #include "lib/events/events.h"
 #include "librpc/rpc/dcerpc.h"
+#include "librpc/rpc/dcerpc_proto.h"
 #include "auth/credentials/credentials.h"
 #include "param/param.h"
 #include "libcli/resolve/resolve.h"
-
+#include "lib/socket/socket.h"
 
 struct sec_conn_state {
        struct dcerpc_pipe *pipe;
        struct dcerpc_pipe *pipe2;
        struct dcerpc_binding *binding;
-       struct smbcli_tree *tree;
+       struct socket_address *peer_addr;
 };
 
 
@@ -50,7 +51,7 @@ static void continue_pipe_open(struct composite_context *c);
   Send request to create a secondary dcerpc connection from a primary
   connection
 */
-struct composite_context* dcerpc_secondary_connection_send(struct dcerpc_pipe *p,
+_PUBLIC_ struct composite_context* dcerpc_secondary_connection_send(struct dcerpc_pipe *p,
                                                           struct dcerpc_binding *b)
 {
        struct composite_context *c;
@@ -74,33 +75,37 @@ struct composite_context* dcerpc_secondary_connection_send(struct dcerpc_pipe *p
        s->pipe2 = dcerpc_pipe_init(c, s->pipe->conn->event_ctx);
        if (composite_nomem(s->pipe2, c)) return c;
 
+       if (DEBUGLEVEL >= 10)
+               s->pipe2->conn->packet_log_dir = s->pipe->conn->packet_log_dir;
+
        /* open second dcerpc pipe using the same transport as for primary pipe */
        switch (s->pipe->conn->transport.transport) {
        case NCACN_NP:
-               /* get smb tree of primary dcerpc pipe opened on smb */
-               s->tree = dcerpc_smb_tree(s->pipe->conn);
-               if (!s->tree) {
-                       composite_error(c, NT_STATUS_INVALID_PARAMETER);
-                       return c;
-               }
-
-               pipe_smb_req = dcerpc_pipe_open_smb_send(s->pipe2, s->tree,
+               pipe_smb_req = dcerpc_secondary_smb_send(s->pipe->conn, s->pipe2,
                                                         s->binding->endpoint);
                composite_continue(c, pipe_smb_req, continue_open_smb, c);
                return c;
 
        case NCACN_IP_TCP:
+               s->peer_addr = dcerpc_socket_peer_addr(s->pipe->conn, s);
+               if (!s->peer_addr) {
+                       composite_error(c, NT_STATUS_INVALID_PARAMETER);
+                       return c;
+               }
+
                pipe_tcp_req = dcerpc_pipe_open_tcp_send(s->pipe2->conn,
-                                                        s->binding->host,
+                                                        s->binding->localaddress,
+                                                        s->peer_addr->addr,
                                                         s->binding->target_hostname,
                                                         atoi(s->binding->endpoint),
-                                                        lp_resolve_context(global_loadparm));
+                                                        resolve_context_init(s));
                composite_continue(c, pipe_tcp_req, continue_open_tcp, c);
                return c;
 
        case NCALRPC:
-               pipe_ncalrpc_req = dcerpc_pipe_open_pipe_send(s->pipe2->conn, lp_ncalrpc_dir(global_loadparm), 
-                                                             s->binding->endpoint);
+       case NCACN_UNIX_STREAM:
+               pipe_ncalrpc_req = dcerpc_pipe_open_unix_stream_send(s->pipe2->conn, 
+                                                             dcerpc_unix_socket_path(s->pipe->conn));
                composite_continue(c, pipe_ncalrpc_req, continue_open_pipe, c);
                return c;
 
@@ -121,7 +126,7 @@ static void continue_open_smb(struct composite_context *ctx)
        struct composite_context *c = talloc_get_type(ctx->async.private_data,
                                                      struct composite_context);
        
-       c->status = dcerpc_pipe_open_smb_recv(ctx);
+       c->status = dcerpc_secondary_smb_recv(ctx);
        if (!composite_is_ok(c)) return;
 
        continue_pipe_open(c);
@@ -183,7 +188,7 @@ static void continue_pipe_open(struct composite_context *c)
   Receive result of secondary rpc connection request and return
   second dcerpc pipe.
 */
-NTSTATUS dcerpc_secondary_connection_recv(struct composite_context *c,
+_PUBLIC_ NTSTATUS dcerpc_secondary_connection_recv(struct composite_context *c,
                                          struct dcerpc_pipe **p2)
 {
        NTSTATUS status = composite_wait(c);
@@ -206,7 +211,7 @@ NTSTATUS dcerpc_secondary_connection_recv(struct composite_context *c,
   If the primary is a SMB connection then the secondary connection
   will be on the same SMB connection, but using a new fnum
 */
-NTSTATUS dcerpc_secondary_connection(struct dcerpc_pipe *p,
+_PUBLIC_ NTSTATUS dcerpc_secondary_connection(struct dcerpc_pipe *p,
                                     struct dcerpc_pipe **p2,
                                     struct dcerpc_binding *b)
 {
@@ -234,7 +239,7 @@ struct sec_auth_conn_state {
 static void dcerpc_secondary_auth_connection_bind(struct composite_context *ctx);
 static void dcerpc_secondary_auth_connection_continue(struct composite_context *ctx);
 
-struct composite_context* dcerpc_secondary_auth_connection_send(struct dcerpc_pipe *p,
+_PUBLIC_ struct composite_context* dcerpc_secondary_auth_connection_send(struct dcerpc_pipe *p,
                                                                struct dcerpc_binding *binding,
                                                                const struct ndr_interface_table *table,
                                                                struct cli_credentials *credentials,
@@ -306,7 +311,7 @@ static void dcerpc_secondary_auth_connection_continue(struct composite_context *
 /*
   Receive an authenticated pipe, created as a secondary connection
 */
-NTSTATUS dcerpc_secondary_auth_connection_recv(struct composite_context *c, 
+_PUBLIC_ NTSTATUS dcerpc_secondary_auth_connection_recv(struct composite_context *c, 
                                               TALLOC_CTX *mem_ctx,
                                               struct dcerpc_pipe **p)
 {