123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- #define word char
- #include "lib/math.c"
- #include "lib/stdlib.c"
- #include "lib/sys.c"
- #include "lib/brfs.c"
- void remove_dir(char* path)
- {
- struct brfs_dir_entry entries[MAX_DIR_ENTRIES];
- word num_entries = fs_readdir(path, entries);
- word i;
- for (i = 0; i < num_entries; i++)
- {
- struct brfs_dir_entry entry = entries[i];
- char decompressed_filename[17];
- strdecompress(decompressed_filename, entry.filename);
-
- if (strcmp(decompressed_filename, ".") == 0 || strcmp(decompressed_filename, "..") == 0)
- {
- continue;
- }
- char absolute_path[MAX_PATH_LENGTH];
- strcpy(absolute_path, path);
- strcat(absolute_path, "/");
- strcat(absolute_path, decompressed_filename);
- if ((entry.flags & 0x01) == 0)
- {
- // File
- if (fs_delete(absolute_path))
- {
- // Do not sync flash after each file deletion
- }
- else
- {
- bdos_println("Could not delete file");
- }
- }
- else
- {
- // Directory
- remove_dir(absolute_path);
- }
- }
- // Delete directory after contents are deleted
- if (fs_delete(path))
- {
- // Do not sync flash after each directory deletion
- }
- else
- {
- bdos_println("Could not delete directory");
- }
-
-
- }
- int main()
- {
- // Read number of arguments
- word argc = shell_argc();
- if (argc < 2)
- {
- bdos_println("Usage: rm <file/dir>");
- return 1;
- }
-
- // Read file/dir name
- char** args = shell_argv();
- char* fname = args[1];
- char absolute_path[MAX_PATH_LENGTH];
- // Check if absolute path
- if (fname[0] != '/')
- {
- char* cwd = fs_getcwd();
- strcpy(absolute_path, cwd);
- if (absolute_path[strlen(absolute_path) - 1] != '/')
- {
- strcat(absolute_path, "/");
- }
- strcat(absolute_path, fname);
- }
- else
- {
- strcpy(absolute_path, fname);
- }
- // Check if fname is a file or directory
- struct brfs_dir_entry* entry = (struct brfs_dir_entry*)fs_stat(absolute_path);
- if ((word)entry == -1)
- {
- bdos_println("File not found");
- return 1;
- }
- // Check if root directory
- if (entry->fat_idx == 0)
- {
- bdos_println("Cannot delete root directory");
- return 1;
- }
- if ((entry->flags & 0x01) == 0)
- {
- // File
- if (fs_delete(absolute_path))
- {
- fs_syncflash();
- }
- else
- {
- bdos_println("Could not delete file");
- }
- }
- else
- {
- // Directory
- remove_dir(absolute_path);
- fs_syncflash();
- }
- return 'q';
- }
- void interrupt()
- {
- // Handle all interrupts
- word i = get_int_id();
- switch(i)
- {
- case INTID_TIMER1:
- timer1Value = 1; // Notify ending of timer1
- break;
- }
- }
|