X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/a6418a4b93376e0e4acf36e88eb1d0ec41e024df..c4d749b78a46e69887ec9662851f180e587f2d34:/methods/cdrom.cc diff --git a/methods/cdrom.cc b/methods/cdrom.cc index cd0d4e512..74e2ecc6b 100644 --- a/methods/cdrom.cc +++ b/methods/cdrom.cc @@ -8,17 +8,20 @@ ##################################################################### */ /*}}}*/ // Include Files /*{{{*/ +#include <config.h> + #include <apt-pkg/acquire-method.h> #include <apt-pkg/cdrom.h> #include <apt-pkg/cdromutl.h> #include <apt-pkg/error.h> #include <apt-pkg/configuration.h> #include <apt-pkg/fileutl.h> +#include <apt-pkg/strutl.h> #include <apt-pkg/hashes.h> +#include <string> +#include <vector> #include <sys/stat.h> -#include <unistd.h> -#include <dlfcn.h> #include <iostream> #include <apti18n.h> @@ -29,12 +32,16 @@ using namespace std; class CDROMMethod : public pkgAcqMethod { bool DatabaseLoaded; + bool Debug; + ::Configuration Database; string CurrentID; string CDROM; bool MountedByApt; + pkgUdevCdromDevices UdevCdroms; - bool IsCorrectCD(URI want, string MountPath); + bool IsCorrectCD(URI want, string MountPath, string& NewID); + bool AutoDetectAndMount(const URI, string &NewID); virtual bool Fetch(FetchItem *Itm); string GetID(string Name); virtual void Exit(); @@ -50,12 +57,12 @@ class CDROMMethod : public pkgAcqMethod CDROMMethod::CDROMMethod() : pkgAcqMethod("1.0",SingleInstance | LocalOnly | SendConfig | NeedsCleanup | Removable), - DatabaseLoaded(false), + DatabaseLoaded(false), + Debug(false), MountedByApt(false) { - - -}; + UdevCdroms.Dlopen(); +} /*}}}*/ // CDROMMethod::Exit - Unmount the disc if necessary /*{{{*/ // --------------------------------------------------------------------- @@ -86,21 +93,70 @@ string CDROMMethod::GetID(string Name) return string(); } /*}}}*/ +// CDROMMethod::AutoDetectAndMount /*{{{*/ +// --------------------------------------------------------------------- +/* Modifies class varaiable CDROM to the mountpoint */ +bool CDROMMethod::AutoDetectAndMount(const URI Get, string &NewID) +{ + vector<struct CdromDevice> v = UdevCdroms.Scan(); + + // first check if its mounted somewhere already + for (unsigned int i=0; i < v.size(); i++) + { + if (v[i].Mounted) + { + if (Debug) + clog << "Checking mounted cdrom device " << v[i].DeviceName << endl; + if (IsCorrectCD(Get, v[i].MountPath, NewID)) + { + CDROM = v[i].MountPath; + return true; + } + } + } + // we are not supposed to mount, exit + if (_config->FindB("APT::CDROM::NoMount",false) == true) + return false; + + // check if we have the mount point + string AptMountPoint = _config->FindDir("Dir::Media::MountPath"); + if (!FileExists(AptMountPoint)) + mkdir(AptMountPoint.c_str(), 0750); + + // now try mounting + for (unsigned int i=0; i < v.size(); i++) + { + if (!v[i].Mounted) + { + if(MountCdrom(AptMountPoint, v[i].DeviceName)) + { + if (IsCorrectCD(Get, AptMountPoint, NewID)) + { + MountedByApt = true; + CDROM = AptMountPoint; + return true; + } else { + UnmountCdrom(AptMountPoint); + } + } + } + } + + return false; +} + /*}}}*/ // CDROMMethod::IsCorrectCD /*{{{*/ // --------------------------------------------------------------------- /* */ -bool CDROMMethod::IsCorrectCD(URI want, string MountPath) +bool CDROMMethod::IsCorrectCD(URI want, string MountPath, string& NewID) { - bool Debug = _config->FindB("Debug::Acquire::cdrom",false); - string NewID; - for (unsigned int Version = 2; Version != 0; Version--) { if (IdentCdrom(MountPath,NewID,Version) == false) return false; - if (Debug == true) + if (Debug) clog << "ID " << Version << " " << NewID << endl; // A hit @@ -116,11 +172,14 @@ bool CDROMMethod::IsCorrectCD(URI want, string MountPath) /* */ bool CDROMMethod::Fetch(FetchItem *Itm) { + FetchResult Res; + URI Get = Itm->Uri; string File = Get.Path; - FetchResult Res; + Debug = _config->FindB("Debug::Acquire::cdrom", false); - bool Debug = _config->FindB("Debug::Acquire::cdrom",false); + if (Debug) + clog << "CDROMMethod::Fetch " << Itm->Uri << endl; /* All IMS queries are returned as a hit, CDROMs are readonly so time stamps never change */ @@ -156,59 +215,32 @@ bool CDROMMethod::Fetch(FetchItem *Itm) } // We already have a CD inserted, but it is the wrong one - if (CurrentID.empty() == false && Database.Find("CD::" + CurrentID) != Get.Host) + if (CurrentID.empty() == false && + CurrentID != "FAIL" && + Database.Find("CD::" + CurrentID) != Get.Host) { Fail(_("Wrong CD-ROM"),true); return true; } - CDROM = _config->FindDir("Acquire::cdrom::mount","/cdrom/"); - - // auto-detect mode - if (CDROM == "apt-udev-auto/") - { - pkgUdevCdromDevices udev; - if(udev.Dlopen()) - { - vector<struct CdromDevice> v = udev.Scan(); - for (unsigned int i=0; i < v.size(); i++) - { - if (!v[i].Mounted) - { - if (!FileExists("/media/apt")) - mkdir("/media/apt", 0755); - if(MountCdrom("/media/apt", v[i].DeviceName)) - { - if (IsCorrectCD(Get, "/media/apt")) - { - MountedByApt = true; - CDROM = "/media/apt"; - break; - } else { - UnmountCdrom("/media/apt"); - } - } - } else { - if (IsCorrectCD(Get, v[i].MountPath)) - { - CDROM = v[i].MountPath; - break; - } - } - } - } - } + bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect", true); + CDROM = _config->FindDir("Acquire::cdrom::mount"); + if (Debug) + clog << "Looking for CDROM at " << CDROM << endl; if (CDROM[0] == '.') CDROM= SafeGetCWD() + '/' + CDROM; + string NewID; while (CurrentID.empty() == true) { - bool Hit = false; + if (AutoDetect) + AutoDetectAndMount(Get, NewID); + if(!IsMounted(CDROM)) MountedByApt = MountCdrom(CDROM); - if (IsCorrectCD(Get, CDROM)) + if (IsCorrectCD(Get, CDROM, NewID)) break; // I suppose this should prompt somehow? @@ -236,7 +268,7 @@ bool CDROMMethod::Fetch(FetchItem *Itm) Hashes Hash; FileFd Fd(Res.Filename, FileFd::ReadOnly); - Hash.AddFD(Fd.Fd(), Fd.Size()); + Hash.AddFD(Fd); Res.TakeHashes(Hash); URIDone(Res);