Bug #999 ยป seekdir.diff
| readdir.c Fri May 2 10:27:18 2008 | ||
|---|---|---|
|
* get next entry in a directory.
|
||
|
*/
|
||
|
struct dirent *
|
||
|
_readdir_unlocked(DIR *dirp)
|
||
|
_readdir_unlocked(DIR *dirp, int skipdeleted)
|
||
|
{
|
||
|
struct dirent *dp;
|
||
|
long dummy;
|
||
| ... | ... | |
|
if (_DIRENT_DIRSIZ(dp) > dirp->dd_len + 1 - dirp->dd_loc)
|
||
|
return (NULL);
|
||
|
dirp->dd_loc += _DIRENT_DIRSIZ(dp);
|
||
|
if (dp->d_ino == 0)
|
||
|
if (dp->d_ino == 0 && skipdeleted)
|
||
|
continue;
|
||
|
if (dp->d_type == DT_WHT && (dirp->dd_flags & DTF_HIDEW))
|
||
|
continue;
|
||
| ... | ... | |
|
if (__isthreaded)
|
||
|
_pthread_mutex_lock((pthread_mutex_t *)&dirp->dd_lock);
|
||
|
dp = _readdir_unlocked(dirp);
|
||
|
dp = _readdir_unlocked(dirp, 0);
|
||
|
if (__isthreaded)
|
||
|
_pthread_mutex_unlock((pthread_mutex_t *)&dirp->dd_lock);
|
||
| ... | ... | |
|
errno = 0;
|
||
|
if (__isthreaded)
|
||
|
_pthread_mutex_lock((pthread_mutex_t *)&dirp->dd_lock);
|
||
|
if ((dp = _readdir_unlocked(dirp)) != NULL)
|
||
|
if ((dp = _readdir_unlocked(dirp, 0)) != NULL)
|
||
|
memcpy(entry, dp, _DIRENT_MINSIZ(dp));
|
||
|
if (__isthreaded)
|
||
|
_pthread_mutex_unlock((pthread_mutex_t *)&dirp->dd_lock);
|
||
|
_pthread_mutex_unlock((pthread_mutex_t *)&dirp->dd_lock, 0);
|
||
|
if (errno != 0) {
|
||
|
if (dp == NULL) {
|
||
|
-- telldir.c.orig Fri May 2 10:25:58 2008
|
||
|
++ telldir.c Fri May 2 10:26:02 2008
|
||
| ... | ... | |
|
* load a new buffer or for dd_loc to not match directly.
|
||
|
*/
|
||
|
while (dirp->dd_loc < lp->loc_loc && dirp->dd_seek == lp->loc_seek) {
|
||
|
dp = _readdir_unlocked(dirp);
|
||
|
dp = _readdir_unlocked(dirp, 1);
|
||
|
if (dp == NULL)
|
||
|
break;
|
||
|
}
|
||