From a7ce195489a4cfb284906e0bc65b1e1b3468d45b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Pierre=20Andr=C3=A9?= Date: Wed, 4 May 2016 10:08:06 +0200 Subject: [PATCH] 383 Fixed masks for major and minor in fuse-lite for OpenIndiana On Solaris/OpenIndiana, the major and minor fields in st_rdev have to be represented on 14 bits and 18 bits respectively. They must have the same representation on 32-bit and 64-bit builds as the kernel and the library do not know the word size of each other. --- libfuse-lite/fuse_lowlevel.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/libfuse-lite/fuse_lowlevel.c b/libfuse-lite/fuse_lowlevel.c index 496800e7..e9d7d7ac 100644 --- a/libfuse-lite/fuse_lowlevel.c +++ b/libfuse-lite/fuse_lowlevel.c @@ -22,6 +22,12 @@ #include #include +#if defined(__sun) && defined (__SVR4) +#ifdef HAVE_SYS_MKDEV_H +#include +#endif +#endif /* defined(__sun) && defined (__SVR4) */ + #define PARAM(inarg) (((const char *)(inarg)) + sizeof(*(inarg))) #define OFFSET_MAX 0x7fffffffffffffffLL @@ -561,10 +567,13 @@ static void do_mknod(fuse_req_t req, fuse_ino_t nodeid, const void *inarg) if (req->f->op.mknod) { #if defined(__SOLARIS__) && defined(_LP64) - /* Must unpack the device, as arg->rdev is limited to 32 bits */ + /* + * Must unpack the device, as arg->rdev is limited to 32 bits, + * and must have the same format in 32-bit and 64-bit builds. + */ req->f->op.mknod(req, nodeid, name, arg->mode, - makedev((arg->rdev >> 18) & 0x3ffff, - arg->rdev & 0x3fff)); + makedev((arg->rdev >> 18) & 0x3fff, + arg->rdev & 0x3ffff)); #else req->f->op.mknod(req, nodeid, name, arg->mode, arg->rdev); #endif