rm.c (945B)
1 #include <libc.h> 2 3 #define enoent 2 4 #define enotdir 20 5 #define eisdir 21 6 7 #define dt_unknown 0 8 #define dt_reg 8 9 #define dt_dir 4 10 11 int has_r; 12 int has_f; 13 14 int first; 15 16 17 void rm_tree(char **argv) { 18 (void)argv; 19 } 20 21 void rm_file(char **argv) { 22 char *f; 23 int r; 24 25 while ((f = *argv++) != NULL) { 26 r = unlink(f); 27 28 if (r < 0) { 29 if (has_f && errno == enoent) 30 continue; 31 return; 32 } 33 } 34 } 35 36 int main(int argc, char *argv[]) { 37 if (argc < 2) { 38 write(stderr, "using: rm [options] <path>\n", 27); 39 return 1; 40 } 41 42 for (int i = 1; i < argc; i++) { 43 if (strcmp(argv[i], "-r") == 0) { 44 has_r = 1; 45 continue; 46 } 47 if (strcmp(argv[i], "-f") == 0) { 48 has_f = 1; 49 continue; 50 } 51 if (strcmp(argv[i], "-rf") == 0) { 52 has_r = 1; 53 has_f = 1; 54 continue; 55 } 56 57 first = i; 58 break; 59 } 60 61 if (has_r) 62 rm_tree(&argv[first]); 63 else 64 rm_file(&argv[first]); 65 66 return 0; 67 }