1*c9945492SAndroid Build Coastguard Worker #include <dirent.h> 2*c9945492SAndroid Build Coastguard Worker #include <fcntl.h> 3*c9945492SAndroid Build Coastguard Worker #include <sys/stat.h> 4*c9945492SAndroid Build Coastguard Worker #include <errno.h> 5*c9945492SAndroid Build Coastguard Worker #include <stdlib.h> 6*c9945492SAndroid Build Coastguard Worker #include "__dirent.h" 7*c9945492SAndroid Build Coastguard Worker fdopendir(int fd)8*c9945492SAndroid Build Coastguard WorkerDIR *fdopendir(int fd) 9*c9945492SAndroid Build Coastguard Worker { 10*c9945492SAndroid Build Coastguard Worker DIR *dir; 11*c9945492SAndroid Build Coastguard Worker struct stat st; 12*c9945492SAndroid Build Coastguard Worker 13*c9945492SAndroid Build Coastguard Worker if (fstat(fd, &st) < 0) { 14*c9945492SAndroid Build Coastguard Worker return 0; 15*c9945492SAndroid Build Coastguard Worker } 16*c9945492SAndroid Build Coastguard Worker if (fcntl(fd, F_GETFL) & O_PATH) { 17*c9945492SAndroid Build Coastguard Worker errno = EBADF; 18*c9945492SAndroid Build Coastguard Worker return 0; 19*c9945492SAndroid Build Coastguard Worker } 20*c9945492SAndroid Build Coastguard Worker if (!S_ISDIR(st.st_mode)) { 21*c9945492SAndroid Build Coastguard Worker errno = ENOTDIR; 22*c9945492SAndroid Build Coastguard Worker return 0; 23*c9945492SAndroid Build Coastguard Worker } 24*c9945492SAndroid Build Coastguard Worker if (!(dir = calloc(1, sizeof *dir))) { 25*c9945492SAndroid Build Coastguard Worker return 0; 26*c9945492SAndroid Build Coastguard Worker } 27*c9945492SAndroid Build Coastguard Worker 28*c9945492SAndroid Build Coastguard Worker fcntl(fd, F_SETFD, FD_CLOEXEC); 29*c9945492SAndroid Build Coastguard Worker dir->fd = fd; 30*c9945492SAndroid Build Coastguard Worker return dir; 31*c9945492SAndroid Build Coastguard Worker } 32