From a665f8638edbc5aa1e6346a2ff814a4b97490c5a Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 2 Jun 2024 09:31:55 +0200 Subject: [PATCH] find system drive --- include/reHDD.h | 3 ++- src/reHDD.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ src/smart.cpp | 4 ++-- 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/include/reHDD.h b/include/reHDD.h index 7bd1e90..d8a98c1 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 @@ -101,6 +101,7 @@ private: static void handleESC(); static void handleAbort(); static Drive *getSelectedDrive(); + static bool getSystemDrive(string &systemDrive); }; #endif // REHDD_H_ diff --git a/src/reHDD.cpp b/src/reHDD.cpp index bc4f5e3..4946859 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -346,6 +346,12 @@ void reHDD::filterIgnoredDrives(list *plistDrives) { list> vtlIgnoredDevices; // store drives from ignore file ifstream input("ignoreDrives.conf"); // read ignore file + string systemDrivePath; + + if (getSystemDrive(systemDrivePath)) + { + Logger::logThis()->info("Found system drive: " + systemDrivePath); + } for (string sLine; getline(input, sLine);) { @@ -605,3 +611,52 @@ void reHDD::handleAbort() } } } + +bool reHDD::getSystemDrive(string &systemDrive) +{ + Logger::logThis()->info("--> search system drive <--"); + char *cLine = NULL; + size_t len = 0; + bool systemDriveFound = false; + + FILE *outputfileHwinfo = popen("lsblk -e 11 -o NAME,MOUNTPOINT", "r"); + + if (outputfileHwinfo == NULL) + { + Logger::logThis()->error("Unable to scan attached drives for system drive"); + exit(EXIT_FAILURE); + } + + while ((getline(&cLine, &len, outputfileHwinfo)) != -1) + { + string currentLine = cLine; + + if (currentLine.find("NAME") != std::string::npos) + { + continue; + } + + // Logger::logThis()->info(currentLine); + + if ((cLine[0U] != '|') && (cLine[0U] != '`')) + { + systemDrive = currentLine; + // Logger::logThis()->info("Drive found: " + systemDrive); + } + + if (currentLine.ends_with(" /boot/efi\n"s)) + { + systemDriveFound = true; + break; + } + + if (currentLine.ends_with(" /\n"s)) + { + systemDriveFound = true; + break; + } + } + pclose(outputfileHwinfo); + + return systemDriveFound; +} \ No newline at end of file diff --git a/src/smart.cpp b/src/smart.cpp index 339d94f..68df376 100644 --- a/src/smart.cpp +++ b/src/smart.cpp @@ -36,7 +36,7 @@ void SMART::readSMARTData(Drive *drive) sCMD.append(drive->getPath()); const char *cpComand = sCMD.c_str(); - // Logger::logThis()->info(cpComand); + //Logger::logThis()->info(cpComand); FILE *outputfileSmart = popen(cpComand, "r"); size_t len = 0U; // length of found line @@ -63,7 +63,7 @@ void SMART::readSMARTData(Drive *drive) if (status == 0U) { // Found S.M.A.R.T. data with this command - // Logger::logThis()->info("Found S.M.A.R.T. data with this command"); + //Logger::logThis()->info("Found S.M.A.R.T. data with this command"); break; } }