void cmd_rmall(Volume* volume, int argc, const char *argv[]) { HFSPlusCatalogRecord* record; char* name; char initPath[1024]; int lastCharOfPath; if(argc > 1) { record = getRecordFromPath(argv[1], volume, &name, NULL); strcpy(initPath, argv[1]); lastCharOfPath = strlen(argv[1]) - 1; if(argv[1][lastCharOfPath] != '/') { initPath[lastCharOfPath + 1] = '/'; initPath[lastCharOfPath + 2] = '\0'; } } else { record = getRecordFromPath("/", volume, &name, NULL); initPath[0] = '/'; initPath[1] = '\0'; } if(record != NULL) { if(record->recordType == kHFSPlusFolderRecord) { removeAllInFolder(((HFSPlusCatalogFolder*)record)->folderID, volume, initPath); } else { printf("Not a folder\n"); } } else { printf("No such file or directory\n"); } free(record); }
void removeAllInFolder(HFSCatalogNodeID folderID, Volume* volume, const char* parentName) { CatalogRecordList* list; CatalogRecordList* theList; char fullName[1024]; char* name; char* pathComponent; int pathLen; char isRoot; HFSPlusCatalogFolder* folder; theList = list = getFolderContents(folderID, volume); strcpy(fullName, parentName); pathComponent = fullName + strlen(fullName); isRoot = FALSE; if(strcmp(fullName, "/") == 0) { isRoot = TRUE; } while(list != NULL) { name = unicodeToAscii(&list->name); if(isRoot && (name[0] == '\0' || strncmp(name, ".HFS+ Private Directory Data", sizeof(".HFS+ Private Directory Data") - 1) == 0)) { free(name); list = list->next; continue; } strcpy(pathComponent, name); pathLen = strlen(fullName); if(list->record->recordType == kHFSPlusFolderRecord) { folder = (HFSPlusCatalogFolder*)list->record; fullName[pathLen] = '/'; fullName[pathLen + 1] = '\0'; removeAllInFolder(folder->folderID, volume, fullName); } else { printf("%s\n", fullName); removeFile(fullName, volume); } free(name); list = list->next; } releaseCatalogRecordList(theList); if(!isRoot) { *(pathComponent - 1) = '\0'; printf("%s\n", fullName); removeFile(fullName, volume); } }