clean up dns_parse_callback
[musl] / src / dirent / fdopendir.c
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
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 }