summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimo Sorce <idra@samba.org>2011-04-21 15:05:12 -0400
committerAndreas Schneider <asn@samba.org>2011-08-10 18:14:03 +0200
commitd67fc9c1ebd22dc275a790fc1e5e7a453b48ac7e (patch)
treeea3c1b849ac2c507a79d0dce2444799082184fcb
parent2056d06cae4937c12433d1247b02c346625f86a4 (diff)
downloadsamba-d67fc9c1ebd22dc275a790fc1e5e7a453b48ac7e.tar.gz
samba-d67fc9c1ebd22dc275a790fc1e5e7a453b48ac7e.tar.bz2
samba-d67fc9c1ebd22dc275a790fc1e5e7a453b48ac7e.zip
s3-rpc: Expose some internal functions
This will allow to hook the prefork socket handlers to the rpc service. Signed-off-by: Andreas Schneider <asn@samba.org>
-rw-r--r--source3/rpc_server/rpc_server.c73
-rw-r--r--source3/rpc_server/rpc_server.h4
2 files changed, 44 insertions, 33 deletions
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,