X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/8e11253db6070bede2ecba01dbd3fde6019c8260..cfcdf7fe9f8c925847fe8d8a18bb0996dd9391a5:/apt-pkg/deb/dpkgpm.cc?ds=sidebyside diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 84443447f..b37980b7e 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -308,6 +308,15 @@ bool pkgDPkgPM::RunScriptsWithPkgs(const char *Cnf) SetCloseExec(STDIN_FILENO,false); SetCloseExec(STDERR_FILENO,false); + if (_config->FindDir("DPkg::Chroot-Directory","/") != "/") + { + std::cerr << "Chrooting into " + << _config->FindDir("DPkg::Chroot-Directory") + << std::endl; + if (chroot(_config->FindDir("DPkg::Chroot-Directory","/").c_str()) != 0) + _exit(100); + } + const char *Args[4]; Args[0] = "/bin/sh"; Args[1] = "-c"; @@ -382,8 +391,9 @@ void pkgDPkgPM::DoTerminalPty(int master) { // this happens when the child is about to exit, we // give it time to actually exit, otherwise we run - // into a race - usleep(500000); + // into a race so we sleep for half a second. + struct timespec sleepfor = { 0, 500000000 }; + nanosleep(&sleepfor, NULL); return; } if(len <= 0) @@ -993,6 +1003,7 @@ bool pkgDPkgPM::Go(int OutStatusFd) else { string const nativeArch = _config->Find("APT::Architecture"); + unsigned long const oldSize = I->Op == Item::Configure ? Size : 0; for (;I != J && Size < MaxArgBytes; I++) { if((*I).Pkg.end() == true) @@ -1003,14 +1014,15 @@ bool pkgDPkgPM::Go(int OutStatusFd) Args[n++] = I->Pkg.Name(); else { - string const PkgDesc = I->Pkg.Name() + string(":") + string(I->Pkg.Arch()); - Packages[pkgcount] = new char[PkgDesc.size()+1]; - strncpy(Packages[pkgcount++],PkgDesc.c_str(),PkgDesc.size()+1); - Args[n++] = Packages[pkgcount-1]; + Packages[pkgcount] = strdup(I->Pkg.FullName(false).c_str()); + Args[n++] = Packages[pkgcount++]; } Size += strlen(Args[n-1]); - } - } + } + // skip configure action if all sheduled packages disappeared + if (oldSize == Size) + continue; + } Args[n] = 0; J = I; @@ -1160,7 +1172,7 @@ bool pkgDPkgPM::Go(int OutStatusFd) /* clean up the temporary allocation for multiarch package names in the parent, so we don't leak memory when we return. */ for (unsigned int i = 0; i < pkgcount; i++) - delete [] Packages[i]; + free(Packages[i]); // the result of the waitpid call int res;