r4394: Use 'raw' protocol towers in the lists in the endpoint rather then
[samba.git] / source4 / rpc_server / handles.c
index 26d7552afb0e1414848dcad16a4d4c973d303ef6..41169aa25dd36e57d4ada187b194c993bbbe6d02 100644 (file)
 */
 
 #include "includes.h"
+#include "dlinklist.h"
+#include "rpc_server/dcerpc_server.h"
 
 /*
   allocate a new rpc handle
 */
-struct dcesrv_handle *dcesrv_handle_new(struct dcesrv_state *dce
-                                       uint8 handle_type)
+struct dcesrv_handle *dcesrv_handle_new(struct dcesrv_connection *dce_conn
+                                       uint8_t handle_type)
 {
-       TALLOC_CTX *mem_ctx;
        struct dcesrv_handle *h;
 
-       mem_ctx = talloc_init("rpc handle type %d\n", handle_type);
-       if (!mem_ctx) {
-               return NULL;
-       }
-       h = talloc(mem_ctx, sizeof(*h));
+       h = talloc_p(dce_conn, struct dcesrv_handle);
        if (!h) {
-               talloc_destroy(mem_ctx);
                return NULL;
        }
-       h->mem_ctx = mem_ctx;
        h->data = NULL;
+       h->destroy = NULL;
 
        h->wire_handle.handle_type = handle_type;
-       uuid_generate_random(&h->wire_handle.uuid);
+       h->wire_handle.uuid = GUID_random();
        
-       DLIST_ADD(dce->handles, h);
+       DLIST_ADD(dce_conn->handles, h);
 
        return h;
 }
@@ -54,11 +50,14 @@ struct dcesrv_handle *dcesrv_handle_new(struct dcesrv_state *dce,
 /*
   destroy a rpc handle
 */
-void dcesrv_handle_destroy(struct dcesrv_state *dce
+void dcesrv_handle_destroy(struct dcesrv_connection *dce_conn
                           struct dcesrv_handle *h)
 {
-       DLIST_REMOVE(dce->handles, h);
-       talloc_destroy(h->mem_ctx);
+       if (h->destroy) {
+               h->destroy(dce_conn, h);
+       }
+       DLIST_REMOVE(dce_conn->handles, h);
+       talloc_free(h);
 }
 
 
@@ -66,20 +65,21 @@ void dcesrv_handle_destroy(struct dcesrv_state *dce,
   find an internal handle given a wire handle. If the wire handle is NULL then
   allocate a new handle
 */
-struct dcesrv_handle *dcesrv_handle_fetch(struct dcesrv_state *dce
+struct dcesrv_handle *dcesrv_handle_fetch(struct dcesrv_connection *dce_conn
                                          struct policy_handle *p,
-                                         uint8 handle_type)
+                                         uint8_t handle_type)
 {
        struct dcesrv_handle *h;
 
        if (policy_handle_empty(p)) {
-               return dcesrv_handle_new(dce, handle_type);
+               return dcesrv_handle_new(dce_conn, handle_type);
        }
 
-       for (h=dce->handles; h; h=h->next) {
+       for (h=dce_conn->handles; h; h=h->next) {
                if (h->wire_handle.handle_type == p->handle_type &&
-                   uuid_equal(&p->uuid, &h->wire_handle.uuid)) {
-                       if (p->handle_type != handle_type) {
+                   GUID_equal(&p->uuid, &h->wire_handle.uuid)) {
+                       if (handle_type != DCESRV_HANDLE_ANY &&
+                           p->handle_type != handle_type) {
                                DEBUG(0,("client gave us the wrong handle type (%d should be %d)\n",
                                         p->handle_type, handle_type));
                                return NULL;