From d67fc9c1ebd22dc275a790fc1e5e7a453b48ac7e Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Thu, 21 Apr 2011 15:05:12 -0400 Subject: s3-rpc: Expose some internal functions This will allow to hook the prefork socket handlers to the rpc service. Signed-off-by: Andreas Schneider --- source3/rpc_server/rpc_server.c | 73 ++++++++++++++++++++++------------------- source3/rpc_server/rpc_server.h | 4 +++ 2 files changed, 44 insertions(+), 33 deletions(-) (limited to 'source3/rpc_server') diff --git a/source3/rpc_server/rpc_server.c b/source3/rpc_server/rpc_server.c index 9134b958ab..e5e856b61f 100644 --- a/source3/rpc_server/rpc_server.c +++ b/source3/rpc_server/rpc_server.c @@ -160,28 +160,10 @@ static void named_pipe_listener(struct tevent_context *ev, uint16_t flags, void *private_data); -bool setup_named_pipe_socket(const char *pipe_name, - struct tevent_context *ev_ctx, - struct messaging_context *msg_ctx) +int create_named_pipe_socket(const char *pipe_name) { - struct dcerpc_ncacn_listen_state *state; - struct tevent_fd *fde; - char *np_dir; - - state = talloc(ev_ctx, struct dcerpc_ncacn_listen_state); - if (!state) { - DEBUG(0, ("Out of memory\n")); - return false; - } - state->ep.name = talloc_strdup(state, pipe_name); - if (state->ep.name == NULL) { - DEBUG(0, ("Out of memory\n")); - goto out; - } - state->fd = -1; - - state->ev_ctx = ev_ctx; - state->msg_ctx = msg_ctx; + char *np_dir = NULL; + int fd = -1; /* * As lp_ncalrpc_dir() should have 0755, but @@ -194,7 +176,7 @@ bool setup_named_pipe_socket(const char *pipe_name, goto out; } - np_dir = talloc_asprintf(state, "%s/np", lp_ncalrpc_dir()); + np_dir = talloc_asprintf(talloc_tos(), "%s/np", lp_ncalrpc_dir()); if (!np_dir) { DEBUG(0, ("Out of memory\n")); goto out; @@ -206,13 +188,44 @@ bool setup_named_pipe_socket(const char *pipe_name, goto out; } - state->fd = create_pipe_sock(np_dir, pipe_name, 0700); - if (state->fd == -1) { + fd = create_pipe_sock(np_dir, pipe_name, 0700); + if (fd == -1) { DEBUG(0, ("Failed to create pipe socket! [%s/%s]\n", np_dir, pipe_name)); goto out; } + + DEBUG(10, ("Openened pipe socket fd %d for %s\n", fd, pipe_name)); + +out: talloc_free(np_dir); + return fd; +} + +bool setup_named_pipe_socket(const char *pipe_name, + struct tevent_context *ev_ctx, + struct messaging_context *msg_ctx) +{ + struct dcerpc_ncacn_listen_state *state; + struct tevent_fd *fde; + + state = talloc(ev_ctx, struct dcerpc_ncacn_listen_state); + if (!state) { + DEBUG(0, ("Out of memory\n")); + return false; + } + state->ep.name = talloc_strdup(state, pipe_name); + if (state->ep.name == NULL) { + DEBUG(0, ("Out of memory\n")); + goto out; + } + state->fd = create_named_pipe_socket(pipe_name); + if (state->fd == -1) { + goto out; + } + + state->ev_ctx = ev_ctx; + state->msg_ctx = msg_ctx; DEBUG(10, ("Openened pipe socket fd %d for %s\n", state->fd, pipe_name)); @@ -236,11 +249,6 @@ out: return false; } -static void named_pipe_accept_function(struct tevent_context *ev_ctx, - struct messaging_context *msg_ctx, - const char *pipe_name, - int fd); - static void named_pipe_listener(struct tevent_context *ev, struct tevent_fd *fde, uint16_t flags, @@ -310,10 +318,9 @@ struct named_pipe_client { static void named_pipe_accept_done(struct tevent_req *subreq); -static void named_pipe_accept_function(struct tevent_context *ev_ctx, - struct messaging_context *msg_ctx, - const char *pipe_name, - int fd) +void named_pipe_accept_function(struct tevent_context *ev_ctx, + struct messaging_context *msg_ctx, + const char *pipe_name, int fd) { struct named_pipe_client *npc; struct tstream_context *plain; diff --git a/source3/rpc_server/rpc_server.h b/source3/rpc_server/rpc_server.h index be6a154333..b81c7e2c39 100644 --- a/source3/rpc_server/rpc_server.h +++ b/source3/rpc_server/rpc_server.h @@ -26,9 +26,13 @@ typedef bool (*dcerpc_ncacn_disconnect_fn)(struct pipes_struct *p); void set_incoming_fault(struct pipes_struct *p); void process_complete_pdu(struct pipes_struct *p); +int create_named_pipe_socket(const char *pipe_name); bool setup_named_pipe_socket(const char *pipe_name, struct tevent_context *ev_ctx, 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); uint16_t setup_dcerpc_ncacn_tcpip_socket(struct tevent_context *ev_ctx, struct messaging_context *msg_ctx, -- cgit