Пример #1
0
/*
  add records from an opened file
*/
static int process_file(struct ldb_context *ldb, FILE *f, unsigned int *count)
{
	struct ldb_ldif *ldif;
	int fun_ret = LDB_SUCCESS, ret;
        struct ldb_control **req_ctrls = ldb_parse_control_strings(ldb, ldb, (const char **)options->controls);
	struct ldif_read_file_state state = {
		.f = f
	};

	if (options->controls != NULL &&  req_ctrls== NULL) {
		printf("parsing controls failed: %s\n", ldb_errstring(ldb));
		return LDB_ERR_OPERATIONS_ERROR;
	}

	fun_ret = ldb_transaction_start(ldb);
	if (fun_ret != LDB_SUCCESS) {
		fprintf(stderr, "ERR: (%s) on transaction start\n",
			ldb_errstring(ldb));
		return fun_ret;
	}

	while ((ldif = ldb_ldif_read_file_state(ldb, &state))) {
		if (ldif->changetype != LDB_CHANGETYPE_ADD &&
		    ldif->changetype != LDB_CHANGETYPE_NONE) {
			fprintf(stderr, "Only CHANGETYPE_ADD records allowed\n");
			break;
		}

		ret = ldb_msg_normalize(ldb, ldif, ldif->msg, &ldif->msg);
		if (ret != LDB_SUCCESS) {
			fprintf(stderr,
			        "ERR: Message canonicalize failed - %s\n",
			        ldb_strerror(ret));
			fun_ret = ret;
			ldb_ldif_read_free(ldb, ldif);
			continue;
		}

		ret = ldb_add_ctrl(ldb, ldif->msg,req_ctrls);
		if (ret != LDB_SUCCESS) {
			fprintf(stderr, "ERR: %s : \"%s\" on DN %s at block before line %llu\n",
				ldb_strerror(ret), ldb_errstring(ldb),
				ldb_dn_get_linearized(ldif->msg->dn),
				(unsigned long long)state.line_no);
			fun_ret = ret;
		} else {
			(*count)++;
			if (options->verbose) {
				printf("Added %s\n", ldb_dn_get_linearized(ldif->msg->dn));
			}
		}
		ldb_ldif_read_free(ldb, ldif);
		if (ret) {
			break;
		}
	}

	if (fun_ret == LDB_SUCCESS && !feof(f)) {
		fprintf(stderr, "Failed to parse ldif\n");
		fun_ret = LDB_ERR_OPERATIONS_ERROR;
	}

	if (fun_ret == LDB_SUCCESS) {
		fun_ret = ldb_transaction_commit(ldb);
		if (fun_ret != LDB_SUCCESS) {
			fprintf(stderr, "ERR: (%s) on transaction commit\n",
				ldb_errstring(ldb));
		}
	} else {
		ldb_transaction_cancel(ldb);
	}

	return fun_ret;
}
Пример #2
0
/*
  process modifies for one file
*/
static int process_file(struct ldb_context *ldb, FILE *f, unsigned int *count)
{
	struct ldb_ldif *ldif;
	int fun_ret = LDB_SUCCESS, ret;
	struct ldb_control **req_ctrls = ldb_parse_control_strings(ldb, ldb, (const char **)options->controls);
	struct ldif_read_file_state state = {
		.f = f
	};

	if (options->controls != NULL &&  req_ctrls== NULL) {
		printf("parsing controls failed: %s\n", ldb_errstring(ldb));
		exit(LDB_ERR_OPERATIONS_ERROR);
	}

	fun_ret = ldb_transaction_start(ldb);
	if (fun_ret != LDB_SUCCESS) {
		fprintf(stderr, "ERR: (%s) on transaction start\n",
			ldb_errstring(ldb));
		return fun_ret;
	}

	while ((ldif = ldb_ldif_read_file_state(ldb, &state))) {
		struct ldb_dn *olddn;
		bool deleteoldrdn = false;
		struct ldb_dn *newdn;
		const char *errstr = NULL;

		switch (ldif->changetype) {
		case LDB_CHANGETYPE_NONE:
		case LDB_CHANGETYPE_ADD:
			ret = ldb_add_ctrl(ldb, ldif->msg,req_ctrls);
			break;
		case LDB_CHANGETYPE_DELETE:
			ret = ldb_delete_ctrl(ldb, ldif->msg->dn,req_ctrls);
			break;
		case LDB_CHANGETYPE_MODIFY:
			ret = ldb_modify_ctrl(ldb, ldif->msg,req_ctrls);
			break;
		case LDB_CHANGETYPE_MODRDN:
			ret = ldb_ldif_parse_modrdn(ldb, ldif, ldif, &olddn,
						    NULL, &deleteoldrdn,
						    NULL, &newdn);
			if (ret == LDB_SUCCESS) {
				if (deleteoldrdn) {
					ret = ldb_rename(ldb, olddn, newdn);
				} else {
					errstr = "modrdn: deleteoldrdn=0 "
						 "not supported.";
					ret = LDB_ERR_CONSTRAINT_VIOLATION;
				}
			}
			break;
		}
		if (ret != LDB_SUCCESS) {
			if (errstr == NULL) {
				errstr = ldb_errstring(ldb);
			}
			fprintf(stderr, "ERR: (%s) \"%s\" on DN %s at block before line %llu\n",
				ldb_strerror(ret),
				errstr, ldb_dn_get_linearized(ldif->msg->dn), 
				(unsigned long long)state.line_no);
			fun_ret = ret;
		} else {
			(*count)++;
			if (options->verbose) {
				printf("Modified %s\n", ldb_dn_get_linearized(ldif->msg->dn));
			}
		}
		ldb_ldif_read_free(ldb, ldif);
		if (ret) {
			break;
		}
	}
	
	if (fun_ret == LDB_SUCCESS && !feof(f)) {
		fprintf(stderr, "Failed to parse ldif\n");
		fun_ret = LDB_ERR_OPERATIONS_ERROR;
	}

	if (fun_ret == LDB_SUCCESS) {
		fun_ret = ldb_transaction_commit(ldb);
		if (fun_ret != LDB_SUCCESS) {
			fprintf(stderr, "ERR: (%s) on transaction commit\n",
				ldb_errstring(ldb));
		}
	} else {
		ldb_transaction_cancel(ldb);
	}

	return fun_ret;
}