/* Tests libewf_handle_read_chunk and libewf_handle_prepare_read_chunk * Returns 1 if successful, 0 if not or -1 on error */ int ewf_test_read_chunk( libewf_handle_t *handle, uint8_t *data_buffer, size_t data_buffer_size, uint8_t *chunk_buffer, size_t chunk_buffer_size, size64_t input_size, size64_t expected_size, libcerror_error_t **error ) { uint8_t checksum_buffer[ 4 ]; static char *function = "ewf_test_read_chunk"; size64_t remaining_size = 0; size64_t result_size = 0; size_t data_size = 0; ssize_t process_count = 0; ssize_t read_count = 0; uint32_t chunk_checksum = 0; int8_t is_compressed = 0; int8_t process_checksum = 0; remaining_size = input_size; while( remaining_size > 0 ) { read_count = libewf_handle_read_chunk( handle, chunk_buffer, chunk_buffer_size, &is_compressed, (void *) checksum_buffer, &chunk_checksum, &process_checksum, error ); if( read_count < 0 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_READ_FAILED, "%s: unable to read chunk of size: %" PRIzd ".", function, chunk_buffer_size ); return( -1 ); } else if( read_count == 0 ) { break; } data_size = data_buffer_size; process_count = libewf_handle_prepare_read_chunk( handle, chunk_buffer, (size_t) read_count, data_buffer, &data_size, is_compressed, chunk_checksum, process_checksum, error ); if( process_count < 0 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_READ_FAILED, "%s: unable to prepare chunk of size: %" PRIzd " after read.", function, read_count ); return( -1 ); } remaining_size -= (size64_t) process_count; result_size += (size64_t) process_count; } if( expected_size != result_size ) { fprintf( stderr, "%s: unexpected read count: %" PRIu64 "\n", function, result_size ); return( 0 ); } return( 1 ); }
/* Tests libewf_handle_read_chunk, libewf_handle_write_chunk, libewf_handle_prepare_read_chunk and libewf_handle_prepare_write_chunk * Returns 1 if successful, 0 if not or -1 on error */ int ewf_test_read_write_chunk( libewf_handle_t *handle, uint8_t *data_buffer, size_t data_buffer_size, uint8_t *chunk_buffer, size_t chunk_buffer_size, size64_t input_size, size64_t expected_size, liberror_error_t **error ) { uint8_t checksum_buffer[ 4 ]; static char *function = "ewf_test_read_write_chunk"; size64_t remaining_size = 0; size64_t result_size = 0; size_t chunk_data_size = 0; size_t data_size = 0; size_t write_size = 0; ssize_t process_count = 0; ssize_t read_count = 0; ssize_t write_count = 0; uint32_t chunk_checksum = 0; int8_t is_compressed = 0; int8_t process_checksum = 0; remaining_size = input_size; while( remaining_size > 0 ) { read_count = libewf_handle_read_chunk( handle, chunk_buffer, chunk_buffer_size, &is_compressed, (void *) checksum_buffer, &chunk_checksum, &process_checksum, error ); if( read_count < 0 ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_IO, LIBERROR_IO_ERROR_READ_FAILED, "%s: unable to read chunk of size: %" PRIzd ".", function, chunk_buffer_size ); return( -1 ); } else if( read_count == 0 ) { break; } data_size = data_buffer_size; process_count = libewf_handle_prepare_read_chunk( handle, chunk_buffer, (size_t) read_count, data_buffer, &data_size, is_compressed, chunk_checksum, process_checksum, error ); if( process_count < 0 ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_IO, LIBERROR_IO_ERROR_READ_FAILED, "%s: unable to prepare chunk of size: %" PRIzd " after read.", function, read_count ); return( -1 ); } if( libewf_handle_seek_offset( handle, -1 * (off64_t) process_count, SEEK_CUR, error ) == -1 ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_IO, LIBERROR_IO_ERROR_READ_FAILED, "%s: unable to seek previous offset.", function ); return( -1 ); } if( memory_set( data_buffer, (int) 'C', data_buffer_size ) == NULL ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_MEMORY, LIBERROR_MEMORY_ERROR_SET_FAILED, "%s: unable set value in buffer.", function ); return( -1 ); } write_size = process_count; chunk_data_size = chunk_buffer_size; process_count = libewf_handle_prepare_write_chunk( handle, data_buffer, write_size, chunk_buffer, &chunk_data_size, &is_compressed, &chunk_checksum, &process_checksum, error ); if( process_count < 0 ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_RUNTIME, LIBERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable to prepare chunk buffer before writing.", function ); return( -1 ); } if( is_compressed == 0 ) { write_count = libewf_handle_write_chunk( handle, data_buffer, process_count, write_size, is_compressed, checksum_buffer, chunk_checksum, process_checksum, error ); } else { write_count = libewf_handle_write_chunk( handle, chunk_buffer, chunk_data_size, write_size, is_compressed, checksum_buffer, chunk_checksum, process_checksum, error ); } if( write_count < 0 ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_IO, LIBERROR_IO_ERROR_WRITE_FAILED, "%s: unable write chunk of size: %" PRIzd ".", function, chunk_data_size ); return( -1 ); } remaining_size -= (size64_t) write_size; result_size += (size64_t) write_size; } if( expected_size != result_size ) { fprintf( stderr, "%s: unexpected read/write count: %" PRIu64 "\n", function, result_size ); return( 0 ); } return( 1 ); }