|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.