/* Reads data at a specific offset * Returns the number of bytes read or -1 on error */ ssize_t mount_file_entry_read_buffer_at_offset( mount_file_entry_t *file_entry, void *buffer, size_t buffer_size, off64_t offset, libcerror_error_t **error ) { static char *function = "mount_file_entry_read_buffer_at_offset"; ssize_t read_count = 0; if( file_entry == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid file entry.", function ); return( -1 ); } read_count = libvshadow_store_read_buffer_at_offset( file_entry->vshadow_store, buffer, buffer_size, offset, error ); if( read_count < 0 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_READ_FAILED, "%s: unable to read buffer at offset: %" PRIi64 " (0x%08" PRIx64 ") from store.", function, offset, offset ); return( -1 ); } return( read_count ); }
/* Tests libvshadow_store_read_buffer_at_offset * Returns 1 if successful, 0 if not or -1 on error */ int vshadow_test_read_buffer_at_offset( libvshadow_store_t *store, off64_t input_offset, size64_t input_size, off64_t expected_offset, size64_t expected_size ) { uint8_t buffer[ VSHADOW_TEST_READ_BUFFER_SIZE ]; libcerror_error_t *error = NULL; off64_t result_offset = 0; size64_t remaining_size = 0; size64_t result_size = 0; size_t read_size = 0; ssize_t read_count = 0; int result = 0; if( store == NULL ) { return( -1 ); } remaining_size = input_size; fprintf( stdout, "Testing reading buffer at offset: %" PRIi64 " and size: %" PRIu64 "\t", input_offset, input_size ); while( remaining_size > 0 ) { read_size = VSHADOW_TEST_READ_BUFFER_SIZE; if( remaining_size < (size64_t) read_size ) { read_size = (size_t) remaining_size; } read_count = libvshadow_store_read_buffer_at_offset( store, buffer, read_size, input_offset, &error ); if( read_count < 0 ) { break; } input_offset += (size64_t) read_count; remaining_size -= (size64_t) read_count; result_size += (size64_t) read_count; if( read_count != (ssize_t) read_size ) { break; } } if( libvshadow_store_get_offset( store, &result_offset, &error ) != 1 ) { result = -1; } if( expected_offset != result_offset ) { fprintf( stderr, "Unexpected offset: %" PRIi64 "\n", result_offset ); } else if( expected_size != result_size ) { fprintf( stderr, "Unexpected read count: %" PRIu64 "\n", result_size ); } else { result = 1; } if( result == 1 ) { fprintf( stdout, "(PASS)" ); } else { fprintf( stdout, "(FAIL)" ); } fprintf( stdout, "\n" ); if( error != NULL ) { if( result != 1 ) { libcerror_error_backtrace_fprint( error, stderr ); } libcerror_error_free( &error ); } return( result ); }