diff --git a/include/reHDD.h b/include/reHDD.h index 893b0bd..ad23206 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -31,7 +31,7 @@ #endif // Logic -// #define DRYRUN // don't touch the drives +#define DRYRUN // don't touch the drives #define FROZEN_ALERT // show alert if drive is frozen #define ZERO_CHECK // check drive after shred if all bytes are zero, show alert if this fails diff --git a/src/drive.cpp b/src/drive.cpp index 1ca3e61..5ae0b7e 100644 --- a/src/drive.cpp +++ b/src/drive.cpp @@ -62,8 +62,12 @@ string Drive::sCapacityToText() dSize /= 1000; u16UnitIndex++; } - - sprintf(acBuffer, "%.*f %s", u16UnitIndex - 3, dSize, units[u16UnitIndex]); + if (u16UnitIndex >= 9) + { + u16UnitIndex = 8; + } + int precision = (u16UnitIndex >= 3) ? (u16UnitIndex - 3) : 0; + sprintf(acBuffer, "%.*f %s", precision, dSize, units[u16UnitIndex]); return acBuffer; } @@ -148,12 +152,20 @@ void Drive::setDriveSMARTData(string modelFamily, void Drive::setTimestamp() { - time(&this->u32Timestamp); + if (time(&this->u32Timestamp) == -1) + { + // handle error + this->u32Timestamp = 0U; + } } void Drive::setActionStartTimestamp() { - time(&this->u32TimestampTaskStart); + if (time(&this->u32TimestampTaskStart) == -1) + { + // handle error + this->u32TimestampTaskStart = 0U; + } } time_t Drive::getActionStartTimestamp() @@ -164,7 +176,11 @@ time_t Drive::getActionStartTimestamp() void Drive::calculateTaskDuration() { time_t u32localtime; - time(&u32localtime); + if (time(&u32localtime) == -1) + { + // handle error + u32localtime = 0U; + } this->u32TaskDuration = u32localtime - this->u32TimestampTaskStart; } @@ -178,6 +194,11 @@ void Drive::checkFrozenDrive(void) { time_t u32localtime; time(&u32localtime); + if (time(&u32localtime) == -1) + { + // handle error + u32localtime = 0U; + } if ((u32localtime - this->u32Timestamp) >= (FROZEN_TIMEOUT * 60) && (this->u32Timestamp > 0) && (this->getTaskPercentage() < 100.0)) { diff --git a/src/main.cpp b/src/main.cpp index 30441e1..5b1798d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,7 +16,7 @@ int main(void) { // cout << "refurbishingHddTool" << endl; - reHDD *app = new reHDD(); - app->app_logic(); + reHDD app; + app.app_logic(); return EXIT_SUCCESS; } \ No newline at end of file diff --git a/src/reHDD.cpp b/src/reHDD.cpp index 5852628..defcb5a 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -43,8 +43,15 @@ void reHDD::app_logic(void) ui = new TUI(); ui->initTUI(); - pipe(fdNewDrivesInformPipe); - pipe(fdShredInformPipe); + if (pipe(fdNewDrivesInformPipe) == -1) + { + Logger::logThis()->error("Unable to open pipe 'fdNewDrivesInformPipe'"); + } + + if (pipe(fdShredInformPipe) == -1) + { + Logger::logThis()->error("Unable to open pipe 'fdShredInformPipe'"); + } thread thDevices(ThreadScanDevices); // start thread that scans for drives thread thUserInput(ThreadUserInput); // start thread that reads user input @@ -94,7 +101,7 @@ Drive *reHDD::getSelectedDrive() else { Logger::logThis()->warning("selected drive not present"); - return {}; + return nullptr; } } @@ -135,6 +142,8 @@ void reHDD::ThreadUserInput() { while (true) { + Drive *tmpSelectedDrive = getSelectedDrive(); + // cout << TUI::readUserInput() << endl; switch (TUI::readUserInput()) { @@ -159,11 +168,11 @@ void reHDD::ThreadUserInput() case TUI::UserInput::Delete: // cout << "Delete" << endl; - if (getSelectedDrive() != nullptr) + if (tmpSelectedDrive != nullptr) { - if (getSelectedDrive()->state == Drive::NONE) + if (tmpSelectedDrive->state == Drive::NONE) { - getSelectedDrive()->state = Drive::DELETE_SELECTED; + tmpSelectedDrive->state = Drive::DELETE_SELECTED; } } @@ -171,15 +180,13 @@ void reHDD::ThreadUserInput() break; case TUI::UserInput::Shred: // cout << "Shred" << endl; - - if (getSelectedDrive() != nullptr) + if (tmpSelectedDrive != nullptr) { - if (getSelectedDrive()->state == Drive::NONE) + if (tmpSelectedDrive->state == Drive::NONE) { - getSelectedDrive()->state = Drive::SHRED_SELECTED; + tmpSelectedDrive->state = Drive::SHRED_SELECTED; } } - ui->updateTUI(&listDrives, u8SelectedEntry); break; case TUI::UserInput::ShredAll: @@ -224,13 +231,14 @@ void reHDD::ThreadShred(Drive *const pDrive) void reHDD::ThreadDelete() { - if (getSelectedDrive() != nullptr) + Drive *tmpSelectedDrive = getSelectedDrive(); + if (tmpSelectedDrive != nullptr) { - getSelectedDrive()->setActionStartTimestamp(); // save timestamp at start of deleting - Delete::deleteDrive(getSelectedDrive()); // blocking, no thread - getSelectedDrive()->state = Drive::TaskState::NONE; // delete finished - getSelectedDrive()->bWasDeleted = true; - Logger::logThis()->info("Finished delete for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); + tmpSelectedDrive->setActionStartTimestamp(); // save timestamp at start of deleting + Delete::deleteDrive(tmpSelectedDrive); // blocking, no thread + tmpSelectedDrive->state = Drive::TaskState::NONE; // delete finished + tmpSelectedDrive->bWasDeleted = true; + Logger::logThis()->info("Finished delete for: " + tmpSelectedDrive->getModelName() + "-" + tmpSelectedDrive->getSerial()); ui->updateTUI(&listDrives, u8SelectedEntry); } } @@ -326,28 +334,28 @@ void reHDD::searchDrives(std::list *plistDrives) if (devName.empty()) continue; - Drive *tmpDrive = new Drive("/dev/" + devName); - tmpDrive->state = Drive::NONE; - tmpDrive->bIsOffline = false; + Drive tmpDrive("/dev/" + devName); + tmpDrive.state = Drive::NONE; + tmpDrive.bIsOffline = false; // Set connection type if (transport == "sata") - tmpDrive->connectionType = Drive::SATA; + tmpDrive.connectionType = Drive::SATA; else if (transport == "usb") - tmpDrive->connectionType = Drive::USB; + tmpDrive.connectionType = Drive::USB; else if (transport == "nvme") - tmpDrive->connectionType = Drive::NVME; + tmpDrive.connectionType = Drive::NVME; else - tmpDrive->connectionType = Drive::UNKNOWN; + tmpDrive.connectionType = Drive::UNKNOWN; - plistDrives->push_back(*tmpDrive); + plistDrives->push_back(tmpDrive); Logger::logThis()->info( - "Drive found: " + tmpDrive->getPath() + + "Drive found: " + tmpDrive.getPath() + " (type: " + - (tmpDrive->connectionType == Drive::USB ? "USB" : tmpDrive->connectionType == Drive::SATA ? "SATA" - : tmpDrive->connectionType == Drive::NVME ? "NVME" - : "UNKNOWN") + + (tmpDrive.connectionType == Drive::USB ? "USB" : tmpDrive.connectionType == Drive::SATA ? "SATA" + : tmpDrive.connectionType == Drive::NVME ? "NVME" + : "UNKNOWN") + ")"); } @@ -376,7 +384,6 @@ void reHDD::filterIgnoredDrives(list *plistDrives) Logger::logThis()->info("system drive found --> ignore this drive: " + it->getPath()); #endif it = plistDrives->erase(it); - it--; } } } @@ -419,6 +426,7 @@ void reHDD::filterIgnoredDrives(list *plistDrives) // cout << "blkid uuid:" << sUUID << endl; } } + free(cLine); pclose(outputfileBlkid); // cout << "blkid uuid:" << sUUID << endl; @@ -429,7 +437,6 @@ void reHDD::filterIgnoredDrives(list *plistDrives) Logger::logThis()->info("same uuid found than in ignore file --> ignore this drive: " + it->getPath()); #endif it = plistDrives->erase(it); - it--; } } } @@ -451,7 +458,6 @@ void reHDD::filterInvalidDrives(list *plistDrives) Logger::logThis()->info("Drive reports zero capacity --> ignore this drive: " + it->getPath()); #endif it = plistDrives->erase(it); - it--; } } } @@ -619,22 +625,21 @@ void reHDD::handleArrowKey(TUI::UserInput userInput) void reHDD::handleEnter() { - - if (getSelectedDrive() != nullptr) + Drive *tmpSelectedDrive = getSelectedDrive(); + if (tmpSelectedDrive != nullptr) { - if (getSelectedDrive()->state == Drive::TaskState::SHRED_SELECTED) + if (tmpSelectedDrive->state == Drive::TaskState::SHRED_SELECTED) { - Logger::logThis()->info("Started shred/check for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); - getSelectedDrive()->state = Drive::TaskState::SHRED_ACTIVE; - // task for drive is running --> don't show more task options - Drive *pTmpDrive = getSelectedDrive(); - thread(ThreadShred, pTmpDrive).detach(); + Logger::logThis()->info("Started shred/check for: " + tmpSelectedDrive->getModelName() + "-" + tmpSelectedDrive->getSerial()); + tmpSelectedDrive->state = Drive::TaskState::SHRED_ACTIVE; + // task for drive is running --> don't show more task option + thread(ThreadShred, tmpSelectedDrive).detach(); } - if (getSelectedDrive()->state == Drive::TaskState::DELETE_SELECTED) + if (tmpSelectedDrive->state == Drive::TaskState::DELETE_SELECTED) { - Logger::logThis()->info("Started delete for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); - getSelectedDrive()->state = Drive::TaskState::DELETE_ACTIVE; + Logger::logThis()->info("Started delete for: " + tmpSelectedDrive->getModelName() + "-" + tmpSelectedDrive->getSerial()); + tmpSelectedDrive->state = Drive::TaskState::DELETE_ACTIVE; // task for drive is running --> don't show more task options thread(ThreadDelete).detach(); } @@ -643,17 +648,18 @@ void reHDD::handleEnter() void reHDD::handleESC() { - if (getSelectedDrive() != nullptr) + Drive *tmpSelectedDrive = getSelectedDrive(); + if (tmpSelectedDrive != nullptr) { - if (getSelectedDrive()->state == Drive::TaskState::SHRED_SELECTED) + if (tmpSelectedDrive->state == Drive::TaskState::SHRED_SELECTED) { - getSelectedDrive()->state = Drive::TaskState::NONE; + tmpSelectedDrive->state = Drive::TaskState::NONE; // task for drive is selected --> remove selection } - if (getSelectedDrive()->state == Drive::TaskState::DELETE_SELECTED) + if (tmpSelectedDrive->state == Drive::TaskState::DELETE_SELECTED) { - getSelectedDrive()->state = Drive::TaskState::NONE; + tmpSelectedDrive->state = Drive::TaskState::NONE; // task for drive is selected --> remove selection } } @@ -661,12 +667,13 @@ void reHDD::handleESC() void reHDD::handleAbort() { - if (getSelectedDrive() != nullptr) + Drive *tmpSelectedDrive = getSelectedDrive(); + if (tmpSelectedDrive != nullptr) { - if (getSelectedDrive()->state == Drive::SHRED_ACTIVE || getSelectedDrive()->state == Drive::DELETE_ACTIVE) + if (tmpSelectedDrive->state == Drive::SHRED_ACTIVE || tmpSelectedDrive->state == Drive::DELETE_ACTIVE) { - getSelectedDrive()->state = Drive::NONE; - Logger::logThis()->info("Abort-Shred-Signal for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); + tmpSelectedDrive->state = Drive::NONE; + Logger::logThis()->info("Abort-Shred-Signal for: " + tmpSelectedDrive->getModelName() + "-" + tmpSelectedDrive->getSerial()); // task for drive is running --> remove selection } } diff --git a/src/shred.cpp b/src/shred.cpp index 2255310..8fd3fae 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -36,7 +36,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd) ostringstream address; address << (void const *)&(*drive); Logger::logThis()->info("Shred-Task started - Drive: " + drive->getModelName() + "-" + drive->getSerial() + " @" + address.str()); - drive->bWasShredStarted = true; //Mark drive as partly shredded + drive->bWasShredStarted = true; // Mark drive as partly shredded #ifdef DRYRUN for (int i = 0; i <= 500; i++) @@ -60,7 +60,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd) randomSrcFileDiscr = open(randomsrc, O_RDONLY | O_LARGEFILE); if (randomSrcFileDiscr == -1) { - std::string errorMsg(strerror(randomSrcFileDiscr)); + std::string errorMsg(strerror(errno)); Logger::logThis()->error("Shred-Task: Open random source failed! " + errorMsg + " - Drive: " + drive->getSerial()); perror(randomsrc); cleanup(); @@ -71,7 +71,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd) driveFileDiscr = open(cpDrivePath, O_RDWR | O_LARGEFILE); if (driveFileDiscr == -1) { - std::string errorMsg(strerror(driveFileDiscr)); + std::string errorMsg(strerror(errno)); Logger::logThis()->error("Shred-Task: Open drive failed! " + errorMsg + " - Drive: " + drive->getSerial()); perror(cpDrivePath); cleanup(); @@ -82,7 +82,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd) ssize_t readRet = read(randomSrcFileDiscr, ucKey, sizeof(ucKey)); if (readRet <= 0) { - std::string errorMsg(strerror(readRet)); + std::string errorMsg(strerror(errno)); Logger::logThis()->error("Shred-Task: Read random key failed! " + errorMsg + " - Drive: " + drive->getSerial()); perror(randomsrc); cleanup(); @@ -93,7 +93,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd) this->ulDriveByteSize = getDriveSizeInBytes(driveFileDiscr); drive->sShredSpeed.chronoShredTimestamp = std::chrono::system_clock::now(); // set inital timestamp for speed metric - drive->sShredSpeed.ulSpeedMetricBytesWritten = 0U; // uses to calculate speed metric + drive->sShredSpeed.ulSpeedMetricBytesWritten = 0U; // uses to calculate speed metric #ifdef LOG_LEVEL_HIGH Logger::logThis()->info("Shred-Task: Bytes-Size of Drive: " + to_string(this->ulDriveByteSize) + " - Drive: " + drive->getSerial()); @@ -132,7 +132,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd) if (iByteShredded <= 0) { - std::string errorMsg(strerror(iByteShredded)); + std::string errorMsg(strerror(errno)); Logger::logThis()->error("Shred-Task: Write to drive failed! " + errorMsg + " - Drive: " + drive->getSerial()); perror("unable to write random data"); cleanup();