Apparently on some versions of OS X, once readdir returns nil once, it automatically rewinds and starts reading from the beginning of the directory. U9fs has always assumed that once you hit the end of the directory, readdir will repeatedly return nil (at least twice). Remove this assumption. Reference: /n/sources/patch/applied/u9fs-eof Date: Sat Jul 19 18:42:13 CES 2008 Signed-off-by: rsc@swtch.com --- /sys/src/cmd/unix/u9fs/u9fs.c Sat Jul 19 18:40:03 2008 +++ /sys/src/cmd/unix/u9fs/u9fs.c Sat Jul 19 18:40:01 2008 @@ -60,6 +60,7 @@ int diroffset; int fd; struct dirent *dirent; + int direof; Fid *next; Fid *prev; int auth; @@ -739,6 +740,11 @@ } rewinddir(fid->dir); fid->diroffset = 0; + fid->direof = 0; + } + if(fid->direof){ + tx->count = 0; + return; } p = (uchar*)tx->data; @@ -747,8 +753,10 @@ if(p+BIT16SZ >= ep) break; if(fid->dirent == nil) /* one entry cache for when convD2M fails */ - if((fid->dirent = readdir(fid->dir)) == nil) + if((fid->dirent = readdir(fid->dir)) == nil){ + fid->direof = 1; break; + } if(strcmp(fid->dirent->d_name, ".") == 0 || strcmp(fid->dirent->d_name, "..") == 0){ fid->dirent = nil;