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 abc67ad38bb4d63625889dedab65065b75439393..2787f0a3dce0b980a406631db3f4690a4c3f14e5 100644 (file)
 #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;
 };
 
 
@@ -72,36 +72,40 @@ _PUBLIC_ struct composite_context* dcerpc_secondary_connection_send(struct dcerp
        s->binding  = b;
 
        /* initialise second dcerpc pipe based on primary pipe's event context */
-       s->pipe2 = dcerpc_pipe_init(c, s->pipe->conn->event_ctx, s->pipe->conn->iconv_convenience);
+       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;
 
@@ -122,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);