diff --git a/src/Build/CMakeLists.txt b/src/Build/CMakeLists.txt index ba67f9d7..5125d157 100644 --- a/src/Build/CMakeLists.txt +++ b/src/Build/CMakeLists.txt @@ -10,6 +10,8 @@ elseif ( NOT DEFINED NOGUI ) MESSAGE(FATAL_ERROR "NOGUI variable MUST BE set to TRUE if building 'Console' version, 'FALSE' otherwise") endif() +option(VC_WITH_FUSE3 "Link against FUSE3 instead of FUSE2 when packaging" OFF) + # - Set version of the package set( FULL_VERSION "1.26.27" ) set( VERSION "1.26.27" ) @@ -268,46 +270,56 @@ if ( ( PLATFORM STREQUAL "Debian" ) OR ( PLATFORM STREQUAL "Ubuntu" ) ) set( CPACK_DEBIAN_PACKAGE_RELEASE ${CPACK_PACKAGE_RELEASE} ) set( CPACK_DEBIAN_PACKAGE_ARCHITECTURE ${ARCHITECTURE} ) # mandatory + # Determine the FUSE runtime package name that matches the selected FUSE version + set(VC_DEBIAN_USE_T64 FALSE) + if ( ( ( PLATFORM STREQUAL "Debian" ) AND ( PLATFORM_VERSION VERSION_GREATER_EQUAL "13" ) ) + OR ( ( PLATFORM STREQUAL "Ubuntu" ) AND ( PLATFORM_VERSION VERSION_GREATER_EQUAL "24.04" ) ) ) + set(VC_DEBIAN_USE_T64 TRUE) + endif () + if (VC_WITH_FUSE3) + set(VC_DEBIAN_FUSE_PACKAGE "libfuse3-3") + else () + if (VC_DEBIAN_USE_T64) + set(VC_DEBIAN_FUSE_PACKAGE "libfuse2t64") + else () + set(VC_DEBIAN_FUSE_PACKAGE "libfuse2") + endif () + endif () + if (NOGUI) # Link against statically built wxWidgets so that we don't depend on any GTK library - # In case of Ubuntu 24.04/ Debian 13 or newer, libfuse2 package was renamed libfuse2t64 - if ( ( ( PLATFORM STREQUAL "Debian" ) AND ( PLATFORM_VERSION VERSION_GREATER_EQUAL "13" ) ) - OR ( ( PLATFORM STREQUAL "Ubuntu" ) AND ( PLATFORM_VERSION VERSION_GREATER_EQUAL "24.04" ) ) ) - set( CPACK_DEBIAN_PACKAGE_DEPENDS "libfuse2t64, dmsetup, sudo" ) - else () - set( CPACK_DEBIAN_PACKAGE_DEPENDS "libfuse2, dmsetup, sudo" ) - endif() + set( CPACK_DEBIAN_PACKAGE_DEPENDS "${VC_DEBIAN_FUSE_PACKAGE}, dmsetup, sudo" ) else () # Link against gtk3 version of wxWidgets if >= Debian 10 or >= Ubuntu 18.04 # Otherwise, link against gtk2 version of wxWidgets if ( ( ( PLATFORM STREQUAL "Debian" ) AND ( PLATFORM_VERSION VERSION_GREATER_EQUAL "13" ) ) OR ( ( PLATFORM STREQUAL "Ubuntu" ) AND ( PLATFORM_VERSION VERSION_GREATER_EQUAL "25.04" ) ) ) - set( CPACK_DEBIAN_PACKAGE_DEPENDS "libwxgtk3.2-1t64, libayatana-appindicator3-1, libfuse2t64, dmsetup, sudo" ) + set( CPACK_DEBIAN_PACKAGE_DEPENDS "libwxgtk3.2-1t64, libayatana-appindicator3-1, ${VC_DEBIAN_FUSE_PACKAGE}, dmsetup, sudo" ) - # In case of Ubuntu 24.04, we depend on libfuse2t64 instead of libfuse2 and we link statically against wxWidgets + # In case of Ubuntu 24.04, we depend on the t64 variant of the FUSE package and we link statically against wxWidgets # because there is a bug in wxWidgets that ships with Ubuntu 24.04 and which was fixed in wxWidgets 3.2.5 elseif ( ( PLATFORM STREQUAL "Ubuntu" ) AND ( PLATFORM_VERSION VERSION_GREATER_EQUAL "24.04" ) ) - - set( CPACK_DEBIAN_PACKAGE_DEPENDS "libgtk-3-0t64, libayatana-appindicator3-1, libfuse2t64, dmsetup, sudo" ) - elseif ( ( ( PLATFORM STREQUAL "Debian" ) AND ( PLATFORM_VERSION VERSION_GREATER_EQUAL "12" ) ) + set( CPACK_DEBIAN_PACKAGE_DEPENDS "libgtk-3-0t64, libayatana-appindicator3-1, ${VC_DEBIAN_FUSE_PACKAGE}, dmsetup, sudo" ) + + elseif ( ( ( PLATFORM STREQUAL "Debian" ) AND ( PLATFORM_VERSION VERSION_GREATER_EQUAL "12" ) ) OR ( ( PLATFORM STREQUAL "Ubuntu" ) AND ( PLATFORM_VERSION VERSION_GREATER_EQUAL "23.04" ) ) ) - - set( CPACK_DEBIAN_PACKAGE_DEPENDS "libwxgtk3.2-1, libayatana-appindicator3-1, libfuse2, dmsetup, sudo" ) - - elseif ( ( ( PLATFORM STREQUAL "Debian" ) AND ( PLATFORM_VERSION VERSION_GREATER_EQUAL "10" ) ) + + set( CPACK_DEBIAN_PACKAGE_DEPENDS "libwxgtk3.2-1, libayatana-appindicator3-1, ${VC_DEBIAN_FUSE_PACKAGE}, dmsetup, sudo" ) + + elseif ( ( ( PLATFORM STREQUAL "Debian" ) AND ( PLATFORM_VERSION VERSION_GREATER_EQUAL "10" ) ) OR ( ( PLATFORM STREQUAL "Ubuntu" ) AND ( PLATFORM_VERSION VERSION_GREATER_EQUAL "18.04" ) ) ) - - set( CPACK_DEBIAN_PACKAGE_DEPENDS "libwxgtk3.0-gtk3-0v5, libayatana-appindicator3-1, libfuse2, dmsetup, sudo" ) - + + set( CPACK_DEBIAN_PACKAGE_DEPENDS "libwxgtk3.0-gtk3-0v5, libayatana-appindicator3-1, ${VC_DEBIAN_FUSE_PACKAGE}, dmsetup, sudo" ) + else () # Link against statically built wxWidgets on Ubuntu 14.04 and older, and Debian 8 and older if ( ( ( PLATFORM STREQUAL "Debian" ) AND ( PLATFORM_VERSION VERSION_LESS_EQUAL "8" ) ) OR ( ( PLATFORM STREQUAL "Ubuntu" ) AND ( PLATFORM_VERSION VERSION_LESS_EQUAL "14.04" ) ) ) - set( CPACK_DEBIAN_PACKAGE_DEPENDS "libgtk2.0-0, libfuse2, dmsetup, sudo" ) + set( CPACK_DEBIAN_PACKAGE_DEPENDS "libgtk2.0-0, ${VC_DEBIAN_FUSE_PACKAGE}, dmsetup, sudo" ) else () - set( CPACK_DEBIAN_PACKAGE_DEPENDS "libwxgtk3.0-0v5, libfuse2, dmsetup, sudo" ) + set( CPACK_DEBIAN_PACKAGE_DEPENDS "libwxgtk3.0-0v5, ${VC_DEBIAN_FUSE_PACKAGE}, dmsetup, sudo" ) endif () endif() @@ -330,7 +342,7 @@ elseif ( ( PLATFORM STREQUAL "CentOS" ) OR ( PLATFORM STREQUAL "openSUSE" ) OR ( set( RPM_PRERM ${CMAKE_CURRENT_BINARY_DIR}/Packaging/rpm-control/prerm.sh) set( CPACK_GENERATOR "RPM" ) # mandatory - set( CPACK_RPM_PACKAGE_SUMMARY ${CPACK_PACKAGE_SUMMARY} ) # mandatory + set( CPACK_RPM_PACKAGE_SUMMARY ${CPACK_PACKAGE_DESCRIPTION_SUMMARY} ) # mandatory set( CPACK_RPM_PACKAGE_DESCRIPTION ${CPACK_PACKAGE_DESCRIPTION} ) # mandatory set( CPACK_RPM_PACKAGE_NAME ${CPACK_PACKAGE_NAME} ) # mandatory set( CPACK_RPM_FILE_NAME ${CPACK_PACKAGE_FILE_NAME}.rpm ) # mandatory @@ -341,17 +353,22 @@ elseif ( ( PLATFORM STREQUAL "CentOS" ) OR ( PLATFORM STREQUAL "openSUSE" ) OR ( set( CPACK_RPM_PACKAGE_GROUP "Applications/System" ) # mandatory, https://fedoraproject.org/wiki/RPMGroups set( CPACK_RPM_PACKAGE_VENDOR ${CPACK_PACKAGE_VENDOR} ) # mandatory set( CPACK_RPM_PACKAGE_AUTOREQ "no" ) # disable automatic shared libraries dependency detection (most of the time buggy) + if (VC_WITH_FUSE3) + set(VC_RPM_FUSE_PACKAGE "fuse3") + else () + set(VC_RPM_FUSE_PACKAGE "fuse") + endif () if (NOGUI) - set( CPACK_RPM_PACKAGE_REQUIRES "fuse, device-mapper, sudo" ) + set( CPACK_RPM_PACKAGE_REQUIRES "${VC_RPM_FUSE_PACKAGE}, device-mapper, sudo" ) else () find_package(PkgConfig REQUIRED) pkg_check_modules(GTK3 gtk+-3.0) if(GTK3_FOUND) - set( CPACK_RPM_PACKAGE_REQUIRES "fuse, device-mapper, gtk3, sudo" ) + set( CPACK_RPM_PACKAGE_REQUIRES "${VC_RPM_FUSE_PACKAGE}, device-mapper, gtk3, sudo" ) else() - set( CPACK_RPM_PACKAGE_REQUIRES "fuse, device-mapper, gtk2, sudo" ) + set( CPACK_RPM_PACKAGE_REQUIRES "${VC_RPM_FUSE_PACKAGE}, device-mapper, gtk2, sudo" ) endif() endif() diff --git a/src/Build/build_cmake_deb.sh b/src/Build/build_cmake_deb.sh index 7248b1cd..64cdf559 100755 --- a/src/Build/build_cmake_deb.sh +++ b/src/Build/build_cmake_deb.sh @@ -41,6 +41,52 @@ export WX_ROOT=$PARENTDIR/wxWidgets-3.2.5 cd $SOURCEPATH +# Detect requested FUSE version (defaults to FUSE2). Can be set via WITHFUSE3=1 or by passing FUSE3/--with-fuse3. +build_with_fuse3=0 +if [ -n "$WITHFUSE3" ] && [ "$WITHFUSE3" != "0" ]; then + build_with_fuse3=1 +fi + +preserved_args="" +while [ $# -gt 0 ]; do + case "$1" in + FUSE3|WITHFUSE3|--with-fuse3) + build_with_fuse3=1 + ;; + FUSE2|WITHFUSE2|--with-fuse2) + build_with_fuse3=0 + ;; + WXSTATIC|INDICATOR) + if [ -z "$preserved_args" ]; then + preserved_args="$1" + else + preserved_args="$preserved_args $1" + fi + ;; + *) + echo "Warning: Unrecognized option '$1' (ignored)" >&2 + ;; + esac + shift +done + +set -- +if [ -n "$preserved_args" ]; then + for arg in $preserved_args; do + set -- "$@" "$arg" + done +fi + +if [ "$build_with_fuse3" = "1" ]; then + FUSE3_MAKE_FLAG="WITHFUSE3=1" + FUSE3_CMAKE_FLAG="-DVC_WITH_FUSE3=TRUE" + echo "Building VeraCrypt packages against FUSE3" +else + FUSE3_MAKE_FLAG="" + FUSE3_CMAKE_FLAG="-DVC_WITH_FUSE3=FALSE" + echo "Building VeraCrypt packages against FUSE2" +fi + build_and_install() { target=$1 wxstatic=$2 @@ -63,7 +109,7 @@ build_and_install() { echo "wx-config already exists in ${WX_BUILD_DIR}. Skipping wxbuild." else echo "Using wxWidgets sources in $WX_ROOT" - make $wxstatic_value $nogui wxbuild || exit 1 + make $wxstatic_value $nogui $FUSE3_MAKE_FLAG wxbuild || exit 1 fi fi @@ -73,9 +119,9 @@ build_and_install() { fi rm -rf "$PARENTDIR/VeraCrypt_Setup/$target" - make $wxstatic_value $indicator_value $nogui clean || exit 1 - make $wxstatic_value $indicator_value $nogui || exit 1 - make $wxstatic_value $indicator_value $nogui install DESTDIR="$PARENTDIR/VeraCrypt_Setup/$target" || exit 1 + make $wxstatic_value $indicator_value $nogui $FUSE3_MAKE_FLAG clean || exit 1 + make $wxstatic_value $indicator_value $nogui $FUSE3_MAKE_FLAG || exit 1 + make $wxstatic_value $indicator_value $nogui $FUSE3_MAKE_FLAG install DESTDIR="$PARENTDIR/VeraCrypt_Setup/$target" || exit 1 } # Handle arguments @@ -112,8 +158,8 @@ rm -rf $PARENTDIR/VeraCrypt_Packaging mkdir -p $PARENTDIR/VeraCrypt_Packaging/GUI mkdir -p $PARENTDIR/VeraCrypt_Packaging/Console -cmake -H$SCRIPTPATH -B$PARENTDIR/VeraCrypt_Packaging/GUI -DVERACRYPT_BUILD_DIR="$PARENTDIR/VeraCrypt_Setup/GUI" -DNOGUI=FALSE || exit 1 +cmake -H$SCRIPTPATH -B$PARENTDIR/VeraCrypt_Packaging/GUI -DVERACRYPT_BUILD_DIR="$PARENTDIR/VeraCrypt_Setup/GUI" -DNOGUI=FALSE $FUSE3_CMAKE_FLAG || exit 1 cpack --config $PARENTDIR/VeraCrypt_Packaging/GUI/CPackConfig.cmake || exit 1 -cmake -H$SCRIPTPATH -B$PARENTDIR/VeraCrypt_Packaging/Console -DVERACRYPT_BUILD_DIR="$PARENTDIR/VeraCrypt_Setup/Console" -DNOGUI=TRUE || exit 1 +cmake -H$SCRIPTPATH -B$PARENTDIR/VeraCrypt_Packaging/Console -DVERACRYPT_BUILD_DIR="$PARENTDIR/VeraCrypt_Setup/Console" -DNOGUI=TRUE $FUSE3_CMAKE_FLAG || exit 1 cpack --config $PARENTDIR/VeraCrypt_Packaging/Console/CPackConfig.cmake || exit 1 diff --git a/src/Build/build_cmake_opensuse.sh b/src/Build/build_cmake_opensuse.sh index da4f985f..87c5a75e 100644 --- a/src/Build/build_cmake_opensuse.sh +++ b/src/Build/build_cmake_opensuse.sh @@ -41,6 +41,38 @@ export WX_ROOT=$PARENTDIR/wxWidgets-3.2.5 cd $SOURCEPATH +# Detect requested FUSE version (defaults to FUSE2). Can be set via WITHFUSE3=1 or by passing FUSE3/--with-fuse3. +build_with_fuse3=0 +if [ -n "$WITHFUSE3" ] && [ "$WITHFUSE3" != "0" ]; then + build_with_fuse3=1 +fi + +while [ $# -gt 0 ]; do + case "$1" in + FUSE3|WITHFUSE3|--with-fuse3) + build_with_fuse3=1 + ;; + FUSE2|WITHFUSE2|--with-fuse2) + build_with_fuse3=0 + ;; + *) + echo "Unknown option: $1" >&2 + exit 1 + ;; + esac + shift +done + +if [ "$build_with_fuse3" = "1" ]; then + FUSE3_MAKE_FLAG="WITHFUSE3=1" + FUSE3_CMAKE_FLAG="-DVC_WITH_FUSE3=TRUE" + echo "Building VeraCrypt packages against FUSE3" +else + FUSE3_MAKE_FLAG="" + FUSE3_CMAKE_FLAG="-DVC_WITH_FUSE3=FALSE" + echo "Building VeraCrypt packages against FUSE2" +fi + echo "Building GUI version of VeraCrypt for RPM using wxWidgets static libraries" # This will be the temporary wxWidgets directory @@ -51,14 +83,14 @@ if [ -L "${WX_BUILD_DIR}/wx-config" ]; then echo "wx-config already exists in ${WX_BUILD_DIR}. Skipping wxbuild." else echo "Using wxWidgets sources in $WX_ROOT" - make WXSTATIC=1 wxbuild || exit 1 + make WXSTATIC=1 $FUSE3_MAKE_FLAG wxbuild || exit 1 ln -s $WX_BUILD_DIR/lib $WX_BUILD_DIR/lib64 fi rm -rf "$PARENTDIR/VeraCrypt_Setup/GUI" -make WXSTATIC=1 clean || exit 1 -make WXSTATIC=1 || exit 1 -make WXSTATIC=1 install DESTDIR="$PARENTDIR/VeraCrypt_Setup/GUI" || exit 1 +make WXSTATIC=1 $FUSE3_MAKE_FLAG clean || exit 1 +make WXSTATIC=1 $FUSE3_MAKE_FLAG || exit 1 +make WXSTATIC=1 $FUSE3_MAKE_FLAG install DESTDIR="$PARENTDIR/VeraCrypt_Setup/GUI" || exit 1 echo "Building console version of VeraCrypt for RPM using wxWidgets static libraries" @@ -74,14 +106,14 @@ if [ -L "${WX_BUILD_DIR}/wx-config" ]; then echo "wx-config already exists in ${WX_BUILD_DIR}. Skipping wxbuild." else echo "Using wxWidgets sources in $WX_ROOT" - make WXSTATIC=1 NOGUI=1 wxbuild || exit 1 + make WXSTATIC=1 NOGUI=1 $FUSE3_MAKE_FLAG wxbuild || exit 1 ln -s $WX_BUILD_DIR/lib $WX_BUILD_DIR/lib64 fi rm -rf "$PARENTDIR/VeraCrypt_Setup/Console" -make WXSTATIC=1 NOGUI=1 clean || exit 1 -make WXSTATIC=1 NOGUI=1 || exit 1 -make WXSTATIC=1 NOGUI=1 install DESTDIR="$PARENTDIR/VeraCrypt_Setup/Console" || exit 1 +make WXSTATIC=1 NOGUI=1 $FUSE3_MAKE_FLAG clean || exit 1 +make WXSTATIC=1 NOGUI=1 $FUSE3_MAKE_FLAG || exit 1 +make WXSTATIC=1 NOGUI=1 $FUSE3_MAKE_FLAG install DESTDIR="$PARENTDIR/VeraCrypt_Setup/Console" || exit 1 echo "Creating VeraCrypt RPM packages " @@ -95,7 +127,7 @@ mkdir -p $PARENTDIR/VeraCrypt_Packaging/GUI mkdir -p $PARENTDIR/VeraCrypt_Packaging/Console # wxWidgets was built using native GTK version -cmake -H$SCRIPTPATH -B$PARENTDIR/VeraCrypt_Packaging/GUI -DVERACRYPT_BUILD_DIR="$PARENTDIR/VeraCrypt_Setup/GUI" -DNOGUI=FALSE || exit 1 +cmake -H$SCRIPTPATH -B$PARENTDIR/VeraCrypt_Packaging/GUI -DVERACRYPT_BUILD_DIR="$PARENTDIR/VeraCrypt_Setup/GUI" -DNOGUI=FALSE $FUSE3_CMAKE_FLAG || exit 1 cpack --config $PARENTDIR/VeraCrypt_Packaging/GUI/CPackConfig.cmake || exit 1 -cmake -H$SCRIPTPATH -B$PARENTDIR/VeraCrypt_Packaging/Console -DVERACRYPT_BUILD_DIR="$PARENTDIR/VeraCrypt_Setup/Console" -DNOGUI=TRUE || exit 1 +cmake -H$SCRIPTPATH -B$PARENTDIR/VeraCrypt_Packaging/Console -DVERACRYPT_BUILD_DIR="$PARENTDIR/VeraCrypt_Setup/Console" -DNOGUI=TRUE $FUSE3_CMAKE_FLAG || exit 1 cpack --config $PARENTDIR/VeraCrypt_Packaging/Console/CPackConfig.cmake|| exit 1 diff --git a/src/Build/build_cmake_rpm.sh b/src/Build/build_cmake_rpm.sh index 3b63e63b..499a1c61 100644 --- a/src/Build/build_cmake_rpm.sh +++ b/src/Build/build_cmake_rpm.sh @@ -41,6 +41,38 @@ export WX_ROOT=$PARENTDIR/wxWidgets-3.2.5 cd $SOURCEPATH +# Detect requested FUSE version (defaults to FUSE2). Can be set via WITHFUSE3=1 or by passing FUSE3/--with-fuse3. +build_with_fuse3=0 +if [ -n "$WITHFUSE3" ] && [ "$WITHFUSE3" != "0" ]; then + build_with_fuse3=1 +fi + +while [ $# -gt 0 ]; do + case "$1" in + FUSE3|WITHFUSE3|--with-fuse3) + build_with_fuse3=1 + ;; + FUSE2|WITHFUSE2|--with-fuse2) + build_with_fuse3=0 + ;; + *) + echo "Unknown option: $1" >&2 + exit 1 + ;; + esac + shift +done + +if [ "$build_with_fuse3" = "1" ]; then + FUSE3_MAKE_FLAG="WITHFUSE3=1" + FUSE3_CMAKE_FLAG="-DVC_WITH_FUSE3=TRUE" + echo "Building VeraCrypt packages against FUSE3" +else + FUSE3_MAKE_FLAG="" + FUSE3_CMAKE_FLAG="-DVC_WITH_FUSE3=FALSE" + echo "Building VeraCrypt packages against FUSE2" +fi + echo "Building GUI version of VeraCrypt for RPM using wxWidgets static libraries" # This will be the temporary wxWidgets directory @@ -51,13 +83,16 @@ if [ -L "${WX_BUILD_DIR}/wx-config" ]; then echo "wx-config already exists in ${WX_BUILD_DIR}. Skipping wxbuild." else echo "Using wxWidgets sources in $WX_ROOT" - make WXSTATIC=1 wxbuild || exit 1 + make WXSTATIC=1 $FUSE3_MAKE_FLAG wxbuild || exit 1 + if [ -d "$WX_BUILD_DIR/lib" ] && [ ! -e "$WX_BUILD_DIR/lib64" ]; then + ln -s "$WX_BUILD_DIR/lib" "$WX_BUILD_DIR/lib64" + fi fi rm -rf "$PARENTDIR/VeraCrypt_Setup/GUI" -make WXSTATIC=1 clean || exit 1 -make WXSTATIC=1 || exit 1 -make WXSTATIC=1 install DESTDIR="$PARENTDIR/VeraCrypt_Setup/GUI" || exit 1 +make WXSTATIC=1 $FUSE3_MAKE_FLAG clean || exit 1 +make WXSTATIC=1 $FUSE3_MAKE_FLAG || exit 1 +make WXSTATIC=1 $FUSE3_MAKE_FLAG install DESTDIR="$PARENTDIR/VeraCrypt_Setup/GUI" || exit 1 echo "Building console version of VeraCrypt for RPM using wxWidgets static libraries" @@ -73,13 +108,13 @@ if [ -L "${WX_BUILD_DIR}/wx-config" ]; then echo "wx-config already exists in ${WX_BUILD_DIR}. Skipping wxbuild." else echo "Using wxWidgets sources in $WX_ROOT" - make WXSTATIC=1 NOGUI=1 wxbuild || exit 1 + make WXSTATIC=1 NOGUI=1 $FUSE3_MAKE_FLAG wxbuild || exit 1 fi rm -rf "$PARENTDIR/VeraCrypt_Setup/Console" -make WXSTATIC=1 NOGUI=1 clean || exit 1 -make WXSTATIC=1 NOGUI=1 || exit 1 -make WXSTATIC=1 NOGUI=1 install DESTDIR="$PARENTDIR/VeraCrypt_Setup/Console" || exit 1 +make WXSTATIC=1 NOGUI=1 $FUSE3_MAKE_FLAG clean || exit 1 +make WXSTATIC=1 NOGUI=1 $FUSE3_MAKE_FLAG || exit 1 +make WXSTATIC=1 NOGUI=1 $FUSE3_MAKE_FLAG install DESTDIR="$PARENTDIR/VeraCrypt_Setup/Console" || exit 1 echo "Creating VeraCrypt RPM packages " @@ -93,7 +128,7 @@ mkdir -p $PARENTDIR/VeraCrypt_Packaging/GUI mkdir -p $PARENTDIR/VeraCrypt_Packaging/Console # wxWidgets was built using native GTK version -cmake -H$SCRIPTPATH -B$PARENTDIR/VeraCrypt_Packaging/GUI -DVERACRYPT_BUILD_DIR="$PARENTDIR/VeraCrypt_Setup/GUI" -DNOGUI=FALSE || exit 1 +cmake -H$SCRIPTPATH -B$PARENTDIR/VeraCrypt_Packaging/GUI -DVERACRYPT_BUILD_DIR="$PARENTDIR/VeraCrypt_Setup/GUI" -DNOGUI=FALSE $FUSE3_CMAKE_FLAG || exit 1 cpack --config $PARENTDIR/VeraCrypt_Packaging/GUI/CPackConfig.cmake || exit 1 -cmake -H$SCRIPTPATH -B$PARENTDIR/VeraCrypt_Packaging/Console -DVERACRYPT_BUILD_DIR="$PARENTDIR/VeraCrypt_Setup/Console" -DNOGUI=TRUE || exit 1 +cmake -H$SCRIPTPATH -B$PARENTDIR/VeraCrypt_Packaging/Console -DVERACRYPT_BUILD_DIR="$PARENTDIR/VeraCrypt_Setup/Console" -DNOGUI=TRUE $FUSE3_CMAKE_FLAG || exit 1 cpack --config $PARENTDIR/VeraCrypt_Packaging/Console/CPackConfig.cmake || exit 1 diff --git a/src/Driver/Fuse/Driver.make b/src/Driver/Fuse/Driver.make index c6156026..49953458 100644 --- a/src/Driver/Fuse/Driver.make +++ b/src/Driver/Fuse/Driver.make @@ -16,5 +16,6 @@ OBJS := OBJS += FuseService.o CXXFLAGS += $(shell $(PKG_CONFIG) $(VC_FUSE_PACKAGE) --cflags) +CXXFLAGS += -DVC_FUSE_VERSION=$(VC_FUSE_VERSION) include $(BUILD_INC)/Makefile.inc diff --git a/src/Driver/Fuse/FuseService.cpp b/src/Driver/Fuse/FuseService.cpp index 4b343b6f..ca1835eb 100644 --- a/src/Driver/Fuse/FuseService.cpp +++ b/src/Driver/Fuse/FuseService.cpp @@ -11,9 +11,24 @@ */ #ifdef TC_OPENBSD -#define FUSE_USE_VERSION 26 +# define FUSE_USE_VERSION 26 #else -#define FUSE_USE_VERSION 25 +# ifndef VC_FUSE_VERSION +# define VC_FUSE_VERSION 2 +# endif +# if VC_FUSE_VERSION < 3 +# define FUSE_USE_VERSION 25 +# else +# define FUSE_USE_VERSION 301 +# define VC_FUSE3 1 +# endif +#endif + + +#ifdef VC_FUSE3 +#define VC_FUSE_FILL_DIR(filler, buf, name, st, off) filler(buf, name, st, off, (enum fuse_fill_dir_flags)0) +#else +#define VC_FUSE_FILL_DIR(filler, buf, name, st, off) filler(buf, name, st, off) #endif #include @@ -41,6 +56,23 @@ namespace VeraCrypt { + static const ino_t VC_FUSE_INODE_ROOT = 1; + static const ino_t VC_FUSE_INODE_VOLUME = 2; + static const ino_t VC_FUSE_INODE_CONTROL = 3; + + static int fuse_service_fill_dir_entry (void *buf, fuse_fill_dir_t filler, const char *name, mode_t mode, ino_t ino, off_t nextOff) + { + struct stat st; + Memory::Zero (&st, sizeof (st)); + st.st_mode = mode; + st.st_nlink = S_ISDIR (mode) ? 2 : 1; + st.st_uid = FuseService::GetUserId(); + st.st_gid = FuseService::GetGroupId(); + st.st_ino = ino; + + return VC_FUSE_FILL_DIR (filler, buf, name, &st, nextOff); + } + static int fuse_service_access (const char *path, int mask) { try @@ -56,11 +88,7 @@ namespace VeraCrypt return 0; } -#ifdef TC_OPENBSD - static void *fuse_service_init (struct fuse_conn_info *) -#else - static void *fuse_service_init () -#endif + static void *fuse_service_init_common () { try { @@ -88,6 +116,32 @@ namespace VeraCrypt return nullptr; } +#if defined(VC_FUSE3) + static void *fuse_service_init (struct fuse_conn_info *conn, struct fuse_config *cfg) + { + if (cfg) + { + cfg->set_uid = 1; + cfg->set_gid = 1; + cfg->uid = FuseService::GetUserId(); + cfg->gid = FuseService::GetGroupId(); + } + + return fuse_service_init_common (); + } +#elif defined(TC_OPENBSD) || (FUSE_USE_VERSION >= 26) + static void *fuse_service_init (struct fuse_conn_info *conn) + { + (void) conn; + return fuse_service_init_common (); + } +#else + static void *fuse_service_init () + { + return fuse_service_init_common (); + } +#endif + static void fuse_service_destroy (void *userdata) { try @@ -104,7 +158,7 @@ namespace VeraCrypt } } - static int fuse_service_getattr (const char *path, struct stat *statData) + static int fuse_service_getattr_impl (const char *path, struct stat *statData) { try { @@ -120,6 +174,7 @@ namespace VeraCrypt { statData->st_mode = S_IFDIR | 0500; statData->st_nlink = 2; + statData->st_ino = VC_FUSE_INODE_ROOT; } else { @@ -131,12 +186,14 @@ namespace VeraCrypt statData->st_mode = S_IFREG | 0600; statData->st_nlink = 1; statData->st_size = FuseService::GetVolumeSize(); + statData->st_ino = VC_FUSE_INODE_VOLUME; } else if (strcmp (path, FuseService::GetControlPath()) == 0) { statData->st_mode = S_IFREG | 0600; statData->st_nlink = 1; statData->st_size = FuseService::GetVolumeInfo()->Size(); + statData->st_ino = VC_FUSE_INODE_CONTROL; } else { @@ -152,6 +209,19 @@ namespace VeraCrypt return 0; } +#if defined(VC_FUSE3) + static int fuse_service_getattr (const char *path, struct stat *statData, struct fuse_file_info *fi) + { + (void) fi; + return fuse_service_getattr_impl (path, statData); + } +#else + static int fuse_service_getattr (const char *path, struct stat *statData) + { + return fuse_service_getattr_impl (path, statData); + } +#endif + static int fuse_service_opendir (const char *path, struct fuse_file_info *fi) { try @@ -261,8 +331,10 @@ namespace VeraCrypt return -ENOENT; } - static int fuse_service_readdir (const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi) + static int fuse_service_readdir_impl (const char *path, void *buf, fuse_fill_dir_t filler, struct fuse_file_info *fi) { + (void) fi; + try { if (!FuseService::CheckAccessRights()) @@ -271,10 +343,14 @@ namespace VeraCrypt if (strcmp (path, "/") != 0) return -ENOENT; - filler (buf, ".", NULL, 0); - filler (buf, "..", NULL, 0); - filler (buf, FuseService::GetVolumeImagePath() + 1, NULL, 0); - filler (buf, FuseService::GetControlPath() + 1, NULL, 0); + if (fuse_service_fill_dir_entry (buf, filler, ".", S_IFDIR | 0500, VC_FUSE_INODE_ROOT, 0) != 0) + return 0; + if (fuse_service_fill_dir_entry (buf, filler, "..", S_IFDIR | 0500, VC_FUSE_INODE_ROOT, 0) != 0) + return 0; + if (fuse_service_fill_dir_entry (buf, filler, FuseService::GetVolumeImagePath() + 1, S_IFREG | 0600, VC_FUSE_INODE_VOLUME, 0) != 0) + return 0; + if (fuse_service_fill_dir_entry (buf, filler, FuseService::GetControlPath() + 1, S_IFREG | 0600, VC_FUSE_INODE_CONTROL, 0) != 0) + return 0; } catch (...) { @@ -284,6 +360,21 @@ namespace VeraCrypt return 0; } +#if defined(VC_FUSE3) + static int fuse_service_readdir (const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi, enum fuse_readdir_flags flags) + { + (void) offset; + (void) flags; + return fuse_service_readdir_impl (path, buf, filler, fi); + } +#else + static int fuse_service_readdir (const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi) + { + (void) offset; + return fuse_service_readdir_impl (path, buf, filler, fi); + } +#endif + static int fuse_service_write (const char *path, const char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { try @@ -461,11 +552,13 @@ namespace VeraCrypt } catch (...) { - if (t > 50) - throw; - - Thread::Sleep (100); + // Ignore exceptions since we will retry } + + if (t > 50) + throw TimeOut (SRC_POS); + + Thread::Sleep (100); } } @@ -592,7 +685,9 @@ namespace VeraCrypt SignalHandlerPipe->GetWriteFD(); -#ifdef TC_OPENBSD +#ifdef VC_FUSE3 + _exit (fuse_main (argc, argv, &fuse_service_oper, nullptr)); +#elif defined(TC_OPENBSD) _exit (fuse_main (argc, argv, &fuse_service_oper, NULL)); #else _exit (fuse_main (argc, argv, &fuse_service_oper)); diff --git a/src/Driver/Fuse/FuseService.h b/src/Driver/Fuse/FuseService.h index 504f40d3..35101678 100644 --- a/src/Driver/Fuse/FuseService.h +++ b/src/Driver/Fuse/FuseService.h @@ -48,7 +48,7 @@ namespace VeraCrypt static const char *GetControlPath () { return "/control"; } static const char *GetVolumeImagePath (); static string GetDeviceType () { return "veracrypt"; } - static uid_t GetGroupId () { return GroupId; } + static gid_t GetGroupId () { return GroupId; } static uid_t GetUserId () { return UserId; } static shared_ptr GetVolumeInfo (); static uint64 GetVolumeSize (); diff --git a/src/Makefile b/src/Makefile index 008df27d..5e756f8b 100644 --- a/src/Makefile +++ b/src/Makefile @@ -52,7 +52,7 @@ export LFLAGS := export PKG_CONFIG ?= pkg-config export PKG_CONFIG_PATH ?= /usr/local/lib/pkgconfig -export VC_FUSE_PACKAGE := fuse + export VC_OSX_FUSET ?= 0 export WX_CONFIG ?= wx-config @@ -342,7 +342,6 @@ $(error Specified SDK version was not found, ensure your active developer direct ifneq "$(VC_OSX_FUSET)" "0" C_CXX_FLAGS += -DVC_MACOSX_FUSET - VC_FUSE_PACKAGE := fuse-t endif export CFLAGS_ARM64 := $(CFLAGS) $(C_CXX_FLAGS) -arch arm64 -march=armv8-a+crypto @@ -547,6 +546,36 @@ ifneq (,$(filter Linux FreeBSD OpenBSD,$(PLATFORM))) endif endif +#------ FUSE selection ------ +# User must specify WITHFUSE3 (non-zero) to request fuse3. Otherwise fuse (FUSE2) is used. +# macOS FUSE-T builds select the fuse-t pkg-config package through WITHFUSET. +# In all cases, existence is validated and build stops if the selected package is not found. +ifeq "$(PLATFORM)" "MacOSX" + ifneq "$(VC_OSX_FUSET)" "0" + VC_FUSE_PACKAGE := fuse-t + else + VC_FUSE_PACKAGE := fuse + endif +else + ifeq ($(origin WITHFUSE3),command line) + ifneq ($(WITHFUSE3),0) + VC_FUSE_PACKAGE := fuse3 + else + VC_FUSE_PACKAGE := fuse + endif + else + VC_FUSE_PACKAGE := fuse + endif +endif + +FUSE_FOUND := $(shell $(PKG_CONFIG) --exists $(VC_FUSE_PACKAGE) >/dev/null 2>&1 && echo 1 || echo 0) +ifeq ($(FUSE_FOUND),0) +$(error Requested FUSE package '$(VC_FUSE_PACKAGE)' not found. Install it (or set WITHFUSE3/WITHFUSET appropriately).) +endif + +export VC_FUSE_PACKAGE +export VC_FUSE_VERSION := $(shell $(PKG_CONFIG) --modversion $(VC_FUSE_PACKAGE) 2>/dev/null | cut -d. -f1) + #------ Common configuration ------ CFLAGS := $(C_CXX_FLAGS) $(CFLAGS) $(TC_EXTRA_CFLAGS)