summaryrefslogtreecommitdiff
path: root/apt-pkg
diff options
context:
space:
mode:
Diffstat (limited to 'apt-pkg')
-rw-r--r--apt-pkg/acquire.cc4
-rw-r--r--apt-pkg/cachefile.cc23
-rw-r--r--apt-pkg/cachefile.h3
-rw-r--r--apt-pkg/contrib/fileutl.cc3
-rw-r--r--apt-pkg/deb/dpkgpm.cc105
-rw-r--r--apt-pkg/init.cc2
6 files changed, 87 insertions, 53 deletions
diff --git a/apt-pkg/acquire.cc b/apt-pkg/acquire.cc
index 0fee80c5d..541785b03 100644
--- a/apt-pkg/acquire.cc
+++ b/apt-pkg/acquire.cc
@@ -1329,7 +1329,7 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner)
{
std::chrono::duration<double> Delta =
std::chrono::seconds(NewTime.tv_sec - Time.tv_sec) +
- std::chrono::microseconds(NewTime.tv_sec - Time.tv_usec);
+ std::chrono::microseconds(NewTime.tv_usec - Time.tv_usec);
// Compute the CPS value
if (Delta < std::chrono::milliseconds(10))
@@ -1423,7 +1423,7 @@ void pkgAcquireStatus::Stop()
std::chrono::duration<double> Delta =
std::chrono::seconds(NewTime.tv_sec - StartTime.tv_sec) +
- std::chrono::microseconds(NewTime.tv_sec - StartTime.tv_usec);
+ std::chrono::microseconds(NewTime.tv_usec - StartTime.tv_usec);
// Compute the CPS value
if (Delta < std::chrono::milliseconds(10))
diff --git a/apt-pkg/cachefile.cc b/apt-pkg/cachefile.cc
index a22804c36..9a1a6cfa9 100644
--- a/apt-pkg/cachefile.cc
+++ b/apt-pkg/cachefile.cc
@@ -35,12 +35,18 @@
#include <apti18n.h>
/*}}}*/
+
+struct pkgCacheFile::Private
+{
+ bool WithLock = false;
+};
+
// CacheFile::CacheFile - Constructor /*{{{*/
-pkgCacheFile::pkgCacheFile() : d(NULL), ExternOwner(false), Map(NULL), Cache(NULL),
+pkgCacheFile::pkgCacheFile() : d(new Private()), ExternOwner(false), Map(NULL), Cache(NULL),
DCache(NULL), SrcList(NULL), Policy(NULL)
{
}
-pkgCacheFile::pkgCacheFile(pkgDepCache * const Owner) : d(NULL), ExternOwner(true),
+pkgCacheFile::pkgCacheFile(pkgDepCache * const Owner) : d(new Private()), ExternOwner(true),
Map(&Owner->GetCache().GetMap()), Cache(&Owner->GetCache()),
DCache(Owner), SrcList(NULL), Policy(NULL)
{
@@ -59,8 +65,10 @@ pkgCacheFile::~pkgCacheFile()
}
delete Policy;
delete SrcList;
- if (ExternOwner == false)
+ if (d->WithLock == true)
_system->UnLock(true);
+
+ delete d;
}
/*}}}*/
// CacheFile::BuildCaches - Open and build the cache files /*{{{*/
@@ -97,8 +105,11 @@ bool pkgCacheFile::BuildCaches(OpProgress *Progress, bool WithLock)
}
if (WithLock == true)
+ {
if (_system->Lock() == false)
return false;
+ d->WithLock = true;
+ }
if (_error->PendingError() == true)
return false;
@@ -337,7 +348,11 @@ void pkgCacheFile::Close()
ExternOwner = false;
delete Policy;
delete SrcList;
- _system->UnLock(true);
+ if (d->WithLock == true)
+ {
+ _system->UnLock(true);
+ d->WithLock = false;
+ }
Map = NULL;
DCache = NULL;
diff --git a/apt-pkg/cachefile.h b/apt-pkg/cachefile.h
index 097876b3a..ed5d5c57c 100644
--- a/apt-pkg/cachefile.h
+++ b/apt-pkg/cachefile.h
@@ -36,8 +36,9 @@ class OpProgress;
class pkgCacheFile
{
+ struct Private;
/** \brief dpointer placeholder (for later in case we need it) */
- void * const d;
+ Private *const d;
bool ExternOwner;
protected:
diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc
index 85d7b36c7..eab05de4f 100644
--- a/apt-pkg/contrib/fileutl.cc
+++ b/apt-pkg/contrib/fileutl.cc
@@ -24,6 +24,7 @@
#include <apt-pkg/error.h>
#include <apt-pkg/fileutl.h>
#include <apt-pkg/macros.h>
+#include <apt-pkg/pkgsystem.h>
#include <apt-pkg/sptr.h>
#include <apt-pkg/strutl.h>
@@ -101,6 +102,8 @@ bool RunScripts(const char *Cnf)
// This is the child
if (Child == 0)
{
+ if (_system != nullptr && _system->IsLocked() == true && (stringcasecmp(Cnf, "dpkg::post-invoke") == 0 || stringcasecmp(Cnf, "dpkg::pre-invoke") == 0))
+ setenv("DPKG_FRONTEND_LOCKED", "true", 1);
if (_config->FindDir("DPkg::Chroot-Directory","/") != "/")
{
std::cerr << "Chrooting into "
diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc
index 790019b98..074e52b3f 100644
--- a/apt-pkg/deb/dpkgpm.cc
+++ b/apt-pkg/deb/dpkgpm.cc
@@ -102,8 +102,8 @@ APT_PURE static unsigned int EnvironmentSize() /*{{{*/
class pkgDPkgPMPrivate /*{{{*/
{
public:
- pkgDPkgPMPrivate() : stdin_is_dev_null(false), dpkgbuf_pos(0),
- term_out(NULL), history_out(NULL),
+ pkgDPkgPMPrivate() : stdin_is_dev_null(false), status_fd_reached_end_of_file(false),
+ dpkgbuf_pos(0), term_out(NULL), history_out(NULL),
progress(NULL), tt_is_valid(false), master(-1),
slave(NULL), protect_slave_from_dying(-1),
direct_stdin(false)
@@ -114,6 +114,7 @@ public:
{
}
bool stdin_is_dev_null;
+ bool status_fd_reached_end_of_file;
// the buffer we use for the dpkg status-fd reading
char dpkgbuf[1024];
size_t dpkgbuf_pos;
@@ -141,12 +142,12 @@ namespace
// Maps the dpkg "processing" info to human readable names. Entry 0
// of each array is the key, entry 1 is the value.
const std::pair<const char *, const char *> PackageProcessingOps[] = {
- std::make_pair("install", N_("Installing %s")),
+ std::make_pair("install", N_("Preparing %s")),
// we don't care for the difference
- std::make_pair("upgrade", N_("Installing %s")),
- std::make_pair("configure", N_("Configuring %s")),
- std::make_pair("remove", N_("Removing %s")),
- std::make_pair("purge", N_("Completely removing %s")),
+ std::make_pair("upgrade", N_("Preparing %s")),
+ std::make_pair("configure", N_("Preparing to configure %s")),
+ std::make_pair("remove", N_("Preparing for removal of %s")),
+ std::make_pair("purge", N_("Preparing to completely remove %s")),
std::make_pair("disappear", N_("Noting disappearance of %s")),
std::make_pair("trigproc", N_("Running post-installation trigger %s"))
};
@@ -480,6 +481,9 @@ bool pkgDPkgPM::RunScriptsWithPkgs(const char *Cnf)
strprintf(hookfd, "%d", InfoFD);
setenv("APT_HOOK_INFO_FD", hookfd.c_str(), 1);
+ if (_system != nullptr && _system->IsLocked() == true && stringcasecmp(Cnf, "DPkg::Pre-Install-Pkgs") == 0)
+ setenv("DPKG_FRONTEND_LOCKED", "true", 1);
+
debSystem::DpkgChrootDirectory();
const char *Args[4];
Args[0] = "/bin/sh";
@@ -958,11 +962,19 @@ void pkgDPkgPM::handleCrossUpgradeAction(string const &pkgname) /*{{{*/
// DPkgPM::DoDpkgStatusFd /*{{{*/
void pkgDPkgPM::DoDpkgStatusFd(int statusfd)
{
- ssize_t const len = read(statusfd, &d->dpkgbuf[d->dpkgbuf_pos],
- (sizeof(d->dpkgbuf)/sizeof(d->dpkgbuf[0])) - d->dpkgbuf_pos);
- if(len <= 0)
- return;
- d->dpkgbuf_pos += (len / sizeof(d->dpkgbuf[0]));
+ auto const remainingBuffer = (sizeof(d->dpkgbuf) / sizeof(d->dpkgbuf[0])) - d->dpkgbuf_pos;
+ if (likely(remainingBuffer > 0) && d->status_fd_reached_end_of_file == false)
+ {
+ auto const len = read(statusfd, &d->dpkgbuf[d->dpkgbuf_pos], remainingBuffer);
+ if (len < 0)
+ return;
+ else if (len == 0 && d->dpkgbuf_pos == 0)
+ {
+ d->status_fd_reached_end_of_file = true;
+ return;
+ }
+ d->dpkgbuf_pos += (len / sizeof(d->dpkgbuf[0]));
+ }
// process line by line from the buffer
char *p = d->dpkgbuf, *q = nullptr;
@@ -1145,30 +1157,26 @@ void pkgDPkgPM::BuildPackagesProgressMap()
{
// map the dpkg states to the operations that are performed
// (this is sorted in the same way as Item::Ops)
- static const std::array<std::array<DpkgState, 3>, 4> DpkgStatesOpMap = {{
+ static const std::array<std::array<DpkgState, 2>, 4> DpkgStatesOpMap = {{
// Install operation
{{
- {"half-installed", N_("Preparing %s")},
- {"unpacked", N_("Unpacking %s") },
- {nullptr, nullptr}
+ {"half-installed", N_("Unpacking %s")},
+ {"unpacked", N_("Installing %s") },
}},
// Configure operation
{{
- {"unpacked",N_("Preparing to configure %s") },
{"half-configured", N_("Configuring %s") },
{ "installed", N_("Installed %s")},
}},
// Remove operation
{{
- {"half-configured", N_("Preparing for removal of %s")},
+ {"half-configured", N_("Removing %s")},
{"half-installed", N_("Removing %s")},
- {"config-files", N_("Removed %s")},
}},
// Purge operation
{{
- {"config-files", N_("Preparing to completely remove %s")},
+ {"config-files", N_("Completely removing %s")},
{"not-installed", N_("Completely removed %s")},
- {nullptr, nullptr}
}},
}};
static_assert(Item::Purge == 3, "Enum item has unexpected index for mapping array");
@@ -1184,21 +1192,16 @@ void pkgDPkgPM::BuildPackagesProgressMap()
string const name = I.Pkg.FullName();
PackageOpsDone[name] = 0;
- auto AddToPackageOps = std::back_inserter(PackageOps[name]);
- if (I.Op == Item::Purge && I.Pkg->CurrentVer != 0)
- {
- // purging a package which is installed first passes through remove states
- auto const DpkgOps = DpkgStatesOpMap[Item::Remove];
- std::copy(DpkgOps.begin(), DpkgOps.end(), AddToPackageOps);
+ auto AddToPackageOps = [&](decltype(I.Op) const Op) {
+ auto const DpkgOps = DpkgStatesOpMap[Op];
+ std::copy(DpkgOps.begin(), DpkgOps.end(), std::back_inserter(PackageOps[name]));
PackagesTotal += DpkgOps.size();
- }
- auto const DpkgOps = DpkgStatesOpMap[I.Op];
- std::copy_if(DpkgOps.begin(), DpkgOps.end(), AddToPackageOps, [&](DpkgState const &state) {
- if (state.state == nullptr)
- return false;
- ++PackagesTotal;
- return true;
- });
+ };
+ // purging a package which is installed first passes through remove states
+ if (I.Op == Item::Purge && I.Pkg->CurrentVer != 0)
+ AddToPackageOps(Item::Remove);
+ AddToPackageOps(I.Op);
+
if ((I.Op == Item::Remove || I.Op == Item::Purge) && I.Pkg->CurrentVer != 0)
{
if (I.Pkg->CurrentState == pkgCache::State::UnPacked ||
@@ -1622,9 +1625,9 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress)
approvedStates.Remove(*Ver);
Purges.erase(Ver);
auto && RemOp = PackageOps[C.first->Pkg.FullName()];
- if (RemOp.size() == 5)
+ if (RemOp.size() == 4)
{
- RemOp.erase(std::next(RemOp.begin(), 3), RemOp.end());
+ RemOp.erase(std::next(RemOp.begin(), 2), RemOp.end());
PackagesTotal -= 2;
}
else
@@ -2022,6 +2025,7 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress)
// we read from dpkg here
int const _dpkgin = fd[0];
close(fd[1]); // close the write end of the pipe
+ d->status_fd_reached_end_of_file = false;
// apply ionice
if (_config->FindB("DPkg::UseIoNice", false) == true)
@@ -2041,14 +2045,24 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress)
int Status = 0;
int res;
bool waitpid_failure = false;
- while ((res=waitpid(Child,&Status, WNOHANG)) != Child) {
- if(res < 0) {
- // error handling, waitpid returned -1
- if (errno == EINTR)
- continue;
- waitpid_failure = true;
- break;
+ bool dpkg_finished = false;
+ do
+ {
+ if (dpkg_finished == false)
+ {
+ if ((res = waitpid(Child, &Status, WNOHANG)) == Child)
+ dpkg_finished = true;
+ else if (res < 0)
+ {
+ // error handling, waitpid returned -1
+ if (errno == EINTR)
+ continue;
+ waitpid_failure = true;
+ break;
+ }
}
+ if (dpkg_finished && d->status_fd_reached_end_of_file)
+ break;
// wait for input or output here
FD_ZERO(&rfds);
@@ -2078,7 +2092,8 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress)
DoStdin(d->master);
if(FD_ISSET(_dpkgin, &rfds))
DoDpkgStatusFd(_dpkgin);
- }
+
+ } while (true);
close(_dpkgin);
// Restore sig int/quit
diff --git a/apt-pkg/init.cc b/apt-pkg/init.cc
index ab0474fac..9a51e31e7 100644
--- a/apt-pkg/init.cc
+++ b/apt-pkg/init.cc
@@ -204,7 +204,7 @@ bool pkgInitConfig(Configuration &Cnf)
Cnf.CndSet("Acquire::IndexTargets::deb-src::Sources::flatDescription", "$(RELEASE) Sources");
Cnf.CndSet("Acquire::IndexTargets::deb-src::Sources::Optional", false);
- Cnf.CndSet("Acquire::Changelogs::URI::Origin::Debian", "http://metadata.ftp-master.debian.org/changelogs/@CHANGEPATH@_changelog");
+ Cnf.CndSet("Acquire::Changelogs::URI::Origin::Debian", "https://metadata.ftp-master.debian.org/changelogs/@CHANGEPATH@_changelog");
Cnf.CndSet("Acquire::Changelogs::URI::Origin::Tanglu", "http://metadata.tanglu.org/changelogs/@CHANGEPATH@_changelog");
Cnf.CndSet("Acquire::Changelogs::URI::Origin::Ubuntu", "https://changelogs.ubuntu.com/changelogs/pool/@CHANGEPATH@/changelog");
Cnf.CndSet("Acquire::Changelogs::URI::Origin::Ultimedia", "http://packages.ultimediaos.com/changelogs/pool/@CHANGEPATH@/changelog.txt");