xref: /aosp_15_r20/external/musl/src/dirent/readdir_r.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include <dirent.h>
2*c9945492SAndroid Build Coastguard Worker #include <errno.h>
3*c9945492SAndroid Build Coastguard Worker #include <string.h>
4*c9945492SAndroid Build Coastguard Worker #include "__dirent.h"
5*c9945492SAndroid Build Coastguard Worker #include "lock.h"
6*c9945492SAndroid Build Coastguard Worker 
readdir_r(DIR * restrict dir,struct dirent * restrict buf,struct dirent ** restrict result)7*c9945492SAndroid Build Coastguard Worker int readdir_r(DIR *restrict dir, struct dirent *restrict buf, struct dirent **restrict result)
8*c9945492SAndroid Build Coastguard Worker {
9*c9945492SAndroid Build Coastguard Worker 	struct dirent *de;
10*c9945492SAndroid Build Coastguard Worker 	int errno_save = errno;
11*c9945492SAndroid Build Coastguard Worker 	int ret;
12*c9945492SAndroid Build Coastguard Worker 
13*c9945492SAndroid Build Coastguard Worker 	LOCK(dir->lock);
14*c9945492SAndroid Build Coastguard Worker 	errno = 0;
15*c9945492SAndroid Build Coastguard Worker 	de = readdir(dir);
16*c9945492SAndroid Build Coastguard Worker 	if ((ret = errno)) {
17*c9945492SAndroid Build Coastguard Worker 		UNLOCK(dir->lock);
18*c9945492SAndroid Build Coastguard Worker 		return ret;
19*c9945492SAndroid Build Coastguard Worker 	}
20*c9945492SAndroid Build Coastguard Worker 	errno = errno_save;
21*c9945492SAndroid Build Coastguard Worker 	if (de) memcpy(buf, de, de->d_reclen);
22*c9945492SAndroid Build Coastguard Worker 	else buf = NULL;
23*c9945492SAndroid Build Coastguard Worker 
24*c9945492SAndroid Build Coastguard Worker 	UNLOCK(dir->lock);
25*c9945492SAndroid Build Coastguard Worker 	*result = buf;
26*c9945492SAndroid Build Coastguard Worker 	return 0;
27*c9945492SAndroid Build Coastguard Worker }
28