I am not an expert on the underlying C API, but I looked into this a bit out of curiosity... but I haven't yet been able to find any examples of whether it is even possible to readdir(3) a directory opened with open(2) instead of opendir(3)? On *NIX systems, the Perl API mirrors the C API closely, and if it's not possible with C, Perl isn't going to be able to do this either - at least not natively, perhaps there are some modules that use XS and can access other APIs provided by the OS, like the openat(2) and related functions.

One reference I found was an older version of the DJGPP manual, which explicitly says (edited for brevity): "You can open directories using open, but there is limited support for POSIX file operations on directories. The principal reason for allowing open to open directories is to support changing directories using fchdir. If you wish to read the contents of a directory, use the opendir and readdir functions instead." This seems to be exactly what your "workaround" is doing. There's also the file chdir-safer.c from gnulib which appears to use the fchdir technique in the function chdir_no_follow.


In reply to Re: readdir() on a sysopen() handle? by haukex
in thread readdir() on a sysopen() handle? by perlhuhn

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.