+ if (Pkg->CurrentVer != 0)
+ continue;
+ char const * Arch;
+ if (Pkg->VersionList != 0)
+ Arch = Pkg.VersionList().Arch();
+ else
+ Arch = Pkg.Arch();
+ fprintf(dpkg, "Package: %s\nVersion: 0~\nArchitecture: %s\nMaintainer: Dummy Example <dummy@example.org>\n"
+ "Description: dummy package record\n A record is needed to put a package on hold, so here it is.\n\n", Pkg.Name(), Arch);
+ }
+ fclose(dpkg);
+
+ if (dpkgMergeAvail > 0)
+ {
+ int Status = 0;
+ while (waitpid(dpkgMergeAvail, &Status, 0) != dpkgMergeAvail)
+ {
+ if (errno == EINTR)
+ continue;
+ _error->WarningE("dpkgGo", _("Waited for %s but it wasn't there"), "dpkg --merge-avail");
+ break;
+ }
+ if (WIFEXITED(Status) == false || WEXITSTATUS(Status) != 0)
+ return _error->Error(_("Executing dpkg failed. Are you root?"));
+ }
+
+ Args.erase(Args.begin() + BaseArgs, Args.end());
+ Args.push_back("--set-selections");
+ Args.push_back(NULL);
+
+ external[0] = -1;
+ external[1] = -1;
+ if (pipe(external) != 0)
+ return _error->WarningE("DoHold", "Can't create IPC pipe for dpkg --set-selections");
+
+ pid_t dpkgSelection = ExecFork();
+ if (dpkgSelection == 0)
+ {
+ close(external[1]);
+ std::string const chrootDir = _config->FindDir("DPkg::Chroot-Directory");
+ if (chrootDir != "/" && chroot(chrootDir.c_str()) != 0 && chdir("/") != 0)
+ _error->WarningE("getArchitecture", "Couldn't chroot into %s for dpkg --set-selections", chrootDir.c_str());
+ dup2(external[0], STDIN_FILENO);
+ execvp(Args[0], (char**) &Args[0]);
+ _error->WarningE("dpkgGo", "Can't get dpkg --set-selections running!");
+ _exit(2);
+ }
+
+ dpkg = fdopen(external[1], "w");
+ for (APT::PackageList::iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
+ {
+ if (dpkgMultiArch == false)
+ fprintf(dpkg, "%s", Pkg.FullName(true).c_str());
+ else
+ {
+ if (Pkg->CurrentVer != 0)
+ fprintf(dpkg, "%s:%s", Pkg.Name(), Pkg.CurrentVer().Arch());
+ else if (Pkg.VersionList().end() == false)
+ fprintf(dpkg, "%s:%s", Pkg.Name(), Pkg.VersionList().Arch());
+ else
+ fprintf(dpkg, "%s", Pkg.FullName(false).c_str());
+ }
+