Annotation of researchv10no/cmd/odist/opkg/mkdir.c, revision 1.1

1.1     ! root        1: #include "asd.h"
        !             2: #include <sys/wait.h>
        !             3: #include <unistd.h>
        !             4: #include "ftw.h"
        !             5: 
        !             6: #ifndef S_ISLNK
        !             7: #ifdef S_IFLNK
        !             8: #define S_ISLNK(M) (((M)&S_IFMT) == S_IFLNK)
        !             9: #endif
        !            10: #define S_ISREG(M) (((M)&S_IFMT) == S_IFREG)
        !            11: #define S_ISDIR(M) (((M)&S_IFMT) == S_IFDIR)
        !            12: #define S_ISCHR(M) (((M)&S_IFMT) == S_IFCHR)
        !            13: #define S_ISBLK(M) (((M)&S_IFMT) == S_IFBLK)
        !            14: #endif
        !            15: 
        !            16: /*
        !            17:  *     mkd function -- tries to make a directory whose name is "d".
        !            18:  *     returns 0 if successful or if d already exists and is a
        !            19:  *     directory.  On failure, returns mkdir's return code.
        !            20:  */
        !            21: 
        !            22: int
        !            23: mkd (char *d)
        !            24: {
        !            25:        register int pid, w;
        !            26:        int status;
        !            27:        struct stat sb;
        !            28: 
        !            29:        if (stat (d, &sb) >= 0)
        !            30:                return !S_ISDIR(sb.st_mode);
        !            31: 
        !            32:        switch (pid = fork()) {
        !            33:        case 0:
        !            34:                /* we might be executed from a setuid program */
        !            35:                setgid (getegid());
        !            36:                setuid (geteuid());
        !            37:                execl ("/bin/mkdir", "mkdir", d, 0);
        !            38:                /* No break */
        !            39:        case -1:
        !            40:                return 1;
        !            41: 
        !            42:        default:
        !            43:                do w = wait (&status);
        !            44:                while (w != pid && w > 0);
        !            45:                if (w == pid)
        !            46:                        return status;
        !            47:                return w;
        !            48:        }
        !            49: }
        !            50: 
        !            51: 
        !            52: static int
        !            53: rm (char *name, struct stat *sb, int type, struct FTW *ftw)
        !            54: {
        !            55:        register int r;
        !            56: 
        !            57:        switch (type) {
        !            58: 
        !            59:        case FTW_F:
        !            60:        case FTW_SL:
        !            61:                r = unlink (name);
        !            62:                if (r < 0) {
        !            63:                        perror (name);
        !            64:                        return r;
        !            65:                }
        !            66:                break;
        !            67:        
        !            68:        case FTW_D:
        !            69:                break;
        !            70:        
        !            71:        case FTW_DNR:
        !            72:                fprintf (stderr, "cannot read directory %s\n", name);
        !            73:                exit (1);
        !            74:        
        !            75:        case FTW_NS:
        !            76:                fprintf (stderr, "cannot stat %s\n", name);
        !            77:                exit (1);
        !            78:        
        !            79:        case FTW_DP:
        !            80:                r = rmdir (name);
        !            81:                if (r != 0) {
        !            82:                        fprintf (stderr,
        !            83:                            "trouble removing directory %s\n", name);
        !            84:                        return r;
        !            85:                }
        !            86:        }
        !            87: 
        !            88:        return 0;
        !            89: }
        !            90: 
        !            91: /*
        !            92:  *     rmdir function -- tries to remove a directory whose name is "d".
        !            93:  *     returns 0 if successful.  On failure, returns rmdir's return code.
        !            94:  */
        !            95: 
        !            96: int
        !            97: rmdir (char *d)
        !            98: {
        !            99:        register int pid, w;
        !           100:        int status;
        !           101:        struct stat sb;
        !           102: 
        !           103:        if (stat (d, &sb) >= 0 && !S_ISDIR(sb.st_mode))
        !           104:                return -1;
        !           105: 
        !           106:        switch (pid = fork()) {
        !           107:        case 0:
        !           108:                /* we might be executed from a setuid program */
        !           109:                setgid (getegid());
        !           110:                setuid (geteuid());
        !           111:                execl ("/bin/rmdir", "rmdir", d, 0);
        !           112:                /* No break */
        !           113:        case -1:
        !           114:                return 1;
        !           115: 
        !           116:        default:
        !           117:                do w = wait (&status);
        !           118:                while (w != pid && w > 0);
        !           119:                if (w == pid)
        !           120:                        return status;
        !           121:                return w;
        !           122:        }
        !           123: }
        !           124: 
        !           125: /* rmall (s) recursively removes the object named s */
        !           126: int
        !           127: rmall (char *s)
        !           128: {
        !           129:        if (access(s, 0) < 0)
        !           130:                return 0;
        !           131:        return ftw (s, rm, 8);
        !           132: }

unix.superglobalmegacorp.com

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