cli_addr,
srv_addr,
sd,
- NULL);
+ NULL, /* disconnect function */
+ lsasd_client_terminated,
+ data);
} else if (tsocket_address_is_unix(srv_addr)) {
const char *p;
const char *b;
cli_addr,
srv_addr,
sd,
- NULL);
+ NULL, /* disconnect function */
+ lsasd_client_terminated,
+ data);
}
} else {
DEBUG(0, ("ERROR: Unsupported socket!\n"));
cli_addr,
srv_addr,
sd,
- NULL);
+ NULL, /* disconnect function */
+ mdssd_client_terminated,
+ data);
} else if (tsocket_address_is_unix(srv_addr)) {
const char *p;
const char *b;
cli_addr,
srv_addr,
sd,
- NULL);
+ NULL, /* disconnect function */
+ mdssd_client_terminated,
+ data);
}
} else {
DEBUG(0, ("ERROR: Unsupported socket!\n"));
struct tevent_context *ev_ctx;
struct messaging_context *msg_ctx;
dcerpc_ncacn_disconnect_fn disconnect_fn;
+ dcerpc_ncacn_termination_fn termination_fn;
+ void *termination_data;
};
static void dcesrv_ncacn_np_listener(struct tevent_context *ev,
cli_addr,
srv_addr,
s,
- NULL);
+ state->disconnect_fn,
+ state->termination_fn,
+ state->termination_data);
}
/********************************************************************
NCALRPC,
state->ep.name,
cli_addr, srv_addr, sd,
- state->disconnect_fn);
+ state->disconnect_fn,
+ state->termination_fn,
+ state->termination_data);
}
static int dcerpc_ncacn_conn_destructor(struct dcerpc_ncacn_conn *ncacn_conn)
DBG_WARNING("Failed to call disconnect function\n");
}
}
+
+ if (ncacn_conn->termination_fn != NULL) {
+ ncacn_conn->termination_fn(ncacn_conn->termination_data);
+ }
+
return 0;
}
struct tsocket_address *cli_addr,
struct tsocket_address *srv_addr,
int s,
- dcerpc_ncacn_disconnect_fn fn) {
+ dcerpc_ncacn_disconnect_fn disconnect_fn,
+ dcerpc_ncacn_termination_fn termination_fn,
+ void *termination_data)
+{
struct dcerpc_ncacn_conn *ncacn_conn;
struct tevent_req *subreq;
char *pipe_name;
ncacn_conn->ev_ctx = ev_ctx;
ncacn_conn->msg_ctx = msg_ctx;
ncacn_conn->sock = s;
- ncacn_conn->disconnect_fn = fn;
+ ncacn_conn->disconnect_fn = disconnect_fn;
+ ncacn_conn->termination_fn = termination_fn;
+ ncacn_conn->termination_data = termination_data;
ncacn_conn->remote_client_addr = talloc_move(ncacn_conn, &cli_addr);
if (tsocket_address_is_inet(ncacn_conn->remote_client_addr, "ip")) {
typedef bool (*dcerpc_ncacn_disconnect_fn)(struct pipes_struct *p);
typedef void (*named_pipe_termination_fn)(void *private_data);
+typedef void (*dcerpc_ncacn_termination_fn)(void *private_data);
struct dcerpc_ncacn_conn {
enum dcerpc_transport_t transport;
struct pipes_struct *p;
dcerpc_ncacn_disconnect_fn disconnect_fn;
+ dcerpc_ncacn_termination_fn termination_fn;
+ void *termination_data;
struct tevent_context *ev_ctx;
struct messaging_context *msg_ctx;
struct tsocket_address *cli_addr,
struct tsocket_address *srv_addr,
int s,
- dcerpc_ncacn_disconnect_fn fn);
+ dcerpc_ncacn_disconnect_fn disconnect_fn,
+ dcerpc_ncacn_termination_fn termination_fn,
+ void *termination_data);
#endif /* _PRC_SERVER_H_ */