telldir.c.patch   [plain text]


--- telldir.c.orig	2007-01-24 14:10:41.000000000 -0800
+++ telldir.c	2007-01-27 02:51:57.000000000 -0800
@@ -54,7 +54,9 @@
  * 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
@@ -65,14 +67,41 @@
 {
 	struct ddloc *lp;
 
+#if __DARWIN_UNIX03
+	if (__isthreaded)
+		_pthread_mutex_lock((pthread_mutex_t *)&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((pthread_mutex_t *)&dirp->dd_lock);
+		return (-1);
+	}
+#else /* !__DARWIN_UNIX03 */
 	if ((lp = (struct ddloc *)malloc(sizeof(struct ddloc))) == NULL)
 		return (-1);
 	if (__isthreaded)
 		_pthread_mutex_lock((pthread_mutex_t *)&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((pthread_mutex_t *)&dirp->dd_lock);
 	return (lp->loc_index);
@@ -96,23 +125,34 @@
 	}
 	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);
 		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.
  */
@@ -131,3 +171,4 @@
 	}
 	LIST_INIT(&dirp->dd_td->td_locq);
 }
+#endif /* !BUILDING_VARIANT */