diff options
author | Michael Vogt <michael.vogt@ubuntu.com> | 2010-01-27 12:11:07 +0100 |
---|---|---|
committer | Michael Vogt <michael.vogt@ubuntu.com> | 2010-01-27 12:11:07 +0100 |
commit | 93adae194b5db00e3afb8fe89b907eed9df28763 (patch) | |
tree | a9e3534bfd019632379fcb6f01d16a80838173af | |
parent | bca4c203ac8664f7cdbffd4ce8474b358f708658 (diff) |
merge 1695..1701 from the lp:~mvo/apt/mvo branch
-rw-r--r-- | apt-pkg/cdrom.cc | 5 | ||||
-rw-r--r-- | apt-pkg/init.cc | 3 | ||||
-rw-r--r-- | cmdline/apt-cdrom.cc | 70 | ||||
-rw-r--r-- | debian/changelog | 5 | ||||
-rw-r--r-- | doc/examples/configure-index | 11 | ||||
-rw-r--r-- | methods/cdrom.cc | 13 |
6 files changed, 94 insertions, 13 deletions
diff --git a/apt-pkg/cdrom.cc b/apt-pkg/cdrom.cc index 72d8e4d41..96d4e9c91 100644 --- a/apt-pkg/cdrom.cc +++ b/apt-pkg/cdrom.cc @@ -829,8 +829,6 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/ } } - - // Unmount and finish if (_config->FindB("APT::CDROM::NoMount",false) == false) { log->Update(_("Unmounting CD-ROM...\n"), STEP_LAST); @@ -921,6 +919,7 @@ pkgUdevCdromDevices::Scan() /*{{{*/ pkgUdevCdromDevices::~pkgUdevCdromDevices() /*{{{*/ { - dlclose(libudev_handle); + if (libudev_handle != NULL) + dlclose(libudev_handle); } /*}}}*/ diff --git a/apt-pkg/init.cc b/apt-pkg/init.cc index a54c09a36..d8c201b9d 100644 --- a/apt-pkg/init.cc +++ b/apt-pkg/init.cc @@ -65,11 +65,12 @@ bool pkgInitConfig(Configuration &Cnf) Cnf.Set("Dir::Etc::vendorlist","vendors.list"); Cnf.Set("Dir::Etc::vendorparts","vendors.list.d"); Cnf.Set("Dir::Etc::main","apt.conf"); - Cnf.Set("Dir::ETc::netrc", "auth.conf"); + Cnf.Set("Dir::Etc::netrc", "auth.conf"); Cnf.Set("Dir::Etc::parts","apt.conf.d"); Cnf.Set("Dir::Etc::preferences","preferences"); Cnf.Set("Dir::Etc::preferencesparts","preferences.d"); Cnf.Set("Dir::Bin::methods","/usr/lib/apt/methods"); + Cnf.Set("Dir::Media::MountPath","/media/apt"); // State Cnf.Set("Dir::Log","var/log/apt"); diff --git a/cmdline/apt-cdrom.cc b/cmdline/apt-cdrom.cc index d804c55e5..988a58f20 100644 --- a/cmdline/apt-cdrom.cc +++ b/cmdline/apt-cdrom.cc @@ -98,6 +98,42 @@ OpProgress* pkgCdromTextStatus::GetOpProgress() return &Progress; }; /*}}}*/ +// SetupAutoDetect /*{{{*/ +bool AutoDetectCdrom(pkgUdevCdromDevices &UdevCdroms, unsigned int &i) +{ + bool Debug = _config->FindB("Debug::Acquire::cdrom", false); + + vector<struct CdromDevice> v = UdevCdroms.Scan(); + if (i >= v.size()) + return false; + + if (Debug) + clog << "Looking at devce " << i + << " DeviveName: " << v[i].DeviceName + << " IsMounted: '" << v[i].Mounted << "'" + << " MountPoint: '" << v[i].MountPath << "'" + << endl; + + if (v[i].Mounted) + { + // 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()); + _config->Set("Acquire::cdrom::mount", AptMountPoint); + _config->Set("APT::CDROM::NoMount", true); + } + i++; + + return true; +} + /*}}}*/ + // DoAdd - Add a new CDROM /*{{{*/ // --------------------------------------------------------------------- /* This does the main add bit.. We show some status and things. The @@ -106,12 +142,25 @@ OpProgress* pkgCdromTextStatus::GetOpProgress() verify them. Then rewrite the database files */ bool DoAdd(CommandLine &) { - bool res = false; + pkgUdevCdromDevices UdevCdroms; pkgCdromTextStatus log; pkgCdrom cdrom; - res = cdrom.Add(&log); + bool res = true; + + bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect"); + unsigned int count = 0; + + if (AutoDetect && UdevCdroms.Dlopen()) + { + while (AutoDetectCdrom(UdevCdroms, count)) + res &= cdrom.Add(&log); + } else { + res = cdrom.Add(&log); + } + if(res) cout << _("Repeat this process for the rest of the CDs in your set.") << endl; + return res; } /*}}}*/ @@ -120,10 +169,24 @@ bool DoAdd(CommandLine &) /* */ bool DoIdent(CommandLine &) { + pkgUdevCdromDevices UdevCdroms; string ident; pkgCdromTextStatus log; pkgCdrom cdrom; - return cdrom.Ident(ident, &log); + bool res = true; + + bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect"); + unsigned int count = 0; + + if (AutoDetect && UdevCdroms.Dlopen()) + { + while (AutoDetectCdrom(UdevCdroms, count)) + res &= cdrom.Ident(ident, &log); + } else { + return cdrom.Ident(ident, &log); + } + + return res; } /*}}}*/ // ShowHelp - Show the help screen /*{{{*/ @@ -164,6 +227,7 @@ int main(int argc,const char *argv[]) /*{{{*/ { CommandLine::Args Args[] = { {'h',"help","help",0}, + {'a',"auto-detect","Acquire::cdrom::AutoDetect",0}, {'v',"version","version",0}, {'d',"cdrom","Acquire::cdrom::mount",CommandLine::HasArg}, {'r',"rename","APT::CDROM::Rename",0}, diff --git a/debian/changelog b/debian/changelog index 388078f2b..2b4f41c47 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,11 +4,16 @@ apt (0.7.25.2) UNRELEASED; urgency=low * apt-pkg/contrib/cdromutl.cc: - fix UnmountCdrom() fails, give it a bit more time and try the umount again + * apt-pkg/cdrom.cc: + - fix crash in pkgUdevCdromDevices * methods/cdrom.cc: - fixes in multi cdrom setup code - add new "Acquire::cdrom::AutoDetect" config that enables/disables the dlopen of libudev for automatic cdrom detection. Off by default currently, feedback/testing welcome + * cmdline/apt-cdrom.cc: + - add new --auto-detect option that uses libudev to figure out + the cdrom/mount-point * cmdline/apt-mark: - merge fix from Gene Cash that supports markauto for packages that are not in the extended_states file yet diff --git a/doc/examples/configure-index b/doc/examples/configure-index index d46679998..ddee86388 100644 --- a/doc/examples/configure-index +++ b/doc/examples/configure-index @@ -248,6 +248,10 @@ Acquire cdrom { + // do auto detection of the cdrom mountpoint + AutoDetect "true"; + + // cdrom mountpoint (needs to be defined in fstab if AutoDetect is not used) mount "/cdrom"; // You need the trailing slash! @@ -326,6 +330,13 @@ Dir "/" Log "var/log/apt" { Terminal "term.log"; }; + + // Media + Media + { + // Media AutoDetect mount path + MountPath "/media/apt"; + }; }; // Things that effect the APT dselect method diff --git a/methods/cdrom.cc b/methods/cdrom.cc index b3f461816..6d694e7c9 100644 --- a/methods/cdrom.cc +++ b/methods/cdrom.cc @@ -116,23 +116,24 @@ bool CDROMMethod::AutoDetectAndMount(const URI Get, string &NewID) return false; // check if we have the mount point - if (!FileExists("/media/apt")) - mkdir("/media/apt", 0755); + 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("/media/apt", v[i].DeviceName)) + if(MountCdrom(AptMountPoint, v[i].DeviceName)) { - if (IsCorrectCD(Get, "/media/apt", NewID)) + if (IsCorrectCD(Get, AptMountPoint, NewID)) { MountedByApt = true; - CDROM = "/media/apt"; + CDROM = AptMountPoint; return true; } else { - UnmountCdrom("/media/apt"); + UnmountCdrom(AptMountPoint); } } } |