Remember result of searching the PATH for the hdparm command (#751251)

Previously on every refresh for every device, GParted was searching the
PATH to discover if the hdparm command existed.  Stracing GParted showed
that calling Glib::find_program_in_path("hdparm") made the following OS
calls:
    access("/usr/lib64/qt-3.3/bin/hdparm", X_OK) = -1 ENOENT (No such file or directory)
    access("/usr/local/sbin/hdparm", X_OK) = -1 ENOENT (No such file or directory)
    access("/usr/local/bin/hdparm", X_OK) = -1 ENOENT (No such file or directory)
    access("/sbin/hdparm", X_OK) = 0
    getuid()                    = 0
    stat("/sbin/hdparm", {st_mode=S_IFREG|0755, st_size=137, ...}) = 0
    stat("/sbin/hdparm", {st_mode=S_IFREG|0755, st_size=137, ...}) = 0

The Linux VFS is very fast but repeatedly doing this is wasteful.
Remember the result of searching the PATH for the hdparm command at
startup and refresh this when the [Rescan For Supported Actions] button
is pressed in the File System Support dialog.  This is the same as
GParted already does for file system specific commands and their
capabilities.

Bug 751251 - Show serial number in device information
This commit is contained in:
Mike Fleetwood 2015-06-30 12:14:20 +01:00 committed by Curtis Gedak
parent 4fce7cd5ee
commit 54d0e3d056
3 changed files with 15 additions and 1 deletions

View File

@ -35,6 +35,7 @@ public:
GParted_Core() ;
~GParted_Core() ;
static void find_supported_core();
void find_supported_filesystems() ;
void set_user_devices( const std::vector<Glib::ustring> & user_devices ) ;
void set_devices( std::vector<Device> & devices ) ;

View File

@ -75,6 +75,8 @@ namespace GParted
static std::map< Glib::ustring, std::vector<Glib::ustring> > mount_info ;
static std::map< Glib::ustring, std::vector<Glib::ustring> > fstab_info ;
static bool hdparm_found = false;
GParted_Core::GParted_Core()
{
thread_status_message = "" ;
@ -92,6 +94,8 @@ GParted_Core::GParted_Core()
std::cout << "libparted : " << ped_get_version() << std::endl ;
std::cout << "======================" << std::endl ;
find_supported_core();
//initialize file system list
init_filesystems() ;
@ -99,6 +103,11 @@ GParted_Core::GParted_Core()
find_supported_filesystems() ;
}
void GParted_Core::find_supported_core()
{
hdparm_found = ! Glib::find_program_in_path( "hdparm" ).empty();
}
void GParted_Core::find_supported_filesystems()
{
std::map< FILESYSTEM, FileSystem * >::iterator f ;
@ -1182,7 +1191,7 @@ Glib::ustring GParted_Core::get_partition_path( PedPartition * lp_partition )
void GParted_Core::set_device_serial_number( Device & device )
{
if ( Glib::find_program_in_path( "hdparm" ).empty() )
if ( ! hdparm_found )
// Serial number left blank when the hdparm command is not installed.
return;

View File

@ -1474,6 +1474,10 @@ void Win_GParted::menu_gparted_features()
dialog .load_filesystems( gparted_core .get_filesystems() ) ;
while ( dialog .run() == Gtk::RESPONSE_OK )
{
// Button [Rescan For Supported Actions] pressed in the dialog. Rescan
// for available core and file system specific commands and update the
// view accordingly in the dialog.
GParted_Core::find_supported_core();
gparted_core .find_supported_filesystems() ;
dialog .load_filesystems( gparted_core .get_filesystems() ) ;