X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/453b82a388013e522b3a1b9fcd6ed0810dab1f4f..d13f2ef5dd2cf41d7abd7f309a9e8965a77d2a63:/cmdline/apt-cdrom.cc

diff --git a/cmdline/apt-cdrom.cc b/cmdline/apt-cdrom.cc
index facb6002b..53efe65b8 100644
--- a/cmdline/apt-cdrom.cc
+++ b/cmdline/apt-cdrom.cc
@@ -34,12 +34,6 @@
 
 #include <apti18n.h>
 									/*}}}*/
-static const char *W_NO_CDROM_FOUND = \
-   N_("No CD-ROM could be auto-detected or found using "
-      "the default mount point.\n"
-      "You may try the --cdrom option to set the CD-ROM mount point. "
-      "See 'man apt-cdrom' for more "
-      "information about the CD-ROM auto-detection and mount point.");
 
 using namespace std;
 
@@ -98,148 +92,116 @@ bool pkgCdromTextStatus::ChangeCdrom()
    return true;
 }
 
-OpProgress* pkgCdromTextStatus::GetOpProgress()
+APT_CONST OpProgress* pkgCdromTextStatus::GetOpProgress()
 {
    return &Progress;
 }
 									/*}}}*/
-// SetupAutoDetect       						/*{{{*/
-static bool AutoDetectCdrom(pkgUdevCdromDevices &UdevCdroms, unsigned int &i, bool &automounted)
+// AddOrIdent - Add or Ident a CDROM					/*{{{*/
+static bool AddOrIdent(bool const Add)
 {
-   bool Debug =  _config->FindB("Debug::Acquire::cdrom", false);
+   pkgUdevCdromDevices UdevCdroms;
+   pkgCdromTextStatus log;
+   pkgCdrom cdrom;
 
-   automounted = false;
+   bool oneSuccessful = false;
+   bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect", true);
+   if (AutoDetect == true && UdevCdroms.Dlopen() == true)
+   {
+      bool const Debug = _config->FindB("Debug::Acquire::cdrom", false);
+      std::string const CDMount = _config->Find("Acquire::cdrom::mount");
+      bool const NoMount = _config->FindB("APT::CDROM::NoMount", false);
+      if (NoMount == false)
+	 _config->Set("APT::CDROM::NoMount", true);
+
+      vector<struct CdromDevice> const v = UdevCdroms.Scan();
+      for (std::vector<struct CdromDevice>::const_iterator cd = v.begin(); cd != v.end(); ++cd)
+      {
+	 if (Debug)
+	    clog << "Looking at device:"
+	       << "\tDeviveName: '" << cd->DeviceName << "'"
+	       << "\tIsMounted: '" << cd->Mounted << "'"
+	       << "\tMountPoint: '" << cd->MountPath << "'"
+	       << endl;
+
+	 std::string AptMountPoint;
+	 if (cd->Mounted)
+	    _config->Set("Acquire::cdrom::mount", cd->MountPath);
+	 else if (NoMount == true)
+	    continue;
+	 else
+	 {
+	    AptMountPoint = _config->FindDir("Dir::Media::MountPath");
+	    if (FileExists(AptMountPoint) == false)
+	       mkdir(AptMountPoint.c_str(), 0750);
+	    if(MountCdrom(AptMountPoint, cd->DeviceName) == false)
+	    {
+	       _error->Warning(_("Failed to mount '%s' to '%s'"), cd->DeviceName.c_str(), AptMountPoint.c_str());
+	       continue;
+	    }
+	    _config->Set("Acquire::cdrom::mount", AptMountPoint);
+	 }
 
-   vector<struct CdromDevice> v = UdevCdroms.Scan();
-   if (i >= v.size())
-      return false;
+	 _error->PushToStack();
+	 if (Add == true)
+	    oneSuccessful = cdrom.Add(&log);
+	 else
+	 {
+	    std::string id;
+	    oneSuccessful = cdrom.Ident(id, &log);
+	 }
+	 _error->MergeWithStack();
 
-   if (Debug)
-      clog << "Looking at devce " << i
-	   << " DeviveName: " << v[i].DeviceName 
-	   << " IsMounted: '" << v[i].Mounted << "'"
-	   << " MountPoint: '" << v[i].MountPath << "'"
-	   << endl;
+	 if (AptMountPoint.empty() == false)
+	    UnmountCdrom(AptMountPoint);
+      }
+      if (NoMount == false)
+	 _config->Set("APT::CDROM::NoMount", NoMount);
+      _config->Set("Acquire::cdrom::mount", CDMount);
+   }
 
-   if (v[i].Mounted)
+   // fallback if auto-detect didn't work
+   if (oneSuccessful == false)
    {
-      // 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());
+      _error->PushToStack();
+      if (Add == true)
+	 oneSuccessful = cdrom.Add(&log);
       else
-	 automounted = true;
-      _config->Set("Acquire::cdrom::mount", AptMountPoint);
-      _config->Set("APT::CDROM::NoMount", true);
+      {
+	 std::string id;
+	 oneSuccessful = cdrom.Ident(id, &log);
+      }
+      _error->MergeWithStack();
    }
-   i++;
 
-   return true;
+   if (oneSuccessful == false)
+      _error->Error("%s", _("No CD-ROM could be auto-detected or found using the default mount point.\n"
+      "You may try the --cdrom option to set the CD-ROM mount point.\n"
+      "See 'man apt-cdrom' for more information about the CD-ROM auto-detection and mount point."));
+   else if (Add == true)
+      cout << _("Repeat this process for the rest of the CDs in your set.") << endl;
+
+   return oneSuccessful;
 }
 									/*}}}*/
 // DoAdd - Add a new CDROM						/*{{{*/
 // ---------------------------------------------------------------------
 /* This does the main add bit.. We show some status and things. The
-   sequence is to mount/umount the CD, Ident it then scan it for package 
+   sequence is to mount/umount the CD, Ident it then scan it for package
    files and reduce that list. Then we copy over the package files and
    verify them. Then rewrite the database files */
 static bool DoAdd(CommandLine &)
 {
-   pkgUdevCdromDevices UdevCdroms;
-   pkgCdromTextStatus log;
-   pkgCdrom cdrom;
-   bool res = true;
-
-   bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect", true);
-   unsigned int count = 0;
-   string AptMountPoint = _config->FindDir("Dir::Media::MountPath");
-   bool automounted = false;
-   if (AutoDetect && UdevCdroms.Dlopen())
-      while (AutoDetectCdrom(UdevCdroms, count, automounted)) {
-	 if (count == 1) {
-	    // begin loop with res false to detect any success using OR
-	    res = false;
-	 }
-
-	 // dump any warnings/errors from autodetect
-	 if (_error->empty() == false)
-	    _error->DumpErrors();
-
-	 res |= cdrom.Add(&log);
-
-	 if (automounted)
-	    UnmountCdrom(AptMountPoint);
-
-	 // dump any warnings/errors from add/unmount
-	 if (_error->empty() == false)
-	    _error->DumpErrors();
-      }
-
-   if (count == 0)
-      res = cdrom.Add(&log);
-
-   if (res == false)
-      _error->Error("%s", _(W_NO_CDROM_FOUND));
-   else
-      cout << _("Repeat this process for the rest of the CDs in your set.") << endl;
-
-   return res;
+   return AddOrIdent(true);
 }
 									/*}}}*/
 // DoIdent - Ident a CDROM						/*{{{*/
-// ---------------------------------------------------------------------
-/* */
 static bool DoIdent(CommandLine &)
 {
-   pkgUdevCdromDevices UdevCdroms;
-   string ident;
-   pkgCdromTextStatus log;
-   pkgCdrom cdrom;
-   bool res = true;
-
-   bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect", true);
-
-   unsigned int count = 0;
-   string AptMountPoint = _config->FindDir("Dir::Media::MountPath");
-   bool automounted = false;
-   if (AutoDetect && UdevCdroms.Dlopen())
-      while (AutoDetectCdrom(UdevCdroms, count, automounted)) {
-	 if (count == 1) {
-	    // begin loop with res false to detect any success using OR
-	    res = false;
-	 }
-
-	 // dump any warnings/errors from autodetect
-	 if (_error->empty() == false)
-	    _error->DumpErrors();
-
-	 res |= cdrom.Ident(ident, &log);
-
-	 if (automounted)
-	    UnmountCdrom(AptMountPoint);
-
-	 // dump any warnings/errors from add/unmount
-	 if (_error->empty() == false)
-	    _error->DumpErrors();
-      }
-
-   if (count == 0)
-      res = cdrom.Ident(ident, &log);
-
-   if (res == false)
-      _error->Error("%s", _(W_NO_CDROM_FOUND));
-
-   return res;
+   return AddOrIdent(false);
 }
 									/*}}}*/
 // ShowHelp - Show the help screen					/*{{{*/
-// ---------------------------------------------------------------------
-/* */
 static bool ShowHelp(CommandLine &)
 {
    ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,PACKAGE_VERSION,
@@ -306,14 +268,12 @@ int main(int argc,const char *argv[])					/*{{{*/
       _config->Set("quiet","1");
    
    // Match the operation
-   CmdL.DispatchArg(Cmds);
+   bool returned = CmdL.DispatchArg(Cmds);
 
-   // Print any errors or warnings found during parsing
-   bool const Errors = _error->PendingError();
    if (_config->FindI("quiet",0) > 0)
       _error->DumpErrors();
    else
       _error->DumpErrors(GlobalError::DEBUG);
-   return Errors == true ? 100 : 0;
+   return returned == true ? 0 : 100;
 }
 									/*}}}*/