|
|
1.1 root 1: static char *sccsid = "@(#)rm.c 4.12 (Berkeley) 6/30/83";
2: int errcode;
3:
4: #include <stdio.h>
5: #include <sys/param.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:
26: /*
27: * all files following a null option are considered file names
28: */
29: if (*(arg+1) == '\0') break;
30:
31: while(*++arg != '\0')
32: switch(*arg) {
33: case 'f':
34: fflg++;
35: break;
36: case 'i':
37: iflg++;
38: break;
39: case 'r':
40: rflg++;
41: break;
42: default:
43: printf("rm: unknown option %s\n", *argv);
44: exit(1);
45: }
46: }
47: while(--argc > 0) {
48: if(!strcmp(*++argv, "..")) {
49: fprintf(stderr, "rm: cannot remove `..'\n");
50: continue;
51: }
52: rm(*argv, fflg, rflg, iflg, 0);
53: }
54:
55: exit(errcode);
56: }
57:
58: rm(arg, fflg, rflg, iflg, level)
59: char arg[];
60: {
61: struct stat buf;
62: struct direct *dp;
63: DIR *dirp;
64: char name[BUFSIZ];
65: int d;
66:
67: if(lstat(arg, &buf)) {
68: if (fflg==0) {
69: printf("rm: %s nonexistent\n", arg);
70: ++errcode;
71: }
72: return;
73: }
74: if ((buf.st_mode&S_IFMT) == S_IFDIR) {
75: if(rflg) {
76: if (access(arg, 02) < 0) {
77: if (fflg==0)
78: printf("%s not changed\n", arg);
79: errcode++;
80: return;
81: }
82: if(iflg && level!=0) {
83: printf("remove directory %s? ", arg);
84: if(!yes())
85: return;
86: }
87: if((dirp = opendir(arg)) == NULL) {
88: printf("rm: cannot read %s?\n", arg);
89: exit(1);
90: }
91: while((dp = readdir(dirp)) != NULL) {
92: if(dp->d_ino != 0 && !dotname(dp->d_name)) {
93: sprintf(name, "%s/%s", arg, dp->d_name);
94: rm(name, fflg, rflg, iflg, level+1);
95: }
96: }
97: closedir(dirp);
98: if (dotname(arg))
99: return;
100: if (iflg) {
101: printf("rm: remove %s? ", arg);
102: if (!yes())
103: return;
104: }
105: if (rmdir(arg) < 0) {
106: fprintf(stderr, "rm: ");
107: perror(arg);
108: errcode++;
109: }
110: return;
111: }
112: printf("rm: %s directory\n", arg);
113: ++errcode;
114: return;
115: }
116:
117: if(iflg) {
118: printf("rm: remove %s? ", arg);
119: if(!yes())
120: return;
121: }
122: else if(!fflg) {
123: if ((buf.st_mode&S_IFMT) != S_IFLNK && access(arg, 02) < 0) {
124: printf("rm: override protection %o for %s? ", buf.st_mode&0777, arg);
125: if(!yes())
126: return;
127: }
128: }
129: if(unlink(arg) && (fflg==0 || iflg)) {
130: printf("rm: %s not removed\n", arg);
131: ++errcode;
132: }
133: }
134:
135: dotname(s)
136: char *s;
137: {
138: if(s[0] == '.')
139: if(s[1] == '.')
140: if(s[2] == '\0')
141: return(1);
142: else
143: return(0);
144: else if(s[1] == '\0')
145: return(1);
146: return(0);
147: }
148:
149: yes()
150: {
151: int i, b;
152:
153: i = b = getchar();
154: while(b != '\n' && b != EOF)
155: b = getchar();
156: return(i == 'y');
157: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.