diff --git a/include/reHDD.h b/include/reHDD.h index d62b78f..b8b9cfa 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -23,14 +23,14 @@ #define SOFTWARE_VERSION "alpha" #define HARDWARE_VERSION "generic" -#define LOG_LEVEL_HIGH //log everything, like drive scann thread +//#define LOG_LEVEL_HIGH //log everything, like drive scann thread #ifndef LOG_LEVEL_HIGH #define LOG_LEVEL_LOW //log only user actions and tasks #endif // Logic //#define DRYRUN //donĀ“t touch the drives -#define DEMO_DRIVE_SIZE 1024*1024*256 // 256MB used for shredding only +//#define DEMO_DRIVE_SIZE 1024*1024*256 // 256MB used for shredding only #define FROZEN_ALERT //show alert if drive is frozen #define ZERO_CHECK_ALERT //check drive after shred if all bytes are zero, show alert if this fails diff --git a/include/shred.h b/include/shred.h index 18b5d12..6306762 100644 --- a/include/shred.h +++ b/include/shred.h @@ -40,13 +40,14 @@ private: fileDescriptor driveFileDiscr; unsigned char caChunk[CHUNK_SIZE]; unsigned long ulDriveByteSize; + unsigned long ulDriveByteOverallCount = 0; //all bytes shredded in all iterations + checking -> used for progress calculation double d32Percent = 0.0; double d32TmpPercent = 0.0; - inline double calcProgress(unsigned long ulDriveByteIndex, unsigned int uiIteration); + inline double calcProgress(); int iRewindDrive(fileDescriptor file); unsigned long getDriveSizeInBytes(fileDescriptor file); - unsigned int uiCalcChecksum(fileDescriptor file); + unsigned int uiCalcChecksum(fileDescriptor file, Drive* drive, int* ipSignalFd); void cleanup(); }; diff --git a/src/shred.cpp b/src/shred.cpp index 84180ad..6031184 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -120,14 +120,13 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) return -1; } ulDriveByteCounter += iByteShredded; - - d32Percent = this->calcProgress(ulDriveByteCounter, (uiShredIterationCounter+1)); + ulDriveByteOverallCount += iByteShredded; + d32Percent = this->calcProgress(); #ifdef LOG_LEVEL_HIGH - Logger::logThis()->info("Shred-Task: ByteCount: " + to_string(ulDriveByteCounter) + " - progress: " + to_string(d32Percent) + " - Drive: " + drive->getSerial()); + Logger::logThis()->info("Shred-Task: ByteCount: " + to_string(ulDriveByteCounter) + " - iteration: " + to_string((uiShredIterationCounter+1)) + " - progress: " + to_string(d32Percent) + " - Drive: " + drive->getSerial()); #endif - - if((d32Percent-d32TmpPercent) >= 0.09) + if((d32Percent-d32TmpPercent) >= 0.01) { drive->setTaskPercentage(d32TmpPercent); d32TmpPercent = d32Percent; @@ -155,7 +154,7 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) } //end all shred iterations #ifdef ZERO_CHECK_ALERT - drive->u32DriveChecksumAferShredding = uiCalcChecksum(driveFileDiscr); + drive->u32DriveChecksumAferShredding = uiCalcChecksum(driveFileDiscr, drive, ipSignalFd); #ifdef LOG_LEVEL_HIGH if (drive->u32DriveChecksumAferShredding != 0) { @@ -176,7 +175,6 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) drive->setTaskPercentage(0.0); Logger::logThis()->info("Finished shred for: " + drive->getModelName() + "-" + drive->getSerial()); } - return 0; } /** @@ -185,15 +183,14 @@ int Shred::shredDrive(Drive* drive, int* ipSignalFd) * \param current shred iteration * \return double percentage */ -double Shred::calcProgress(unsigned long ulDriveByteIndex, unsigned int uiIteration) +double Shred::calcProgress() { unsigned int uiMaxShredIteration = SHRED_ITERATIONS; #ifdef ZERO_CHECK_ALERT uiMaxShredIteration++; //increment because we will check after SHRED_ITERATIONS the drive for non-zero bytes #endif - - return (double) (100.0f/((double)this->ulDriveByteSize)*((double) ulDriveByteIndex) / ((double) uiIteration / (double) uiMaxShredIteration) ); + return (double) (((double) ulDriveByteOverallCount) / ((double)this->ulDriveByteSize*uiMaxShredIteration))*100.0f; } int Shred::iRewindDrive(fileDescriptor file) @@ -224,7 +221,7 @@ unsigned long Shred::getDriveSizeInBytes(fileDescriptor file) return ulDriveSizeTmp; } -unsigned int Shred::uiCalcChecksum(fileDescriptor file) +unsigned int Shred::uiCalcChecksum(fileDescriptor file,Drive* drive, int* ipSignalFd) { unsigned int uiChecksum = 0; unsigned long ulDriveByteCounter = 0U; @@ -247,6 +244,21 @@ unsigned int Shred::uiCalcChecksum(fileDescriptor file) uiChecksum += caChunk[iReadBytesCounter]; } ulDriveByteCounter += iReadBytes; + ulDriveByteOverallCount += ulDriveByteCounter; + + d32Percent = this->calcProgress(); + +#ifdef LOG_LEVEL_HIGH + Logger::logThis()->info("Shred-Task (Checksum): ByteCount: " + to_string(ulDriveByteCounter) + " - progress: " + to_string(d32Percent) + " - Drive: " + drive->getSerial()); +#endif + + if((d32Percent-d32TmpPercent) >= 0.09) + { + drive->setTaskPercentage(d32TmpPercent); + d32TmpPercent = d32Percent; + write(*ipSignalFd, "A",1); + } + } return uiChecksum; } diff --git a/src/tui.cpp b/src/tui.cpp index ce85d94..6d2b4c0 100644 --- a/src/tui.cpp +++ b/src/tui.cpp @@ -128,7 +128,7 @@ void TUI::updateTUI(list * plistDrives, uint8_t u8SelectedEntry) } #ifdef ZERO_CHECK_ALERT - if(bSelectedEntry && it->bWasShredded && (it->u32DriveChecksumAferShredding != 42U)) + if(bSelectedEntry && it->bWasShredded && (it->u32DriveChecksumAferShredding != 0U)) { dialog=createZeroChecksumWarning(70, 16, ((u16StdscrX)-(int)(u16StdscrX/2)-20),(int)(u16StdscrY/2)-8, it->getPath(), it->getModelFamily(), it->getModelName(), it->getSerial(), it->u32DriveChecksumAferShredding); wrefresh(dialog);