static struct composite_context *wreplsrv_pull_names_send(TALLOC_CTX *mem_ctx, struct wreplsrv_pull_names_io *io) { struct composite_context *c = NULL; struct wreplsrv_service *service = io->in.partner->service; struct wreplsrv_pull_names_state *state = NULL; enum winsrepl_partner_type partner_type = WINSREPL_PARTNER_PULL; if (io->in.wreplconn) partner_type = WINSREPL_PARTNER_NONE; c = talloc_zero(mem_ctx, struct composite_context); if (!c) goto failed; state = talloc_zero(c, struct wreplsrv_pull_names_state); if (!state) goto failed; state->c = c; state->io = io; c->state = COMPOSITE_STATE_IN_PROGRESS; c->event_ctx = service->task->event_ctx; c->private_data = state; state->stage = WREPLSRV_PULL_NAMES_STAGE_WAIT_CONNECTION; state->creq = wreplsrv_out_connect_send(io->in.partner, partner_type, io->in.wreplconn); if (!state->creq) goto failed; state->creq->async.fn = wreplsrv_pull_names_handler_creq; state->creq->async.private_data = state; return c; failed: talloc_free(c); return NULL; }
static struct composite_context *wreplsrv_pull_table_send(TALLOC_CTX *mem_ctx, struct wreplsrv_pull_table_io *io) { struct composite_context *c = NULL; struct wreplsrv_service *service = io->in.partner->service; struct wreplsrv_pull_table_state *state = NULL; c = talloc_zero(mem_ctx, struct composite_context); if (!c) goto failed; state = talloc_zero(c, struct wreplsrv_pull_table_state); if (!state) goto failed; state->c = c; state->io = io; c->state = COMPOSITE_STATE_IN_PROGRESS; c->event_ctx = service->task->event_ctx; c->private_data = state; if (io->in.num_owners) { struct wrepl_wins_owner *partners; uint32_t i; partners = talloc_array(state, struct wrepl_wins_owner, io->in.num_owners); if (composite_nomem(partners, c)) goto failed; for (i=0; i < io->in.num_owners; i++) { partners[i] = io->in.owners[i]; partners[i].address = talloc_strdup(partners, io->in.owners[i].address); if (composite_nomem(partners[i].address, c)) goto failed; } state->table_io.out.num_partners = io->in.num_owners; state->table_io.out.partners = partners; state->stage = WREPLSRV_PULL_TABLE_STAGE_DONE; composite_done(c); return c; } state->stage = WREPLSRV_PULL_TABLE_STAGE_WAIT_CONNECTION; state->creq = wreplsrv_out_connect_send(io->in.partner, WINSREPL_PARTNER_PULL, NULL); if (!state->creq) goto failed; state->creq->async.fn = wreplsrv_pull_table_handler_creq; state->creq->async.private_data = state; return c; failed: talloc_free(c); return NULL; }
struct composite_context *wreplsrv_push_notify_send(TALLOC_CTX *mem_ctx, struct wreplsrv_push_notify_io *io) { struct composite_context *c = NULL; struct wreplsrv_service *service = io->in.partner->service; struct wreplsrv_push_notify_state *state = NULL; enum winsrepl_partner_type partner_type; c = talloc_zero(mem_ctx, struct composite_context); if (!c) goto failed; state = talloc_zero(c, struct wreplsrv_push_notify_state); if (!state) goto failed; state->c = c; state->io = io; if (io->in.inform) { /* we can cache the connection in partner->push->wreplconn */ partner_type = WINSREPL_PARTNER_PUSH; if (io->in.propagate) { state->command = WREPL_REPL_INFORM2; } else { state->command = WREPL_REPL_INFORM; } } else { /* we can NOT cache the connection */ partner_type = WINSREPL_PARTNER_NONE; if (io->in.propagate) { state->command = WREPL_REPL_UPDATE2; } else { state->command = WREPL_REPL_UPDATE; } } c->state = COMPOSITE_STATE_IN_PROGRESS; c->event_ctx = service->task->event_ctx; c->private_data = state; state->stage = WREPLSRV_PUSH_NOTIFY_STAGE_WAIT_CONNECT; state->creq = wreplsrv_out_connect_send(io->in.partner, partner_type, NULL); if (!state->creq) goto failed; state->creq->async.fn = wreplsrv_push_notify_handler_creq; state->creq->async.private_data = state; return c; failed: talloc_free(c); return NULL; }