From e7baf4f5bc4db369ff8e61485786fed82d98d4ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ya=C4=9F=C4=B1z=20Zengin?= Date: Mon, 1 Sep 2025 01:21:06 +0300 Subject: [PATCH] pmt: Improve pmt & libpartition_map - Change some operator returnn types. - Use std::map instead of std::unordered on magic number maps. - Some improvements. --- src/functions/BackupFunction.cpp | 14 +++--- src/functions/EraseFunction.cpp | 12 ++--- src/functions/FlashFunction.cpp | 14 +++--- src/functions/InfoFunction.cpp | 9 ++-- src/functions/MemoryTestFunction.cpp | 9 ++-- src/functions/PartitionSizeFunction.cpp | 9 ++-- src/functions/RealPathFunction.cpp | 9 ++-- src/functions/RebootFunction.cpp | 9 ++-- src/functions/TypeFunction.cpp | 12 ++--- src/functions/functions.hpp | 20 +++++---- .../include/libpartition_map/lib.hpp | 45 +++++++++---------- srclib/libpartition_map/src/Magic.cpp | 8 ++-- srclib/libpartition_map/src/PartitionMap.cpp | 11 +++-- srclib/libpartition_map/src/Type.cpp | 11 +++-- srclib/libpartition_map/tests/test.cpp | 17 +++++++ 15 files changed, 115 insertions(+), 94 deletions(-) diff --git a/src/functions/BackupFunction.cpp b/src/functions/BackupFunction.cpp index c2e6747..56e161d 100644 --- a/src/functions/BackupFunction.cpp +++ b/src/functions/BackupFunction.cpp @@ -25,11 +25,11 @@ #include #define BFUN "backupFunction" +#define FUNCTION_CLASS backupFunction namespace PartitionManager { -RUN_ASYNC(backupFunction)(const std::string &partitionName, - const std::string &outputName, - const uint64_t bufferSize) { +RUN_ASYNC(const std::string &partitionName, const std::string &outputName, + const uint64_t bufferSize) { if (!Variables->PartMap->hasPartition(partitionName)) return {format("Couldn't find partition: %s", partitionName.data()), false}; @@ -105,7 +105,7 @@ RUN_ASYNC(backupFunction)(const std::string &partitionName, true}; } -INIT(backupFunction) { +INIT { LOGN(BFUN, INFO) << "Initializing variables of backup function." << std::endl; cmd = _app.add_subcommand("backup", "Backup partition(s) to file(s)"); cmd->add_option("partition(s)", rawPartitions, "Partition name(s)") @@ -123,7 +123,7 @@ INIT(backupFunction) { return true; } -RUN(backupFunction) { +RUN { processCommandLine(partitions, outputNames, rawPartitions, rawOutputNames, ',', true); if (!outputNames.empty() && partitions.size() != outputNames.size()) @@ -161,7 +161,7 @@ RUN(backupFunction) { return endResult; } -IS_USED_COMMON_BODY(backupFunction) +IS_USED_COMMON_BODY -NAME(backupFunction) { return BFUN; } +NAME { return BFUN; } } // namespace PartitionManager diff --git a/src/functions/EraseFunction.cpp b/src/functions/EraseFunction.cpp index e8c5816..f4de40e 100644 --- a/src/functions/EraseFunction.cpp +++ b/src/functions/EraseFunction.cpp @@ -23,10 +23,10 @@ Copyright 2025 Yağız Zengin #include #define EFUN "eraseFunction" +#define FUNCTION_CLASS eraseFunction namespace PartitionManager { -RUN_ASYNC(eraseFunction)(const std::string &partitionName, - const uint64_t bufferSize) { +RUN_ASYNC(const std::string &partitionName, const uint64_t bufferSize) { if (!Variables->PartMap->hasPartition(partitionName)) return {format("Couldn't find partition: %s", partitionName.data()), false}; @@ -87,7 +87,7 @@ RUN_ASYNC(eraseFunction)(const std::string &partitionName, true}; } -INIT(eraseFunction) { +INIT { LOGN(EFUN, INFO) << "Initializing variables of erase function." << std::endl; cmd = _app.add_subcommand("erase", "Writes zero bytes to partition(s)"); cmd->add_option("partition(s)", partitions, "Partition name(s)") @@ -100,7 +100,7 @@ INIT(eraseFunction) { return true; } -RUN(eraseFunction) { +RUN { std::vector> futures; for (const auto &partitionName : partitions) { uint64_t buf = bufferSize; @@ -127,7 +127,7 @@ RUN(eraseFunction) { return endResult; } -IS_USED_COMMON_BODY(eraseFunction) +IS_USED_COMMON_BODY -NAME(eraseFunction) { return EFUN; } +NAME { return EFUN; } } // namespace PartitionManager diff --git a/src/functions/FlashFunction.cpp b/src/functions/FlashFunction.cpp index a34c9f6..c5056fa 100644 --- a/src/functions/FlashFunction.cpp +++ b/src/functions/FlashFunction.cpp @@ -23,11 +23,11 @@ Copyright 2025 Yağız Zengin #include #define FFUN "flashFunction" +#define FUNCTION_CLASS flashFunction namespace PartitionManager { -RUN_ASYNC(flashFunction)(const std::string &partitionName, - const std::string &imageName, - const uint64_t bufferSize) { +RUN_ASYNC(const std::string &partitionName, const std::string &imageName, + const uint64_t bufferSize) { if (!Helper::fileIsExists(imageName)) return {format("Couldn't find image file: %s", imageName.data()), false}; if (!Variables->PartMap->hasPartition(partitionName)) @@ -92,7 +92,7 @@ RUN_ASYNC(flashFunction)(const std::string &partitionName, true}; } -INIT(flashFunction) { +INIT { LOGN(FFUN, INFO) << "Initializing variables of flash function." << std::endl; cmd = _app.add_subcommand("flash", "Flash image(s) to partition(s)"); cmd->add_option("partition(s)", rawPartitions, "Partition name(s)") @@ -110,7 +110,7 @@ INIT(flashFunction) { return true; } -RUN(flashFunction) { +RUN { processCommandLine(partitions, imageNames, rawPartitions, rawImageNames, ',', true); if (partitions.size() != imageNames.size()) @@ -148,7 +148,7 @@ RUN(flashFunction) { return endResult; } -IS_USED_COMMON_BODY(flashFunction) +IS_USED_COMMON_BODY -NAME(flashFunction) { return FFUN; } +NAME { return FFUN; } } // namespace PartitionManager diff --git a/src/functions/InfoFunction.cpp b/src/functions/InfoFunction.cpp index d5acc79..611154e 100644 --- a/src/functions/InfoFunction.cpp +++ b/src/functions/InfoFunction.cpp @@ -22,10 +22,11 @@ Copyright 2025 Yağız Zengin #include #define IFUN "infoFunction" +#define FUNCTION_CLASS infoFunction namespace PartitionManager { -INIT(infoFunction) { +INIT { LOGN(IFUN, INFO) << "Initializing variables of info printer function." << std::endl; cmd = _app.add_subcommand("info", "Tell info(s) of input partition list") @@ -56,7 +57,7 @@ INIT(infoFunction) { return true; } -RUN(infoFunction) { +RUN { std::vector jParts; auto func = [this, &jParts] COMMON_LAMBDA_PARAMS -> bool { if (Variables->onLogical && !props.isLogical) { @@ -106,7 +107,7 @@ RUN(infoFunction) { return true; } -IS_USED_COMMON_BODY(infoFunction) +IS_USED_COMMON_BODY -NAME(infoFunction) { return IFUN; }; +NAME { return IFUN; }; } // namespace PartitionManager diff --git a/src/functions/MemoryTestFunction.cpp b/src/functions/MemoryTestFunction.cpp index 31e5f8c..7fa260c 100644 --- a/src/functions/MemoryTestFunction.cpp +++ b/src/functions/MemoryTestFunction.cpp @@ -24,10 +24,11 @@ Copyright 2025 Yağız Zengin #include #define MTFUN "memoryTestFunction" +#define FUNCTION_CLASS memoryTestFunction namespace PartitionManager { -INIT(memoryTestFunction) { +INIT { LOGN(MTFUN, INFO) << "Initializing variables of memory test function." << std::endl; cmd = _app.add_subcommand("memtest", "Test your write/read speed of device."); @@ -56,7 +57,7 @@ INIT(memoryTestFunction) { return true; } -RUN(memoryTestFunction) { +RUN { LOGN(MTFUN, INFO) << "Starting memory test on " << testPath << std::endl; Helper::garbageCollector collector; const std::string test = Helper::pathJoin(testPath, "test.bin"); @@ -121,7 +122,7 @@ RUN(memoryTestFunction) { return true; } -IS_USED_COMMON_BODY(memoryTestFunction) +IS_USED_COMMON_BODY -NAME(memoryTestFunction) { return MTFUN; } +NAME { return MTFUN; } } // namespace PartitionManager diff --git a/src/functions/PartitionSizeFunction.cpp b/src/functions/PartitionSizeFunction.cpp index 59c7b64..04d9e02 100644 --- a/src/functions/PartitionSizeFunction.cpp +++ b/src/functions/PartitionSizeFunction.cpp @@ -18,6 +18,7 @@ Copyright 2025 Yağız Zengin #include #define SFUN "partitionSizeFunction" +#define FUNCTION_CLASS partitionSizeFunction static std::string convertTo(const uint64_t size, const std::string &multiple) { if (multiple == "KB") return std::to_string(TO_KB(size)); @@ -27,7 +28,7 @@ static std::string convertTo(const uint64_t size, const std::string &multiple) { } namespace PartitionManager { -INIT(partitionSizeFunction) { +INIT { LOGN(SFUN, INFO) << "Initializing variables of partition size getter function." << std::endl; @@ -59,7 +60,7 @@ INIT(partitionSizeFunction) { return true; } -RUN(partitionSizeFunction) { +RUN { auto func = [this] COMMON_LAMBDA_PARAMS -> bool { if (Variables->onLogical && !props.isLogical) { if (Variables->forceProcess) @@ -97,7 +98,7 @@ RUN(partitionSizeFunction) { return true; } -IS_USED_COMMON_BODY(partitionSizeFunction) +IS_USED_COMMON_BODY -NAME(partitionSizeFunction) { return SFUN; } +NAME { return SFUN; } } // namespace PartitionManager diff --git a/src/functions/RealPathFunction.cpp b/src/functions/RealPathFunction.cpp index d715fa7..bc91c95 100644 --- a/src/functions/RealPathFunction.cpp +++ b/src/functions/RealPathFunction.cpp @@ -18,9 +18,10 @@ #include #define RPFUN "realPathFunction" +#define FUNCTION_CLASS realPathFunction namespace PartitionManager { -INIT(realPathFunction) { +INIT { LOGN(RPFUN, INFO) << "Initializing variables of real path function." << std::endl; cmd = _app.add_subcommand("real-path", "Tell real paths of partition(s)"); @@ -32,7 +33,7 @@ INIT(realPathFunction) { return true; } -RUN(realPathFunction) { +RUN { for (const auto &partition : partitions) { if (!Variables->PartMap->hasPartition(partition)) throw Error("Couldn't find partition: %s", partition.data()); @@ -56,7 +57,7 @@ RUN(realPathFunction) { return true; } -IS_USED_COMMON_BODY(realPathFunction) +IS_USED_COMMON_BODY -NAME(realPathFunction) { return RPFUN; } +NAME { return RPFUN; } } // namespace PartitionManager diff --git a/src/functions/RebootFunction.cpp b/src/functions/RebootFunction.cpp index 44b8eca..12dce53 100644 --- a/src/functions/RebootFunction.cpp +++ b/src/functions/RebootFunction.cpp @@ -18,9 +18,10 @@ Copyright 2025 Yağız Zengin #include #define RFUN "rebootFunction" +#define FUNCTION_CLASS rebootFunction namespace PartitionManager { -INIT(rebootFunction) { +INIT { LOGN(RFUN, INFO) << "Initializing variables of reboot function." << std::endl; cmd = _app.add_subcommand("reboot", "Reboots device"); cmd->add_option("rebootTarget", rebootTarget, @@ -28,7 +29,7 @@ INIT(rebootFunction) { return true; } -RUN(rebootFunction) { +RUN { LOGN(RFUN, INFO) << "Rebooting device!!! (custom reboot target: " << (rebootTarget.empty() ? "none" : rebootTarget) << std::endl; @@ -39,7 +40,7 @@ RUN(rebootFunction) { return true; } -IS_USED_COMMON_BODY(rebootFunction) +IS_USED_COMMON_BODY -NAME(rebootFunction) { return RFUN; } +NAME { return RFUN; } } // namespace PartitionManager diff --git a/src/functions/TypeFunction.cpp b/src/functions/TypeFunction.cpp index 26490e3..3219589 100644 --- a/src/functions/TypeFunction.cpp +++ b/src/functions/TypeFunction.cpp @@ -16,11 +16,13 @@ #include "functions.hpp" #include +#include #define TFUN "typeFunction" +#define FUNCTION_CLASS typeFunction namespace PartitionManager { -INIT(typeFunction) { +INIT { LOGN(TFUN, INFO) << "Initializing variables of type function." << std::endl; cmd = _app.add_subcommand("type", "Get type of the partition(s) or image(s)"); cmd->add_option("content(s)", contents, "Content(s)") @@ -39,8 +41,8 @@ INIT(typeFunction) { return true; } -RUN(typeFunction) { - std::unordered_map magics; +RUN { + std::map magics; if (onlyCheckAndroidMagics) magics.merge(PartitionMap::Extras::AndroidMagicMap); else if (onlyCheckFileSystemMagics) @@ -74,8 +76,8 @@ RUN(typeFunction) { return true; } -IS_USED_COMMON_BODY(typeFunction) +IS_USED_COMMON_BODY -NAME(typeFunction) { return TFUN; } +NAME { return TFUN; } } // namespace PartitionManager diff --git a/src/functions/functions.hpp b/src/functions/functions.hpp index 2f8b2ce..5f163c9 100644 --- a/src/functions/functions.hpp +++ b/src/functions/functions.hpp @@ -21,16 +21,18 @@ #include #include -#define INIT(cls) bool cls::init(CLI::App &_app) -#define RUN(cls) bool cls::run() -#define RUN_ASYNC(cls) pair cls::runAsync -#define IS_USED(cls) bool cls::isUsed() const -#define IS_USED_COMMON_BODY(cls) \ - bool cls::isUsed() const { return cmd->parsed(); } -#define NAME(cls) const char *cls::name() const +#define INIT bool FUNCTION_CLASS::init(CLI::App &_app) +#define RUN bool FUNCTION_CLASS::run() +#define RUN_ASYNC pair FUNCTION_CLASS::runAsync +#define IS_USED bool FUNCTION_CLASS::isUsed() const +#define IS_USED_COMMON_BODY \ + bool FUNCTION_CLASS::isUsed() const { return cmd->parsed(); } +#define NAME const char *FUNCTION_CLASS::name() const + +/** + * Please define FUNCTION_CLASS before using these macros!!! (INIT etc.) + */ -#define COMMON_LAMBDA_PARAMS \ - (std::string partition, const PartitionMap::Map_t::BasicInf props) #define COMMON_FUNCTION_BODY() \ CLI::App *cmd = nullptr; \ bool init(CLI::App &_app) override; \ diff --git a/srclib/libpartition_map/include/libpartition_map/lib.hpp b/srclib/libpartition_map/include/libpartition_map/lib.hpp index 0e0c82b..7da596b 100644 --- a/srclib/libpartition_map/include/libpartition_map/lib.hpp +++ b/srclib/libpartition_map/include/libpartition_map/lib.hpp @@ -22,12 +22,11 @@ #include #include #include +#include #include #include #include #include -#include -#include #include // for std::pair namespace PartitionMap { @@ -40,6 +39,14 @@ struct _entry { } props; }; +struct _returnable_entry { + uint64_t size; + bool isLogical; +}; + +using BasicInf = _returnable_entry; +using Info = _entry; + /** * The main type of the library. The Builder class is designed * to be easily manipulated and modified only on this class. @@ -54,13 +61,6 @@ public: _entry *_data; size_t _count{}, _capacity{}; - struct _returnable_entry { - uint64_t size; - bool isLogical; - }; - - using BasicInf = _returnable_entry; - basic_partition_map(const std::string &name, uint64_t size, bool logical); basic_partition_map(const basic_partition_map &other); basic_partition_map(basic_partition_map &&other) noexcept; @@ -84,7 +84,7 @@ public: bool operator==(const basic_partition_map &other) const; bool operator!=(const basic_partition_map &other) const; - operator std::vector>() const; + operator std::vector() const; operator int() const; class iterator { @@ -256,26 +256,26 @@ public: * Do input function (lambda) for all partitions. */ void doForAllPartitions( - const std::function &func) const; + const std::function &func) const; /** * Do input function (lambda) for physical partitions. */ void doForPhysicalPartitions( - const std::function &func) const; + const std::function &func) const; /** * Do input function (lambda) for logical partitions. */ void doForLogicalPartitions( - const std::function &func) const; + const std::function &func) const; /** * Do input function (lambda) for input partition list. */ void doForPartitionList( const std::vector &partitions, - const std::function &func) const; + const std::function &func) const; /** * The entered path is defined as the new search @@ -346,10 +346,9 @@ public: const Map_t &operator*() const; /** - * Get map contents as vector (std::tuple type). + * Get map contents as vector (PartitionManager::Info type). */ - [[nodiscard]] - operator std::vector>() const; + [[nodiscard]] operator std::vector() const; /** * Get total partition count in map (int type). @@ -399,9 +398,9 @@ constexpr uint64_t ELF = constexpr uint64_t RAW = 0x00000000; } // namespace AndroidMagic -extern std::unordered_map FileSystemMagicMap; -extern std::unordered_map AndroidMagicMap; -extern std::unordered_map MagicMap; +extern std::map FileSystemMagicMap; +extern std::map AndroidMagicMap; +extern std::map MagicMap; size_t getMagicLength(uint64_t magic); bool hasMagic(uint64_t magic, ssize_t buf, const std::string &path); @@ -411,9 +410,7 @@ std::string formatMagic(uint64_t magic); #define MAP "libpartition_map" -#define T_NAME 0 -#define T_TYPE 1 -#define T_SIZE 2 -#define T_VEC_DECL_TYPE std::vector> +#define COMMON_LAMBDA_PARAMS \ + (const std::string &partition, const PartitionMap::BasicInf props) #endif // #ifndef LIBPARTITION_MAP_LIB_HPP diff --git a/srclib/libpartition_map/src/Magic.cpp b/srclib/libpartition_map/src/Magic.cpp index 7f4861b..d0e5a68 100644 --- a/srclib/libpartition_map/src/Magic.cpp +++ b/srclib/libpartition_map/src/Magic.cpp @@ -17,15 +17,15 @@ #include #include #include +#include #include #include #include -#include #include "PartitionManager/PartitionManager.hpp" namespace PartitionMap::Extras { -std::unordered_map FileSystemMagicMap = { +std::map FileSystemMagicMap = { {FileSystemMagic::EXTFS_FS, "EXT2/3/4"}, {FileSystemMagic::F2FS_FS, "F2FS"}, {FileSystemMagic::EROFS_FS, "EROFS"}, @@ -36,7 +36,7 @@ std::unordered_map FileSystemMagicMap = { {FileSystemMagic::NTFS_FS, "NTFS"}, {FileSystemMagic::MSDOS_FS, "MSDOS"}}; -std::unordered_map AndroidMagicMap = { +std::map AndroidMagicMap = { {AndroidMagic::BOOT_IMAGE, "Android Boot Image"}, {AndroidMagic::VBOOT_IMAGE, "Android Vendor Boot Image"}, {AndroidMagic::LK_IMAGE, "Android LK (Bootloader)"}, @@ -47,7 +47,7 @@ std::unordered_map AndroidMagicMap = { {AndroidMagic::ELF, "ELF"}, {AndroidMagic::RAW, "Raw Data"}}; -std::unordered_map MagicMap = { +std::map MagicMap = { {AndroidMagic::BOOT_IMAGE, "Android Boot Image"}, {AndroidMagic::VBOOT_IMAGE, "Android Vendor Boot Image"}, {AndroidMagic::LK_IMAGE, "Android LK (Bootloader)"}, diff --git a/srclib/libpartition_map/src/PartitionMap.cpp b/srclib/libpartition_map/src/PartitionMap.cpp index 6e04215..1e06b64 100644 --- a/srclib/libpartition_map/src/PartitionMap.cpp +++ b/srclib/libpartition_map/src/PartitionMap.cpp @@ -288,7 +288,7 @@ bool basic_partition_map_builder::empty() const { } void basic_partition_map_builder::doForAllPartitions( - const std::function &func) const { + const std::function &func) const { _map_build_check(); LOGN(MAP, INFO) << "Doing input function for all partitions." << std::endl; @@ -303,7 +303,7 @@ void basic_partition_map_builder::doForAllPartitions( } void basic_partition_map_builder::doForPhysicalPartitions( - const std::function &func) const { + const std::function &func) const { _map_build_check(); LOGN(MAP, INFO) << "Doing input function for physical partitions." @@ -320,7 +320,7 @@ void basic_partition_map_builder::doForPhysicalPartitions( } void basic_partition_map_builder::doForLogicalPartitions( - const std::function &func) const { + const std::function &func) const { _map_build_check(); LOGN(MAP, INFO) << "Doing input function for logical partitions." @@ -338,7 +338,7 @@ void basic_partition_map_builder::doForLogicalPartitions( void basic_partition_map_builder::doForPartitionList( const std::vector &partitions, - const std::function &func) const { + const std::function &func) const { _map_build_check(); LOGN(MAP, INFO) << "Doing input function for input partition list." @@ -388,8 +388,7 @@ const Map_t &basic_partition_map_builder::operator*() const { return _current_map; } -basic_partition_map_builder::operator std::vector< - std::tuple>() const { +basic_partition_map_builder::operator std::vector() const { return _current_map; } diff --git a/srclib/libpartition_map/src/Type.cpp b/srclib/libpartition_map/src/Type.cpp index 353b11b..9c24dcc 100644 --- a/srclib/libpartition_map/src/Type.cpp +++ b/srclib/libpartition_map/src/Type.cpp @@ -162,7 +162,7 @@ bool basic_partition_map::is_logical(const std::string_view name) const { return false; } -basic_partition_map::_returnable_entry +_returnable_entry basic_partition_map::get_all(const std::string_view name) const { if (const int pos = _index_of(name); name == _data[pos].name) return _returnable_entry{_data[pos].props.size, _data[pos].props.isLogical}; @@ -229,13 +229,12 @@ bool basic_partition_map::operator!=(const basic_partition_map &other) const { return !(*this == other); } -basic_partition_map::operator std::vector< - std::tuple>() const { - std::vector> v; +basic_partition_map::operator std::vector() const { + std::vector v; if (_count == 0) return {}; for (size_t i = 0; i < _count; i++) - v.emplace_back(_data[i].name, _data[i].props.size, - _data[i].props.isLogical); + v.push_back( + {_data[i].name, {_data[i].props.size, _data[i].props.isLogical}}); return v; } diff --git a/srclib/libpartition_map/tests/test.cpp b/srclib/libpartition_map/tests/test.cpp index e8bf696..f91ed43 100644 --- a/srclib/libpartition_map/tests/test.cpp +++ b/srclib/libpartition_map/tests/test.cpp @@ -14,6 +14,7 @@ limitations under the License. */ +#include #include #include #include @@ -54,10 +55,26 @@ int main() { for (const auto &name : *physicals) std::cout << " - " << name << std::endl; + if (const std::vector parts = MyMap; parts.empty()) + throw PartitionMap::Error( + "operator std::vector>PartitionMap::Info>() returned empty vector"); + + auto func = [](const std::string &partition, + const PartitionMap::BasicInf props) -> bool { + std::ofstream f("parts.txt"); + f << "Partition: " << partition << ", size: " << props.size + << ", logical: " << props.isLogical; + return !f.fail(); + }; + MyMap.doForAllPartitions(func); + + std::cout << "Total partitions count: " << (int)MyMap << std::endl; std::cout << "Boot: " << MyMap.getRealLinkPathOf("boot") << std::endl; std::cout << "Boot (realpath): " << MyMap.getRealPathOf("boot") << std::endl; std::cout << "Search dir: " << MyMap.getCurrentWorkDir() << std::endl; + std::cout << "Search dir test 2: " << static_cast(MyMap) + << std::endl; std::cout << "Has partition cache? = " << MyMap.hasPartition("cache") << std::endl; std::cout << "system partition is logical? = " << MyMap.isLogical("system")