]> git.saurik.com Git - apt.git/blobdiff - ftparchive/multicompress.cc
test: Avoid use of /proc/self/fd
[apt.git] / ftparchive / multicompress.cc
index 2a930ca6b9c2a1e8f949f24a46686fda39302474..3ffc5266ee22f8d9547fa7465017b52d20c00b0f 100644 (file)
 #include <apt-pkg/strutl.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/md5.h>
+#include <apt-pkg/aptconfiguration.h>
+#include <apt-pkg/hashsum_template.h>
 
+#include <ctype.h>
+#include <vector>
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <utime.h>
+#include <sys/time.h>
 #include <unistd.h>
-#include <iostream>
 
 #include "multicompress.h"
 #include <apti18n.h>
@@ -43,7 +46,6 @@ MultiCompress::MultiCompress(string const &Output,string const &Compress,
 {
    Outputs = 0;
    Outputter = -1;
-   Input = 0;
    UpdateMTime = 0;
 
    /* Parse the compression string, a space separated lists of compresison
@@ -184,12 +186,11 @@ bool MultiCompress::Start()
    };
 
    close(Pipe[0]);
-   Input = fdopen(Pipe[1],"w");
-   if (Input == 0)
-      return _error->Errno("fdopen",_("Failed to create FILE*"));
-   
+   if (Input.OpenDescriptor(Pipe[1], FileFd::WriteOnly, true) == false)
+      return false;
+
    if (Outputter == -1)
-      return _error->Errno("fork",_("Failed to fork"));   
+      return _error->Errno("fork",_("Failed to fork"));
    return true;
 }
                                                                        /*}}}*/
@@ -198,11 +199,10 @@ bool MultiCompress::Start()
 /* */
 bool MultiCompress::Die()
 {
-   if (Input == 0)
+   if (Input.IsOpen() == false)
       return true;
-   
-   fclose(Input);
-   Input = 0;
+
+   Input.Close();
    bool Res = ExecWait(Outputter,_("Compress child"),false);
    Outputter = -1;
    return Res;
@@ -214,7 +214,7 @@ bool MultiCompress::Die()
 bool MultiCompress::Finalize(unsigned long long &OutSize)
 {
    OutSize = 0;
-   if (Input == 0 || Die() == false)
+   if (Input.IsOpen() == false || Die() == false)
       return false;
    
    time_t Now;
@@ -234,14 +234,12 @@ bool MultiCompress::Finalize(unsigned long long &OutSize)
       else
       {
         // Update the mtime if necessary
-        if (UpdateMTime > 0 && 
+        if (UpdateMTime > 0 &&
             (Now - St.st_mtime > (signed)UpdateMTime || St.st_mtime > Now))
         {
-           struct utimbuf Buf;
-           Buf.actime = Buf.modtime = Now;
-           utime(I->Output.c_str(),&Buf);
+           utimes(I->Output.c_str(), NULL);
            Changed = true;
-        }           
+        }
       }
       
       // Force the file permissions
@@ -260,7 +258,7 @@ bool MultiCompress::Finalize(unsigned long long &OutSize)
 // MultiCompress::OpenOld - Open an old file                           /*{{{*/
 // ---------------------------------------------------------------------
 /* This opens one of the original output files, possibly decompressing it. */
-bool MultiCompress::OpenOld(int &Fd,pid_t &Proc)
+bool MultiCompress::OpenOld(FileFd &Fd)
 {
    Files *Best = Outputs;
    for (Files *I = Outputs; I != 0; I = I->Next)
@@ -268,29 +266,9 @@ bool MultiCompress::OpenOld(int &Fd,pid_t &Proc)
         Best = I;
 
    // Open the file
-   FileFd F(Best->Output,FileFd::ReadOnly);
-   if (_error->PendingError() == true)
-      return false;
-   
-   // Decompress the file so we can read it
-   if (ExecCompressor(Best->CompressProg,&Proc,F.Fd(),Fd,false) == false)
-      return false;
-   
-   return true;
+   return Fd.Open(Best->Output, FileFd::ReadOnly, FileFd::Extension);
 }
                                                                        /*}}}*/
-// MultiCompress::CloseOld - Close the old file                                /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-bool MultiCompress::CloseOld(int Fd,pid_t Proc)
-{
-   close(Fd);
-   if (Proc != -1)
-      if (ExecWait(Proc,_("decompressor"),false) == false)
-        return false;
-   return true;
-}   
-                                                                       /*}}}*/
 // MultiCompress::Child - The writer child                             /*{{{*/
 // ---------------------------------------------------------------------
 /* The child process forks a bunch of compression children and takes 
@@ -345,31 +323,27 @@ bool MultiCompress::Child(int const &FD)
    // Check the MD5 of the lowest cost entity.
    while (Missing == false)
    {
-      int CompFd = -1;
-      pid_t Proc = -1;
-      if (OpenOld(CompFd,Proc) == false)
+      FileFd CompFd;
+      if (OpenOld(CompFd) == false)
       {
         _error->Discard();
         break;
       }
-            
+
       // Compute the hash
       MD5Summation OldMD5;
       unsigned long long NewFileSize = 0;
       while (1)
       {
-        int Res = read(CompFd,Buffer,sizeof(Buffer));
+        unsigned long long Res = 0;
+        if (CompFd.Read(Buffer,sizeof(Buffer), &Res) == false)
+           return _error->Errno("read",_("Failed to read while computing MD5"));
         if (Res == 0)
            break;
-        if (Res < 0)
-           return _error->Errno("read",_("Failed to read while computing MD5"));
         NewFileSize += Res;
         OldMD5.Add(Buffer,Res);
       }
-      
-      // Tidy the compressor
-      if (CloseOld(CompFd,Proc) == false)
-        return false;
+      CompFd.Close();
 
       // Check the hash
       if (OldMD5.Result() == MD5.Result() &&
@@ -378,9 +352,7 @@ bool MultiCompress::Child(int const &FD)
         for (Files *I = Outputs; I != 0; I = I->Next)
         {
            I->TmpFile.Close();
-           if (unlink(I->TmpFile.Name().c_str()) != 0)
-              _error->Errno("unlink",_("Problem unlinking %s"),
-                            I->TmpFile.Name().c_str());
+           RemoveFile("MultiCompress::Child", I->TmpFile.Name());
         }
         return !_error->PendingError();
       }      
@@ -391,7 +363,7 @@ bool MultiCompress::Child(int const &FD)
    for (Files *I = Outputs; I != 0; I = I->Next)
    {
       // Set the correct file modes
-      fchmod(I->TmpFile.Fd(),Permissions);
+      chmod(I->TmpFile.Name().c_str(),Permissions);
       
       if (rename(I->TmpFile.Name().c_str(),I->Output.c_str()) != 0)
         _error->Errno("rename",_("Failed to rename %s to %s"),