/*
** if to throw exception on eject errors or ignore them
*/
-#define REPORT_EJECT_ERRORS 1
+#define REPORT_EJECT_ERRORS 0
/*
** If defined to the full path of the eject utility,
PathInfo devnode( devnodePtr );
if ( devnode.isBlk() )
{
- MediaSource media( "cdrom", devnode.path().asString(), devnode.major(), devnode.minor() );
+ MediaSource media( "cdrom", devnode.path().asString(), devnode.devMajor(), devnode.devMinor() );
DBG << "Found (udev): " << media << std::endl;
detected.push_back( media );
}
PathInfo cdrinfo( "/dev/cdrom" );
if ( dvdinfo.isBlk() )
{
- MediaSource media( "cdrom", dvdinfo.path().asString(), dvdinfo.major(), dvdinfo.minor() );
+ MediaSource media( "cdrom", dvdinfo.path().asString(), dvdinfo.devMajor(), dvdinfo.devMinor() );
DBG << "Found (GUESS): " << media << std::endl;
detected.push_back( media );
}
if ( cdrinfo.isBlk()
- && ! ( cdrinfo.major() == dvdinfo.major() && cdrinfo.minor() == dvdinfo.minor() ) )
+ && ! ( cdrinfo.devMajor() == dvdinfo.devMajor() && cdrinfo.devMinor() == dvdinfo.devMinor() ) )
{
- MediaSource media( "cdrom", cdrinfo.path().asString(), cdrinfo.major(), cdrinfo.minor() );
+ MediaSource media( "cdrom", cdrinfo.path().asString(), cdrinfo.devMajor(), cdrinfo.devMinor() );
DBG << "Found (GUESS): " << media << std::endl;
detected.push_back( media );
}
PathInfo dinfo( device );
if ( dinfo.isBlk() )
{
- MediaSource media( "cdrom", device, dinfo.major(), dinfo.minor() );
+ MediaSource media( "cdrom", device, dinfo.devMajor(), dinfo.devMinor() );
if ( detected.empty() )
{
_devices.push_front( media ); // better try this than nothing
DBG << "skipping device " << it->name << endl;
continue;
}
- DBG << "trying device " << it->name << endl;
-
_lastdev_tried = count;
- bool valid( false );
+ // bnc#755815: _devices contains either devices passed as url option
+ // or autodetected ones. Accept both as long as they are block
+ // devices.
MediaSource temp( *it );
PathInfo dinfo( temp.name );
- if ( dinfo.isBlk() )
+ if ( ! dinfo.isBlk() )
{
- temp.maj_nr = dinfo.major();
- temp.min_nr = dinfo.minor();
-
- if ( detected.empty() )
- valid = true; // better try this than nothing
- else
- for ( const auto & d : detected )
- {
- if ( temp.equals( d ) )
- {
- valid = true;
- break;
- }
- }
- }
-
- if ( ! valid )
- {
- DBG << "skipping invalid device: " << it->name << endl;
- continue;
+ WAR << "skipping non block device: " << dinfo << endl;
+ continue;
}
+ DBG << "trying device " << dinfo << endl;
+ temp.maj_nr = dinfo.devMajor();
+ temp.min_nr = dinfo.devMinor();
MediaSourceRef media( new MediaSource(temp));
AttachedMedia ret( findAttachedMedia( media));
is_device = true;
}
- if( is_device && media->maj_nr == dev_info.major() &&
- media->min_nr == dev_info.minor())
+ if( is_device && media->maj_nr == dev_info.devMajor() &&
+ media->min_nr == dev_info.devMinor())
{
AttachPointRef ap( new AttachPoint(e->dir, false));
AttachedMedia am( media, ap);
// wait for /etc/mtab update ...
// (shouldn't be needed)
- int limit = 5;
+ int limit = 2;
while( !(mountsucceeded=isAttached()) && --limit)
{
+ WAR << "Wait for /proc/mounts update and retry...." << endl;
sleep(1);
}
//
// Asserted that media is not attached.
//
- void MediaCD::forceEject(const std::string & ejectDev)
+ void MediaCD::forceEject( const std::string & ejectDev_r )
{
+#if REPORT_EJECT_ERRORS
bool ejected = false;
+#endif
if ( ! isAttached() ) // no device mounted in this instance
{
// This also fills the _devices list on demand
DeviceList detected( detectDevices( _url.getScheme() == "dvd" ? true : false ) );
-
- DeviceList::iterator it;
- for( it = _devices.begin(); it != _devices.end(); ++it ) {
- MediaSourceRef media( new MediaSource( *it));
- if (media->name != ejectDev)
+ for_( it, _devices.begin(), _devices.end() )
+ {
+ MediaSourceRef media( new MediaSource( *it ) );
+ if ( media->name != ejectDev_r )
continue;
- bool valid=false;
- PathInfo dinfo(media->name);
- if( dinfo.isBlk())
- {
- media->maj_nr = dinfo.major();
- media->min_nr = dinfo.minor();
-
- DeviceList::const_iterator d( detected.begin());
- for( ; d != detected.end(); ++d)
- {
- if( media->equals( *d))
- {
- valid = true;
- break;
- }
- }
- }
- if( !valid)
- {
- DBG << "skipping invalid device: " << it->name << endl;
- continue;
- }
+ // bnc#755815: _devices contains either devices passed as url option
+ // or autodetected ones. Accept both as long as they are block
+ // devices.
+ PathInfo dinfo( media->name );
+ if( ! dinfo.isBlk() )
+ {
+ WAR << "skipping non block device: " << dinfo << endl;
+ continue;
+ }
+ DBG << "trying device " << dinfo << endl;
// FIXME: we have also to check if it is mounted in the system
AttachedMedia ret( findAttachedMedia( media));
- if( !ret.mediaSource)
+ if( !ret.mediaSource )
{
- forceRelaseAllMedia(media, false);
+ forceRelaseAllMedia( media, false );
if ( openTray( it->name ) )
{
+#if REPORT_EJECT_ERRORS
ejected = true;
+#endif
break; // on 1st success
}
}
}
}
+#if REPORT_EJECT_ERRORS
if( !ejected)
{
-#if REPORT_EJECT_ERRORS
ZYPP_THROW(MediaNotEjectedException());
-#endif
}
+#endif
}
///////////////////////////////////////////////////////////////////