1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-24 13:57:43 +03:00

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)
This commit is contained in:
Jelmer Vernooij 2004-10-18 15:18:05 +00:00 committed by Gerald (Jerry) Carter
parent b1b8f49a5b
commit 31403d548e
17 changed files with 76 additions and 54 deletions

View File

@ -1482,20 +1482,18 @@ sub FunctionTable($)
}
pidl "\t{ NULL, 0, NULL, NULL }\n};\n\n";
my $endpoints;
if (! defined $interface->{PROPERTIES}->{endpoints}) {
$interface->{PROPERTIES}->{endpoints} = $interface->{NAME};
# If no endpoint is set, default to the interface name as a named pipe
if (! defined $interface->{PROPERTIES}->{endpoint}) {
$interface->{PROPERTIES}->{endpoint} = "\"ncacn_np:[\\\\pipe\\\\" . $interface->{NAME} . "]\"";
}
my @e = split / /, $interface->{PROPERTIES}->{endpoints};
my @e = split / /, $interface->{PROPERTIES}->{endpoint};
my $endpoint_count = $#e + 1;
pidl "static const char * const $interface->{NAME}\_endpoint_strings[] = {\n\t";
for (my $i=0; $i < $#e; $i++) {
pidl "\"$e[$i]\", ";
pidl "static const char * const $interface->{NAME}\_endpoint_strings[] = {\n";
foreach my $ep (@e) {
pidl "\t$ep, \n";
}
pidl "\"$e[$#e]\"\n";
pidl "};\n\n";
pidl "static const struct dcerpc_endpoint_list $interface->{NAME}\_endpoints = {\n";

View File

@ -3,7 +3,7 @@
[
uuid(e3514235-4b06-11d1-ab04-00c04fc2dcd2),
version(4.0),
endpoints(lsass,protected_storage,TCP-0),
endpoint("ncacn_np:[\\pipe\\lsass]","ncacn_np:[\\pipe\\protected_storage]","ncacn_ip_tcp:"),
helpstring("Active Directory Replication"),
pointer_default(unique)
]

View File

@ -3,7 +3,7 @@
[
uuid(60a15ec5-4de8-11d7-a637-005056a20182),
endpoints(rpcecho, TCP-0),
endpoint("ncacn_np:[\\pipe\\rpcecho]", "ncacn_ip_tcp:"),
version(1.0),
helpstring("Simple echo pipe")
]

View File

@ -11,7 +11,7 @@ http://www.opengroup.org/onlinepubs/9629399/chap6.htm#tagcjh_11_02_03_01: bindin
[
uuid(e1af8308-5d1f-11c9-91a4-08002b14a0fa),
version(3.0),
endpoints(epmapper, TCP-135),
endpoint("ncacn_np:[\\pipe\\epmapper]", "ncacn_ip_tcp:[135]"),
pointer_default(unique)
]
interface epmapper

View File

@ -6,7 +6,7 @@
[ uuid(12345778-1234-abcd-ef00-0123456789ab),
version(0.0),
endpoints(lsarpc,lsass,TCP-0),
endpoint("ncacn_np:[\\pipe\\lsarpc]","ncacn_np:[\\pipe\\lsass]","ncacn_ip_tcp:"),
pointer_default(unique),
helpstring("Local Server Authentication(?)")
] interface lsarpc

View File

@ -3,7 +3,7 @@
[
uuid(3919286a-b10c-11d0-9ba8-00c04fd92ef5),
version(0.0),
endpoints(lsarpc,lsass),
endpoint("ncacn_np:[\\pipe\\lsarpc]","ncacn_np:[\\pipe\\lsass]"),
pointer_default(unique)
]
interface lsads

View File

@ -9,7 +9,7 @@
[
uuid(12345678-1234-abcd-ef00-01234567cffb),
version(1.0),
endpoints(netlogon,TCP-0),
endpoint("ncacn_np:[\\pipe\\netlogon]","ncacn_ip_tcp:"),
pointer_default(unique)
]

View File

@ -15,7 +15,7 @@
[
uuid(99fcfec4-5260-101b-bbcb-00aa0021347a),
helpstring("Object Exporter ID Resolver"),
endpoints(epmapper, TCP-135),
endpoint("ncacn_np:[\\pipe\\epmapper]", "ncacn_ip_tcp:[135]"),
pointer_default(unique)
]
interface IOXIDResolver

View File

@ -10,7 +10,7 @@
[ uuid(12345778-1234-abcd-ef00-0123456789ac),
version(1.0),
endpoints(samr,TCP-0),
endpoint("ncacn_np:[\\pipe\\samr]","ncacn_ip_tcp:"),
pointer_default(unique)
] interface samr
{

View File

@ -6,7 +6,7 @@
[ uuid(12345678-1234-abcd-ef00-0123456789ab),
version(1.0),
endpoints(spoolss),
endpoint("ncacn_np:[\\pipe\\spoolss]"),
pointer_default(unique),
helpstring("Spooler SubSystem")
] interface spoolss

View File

@ -4,7 +4,7 @@
[
uuid(8fb6d884-2388-11d0-8c35-00c04fda2795),
endpoints(srvsvc,atsvc,browser,keysvc,wkssvc),
endpoint("ncacn_np:[\\pipe\\srvsvc]","ncacn_np:[\\pipe\\atsvc]","ncacn_np:[\\pipe\\browser]","ncacn_np:[\\pipe\\keysvc]","ncacn_np:[\\pipe\\wkssvc]"),
version(4.1),
helpstring("Win32 Time Server")
]

View File

@ -6,7 +6,7 @@
[ uuid(338cd001-2244-31f1-aaaa-900038001003),
version(1.0),
endpoints(winreg,TCP-0),
endpoint("ncacn_np:[\\pipe\\winreg]","ncacn_ip_tcp:"),
pointer_default(unique),
helpstring("Remote Registry Service")
] interface winreg

View File

@ -372,14 +372,8 @@ NTSTATUS dcerpc_pipe_open_smb(struct dcerpc_pipe **p,
{
struct smb_private *smb;
NTSTATUS status;
char *name;
union smb_open io;
name = talloc_asprintf(tree, "\\%s", pipe_name);
if (!name) {
return NT_STATUS_NO_MEMORY;
}
io.ntcreatex.level = RAW_OPEN_NTCREATEX;
io.ntcreatex.in.flags = 0;
io.ntcreatex.in.root_fid = 0;
@ -398,10 +392,9 @@ NTSTATUS dcerpc_pipe_open_smb(struct dcerpc_pipe **p,
io.ntcreatex.in.create_options = 0;
io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_IMPERSONATION;
io.ntcreatex.in.security_flags = 0;
io.ntcreatex.in.fname = name;
io.ntcreatex.in.fname = pipe_name;
status = smb_raw_open(tree, name, &io);
talloc_free(name);
status = smb_raw_open(tree, pipe_name, &io);
if (!NT_STATUS_IS_OK(status)) {
return status;

View File

@ -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 */

View File

@ -227,9 +227,6 @@ static NTSTATUS ipc_open_generic(struct ntvfs_module_context *ntvfs,
return NT_STATUS_TOO_MANY_OPENED_FILES;
}
while (p->pipe_name[0] == '\\') {
p->pipe_name++;
}
p->ipc_state = 0x5ff;
/*
@ -310,8 +307,6 @@ static NTSTATUS ipc_open_openx(struct ntvfs_module_context *ntvfs,
return NT_STATUS_OBJECT_NAME_NOT_FOUND;
}
fname += 4;
status = ipc_open_generic(ntvfs, req, fname, &p);
if (!NT_STATUS_IS_OK(status)) {
return status;

View File

@ -153,17 +153,30 @@ NTSTATUS dcesrv_interface_register(struct dcesrv_context *dce_ctx,
struct dcesrv_ep_description ep_description;
struct dcesrv_endpoint *ep;
struct dcesrv_if_list *ifl;
BOOL tcp;
struct dcerpc_binding binding;
BOOL add_ep = False;
NTSTATUS status;
status = dcerpc_parse_binding(dce_ctx, ep_name, &binding);
tcp = (strncasecmp(ep_name, "TCP-", 4) == 0);
if (NT_STATUS_IS_ERR(status)) {
DEBUG(0, ("Trouble parsing binding string '%s'\n", ep_name));
return status;
}
if (tcp) {
if (binding.transport == NCACN_IP_TCP) {
ep_description.type = ENDPOINT_TCP;
ep_description.info.tcp_port = atoi(ep_name+4);
} else {
ep_description.info.tcp_port = 0;
if (binding.options && binding.options[0]) {
ep_description.info.tcp_port = atoi(binding.options[0]);
}
} else if (binding.transport == NCACN_NP) {
ep_description.type = ENDPOINT_SMB;
ep_description.info.smb_pipe = ep_name;
ep_description.info.smb_pipe = binding.options[0];
} else {
DEBUG(0, ("Unknown transport type '%d'\n", binding.transport));
return NT_STATUS_INVALID_PARAMETER;
}
/* check if this endpoint exists
@ -174,12 +187,16 @@ NTSTATUS dcesrv_interface_register(struct dcesrv_context *dce_ctx,
return NT_STATUS_NO_MEMORY;
}
ZERO_STRUCTP(ep);
if (tcp) {
if (binding.transport == NCACN_IP_TCP) {
ep->ep_description.type = ENDPOINT_TCP;
ep->ep_description.info.tcp_port = atoi(ep_name+4);
ep->ep_description.info.tcp_port = 0;
if (binding.options && binding.options[0]) {
ep->ep_description.info.tcp_port = atoi(binding.options[0]);
}
} else {
ep->ep_description.type = ENDPOINT_SMB;
ep->ep_description.info.smb_pipe = smb_xstrdup(ep_name);
ep->ep_description.info.smb_pipe = binding.options[0];
}
add_ep = True;
}
@ -508,6 +525,7 @@ static NTSTATUS dcesrv_bind(struct dcesrv_call_state *call)
pkt.u.bind_ack.max_recv_frag = 0x2000;
pkt.u.bind_ack.assoc_group_id = call->pkt.u.bind.assoc_group_id;
if (call->conn->iface && call->conn->iface->ndr) {
/* FIXME: Use pipe name as specified by endpoint instead of interface name */
pkt.u.bind_ack.secondary_address = talloc_asprintf(call, "\\PIPE\\%s",
call->conn->iface->ndr->name);
} else {

View File

@ -81,8 +81,7 @@ static BOOL fill_protocol_tower(TALLOC_CTX *mem_ctx, struct epm_towers *twr,
/* on a SMB pipe ... */
twr->floors[3].lhs.protocol = EPM_PROTOCOL_SMB;
twr->floors[3].lhs.info.lhs_data = data_blob(NULL, 0);
twr->floors[3].rhs.smb.unc = talloc_asprintf(mem_ctx, "\\PIPE\\%s",
e->ep_description.info.smb_pipe);
twr->floors[3].rhs.smb.unc = talloc_strdup(mem_ctx, e->ep_description.info.smb_pipe);
/* on an NetBIOS link ... */
twr->floors[4].lhs.protocol = EPM_PROTOCOL_NETBIOS;