summaryrefslogtreecommitdiff
path: root/source4/rpc_server/handles.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-01-10 12:15:26 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:08:38 -0500
commit577218b2aded7adb367f3f33bcc5560f3d4c0ec2 (patch)
tree353a1cad1840485225b0d25d08eae5ae4aa27e5c /source4/rpc_server/handles.c
parent3136462ea9d2b97e5385386e2c37b1ac403db6ca (diff)
downloadsamba-577218b2aded7adb367f3f33bcc5560f3d4c0ec2.tar.gz
samba-577218b2aded7adb367f3f33bcc5560f3d4c0ec2.tar.bz2
samba-577218b2aded7adb367f3f33bcc5560f3d4c0ec2.zip
r4640: first stage in the server side support for multiple context_ids on one pipe
this stage does the following: - simplifies the dcerpc_handle handling, and all the callers of it - split out the context_id depenent state into a linked list of established contexts - fixed some talloc handling in several rpc servers that i noticed while doing the above (This used to be commit fde042b3fc609c94e2c7eedcdd72ecdf489cf63b)
Diffstat (limited to 'source4/rpc_server/handles.c')
-rw-r--r--source4/rpc_server/handles.c44
1 files changed, 24 insertions, 20 deletions
diff --git a/source4/rpc_server/handles.c b/source4/rpc_server/handles.c
index 41169aa25d..df9213bfd3 100644
--- a/source4/rpc_server/handles.c
+++ b/source4/rpc_server/handles.c
@@ -25,57 +25,61 @@
#include "rpc_server/dcerpc_server.h"
/*
+ destroy a rpc handle
+*/
+static int dcesrv_handle_destructor(void *ptr)
+{
+ struct dcesrv_handle *h = ptr;
+ if (h->destroy) {
+ h->destroy(h->context, h);
+ }
+ DLIST_REMOVE(h->context->handles, h);
+ talloc_free(h);
+ return 0;
+}
+
+
+/*
allocate a new rpc handle
*/
-struct dcesrv_handle *dcesrv_handle_new(struct dcesrv_connection *dce_conn,
+struct dcesrv_handle *dcesrv_handle_new(struct dcesrv_connection_context *context,
uint8_t handle_type)
{
struct dcesrv_handle *h;
- h = talloc_p(dce_conn, struct dcesrv_handle);
+ h = talloc_p(context, struct dcesrv_handle);
if (!h) {
return NULL;
}
h->data = NULL;
h->destroy = NULL;
+ h->context = context;
h->wire_handle.handle_type = handle_type;
h->wire_handle.uuid = GUID_random();
- DLIST_ADD(dce_conn->handles, h);
+ DLIST_ADD(context->handles, h);
- return h;
-}
+ talloc_set_destructor(h, dcesrv_handle_destructor);
-/*
- destroy a rpc handle
-*/
-void dcesrv_handle_destroy(struct dcesrv_connection *dce_conn,
- struct dcesrv_handle *h)
-{
- if (h->destroy) {
- h->destroy(dce_conn, h);
- }
- DLIST_REMOVE(dce_conn->handles, h);
- talloc_free(h);
+ return h;
}
-
/*
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_connection *dce_conn,
+struct dcesrv_handle *dcesrv_handle_fetch(struct dcesrv_connection_context *context,
struct policy_handle *p,
uint8_t handle_type)
{
struct dcesrv_handle *h;
if (policy_handle_empty(p)) {
- return dcesrv_handle_new(dce_conn, handle_type);
+ return dcesrv_handle_new(context, handle_type);
}
- for (h=dce_conn->handles; h; h=h->next) {
+ 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 &&