that the ctdb daemon is to kill
*/
struct ctdb_kill_tcp {
- struct ctdb_vnn *vnn;
- struct ctdb_context *ctdb;
int capture_fd;
struct tevent_fd *fde;
trbt_tree_t *connections;
void *private_data;
+ void *destructor_data;
};
/*
/*
destroy the killtcp structure
*/
+struct ctdb_killtcp_destructor_data {
+ struct ctdb_vnn *vnn;
+ struct ctdb_context *ctdb;
+};
+
static int ctdb_killtcp_destructor(struct ctdb_kill_tcp *killtcp)
{
+ struct ctdb_killtcp_destructor_data *dd =
+ talloc_get_type_abort(killtcp->destructor_data,
+ struct ctdb_killtcp_destructor_data);
struct ctdb_vnn *tmpvnn;
/* verify that this vnn is still active */
- for (tmpvnn = killtcp->ctdb->vnn; tmpvnn; tmpvnn = tmpvnn->next) {
- if (tmpvnn == killtcp->vnn) {
+ for (tmpvnn = dd->ctdb->vnn; tmpvnn; tmpvnn = tmpvnn->next) {
+ if (tmpvnn == dd->vnn) {
break;
}
}
return 0;
}
- if (killtcp->vnn->killtcp != killtcp) {
+ if (dd->vnn->killtcp != killtcp) {
return 0;
}
- killtcp->vnn->killtcp = NULL;
+ dd->vnn->killtcp = NULL;
return 0;
}
struct ctdb_killtcp_con *con;
struct ctdb_vnn *vnn;
const char *iface;
+ struct ctdb_killtcp_destructor_data *dd;
ctdb_canonicalize_ip(s, &src);
ctdb_canonicalize_ip(d, &dst);
return -1;
}
- killtcp->vnn = vnn;
- killtcp->ctdb = ctdb;
killtcp->capture_fd = -1;
killtcp->connections = trbt_create(killtcp, 0);
vnn->killtcp = killtcp;
- talloc_set_destructor(killtcp, ctdb_killtcp_destructor);
}
&con->src_addr,
0, 0, 0);
+ dd = talloc(killtcp, struct ctdb_killtcp_destructor_data);
+ if (dd == NULL) {
+ DEBUG(DEBUG_ERR, (__location__ " out of memory\n"));
+ goto failed;
+ }
+
+ dd->vnn = vnn;
+ dd->ctdb = ctdb;
+ killtcp->destructor_data = dd;
+ talloc_set_destructor(killtcp, ctdb_killtcp_destructor);
+
return 0;
failed: