diff options
Diffstat (limited to 'source4/lib/messaging')
-rw-r--r-- | source4/lib/messaging/irpc.h | 5 | ||||
-rw-r--r-- | source4/lib/messaging/messaging.c | 21 |
2 files changed, 18 insertions, 8 deletions
diff --git a/source4/lib/messaging/irpc.h b/source4/lib/messaging/irpc.h index a483c78c70..93cadddd34 100644 --- a/source4/lib/messaging/irpc.h +++ b/source4/lib/messaging/irpc.h @@ -28,7 +28,7 @@ struct irpc_message { }; /* don't allow calls to take too long */ -#define IRPC_CALL_TIMEOUT 10 +#define IRPC_CALL_TIMEOUT 20 /* the server function type */ @@ -44,6 +44,9 @@ typedef NTSTATUS (*irpc_function_t)(struct irpc_message *, void *r); #define IRPC_CALL(msg_ctx, server_id, pipename, funcname, ptr) \ irpc_call(msg_ctx, server_id, &dcerpc_table_ ## pipename, DCERPC_ ## funcname, ptr) +#define IRPC_CALL_SEND(msg_ctx, server_id, pipename, funcname, ptr) \ + irpc_call_send(msg_ctx, server_id, &dcerpc_table_ ## pipename, DCERPC_ ## funcname, ptr) + /* a pending irpc call diff --git a/source4/lib/messaging/messaging.c b/source4/lib/messaging/messaging.c index b605fa0494..be89c97e5b 100644 --- a/source4/lib/messaging/messaging.c +++ b/source4/lib/messaging/messaging.c @@ -315,7 +315,7 @@ NTSTATUS messaging_send(struct messaging_context *msg, uint32_t server, if (msg->pending == NULL) { EVENT_FD_WRITEABLE(msg->event.fde); } - DLIST_ADD(msg->pending, rec); + DLIST_ADD_END(msg->pending, rec, struct messaging_rec *); return NT_STATUS_OK; } @@ -426,20 +426,27 @@ struct irpc_list { */ NTSTATUS irpc_register(struct messaging_context *msg_ctx, const struct dcerpc_interface_table *table, - int call, irpc_function_t fn) + int callnum, irpc_function_t fn) { struct irpc_list *irpc; - irpc = talloc(msg_ctx, struct irpc_list); - NT_STATUS_HAVE_NO_MEMORY(irpc); + /* override an existing handler, if any */ + for (irpc=msg_ctx->irpc; irpc; irpc=irpc->next) { + if (irpc->table == table && irpc->callnum == callnum) { + break; + } + } + if (irpc == NULL) { + irpc = talloc(msg_ctx, struct irpc_list); + NT_STATUS_HAVE_NO_MEMORY(irpc); + DLIST_ADD(msg_ctx->irpc, irpc); + } irpc->table = table; - irpc->callnum = call; + irpc->callnum = callnum; irpc->fn = fn; GUID_from_string(irpc->table->uuid, &irpc->uuid); - DLIST_ADD(msg_ctx->irpc, irpc); - return NT_STATUS_OK; } |