summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/deb/dpkgpm.cc6
-rw-r--r--apt-pkg/iprogress.cc9
-rw-r--r--apt-pkg/packagemanager.cc18
-rw-r--r--apt-private/private-install.cc3
4 files changed, 21 insertions, 15 deletions
diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc
index 36d8c829a..fbb5e4c96 100644
--- a/apt-pkg/deb/dpkgpm.cc
+++ b/apt-pkg/deb/dpkgpm.cc
@@ -1264,6 +1264,9 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress)
_error->DumpErrors(std::cerr);
_error->RevertToStack();
+ // this is the dpkg status-fd, we need to keep it
+ _config->Set("APT::Keep-Fds::",fd[1]);
+
// Tell the progress that its starting and fork dpkg
d->progress->Start();
pid_t Child = ExecFork();
@@ -1316,6 +1319,9 @@ bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress)
if (_config->FindB("DPkg::UseIoNice", false) == true)
ionice(Child);
+ // clear the Keep-Fd again
+ _config->Clear("APT::Keep-Fds",fd[1]);
+
// Wait for dpkg
int Status = 0;
diff --git a/apt-pkg/iprogress.cc b/apt-pkg/iprogress.cc
index 7de190da0..bed991d68 100644
--- a/apt-pkg/iprogress.cc
+++ b/apt-pkg/iprogress.cc
@@ -8,7 +8,7 @@
#include <termios.h>
#include <sys/ioctl.h>
#include <sstream>
-
+#include <fcntl.h>
namespace APT {
namespace Progress {
@@ -42,7 +42,12 @@ void PackageManagerProgressFd::WriteToStatusFd(std::string s)
void PackageManagerProgressFd::Start()
{
- _config->Set("APT::Keep-Fds::", OutStatusFd);
+ if(OutStatusFd <= 0)
+ return;
+
+ // FIXME: use SetCloseExec here once it taught about throwing
+ // exceptions instead of doing _exit(100) on failure
+ fcntl(OutStatusFd,F_SETFD,FD_CLOEXEC);
// send status information that we are about to fork dpkg
std::ostringstream status;
diff --git a/apt-pkg/packagemanager.cc b/apt-pkg/packagemanager.cc
index 32bc5284e..3690a64c3 100644
--- a/apt-pkg/packagemanager.cc
+++ b/apt-pkg/packagemanager.cc
@@ -26,7 +26,6 @@
#include <apt-pkg/sptr.h>
#include <iostream>
-#include <fcntl.h>
#include <apti18n.h>
/*}}}*/
@@ -1034,18 +1033,11 @@ pkgPackageManager::OrderResult pkgPackageManager::OrderInstall()
pkgPackageManager::OrderResult
pkgPackageManager::DoInstallPostFork(APT::Progress::PackageManager *progress)
{
-// FIXME: port to new structure
-#if 0
- if(statusFd > 0)
- // FIXME: use SetCloseExec here once it taught about throwing
- // exceptions instead of doing _exit(100) on failure
- fcntl(statusFd,F_SETFD,FD_CLOEXEC);
-#endif
- bool goResult = Go(progress);
- if(goResult == false)
- return Failed;
-
- return Res;
+ bool goResult = Go(progress);
+ if(goResult == false)
+ return Failed;
+
+ return Res;
};
/*}}}*/
// PM::DoInstall - Does the installation /*{{{*/
diff --git a/apt-private/private-install.cc b/apt-private/private-install.cc
index d1066c869..8d72faecc 100644
--- a/apt-private/private-install.cc
+++ b/apt-private/private-install.cc
@@ -104,12 +104,14 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask, bool Safety)
if (_config->FindB("APT::Get::Simulate") == true)
{
pkgSimulate PM(Cache);
+
int status_fd = _config->FindI("APT::Status-Fd",-1);
APT::Progress::PackageManager *progress = NULL;
if (status_fd > 0)
progress = new APT::Progress::PackageManagerProgressFd(status_fd);
pkgPackageManager::OrderResult Res = PM.DoInstall(progress);
delete progress;
+
if (Res == pkgPackageManager::Failed)
return false;
if (Res != pkgPackageManager::Completed)
@@ -341,6 +343,7 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask, bool Safety)
// FIXME: make this a factory
// select the right progress
int status_fd = _config->FindI("APT::Status-Fd",-1);
+
APT::Progress::PackageManager *progress = NULL;
if (status_fd > 0)
progress = new APT::Progress::PackageManagerProgressFd(status_fd);