implement posix_getdents adopted for next issue of POSIX
[musl.git] / src / dirent / fdopendir.c
blobd78fb87f9bc909dcbf4a81a779a76dcb89696b17
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"
8 DIR *fdopendir(int fd)
10 DIR *dir;
11 struct stat st;
13 if (fstat(fd, &st) < 0) {
14 return 0;
16 if (fcntl(fd, F_GETFL) & O_PATH) {
17 errno = EBADF;
18 return 0;
20 if (!S_ISDIR(st.st_mode)) {
21 errno = ENOTDIR;
22 return 0;
24 if (!(dir = calloc(1, sizeof *dir))) {
25 return 0;
28 fcntl(fd, F_SETFD, FD_CLOEXEC);
29 dir->fd = fd;
30 return dir;