diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2004-10-18 15:18:05 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:01:53 -0500 |
commit | 31403d548e95ee6047009b78ed72e7144ece199a (patch) | |
tree | ed25edef604668354e5b9ffc4cf4cc75d5d1a9c1 /source4/librpc/rpc/dcerpc_util.c | |
parent | b1b8f49a5b6d57cdec663efe0d43c5e3de4abbf3 (diff) | |
download | samba-31403d548e95ee6047009b78ed72e7144ece199a.tar.gz samba-31403d548e95ee6047009b78ed72e7144ece199a.tar.bz2 samba-31403d548e95ee6047009b78ed72e7144ece199a.zip |
r3043: Use binding strings for specifying endpoints. The property for
specifying a endpoint is now also 'endpoint' instead of 'endpoints'. The
default endpoint (if none is specified) is still "ncacn_np:[\\pipe\\ifacename]",
where ifacename is the name of the interface.
Examples:
[
uuid(60a15ec5-4de8-11d7-a637-005056a20182),
endpoint("ncacn_np:[\\pipe\\rpcecho]", "ncacn_ip_tcp:")
]
interface rpcecho
{
void dummy();
}
dcerpc_binding is now converted to ep_description in the server, but I hope to
completely eliminate ep_description later on.
The eventual goal of all these changes is to make it easier to add
transports as I'm going to add support for
ncalrpc (local RPC over named pipes) and ncacn_unix_stream (Unix sockets).
(This used to be commit f3da7c8b443a29b0c656c687a277384ae1353792)
Diffstat (limited to 'source4/librpc/rpc/dcerpc_util.c')
-rw-r--r-- | source4/librpc/rpc/dcerpc_util.c | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/source4/librpc/rpc/dcerpc_util.c b/source4/librpc/rpc/dcerpc_util.c index 747f8d1277..a82f30f3e5 100644 --- a/source4/librpc/rpc/dcerpc_util.c +++ b/source4/librpc/rpc/dcerpc_util.c @@ -4,6 +4,7 @@ dcerpc utility functions Copyright (C) Andrew Tridgell 2003 + Copyright (C) Jelmer Vernooij 2004 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -129,7 +130,6 @@ NTSTATUS dcerpc_epm_map_tcp_port(const char *server, return NT_STATUS_OK; } - /* find the pipe name for a local IDL interface */ @@ -425,24 +425,39 @@ static NTSTATUS dcerpc_pipe_connect_ncacn_np(struct dcerpc_pipe **p, BOOL retry; struct smbcli_state *cli; const char *pipe_name; + TALLOC_CTX *mem_ctx = talloc_init("dcerpc_pipe_connect_ncacn_np"); if (!binding->options || !binding->options[0] || !strlen(binding->options[0])) { const struct dcerpc_interface_table *table = idl_iface_by_uuid(pipe_uuid); + struct dcerpc_binding default_binding; + int i; + if (!table) { DEBUG(0,("Unknown interface endpoint '%s'\n", pipe_uuid)); + talloc_destroy(mem_ctx); return NT_STATUS_INVALID_PARAMETER; } - /* only try the first endpoint for now */ - pipe_name = table->endpoints->names[0]; + + /* Find one of the default pipes for this interface */ + for (i = 0; i < table->endpoints->count; i++) { + status = dcerpc_parse_binding(mem_ctx, table->endpoints->names[i], &default_binding); + + if (NT_STATUS_IS_OK(status) && default_binding.transport == ENDPOINT_SMB) { + pipe_name = default_binding.options[0]; + break; + + } + } } else { pipe_name = binding->options[0]; } - if (strncasecmp(pipe_name, "\\pipe\\", 6) == 0) { - pipe_name += 6; + if (!strncasecmp(pipe_name, "/pipe/", 6)) { + pipe_name+=6; } - if (strncasecmp(pipe_name, "/pipe/", 6) == 0) { - pipe_name += 6; + + if (strncasecmp(pipe_name, "\\pipe\\", 6)) { + pipe_name = talloc_asprintf(mem_ctx, "\\pipe\\%s", pipe_name); } if (!username || !username[0]) { @@ -459,6 +474,7 @@ static NTSTATUS dcerpc_pipe_connect_ncacn_np(struct dcerpc_pipe **p, } if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("Failed to connect to %s - %s\n", binding->host, nt_errstr(status))); + talloc_destroy(mem_ctx); return status; } @@ -467,8 +483,11 @@ static NTSTATUS dcerpc_pipe_connect_ncacn_np(struct dcerpc_pipe **p, DEBUG(0,("Failed to open pipe %s - %s\n", pipe_name, nt_errstr(status))); smbcli_tdis(cli); smbcli_shutdown(cli); - return status; - } + talloc_destroy(mem_ctx); + return status; + } + + talloc_destroy(mem_ctx); /* this ensures that the reference count is decremented so a pipe close will really close the link */ |