|
|
@@ -14,6 +14,7 @@
|
|
|
#include <apt-pkg/depcache.h>
|
|
|
#include <apt-pkg/strutl.h>
|
|
|
#include <apti18n.h>
|
|
|
+#include <apt-pkg/fileutl.h>
|
|
|
|
|
|
#include <unistd.h>
|
|
|
#include <stdlib.h>
|
|
|
@@ -95,68 +96,6 @@ bool pkgDPkgPM::Remove(PkgIterator Pkg,bool Purge)
|
|
|
return true;
|
|
|
}
|
|
|
/*}}}*/
|
|
|
-// DPkgPM::RunScripts - Run a set of scripts /*{{{*/
|
|
|
-// ---------------------------------------------------------------------
|
|
|
-/* This looks for a list of script sto run from the configuration file,
|
|
|
- each one is run with system from a forked child. */
|
|
|
-bool pkgDPkgPM::RunScripts(const char *Cnf)
|
|
|
-{
|
|
|
- Configuration::Item const *Opts = _config->Tree(Cnf);
|
|
|
- if (Opts == 0 || Opts->Child == 0)
|
|
|
- return true;
|
|
|
- Opts = Opts->Child;
|
|
|
-
|
|
|
- // Fork for running the system calls
|
|
|
- pid_t Child = ExecFork();
|
|
|
-
|
|
|
- // This is the child
|
|
|
- if (Child == 0)
|
|
|
- {
|
|
|
- if (chdir("/tmp/") != 0)
|
|
|
- _exit(100);
|
|
|
-
|
|
|
- unsigned int Count = 1;
|
|
|
- for (; Opts != 0; Opts = Opts->Next, Count++)
|
|
|
- {
|
|
|
- if (Opts->Value.empty() == true)
|
|
|
- continue;
|
|
|
-
|
|
|
- if (system(Opts->Value.c_str()) != 0)
|
|
|
- _exit(100+Count);
|
|
|
- }
|
|
|
- _exit(0);
|
|
|
- }
|
|
|
-
|
|
|
- // Wait for the child
|
|
|
- int Status = 0;
|
|
|
- while (waitpid(Child,&Status,0) != Child)
|
|
|
- {
|
|
|
- if (errno == EINTR)
|
|
|
- continue;
|
|
|
- return _error->Errno("waitpid","Couldn't wait for subprocess");
|
|
|
- }
|
|
|
-
|
|
|
- // Restore sig int/quit
|
|
|
- signal(SIGQUIT,SIG_DFL);
|
|
|
- signal(SIGINT,SIG_DFL);
|
|
|
-
|
|
|
- // Check for an error code.
|
|
|
- if (WIFEXITED(Status) == 0 || WEXITSTATUS(Status) != 0)
|
|
|
- {
|
|
|
- unsigned int Count = WEXITSTATUS(Status);
|
|
|
- if (Count > 100)
|
|
|
- {
|
|
|
- Count -= 100;
|
|
|
- for (; Opts != 0 && Count != 1; Opts = Opts->Next, Count--);
|
|
|
- _error->Error("Problem executing scripts %s '%s'",Cnf,Opts->Value.c_str());
|
|
|
- }
|
|
|
-
|
|
|
- return _error->Error("Sub-process returned an error code");
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
- /*}}}*/
|
|
|
// DPkgPM::SendV2Pkgs - Send version 2 package info /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
|
/* This is part of the helper script communication interface, it sends
|
|
|
@@ -763,14 +702,16 @@ bool pkgDPkgPM::Go(int OutStatusFd)
|
|
|
sighandler_t old_SIGINT = signal(SIGINT,SIG_IGN);
|
|
|
|
|
|
struct termios tt;
|
|
|
+ struct termios tt_out;
|
|
|
struct winsize win;
|
|
|
int master;
|
|
|
int slave;
|
|
|
|
|
|
// FIXME: setup sensible signal handling (*ick*)
|
|
|
tcgetattr(0, &tt);
|
|
|
+ tcgetattr(1, &tt_out);
|
|
|
ioctl(0, TIOCGWINSZ, (char *)&win);
|
|
|
- if (openpty(&master, &slave, NULL, &tt, &win) < 0)
|
|
|
+ if (openpty(&master, &slave, NULL, &tt_out, &win) < 0)
|
|
|
{
|
|
|
const char *s = _("Can not write log, openpty() "
|
|
|
"failed (/dev/pts not mounted?)\n");
|