Import fuse3_3.17.2-2.debian.tar.xz
authorLaszlo Boszormenyi (GCS) <gcs@debian.org>
Mon, 19 May 2025 18:39:08 +0000 (20:39 +0200)
committerLaszlo Boszormenyi (GCS) <gcs@debian.org>
Mon, 19 May 2025 18:39:08 +0000 (20:39 +0200)
[dgit import tarball fuse3 3.17.2-2 fuse3_3.17.2-2.debian.tar.xz]

34 files changed:
NEWS [new file with mode: 0644]
changelog [new file with mode: 0644]
clean [new file with mode: 0644]
control [new file with mode: 0644]
copyright [new file with mode: 0644]
examples/Makefile [new file with mode: 0644]
fuse3-udeb.install [new file with mode: 0644]
fuse3.install [new file with mode: 0644]
fuse3.links [new file with mode: 0644]
fuse3.manpages [new file with mode: 0644]
fuse3.postinst [new file with mode: 0644]
fuse3.postrm [new file with mode: 0644]
fuse3.preinst [new file with mode: 0644]
libfuse3-4-udeb.install [new file with mode: 0644]
libfuse3-4.docs [new file with mode: 0644]
libfuse3-4.install [new file with mode: 0644]
libfuse3-4.symbols [new file with mode: 0644]
libfuse3-dev.examples [new file with mode: 0644]
libfuse3-dev.install [new file with mode: 0644]
local/fuse.conf [new file with mode: 0644]
local/fuse.hook [new file with mode: 0644]
local/fuse.kmod [new file with mode: 0644]
not-installed [new file with mode: 0644]
patches/Add-container_of-and-ROUND_UP-macros.patch [new file with mode: 0644]
patches/Fix-fuse_apply_conn_info_opts.patch [new file with mode: 0644]
patches/Fix_meson_function_tests.patch [new file with mode: 0644]
patches/Make_conn-want-want_ext_conversion_non_fatal.patch [new file with mode: 0644]
patches/meson.build-make-special_funcs-check-more-reliable.patch [new file with mode: 0644]
patches/series [new file with mode: 0644]
rules [new file with mode: 0755]
source/format [new file with mode: 0644]
upstream/metadata [new file with mode: 0644]
upstream/signing-key.asc [new file with mode: 0644]
watch [new file with mode: 0644]

diff --git a/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..196ba52
--- /dev/null
+++ b/NEWS
@@ -0,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 <helmut@subdivi.de>  Wed, 12 Jun 2024 13:41:27 +0200
diff --git a/changelog b/changelog
new file mode 100644 (file)
index 0000000..0430c95
--- /dev/null
+++ b/changelog
@@ -0,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 <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
diff --git a/clean b/clean
new file mode 100644 (file)
index 0000000..c612857
--- /dev/null
+++ b/clean
@@ -0,0 +1,2 @@
+config.rpath
+util/mount_util.c
diff --git a/control b/control
new file mode 100644 (file)
index 0000000..12b3202
--- /dev/null
+++ b/control
@@ -0,0 +1,95 @@
+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.
diff --git a/copyright b/copyright
new file mode 100644 (file)
index 0000000..8b62c67
--- /dev/null
+++ b/copyright
@@ -0,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 <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'.
diff --git a/examples/Makefile b/examples/Makefile
new file mode 100644 (file)
index 0000000..4ac1685
--- /dev/null
@@ -0,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 --git a/fuse3-udeb.install b/fuse3-udeb.install
new file mode 100644 (file)
index 0000000..e611e5c
--- /dev/null
@@ -0,0 +1,2 @@
+usr/bin/fusermount3
+usr/sbin/mount.fuse3
diff --git a/fuse3.install b/fuse3.install
new file mode 100644 (file)
index 0000000..277e341
--- /dev/null
@@ -0,0 +1,3 @@
+usr/bin/fusermount3
+usr/sbin/mount.fuse3
+etc/fuse.conf
diff --git a/fuse3.links b/fuse3.links
new file mode 100644 (file)
index 0000000..d7b2758
--- /dev/null
@@ -0,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 --git a/fuse3.manpages b/fuse3.manpages
new file mode 100644 (file)
index 0000000..b06a58e
--- /dev/null
@@ -0,0 +1,2 @@
+usr/share/man/man1/fusermount3.1
+usr/share/man/man8/mount.fuse3.8
diff --git a/fuse3.postinst b/fuse3.postinst
new file mode 100644 (file)
index 0000000..4ac335c
--- /dev/null
@@ -0,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 --git a/fuse3.postrm b/fuse3.postrm
new file mode 100644 (file)
index 0000000..c17995a
--- /dev/null
@@ -0,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 --git a/fuse3.preinst b/fuse3.preinst
new file mode 100644 (file)
index 0000000..d2341bb
--- /dev/null
@@ -0,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 --git a/libfuse3-4-udeb.install b/libfuse3-4-udeb.install
new file mode 100644 (file)
index 0000000..3de3b10
--- /dev/null
@@ -0,0 +1 @@
+usr/lib/*/*.so.*
diff --git a/libfuse3-4.docs b/libfuse3-4.docs
new file mode 100644 (file)
index 0000000..0135531
--- /dev/null
@@ -0,0 +1,3 @@
+README.md
+doc/README.NFS
+doc/*.txt
diff --git a/libfuse3-4.install b/libfuse3-4.install
new file mode 100644 (file)
index 0000000..3de3b10
--- /dev/null
@@ -0,0 +1 @@
+usr/lib/*/*.so.*
diff --git a/libfuse3-4.symbols b/libfuse3-4.symbols
new file mode 100644 (file)
index 0000000..4494859
--- /dev/null
@@ -0,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 --git a/libfuse3-dev.examples b/libfuse3-dev.examples
new file mode 100644 (file)
index 0000000..5dc4562
--- /dev/null
@@ -0,0 +1,4 @@
+example/*.c
+example/*.h
+
+debian/examples/*
diff --git a/libfuse3-dev.install b/libfuse3-dev.install
new file mode 100644 (file)
index 0000000..ef0894d
--- /dev/null
@@ -0,0 +1,4 @@
+usr/include
+usr/lib/*/pkgconfig
+usr/lib/*/*.so
+usr/lib/*/*.a
diff --git a/local/fuse.conf b/local/fuse.conf
new file mode 100644 (file)
index 0000000..ae194a0
--- /dev/null
@@ -0,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 --git a/local/fuse.hook b/local/fuse.hook
new file mode 100644 (file)
index 0000000..e96afd9
--- /dev/null
@@ -0,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 --git a/local/fuse.kmod b/local/fuse.kmod
new file mode 100644 (file)
index 0000000..a517c48
--- /dev/null
@@ -0,0 +1 @@
+fuse
diff --git a/not-installed b/not-installed
new file mode 100644 (file)
index 0000000..8d1cca1
--- /dev/null
@@ -0,0 +1,2 @@
+debian/tmp/etc/init.d/fuse3
+debian/tmp/usr/lib/udev/rules.d/99-fuse3.rules
diff --git a/patches/Add-container_of-and-ROUND_UP-macros.patch b/patches/Add-container_of-and-ROUND_UP-macros.patch
new file mode 100644 (file)
index 0000000..620ddec
--- /dev/null
@@ -0,0 +1,61 @@
+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
diff --git a/patches/Fix-fuse_apply_conn_info_opts.patch b/patches/Fix-fuse_apply_conn_info_opts.patch
new file mode 100644 (file)
index 0000000..58a9bfd
--- /dev/null
@@ -0,0 +1,559 @@
+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);
diff --git a/patches/Fix_meson_function_tests.patch b/patches/Fix_meson_function_tests.patch
new file mode 100644 (file)
index 0000000..a1263c6
--- /dev/null
@@ -0,0 +1,117 @@
+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
diff --git a/patches/Make_conn-want-want_ext_conversion_non_fatal.patch b/patches/Make_conn-want-want_ext_conversion_non_fatal.patch
new file mode 100644 (file)
index 0000000..8e17ec2
--- /dev/null
@@ -0,0 +1,92 @@
+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)) {
diff --git a/patches/meson.build-make-special_funcs-check-more-reliable.patch b/patches/meson.build-make-special_funcs-check-more-reliable.patch
new file mode 100644 (file)
index 0000000..1ee84c7
--- /dev/null
@@ -0,0 +1,37 @@
+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
diff --git a/patches/series b/patches/series
new file mode 100644 (file)
index 0000000..5adfbb0
--- /dev/null
@@ -0,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 --git a/rules b/rules
new file mode 100755 (executable)
index 0000000..fcac031
--- /dev/null
+++ b/rules
@@ -0,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 --git a/source/format b/source/format
new file mode 100644 (file)
index 0000000..163aaf8
--- /dev/null
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/upstream/metadata b/upstream/metadata
new file mode 100644 (file)
index 0000000..0b26a50
--- /dev/null
@@ -0,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 --git a/upstream/signing-key.asc b/upstream/signing-key.asc
new file mode 100644 (file)
index 0000000..c31f5c4
--- /dev/null
@@ -0,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
+E2XnX41bNwzZtycfZuk5VB29MIiEIIGbR/Y8rq7KwWQdyQ8y5i6Jnq5hPqRVpvMa
+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
+ol5xay+f7P0XVpxLkO+fCw==
+=gOOn
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/watch b/watch
new file mode 100644 (file)
index 0000000..8df1acc
--- /dev/null
+++ b/watch
@@ -0,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@