diff options
author | Theodore Ts'o <tytso@mit.edu> | 2024-04-21 01:03:35 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2024-04-21 01:03:35 -0400 |
commit | 4b819954e861d1fdf8c37902e5338e76d9a11f09 (patch) | |
tree | 6812821e4b901cbf75b955adf8a87e356f87c9e4 | |
parent | ddf8d89ae0533cfcc2495fee66e5b51d8c3194f6 (diff) | |
parent | 448a3f8b487be74058cd33a1890fa56156a647e3 (diff) | |
download | e2fsprogs-4b819954e861d1fdf8c37902e5338e76d9a11f09.tar.gz |
Merge branch 'support-fuse3' of https://github.com/DrDaveD/e2fsprogs into next
-rwxr-xr-x | configure | 443 | ||||
-rw-r--r-- | configure.ac | 67 | ||||
-rw-r--r-- | lib/config.h.in | 3 | ||||
-rw-r--r-- | misc/fuse2fs.c | 86 |
4 files changed, 550 insertions, 49 deletions
@@ -703,6 +703,8 @@ UNI_DIFF_OPTS SEM_INIT_LIB FUSE_CMT FUSE_LIB +fuse3_LIBS +fuse3_CFLAGS CLOCK_GETTIME_LIB ARCHIVE_LIB MAGIC_LIB @@ -951,6 +953,8 @@ CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR +fuse3_CFLAGS +fuse3_LIBS CXX CXXFLAGS CCC @@ -13833,7 +13837,97 @@ then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Disabling fuse2fs" >&5 printf "%s\n" "Disabling fuse2fs" >&6; } else - for ac_header in pthread.h fuse.h + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __linux__ +#include <linux/fs.h> +#include <linux/falloc.h> +#include <linux/xattr.h> +#endif + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "Cannot find fuse2fs Linux headers. +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + fuse3_CFLAGS + C compiler flags for fuse3, overriding pkg-config + fuse3_LIBS linker flags for fuse3, overriding pkg-config + +pkg_failed=no +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fuse3" >&5 +printf %s "checking for fuse3... " >&6; } + +if test -n "$fuse3_CFLAGS"; then + pkg_cv_fuse3_CFLAGS="$fuse3_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fuse3\""; } >&5 + ($PKG_CONFIG --exists --print-errors "fuse3") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_fuse3_CFLAGS=`$PKG_CONFIG --cflags "fuse3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$fuse3_LIBS"; then + pkg_cv_fuse3_LIBS="$fuse3_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fuse3\""; } >&5 + ($PKG_CONFIG --exists --print-errors "fuse3") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_fuse3_LIBS=`$PKG_CONFIG --libs "fuse3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + fuse3_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "fuse3" 2>&1` + else + fuse3_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "fuse3" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$fuse3_PKG_ERRORS" >&5 + + + for ac_header in pthread.h fuse.h do : as_ac_Header=`printf "%s\n" "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#define _FILE_OFFSET_BITS 64 @@ -13854,35 +13948,119 @@ fi done - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fuse_main in -losxfuse" >&5 +printf %s "checking for fuse_main in -losxfuse... " >&6; } +if test ${ac_cv_lib_osxfuse_fuse_main+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-losxfuse $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#define FUSE_USE_VERSION 29 -#ifdef __linux__ -#include <linux/fs.h> -#include <linux/falloc.h> -#include <linux/xattr.h> -#endif +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char fuse_main (); int main (void) { +return fuse_main (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_osxfuse_fuse_main=yes +else $as_nop + ac_cv_lib_osxfuse_fuse_main=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_osxfuse_fuse_main" >&5 +printf "%s\n" "$ac_cv_lib_osxfuse_fuse_main" >&6; } +if test "x$ac_cv_lib_osxfuse_fuse_main" = xyes +then : + FUSE_LIB=-losxfuse +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fuse_main in -lfuse" >&5 +printf %s "checking for fuse_main in -lfuse... " >&6; } +if test ${ac_cv_lib_fuse_fuse_main+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfuse $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char fuse_main (); +int +main (void) +{ +return fuse_main (); ; return 0; } _ACEOF -if ac_fn_c_try_cpp "$LINENO" +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_fuse_fuse_main=yes +else $as_nop + ac_cv_lib_fuse_fuse_main=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_fuse_fuse_main" >&5 +printf "%s\n" "$ac_cv_lib_fuse_fuse_main" >&6; } +if test "x$ac_cv_lib_fuse_fuse_main" = xyes then : + FUSE_LIB=-lfuse +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "Cannot find fuse library. +See \`config.log' for more details" "$LINENO" 5; } +fi + +fi + + +elif test $pkg_failed = untried; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + + for ac_header in pthread.h fuse.h +do : + as_ac_Header=`printf "%s\n" "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#define _FILE_OFFSET_BITS 64 +#define FUSE_USE_VERSION 29 +" +if eval test \"x\$"$as_ac_Header"\" = x"yes" +then : + cat >>confdefs.h <<_ACEOF +#define `printf "%s\n" "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF else $as_nop { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "Cannot find fuse2fs Linux headers. +as_fn_error $? "Cannot find fuse2fs headers. See \`config.log' for more details" "$LINENO" 5; } fi -rm -f conftest.err conftest.i conftest.$ac_ext - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fuse_main in -losxfuse" >&5 +done + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fuse_main in -losxfuse" >&5 printf %s "checking for fuse_main in -losxfuse... " >&6; } if test ${ac_cv_lib_osxfuse_fuse_main+y} then : @@ -13968,12 +14146,82 @@ fi fi + +else + fuse3_CFLAGS=$pkg_cv_fuse3_CFLAGS + fuse3_LIBS=$pkg_cv_fuse3_LIBS + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + + FUSE_LIB=-lfuse3 + +fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Enabling fuse2fs" >&5 printf "%s\n" "Enabling fuse2fs" >&6; } fi else $as_nop - for ac_header in pthread.h fuse.h + +pkg_failed=no +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fuse3" >&5 +printf %s "checking for fuse3... " >&6; } + +if test -n "$fuse3_CFLAGS"; then + pkg_cv_fuse3_CFLAGS="$fuse3_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fuse3\""; } >&5 + ($PKG_CONFIG --exists --print-errors "fuse3") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_fuse3_CFLAGS=`$PKG_CONFIG --cflags "fuse3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$fuse3_LIBS"; then + pkg_cv_fuse3_LIBS="$fuse3_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fuse3\""; } >&5 + ($PKG_CONFIG --exists --print-errors "fuse3") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_fuse3_LIBS=`$PKG_CONFIG --libs "fuse3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + fuse3_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "fuse3" 2>&1` + else + fuse3_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "fuse3" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$fuse3_PKG_ERRORS" >&5 + + + for ac_header in pthread.h fuse.h do : as_ac_Header=`printf "%s\n" "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#define _FILE_OFFSET_BITS 64 @@ -13995,9 +14243,122 @@ else $as_nop fi done -if test -z "$FUSE_CMT" -then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fuse_main in -losxfuse" >&5 + if test -z "$FUSE_CMT" + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fuse_main in -losxfuse" >&5 +printf %s "checking for fuse_main in -losxfuse... " >&6; } +if test ${ac_cv_lib_osxfuse_fuse_main+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-losxfuse $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char fuse_main (); +int +main (void) +{ +return fuse_main (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_osxfuse_fuse_main=yes +else $as_nop + ac_cv_lib_osxfuse_fuse_main=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_osxfuse_fuse_main" >&5 +printf "%s\n" "$ac_cv_lib_osxfuse_fuse_main" >&6; } +if test "x$ac_cv_lib_osxfuse_fuse_main" = xyes +then : + FUSE_LIB=-losxfuse +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fuse_main in -lfuse" >&5 +printf %s "checking for fuse_main in -lfuse... " >&6; } +if test ${ac_cv_lib_fuse_fuse_main+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfuse $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char fuse_main (); +int +main (void) +{ +return fuse_main (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_fuse_fuse_main=yes +else $as_nop + ac_cv_lib_fuse_fuse_main=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_fuse_fuse_main" >&5 +printf "%s\n" "$ac_cv_lib_fuse_fuse_main" >&6; } +if test "x$ac_cv_lib_fuse_fuse_main" = xyes +then : + FUSE_LIB=-lfuse +else $as_nop + FUSE_CMT="#" +fi + +fi + + fi + +elif test $pkg_failed = untried; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + + for ac_header in pthread.h fuse.h +do : + as_ac_Header=`printf "%s\n" "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#define _FILE_OFFSET_BITS 64 +#define FUSE_USE_VERSION 29 +#ifdef __linux__ +# include <linux/fs.h> +# include <linux/falloc.h> +# include <linux/xattr.h> +#endif +" +if eval test \"x\$"$as_ac_Header"\" = x"yes" +then : + cat >>confdefs.h <<_ACEOF +#define `printf "%s\n" "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +else $as_nop + FUSE_CMT="#" +fi + +done + if test -z "$FUSE_CMT" + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fuse_main in -losxfuse" >&5 printf %s "checking for fuse_main in -losxfuse... " >&6; } if test ${ac_cv_lib_osxfuse_fuse_main+y} then : @@ -14080,6 +14441,16 @@ fi fi + fi + +else + fuse3_CFLAGS=$pkg_cv_fuse3_CFLAGS + fuse3_LIBS=$pkg_cv_fuse3_LIBS + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + + FUSE_LIB=-lfuse3 + fi if test -z "$FUSE_CMT" then @@ -14091,6 +14462,46 @@ fi +if test "$FUSE_LIB" = "-lfuse3" +then + FUSE_USE_VERSION=35 + CFLAGS="$CFLAGS $fuse3_CFLAGS" + LDFLAGS="$LDFLAGS $fuse3_LDFLAGS" + for ac_header in pthread.h fuse.h +do : + as_ac_Header=`printf "%s\n" "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#define _FILE_OFFSET_BITS 64 +#define FUSE_USE_VERSION 35 +#ifdef __linux__ +#include <linux/fs.h> +#include <linux/falloc.h> +#include <linux/xattr.h> +#endif +" +if eval test \"x\$"$as_ac_Header"\" = x"yes" +then : + cat >>confdefs.h <<_ACEOF +#define `printf "%s\n" "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "Cannot find fuse3 fuse2fs headers. +See \`config.log' for more details" "$LINENO" 5; } +fi + +done +elif test -n "$FUSE_LIB" +then + FUSE_USE_VERSION=29 +fi +if test -n "$FUSE_USE_VERSION" +then + +printf "%s\n" "#define FUSE_USE_VERSION $FUSE_USE_VERSION" >>confdefs.h + +fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for optreset" >&5 printf %s "checking for optreset... " >&6; } if test ${ac_cv_have_optreset+y} diff --git a/configure.ac b/configure.ac index 278bbe966..e4a17b952 100644 --- a/configure.ac +++ b/configure.ac @@ -1313,7 +1313,7 @@ dnl AC_CHECK_LIB(rt, clock_gettime, [CLOCK_GETTIME_LIB=-lrt]) AC_SUBST(CLOCK_GETTIME_LIB) dnl -dnl Check to see if the FUSE library is -lfuse or -losxfuse +dnl Check to see if the FUSE library is -lfuse3, -losxfuse, or -lfuse dnl FUSE_CMT= FUSE_LIB= @@ -1325,27 +1325,35 @@ then FUSE_CMT="#" AC_MSG_RESULT([Disabling fuse2fs]) else - AC_CHECK_HEADERS([pthread.h fuse.h], [], -[AC_MSG_FAILURE([Cannot find fuse2fs headers.])], -[#define _FILE_OFFSET_BITS 64 -#define FUSE_USE_VERSION 29]) - AC_PREPROC_IFELSE( -[AC_LANG_PROGRAM([[#define FUSE_USE_VERSION 29 -#ifdef __linux__ +[AC_LANG_PROGRAM([[#ifdef __linux__ #include <linux/fs.h> #include <linux/falloc.h> #include <linux/xattr.h> #endif ]], [])], [], [AC_MSG_FAILURE([Cannot find fuse2fs Linux headers.])]) - AC_CHECK_LIB(osxfuse, fuse_main, [FUSE_LIB=-losxfuse], - [AC_CHECK_LIB(fuse, fuse_main, [FUSE_LIB=-lfuse], - [AC_MSG_FAILURE([Cannot find fuse library.])])]) + PKG_CHECK_MODULES([fuse3], [fuse3], + [ + FUSE_LIB=-lfuse3 + ], [ + AC_CHECK_HEADERS([pthread.h fuse.h], [], + [AC_MSG_FAILURE([Cannot find fuse2fs headers.])], +[#define _FILE_OFFSET_BITS 64 +#define FUSE_USE_VERSION 29]) + + AC_CHECK_LIB(osxfuse, fuse_main, [FUSE_LIB=-losxfuse], + [AC_CHECK_LIB(fuse, fuse_main, [FUSE_LIB=-lfuse], + [AC_MSG_FAILURE([Cannot find fuse library.])])]) + ]) AC_MSG_RESULT([Enabling fuse2fs]) fi , -AC_CHECK_HEADERS([pthread.h fuse.h], [], [FUSE_CMT="#"], +PKG_CHECK_MODULES([fuse3], [fuse3], + [ + FUSE_LIB=-lfuse3 + ], [ + AC_CHECK_HEADERS([pthread.h fuse.h], [], [FUSE_CMT="#"], [#define _FILE_OFFSET_BITS 64 #define FUSE_USE_VERSION 29 #ifdef __linux__ @@ -1353,11 +1361,13 @@ AC_CHECK_HEADERS([pthread.h fuse.h], [], [FUSE_CMT="#"], # include <linux/falloc.h> # include <linux/xattr.h> #endif]) -if test -z "$FUSE_CMT" -then - AC_CHECK_LIB(osxfuse, fuse_main, [FUSE_LIB=-losxfuse], -[AC_CHECK_LIB(fuse, fuse_main, [FUSE_LIB=-lfuse], [FUSE_CMT="#"])]) -fi + if test -z "$FUSE_CMT" + then + AC_CHECK_LIB(osxfuse, fuse_main, [FUSE_LIB=-losxfuse], + [AC_CHECK_LIB(fuse, fuse_main, [FUSE_LIB=-lfuse], + [FUSE_CMT="#"])]) + fi + ]) if test -z "$FUSE_CMT" then AC_MSG_RESULT([Enabling fuse2fs by default.]) @@ -1365,6 +1375,29 @@ fi ) AC_SUBST(FUSE_LIB) AC_SUBST(FUSE_CMT) +if test "$FUSE_LIB" = "-lfuse3" +then + FUSE_USE_VERSION=35 + CFLAGS="$CFLAGS $fuse3_CFLAGS" + LDFLAGS="$LDFLAGS $fuse3_LDFLAGS" + AC_CHECK_HEADERS([pthread.h fuse.h], [], + [AC_MSG_FAILURE([Cannot find fuse3 fuse2fs headers.])], +[#define _FILE_OFFSET_BITS 64 +#define FUSE_USE_VERSION 35 +#ifdef __linux__ +#include <linux/fs.h> +#include <linux/falloc.h> +#include <linux/xattr.h> +#endif]) +elif test -n "$FUSE_LIB" +then + FUSE_USE_VERSION=29 +fi +if test -n "$FUSE_USE_VERSION" +then + AC_DEFINE_UNQUOTED(FUSE_USE_VERSION, $FUSE_USE_VERSION, + [Define to the version of FUSE to use]) +fi dnl dnl See if optreset exists dnl diff --git a/lib/config.h.in b/lib/config.h.in index 30477698e..9a4058ec5 100644 --- a/lib/config.h.in +++ b/lib/config.h.in @@ -37,6 +37,9 @@ language is requested. */ #undef ENABLE_NLS +/* Define to the version of FUSE to use */ +#undef FUSE_USE_VERSION + /* Define to 1 if you have the `add_key' function. */ #undef HAVE_ADD_KEY diff --git a/misc/fuse2fs.c b/misc/fuse2fs.c index 4133e0601..5c759662f 100644 --- a/misc/fuse2fs.c +++ b/misc/fuse2fs.c @@ -9,7 +9,6 @@ * %End-Header% */ #define _FILE_OFFSET_BITS 64 -#define FUSE_USE_VERSION 29 #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif @@ -19,12 +18,9 @@ # include <linux/fs.h> # include <linux/falloc.h> # include <linux/xattr.h> -# define FUSE_PLATFORM_OPTS ",big_writes" # ifdef HAVE_SYS_ACL_H # define TRANSLATE_LINUX_ACLS # endif -#else -# define FUSE_PLATFORM_OPTS "" #endif #ifdef TRANSLATE_LINUX_ACLS # include <sys/acl.h> @@ -35,6 +31,15 @@ #include <inttypes.h> #include "ext2fs/ext2fs.h" #include "ext2fs/ext2_fs.h" +#if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 0) +# define FUSE_PLATFORM_OPTS "" +#else +# ifdef __linux__ +# define FUSE_PLATFORM_OPTS ",use_ino,big_writes" +# else +# define FUSE_PLATFORM_OPTS ",use_ino" +# endif +#endif #include "../version.h" @@ -728,7 +733,11 @@ static void op_destroy(void *p EXT2FS_ATTR((unused))) } } -static void *op_init(struct fuse_conn_info *conn) +static void *op_init(struct fuse_conn_info *conn +#if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 0) + , struct fuse_config *cfg +#endif + ) { struct fuse_context *ctxt = fuse_get_context(); struct fuse2fs *ff = (struct fuse2fs *)ctxt->private_data; @@ -798,7 +807,11 @@ static int stat_inode(ext2_filsys fs, ext2_ino_t ino, struct stat *statbuf) return ret; } -static int op_getattr(const char *path, struct stat *statbuf) +static int op_getattr(const char *path, struct stat *statbuf +#if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 0) + , struct fuse_file_info *fi +#endif + ) { struct fuse_context *ctxt = fuse_get_context(); struct fuse2fs *ff = (struct fuse2fs *)ctxt->private_data; @@ -1542,7 +1555,11 @@ static int update_dotdot_helper(ext2_ino_t dir EXT2FS_ATTR((unused)), return 0; } -static int op_rename(const char *from, const char *to) +static int op_rename(const char *from, const char *to +#if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 0) + , unsigned int flags +#endif + ) { struct fuse_context *ctxt = fuse_get_context(); struct fuse2fs *ff = (struct fuse2fs *)ctxt->private_data; @@ -1871,7 +1888,11 @@ out: return ret; } -static int op_chmod(const char *path, mode_t mode) +static int op_chmod(const char *path, mode_t mode +#if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 0) + , struct fuse_file_info *fi +#endif + ) { struct fuse_context *ctxt = fuse_get_context(); struct fuse2fs *ff = (struct fuse2fs *)ctxt->private_data; @@ -1930,7 +1951,11 @@ out: return ret; } -static int op_chown(const char *path, uid_t owner, gid_t group) +static int op_chown(const char *path, uid_t owner, gid_t group +#if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 0) + , struct fuse_file_info *fi +#endif + ) { struct fuse_context *ctxt = fuse_get_context(); struct fuse2fs *ff = (struct fuse2fs *)ctxt->private_data; @@ -2000,7 +2025,11 @@ out: return ret; } -static int op_truncate(const char *path, off_t len) +static int op_truncate(const char *path, off_t len +#if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 0) + , struct fuse_file_info *fi +#endif + ) { struct fuse_context *ctxt = fuse_get_context(); struct fuse2fs *ff = (struct fuse2fs *)ctxt->private_data; @@ -2753,7 +2782,11 @@ static int op_readdir_iter(ext2_ino_t dir EXT2FS_ATTR((unused)), memcpy(namebuf, dirent->name, dirent->name_len & 0xFF); namebuf[dirent->name_len & 0xFF] = 0; - ret = i->func(i->buf, namebuf, NULL, 0); + ret = i->func(i->buf, namebuf, NULL, 0 +#if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 0) + , 0 +#endif + ); if (ret) return DIRENT_ABORT; @@ -2763,7 +2796,11 @@ static int op_readdir_iter(ext2_ino_t dir EXT2FS_ATTR((unused)), static int op_readdir(const char *path EXT2FS_ATTR((unused)), void *buf, fuse_fill_dir_t fill_func, off_t offset EXT2FS_ATTR((unused)), - struct fuse_file_info *fp) + struct fuse_file_info *fp +#if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 0) + , enum fuse_readdir_flags flags +#endif + ) { struct fuse_context *ctxt = fuse_get_context(); struct fuse2fs *ff = (struct fuse2fs *)ctxt->private_data; @@ -2951,6 +2988,7 @@ out: return ret; } +#if FUSE_VERSION < FUSE_MAKE_VERSION(3, 0) static int op_ftruncate(const char *path EXT2FS_ATTR((unused)), off_t len, struct fuse_file_info *fp) { @@ -3024,8 +3062,13 @@ static int op_fgetattr(const char *path EXT2FS_ATTR((unused)), return ret; } +#endif /* FUSE_VERSION < FUSE_MAKE_VERSION(3, 0) */ -static int op_utimens(const char *path, const struct timespec ctv[2]) +static int op_utimens(const char *path, const struct timespec ctv[2] +#if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 0) + , struct fuse_file_info *fi +#endif + ) { struct fuse_context *ctxt = fuse_get_context(); struct fuse2fs *ff = (struct fuse2fs *)ctxt->private_data; @@ -3259,7 +3302,12 @@ static int ioctl_fitrim(ext2_filsys fs, struct fuse2fs_file_handle *fh, #endif /* FITRIM */ #if FUSE_VERSION >= FUSE_MAKE_VERSION(2, 8) -static int op_ioctl(const char *path EXT2FS_ATTR((unused)), int cmd, +static int op_ioctl(const char *path EXT2FS_ATTR((unused)), +#if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 0) + unsigned int cmd, +#else + int cmd, +#endif void *arg EXT2FS_ATTR((unused)), struct fuse_file_info *fp, unsigned int flags EXT2FS_ATTR((unused)), void *data) @@ -3603,10 +3651,12 @@ static struct fuse_operations fs_ops = { .fsyncdir = op_fsync, .access = op_access, .create = op_create, +#if FUSE_VERSION < FUSE_MAKE_VERSION(3, 0) .ftruncate = op_ftruncate, .fgetattr = op_fgetattr, +#endif .utimens = op_utimens, -#if FUSE_VERSION >= FUSE_MAKE_VERSION(2, 9) +#if (FUSE_VERSION >= FUSE_MAKE_VERSION(2, 9)) && (FUSE_VERSION < FUSE_MAKE_VERSION(3, 0)) # if defined(UTIME_NOW) || defined(UTIME_OMIT) .flag_utime_omit_ok = 1, # endif @@ -3618,10 +3668,14 @@ static struct fuse_operations fs_ops = { #endif #if FUSE_VERSION >= FUSE_MAKE_VERSION(2, 8) .ioctl = op_ioctl, +#if FUSE_VERSION < FUSE_MAKE_VERSION(3, 0) .flag_nullpath_ok = 1, #endif +#endif #if FUSE_VERSION >= FUSE_MAKE_VERSION(2, 9) +#if FUSE_VERSION < FUSE_MAKE_VERSION(3, 0) .flag_nopath = 1, +#endif # ifdef SUPPORT_FALLOCATE .fallocate = op_fallocate, # endif @@ -3860,7 +3914,7 @@ int main(int argc, char *argv[]) get_random_bytes(&fctx.next_generation, sizeof(unsigned int)); /* Set up default fuse parameters */ - snprintf(extra_args, BUFSIZ, "-okernel_cache,subtype=ext4,use_ino," + snprintf(extra_args, BUFSIZ, "-okernel_cache,subtype=ext4," "fsname=%s,attr_timeout=0" FUSE_PLATFORM_OPTS, fctx.device); if (fctx.no_default_opts == 0) |