return ret;
}
-static void spoolss_client_terminated(void *pvt)
+static void spoolss_client_terminated(struct pipes_struct *p, void *pvt)
{
struct spoolss_children_data *data;
cli_addr,
srv_addr,
sd,
- NULL, /* disconnect function */
spoolss_client_terminated,
data);
}
return true;
}
-bool srv_epmapper_delete_endpoints(struct pipes_struct *p)
+void srv_epmapper_delete_endpoints(struct pipes_struct *p, void *private_data)
{
struct epm_Delete r;
struct dcesrv_ep_entry_list *el = p->ep_entries;
result = _epm_Delete(p, &r);
if (result != EPMAPPER_STATUS_OK) {
- return false;
+ DBG_ERR("Failed to delete endpoint maps\n");
+ return;
}
DLIST_REMOVE(p->ep_entries, el);
el = next;
}
-
- return true;
}
void srv_epmapper_cleanup(void)
*/
void srv_epmapper_cleanup(void);
-bool srv_epmapper_delete_endpoints(struct pipes_struct *p);
+/**
+ * @brief Cleanup function used to delete endpoints when a ncalrpc connection
+ * from an external daemon is lost
+ */
+void srv_epmapper_delete_endpoints(struct pipes_struct *p, void *private_data);
#endif /*_SRV_EPMAPPER_H_ */
status = dcesrv_setup_ncalrpc_socket(ev_ctx,
msg_ctx,
"EPMAPPER",
- srv_epmapper_delete_endpoints);
+ srv_epmapper_delete_endpoints,
+ NULL);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("Failed to open epmd ncalrpc pipe!\n"));
exit(1);
return ret;
}
-static void lsasd_client_terminated(void *pvt)
+static void lsasd_client_terminated(struct pipes_struct *p, void *pvt)
{
struct lsasd_children_data *data;
cli_addr,
srv_addr,
sd,
- NULL, /* disconnect function */
lsasd_client_terminated,
data);
} else if (tsocket_address_is_unix(srv_addr)) {
NULL, /* remote client address */
NULL, /* local server address */
sd,
- NULL, /* disconnect function */
lsasd_client_terminated,
data);
cli_addr,
srv_addr,
sd,
- NULL, /* disconnect function */
lsasd_client_terminated,
data);
}
return ret;
}
-static void mdssd_client_terminated(void *pvt)
+static void mdssd_client_terminated(struct pipes_struct *p, void *pvt)
{
struct mdssd_children_data *data;
cli_addr,
srv_addr,
sd,
- NULL, /* disconnect function */
mdssd_client_terminated,
data);
} else if (tsocket_address_is_unix(srv_addr)) {
NULL, /* remote client address */
NULL, /* local server address */
sd,
- NULL, /* disconnect function */
mdssd_client_terminated,
data);
} else {
cli_addr,
srv_addr,
sd,
- NULL, /* disconnect function */
mdssd_client_terminated,
data);
}
msg_ctx,
NCACN_NP,
pipe_name,
- NULL, /* disconnect fn */
NULL, /* termination fn */
NULL, /* termination data */
&ncacn_conn);
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;
};
NULL, /* remote client address */
NULL, /* local server address */
sd,
- state->disconnect_fn,
state->termination_fn,
state->termination_data);
}
state->fd = -1;
state->ep.port = *port;
- state->disconnect_fn = NULL;
status = dcesrv_create_ncacn_ip_tcp_socket(ifss, &state->ep.port,
&state->fd);
cli_addr,
srv_addr,
s,
- state->disconnect_fn,
state->termination_fn,
state->termination_data);
}
NTSTATUS dcesrv_setup_ncalrpc_socket(struct tevent_context *ev_ctx,
struct messaging_context *msg_ctx,
const char *name,
- dcerpc_ncacn_disconnect_fn fn)
+ dcerpc_ncacn_termination_fn term_fn,
+ void *termination_data)
{
struct dcerpc_ncacn_listen_state *state;
struct tevent_fd *fde;
}
state->fd = -1;
- state->disconnect_fn = fn;
+ state->termination_fn = term_fn;
+ state->termination_data = termination_data;
if (name == NULL) {
name = "DEFAULT";
NCALRPC,
state->ep.name,
cli_addr, srv_addr, sd,
- state->disconnect_fn,
state->termination_fn,
state->termination_data);
}
static int dcerpc_ncacn_conn_destructor(struct dcerpc_ncacn_conn *ncacn_conn)
{
- if (ncacn_conn->disconnect_fn != NULL) {
- bool ok = ncacn_conn->disconnect_fn(ncacn_conn->p);
- if (!ok) {
- DBG_WARNING("Failed to call disconnect function\n");
- }
- }
-
if (ncacn_conn->termination_fn != NULL) {
- ncacn_conn->termination_fn(ncacn_conn->termination_data);
+ ncacn_conn->termination_fn(ncacn_conn->p,
+ ncacn_conn->termination_data);
}
return 0;
struct messaging_context *msg_ctx,
enum dcerpc_transport_t transport,
const char *name,
- dcerpc_ncacn_disconnect_fn disconnect_fn,
dcerpc_ncacn_termination_fn term_fn,
void *termination_data,
struct dcerpc_ncacn_conn **out)
ncacn_conn->ev_ctx = ev_ctx;
ncacn_conn->msg_ctx = msg_ctx;
ncacn_conn->sock = -1;
- ncacn_conn->disconnect_fn = disconnect_fn;
ncacn_conn->termination_fn = term_fn;
ncacn_conn->termination_data = termination_data;
if (name != NULL) {
struct tsocket_address *cli_addr,
struct tsocket_address *srv_addr,
int s,
- dcerpc_ncacn_disconnect_fn disconnect_fn,
dcerpc_ncacn_termination_fn termination_fn,
void *termination_data)
{
msg_ctx,
transport,
name,
- disconnect_fn,
termination_fn,
termination_data,
&ncacn_conn);
struct pipes_struct;
struct auth_session_info;
-typedef bool (*dcerpc_ncacn_disconnect_fn)(struct pipes_struct *p);
-typedef void (*dcerpc_ncacn_termination_fn)(void *private_data);
+typedef void (*dcerpc_ncacn_termination_fn)(struct pipes_struct *, void *);
struct dcerpc_ncacn_conn {
enum dcerpc_transport_t transport;
int sock;
struct pipes_struct *p;
- dcerpc_ncacn_disconnect_fn disconnect_fn;
dcerpc_ncacn_termination_fn termination_fn;
void *termination_data;
struct messaging_context *msg_ctx,
enum dcerpc_transport_t transport,
const char *name,
- dcerpc_ncacn_disconnect_fn disconnect_fn,
dcerpc_ncacn_termination_fn term_fn,
void *termination_data,
struct dcerpc_ncacn_conn **out);
NTSTATUS dcesrv_setup_ncalrpc_socket(struct tevent_context *ev_ctx,
struct messaging_context *msg_ctx,
const char *name,
- dcerpc_ncacn_disconnect_fn fn);
+ dcerpc_ncacn_termination_fn term_fn,
+ void *termination_data);
void dcerpc_ncacn_accept(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 disconnect_fn,
dcerpc_ncacn_termination_fn termination_fn,
void *termination_data);
void dcerpc_ncacn_packet_process(struct tevent_req *subreq);