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