Просмотр исходного кода

merge 1695..1701 from the lp:~mvo/apt/mvo branch

Michael Vogt лет назад: 16
Родитель
Сommit
93adae194b
6 измененных файлов с 94 добавлено и 13 удалено
  1. 2 3
      apt-pkg/cdrom.cc
  2. 2 1
      apt-pkg/init.cc
  3. 67 3
      cmdline/apt-cdrom.cc
  4. 5 0
      debian/changelog
  5. 11 0
      doc/examples/configure-index
  6. 7 6
      methods/cdrom.cc

+ 2 - 3
apt-pkg/cdrom.cc

@@ -829,8 +829,6 @@ bool pkgCdrom::Add(pkgCdromStatus *log)					/*{{{*/
       }
       }
    }
    }
 
 
-   
-
    // Unmount and finish
    // Unmount and finish
    if (_config->FindB("APT::CDROM::NoMount",false) == false) {
    if (_config->FindB("APT::CDROM::NoMount",false) == false) {
       log->Update(_("Unmounting CD-ROM...\n"), STEP_LAST);
       log->Update(_("Unmounting CD-ROM...\n"), STEP_LAST);
@@ -921,6 +919,7 @@ pkgUdevCdromDevices::Scan()                                             /*{{{*/
 
 
 pkgUdevCdromDevices::~pkgUdevCdromDevices()                             /*{{{*/
 pkgUdevCdromDevices::~pkgUdevCdromDevices()                             /*{{{*/
 { 
 { 
-   dlclose(libudev_handle);
+   if (libudev_handle != NULL)
+      dlclose(libudev_handle);
 }
 }
 									/*}}}*/
 									/*}}}*/

+ 2 - 1
apt-pkg/init.cc

@@ -65,11 +65,12 @@ bool pkgInitConfig(Configuration &Cnf)
    Cnf.Set("Dir::Etc::vendorlist","vendors.list");
    Cnf.Set("Dir::Etc::vendorlist","vendors.list");
    Cnf.Set("Dir::Etc::vendorparts","vendors.list.d");
    Cnf.Set("Dir::Etc::vendorparts","vendors.list.d");
    Cnf.Set("Dir::Etc::main","apt.conf");
    Cnf.Set("Dir::Etc::main","apt.conf");
-   Cnf.Set("Dir::ETc::netrc", "auth.conf");
+   Cnf.Set("Dir::Etc::netrc", "auth.conf");
    Cnf.Set("Dir::Etc::parts","apt.conf.d");
    Cnf.Set("Dir::Etc::parts","apt.conf.d");
    Cnf.Set("Dir::Etc::preferences","preferences");
    Cnf.Set("Dir::Etc::preferences","preferences");
    Cnf.Set("Dir::Etc::preferencesparts","preferences.d");
    Cnf.Set("Dir::Etc::preferencesparts","preferences.d");
    Cnf.Set("Dir::Bin::methods","/usr/lib/apt/methods");
    Cnf.Set("Dir::Bin::methods","/usr/lib/apt/methods");
+   Cnf.Set("Dir::Media::MountPath","/media/apt");
 
 
    // State   
    // State   
    Cnf.Set("Dir::Log","var/log/apt");
    Cnf.Set("Dir::Log","var/log/apt");

+ 67 - 3
cmdline/apt-cdrom.cc

@@ -98,6 +98,42 @@ OpProgress* pkgCdromTextStatus::GetOpProgress()
    return &Progress; 
    return &Progress; 
 };
 };
 									/*}}}*/
 									/*}}}*/
+// SetupAutoDetect       						/*{{{*/
+bool AutoDetectCdrom(pkgUdevCdromDevices &UdevCdroms, unsigned int &i)
+{
+   bool Debug =  _config->FindB("Debug::Acquire::cdrom", false);
+
+   vector<struct CdromDevice> v = UdevCdroms.Scan();
+   if (i >= v.size())
+      return false;
+
+   if (Debug)
+      clog << "Looking at devce " << i
+	   << " DeviveName: " << v[i].DeviceName 
+	   << " IsMounted: '" << v[i].Mounted << "'"
+	   << " MountPoint: '" << v[i].MountPath << "'"
+	   << endl;
+
+   if (v[i].Mounted)
+   {
+      // set the right options
+      _config->Set("Acquire::cdrom::mount", v[i].MountPath);
+      _config->Set("APT::CDROM::NoMount", true);
+   } else {
+      string AptMountPoint = _config->FindDir("Dir::Media::MountPath");
+      if (!FileExists(AptMountPoint))
+	 mkdir(AptMountPoint.c_str(), 0750);
+      if(MountCdrom(AptMountPoint, v[i].DeviceName) == false)
+	 _error->Warning(_("Failed to mount '%s' to '%s'"), v[i].DeviceName.c_str(), AptMountPoint.c_str());
+      _config->Set("Acquire::cdrom::mount", AptMountPoint);
+      _config->Set("APT::CDROM::NoMount", true);
+   }
+   i++;
+
+   return true;
+}
+									/*}}}*/
+
 // DoAdd - Add a new CDROM						/*{{{*/
 // DoAdd - Add a new CDROM						/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* This does the main add bit.. We show some status and things. The
 /* This does the main add bit.. We show some status and things. The
@@ -106,12 +142,25 @@ OpProgress* pkgCdromTextStatus::GetOpProgress()
    verify them. Then rewrite the database files */
    verify them. Then rewrite the database files */
 bool DoAdd(CommandLine &)
 bool DoAdd(CommandLine &)
 {
 {
-   bool res = false;
+   pkgUdevCdromDevices UdevCdroms;
    pkgCdromTextStatus log;
    pkgCdromTextStatus log;
    pkgCdrom cdrom;
    pkgCdrom cdrom;
-   res = cdrom.Add(&log);
+   bool res = true;
+
+   bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect");
+   unsigned int count = 0;
+   
+   if (AutoDetect && UdevCdroms.Dlopen())
+   {
+      while (AutoDetectCdrom(UdevCdroms, count))
+	 res &= cdrom.Add(&log);
+   } else {
+      res = cdrom.Add(&log);
+   }
+
    if(res)
    if(res)
       cout << _("Repeat this process for the rest of the CDs in your set.") << endl;
       cout << _("Repeat this process for the rest of the CDs in your set.") << endl;
+
    return res;
    return res;
 }
 }
 									/*}}}*/
 									/*}}}*/
@@ -120,10 +169,24 @@ bool DoAdd(CommandLine &)
 /* */
 /* */
 bool DoIdent(CommandLine &)
 bool DoIdent(CommandLine &)
 {
 {
+   pkgUdevCdromDevices UdevCdroms;
    string ident;
    string ident;
    pkgCdromTextStatus log;
    pkgCdromTextStatus log;
    pkgCdrom cdrom;
    pkgCdrom cdrom;
-   return cdrom.Ident(ident, &log);
+   bool res = true;
+
+   bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect");
+   unsigned int count = 0;
+   
+   if (AutoDetect && UdevCdroms.Dlopen())
+   {
+      while (AutoDetectCdrom(UdevCdroms, count))
+	 res &= cdrom.Ident(ident, &log);
+   } else {
+      return cdrom.Ident(ident, &log);
+   }
+ 
+   return res;
 }
 }
 									/*}}}*/
 									/*}}}*/
 // ShowHelp - Show the help screen					/*{{{*/
 // ShowHelp - Show the help screen					/*{{{*/
@@ -164,6 +227,7 @@ int main(int argc,const char *argv[])					/*{{{*/
 {
 {
    CommandLine::Args Args[] = {
    CommandLine::Args Args[] = {
       {'h',"help","help",0},
       {'h',"help","help",0},
+      {'a',"auto-detect","Acquire::cdrom::AutoDetect",0},
       {'v',"version","version",0},
       {'v',"version","version",0},
       {'d',"cdrom","Acquire::cdrom::mount",CommandLine::HasArg},
       {'d',"cdrom","Acquire::cdrom::mount",CommandLine::HasArg},
       {'r',"rename","APT::CDROM::Rename",0},
       {'r',"rename","APT::CDROM::Rename",0},

+ 5 - 0
debian/changelog

@@ -4,11 +4,16 @@ apt (0.7.25.2) UNRELEASED; urgency=low
   * apt-pkg/contrib/cdromutl.cc:
   * apt-pkg/contrib/cdromutl.cc:
     - fix UnmountCdrom() fails, give it a bit more time and try
     - fix UnmountCdrom() fails, give it a bit more time and try
       the umount again
       the umount again
+  * apt-pkg/cdrom.cc:
+    - fix crash in pkgUdevCdromDevices
   * methods/cdrom.cc:
   * methods/cdrom.cc:
     - fixes in multi cdrom setup code
     - fixes in multi cdrom setup code
     - add new "Acquire::cdrom::AutoDetect" config that enables/disables
     - add new "Acquire::cdrom::AutoDetect" config that enables/disables
       the dlopen of libudev for automatic cdrom detection. Off by default
       the dlopen of libudev for automatic cdrom detection. Off by default
       currently, feedback/testing welcome
       currently, feedback/testing welcome
+  * cmdline/apt-cdrom.cc:
+    - add new --auto-detect option that uses libudev to figure out
+      the cdrom/mount-point
   * cmdline/apt-mark:
   * cmdline/apt-mark:
     - merge fix from Gene Cash that supports markauto for
     - merge fix from Gene Cash that supports markauto for
       packages that are not in the extended_states file yet
       packages that are not in the extended_states file yet

+ 11 - 0
doc/examples/configure-index

@@ -248,6 +248,10 @@ Acquire
   
   
   cdrom
   cdrom
   {
   {
+    // do auto detection of the cdrom mountpoint
+    AutoDetect "true";
+    
+    // cdrom mountpoint (needs to be defined in fstab if AutoDetect is not used)
     mount "/cdrom";
     mount "/cdrom";
 
 
     // You need the trailing slash!
     // You need the trailing slash!
@@ -326,6 +330,13 @@ Dir "/"
   Log "var/log/apt" {
   Log "var/log/apt" {
 	Terminal "term.log";
 	Terminal "term.log";
   };
   };
+
+  // Media 
+  Media 
+  {
+	// Media AutoDetect mount path
+	MountPath "/media/apt";
+  };
 };
 };
 
 
 // Things that effect the APT dselect method
 // Things that effect the APT dselect method

+ 7 - 6
methods/cdrom.cc

@@ -116,23 +116,24 @@ bool CDROMMethod::AutoDetectAndMount(const URI Get, string &NewID)
       return false;
       return false;
 
 
    // check if we have the mount point
    // check if we have the mount point
-   if (!FileExists("/media/apt"))
-      mkdir("/media/apt", 0755);
+   string AptMountPoint = _config->FindDir("Dir::Media::MountPath");
+   if (!FileExists(AptMountPoint))
+      mkdir(AptMountPoint.c_str(), 0750);
 
 
    // now try mounting
    // now try mounting
    for (unsigned int i=0; i < v.size(); i++)
    for (unsigned int i=0; i < v.size(); i++)
    {
    {
       if (!v[i].Mounted)
       if (!v[i].Mounted)
       {
       {
-	 if(MountCdrom("/media/apt", v[i].DeviceName)) 
+	 if(MountCdrom(AptMountPoint, v[i].DeviceName)) 
 	 {
 	 {
-	    if (IsCorrectCD(Get, "/media/apt", NewID))
+	    if (IsCorrectCD(Get, AptMountPoint, NewID))
 	    {
 	    {
 	       MountedByApt = true;
 	       MountedByApt = true;
-	       CDROM = "/media/apt";
+	       CDROM = AptMountPoint;
 	       return true;
 	       return true;
 	    } else {
 	    } else {
-	       UnmountCdrom("/media/apt");
+	       UnmountCdrom(AptMountPoint);
 	    }
 	    }
 	 }
 	 }
       }
       }