summaryrefslogtreecommitdiff
path: root/source4/librpc/rpc
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2004-10-24 23:12:13 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:02:29 -0500
commitdbdd217435ee579769cefe58954135bfc5b8411b (patch)
treecb37f53f52b7f157108a1810d194b0e8d2862f78 /source4/librpc/rpc
parent06b3879c8fec97ef5de9b969301611e28fff00de (diff)
downloadsamba-dbdd217435ee579769cefe58954135bfc5b8411b.tar.gz
samba-dbdd217435ee579769cefe58954135bfc5b8411b.tar.bz2
samba-dbdd217435ee579769cefe58954135bfc5b8411b.zip
r3168: Use generic function for looking up endpoints
(This used to be commit 45a3e2a9815058a3a828c573573c5eee605f9129)
Diffstat (limited to 'source4/librpc/rpc')
-rw-r--r--source4/librpc/rpc/dcerpc_util.c206
1 files changed, 3 insertions, 203 deletions
diff --git a/source4/librpc/rpc/dcerpc_util.c b/source4/librpc/rpc/dcerpc_util.c
index 88ef90cf95..3c786e8b3a 100644
--- a/source4/librpc/rpc/dcerpc_util.c
+++ b/source4/librpc/rpc/dcerpc_util.c
@@ -23,206 +23,6 @@
#include "includes.h"
-/*
- work out what TCP port to use for a given interface on a given host
-*/
-NTSTATUS dcerpc_epm_map_tcp_port(const char *server,
- const char *uuid, uint_t version,
- uint32_t *port)
-{
- struct dcerpc_pipe *p;
- NTSTATUS status;
- struct epm_Map r;
- struct policy_handle handle;
- struct GUID guid;
- struct epm_twr_t twr, *twr_r;
-
- if (strcasecmp(uuid, DCERPC_EPMAPPER_UUID) == 0 ||
- strcasecmp(uuid, DCERPC_MGMT_UUID) == 0) {
- /* don't lookup epmapper via epmapper! */
- *port = EPMAPPER_PORT;
- return NT_STATUS_OK;
- }
-
- status = dcerpc_pipe_open_tcp(&p, server, EPMAPPER_PORT, AF_UNSPEC );
- if (!NT_STATUS_IS_OK(status)) {
- return status;
- }
-
- /* we can use the pipes memory context here as we will have a short
- lived connection */
- status = dcerpc_bind_byuuid(p, p,
- DCERPC_EPMAPPER_UUID,
- DCERPC_EPMAPPER_VERSION);
- if (!NT_STATUS_IS_OK(status)) {
- dcerpc_pipe_close(p);
- return status;
- }
-
- ZERO_STRUCT(handle);
- ZERO_STRUCT(guid);
-
- twr.tower.num_floors = 5;
- twr.tower.floors = talloc(p, sizeof(twr.tower.floors[0]) * 5);
-
- /* what I'd like for christmas ... */
-
- /* an RPC interface ... */
- twr.tower.floors[0].lhs.protocol = EPM_PROTOCOL_UUID;
- GUID_from_string(uuid, &twr.tower.floors[0].lhs.info.uuid.uuid);
- twr.tower.floors[0].lhs.info.uuid.version = version;
- twr.tower.floors[0].rhs.uuid.unknown = 0;
-
- /* encoded with NDR ... */
- twr.tower.floors[1].lhs.protocol = EPM_PROTOCOL_UUID;
- GUID_from_string(NDR_GUID, &twr.tower.floors[1].lhs.info.uuid.uuid);
- twr.tower.floors[1].lhs.info.uuid.version = NDR_GUID_VERSION;
- twr.tower.floors[1].rhs.uuid.unknown = 0;
-
- /* on an RPC connection ... */
- twr.tower.floors[2].lhs.protocol = EPM_PROTOCOL_NCACN;
- twr.tower.floors[2].lhs.info.lhs_data = data_blob(NULL, 0);
- twr.tower.floors[2].rhs.ncacn.minor_version = 0;
-
- /* on a TCP port ... */
- twr.tower.floors[3].lhs.protocol = EPM_PROTOCOL_TCP;
- twr.tower.floors[3].lhs.info.lhs_data = data_blob(NULL, 0);
- twr.tower.floors[3].rhs.tcp.port = 0;
-
- /* on an IP link ... */
- twr.tower.floors[4].lhs.protocol = EPM_PROTOCOL_IP;
- twr.tower.floors[4].lhs.info.lhs_data = data_blob(NULL, 0);
- twr.tower.floors[4].rhs.ip.address = 0;
-
- /* with some nice pretty paper around it of course */
- r.in.object = &guid;
- r.in.map_tower = &twr;
- r.in.entry_handle = &handle;
- r.in.max_towers = 1;
- r.out.entry_handle = &handle;
-
- status = dcerpc_epm_Map(p, p, &r);
- if (!NT_STATUS_IS_OK(status)) {
- dcerpc_pipe_close(p);
- return status;
- }
- if (r.out.result != 0 || r.out.num_towers != 1) {
- dcerpc_pipe_close(p);
- return NT_STATUS_PORT_UNREACHABLE;
- }
-
- twr_r = r.out.towers[0].twr;
- if (!twr_r) {
- dcerpc_pipe_close(p);
- return NT_STATUS_PORT_UNREACHABLE;
- }
-
- if (twr_r->tower.num_floors != 5 ||
- twr_r->tower.floors[3].lhs.protocol != twr.tower.floors[3].lhs.protocol) {
- dcerpc_pipe_close(p);
- return NT_STATUS_PORT_UNREACHABLE;
- }
-
- *port = twr_r->tower.floors[3].rhs.tcp.port;
-
- dcerpc_pipe_close(p);
-
- return NT_STATUS_OK;
-}
-
-NTSTATUS dcerpc_epm_map_ncalrpc(TALLOC_CTX *mem_ctx,
- const char *uuid, uint_t version, const char **identifier)
-{
- struct dcerpc_pipe *p;
- NTSTATUS status;
- struct epm_Map r;
- struct policy_handle handle;
- struct GUID guid;
- struct epm_twr_t twr, *twr_r;
-
- if (strcasecmp(uuid, DCERPC_EPMAPPER_UUID) == 0 ||
- strcasecmp(uuid, DCERPC_MGMT_UUID) == 0) {
- /* don't lookup epmapper via epmapper! */
- *identifier = talloc_strdup(mem_ctx, EPMAPPER_IDENTIFIER);
- return NT_STATUS_OK;
- }
-
- status = dcerpc_pipe_open_pipe(&p, EPMAPPER_IDENTIFIER);
- if (!NT_STATUS_IS_OK(status)) {
- return status;
- }
-
- /* we can use the pipes memory context here as we will have a short
- lived connection */
- status = dcerpc_bind_byuuid(p, p,
- DCERPC_EPMAPPER_UUID,
- DCERPC_EPMAPPER_VERSION);
- if (!NT_STATUS_IS_OK(status)) {
- dcerpc_pipe_close(p);
- return status;
- }
-
- ZERO_STRUCT(handle);
- ZERO_STRUCT(guid);
-
- twr.tower.num_floors = 4;
- twr.tower.floors = talloc(p, sizeof(twr.tower.floors[0]) * 5);
-
- twr.tower.floors[0].lhs.protocol = EPM_PROTOCOL_UUID;
- GUID_from_string(uuid, &twr.tower.floors[0].lhs.info.uuid.uuid);
- twr.tower.floors[0].lhs.info.uuid.version = version;
- twr.tower.floors[0].rhs.uuid.unknown = 0;
-
- twr.tower.floors[1].lhs.protocol = EPM_PROTOCOL_UUID;
- GUID_from_string(NDR_GUID, &twr.tower.floors[1].lhs.info.uuid.uuid);
- twr.tower.floors[1].lhs.info.uuid.version = NDR_GUID_VERSION;
- twr.tower.floors[1].rhs.uuid.unknown = 0;
-
- twr.tower.floors[2].lhs.protocol = EPM_PROTOCOL_NCALRPC;
- twr.tower.floors[2].lhs.info.lhs_data = data_blob(NULL, 0);
- twr.tower.floors[2].rhs.ncalrpc.minor_version = 0;
-
- twr.tower.floors[3].lhs.protocol = EPM_PROTOCOL_PIPE;
- twr.tower.floors[3].lhs.info.lhs_data = data_blob(NULL, 0);
- twr.tower.floors[3].rhs.pipe.path = talloc_strdup(p, "");
-
- /* with some nice pretty paper around it of course */
- r.in.object = &guid;
- r.in.map_tower = &twr;
- r.in.entry_handle = &handle;
- r.in.max_towers = 1;
- r.out.entry_handle = &handle;
-
- status = dcerpc_epm_Map(p, p, &r);
- if (!NT_STATUS_IS_OK(status)) {
- dcerpc_pipe_close(p);
- return status;
- }
- if (r.out.result != 0 || r.out.num_towers != 1) {
- dcerpc_pipe_close(p);
- return NT_STATUS_PORT_UNREACHABLE;
- }
-
- twr_r = r.out.towers[0].twr;
- if (!twr_r) {
- dcerpc_pipe_close(p);
- return NT_STATUS_PORT_UNREACHABLE;
- }
-
- if (twr_r->tower.num_floors != 4 ||
- twr_r->tower.floors[3].lhs.protocol != twr.tower.floors[3].lhs.protocol) {
- dcerpc_pipe_close(p);
- return NT_STATUS_PORT_UNREACHABLE;
- }
-
- *identifier = talloc_strdup(mem_ctx, twr_r->tower.floors[3].rhs.pipe.path);
-
- dcerpc_pipe_close(p);
-
- return NT_STATUS_OK;
-}
-
-
/*
find the pipe name for a local IDL interface
@@ -850,7 +650,7 @@ NTSTATUS dcerpc_binding_build_tower(TALLOC_CTX *mem_ctx, struct dcerpc_binding *
return NT_STATUS_OK;
}
-NTSTATUS dcerpc_epm_map(TALLOC_CTX *mem_ctx, struct dcerpc_binding *binding,
+NTSTATUS dcerpc_epm_map_binding(TALLOC_CTX *mem_ctx, struct dcerpc_binding *binding,
const char *uuid, uint_t version)
{
struct dcerpc_pipe *p;
@@ -1064,7 +864,7 @@ static NTSTATUS dcerpc_pipe_connect_ncalrpc(struct dcerpc_pipe **p,
/* Look up identifier using the epmapper */
if (!binding->endpoint) {
- status = dcerpc_epm_map(mem_ctx, binding, pipe_uuid, pipe_version);
+ status = dcerpc_epm_map_binding(mem_ctx, binding, pipe_uuid, pipe_version);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("Failed to map DCERPC/TCP NCALRPC identifier for '%s' - %s\n",
pipe_uuid, nt_errstr(status)));
@@ -1174,7 +974,7 @@ static NTSTATUS dcerpc_pipe_connect_ncacn_ip_tcp(struct dcerpc_pipe **p,
TALLOC_CTX *mem_ctx = talloc_init("connect_ncacn_ip_tcp");
if (!binding->endpoint) {
- status = dcerpc_epm_map(mem_ctx, binding,
+ status = dcerpc_epm_map_binding(mem_ctx, binding,
pipe_uuid, pipe_version);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("Failed to map DCERPC/TCP port for '%s' - %s\n",