On Fri, Jan 19, 2007 at 11:07:14AM -0500, Adam wrote:
> Darrin Chandler <[EMAIL PROTECTED]> wrote:
> 
> > On Thu, Jan 18, 2007 at 05:17:50PM -0500, Adam wrote:
> > > Why does fopen()ing a directory for reading succeed instead of failing
> > > with EISDIR?  This has the possibly unexpected consequence of letting
> > > you pass yyin to yylex() as a fopen()ed directory, which then thinks it
> > > finished successfully because fread() returns 0 immediately.
> > 
> > Directories are files and can be open(2)ed as such for reading.
> 
> We're not talking about the low level open() interface, we're talking
> about the abstracted fopen() wrapper.  You can't use fread() on a
> fopen()ed directory, and when passed a FILE * you can't tell wether its
> a directory or just an empty file.  If you can't fread() from a stream
> that is associated with a directory, then why associate the stream with
> a directory in the first place?
> 
> Adam
> 
>

C* doesn't know about directories and makes no assumptions about them.
Directories in Unix happen to be implemented as a file, so that's
perfectly legal. Reading and writing from/to the file depends on the
OS, and the C* standard doesn't require that this must succeed/fail.
If and how it fails is implemented by the OS and documented here:
http://www.opengroup.org/onlinepubs/009695399/functions/fopen.html

use stat(2) before you fopen anything to make sure it's not a
dir/device/etc (race condition...).

Tobias

*C89 + C99

Reply via email to