|
|
1.1 ! root 1: #include "asd.h" ! 2: #include <sys/wait.h> ! 3: #include <unistd.h> ! 4: #include "ftw.h" ! 5: ! 6: #ifndef S_ISLNK ! 7: #ifdef S_IFLNK ! 8: #define S_ISLNK(M) (((M)&S_IFMT) == S_IFLNK) ! 9: #endif ! 10: #define S_ISREG(M) (((M)&S_IFMT) == S_IFREG) ! 11: #define S_ISDIR(M) (((M)&S_IFMT) == S_IFDIR) ! 12: #define S_ISCHR(M) (((M)&S_IFMT) == S_IFCHR) ! 13: #define S_ISBLK(M) (((M)&S_IFMT) == S_IFBLK) ! 14: #endif ! 15: ! 16: /* ! 17: * mkd function -- tries to make a directory whose name is "d". ! 18: * returns 0 if successful or if d already exists and is a ! 19: * directory. On failure, returns mkdir's return code. ! 20: */ ! 21: ! 22: int ! 23: mkd (char *d) ! 24: { ! 25: register int pid, w; ! 26: int status; ! 27: struct stat sb; ! 28: ! 29: if (stat (d, &sb) >= 0) ! 30: return !S_ISDIR(sb.st_mode); ! 31: ! 32: switch (pid = fork()) { ! 33: case 0: ! 34: /* we might be executed from a setuid program */ ! 35: setgid (getegid()); ! 36: setuid (geteuid()); ! 37: execl ("/bin/mkdir", "mkdir", d, 0); ! 38: /* No break */ ! 39: case -1: ! 40: return 1; ! 41: ! 42: default: ! 43: do w = wait (&status); ! 44: while (w != pid && w > 0); ! 45: if (w == pid) ! 46: return status; ! 47: return w; ! 48: } ! 49: } ! 50: ! 51: ! 52: static int ! 53: rm (char *name, struct stat *sb, int type, struct FTW *ftw) ! 54: { ! 55: register int r; ! 56: ! 57: switch (type) { ! 58: ! 59: case FTW_F: ! 60: case FTW_SL: ! 61: r = unlink (name); ! 62: if (r < 0) { ! 63: perror (name); ! 64: return r; ! 65: } ! 66: break; ! 67: ! 68: case FTW_D: ! 69: break; ! 70: ! 71: case FTW_DNR: ! 72: fprintf (stderr, "cannot read directory %s\n", name); ! 73: exit (1); ! 74: ! 75: case FTW_NS: ! 76: fprintf (stderr, "cannot stat %s\n", name); ! 77: exit (1); ! 78: ! 79: case FTW_DP: ! 80: r = rmdir (name); ! 81: if (r != 0) { ! 82: fprintf (stderr, ! 83: "trouble removing directory %s\n", name); ! 84: return r; ! 85: } ! 86: } ! 87: ! 88: return 0; ! 89: } ! 90: ! 91: /* ! 92: * rmdir function -- tries to remove a directory whose name is "d". ! 93: * returns 0 if successful. On failure, returns rmdir's return code. ! 94: */ ! 95: ! 96: int ! 97: rmdir (char *d) ! 98: { ! 99: register int pid, w; ! 100: int status; ! 101: struct stat sb; ! 102: ! 103: if (stat (d, &sb) >= 0 && !S_ISDIR(sb.st_mode)) ! 104: return -1; ! 105: ! 106: switch (pid = fork()) { ! 107: case 0: ! 108: /* we might be executed from a setuid program */ ! 109: setgid (getegid()); ! 110: setuid (geteuid()); ! 111: execl ("/bin/rmdir", "rmdir", d, 0); ! 112: /* No break */ ! 113: case -1: ! 114: return 1; ! 115: ! 116: default: ! 117: do w = wait (&status); ! 118: while (w != pid && w > 0); ! 119: if (w == pid) ! 120: return status; ! 121: return w; ! 122: } ! 123: } ! 124: ! 125: /* rmall (s) recursively removes the object named s */ ! 126: int ! 127: rmall (char *s) ! 128: { ! 129: if (access(s, 0) < 0) ! 130: return 0; ! 131: return ftw (s, rm, 8); ! 132: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.