path: root/include
diff options
authorjhb <>2014-08-14 20:20:21 +0000
committerjhb <>2014-08-14 20:20:21 +0000
commitcabf1ab5da244a22f50146e3ebe638c11ce55b7e (patch)
treec73c3e046f6b2412b005899914d466e00f3774a2 /include
parent599cdb2d596f1aec1ed6a3f5898de4d83386711f (diff)
MFC 268531,269079,269204:
Fix various edge cases with rewinddir(), seekdir(), and telldir(): - In the unionfs case, opendir() and fdopendir() read the directory's full contents and cache it. This cache is not refreshed when rewinddir() is called, so rewinddir() will not notice updates to a directory. Fix this by splitting the code to fetch a directory's contents out of __opendir_common() into a new _filldir() function and call this from rewinddir() when operating on a unionfs directory. - If rewinddir() is called on a directory opened with fdopendir() before any directory entries are fetched, rewinddir() will not adjust the seek location of the backing file descriptor. If the file descriptor passed to fdopendir() had a non-zero offset, the rewinddir() will not rewind to the beginning. Fix this by always seeking back to 0 in rewinddir(). This means the dd_rewind hack can also be removed. - Add missing locking to rewinddir() - POSIX says that passing a location returned by telldir() to seekdir() after an intervening call to rewinddir() is undefined, so reclaim any pending telldir() cookies in the directory when rewinddir() is called. - If telldir() is called immediately after a call to seekdir(), POSIX requires the return value of telldir() to equal the value passed to seekdir(). The current seekdir code with SINGLEUSE enabled breaks this case as each call to telldir() allocates a new cookie. Instead, remove the SINGLEUSE code and change telldir() to look for an existing cookie for the directory's current location rather than always creating a new cookie. PR: 121656
Diffstat (limited to 'include')
1 files changed, 1 insertions, 0 deletions
diff --git a/include/dirent.h b/include/dirent.h
index d0b0a9a..a04e88b 100644
--- a/include/dirent.h
+++ b/include/dirent.h
@@ -63,6 +63,7 @@ typedef struct _dirdesc DIR;
#define DTF_NODUP 0x0002 /* don't return duplicate names */
#define DTF_REWIND 0x0004 /* rewind after reading union stack */
#define __DTF_READALL 0x0008 /* everything has been read */
+#define __DTF_SKIPREAD 0x0010 /* assume internal buffer is populated */
#else /* !__BSD_VISIBLE */
OpenPOWER on IntegriCloud