|
|
1.1 ! root 1: /* ! 2: * mkdir, rmdir ! 3: * for systems without the system calls ! 4: */ ! 5: #include <errno.h> ! 6: #include <rf.h> ! 7: ! 8: mkdir(s, mode) ! 9: char *s; ! 10: int mode; ! 11: { ! 12: int npid, pid, sts; ! 13: ! 14: if ((pid = fork()) < 0) { ! 15: rflog("can't mkdir %s: fork failed: %d\n", s, errno); ! 16: errno = ENOTDIR; /* or something */ ! 17: return (-1); ! 18: } ! 19: if (pid == 0) { /* child */ ! 20: setgid(rfgid); ! 21: setuid(rfuid); ! 22: close(0); ! 23: close(1); ! 24: close(2); ! 25: open("/dev/null", 2); ! 26: dup(0); ! 27: dup(0); ! 28: execl("/bin/mkdir", "mkdir", s, (char *)0); ! 29: execl("/usr/bin/mkdir", "mkdir", s, (char *)0); ! 30: rflog("can't mkdir %s: can't exec mkdir\n", s); ! 31: _exit(127); ! 32: } ! 33: while ((npid = wait(&sts)) != pid) ! 34: if (npid < 0) { ! 35: rflog("can't mkdir %s: bad wait: %d\n", s, errno); ! 36: errno = ENOTDIR; ! 37: return (-1); ! 38: } ! 39: if (sts) { ! 40: errno = EPERM; /* probably */ ! 41: return (-1); ! 42: } ! 43: if (chmod(s, mode) < 0) { ! 44: rmdir(s); /* what if it fails? */ ! 45: return (-1); ! 46: } ! 47: return (0); ! 48: } ! 49: ! 50: rmdir(s) ! 51: char *s; ! 52: { ! 53: int npid, pid, sts; ! 54: ! 55: if ((pid = fork()) < 0) { ! 56: rflog("can't rmdir %s: fork failed: %d\n", s, errno); ! 57: errno = ENOTDIR; /* or something */ ! 58: return (-1); ! 59: } ! 60: if (pid == 0) { /* child */ ! 61: setgid(rfgid); ! 62: setuid(rfuid); ! 63: close(0); ! 64: close(1); ! 65: close(2); ! 66: open("/dev/null", 2); ! 67: dup(0); ! 68: dup(0); ! 69: execl("/bin/rmdir", "rmdir", s, (char *)0); ! 70: execl("/usr/bin/rmdir", "rmdir", s, (char *)0); ! 71: rflog("can't rmdir %s: can't exec rmdir\n", s); ! 72: _exit(127); ! 73: } ! 74: while ((npid = wait(&sts)) != pid) ! 75: if (npid < 0) { ! 76: rflog("can't rmdir %s: bad wait: %d\n", s, errno); ! 77: errno = ENOTDIR; ! 78: return (-1); ! 79: } ! 80: if (sts) { ! 81: errno = EPERM; /* probably */ ! 82: return (-1); ! 83: } ! 84: return (0); ! 85: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.