diff options
Diffstat (limited to 'apt-pkg/contrib/hashsum.cc')
-rw-r--r-- | apt-pkg/contrib/hashsum.cc | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/apt-pkg/contrib/hashsum.cc b/apt-pkg/contrib/hashsum.cc new file mode 100644 index 0000000..e8e86e9 --- /dev/null +++ b/apt-pkg/contrib/hashsum.cc @@ -0,0 +1,52 @@ +// Cryptographic API Base +#include <config.h> + +#include <apt-pkg/fileutl.h> + +#include "hashsum_template.h" +#include <algorithm> +#include <unistd.h> + +// Summation::AddFD - Add content of file into the checksum /*{{{*/ +// --------------------------------------------------------------------- +/* */ +bool SummationImplementation::AddFD(int const 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); + 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; + Size -= Res; + 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; +} + /*}}}*/ |