xref: /aosp_15_r20/external/musl/src/dirent/fdopendir.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
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 Worker DIR *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