From b60c8a89c281f2bb945d426d2215cbf8f5760738 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Fri, 29 Jul 2016 21:51:43 +0200 Subject: edsp: try to read responses even if writing failed If a solver/planner exits before apt is done writing we will generate write errors. Solvers like 'dump' can be pretty quick in failing but produce a valid EDSP error report apt should read, parse and display instead of just discarding even through we had write errors. --- apt-pkg/edsp.cc | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) (limited to 'apt-pkg/edsp.cc') diff --git a/apt-pkg/edsp.cc b/apt-pkg/edsp.cc index 740eb0a0d..f56625feb 100644 --- a/apt-pkg/edsp.cc +++ b/apt-pkg/edsp.cc @@ -1061,20 +1061,21 @@ bool EDSP::ResolveExternal(const char* const solver, pkgDepCache &Cache, return _error->Errno("ResolveExternal", "Opening solver %s stdin on fd %d for writing failed", solver, solver_in); bool Okay = output.Failed() == false; - if (Progress != NULL) + if (Okay && Progress != NULL) Progress->OverallProgress(0, 100, 5, _("Execute external solver")); Okay &= EDSP::WriteRequest(Cache, output, flags, Progress); - if (Progress != NULL) + if (Okay && Progress != NULL) Progress->OverallProgress(5, 100, 20, _("Execute external solver")); Okay &= EDSP::WriteScenario(Cache, output, Progress); output.Close(); - if (Progress != NULL) + if (Okay && Progress != NULL) Progress->OverallProgress(25, 100, 75, _("Execute external solver")); if (Okay && EDSP::ReadResponse(solver_out, Cache, Progress) == false) return false; - return ExecWait(solver_pid, solver); + bool const waited = ExecWait(solver_pid, solver); + return Okay && waited; } bool EDSP::ResolveExternal(const char* const solver, pkgDepCache &Cache, bool const upgrade, bool const distUpgrade, @@ -1118,28 +1119,32 @@ bool EIPP::OrderInstall(char const * const solver, pkgPackageManager * const PM, return _error->Errno("EIPP::OrderInstall", "Opening planner %s stdin on fd %d for writing failed", solver, solver_in); bool Okay = output.Failed() == false; - if (Progress != NULL) + if (Okay && Progress != NULL) Progress->OverallProgress(0, 100, 5, _("Execute external planner")); Okay &= EIPP::WriteRequest(PM->Cache, output, flags, Progress); - if (Progress != NULL) + if (Okay && Progress != NULL) Progress->OverallProgress(5, 100, 20, _("Execute external planner")); Okay &= EIPP::WriteScenario(PM->Cache, output, Progress); output.Close(); - if (Progress != NULL) - Progress->OverallProgress(25, 100, 75, _("Execute external planner")); - - // we don't tell the external planners about boring things - for (auto Pkg = PM->Cache.PkgBegin(); Pkg.end() == false; ++Pkg) + if (Okay) { - if (Pkg->CurrentState == pkgCache::State::ConfigFiles && PM->Cache[Pkg].Purge() == true) - PM->Remove(Pkg, true); + if (Progress != nullptr) + Progress->OverallProgress(25, 100, 75, _("Execute external planner")); + + // we don't tell the external planners about boring things + for (auto Pkg = PM->Cache.PkgBegin(); Pkg.end() == false; ++Pkg) + { + if (Pkg->CurrentState == pkgCache::State::ConfigFiles && PM->Cache[Pkg].Purge() == true) + PM->Remove(Pkg, true); + } } - if (Okay && EIPP::ReadResponse(solver_out, PM, Progress) == false) + if (EIPP::ReadResponse(solver_out, PM, Progress) == false) return false; - return ExecWait(solver_pid, solver); + bool const waited = ExecWait(solver_pid, solver); + return Okay && waited; } /*}}}*/ bool EIPP::WriteRequest(pkgDepCache &Cache, FileFd &output, /*{{{*/ -- cgit v1.2.3