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)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 } 32