/* Clones the list and its elements * * The values are cloned using the value_clone_function * On error the values are freed using the value_free_function * * Returns 1 if successful or -1 on error */ int libcdata_list_clone( libcdata_list_t **destination_list, libcdata_list_t *source_list, int (*value_free_function)( intptr_t **value, libcerror_error_t **error ), int (*value_clone_function)( intptr_t **destination, intptr_t *source, libcerror_error_t **error ), libcerror_error_t **error ) { libcdata_internal_list_t *internal_source_list = NULL; libcdata_list_element_t *source_list_element = NULL; intptr_t *destination_value = NULL; intptr_t *source_value = NULL; static char *function = "libcdata_list_clone"; int element_index = 0; if( destination_list == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid destination list.", function ); return( -1 ); } if( *destination_list != NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_ALREADY_SET, "%s: invalid destination list already set.", function ); return( -1 ); } if( value_free_function == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid value free function.", function ); return( -1 ); } if( value_clone_function == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid value clone function.", function ); return( -1 ); } if( source_list == NULL ) { *destination_list = NULL; return( 1 ); } internal_source_list = (libcdata_internal_list_t *) source_list; if( libcdata_list_initialize( destination_list, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create destination list.", function ); goto on_error; } if( *destination_list == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_MISSING, "%s: missing destination list.", function ); goto on_error; } source_list_element = internal_source_list->first_element; for( element_index = 0; element_index < internal_source_list->number_of_elements; element_index++ ) { if( libcdata_list_element_get_value( source_list_element, &source_value, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve value from source list element: %d.", function, element_index ); goto on_error; } if( value_clone_function( &destination_value, source_value, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to clone value of source list element: %d.", function, element_index ); goto on_error; } if( libcdata_list_append_value( *destination_list, destination_value, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_APPEND_FAILED, "%s: unable to append value of list element: %d.", function, element_index ); goto on_error; } destination_value = NULL; if( libcdata_list_element_get_next_element( source_list_element, &source_list_element, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve next element from source list element: %d.", function, element_index ); goto on_error; } } return( 1 ); on_error: if( destination_value != NULL ) { value_free_function( &destination_value, NULL ); } if( *destination_list != NULL ) { libcdata_list_free( destination_list, value_free_function, error ); } return( -1 ); }
/* Opens a file for reading * Returns 1 if successful or -1 on error */ int libolecf_file_open_read( libolecf_internal_file_t *internal_file, libbfio_handle_t *file_io_handle, libcerror_error_t **error ) { libcdata_list_t *directory_entry_list = NULL; static char *function = "libolecf_file_open_read"; uint32_t msat_sector_identifier = 0; uint32_t number_of_msat_sectors = 0; uint32_t number_of_sat_sectors = 0; uint32_t ssat_sector_identifier = 0; uint32_t number_of_ssat_sectors = 0; uint32_t root_directory_sector_identifier = 0; if( internal_file == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid file.", function ); return( -1 ); } if( internal_file->io_handle == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_MISSING, "%s: invalid file - missing IO handle.", function ); return( -1 ); } if( internal_file->msat != NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_ALREADY_SET, "%s: invalid file - MSAT already set.", function ); return( -1 ); } if( internal_file->sat != NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_ALREADY_SET, "%s: invalid file - SAT already set.", function ); return( -1 ); } if( internal_file->ssat != NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_ALREADY_SET, "%s: invalid file - SSAT already set.", function ); return( -1 ); } if( internal_file->unallocated_block_list != NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_ALREADY_SET, "%s: invalid file - unallocated block list already set.", function ); return( -1 ); } if( internal_file->directory_tree_root_node != NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_ALREADY_SET, "%s: invalid file - directory tree root node already set.", function ); return( -1 ); } if( libolecf_allocation_table_initialize( &( internal_file->msat ), 0, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create MSAT.", function ); goto on_error; } if( libolecf_allocation_table_initialize( &( internal_file->sat ), 0, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create SAT.", function ); goto on_error; } if( libolecf_allocation_table_initialize( &( internal_file->ssat ), 0, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create SSAT.", function ); goto on_error; } #if defined( HAVE_DEBUG_OUTPUT ) if( libcnotify_verbose != 0 ) { libcnotify_printf( "Reading file header:\n" ); } #endif if( libolecf_io_handle_read_file_header( internal_file->io_handle, file_io_handle, internal_file->msat, &msat_sector_identifier, &number_of_msat_sectors, &number_of_sat_sectors, &ssat_sector_identifier, &number_of_ssat_sectors, &root_directory_sector_identifier, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_READ_FAILED, "%s: unable to read file header.", function ); goto on_error; } #if defined( HAVE_DEBUG_OUTPUT ) if( libcnotify_verbose != 0 ) { libcnotify_printf( "Reading master sector allocation table (MSAT):\n" ); } #endif if( libolecf_io_handle_read_msat( internal_file->io_handle, file_io_handle, internal_file->msat, msat_sector_identifier, number_of_msat_sectors, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_READ_FAILED, "%s: unable to read MSAT.", function ); goto on_error; } #if defined( HAVE_DEBUG_OUTPUT ) if( libcnotify_verbose != 0 ) { libcnotify_printf( "Reading sector allocation table (SAT):\n" ); } #endif if( libolecf_io_handle_read_sat( internal_file->io_handle, file_io_handle, internal_file->msat, internal_file->sat, number_of_sat_sectors, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_READ_FAILED, "%s: unable to read SAT.", function ); goto on_error; } #if defined( HAVE_DEBUG_OUTPUT ) if( libcnotify_verbose != 0 ) { libcnotify_printf( "Reading short sector allocation table (SSAT):\n" ); } #endif if( libolecf_io_handle_read_ssat( internal_file->io_handle, file_io_handle, internal_file->sat, internal_file->ssat, ssat_sector_identifier, number_of_ssat_sectors, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_READ_FAILED, "%s: unable to read SSAT.", function ); goto on_error; } if( libcdata_list_initialize( &directory_entry_list, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create directory entry list.", function ); goto on_error; } #if defined( HAVE_DEBUG_OUTPUT ) if( libcnotify_verbose != 0 ) { libcnotify_printf( "Reading directory entries:\n" ); } #endif if( libolecf_io_handle_read_directory_entries( internal_file->io_handle, file_io_handle, internal_file->sat, directory_entry_list, root_directory_sector_identifier, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_READ_FAILED, "%s: unable to read directory entries.", function ); goto on_error; } #if defined( HAVE_DEBUG_OUTPUT ) if( libcnotify_verbose != 0 ) { libcnotify_printf( "Creating directory tree:\n" ); } #endif if( libolecf_directory_tree_create( &( internal_file->directory_tree_root_node ), &( internal_file->io_handle->short_sector_stream_start_sector_identifier ), &( internal_file->document_summary_information_directory_entry ), &( internal_file->summary_information_directory_entry ), directory_entry_list, internal_file->io_handle->byte_order, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create directory tree.", function ); goto on_error; } /* The directory entries are no longer managed by the list but by the tree */ if( libcdata_list_free( &directory_entry_list, NULL, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_FINALIZE_FAILED, "%s: unable to free directory entry list.", function ); goto on_error; } return( 1 ); on_error: if( internal_file->unallocated_block_list != NULL ) { libcdata_range_list_free( &( internal_file->unallocated_block_list ), NULL, NULL ); } if( internal_file->directory_tree_root_node != NULL ) { libcdata_tree_node_free( &( internal_file->directory_tree_root_node ), (int (*)(intptr_t **, libcerror_error_t **)) &libolecf_directory_entry_free, NULL ); } if( directory_entry_list != NULL ) { libcdata_list_free( &directory_entry_list, (int (*)(intptr_t **, libcerror_error_t **)) &libolecf_directory_entry_free, NULL ); } if( internal_file->ssat != NULL ) { libolecf_allocation_table_free( &( internal_file->ssat ), NULL ); } if( internal_file->sat != NULL ) { libolecf_allocation_table_free( &( internal_file->sat ), NULL ); } if( internal_file->msat != NULL ) { libolecf_allocation_table_free( &( internal_file->msat ), NULL ); } return( -1 ); }
/* Creates a catalog * Make sure the value catalog is referencing, is set to NULL * Returns 1 if successful or -1 on error */ int libesedb_catalog_initialize( libesedb_catalog_t **catalog, libcerror_error_t **error ) { static char *function = "libesedb_catalog_initialize"; if( catalog == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid catalog.", function ); return( -1 ); } if( *catalog != NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_VALUE_ALREADY_SET, "%s: invalid catalog value already set.", function ); return( -1 ); } *catalog = memory_allocate_structure( libesedb_catalog_t ); if( *catalog == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_MEMORY, LIBCERROR_MEMORY_ERROR_INSUFFICIENT, "%s: unable to create catalog.", function ); goto on_error; } if( memory_set( *catalog, 0, sizeof( libesedb_catalog_t ) ) == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_MEMORY, LIBCERROR_MEMORY_ERROR_SET_FAILED, "%s: unable to clear catalog.", function ); goto on_error; } if( libcdata_list_initialize( &( ( *catalog )->table_definition_list ), error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create table definition list.", function ); goto on_error; } return( 1 ); on_error: if( *catalog != NULL ) { memory_free( *catalog ); *catalog = NULL; } return( -1 ); }