r3516: dcerpc_epm_map_binding now checks the endpoints it nows first
authorJelmer Vernooij <jelmer@samba.org>
Thu, 4 Nov 2004 01:25:56 +0000 (01:25 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:05:27 +0000 (13:05 -0500)
and then possibly does a epm_Map call().
ncacn_np now also uses dcerpc_epm_map_binding()
(This used to be commit 77eec3fa18dbbf4d774ccf04c7a38b0887f26ca6)

source4/build/pidl/util.pm
source4/librpc/idl/epmapper.idl
source4/librpc/idl/mgmt.idl
source4/librpc/idl/remact.idl
source4/librpc/rpc/dcerpc_util.c

index 03541ae95dd13515809e60476b3d3f407a37cb08..bddce577404df069f3be56ec47764729da74f026 100644 (file)
@@ -239,7 +239,6 @@ sub type_align($)
     return 4, if ($type eq "DATA_BLOB");
     return 4, if ($type eq "int32");
 
-       print STDERR "Had to guess align width for type $type\n";
     # it must be an external type - all we can do is guess 
     return 4;
 }
index 2bff814a4547a320ec7e8b123342592c566e1821..e18c24a3cd11218ff79ad81856e86958e83860ec 100644 (file)
@@ -36,9 +36,6 @@ interface epmapper
        const string NDR_GUID = "8a885d04-1ceb-11c9-9fe8-08002b104860";
        const string NDR_GUID_VERSION = 2;
 
-       const uint32 EPMAPPER_PORT = 135;
-       const string EPMAPPER_IDENTIFIER = "EPMAPPER";
-
        typedef struct {
                GUID uuid;
                uint16 version;
index 8cc409454f7c5bc4f1fa1e7233649ff6f30e726e..ac41ff18640845d906fb81153e37e1c9b3261881 100644 (file)
@@ -7,6 +7,7 @@
 [
   uuid("afa8bd80-7d8a-11c9-bef4-08002b102989"), 
   version(1.0),
+  endpoint("ncalrpc:", "ncacn_ip_tcp:[135]", "ncacn_np:[\\pipe\\epmapper]"),
   helpstring("DCE/RPC Remote Management")
 ] 
 interface mgmt
index 8a77240a19db3d672f80125e0d168127019b28dc..6065d41bcc0a789ea0e2af2e43f08d74ded396ff 100644 (file)
@@ -10,7 +10,7 @@
 [
        uuid("4d9f4ab8-7d1c-11cf-861e-0020af6e7c57"),
        pointer_default(unique),
-       endpoint("ncalrpc:", "ncacn_ip_tcp:[135]"),
+       endpoint("ncalrpc:", "ncacn_ip_tcp:[135]", "ncacn_np:[\\pipe\\epmapper]"),
        depends(dcom)
 ]
 interface IRemoteActivation
index 8eb058d7b392fcbffba188b90639235f3da3d601..3e460af8e787bbe74e1f170e20f8bbbf37c72fef 100644 (file)
@@ -24,9 +24,6 @@
 #include "includes.h"
 #include "system/network.h"
 #include "librpc/gen_ndr/ndr_epmapper.h"
-#include "librpc/gen_ndr/ndr_remact.h"
-#include "librpc/gen_ndr/ndr_oxidresolver.h"
-#include "librpc/gen_ndr/ndr_mgmt.h"
 #include "librpc/gen_ndr/tables.h"
 
 /*
@@ -660,19 +657,25 @@ NTSTATUS dcerpc_epm_map_binding(TALLOC_CTX *mem_ctx, struct dcerpc_binding *bind
        struct GUID guid;
        struct epm_twr_t twr, *twr_r;
        struct dcerpc_binding epmapper_binding;
+       const struct dcerpc_interface_table *table = idl_iface_by_uuid(uuid);
+       int i;
+
+       /* First, check if there is a default endpoint specified in the IDL */
 
+       if (table) {
+               struct dcerpc_binding default_binding;
+               
+               /* 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 (!strcmp(uuid, DCERPC_EPMAPPER_UUID) ||
-               !strcmp(uuid, DCERPC_MGMT_UUID) ||
-               !strcmp(uuid, DCERPC_IREMOTEACTIVATION_UUID) ||
-               !strcmp(uuid, DCERPC_IOXIDRESOLVER_UUID)) {
-               switch(binding->transport) {
-                       case NCACN_IP_TCP: binding->endpoint = talloc_asprintf(mem_ctx, "%d", EPMAPPER_PORT); return NT_STATUS_OK;
-                       case NCALRPC: binding->endpoint = EPMAPPER_IDENTIFIER; return NT_STATUS_OK;
-                       default: return NT_STATUS_NOT_SUPPORTED;
+                       if (NT_STATUS_IS_OK(status) && default_binding.transport == binding->transport && default_binding.endpoint) {
+                               binding->endpoint = talloc_strdup(mem_ctx, default_binding.endpoint);   
+                               return NT_STATUS_OK;
+                       }
                }
        }
-       
+
 
        ZERO_STRUCT(epmapper_binding);
        epmapper_binding.transport = binding->transport;
@@ -759,36 +762,20 @@ static NTSTATUS dcerpc_pipe_connect_ncacn_np(struct dcerpc_pipe **p,
        const char *pipe_name = NULL;
        TALLOC_CTX *mem_ctx = talloc_init("dcerpc_pipe_connect_ncacn_np");
        
+       /* Look up identifier using the epmapper */
        if (!binding->endpoint) {
-               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));
+               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 NCACN_NP pipe for '%s' - %s\n", 
+                                pipe_uuid, nt_errstr(status)));
                        talloc_destroy(mem_ctx);
-                       return NT_STATUS_INVALID_PARAMETER;
-               }
-
-               /* 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 == NCACN_NP) {
-                               pipe_name = default_binding.endpoint;   
-                               break;
-                               
-                       }
-               }
-
-               if (pipe_name == NULL) {
-                       DEBUG(0, ("No default named pipe specified for interface with UUID %s\n", pipe_uuid));
-                       return NT_STATUS_OBJECT_NAME_NOT_FOUND;
+                       return status;
                }
-       } else {
-               pipe_name = binding->endpoint;
+               DEBUG(1,("Mapped to DCERPC/TCP pipe %s\n", binding->endpoint));
        }
 
+       pipe_name = binding->endpoint;
+
        if (!strncasecmp(pipe_name, "/pipe/", 6) || 
                !strncasecmp(pipe_name, "\\pipe\\", 6)) {
                pipe_name+=6;