Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}