[Patch] Add dirent.d_type support to Cygwin 1.7 ?

Christian Franke Christian.Franke@t-online.de
Thu Nov 27 10:39:00 GMT 2008


Hi Corinna,

Corinna Vinschen wrote:
> > > ...
> > > > 
> > > > +#ifdef _DIRENT_HAVE_D_TYPE
> > > > +  /* Set d_type if type can be determined from file attributes.
> > > > +     FILE_ATTRIBUTE_SYSTEM ommitted to leave DT_UNKNOWN for old
> > > > symlinks.
> > > > +     For new symlinks, d_type will be reset to DT_UNKNOWN
> > > > below.  */ +  if (attr &&
> > > > +      !(attr & ~( FILE_ATTRIBUTE_NORMAL
> > > > +                | FILE_ATTRIBUTE_READONLY
> > > > +                | FILE_ATTRIBUTE_ARCHIVE
> > > > +                | FILE_ATTRIBUTE_HIDDEN
> > > > +                | FILE_ATTRIBUTE_COMPRESSED
> > > > +                | FILE_ATTRIBUTE_ENCRYPTED
> > > > +                | FILE_ATTRIBUTE_SPARSE_FILE
> > > > +                | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
> > > > +                | FILE_ATTRIBUTE_DIRECTORY)))
> > > > 
> 
> I understand why you omit FILE_ATTRIBUTE_REPARSE_POINT in this
> attribute list but what about FILE_ATTRIBUTE_OFFLINE,
> FILE_ATTRIBUTE_TEMPORARY or, FWIW, any other new attributes which will
> be created in later Windows versions?
> 

FILE_ATTRIBUTE_TEMPORARY and _OFFLINE should be added.


> Shouldn't this condition test positively instead like, say,
> 
> !(attr & (FILE_ATTRIBUTE_REPARSE_POINT | FILE_ATTRIBUTE_DEVICE))
> 

If any undocumented flag is set, then DT_UNKNOWN should be returned. MS
might invent new flags, at least on the ntdll layer.


> I must admit I never saw the FILE_ATTRIBUTE_DEVICE attribute actually
> set anywhere...
> 

Meantime, I found FILE_ATTRIBUTE_VALID_FLAGS in winnt.h. It does not
include FILE_ATTRIBUTE_DEVICE.

I would suggest the following logic:

if (attr)
{
  if (attr & ~FILE_ATTRIBUTE_VALID_FLAGS)
    {
      /* undocumented flag: DT_UNKNOWN
         Probably print a warning once:
        "... please inform cygwin at cygwin.com" */
    }
  else if (!(attr & (FILE_ATTRIBUTE_SYSTEM
                    |FILE_ATTRIBUTE_REPARSE_POINT))
    {
      /* DT_REG or DT_DIR */
    }
  else
    /* possible old symlink or something special: DT_UNKNOWN */;
}

Christian





More information about the Cygwin-patches mailing list