summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/build/pidl/parser.pm16
-rw-r--r--source4/librpc/idl/drsuapi.idl2
-rw-r--r--source4/librpc/idl/echo.idl2
-rw-r--r--source4/librpc/idl/epmapper.idl2
-rw-r--r--source4/librpc/idl/lsa.idl2
-rw-r--r--source4/librpc/idl/lsads.idl2
-rw-r--r--source4/librpc/idl/netlogon.idl2
-rw-r--r--source4/librpc/idl/oxidresolver.idl2
-rw-r--r--source4/librpc/idl/samr.idl2
-rw-r--r--source4/librpc/idl/spoolss.idl2
-rw-r--r--source4/librpc/idl/w32time.idl2
-rw-r--r--source4/librpc/idl/winreg.idl2
-rw-r--r--source4/librpc/rpc/dcerpc_smb.c11
-rw-r--r--source4/librpc/rpc/dcerpc_util.c37
-rw-r--r--source4/ntvfs/ipc/vfs_ipc.c5
-rw-r--r--source4/rpc_server/dcerpc_server.c36
-rw-r--r--source4/rpc_server/epmapper/rpc_epmapper.c3
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;