Annotation of coherent/d/usr/bin/pax/shipping/opendir.c, revision 1.1

1.1     ! root        1: /*
        !             2:        opendir -- open a directory stream
        !             3: 
        !             4:        last edit:      25-Apr-1987     D A Gwyn
        !             5: */
        !             6: #include       <stdio.h>
        !             7: #include       <errno.h>
        !             8: #include       <sys/types.h>
        !             9: #include       <sys/stat.h>
        !            10: #include       <ndir.h>
        !            11: 
        !            12: #ifdef BRL
        !            13: #define open   _open                   /* avoid emulation overhead */
        !            14: #endif
        !            15: 
        !            16: typedef char   *pointer;               /* (void *) if you have it */
        !            17: 
        !            18: extern void    free();
        !            19: extern pointer malloc();
        !            20: extern int     open(), close(), fstat();
        !            21: 
        !            22: extern int     errno;
        !            23: 
        !            24: #ifndef NULL
        !            25: #define        NULL    0
        !            26: #endif
        !            27: 
        !            28: #ifndef O_RDONLY
        !            29: #define        O_RDONLY        0
        !            30: #endif
        !            31: 
        !            32: #ifndef S_ISDIR                                /* macro to test for directory file */
        !            33: #define        S_ISDIR( mode )         (((mode) & S_IFMT) == S_IFDIR)
        !            34: #endif
        !            35: 
        !            36: DIR *
        !            37: opendir( dirname )
        !            38: char           *dirname;       /* name of directory */
        !            39: {
        !            40:        register DIR    *dirp;          /* -> malloc'ed storage */
        !            41:        register int    fd;             /* file descriptor for read */
        !            42:        struct stat     sbuf;           /* result of fstat() */
        !            43: 
        !            44:        if ( (fd = open( dirname, 0)) < 0 ) {
        !            45:                fprintf(stderr, "Cannot open directory %s\n", dirname);
        !            46:                return NULL;            /* errno set by open() */
        !            47:        }
        !            48:        if ( fstat( fd, &sbuf ) != 0 || !S_ISDIR( sbuf.st_mode ) )
        !            49:                {
        !            50:                fprintf(stderr, "Cannot stat directory %s\n", dirname);
        !            51:                (void)close( fd );
        !            52:                errno = ENOTDIR;
        !            53:                return NULL;            /* not a directory */
        !            54:                }
        !            55:        
        !            56:        if ((dirp = (DIR *)malloc( sizeof(DIR) )) == NULL
        !            57:          || (dirp->dd_buf = (char *)malloc( (unsigned)DIRBUF )) == NULL
        !            58:           )    {
        !            59:                register int    serrno = errno;
        !            60:                                        /* errno set to ENOMEM by sbrk() */
        !            61: 
        !            62:                if ( dirp != NULL )
        !            63:                        free( (pointer)dirp );
        !            64: 
        !            65:                (void)close( fd );
        !            66:                errno = serrno;
        !            67:                fprintf(stderr, "Not enough memory %s\n", dirname);
        !            68:                return NULL;            /* not enough memory */
        !            69:                }
        !            70: 
        !            71:        dirp->dd_fd = fd;
        !            72:        dirp->dd_loc = dirp->dd_size = 0;       /* refill needed */
        !            73: 
        !            74:        return dirp;
        !            75:        }

unix.superglobalmegacorp.com

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