]> git.saurik.com Git - apt.git/blobdiff - ftparchive/multicompress.cc
merged from donkult
[apt.git] / ftparchive / multicompress.cc
index 37a713efd2dfb2b6b50561890144994c02f65954..1fea589e25667380326387c83a23695356bcd60d 100644 (file)
@@ -91,7 +91,7 @@ MultiCompress::MultiCompress(string const &Output,string const &Compress,
    /* Open all the temp files now so we can report any errors. File is 
       made unreable to prevent people from touching it during creating. */
    for (Files *I = Outputs; I != 0; I = I->Next)
-      I->TmpFile.Open(I->Output + ".new",FileFd::WriteEmpty,0600);
+      I->TmpFile.Open(I->Output + ".new", FileFd::WriteOnly | FileFd::Create | FileFd::Empty, FileFd::Extension, 0600);
    if (_error->PendingError() == true)
       return;
 
@@ -183,11 +183,6 @@ bool MultiCompress::Start()
       _exit(0);
    };
 
-   /* Tidy up the temp files, we open them in the constructor so as to
-      get proper error reporting. Close them now. */
-   for (Files *I = Outputs; I != 0; I = I->Next)
-      I->TmpFile.Close();
-   
    close(Pipe[0]);
    Input = fdopen(Pipe[1],"w");
    if (Input == 0)
@@ -265,7 +260,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)
@@ -273,29 +268,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 
@@ -305,14 +280,6 @@ bool MultiCompress::CloseOld(int Fd,pid_t Proc)
    is new then the temp files are renamed, otherwise they are erased. */
 bool MultiCompress::Child(int const &FD)
 {
-   // Start the compression children.
-   for (Files *I = Outputs; I != 0; I = I->Next)
-   {
-      if (ExecCompressor(I->CompressProg,&(I->CompressProc),I->TmpFile.Fd(),
-                        I->Fd,true) == false)
-        return false;      
-   }
-
    /* Okay, now we just feed data from FD to all the other FDs. Also
       stash a hash of the data to use later. */
    SetNonBlock(FD,false);
@@ -332,25 +299,14 @@ bool MultiCompress::Child(int const &FD)
       FileSize += Res;
       for (Files *I = Outputs; I != 0; I = I->Next)
       {
-        if (write(I->Fd,Buffer,Res) != Res)
+        if (I->TmpFile.Write(Buffer, Res) == false)
         {
            _error->Errno("write",_("IO to subprocess/file failed"));
            break;
         }
       }      
    }   
-   
-   // Close all the writers
-   for (Files *I = Outputs; I != 0; I = I->Next)
-      close(I->Fd);
-   
-   // Wait for the compressors to exit
-   for (Files *I = Outputs; I != 0; I = I->Next)
-   {
-      if (I->CompressProc != -1)
-        ExecWait(I->CompressProc, I->CompressProg.Binary.c_str(), false);
-   }
-   
+
    if (_error->PendingError() == true)
       return false;
    
@@ -369,31 +325,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() &&