#include "lib/events/events.h"
#include "librpc/rpc/dcerpc.h"
#include "librpc/rpc/dcerpc_proto.h"
+#include "libcli/smb/smbXcli_base.h"
#include "auth/credentials/credentials.h"
#include "param/param.h"
#include "libcli/resolve/resolve.h"
struct dcerpc_pipe *pipe;
struct dcerpc_pipe *pipe2;
struct dcerpc_binding *binding;
+ struct {
+ struct smbXcli_conn *conn;
+ struct smbXcli_session *session;
+ struct smbXcli_tcon *tcon;
+ } smb;
};
/* open second dcerpc pipe using the same transport as for primary pipe */
switch (s->pipe->conn->transport.transport) {
case NCACN_NP:
- pipe_smb_req = dcerpc_secondary_smb_send(s->pipe->conn,
- s->pipe2->conn,
+ c->status = dcerpc_binding_get_smbXcli_pointers(s->pipe->binding,
+ &s->smb.conn,
+ &s->smb.session,
+ &s->smb.tcon);
+ if (!NT_STATUS_IS_OK(c->status)) {
+ composite_error(c, NT_STATUS_INVALID_PARAMETER_MIX);
+ return c;
+ }
+
+ pipe_smb_req = dcerpc_pipe_open_smb_send(s->pipe2->conn,
+ s->smb.conn,
+ s->smb.session,
+ s->smb.tcon,
+ DCERPC_REQUEST_TIMEOUT * 1000,
endpoint);
composite_continue(c, pipe_smb_req, continue_open_smb, c);
return c;
{
struct composite_context *c = talloc_get_type(ctx->async.private_data,
struct composite_context);
-
- c->status = dcerpc_secondary_smb_recv(ctx);
+ struct sec_conn_state *s = talloc_get_type_abort(c->private_data,
+ struct sec_conn_state);
+
+ c->status = dcerpc_pipe_open_smb_recv(ctx);
+ if (!composite_is_ok(c)) return;
+
+ c->status = dcerpc_binding_set_smbXcli_pointers(s->binding,
+ s->smb.conn,
+ s->smb.session,
+ s->smb.tcon);
if (!composite_is_ok(c)) return;
continue_pipe_open(c);
s = talloc_get_type(c->private_data, struct sec_conn_state);
s->pipe2->conn->flags = s->pipe->conn->flags;
- s->pipe2->binding = dcerpc_binding_dup(s->pipe2, s->binding);
- if (composite_nomem(s->pipe2->binding, c)) {
- return;
- }
+ s->pipe2->binding = talloc_move(s->pipe2, &s->binding);
composite_done(c);
}
return status;
}
-/*
- Create a secondary dcerpc connection from a primary connection
- - sync version
-
- If the primary is a SMB connection then the secondary connection
- will be on the same SMB connection, but using a new fnum
-*/
-_PUBLIC_ NTSTATUS dcerpc_secondary_connection(struct dcerpc_pipe *p,
- struct dcerpc_pipe **p2,
- const struct dcerpc_binding *b)
-{
- struct composite_context *c;
-
- c = dcerpc_secondary_connection_send(p, b);
- return dcerpc_secondary_connection_recv(c, p2);
-}
-
/*
Create a secondary DCERPC connection, then bind (and possibly
authenticate) using the supplied credentials.