]> git.saurik.com Git - apt.git/commitdiff
* apt-pkg/deb/dpkgpm.cc:
authorMichael Vogt <michael.vogt@ubuntu.com>
Thu, 24 Sep 2009 09:49:45 +0000 (11:49 +0200)
committerMichael Vogt <michael.vogt@ubuntu.com>
Thu, 24 Sep 2009 09:49:45 +0000 (11:49 +0200)
  - when tcgetattr() returns non-zero skip all pty magic
    (thanks to Simon Richter, closes: #509866)
* apt-inst/contrib/arfile.cc:
  - show propper error message for Invalid archive members

1  2 
apt-inst/contrib/arfile.cc
apt-pkg/deb/dpkgpm.cc
debian/changelog

index e6c63d1ab5f03fe1e70fe2c4aab383adcd4b7293,8f30355ed03179a8a92f2f1e659700e4d0612467..8018f4d30792dd99a4fc67da30850f05081edce1
@@@ -87,7 -87,7 +87,7 @@@ bool ARArchive::LoadHeaders(
          StrToNum(Head.Size,Memb->Size,sizeof(Head.Size)) == false)
        {
         delete Memb;
-        return _error->Error(_("Invalid archive member header"));
+        return _error->Error(_("Invalid archive member header %s"), Head.Name);
        }
         
        // Check for an extra long name string
@@@ -96,7 -96,7 +96,7 @@@
         char S[300];
         unsigned long Len;
         if (StrToNum(Head.Name+3,Len,sizeof(Head.Size)-3) == false ||
 -           Len >= strlen(S))
 +           Len >= sizeof(S))
         {
            delete Memb;
            return _error->Error(_("Invalid archive member header"));
diff --combined apt-pkg/deb/dpkgpm.cc
index aec4edc49f7ccd2b70aa9699da15a5ea37b3ea62,ab71d4e964ec95a1505c21b01f2cbe79d0509244..f017d53e7a3395865fb94f640daf4fd07458b9fb
@@@ -134,14 -134,8 +134,14 @@@ bool pkgDPkgPM::Configure(PkgIterator P
  {
     if (Pkg.end() == true)
        return false;
 -   
 -   List.push_back(Item(Item::Configure,Pkg));
 +
 +   List.push_back(Item(Item::Configure, Pkg));
 +
 +   // Use triggers for config calls if we configure "smart"
 +   // as otherwise Pre-Depends will not be satisfied, see #526774
 +   if (_config->FindB("DPkg::TriggersPending", false) == true)
 +      List.push_back(Item(Item::TriggersPending, PkgIterator()));
 +
     return true;
  }
                                                                        /*}}}*/
@@@ -196,9 -190,6 +196,9 @@@ bool pkgDPkgPM::SendV2Pkgs(FILE *F
     // Write out the package actions in order.
     for (vector<Item>::iterator I = List.begin(); I != List.end(); I++)
     {
 +      if(I->Pkg.end() == true)
 +       continue;
 +
        pkgDepCache::StateCache &S = Cache[I->Pkg];
        
        fprintf(F,"%s ",I->Pkg.Name());
@@@ -387,11 -378,10 +387,11 @@@ void pkgDPkgPM::DoTerminalPty(int maste
   */
  void pkgDPkgPM::ProcessDpkgStatusLine(int OutStatusFd, char *line)
  {
 +   bool const Debug = _config->FindB("Debug::pkgDPkgProgressReporting",false);
     // the status we output
     ostringstream status;
  
 -   if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true)
 +   if (Debug == true)
        std::clog << "got from dpkg '" << line << "'" << std::endl;
  
  
        'processing: install: pkg'
        'processing: configure: pkg'
        'processing: remove: pkg'
 +      'processing: purge: pkg' - but for apt is it a ignored "unknown" action
        'processing: trigproc: trigger'
            
     */
     TokSplitString(':', line, list, sizeof(list)/sizeof(list[0]));
     if( list[0] == NULL || list[1] == NULL || list[2] == NULL) 
     {
 -      if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true)
 +      if (Debug == true)
         std::clog << "ignoring line: not enough ':'" << std::endl;
        return;
     }
 -   char *pkg = list[1];
 -   char *action = _strstrip(list[2]);
 +   const char* const pkg = list[1];
 +   const char* action = _strstrip(list[2]);
  
     // 'processing' from dpkg looks like
     // 'processing: action: pkg'
     if(strncmp(list[0], "processing", strlen("processing")) == 0)
     {
        char s[200];
 -      char *pkg_or_trigger = _strstrip(list[2]);
 -      action =_strstrip( list[1]);
 +      const char* const pkg_or_trigger = _strstrip(list[2]);
 +      action = _strstrip( list[1]);
        const std::pair<const char *, const char *> * const iter =
        std::find_if(PackageProcessingOpsBegin,
                     PackageProcessingOpsEnd,
                     MatchProcessingOp(action));
        if(iter == PackageProcessingOpsEnd)
        {
 -       if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true)
 -          std::clog << "ignoring unknwon action: " << action << std::endl;
 +       if (Debug == true)
 +          std::clog << "ignoring unknown action: " << action << std::endl;
         return;
        }
        snprintf(s, sizeof(s), _(iter->second), pkg_or_trigger);
             << endl;
        if(OutStatusFd > 0)
         write(OutStatusFd, status.str().c_str(), status.str().size());
 -      if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true)
 +      if (Debug == true)
         std::clog << "send: '" << status.str() << "'" << endl;
        return;
     }
             << endl;
        if(OutStatusFd > 0)
         write(OutStatusFd, status.str().c_str(), status.str().size());
 -      if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true)
 +      if (Debug == true)
         std::clog << "send: '" << status.str() << "'" << endl;
        return;
     }
 -   if(strncmp(action,"conffile",strlen("conffile")) == 0)
 +   else if(strncmp(action,"conffile",strlen("conffile")) == 0)
     {
        status << "pmconffile:" << list[1]
             << ":"  << (PackagesDone/float(PackagesTotal)*100.0) 
             << endl;
        if(OutStatusFd > 0)
         write(OutStatusFd, status.str().c_str(), status.str().size());
 -      if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true)
 +      if (Debug == true)
         std::clog << "send: '" << status.str() << "'" << endl;
        return;
     }
  
 -   vector<struct DpkgState> &states = PackageOps[pkg];
 +   vector<struct DpkgState> const &states = PackageOps[pkg];
     const char *next_action = NULL;
     if(PackageOpsDone[pkg] < states.size())
        next_action = states[PackageOpsDone[pkg]].state;
             << endl;
        if(OutStatusFd > 0)
         write(OutStatusFd, status.str().c_str(), status.str().size());
 -      if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true)
 +      if (Debug == true)
         std::clog << "send: '" << status.str() << "'" << endl;
     }
 -   if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true) 
 +   if (Debug == true) 
        std::clog << "(parsed from dpkg) pkg: " << pkg 
                << " action: " << action << endl;
  }
 -
 -// DPkgPM::DoDpkgStatusFd                                             /*{{{*/
 +                                                                      /*}}}*/
 +// DPkgPM::DoDpkgStatusFd                                             /*{{{*/
  // ---------------------------------------------------------------------
  /*
   */
@@@ -549,7 -538,7 +549,7 @@@ void pkgDPkgPM::DoDpkgStatusFd(int stat
     dpkgbuf_pos = dpkgbuf+dpkgbuf_pos-p;
  }
                                                                        /*}}}*/
 -
 +// DPkgPM::OpenLog                                                    /*{{{*/
  bool pkgDPkgPM::OpenLog()
  {
     string logdir = _config->FindDir("Dir::Log");
     }
     return true;
  }
 -
 +                                                                      /*}}}*/
 +// DPkg::CloseLog                                                     /*{{{*/
  bool pkgDPkgPM::CloseLog()
  {
     if(term_out)
     term_out = NULL;
     return true;
  }
 -
 +                                                                      /*}}}*/
  /*{{{*/
  // This implements a racy version of pselect for those architectures
  // that don't have a working implementation.
@@@ -612,6 -600,7 +612,6 @@@ static int racy_pselect(int nfds, fd_se
     return retval;
  }
  /*}}}*/
 -
  // DPkgPM::Go - Run the sequence                                      /*{{{*/
  // ---------------------------------------------------------------------
  /* This globs the operations and calls dpkg 
@@@ -628,9 -617,9 +628,9 @@@ bool pkgDPkgPM::Go(int OutStatusFd
     sigset_t sigmask;
     sigset_t original_sigmask;
  
 -   unsigned int MaxArgs = _config->FindI("Dpkg::MaxArgs",8*1024);   
 -   unsigned int MaxArgBytes = _config->FindI("Dpkg::MaxArgBytes",32*1024);
 -   bool NoTriggers = _config->FindB("DPkg::NoTriggers",false);
 +   unsigned int const MaxArgs = _config->FindI("Dpkg::MaxArgs",8*1024);
 +   unsigned int const MaxArgBytes = _config->FindI("Dpkg::MaxArgBytes",32*1024);
 +   bool const NoTriggers = _config->FindB("DPkg::NoTriggers", false);
  
     if (RunScripts("DPkg::Pre-Invoke") == false)
        return false;
     if (RunScriptsWithPkgs("DPkg::Pre-Install-Pkgs") == false)
        return false;
  
 +   // 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");
 +   if (_config->FindB("DPkg::ConfigurePending", SmartConf) == true)
 +      List.push_back(Item(Item::ConfigurePending, PkgIterator()));
 +
     // map the dpkg states to the operations that are performed
     // (this is sorted in the same way as Item::Ops)
     static const struct DpkgState DpkgStatesOpMap[][7] = {
     // that will be [installed|configured|removed|purged] and add
     // them to the PackageOps map (the dpkg states it goes through)
     // and the PackageOpsTranslations (human readable strings)
 -   for (vector<Item>::iterator I = List.begin(); I != List.end();I++)
 +   for (vector<Item>::const_iterator I = List.begin(); I != List.end();I++)
     {
 -      string name = (*I).Pkg.Name();
 +      if((*I).Pkg.end() == true)
 +       continue;
 +
 +      string const name = (*I).Pkg.Name();
        PackageOpsDone[name] = 0;
        for(int i=0; (DpkgStatesOpMap[(*I).Op][i]).state != NULL;  i++) 
        {
         PackageOps[name].push_back(DpkgStatesOpMap[(*I).Op][i]);
         PackagesTotal++;
        }
 -   }   
 +   }
  
     stdin_is_dev_null = false;
  
     OpenLog();
  
     // this loop is runs once per operation
 -   for (vector<Item>::iterator I = List.begin(); I != List.end();)
 +   for (vector<Item>::const_iterator I = List.begin(); I != List.end();)
     {
 -      vector<Item>::iterator J = I;
 +      vector<Item>::const_iterator J = I;
        for (; J != List.end() && J->Op == I->Op; J++)
         /* nothing */;
  
        
        unsigned int n = 0;
        unsigned long Size = 0;
 -      string Tmp = _config->Find("Dir::Bin::dpkg","dpkg");
 +      string const Tmp = _config->Find("Dir::Bin::dpkg","dpkg");
        Args[n++] = Tmp.c_str();
        Size += strlen(Args[n-1]);
        
         
         case Item::Configure:
         Args[n++] = "--configure";
 -       if (NoTriggers)
 -          Args[n++] = "--no-triggers";
         Size += strlen(Args[n-1]);
         break;
 -       
 +
 +       case Item::ConfigurePending:
 +       Args[n++] = "--configure";
 +       Size += strlen(Args[n-1]);
 +       Args[n++] = "--pending";
 +       Size += strlen(Args[n-1]);
 +       break;
 +
 +       case Item::TriggersPending:
 +       Args[n++] = "--triggers-only";
 +       Size += strlen(Args[n-1]);
 +       Args[n++] = "--pending";
 +       Size += strlen(Args[n-1]);
 +       break;
 +
         case Item::Install:
         Args[n++] = "--unpack";
         Size += strlen(Args[n-1]);
         Size += strlen(Args[n-1]);
         break;
        }
 -      
 +
 +      if (NoTriggers == true && I->Op != Item::TriggersPending &&
 +        I->Op != Item::ConfigurePending)
 +      {
 +       Args[n++] = "--no-triggers";
 +       Size += strlen(Args[n-1]);
 +      }
 +
        // Write in the file or package names
        if (I->Op == Item::Install)
        {
        {
         for (;I != J && Size < MaxArgBytes; I++)
         {
 +          if((*I).Pkg.end() == true)
 +             continue;
            Args[n++] = I->Pkg.Name();
            Size += strlen(Args[n-1]);
         }       
  
        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
        int Status = 0;
  
        // we read from dpkg here
 -      int _dpkgin = fd[0];
 +      int const _dpkgin = fd[0];
        close(fd[1]);                        // close the write end of the pipe
  
 -      // the result of the waitpid call
 -      int res;
        if(slave > 0)
         close(slave);
  
        sigemptyset(&sigmask);
        sigprocmask(SIG_BLOCK,&sigmask,&original_sigmask);
  
 +      // the result of the waitpid call
 +      int res;
        int select_ret;
        while ((res=waitpid(Child,&Status, WNOHANG)) != Child) {
         if(res < 0) {
         // if it was set to "keep-dpkg-runing" then we won't return
         // here but keep the loop going and just report it as a error
         // for later
 -       bool stopOnError = _config->FindB("Dpkg::StopOnError",true);
 +       bool const stopOnError = _config->FindB("Dpkg::StopOnError",true);
         
         if(stopOnError)
            RunScripts("DPkg::Post-Invoke");
diff --combined debian/changelog
index 90e5f8de1661f8314d3c9b3285f2cc8145567138,cad22383334dce5cc542102d56d82889b52172ff..9def86ce9a4c9088f11835d3886bf1b785c97670
@@@ -1,72 -1,14 +1,79 @@@
 -apt (0.7.22.4) unstable; urgency=low
 +apt (0.7.24) UNRELEASED; urgency=low
  
 - -- Michael Vogt <michael.vogt@ubuntu.com>  Mon, 31 Aug 2009 11:08:03 +0200
 +  [ Nicolas François ]
 +  * Cleaned up the first patch draft from KURASAWA Nozomu to finally
 +    get po4a support for translating the man pages.
 +    Many thanks to both for this excellent work! (Closes: #441608)
 +  * doc/ja/*, doc/po/ja.po:
 +    - remove the old ja man page translation and replace it with
 +      the new po4a-powered translation by KURASAWA Nozomu.
 +  * doc/*.?.xml (manpages):
 +    - add contrib to author tags and also add refmiscinfo to fix warnings
 +  * doc/style.txt, buildlib/defaults.mak, buildlib/manpage.mak:
 +    - fix a few typos in the comments of this files
 +
++  [ Michael Vogt ]
+   * apt-pkg/deb/dpkgpm.cc:
+     - when tcgetattr() returns non-zero skip all pty magic 
+       (thanks to Simon Richter, closes: #509866)
+   * apt-inst/contrib/arfile.cc:
+     - show propper error message for Invalid archive members
 +  [ David Kalnischkies ]
 +  * doc/Doxyfile.in:
 +    - update file with doxygen 1.6.1 (current unstable)
 +    - activate DOT_MULTI_TARGETS, it is default on since doxygen 1.5.9
 +  * buildlib/po4a_manpage.mak, doc/makefile, configure:
 +    - simplify the makefiles needed for po4a manpages
 +  * apt-pkg/contrib/configuration.cc:
 +    - add a helper to easily get a vector of strings from the config
 +  * apt-pkg/contrib/strutl.cc:
 +    - replace unknown multibytes with ? in UTF8ToCharset (Closes: #545208)
 +  * doc/apt-get.8.xml:
 +    - fix two little typos in the --simulate description.
 +  * apt-pkg/aptconfiguration.cc, doc/apt.conf.5.xml:
 +    - add an order subgroup to the compression types to simplify reordering
 +      a bit and improve the documentation for this option group.
 +  * doc/apt.ent, all man pages:
 +    - move the description of files to globally usable entities
 +  * doc/apt_preferences.5.xml:
 +    - document the new preferences.d folder (Closes: #544017)
 +  * methods/rred.cc:
 +    - add at the top without failing (by Bernhard R. Link, Closes: #545694)
 +  * buildlib/sizetable:
 +    - add amd64 for cross building (by Mikhail Gusarov, Closes: #513058)
 +  * debian/prerm:
 +    - remove file as nobody will upgrade from 0.4.10 anymore
 +  * debian/control:
 +    - remove gnome-apt suggestion as it was removed from debian
 +  * apt-pkg/deb/dpkgpm.cc, apt-pkg/packagemanager.cc, apt-pkg/orderlist.cc:
 +    - add and document _experimental_ options to make (aggressive)
 +      use of dpkg's trigger and configuration handling (Closes: #473461)
 +
 +  [ Christian Perrier ]
 +  * doc/fr/*, doc/po/fr.po:
 +    - remove the old fr man page translation and replace it with
 +      the new po4a-powered translation
 +  * doc/pl, doc/de: dropped (pl translation is useless as the translated
 +    document is not provideed anymore and the de translation is too
 +    incomplete to be used)
 +
 + -- David Kalnischkies <kalnischkies@gmail.com>  Fri, 28 Aug 2009 09:40:08 +0200
 +
 +apt (0.7.23.1) unstable; urgency=low
 +
 +  [ Michael Vogt ]
 +  * apt-pkg/pkgcache.cc:
 +    - do not set internel "needs-configure" state for packages in 
 +      triggers-pending state. dpkg will deal with the trigger and
 +      it if does it before we trigger it, dpkg will error out
 +      (LP: #414631)
 +  * apt-pkg/acquire-item.cc:
 +    - do not segfault on invalid items (closes: #544080)
  
 -apt (0.7.22.3) UNRELEASED; urgency=low
 + -- Michael Vogt <mvo@debian.org>  Fri, 28 Aug 2009 21:53:20 +0200
 +
 +apt (0.7.23) unstable; urgency=low
  
    [ Eugene V. Lyubimkin ]
    * methods/{http,https,ftp}, doc/apt.conf.5.xml:
        mentioned above are not specified.
        (Closes: #445985, #157759, #320184, #365880, #479617)
    
 -  [ Michael Vogt ]
 -  * apt-pkg/pkgcache.cc:
 -    - do not set internel "needs-configure" state for packages in 
 -      triggers-pending state. dpkg will deal with the trigger and
 -      it if does it before we trigger it, dpkg will error out
 -      (LP: #414631)
 +  [ David Kalnischkies ]
 +  * cmdline/apt-get.cc:
 +    - add APT::Get::HideAutoRemove=small to display only a short line
 +      instead of the full package list. (Closes: #537450)
 +    - ShowBroken() in build-dep (by Mike O'Connor, Closes: #145916)
 +    - check for statfs.f_type (by Robert Millan, Closes: #509313)
 +    - correct the order of picked package binary vs source in source
 +    - use SourceVersion instead of the BinaryVersion to get the source
 +      Patch by Matt Kraai, thanks! (Closes: #382826)
 +    - add pkg/archive and codename in source (Closes: #414105, #441178)
 +  * apt-pkg/contrib/strutl.cc:
 +    - enable thousand separator according to the current locale
 +      (by Luca Bruno, Closes: #223712)
 +  * doc/apt.conf.5.xml:
 +    - mention the apt.conf.d dir (by Vincent McIntyre, Closes: #520831)
 +  * apt-inst/contrib/arfile.cc:
 +    - use sizeof instead strlen (by Marius Vollmer, Closes: #504325)
 +  * doc/apt-mark.8.xml:
 +    - improve manpage based on patch by Carl Chenet (Closes: #510286)
 +  * apt-pkg/acquire-item.cc:
 +    - use configsettings for dynamic compression type use and order.
 +      Based on a patch by Jyrki Muukkonen, thanks! (LP: #71746)
 +  * apt-pkg/aptconfiguration.cc:
 +    - add default configuration for compression types and add lzma
 +      support. Order is now bzip2, lzma, gzip, none (Closes: #510526)
 +  * ftparchive/writer.cc:
 +    - add lzma support also here, patch for this (and inspiration for
 +      the one above) by Robert Millan, thanks!
 +  * apt-pkg/depcache.cc:
 +    - restore the --ignore-hold effect in the Is{Delete,Install}Ok hooks
 +  * doc/apt-get.8.xml:
 +    - update the source description to reflect what it actually does
 +      and how it can be used. (Closes: #413021)
 +  * methods/http.cc:
 +    - allow empty Reason-Phase in Status-Line to please squid,
 +      thanks Modestas Vainius for noticing! (Closes: #531157, LP: #411435)
 +
 +  [ George Danchev ]
 +  * cmdline/apt-cache.cc:
 +    - fix a memory leak in the xvcg method (Closes: #511557)
 +  * apt-pkg/indexcopy.cc:
 +    - fix a memory leak then the Release file not exists (Closes: #511556)
  
 - -- Michael Vogt <mvo@debian.org>  Wed, 19 Aug 2009 11:14:15 +0200
 + -- Michael Vogt <mvo@debian.org>  Thu, 27 Aug 2009 14:44:39 +0200
  
  apt (0.7.22.2) unstable; urgency=low
  
@@@ -207,7 -113,7 +214,7 @@@ apt (0.7.22) unstable; urgency=lo
        (off by default)
      - send "dpkg-exec" message on the status fd when dpkg is run
      - provide DPkg::Chroot-Directory config option (useful for testing)
 -    - fix potential hang when in a backgroud process group
 +    - fix potential hang when in a background process group
    * apt-pkg/algorithms.cc:
      - consider recommends when making the scores for the problem 
        resolver
    * apt-pkg/deb/debsystem.cc:
      - make strings i18n able 
    * fix problematic use of tolower() when calculating the version 
 -    hash by using locale independant tolower_ascii() function. 
 +    hash by using locale independent tolower_ascii() function. 
      Thanks to M. Vefa Bicakci (LP: #80248)
    * build fixes for g++-4.4
    * cmdline/apt-mark: