diff options
Diffstat (limited to 'source4/rpc_server/dcerpc_server.h')
-rw-r--r-- | source4/rpc_server/dcerpc_server.h | 129 |
1 files changed, 82 insertions, 47 deletions
diff --git a/source4/rpc_server/dcerpc_server.h b/source4/rpc_server/dcerpc_server.h index 8481372d55..411bf400bf 100644 --- a/source4/rpc_server/dcerpc_server.h +++ b/source4/rpc_server/dcerpc_server.h @@ -4,6 +4,7 @@ server side dcerpc defines Copyright (C) Andrew Tridgell 2003 + Copyright (C) Stefan (metze) Metzmacher 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 @@ -20,12 +21,18 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +/* modules can use the following to determine if the interface has changed + * please increment the version number after each interface change + * with a comment and maybe update struct dcesrv_critical_sizes. + */ +/* version 1 - initial version - metze */ +#define DCERPC_MODULE_VERSION 1 enum endpoint_type {ENDPOINT_SMB, ENDPOINT_TCP}; /* a description of a single dcerpc endpoint. Not as flexible as a full epm tower, but much easier to work with */ -struct dcesrv_endpoint { +struct dcesrv_ep_description { enum endpoint_type type; union { const char *smb_pipe; @@ -33,23 +40,31 @@ struct dcesrv_endpoint { } info; }; -/* a endpoint combined with an interface description */ -struct dcesrv_ep_iface { - const char *name; - struct dcesrv_endpoint endpoint; - const char *uuid; - uint32 if_version; -}; - -struct dcesrv_state; +struct dcesrv_connection; +struct dcesrv_call_state; /* the dispatch functions for an interface take this form */ -typedef NTSTATUS (*dcesrv_dispatch_fn_t)(struct dcesrv_state *, TALLOC_CTX *, void *); +typedef NTSTATUS (*dcesrv_dispatch_fn_t)(struct dcesrv_call_state *, TALLOC_CTX *, void *); + +struct dcesrv_interface { + /* the ndr function table for the chosen interface */ + const struct dcerpc_interface_table *ndr; + + /* this function is called when the client binds to this interface */ + NTSTATUS (*bind)(struct dcesrv_call_state *, const struct dcesrv_interface *); + + /* this function is called when the client disconnects the endpoint */ + void (*unbind)(struct dcesrv_connection *, const struct dcesrv_interface *); + + /* the dispatch function for the chosen interface. + */ + dcesrv_dispatch_fn_t dispatch; +}; /* the state of an ongoing dcerpc call */ struct dcesrv_call_state { struct dcesrv_call_state *next, *prev; - struct dcesrv_state *dce; + struct dcesrv_connection *conn; TALLOC_CTX *mem_ctx; struct dcerpc_packet pkt; @@ -78,24 +93,17 @@ struct dcesrv_auth { /* the state associated with a dcerpc server connection */ -struct dcesrv_state { +struct dcesrv_connection { /* the top level context for this server */ - struct dcesrv_context *dce; + struct dcesrv_context *dce_ctx; TALLOC_CTX *mem_ctx; /* the endpoint that was opened */ - struct dcesrv_endpoint endpoint; - - /* endpoint operations provided by the endpoint server */ - const struct dcesrv_endpoint_ops *ops; + const struct dcesrv_endpoint *endpoint; /* the ndr function table for the chosen interface */ - const struct dcerpc_interface_table *ndr; - - /* the dispatch table for the chosen interface. Must contain - enough entries for all entries in the ndr table */ - const dcesrv_dispatch_fn_t *dispatch; + const struct dcesrv_interface *iface; /* the state of the current calls */ struct dcesrv_call_state *call_list; @@ -103,7 +111,7 @@ struct dcesrv_state { /* the maximum size the client wants to receive */ uint32 cli_max_recv_frag; - /* private data for the endpoint server */ + /* private data for the interface implementation */ void *private; /* current rpc handles - this is really the wrong scope for @@ -117,34 +125,61 @@ struct dcesrv_state { }; -struct dcesrv_endpoint_ops { - /* this function is used to ask an endpoint server if it - handles a particular endpoint */ - BOOL (*query_endpoint)(const struct dcesrv_endpoint *); - - /* this function sets up the dispatch table for this - connection */ - BOOL (*set_interface)(struct dcesrv_state *, const char *, uint32); - - /* connect() is called when a connection is made to an endpoint */ - NTSTATUS (*connect)(struct dcesrv_state *); - - /* disconnect() is called when the endpoint is disconnected */ - void (*disconnect)(struct dcesrv_state *); +struct dcesrv_endpoint_server { + /* this is the name of the endpoint server */ + const char *name; - /* this function is used to ask an endpoint server for a list - of endpoints/interfaces it wants to handle */ - int (*lookup_endpoints)(TALLOC_CTX *mem_ctx, struct dcesrv_ep_iface **); + /* this function should register endpoints and some other setup stuff, + * it is called when the dcesrv_context gets initialized. + */ + NTSTATUS (*init_server)(struct dcesrv_context *, const 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 ! + */ + BOOL (*interface_by_uuid)(struct dcesrv_interface *iface, const char *, uint32); + + /* 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 ! + */ + BOOL (*interface_by_name)(struct dcesrv_interface *iface, const char *); }; /* server-wide context information for the dcerpc server */ struct dcesrv_context { - - /* the list of endpoints servers that have registered */ - struct dce_endpoint { - struct dce_endpoint *next, *prev; - struct dcesrv_endpoint endpoint; - const struct dcesrv_endpoint_ops *endpoint_ops; + TALLOC_CTX *mem_ctx; + + /* the list of endpoints that have registered + * by the configured endpoint servers + */ + struct dcesrv_endpoint { + struct dcesrv_endpoint *next, *prev; + /* the type and location of the endpoint */ + struct dcesrv_ep_description ep_description; + /* the security descriptor for smb named pipes */ + struct security_descriptor *sd; + /* the list of interfaces available on this endpoint */ + struct dcesrv_if_list { + struct dcesrv_if_list *next, *prev; + struct dcesrv_interface iface; + } *interface_list; } *endpoint_list; }; + +/* this structure is used by modules to determine the size of some critical types */ +struct dcesrv_critical_sizes { + int interface_version; + 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; + int sizeof_dcesrv_call_state; + int sizeof_dcesrv_auth; + int sizeof_dcesrv_handle; +}; |