Don't use IFTODT macro.
authorNikolaus Rath <Nikolaus@rath.org>
Sun, 5 Jun 2016 14:45:35 +0000 (10:45 -0400)
committerNikolaus Rath <Nikolaus@rath.org>
Sun, 5 Jun 2016 16:25:44 +0000 (12:25 -0400)
IFTODT is provided by libc to convert from mode_t (as included in e.g.
struct fstat) to d_type (unsigned char element of struct dirent, as
returned by e.g. readdir). However, fuse actually uses a different
struct fuse_dirent with a "type" field of type uint32.
In other words, the semantics of (struct fuse_dirent).type are
not necessarily the same as those of (struct dirent).d_type.

lib/fuse_lowlevel.c

index 64f9c600b1b876325db14843bc33be54624442ad..a7444a723daacc611f95e8ffd4189e929ec1b38a 100755 (executable)
@@ -266,11 +266,6 @@ int fuse_reply_iov(fuse_req_t req, const struct iovec *iov, int count)
        return res;
 }
 
-#ifndef IFTODT
-# define IFTODT(mode) (((mode) & 0170000) >> 12)
-#endif
-
-
 static void calculate_dirent_size(const char *name,
                                  size_t *namelen,
                                  size_t *entlen,
@@ -311,7 +306,7 @@ size_t fuse_add_direntry(fuse_req_t req, char *buf, size_t bufsize,
        dirent->ino = stbuf->st_ino;
        dirent->off = off;
        dirent->namelen = namelen;
-       dirent->type = IFTODT(stbuf->st_mode);
+       dirent->type = (stbuf->st_mode & 0170000) >> 12;
        strncpy(dirent->name, name, namelen);
        memset(dirent->name + namelen, 0, entlen_padded - entlen);
 
@@ -402,7 +397,7 @@ size_t fuse_add_direntry_plus(fuse_req_t req, char *buf, size_t bufsize,
        dirent->ino = e->attr.st_ino;
        dirent->off = off;
        dirent->namelen = namelen;
-       dirent->type = IFTODT(e->attr.st_mode);
+       dirent->type = (e->attr.st_mode & 0170000) >> 12;
        strncpy(dirent->name, name, namelen);
        memset(dirent->name + namelen, 0, entlen_padded - entlen);