Просмотр исходного кода

- when writting apport reports, attach the dpkg
terminal log too

Michael Vogt лет назад: 19
Родитель
Сommit
8ecd1fedea
3 измененных файлов с 30 добавлено и 6 удалено
  1. 25 4
      apt-pkg/deb/dpkgpm.cc
  2. 3 2
      apt-pkg/deb/dpkgpm.h
  3. 2 0
      debian/changelog

+ 25 - 4
apt-pkg/deb/dpkgpm.cc

@@ -44,7 +44,8 @@ using namespace std;
 // ---------------------------------------------------------------------
 /* */
 pkgDPkgPM::pkgDPkgPM(pkgDepCache *Cache) 
-   : pkgPackageManager(Cache), dpkgbuf_pos(0), PackagesTotal(0), PackagesDone(0)
+   : pkgPackageManager(Cache), dpkgbuf_pos(0), PackagesTotal(0), 
+     PackagesDone(0), term_out(NULL)
 {
 }
 									/*}}}*/
@@ -351,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,};
 
@@ -569,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");
@@ -812,7 +812,7 @@ bool pkgDPkgPM::Go(int OutStatusFd)
 	    continue;
 
 	 if(FD_ISSET(master, &rfds))
-	    DoTerminalPty(master, term_out);
+	    DoTerminalPty(master);
 	 if(FD_ISSET(0, &rfds))
 	    DoStdin(master);
 	 if(FD_ISSET(_dpkgin, &rfds))
@@ -956,6 +956,27 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg)
    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);
 }
 									/*}}}*/

+ 3 - 2
apt-pkg/deb/dpkgpm.h

@@ -26,7 +26,8 @@ class pkgDPkgPM : public pkgPackageManager
    // the buffer we use for the dpkg status-fd reading
    char dpkgbuf[1024];
    int dpkgbuf_pos;
-
+   FILE *term_out;
+   
    protected:
    int pkgFailures;
 
@@ -71,7 +72,7 @@ class pkgDPkgPM : public pkgPackageManager
 
    // 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);
 

+ 2 - 0
debian/changelog

@@ -14,6 +14,8 @@ apt (0.7.6ubuntu1) gutsy; urgency=low
     - merged dpkg-log branch, this lets you specify a 
       Dir::Log::Terminal file to log dpkg output to
     (ABI break)
+    - when writting apport reports, attach the dpkg
+      terminal log too
   * merged apt--sha256 branch to fully support the new
     sha256 checksums in the Packages and Release files
     (ABI break)