Imported Upstream version 14.35.0
[platform/upstream/libzypp.git] / zypp / media / MediaCD.cc
index 7986421..03f2be9 100644 (file)
@@ -41,7 +41,7 @@ extern "C"
 /*
 ** 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,
@@ -127,7 +127,7 @@ namespace zypp
          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 );
          }
@@ -335,14 +335,14 @@ namespace zypp
       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 );
       }
@@ -364,7 +364,7 @@ namespace zypp
       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
@@ -439,37 +439,22 @@ namespace zypp
         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));
 
@@ -505,8 +490,8 @@ namespace zypp
             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);
@@ -557,9 +542,10 @@ namespace zypp
 
           // 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);
           }
 
@@ -669,62 +655,53 @@ namespace zypp
   //
   // 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
   }
 
   ///////////////////////////////////////////////////////////////////