ok = setup_dcerpc_ncalrpc_socket(ep_ctx->ev_ctx,
ep_ctx->msg_ctx,
abstract_syntax,
- pipe_name);
+ pipe_name,
+ NULL);
if (!ok) {
return false;
}
ok = setup_dcerpc_ncalrpc_socket(ep_ctx->ev_ctx,
ep_ctx->msg_ctx,
abstract_syntax,
- pipe_name);
+ pipe_name,
+ NULL);
if (!ok) {
return false;
}
ok = setup_dcerpc_ncalrpc_socket(ep_ctx->ev_ctx,
ep_ctx->msg_ctx,
abstract_syntax,
- pipe_name);
+ pipe_name,
+ NULL);
if (!ok) {
return false;
}
ok = setup_dcerpc_ncalrpc_socket(ep_ctx->ev_ctx,
ep_ctx->msg_ctx,
abstract_syntax,
- pipe_name);
+ pipe_name,
+ NULL);
if (!ok) {
return false;
}
ok = setup_dcerpc_ncalrpc_socket(ep_ctx->ev_ctx,
ep_ctx->msg_ctx,
abstract_syntax,
- pipe_name);
+ pipe_name,
+ NULL);
if (!ok) {
return false;
}
ok = setup_dcerpc_ncalrpc_socket(ep_ctx->ev_ctx,
ep_ctx->msg_ctx,
abstract_syntax,
- pipe_name);
+ pipe_name,
+ NULL);
if (!ok) {
return false;
}
ok = setup_dcerpc_ncalrpc_socket(ep_ctx->ev_ctx,
ep_ctx->msg_ctx,
abstract_syntax,
- pipe_name);
+ pipe_name,
+ NULL);
if (!ok) {
return false;
}
ok = setup_dcerpc_ncalrpc_socket(ep_ctx->ev_ctx,
ep_ctx->msg_ctx,
abstract_syntax,
- pipe_name);
+ pipe_name,
+ NULL);
if (!ok) {
return false;
}
struct tevent_context *ev_ctx;
struct messaging_context *msg_ctx;
+ dcerpc_ncacn_disconnect_fn disconnect_fn;
};
static void named_pipe_listener(struct tevent_context *ev,
uint16_t port,
struct tsocket_address *cli_addr,
struct tsocket_address *srv_addr,
- int s);
+ int s,
+ dcerpc_ncacn_disconnect_fn fn);
/********************************************************************
* Start listening on the tcp/ip socket
state->syntax_id = syntax_id;
state->fd = -1;
state->ep.port = port;
+ state->disconnect_fn = NULL;
if (state->ep.port == 0) {
uint16_t i;
state->ep.port,
cli_addr,
srv_addr,
- s);
+ s,
+ NULL);
}
/********************************************************************
bool setup_dcerpc_ncalrpc_socket(struct tevent_context *ev_ctx,
struct messaging_context *msg_ctx,
struct ndr_syntax_id syntax_id,
- const char *name)
+ const char *name,
+ dcerpc_ncacn_disconnect_fn fn)
{
struct dcerpc_ncacn_listen_state *state;
struct tevent_fd *fde;
state->syntax_id = syntax_id;
state->fd = -1;
+ state->disconnect_fn = fn;
if (name == NULL) {
name = "DEFAULT";
state->msg_ctx,
state->syntax_id, NCALRPC,
state->ep.name, 0,
- cli_addr, NULL, sd);
+ cli_addr, NULL, sd,
+ state->disconnect_fn);
}
struct dcerpc_ncacn_conn {
int sock;
struct pipes_struct *p;
+ dcerpc_ncacn_disconnect_fn disconnect_fn;
struct tevent_context *ev_ctx;
struct messaging_context *msg_ctx;
uint16_t port,
struct tsocket_address *cli_addr,
struct tsocket_address *srv_addr,
- int s) {
+ int s,
+ dcerpc_ncacn_disconnect_fn fn) {
struct dcerpc_ncacn_conn *ncacn_conn;
struct tevent_req *subreq;
const char *cli_str;
ncacn_conn->ev_ctx = ev_ctx;
ncacn_conn->msg_ctx = msg_ctx;
ncacn_conn->sock = s;
+ ncacn_conn->disconnect_fn = fn;
ncacn_conn->client = talloc_move(ncacn_conn, &cli_addr);
if (tsocket_address_is_inet(ncacn_conn->client, "ip")) {
status = dcerpc_read_ncacn_packet_recv(subreq, ncacn_conn, &pkt, &recv_buffer);
TALLOC_FREE(subreq);
if (!NT_STATUS_IS_OK(status)) {
+ if (ncacn_conn->disconnect_fn != NULL) {
+ ok = ncacn_conn->disconnect_fn(ncacn_conn->p);
+ if (!ok) {
+ DEBUG(3, ("Failed to call disconnect function\n"));
+ }
+ }
goto fail;
}
#ifndef _RPC_SERVER_H_
#define _RPC_SERVER_H_
+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);
bool setup_named_pipe_socket(const char *pipe_name,
bool setup_dcerpc_ncalrpc_socket(struct tevent_context *ev_ctx,
struct messaging_context *msg_ctx,
struct ndr_syntax_id syntax_id,
- const char *name);
+ const char *name,
+ dcerpc_ncacn_disconnect_fn fn);
#endif /* _PRC_SERVER_H_ */