thanks david.

using dup() is very nice idea!
your code works with
   CFLAGS=-D__DARWIN_64_BIT_INO_T               # manual is wrong
and a fix:
//      buf = ((char*)buf) + d_reclen(buf);
        buf = (struct dirent *)(((char*)buf) + d_reclen(buf));
and adding
        #define NAME_MAX 256
in somewhere.

now /dev is readable.

one problem is left.

my test code:
        fd = open(dirname,OREAD);
        if(fd < 0)
                fatal("%s open error",dirname);
        while((n = dirread(fd, &db)) > 0){
                print("#DBG n=%d\n",n);
                for(i = 0; i < n; i++)
                        print("%s %s %s \n", db[i].name, db[i].uid, db[i].gid);
        }
        close(fd);
shows for dirname=$HOME
        ...
        arch root 501 
        bin root 501 
        ...
but they should be
        arch arisawa staff 
        bin arisawa staff
 this problem comes from _p9dir() that is used in dirpackage().

Kenji Arisawa


> 2017/04/08 18:07、David Arroyo <dr...@aqwari.net> のメール:
> 
> Ignore my previous post, I was tired and forgot about dup(). How about
> something like this? (attached)
> 
> I only tested this on Ubuntu, I don't have an OS X machine. I still went
> with readdir_r because the AIX and Solaris man pages for readdir were
> vague about its behavior when called from multiple threads (glibc, musl,
> FreeBSD look pretty safe).
> 
> Cheers,
> David
> 
> On Sat, Apr 8, 2017, at 03:27 AM, David Arroyo wrote:
>> This should be doable with some combination of fdopendir(3) and
>> readdir(3). I'm not sure how to avoid leaking memory through the
>> returned DIR pointer and any memory allocated with by readdir(3).
>> This is usually free'd by closedir(3), which we can't use without
>> closing the underlying file.
>> 
>> It should be OK to use free() on the return value of fdopendir, and
>> stick to the uglier readdir_r(3) interface. I can definitely see why
>> Russ went with  the simpler  system-specific interfaces on this.
>> 
>> David
>> 
>> On Sat, Apr 8, 2017, at 02:46 AM, Ori Bernstein wrote:
>>> On Sat, 8 Apr 2017 15:21:47 +0900, arisawa <karis...@gmail.com> wrote:
>>> 
>>>> but how to?
>>>> 
>>>> unix doesn’t have something like fdreaddir(int fd).
>>>> my guess: russ unwillingly used a low level function such as
>>>> int getdirentries(int fd, char *buf, int nbytes, long *basep).
>>>> 
>>>> readdirall() might be OK in regular usage.
>>> 
>>> I don't use OSX regularly, although I do maintain the syscall
>>> layer for Myrddin on it.
>>> 
>>> Getdirentries64 exists, and rudimentary testing doesn't show
>>> any difficulties with using it.
>>> 
>>> -- 
>>>    Ori Bernstein
>>> 
>> 
> <posix-dirread.patch>


Reply via email to