Annotation of researchv10no/netfs/serv/mkdir.c, revision 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.