summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/cdrom.cc26
-rw-r--r--cmdline/apt-cdrom.cc76
2 files changed, 83 insertions, 19 deletions
diff --git a/apt-pkg/cdrom.cc b/apt-pkg/cdrom.cc
index a5668a50a..f577e3572 100644
--- a/apt-pkg/cdrom.cc
+++ b/apt-pkg/cdrom.cc
@@ -577,8 +577,30 @@ bool pkgCdrom::Ident(string &ident, pkgCdromStatus *log) /*{{{*/
CDROM.c_str());
log->Update(msg.str());
}
- if (MountCdrom(CDROM) == false)
- return _error->Error("Failed to mount the cdrom.");
+
+ // Unmount the CD and get the user to put in the one they want
+ if (_config->FindB("APT::CDROM::NoMount",false) == false)
+ {
+ if(log != NULL)
+ log->Update(_("Unmounting CD-ROM\n"), STEP_UNMOUNT);
+ UnmountCdrom(CDROM);
+
+ if(log != NULL)
+ {
+ log->Update(_("Waiting for disc...\n"), STEP_WAIT);
+ if(!log->ChangeCdrom()) {
+ // user aborted
+ return false;
+ }
+ }
+
+ // Mount the new CDROM
+ if(log != NULL)
+ log->Update(_("Mounting CD-ROM...\n"), STEP_MOUNT);
+
+ if (MountCdrom(CDROM) == false)
+ return _error->Error("Failed to mount the cdrom.");
+ }
// Hash the CD to get an ID
if (log != NULL)
diff --git a/cmdline/apt-cdrom.cc b/cmdline/apt-cdrom.cc
index 17a60ddcb..20c6e8892 100644
--- a/cmdline/apt-cdrom.cc
+++ b/cmdline/apt-cdrom.cc
@@ -111,10 +111,12 @@ OpProgress* pkgCdromTextStatus::GetOpProgress()
};
/*}}}*/
// 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;
}
/*}}}*/