summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimo Sorce <idra@samba.org>2011-04-25 17:24:15 -0400
committerAndreas Schneider <asn@samba.org>2011-08-10 18:14:03 +0200
commita1394fc934e91e5db31853a89e3ae9b67e5c76f6 (patch)
tree68e3fa3d44f01da1509b205358ab2024348b530e
parentd67fc9c1ebd22dc275a790fc1e5e7a453b48ac7e (diff)
downloadsamba-a1394fc934e91e5db31853a89e3ae9b67e5c76f6.tar.gz
samba-a1394fc934e91e5db31853a89e3ae9b67e5c76f6.tar.bz2
samba-a1394fc934e91e5db31853a89e3ae9b67e5c76f6.zip
s3-rpc_server: add termination function
This way we can act when a client disconnects. Signed-off-by: Andreas Schneider <asn@samba.org>
-rw-r--r--source3/rpc_server/rpc_server.c21
-rw-r--r--source3/rpc_server/rpc_server.h5
2 files changed, 23 insertions, 3 deletions
diff --git a/source3/rpc_server/rpc_server.c b/source3/rpc_server/rpc_server.c
index e5e856b61f..fe78a1c629 100644
--- a/source3/rpc_server/rpc_server.c
+++ b/source3/rpc_server/rpc_server.c
@@ -281,7 +281,7 @@ static void named_pipe_listener(struct tevent_context *ev,
named_pipe_accept_function(state->ev_ctx,
state->msg_ctx,
state->ep.name,
- sd);
+ sd, NULL, 0);
}
@@ -314,13 +314,26 @@ struct named_pipe_client {
struct iovec *iov;
size_t count;
+
+ named_pipe_termination_fn *term_fn;
+ void *private_data;
};
+static int named_pipe_destructor(struct named_pipe_client *npc)
+{
+ if (npc->term_fn) {
+ npc->term_fn(npc->private_data);
+ }
+ return 0;
+}
+
static void named_pipe_accept_done(struct tevent_req *subreq);
void named_pipe_accept_function(struct tevent_context *ev_ctx,
struct messaging_context *msg_ctx,
- const char *pipe_name, int fd)
+ const char *pipe_name, int fd,
+ named_pipe_termination_fn *term_fn,
+ void *private_data)
{
struct named_pipe_client *npc;
struct tstream_context *plain;
@@ -343,6 +356,10 @@ void named_pipe_accept_function(struct tevent_context *ev_ctx,
}
npc->ev = ev_ctx;
npc->msg_ctx = msg_ctx;
+ npc->term_fn = term_fn;
+ npc->private_data = private_data;
+
+ talloc_set_destructor(npc, named_pipe_destructor);
/* make sure socket is in NON blocking state */
ret = set_blocking(fd, false);
diff --git a/source3/rpc_server/rpc_server.h b/source3/rpc_server/rpc_server.h
index b81c7e2c39..c6ac2e29b3 100644
--- a/source3/rpc_server/rpc_server.h
+++ b/source3/rpc_server/rpc_server.h
@@ -23,6 +23,7 @@
struct pipes_struct;
typedef bool (*dcerpc_ncacn_disconnect_fn)(struct pipes_struct *p);
+typedef void (named_pipe_termination_fn)(void *private_data);
void set_incoming_fault(struct pipes_struct *p);
void process_complete_pdu(struct pipes_struct *p);
@@ -32,7 +33,9 @@ bool setup_named_pipe_socket(const char *pipe_name,
struct messaging_context *msg_ctx);
void named_pipe_accept_function(struct tevent_context *ev_ctx,
struct messaging_context *msg_ctx,
- const char *pipe_name, int fd);
+ const char *pipe_name, int fd,
+ named_pipe_termination_fn *term_fn,
+ void *private_data);
uint16_t setup_dcerpc_ncacn_tcpip_socket(struct tevent_context *ev_ctx,
struct messaging_context *msg_ctx,