|
|
@@ -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;
|
|
|
|
|
|
@@ -103,143 +97,111 @@ 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;
|
|
|
}
|
|
|
/*}}}*/
|