test framework: Correctly generate new paths in noopchroot
[apt.git] / apt-pkg / contrib / hashsum.cc
index 728747d7ab00ed47b44cc36706ae88daf549d994..25ccc187d14e257ca0e085414bff6a864439d1ab 100644 (file)
@@ -1,21 +1,24 @@
 // Cryptographic API Base
+#include <config.h>
 
+#include <apt-pkg/fileutl.h>
+
+#include <algorithm>
 #include <unistd.h>
 #include "hashsum_template.h"
 
 // Summation::AddFD - Add content of file into the checksum            /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-bool SummationImplementation::AddFD(int const Fd, unsigned long Size) {
+bool SummationImplementation::AddFD(int const Fd, unsigned long long Size) {
    unsigned char Buf[64 * 64];
-   int Res = 0;
-   int ToEOF = (Size == 0);
+   bool const ToEOF = (Size == 0);
    while (Size != 0 || ToEOF)
    {
-      unsigned n = sizeof(Buf);
-      if (!ToEOF) n = min(Size,(unsigned long)n);
-      Res = read(Fd, Buf, n);
-      if (Res < 0 || (!ToEOF && (unsigned) Res != n)) // error, or short read
+      unsigned long long n = sizeof(Buf);
+      if (!ToEOF) n = std::min(Size, n);
+      ssize_t const Res = read(Fd, Buf, n);
+      if (Res < 0 || (!ToEOF && Res != (ssize_t) n)) // error, or short read
         return false;
       if (ToEOF && Res == 0) // EOF
         break;
@@ -23,5 +26,27 @@ bool SummationImplementation::AddFD(int const Fd, unsigned long Size) {
       Add(Buf,Res);
    }
    return true;
+}
+bool SummationImplementation::AddFD(FileFd &Fd, unsigned long long Size) {
+   unsigned char Buf[64 * 64];
+   bool const ToEOF = (Size == 0);
+   while (Size != 0 || ToEOF)
+   {
+      unsigned long long n = sizeof(Buf);
+      if (!ToEOF) n = std::min(Size, n);
+      unsigned long long a = 0;
+      if (Fd.Read(Buf, n, &a) == false) // error
+        return false;
+      if (ToEOF == false)
+      {
+        if (a != n) // short read
+           return false;
+      }
+      else if (a == 0) // EOF
+        break;
+      Size -= a;
+      Add(Buf, a);
+   }
+   return true;
 }
                                                                        /*}}}*/