r3118: Eliminate struct dcesrv_ep_description and replace it with
authorJelmer Vernooij <jelmer@samba.org>
Thu, 21 Oct 2004 17:40:55 +0000 (17:40 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:02:23 +0000 (13:02 -0500)
struct dcerpc_binding.
(This used to be commit 2046e14cf8d010d4e715124859df2c1c3c782266)

source4/ntvfs/ipc/vfs_ipc.c
source4/rpc_server/dcerpc_server.c
source4/rpc_server/dcerpc_server.h
source4/rpc_server/dcerpc_tcp.c
source4/rpc_server/epmapper/rpc_epmapper.c

index 8b1c9d2d8dd2c4113e7fc138fc5be4310947e530..dc50f1671e6ec22b59d3c7421c0de770694f164f 100644 (file)
@@ -176,7 +176,7 @@ static NTSTATUS ipc_open_generic(struct ntvfs_module_context *ntvfs,
 {
        struct pipe_state *p;
        NTSTATUS status;
-       struct dcesrv_ep_description ep_description;
+       struct dcerpc_binding ep_description;
        struct auth_session_info *session_info = NULL;
        struct ipc_private *private = ntvfs->private_data;
        int fnum;
@@ -211,8 +211,10 @@ static NTSTATUS ipc_open_generic(struct ntvfs_module_context *ntvfs,
          will need to do that once the credentials infrastructure is
          finalised for Samba4
        */
-       ep_description.type = NCACN_NP;
-       ep_description.info.smb_pipe = p->pipe_name;
+       ep_description.transport = NCACN_NP;
+       ep_description.options = talloc_array_p(req, char *, 2);
+       ep_description.options[0] = p->pipe_name;
+       ep_description.options[1] = NULL;
 
        /* tell the RPC layer the session_info */
        if (req->session) {
index 1ccb8f4ef29545f195daf77d1833d4e601b22d49..a4e31712bdbc3a49ff0cb0221cd538df81ea4a47 100644 (file)
 /*
   see if two endpoints match
 */
-static BOOL endpoints_match(const struct dcesrv_ep_description *ep1,
-                           const struct dcesrv_ep_description *ep2)
+static BOOL endpoints_match(const struct dcerpc_binding *ep1,
+                           const struct dcerpc_binding *ep2)
 {
-       if (ep1->type != ep2->type) {
+       if (ep1->transport != ep2->transport) {
                return False;
        }
 
-       switch (ep1->type) {
-               case NCACN_NP:
-                       if (strcasecmp(ep1->info.smb_pipe,ep2->info.smb_pipe)==0) {
-                               return True;
-                       }                       
-                       break;
-               case NCACN_IP_TCP:
-                       if (ep1->info.tcp_port == ep2->info.tcp_port) {
-                               return True;
-                       }
-                       break;
-               default: 
-                       /* Not supported yet */
-                       return False;
+       if (!ep1->options || !ep2->options) {
+               return ep1->options == ep2->options;
        }
 
-       return False;
+       if (!ep1->options[0] || !ep2->options[0]) {
+               return ep1->options[0] == ep2->options[0];
+       }
+
+       if (strcasecmp(ep1->options[0], ep2->options[0]) != 0) 
+               return False;
+
+       return True;
 }
 
 /*
   find an endpoint in the dcesrv_context
 */
 static struct dcesrv_endpoint *find_endpoint(struct dcesrv_context *dce_ctx,
-                                            const struct dcesrv_ep_description *ep_description)
+                                            const struct dcerpc_binding *ep_description)
 {
        struct dcesrv_endpoint *ep;
        for (ep=dce_ctx->endpoint_list; ep; ep=ep->next) {
@@ -153,7 +148,6 @@ NTSTATUS dcesrv_interface_register(struct dcesrv_context *dce_ctx,
                                   const struct dcesrv_interface *iface,
                                   const struct security_descriptor *sd)
 {
-       struct dcesrv_ep_description ep_description;
        struct dcesrv_endpoint *ep;
        struct dcesrv_if_list *ifl;
        struct dcerpc_binding binding;
@@ -167,46 +161,15 @@ NTSTATUS dcesrv_interface_register(struct dcesrv_context *dce_ctx,
                return status;
        }
 
-       ep_description.type = binding.transport;
-       switch (binding.transport) {
-       case NCACN_IP_TCP:
-               ep_description.info.tcp_port = 0;
-
-               if (binding.options && binding.options[0]) {
-                       ep_description.info.tcp_port = atoi(binding.options[0]);
-               }
-               break;
-       case NCACN_NP:
-               ep_description.info.smb_pipe = binding.options[0];
-               break;
-       default:
-               DEBUG(0, ("Unsupported transport type '%d'\n", binding.transport));
-               return NT_STATUS_NOT_SUPPORTED;
-       }
-
        /* check if this endpoint exists
         */
-       if ((ep=find_endpoint(dce_ctx, &ep_description))==NULL) {
+       if ((ep=find_endpoint(dce_ctx, &binding))==NULL) {
                ep = talloc_p(dce_ctx, struct dcesrv_endpoint);
                if (!ep) {
                        return NT_STATUS_NO_MEMORY;
                }
                ZERO_STRUCTP(ep);
-               ep->ep_description.type = binding.transport;
-               switch (binding.transport) { 
-               case NCACN_IP_TCP:
-                       ep->ep_description.info.tcp_port = 0;
-
-                       if (binding.options && binding.options[0]) {
-                               ep->ep_description.info.tcp_port = atoi(binding.options[0]);
-                       }
-                       break;
-               case NCACN_NP:
-                       ep->ep_description.info.smb_pipe = binding.options[0];
-                       break;
-               default:
-                       return NT_STATUS_NOT_SUPPORTED;
-               }
+               ep->ep_description = binding;
                add_ep = True;
        }
 
@@ -352,7 +315,7 @@ NTSTATUS dcesrv_endpoint_connect(struct dcesrv_context *dce_ctx,
   search and connect to a dcerpc endpoint
 */
 NTSTATUS dcesrv_endpoint_search_connect(struct dcesrv_context *dce_ctx,
-                                       const struct dcesrv_ep_description *ep_description,
+                                       const struct dcerpc_binding *ep_description,
                                        struct auth_session_info *session_info,
                                        struct dcesrv_connection **dce_conn_p)
 {
@@ -1192,7 +1155,6 @@ const struct dcesrv_critical_sizes *dcerpc_module_version(void)
                sizeof(struct dcesrv_context),
                sizeof(struct dcesrv_endpoint),
                sizeof(struct dcesrv_endpoint_server),
-               sizeof(struct dcesrv_ep_description),
                sizeof(struct dcesrv_interface),
                sizeof(struct dcesrv_if_list),
                sizeof(struct dcesrv_connection),
index f04460a78b560c36e000db47218b64110d35f90f..12c93140ec01b6d95c23a203e198b0cb236d0ae2 100644 (file)
 /* version 1 - initial version - metze */
 #define DCERPC_MODULE_VERSION 1
 
-/* a description of a single dcerpc endpoint. Not as flexible as a full epm tower,
-   but much easier to work with */
-struct dcesrv_ep_description {
-       enum dcerpc_transport_t type;
-       union {
-               const char *smb_pipe;
-               uint16_t tcp_port;
-       } info;
-};
-
 struct dcesrv_connection;
 struct dcesrv_call_state;
 struct dcesrv_auth;
@@ -146,13 +136,13 @@ struct dcesrv_endpoint_server {
 
        /* this function can be used by other endpoint servers to
         * ask for a dcesrv_interface implementation
-        * - iface must be referenz to an allready existent struct !
+        * - iface must be reference to an already existing struct !
         */
        BOOL (*interface_by_uuid)(struct dcesrv_interface *iface, const char *, uint32_t);
 
        /* this function can be used by other endpoint servers to
         * ask for a dcesrv_interface implementation
-        * - iface must be referenz to an allready existent struct !
+        * - iface must be reference to an already existeng struct !
         */
        BOOL (*interface_by_name)(struct dcesrv_interface *iface, const char *);
 };
@@ -166,7 +156,7 @@ struct dcesrv_context {
        struct dcesrv_endpoint {
                struct dcesrv_endpoint *next, *prev;
                /* the type and location of the endpoint */
-               struct dcesrv_ep_description ep_description;
+               struct dcerpc_binding ep_description;
                /* the security descriptor for smb named pipes */
                struct security_descriptor *sd;
                /* the list of interfaces available on this endpoint */
@@ -183,7 +173,6 @@ struct dcesrv_critical_sizes {
        int sizeof_dcesrv_context;
        int sizeof_dcesrv_endpoint;
        int sizeof_dcesrv_endpoint_server;
-       int sizeof_dcesrv_ep_description;
        int sizeof_dcesrv_interface;
        int sizeof_dcesrv_if_list;
        int sizeof_dcesrv_connection;
index ef05d74349ea7c2a842f3f5372aeed1ce6522fd3..de8b5bc069f18b9537ef3a0d61feeb67825c0096 100644 (file)
@@ -62,16 +62,29 @@ static void add_socket_rpc(struct server_service *service,
        char *ip_str = talloc_strdup(service, inet_ntoa(*ifip));
 
        for (e=dce_ctx->endpoint_list;e;e=e->next) {
-               if (e->ep_description.type == NCACN_IP_TCP) {
+               if (e->ep_description.transport == NCACN_IP_TCP) {
                        struct server_socket *sock;
                        struct dcesrv_socket_context *dcesrv_sock;
+                       uint16_t port = 0;
+                       
+                       if (e->ep_description.options && e->ep_description.options[0]) 
+                               port = atoi(e->ep_description.options[0]);
 
-                       sock = service_setup_socket(service,model_ops, ip_str, &e->ep_description.info.tcp_port);
+                       sock = service_setup_socket(service,model_ops, ip_str, &port);
                        if (!sock) {
-                               DEBUG(0,("service_setup_socket(port=%u) failed\n",e->ep_description.info.tcp_port));
+                               DEBUG(0,("service_setup_socket(port=%u) failed\n",port));
                                continue;
                        }
 
+                       /* And put the settings back into the binding. This will 
+                        * go away once we store the 'encoded' endpoint instead of a 
+                        * string describing it */
+                       if (e->ep_description.options == NULL) {
+                               e->ep_description.options = talloc_array_p(dce_ctx, const char *, 2);
+                               e->ep_description.options[0] = talloc_asprintf(dce_ctx, "%d", port);
+                               e->ep_description.options[1] = NULL;
+                       }
+
                        dcesrv_sock = talloc_p(sock, struct dcesrv_socket_context);
                        if (!dcesrv_sock) {
                                DEBUG(0,("talloc_p(sock->mem_ctx, struct dcesrv_socket_context) failed\n"));
index 4ee2a7b7749fdb0595508975209619a50b91d8cb..52377569e3ea69e0f55cedfa3915307cec551e89 100644 (file)
@@ -31,7 +31,7 @@ enum handle_types {HTYPE_LOOKUP};
 /* a endpoint combined with an interface description */
 struct dcesrv_ep_iface {
        const char *name;
-       struct dcesrv_ep_description ep_description;
+       struct dcerpc_binding ep_description;
        const char *uuid;
        uint32_t if_version;
 };
@@ -76,12 +76,12 @@ static BOOL fill_protocol_tower(TALLOC_CTX *mem_ctx, struct epm_tower *twr,
        twr->floors[2].lhs.info.lhs_data = data_blob(NULL, 0);
        twr->floors[2].rhs.ncacn.minor_version = 0;
 
-       switch (e->ep_description.type) {
+       switch (e->ep_description.transport) {
        case NCACN_NP:
                /* 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_strdup(mem_ctx, e->ep_description.info.smb_pipe);
+               twr->floors[3].rhs.smb.unc = talloc_strdup(mem_ctx, e->ep_description.options[0]);
                
                /* on an NetBIOS link ... */
                twr->floors[4].lhs.protocol = EPM_PROTOCOL_NETBIOS;
@@ -94,7 +94,10 @@ static BOOL fill_protocol_tower(TALLOC_CTX *mem_ctx, struct epm_tower *twr,
                /* on a TCP connection ... */
                twr->floors[3].lhs.protocol = EPM_PROTOCOL_TCP;
                twr->floors[3].lhs.info.lhs_data = data_blob(NULL, 0);
-               twr->floors[3].rhs.tcp.port = e->ep_description.info.tcp_port;
+               twr->floors[3].rhs.tcp.port = 0;
+               if (e->ep_description.options && e->ep_description.options[0]) {
+                       twr->floors[3].rhs.tcp.port = atoi(e->ep_description.options[0]);
+               }
                
                /* on an IP link ... */
                twr->floors[4].lhs.protocol = EPM_PROTOCOL_IP;
@@ -275,7 +278,7 @@ static error_status_t epm_Map(struct dcesrv_call_state *dce_call, TALLOC_CTX *me
                    floors[0].lhs.info.uuid.version != eps[i].if_version) {
                        continue;
                }
-               switch (eps[i].ep_description.type) {
+               switch (eps[i].ep_description.transport) {
                case NCACN_NP:
                        if (floors[3].lhs.protocol != EPM_PROTOCOL_SMB ||
                            floors[4].lhs.protocol != EPM_PROTOCOL_NETBIOS) {