--- telldir.c.orig 2009-11-08 14:02:31.000000000 -0800 +++ telldir.c 2009-11-08 14:02:24.000000000 -0800 @@ -50,7 +50,9 @@ __FBSDID("$FreeBSD: src/lib/libc/gen/tel * cookie may be used only once before it is freed. This option * is used to avoid having memory usage grow without bound. */ +#if !__DARWIN_UNIX03 #define SINGLEUSE +#endif /* !__DARWIN_UNIX03 */ /* * return a pointer into a directory @@ -61,14 +63,41 @@ telldir(dirp) { struct ddloc *lp; +#if __DARWIN_UNIX03 + if (__isthreaded) + _pthread_mutex_lock(&dirp->dd_lock); + LIST_FOREACH(lp, &dirp->dd_td->td_locq, loc_lqe) { + if ( +#if __DARWIN_64_BIT_INO_T + (lp->loc_seek == dirp->dd_td->seekoff) +#else /* !__DARWIN_64_BIT_INO_T */ + (lp->loc_seek == dirp->dd_seek) +#endif /* __DARWIN_64_BIT_INO_T */ + && (lp->loc_loc == dirp->dd_loc)) + goto found; + } + if ((lp = (struct ddloc *)malloc(sizeof(struct ddloc))) == NULL) { + if (__isthreaded) + _pthread_mutex_unlock(&dirp->dd_lock); + return (-1); + } +#else /* !__DARWIN_UNIX03 */ if ((lp = (struct ddloc *)malloc(sizeof(struct ddloc))) == NULL) return (-1); if (__isthreaded) _pthread_mutex_lock(&dirp->dd_lock); +#endif /* __DARWIN_UNIX03 */ lp->loc_index = dirp->dd_td->td_loccnt++; +#if __DARWIN_64_BIT_INO_T + lp->loc_seek = dirp->dd_td->seekoff; +#else /* !__DARWIN_64_BIT_INO_T */ lp->loc_seek = dirp->dd_seek; +#endif /* __DARWIN_64_BIT_INO_T */ lp->loc_loc = dirp->dd_loc; LIST_INSERT_HEAD(&dirp->dd_td->td_locq, lp, loc_lqe); +#if __DARWIN_UNIX03 +found: +#endif /* __DARWIN_UNIX03 */ if (__isthreaded) _pthread_mutex_unlock(&dirp->dd_lock); return (lp->loc_index); @@ -92,23 +121,34 @@ _seekdir(dirp, loc) } if (lp == NULL) return; - if (lp->loc_loc == dirp->dd_loc && lp->loc_seek == dirp->dd_seek) + if (lp->loc_loc == dirp->dd_loc && +#if __DARWIN_64_BIT_INO_T + lp->loc_seek == dirp->dd_td->seekoff +#else /* !__DARWIN_64_BIT_INO_T */ + lp->loc_seek == dirp->dd_seek +#endif /* __DARWIN_64_BIT_INO_T */ + ) goto found; (void) lseek(dirp->dd_fd, (off_t)lp->loc_seek, SEEK_SET); +#if __DARWIN_64_BIT_INO_T + dirp->dd_td->seekoff = lp->loc_seek; +#else /* !__DARWIN_64_BIT_INO_T */ dirp->dd_seek = lp->loc_seek; +#endif /* __DARWIN_64_BIT_INO_T */ dirp->dd_loc = 0; while (dirp->dd_loc < lp->loc_loc) { dp = _readdir_unlocked(dirp, 0); if (dp == NULL) break; } -found: +found:; #ifdef SINGLEUSE LIST_REMOVE(lp, loc_lqe); free((caddr_t)lp); #endif } +#ifndef BUILDING_VARIANT /* * Reclaim memory for telldir cookies which weren't used. */ @@ -127,3 +167,4 @@ _reclaim_telldir(dirp) } LIST_INIT(&dirp->dd_td->td_locq); } +#endif /* !BUILDING_VARIANT */