/* Creates a filename for a certain segment file * Returns 1 if successful or -1 on error */ int libewf_filename_create( libcstring_system_character_t **filename, size_t *filename_size, libcstring_system_character_t *basename, size_t basename_length, uint32_t segment_number, uint32_t maximum_number_of_segments, uint8_t segment_file_type, uint8_t format, libcerror_error_t **error ) { static char *function = "libewf_filename_create"; if( filename == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid filename.", function ); return( -1 ); } if( *filename != NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: filename already set.", function ); return( -1 ); } if( filename_size == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid filename size.", function ); return( -1 ); } if( basename == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid basename.", function ); return( -1 ); } if( ( segment_file_type == LIBEWF_SEGMENT_FILE_TYPE_EWF2 ) || ( segment_file_type == LIBEWF_SEGMENT_FILE_TYPE_EWF2_LOGICAL ) ) { /* The actual filename also contains a '.', 4 character extension and a end of string byte */ *filename_size = basename_length + 6; } else { /* The actual filename also contains a '.', 3 character extension and a end of string byte */ *filename_size = basename_length + 5; } *filename = libcstring_system_string_allocate( *filename_size ); if( *filename == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_MEMORY, LIBCERROR_MEMORY_ERROR_INSUFFICIENT, "%s: unable to create filename.", function ); goto on_error; } if( libcstring_system_string_copy( *filename, basename, basename_length ) == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_MEMORY, LIBCERROR_MEMORY_ERROR_COPY_FAILED, "%s: unable to set basename.", function ); goto on_error; } ( *filename )[ basename_length++ ] = (libcstring_system_character_t) '.'; #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_filename_set_extension_wide( *filename, *filename_size, &basename_length, segment_number, maximum_number_of_segments, segment_file_type, format, error ) != 1 ) #else if( libewf_filename_set_extension( *filename, *filename_size, &basename_length, segment_number, maximum_number_of_segments, segment_file_type, format, error ) != 1 ) #endif { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable to set extension.", function ); goto on_error; } return( 1 ); on_error: if( *filename != NULL ) { memory_free( *filename ); *filename = NULL; } *filename_size = 0; return( -1 ); }
/* Globs the segment files according to the EWF naming schema * if format is known the filename should contain the base of the filename * otherwise the function will try to determine the format based on the extension * Returns 1 if successful or -1 on error */ int libewf_glob_wide( const wchar_t *filename, size_t filename_length, uint8_t format, wchar_t **filenames[], int *number_of_filenames, libcerror_error_t **error ) { libbfio_handle_t *file_io_handle = NULL; wchar_t *segment_filename = NULL; void *reallocation = NULL; static char *function = "libewf_glob_wide"; size_t additional_length = 4; size_t segment_filename_length = 0; int result = 0; uint8_t segment_file_type = 0; uint8_t ewf_format = 0; if( filename == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid filename.", function ); return( -1 ); } if( ( filename_length == 0 ) || ( filename_length > (size_t) SSIZE_MAX ) ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_VALUE_OUT_OF_BOUNDS, "%s: invalid filename length.", function ); return( -1 ); } if( ( format != LIBEWF_FORMAT_UNKNOWN ) && ( format != LIBEWF_FORMAT_ENCASE1 ) && ( format != LIBEWF_FORMAT_ENCASE2 ) && ( format != LIBEWF_FORMAT_ENCASE3 ) && ( format != LIBEWF_FORMAT_ENCASE4 ) && ( format != LIBEWF_FORMAT_ENCASE5 ) && ( format != LIBEWF_FORMAT_ENCASE6 ) && ( format != LIBEWF_FORMAT_LINEN5 ) && ( format != LIBEWF_FORMAT_LINEN6 ) && ( format != LIBEWF_FORMAT_SMART ) && ( format != LIBEWF_FORMAT_FTK ) && ( format != LIBEWF_FORMAT_LVF ) && ( format != LIBEWF_FORMAT_EWF ) && ( format != LIBEWF_FORMAT_EWFX ) ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_UNSUPPORTED_VALUE, "%s: unsupported format.", function ); return( -1 ); } if( filenames == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid filenames.", function ); return( -1 ); } if( number_of_filenames == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid number of filenames.", function ); return( -1 ); } if( format == LIBEWF_FORMAT_UNKNOWN ) { if( filename[ filename_length - 4 ] != (wchar_t) '.' ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_UNSUPPORTED_VALUE, "%s: invalid filename - missing extension.", function ); return( -1 ); } additional_length = 0; if( filename[ filename_length - 3 ] == (wchar_t) 'E' ) { format = LIBEWF_FORMAT_ENCASE5; } else if( filename[ filename_length - 3 ] == (wchar_t) 'e' ) { format = LIBEWF_FORMAT_EWF; } else if( filename[ filename_length - 3 ] == (wchar_t) 'L' ) { format = LIBEWF_FORMAT_LVF; } else if( filename[ filename_length - 3 ] == (wchar_t) 's' ) { format = LIBEWF_FORMAT_SMART; } else { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_UNSUPPORTED_VALUE, "%s: invalid filename - unsupported extension: %s.", function, &( filename[ filename_length - 4 ] ) ); return( -1 ); } } if( format == LIBEWF_FORMAT_LVF ) { segment_file_type = LIBEWF_SEGMENT_FILE_TYPE_LWF; ewf_format = EWF_FORMAT_L01; } else if( format == LIBEWF_FORMAT_SMART ) { segment_file_type = LIBEWF_SEGMENT_FILE_TYPE_EWF; ewf_format = EWF_FORMAT_S01; } else { segment_file_type = LIBEWF_SEGMENT_FILE_TYPE_EWF; ewf_format = EWF_FORMAT_E01; } if( libbfio_file_initialize( &file_io_handle, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, "%s: unable to create file IO handle.", function ); goto on_error; } *number_of_filenames = 0; while( *number_of_filenames < (int) UINT16_MAX ) { segment_filename_length = filename_length + additional_length; segment_filename = (wchar_t *) memory_allocate( sizeof( wchar_t ) * ( segment_filename_length + 1 ) ); if( segment_filename == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_MEMORY, LIBCERROR_MEMORY_ERROR_INSUFFICIENT, "%s: unable to create segment filename.", function ); goto on_error; } if( libcstring_wide_string_copy( segment_filename, filename, filename_length ) == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_MEMORY, LIBCERROR_MEMORY_ERROR_COPY_FAILED, "%s: unable to copy filename.", function ); goto on_error; } if( additional_length > 0 ) { segment_filename[ filename_length ] = (wchar_t) '.'; } if( libewf_filename_set_extension_wide( &( segment_filename[ segment_filename_length - 3 ] ), (uint16_t) ( *number_of_filenames + 1 ), UINT16_MAX, segment_file_type, format, ewf_format, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable to set extension.", function ); goto on_error; } segment_filename[ segment_filename_length ] = 0; if( libbfio_file_set_name_wide( file_io_handle, segment_filename, segment_filename_length, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable to set name in file IO handle.", function ); goto on_error; } result = libbfio_handle_exists( file_io_handle, error ); if( result == -1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_IO, LIBCERROR_IO_ERROR_GENERIC, "%s: unable to test if file exists.", function ); goto on_error; } else if( result == 0 ) { memory_free( segment_filename ); break; } *number_of_filenames += 1; reallocation = memory_reallocate( *filenames, sizeof( wchar_t * ) * *number_of_filenames ); if( reallocation == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_MEMORY, LIBCERROR_MEMORY_ERROR_INSUFFICIENT, "%s: unable to resize filenames.", function ); goto on_error; } *filenames = (wchar_t **) reallocation; ( *filenames )[ *number_of_filenames - 1 ] = segment_filename; } if( libbfio_handle_free( &file_io_handle, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_FINALIZE_FAILED, "%s: unable to free file IO handle.", function ); goto on_error; } return( 1 ); on_error: if( segment_filename != NULL ) { memory_free( segment_filename ); } if( file_io_handle != NULL ) { libbfio_handle_free( &file_io_handle, NULL ); } return( -1 ); }
/* Creates a filename for a certain segment file * Returns 1 if successful or -1 on error */ int libewf_filename_create( libcstring_system_character_t **filename, size_t *filename_size, libcstring_system_character_t *basename, size_t basename_length, uint16_t segment_number, uint16_t maximum_number_of_segments, uint8_t segment_file_type, uint8_t format, uint8_t ewf_format, liberror_error_t **error ) { libcstring_system_character_t *new_filename = NULL; static char *function = "libewf_filename_create"; if( filename == NULL ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_ARGUMENTS, LIBERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid filename.", function ); return( -1 ); } if( *filename != NULL ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_ARGUMENTS, LIBERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: filename already set.", function ); return( -1 ); } if( filename_size == NULL ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_ARGUMENTS, LIBERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid filename size.", function ); return( -1 ); } if( basename == NULL ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_ARGUMENTS, LIBERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid basename.", function ); return( -1 ); } /* The actual filename also contains a '.', 3 character extension and a end of string byte */ new_filename = libcstring_system_string_allocate( basename_length + 5 ); if( new_filename == NULL ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_MEMORY, LIBERROR_MEMORY_ERROR_INSUFFICIENT, "%s: unable to create filename.", function ); return( -1 ); } /* Add one additional character for the end of line */ if( libcstring_system_string_copy( new_filename, basename, ( basename_length + 1 ) ) == NULL ) { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_MEMORY, LIBERROR_MEMORY_ERROR_COPY_FAILED, "%s: unable to set basename.", function ); memory_free( new_filename ); return( -1 ); } new_filename[ basename_length ] = (libcstring_system_character_t) '.'; #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) if( libewf_filename_set_extension_wide( &( new_filename[ basename_length + 1 ] ), segment_number, maximum_number_of_segments, segment_file_type, format, ewf_format, error ) != 1 ) #else if( libewf_filename_set_extension( &( new_filename[ basename_length + 1 ] ), segment_number, maximum_number_of_segments, segment_file_type, format, ewf_format, error ) != 1 ) #endif { liberror_error_set( error, LIBERROR_ERROR_DOMAIN_RUNTIME, LIBERROR_RUNTIME_ERROR_SET_FAILED, "%s: unable to set extension.", function ); memory_free( new_filename ); return( -1 ); } *filename = new_filename; *filename_size = basename_length + 5; return( 1 ); }