static bool __fill_DIR(DIR* d) { int rc = TEMP_FAILURE_RETRY(__getdents64(d->fd_, d->buff_, sizeof(d->buff_))); if (rc <= 0) { return false; } d->available_bytes_ = rc; d->next_ = d->buff_; return true; }
int readdir64_r(DIR *dir, struct dirent64 *entry, struct dirent64 **result) { int ret; ssize_t bytes; struct dirent64 *de; if (!dir) { __set_errno(EBADF); return(EBADF); } de = NULL; #ifdef __UCLIBC_HAS_THREADS__ pthread_mutex_lock(&(dir->dd_lock)); #endif do { if (dir->dd_size <= dir->dd_nextloc) { /* read dir->dd_max bytes of directory entries. */ bytes = __getdents64(dir->dd_fd, dir->dd_buf, dir->dd_max); if (bytes <= 0) { *result = NULL; ret = errno; goto all_done; } dir->dd_size = bytes; dir->dd_nextloc = 0; } de = (struct dirent64 *) (((char *) dir->dd_buf) + dir->dd_nextloc); /* Am I right? H.J. */ dir->dd_nextloc += de->d_reclen; /* We have to save the next offset here. */ dir->dd_nextoff = de->d_off; /* Skip deleted files. */ } while (de->d_ino == 0); if (de == NULL) { *result = NULL; } else { *result = memcpy (entry, de, de->d_reclen); } ret = 0; all_done: #ifdef __UCLIBC_HAS_THREADS__ pthread_mutex_unlock(&(dir->dd_lock)); #endif return((de != NULL)? 0 : ret); }
struct dirent64 *readdir64(DIR * dir) { ssize_t bytes; struct dirent64 *de; if (!dir) { __set_errno(EBADF); return NULL; } __UCLIBC_MUTEX_LOCK(dir->dd_lock); do { if (dir->dd_size <= dir->dd_nextloc) { /* read dir->dd_max bytes of directory entries. */ bytes = __getdents64(dir->dd_fd, dir->dd_buf, dir->dd_max); if (bytes <= 0) { de = NULL; goto all_done; } dir->dd_size = bytes; dir->dd_nextloc = 0; } de = (struct dirent64 *) (((char *) dir->dd_buf) + dir->dd_nextloc); /* Am I right? H.J. */ dir->dd_nextloc += de->d_reclen; /* We have to save the next offset here. */ dir->dd_nextoff = de->d_off; /* Skip deleted files. */ } while (de->d_ino == 0); all_done: __UCLIBC_MUTEX_UNLOCK(dir->dd_lock); return de; }
int getdents(unsigned int fd, dirent* dirp, unsigned int count) { return __getdents64(fd, dirp, count); }