coreutils

custom mini coreutils
git clone git://git.evenfri.xyz/coreutils.git
Log | Files | Refs | README

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 }