58f603257a3600cd4eddd96b7dd1988c240299c4
[musl] / src / dirent / readdir_r.c
1 #include <dirent.h>
2 #include <errno.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include "__dirent.h"
6 #include "libc.h"
7
8 int readdir_r(DIR *dir, struct dirent *buf, struct dirent **result)
9 {
10         struct dirent *de;
11         int errno_save = errno;
12         int ret;
13         
14         LOCK(&dir->lock);
15         errno = 0;
16         de = readdir(dir);
17         if ((ret = errno)) {
18                 UNLOCK(&dir->lock);
19                 return ret;
20         }
21         errno = errno_save;
22         if (de) memcpy(buf, de, de->d_reclen);
23         else buf = NULL;
24
25         UNLOCK(&dir->lock);
26         *result = buf;
27         return 0;
28 }
29
30 LFS64_2(readdir_r, readdir64_r);