diff options
Diffstat (limited to 'apt-pkg')
-rw-r--r-- | apt-pkg/acquire-item.cc | 45 | ||||
-rw-r--r-- | apt-pkg/acquire.cc | 4 | ||||
-rw-r--r-- | apt-pkg/aptconfiguration.h | 10 | ||||
-rw-r--r-- | apt-pkg/cachefile.cc | 23 | ||||
-rw-r--r-- | apt-pkg/cachefile.h | 3 | ||||
-rw-r--r-- | apt-pkg/cacheset.h | 2 | ||||
-rw-r--r-- | apt-pkg/contrib/fileutl.cc | 3 | ||||
-rw-r--r-- | apt-pkg/deb/debmetaindex.cc | 1 | ||||
-rw-r--r-- | apt-pkg/deb/dpkgpm.cc | 105 | ||||
-rw-r--r-- | apt-pkg/depcache.cc | 2 | ||||
-rw-r--r-- | apt-pkg/init.cc | 4 | ||||
-rw-r--r-- | apt-pkg/orderlist.cc | 4 | ||||
-rw-r--r-- | apt-pkg/tagfile.h | 2 |
13 files changed, 123 insertions, 85 deletions
diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc index b40c67ec1..83c793093 100644 --- a/apt-pkg/acquire-item.cc +++ b/apt-pkg/acquire-item.cc @@ -277,6 +277,27 @@ static HashStringList GetExpectedHashesFromFor(metaIndex * const Parser, std::st } /*}}}*/ +class pkgAcquire::Item::Private /*{{{*/ +{ +public: + struct AlternateURI + { + std::string URI; + std::unordered_map<std::string, std::string> changefields; + AlternateURI(std::string &&u, decltype(changefields) &&cf) : URI(u), changefields(cf) {} + }; + std::list<AlternateURI> AlternativeURIs; + std::vector<std::string> BadAlternativeSites; + std::vector<std::string> PastRedirections; + std::unordered_map<std::string, std::string> CustomFields; + unsigned int Retries; + + Private() : Retries(_config->FindI("Acquire::Retries", 0)) + { + } +}; + /*}}}*/ + // all ::HashesRequired and ::GetExpectedHashes implementations /*{{{*/ /* ::GetExpectedHashes is abstract and has to be implemented by all subclasses. It is best to implement it as broadly as possible, while ::HashesRequired defaults @@ -748,25 +769,6 @@ class APT_HIDDEN CleanupItem : public pkgAcqTransactionItem /*{{{*/ /*}}}*/ // Acquire::Item::Item - Constructor /*{{{*/ -class pkgAcquire::Item::Private -{ -public: - struct AlternateURI - { - std::string URI; - std::unordered_map<std::string, std::string> changefields; - AlternateURI(std::string &&u, decltype(changefields) &&cf) : URI(u), changefields(cf) {} - }; - std::list<AlternateURI> AlternativeURIs; - std::vector<std::string> BadAlternativeSites; - std::vector<std::string> PastRedirections; - std::unordered_map<std::string, std::string> CustomFields; - unsigned int Retries; - - Private() : Retries(_config->FindI("Acquire::Retries", 0)) - { - } -}; APT_IGNORE_DEPRECATED_PUSH pkgAcquire::Item::Item(pkgAcquire * const owner) : FileSize(0), PartialSize(0), Mode(0), ID(0), Complete(false), Local(false), @@ -1045,7 +1047,7 @@ void pkgAcquire::Item::Done(string const &/*Message*/, HashStringList const &Has } Status = StatDone; ErrorText.clear(); - Owner->Dequeue(this); + Dequeue(); } /*}}}*/ // Acquire::Item::Rename - Rename a file /*{{{*/ @@ -1070,6 +1072,7 @@ bool pkgAcquire::Item::Rename(string const &From,string const &To) /*}}}*/ void pkgAcquire::Item::Dequeue() /*{{{*/ { + d->AlternativeURIs.clear(); Owner->Dequeue(this); } /*}}}*/ @@ -1272,7 +1275,7 @@ void pkgAcqMetaBase::AbortTransaction() { (*I)->ExpectedAdditionalItems = 0; if ((*I)->Status != pkgAcquire::Item::StatFetching) - Owner->Dequeue(*I); + (*I)->Dequeue(); (*I)->TransactionState(TransactionAbort); } Transaction.clear(); 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/aptconfiguration.h b/apt-pkg/aptconfiguration.h index 6776f96ef..34621a2b8 100644 --- a/apt-pkg/aptconfiguration.h +++ b/apt-pkg/aptconfiguration.h @@ -34,7 +34,7 @@ namespace Configuration { /*{{{*/ * in the Dir::Bin group. * * \param Cached saves the result so we need to calculated it only once - * this parameter should ony be used for testing purposes. + * this parameter should only be used for testing purposes. * * \return a vector of the compression types in the preferred usage order */ @@ -57,9 +57,9 @@ namespace Configuration { /*{{{*/ * * \param All return all codes or only codes for languages we want to use * \param Cached saves the result so we need to calculated it only once - * this parameter should ony be used for testing purposes. + * this parameter should only be used for testing purposes. * \param Locale don't get the locale from the system but use this one instead - * this parameter should ony be used for testing purposes. + * this parameter should only be used for testing purposes. * * \return a vector of (all) Language Codes in the preferred usage order */ @@ -77,7 +77,7 @@ namespace Configuration { /*{{{*/ /** \brief Returns a vector of Architectures we support * * \param Cached saves the result so we need to calculated it only once - * this parameter should ony be used for testing purposes. + * this parameter should only be used for testing purposes. * * \return a vector of Architectures in preferred order */ @@ -108,7 +108,7 @@ namespace Configuration { /*{{{*/ /** \brief Return a vector of Compressors supported for data.tar's * * \param Cached saves the result so we need to calculated it only once - * this parameter should ony be used for testing purposes. + * this parameter should only be used for testing purposes. * * \return a vector of Compressors */ 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/cacheset.h b/apt-pkg/cacheset.h index 157f6139e..b00fc7318 100644 --- a/apt-pkg/cacheset.h +++ b/apt-pkg/cacheset.h @@ -479,7 +479,7 @@ APT_IGNORE_DEPRECATED_POP return FromTask(Cache, pattern, helper); } - /** \brief returns all packages in the cache whose name matchs a given pattern + /** \brief returns all packages in the cache whose name matches a given pattern A simple helper responsible for executing a regular expression on all package names in the cache. Optional it prints a notice about the 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/debmetaindex.cc b/apt-pkg/deb/debmetaindex.cc index 6cbed85a7..9c7c70784 100644 --- a/apt-pkg/deb/debmetaindex.cc +++ b/apt-pkg/deb/debmetaindex.cc @@ -1043,6 +1043,7 @@ class APT_HIDDEN debSLTypeDebian : public pkgSourceList::Type /*{{{*/ auto const tv = *t; mytargets.erase(t); mytargets.emplace_back(tv); + break; } if (Changed == false) break; 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/depcache.cc b/apt-pkg/depcache.cc index 7c016a5e7..510f2d3f0 100644 --- a/apt-pkg/depcache.cc +++ b/apt-pkg/depcache.cc @@ -413,7 +413,7 @@ bool pkgDepCache::CheckDep(DepIterator const &Dep,int const Type,PkgIterator &Re /*}}}*/ // DepCache::AddSizes - Add the packages sizes to the counters /*{{{*/ // --------------------------------------------------------------------- -/* Call with Inverse = true to perform the inverse opration */ +/* Call with Inverse = true to perform the inverse operation */ void pkgDepCache::AddSizes(const PkgIterator &Pkg, bool const Inverse) { StateCache &P = PkgState[Pkg->ID]; diff --git a/apt-pkg/init.cc b/apt-pkg/init.cc index 22693d2a2..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"); @@ -249,7 +249,7 @@ bool pkgInitConfig(Configuration &Cnf) return good; } /*}}}*/ -// pkgInitSystem - Initialize the _system calss /*{{{*/ +// pkgInitSystem - Initialize the _system class /*{{{*/ // --------------------------------------------------------------------- /* */ bool pkgInitSystem(Configuration &Cnf,pkgSystem *&Sys) diff --git a/apt-pkg/orderlist.cc b/apt-pkg/orderlist.cc index 670b5e2bd..a826f2853 100644 --- a/apt-pkg/orderlist.cc +++ b/apt-pkg/orderlist.cc @@ -12,7 +12,7 @@ This is a modified version of Manoj's Routine B. It consists of four independent ordering algorithms that can be applied at for different - points in the ordering. By appling progressivly fewer ordering + points in the ordering. By applying progressivly fewer ordering operations it is possible to give each consideration it's own priority and create an order that satisfies the lowest applicable consideration. @@ -562,7 +562,7 @@ bool pkgOrderList::VisitProvides(DepIterator D,bool Critical) // OrderList::VisitNode - Recursive ordering director /*{{{*/ // --------------------------------------------------------------------- /* This is the core ordering routine. It calls the set dependency - consideration functions which then potentialy call this again. Finite + consideration functions which then potentially call this again. Finite depth is achieved through the colouring mechinism. */ bool pkgOrderList::VisitNode(PkgIterator Pkg, char const* from) { diff --git a/apt-pkg/tagfile.h b/apt-pkg/tagfile.h index c4dc50a10..8b59c43de 100644 --- a/apt-pkg/tagfile.h +++ b/apt-pkg/tagfile.h @@ -133,7 +133,7 @@ class pkgTagSection * @param MaxLength is the size of valid data in the stream pointed to by Start * @param Restart if enabled internal state will be cleared, otherwise it is * assumed that now more data is available in the stream and the parsing will - * start were it encountered insufficent data the last time. + * start were it encountered insufficient data the last time. * * @return \b true if section end was found, \b false otherwise. * Beware that internal state will be inconsistent if \b false is returned! |