From: Laszlo Boszormenyi (GCS) Date: Mon, 19 May 2025 18:39:08 +0000 (+0200) Subject: fuse3 (3.17.2-2) unstable; urgency=medium X-Git-Tag: archive/raspbian/3.17.2-2+rpi1^2~6 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=4f1a3a7c8a7d915e27c080324a1d40211a01707b;p=fuse3.git 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 ] * Update -latomic architecture list (closes: #1105150). [dgit import unpatched fuse3 3.17.2-2] --- 4f1a3a7c8a7d915e27c080324a1d40211a01707b diff --cc debian/NEWS index 0000000,0000000..196ba52 new file mode 100644 --- /dev/null +++ b/debian/NEWS @@@ -1,0 -1,0 +1,9 @@@ ++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 Wed, 12 Jun 2024 13:41:27 +0200 diff --cc debian/changelog index 0000000,0000000..0430c95 new file mode 100644 --- /dev/null +++ b/debian/changelog @@@ -1,0 -1,0 +1,346 @@@ ++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 ] ++ * Update -latomic architecture list (closes: #1105150). ++ ++ -- Laszlo Boszormenyi (GCS) 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) 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) 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) 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) 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) 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) 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) Fri, 14 Feb 2025 22:49:04 +0100 ++ ++fuse3 (3.14.0-10) unstable; urgency=medium ++ ++ [ Helmut Grohne ] ++ * Upgrade Breaks for fuse to Conflicts to prevent accidental file loss ++ (DEP17, closes: #1082357). ++ ++ -- Laszlo Boszormenyi (GCS) 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) Sun, 15 Sep 2024 08:00:33 +0200 ++ ++fuse3 (3.14.0-8) unstable; urgency=medium ++ ++ [ Jeremy Bícha ] ++ * Provide fuse transitional package for upgrade (closes: #918984, #927291, ++ #1074767, #1081537). ++ ++ -- Laszlo Boszormenyi (GCS) 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) 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) 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) 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) Tue, 18 Apr 2023 23:07:15 +0200 ++ ++fuse3 (3.14.0-3) unstable; urgency=medium ++ ++ [ Helge Deller ] ++ * 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) 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) 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) Fri, 17 Feb 2023 19:50:40 +0100 ++ ++fuse3 (3.13.1-1) unstable; urgency=medium ++ ++ * New upstream release. ++ ++ -- Laszlo Boszormenyi (GCS) 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) Sun, 22 Jan 2023 08:17:08 +0100 ++ ++fuse3 (3.13.0-1) unstable; urgency=medium ++ ++ * New upstream release. ++ ++ -- Laszlo Boszormenyi (GCS) 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) 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) Sat, 07 May 2022 16:30:30 +0200 ++ ++fuse3 (3.10.5-1) unstable; urgency=medium ++ ++ * New upstream release. ++ ++ -- Laszlo Boszormenyi (GCS) Thu, 16 Sep 2021 17:41:27 +0200 ++ ++fuse3 (3.10.4-1) unstable; urgency=medium ++ ++ * New upstream release. ++ ++ -- Laszlo Boszormenyi (GCS) 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) 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) 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 ] ++ * Allow one to build without udeb package (closes: #983438). ++ ++ -- Laszlo Boszormenyi (GCS) Wed, 24 Feb 2021 23:28:30 +0100 ++ ++fuse3 (3.10.2-1) unstable; urgency=medium ++ ++ * New upstream release. ++ ++ -- Laszlo Boszormenyi (GCS) Mon, 08 Feb 2021 21:21:32 +0100 ++ ++fuse3 (3.10.1-3) unstable; urgency=medium ++ ++ * Update debhelper level to 13 . ++ ++ [ Stephen Kitt ] ++ * 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) 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 ] ++ * Fix FTBFS on kFreeBSD (closes: #980213). ++ ++ -- Laszlo Boszormenyi (GCS) 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) Fri, 01 Jan 2021 15:32:48 +0100 ++ ++fuse3 (3.10.0-1) unstable; urgency=medium ++ ++ * New upstream release. ++ ++ -- Laszlo Boszormenyi (GCS) Sun, 11 Oct 2020 23:01:33 +0200 ++ ++fuse3 (3.9.3-1) unstable; urgency=medium ++ ++ * New upstream release. ++ ++ -- Laszlo Boszormenyi (GCS) 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 ] ++ * Run tests form the correct directory and make them non fatal ++ (closes: #956592). ++ ++ -- Laszlo Boszormenyi (GCS) 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) 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 ] ++ * Add version for Provides: fuse (closes: #943896). ++ ++ -- Laszlo Boszormenyi (GCS) 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) 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) 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 ] ++ * Make "fuse3" to replace "fuse", instead of conflict (closes: #912528). ++ ++ -- Laszlo Boszormenyi (GCS) 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) 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) Sat, 21 Jul 2018 14:11:44 +0000 diff --cc debian/clean index 0000000,0000000..c612857 new file mode 100644 --- /dev/null +++ b/debian/clean @@@ -1,0 -1,0 +1,2 @@@ ++config.rpath ++util/mount_util.c diff --cc debian/control index 0000000,0000000..12b3202 new file mode 100644 --- /dev/null +++ b/debian/control @@@ -1,0 -1,0 +1,95 @@@ ++Source: fuse3 ++Section: utils ++Priority: optional ++Maintainer: Laszlo Boszormenyi (GCS) ++Build-Depends: ++ debhelper-compat (= 13), ++ pkgconf, ++ meson, ++ systemd-dev, ++ python3 , ++ python3-pytest ++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: ++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. diff --cc debian/copyright index 0000000,0000000..8b62c67 new file mode 100644 --- /dev/null +++ b/debian/copyright @@@ -1,0 -1,0 +1,87 @@@ ++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 , ++ 2001-2013 Miklos Szeredi ++License: GPL-2 ++ ++Files: lib/* ++Copyright: 2001-2013 Miklos Szeredi ++License: LGPL-2.1 ++ ++Files: example/passthrough.c example/passthrough_fh.c ++License: GPL-2 ++Copyright: Copyright (C) 2001-2007 Miklos Szeredi , ++ Copyright (C) 2011 Sebastian Pipping ++ ++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 ++ ++Files: debian/* ++Copyright: 2014- Laszlo Boszormenyi (GCS) , ++ 2011-2014 Daniel Baumann ++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 . ++ . ++ 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 . ++ . ++ 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 . ++ . ++ On Debian systems, the complete text of the GNU Lesser General ++ Public License can be found in `/usr/share/common-licenses/LGPL-2.1'. diff --cc debian/examples/Makefile index 0000000,0000000..4ac1685 new file mode 100644 --- /dev/null +++ b/debian/examples/Makefile @@@ -1,0 -1,0 +1,17 @@@ ++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) diff --cc debian/fuse3-udeb.install index 0000000,0000000..e611e5c new file mode 100644 --- /dev/null +++ b/debian/fuse3-udeb.install @@@ -1,0 -1,0 +1,2 @@@ ++usr/bin/fusermount3 ++usr/sbin/mount.fuse3 diff --cc debian/fuse3.install index 0000000,0000000..277e341 new file mode 100644 --- /dev/null +++ b/debian/fuse3.install @@@ -1,0 -1,0 +1,3 @@@ ++usr/bin/fusermount3 ++usr/sbin/mount.fuse3 ++etc/fuse.conf diff --cc debian/fuse3.links index 0000000,0000000..d7b2758 new file mode 100644 --- /dev/null +++ b/debian/fuse3.links @@@ -1,0 -1,0 +1,4 @@@ ++/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 diff --cc debian/fuse3.manpages index 0000000,0000000..b06a58e new file mode 100644 --- /dev/null +++ b/debian/fuse3.manpages @@@ -1,0 -1,0 +1,2 @@@ ++usr/share/man/man1/fusermount3.1 ++usr/share/man/man8/mount.fuse3.8 diff --cc debian/fuse3.postinst index 0000000,0000000..4ac335c new file mode 100644 --- /dev/null +++ b/debian/fuse3.postinst @@@ -1,0 -1,0 +1,52 @@@ ++#!/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 diff --cc debian/fuse3.postrm index 0000000,0000000..c17995a new file mode 100644 --- /dev/null +++ b/debian/fuse3.postrm @@@ -1,0 -1,0 +1,28 @@@ ++#!/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 diff --cc debian/fuse3.preinst index 0000000,0000000..d2341bb new file mode 100644 --- /dev/null +++ b/debian/fuse3.preinst @@@ -1,0 -1,0 +1,16 @@@ ++#!/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 diff --cc debian/libfuse3-4-udeb.install index 0000000,0000000..3de3b10 new file mode 100644 --- /dev/null +++ b/debian/libfuse3-4-udeb.install @@@ -1,0 -1,0 +1,1 @@@ ++usr/lib/*/*.so.* diff --cc debian/libfuse3-4.docs index 0000000,0000000..0135531 new file mode 100644 --- /dev/null +++ b/debian/libfuse3-4.docs @@@ -1,0 -1,0 +1,3 @@@ ++README.md ++doc/README.NFS ++doc/*.txt diff --cc debian/libfuse3-4.install index 0000000,0000000..3de3b10 new file mode 100644 --- /dev/null +++ b/debian/libfuse3-4.install @@@ -1,0 -1,0 +1,1 @@@ ++usr/lib/*/*.so.* diff --cc debian/libfuse3-4.symbols index 0000000,0000000..4494859 new file mode 100644 --- /dev/null +++ b/debian/libfuse3-4.symbols @@@ -1,0 -1,0 +1,11 @@@ ++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 diff --cc debian/libfuse3-dev.examples index 0000000,0000000..5dc4562 new file mode 100644 --- /dev/null +++ b/debian/libfuse3-dev.examples @@@ -1,0 -1,0 +1,4 @@@ ++example/*.c ++example/*.h ++ ++debian/examples/* diff --cc debian/libfuse3-dev.install index 0000000,0000000..ef0894d new file mode 100644 --- /dev/null +++ b/debian/libfuse3-dev.install @@@ -1,0 -1,0 +1,4 @@@ ++usr/include ++usr/lib/*/pkgconfig ++usr/lib/*/*.so ++usr/lib/*/*.a diff --cc debian/local/fuse.conf index 0000000,0000000..ae194a0 new file mode 100644 --- /dev/null +++ b/debian/local/fuse.conf @@@ -1,0 -1,0 +1,8 @@@ ++# /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 diff --cc debian/local/fuse.hook index 0000000,0000000..e96afd9 new file mode 100644 --- /dev/null +++ b/debian/local/fuse.hook @@@ -1,0 -1,0 +1,24 @@@ ++#!/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 diff --cc debian/local/fuse.kmod index 0000000,0000000..a517c48 new file mode 100644 --- /dev/null +++ b/debian/local/fuse.kmod @@@ -1,0 -1,0 +1,1 @@@ ++fuse diff --cc debian/not-installed index 0000000,0000000..8d1cca1 new file mode 100644 --- /dev/null +++ b/debian/not-installed @@@ -1,0 -1,0 +1,2 @@@ ++debian/tmp/etc/init.d/fuse3 ++debian/tmp/usr/lib/udev/rules.d/99-fuse3.rules diff --cc debian/patches/Add-container_of-and-ROUND_UP-macros.patch index 0000000,0000000..620ddec new file mode 100644 --- /dev/null +++ b/debian/patches/Add-container_of-and-ROUND_UP-macros.patch @@@ -1,0 -1,0 +1,61 @@@ ++From d6a9799fc04e6ada5fd7fd7bbde14fb14981fc8b Mon Sep 17 00:00:00 2001 ++From: Bernd Schubert ++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 ++(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 diff --cc debian/patches/Fix-fuse_apply_conn_info_opts.patch index 0000000,0000000..58a9bfd new file mode 100644 --- /dev/null +++ b/debian/patches/Fix-fuse_apply_conn_info_opts.patch @@@ -1,0 -1,0 +1,559 @@@ ++From 066e8111f0ff522e4682a31bd63b5a3532e8af86 Mon Sep 17 00:00:00 2001 ++From: Bernd Schubert ++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 ++--- ++ 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 ++ #include ++ +++#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 ++ ++ 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 +++#include ++ ++ #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 ++ #include ++ #include ++ #include +++#include ++ ++ 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); diff --cc debian/patches/Fix_meson_function_tests.patch index 0000000,0000000..a1263c6 new file mode 100644 --- /dev/null +++ b/debian/patches/Fix_meson_function_tests.patch @@@ -1,0 -1,0 +1,117 @@@ ++From 1df74208ea060b32e11b14e9b97049207ed03dd3 Mon Sep 17 00:00:00 2001 ++From: Bernd Schubert ++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 " : 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 ++Signed-off-by: Giulio Benetti ++--- ++ 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 ++ #include ++ #include +++#include /* For static_assert */ +++#include /* 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 ')) ++-private_cfg.set('HAVE_ICONV', ++- cc.has_function('iconv', prefix: '#include ')) ++-private_cfg.set('HAVE_BACKTRACE', ++- cc.has_function('backtrace', prefix: '#include ')) ++ ++-# Test if headers exist ++-private_cfg.set('HAVE_LINUX_CLOSE_RANGE_H', ++- cc.check_header('#include ')) +++# Special case checks that need custom code +++special_funcs = { +++ 'static_assert': ''' +++ #include +++ static_assert(1, "test"); +++ int main(void) { return 0; } +++ ''', +++ 'pthread_setname_np': ''' +++ #include +++ int main(void) { +++ pthread_t thread = pthread_self(); +++ pthread_setname_np(thread, "test"); +++ return 0; +++ } +++ ''', +++ 'close_range': ''' +++ #include +++ #include +++ #include +++ 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 ')) +++private_cfg.set('HAVE_ICONV', +++ cc.has_function('iconv', prefix: '#include ')) +++private_cfg.set('HAVE_BACKTRACE', +++ cc.has_function('backtrace', prefix: '#include ')) ++ ++-# 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 ', +++ 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 ', +++ args: args_default)) ++ ++ # ++ # Compiler configuration diff --cc debian/patches/Make_conn-want-want_ext_conversion_non_fatal.patch index 0000000,0000000..8e17ec2 new file mode 100644 --- /dev/null +++ b/debian/patches/Make_conn-want-want_ext_conversion_non_fatal.patch @@@ -1,0 -1,0 +1,92 @@@ ++From 28a6e40302fbd3eeac1aee9434e1bcf69b1a8e25 Mon Sep 17 00:00:00 2001 ++From: Bernd Schubert ++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 ++--- ++ 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)) { diff --cc debian/patches/meson.build-make-special_funcs-check-more-reliable.patch index 0000000,0000000..1ee84c7 new file mode 100644 --- /dev/null +++ b/debian/patches/meson.build-make-special_funcs-check-more-reliable.patch @@@ -1,0 -1,0 +1,37 @@@ ++From 8e226c6af6f386a88ed53d0a0940ff6b869b372d Mon Sep 17 00:00:00 2001 ++From: Giulio Benetti ++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 ++--- ++ 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 ++ diff --cc debian/patches/series index 0000000,0000000..5adfbb0 new file mode 100644 --- /dev/null +++ b/debian/patches/series @@@ -1,0 -1,0 +1,5 @@@ ++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 diff --cc debian/rules index 0000000,0000000..fcac031 new file mode 100755 --- /dev/null +++ b/debian/rules @@@ -1,0 -1,0 +1,69 @@@ ++#!/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 diff --cc debian/source/format index 0000000,0000000..163aaf8 new file mode 100644 --- /dev/null +++ b/debian/source/format @@@ -1,0 -1,0 +1,1 @@@ ++3.0 (quilt) diff --cc debian/upstream/metadata index 0000000,0000000..0b26a50 new file mode 100644 --- /dev/null +++ b/debian/upstream/metadata @@@ -1,0 -1,0 +1,6 @@@ ++--- ++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 diff --cc debian/upstream/signing-key.asc index 0000000,0000000..c31f5c4 new file mode 100644 --- /dev/null +++ b/debian/upstream/signing-key.asc @@@ -1,0 -1,0 +1,85 @@@ ++-----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----- diff --cc debian/watch index 0000000,0000000..8df1acc new file mode 100644 --- /dev/null +++ b/debian/watch @@@ -1,0 -1,0 +1,6 @@@ ++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@