Marcel Moolenaar <[email protected]> writes:

> +    static union { 
> +     struct dirent dirent;
> +     char buf[512];
> +    } u;
> +    off_t off;
> +    int len;
[...]
> +    /*
> +     * The readdirfd() function is specific to the loader environment.
> +     * We do the best we can to make freaddir work, but it's not at
> +     * all guaranteed.
> +     */
> +    off = lseek(fd, 0LL, SEEK_CUR);
> +    len = getdents(fd, u.buf, sizeof(u.buf));
> +    d = (len != -1) ? &u.dirent : NULL;
> +    if (d != NULL)
> +     lseek(fd, off + d->d_reclen, SEEK_SET);

How did you test? I can't make the code work on amd64 using
either ficl32 or ficl64.

  # r253862
  ok> s" /bin" 0 fopen
  ok> dup freaddir . type cr
  -1 .
  ok> dup freaddir . type cr
  -1 sleep
  ok> dup freaddir . type cr
  -1 sleep
  ok> dup freaddir . type cr
  -1 sleep
  ok> dup freaddir . type cr
  -1 sleep

  # bin/172542
  ok> s" /bin" 0 fopen
  ok> dup freaddir . type cr
  -1 .
  ok> dup freaddir . type cr
  -1 ..
  ok> dup freaddir . type cr
  -1 sleep
  ok> dup freaddir . type cr
  -1 domainname
  ok> dup freaddir . type cr
  -1 ps
  ok> dup freaddir . type cr
  -1 sync
  ok> dup freaddir . type cr
  -1 red  
  
  # zfsloader (no '.' and '..' - zfs_readdir bug?)
  OK s" /bin" 0 fopen
  OK dup freaddir . type cr
  -1 cat
  OK dup freaddir . type cr
  -1 sh
  OK dup freaddir . type cr
  -1 chflags
  OK dup freaddir . type cr
  -1 chio
  OK dup freaddir . type cr
  -1 sleep
  OK dup freaddir . type cr
  -1 chmod

Here's an example with a loop almost endless.

  # r253862 
  ok> s" /bin" lsdir
  .
  sleep
  sleep
  sleep
  ...

  \ list directory contents
  : lsdir ( dir -- )
    0 fopen
    begin
      dup
      freaddir
    while
      type cr
    repeat
    fclose
  ;
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to