summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2008-04-15 18:24:11 +0200
committerJelmer Vernooij <jelmer@samba.org>2008-04-17 10:58:10 +0200
commite3246e8720c74bb62a2b86b21f6147ea6f050054 (patch)
treed41c749b5fd372cfc3c140dcb58b8996328dcb56 /source3
parent3db2249886bf19be4c357a0966d9efa2f2e692f6 (diff)
downloadsamba-e3246e8720c74bb62a2b86b21f6147ea6f050054.tar.gz
samba-e3246e8720c74bb62a2b86b21f6147ea6f050054.tar.bz2
samba-e3246e8720c74bb62a2b86b21f6147ea6f050054.zip
Actually connect to RPC.
(This used to be commit 3082534454ff936ac0b78b5a2c72c9b060e21244)
Diffstat (limited to 'source3')
-rw-r--r--source3/librpc/rpc/dcerpc.c37
-rw-r--r--source3/librpc/rpc/dcerpc.h3
-rw-r--r--source3/rpc_parse/parse_rpc.c15
3 files changed, 50 insertions, 5 deletions
diff --git a/source3/librpc/rpc/dcerpc.c b/source3/librpc/rpc/dcerpc.c
index 7609757417..f297c7200e 100644
--- a/source3/librpc/rpc/dcerpc.c
+++ b/source3/librpc/rpc/dcerpc.c
@@ -74,7 +74,7 @@ NTSTATUS dcerpc_ndr_request_recv(struct rpc_request *req)
prs_init_empty( &r_ps, req, UNMARSHALL );
- status = rpc_api_pipe_req(req->pipe->cli, req->opnum, &req->q_ps, &r_ps);
+ status = rpc_api_pipe_req(req->pipe->rpc_cli, req->opnum, &req->q_ps, &r_ps);
prs_mem_free( &req->q_ps );
@@ -104,8 +104,6 @@ NTSTATUS dcerpc_ndr_request_recv(struct rpc_request *req)
return ndr_map_error2ntstatus(ndr_err);
}
-
-
return NT_STATUS_NOT_IMPLEMENTED;
}
@@ -117,14 +115,23 @@ _PUBLIC_ NTSTATUS dcerpc_pipe_connect(TALLOC_CTX *parent_ctx, struct dcerpc_pipe
struct dcerpc_pipe *p = talloc(parent_ctx, struct dcerpc_pipe);
struct dcerpc_binding *binding;
NTSTATUS nt_status;
+ int idx;
+ RPC_IFACE iface_syntax;
nt_status = dcerpc_parse_binding(p, binding_string, &binding);
if (NT_STATUS_IS_ERR(nt_status)) {
- DEBUG(1, ("Unable to parse binding string '%s'", binding));
+ DEBUG(1, ("Unable to parse binding string '%s'", binding_string));
+ talloc_free(p);
return nt_status;
}
+ if (binding->transport != NCACN_NP) {
+ DEBUG(0, ("Only ncacn_np supported"));
+ talloc_free(p);
+ return NT_STATUS_NOT_SUPPORTED;
+ }
+
/* FIXME: Actually use loadparm_context.. */
/* FIXME: actually use credentials */
@@ -138,6 +145,28 @@ _PUBLIC_ NTSTATUS dcerpc_pipe_connect(TALLOC_CTX *parent_ctx, struct dcerpc_pipe
get_cmdline_auth_info_use_kerberos() ? CLI_FULL_CONNECTION_USE_KERBEROS : 0,
get_cmdline_auth_info_signing_state(), NULL);
+ if (NT_STATUS_IS_ERR(nt_status)) {
+ talloc_free(p);
+ return nt_status;
+ }
+
+ iface_syntax.uuid = table->syntax_id.uuid;
+ iface_syntax.version = table->syntax_id.if_version;
+
+ idx = cli_get_pipe_idx(&iface_syntax);
+ if (idx < 0) {
+ DEBUG(0, ("Unable to find interface index"));
+ talloc_free(p);
+ return NT_STATUS_OBJECT_PATH_INVALID;
+ }
+
+ p->rpc_cli = cli_rpc_pipe_open_noauth(p->cli, idx, &nt_status);
+
+ if (p->rpc_cli == NULL) {
+ talloc_free(p);
+ return nt_status;
+ }
+
p->table = table;
*pp = p;
diff --git a/source3/librpc/rpc/dcerpc.h b/source3/librpc/rpc/dcerpc.h
index 9e2bd9b4f6..a225f82189 100644
--- a/source3/librpc/rpc/dcerpc.h
+++ b/source3/librpc/rpc/dcerpc.h
@@ -35,7 +35,8 @@ struct cli_credentials;
struct dcerpc_pipe {
const struct ndr_interface_table *table;
- struct rpc_pipe_client *cli;
+ struct cli_state *cli;
+ struct rpc_pipe_client *rpc_cli;
};
struct rpc_request {
diff --git a/source3/rpc_parse/parse_rpc.c b/source3/rpc_parse/parse_rpc.c
index 268bee7e51..9eeae176c7 100644
--- a/source3/rpc_parse/parse_rpc.c
+++ b/source3/rpc_parse/parse_rpc.c
@@ -234,6 +234,21 @@ const char *cli_get_pipe_name(int pipe_idx)
return &pipe_names[pipe_idx].client_pipe[5];
}
+/****************************************************************************
+ Return the pipe idx from the syntax.
+ ****************************************************************************/
+int cli_get_pipe_idx(const RPC_IFACE *syntax)
+{
+ int i;
+ for (i = 0; pipe_names[i].client_pipe; i++) {
+ if (GUID_equal(&pipe_names[i].abstr_syntax.uuid, &syntax->uuid) &&
+ pipe_names[i].abstr_syntax.version == syntax->version)
+ return i;
+ }
+
+ return -1;
+}
+
/*******************************************************************
Inits an RPC_HDR structure.
********************************************************************/