From a9bb84c4b0d572338258c88140b4f3fe2b425675 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 19 Sep 2013 18:50:27 +0200 Subject: s4:librpc: implement dcerpc_pipe_open_smb2() in dcerpc_smb.c Signed-off-by: Stefan Metzmacher Reviewed-by: Andreas Schneider --- source4/librpc/rpc/dcerpc.h | 3 +++ source4/librpc/rpc/dcerpc_smb.c | 45 ++++++++++++++++++++++++++++++++++++++++ source4/librpc/rpc/dcerpc_smb2.c | 8 ------- 3 files changed, 48 insertions(+), 8 deletions(-) (limited to 'source4/librpc') diff --git a/source4/librpc/rpc/dcerpc.h b/source4/librpc/rpc/dcerpc.h index 8b1c39655cb..242f356a602 100644 --- a/source4/librpc/rpc/dcerpc.h +++ b/source4/librpc/rpc/dcerpc.h @@ -170,6 +170,9 @@ struct dcerpc_pipe *dcerpc_pipe_init(TALLOC_CTX *mem_ctx, struct tevent_context NTSTATUS dcerpc_pipe_open_smb(struct dcerpc_pipe *p, struct smbcli_tree *tree, const char *pipe_name); +NTSTATUS dcerpc_pipe_open_smb2(struct dcerpc_pipe *p, + struct smb2_tree *tree, + const char *pipe_name); NTSTATUS dcerpc_bind_auth_none(struct dcerpc_pipe *p, const struct ndr_interface_table *table); NTSTATUS dcerpc_fetch_session_key(struct dcerpc_pipe *p, diff --git a/source4/librpc/rpc/dcerpc_smb.c b/source4/librpc/rpc/dcerpc_smb.c index 0651f5e61bd..adfb870db78 100644 --- a/source4/librpc/rpc/dcerpc_smb.c +++ b/source4/librpc/rpc/dcerpc_smb.c @@ -28,6 +28,7 @@ #include "libcli/smb/smbXcli_base.h" #include "libcli/smb/tstream_smbXcli_np.h" #include "libcli/raw/libcliraw.h" +#include "libcli/smb2/smb2.h" #include "librpc/rpc/dcerpc.h" #include "librpc/rpc/dcerpc_proto.h" #include "libcli/composite/composite.h" @@ -590,6 +591,50 @@ _PUBLIC_ NTSTATUS dcerpc_pipe_open_smb(struct dcerpc_pipe *p, return dcerpc_pipe_open_smb_recv(ctx); } +_PUBLIC_ NTSTATUS dcerpc_pipe_open_smb2(struct dcerpc_pipe *p, + struct smb2_tree *t, + const char *pipe_name) +{ + struct smbXcli_conn *conn; + struct smbXcli_session *session; + struct smbXcli_tcon *tcon; + uint32_t timeout_msec; + struct composite_context *ctx; + + conn = t->session->transport->conn; + session = t->session->smbXcli; + tcon = t->smbXcli; + timeout_msec = t->session->transport->options.request_timeout * 1000; + + /* if we don't have a binding on this pipe yet, then create one */ + if (p->binding == NULL) { + NTSTATUS status; + const char *r = smbXcli_conn_remote_name(conn); + char *str; + SMB_ASSERT(r != NULL); + str = talloc_asprintf(p, "ncacn_np:%s", r); + if (str == NULL) { + return NT_STATUS_NO_MEMORY; + } + status = dcerpc_parse_binding(p, str, + &p->binding); + talloc_free(str); + if (!NT_STATUS_IS_OK(status)) { + return status; + } + } + + ctx = dcerpc_pipe_open_smb_send(p->conn, + conn, session, + tcon, timeout_msec, + pipe_name); + if (ctx == NULL) { + return NT_STATUS_NO_MEMORY; + } + + return dcerpc_pipe_open_smb_recv(ctx); +} + struct composite_context *dcerpc_secondary_smb_send(struct dcecli_connection *c1, struct dcecli_connection *c2, const char *pipe_name) diff --git a/source4/librpc/rpc/dcerpc_smb2.c b/source4/librpc/rpc/dcerpc_smb2.c index 2b1c66e232f..571c50fb83f 100644 --- a/source4/librpc/rpc/dcerpc_smb2.c +++ b/source4/librpc/rpc/dcerpc_smb2.c @@ -539,14 +539,6 @@ NTSTATUS dcerpc_pipe_open_smb2_recv(struct composite_context *c) return status; } -NTSTATUS dcerpc_pipe_open_smb2(struct dcerpc_pipe *p, - struct smb2_tree *tree, - const char *pipe_name) -{ - struct composite_context *ctx = dcerpc_pipe_open_smb2_send(p, tree, pipe_name); - return dcerpc_pipe_open_smb2_recv(ctx); -} - /* return the SMB2 tree used for a dcerpc over SMB2 pipe */ -- cgit