NTSTATUS wreplsrv_out_push_run(struct wreplsrv_service *service) { struct wreplsrv_partner *partner; uint64_t seqnumber; uint32_t change_count; seqnumber = winsdb_get_maxVersion(service->wins_db); for (partner = service->partners; partner; partner = partner->next) { /* if it's not a push partner, go to the next partner */ if (!(partner->type & WINSREPL_PARTNER_PUSH)) continue; /* if push notifies are disabled for this partner, go to the next partner */ if (partner->push.change_count == 0) continue; /* get the actual change count for the partner */ change_count = wreplsrv_calc_change_count(partner, seqnumber); /* if the configured change count isn't reached, go to the next partner */ if (change_count < partner->push.change_count) continue; wreplsrv_out_partner_push(partner, False); } return NT_STATUS_OK; }
NTSTATUS wreplsrv_fill_wrepl_table(struct wreplsrv_service *service, TALLOC_CTX *mem_ctx, struct wrepl_table *table_out, const char *initiator, bool full_table) { struct wreplsrv_owner *cur; uint32_t i = 0; table_out->partner_count = 0; table_out->partners = NULL; table_out->initiator = initiator; for (cur = service->table; cur; cur = cur->next) { if (full_table) { table_out->partner_count++; continue; } if (strcmp(initiator, cur->owner.address) != 0) continue; table_out->partner_count++; break; } table_out->partners = talloc_array(mem_ctx, struct wrepl_wins_owner, table_out->partner_count); NT_STATUS_HAVE_NO_MEMORY(table_out->partners); for (cur = service->table; cur && i < table_out->partner_count; cur = cur->next) { /* * if it's our local entry * update the max version */ if (cur == service->owner) { cur->owner.max_version = winsdb_get_maxVersion(service->wins_db); } if (full_table) { table_out->partners[i] = cur->owner; i++; continue; } if (strcmp(initiator, cur->owner.address) != 0) continue; table_out->partners[i] = cur->owner; i++; break; } return NT_STATUS_OK; }
struct wreplsrv_owner *wreplsrv_find_owner(struct wreplsrv_service *service, struct wreplsrv_owner *table, const char *wins_owner) { struct wreplsrv_owner *cur; for (cur = table; cur; cur = cur->next) { if (strcmp(cur->owner.address, wins_owner) == 0) { /* * if it's our local entry * update the max version */ if (cur == service->owner) { cur->owner.max_version = winsdb_get_maxVersion(service->wins_db); } return cur; } } return NULL; }