From 738c7eb5f8ba1c45262c4fc8df4f2eb0a59a665c Mon Sep 17 00:00:00 2001 From: Nikolaus Rath Date: Sun, 5 Jun 2016 10:45:35 -0400 Subject: [PATCH] Don't use IFTODT macro. 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 | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c index 64f9c60..a7444a7 100755 --- a/lib/fuse_lowlevel.c +++ b/lib/fuse_lowlevel.c @@ -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); -- 2.30.2