From 31403d548e95ee6047009b78ed72e7144ece199a Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 18 Oct 2004 15:18:05 +0000 Subject: 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) --- source4/build/pidl/parser.pm | 16 ++++++------- source4/librpc/idl/drsuapi.idl | 2 +- source4/librpc/idl/echo.idl | 2 +- source4/librpc/idl/epmapper.idl | 2 +- source4/librpc/idl/lsa.idl | 2 +- source4/librpc/idl/lsads.idl | 2 +- source4/librpc/idl/netlogon.idl | 2 +- source4/librpc/idl/oxidresolver.idl | 2 +- source4/librpc/idl/samr.idl | 2 +- source4/librpc/idl/spoolss.idl | 2 +- source4/librpc/idl/w32time.idl | 2 +- source4/librpc/idl/winreg.idl | 2 +- source4/librpc/rpc/dcerpc_smb.c | 11 ++------- source4/librpc/rpc/dcerpc_util.c | 37 ++++++++++++++++++++++-------- source4/ntvfs/ipc/vfs_ipc.c | 5 ---- source4/rpc_server/dcerpc_server.c | 36 +++++++++++++++++++++-------- source4/rpc_server/epmapper/rpc_epmapper.c | 3 +-- 17 files changed, 76 insertions(+), 54 deletions(-) diff --git a/source4/build/pidl/parser.pm b/source4/build/pidl/parser.pm index 7d7ee7a163..15dd1cd70e 100644 --- a/source4/build/pidl/parser.pm +++ b/source4/build/pidl/parser.pm @@ -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"; diff --git a/source4/librpc/idl/drsuapi.idl b/source4/librpc/idl/drsuapi.idl index a59dec5a29..15ebb6077d 100644 --- a/source4/librpc/idl/drsuapi.idl +++ b/source4/librpc/idl/drsuapi.idl @@ -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) ] diff --git a/source4/librpc/idl/echo.idl b/source4/librpc/idl/echo.idl index f8cc734513..e54b3914f8 100644 --- a/source4/librpc/idl/echo.idl +++ b/source4/librpc/idl/echo.idl @@ -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") ] diff --git a/source4/librpc/idl/epmapper.idl b/source4/librpc/idl/epmapper.idl index 18bb6bf7d7..eaf2b185f6 100644 --- a/source4/librpc/idl/epmapper.idl +++ b/source4/librpc/idl/epmapper.idl @@ -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 diff --git a/source4/librpc/idl/lsa.idl b/source4/librpc/idl/lsa.idl index fe3aa1d51b..ca1090545a 100644 --- a/source4/librpc/idl/lsa.idl +++ b/source4/librpc/idl/lsa.idl @@ -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 diff --git a/source4/librpc/idl/lsads.idl b/source4/librpc/idl/lsads.idl index 53ff69d687..3caed0f92f 100644 --- a/source4/librpc/idl/lsads.idl +++ b/source4/librpc/idl/lsads.idl @@ -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 diff --git a/source4/librpc/idl/netlogon.idl b/source4/librpc/idl/netlogon.idl index d52fd2e757..9e0c3c4576 100644 --- a/source4/librpc/idl/netlogon.idl +++ b/source4/librpc/idl/netlogon.idl @@ -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) ] diff --git a/source4/librpc/idl/oxidresolver.idl b/source4/librpc/idl/oxidresolver.idl index 1ef20e5bf0..6354e7b380 100644 --- a/source4/librpc/idl/oxidresolver.idl +++ b/source4/librpc/idl/oxidresolver.idl @@ -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 diff --git a/source4/librpc/idl/samr.idl b/source4/librpc/idl/samr.idl index 8feb726ac8..42a549cc5c 100644 --- a/source4/librpc/idl/samr.idl +++ b/source4/librpc/idl/samr.idl @@ -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 { diff --git a/source4/librpc/idl/spoolss.idl b/source4/librpc/idl/spoolss.idl index 4ee9eab90c..be6dae084a 100644 --- a/source4/librpc/idl/spoolss.idl +++ b/source4/librpc/idl/spoolss.idl @@ -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 diff --git a/source4/librpc/idl/w32time.idl b/source4/librpc/idl/w32time.idl index 568f97ef1d..3ba1bc1ed1 100644 --- a/source4/librpc/idl/w32time.idl +++ b/source4/librpc/idl/w32time.idl @@ -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") ] diff --git a/source4/librpc/idl/winreg.idl b/source4/librpc/idl/winreg.idl index 428345ff30..1f7123f7f3 100644 --- a/source4/librpc/idl/winreg.idl +++ b/source4/librpc/idl/winreg.idl @@ -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 diff --git a/source4/librpc/rpc/dcerpc_smb.c b/source4/librpc/rpc/dcerpc_smb.c index ffe7e55a85..cfb02680e2 100644 --- a/source4/librpc/rpc/dcerpc_smb.c +++ b/source4/librpc/rpc/dcerpc_smb.c @@ -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; 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 */ diff --git a/source4/ntvfs/ipc/vfs_ipc.c b/source4/ntvfs/ipc/vfs_ipc.c index b37b3e917d..8c32a78512 100644 --- a/source4/ntvfs/ipc/vfs_ipc.c +++ b/source4/ntvfs/ipc/vfs_ipc.c @@ -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; diff --git a/source4/rpc_server/dcerpc_server.c b/source4/rpc_server/dcerpc_server.c index 220c730790..b4cf7094aa 100644 --- a/source4/rpc_server/dcerpc_server.c +++ b/source4/rpc_server/dcerpc_server.c @@ -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 { diff --git a/source4/rpc_server/epmapper/rpc_epmapper.c b/source4/rpc_server/epmapper/rpc_epmapper.c index 5cf34efa7f..7de99687b7 100644 --- a/source4/rpc_server/epmapper/rpc_epmapper.c +++ b/source4/rpc_server/epmapper/rpc_epmapper.c @@ -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; -- cgit