s4:rpc_server Add a 'if_version' parameter to the bind operation.
[abartlet/samba.git/.git] / source4 / rpc_server / dcerpc_server.h
index 1a003b6adf48cdbafa5ac9aaac04e3de1fb6f2b2..0628730f263af70057708475511a74804e29a406 100644 (file)
@@ -23,8 +23,7 @@
 #ifndef SAMBA_DCERPC_SERVER_H
 #define SAMBA_DCERPC_SERVER_H
 
-#include "core.h"
-#include "librpc/gen_ndr/misc.h"
+#include "librpc/gen_ndr/server_id.h"
 #include "librpc/rpc/dcerpc.h"
 #include "librpc/ndr/libndr.h"
 
@@ -42,10 +41,10 @@ struct dcesrv_connection_context;
 
 struct dcesrv_interface {
        const char *name;
-       struct dcerpc_syntax_id syntax_id;
+       struct ndr_syntax_id syntax_id;
 
        /* this function is called when the client binds to this interface  */
-       NTSTATUS (*bind)(struct dcesrv_call_state *, const struct dcesrv_interface *);
+       NTSTATUS (*bind)(struct dcesrv_call_state *, const struct dcesrv_interface *, uint32_t if_version);
 
        /* this function is called when the client disconnects the endpoint */
        void (*unbind)(struct dcesrv_connection_context *, const struct dcesrv_interface *);
@@ -67,7 +66,7 @@ struct dcesrv_interface {
        NTSTATUS (*ndr_push)(struct dcesrv_call_state *, TALLOC_CTX *, struct ndr_push *, const void *);
 
        /* for any private use by the interface code */
-       const void *private;
+       const void *private_data;
 };
 
 enum dcesrv_call_list {
@@ -102,13 +101,14 @@ struct dcesrv_call_state {
         */
 #define DCESRV_CALL_STATE_FLAG_ASYNC (1<<0)
 #define DCESRV_CALL_STATE_FLAG_MAY_ASYNC (1<<1)
+#define DCESRV_CALL_STATE_FLAG_HEADER_SIGNING (1<<2)
        uint32_t state_flags;
 
        /* the time the request arrived in the server */
        struct timeval time;
 
        /* the backend can use this event context for async replies */
-       struct event_context *event_ctx;
+       struct tevent_context *event_ctx;
 
        /* the message_context that will be used for async replies */
        struct messaging_context *msg_ctx;
@@ -136,8 +136,10 @@ struct dcesrv_call_state {
 /* a dcerpc handle in internal format */
 struct dcesrv_handle {
        struct dcesrv_handle *next, *prev;
-       struct dcesrv_connection_context *context;
+       struct dcesrv_assoc_group *assoc_group;
        struct policy_handle wire_handle;
+       struct dom_sid *sid;
+       const struct dcesrv_interface *iface;
        void *data;
 };
 
@@ -153,6 +155,8 @@ struct dcesrv_connection_context {
        struct dcesrv_connection_context *next, *prev;
        uint32_t context_id;
 
+       struct dcesrv_assoc_group *assoc_group;
+
        /* the connection this is on */
        struct dcesrv_connection *conn;
 
@@ -160,11 +164,7 @@ struct dcesrv_connection_context {
        const struct dcesrv_interface *iface;
 
        /* private data for the interface implementation */
-       void *private;
-
-       /* current rpc handles - this is really the wrong scope for
-          them, but it will do for now */
-       struct dcesrv_handle *handles;
+       void *private_data;
 };
 
 
@@ -197,7 +197,7 @@ struct dcesrv_connection {
        struct dcesrv_auth auth_state;
 
        /* the event_context that will be used for this connection */
-       struct event_context *event_ctx;
+       struct tevent_context *event_ctx;
 
        /* the message_context that will be used for this connection */
        struct messaging_context *msg_ctx;
@@ -208,7 +208,9 @@ struct dcesrv_connection {
        /* the transport level session key */
        DATA_BLOB transport_session_key;
 
-       BOOL processing;
+       bool processing;
+
+       const char *packet_log_dir;
 
        /* this is the default state_flags for dcesrv_call_state structs */
        uint32_t state_flags;
@@ -219,6 +221,9 @@ struct dcesrv_connection {
                struct socket_address *(*get_my_addr)(struct dcesrv_connection *, TALLOC_CTX *mem_ctx);
                struct socket_address *(*get_peer_addr)(struct dcesrv_connection *, TALLOC_CTX *mem_ctx);
        } transport;
+
+       struct tstream_context *stream;
+       struct tevent_queue *send_queue;
 };
 
 
@@ -235,16 +240,31 @@ struct dcesrv_endpoint_server {
         * ask for a dcesrv_interface implementation
         * - iface must be reference to an already existing struct !
         */
-       BOOL (*interface_by_uuid)(struct dcesrv_interface *iface, const struct GUID *, uint32_t);
+       bool (*interface_by_uuid)(struct dcesrv_interface *iface, const struct GUID *, uint32_t);
 
        /* this function can be used by other endpoint servers to
         * ask for a dcesrv_interface implementation
         * - iface must be reference to an already existeng struct !
         */
-       BOOL (*interface_by_name)(struct dcesrv_interface *iface, const char *);
+       bool (*interface_by_name)(struct dcesrv_interface *iface, const char *);
 };
 
 
+/* one association groups */
+struct dcesrv_assoc_group {
+       /* the wire id */
+       uint32_t id;
+       
+       /* list of handles in this association group */
+       struct dcesrv_handle *handles;
+
+       /* parent context */
+       struct dcesrv_context *dce_ctx;
+
+       /* Remote association group ID (if proxied) */
+       uint32_t proxied_id;
+};
+
 /* server-wide context information for the dcerpc server */
 struct dcesrv_context {
        /* the list of endpoints that have registered 
@@ -262,6 +282,11 @@ struct dcesrv_context {
                        struct dcesrv_interface iface;
                } *interface_list;
        } *endpoint_list;
+
+       /* loadparm context to use for this connection */
+       struct loadparm_context *lp_ctx;
+
+       struct idr_context *assoc_groups_idr;
 };
 
 /* this structure is used by modules to determine the size of some critical types */
@@ -280,6 +305,75 @@ struct dcesrv_critical_sizes {
 
 struct model_ops;
 
-#include "rpc_server/dcerpc_server_proto.h"
+NTSTATUS dcesrv_interface_register(struct dcesrv_context *dce_ctx,
+                                  const char *ep_name,
+                                  const struct dcesrv_interface *iface,
+                                  const struct security_descriptor *sd);
+NTSTATUS dcerpc_register_ep_server(const void *_ep_server);
+NTSTATUS dcesrv_init_context(TALLOC_CTX *mem_ctx, 
+                                     struct loadparm_context *lp_ctx,
+                                     const char **endpoint_servers, struct dcesrv_context **_dce_ctx);
+NTSTATUS dcesrv_endpoint_connect(struct dcesrv_context *dce_ctx,
+                                TALLOC_CTX *mem_ctx,
+                                const struct dcesrv_endpoint *ep,
+                                struct auth_session_info *session_info,
+                                struct tevent_context *event_ctx,
+                                struct messaging_context *msg_ctx,
+                                struct server_id server_id,
+                                uint32_t state_flags,
+                                struct dcesrv_connection **_p);
+
+NTSTATUS dcesrv_reply(struct dcesrv_call_state *call);
+struct dcesrv_handle *dcesrv_handle_new(struct dcesrv_connection_context *context, 
+                                       uint8_t handle_type);
+
+struct dcesrv_handle *dcesrv_handle_fetch(
+                                         struct dcesrv_connection_context *context, 
+                                         struct policy_handle *p,
+                                         uint8_t handle_type);
+struct socket_address *dcesrv_connection_get_my_addr(struct dcesrv_connection *conn, TALLOC_CTX *mem_ctx);
+
+struct socket_address *dcesrv_connection_get_peer_addr(struct dcesrv_connection *conn, TALLOC_CTX *mem_ctx);
+
+NTSTATUS dcesrv_fetch_session_key(struct dcesrv_connection *p, DATA_BLOB *session_key);
+
+/* a useful macro for generating a RPC fault in the backend code */
+#define DCESRV_FAULT(code) do { \
+       dce_call->fault_code = code; \
+       return r->out.result; \
+} while(0)
+
+/* a useful macro for generating a RPC fault in the backend code */
+#define DCESRV_FAULT_VOID(code) do { \
+       dce_call->fault_code = code; \
+       return; \
+} while(0)
+
+/* a useful macro for checking the validity of a dcerpc policy handle
+   and giving the right fault code if invalid */
+#define DCESRV_CHECK_HANDLE(h) do {if (!(h)) DCESRV_FAULT(DCERPC_FAULT_CONTEXT_MISMATCH); } while (0)
+
+/* this checks for a valid policy handle, and gives a fault if an
+   invalid handle or retval if the handle is of the
+   wrong type */
+#define DCESRV_PULL_HANDLE_RETVAL(h, inhandle, t, retval) do { \
+       (h) = dcesrv_handle_fetch(dce_call->context, (inhandle), DCESRV_HANDLE_ANY); \
+       DCESRV_CHECK_HANDLE(h); \
+       if ((t) != DCESRV_HANDLE_ANY && (h)->wire_handle.handle_type != (t)) { \
+               return retval; \
+       } \
+} while (0)
+
+/* this checks for a valid policy handle and gives a dcerpc fault 
+   if its the wrong type of handle */
+#define DCESRV_PULL_HANDLE_FAULT(h, inhandle, t) do { \
+       (h) = dcesrv_handle_fetch(dce_call->context, (inhandle), t); \
+       DCESRV_CHECK_HANDLE(h); \
+} while (0)
+
+#define DCESRV_PULL_HANDLE(h, inhandle, t) DCESRV_PULL_HANDLE_RETVAL(h, inhandle, t, NT_STATUS_INVALID_HANDLE)
+#define DCESRV_PULL_HANDLE_WERR(h, inhandle, t) DCESRV_PULL_HANDLE_RETVAL(h, inhandle, t, WERR_BADFID)
+
+
 
 #endif /* SAMBA_DCERPC_SERVER_H */