the result is shown below. # # ls (official ls in osx) # -bash$ ls /usr/bin|wc 1108 1108 9719 -bash$ ls /dev|wc 352 352 2428 # # david # -bash$ mk -f mkfile_david 9c -D__DARWIN_64_BIT_INO_T test_dirread.c 9c -D__DARWIN_64_BIT_INO_T dirread_david2.c 9l -o o.test_dirread test_dirread.o dirread_david2.o -bash$ o.test_dirread . .DS_Store root 501 416 0 _mp9dir.c root 501 200000320 0 _p9dir.c root 501 20000000106 0 a.out root 501 710 0 a1.c root 501 572 0 b1.c root 501 243 0 dirread.c.orig root 501 743 0 dirread1.c root 501 137 0 dirread_david.c root 501 473 0 ... -bash$ o.test_dirread /usr/bin |wc 770 3850 20936 -bash$ o.test_dirread -a /usr/bin |wc 770 3850 20936 -bash$ o.test_dirread /dev |wc 320 1600 7739 -bash$ o.test_dirread -a /dev |wc 320 1600 7739 -bash$ # # mine # -bash$ mk 9c -D__DARWIN_64_BIT_INO_T test_dirread.c 9c -D__DARWIN_64_BIT_INO_T mdirread2.c 9c -D__DARWIN_64_BIT_INO_T _mp9dir.c 9l -o o.test_dirread test_dirread.o mdirread2.o _mp9dir.o -bash$ o.test_dirread . .DS_Store arisawa staff 644 6148 _mp9dir.c arisawa staff 644 4948 _mp9dir.o arisawa staff 644 10284 _p9dir.c arisawa staff 444 4733 a.out arisawa staff 755 9552 a1.c arisawa staff 644 741 b1.c arisawa staff 644 2390 dirread.c.orig arisawa staff 444 3699 dirread1.c arisawa staff 644 3790 dirread_david.c arisawa staff 644 3768 ... -bash$ o.test_dirread /usr/bin |wc 1108 5540 33034 -bash$ o.test_dirread -a /usr/bin |wc 1108 5540 33034 -bash$ o.test_dirread /dev |wc 352 1760 10308 -bash$ o.test_dirread -a /dev |wc 352 1760 10308 -bash$ David idea is nice. I borrowed the idea: dir = fdopendir(dup(fd)); in mdirread2.c