|
|
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.