On 2010-01-15, Dirk-Jan C  Binnema wrote:
>>>>>> "Olly" == Olly Betts <o...@survex.com> writes:
>    Olly> Not a full patch, but I already posted what this code should look 
> like
>    Olly> to handle both systems without d_type, and those which return 
>    Olly> http://article.gmane.org/gmane.mail.notmuch.general/1044

> static gboolean
> _set_dtype (const char* path, struct dirent *entry)

Underscore prefixed identifiers are reserved by ISO C at file-scope; using them
yourself is undefined behaviour...

>       /* we only care about dirs, regular files and links */
>       if (S_ISREG (statbuf.st_mode))
>               entry->d_type = DT_REG;
>       else if (S_ISDIR (statbuf.st_mode))
>               entry->d_type = DT_DIR;
>       else if (S_ISLNK (statbuf.st_mode))
>               entry->d_type = DT_LNK;

This addresses the case where the FS returns DT_UNKNOWN for d_type, but doesn't
deal with the case of platforms where struct dirent has no d_type member - from
the Linux readdir man page:

  The only fields in the dirent structure that are mandated by POSIX.1 are:
  d_name[], of unspecified size, with at most NAME_MAX characters preceding
  the terminating null byte; and (as an XSI extension) d_ino.  The other fields
  are unstandardized, and not present on all systems; see NOTES below for some
  further details.

And in NOTES:

  Other than Linux, the d_type field is available mainly only on BSD systems.


notmuch mailing list

Reply via email to