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