]> git.saurik.com Git - apt.git/commitdiff
methods/cdrom.cc: move the scan into the loop that waits for a CD
authorMichael Vogt <michael.vogt@ubuntu.com>
Wed, 22 Jul 2009 16:32:08 +0000 (18:32 +0200)
committerMichael Vogt <michael.vogt@ubuntu.com>
Wed, 22 Jul 2009 16:32:08 +0000 (18:32 +0200)
apt-pkg/cdrom.cc
apt-pkg/cdrom.h
methods/cdrom.cc

index 517efa180c4cec3e5b9cafc82b7b4a4043e9832e..157f0ea3c2f3bbebfff5ee7f93a0e593e97f104d 100644 (file)
@@ -847,7 +847,7 @@ bool pkgCdrom::Add(pkgCdromStatus *log)
 
 
 pkgUdevCdromDevices::pkgUdevCdromDevices() 
-  : libudev_handle(NULL)
+   : libudev_handle(NULL), Dlopened(false)
 {
 
 }
@@ -855,6 +855,10 @@ pkgUdevCdromDevices::pkgUdevCdromDevices()
 bool
 pkgUdevCdromDevices::Dlopen()
 {
+   // alread open
+   if(Dlopened)
+      return true;
+
    // see if we can get libudev
    void *h = ::dlopen("libudev.so.0", RTLD_LAZY);
    if(h == NULL)
@@ -874,6 +878,7 @@ pkgUdevCdromDevices::Dlopen()
    udev_list_entry_get_next = (udev_list_entry* (*)(udev_list_entry*))dlsym(h, "udev_list_entry_get_next");
    udev_device_get_property_value = (const char* (*)(udev_device *, const char *))dlsym(h, "udev_device_get_property_value");
 
+   Dlopened = true;
    return true;
 }
 
index 13e7203f41c7016e67cebd3cc97e76b4635ff33f..74667297e3cd1bfdc7f56c680fffaa5dc2d5a662 100644 (file)
@@ -77,6 +77,8 @@ struct CdromDevice
 
 class pkgUdevCdromDevices
 {
+ private:
+   bool Dlopened;
  protected:
    // libudev dlopen stucture
    void *libudev_handle;
index cd0d4e5120dd2d5b50d3fe05ecd6d39d7d9d0653..a677022adc1869ecf6a8b3b6a53e35b29b33645a 100644 (file)
@@ -121,6 +121,8 @@ bool CDROMMethod::Fetch(FetchItem *Itm)
    FetchResult Res;
 
    bool Debug = _config->FindB("Debug::Acquire::cdrom",false);
+   if (Debug)
+      clog << "CDROMMethod::Fetch " << Itm->Uri << endl;
 
    /* All IMS queries are returned as a hit, CDROMs are readonly so 
       time stamps never change */
@@ -156,54 +158,63 @@ bool CDROMMethod::Fetch(FetchItem *Itm)
    }
 
    // We already have a CD inserted, but it is the wrong one
-   if (CurrentID.empty() == false && Database.Find("CD::" + CurrentID) != Get.Host)
+   if (CurrentID.empty() == false && 
+       CurrentID != "FAIL" &&
+       Database.Find("CD::" + CurrentID) != Get.Host)
    {
       Fail(_("Wrong CD-ROM"),true);
       return true;
    }
 
    CDROM = _config->FindDir("Acquire::cdrom::mount","/cdrom/");
+   if (Debug)
+      clog << "Looking for CDROM at " << CDROM << endl;
 
-   // auto-detect mode
-   if (CDROM == "apt-udev-auto/") 
+   if (CDROM[0] == '.')
+      CDROM= SafeGetCWD() + '/' + CDROM;
+   string NewID;
+   pkgUdevCdromDevices udev;
+
+   while (CurrentID.empty() == true)
    {
-      pkgUdevCdromDevices udev;
-      if(udev.Dlopen())
+      // hrm, ugly the loop here
+      if (CDROM == "apt-udev-auto/") 
       {
-        vector<struct CdromDevice> v = udev.Scan();
-        for (unsigned int i=0; i < v.size(); i++)
+        if(udev.Dlopen())
         {
-           if (!v[i].Mounted) 
+           vector<struct CdromDevice> v = udev.Scan();
+           for (unsigned int i=0; i < v.size(); i++)
            {
-              if (!FileExists("/media/apt"))
-                 mkdir("/media/apt", 0755);
-              if(MountCdrom("/media/apt", v[i].DeviceName)
+              if (Debug)
+                 clog << "Have cdrom device " << v[i].DeviceName << endl;
+              if (!v[i].Mounted
               {
-                 if (IsCorrectCD(Get, "/media/apt"))
+                 if (!FileExists("/media/apt"))
+                    mkdir("/media/apt", 0755);
+                 if(MountCdrom("/media/apt", v[i].DeviceName)) 
+                 {
+                    if (IsCorrectCD(Get, "/media/apt"))
+                    {
+                       MountedByApt = true;
+                       CDROM = "/media/apt";
+                       break;
+                    } else {
+                       UnmountCdrom("/media/apt");
+                    }
+                 }
+              } else {
+                 if (IsCorrectCD(Get, v[i].MountPath))
                  {
-                    MountedByApt = true;
-                    CDROM = "/media/apt";
+                    CDROM = v[i].MountPath;
                     break;
-                 } else {
-                    UnmountCdrom("/media/apt");
                  }
               }
-           } else {
-              if (IsCorrectCD(Get, v[i].MountPath))
-              {
-                 CDROM = v[i].MountPath;
-                 break;
-              }
            }
+        } else {
+           _error->WarningE("udev.Dlopen() failed","foo");
         }
       }
-   }
 
-   if (CDROM[0] == '.')
-      CDROM= SafeGetCWD() + '/' + CDROM;
-   string NewID;
-   while (CurrentID.empty() == true)
-   {
       bool Hit = false;
       if(!IsMounted(CDROM))
         MountedByApt = MountCdrom(CDROM);