diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 135bcb081..034c59bd8 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -1900,6 +1900,13 @@ static void PacketReceived(PacketCommandNG *packet) { LED_B_OFF(); break; } + case CMD_SPIFFS_WIPE: { + LED_B_ON(); + rdv40_spiffs_safe_wipe(); + reply_ng(CMD_SPIFFS_WIPE, PM3_SUCCESS, NULL, 0); + LED_B_OFF(); + break; + } case CMD_FLASHMEM_SET_SPIBAUDRATE: { if (packet->length != sizeof(uint32_t)) break; diff --git a/armsrc/spiffs.c b/armsrc/spiffs.c index 216b2321d..a7be6cedf 100644 --- a/armsrc/spiffs.c +++ b/armsrc/spiffs.c @@ -472,16 +472,20 @@ int rdv40_spiffs_is_symlink(const char *s) { // ATTENTION : you must NOT provide the whole filename (so please do not include the .lnk extension) // TODO : integrate in read_function int rdv40_spiffs_read_as_symlink(char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level) { - RDV40_SPIFFS_SAFE_FUNCTION( // - char linkdest[SPIFFS_OBJ_NAME_LEN]; // - char linkfilename[SPIFFS_OBJ_NAME_LEN]; // + RDV40_SPIFFS_SAFE_FUNCTION( + char linkdest[SPIFFS_OBJ_NAME_LEN]; + char linkfilename[SPIFFS_OBJ_NAME_LEN]; sprintf(linkfilename, "%s.lnk", filename); - if (DBGLEVEL > 1) Dbprintf("Linkk real filename is destination is : %s", linkfilename); + + if (DBGLEVEL > 1) Dbprintf("Linkk real filename is : " _YELLOW_("%s"), linkfilename); + read_from_spiffs((char *)linkfilename, (uint8_t *)linkdest, SPIFFS_OBJ_NAME_LEN); - if (DBGLEVEL > 1) Dbprintf("Symlink destination is : %s", linkdest); - read_from_spiffs((char *)linkdest, (uint8_t *)dst, size); // - ) - } + + if (DBGLEVEL > 1) Dbprintf("Symlink destination is : " _YELLOW_("%s"), linkdest); + + read_from_spiffs((char *)linkdest, (uint8_t *)dst, size); + ) +} // BEWARE ! This function is DESTRUCTIVE as it will UPDATE an existing symlink // Since it creates a .lnk extension file it may be minor to mistake the order of arguments @@ -601,6 +605,37 @@ void rdv40_spiffs_safe_print_tree(uint8_t banner) { rdv40_spiffs_lazy_mount_rollback(changed); } +void rdv40_spiffs_safe_wipe(void) { + + int changed = rdv40_spiffs_lazy_mount(); + + spiffs_DIR d; + struct spiffs_dirent e; + struct spiffs_dirent *pe = &e; + SPIFFS_opendir(&fs, "/", &d); + + while ((pe = SPIFFS_readdir(&d, pe))) { + + if (rdv40_spiffs_is_symlink((const char *)pe->name)) { + + char linkdest[SPIFFS_OBJ_NAME_LEN]; + read_from_spiffs((char *)pe->name, (uint8_t *)linkdest, SPIFFS_OBJ_NAME_LEN); + + remove_from_spiffs(linkdest); + Dbprintf(".lnk removed %s", pe->name); + + remove_from_spiffs((char *)pe->name); + Dbprintf("removed %s", linkdest); + + } else { + remove_from_spiffs((char *)pe->name); + Dbprintf("removed %s", pe->name); + } + } + + SPIFFS_closedir(&d); + rdv40_spiffs_lazy_mount_rollback(changed); +} // Selftest function void test_spiffs(void) { diff --git a/armsrc/spiffs.h b/armsrc/spiffs.h index 5a9e58a94..8754cb432 100644 --- a/armsrc/spiffs.h +++ b/armsrc/spiffs.h @@ -58,6 +58,8 @@ int rdv40_spiffs_stat(char *filename, uint32_t *buf, RDV40SpiFFSSafetyLevel leve uint32_t size_in_spiffs(const char *filename); int exists_in_spiffs(const char *filename); +void rdv40_spiffs_safe_wipe(void); + #define SPIFFS_OK 0 #define SPIFFS_ERR_NOT_MOUNTED -10000 #define SPIFFS_ERR_FULL -10001 diff --git a/client/src/cmdflashmemspiffs.c b/client/src/cmdflashmemspiffs.c index 887784428..d419fa131 100644 --- a/client/src/cmdflashmemspiffs.c +++ b/client/src/cmdflashmemspiffs.c @@ -74,7 +74,14 @@ static int usage_flashmemspiffs_load(void) { return PM3_SUCCESS; } - +static int usage_flashmemspiffs_wipe(void) { + PrintAndLogEx(NORMAL, "wipes all files on the device filesystem " _RED_("* Warning *")); + PrintAndLogEx(NORMAL, "Usage: mem spiffs wipe [h]"); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(NORMAL, "Examples:"); + PrintAndLogEx(NORMAL, _YELLOW_(" mem spiffs wipe")); + return PM3_SUCCESS; +} static int CmdFlashMemSpiFFSMount(const char *Cmd) { (void)Cmd; // Cmd is not used so far clearCommandBuffer(); @@ -413,6 +420,23 @@ out: return ret_val; } +static int CmdFlashMemSpiFFSWipe(const char *Cmd) { + + char ctmp = tolower(param_getchar(Cmd, 0)); + if (ctmp == 'h') { + return usage_flashmemspiffs_wipe(); + } + + PrintAndLogEx(INFO, "Wiping all files from SPIFFS FileSystem"); + PacketResponseNG resp; + clearCommandBuffer(); + SendCommandNG(CMD_SPIFFS_WIPE, NULL, 0); + WaitForResponse(CMD_SPIFFS_WIPE, &resp); + PrintAndLogEx(INFO, "Done!"); + PrintAndLogEx(HINT, "Try use '" _YELLOW_("mem spiffs tree") "' to verify."); + return PM3_SUCCESS; +} + static int CmdFlashMemSpiFFSLoad(const char *Cmd) { char filename[FILE_PATH_SIZE] = {0}; @@ -473,20 +497,18 @@ static int CmdFlashMemSpiFFSLoad(const char *Cmd) { static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, - { - "copy", CmdFlashMemSpiFFSCopy, IfPm3Flash, - "Copy a file to another (destructively) in SPIFFS FileSystem in FlashMEM (spiffs)" - }, - {"check", CmdFlashMemSpiFFSCheck, IfPm3Flash, "Check/try to defrag faulty/fragmented Filesystem"}, - {"dump", CmdFlashMemSpiFFSDump, IfPm3Flash, "Dump a file from SPIFFS FileSystem in FlashMEM (spiffs)"}, - {"info", CmdFlashMemSpiFFSInfo, IfPm3Flash, "Print filesystem info and usage statistics (spiffs)"}, - {"load", CmdFlashMemSpiFFSLoad, IfPm3Flash, "Upload file into SPIFFS Filesystem (spiffs)"}, - {"mount", CmdFlashMemSpiFFSMount, IfPm3Flash, "Mount the SPIFFS Filesystem if not already mounted (spiffs)"}, - {"remove", CmdFlashMemSpiFFSRemove, IfPm3Flash, "Remove a file from SPIFFS FileSystem in FlashMEM (spiffs)"}, - {"rename", CmdFlashMemSpiFFSRename, IfPm3Flash, "Rename/move a file in SPIFFS FileSystem in FlashMEM (spiffs)"}, - {"test", CmdFlashMemSpiFFSTest, IfPm3Flash, "Test SPIFFS Operations (require wiping pages 0 and 1)"}, - {"tree", CmdFlashMemSpiFFSTree, IfPm3Flash, "Print the Flash Memory FileSystem Tree (spiffs)"}, + {"copy", CmdFlashMemSpiFFSCopy, IfPm3Flash, "Copy a file to another (destructively) in SPIFFS FileSystem in FlashMEM (spiffs)"}, + {"check", CmdFlashMemSpiFFSCheck, IfPm3Flash, "Check/try to defrag faulty/fragmented Filesystem"}, + {"dump", CmdFlashMemSpiFFSDump, IfPm3Flash, "Dump a file from SPIFFS FileSystem in FlashMEM (spiffs)"}, + {"info", CmdFlashMemSpiFFSInfo, IfPm3Flash, "Print filesystem info and usage statistics (spiffs)"}, + {"load", CmdFlashMemSpiFFSLoad, IfPm3Flash, "Upload file into SPIFFS Filesystem (spiffs)"}, + {"mount", CmdFlashMemSpiFFSMount, IfPm3Flash, "Mount the SPIFFS Filesystem if not already mounted (spiffs)"}, + {"remove", CmdFlashMemSpiFFSRemove, IfPm3Flash, "Remove a file from SPIFFS FileSystem in FlashMEM (spiffs)"}, + {"rename", CmdFlashMemSpiFFSRename, IfPm3Flash, "Rename/move a file in SPIFFS FileSystem in FlashMEM (spiffs)"}, + {"test", CmdFlashMemSpiFFSTest, IfPm3Flash, "Test SPIFFS Operations (require wiping pages 0 and 1)"}, + {"tree", CmdFlashMemSpiFFSTree, IfPm3Flash, "Print the Flash Memory FileSystem Tree (spiffs)"}, {"unmount", CmdFlashMemSpiFFSUnmount, IfPm3Flash, "Un-mount the SPIFFS Filesystem if not already mounted (spiffs)"}, + {"wipe", CmdFlashMemSpiFFSWipe, IfPm3Flash, "Wipe all files from SPIFFS FileSystem." _RED_("* dangerous *") }, {NULL, NULL, NULL, NULL} }; diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h index 258b11b02..a28de4264 100644 --- a/include/pm3_cmd.h +++ b/include/pm3_cmd.h @@ -409,11 +409,12 @@ typedef struct { #define CMD_SPIFFS_MOUNT 0x0130 #define CMD_SPIFFS_UNMOUNT 0x0131 #define CMD_SPIFFS_WRITE 0x0132 + // We take +0x1000 when having a variant of similar function (todo : make it an argument!) #define CMD_SPIFFS_APPEND 0x1132 #define CMD_SPIFFS_READ 0x0133 -//We use no open/close instruvtion, as they are handled internally. +//We use no open/close instruction, as they are handled internally. #define CMD_SPIFFS_REMOVE 0x0134 #define CMD_SPIFFS_RM CMD_SPIFFS_REMOVE #define CMD_SPIFFS_RENAME 0x0135 @@ -424,6 +425,9 @@ typedef struct { #define CMD_SPIFFS_FSTAT 0x0138 #define CMD_SPIFFS_INFO 0x0139 #define CMD_SPIFFS_FORMAT CMD_FLASHMEM_WIPE + +#define CMD_SPIFFS_WIPE 0x013A + // This take a +0x2000 as they are high level helper and special functions // As the others, they may have safety level argument if it makkes sense #define CMD_SPIFFS_PRINT_TREE 0x2130