示例#1
0
 NTSTATUS gp_inifile_init_context(TALLOC_CTX *mem_ctx,
				 uint32_t flags,
				 const char *unix_path,
				 const char *suffix,
				 struct gp_inifile_context **ctx_ret)
{
	struct gp_inifile_context *ctx = NULL;
	NTSTATUS status;
	dictionary *dict = NULL;
	char *tmp_filename = NULL;
	const char *ini_filename = NULL;

	if (!unix_path || !ctx_ret) {
		return NT_STATUS_INVALID_PARAMETER;
	}

	ctx = TALLOC_ZERO_P(mem_ctx, struct gp_inifile_context);
	NT_STATUS_HAVE_NO_MEMORY(ctx);

	talloc_set_destructor(ctx, gp_inifile_free_context);

	status = gp_find_file(mem_ctx, flags, unix_path, suffix,
			      &ini_filename);

	if (!NT_STATUS_IS_OK(status)) {
		goto failed;
	}

	status = convert_file_from_ucs2(mem_ctx, ini_filename,
					&tmp_filename);
	if (!NT_STATUS_IS_OK(status)) {
		goto failed;
	}

	dict = iniparser_load(tmp_filename);
	if (!dict) {
		status = NT_STATUS_NO_SUCH_FILE;
		goto failed;
	}

	ctx->generated_filename = tmp_filename;
	ctx->dict = dict;
	ctx->mem_ctx = mem_ctx;

	*ctx_ret = ctx;

	return NT_STATUS_OK;

 failed:

	DEBUG(1,("gp_inifile_init_context failed: %s\n",
		nt_errstr(status)));

	TALLOC_FREE(ctx);

	return status;
}
示例#2
0
文件: registry.c 项目: Arkhont/samba
static NTSTATUS reg_parse_registry(TALLOC_CTX *mem_ctx,
				   uint32_t flags,
				   const char *filename,
				   struct gp_registry_entry **entries_p,
				   size_t *num_entries_p)
{
	DATA_BLOB blob;
	NTSTATUS status;
	enum ndr_err_code ndr_err;
	const char *real_filename = NULL;
	struct preg_file r;
	struct gp_registry_entry *entries = NULL;
	size_t num_entries = 0;
	int i;

	status = gp_find_file(mem_ctx,
			      flags,
			      filename,
			      GP_REGPOL_FILE,
			      &real_filename);
	if (!NT_STATUS_IS_OK(status)) {
		return status;
	}

	blob.data = (uint8_t *)file_load(real_filename, &blob.length, 0, NULL);
	if (!blob.data) {
		return NT_STATUS_CANNOT_LOAD_REGISTRY_FILE;
	}

	ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, &r,
			(ndr_pull_flags_fn_t)ndr_pull_preg_file);
	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
		status = ndr_map_error2ntstatus(ndr_err);
		goto out;
	}

	if (!strequal(r.header.signature, "PReg")) {
		status = NT_STATUS_INVALID_PARAMETER;
		goto out;
	}

	if (r.header.version != GP_REGPOL_FILE_VERSION) {
		status = NT_STATUS_INVALID_PARAMETER;
		goto out;
	}

	for (i=0; i < r.num_entries; i++) {

		struct gp_registry_entry *r_entry = NULL;

		if (!gp_reg_entry_from_file_entry(mem_ctx,
						  &r.entries[i],
						  &r_entry)) {
			status = NT_STATUS_NO_MEMORY;
			goto out;
		}

		if (!add_gp_registry_entry_to_array(mem_ctx,
						    r_entry,
						    &entries,
						    &num_entries)) {
			status = NT_STATUS_NO_MEMORY;
			goto out;
		}
	}

	*entries_p = entries;
	*num_entries_p = num_entries;

	status = NT_STATUS_OK;

 out:
	data_blob_free(&blob);
	return status;
}