1: #ifndef lint
2: static char *sccsid = "@(#)rmdir.c 4.2 (Berkeley) 11/10/80";
3: #endif
4: /*
5: * Remove directory
6: */
7:
8: #include <sys/types.h>
9: #include <sys/dir.h>
10: #include <sys/stat.h>
11: #include <stdio.h>
12:
13: int Errors = 0;
14: char *rindex();
15: char *strcat();
16: char *strcpy();
17:
18: main(argc,argv)
19: int argc;
20: char **argv;
21: {
22:
23: if(argc < 2) {
24: fprintf(stderr, "rmdir: arg count\n");
25: exit(1);
26: }
27: while(--argc)
28: rmdir(*++argv);
29: exit(Errors!=0);
30: }
31:
32: rmdir(d)
33: char *d;
34: {
35: int fd;
36: char *np, name[500];
37: struct stat st, cst;
38: struct direct dir;
39:
40: strcpy(name, d);
41:
42: /* eat trailing slashes */
43: np = &(name[strlen(name)-1]);
44: while (*np == '/' && np != name) {
45: *np = '\0';
46: np--;
47: }
48:
49: /* point after last slash */
50: if((np = rindex(name, '/')) == NULL)
51: np = name;
52: else
53: np++;
54:
55: if(!strcmp(np, ".") || !strcmp(np, "..")) {
56: fprintf(stderr, "rmdir: cannot remove . or ..\n");
57: ++Errors;
58: return;
59: }
60: if(stat(name,&st) < 0) {
61: fprintf(stderr, "rmdir: %s non-existent\n", name);
62: ++Errors;
63: return;
64: }
65: if (stat("", &cst) < 0) {
66: fprintf(stderr, "rmdir: cannot stat \"\"");
67: ++Errors;
68: exit(1);
69: }
70: if((st.st_mode & S_IFMT) != S_IFDIR) {
71: fprintf(stderr, "rmdir: %s not a directory\n", name);
72: ++Errors;
73: return;
74: }
75: if(st.st_ino==cst.st_ino &&st.st_dev==cst.st_dev) {
76: fprintf(stderr, "rmdir: cannot remove current directory\n");
77: ++Errors;
78: return;
79: }
80: if((fd = open(name,0)) < 0) {
81: fprintf(stderr, "rmdir: %s unreadable\n", name);
82: ++Errors;
83: return;
84: }
85: while(read(fd, (char *)&dir, sizeof dir) == sizeof dir) {
86: if(dir.d_ino == 0) continue;
87: if(!strcmp(dir.d_name, ".") || !strcmp(dir.d_name, ".."))
88: continue;
89: fprintf(stderr, "rmdir: %s not empty\n", name);
90: ++Errors;
91: close(fd);
92: return;
93: }
94: close(fd);
95: strcat(name, "/.");
96: if((access(name, 0)) < 0) { /* name/. non-existent */
97: strcat(name, ".");
98: goto unl;
99: }
100: strcat(name, ".");
101: if((access(name, 0)) < 0) /* name/.. non-existent */
102: goto unl2;
103: if(access(name, 02)) {
104: name[strlen(name)-3] = '\0';
105: fprintf(stderr, "rmdir: %s: no permission\n", name);
106: ++Errors;
107: return;
108: }
109: unl:
110: unlink(name); /* unlink name/.. */
111: unl2:
112: name[strlen(name)-1] = '\0';
113: unlink(name); /* unlink name/. */
114: name[strlen(name)-2] = '\0';
115: if (unlink(name) < 0) {
116: fprintf(stderr, "rmdir: %s not removed\n", name);
117: ++Errors;
118: }
119: }
Defined functions
main
defined in line
18;
never used
rmdir
defined in line
32; used 1 times
Defined variables
Errors
defined in line
13; used 10 times
sccsid
defined in line
2;
never used