implement posix_getdents adopted for next issue of POSIX
[musl.git] / src / dirent / readdir_r.c
blob0d5de5f56dddade485d25f51e444267e370e12f0
1 #include <dirent.h>
2 #include <errno.h>
3 #include <string.h>
4 #include "__dirent.h"
5 #include "lock.h"
7 int readdir_r(DIR *restrict dir, struct dirent *restrict buf, struct dirent **restrict result)
9 struct dirent *de;
10 int errno_save = errno;
11 int ret;
13 LOCK(dir->lock);
14 errno = 0;
15 de = readdir(dir);
16 if ((ret = errno)) {
17 UNLOCK(dir->lock);
18 return ret;
20 errno = errno_save;
21 if (de) memcpy(buf, de, de->d_reclen);
22 else buf = NULL;
24 UNLOCK(dir->lock);
25 *result = buf;
26 return 0;