Kaynağa Gözat

methods/cdrom.cc: move the scan into the loop that waits for a CD

Michael Vogt 17 yıl önce
ebeveyn
işleme
49cb36fc56
3 değiştirilmiş dosya ile 47 ekleme ve 29 silme
  1. 6 1
      apt-pkg/cdrom.cc
  2. 2 0
      apt-pkg/cdrom.h
  3. 39 28
      methods/cdrom.cc

+ 6 - 1
apt-pkg/cdrom.cc

@@ -847,7 +847,7 @@ bool pkgCdrom::Add(pkgCdromStatus *log)
 
 
 
 
 pkgUdevCdromDevices::pkgUdevCdromDevices() 
 pkgUdevCdromDevices::pkgUdevCdromDevices() 
-  : libudev_handle(NULL)
+   : libudev_handle(NULL), Dlopened(false)
 {
 {
 
 
 }
 }
@@ -855,6 +855,10 @@ pkgUdevCdromDevices::pkgUdevCdromDevices()
 bool
 bool
 pkgUdevCdromDevices::Dlopen()
 pkgUdevCdromDevices::Dlopen()
 {
 {
+   // alread open
+   if(Dlopened)
+      return true;
+
    // see if we can get libudev
    // see if we can get libudev
    void *h = ::dlopen("libudev.so.0", RTLD_LAZY);
    void *h = ::dlopen("libudev.so.0", RTLD_LAZY);
    if(h == NULL)
    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_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");
    udev_device_get_property_value = (const char* (*)(udev_device *, const char *))dlsym(h, "udev_device_get_property_value");
 
 
+   Dlopened = true;
    return true;
    return true;
 }
 }
 
 

+ 2 - 0
apt-pkg/cdrom.h

@@ -77,6 +77,8 @@ struct CdromDevice
 
 
 class pkgUdevCdromDevices
 class pkgUdevCdromDevices
 {
 {
+ private:
+   bool Dlopened;
  protected:
  protected:
    // libudev dlopen stucture
    // libudev dlopen stucture
    void *libudev_handle;
    void *libudev_handle;

+ 39 - 28
methods/cdrom.cc

@@ -121,6 +121,8 @@ bool CDROMMethod::Fetch(FetchItem *Itm)
    FetchResult Res;
    FetchResult Res;
 
 
    bool Debug = _config->FindB("Debug::Acquire::cdrom",false);
    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 
    /* All IMS queries are returned as a hit, CDROMs are readonly so 
       time stamps never change */
       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
    // 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);
       Fail(_("Wrong CD-ROM"),true);
       return true;
       return true;
    }
    }
 
 
    CDROM = _config->FindDir("Acquire::cdrom::mount","/cdrom/");
    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;
 		     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;
       bool Hit = false;
       if(!IsMounted(CDROM))
       if(!IsMounted(CDROM))
 	 MountedByApt = MountCdrom(CDROM);
 	 MountedByApt = MountCdrom(CDROM);