Annotation of researchv10no/netfs/serv/mkdir.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.