diff --git a/Makefile.util.def b/Makefile.util.def index b098d5bba..d919c562c 100644 --- a/Makefile.util.def +++ b/Makefile.util.def @@ -309,11 +309,13 @@ program = { common = grub-core/disk/host.c; common = grub-core/osdep/init.c; + cflags = '$(FUSE_CFLAGS)'; + ldadd = libgrubmods.a; ldadd = libgrubgcry.a; ldadd = libgrubkern.a; ldadd = grub-core/lib/gnulib/libgnu.a; - ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) -lfuse'; + ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) $(FUSE_LIBS)'; condition = COND_GRUB_MOUNT; }; diff --git a/configure.ac b/configure.ac index 50f7bc6a0..b0b2fd283 100644 --- a/configure.ac +++ b/configure.ac @@ -1797,17 +1797,11 @@ if test x"$enable_grub_mount" = xno ; then fi if test x"$grub_mount_excuse" = x ; then - AC_CHECK_LIB([fuse], [fuse_main_real], [], - [grub_mount_excuse="need FUSE library"]) -fi - -if test x"$grub_mount_excuse" = x ; then - # Check for fuse headers. - SAVED_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS -DFUSE_USE_VERSION=26" - AC_CHECK_HEADERS([fuse/fuse.h], [], - [grub_mount_excuse=["need FUSE headers"]]) - CPPFLAGS="$SAVED_CPPFLAGS" + PKG_CHECK_MODULES([FUSE], [fuse3], [FUSE_CFLAGS="$FUSE_CFLAGS -DFUSE_USE_VERSION=32"], [ + PKG_CHECK_MODULES([FUSE], [fuse], [FUSE_CFLAGS="$FUSE_CFLAGS -DFUSE_USE_VERSION=26"], [ + grub_mount_excuse="need fuse or fuse3 libraries" + ]) + ]) fi if test x"$enable_grub_mount" = xyes && test x"$grub_mount_excuse" != x ; then diff --git a/util/grub-mount.c b/util/grub-mount.c index ef00fdded..1c35b6a6e 100644 --- a/util/grub-mount.c +++ b/util/grub-mount.c @@ -16,7 +16,6 @@ * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ -#define FUSE_USE_VERSION 26 #include #include #include @@ -34,7 +33,7 @@ #include #include #include -#include +#include #include #include @@ -146,8 +145,14 @@ fuse_getattr_find_file (const char *cur_filename, return 0; } +#if FUSE_USE_VERSION < 30 static int fuse_getattr (const char *path, struct stat *st) +#else +static int +fuse_getattr (const char *path, struct stat *st, + struct fuse_file_info *fi __attribute__ ((unused))) +#endif { struct fuse_getattr_ctx ctx; char *pathname, *path2; @@ -241,8 +246,11 @@ static grub_file_t files[65536]; static int first_fd = 1; static int -fuse_open (const char *path, struct fuse_file_info *fi __attribute__ ((unused))) +fuse_open (const char *path, struct fuse_file_info *fi) { + if ((fi->flags & O_ACCMODE) != O_RDONLY) + return -EROFS; + grub_file_t file; file = grub_file_open (path, GRUB_FILE_TYPE_MOUNT); if (! file) @@ -330,13 +338,24 @@ fuse_readdir_call_fill (const char *filename, st.st_blocks = (st.st_size + 511) >> 9; st.st_atime = st.st_mtime = st.st_ctime = info->mtimeset ? info->mtime : 0; +#if FUSE_USE_VERSION < 30 ctx->fill (ctx->buf, filename, &st, 0); +#else + ctx->fill (ctx->buf, filename, &st, 0, 0); +#endif return 0; } +#if FUSE_USE_VERSION < 30 static int fuse_readdir (const char *path, void *buf, fuse_fill_dir_t fill, off_t off, struct fuse_file_info *fi) +#else +static int +fuse_readdir (const char *path, void *buf, + fuse_fill_dir_t fill, off_t off, struct fuse_file_info *fi, + enum fuse_readdir_flags flags __attribute__ ((unused))) +#endif { struct fuse_readdir_ctx ctx = { .path = path,