--- /dev/null
--- /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
--- /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
--- /dev/null
++config.rpath
++util/mount_util.c
--- /dev/null
--- /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
--- /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
--- /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
--- /dev/null
++usr/bin/fusermount3
++usr/sbin/mount.fuse3
--- /dev/null
--- /dev/null
++usr/bin/fusermount3
++usr/sbin/mount.fuse3
++etc/fuse.conf
--- /dev/null
--- /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
--- /dev/null
++usr/share/man/man1/fusermount3.1
++usr/share/man/man8/mount.fuse3.8
--- /dev/null
--- /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
--- /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
--- /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
--- /dev/null
++usr/lib/*/*.so.*
--- /dev/null
--- /dev/null
++README.md
++doc/README.NFS
++doc/*.txt
--- /dev/null
--- /dev/null
++usr/lib/*/*.so.*
--- /dev/null
--- /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
--- /dev/null
++example/*.c
++example/*.h
++
++debian/examples/*
--- /dev/null
--- /dev/null
++usr/include
++usr/lib/*/pkgconfig
++usr/lib/*/*.so
++usr/lib/*/*.a
--- /dev/null
--- /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
--- /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
--- /dev/null
++fuse
--- /dev/null
--- /dev/null
++debian/tmp/etc/init.d/fuse3
++debian/tmp/usr/lib/udev/rules.d/99-fuse3.rules
--- /dev/null
--- /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
--- /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
--- /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
--- /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
--- /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
--- /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
--- /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
--- /dev/null
++3.0 (quilt)
--- /dev/null
--- /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
--- /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
++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
++ol5xay+f7P0XVpxLkO+fCw==
++=gOOn
++-----END PGP PUBLIC KEY BLOCK-----
--- /dev/null
--- /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@