1570af302Sopenharmony_ci#include <dirent.h> 2570af302Sopenharmony_ci#include <errno.h> 3570af302Sopenharmony_ci#include <string.h> 4570af302Sopenharmony_ci#include "__dirent.h" 5570af302Sopenharmony_ci#include "lock.h" 6570af302Sopenharmony_ci 7570af302Sopenharmony_ciint readdir_r(DIR *restrict dir, struct dirent *restrict buf, struct dirent **restrict result) 8570af302Sopenharmony_ci{ 9570af302Sopenharmony_ci struct dirent *de; 10570af302Sopenharmony_ci int errno_save = errno; 11570af302Sopenharmony_ci int ret; 12570af302Sopenharmony_ci 13570af302Sopenharmony_ci LOCK(dir->lock); 14570af302Sopenharmony_ci errno = 0; 15570af302Sopenharmony_ci de = readdir(dir); 16570af302Sopenharmony_ci if ((ret = errno)) { 17570af302Sopenharmony_ci UNLOCK(dir->lock); 18570af302Sopenharmony_ci return ret; 19570af302Sopenharmony_ci } 20570af302Sopenharmony_ci errno = errno_save; 21570af302Sopenharmony_ci if (de) memcpy(buf, de, de->d_reclen); 22570af302Sopenharmony_ci else buf = NULL; 23570af302Sopenharmony_ci 24570af302Sopenharmony_ci UNLOCK(dir->lock); 25570af302Sopenharmony_ci *result = buf; 26570af302Sopenharmony_ci return 0; 27570af302Sopenharmony_ci} 28570af302Sopenharmony_ci 29570af302Sopenharmony_ciweak_alias(readdir_r, readdir64_r); 30