--- /dev/null
+fuse3 (3.14.0-6) unstable; urgency=medium
+
+ The fuse3 package honours a dpkg-statoverride of /bin/fusermount3 installed
+ by a system administrator (e.g. to remove the setuid binary installed by
+ default). The path to this file according to the package manager is
+ transitioned to /usr/bin/fusermount3. If you installed a statoverride,
+ please move it to the new path and verify the permissions.
+
+ -- Helmut Grohne <helmut@subdivi.de> Wed, 12 Jun 2024 13:41:27 +0200
--- /dev/null
+fuse3 (3.17.2-2) unstable; urgency=medium
+
+ [ Laszlo Boszormenyi (GCS) ]
+ * Backport upstream fixes (closes: #1101305):
+ - make conn->want/want_ext conversion non fatal,
+ - add container_of and ROUND_UP macros,
+ - conn->want conversion: fix fuse_apply_conn_info_opts() .
+ * Update symbols file (closes: #1105099).
+
+ [ Helmut Grohne <helmut@subdivi.de> ]
+ * Update -latomic architecture list (closes: #1105150).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Mon, 19 May 2025 20:39:08 +0200
+
+fuse3 (3.17.2-1) unstable; urgency=medium
+
+ * New upstream release:
+ - check if pthread_setname_np() exists before use it,
+ - fix example/memfs_ll rename deadlock error,
+ - signal handlers: Store fuse_session unconditionally.
+ * Backport upstream fixes:
+ - fix meson function tests,
+ - meson.build: make special_funcs check more reliable.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sun, 27 Apr 2025 08:10:01 +0200
+
+fuse3 (3.17.1+git250416-1) unstable; urgency=medium
+
+ * New git snapshot release:
+ - fixes "both 'want' and 'want_ext' are set" errors (closes: #1101305).
+ * Refer online versions of Free Software Foundation licences.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Wed, 16 Apr 2025 18:35:53 +0200
+
+fuse3 (3.17.1-1) unstable; urgency=medium
+
+ * New major upstream release:
+ - fixes want flag conversion (closes: #1101129).
+ * Update Standards-Version to 4.7.2 .
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Mon, 24 Mar 2025 14:12:08 +0100
+
+fuse3 (3.17.1~rc1-3) unstable; urgency=medium
+
+ * Backport upstream fix for mount: fix closing stdout/err and error logs.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Thu, 13 Mar 2025 15:30:01 +0100
+
+fuse3 (3.17.1~rc1-2) experimental; urgency=medium
+
+ * Link examples with atomic on armel, m68k and powerpc architectures.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sat, 22 Feb 2025 07:44:45 +0100
+
+fuse3 (3.17.1~rc1-1) experimental; urgency=medium
+
+ * New major upstream release candidate version.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Wed, 19 Feb 2025 17:29:04 +0100
+
+fuse3 (3.17.1~rc0-1) experimental; urgency=medium
+
+ * New major upstream release candidate version (closes: #1095239):
+ - fixes ABI breaks (closes: #1031802),
+ - fixes max threads value warning (closes: #1037410).
+ * Library transition from libfuse3-3 to libfuse3-4.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Fri, 14 Feb 2025 22:49:04 +0100
+
+fuse3 (3.14.0-10) unstable; urgency=medium
+
+ [ Helmut Grohne <helmut@subdivi.de> ]
+ * Upgrade Breaks for fuse to Conflicts to prevent accidental file loss
+ (DEP17, closes: #1082357).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sat, 21 Sep 2024 14:06:04 +0200
+
+fuse3 (3.14.0-9) unstable; urgency=medium
+
+ * Fix FTBFS due to the fuse transitional package.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sun, 15 Sep 2024 08:00:33 +0200
+
+fuse3 (3.14.0-8) unstable; urgency=medium
+
+ [ Jeremy BĂcha <jeremy.bicha@canonical.com> ]
+ * Provide fuse transitional package for upgrade (closes: #918984, #927291,
+ #1074767, #1081537).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Fri, 13 Sep 2024 19:31:58 +0200
+
+fuse3 (3.14.0-7) unstable; urgency=medium
+
+ [ Guillem Jover ]
+ * Use canonical pathnames in initramfs hook (closes: #1079573).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sun, 25 Aug 2024 13:39:34 +0200
+
+fuse3 (3.14.0-6) unstable; urgency=medium
+
+ [ Helmut Grohne ]
+ * Move aliased files to /usr (DEP17) (closes: #1073058).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sun, 07 Jul 2024 07:17:03 +0200
+
+fuse3 (3.14.0-5) unstable; urgency=medium
+
+ * Fix 99-fuse3.rules path (closes: #1060067).
+ * Switch udev build dependency to systemd-dev (closes: #1060606).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Fri, 12 Jan 2024 16:46:21 +0100
+
+fuse3 (3.14.0-4) unstable; urgency=medium
+
+ * Backport upstream fixes:
+ - fix max_threads command line parameter propagation,
+ - fix memory leak in high level API.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Tue, 18 Apr 2023 23:07:15 +0200
+
+fuse3 (3.14.0-3) unstable; urgency=medium
+
+ [ Helge Deller <deller@gmx.de> ]
+ * Add the big-endian hppa platform to the disabled self-testing list
+ (closes: #1032187).
+
+ [ Laszlo Boszormenyi (GCS) ]
+ * Update fuse header name in examples.
+ * Fix Makefile for examples (closes: #1031544).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Fri, 17 Mar 2023 20:51:05 +0100
+
+fuse3 (3.14.0-2) unstable; urgency=medium
+
+ * Revert upgrade of fuse_kernel.h for not being upstreamed yet
+ (closes: #1031524).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sat, 18 Feb 2023 07:22:30 +0100
+
+fuse3 (3.14.0-1) unstable; urgency=medium
+
+ * New upstream release:
+ - fix header installation issue (closes: #1031455).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Fri, 17 Feb 2023 19:50:40 +0100
+
+fuse3 (3.13.1-1) unstable; urgency=medium
+
+ * New upstream release.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Fri, 10 Feb 2023 22:04:50 +0100
+
+fuse3 (3.13.0-2) unstable; urgency=medium
+
+ * Can't run self-testing on big-endian machines.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sun, 22 Jan 2023 08:17:08 +0100
+
+fuse3 (3.13.0-1) unstable; urgency=medium
+
+ * New upstream release.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Tue, 17 Jan 2023 19:11:25 +0100
+
+fuse3 (3.12.0-1) unstable; urgency=medium
+
+ * New upstream release.
+ * Update library symbols for this release.
+ * Update watch file.
+ * Update Lintian overrides.
+ * Update Standards-Version to 4.6.1 .
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sat, 22 Oct 2022 21:28:52 +0200
+
+fuse3 (3.11.0-1) unstable; urgency=medium
+
+ * New upstream release.
+ * Update Standards-Version to 4.6.0.1 .
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sat, 07 May 2022 16:30:30 +0200
+
+fuse3 (3.10.5-1) unstable; urgency=medium
+
+ * New upstream release.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Thu, 16 Sep 2021 17:41:27 +0200
+
+fuse3 (3.10.4-1) unstable; urgency=medium
+
+ * New upstream release.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Mon, 23 Aug 2021 22:05:34 +0200
+
+fuse3 (3.10.3-2) unstable; urgency=medium
+
+ * Do not try to alter cuse device permissions (closes: #947229, #989977).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sun, 20 Jun 2021 15:45:33 +0200
+
+fuse3 (3.10.3-1) unstable; urgency=medium
+
+ * New upstream release:
+ - fix returning d_ino and d_type by readdir(3) in non-plus mode,
+ - remove unused fuse_worker bufsize,
+ - fix typos.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Wed, 21 Apr 2021 14:34:39 +0200
+
+fuse3 (3.10.2-2) unstable; urgency=medium
+
+ * Mark libfuse3-dev as Multi-Arch same.
+
+ [ Matthias Klose <doko@ubuntu.com> ]
+ * Allow one to build without udeb package (closes: #983438).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Wed, 24 Feb 2021 23:28:30 +0100
+
+fuse3 (3.10.2-1) unstable; urgency=medium
+
+ * New upstream release.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Mon, 08 Feb 2021 21:21:32 +0100
+
+fuse3 (3.10.1-3) unstable; urgency=medium
+
+ * Update debhelper level to 13 .
+
+ [ Stephen Kitt <skitt@debian.org> ]
+ * Ignore "-o nonempty" instead of treating it as an error; the default
+ behaviour in fuse3 is equivalent to "-o nonempty". This allows
+ software expecting fuse2 semantics to work with fusermount3
+ (closes: #939767).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Fri, 29 Jan 2021 16:59:06 +0100
+
+fuse3 (3.10.1-2) unstable; urgency=medium
+
+ * Add upstream metadata.
+ * Update watch file.
+ * Update packaging bits.
+ * Update Standards-Version to 4.5.1 .
+
+ [ Laurent Bigonville <bigon@debian.org> ]
+ * Fix FTBFS on kFreeBSD (closes: #980213).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sat, 16 Jan 2021 10:34:25 +0100
+
+fuse3 (3.10.1-1) unstable; urgency=medium
+
+ * New upstream release.
+ * Backport upstream fix:
+ - add exfat to whitelist.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Fri, 01 Jan 2021 15:32:48 +0100
+
+fuse3 (3.10.0-1) unstable; urgency=medium
+
+ * New upstream release.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sun, 11 Oct 2020 23:01:33 +0200
+
+fuse3 (3.9.3-1) unstable; urgency=medium
+
+ * New upstream release.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Thu, 20 Aug 2020 15:16:47 +0200
+
+fuse3 (3.9.2-1) unstable; urgency=medium
+
+ * New upstream release.
+ * Use udev for Linux builds, specify udevrulesdir otherwise
+ (closes: #956579).
+
+ [ Laurent Bigonville <bigon@debian.org> ]
+ * Run tests form the correct directory and make them non fatal
+ (closes: #956592).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sat, 13 Jun 2020 14:54:36 +0200
+
+fuse3 (3.9.0-2) unstable; urgency=medium
+
+ * Don't explicitly remove fuse.conf on purge (closes: #953223).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sat, 07 Mar 2020 11:10:15 +0000
+
+fuse3 (3.9.0-1) unstable; urgency=medium
+
+ * New upstream release.
+ * Update Standards-Version to 4.5.0 .
+
+ [ Hideki Yamane <henrich@debian.org> ]
+ * Add version for Provides: fuse (closes: #943896).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Thu, 13 Feb 2020 16:06:09 +0000
+
+fuse3 (3.7.0-1) unstable; urgency=medium
+
+ * New upstream release.
+ * Update library symbols for this release.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sat, 28 Sep 2019 21:28:17 +0000
+
+fuse3 (3.6.2-1) unstable; urgency=medium
+
+ * New upstream release.
+ * Drop outdated udevadm commands from postinst (closes: #934293).
+ * Remove dh_makeshlibs override.
+ * Update Standards-Version to 4.4.0 .
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sun, 01 Sep 2019 06:15:20 +0000
+
+fuse3 (3.4.1-1) unstable; urgency=medium
+
+ * New upstream release.
+ * Update library symbols for this release.
+ * Update Standards-Version to 4.3.0 .
+
+ [ Dmitry Smirnov <onlyjob@member.fsf.org> ]
+ * Make "fuse3" to replace "fuse", instead of conflict (closes: #912528).
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Tue, 25 Dec 2018 16:57:44 +0000
+
+fuse3 (3.2.6-1) unstable; urgency=medium
+
+ * New upstream release:
+ - fix CVE-2018-10906, restriction bypass of the allow_other option when
+ SELinux is active (closes: #911343).
+ * Honor nocheck in DEB_BUILD_OPTIONS (closes: #910029).
+ * Don't force xz compression for source and binaries (closes: #910030).
+ * Update copyright file.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Thu, 18 Oct 2018 21:36:00 +0000
+
+fuse3 (3.2.4-1) unstable; urgency=medium
+
+ * New major upstream release (closes: #904216).
+ * Drop own udev rules.
+ * Update watch file.
+ * Update copyright file.
+ * Update debhelper level to 11:
+ - remove dh-autoreconf build dependency,
+ - don't specify parallel to debhelper.
+ * Update Standards-Version to 4.1.5:
+ - remove fuse-dbg package and use the auto-generated one.
+
+ -- Laszlo Boszormenyi (GCS) <gcs@debian.org> Sat, 21 Jul 2018 14:11:44 +0000
--- /dev/null
+config.rpath
+util/mount_util.c
--- /dev/null
+Source: fuse3
+Section: utils
+Priority: optional
+Maintainer: Laszlo Boszormenyi (GCS) <gcs@debian.org>
+Build-Depends:
+ debhelper-compat (= 13),
+ pkgconf,
+ meson,
+ systemd-dev,
+ python3 <!nocheck>,
+ python3-pytest <!nocheck>
+Standards-Version: 4.7.2
+Homepage: https://github.com/libfuse/libfuse/wiki
+Rules-Requires-Root: binary-targets
+
+Package: fuse3
+Section: utils
+Architecture: linux-any
+Depends:
+ ${misc:Depends},
+ ${shlibs:Depends},
+ libfuse3-4 (= ${binary:Version}),
+ adduser,
+ mount (>= 2.19.1),
+ sed (>= 4)
+Provides: fuse (= ${source:Version})
+Conflicts: fuse (<< ${source:Version})
+Description: Filesystem in Userspace (3.x version)
+ Filesystem in Userspace (FUSE) is a simple interface for userspace programs to
+ export a virtual filesystem to the Linux kernel. It also aims to provide a
+ secure method for non privileged users to create and mount their own filesystem
+ implementations.
+
+Package: libfuse3-4
+Section: libs
+Architecture: linux-any kfreebsd-any
+Multi-Arch: same
+Pre-Depends: ${misc:Pre-Depends}
+Depends:
+ ${misc:Depends},
+ ${shlibs:Depends},
+Suggests: fuse3
+Description: Filesystem in Userspace (library) (3.x version)
+ Filesystem in Userspace (FUSE) is a simple interface for userspace programs to
+ export a virtual filesystem to the Linux kernel. It also aims to provide a
+ secure method for non privileged users to create and mount their own filesystem
+ implementations.
+ .
+ This package contains the shared library.
+
+Package: libfuse3-dev
+Section: libdevel
+Architecture: linux-any kfreebsd-any
+Multi-Arch: same
+Depends:
+ ${misc:Depends},
+ libfuse3-4 (= ${binary:Version}),
+ libselinux-dev [linux-any],
+Suggests: fuse
+Description: Filesystem in Userspace (development) (3.x version)
+ Filesystem in Userspace (FUSE) is a simple interface for userspace programs to
+ export a virtual filesystem to the Linux kernel. It also aims to provide a
+ secure method for non privileged users to create and mount their own filesystem
+ implementations.
+ .
+ This package contains the development files.
+
+Package: fuse3-udeb
+Package-Type: udeb
+Architecture: linux-any
+Section: debian-installer
+Depends:
+ ${misc:Depends},
+ ${shlibs:Depends},
+ libfuse3-4-udeb (= ${binary:Version}),
+Description: Filesystem in Userspace (3.x version)
+
+Package: libfuse3-4-udeb
+Package-Type: udeb
+Build-Profiles: <!noudeb>
+Architecture: linux-any kfreebsd-any
+Section: debian-installer
+Depends:
+ ${misc:Depends},
+ ${shlibs:Depends},
+Description: Filesystem in Userspace (library) (3.x version)
+
+Package: fuse
+Architecture: all
+Section: oldlibs
+Depends:
+ ${misc:Depends},
+ fuse3,
+Description: Filesystem in Userspace (transitional package)
+ This is a transitional package. It can safely be removed.
--- /dev/null
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: fuse3
+Upstream-Contact: fuse-devel@lists.sourceforge.net
+Source: https://sourceforge.net/projects/fuse/files/
+
+Files: *
+Copyright: 2016- Nikolaus Rath <Nikolaus@rath.org>,
+ 2001-2013 Miklos Szeredi <miklos@szeredi.hu>
+License: GPL-2
+
+Files: lib/*
+Copyright: 2001-2013 Miklos Szeredi <miklos@szeredi.hu>
+License: LGPL-2.1
+
+Files: example/passthrough.c example/passthrough_fh.c
+License: GPL-2
+Copyright: Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>,
+ Copyright (C) 2011 Sebastian Pipping <sebastian@pipping.org>
+
+Files: example/cuse.c
+ example/cuse_client.c
+ example/ioctl.c
+ example/ioctl.h
+ example/ioctl_client.c
+ example/poll.c
+ example/poll_client.c
+ include/cuse_lowlevel.h
+ lib/cuse_lowlevel.c
+License: GPL-2
+Copyright: Copyright (C) 2008-2009 SUSE Linux Products GmbH,
+ Copyright (C) 2008-2009 Tejun Heo <tj@kernel.org>
+
+Files: debian/*
+Copyright: 2014- Laszlo Boszormenyi (GCS) <gcs@debian.org>,
+ 2011-2014 Daniel Baumann <mail@daniel-baumann.ch>
+License: GPL-2+
+
+License: GPL-2
+ This package is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License.
+ .
+ This package is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License 2
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+ .
+ On Debian systems, the complete text of the GNU General
+ Public License can be found in `/usr/share/common-licenses/GPL-2'.
+
+License: GPL-2+
+ This package is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ .
+ This package is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License 2
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+ .
+ On Debian systems, the complete text of the GNU General
+ Public License can be found in `/usr/share/common-licenses/GPL-2'.
+
+License: LGPL-2.1
+ This package is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+ .
+ This package is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+ .
+ You should have received a copy of the GNU Lesser General Public
+ License 2.1 along with this program.
+ If not, see <https://www.gnu.org/licenses/>.
+ .
+ On Debian systems, the complete text of the GNU Lesser General
+ Public License can be found in `/usr/share/common-licenses/LGPL-2.1'.
--- /dev/null
+CFLAGS := -Wall $(shell pkg-config fuse3 --cflags)
+LDFLAGS := $(shell pkg-config fuse3 --libs)
+
+targets = cuse cuse_client hello hello_ll \
+ invalidate_path ioctl ioctl_client \
+ notify_inval_entry notify_inval_inode notify_store_retrieve \
+ null passthrough passthrough_fh passthrough_ll \
+ poll poll_client printcap
+
+%: %.c
+ $(CC) $(CFLAGS) $< -o $@ $(LDFLAGS)
+
+all: $(targets)
+
+clean:
+ rm -f *.o
+ rm -f $(targets)
--- /dev/null
+usr/bin/fusermount3
+usr/sbin/mount.fuse3
--- /dev/null
+usr/bin/fusermount3
+usr/sbin/mount.fuse3
+etc/fuse.conf
--- /dev/null
+/usr/bin/fusermount3 /usr/bin/fusermount
+/usr/sbin/mount.fuse3 /usr/sbin/mount.fuse
+/usr/share/man/man1/fusermount3.1.gz /usr/share/man/man1/fusermount.1.gz
+/usr/share/man/man8/mount.fuse3.8.gz /usr/share/man/man8/mount.fuse.8.gz
--- /dev/null
+usr/share/man/man1/fusermount3.1
+usr/share/man/man8/mount.fuse3.8
--- /dev/null
+#!/bin/sh
+
+set -e
+
+chrooted() {
+ if [ "$(stat -c %d/%i /)" = "$(stat -Lc %d/%i /proc/1/root 2>/dev/null)" ]; then
+ # the devicenumber/inode pair of / is the same as that of
+ # /sbin/init's root, so we're *not* in a chroot and hence
+ # return false.
+ return 1
+ fi
+ return 0
+}
+
+# begin-remove-after: released:trixie
+# protective diversion of files moved from / to /usr, to avoid file loss.
+if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ]; then
+ for f in /bin/fusermount /sbin/mount.fuse; do
+ dpkg-divert --package #PACKAGE# --no-rename --divert "$f.usr-is-merged" --remove "$f"
+ done
+fi
+# end-remove-after
+
+case "${1}" in
+ configure)
+ if ! dpkg-statoverride --list /bin/fusermount3 > /dev/null 2>&1 &&
+ ! dpkg-statoverride --list /usr/bin/fusermount3 > /dev/null 2>&1
+ then
+ chmod 4755 /usr/bin/fusermount3
+ fi
+
+ modprobe fuse > /dev/null 2>&1 || true
+
+ if [ -x "`which update-initramfs 2>/dev/null`" ]
+ then
+ update-initramfs -u
+ fi
+ ;;
+
+ abort-upgrade|abort-remove|abort-deconfigure)
+
+ ;;
+
+ *)
+ echo "postinst called with unknown argument \`${1}'" >&2
+ exit 1
+ ;;
+esac
+
+#DEBHELPER#
+
+exit 0
--- /dev/null
+#!/bin/sh
+
+set -e
+
+case "${1}" in
+ remove)
+ if [ -x "`which update-initramfs 2>/dev/null`" ]
+ then
+ update-initramfs -u
+ fi
+ ;;
+
+ purge)
+ ;;
+
+ upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
+
+ ;;
+
+ *)
+ echo "postrm called with unknown argument \`${1}'" >&2
+ exit 1
+ ;;
+esac
+
+#DEBHELPER#
+
+exit 0
--- /dev/null
+#!/bin/sh
+
+set -e
+
+# begin-remove-after: released:trixie
+# protective diversion of files moved from / to /usr, to avoid file loss.
+if [ "$1" = "upgrade" ] || [ "$1" = "install" ]; then
+ for f in /bin/fusermount /sbin/mount.fuse; do
+ dpkg-divert --package #PACKAGE# --no-rename --divert "$f.usr-is-merged" --add "$f"
+ done
+fi
+# end-remove-after
+
+#DEBHELPER#
+
+exit 0
--- /dev/null
+usr/lib/*/*.so.*
--- /dev/null
+README.md
+doc/README.NFS
+doc/*.txt
--- /dev/null
+usr/lib/*/*.so.*
--- /dev/null
+libfuse3.so.4 #PACKAGE# #MINVER#
+* Build-Depends-Package: libfuse3-dev
+ (symver)FUSE_3.0 3.17.2
+ (symver)FUSE_3.1 3.17.2
+ (symver)FUSE_3.2 3.17.2
+ (symver)FUSE_3.3 3.17.2
+ (symver)FUSE_3.4 3.17.2
+ (symver)FUSE_3.7 3.17.2
+ (symver)FUSE_3.12 3.17.2
+ (symver)FUSE_3.17 3.17.2
+ (symver)FUSE_3.17.3 3.17.2
--- /dev/null
+example/*.c
+example/*.h
+
+debian/examples/*
--- /dev/null
+usr/include
+usr/lib/*/pkgconfig
+usr/lib/*/*.so
+usr/lib/*/*.a
--- /dev/null
+# /etc/fuse.conf - Configuration file for Filesystem in Userspace (FUSE)
+
+# Set the maximum number of FUSE mounts allowed to non-root users.
+# The default is 1000.
+#mount_max = 1000
+
+# Allow non-root users to specify the allow_other or allow_root mount options.
+#user_allow_other
--- /dev/null
+#!/bin/sh
+
+set -e
+
+PREREQ=""
+
+prereqs () {
+ echo "${PREREQ}"
+}
+
+case "${1}" in
+ prereqs)
+ prereqs
+ exit 0
+ ;;
+esac
+
+. /usr/share/initramfs-tools/hook-functions
+
+copy_exec /usr/sbin/mount.fuse3 /usr/sbin
+
+manual_add_modules fuse
+
+exit 0
--- /dev/null
+debian/tmp/etc/init.d/fuse3
+debian/tmp/usr/lib/udev/rules.d/99-fuse3.rules
--- /dev/null
+From d6a9799fc04e6ada5fd7fd7bbde14fb14981fc8b Mon Sep 17 00:00:00 2001
+From: Bernd Schubert <bschubert@ddn.com>
+Date: Tue, 15 Apr 2025 22:03:09 +0200
+Subject: [PATCH] Add container_of and ROUND_UP macros
+
+Needed by follow up commits. container_of is actually
+just moved/consolidated to util.h.
+
+Signed-off-by: Bernd Schubert <bschubert@ddn.com>
+(cherry picked from commit c5a032b3410d7225ac0355355faa63565a209943)
+---
+ lib/fuse.c | 4 ----
+ lib/fuse_lowlevel.c | 4 ----
+ lib/util.h | 6 ++++++
+ 3 files changed, 6 insertions(+), 8 deletions(-)
+
+diff --git a/lib/fuse.c b/lib/fuse.c
+index c0d00edbc..4964de20f 100644
+--- a/lib/fuse.c
++++ b/lib/fuse.c
+@@ -92,10 +92,6 @@ struct node_table {
+ size_t split;
+ };
+
+-#define container_of(ptr, type, member) ({ \
+- const typeof( ((type *)0)->member ) *__mptr = (ptr); \
+- (type *)( (char *)__mptr - offsetof(type,member) );})
+-
+ #define list_entry(ptr, type, member) \
+ container_of(ptr, type, member)
+
+diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
+index 9ee88b160..cb046aae0 100644
+--- a/lib/fuse_lowlevel.c
++++ b/lib/fuse_lowlevel.c
+@@ -44,10 +44,6 @@
+ #define PARAM(inarg) (((char *)(inarg)) + sizeof(*(inarg)))
+ #define OFFSET_MAX 0x7fffffffffffffffLL
+
+-#define container_of(ptr, type, member) ({ \
+- const typeof( ((type *)0)->member ) *__mptr = (ptr); \
+- (type *)( (char *)__mptr - offsetof(type,member) );})
+-
+ struct fuse_pollhandle {
+ uint64_t kh;
+ struct fuse_session *se;
+diff --git a/lib/util.h b/lib/util.h
+index 508fafb12..ed03ad40e 100644
+--- a/lib/util.h
++++ b/lib/util.h
+@@ -30,4 +30,10 @@ static inline uint64_t fuse_higher_32_bits(uint64_t nr)
+ #define FUSE_VAR_UNUSED(var) (__attribute__((unused)) var)
+ #endif
+
++#define container_of(ptr, type, member) \
++ ({ \
++ unsigned long __mptr = (unsigned long)(ptr); \
++ ((type *)(__mptr - offsetof(type, member))); \
++ })
++
+ #endif
--- /dev/null
+From 066e8111f0ff522e4682a31bd63b5a3532e8af86 Mon Sep 17 00:00:00 2001
+From: Bernd Schubert <bschubert@ddn.com>
+Date: Sun, 18 May 2025 00:24:07 +0200
+Subject: [PATCH] conn->want conversion: Fix fuse_apply_conn_info_opts()
+
+fuse_apply_conn_info_opts() was applying to 'want_ext',
+which would cause conflicts with 'want' if the application
+applied its own flags to 'conn->want'.
+
+Solution is:
+ - to move fuse_{set,unset,get}_feature_flag and
+ convert_to_conn_want_ext() to fuse_lowlevel.c and
+ to define them as part of the public API, although
+ convert_to_conn_want_ext() should not be used - it is
+ currently needed to be a public function due as it needs
+ to be defined for the tests.
+
+Related to https://github.com/libfuse/libfuse/issues/1171 and
+https://github.com/libfuse/libfuse/pull/1172.
+
+Closes: https://github.com/libfuse/libfuse/issues/1171
+Signed-off-by: Bernd Schubert <bschubert@ddn.com>
+---
+ include/fuse_common.h | 50 +++++++++++--------
+ lib/fuse.c | 9 +---
+ lib/fuse_i.h | 38 +++------------
+ lib/fuse_lowlevel.c | 78 ++++++++++++++++++++++++++---
+ lib/fuse_versionscript | 10 ++++
+ lib/helper.c | 15 ++++--
+ lib/util.c | 8 +++
+ lib/util.h | 3 ++
+ test/test_want_conversion.c | 97 ++++++++++++++++++++++---------------
+ 9 files changed, 200 insertions(+), 108 deletions(-)
+
+diff --git a/include/fuse_common.h b/include/fuse_common.h
+index 582505fa9..dd08f444a 100644
+--- a/include/fuse_common.h
++++ b/include/fuse_common.h
+@@ -1096,28 +1096,40 @@ void fuse_loop_cfg_convert(struct fuse_loop_config *config,
+ struct fuse_loop_config_v1 *v1_conf);
+ #endif
+
++/**
++ * Set a feature flag in the want_ext field of fuse_conn_info.
++ *
++ * @param conn connection information
++ * @param flag feature flag to be set
++ * @return true if the flag was set, false if the flag is not supported
++ */
++bool fuse_set_feature_flag(struct fuse_conn_info *conn, uint64_t flag);
+
+-static inline bool fuse_set_feature_flag(struct fuse_conn_info *conn,
+- uint64_t flag)
+-{
+- if (conn->capable_ext & flag) {
+- conn->want_ext |= flag;
+- return true;
+- }
+- return false;
+-}
++/**
++ * Unset a feature flag in the want_ext field of fuse_conn_info.
++ *
++ * @param conn connection information
++ * @param flag feature flag to be unset
++ */
++void fuse_unset_feature_flag(struct fuse_conn_info *conn, uint64_t flag);
++
++/**
++ * Get the value of a feature flag in the want_ext field of fuse_conn_info.
++ *
++ * @param conn connection information
++ * @param flag feature flag to be checked
++ * @return true if the flag is set, false otherwise
++ */
++bool fuse_get_feature_flag(struct fuse_conn_info *conn, uint64_t flag);
++
++/*
++ * DO NOT USE: Not part of public API, for internal test use only.
++ * The function signature or any use of it is not guaranteeed to
++ * remain stable. And neither are results of what this function does.
++ */
++int fuse_convert_to_conn_want_ext(struct fuse_conn_info *conn);
+
+-static inline void fuse_unset_feature_flag(struct fuse_conn_info *conn,
+- uint64_t flag)
+-{
+- conn->want_ext &= ~flag;
+-}
+
+-static inline bool fuse_get_feature_flag(struct fuse_conn_info *conn,
+- uint64_t flag)
+-{
+- return conn->capable_ext & flag ? true : false;
+-}
+
+ /* ----------------------------------------------------------- *
+ * Compatibility stuff *
+diff --git a/lib/fuse.c b/lib/fuse.c
+index 4964de20f..85914546e 100644
+--- a/lib/fuse.c
++++ b/lib/fuse.c
+@@ -2611,15 +2611,8 @@ void fuse_fs_init(struct fuse_fs *fs, struct fuse_conn_info *conn,
+ fuse_unset_feature_flag(conn, FUSE_CAP_POSIX_LOCKS);
+ if (!fs->op.flock)
+ fuse_unset_feature_flag(conn, FUSE_CAP_FLOCK_LOCKS);
+- if (fs->op.init) {
+- uint64_t want_ext_default = conn->want_ext;
+- uint32_t want_default = fuse_lower_32_bits(conn->want_ext);
+-
+- conn->want = want_default;
++ if (fs->op.init)
+ fs->user_data = fs->op.init(conn, cfg);
+-
+- convert_to_conn_want_ext(conn, want_ext_default, want_default);
+- }
+ }
+
+ static int fuse_init_intr_signal(int signum, int *installed);
+diff --git a/lib/fuse_i.h b/lib/fuse_i.h
+index bf5e2ca41..718fa142c 100644
+--- a/lib/fuse_i.h
++++ b/lib/fuse_i.h
+@@ -85,6 +85,13 @@ struct fuse_session {
+
+ /* true if reading requests from /dev/fuse are handled internally */
+ bool buf_reallocable;
++
++ /*
++ * conn->want and conn_want_ext options set by libfuse , needed
++ * to correctly convert want to want_ext
++ */
++ uint32_t conn_want;
++ uint64_t conn_want_ext;
+ };
+
+ struct fuse_chan {
+@@ -227,34 +234,3 @@ int fuse_loop_cfg_verify(struct fuse_loop_config *config);
+ /* room needed in buffer to accommodate header */
+ #define FUSE_BUFFER_HEADER_SIZE 0x1000
+
+-/**
+- * Get the wanted capability flags, converting from old format if necessary
+- */
+-static inline int convert_to_conn_want_ext(struct fuse_conn_info *conn,
+- uint64_t want_ext_default,
+- uint32_t want_default)
+-{
+- /*
+- * Convert want to want_ext if necessary.
+- * For the high level interface this function might be called
+- * twice, once from the high level interface and once from the
+- * low level interface. Both, with different want_ext_default and
+- * want_default values. In order to suppress a failure for the
+- * second call, we check if the lower 32 bits of want_ext are
+- * already set to the value of want.
+- */
+- if (conn->want != want_default &&
+- fuse_lower_32_bits(conn->want_ext) != conn->want) {
+- if (conn->want_ext != want_ext_default)
+- return -EINVAL;
+-
+- /* high bits from want_ext, low bits from want */
+- conn->want_ext = fuse_higher_32_bits(conn->want_ext) |
+- conn->want;
+- }
+-
+- /* ensure there won't be a second conversion */
+- conn->want = fuse_lower_32_bits(conn->want_ext);
+-
+- return 0;
+-}
+diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
+index cb046aae0..1276a0fd9 100644
+--- a/lib/fuse_lowlevel.c
++++ b/lib/fuse_lowlevel.c
+@@ -1994,6 +1994,77 @@ static bool want_flags_valid(uint64_t capable, uint64_t want)
+ return true;
+ }
+
++/**
++ * Get the wanted capability flags, converting from old format if necessary
++ */
++int fuse_convert_to_conn_want_ext(struct fuse_conn_info *conn)
++{
++ struct fuse_session *se = container_of(conn, struct fuse_session, conn);
++
++ /*
++ * Convert want to want_ext if necessary.
++ * For the high level interface this function might be called
++ * twice, once from the high level interface and once from the
++ * low level interface. Both, with different want_ext_default and
++ * want_default values. In order to suppress a failure for the
++ * second call, we check if the lower 32 bits of want_ext are
++ * already set to the value of want.
++ */
++ if (conn->want != se->conn_want &&
++ fuse_lower_32_bits(conn->want_ext) != conn->want) {
++ if (conn->want_ext != se->conn_want_ext) {
++ fuse_log(FUSE_LOG_ERR,
++ "%s: Both conn->want_ext and conn->want are set.\n"
++ "want=%x, want_ext=%lx, se->want=%lx se->want_ext=%lx\n",
++ __func__, conn->want, conn->want_ext,
++ se->conn_want, se->conn_want_ext);
++ return -EINVAL;
++ }
++
++ /* high bits from want_ext, low bits from want */
++ conn->want_ext = fuse_higher_32_bits(conn->want_ext) |
++ conn->want;
++ }
++
++ /* ensure there won't be a second conversion */
++ conn->want = fuse_lower_32_bits(conn->want_ext);
++
++ return 0;
++}
++
++bool fuse_set_feature_flag(struct fuse_conn_info *conn,
++ uint64_t flag)
++{
++ struct fuse_session *se = container_of(conn, struct fuse_session, conn);
++
++ if (conn->capable_ext & flag) {
++ conn->want_ext |= flag;
++ se->conn_want_ext |= flag;
++ conn->want |= flag;
++ se->conn_want |= flag;
++ return true;
++ }
++ return false;
++}
++
++void fuse_unset_feature_flag(struct fuse_conn_info *conn,
++ uint64_t flag)
++{
++ struct fuse_session *se = container_of(conn, struct fuse_session, conn);
++
++ conn->want_ext &= ~flag;
++ se->conn_want_ext &= ~flag;
++ conn->want &= ~flag;
++ se->conn_want &= ~flag;
++}
++
++bool fuse_get_feature_flag(struct fuse_conn_info *conn,
++ uint64_t flag)
++{
++ return conn->capable_ext & flag ? true : false;
++}
++
++
+ /* Prevent bogus data races (bogus since "init" is called before
+ * multi-threading becomes relevant */
+ static __attribute__((no_sanitize("thread")))
+@@ -2154,12 +2225,8 @@ void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
+
+ se->got_init = 1;
+ if (se->op.init) {
+- uint64_t want_ext_default = se->conn.want_ext;
+- uint32_t want_default = fuse_lower_32_bits(se->conn.want_ext);
+-
+ // Apply the first 32 bits of capable_ext to capable
+ se->conn.capable = fuse_lower_32_bits(se->conn.capable_ext);
+- se->conn.want = want_default;
+
+ se->op.init(se->userdata, &se->conn);
+
+@@ -2168,8 +2235,7 @@ void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
+ * se->conn.want_ext
+ * Userspace might still use conn.want - we need to convert it
+ */
+- convert_to_conn_want_ext(&se->conn, want_ext_default,
+- want_default);
++ fuse_convert_to_conn_want_ext(&se->conn);
+ }
+
+ if (!want_flags_valid(se->conn.capable_ext, se->conn.want_ext)) {
+diff --git a/lib/fuse_versionscript b/lib/fuse_versionscript
+index 6c5fc83eb..a2653fcdd 100644
+--- a/lib/fuse_versionscript
++++ b/lib/fuse_versionscript
+@@ -202,6 +202,16 @@ FUSE_3.17 {
+ fuse_log_close_syslog;
+ } FUSE_3.12;
+
++FUSE_3.17.3 {
++ global:
++ fuse_set_feature_flag;
++ fuse_unset_feature_flag;
++ fuse_get_feature_flag;
++
++ # Not part of public API, for internal test use only
++ fuse_convert_to_conn_want_ext;
++} FUSE_3.17;
++
+ # Local Variables:
+ # indent-tabs-mode: t
+ # End:
+diff --git a/lib/helper.c b/lib/helper.c
+index 59dd48881..aceff9fd5 100644
+--- a/lib/helper.c
++++ b/lib/helper.c
+@@ -423,10 +423,17 @@ void fuse_apply_conn_info_opts(struct fuse_conn_info_opts *opts,
+ if(opts->set_max_readahead)
+ conn->max_readahead = opts->max_readahead;
+
+-#define LL_ENABLE(cond,cap) \
+- if (cond) conn->want_ext |= (cap)
+-#define LL_DISABLE(cond,cap) \
+- if (cond) conn->want_ext &= ~(cap)
++#define LL_ENABLE(cond, cap) \
++ do { \
++ if (cond) \
++ fuse_set_feature_flag(conn, cap); \
++ } while (0)
++
++#define LL_DISABLE(cond, cap) \
++ do { \
++ if (cond) \
++ fuse_unset_feature_flag(conn, cap); \
++ } while (0)
+
+ LL_ENABLE(opts->splice_read, FUSE_CAP_SPLICE_READ);
+ LL_DISABLE(opts->no_splice_read, FUSE_CAP_SPLICE_READ);
+diff --git a/lib/util.c b/lib/util.c
+index a529d383c..956c3d2e9 100644
+--- a/lib/util.c
++++ b/lib/util.c
+@@ -1,7 +1,14 @@
+ #include <stdlib.h>
+ #include <errno.h>
+
++#ifndef FUSE_USE_VERSION
++#define FUSE_USE_VERSION (FUSE_MAKE_VERSION(3, 18))
++#endif
++
+ #include "util.h"
++#include "fuse_log.h"
++#include "fuse_lowlevel.h"
++#include <stdio.h>
+
+ int libfuse_strtol(const char *str, long *res)
+ {
+@@ -25,3 +32,4 @@ int libfuse_strtol(const char *str, long *res)
+ *res = val;
+ return 0;
+ }
++
+diff --git a/lib/util.h b/lib/util.h
+index ed03ad40e..f24401a29 100644
+--- a/lib/util.h
++++ b/lib/util.h
+@@ -2,12 +2,15 @@
+ #define FUSE_UTIL_H_
+
+ #include <stdint.h>
++#include <stdbool.h>
+
+ #define ROUND_UP(val, round_to) (((val) + (round_to - 1)) & ~(round_to - 1))
+
+ #define likely(x) __builtin_expect(!!(x), 1)
+ #define unlikely(x) __builtin_expect(!!(x), 0)
+
++struct fuse_conn_info;
++
+ int libfuse_strtol(const char *str, long *res);
+
+ /**
+diff --git a/test/test_want_conversion.c b/test/test_want_conversion.c
+index bee23cc6e..db731edbf 100644
+--- a/test/test_want_conversion.c
++++ b/test/test_want_conversion.c
+@@ -1,16 +1,22 @@
+-#include "util.h"
+ #define FUSE_USE_VERSION FUSE_MAKE_VERSION(3, 17)
+
++#include "util.h"
+ #include "fuse_i.h"
++#include "fuse_lowlevel.h"
+ #include <stdio.h>
+ #include <assert.h>
+ #include <inttypes.h>
+ #include <stdbool.h>
++#include <err.h>
+
+ static void print_conn_info(const char *prefix, struct fuse_conn_info *conn)
+ {
+- printf("%s: want=0x%" PRIx32 " want_ext=0x%" PRIx64 "\n", prefix,
+- conn->want, conn->want_ext);
++ struct fuse_session *se = container_of(conn, struct fuse_session, conn);
++
++ printf("%s: want=0x%" PRIx32 " want_ext=0x%" PRIx64
++ " want_default=0x%" PRIx32 " want_ext_default=0x%" PRIx64 "\n",
++ prefix, conn->want, conn->want_ext, se->conn_want,
++ se->conn_want_ext);
+ }
+
+ static void application_init_old_style(struct fuse_conn_info *conn)
+@@ -18,33 +24,31 @@ static void application_init_old_style(struct fuse_conn_info *conn)
+ /* Simulate application init the old style */
+ conn->want |= FUSE_CAP_ASYNC_READ;
+ conn->want &= ~FUSE_CAP_SPLICE_READ;
++
++ /*
++ * Also use new style API, as that might happen through
++ * fuse_apply_conn_info_opts()
++ */
++ fuse_set_feature_flag(conn, FUSE_CAP_IOCTL_DIR);
+ }
+
+ static void application_init_new_style(struct fuse_conn_info *conn)
+ {
+ /* Simulate application init the new style */
+ fuse_set_feature_flag(conn, FUSE_CAP_ASYNC_READ);
++ fuse_set_feature_flag(conn, FUSE_CAP_IOCTL_DIR);
+ fuse_unset_feature_flag(conn, FUSE_CAP_SPLICE_READ);
+ }
+
+ static void test_fuse_fs_init(struct fuse_conn_info *conn, bool new_style)
+ {
+- uint64_t want_ext_default = conn->want_ext;
+- uint32_t want_default = fuse_lower_32_bits(conn->want_ext);
+- int rc;
+-
+ /* High-level init */
+ fuse_set_feature_flag(conn, FUSE_CAP_EXPORT_SUPPORT);
+
+- conn->want = want_default;
+-
+ if (new_style)
+ application_init_new_style(conn);
+ else
+ application_init_old_style(conn);
+-
+- rc = convert_to_conn_want_ext(conn, want_ext_default, want_default);
+- assert(rc == 0);
+ }
+
+ static void test_do_init(struct fuse_conn_info *conn, bool new_style)
+@@ -53,49 +57,71 @@ static void test_do_init(struct fuse_conn_info *conn, bool new_style)
+ conn->capable_ext = FUSE_CAP_SPLICE_READ | FUSE_CAP_SPLICE_WRITE |
+ FUSE_CAP_SPLICE_MOVE | FUSE_CAP_POSIX_LOCKS |
+ FUSE_CAP_FLOCK_LOCKS | FUSE_CAP_EXPORT_SUPPORT |
+- FUSE_CAP_ASYNC_READ;
++ FUSE_CAP_ASYNC_READ | FUSE_CAP_IOCTL_DIR;
+ conn->capable = fuse_lower_32_bits(conn->capable_ext);
+- conn->want_ext = conn->capable_ext;
++
++ fuse_set_feature_flag(conn, FUSE_CAP_SPLICE_READ |
++ FUSE_CAP_SPLICE_WRITE |
++ FUSE_CAP_SPLICE_MOVE);
+
+ print_conn_info("Initial state", conn);
+
+- uint64_t want_ext_default = conn->want_ext;
+- uint32_t want_default = fuse_lower_32_bits(conn->want_ext);
+ int rc;
+
+- conn->want = want_default;
+- conn->capable = fuse_lower_32_bits(conn->capable_ext);
+-
+ test_fuse_fs_init(conn, new_style);
++ print_conn_info("After init", conn);
+
+- rc = convert_to_conn_want_ext(conn, want_ext_default, want_default);
++ rc = fuse_convert_to_conn_want_ext(conn);
+ assert(rc == 0);
+
+ /* Verify all expected flags are set */
+ assert(!(conn->want_ext & FUSE_CAP_SPLICE_READ));
+ assert(conn->want_ext & FUSE_CAP_SPLICE_WRITE);
+ assert(conn->want_ext & FUSE_CAP_SPLICE_MOVE);
+- assert(conn->want_ext & FUSE_CAP_POSIX_LOCKS);
+- assert(conn->want_ext & FUSE_CAP_FLOCK_LOCKS);
+ assert(conn->want_ext & FUSE_CAP_EXPORT_SUPPORT);
+ assert(conn->want_ext & FUSE_CAP_ASYNC_READ);
++ assert(conn->want_ext & FUSE_CAP_IOCTL_DIR);
++
+ /* Verify no other flags are set */
+ assert(conn->want_ext ==
+ (FUSE_CAP_SPLICE_WRITE | FUSE_CAP_SPLICE_MOVE |
+- FUSE_CAP_POSIX_LOCKS | FUSE_CAP_FLOCK_LOCKS |
+- FUSE_CAP_EXPORT_SUPPORT | FUSE_CAP_ASYNC_READ));
++ FUSE_CAP_EXPORT_SUPPORT | FUSE_CAP_ASYNC_READ |
++ FUSE_CAP_IOCTL_DIR));
+
+ print_conn_info("After init", conn);
+ }
+
+ static void test_want_conversion_basic(void)
+ {
+- struct fuse_conn_info conn = { 0 };
++ const struct fuse_lowlevel_ops ops = { 0 };
++ struct fuse_args args = FUSE_ARGS_INIT(0, NULL);
++ struct fuse_session *se;
++ struct fuse_conn_info *conn;
++
++ /* Add the program name to arg[0] */
++ if (fuse_opt_add_arg(&args, "test_signals")) {
++ fprintf(stderr, "Failed to add argument\n");
++ errx(1, "Failed to add argument");
++ }
++
++
++ se = fuse_session_new(&args, &ops, sizeof(ops), NULL);
++ assert(se);
++ conn = &se->conn;
++ printf("\nTesting basic want conversion, old style:\n");
++ test_do_init(conn, false);
++ fuse_session_destroy(se);
++
++ se = fuse_session_new(&args, &ops, sizeof(ops), NULL);
++ assert(se);
++ conn = &se->conn;
++ printf("\nTesting basic want conversion, new style:\n");
++ test_do_init(conn, true);
++ print_conn_info("After init", conn);
++ fuse_session_destroy(se);
++
++ fuse_opt_free_args(&args);
+
+- printf("\nTesting basic want conversion:\n");
+- test_do_init(&conn, false);
+- test_do_init(&conn, true);
+- print_conn_info("After init", &conn);
+ }
+
+ static void test_want_conversion_conflict(void)
+@@ -115,16 +141,11 @@ static void test_want_conversion_conflict(void)
+ conn.want = fuse_lower_32_bits(conn.want_ext);
+ print_conn_info("Test conflict initial", &conn);
+
+- /* Initialize default values like in basic test */
+- uint64_t want_ext_default_ll = conn.want_ext;
+- uint32_t want_default_ll = fuse_lower_32_bits(want_ext_default_ll);
+-
+ /* Simulate application init modifying capabilities */
+ conn.want_ext |= FUSE_CAP_ATOMIC_O_TRUNC; /* Add new capability */
+ conn.want &= ~FUSE_CAP_SPLICE_READ; /* Remove a capability */
+
+- rc = convert_to_conn_want_ext(&conn, want_ext_default_ll,
+- want_default_ll);
++ rc = fuse_convert_to_conn_want_ext(&conn);
+ assert(rc == -EINVAL);
+ print_conn_info("Test conflict after", &conn);
+
+@@ -143,11 +164,7 @@ static void test_want_conversion_high_bits(void)
+ conn.want = fuse_lower_32_bits(conn.want_ext);
+ print_conn_info("Test high bits initial", &conn);
+
+- uint64_t want_ext_default_ll = conn.want_ext;
+- uint32_t want_default_ll = fuse_lower_32_bits(want_ext_default_ll);
+-
+- rc = convert_to_conn_want_ext(&conn, want_ext_default_ll,
+- want_default_ll);
++ rc = fuse_convert_to_conn_want_ext(&conn);
+ assert(rc == 0);
+ assert(conn.want_ext == ((1ULL << 33) | FUSE_CAP_ASYNC_READ));
+ print_conn_info("Test high bits after", &conn);
--- /dev/null
+From 1df74208ea060b32e11b14e9b97049207ed03dd3 Mon Sep 17 00:00:00 2001
+From: Bernd Schubert <bschubert@ddn.com>
+Date: Thu, 24 Apr 2025 16:49:08 +0200
+Subject: [PATCH] Fix meson function tests
+
+Several meson tests were incorrectly failing
+
+Checking for function "static_assert" : NO (cached)
+Checking for function "pthread_setname_np" : NO (cached)
+Check usable header "#include <linux/close_range.h>" : NO (cached)
+
+These functions get now tested with compilation tests
+and get found on my system.
+
+Checking if "static_assert check" compiles: YES
+Checking if "pthread_setname_np check" compiles: YES
+Checking if "close_range check" compiles: YES
+
+Signed-off-by: Bernd Schubert <bschubert@ddn.com>
+Signed-off-by: Giulio Benetti <giulio.benetti@benettiengineering.com>
+---
+ meson.build | 67 +++++++++++++++++++++++++++++++++++++++--------------
+ 1 file changed, 49 insertions(+), 18 deletions(-)
+
+diff --git a/meson.build b/meson.build
+index ba551ed53..d1346d090 100644
+--- a/meson.build
++++ b/meson.build
+@@ -59,6 +59,8 @@ include_default = '''
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <fcntl.h>
++#include <assert.h> /* For static_assert */
++#include <pthread.h> /* For pthread_setname_np */
+ '''
+ args_default = [ '-D_GNU_SOURCE' ]
+
+@@ -72,32 +74,61 @@ private_cfg.set_quoted('PACKAGE_VERSION', meson.project_version())
+ # Test for presence of some functions
+ test_funcs = [ 'fork', 'fstatat', 'openat', 'readlinkat', 'pipe2',
+ 'splice', 'vmsplice', 'posix_fallocate', 'fdatasync',
+- 'utimensat', 'copy_file_range', 'fallocate', 'static_assert',
+- 'pthread_setname_np' ]
++ 'utimensat', 'copy_file_range', 'fallocate' ]
+ foreach func : test_funcs
+ private_cfg.set('HAVE_' + func.to_upper(),
+ cc.has_function(func, prefix: include_default, args: args_default))
+ endforeach
+-private_cfg.set('HAVE_SETXATTR',
+- cc.has_function('setxattr', prefix: '#include <sys/xattr.h>'))
+-private_cfg.set('HAVE_ICONV',
+- cc.has_function('iconv', prefix: '#include <iconv.h>'))
+-private_cfg.set('HAVE_BACKTRACE',
+- cc.has_function('backtrace', prefix: '#include <execinfo.h>'))
+
+-# Test if headers exist
+-private_cfg.set('HAVE_LINUX_CLOSE_RANGE_H',
+- cc.check_header('#include <linux/close_range.h>'))
++# Special case checks that need custom code
++special_funcs = {
++ 'static_assert': '''
++ #include <assert.h>
++ static_assert(1, "test");
++ int main(void) { return 0; }
++ ''',
++ 'pthread_setname_np': '''
++ #include <pthread.h>
++ int main(void) {
++ pthread_t thread = pthread_self();
++ pthread_setname_np(thread, "test");
++ return 0;
++ }
++ ''',
++ 'close_range': '''
++ #include <unistd.h>
++ #include <fcntl.h>
++ #include <linux/close_range.h>
++ int main(void) {
++ unsigned int flags = CLOSE_RANGE_UNSHARE;
++ return close_range(3, ~0U, flags);
++ }
++ '''
++}
++
++foreach name, code : special_funcs
++ private_cfg.set('HAVE_' + name.to_upper(),
++ cc.compiles(code, args: ['-Werror'] + args_default,
++ name: name + ' check'))
++endforeach
++
++# Regular function checks
++private_cfg.set('HAVE_SETXATTR',
++ cc.has_function('setxattr', prefix: '#include <sys/xattr.h>'))
++private_cfg.set('HAVE_ICONV',
++ cc.has_function('iconv', prefix: '#include <iconv.h>'))
++private_cfg.set('HAVE_BACKTRACE',
++ cc.has_function('backtrace', prefix: '#include <execinfo.h>'))
+
+-# Test if structs have specific member
++# Struct member checks
+ private_cfg.set('HAVE_STRUCT_STAT_ST_ATIM',
+- cc.has_member('struct stat', 'st_atim',
+- prefix: include_default,
+- args: args_default))
++ cc.has_member('struct stat', 'st_atim',
++ prefix: include_default + '#include <sys/stat.h>',
++ args: args_default))
+ private_cfg.set('HAVE_STRUCT_STAT_ST_ATIMESPEC',
+- cc.has_member('struct stat', 'st_atimespec',
+- prefix: include_default,
+- args: args_default))
++ cc.has_member('struct stat', 'st_atimespec',
++ prefix: include_default + '#include <sys/stat.h>',
++ args: args_default))
+
+ #
+ # Compiler configuration
--- /dev/null
+From 28a6e40302fbd3eeac1aee9434e1bcf69b1a8e25 Mon Sep 17 00:00:00 2001
+From: Bernd Schubert <bschubert@ddn.com>
+Date: Sat, 17 May 2025 23:52:47 +0200
+Subject: [PATCH] Make conn->want/want_ext conversion non fatal
+
+there are too many issues with conn->want and conn->want_ext
+conversion, for now just log a warning, but setting both
+flags is now not fatal anymore.
+
+Signed-off-by: Bernd Schubert <bschubert@ddn.com>
+---
+ lib/fuse.c | 16 +---------------
+ lib/fuse_i.h | 5 +----
+ lib/fuse_lowlevel.c | 9 +--------
+ 3 files changed, 3 insertions(+), 27 deletions(-)
+
+diff --git a/lib/fuse.c b/lib/fuse.c
+index 49f57112a..c0d00edbc 100644
+--- a/lib/fuse.c
++++ b/lib/fuse.c
+@@ -2618,25 +2618,11 @@ void fuse_fs_init(struct fuse_fs *fs, struct fuse_conn_info *conn,
+ if (fs->op.init) {
+ uint64_t want_ext_default = conn->want_ext;
+ uint32_t want_default = fuse_lower_32_bits(conn->want_ext);
+- int rc;
+
+ conn->want = want_default;
+ fs->user_data = fs->op.init(conn, cfg);
+
+- rc = convert_to_conn_want_ext(conn, want_ext_default,
+- want_default);
+-
+- if (rc != 0) {
+- /*
+- * This is a grave developer error, but
+- * we cannot return an error here, as the function
+- * signature does not allow it.
+- */
+- fuse_log(
+- FUSE_LOG_ERR,
+- "fuse: Aborting due to invalid conn want flags.\n");
+- _exit(EXIT_FAILURE);
+- }
++ convert_to_conn_want_ext(conn, want_ext_default, want_default);
+ }
+ }
+
+diff --git a/lib/fuse_i.h b/lib/fuse_i.h
+index 48b8294f3..bf5e2ca41 100644
+--- a/lib/fuse_i.h
++++ b/lib/fuse_i.h
+@@ -245,11 +245,8 @@ static inline int convert_to_conn_want_ext(struct fuse_conn_info *conn,
+ */
+ if (conn->want != want_default &&
+ fuse_lower_32_bits(conn->want_ext) != conn->want) {
+- if (conn->want_ext != want_ext_default) {
+- fuse_log(FUSE_LOG_ERR,
+- "fuse: both 'want' and 'want_ext' are set\n");
++ if (conn->want_ext != want_ext_default)
+ return -EINVAL;
+- }
+
+ /* high bits from want_ext, low bits from want */
+ conn->want_ext = fuse_higher_32_bits(conn->want_ext) |
+diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
+index 9ebaaf08e..9ee88b160 100644
+--- a/lib/fuse_lowlevel.c
++++ b/lib/fuse_lowlevel.c
+@@ -2160,7 +2160,6 @@ void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
+ if (se->op.init) {
+ uint64_t want_ext_default = se->conn.want_ext;
+ uint32_t want_default = fuse_lower_32_bits(se->conn.want_ext);
+- int rc;
+
+ // Apply the first 32 bits of capable_ext to capable
+ se->conn.capable = fuse_lower_32_bits(se->conn.capable_ext);
+@@ -2173,14 +2172,8 @@ void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
+ * se->conn.want_ext
+ * Userspace might still use conn.want - we need to convert it
+ */
+- rc = convert_to_conn_want_ext(&se->conn, want_ext_default,
++ convert_to_conn_want_ext(&se->conn, want_ext_default,
+ want_default);
+- if (rc != 0) {
+- fuse_reply_err(req, EPROTO);
+- se->error = -EPROTO;
+- fuse_session_exit(se);
+- return;
+- }
+ }
+
+ if (!want_flags_valid(se->conn.capable_ext, se->conn.want_ext)) {
--- /dev/null
+From 8e226c6af6f386a88ed53d0a0940ff6b869b372d Mon Sep 17 00:00:00 2001
+From: Giulio Benetti <giulio.benetti@benettiengineering.com>
+Date: Fri, 25 Apr 2025 19:00:14 +0200
+Subject: [PATCH] meson.build: make special_funcs check more reliable
+
+Unfortunately while cross-compiling with build tools like Buildroot it
+happens to have repeated flags or anything that could lead to a warning.
+This way the check fails because of a warning not related to the special
+function. So let's use cc.links() and increase minimum meson_version to
+0.60 since cc.links() has been added during that version.
+
+Signed-off-by: Giulio Benetti <giulio.benetti@benettiengineering.com>
+---
+ meson.build | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/meson.build b/meson.build
+index d1346d090..d3d236dc4 100644
+--- a/meson.build
++++ b/meson.build
+@@ -1,6 +1,6 @@
+ project('libfuse3', ['c'],
+ version: '3.17.2',
+- meson_version: '>= 0.51.0',
++ meson_version: '>= 0.60.0',
+ default_options: [
+ 'buildtype=debugoptimized',
+ 'c_std=gnu11',
+@@ -108,7 +108,7 @@ special_funcs = {
+
+ foreach name, code : special_funcs
+ private_cfg.set('HAVE_' + name.to_upper(),
+- cc.compiles(code, args: ['-Werror'] + args_default,
++ cc.links(code, args: args_default,
+ name: name + ' check'))
+ endforeach
+
--- /dev/null
+Fix_meson_function_tests.patch
+meson.build-make-special_funcs-check-more-reliable.patch
+Make_conn-want-want_ext_conversion_non_fatal.patch
+Add-container_of-and-ROUND_UP-macros.patch
+Fix-fuse_apply_conn_info_opts.patch
--- /dev/null
+#!/usr/bin/make -f
+# -*- makefile -*-
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+SHELL := sh -e
+
+include /usr/share/dpkg/architecture.mk
+
+export DEB_BUILD_MAINT_OPTIONS = hardening=+all
+
+ifneq (,$(filter $(DEB_HOST_ARCH), arc armel m68k mips mipsel powerpc sh3 sh4 sparc))
+ export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed -latomic
+endif
+
+ifeq (,$(filter noudeb, $(DEB_BUILD_PROFILES)))
+ with_udeb = yes
+endif
+
+override_dh_auto_configure-arch:
+ dh_auto_configure -- -Ddefault_library=both -Duseroot=false \
+ $(DEB_CONFIGURE_EXTRA_FLAGS)
+
+override_dh_auto_configure-indep:
+ @echo Do not configure indep
+
+override_dh_auto_build-indep:
+ @echo Do not build indep
+
+override_dh_auto_install-indep:
+ @echo Do not install indep
+
+override_dh_compress:
+ dh_compress -Xusr/share/doc/libfuse3-dev/examples -XREADME.md
+
+override_dh_fixperms-arch:
+ dh_fixperms --arch
+ifeq ($(DEB_HOST_ARCH),linux)
+ chmod 0755 debian/fuse3/bin/fusermount3
+endif
+
+execute_after_dh_install:
+ # adding initramfs-tools integration
+ install -D -m 0755 debian/local/fuse.hook debian/fuse3/usr/share/initramfs-tools/hooks/fuse
+
+override_dh_auto_test-arch:
+ifeq (,$(findstring nocheck,$(DEB_BUILD_OPTIONS)))
+ifeq (,$(findstring $(DEB_BUILD_ARCH),powerpc ppc64 sparc64 s390x hppa))
+ (cd obj-${DEB_HOST_GNU_TYPE}; python3 -m pytest test/) \
+ || true
+endif
+endif
+
+override_dh_auto_test-indep:
+ @echo Do not test indep
+
+override_dh_missing:
+ dh_missing --fail-missing
+
+%:
+ dh ${@} --buildsystem=meson
+
+.PHONY: override_dh_auto_configure-arch override_dh_auto_configure-indep \
+ override_dh_auto_build-indep override_dh_auto_install-indep \
+ override_dh_compress override_dh_fixperms-arch \
+ execute_after_dh_install \
+ override_dh_auto_test-arch override_dh_auto_test-indep \
+ override_dh_missing
--- /dev/null
+3.0 (quilt)
--- /dev/null
+---
+Archive: GitHub
+Bug-Database: https://github.com/libfuse/libfuse/issues
+Bug-Submit: https://github.com/libfuse/libfuse/issues/new
+Repository: https://github.com/libfuse/libfuse.git
+Repository-Browse: https://github.com/libfuse/libfuse
--- /dev/null
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1
+
+mQINBFMiefoBEADYa1ZUqR/3YDqaf2UGpd9kNfKAY3TAR+xTcTYBKWTkJEy4cX2b
+ccSEOf7Ef1w0va+WgBwDUAllf+x21UFOWnPnqwb8LJxyg8dN3CRNWf9Z2vRXNOkv
+nAd0hYnA6xsbSLDQV0wpJOTH1zyZejMMWLpZh5SKRxaJAtpsfZ32qppzJhn4jJb0
+v2fC+wJVkUy4mLe6yaHCrrHwlwldyzlwPBNwFfk31mVFYO+COSTGq+RXU2kCdujf
+w648IBYltdWI3D1vTilJd0gt2EDmOqQizfFJLlBTdLieJdrXzL4WWuzvJpC1Yadk
+mqMqnVkpcDxbxw0bK7G0faLigwWkshggaSns0vnpD05jQyMJUYdLwB9lh6u0B9AP
+cCxmPLhgHDdgdlZ+1JHMdfY0gIMSIAP2zkQu4iaTv5Tuc5a03dXE7G6GwZ+A5Ysr
+ovQCot2FY653A0swmAsaCy3A2OcVFXXgmZGLYh/06XA/+WhMSLVIaQ6eYTFgG9k8
+iopU6zw5p2vav1rOuirymLe3b/VNZhk6nOpewwLp+5c2Ylmj6zEHegFQ9pbmlFF/
+kubk9wGuS941G0/iLPyf3ePPhQ6hMY9L+7moW+Zlbqqg2XXa9S8C2rMwELDegpaw
+YJyMIt25xAb94BGMkU/SxclzZ62ktGkYrA0ekiHkB6zzt8uhHrGDxWEucQARAQAB
+tCFOaWtvbGF1cyBSYXRoIDxOaWtvbGF1c0ByYXRoLm9yZz6IagQQEQoAKgUCUyJ7
+rCMaaHR0cDovL3d3dy5yYXRoLm9yZy9ncGdwb2xpY3kuaHRtbAAKCRCprbf4rk5C
+XNS7AJ9/Fdr8AzeAPKRoGN/ilFSb64kVggCeNE3F2CrZisHyjAlJ2sW/5iRS1MeJ
+AUAEEAEKACoFAlMie5IjGmh0dHA6Ly93d3cucmF0aC5vcmcvZ3BncG9saWN5Lmh0
+bWwACgkQttywLM0aUrlgiQf/fskwiyKtKS2ikqsiw6rqo9RP3A6AGJ3LQivpekV3
+elKxeu22L99yjkCEKHtggMmVd+Q9z9Pmvmx1d4EcVRtj7N86CcrQnPFbvUaiZ22g
+CDS61BCbnItzeo3nkOhbJtCU2AXHwBCx2c1uGNzR5qJoymXo92FIp7JxKJ3hHZDW
+E2XnX41bNwzZtycfZuk5VB29MIiEIIGbR/Y8rq7KwWQdyQ8y5i6Jnq5hPqRVpvMa
+gcA9ycOINkf6FqK0RHOjpxXgTHPjQudrlrhbbSOW5AQdsVGo+kJU/S+eYjPO1QLO
+AcVX1xDHmBIYUwY3wxIVUXUwiGScNuKHATAwm8SFZuzTqIkCHAQQAQgABgUCVNw4
+rgAKCRAekxDZrc5gZUqFD/44Ze4ow4ehRZ9P359WNwRKkOMmG/tMCq5boe6Sx+eo
+n3dO8zlR6WZfRdlqbYWD4lUAN1H1zKbX/EmBcHiT01d4MAk3E3JqsmVKnhoEAj1D
+9/UryQlsLPuGgtbocoCxo2yg3dgTsbUiuOhYeRtp+zqdck55Y9awU1xi5MLHOryN
+yAtWqncxMSDF6e4R17+RNUZqDykJQhjTAm2V+OQiWZ3ro15T0rYpy+2de5zCgZKK
+E3rZyaLYNjOaF3jRGvZfTRFyhsIyHxksoDfICUHayeTpHeLR6oczai14Eg6HG9TD
+DfNNEKOWNU6m1O9kSJ8Q+Ow+khVchSF6UY0gPl6o7SFukoybhm9A6WpRnGhgACUd
+X84jzMNydrf7yp9AqUWohmOth2GSc+owDoQCjuIFEjLJr0Ic+YFP0WD8ZMIrXhtG
++muv0mE4qqo0JJgC9rdZk9vt6SSzuA6Wg/Hb7lbkcNOwGysb2xnL5Czjqpl0LPfX
+GngYgQVLQ9Gf3x/Ev4BIgnmzTxfCkTjRw2omL4mtCQJsajGLmwPNjX0SBKw57h8L
+6olljgrzzKZf6hV2EGsTvfp9l1WJlLGD24WVUNnC0y4XlRO/zym1mCq8aLcnr+63
+BIsZZPvUToun7PvgIyxjtf3Y9FLKlh7IxzZzcWZT+GJg0eLd2JMUrSE07jSn8Ot7
+N4kCHAQQAQgABgUCVN/l8gAKCRAWf9Q0wEOjE1iVEADAQPNGvhvvVMONiYZ3hIfv
+2Te7yOIWduPtvzykXovK+pzwwFdGs0BqreVMo7dnONecj53svvRwHU1XD/oMDDYV
+Xfy5mfmM4ffIID77tA37bVblMApkwFWm573oaTFJhHH6VkI9Kb1/ST4wl9T8QdJr
+Mkrdkr/2ypl6AHOFuI1A+VuAAKooZ34outAdzZgFBZEobBgHcZEwatarNLP+bl6b
+1U8rYFUeKra9pFEcIIOEfa+OVumtPyh6bue2CBrhgCh1EhiF9sD8PxxGzx9ZH2ws
+gUfXwKVmoE/bDsuWP7HJkpRFWRHeDgqohVCwUXqFaqwq4up6dWm0Js/wbZp87kzF
+aMjzTp98Nr3akNRO636MXxNip6JHNNxGuI5TAbXGXG3Foh5b57bOfS3zc/g4328/
+6ehA+DDct+aBlrhEfSYGdZ3Ss28IRcsxY9Xpx1ouKXY3g51pJYzTTrLCQ28YVV3I
+mvzA6Pi6vaSrIoCtHfNqONloGo3QF/1zleAGFGz0AmVCckTDk/QvxYG842LjMjtk
+XhsZpLUUmEE11ore6ZaFqDcWba/Ob81/Cp9yibp8WNyO2kj5vs6peStTp0mPoPbW
+mX+43QAYcoIeVcePgizDpk84+esn2XX/NbK0vE+eNXZF2oxUsOBjoWbezD1X7+Ym
+z40Ry5H5OuaCwkkR0Id37IkCYQQTAQoASwUCUyJ5+iMaaHR0cDovL3d3dy5yYXRo
+Lm9yZy9ncGdwb2xpY3kuaHRtbAIbAwUJEswDAAULCQgHAwUVCgkICwUWAgMBAAIe
+AQIXgAAKCRDRE/ysPE5Zn+l4EADTvsHUBaIqTjakIkYy8P2mvgJ/YqeDi2bcdXFM
+dFxNkhTiL/YlEoMelaUQoFUo0yKn6bMhYTtsCXohqKIb5hup1wDDjfhShxyWm9zP
+FrI/8O66tydnEgjr0X45WWU6ull2YuWzabRCg/2NRSxnbYLglSnoAJCmjs1iVb35
+nOxj1xv3QJHsr6jETxGkLKoL4eolcphRr0RycNr1gZT3xXtgLBNoePEpwS9RHHph
+HTbzXxQfQmIIHoI/FIwSSBYgzTPiRVsR5nrCPhfhzvhGIiFwPimDfcrkMfnl9ge0
+QPLxD5tkect20MzIXgZu8t11URJEElS6tRikndfDCx/m8NkHTKkxg16ANeZxpJSi
++zFTLMljqVHrA0bwwVI+VR2IcL/oPjQXIwj3HHj4q42YpE6qB9vlFQeIM+W9ZIOq
+isOsCNpaijKs4BQkANREFwfaQBPcfTNoQV4oQO8OEJzhFTM2QUPFMZkg8mD/FAIU
+03d3kfWZMqrMQUj4SdOrhEcsheX3coUji6b7brZIp2EF47CE8yCtPYs5U+sEaQFe
+5ue/yh1k8MFrzhk+BDmelOaZBiyHAMeJzqx5pd2SisM5qrO2eo5aTPE7/lsEjzBl
+Iy4dRfu1GYMU4VP3DzSHRZPXwa0TahZJY5orlfyyoip844p68djEBvO3sZOBQr7Q
+RjAaIbkCDQRTInn6ARAAwL+oAUxGacCUctUxjdInq+HK/9EYV1KDOgsUV6JQfMF8
+nTJNXEYg8xsi7BXGtBf0JL0n4TyVnVGBS2vaR3c4+xCvTTxEyOcgqyVeKp1Hh61w
+QYbnlbhANrT2dKItG/dwgZHVeDfW1ARrgsBFF7L97OuHruipK8n9ibPruPS4szGM
+rBS6Fvdt1bPX258D1Y5Z2MrvQkjAOlynIKrgxMC1BiFNUH6ktukXmKgbpiPG8ZuZ
+Bk+60e2IkvXB5gp5dcNvJ0hd1xWpuMJeThUdwwQqA79Kf7LStmltqlbphGzbAMQy
+7DJBJpHMm55HwG6AUMDuDh9H1cLs891a5wyPgGzHFMlMUy3hJMI/LZO4L/oxRidF
+cRrPsIaXWP8Ot85no3+QguQNRiuNNDTLZv8L+ExNBDHfVbg9gdqZr0gfZQHBQIE2
+7XHfOvc7z7PMd2BtsGM/kKh3UTAZfgiZSgZSOZAOBRqb6dG2nTqxi+tTN0lhStQl
+9TpN39NqMa9NJPjzzRU2dLdTRVX/S9R2hAWLG97sPUxBRSfCbEBeZsj8QwLhkkoy
+pzaX39Hzq3jwm9ekUAlJwNXwyEgLD+K2DctTyF6yeUfuKjXOu+YC86EvXvPcmu7+
+aVPLdHv3Flyao6b7xapZx5c01FoK0bqPEHK4AopfyZ4kQyk/lxyMAbtdHFeYk30A
+EQEAAYkCSQQYAQoAMwUCUyJ5+iMaaHR0cDovL3d3dy5yYXRoLm9yZy9ncGdwb2xp
+Y3kuaHRtbAIbDAUJEswDAAAKCRDRE/ysPE5ZnwbXD/920l474IxY/HKcHNFwat42
+IMWHIAI61+CrL2ZKN7Ou13qBdMRMc9zUYrD4EifXen5WotTgwEKKmCIDnCKcVxRp
+iGEocOXXW1dvUTEJA+2xJRfkEgv9jsO2Q9ftTtC1SD08/h3tiA5aF103ZkYnZdCC
+bz3WcgW01aOs1l/IxVtdT8+ZgtJUT43zOJWN5p6J8Egnb8vAD87UPNnVmyDfpW2t
+GThfIrepWdve0hx1W1FrUsCVT5/suZvFMpAQaX4Tv50Sk3+g/77bwhe/OWJZyIJM
+sHCNlcJW+QM3r28+mcNc5WiX1r2TdjGZBN3gWv23Vj8hhhS7w4jVWe/7pB/v67J2
+mZozVeUgfWR66HfXmCS+W1OrIELKyZFDNgxxnct9vx6/wCHqX0RRqdTe7FJw0WKF
+vDUhuKU7B/CVSXooF39wgBx7iD7FVTtstPrzYte/VbPZz5nyHQppSFUHW6bFJG0N
+dqpfvQts7RDoWJwS4RPqXUTkCKOSQjVuK+nl24M/awFwxdS0zDrHwd5zOsxhufqL
+4xRsrS5p5QfeUrcNOIYSEF75DLFxRfMHUP/icJcJs8LuTAFMtZqL7kbWok7wdRYm
+O8mez/FvNTRSo85TlUzR3Fc4xZndBJ3P9vDkvWpKPfuXpiBfCuX9TFYSVolnnl2c
+ol5xay+f7P0XVpxLkO+fCw==
+=gOOn
+-----END PGP PUBLIC KEY BLOCK-----
--- /dev/null
+version=4
+opts=uversionmangle=s/^(SNAPSHOT|RELEASE)\.//;s/(\d+)[_-](\d+)[_-](\d+)/\$1.\$2.\$3/;s/(\d+)[_-](\d+)/\$1.\$2/;s/(\d)[_\.\-\+]?((rc|pre|dev|beta|alpha|b|a)[\-\.]?\d*)$/$1~$2/;s/(\d)[_\.\-\+]?RC[\-\.]?(\d*)$/$1~rc$2/,\
+dversionmangle=s/\+(debian|dfsg|ds|deb)(\.?\d+)?$//i,\
+pgpsigurlmangle=s/$/.asc/ \
+https://github.com/libfuse/libfuse/tags \
+(?:|.*/)fuse-[vV]?(\d\S*)@ARCHIVE_EXT@