master
 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
 8DIR *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}