]> git.saurik.com Git - apt.git/blobdiff - cmdline/apt-cdrom.cc
warning: cast from type A to type B casts away qualifiers [-Wcast-qual]
[apt.git] / cmdline / apt-cdrom.cc
index 17a60ddcb38d597ec1a4ce35d9df9961acac7e52..9aaebefd7fa36568ae17a335c858aecf311f481d 100644 (file)
@@ -54,7 +54,7 @@ class pkgCdromTextStatus : public pkgCdromStatus                      /*{{{*/
 {
 protected:
    OpTextProgress Progress;
-   void Prompt(const char *Text); 
+   void Prompt(const char *Text);
    string PromptLine(const char *Text);
    bool AskCdromName(string &name);
 
@@ -64,12 +64,12 @@ public:
    virtual OpProgress* GetOpProgress();
 };
 
-void pkgCdromTextStatus::Prompt(const char *Text) 
+void pkgCdromTextStatus::Prompt(const char *Text)
 {
    char C;
    cout << Text << ' ' << flush;
    if (read(STDIN_FILENO,&C,1) < 0)
-      _error->Errno("pkgCdromTextStatus::Prompt", 
+      _error->Errno("pkgCdromTextStatus::Prompt",
                     "Failed to read from standard input (not a terminal?)");
    if (C != '\n')
       cout << endl;
@@ -78,43 +78,45 @@ void pkgCdromTextStatus::Prompt(const char *Text)
 string pkgCdromTextStatus::PromptLine(const char *Text)
 {
    cout << Text << ':' << endl;
-   
+
    string Res;
    getline(cin,Res);
    return Res;
 }
 
-bool pkgCdromTextStatus::AskCdromName(string &name) 
+bool pkgCdromTextStatus::AskCdromName(string &name)
 {
    cout << _("Please provide a name for this Disc, such as 'Debian 5.0.3 Disk 1'") << flush;
    name = PromptLine("");
-        
+
    return true;
 }
-   
 
-void pkgCdromTextStatus::Update(string text, int current) 
+
+void pkgCdromTextStatus::Update(string text, int current)
 {
    if(text.size() > 0)
       cout << text << flush;
 }
 
-bool pkgCdromTextStatus::ChangeCdrom() 
+bool pkgCdromTextStatus::ChangeCdrom()
 {
    Prompt(_("Please insert a Disc in the drive and press enter"));
    return true;
 }
 
-OpProgress* pkgCdromTextStatus::GetOpProgress() 
-{ 
-   return &Progress; 
-};
+OpProgress* pkgCdromTextStatus::GetOpProgress()
+{
+   return &Progress;
+}
                                                                        /*}}}*/
 // SetupAutoDetect                                                     /*{{{*/
-bool AutoDetectCdrom(pkgUdevCdromDevices &UdevCdroms, unsigned int &i)
+bool AutoDetectCdrom(pkgUdevCdromDevices &UdevCdroms, unsigned int &i, bool &automounted)
 {
    bool Debug =  _config->FindB("Debug::Acquire::cdrom", false);
 
+   automounted = false;
+
    vector<struct CdromDevice> v = UdevCdroms.Scan();
    if (i >= v.size())
       return false;
@@ -137,6 +139,8 @@ bool AutoDetectCdrom(pkgUdevCdromDevices &UdevCdroms, unsigned int &i)
         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());
+      else
+        automounted = true;
       _config->Set("Acquire::cdrom::mount", AptMountPoint);
       _config->Set("APT::CDROM::NoMount", true);
    }
@@ -160,17 +164,35 @@ bool DoAdd(CommandLine &)
 
    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))
-        res &= cdrom.Add(&log);
-   if (count == 0) {
-      res = cdrom.Add(&log);
-      if (res == false) {
-         _error->Error("%s", _(W_NO_CDROM_FOUND));
+      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(res)
+   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;
@@ -187,18 +209,38 @@ bool DoIdent(CommandLine &)
    pkgCdrom cdrom;
    bool res = true;
 
-   bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect");
+   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))
-        res &= cdrom.Ident(ident, &log);
-   if (count == 0) {
-      res = cdrom.Ident(ident, &log);
-      if (res == false) {
-         _error->Error("%s", _(W_NO_CDROM_FOUND));
+      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;
 }
                                                                        /*}}}*/