1: int errcode;
   2: 
   3: #include <stdio.h>
   4: #include <sys/types.h>
   5: #include <sys/stat.h>
   6: #include <sys/dir.h>
   7: 
   8: char    *sprintf();
   9: 
  10: main(argc, argv)
  11: char *argv[];
  12: {
  13:     register char *arg;
  14:     int fflg, iflg, rflg;
  15: 
  16:     fflg = 0;
  17:     if (isatty(0) == 0)
  18:         fflg++;
  19:     iflg = 0;
  20:     rflg = 0;
  21:     if(argc>1 && argv[1][0]=='-') {
  22:         arg = *++argv;
  23:         argc--;
  24:         while(*++arg != '\0')
  25:             switch(*arg) {
  26:             case 'f':
  27:                 fflg++;
  28:                 break;
  29:             case 'i':
  30:                 iflg++;
  31:                 break;
  32:             case 'r':
  33:                 rflg++;
  34:                 break;
  35:             default:
  36:                 printf("rm: unknown option %s\n", *argv);
  37:                 exit(1);
  38:             }
  39:     }
  40:     while(--argc > 0) {
  41:         if(!strcmp(*++argv, "..")) {
  42:             fprintf(stderr, "rm: cannot remove `..'\n");
  43:             continue;
  44:         }
  45:         rm(*argv, fflg, rflg, iflg, 0);
  46:     }
  47: 
  48:     exit(errcode);
  49: }
  50: 
  51: rm(arg, fflg, rflg, iflg, level)
  52: char arg[];
  53: {
  54:     struct stat buf;
  55:     struct direct direct;
  56:     char name[100];
  57:     int d;
  58: 
  59:     if(stat(arg, &buf)) {
  60:         if (fflg==0) {
  61:             printf("rm: %s nonexistent\n", arg);
  62:             ++errcode;
  63:         }
  64:         return;
  65:     }
  66:     if ((buf.st_mode&S_IFMT) == S_IFDIR) {
  67:         if(rflg) {
  68:             if (access(arg, 02) < 0) {
  69:                 if (fflg==0)
  70:                     printf("%s not changed\n", arg);
  71:                 errcode++;
  72:                 return;
  73:             }
  74:             if(iflg && level!=0) {
  75:                 printf("directory %s: ", arg);
  76:                 if(!yes())
  77:                     return;
  78:             }
  79:             if((d=open(arg, 0)) < 0) {
  80:                 printf("rm: %s: cannot read\n", arg);
  81:                 exit(1);
  82:             }
  83:             while(read(d, (char *)&direct, sizeof(direct)) == sizeof(direct)) {
  84:                 if(direct.d_ino != 0 && !dotname(direct.d_name)) {
  85:                     sprintf(name, "%s/%.14s", arg, direct.d_name);
  86:                     rm(name, fflg, rflg, iflg, level+1);
  87:                 }
  88:             }
  89:             close(d);
  90:             errcode += rmdir(arg, iflg);
  91:             return;
  92:         }
  93:         printf("rm: %s directory\n", arg);
  94:         ++errcode;
  95:         return;
  96:     }
  97: 
  98:     if(iflg) {
  99:         printf("%s: ", arg);
 100:         if(!yes())
 101:             return;
 102:     }
 103:     else if(!fflg) {
 104:         if (access(arg, 02)<0) {
 105:             printf("rm: %s %o mode ", arg, buf.st_mode&0777);
 106:             if(!yes())
 107:                 return;
 108:         }
 109:     }
 110:     if(unlink(arg) && (fflg==0 || iflg)) {
 111:         printf("rm: %s not removed\n", arg);
 112:         ++errcode;
 113:     }
 114: }
 115: 
 116: dotname(s)
 117: char *s;
 118: {
 119:     if(s[0] == '.')
 120:         if(s[1] == '.')
 121:             if(s[2] == '\0')
 122:                 return(1);
 123:             else
 124:                 return(0);
 125:         else if(s[1] == '\0')
 126:             return(1);
 127:     return(0);
 128: }
 129: 
 130: rmdir(f, iflg)
 131: char *f;
 132: {
 133:     int status, i;
 134: 
 135:     if(dotname(f))
 136:         return(0);
 137:     if(iflg) {
 138:         printf("%s: ", f);
 139:         if(!yes())
 140:             return(0);
 141:     }
 142:     while((i=fork()) == -1)
 143:         sleep(3);
 144:     if(i) {
 145:         wait(&status);
 146:         return(status);
 147:     }
 148:     execl("/bin/rmdir", "rmdir", f, 0);
 149:     execl("/usr/bin/rmdir", "rmdir", f, 0);
 150:     printf("rm: can't find rmdir\n");
 151:     exit(1);
 152: }
 153: 
 154: yes()
 155: {
 156:     int i, b;
 157: 
 158:     i = b = getchar();
 159:     while(b != '\n' && b != EOF)
 160:         b = getchar();
 161:     return(i == 'y');
 162: }

Defined functions

dotname defined in line 116; used 2 times
main defined in line 10; never used
rm defined in line 51; used 2 times
rmdir defined in line 130; used 1 times
  • in line 90
yes defined in line 154; used 4 times

Defined variables

errcode defined in line 1; used 6 times
Last modified: 1979-01-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 745
Valid CSS Valid XHTML 1.0 Strict