fuse3 (3.17.2-2) unstable; urgency=medium
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)
  [ 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).

[dgit import unpatched fuse3 3.17.2-2]

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

diff --cc debian/NEWS
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..196ba52f23ab3776e7fd06fff8da2b7e1b707cfa
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -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 <helmut@subdivi.de>  Wed, 12 Jun 2024 13:41:27 +0200
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..0430c95724257b45337fdcf461fdde91d394d0f6
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -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 <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 --cc debian/clean
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..c6128579cf3d68dd06773bc192d4933627913210
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++config.rpath
++util/mount_util.c
diff --cc debian/control
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..12b320233729aaae47532ba74078c8b8a5a9cbed
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,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.
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..8b62c671459b916e0984f7ff7663bd849a102e1e
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -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 <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'.
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..4ac16858cb6e48639d5a36b4c97ba816fe8c0fac
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -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)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e611e5c8bf3ad9a075d2efaf34e0280652f0ed5c
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++usr/bin/fusermount3
++usr/sbin/mount.fuse3
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..277e3418fa29ebc24582bd3a837e24e36e1b67bf
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,3 @@@
++usr/bin/fusermount3
++usr/sbin/mount.fuse3
++etc/fuse.conf
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..d7b27588e0250b8bdad2f2823b199e422652a3e2
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -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
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..b06a58eadd287409fbb701b19275b317fa3cdafe
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++usr/share/man/man1/fusermount3.1
++usr/share/man/man8/mount.fuse3.8
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..4ac335caf9a4017d852c5818b9eb8450a7851124
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -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
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..c17995ab1936c8171965b28988736d0e1ddf439d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -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
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..d2341bb4d9debc9e323fe122eb0db339587e8f4c
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -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
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..3de3b10a49844edfe7e12e2fde3eb1357306fbfc
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++usr/lib/*/*.so.*
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..013553137845d542cf682d531e83864ec6d70e3f
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,3 @@@
++README.md
++doc/README.NFS
++doc/*.txt
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..3de3b10a49844edfe7e12e2fde3eb1357306fbfc
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++usr/lib/*/*.so.*
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..4494859225bb14dbfa67808563ac9f5e30e123e3
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -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
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5dc456261e3f59f65025352b3eef0f897143a1a9
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++example/*.c
++example/*.h
++
++debian/examples/*
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..ef0894d33b13d83db7e2073237250aeebf92599b
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++usr/include
++usr/lib/*/pkgconfig
++usr/lib/*/*.so
++usr/lib/*/*.a
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..ae194a07105be3818d7e0fab40baf825477de861
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -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
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e96afd90a0f053d8bc5b7d3f32a897d3c06a1bc8
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -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
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a517c488f34950bf2f440bd49e2519e4a8149ec1
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++fuse
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..8d1cca133189800a6774d57c69a94f4619bc1c05
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++debian/tmp/etc/init.d/fuse3
++debian/tmp/usr/lib/udev/rules.d/99-fuse3.rules
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..620ddece65c1893b777ddf4db28a01bb2dfd1ab8
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,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
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..58a9bfdeb3c20b09be8a52cc057d43038eadcd4b
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,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);
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a1263c6e54c2f3a2834d06f8626bee164f492a62
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,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
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..8e17ec2d447b8a91e8b264fdf0665b936ec61371
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,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)) {
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..1ee84c7b77bffb739033ca743d1b4fa36c18ab2a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,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
++ 
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5adfbb0b1d26ff7d62a02c2247ac96f04db24ea3
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -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 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..fcac03136ac8e89136b964f2736b01dc92477a73
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -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
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..163aaf8d82b6c54f23c45f32895dbdfdcc27b047
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++3.0 (quilt)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..0b26a503e51fbe3b3a373308838c0c2c28b15625
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -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
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..c31f5c44794cd46a83d382e29bb12b98c621f20b
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -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 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..8df1acc02207924ec64f5f75ece7acf4f761d678
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -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@