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