1 #include <dirent.h>
2 #include <fcntl.h>
3 #include <sys/stat.h>
4 #include <errno.h>
5 #include <stdlib.h>
6 #include "__dirent.h"
7 
fdopendir(int fd)8 DIR *fdopendir(int fd)
9 {
10 	DIR *dir;
11 	struct stat st;
12 
13 	if (fstat(fd, &st) < 0) {
14 		return 0;
15 	}
16 	if (fcntl(fd, F_GETFL) & O_PATH) {
17 		errno = EBADF;
18 		return 0;
19 	}
20 	if (!S_ISDIR(st.st_mode)) {
21 		errno = ENOTDIR;
22 		return 0;
23 	}
24 	if (!(dir = calloc(1, sizeof *dir))) {
25 		return 0;
26 	}
27 
28 	fcntl(fd, F_SETFD, FD_CLOEXEC);
29 	dir->fd = fd;
30 	return dir;
31 }
32