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
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;
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));
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,
named_pipe_accept_function(state->ev_ctx,
state->msg_ctx,
state->ep.name,
- sd);
+ sd, NULL, 0);
}
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);
-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,
+ named_pipe_termination_fn *term_fn,
+ void *private_data)
{
struct named_pipe_client *npc;
struct tstream_context *plain;
}
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);
return;
}
-static void dcerpc_ncacn_accept(struct tevent_context *ev_ctx,
- struct messaging_context *msg_ctx,
- enum dcerpc_transport_t transport,
- const char *name,
- struct tsocket_address *cli_addr,
- struct tsocket_address *srv_addr,
- int s,
- dcerpc_ncacn_disconnect_fn fn);
-
/********************************************************************
* Start listening on the tcp/ip socket
********************************************************************/
static void dcerpc_ncacn_packet_process(struct tevent_req *subreq);
static void dcerpc_ncacn_packet_done(struct tevent_req *subreq);
-static void dcerpc_ncacn_accept(struct tevent_context *ev_ctx,
- struct messaging_context *msg_ctx,
- enum dcerpc_transport_t transport,
- const char *name,
- struct tsocket_address *cli_addr,
- struct tsocket_address *srv_addr,
- int s,
- dcerpc_ncacn_disconnect_fn fn) {
+void dcerpc_ncacn_accept(struct tevent_context *ev_ctx,
+ struct messaging_context *msg_ctx,
+ enum dcerpc_transport_t transport,
+ const char *name,
+ struct tsocket_address *cli_addr,
+ struct tsocket_address *srv_addr,
+ int s,
+ dcerpc_ncacn_disconnect_fn fn) {
struct dcerpc_ncacn_conn *ncacn_conn;
struct tevent_req *subreq;
bool system_user = false;