]> git.saurik.com Git - apt.git/commitdiff
* merged from apt--mvo
authorMichael Vogt <michael.vogt@ubuntu.com>
Fri, 3 Aug 2007 17:24:22 +0000 (19:24 +0200)
committerMichael Vogt <michael.vogt@ubuntu.com>
Fri, 3 Aug 2007 17:24:22 +0000 (19:24 +0200)
1  2 
apt-pkg/deb/dpkgpm.cc
apt-pkg/deb/dpkgpm.h
debian/control

diff --combined apt-pkg/deb/dpkgpm.cc
index 6cb444ef12d3d461c210b736780dc9894d2fdd5f,168c314836317f9e24787bdcfdb58b78dc4a5a4e..de84ba96af445d88e3665cb1d7011610b3459740
@@@ -12,7 -12,6 +12,7 @@@
  #include <apt-pkg/error.h>
  #include <apt-pkg/configuration.h>
  #include <apt-pkg/depcache.h>
 +#include <apt-pkg/pkgrecords.h>
  #include <apt-pkg/strutl.h>
  
  #include <unistd.h>
@@@ -44,8 -43,7 +44,8 @@@ using namespace std
  // ---------------------------------------------------------------------
  /* */
  pkgDPkgPM::pkgDPkgPM(pkgDepCache *Cache) 
-    : pkgPackageManager(Cache), dpkgbuf_pos(0), PackagesTotal(0), 
-      PackagesDone(0), term_out(NULL)
 -   : pkgPackageManager(Cache), dpkgbuf_pos(0), PackagesDone(0), PackagesTotal(0)
++   : pkgPackageManager(Cache), dpkgbuf_pos(0), 
++     PackagesTotal(0), PackagesDone(0), term_out(NULL)
  {
  }
                                                                        /*}}}*/
@@@ -352,7 -350,7 +352,7 @@@ void pkgDPkgPM::DoStdin(int master
  /*
   * read the terminal pty and write log
   */
 -void pkgDPkgPM::DoTerminalPty(int master, FILE *term_out)
 +void pkgDPkgPM::DoTerminalPty(int master)
  {
     char term_buf[1024] = {0,};
  
@@@ -411,8 -409,6 +411,8 @@@ void pkgDPkgPM::ProcessDpkgStatusLine(i
         write(OutStatusFd, status.str().c_str(), status.str().size());
        if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true)
         std::clog << "send: '" << status.str() << "'" << endl;
 +      pkgFailures++;
 +      WriteApportReport(list[1], list[3]);
        return;
     }
     if(strncmp(action,"conffile",strlen("conffile")) == 0)
@@@ -570,6 -566,7 +570,6 @@@ bool pkgDPkgPM::Go(int OutStatusFd
        return _error->Error(_("Directory '%s' missing"), logdir.c_str());
     string logfile_name = flCombine(logdir,
                                   _config->Find("Dir::Log::Terminal"));
 -   FILE *term_out = NULL;
     if (!logfile_name.empty())
     {
        term_out = fopen(logfile_name.c_str(),"a");
        int _dpkgin = fd[0];
        close(fd[1]);                        // close the write end of the pipe
  
-       // the read buffers for the communication with dpkg
-       char buf[2] = {0,0};
-       
        // the result of the waitpid call
        int res;
        close(slave);
            continue;
  
         if(FD_ISSET(master, &rfds))
 -          DoTerminalPty(master, term_out);
 +          DoTerminalPty(master);
         if(FD_ISSET(0, &rfds))
            DoStdin(master);
         if(FD_ISSET(_dpkgin, &rfds))
@@@ -868,115 -862,3 +865,115 @@@ void pkgDPkgPM::Reset(
     List.erase(List.begin(),List.end());
  }
                                                                        /*}}}*/
 +// pkgDpkgPM::WriteApportReport - write out error report pkg failure  /*{{{*/
 +// ---------------------------------------------------------------------
 +/* */
 +void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg) 
 +{
 +   string pkgname, reportfile, srcpkgname, pkgver, arch;
 +   string::size_type pos;
 +   FILE *report;
 +
 +   if (_config->FindB("Dpkg::ApportFailureReport",true) == false)
 +      return;
 +
 +   // only report the first error if we are in StopOnError=false mode
 +   // to prevent bogus reports
 +   if((_config->FindB("Dpkg::StopOnError",true) == false) && pkgFailures > 1)
 +      return;
 +
 +   // get the pkgname and reportfile
 +   pkgname = flNotDir(pkgpath);
 +   pos = pkgname.rfind('_');
 +   if(pos != string::npos)
 +      pkgname = string(pkgname, 0, pos);
 +
 +   // find the package versin and source package name
 +   pkgCache::PkgIterator Pkg = Cache.FindPkg(pkgname);
 +   if (Pkg.end() == true)
 +      return;
 +   pkgCache::VerIterator Ver = Cache.GetCandidateVer(Pkg);
 +   pkgver = Ver.VerStr();
 +   if (Ver.end() == true)
 +      return;
 +   pkgRecords Recs(Cache);
 +   pkgRecords::Parser &Parse = Recs.Lookup(Ver.FileList());
 +   srcpkgname = Parse.SourcePkg();
 +   if(srcpkgname.empty())
 +      srcpkgname = pkgname;
 +
 +   // if the file exists already, we check:
 +   // - if it was reported already (touched by apport). 
 +   //   If not, we do nothing, otherwise
 +   //    we overwrite it. This is the same behaviour as apport
 +   // - if we have a report with the same pkgversion already
 +   //   then we skip it
 +   reportfile = flCombine("/var/crash",pkgname+".0.crash");
 +   if(FileExists(reportfile))
 +   {
 +      struct stat buf;
 +      char strbuf[255];
 +
 +      // check atime/mtime
 +      stat(reportfile.c_str(), &buf);
 +      if(buf.st_mtime > buf.st_atime)
 +       return;
 +
 +      // check if the existing report is the same version
 +      report = fopen(reportfile.c_str(),"r");
 +      while(fgets(strbuf, sizeof(strbuf), report) != NULL)
 +      {
 +       if(strstr(strbuf,"Package:") == strbuf)
 +       {
 +          char pkgname[255], version[255];
 +          if(sscanf(strbuf, "Package: %s %s", pkgname, version) == 2)
 +             if(strcmp(pkgver.c_str(), version) == 0)
 +             {
 +                fclose(report);
 +                return;
 +             }
 +       }
 +      }
 +      fclose(report);
 +   }
 +
 +   // now write the report
 +   arch = _config->Find("APT::Architecture");
 +   report = fopen(reportfile.c_str(),"w");
 +   if(report == NULL)
 +      return;
 +   if(_config->FindB("DPkgPM::InitialReportOnly",false) == true)
 +      chmod(reportfile.c_str(), 0);
 +   else
 +      chmod(reportfile.c_str(), 0600);
 +   fprintf(report, "ProblemType: Package\n");
 +   fprintf(report, "Architecture: %s\n", arch.c_str());
 +   time_t now = time(NULL);
 +   fprintf(report, "Date: %s" , ctime(&now));
 +   fprintf(report, "Package: %s %s\n", pkgname.c_str(), pkgver.c_str());
 +   fprintf(report, "SourcePackage: %s\n", srcpkgname.c_str());
 +   fprintf(report, "ErrorMessage:\n %s\n", errormsg);
 +
 +   // ensure that the log is flushed
 +   if(term_out)
 +      fflush(term_out);
 +
 +   // attach terminal log it if we have it
 +   string logfile_name = _config->FindFile("Dir::Log::Terminal");
 +   if (!logfile_name.empty())
 +   {
 +      FILE *log = NULL;
 +      char buf[1024];
 +
 +      fprintf(report, "DpkgTerminalLog:\n");
 +      log = fopen(logfile_name.c_str(),"r");
 +      if(log != NULL)
 +      {
 +       while( fgets(buf, sizeof(buf), log) != NULL)
 +          fprintf(report, " %s", buf);
 +       fclose(log);
 +      }
 +   }
 +   fclose(report);
 +}
 +                                                                      /*}}}*/
diff --combined apt-pkg/deb/dpkgpm.h
index 222add98f7c886f4c4d03bf497a0aacbbc9b8395,065c6c917858a34df92c4a31e6acbfa794318b3b..debde36a30d4045b7c9990c345215b6a280b32df
@@@ -26,10 -26,8 +26,10 @@@ class pkgDPkgPM : public pkgPackageMana
     // the buffer we use for the dpkg status-fd reading
     char dpkgbuf[1024];
     int dpkgbuf_pos;
 -
 +   FILE *term_out;
 +   
     protected:
 +   int pkgFailures;
  
     // progress reporting
     struct DpkgState 
     // the dpkg states that are already done; the string is the package
     // the int is the state that is already done (e.g. a package that is
     // going to be install is already in state "half-installed")
-    map<string,int> PackageOpsDone;
+    map<string,unsigned int> PackageOpsDone;
     // progress reporting
-    int PackagesDone;
-    int PackagesTotal;
+    unsigned int PackagesDone;
+    unsigned int PackagesTotal;
    
     struct Item
     {
     bool RunScriptsWithPkgs(const char *Cnf);
     bool SendV2Pkgs(FILE *F);
  
 +   // apport integration
 +   void WriteApportReport(const char *pkgpath, const char *errormsg);
 +
     // input processing
     void DoStdin(int master);
 -   void DoTerminalPty(int master, FILE *out);
 +   void DoTerminalPty(int master);
     void DoDpkgStatusFd(int statusfd, int OutStatusFd);
     void ProcessDpkgStatusLine(int OutStatusFd, char *line);
  
diff --combined debian/control
index ac14c5e0b5ecb3f74c7f849e442ac3047a1ecd7f,742e8ca5c8b1e5cd7e50c810a04b4f20d22a34ab..6c1453857e6f1e183428ebcd5425ba0732ad1eb9
@@@ -1,22 -1,20 +1,22 @@@
  Source: apt
  Section: admin
  Priority: important
 -Maintainer: APT Development Team <deity@lists.debian.org>
 +Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com>
 +XSBC-Original-Maintainer: APT Development Team <deity@lists.debian.org>
  Uploaders: Jason Gunthorpe <jgg@debian.org>, Adam Heath <doogie@debian.org>, Matt Zimmerman <mdz@debian.org>, Michael Vogt <mvo@debian.org>, Otavio Salvador <otavio@debian.org>
  Standards-Version: 3.7.2.2
  Build-Depends: debhelper (>= 5.0), libdb4.4-dev, gettext (>= 0.12), libcurl4-gnutls-dev | libcurl3-gnutls-dev (>= 7.15.5)
  Build-Depends-Indep: debiandoc-sgml, docbook-utils (>= 0.6.12-1)
 -XS-Vcs-Bzr: http://bzr.debian.org/apt/debian-sid/
 +XS-Vcs-Bzr: http://code.launchpad.net/~ubuntu-core-dev/apt/ubuntu
  
  Package: apt
  Architecture: any
 -Depends: ${shlibs:Depends}, debian-archive-keyring
 +Depends: ${shlibs:Depends}
  Priority: important
  Replaces: libapt-pkg-doc (<< 0.3.7), libapt-pkg-dev (<< 0.3.7)
  Provides: ${libapt-pkg:provides}
 -Suggests: aptitude | synaptic | gnome-apt | wajig, dpkg-dev, apt-doc, bzip2, lzma
 +Recommends: ubuntu-keyring
- Suggests: aptitude | synaptic | gnome-apt | wajig, dpkg-dev, apt-doc, bzip2, gnupg, lzma
++Suggests: aptitude | synaptic | gnome-apt | wajig, dpkg-dev, apt-doc, bzip2, lzma, gnupg
  Section: admin
  Description: Advanced front-end for dpkg
   This is Debian's next generation front-end for the dpkg package manager.