hashsum.cc 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. // Cryptographic API Base
  2. #include <config.h>
  3. #include <unistd.h>
  4. #include "hashsum_template.h"
  5. // Summation::AddFD - Add content of file into the checksum /*{{{*/
  6. // ---------------------------------------------------------------------
  7. /* */
  8. bool SummationImplementation::AddFD(int const Fd, unsigned long long Size) {
  9. unsigned char Buf[64 * 64];
  10. ssize_t Res = 0;
  11. int ToEOF = (Size == 0);
  12. while (Size != 0 || ToEOF)
  13. {
  14. unsigned long long n = sizeof(Buf);
  15. if (!ToEOF) n = std::min(Size, n);
  16. Res = read(Fd, Buf, n);
  17. if (Res < 0 || (!ToEOF && Res != (ssize_t) n)) // error, or short read
  18. return false;
  19. if (ToEOF && Res == 0) // EOF
  20. break;
  21. Size -= Res;
  22. Add(Buf,Res);
  23. }
  24. return true;
  25. }
  26. bool SummationImplementation::AddFD(FileFd &Fd, unsigned long long Size) {
  27. unsigned char Buf[64 * 64];
  28. bool ToEOF = (Size == 0);
  29. while (Size != 0 || ToEOF)
  30. {
  31. unsigned long long n = sizeof(Buf);
  32. if (!ToEOF) n = std::min(Size, n);
  33. unsigned long long a = 0;
  34. if (Fd.Read(Buf, n, &a) == false) // error
  35. return false;
  36. if (ToEOF == false)
  37. {
  38. if (a != n) // short read
  39. return false;
  40. }
  41. else if (a == 0) // EOF
  42. break;
  43. Size -= a;
  44. Add(Buf, a);
  45. }
  46. return true;
  47. }
  48. /*}}}*/