|
|
1.1 root 1: static char *sccsid = "@(#)rmdir.c 4.1 (Berkeley) 10/1/80";
2: /*
3: * Remove directory
4: */
5:
6: #include <sys/types.h>
7: #include <sys/dir.h>
8: #include <sys/stat.h>
9: #include <stdio.h>
10:
11: int Errors = 0;
12: char *rindex();
13: char *strcat();
14: char *strcpy();
15:
16: main(argc,argv)
17: int argc;
18: char **argv;
19: {
20:
21: if(argc < 2) {
22: fprintf(stderr, "rmdir: arg count\n");
23: exit(1);
24: }
25: while(--argc)
26: rmdir(*++argv);
27: exit(Errors!=0);
28: }
29:
30: rmdir(d)
31: char *d;
32: {
33: int fd;
34: char *np, name[500];
35: struct stat st, cst;
36: struct direct dir;
37:
38: strcpy(name, d);
39: if((np = rindex(name, '/')) == NULL)
40: np = name;
41: if(stat(name,&st) < 0) {
42: fprintf(stderr, "rmdir: %s non-existent\n", name);
43: ++Errors;
44: return;
45: }
46: if (stat("", &cst) < 0) {
47: fprintf(stderr, "rmdir: cannot stat \"\"");
48: ++Errors;
49: exit(1);
50: }
51: if((st.st_mode & S_IFMT) != S_IFDIR) {
52: fprintf(stderr, "rmdir: %s not a directory\n", name);
53: ++Errors;
54: return;
55: }
56: if(st.st_ino==cst.st_ino &&st.st_dev==cst.st_dev) {
57: fprintf(stderr, "rmdir: cannot remove current directory\n");
58: ++Errors;
59: return;
60: }
61: if((fd = open(name,0)) < 0) {
62: fprintf(stderr, "rmdir: %s unreadable\n", name);
63: ++Errors;
64: return;
65: }
66: while(read(fd, (char *)&dir, sizeof dir) == sizeof dir) {
67: if(dir.d_ino == 0) continue;
68: if(!strcmp(dir.d_name, ".") || !strcmp(dir.d_name, ".."))
69: continue;
70: fprintf(stderr, "rmdir: %s not empty\n", name);
71: ++Errors;
72: close(fd);
73: return;
74: }
75: close(fd);
76: if(!strcmp(np, ".") || !strcmp(np, "..")) {
77: fprintf(stderr, "rmdir: cannot remove . or ..\n");
78: ++Errors;
79: return;
80: }
81: strcat(name, "/.");
82: if((access(name, 0)) < 0) { /* name/. non-existent */
83: strcat(name, ".");
84: goto unl;
85: }
86: strcat(name, ".");
87: if((access(name, 0)) < 0) /* name/.. non-existent */
88: goto unl2;
89: if(access(name, 02)) {
90: name[strlen(name)-3] = '\0';
91: fprintf(stderr, "rmdir: %s: no permission\n", name);
92: ++Errors;
93: return;
94: }
95: unl:
96: unlink(name); /* unlink name/.. */
97: unl2:
98: name[strlen(name)-1] = '\0';
99: unlink(name); /* unlink name/. */
100: name[strlen(name)-2] = '\0';
101: if (unlink(name) < 0) {
102: fprintf(stderr, "rmdir: %s not removed\n", name);
103: ++Errors;
104: }
105: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.