|
|
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.