]>
Commit | Line | Data |
---|---|---|
320054e8 DG |
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 | } | |
f41256b6 DG |
16 | if (fcntl(fd, F_GETFL) & O_PATH) { |
17 | errno = EBADF; | |
18 | return 0; | |
19 | } | |
320054e8 DG |
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 | } |