svn commit: r253862 - head/sys/boot/ficl

Jan Beich jbeich at tormail.org
Mon Aug 5 01:35:16 UTC 2013


Marcel Moolenaar <marcel at FreeBSD.org> 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
  ;


More information about the svn-src-head mailing list