1 /* 2 Condensed version of `rm', optimized for space, sortof 3 4 042720000103: TODO: Add support for -[rR] ! 5 6 */ 7 8 9 #include <stdio.h> 10 #include <unistd.h> 11 #include <stdlib.h> 12 #include <sys/stat.h> 13 #include <sys/types.h> 14 #include "version.h" 15 #include "rm.h" 16 17 extern char *optarg; 18 extern int optind, opterr, optopt; 19 20 int rm_main (int argc, char **argv) { 21 unsigned int error_code=0; 22 struct stat statbuf; 23 char ch; 24 char option_dir=0; 25 char option_force=0; 26 char option_interactive=0; 27 char option_recurse=0; 28 char option_verbose=0; 29 char input_buff[127]; 30 int i; 31 32 while ((ch=getopt(argc, argv, "dfirvR")) != -1) { 33 switch (ch) { 34 case 'd': 35 option_dir=1; 36 break; 37 case 'f': 38 option_interactive=0; 39 option_force=1; 40 break; 41 case 'i': 42 option_force=0; 43 option_interactive=1; 44 break; 45 case 'r': 46 case 'R': 47 option_recurse=1; 48 break; 49 case 'v': 50 option_verbose=1; 51 break; 52 default: 53 return(-1); 54 } 55 } 56 57 if (optind==argc) { 58 write(STDERR_FILENO, "rm: too few arguments\n",22); 59 return(!option_force); 60 } 61 62 for (i=optind;i<argc;i++) { 63 if (stat(argv[i], &statbuf)<0) { 64 if (!option_force) { 65 write(STDERR_FILENO, "rm: ", 4); 66 perror(argv[i]); 67 } 68 error_code=1; 69 goto loop; 70 } 71 if (S_ISDIR(statbuf.st_mode) && option_dir==0) { 72 if (option_recurse) { 73 74 /* TODO: Add recursion code here */ 75 76 } 77 write(STDERR_FILENO, "rm: ",4); 78 write(STDERR_FILENO, argv[i], strlen(argv[i])); 79 write(STDERR_FILENO, " is a directory\n",16); 80 error_code=2; 81 goto loop; 82 } 83 if (option_interactive) { 84 write(STDOUT_FILENO, "rm: remove `", 12); 85 write(STDOUT_FILENO, argv[i], strlen(argv[i])); 86 write(STDOUT_FILENO, "\'? ", 3); 87 read(STDIN_FILENO, &input_buff, sizeof(input_buff)); 88 if (input_buff[0]!='y' && input_buff[0]!='Y') goto loop; 89 } 90 if (option_verbose) 91 write(STDOUT_FILENO,argv[i],strlen(argv[i])); 92 if (unlink(argv[i])<0) { 93 write(STDERR_FILENO, "rm: ", 4); 94 perror(argv[i]); 95 error_code=2; 96 } 97 loop: 98 } 99 return((option_force==0 || error_code>1)); 100 } |