Selaa lähdekoodia

implement CopyFile without using FileFd::Size()

Pipes and such have no good Size value, but we still want to copy from
it maybe and we don't really need size as we can just as well read as
long as we get data out of a file to copy it.

Git-Dch: Ignore
David Kalnischkies 11 vuotta sitten
vanhempi
commit
e977b8b923
1 muutettua tiedostoa jossa 7 lisäystä ja 13 poistoa
  1. 7 13
      apt-pkg/contrib/fileutl.cc

+ 7 - 13
apt-pkg/contrib/fileutl.cc

@@ -158,24 +158,18 @@ bool CopyFile(FileFd &From,FileFd &To)
    if (From.IsOpen() == false || To.IsOpen() == false ||
    if (From.IsOpen() == false || To.IsOpen() == false ||
 	 From.Failed() == true || To.Failed() == true)
 	 From.Failed() == true || To.Failed() == true)
       return false;
       return false;
-   
+
    // Buffered copy between fds
    // Buffered copy between fds
    std::unique_ptr<unsigned char[]> Buf(new unsigned char[64000]);
    std::unique_ptr<unsigned char[]> Buf(new unsigned char[64000]);
-   unsigned long long Size = From.Size();
-   while (Size != 0)
-   {
-      unsigned long long ToRead = Size;
-      if (Size > 64000)
-	 ToRead = 64000;
-      
-      if (From.Read(Buf.get(),ToRead) == false ||
+   constexpr unsigned long long BufSize = sizeof(Buf.get())/sizeof(Buf.get()[0]);
+   unsigned long long ToRead = 0;
+   do {
+      if (From.Read(Buf.get(),BufSize, &ToRead) == false ||
 	  To.Write(Buf.get(),ToRead) == false)
 	  To.Write(Buf.get(),ToRead) == false)
 	 return false;
 	 return false;
-      
-      Size -= ToRead;
-   }
+   } while (ToRead != 0);
 
 
-   return true;   
+   return true;
 }
 }
 									/*}}}*/
 									/*}}}*/
 // GetLock - Gets a lock file						/*{{{*/
 // GetLock - Gets a lock file						/*{{{*/