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