]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/deb/dpkgpm.cc
Add yet another pseudo package which isn't as pseudo as the others:
[apt.git] / apt-pkg / deb / dpkgpm.cc
index aec4edc49f7ccd2b70aa9699da15a5ea37b3ea62..adaf362fa2e7df529ea2e1e55ac80732c053ac82 100644 (file)
@@ -641,6 +641,7 @@ bool pkgDPkgPM::Go(int OutStatusFd)
    // support subpressing of triggers processing for special
    // cases like d-i that runs the triggers handling manually
    bool const SmartConf = (_config->Find("PackageManager::Configure", "all") != "all");
+   bool const TriggersPending = _config->FindB("DPkg::TriggersPending", false);
    if (_config->FindB("DPkg::ConfigurePending", SmartConf) == true)
       List.push_back(Item(Item::ConfigurePending, PkgIterator()));
 
@@ -701,9 +702,23 @@ bool pkgDPkgPM::Go(int OutStatusFd)
    // this loop is runs once per operation
    for (vector<Item>::const_iterator I = List.begin(); I != List.end();)
    {
+      // Do all actions with the same Op in one run
       vector<Item>::const_iterator J = I;
-      for (; J != List.end() && J->Op == I->Op; J++)
-        /* nothing */;
+      if (TriggersPending == true)
+        for (; J != List.end(); J++)
+        {
+           if (J->Op == I->Op)
+              continue;
+           if (J->Op != Item::TriggersPending)
+              break;
+           vector<Item>::const_iterator T = J + 1;
+           if (T != List.end() && T->Op == I->Op)
+              continue;
+           break;
+        }
+      else
+        for (; J != List.end() && J->Op == I->Op; J++)
+           /* nothing */;
 
       // Generate the argument list
       const char *Args[MaxArgs + 50];
@@ -850,32 +865,35 @@ bool pkgDPkgPM::Go(int OutStatusFd)
 
       struct   termios tt;
       struct   winsize win;
-      int      master;
-      int      slave;
+      int      master = -1;
+      int      slave = -1;
 
-      // FIXME: setup sensible signal handling (*ick*)
-      tcgetattr(0, &tt);
-      ioctl(0, TIOCGWINSZ, (char *)&win);
-      if (openpty(&master, &slave, NULL, &tt, &win) < 0) 
+      // if tcgetattr does not return zero there was a error
+      // and we do not do any pty magic
+      if (tcgetattr(0, &tt) == 0)
       {
-        const char *s = _("Can not write log, openpty() "
-                          "failed (/dev/pts not mounted?)\n");
-        fprintf(stderr, "%s",s);
-        fprintf(term_out, "%s",s);
-        master = slave = -1;
-      }  else {
-        struct termios rtt;
-        rtt = tt;
-        cfmakeraw(&rtt);
-        rtt.c_lflag &= ~ECHO;
-        // block SIGTTOU during tcsetattr to prevent a hang if
-        // the process is a member of the background process group
-        // http://www.opengroup.org/onlinepubs/000095399/functions/tcsetattr.html
-        sigemptyset(&sigmask);
-        sigaddset(&sigmask, SIGTTOU);
-        sigprocmask(SIG_BLOCK,&sigmask, &original_sigmask);
-        tcsetattr(0, TCSAFLUSH, &rtt);
-        sigprocmask(SIG_SETMASK, &original_sigmask, 0);
+        ioctl(0, TIOCGWINSZ, (char *)&win);
+        if (openpty(&master, &slave, NULL, &tt, &win) < 0) 
+        {
+           const char *s = _("Can not write log, openpty() "
+                             "failed (/dev/pts not mounted?)\n");
+           fprintf(stderr, "%s",s);
+           fprintf(term_out, "%s",s);
+           master = slave = -1;
+        }  else {
+           struct termios rtt;
+           rtt = tt;
+           cfmakeraw(&rtt);
+           rtt.c_lflag &= ~ECHO;
+           // block SIGTTOU during tcsetattr to prevent a hang if
+           // the process is a member of the background process group
+           // http://www.opengroup.org/onlinepubs/000095399/functions/tcsetattr.html
+           sigemptyset(&sigmask);
+           sigaddset(&sigmask, SIGTTOU);
+           sigprocmask(SIG_BLOCK,&sigmask, &original_sigmask);
+           tcsetattr(0, TCSAFLUSH, &rtt);
+           sigprocmask(SIG_SETMASK, &original_sigmask, 0);
+        }
       }
 
        // Fork dpkg