This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: readdir after rewinddir not working in 20060128 snapshot


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/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]