diff --git a/tapeserver/castor/tape/tapeserver/SCSI/Structures.hpp b/tapeserver/castor/tape/tapeserver/SCSI/Structures.hpp index 55ba6fe6ce242ff5024d0dc9ccaeec505bd6e3a8..e40382fd1299e4eb37667a5847f3bb705b858598 100644 --- a/tapeserver/castor/tape/tapeserver/SCSI/Structures.hpp +++ b/tapeserver/castor/tape/tapeserver/SCSI/Structures.hpp @@ -1218,7 +1218,7 @@ namespace SCSI { unsigned char reserved[2]; // Reserved // bytes 4-n - struct { + struct WrapDescriptor { unsigned char wrapNumber[2]; // Wrap number unsigned char partition[2]; // The partition number of the above wrap unsigned char reserved[2]; // Reserved @@ -1226,7 +1226,7 @@ namespace SCSI { } wrapDescriptor[maxLTOTapeWraps]; // Array of wrap descriptiors uint16_t getNbWrapsReturned(){ - return (SCSI::Structures::toU16(responseDataLength) / sizeof(wrapDescriptor)); + return ((SCSI::Structures::toU16(responseDataLength) - sizeof(reserved)) / sizeof(WrapDescriptor)); } }; diff --git a/tapeserver/castor/tape/tapeserver/SCSI/StructuresTest.cpp b/tapeserver/castor/tape/tapeserver/SCSI/StructuresTest.cpp index 5986f9427384e7a947a33fd1a00fe87a5935734d..3f735321c06d816ef4f9e12eef8c9632a452f72b 100644 --- a/tapeserver/castor/tape/tapeserver/SCSI/StructuresTest.cpp +++ b/tapeserver/castor/tape/tapeserver/SCSI/StructuresTest.cpp @@ -971,8 +971,9 @@ namespace unitTests { // Check proper initialization and location of struct members match the bit/byte locations defined in LTO-8 reference ASSERT_EQ(0U, castor::tape::SCSI::Structures::toU16(readEndOfWrapPositionDataLongForm.responseDataLength)); - buff[0] = 0x0A; buff[1] = 0xB0; - ASSERT_EQ(0xAB0, castor::tape::SCSI::Structures::toU16(readEndOfWrapPositionDataLongForm.responseDataLength)); + //Assume we have maxLTOTapeWraps returned * 12 bytes = 3362 = 0x0D22 + buff[0] = 0x0D; buff[1] = 0x22; + ASSERT_EQ(0x0D22, castor::tape::SCSI::Structures::toU16(readEndOfWrapPositionDataLongForm.responseDataLength)); for(unsigned int wrap = 0; wrap < castor::tape::SCSI::maxLTOTapeWraps; ++wrap) { int offset = 4 + (wrap * 12); @@ -996,6 +997,8 @@ namespace unitTests { buff[offset + 9] = 0x12; buff[offset + 10] = 0x34; buff[offset + 11] = 0x56; ASSERT_EQ(0xABCDEF123456, castor::tape::SCSI::Structures::toU64(readEndOfWrapPositionDataLongForm.wrapDescriptor[wrap].logicalObjectIdentifier)); } + + ASSERT_EQ(castor::tape::SCSI::maxLTOTapeWraps,readEndOfWrapPositionDataLongForm.getNbWrapsReturned()); } TEST(castor_tape_SCSI_Structures, requestSenseCDB_t) { diff --git a/tapeserver/castor/tape/tapeserver/drive/FakeDrive.cpp b/tapeserver/castor/tape/tapeserver/drive/FakeDrive.cpp index d37e78c47bde9a9d13816ed346d1617622da0422..612a9ea95796aa7527c1dee448989502a0b8ef7c 100644 --- a/tapeserver/castor/tape/tapeserver/drive/FakeDrive.cpp +++ b/tapeserver/castor/tape/tapeserver/drive/FakeDrive.cpp @@ -99,7 +99,13 @@ castor::tape::tapeserver::drive::physicalPositionInfo castor::tape::tapeserver:: } std::vector<castor::tape::tapeserver::drive::endOfWrapPosition> castor::tape::tapeserver::drive::FakeDrive::getEndOfWrapPositions() { - return std::vector<castor::tape::tapeserver::drive::endOfWrapPosition>(); + endOfWrapPosition eowp; + eowp.blockId = 1; + eowp.partition = 1; + eowp.wrapNumber = 1; + std::vector<endOfWrapPosition> ret; + ret.push_back(eowp); + return ret; } std::vector<uint16_t> castor::tape::tapeserver::drive::FakeDrive::getTapeAlertCodes() {