Annotation of researchv10no/cmd/asd/mkdir.c, revision 1.1

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

unix.superglobalmegacorp.com

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