r11289: Fix comment.
[bbaumbach/samba-autobuild/.git] / source4 / rpc_server / handles.c
index 6b7d42226786a755b9cbcbac216b1435cfe22bee..3cc9e8a42547210a07f82d53402fa416098b7a92 100644 (file)
 */
 
 #include "includes.h"
+#include "dlinklist.h"
+#include "rpc_server/dcerpc_server.h"
+
+/*
+  destroy a rpc handle
+*/
+static int dcesrv_handle_destructor(void *ptr)
+{
+       struct dcesrv_handle *h = ptr;
+       DLIST_REMOVE(h->context->handles, h);
+       talloc_free(h);
+       return 0;
+}
+
 
 /*
   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_context *context
+                                       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(context, struct dcesrv_handle);
        if (!h) {
-               talloc_destroy(mem_ctx);
                return NULL;
        }
-       h->mem_ctx = mem_ctx;
        h->data = NULL;
+       h->context = context;
 
-       memset(h->wire_handle.data, 'H', sizeof(h->wire_handle.data));
-       strncpy(h->wire_handle.data, dce->ndr->name, 11);
-       h->wire_handle.data[11] = handle_type;
+       h->wire_handle.handle_type = handle_type;
+       h->wire_handle.uuid = GUID_random();
        
-       /* TODO: check for wraparound here */
-       SIVAL(&h->wire_handle.data, 12, random());
-       dce->next_handle++;     
-       SIVAL(&h->wire_handle.data, 16, dce->next_handle);
+       DLIST_ADD(context->handles, h);
 
-       DLIST_ADD(dce->handles, h);
+       talloc_set_destructor(h, dcesrv_handle_destructor);
 
        return h;
 }
 
-/*
-  destroy a rpc handle
-*/
-void dcesrv_handle_destroy(struct dcesrv_state *dce, 
-                          struct dcesrv_handle *h)
-{
-       DLIST_REMOVE(dce->handles, h);
-       talloc_destroy(h->mem_ctx);
-}
-
-
 /*
   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_context *context
                                          struct policy_handle *p,
-                                         uint8 handle_type)
+                                         uint8_t handle_type)
 {
        struct dcesrv_handle *h;
 
-       if (all_zero(p->data, sizeof(p->data))) {
-               return dcesrv_handle_new(dce, handle_type);
+       if (policy_handle_empty(p)) {
+               return dcesrv_handle_new(context, handle_type);
        }
 
-       for (h=dce->handles; h; h=h->next) {
-               if (memcmp(h->wire_handle.data, p->data, sizeof(p->data)) == 0) {
+       for (h=context->handles; h; h=h->next) {
+               if (h->wire_handle.handle_type == p->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;
+                       }
                        return h;
                }
        }