summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Vogt <michael.vogt@ubuntu.com>2010-01-27 12:11:07 +0100
committerMichael Vogt <michael.vogt@ubuntu.com>2010-01-27 12:11:07 +0100
commit93adae194b5db00e3afb8fe89b907eed9df28763 (patch)
treea9e3534bfd019632379fcb6f01d16a80838173af
parentbca4c203ac8664f7cdbffd4ce8474b358f708658 (diff)
merge 1695..1701 from the lp:~mvo/apt/mvo branch
-rw-r--r--apt-pkg/cdrom.cc5
-rw-r--r--apt-pkg/init.cc3
-rw-r--r--cmdline/apt-cdrom.cc70
-rw-r--r--debian/changelog5
-rw-r--r--doc/examples/configure-index11
-rw-r--r--methods/cdrom.cc13
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);
}
}
}