On Mon, Jan 30, 2006 at 11:39:48AM +0100, Corinna Vinschen wrote: > On Jan 30 00:29, Yitzchak Scott-Thoennes wrote: > > After a rewinddir, readdir seems to return as many empty entries as there > > were actual entries left to read, followed by . and .. > > Thanks for the testcase! Since the underlying NT call NtQueryDirectoryInfo > is able to return more than one directory entry in one call, I thought it > might be a good idea to implement readdir caching. Unfortunately I forgot > to reset the cache in case of rewinddir. I've applied a fix now.
Thanks, but.. With 20060202, that testcase now works, but if you read all the way to the end, then rewind, you only get . and .. thereafter. $ cat rewdir.c #include <stdio.h> #include <dirent.h> #include <errno.h> #include <string.h> void readentries(DIR *dh, int limit) { struct dirent *de; int count; for (count = 0; count < limit; ++count) { errno = 0; if ((de = readdir(dh)) == NULL) { if (errno != 0) printf ("read error: %s\n", strerror (errno)); break; } printf ("got: %s\n", de->d_name); } } int main(int argc, char **argv) { DIR *dh; int i; if (argc != 2) return 1; if ( (dh = opendir (argv[1])) == NULL ) { fprintf (stderr, "couldn't open '%s': %s\n", argv[1], strerror (errno)); return 1; } for (i = 0; i < 3; ++i) { readentries (dh, 9999); printf ("rewinding.\n"); errno = 0; rewinddir (dh); if (errno != 0) printf ("unexpected errno: %d\n", errno); } return 0; } $ rm -rf foo; mkdir foo; touch foo/{bar,baz,quux,quuux,quuuux} $ gcc -Wall rewdir.c -o rewdir && ./rewdir foo got: . got: .. got: bar got: baz got: quuuux got: quuux got: quux rewinding. got: . got: .. rewinding. got: . got: .. rewinding. -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/