diff --git a/.gitignore b/.gitignore index 259148f..5f0fac8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# Build directory +build/ + # Prerequisites *.d diff --git a/src/MultiuserFileSystem.cc b/src/MultiuserFileSystem.cc index 714a99f..122d9d0 100644 --- a/src/MultiuserFileSystem.cc +++ b/src/MultiuserFileSystem.cc @@ -127,6 +127,9 @@ MultiuserFileSystem::Config(XrdSysLogger *lp, const char *configfn) else if (!strcmp("crc32", val)) { m_digests |= ChecksumManager::CRC32; } + else if (!strcmp("crc32c", val)) { + m_digests |= ChecksumManager::CRC32C; + } else if (!strcmp("adler32", val)) { m_digests |= ChecksumManager::ADLER32; } diff --git a/src/XrdChecksum.cc b/src/XrdChecksum.cc index 6691393..e636824 100644 --- a/src/XrdChecksum.cc +++ b/src/XrdChecksum.cc @@ -45,6 +45,9 @@ ChecksumManager::Set(const char *lfn, const ChecksumState &state) if (state.Get(ChecksumManager::CRC32).size()) retval = this->Set(lfn, "CRC32", state.Get(ChecksumManager::CRC32).c_str()); + if (state.Get(ChecksumManager::CRC32C).size()) + retval = this->Set(lfn, "CRC32C", state.Get(ChecksumManager::CRC32C).c_str()); + if (state.Get(ChecksumManager::MD5).size()) retval = this->Set(lfn, "MD5", state.Get(ChecksumManager::MD5).c_str()); @@ -73,6 +76,10 @@ int ChecksumManager::Calc( const char *lfn, XrdCksData &Cks, int doSet) { return_digest = ChecksumManager::CKSUM; } + else if (!strncasecmp(Cks.Name, "crc32c", Cks.NameSize)) + { + return_digest = ChecksumManager::CRC32C; + } else if (!strncasecmp(Cks.Name, "crc32", Cks.NameSize)) { return_digest = ChecksumManager::CRC32; @@ -125,6 +132,9 @@ int ChecksumManager::Calc( const char *lfn, XrdCksData &Cks, int doSet) case ChecksumManager::CRC32: checksum_value = state.Get(ChecksumManager::CRC32); break; + case ChecksumManager::CRC32C: + checksum_value = state.Get(ChecksumManager::CRC32C); + break; case ChecksumManager::MD5: checksum_value = state.Get(ChecksumManager::MD5); break; diff --git a/src/XrdChecksum.hh b/src/XrdChecksum.hh index 147be22..fd1bf1a 100644 --- a/src/XrdChecksum.hh +++ b/src/XrdChecksum.hh @@ -41,6 +41,7 @@ private: const unsigned m_digests; uint32_t m_cksum; uint32_t m_crc32; + uint32_t m_crc32c; uint32_t m_adler32; unsigned m_md5_length; @@ -119,6 +120,7 @@ public: ADLER32 = 0x04, CVMFS = 0x08, CRC32 = 0x10, + CRC32C = 0x20, ALL = 0xff }; diff --git a/src/XrdChecksumCalc.cc b/src/XrdChecksumCalc.cc index 81dca43..89a9abb 100644 --- a/src/XrdChecksumCalc.cc +++ b/src/XrdChecksumCalc.cc @@ -8,6 +8,7 @@ #include #include "XrdOss/XrdOss.hh" +#include "XrdOuc/XrdOucCRC.hh" #include "XrdSfs/XrdSfsInterface.hh" #include "XrdSys/XrdSysXAttr.hh" @@ -76,7 +77,6 @@ static uint32_t const g_crctab[256] = 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 }; - static std::string human_readable_evp(const unsigned char *evp, size_t length) { @@ -96,6 +96,7 @@ ChecksumState::ChecksumState(unsigned digests) : m_digests(digests), m_cksum(0), m_crc32(crc32(0, NULL, 0)), + m_crc32c(0), m_adler32(adler32(0, NULL, 0)), m_md5_length(0), m_cur_chunk_bytes(0), @@ -150,6 +151,11 @@ ChecksumState::Get(unsigned digest) const uint32_t crc32_no = htonl(m_crc32); return human_readable_evp(reinterpret_cast(&crc32_no), sizeof(crc32_no)); } + if ((digest & ChecksumManager::CRC32C) && (m_digests & ChecksumManager::CRC32C)) + { + uint32_t crc32c_no = htonl(m_crc32c); + return human_readable_evp(reinterpret_cast(&crc32c_no), sizeof(crc32c_no)); + } if ((digest & ChecksumManager::ADLER32) && (m_digests & ChecksumManager::ADLER32)) { uint32_t adler32_no = htonl(m_adler32); @@ -189,6 +195,10 @@ ChecksumState::Update(const unsigned char *buffer, size_t bsize) { m_crc32 = crc32(m_crc32, buffer, bsize); } + if (m_digests & ChecksumManager::CRC32C) + { + m_crc32c = XrdOucCRC::Calc32C(buffer, bsize, m_crc32c); + } if (m_digests & ChecksumManager::MD5) { EVP_DigestUpdate(m_md5, buffer, bsize);