s3-rpc: Expose some internal functions
authorSimo Sorce <idra@samba.org>
Thu, 21 Apr 2011 19:05:12 +0000 (15:05 -0400)
committerAndreas Schneider <asn@samba.org>
Wed, 10 Aug 2011 16:14:03 +0000 (18:14 +0200)
This will allow to hook the prefork socket handlers to the rpc service.

Signed-off-by: Andreas Schneider <asn@samba.org>
source3/rpc_server/rpc_server.c
source3/rpc_server/rpc_server.h

index 9134b958abb0f209e53be91a63ee95e621468b9a..e5e856b61ffef5f59fedc1f7d51eba0cc6cf6eb9 100644 (file)
@@ -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;
index be6a1543331f416a7ce25f8918666955de8dbaaa..b81c7e2c39bf968e834d1d0b7b933d19912d32e7 100644 (file)
@@ -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,