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; }
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; }