diff --git a/ChangeLog b/ChangeLog index 3b555c15..fe9eed85 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2006-05-23 Bart Hakvoort + + * Use ped_device_read and ped_device_write instead of 'dd' to copy + filesystems. + Modified progressdetails to provide more detailed feedback about a + process. + Basicly these were all changes to the infrastructure to make the + incorporation of the 'move-code' a bit easier. + + ( sorry, not in the mood to list all affected files ;) + 2006-05-13 Bart Hakvoort * configure.in: bumped to gparted-0.2.5 diff --git a/include/Dialog_Progress.h b/include/Dialog_Progress.h index 707f4e2e..c5ff0936 100644 --- a/include/Dialog_Progress.h +++ b/include/Dialog_Progress.h @@ -56,6 +56,7 @@ private: bool on_delete_event( GdkEventAny * event ) ; Gtk::Label label_current ; + Gtk::Label label_current_sub ; Gtk::ProgressBar progressbar_all, progressbar_current ; Gtk::TreeView treeview_operations ; Gtk::TreeRow treerow ; @@ -86,7 +87,7 @@ private: treeview_operations_Columns treeview_operations_columns; std::vector operations ; - bool pulse, succes, cancel ; + bool running, succes, cancel, pulse ; pthread_t pthread ; double fraction ; unsigned int t ; diff --git a/include/GParted_Core.h b/include/GParted_Core.h index 7c92af25..cdc9481c 100644 --- a/include/GParted_Core.h +++ b/include/GParted_Core.h @@ -48,7 +48,7 @@ public: const Partition & partition_old, const Partition & partition_new, std::vector & operation_detail ) ; - bool copy( const Glib::ustring & src_part_path, + bool copy( const Partition & partition_src, Partition & partition_dest, Sector min_size, std::vector & operation_details ) ; @@ -91,6 +91,10 @@ private: const Partition & partition_new, std::vector & operation_details ) ; + bool copy_filesystem( const Partition & partition_src, + const Partition & partition_dest, + std::vector & operation_details ) ; + void set_proper_filesystem( const FILESYSTEM & filesystem ) ; bool set_partition_type( const Partition & partition, std::vector & operation_details ) ; diff --git a/include/Operation.h b/include/Operation.h index e7648380..9ec0f101 100644 --- a/include/Operation.h +++ b/include/Operation.h @@ -43,16 +43,21 @@ struct OperationDetails OperationDetails() { status = NONE ; + fraction = -1 ; } OperationDetails( const Glib::ustring & description, Status status = EXECUTE ) { this ->description = description ; this ->status = status ; + + fraction = -1 ; } Glib::ustring description ; Status status ; + double fraction ; + Glib::ustring progress_text ; std::vector sub_details ; }; diff --git a/include/Utils.h b/include/Utils.h index b06a02fd..84d36dc1 100644 --- a/include/Utils.h +++ b/include/Utils.h @@ -84,8 +84,9 @@ struct FS enum Support { NONE = 0, - LIBPARTED = 1, - EXTERNAL = 2 + GPARTED = 1, + LIBPARTED = 2, + EXTERNAL = 3 }; FILESYSTEM filesystem ; diff --git a/src/Dialog_Progress.cc b/src/Dialog_Progress.cc index 35907c16..2519048c 100644 --- a/src/Dialog_Progress.cc +++ b/src/Dialog_Progress.cc @@ -45,13 +45,14 @@ Dialog_Progress::Dialog_Progress( const std::vector & operations ) str_temp += "\n"; this ->get_vbox() ->pack_start( * Utils::mk_label( str_temp ), Gtk::PACK_SHRINK ); - this ->get_vbox() ->pack_start( * Utils::mk_label( "" + static_cast( _("Current Operation:") ) + "" ), Gtk::PACK_SHRINK ); - + label_current .set_alignment( Gtk::ALIGN_LEFT ); + this ->get_vbox() ->pack_start( label_current, Gtk::PACK_SHRINK ) ; + progressbar_current .set_pulse_step( 0.01 ) ; this->get_vbox() ->pack_start( progressbar_current, Gtk::PACK_SHRINK ); - label_current .set_alignment( Gtk::ALIGN_LEFT ); - this ->get_vbox() ->pack_start( label_current, Gtk::PACK_SHRINK ); + label_current_sub .set_alignment( Gtk::ALIGN_LEFT ); + this ->get_vbox() ->pack_start( label_current_sub, Gtk::PACK_SHRINK ); this ->get_vbox() ->pack_start( * Utils::mk_label( "" + static_cast( _("Completed Operations:") ) + "" ), Gtk::PACK_SHRINK ); this ->get_vbox() ->pack_start( progressbar_all, Gtk::PACK_SHRINK ); @@ -146,6 +147,19 @@ void Dialog_Progress::update_operation_details( const Gtk::TreeRow & treerow, } } + //check description and update if necessary + if ( operation_details .description != treerow[ treeview_operations_columns .operation_description ] ) + treerow[ treeview_operations_columns .operation_description ] = operation_details .description ; + + if ( operation_details .fraction >= 0 ) + { + pulse = false ; + progressbar_current .set_fraction( operation_details .fraction ) ; + progressbar_current .set_text( operation_details .progress_text ) ; + } + else + pulse = true ; + //and update the children.. for ( unsigned int t = 0 ; t < operation_details .sub_details .size() ; t++ ) update_operation_details( treerow .children()[ t ], operation_details .sub_details[ t ] ) ; @@ -155,7 +169,7 @@ void Dialog_Progress::on_signal_show() { for ( t = 0 ; t < operations .size() && succes && ! cancel ; t++ ) { - label_current .set_markup( "" + operations[ t ] ->description + "\n" ) ; + label_current .set_markup( "" + operations[ t ] ->description + "" ) ; progressbar_all .set_text( String::ucompose( _("%1 of %2 operations completed"), t, operations .size() ) ) ; progressbar_all .set_fraction( fraction * t ) ; @@ -170,19 +184,30 @@ void Dialog_Progress::on_signal_show() treeview_operations .set_cursor( static_cast( treerow ) ) ; //and start.. - pulse = true ; + running = true ; pthread_create( & pthread, NULL, Dialog_Progress::static_pthread_apply_operation, this ); - - while ( pulse ) - { - update_operation_details( treerow, operations[ t ] ->operation_details ) ; - progressbar_current .pulse() ; + int ms = 200 ; + while ( running ) + { + if ( ms >= 200 ) + { + update_operation_details( treerow, operations[ t ] ->operation_details ) ; + if ( operations[ t ] ->operation_details .sub_details .size() > 0 ) + label_current_sub .set_markup( + "" + + operations[ t ] ->operation_details .sub_details .back() .description + + "\n" ) ; + ms = 0 ; + } + if ( pulse ) + progressbar_current .pulse() ; while ( Gtk::Main::events_pending() ) Gtk::Main::iteration(); usleep( 10000 ) ; + ms += 10 ; } //set status (succes/error) for this operation @@ -207,10 +232,9 @@ void Dialog_Progress::on_signal_show() else { //hide 'current operation' stuff - children = this ->get_vbox() ->get_children() ; - children[ 1 ] ->hide() ; - progressbar_current .hide() ; label_current .hide() ; + progressbar_current .hide() ; + label_current_sub .hide() ; } //deal with succes/error... @@ -260,7 +284,7 @@ void * Dialog_Progress::static_pthread_apply_operation( void * p_dialog_progress dp ->succes = dp ->signal_apply_operation .emit( dp ->operations[ dp ->t ] ) ; - dp ->pulse = false ; + dp ->running = false ; return NULL ; } @@ -283,7 +307,7 @@ void Dialog_Progress::on_cancel() { pthread_cancel( pthread ) ; cancel = true ; - pulse = false ; + running = false ; succes = false ; } } diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc index 07e31a57..cc104d13 100644 --- a/src/GParted_Core.cc +++ b/src/GParted_Core.cc @@ -651,7 +651,7 @@ bool GParted_Core::apply_operation_to_disk( Operation * operation ) return format( operation ->partition_new, operation ->operation_details .sub_details ) ; case COPY: operation ->partition_new .add_path( operation ->partition_original .get_path(), true ) ; - return copy( static_cast( operation ) ->partition_copied .get_path(), + return copy( static_cast( operation ) ->partition_copied, operation ->partition_new, static_cast( operation ) ->partition_copied .get_length(), operation ->operation_details .sub_details ) ; @@ -782,26 +782,53 @@ bool GParted_Core::resize( const Device & device, return false ; } -bool GParted_Core::copy( const Glib::ustring & src_part_path, +bool GParted_Core::copy( const Partition & partition_src, Partition & partition_dest, Sector min_size, std::vector & operation_details ) { -//FIXME: some filesystems (e.g. fat*) can be copied using libparted.. - set_proper_filesystem( partition_dest .filesystem ) ; - if ( p_filesystem && p_filesystem ->Check_Repair( Partition( src_part_path ), operation_details ) ) + if ( p_filesystem && p_filesystem ->Check_Repair( partition_src, operation_details ) ) { bool succes = true ; if ( partition_dest .status == GParted::STAT_NEW ) succes = create_empty_partition( partition_dest, operation_details, min_size ) ; - return ( succes && - set_partition_type( partition_dest, operation_details ) && - p_filesystem ->Copy( src_part_path, partition_dest .get_path(), operation_details ) && - p_filesystem ->Check_Repair( partition_dest, operation_details ) && - p_filesystem ->Resize( partition_dest, operation_details, true ) && - p_filesystem ->Check_Repair( partition_dest, operation_details ) ) ; + if ( succes && set_partition_type( partition_dest, operation_details ) ) + { + operation_details .push_back( OperationDetails( + String::ucompose( _("copy filesystem of %1 to %2"), + partition_src .get_path(), + partition_dest .get_path() ) ) ) ; + + switch ( get_fs( partition_dest .filesystem ) .copy ) + { + case GParted::FS::GPARTED : + succes = copy_filesystem( partition_src, + partition_dest, + operation_details ) ; + break ; + + case GParted::FS::LIBPARTED : + //FIXME: see if copying through libparted has any advantages + break ; + + case GParted::FS::EXTERNAL : + succes = p_filesystem ->Copy( partition_src .get_path(), + partition_dest .get_path(), + operation_details ) ; + break ; + + default : + succes = false ; + break ; + } + + return ( succes && + p_filesystem ->Check_Repair( partition_dest, operation_details ) && + p_filesystem ->Resize( partition_dest, operation_details, true ) && + p_filesystem ->Check_Repair( partition_dest, operation_details ) ) ; + } } return false ; @@ -1027,19 +1054,17 @@ bool GParted_Core::create_empty_partition( Partition & new_partition, free( lp_path ) ; new_partition .partition_number = lp_partition ->num ; - - Sector start = lp_partition ->geom .start ; - Sector end = lp_partition ->geom .end ; + new_partition .sector_start = lp_partition ->geom .start ; + new_partition .sector_end = lp_partition ->geom .end ; - operation_details .back() .sub_details .push_back( - OperationDetails( - "" + - String::ucompose( _("path: %1"), new_partition .get_path() ) + "\n" + - String::ucompose( _("start: %1"), start ) + "\n" + - String::ucompose( _("end: %1"), end ) + "\n" + - String::ucompose( _("size: %1"), Utils::format_size( end - start + 1 ) ) + - "", - OperationDetails::NONE ) ) ; + operation_details .back() .sub_details .push_back( OperationDetails( + "" + + String::ucompose( _("path: %1"), new_partition .get_path() ) + "\n" + + String::ucompose( _("start: %1"), new_partition .sector_start ) + "\n" + + String::ucompose( _("end: %1"), new_partition .sector_end ) + "\n" + + String::ucompose( _("size: %1"), Utils::format_size( new_partition .get_length() ) ) + + "", + OperationDetails::NONE ) ) ; } ped_constraint_destroy( constraint ); @@ -1231,6 +1256,112 @@ bool GParted_Core::resize_normal_using_libparted( const Partition & partition_ol return return_value ; } +bool GParted_Core::copy_filesystem( const Partition & partition_src, + const Partition & partition_dest, + std::vector & operation_details ) +{//FIXME: try to increase speed by copying more sectors at once, this should probably become a userspace setting + bool succes = false ; + + char buf[1024] ; + PedDevice *lp_device_src, *lp_device_dest ; +//FIXME: adapt open_device() so we don't have to call ped_device_get() here +//(same goes for close_device() and ped_device_destroy() + lp_device_src = ped_device_get( partition_src .device_path .c_str() ); + + if ( partition_src .device_path != partition_dest .device_path ) + lp_device_dest = ped_device_get( partition_dest .device_path .c_str() ); + else + lp_device_dest = lp_device_src ; + + if ( lp_device_src && lp_device_dest && ped_device_open( lp_device_src ) && ped_device_open( lp_device_dest ) ) + { + ped_device_sync( lp_device_dest ) ; + + //add an empty sub which we will constantly update in the loop + operation_details .back() .sub_details .push_back( + OperationDetails( "", OperationDetails::NONE ) ) ; + + Glib::ustring error_message ; + Sector t = 0 ; + for ( ; t < partition_src .get_length() ; t++ ) + { + if ( ! ped_device_read( lp_device_src, buf, partition_src .sector_start + t, 1 ) ) + { + error_message = "" + String::ucompose( _("Error while reading sector %1"), + partition_src .sector_start + t ) + "" ; + + break ; + } + + if ( ! ped_device_write( lp_device_dest, buf, partition_dest .sector_start + t, 1 ) ) + { + error_message = "" + String::ucompose( _("Error while writing sector %1"), + partition_src .sector_start + t ) + "" ; + + break ; + } + + if ( t % MEBIBYTE == 0 ) + { + operation_details .back() .sub_details .back() .progress_text = + String::ucompose( _("%1 of %2 copied"), + Utils::format_size( t +1 ), + Utils::format_size( partition_src .get_length() ) ) ; + + operation_details .back() .sub_details .back() .description = + "" + operation_details .back() .sub_details .back() .progress_text + "" ; + + operation_details .back() .sub_details .back() .fraction = + t / static_cast( partition_src .get_length() ) ; + } + } + + //final description + operation_details .back() .sub_details .back() .description = + "" + + String::ucompose( _("%1 of %2 copied"), + Utils::format_size( t +1 ), + Utils::format_size( partition_src .get_length() ) ) + + "" ; + //reset fraction to -1 to make room for a new one (or a pulsebar) + operation_details .back() .sub_details .back() .fraction = -1 ; + + if ( t == partition_src .get_length() ) + { + succes = true ; + } + else + { + if ( ! error_message .empty() ) + operation_details .back() .sub_details .push_back( + OperationDetails( error_message, OperationDetails::NONE ) ) ; + + if ( ! ped_error .empty() ) + operation_details .back() .sub_details .push_back( + OperationDetails( "" + ped_error + "", OperationDetails::NONE ) ) ; + } + + //close the devices.. + ped_device_close( lp_device_src ) ; + + if ( partition_src .device_path != partition_dest .device_path ) + ped_device_close( lp_device_dest ) ; + + //detroy the devices.. + ped_device_destroy( lp_device_src ) ; + + if ( partition_src .device_path != partition_dest .device_path ) + ped_device_destroy( lp_device_dest ) ; + } + else + operation_details .back() .sub_details .push_back( + OperationDetails( _("An error occured while opening the devices"), OperationDetails::NONE ) ) ; + + + operation_details .back() .status = succes ? OperationDetails::SUCCES : OperationDetails::ERROR ; + return succes ; +} + void GParted_Core::set_flags( Partition & partition ) { for ( unsigned int t = 0 ; t < flags .size() ; t++ ) @@ -1344,7 +1475,8 @@ bool GParted_Core::erase_filesystem_signatures( const Partition & partition ) return return_value ; } - +//FIXME open_device( _and_disk) and the close functions should take an PedDevice * and PedDisk * as argument +//basicly we should get rid of these global lp_device and lp_disk bool GParted_Core::open_device( const Glib::ustring & device_path ) { lp_device = ped_device_get( device_path .c_str() ); diff --git a/src/ext2.cc b/src/ext2.cc index 82bae23f..490af817 100644 --- a/src/ext2.cc +++ b/src/ext2.cc @@ -34,18 +34,15 @@ FS ext2::get_filesystem_support() if ( ! Glib::find_program_in_path( "e2fsck" ) .empty() ) fs .check = GParted::FS::EXTERNAL ; - //resizing is a delicate process ... if ( ! Glib::find_program_in_path( "resize2fs" ) .empty() && fs .check ) { fs .grow = GParted::FS::EXTERNAL ; + fs .copy = GParted::FS::GPARTED ; if ( fs .read ) //needed to determine a min filesystemsize.. fs .shrink = GParted::FS::EXTERNAL ; } - if ( ! Glib::find_program_in_path( "dd" ) .empty() && fs .grow ) - fs .copy = GParted::FS::EXTERNAL ; - return fs ; } @@ -119,20 +116,7 @@ bool ext2::Copy( const Glib::ustring & src_part_path, const Glib::ustring & dest_part_path, std::vector & operation_details ) { - operation_details .push_back( OperationDetails( - String::ucompose( _("copy contents of %1 to %2"), src_part_path, dest_part_path ) ) ) ; - - if ( ! execute_command( "dd bs=8192 if=" + src_part_path + " of=" + dest_part_path, - operation_details .back() .sub_details ) ) - { - operation_details .back() .status = OperationDetails::SUCCES ; - return true ; - } - else - { - operation_details .back() .status = OperationDetails::ERROR ; - return false ; - } + return true ; } bool ext2::Check_Repair( const Partition & partition, std::vector & operation_details ) @@ -143,7 +127,10 @@ bool ext2::Check_Repair( const Partition & partition, std::vector= 0 && exit_status <= 2 ) + + //exitstatus 256 isn't documented, but it's returned when the 'FILESYSTEM IS MODIFIED' + //this is quite normal (especially after a copy) so we let the function return true... + if ( exit_status == 0 || exit_status == 1 || exit_status == 2 || exit_status == 256 ) { operation_details .back() .status = OperationDetails::SUCCES ; return true ; diff --git a/src/ext3.cc b/src/ext3.cc index 28a8374d..599c426a 100644 --- a/src/ext3.cc +++ b/src/ext3.cc @@ -35,18 +35,15 @@ FS ext3::get_filesystem_support() if ( ! Glib::find_program_in_path( "e2fsck" ) .empty() ) fs .check = GParted::FS::EXTERNAL ; - //resizing is a delicate process ... if ( ! Glib::find_program_in_path( "resize2fs" ) .empty() && fs .check ) { fs .grow = GParted::FS::EXTERNAL ; + fs .copy = GParted::FS::GPARTED ; if ( fs .read ) //needed to determine a min filesystemsize.. fs .shrink = GParted::FS::EXTERNAL ; } - if ( ! Glib::find_program_in_path( "dd" ) .empty() && fs .grow ) - fs .copy = GParted::FS::EXTERNAL ; - return fs ; } @@ -120,20 +117,7 @@ bool ext3::Copy( const Glib::ustring & src_part_path, const Glib::ustring & dest_part_path, std::vector & operation_details ) { - operation_details .push_back( OperationDetails( - String::ucompose( _("copy contents of %1 to %2"), src_part_path, dest_part_path ) ) ) ; - - if ( ! execute_command( "dd bs=8192 if=" + src_part_path + " of=" + dest_part_path, - operation_details .back() .sub_details ) ) - { - operation_details .back() .status = OperationDetails::SUCCES ; - return true ; - } - else - { - operation_details .back() .status = OperationDetails::ERROR ; - return false ; - } + return true ; } bool ext3::Check_Repair( const Partition & partition, std::vector & operation_details ) @@ -144,7 +128,10 @@ bool ext3::Check_Repair( const Partition & partition, std::vector= 0 && exit_status <= 2 ) + + //exitstatus 256 isn't documented, but it's returned when the 'FILESYSTEM IS MODIFIED' + //this is quite normal (especially after a copy) so we let the function return true... + if ( exit_status == 0 || exit_status == 1 || exit_status == 2 || exit_status == 256 ) { operation_details .back() .status = OperationDetails::SUCCES ; return true ; diff --git a/src/fat16.cc b/src/fat16.cc index b5f34d54..92ee29d8 100644 --- a/src/fat16.cc +++ b/src/fat16.cc @@ -41,8 +41,7 @@ FS fat16::get_filesystem_support() fs .shrink = GParted::FS::LIBPARTED ; fs .move = GParted::FS::LIBPARTED ; - if ( ! Glib::find_program_in_path( "dd" ) .empty() ) - fs .copy = GParted::FS::EXTERNAL ; + fs .copy = GParted::FS::GPARTED ; fs .MIN = 16 * MEBIBYTE ; fs .MAX = 4096 * MEBIBYTE ; @@ -103,20 +102,7 @@ bool fat16::Copy( const Glib::ustring & src_part_path, const Glib::ustring & dest_part_path, std::vector & operation_details ) { - operation_details .push_back( OperationDetails( - String::ucompose( _("copy contents of %1 to %2"), src_part_path, dest_part_path ) ) ) ; - - if ( ! execute_command( "dd bs=8192 if=" + src_part_path + " of=" + dest_part_path, - operation_details .back() .sub_details ) ) - { - operation_details .back() .status = OperationDetails::SUCCES ; - return true ; - } - else - { - operation_details .back() .status = OperationDetails::ERROR ; - return false ; - } + return true ; } bool fat16::Check_Repair( const Partition & partition, std::vector & operation_details ) diff --git a/src/fat32.cc b/src/fat32.cc index 5152abf2..f8e16e7d 100644 --- a/src/fat32.cc +++ b/src/fat32.cc @@ -41,8 +41,9 @@ FS fat32::get_filesystem_support() fs .shrink = GParted::FS::LIBPARTED ; fs .move = GParted::FS::LIBPARTED ; - if ( ! Glib::find_program_in_path( "dd" ) .empty() ) - fs .copy = GParted::FS::EXTERNAL ; +//FIXME: find a way to decouple FS and partitionresizing when using libparted.. +//this is especially important while copying fat* FS's + fs .copy = GParted::FS::GPARTED ; fs .MIN = 32 * MEBIBYTE ; //smaller fs'es will cause windows scandisk to fail.. @@ -102,20 +103,7 @@ bool fat32::Copy( const Glib::ustring & src_part_path, const Glib::ustring & dest_part_path, std::vector & operation_details ) { - operation_details .push_back( OperationDetails( - String::ucompose( _("copy contents of %1 to %2"), src_part_path, dest_part_path ) ) ) ; - - if ( ! execute_command( "dd bs=8192 if=" + src_part_path + " of=" + dest_part_path, - operation_details .back() .sub_details ) ) - { - operation_details .back() .status = OperationDetails::SUCCES ; - return true ; - } - else - { - operation_details .back() .status = OperationDetails::ERROR ; - return false ; - } + return true ; } bool fat32::Check_Repair( const Partition & partition, std::vector & operation_details ) diff --git a/src/hfs.cc b/src/hfs.cc index 4c2d8af5..0784b445 100644 --- a/src/hfs.cc +++ b/src/hfs.cc @@ -33,8 +33,7 @@ FS hfs::get_filesystem_support() if ( ! Glib::find_program_in_path( "hformat" ) .empty() ) fs .create = GParted::FS::EXTERNAL ; - if ( ! Glib::find_program_in_path( "dd" ) .empty() ) - fs .copy = GParted::FS::EXTERNAL ; + fs .copy = GParted::FS::GPARTED ; fs .MAX = 2048 * MEBIBYTE ; @@ -74,20 +73,7 @@ bool hfs::Copy( const Glib::ustring & src_part_path, const Glib::ustring & dest_part_path, std::vector & operation_details ) { - operation_details .push_back( OperationDetails( - String::ucompose( _("copy contents of %1 to %2"), src_part_path, dest_part_path ) ) ) ; - - if ( ! execute_command( "dd bs=8192 if=" + src_part_path + " of=" + dest_part_path, - operation_details .back() .sub_details ) ) - { - operation_details .back() .status = OperationDetails::SUCCES ; - return true ; - } - else - { - operation_details .back() .status = OperationDetails::ERROR ; - return false ; - } + return true ; } bool hfs::Check_Repair( const Partition & partition, std::vector & operation_details ) diff --git a/src/hfsplus.cc b/src/hfsplus.cc index 0ee77f1b..1a670a2f 100644 --- a/src/hfsplus.cc +++ b/src/hfsplus.cc @@ -30,8 +30,7 @@ FS hfsplus::get_filesystem_support( ) fs .read = GParted::FS::LIBPARTED ; fs .shrink = GParted::FS::LIBPARTED ; - if ( ! Glib::find_program_in_path( "dd" ) .empty() ) - fs .copy = GParted::FS::EXTERNAL ; + fs .copy = GParted::FS::GPARTED ; return fs ; } @@ -56,20 +55,7 @@ bool hfsplus::Copy( const Glib::ustring & src_part_path, const Glib::ustring & dest_part_path, std::vector & operation_details ) { - operation_details .push_back( OperationDetails( - String::ucompose( _("copy contents of %1 to %2"), src_part_path, dest_part_path ) ) ) ; - - if ( ! execute_command( "dd bs=8192 if=" + src_part_path + " of=" + dest_part_path, - operation_details .back() .sub_details ) ) - { - operation_details .back() .status = OperationDetails::SUCCES ; - return true ; - } - else - { - operation_details .back() .status = OperationDetails::ERROR ; - return false ; - } + return true ; } bool hfsplus::Check_Repair( const Partition & partition, std::vector & operation_details ) diff --git a/src/jfs.cc b/src/jfs.cc index 91ca4793..1f437d11 100644 --- a/src/jfs.cc +++ b/src/jfs.cc @@ -57,9 +57,9 @@ FS jfs::get_filesystem_support() input .close() ; } } - - if ( ! Glib::find_program_in_path( "dd" ) .empty() && fs .grow ) - fs .copy = GParted::FS::EXTERNAL ; + + if ( fs .grow ) + fs .copy = GParted::FS::GPARTED ; fs .MIN = 16 * MEBIBYTE ; @@ -203,21 +203,7 @@ bool jfs::Copy( const Glib::ustring & src_part_path, const Glib::ustring & dest_part_path, std::vector & operation_details ) { - operation_details .push_back( OperationDetails( - String::ucompose( _("copy contents of %1 to %2"), src_part_path, dest_part_path ) ) ) ; - - if ( ! execute_command( "dd bs=8192 if=" + src_part_path + " of=" + dest_part_path, - operation_details .back() .sub_details ) ) - { - operation_details .back() .status = OperationDetails::SUCCES ; - return true ; - - } - else - { - operation_details .back() .status = OperationDetails::ERROR ; - return false ; - } + return true ; } bool jfs::Check_Repair( const Partition & partition, std::vector & operation_details ) diff --git a/src/linux_swap.cc b/src/linux_swap.cc index a1fcaef7..f7730899 100644 --- a/src/linux_swap.cc +++ b/src/linux_swap.cc @@ -34,8 +34,7 @@ FS linux_swap::get_filesystem_support() fs .move = GParted::FS::EXTERNAL ; } - if ( ! Glib::find_program_in_path( "dd" ) .empty() ) - fs .copy = GParted::FS::EXTERNAL ; + fs .copy = GParted::FS::GPARTED ; return fs ; } @@ -74,20 +73,7 @@ bool linux_swap::Copy( const Glib::ustring & src_part_path, const Glib::ustring & dest_part_path, std::vector & operation_details ) { - operation_details .push_back( OperationDetails( - String::ucompose( _("copy contents of %1 to %2"), src_part_path, dest_part_path ) ) ) ; - - if ( ! execute_command( "dd bs=8192 if=" + src_part_path + " of=" + dest_part_path, - operation_details .back() .sub_details ) ) - { - operation_details .back() .status = OperationDetails::SUCCES ; - return true ; - } - else - { - operation_details .back() .status = OperationDetails::ERROR ; - return false ; - } + return true ; } bool linux_swap::Check_Repair( const Partition & partition, std::vector & operation_details ) diff --git a/src/ntfs.cc b/src/ntfs.cc index 6af93937..e52b68d6 100644 --- a/src/ntfs.cc +++ b/src/ntfs.cc @@ -138,9 +138,6 @@ bool ntfs::Copy( const Glib::ustring & src_part_path, const Glib::ustring & dest_part_path, std::vector & operation_details ) { - operation_details .push_back( OperationDetails( - String::ucompose( _("copy contents of %1 to %2"), src_part_path, dest_part_path ) ) ) ; - if ( ! execute_command( "ntfsclone -f --overwrite " + dest_part_path + " " + src_part_path, operation_details .back() .sub_details ) ) { diff --git a/src/reiser4.cc b/src/reiser4.cc index 9ed38711..f7f1da27 100644 --- a/src/reiser4.cc +++ b/src/reiser4.cc @@ -35,8 +35,7 @@ FS reiser4::get_filesystem_support() if ( ! Glib::find_program_in_path( "fsck.reiser4" ) .empty() ) fs .check = GParted::FS::EXTERNAL ; - if ( ! Glib::find_program_in_path( "dd" ) .empty() ) - fs .copy = GParted::FS::EXTERNAL ; + fs .copy = GParted::FS::GPARTED ; /* * IT SEEMS RESIZE AND COPY AREN'T IMPLEMENTED YET IN THE TOOLS... @@ -96,20 +95,7 @@ bool reiser4::Copy( const Glib::ustring & src_part_path, const Glib::ustring & dest_part_path, std::vector & operation_details ) { - operation_details .push_back( OperationDetails( - String::ucompose( _("copy contents of %1 to %2"), src_part_path, dest_part_path ) ) ) ; - - if ( ! execute_command( "dd bs=8192 if=" + src_part_path + " of=" + dest_part_path, - operation_details .back() .sub_details ) ) - { - operation_details .back() .status = OperationDetails::SUCCES ; - return true ; - } - else - { - operation_details .back() .status = OperationDetails::ERROR ; - return false ; - } + return true ; } bool reiser4::Check_Repair( const Partition & partition, std::vector & operation_details ) diff --git a/src/reiserfs.cc b/src/reiserfs.cc index 24825997..64b5bc72 100644 --- a/src/reiserfs.cc +++ b/src/reiserfs.cc @@ -39,15 +39,12 @@ FS reiserfs::get_filesystem_support() if ( ! Glib::find_program_in_path( "resize_reiserfs" ) .empty() && fs .check ) { fs .grow = GParted::FS::EXTERNAL ; + fs .copy = GParted::FS::GPARTED ; if ( fs .read ) //needed to determine a min filesystemsize.. fs .shrink = GParted::FS::EXTERNAL ; } - //we need to call resize_reiserfs after a copy to get proper used/unused - if ( ! Glib::find_program_in_path( "dd" ) .empty() && fs .grow ) - fs .copy = GParted::FS::EXTERNAL ; - fs .MIN = 32 * MEBIBYTE ; return fs ; @@ -109,8 +106,9 @@ bool reiserfs::Resize( const Partition & partition_new, str_temp += Utils::num_to_str( Utils::round( Utils::sector_to_unit( partition_new .get_length() - cylinder_size, GParted::UNIT_BYTE ) ), true ) ; } - - if ( ! execute_command( str_temp, operation_details .back() .sub_details ) ) + + exit_status = execute_command( str_temp, operation_details .back() .sub_details ) ; + if ( exit_status == 0 || exit_status == 256 ) { operation_details .back() .status = OperationDetails::SUCCES ; return true ; @@ -126,20 +124,7 @@ bool reiserfs::Copy( const Glib::ustring & src_part_path, const Glib::ustring & dest_part_path, std::vector & operation_details ) { - operation_details .push_back( OperationDetails( - String::ucompose( _("copy contents of %1 to %2"), src_part_path, dest_part_path ) ) ) ; - - if ( ! execute_command( "dd bs=8192 if=" + src_part_path + " of=" + dest_part_path, - operation_details .back() .sub_details ) ) - { - operation_details .back() .status = OperationDetails::SUCCES ; - return true ; - } - else - { - operation_details .back() .status = OperationDetails::ERROR ; - return false ; - } + return true ; } bool reiserfs::Check_Repair( const Partition & partition, std::vector & operation_details ) diff --git a/src/xfs.cc b/src/xfs.cc index 9abaef3b..9ee1635d 100644 --- a/src/xfs.cc +++ b/src/xfs.cc @@ -203,9 +203,6 @@ bool xfs::Copy( const Glib::ustring & src_part_path, const Glib::ustring & dest_part_path, std::vector & operation_details ) { - operation_details .push_back( OperationDetails( - String::ucompose( _("copy contents of %1 to %2"), src_part_path, dest_part_path ) ) ) ; - bool return_value = false ; Glib::ustring error ; Glib::ustring SRC = Glib::get_tmp_dir() + "/gparted_tmp_xfs_src_mountpoint" ;