/* Exports the sub items * Returns 1 if successful or -1 on error */ int export_handle_export_sub_items( export_handle_t *export_handle, libolecf_item_t *item, const system_character_t *export_path, size_t export_path_length, log_handle_t *log_handle, libcerror_error_t **error ) { libolecf_item_t *sub_item = NULL; static char *function = "export_handle_export_sub_items"; int number_of_sub_items = 0; int sub_item_iterator = 0; if( export_handle == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid export handle.", function ); return( -1 ); } if( item == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid item.", function ); return( -1 ); } if( export_path == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid export path.", function ); return( -1 ); } if( libolecf_item_get_number_of_sub_items( item, &number_of_sub_items, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve number of sub items.", function ); return( -1 ); } for( sub_item_iterator = 0; sub_item_iterator < number_of_sub_items; sub_item_iterator++ ) { if( libolecf_item_get_sub_item( item, sub_item_iterator, &sub_item, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve sub item: %d.", function, sub_item_iterator + 1 ); return( -1 ); } if( export_handle_export_item( export_handle, sub_item, sub_item_iterator, number_of_sub_items, export_path, export_path_length, log_handle, error ) != 1 ) { fprintf( stdout, "Unable to export item %d out of %d.\n", sub_item_iterator + 1, number_of_sub_items ); if( libcnotify_verbose != 0 ) { libcnotify_printf( "%s: unable to export sub item: %d.\n", function, sub_item_iterator + 1 ); } if( ( error != NULL ) && ( *error != NULL ) ) { libcnotify_print_error_backtrace( *error ); } libcerror_error_free( error ); log_handle_printf( log_handle, "Unable to export sub item: %d.\n", sub_item_iterator + 1 ); } if( libolecf_item_free( &sub_item, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_FINALIZE_FAILED, "%s: unable to free sub item: %d.", function, sub_item_iterator + 1 ); return( -1 ); } } return( 1 ); }
/* Prints an item to a stream * Returns 1 if successful or -1 on error */ int info_handle_item_fprint( info_handle_t *info_handle, libolecf_item_t *item, int indentation_level, libcerror_error_t **error ) { libcstring_system_character_t *name = NULL; libolecf_item_t *sub_item = NULL; static char *function = "info_handle_item_fprint"; size_t name_index = 0; size_t name_size = 0; uint32_t size = 0; int number_of_sub_items = 0; int indentation_iterator = 0; int result = 0; int sub_item_index = 0; if( info_handle == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid info handle.", function ); return( -1 ); } if( item == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_ARGUMENTS, LIBCERROR_ARGUMENT_ERROR_INVALID_VALUE, "%s: invalid item.", function ); return( -1 ); } #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) result = libolecf_item_get_utf16_name_size( item, &name_size, error ); #else result = libolecf_item_get_utf8_name_size( item, &name_size, error ); #endif if( result != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve item name size.", function ); goto on_error; } name = libcstring_system_string_allocate( name_size ); if( name == NULL ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_MEMORY, LIBCERROR_MEMORY_ERROR_INSUFFICIENT, "%s: unable to create name.", function ); goto on_error; } #if defined( LIBCSTRING_HAVE_WIDE_SYSTEM_CHARACTER ) result = libolecf_item_get_utf16_name( item, (uint16_t *) name, name_size, error ); #else result = libolecf_item_get_utf8_name( item, (uint8_t *) name, name_size, error ); #endif if( result != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve item name.", function ); goto on_error; } if( libolecf_item_get_size( item, &size, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve item size.", function ); goto on_error; } for( indentation_iterator = 0; indentation_iterator < indentation_level; indentation_iterator++ ) { fprintf( info_handle->notify_stream, " " ); } for( name_index = 0; name_index < ( name_size - 1 ); name_index++ ) { /* Print control characters as hexadecimal values */ if( ( name[ name_index ] < 0x20 ) || ( name[ name_index ] == 0x7f ) ) { fprintf( info_handle->notify_stream, "\\x%02" PRIx8 "", (uint8_t) name[ name_index ] ); } else { fprintf( info_handle->notify_stream, "%" PRIc_LIBCSTRING_SYSTEM "", name[ name_index ] ); } } fprintf( info_handle->notify_stream, " (%" PRIu32 " bytes)\n", size ); memory_free( name ); name = NULL; if( libolecf_item_get_number_of_sub_items( item, &number_of_sub_items, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve number of sub items.", function ); goto on_error; } for( sub_item_index = 0; sub_item_index < number_of_sub_items; sub_item_index++ ) { if( libolecf_item_get_sub_item( item, sub_item_index, &sub_item, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_GET_FAILED, "%s: unable to retrieve sub item: %d.", function, sub_item_index ); goto on_error; } if( info_handle_item_fprint( info_handle, sub_item, indentation_level + 1, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_PRINT_FAILED, "%s: unable to print sub item: %d.", function, sub_item_index ); libolecf_item_free( &sub_item, NULL ); goto on_error; } if( libolecf_item_free( &sub_item, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, LIBCERROR_RUNTIME_ERROR_FINALIZE_FAILED, "%s: unable to free sub item: %d.", function, sub_item_index ); goto on_error; } } return( 1 ); on_error: if( name != NULL ) { memory_free( name ); } return( -1 ); }