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

cmdline/apt-cdrom.cc: add --auto-detect

Michael Vogt лет назад: 16
Родитель
Сommit
169413dcf1
3 измененных файлов с 67 добавлено и 4 удалено
  1. 2 1
      apt-pkg/cdrom.cc
  2. 64 3
      cmdline/apt-cdrom.cc
  3. 1 0
      debian/apt.dirs

+ 2 - 1
apt-pkg/cdrom.cc

@@ -921,6 +921,7 @@ pkgUdevCdromDevices::Scan()                                             /*{{{*/
 
 pkgUdevCdromDevices::~pkgUdevCdromDevices()                             /*{{{*/
 { 
-   dlclose(libudev_handle);
+   if (libudev_handle != NULL)
+      dlclose(libudev_handle);
 }
 									/*}}}*/

+ 64 - 3
cmdline/apt-cdrom.cc

@@ -98,6 +98,39 @@ OpProgress* pkgCdromTextStatus::GetOpProgress()
    return &Progress; 
 };
 									/*}}}*/
+// SetupAutoDetect       						/*{{{*/
+bool AutoDetectCdrom(pkgUdevCdromDevices &UdevCdroms, 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 {
+      MountCdrom("/var/lib/apt/media", v[i].DeviceName);
+      MountCdrom("/var/lib/apt/media", v[i].DeviceName);
+      _config->Set("Acquire::cdrom::mount", "/var/lib/apt/media");
+      _config->Set("APT::CDROM::NoMount", true);
+   }
+   i++;
+
+   return true;
+}
+									/*}}}*/
+
 // DoAdd - Add a new CDROM						/*{{{*/
 // ---------------------------------------------------------------------
 /* This does the main add bit.. We show some status and things. The
@@ -106,12 +139,25 @@ OpProgress* pkgCdromTextStatus::GetOpProgress()
    verify them. Then rewrite the database files */
 bool DoAdd(CommandLine &)
 {
-   bool res = false;
+   pkgUdevCdromDevices UdevCdroms;
    pkgCdromTextStatus log;
    pkgCdrom cdrom;
-   res = cdrom.Add(&log);
+   bool res = false;
+
+   bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect");
+   int count = 0;
+   
+   if (AutoDetect && UdevCdroms.Dlopen())
+   {
+      while (AutoDetectCdrom(UdevCdroms, count))
+	 res &= cdrom.Add(&log);
+   } else {
+      res = cdrom.Add(&log);
+   }
+
    if(res)
       cout << _("Repeat this process for the rest of the CDs in your set.") << endl;
+
    return res;
 }
 									/*}}}*/
@@ -120,10 +166,24 @@ bool DoAdd(CommandLine &)
 /* */
 bool DoIdent(CommandLine &)
 {
+   pkgUdevCdromDevices UdevCdroms;
    string ident;
    pkgCdromTextStatus log;
    pkgCdrom cdrom;
-   return cdrom.Ident(ident, &log);
+   bool res = true;
+
+   bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect");
+   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					/*{{{*/
@@ -164,6 +224,7 @@ int main(int argc,const char *argv[])					/*{{{*/
 {
    CommandLine::Args Args[] = {
       {'h',"help","help",0},
+      {'a',"auto-detect","Acquire::cdrom::AutoDetect",0},
       {'v',"version","version",0},
       {'d',"cdrom","Acquire::cdrom::mount",CommandLine::HasArg},
       {'r',"rename","APT::CDROM::Rename",0},

+ 1 - 0
debian/apt.dirs

@@ -9,6 +9,7 @@ etc/logrotate.d
 var/cache/apt/archives/partial
 var/lib/apt/lists/partial
 var/lib/apt/periodic
+var/lib/apt/media
 var/log/apt
 usr/share/bug/apt
 usr/share/lintian/overrides