|
|
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: usage();
37: }
38: }
39: if (argc <= 1)
40: usage();
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: usage()
53: {
54: fprintf(stderr, "usage: rm [-rfi] file ...\n");
55: exit(1);
56: }
57:
58: rm(arg, fflg, rflg, iflg, level)
59: char arg[];
60: {
61: struct stat buf;
62: struct direct direct;
63: char name[100];
64: int d;
65:
66: if(lstat(arg, &buf)) {
67: if (fflg==0) {
68: fprintf(stderr, "rm: %s nonexistent\n", arg);
69: ++errcode;
70: }
71: return;
72: }
73: if ((buf.st_mode&S_IFMT) == S_IFDIR) {
74: if(rflg) {
75: if (access(arg, 02) < 0) {
76: if (fflg==0)
77: fprintf(stderr, "%s not changed\n", arg);
78: errcode++;
79: return;
80: }
81: if(iflg && level!=0) {
82: printf("directory %s: ", arg);
83: if(!yes())
84: return;
85: }
86: if((d=open(arg, 0)) < 0) {
87: fprintf(stderr, "rm: %s: cannot read\n", arg);
88: exit(1);
89: }
90: while(read(d, (char *)&direct, sizeof(direct)) == sizeof(direct)) {
91: if(direct.d_ino != 0 && !dotname(direct.d_name)) {
92: sprintf(name, "%s/%.14s", arg, direct.d_name);
93: rm(name, fflg, rflg, iflg, level+1);
94: }
95: }
96: close(d);
97: }
98: if (iflg) {
99: printf("%s: ", arg);
100: if (!yes())
101: return;
102: }
103: if (rmdir(arg) < 0 && (fflg==0 || iflg)) {
104: perror(arg);
105: errcode++;
106: }
107: return;
108: }
109:
110: if(iflg) {
111: printf("%s: ", arg);
112: if(!yes())
113: return;
114: }
115: else if(!fflg) {
116: if (access(arg, 02)<0) {
117: printf("rm: %s %o mode ", arg, buf.st_mode&0777);
118: if(!yes())
119: return;
120: }
121: }
122: if(unlink(arg) && (fflg==0 || iflg)) {
123: perror(arg);
124: ++errcode;
125: }
126: }
127:
128: dotname(s)
129: char *s;
130: {
131: if(s[0] == '.')
132: if(s[1] == '.')
133: if(s[2] == '\0')
134: return(1);
135: else
136: return(0);
137: else if(s[1] == '\0')
138: return(1);
139: return(0);
140: }
141:
142: yes()
143: {
144: int i, b;
145:
146: fflush(stdout);
147: i = b = getchar();
148: while(b != '\n' && b != EOF)
149: b = getchar();
150: return(i == 'y');
151: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.