summaryrefslogtreecommitdiff
path: root/filesystems
diff options
context:
space:
mode:
authorRobert Clausecker <fuz@FreeBSD.org>2024-09-27 12:48:46 +0200
committerRobert Clausecker <fuz@FreeBSD.org>2024-11-06 16:17:35 +0100
commit6e2da9672f79f44048d597f0f61e4646cdeade9d (patch)
treec92e4b3158e3419e8cec38e00227d08dcdaab3e9 /filesystems
parentmath/sdpa: speed up build (diff)
filesystems: add new category for file systems and related utilities
The filesystems category houses file systems and file system utilities. It is added mainly to turn the sysutils/fusefs-* pseudo-category into a proper one, but is also useful for the sundry of other file systems related ports found in the tree. Ports that seem like they belong there are moved to the new category. Two ports, sysutils/fusefs-funionfs and sysutils/fusefs-fusepak are not moved as they currently don't fetch and don't have TIMESTAMP set in their distinfo, but that is required to be able to push a rename of the port by the pre-receive hook. Approved by: portmgr (rene) Reviewed by: mat Pull Request: https://github.com/freebsd/freebsd-ports/pull/302 PR: 281988
Diffstat (limited to 'filesystems')
-rw-r--r--filesystems/Makefile144
-rw-r--r--filesystems/R-cran-fs/Makefile26
-rw-r--r--filesystems/R-cran-fs/distinfo3
-rw-r--r--filesystems/R-cran-fs/pkg-descr2
-rw-r--r--filesystems/acfgfs/Makefile22
-rw-r--r--filesystems/acfgfs/distinfo3
-rw-r--r--filesystems/acfgfs/pkg-descr2
-rw-r--r--filesystems/afuse/Makefile30
-rw-r--r--filesystems/afuse/distinfo3
-rw-r--r--filesystems/afuse/files/afuse.195
-rw-r--r--filesystems/afuse/files/patch-src_afuse.c11
-rw-r--r--filesystems/afuse/files/pkg-message.in8
-rw-r--r--filesystems/afuse/pkg-descr16
-rw-r--r--filesystems/afuse/pkg-plist3
-rw-r--r--filesystems/archivemount/Makefile28
-rw-r--r--filesystems/archivemount/distinfo3
-rw-r--r--filesystems/archivemount/files/pkg-message.in10
-rw-r--r--filesystems/archivemount/pkg-descr4
-rw-r--r--filesystems/automount/Makefile36
-rw-r--r--filesystems/automount/distinfo3
-rw-r--r--filesystems/automount/pkg-descr8
-rw-r--r--filesystems/automount/pkg-message10
-rw-r--r--filesystems/avfs/Makefile43
-rw-r--r--filesystems/avfs/distinfo3
-rw-r--r--filesystems/avfs/files/patch-scripts_mountavfs11
-rw-r--r--filesystems/avfs/files/patch-scripts_umountavfs16
-rw-r--r--filesystems/avfs/pkg-descr8
-rw-r--r--filesystems/avfs/pkg-plist51
-rw-r--r--filesystems/bindfs/Makefile28
-rw-r--r--filesystems/bindfs/distinfo3
-rw-r--r--filesystems/bindfs/pkg-descr4
-rw-r--r--filesystems/cfs/Makefile36
-rw-r--r--filesystems/cfs/distinfo3
-rw-r--r--filesystems/cfs/files/cfsd.in49
-rw-r--r--filesystems/cfs/files/pkg-message.in26
-rw-r--r--filesystems/cfs/pkg-descr9
-rw-r--r--filesystems/cfs/pkg-plist19
-rw-r--r--filesystems/chironfs/Makefile30
-rw-r--r--filesystems/chironfs/distinfo3
-rw-r--r--filesystems/chironfs/pkg-descr8
-rw-r--r--filesystems/clamfs/Makefile42
-rw-r--r--filesystems/clamfs/distinfo3
-rw-r--r--filesystems/clamfs/pkg-descr10
-rw-r--r--filesystems/clamfs/pkg-message16
-rw-r--r--filesystems/cramfs/Makefile30
-rw-r--r--filesystems/cramfs/distinfo3
-rw-r--r--filesystems/cramfs/files/patch-GNUmakefile10
-rw-r--r--filesystems/cramfs/files/patch-cramfsck.c39
-rw-r--r--filesystems/cramfs/files/patch-mkcramfs.c12
-rw-r--r--filesystems/cramfs/pkg-descr3
-rw-r--r--filesystems/cryptofs/Makefile28
-rw-r--r--filesystems/cryptofs/distinfo3
-rw-r--r--filesystems/cryptofs/pkg-descr17
-rw-r--r--filesystems/cryptofs/pkg-plist3
-rw-r--r--filesystems/curlftpfs/Makefile35
-rw-r--r--filesystems/curlftpfs/distinfo13
-rw-r--r--filesystems/curlftpfs/files/patch-ftpfs.c304
-rw-r--r--filesystems/curlftpfs/files/patch-ftpfs.h11
-rw-r--r--filesystems/curlftpfs/files/patch-path__utils.c75
-rw-r--r--filesystems/curlftpfs/files/patch-path__utils.h14
-rw-r--r--filesystems/curlftpfs/pkg-descr11
-rw-r--r--filesystems/darling-dmg/Makefile33
-rw-r--r--filesystems/darling-dmg/distinfo3
-rw-r--r--filesystems/darling-dmg/files/patch-CMakeLists.txt16
-rw-r--r--filesystems/darling-dmg/pkg-descr7
-rw-r--r--filesystems/dsbmc-cli/Makefile22
-rw-r--r--filesystems/dsbmc-cli/distinfo3
-rw-r--r--filesystems/dsbmc-cli/pkg-descr4
-rw-r--r--filesystems/dsbmc/Makefile24
-rw-r--r--filesystems/dsbmc/distinfo3
-rw-r--r--filesystems/dsbmc/files/patch-src_mainwin.cpp13
-rw-r--r--filesystems/dsbmc/pkg-descr2
-rw-r--r--filesystems/dsbmc/pkg-plist3
-rw-r--r--filesystems/dsbmd/Makefile43
-rw-r--r--filesystems/dsbmd/distinfo3
-rw-r--r--filesystems/dsbmd/files/dsbmd.in44
-rw-r--r--filesystems/dsbmd/pkg-descr9
-rw-r--r--filesystems/e2fsprogs-core/Makefile331
-rw-r--r--filesystems/e2fsprogs-core/distinfo3
-rw-r--r--filesystems/e2fsprogs-core/files/extrapatch-e2fsck_sigcatcher.c19
-rw-r--r--filesystems/e2fsprogs-core/files/extrapatch-no-sbrk34
-rw-r--r--filesystems/e2fsprogs-core/files/fix-ss_err.h.sed3
-rw-r--r--filesystems/e2fsprogs-core/files/fsck_ext2fs.895
-rw-r--r--filesystems/e2fsprogs-core/files/fsck_ext2fs.c145
-rw-r--r--filesystems/e2fsprogs-core/files/patch-e2fsck__unix.c78
-rw-r--r--filesystems/e2fsprogs-core/files/patch-lib__uuid__gen_uuid.c57
-rw-r--r--filesystems/e2fsprogs-core/files/patch-lib_blkid_devname.c110
-rw-r--r--filesystems/e2fsprogs-core/files/patch-lib_et_com__err.311
-rw-r--r--filesystems/e2fsprogs-core/files/patch-lib_support_plausible.c11
-rw-r--r--filesystems/e2fsprogs-core/files/patch-lib_support_sort__r.h13
-rw-r--r--filesystems/e2fsprogs-core/files/patch-misc__Makefile.in81
-rw-r--r--filesystems/e2fsprogs-core/files/patch-misc_blkid.8.in17
-rw-r--r--filesystems/e2fsprogs-core/files/patch-misc_e2fuzz.c13
-rw-r--r--filesystems/e2fsprogs-core/files/patch-tests_Makefile.in11
-rw-r--r--filesystems/e2fsprogs-core/files/patch-tests_f__detect__junk_script11
-rw-r--r--filesystems/e2fsprogs-core/files/patch-tests_m__offset_script11
-rw-r--r--filesystems/e2fsprogs-core/files/patch-tests_t__mmp__fail_script19
-rw-r--r--filesystems/e2fsprogs-core/files/unwanted8
-rw-r--r--filesystems/e2fsprogs-core/pkg-descr1
-rw-r--r--filesystems/e2fsprogs-core/pkg-install76
-rw-r--r--filesystems/e2fsprogs-core/pkg-message8
-rw-r--r--filesystems/e2fsprogs-core/pkg-plist127
-rw-r--r--filesystems/e2fsprogs-libblkid/Makefile31
-rw-r--r--filesystems/e2fsprogs-libblkid/pkg-descr1
-rw-r--r--filesystems/e2fsprogs-libblkid/pkg-plist8
-rw-r--r--filesystems/e2fsprogs/Makefile21
-rw-r--r--filesystems/e2fsprogs/pkg-descr3
-rw-r--r--filesystems/e2fsprogs/pkg-plist2
-rw-r--r--filesystems/e2tools/Makefile19
-rw-r--r--filesystems/e2tools/distinfo3
-rw-r--r--filesystems/e2tools/pkg-descr17
-rw-r--r--filesystems/e2tools/pkg-plist16
-rw-r--r--filesystems/encfs/Makefile35
-rw-r--r--filesystems/encfs/distinfo3
-rw-r--r--filesystems/encfs/files/patch-CMakeLists.txt12
-rw-r--r--filesystems/encfs/files/patch-encfs_NullCipher.cpp11
-rw-r--r--filesystems/encfs/pkg-descr5
-rw-r--r--filesystems/encfs/pkg-plist56
-rw-r--r--filesystems/exfat-utils/Makefile29
-rw-r--r--filesystems/exfat-utils/distinfo3
-rw-r--r--filesystems/exfat-utils/files/patch-Makefile.am8
-rw-r--r--filesystems/exfat-utils/files/patch-configure.ac21
-rw-r--r--filesystems/exfat-utils/pkg-descr5
-rw-r--r--filesystems/exfat/Makefile28
-rw-r--r--filesystems/exfat/distinfo3
-rw-r--r--filesystems/exfat/pkg-descr4
-rw-r--r--filesystems/ext2/Makefile34
-rw-r--r--filesystems/ext2/distinfo3
-rw-r--r--filesystems/ext2/files/patch-fuse-ext2_fuse-ext2.c61
-rw-r--r--filesystems/ext2/pkg-descr2
-rw-r--r--filesystems/fstyp/Makefile18
-rw-r--r--filesystems/fstyp/distinfo3
-rw-r--r--filesystems/fstyp/pkg-descr2
-rw-r--r--filesystems/fswatch-mon/Makefile30
-rw-r--r--filesystems/fswatch-mon/distinfo3
-rw-r--r--filesystems/fswatch-mon/pkg-descr15
-rw-r--r--filesystems/fswatch-mon/pkg-plist47
-rw-r--r--filesystems/fusefs-libs/Makefile43
-rw-r--r--filesystems/fusefs-libs/distinfo3
-rw-r--r--filesystems/fusefs-libs/files/patch-doc_Makefile.am11
-rw-r--r--filesystems/fusefs-libs/files/patch-lib_fuse__versionscript53
-rw-r--r--filesystems/fusefs-libs/files/patch-lib_helper.c72
-rw-r--r--filesystems/fusefs-libs/files/patch-lib_mount__bsd.c77
-rw-r--r--filesystems/fusefs-libs/files/patch-lib_mount__util.c23
-rw-r--r--filesystems/fusefs-libs/files/patch-lib_mount__util.h7
-rw-r--r--filesystems/fusefs-libs/pkg-descr3
-rw-r--r--filesystems/fusefs-libs/pkg-message7
-rw-r--r--filesystems/fusefs-libs/pkg-plist20
-rw-r--r--filesystems/fusefs-libs3/Makefile31
-rw-r--r--filesystems/fusefs-libs3/distinfo3
-rw-r--r--filesystems/fusefs-libs3/files/extra-patch-test_meson.build15
-rw-r--r--filesystems/fusefs-libs3/files/patch-example_meson.build9
-rw-r--r--filesystems/fusefs-libs3/files/patch-lib_mount__bsd.c10
-rw-r--r--filesystems/fusefs-libs3/pkg-descr7
-rw-r--r--filesystems/fusefs-libs3/pkg-message7
-rw-r--r--filesystems/fusefs-libs3/pkg-plist11
-rw-r--r--filesystems/genromfs/Makefile20
-rw-r--r--filesystems/genromfs/distinfo3
-rw-r--r--filesystems/genromfs/files/patch-Makefile36
-rw-r--r--filesystems/genromfs/pkg-descr6
-rw-r--r--filesystems/gitfs/Makefile45
-rw-r--r--filesystems/gitfs/distinfo3
-rw-r--r--filesystems/gitfs/files/patch-gitfs_utils_args.py36
-rw-r--r--filesystems/gitfs/pkg-descr3
-rw-r--r--filesystems/gphotofs/Makefile22
-rw-r--r--filesystems/gphotofs/distinfo3
-rw-r--r--filesystems/gphotofs/pkg-descr3
-rw-r--r--filesystems/gvfs/Makefile89
-rw-r--r--filesystems/gvfs/distinfo3
-rw-r--r--filesystems/gvfs/files/patch-client_gvfsfusedaemon.c12
-rw-r--r--filesystems/gvfs/files/patch-daemon_gvfswritechannel.c10
-rw-r--r--filesystems/gvfs/pkg-descr4
-rw-r--r--filesystems/gvfs/pkg-plist156
-rw-r--r--filesystems/hfsexplorer/Makefile51
-rw-r--r--filesystems/hfsexplorer/distinfo3
-rw-r--r--filesystems/hfsexplorer/files/patch-build.xml20
-rw-r--r--filesystems/hfsexplorer/pkg-descr11
-rw-r--r--filesystems/hfsexplorer/pkg-plist21
-rw-r--r--filesystems/hfsfuse/Makefile42
-rw-r--r--filesystems/hfsfuse/distinfo3
-rw-r--r--filesystems/hfsfuse/pkg-descr8
-rw-r--r--filesystems/hfsutils/Makefile56
-rw-r--r--filesystems/hfsutils/distinfo3
-rw-r--r--filesystems/hfsutils/files/patch-Makefile.in36
-rw-r--r--filesystems/hfsutils/pkg-descr14
-rw-r--r--filesystems/hfsutils/pkg-plist40
-rw-r--r--filesystems/httpdirfs/Makefile38
-rw-r--r--filesystems/httpdirfs/distinfo7
-rw-r--r--filesystems/httpdirfs/pkg-descr11
-rw-r--r--filesystems/httpfs/Makefile53
-rw-r--r--filesystems/httpfs/distinfo3
-rw-r--r--filesystems/httpfs/files/patch-Makefile60
-rw-r--r--filesystems/httpfs/files/patch-httpfs2.c53
-rw-r--r--filesystems/httpfs/pkg-descr4
-rw-r--r--filesystems/ifuse/Makefile27
-rw-r--r--filesystems/ifuse/distinfo3
-rw-r--r--filesystems/ifuse/pkg-descr4
-rw-r--r--filesystems/ifuse/pkg-message16
-rw-r--r--filesystems/jmtpfs/Makefile31
-rw-r--r--filesystems/jmtpfs/distinfo3
-rw-r--r--filesystems/jmtpfs/pkg-descr14
-rw-r--r--filesystems/kio-fuse/Makefile22
-rw-r--r--filesystems/kio-fuse/distinfo3
-rw-r--r--filesystems/kio-fuse/files/patch-CMakeLists.txt19
-rw-r--r--filesystems/kio-fuse/pkg-descr7
-rw-r--r--filesystems/kio-fuse/pkg-message10
-rw-r--r--filesystems/libbde/Makefile31
-rw-r--r--filesystems/libbde/distinfo3
-rw-r--r--filesystems/libbde/pkg-descr2
-rw-r--r--filesystems/libbde/pkg-plist19
-rw-r--r--filesystems/libfsapfs/Makefile32
-rw-r--r--filesystems/libfsapfs/distinfo3
-rw-r--r--filesystems/libfsapfs/pkg-descr1
-rw-r--r--filesystems/libfsapfs/pkg-plist19
-rw-r--r--filesystems/libfsext/Makefile30
-rw-r--r--filesystems/libfsext/distinfo3
-rw-r--r--filesystems/libfsext/pkg-descr1
-rw-r--r--filesystems/libfsext/pkg-plist19
-rw-r--r--filesystems/libfsfat/Makefile30
-rw-r--r--filesystems/libfsfat/distinfo3
-rw-r--r--filesystems/libfsfat/pkg-descr1
-rw-r--r--filesystems/libfsfat/pkg-plist19
-rw-r--r--filesystems/libfshfs/Makefile30
-rw-r--r--filesystems/libfshfs/distinfo3
-rw-r--r--filesystems/libfshfs/pkg-descr1
-rw-r--r--filesystems/libfshfs/pkg-plist19
-rw-r--r--filesystems/libfsntfs/Makefile34
-rw-r--r--filesystems/libfsntfs/distinfo3
-rw-r--r--filesystems/libfsntfs/pkg-descr1
-rw-r--r--filesystems/libfsntfs/pkg-plist18
-rw-r--r--filesystems/libfsxfs/Makefile30
-rw-r--r--filesystems/libfsxfs/distinfo3
-rw-r--r--filesystems/libfsxfs/pkg-descr1
-rw-r--r--filesystems/libfsxfs/pkg-plist19
-rw-r--r--filesystems/libmodi/Makefile32
-rw-r--r--filesystems/libmodi/distinfo3
-rw-r--r--filesystems/libmodi/pkg-descr1
-rw-r--r--filesystems/libmodi/pkg-plist18
-rw-r--r--filesystems/linux-c7-dosfstools/Makefile19
-rw-r--r--filesystems/linux-c7-dosfstools/distinfo9
-rw-r--r--filesystems/linux-c7-dosfstools/pkg-descr2
-rw-r--r--filesystems/linux-c7-dosfstools/pkg-plist28
-rw-r--r--filesystems/lizardfs/Makefile57
-rw-r--r--filesystems/lizardfs/distinfo3
-rw-r--r--filesystems/lizardfs/files/mfscgiserv.in29
-rw-r--r--filesystems/lizardfs/files/mfschunkserver.in30
-rw-r--r--filesystems/lizardfs/files/mfsmaster.in30
-rw-r--r--filesystems/lizardfs/files/mfsmetalogger.in30
-rw-r--r--filesystems/lizardfs/files/mfspingserv.in29
-rw-r--r--filesystems/lizardfs/files/patch-CMakeLists.txt37
-rw-r--r--filesystems/lizardfs/files/patch-cmake_CheckIncludes.cmake13
-rw-r--r--filesystems/lizardfs/files/patch-cmake__Libraries.cmake14
-rw-r--r--filesystems/lizardfs/files/patch-src_common_slogger.cc11
-rw-r--r--filesystems/lizardfs/files/patch-src_common_slogger.h12
-rw-r--r--filesystems/lizardfs/pkg-descr3
-rw-r--r--filesystems/lizardfs/pkg-plist119
-rw-r--r--filesystems/lkl/Makefile42
-rw-r--r--filesystems/lkl/distinfo3
-rw-r--r--filesystems/lkl/files/patch-Makefile15
-rw-r--r--filesystems/lkl/files/patch-Targets18
-rw-r--r--filesystems/lkl/pkg-descr1
-rw-r--r--filesystems/ltfs/Makefile52
-rw-r--r--filesystems/ltfs/distinfo3
-rw-r--r--filesystems/ltfs/files/patch-src_tape__drivers_freebsd_cam_cam__tc.c11
-rw-r--r--filesystems/ltfs/pkg-descr3
-rw-r--r--filesystems/ltfs/pkg-message15
-rw-r--r--filesystems/ltfs/pkg-plist54
-rw-r--r--filesystems/mergerfs/Makefile27
-rw-r--r--filesystems/mergerfs/distinfo3
-rw-r--r--filesystems/mergerfs/files/patch-libfuse_lib_cpu.hpp16
-rw-r--r--filesystems/mergerfs/files/patch-libfuse_lib_fuse.c14
-rw-r--r--filesystems/mergerfs/files/patch-libfuse_util_fusermount.c15
-rw-r--r--filesystems/mergerfs/files/patch-src_fs__readahead.cpp14
-rw-r--r--filesystems/mergerfs/files/patch-src_fs__umount2.hpp17
-rw-r--r--filesystems/mergerfs/files/patch-tools_preload.c29
-rw-r--r--filesystems/mergerfs/pkg-descr3
-rw-r--r--filesystems/mhddfs/Makefile33
-rw-r--r--filesystems/mhddfs/distinfo3
-rw-r--r--filesystems/mhddfs/files/patch-Makefile50
-rw-r--r--filesystems/mhddfs/pkg-descr8
-rw-r--r--filesystems/moosefs2-cgi/Makefile9
-rw-r--r--filesystems/moosefs2-cgi/pkg-descr7
-rw-r--r--filesystems/moosefs2-cgi/pkg-plist8
-rw-r--r--filesystems/moosefs2-cgiserv/Makefile10
-rw-r--r--filesystems/moosefs2-cgiserv/pkg-descr7
-rw-r--r--filesystems/moosefs2-cgiserv/pkg-plist5
-rw-r--r--filesystems/moosefs2-chunkserver/Makefile10
-rw-r--r--filesystems/moosefs2-chunkserver/pkg-descr7
-rw-r--r--filesystems/moosefs2-chunkserver/pkg-plist11
-rw-r--r--filesystems/moosefs2-cli/Makefile10
-rw-r--r--filesystems/moosefs2-cli/pkg-descr7
-rw-r--r--filesystems/moosefs2-cli/pkg-plist2
-rw-r--r--filesystems/moosefs2-client/Makefile10
-rw-r--r--filesystems/moosefs2-client/pkg-descr7
-rw-r--r--filesystems/moosefs2-client/pkg-plist47
-rw-r--r--filesystems/moosefs2-master/Makefile107
-rw-r--r--filesystems/moosefs2-master/distinfo3
-rw-r--r--filesystems/moosefs2-master/files/mfscgiserv.in29
-rw-r--r--filesystems/moosefs2-master/files/mfschunkserver.in30
-rw-r--r--filesystems/moosefs2-master/files/mfsmaster.in30
-rw-r--r--filesystems/moosefs2-master/files/mfsmetalogger.in30
-rw-r--r--filesystems/moosefs2-master/files/patch-mfsdata_Makefile.in30
-rw-r--r--filesystems/moosefs2-master/files/pkg-message-cgiserv.in14
-rw-r--r--filesystems/moosefs2-master/files/pkg-message-chunkserver.in14
-rw-r--r--filesystems/moosefs2-master/files/pkg-message-master.in14
-rw-r--r--filesystems/moosefs2-master/files/pkg-message-metalogger.in14
-rw-r--r--filesystems/moosefs2-master/pkg-descr7
-rw-r--r--filesystems/moosefs2-master/pkg-plist16
-rw-r--r--filesystems/moosefs2-metalogger/Makefile10
-rw-r--r--filesystems/moosefs2-metalogger/pkg-descr7
-rw-r--r--filesystems/moosefs2-metalogger/pkg-plist7
-rw-r--r--filesystems/moosefs2-netdump/Makefile10
-rw-r--r--filesystems/moosefs2-netdump/pkg-descr7
-rw-r--r--filesystems/moosefs2-netdump/pkg-plist2
-rw-r--r--filesystems/moosefs3-cgi/Makefile9
-rw-r--r--filesystems/moosefs3-cgi/pkg-descr7
-rw-r--r--filesystems/moosefs3-cgi/pkg-plist8
-rw-r--r--filesystems/moosefs3-cgiserv/Makefile10
-rw-r--r--filesystems/moosefs3-cgiserv/pkg-descr7
-rw-r--r--filesystems/moosefs3-cgiserv/pkg-plist5
-rw-r--r--filesystems/moosefs3-chunkserver/Makefile10
-rw-r--r--filesystems/moosefs3-chunkserver/pkg-descr7
-rw-r--r--filesystems/moosefs3-chunkserver/pkg-plist13
-rw-r--r--filesystems/moosefs3-cli/Makefile10
-rw-r--r--filesystems/moosefs3-cli/pkg-descr7
-rw-r--r--filesystems/moosefs3-cli/pkg-plist2
-rw-r--r--filesystems/moosefs3-client/Makefile10
-rw-r--r--filesystems/moosefs3-client/pkg-descr7
-rw-r--r--filesystems/moosefs3-client/pkg-plist88
-rw-r--r--filesystems/moosefs3-master/Makefile111
-rw-r--r--filesystems/moosefs3-master/distinfo3
-rw-r--r--filesystems/moosefs3-master/files/mfscgiserv.in29
-rw-r--r--filesystems/moosefs3-master/files/mfschunkserver.in30
-rw-r--r--filesystems/moosefs3-master/files/mfsmaster.in31
-rw-r--r--filesystems/moosefs3-master/files/mfsmetalogger.in30
-rw-r--r--filesystems/moosefs3-master/files/pkg-message-cgiserv.in14
-rw-r--r--filesystems/moosefs3-master/files/pkg-message-chunkserver.in14
-rw-r--r--filesystems/moosefs3-master/files/pkg-message-master.in14
-rw-r--r--filesystems/moosefs3-master/files/pkg-message-metalogger.in14
-rw-r--r--filesystems/moosefs3-master/pkg-descr7
-rw-r--r--filesystems/moosefs3-master/pkg-plist20
-rw-r--r--filesystems/moosefs3-metalogger/Makefile10
-rw-r--r--filesystems/moosefs3-metalogger/pkg-descr7
-rw-r--r--filesystems/moosefs3-metalogger/pkg-plist7
-rw-r--r--filesystems/moosefs3-netdump/Makefile10
-rw-r--r--filesystems/moosefs3-netdump/pkg-descr7
-rw-r--r--filesystems/moosefs3-netdump/pkg-plist2
-rw-r--r--filesystems/mp3fs/Makefile27
-rw-r--r--filesystems/mp3fs/distinfo3
-rw-r--r--filesystems/mp3fs/pkg-descr8
-rw-r--r--filesystems/mtools/Makefile58
-rw-r--r--filesystems/mtools/distinfo3
-rw-r--r--filesystems/mtools/files/patch-Makefile.in40
-rw-r--r--filesystems/mtools/files/patch-configure63
-rw-r--r--filesystems/mtools/files/patch-mtools.texi11
-rw-r--r--filesystems/mtools/files/patch-scsi.c29
-rw-r--r--filesystems/mtools/files/pkg-message.in7
-rw-r--r--filesystems/mtools/pkg-descr4
-rw-r--r--filesystems/mtools/pkg-plist60
-rw-r--r--filesystems/mtpfs/Makefile34
-rw-r--r--filesystems/mtpfs/distinfo3
-rw-r--r--filesystems/mtpfs/files/patch-Makefile.am10
-rw-r--r--filesystems/mtpfs/files/patch-Makefile.in11
-rw-r--r--filesystems/mtpfs/files/patch-mtpfs.c11
-rw-r--r--filesystems/mtpfs/files/patch-mtpfs.h11
-rw-r--r--filesystems/mtpfs/pkg-descr2
-rw-r--r--filesystems/nbt/Makefile44
-rw-r--r--filesystems/nbt/distinfo3
-rw-r--r--filesystems/nbt/pkg-descr11
-rw-r--r--filesystems/nbt/pkg-plist15
-rw-r--r--filesystems/ntfs-compression/Makefile26
-rw-r--r--filesystems/ntfs-compression/distinfo3
-rw-r--r--filesystems/ntfs-compression/pkg-descr8
-rw-r--r--filesystems/ntfs/Makefile61
-rw-r--r--filesystems/ntfs/distinfo3
-rw-r--r--filesystems/ntfs/files/README.FreeBSD126
-rw-r--r--filesystems/ntfs/files/extra-patch-ublio27
-rw-r--r--filesystems/ntfs/files/patch-configure30
-rw-r--r--filesystems/ntfs/files/patch-libntfs-3g__unix_io.c623
-rw-r--r--filesystems/ntfs/files/patch-ntfsprogs_mkntfs.c18
-rw-r--r--filesystems/ntfs/files/pkg-message.in13
-rw-r--r--filesystems/ntfs/pkg-descr4
-rw-r--r--filesystems/ntfs/pkg-plist90
-rw-r--r--filesystems/ntfs2btrfs/Makefile25
-rw-r--r--filesystems/ntfs2btrfs/distinfo3
-rw-r--r--filesystems/ntfs2btrfs/files/patch-src_ntfs.cpp11
-rw-r--r--filesystems/ntfs2btrfs/pkg-descr5
-rw-r--r--filesystems/openzfs-kmod/Makefile68
-rw-r--r--filesystems/openzfs-kmod/distinfo3
-rw-r--r--filesystems/openzfs-kmod/pkg-descr1
-rw-r--r--filesystems/openzfs-kmod/pkg-message12
-rw-r--r--filesystems/openzfs/Makefile71
-rw-r--r--filesystems/openzfs/distinfo3
-rw-r--r--filesystems/openzfs/pkg-descr1
-rw-r--r--filesystems/openzfs/pkg-message11
-rw-r--r--filesystems/openzfs/pkg-plist2621
-rw-r--r--filesystems/p5-Filesys-Statvfs/Makefile15
-rw-r--r--filesystems/p5-Filesys-Statvfs/distinfo3
-rw-r--r--filesystems/p5-Filesys-Statvfs/pkg-descr13
-rw-r--r--filesystems/p5-Filesys-Statvfs/pkg-plist3
-rw-r--r--filesystems/p5-Fuse/Makefile23
-rw-r--r--filesystems/p5-Fuse/distinfo3
-rw-r--r--filesystems/p5-Fuse/pkg-descr14
-rw-r--r--filesystems/p5-Fuse/pkg-plist4
-rw-r--r--filesystems/pear-Horde_Vfs/Makefile24
-rw-r--r--filesystems/pear-Horde_Vfs/distinfo3
-rw-r--r--filesystems/pear-Horde_Vfs/pkg-descr11
-rw-r--r--filesystems/pod/Makefile21
-rw-r--r--filesystems/pod/distinfo3
-rw-r--r--filesystems/pod/files/patch-configure11
-rw-r--r--filesystems/pod/files/patch-src_fusepod__ipod.h12
-rw-r--r--filesystems/pod/files/patch-src_fusepod__util.h10
-rw-r--r--filesystems/pod/pkg-descr4
-rw-r--r--filesystems/progsreiserfs/Makefile44
-rw-r--r--filesystems/progsreiserfs/distinfo3
-rw-r--r--filesystems/progsreiserfs/files/extrapatch-progsreiserfs_libmisc_Makefile.in37
-rw-r--r--filesystems/progsreiserfs/files/patch-libdal_file.c26
-rw-r--r--filesystems/progsreiserfs/files/patch-libreiserfs_journal.c11
-rw-r--r--filesystems/progsreiserfs/pkg-descr6
-rw-r--r--filesystems/progsreiserfs/pkg-plist40
-rw-r--r--filesystems/py-dfvfs/Makefile60
-rw-r--r--filesystems/py-dfvfs/distinfo3
-rw-r--r--filesystems/py-dfvfs/pkg-descr5
-rw-r--r--filesystems/py-fs/Makefile20
-rw-r--r--filesystems/py-fs/distinfo3
-rw-r--r--filesystems/py-fs/files/patch-2to35882
-rw-r--r--filesystems/py-fs/pkg-descr8
-rw-r--r--filesystems/py-fs2/Makefile26
-rw-r--r--filesystems/py-fs2/distinfo3
-rw-r--r--filesystems/py-fs2/pkg-descr5
-rw-r--r--filesystems/py-fsspec-xrootd/Makefile26
-rw-r--r--filesystems/py-fsspec-xrootd/distinfo3
-rw-r--r--filesystems/py-fsspec-xrootd/pkg-descr3
-rw-r--r--filesystems/py-fsspec/Makefile28
-rw-r--r--filesystems/py-fsspec/distinfo3
-rw-r--r--filesystems/py-fsspec/pkg-descr3
-rw-r--r--filesystems/py-fusepy/Makefile24
-rw-r--r--filesystems/py-fusepy/distinfo3
-rw-r--r--filesystems/py-fusepy/pkg-descr2
-rw-r--r--filesystems/py-gcsfs/Makefile37
-rw-r--r--filesystems/py-gcsfs/distinfo3
-rw-r--r--filesystems/py-gcsfs/pkg-descr1
-rw-r--r--filesystems/py-libzfs/Makefile35
-rw-r--r--filesystems/py-libzfs/distinfo3
-rw-r--r--filesystems/py-libzfs/files/extra-zpool-add.patch44
-rw-r--r--filesystems/py-libzfs/pkg-descr1
-rw-r--r--filesystems/py-llfuse/Makefile26
-rw-r--r--filesystems/py-llfuse/distinfo3
-rw-r--r--filesystems/py-llfuse/pkg-descr3
-rw-r--r--filesystems/py-prometheus-zfs/Makefile33
-rw-r--r--filesystems/py-prometheus-zfs/distinfo3
-rw-r--r--filesystems/py-prometheus-zfs/files/zfsprom.in32
-rw-r--r--filesystems/py-prometheus-zfs/pkg-descr3
-rw-r--r--filesystems/py-pyfakefs/Makefile24
-rw-r--r--filesystems/py-pyfakefs/distinfo3
-rw-r--r--filesystems/py-pyfakefs/pkg-descr13
-rw-r--r--filesystems/py-s3fs/Makefile33
-rw-r--r--filesystems/py-s3fs/distinfo3
-rw-r--r--filesystems/py-s3fs/pkg-descr2
-rw-r--r--filesystems/py-zfs-autobackup/Makefile24
-rw-r--r--filesystems/py-zfs-autobackup/distinfo3
-rw-r--r--filesystems/py-zfs-autobackup/pkg-descr20
-rw-r--r--filesystems/rar2fs/Makefile37
-rw-r--r--filesystems/rar2fs/distinfo3
-rw-r--r--filesystems/rar2fs/files/patch-configure.ac24
-rw-r--r--filesystems/rar2fs/files/patch-src_dllext.cpp199
-rw-r--r--filesystems/rar2fs/pkg-descr7
-rw-r--r--filesystems/rubygem-aws-sdk-efs/Makefile20
-rw-r--r--filesystems/rubygem-aws-sdk-efs/distinfo3
-rw-r--r--filesystems/rubygem-aws-sdk-efs/pkg-descr1
-rw-r--r--filesystems/rubygem-winrm-fs/Makefile24
-rw-r--r--filesystems/rubygem-winrm-fs/distinfo3
-rw-r--r--filesystems/rubygem-winrm-fs/pkg-descr1
-rw-r--r--filesystems/s3backer/Makefile26
-rw-r--r--filesystems/s3backer/distinfo3
-rw-r--r--filesystems/s3backer/pkg-descr22
-rw-r--r--filesystems/s3backer/pkg-plist7
-rw-r--r--filesystems/s3fs/Makefile36
-rw-r--r--filesystems/s3fs/distinfo3
-rw-r--r--filesystems/s3fs/files/patch-test_mknod__test.c13
-rw-r--r--filesystems/s3fs/pkg-descr2
-rw-r--r--filesystems/s3fs/pkg-message7
-rw-r--r--filesystems/sandboxfs/Makefile91
-rw-r--r--filesystems/sandboxfs/distinfo133
-rw-r--r--filesystems/sandboxfs/files/patch-powerpc62
-rw-r--r--filesystems/sandboxfs/files/patch-src_lib.rs15
-rw-r--r--filesystems/sandboxfs/files/patch-src_nodes_conv.rs41
-rw-r--r--filesystems/sandboxfs/files/patch-src_nodes_mod.rs23
-rw-r--r--filesystems/sandboxfs/pkg-descr9
-rw-r--r--filesystems/sandboxfs/pkg-message10
-rw-r--r--filesystems/scan_ffs/Makefile18
-rw-r--r--filesystems/scan_ffs/distinfo3
-rw-r--r--filesystems/scan_ffs/pkg-descr12
-rw-r--r--filesystems/securefs/Makefile33
-rw-r--r--filesystems/securefs/distinfo3
-rw-r--r--filesystems/securefs/pkg-descr4
-rw-r--r--filesystems/simple-mtpfs/Makefile46
-rw-r--r--filesystems/simple-mtpfs/distinfo3
-rw-r--r--filesystems/simple-mtpfs/files/patch-src__simple-mtpfs-fuse.cpp32
-rw-r--r--filesystems/simple-mtpfs/files/special_simple-mtpfs.in18
-rw-r--r--filesystems/simple-mtpfs/pkg-descr6
-rw-r--r--filesystems/smbnetfs/Makefile54
-rw-r--r--filesystems/smbnetfs/distinfo3
-rw-r--r--filesystems/smbnetfs/files/patch-fuse3216
-rw-r--r--filesystems/smbnetfs/files/pkg-message.in33
-rw-r--r--filesystems/smbnetfs/pkg-descr18
-rw-r--r--filesystems/smbnetfs/pkg-plist5
-rw-r--r--filesystems/sqlfs/Makefile41
-rw-r--r--filesystems/sqlfs/distinfo3
-rw-r--r--filesystems/sqlfs/files/patch-fuse_main.c65
-rw-r--r--filesystems/sqlfs/pkg-descr6
-rw-r--r--filesystems/sqlfs/pkg-message13
-rw-r--r--filesystems/squashfs-tools-ng/Makefile43
-rw-r--r--filesystems/squashfs-tools-ng/distinfo3
-rw-r--r--filesystems/squashfs-tools-ng/pkg-descr19
-rw-r--r--filesystems/squashfs-tools-ng/pkg-plist44
-rw-r--r--filesystems/squashfs-tools/Makefile66
-rw-r--r--filesystems/squashfs-tools/distinfo5
-rw-r--r--filesystems/squashfs-tools/files/patch-Makefile75
-rw-r--r--filesystems/squashfs-tools/files/patch-action.c17
-rw-r--r--filesystems/squashfs-tools/files/patch-pseudo.c13
-rw-r--r--filesystems/squashfs-tools/pkg-descr8
-rw-r--r--filesystems/squashfuse/Makefile29
-rw-r--r--filesystems/squashfuse/distinfo3
-rw-r--r--filesystems/squashfuse/pkg-descr2
-rw-r--r--filesystems/squashfuse/pkg-plist27
-rw-r--r--filesystems/sshfs/Makefile32
-rw-r--r--filesystems/sshfs/distinfo5
-rw-r--r--filesystems/sshfs/files/patch-meson.build27
-rw-r--r--filesystems/sshfs/pkg-descr1
-rw-r--r--filesystems/sshfs/pkg-message26
-rw-r--r--filesystems/tclvfs/Makefile18
-rw-r--r--filesystems/tclvfs/distinfo3
-rw-r--r--filesystems/tclvfs/files/patch-Makefile.in12
-rw-r--r--filesystems/tclvfs/files/patch-generic_vfs.c14
-rw-r--r--filesystems/tclvfs/pkg-descr4
-rw-r--r--filesystems/tclvfs/pkg-plist28
-rw-r--r--filesystems/ufs/Makefile25
-rw-r--r--filesystems/ufs/Makefile.crates108
-rw-r--r--filesystems/ufs/distinfo219
-rw-r--r--filesystems/ufs/pkg-descr7
-rw-r--r--filesystems/ufs/pkg-plist3
-rw-r--r--filesystems/ufs_copy/Makefile28
-rw-r--r--filesystems/ufs_copy/distinfo3
-rw-r--r--filesystems/ufs_copy/files/patch-ufs_copy.c72
-rw-r--r--filesystems/ufs_copy/pkg-descr3
-rw-r--r--filesystems/unionfs/Makefile38
-rw-r--r--filesystems/unionfs/distinfo3
-rw-r--r--filesystems/unionfs/files/patch-CMakeLists.txt15
-rw-r--r--filesystems/unionfs/files/patch-src__usyslog.c11
-rw-r--r--filesystems/unionfs/files/pkg-message.in20
-rw-r--r--filesystems/unionfs/pkg-descr2
-rw-r--r--filesystems/unreliablefs/Makefile43
-rw-r--r--filesystems/unreliablefs/distinfo5
-rw-r--r--filesystems/unreliablefs/pkg-descr10
-rw-r--r--filesystems/vzvol/Makefile50
-rw-r--r--filesystems/vzvol/distinfo3
-rw-r--r--filesystems/vzvol/pkg-descr5
-rw-r--r--filesystems/vzvol/pkg-plist22
-rw-r--r--filesystems/webdavfs/Makefile47
-rw-r--r--filesystems/webdavfs/distinfo9
-rw-r--r--filesystems/webdavfs/files/mount_webdavfs.in33
-rw-r--r--filesystems/webdavfs/files/pkg-message.in10
-rw-r--r--filesystems/webdavfs/pkg-descr6
-rw-r--r--filesystems/wimlib/Makefile30
-rw-r--r--filesystems/wimlib/distinfo3
-rw-r--r--filesystems/wimlib/pkg-descr18
-rw-r--r--filesystems/wimlib/pkg-plist57
-rw-r--r--filesystems/xfsm/Makefile15
-rw-r--r--filesystems/xfsm/distinfo3
-rw-r--r--filesystems/xfsm/files/patch-xfsm_util.c11
-rw-r--r--filesystems/xfsm/pkg-descr6
-rw-r--r--filesystems/xfsprogs/Makefile44
-rw-r--r--filesystems/xfsprogs/distinfo3
-rw-r--r--filesystems/xfsprogs/files/patch-fsr_xfs__fsr.c266
-rw-r--r--filesystems/xfsprogs/files/patch-include_freebsd.h17
-rw-r--r--filesystems/xfsprogs/files/patch-include_libxfs.h10
-rw-r--r--filesystems/xfsprogs/files/patch-include_list.h11
-rw-r--r--filesystems/xfsprogs/files/patch-include_xfs__bit.h11
-rw-r--r--filesystems/xfsprogs/files/patch-io_mmap.c41
-rw-r--r--filesystems/xfsprogs/files/patch-io_readdir.c20
-rw-r--r--filesystems/xfsprogs/files/patch-libhandle_handle.c10
-rw-r--r--filesystems/xfsprogs/files/patch-libhandle_jdm.c11
-rw-r--r--filesystems/xfsprogs/files/patch-libxcmd_paths.c11
-rw-r--r--filesystems/xfsprogs/files/patch-libxfs_crc32.c10
-rw-r--r--filesystems/xfsprogs/files/patch-libxfs_rdwr.c19
-rw-r--r--filesystems/xfsprogs/files/patch-libxfs_util.c10
-rw-r--r--filesystems/xfsprogs/files/patch-libxfs_xfs__attr__remote.c10
-rw-r--r--filesystems/xfsprogs/files/patch-libxlog_util.c10
-rw-r--r--filesystems/xfsprogs/files/patch-po_de.po11
-rw-r--r--filesystems/xfsprogs/files/patch-repair_agheader.c10
-rw-r--r--filesystems/xfsprogs/files/patch-repair_attr__repair.c10
-rw-r--r--filesystems/xfsprogs/files/patch-repair_attr__repair.h10
-rw-r--r--filesystems/xfsprogs/files/patch-repair_bmap.c10
-rw-r--r--filesystems/xfsprogs/files/patch-repair_dino__chunks.c10
-rw-r--r--filesystems/xfsprogs/files/patch-repair_dinode.c10
-rw-r--r--filesystems/xfsprogs/files/patch-repair_dir2.c10
-rw-r--r--filesystems/xfsprogs/files/patch-repair_incore.c10
-rw-r--r--filesystems/xfsprogs/files/patch-repair_phase2.c10
-rw-r--r--filesystems/xfsprogs/files/patch-repair_phase3.c10
-rw-r--r--filesystems/xfsprogs/files/patch-repair_phase4.c10
-rw-r--r--filesystems/xfsprogs/files/patch-repair_phase6.c19
-rw-r--r--filesystems/xfsprogs/files/patch-repair_phase7.c10
-rw-r--r--filesystems/xfsprogs/files/patch-repair_progress.c8
-rw-r--r--filesystems/xfsprogs/files/patch-repair_sb.c10
-rw-r--r--filesystems/xfsprogs/files/patch-repair_scan.c10
-rw-r--r--filesystems/xfsprogs/files/patch-repair_xfs__repair.c10
-rw-r--r--filesystems/xfsprogs/pkg-descr7
-rw-r--r--filesystems/xfsprogs/pkg-plist49
-rw-r--r--filesystems/xfuse/Makefile26
-rw-r--r--filesystems/xfuse/Makefile.crates142
-rw-r--r--filesystems/xfuse/distinfo287
-rw-r--r--filesystems/xfuse/pkg-descr11
-rw-r--r--filesystems/zap/Makefile33
-rw-r--r--filesystems/zap/distinfo3
-rw-r--r--filesystems/zap/pkg-descr10
-rw-r--r--filesystems/zap/pkg-message11
-rw-r--r--filesystems/zfs-periodic/Makefile43
-rw-r--r--filesystems/zfs-periodic/distinfo3
-rw-r--r--filesystems/zfs-periodic/pkg-descr2
-rw-r--r--filesystems/zfs-periodic/pkg-message30
-rw-r--r--filesystems/zfs-replicate/Makefile43
-rw-r--r--filesystems/zfs-replicate/distinfo3
-rw-r--r--filesystems/zfs-replicate/pkg-descr2
-rw-r--r--filesystems/zfs-replicate/pkg-message15
-rw-r--r--filesystems/zfs-snap-diff/Makefile27
-rw-r--r--filesystems/zfs-snap-diff/distinfo9
-rw-r--r--filesystems/zfs-snap-diff/pkg-descr6
-rw-r--r--filesystems/zfs-snapshot-clean/Makefile21
-rw-r--r--filesystems/zfs-snapshot-clean/distinfo3
-rw-r--r--filesystems/zfs-snapshot-clean/pkg-descr13
-rw-r--r--filesystems/zfs-snapshot-mgmt/Makefile28
-rw-r--r--filesystems/zfs-snapshot-mgmt/distinfo3
-rw-r--r--filesystems/zfs-snapshot-mgmt/files/patch-zfs-snapshot-mgmt32
-rw-r--r--filesystems/zfs-snapshot-mgmt/files/pkg-message.in19
-rw-r--r--filesystems/zfs-snapshot-mgmt/pkg-descr1
-rw-r--r--filesystems/zfs-snapshot-mgmt/pkg-plist3
-rw-r--r--filesystems/zfs-stats-lite/Makefile22
-rw-r--r--filesystems/zfs-stats-lite/distinfo3
-rw-r--r--filesystems/zfs-stats-lite/pkg-descr5
-rw-r--r--filesystems/zfs-stats/Makefile24
-rw-r--r--filesystems/zfs-stats/distinfo3
-rw-r--r--filesystems/zfs-stats/pkg-descr8
-rw-r--r--filesystems/zfsnap/Makefile37
-rw-r--r--filesystems/zfsnap/distinfo3
-rw-r--r--filesystems/zfsnap/files/patch-zfSnap.sh11
-rw-r--r--filesystems/zfsnap/pkg-descr8
-rw-r--r--filesystems/zfsnap/pkg-message55
-rw-r--r--filesystems/zfsnap/pkg-plist10
-rw-r--r--filesystems/zfsnap2/Makefile56
-rw-r--r--filesystems/zfsnap2/distinfo3
-rw-r--r--filesystems/zfsnap2/files/patch-periodic_xPERIODICx__zfsnap.sh48
-rw-r--r--filesystems/zfsnap2/pkg-descr16
-rw-r--r--filesystems/zfsnap2/pkg-plist14
-rw-r--r--filesystems/zfstools/Makefile36
-rw-r--r--filesystems/zfstools/distinfo3
-rw-r--r--filesystems/zfstools/files/pkg-message.in32
-rw-r--r--filesystems/zfstools/pkg-descr2
-rw-r--r--filesystems/zfstools/pkg-plist9
-rw-r--r--filesystems/zip/Makefile34
-rw-r--r--filesystems/zip/distinfo3
-rw-r--r--filesystems/zip/pkg-descr4
-rw-r--r--filesystems/zisofs-tools/Makefile30
-rw-r--r--filesystems/zisofs-tools/distinfo3
-rw-r--r--filesystems/zisofs-tools/files/patch-compress.c11
-rw-r--r--filesystems/zisofs-tools/pkg-descr6
-rw-r--r--filesystems/zrepl-dsh2dsh/Makefile61
-rw-r--r--filesystems/zrepl-dsh2dsh/distinfo5
-rw-r--r--filesystems/zrepl-dsh2dsh/files/pkg-message.in43
-rw-r--r--filesystems/zrepl-dsh2dsh/pkg-descr19
-rw-r--r--filesystems/zrepl-dsh2dsh/pkg-plist24
-rw-r--r--filesystems/zrepl/Makefile61
-rw-r--r--filesystems/zrepl/distinfo7
-rw-r--r--filesystems/zrepl/files/500.zrepl.in41
-rw-r--r--filesystems/zrepl/files/newsyslog.conf5
-rw-r--r--filesystems/zrepl/files/patch-go.mod89
-rw-r--r--filesystems/zrepl/files/patch-go.sum28
-rw-r--r--filesystems/zrepl/files/patch-vendor_modules.txt277
-rw-r--r--filesystems/zrepl/files/pkg-message.in37
-rw-r--r--filesystems/zrepl/files/syslog.conf7
-rw-r--r--filesystems/zrepl/files/zrepl.in80
-rw-r--r--filesystems/zrepl/files/zrepl.yml13
-rw-r--r--filesystems/zrepl/pkg-descr2
-rw-r--r--filesystems/zrepl/pkg-plist25
-rw-r--r--filesystems/zxfer/Makefile30
-rw-r--r--filesystems/zxfer/distinfo3
-rw-r--r--filesystems/zxfer/pkg-descr22
687 files changed, 24638 insertions, 0 deletions
diff --git a/filesystems/Makefile b/filesystems/Makefile
new file mode 100644
index 000000000000..5b0e6dbca81c
--- /dev/null
+++ b/filesystems/Makefile
@@ -0,0 +1,144 @@
+ COMMENT = File systems and related utilities
+
+ SUBDIR += acfgfs
+ SUBDIR += afuse
+ SUBDIR += archivemount
+ SUBDIR += automount
+ SUBDIR += avfs
+ SUBDIR += bindfs
+ SUBDIR += cfs
+ SUBDIR += chironfs
+ SUBDIR += clamfs
+ SUBDIR += cramfs
+ SUBDIR += cryptofs
+ SUBDIR += curlftpfs
+ SUBDIR += darling-dmg
+ SUBDIR += dsbmc
+ SUBDIR += dsbmc-cli
+ SUBDIR += dsbmd
+ SUBDIR += e2fsprogs
+ SUBDIR += e2fsprogs-core
+ SUBDIR += e2fsprogs-libblkid
+ SUBDIR += e2tools
+ SUBDIR += encfs
+ SUBDIR += exfat
+ SUBDIR += exfat-utils
+ SUBDIR += ext2
+ SUBDIR += fstyp
+ SUBDIR += fswatch-mon
+ SUBDIR += fusefs-libs
+ SUBDIR += fusefs-libs3
+ SUBDIR += genromfs
+ SUBDIR += gitfs
+ SUBDIR += gphotofs
+ SUBDIR += gvfs
+ SUBDIR += hfsexplorer
+ SUBDIR += hfsfuse
+ SUBDIR += hfsutils
+ SUBDIR += httpdirfs
+ SUBDIR += httpfs
+ SUBDIR += ifuse
+ SUBDIR += jmtpfs
+ SUBDIR += kio-fuse
+ SUBDIR += libbde
+ SUBDIR += libfsapfs
+ SUBDIR += libfsext
+ SUBDIR += libfsfat
+ SUBDIR += libfshfs
+ SUBDIR += libfsntfs
+ SUBDIR += libfsxfs
+ SUBDIR += libmodi
+ SUBDIR += linux-c7-dosfstools
+ SUBDIR += lizardfs
+ SUBDIR += lkl
+ SUBDIR += ltfs
+ SUBDIR += mergerfs
+ SUBDIR += mhddfs
+ SUBDIR += moosefs2-cgi
+ SUBDIR += moosefs2-cgiserv
+ SUBDIR += moosefs2-chunkserver
+ SUBDIR += moosefs2-cli
+ SUBDIR += moosefs2-client
+ SUBDIR += moosefs2-master
+ SUBDIR += moosefs2-metalogger
+ SUBDIR += moosefs2-netdump
+ SUBDIR += moosefs3-cgi
+ SUBDIR += moosefs3-cgiserv
+ SUBDIR += moosefs3-chunkserver
+ SUBDIR += moosefs3-cli
+ SUBDIR += moosefs3-client
+ SUBDIR += moosefs3-master
+ SUBDIR += moosefs3-metalogger
+ SUBDIR += moosefs3-netdump
+ SUBDIR += mp3fs
+ SUBDIR += mtools
+ SUBDIR += mtpfs
+ SUBDIR += nbt
+ SUBDIR += ntfs
+ SUBDIR += ntfs-compression
+ SUBDIR += ntfs2btrfs
+ SUBDIR += openzfs
+ SUBDIR += openzfs-kmod
+ SUBDIR += p5-Filesys-Statvfs
+ SUBDIR += p5-Fuse
+ SUBDIR += pear-Horde_Vfs
+ SUBDIR += pod
+ SUBDIR += progsreiserfs
+ SUBDIR += py-dfvfs
+ SUBDIR += py-fs
+ SUBDIR += py-fs2
+ SUBDIR += py-fsspec
+ SUBDIR += py-fsspec-xrootd
+ SUBDIR += py-fusepy
+ SUBDIR += py-gcsfs
+ SUBDIR += py-libzfs
+ SUBDIR += py-llfuse
+ SUBDIR += py-prometheus-zfs
+ SUBDIR += py-pyfakefs
+ SUBDIR += py-s3fs
+ SUBDIR += py-zfs-autobackup
+ SUBDIR += R-cran-fs
+ SUBDIR += rar2fs
+ SUBDIR += rubygem-aws-sdk-efs
+ SUBDIR += rubygem-winrm-fs
+ SUBDIR += s3backer
+ SUBDIR += s3fs
+ SUBDIR += sandboxfs
+ SUBDIR += scan_ffs
+ SUBDIR += securefs
+ SUBDIR += simple-mtpfs
+ SUBDIR += smbnetfs
+ SUBDIR += sqlfs
+ SUBDIR += squashfs-tools
+ SUBDIR += squashfs-tools-ng
+ SUBDIR += squashfuse
+ SUBDIR += sshfs
+ SUBDIR += tclvfs
+ SUBDIR += ufs
+ SUBDIR += ufs_copy
+ SUBDIR += unionfs
+ SUBDIR += unreliablefs
+ SUBDIR += vzvol
+ SUBDIR += webdavfs
+ SUBDIR += wimlib
+ SUBDIR += xfsm
+ SUBDIR += xfsprogs
+ SUBDIR += xfuse
+ SUBDIR += zap
+ SUBDIR += zfs-periodic
+ SUBDIR += zfs-replicate
+ SUBDIR += zfs-snap-diff
+ SUBDIR += zfs-snapshot-clean
+ SUBDIR += zfs-snapshot-mgmt
+ SUBDIR += zfs-stats
+ SUBDIR += zfs-stats-lite
+ SUBDIR += zfsnap
+ SUBDIR += zfsnap2
+ SUBDIR += zfstools
+ SUBDIR += zip
+ SUBDIR += zisofs-tools
+ SUBDIR += zrepl
+ SUBDIR += zrepl-dsh2dsh
+ SUBDIR += zxfer
+
+.include <bsd.port.subdir.mk>
diff --git a/filesystems/R-cran-fs/Makefile b/filesystems/R-cran-fs/Makefile
new file mode 100644
index 000000000000..3d9974d540de
--- /dev/null
+++ b/filesystems/R-cran-fs/Makefile
@@ -0,0 +1,26 @@
+PORTNAME= fs
+DISTVERSION= 1.6.5
+CATEGORIES= filesystems sysutils
+DISTNAME= ${PORTNAME}_${DISTVERSION}
+
+MAINTAINER= uzsolt@FreeBSD.org
+COMMENT= Cross-Platform File System Operations Based on 'libuv'
+WWW= https://fs.r-lib.org
+
+LICENSE= MIT
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+TEST_DEPENDS= R-cran-covr>0:devel/R-cran-covr \
+ R-cran-crayon>0:devel/R-cran-crayon \
+ R-cran-knitr>0:print/R-cran-knitr \
+ R-cran-pillar>=1.0.0:devel/R-cran-pillar \
+ R-cran-rmarkdown>0:textproc/R-cran-rmarkdown \
+ R-cran-spelling>0:textproc/R-cran-spelling \
+ R-cran-testthat>=3.0.0:devel/R-cran-testthat \
+ R-cran-tibble>=1.1.0:devel/R-cran-tibble \
+ R-cran-vctrs>=0.3.0:devel/R-cran-vctrs \
+ R-cran-withr>0:devel/R-cran-withr
+
+USES= cran:auto-plist,compiles
+
+.include <bsd.port.mk>
diff --git a/filesystems/R-cran-fs/distinfo b/filesystems/R-cran-fs/distinfo
new file mode 100644
index 000000000000..e5669da26a36
--- /dev/null
+++ b/filesystems/R-cran-fs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730355406
+SHA256 (fs_1.6.5.tar.gz) = 0e3b4d40215bee77b52d158a2e4967f4408721576aaf39bc6a77024522c70b34
+SIZE (fs_1.6.5.tar.gz) = 1200455
diff --git a/filesystems/R-cran-fs/pkg-descr b/filesystems/R-cran-fs/pkg-descr
new file mode 100644
index 000000000000..fcc21a216d41
--- /dev/null
+++ b/filesystems/R-cran-fs/pkg-descr
@@ -0,0 +1,2 @@
+A cross-platform interface to file system operations, built on top of the
+'libuv' C library.
diff --git a/filesystems/acfgfs/Makefile b/filesystems/acfgfs/Makefile
new file mode 100644
index 000000000000..6a62ea14b229
--- /dev/null
+++ b/filesystems/acfgfs/Makefile
@@ -0,0 +1,22 @@
+PORTNAME= acfgfs
+DISTVERSION= 0.6.3.4
+CATEGORIES= filesystems sysutils
+
+MAINTAINER= ports@FreeBSD.org
+COMMENT= FUSE file system driver for Arcan window managers
+WWW= https://arcan-fe.com/
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC:H:H:H}/data/distr/LICENSE.BSD
+
+LIB_DEPENDS= libarcan_shmif_ext.so:multimedia/arcan
+
+USES= cmake compiler:c11 fuse:3 pkgconfig
+USE_GITHUB= yes
+GH_ACCOUNT= letoram
+GH_PROJECT= arcan
+WRKSRC_SUBDIR= src/tools/${PORTNAME}
+PLIST_FILES= bin/arcan_cfgfs \
+ share/man/man1/arcan_cfgfs.1.gz
+
+.include <bsd.port.mk>
diff --git a/filesystems/acfgfs/distinfo b/filesystems/acfgfs/distinfo
new file mode 100644
index 000000000000..e7950a44e17b
--- /dev/null
+++ b/filesystems/acfgfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1728130449
+SHA256 (letoram-arcan-0.6.3.4_GH0.tar.gz) = 8ffdd67e99df7fae4de739f530f51ca1583eb6b6dbb2fd4cd5c29913e85200e5
+SIZE (letoram-arcan-0.6.3.4_GH0.tar.gz) = 12951187
diff --git a/filesystems/acfgfs/pkg-descr b/filesystems/acfgfs/pkg-descr
new file mode 100644
index 000000000000..977d242c44a2
--- /dev/null
+++ b/filesystems/acfgfs/pkg-descr
@@ -0,0 +1,2 @@
+Acfgfs is a tool that lets you mount certain arcan applications as a FUSE
+file-system. The application has to explicitly support it (e.g., Durden).
diff --git a/filesystems/afuse/Makefile b/filesystems/afuse/Makefile
new file mode 100644
index 000000000000..808794a7224b
--- /dev/null
+++ b/filesystems/afuse/Makefile
@@ -0,0 +1,30 @@
+PORTNAME= afuse
+PORTVERSION= 0.4.1
+PORTREVISION= 2
+CATEGORIES= filesystems
+MASTER_SITES= https://BSDforge.com/projects/source/sysutils/afuse/
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= portmaster@BSDforge.com
+COMMENT= File system automounting implemented in user-space using FUSE
+WWW= https://github.com/pcarrier/afuse
+
+LICENSE= GPLv2
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+USES= cpe fuse pkgconfig
+GNU_CONFIGURE= yes
+
+PORTDOCS= AUTHORS README
+
+OPTIONS_DEFINE= DOCS
+DOCS_SUB_FILES= pkg-message
+
+post-install:
+ ${INSTALL_MAN} ${FILESDIR}/afuse.1 ${STAGEDIR}${PREFIX}/share/man/man1
+
+post-install-DOCS-on:
+ @${MKDIR} ${STAGEDIR}${DOCSDIR}
+ ${INSTALL_DATA} ${PORTDOCS:S,^,${WRKSRC}/,} ${STAGEDIR}${DOCSDIR}
+
+.include <bsd.port.mk>
diff --git a/filesystems/afuse/distinfo b/filesystems/afuse/distinfo
new file mode 100644
index 000000000000..3dca6b32c27b
--- /dev/null
+++ b/filesystems/afuse/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905207
+SHA256 (afuse-0.4.1.tar.gz) = c6e0555a65d42d3782e0734198bbebd22486386e29cb00047bc43c3eb726dca8
+SIZE (afuse-0.4.1.tar.gz) = 121957
diff --git a/filesystems/afuse/files/afuse.1 b/filesystems/afuse/files/afuse.1
new file mode 100644
index 000000000000..f6212f74aa3f
--- /dev/null
+++ b/filesystems/afuse/files/afuse.1
@@ -0,0 +1,95 @@
+.TH AFUSE 1 "October 12, 2006"
+.SH NAME
+AFUSE \- automounting file system implemented in user-space using FUSE
+.SH DESCRIPTION
+usage: afuse mountpoint [options]
+.SS "general options:"
+.TP
+\fB\-o\fR opt,[opt...]
+mount options
+.TP
+\fB\-h\fR \fB\-\-help\fR
+print help
+.TP
+\fB\-V\fR \fB\-\-version\fR
+print FUSE version information
+.SS "AFUSE options:"
+.TP
+\fB\-o\fR \fB\ mount_template=CMD\fR
+template for CMD to execute to mount (*)
+.TP
+\fB\-o\fR \fB\ unmount_template=CMD\fR
+template for CMD to execute to unmount (*) (**)
+.TP
+(*) - When executed, %r and %m are expanded in templates to the root
+directory name for the new mount point, and the actual directory to
+mount onto respectively to mount onto. Both templates are REQUIRED.
+.TP
+(**)- The unmount command must perform a lazy unmount operation. E.g. the
+\-u \-z options to fusermount, or \-l for regular mount.
+.SS "FUSE options:"
+.TP
+\fB\-d\fR \fB\-o\fR debug
+enable debug output (implies \fB\-f\fR)
+.TP
+\fB\-f\fR
+foreground operation
+.TP
+\fB\-s\fR
+disable multi\-threaded operation
+.TP
+\fB\-o\fR allow_other
+allow access to other users
+.TP
+\fB\-o\fR allow_root
+allow access to root
+.TP
+\fB\-o\fR nonempty
+allow mounts over non\-empty file/dir
+.HP
+\fB\-o\fR default_permissions enable permission checking by kernel
+.TP
+\fB\-o\fR fsname=NAME
+set filesystem name
+.TP
+\fB\-o\fR large_read
+issue large read requests (2.4 only)
+.TP
+\fB\-o\fR max_read=N
+set maximum size of read requests
+.TP
+\fB\-o\fR hard_remove
+immediate removal (don't hide files)
+.TP
+\fB\-o\fR use_ino
+let filesystem set inode numbers
+.TP
+\fB\-o\fR readdir_ino
+try to fill in d_ino in readdir
+.TP
+\fB\-o\fR direct_io
+use direct I/O
+.TP
+\fB\-o\fR kernel_cache
+cache files in kernel
+.TP
+\fB\-o\fR umask=M
+set file permissions (octal)
+.TP
+\fB\-o\fR uid=N
+set file owner
+.TP
+\fB\-o\fR gid=N
+set file group
+.TP
+\fB\-o\fR entry_timeout=T
+cache timeout for names (1.0s)
+.TP
+\fB\-o\fR negative_timeout=T
+cache timeout for deleted names (0.0s)
+.TP
+\fB\-o\fR attr_timeout=T
+cache timeout for attributes (1.0s)
+.SH AUTHOR
+This manual page was written by Varun Hiremath <varunhiremath@gmail.com>,
+for the Debian project (but may be used by others).
diff --git a/filesystems/afuse/files/patch-src_afuse.c b/filesystems/afuse/files/patch-src_afuse.c
new file mode 100644
index 000000000000..31a49171dcfc
--- /dev/null
+++ b/filesystems/afuse/files/patch-src_afuse.c
@@ -0,0 +1,11 @@
+--- src/afuse.c.orig 2013-02-13 02:36:47 UTC
++++ src/afuse.c
+@@ -29,7 +29,7 @@
+ #include <string.h>
+ #include <stddef.h>
+ #include <unistd.h>
+-#include <alloca.h>
++//#include <alloca.h>
+ #include <fcntl.h>
+ #include <dirent.h>
+ #include <errno.h>
diff --git a/filesystems/afuse/files/pkg-message.in b/filesystems/afuse/files/pkg-message.in
new file mode 100644
index 000000000000..bf89bc245d9b
--- /dev/null
+++ b/filesystems/afuse/files/pkg-message.in
@@ -0,0 +1,8 @@
+[
+{ type: install
+ message: <<EOM
+Additional info about program usage can be found at
+%%DOCSDIR%%/README.
+EOM
+}
+]
diff --git a/filesystems/afuse/pkg-descr b/filesystems/afuse/pkg-descr
new file mode 100644
index 000000000000..7372b291f353
--- /dev/null
+++ b/filesystems/afuse/pkg-descr
@@ -0,0 +1,16 @@
+Afuse is an automounting file system implemented in user-space
+using FUSE. Afuse currently implements the most basic
+functionality that can be expected by an automounter; that is it
+manages a directory of virtual directories. If one of these virtual
+directories is accessed and is not already automounted, afuse will
+attempt to mount a filesystem onto that directory. If the mount
+succeeds the requested access proceeds as normal, otherwise it will
+fail with an error.
+
+The advantage of using afuse over traditional automounters is that
+afuse is designed to run entirely in user-space by individual users.
+This way an automounting action can take advantage of the invoking
+users environment, for example allowing access to an ssh-agent for
+password-less sshfs mounts, or allowing access to a graphical
+environment to get user input to complete a mount (i.e. popping up
+a window asking for a password).
diff --git a/filesystems/afuse/pkg-plist b/filesystems/afuse/pkg-plist
new file mode 100644
index 000000000000..ca1d3709154f
--- /dev/null
+++ b/filesystems/afuse/pkg-plist
@@ -0,0 +1,3 @@
+bin/afuse
+@comment bin/afuse-avahissh
+share/man/man1/afuse.1.gz
diff --git a/filesystems/archivemount/Makefile b/filesystems/archivemount/Makefile
new file mode 100644
index 000000000000..b29e53e95b7e
--- /dev/null
+++ b/filesystems/archivemount/Makefile
@@ -0,0 +1,28 @@
+PORTNAME= archivemount
+DISTVERSION= 0.9.1
+PORTREVISION= 1
+CATEGORIES= filesystems sysutils
+MASTER_SITES= https://www.cybernoia.de/software/archivemount/
+
+MAINTAINER= jirnov@gmail.com
+COMMENT= Mount archives with FUSE
+WWW= https://www.cybernoia.de/software/archivemount.html
+
+LICENSE= LGPL20
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+USES= fuse iconv libarchive pkgconfig
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+
+PLIST_FILES= bin/archivemount \
+ share/man/man1/archivemount.1.gz \
+ sbin/mount_archive
+
+SUB_FILES= pkg-message
+
+post-install:
+ ${RLN} ${STAGEDIR}${PREFIX}/bin/archivemount \
+ ${STAGEDIR}${PREFIX}/sbin/mount_archive
+
+.include <bsd.port.mk>
diff --git a/filesystems/archivemount/distinfo b/filesystems/archivemount/distinfo
new file mode 100644
index 000000000000..f80191a890d9
--- /dev/null
+++ b/filesystems/archivemount/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1663696814
+SHA256 (archivemount-0.9.1.tar.gz) = c529b981cacb19541b48ddafdafb2ede47a40fcaf16c677c1e2cd198b159c5b3
+SIZE (archivemount-0.9.1.tar.gz) = 133251
diff --git a/filesystems/archivemount/files/pkg-message.in b/filesystems/archivemount/files/pkg-message.in
new file mode 100644
index 000000000000..a1fa17f41d3e
--- /dev/null
+++ b/filesystems/archivemount/files/pkg-message.in
@@ -0,0 +1,10 @@
+[
+{ type: install
+ message: <<EOM
+Make sure you have fusefs.ko loaded then use archivemount
+or mount_archive command or add an entry to the /etc/fstab such as:
+
+/path/to/archive /mnt/path fusefs ro,late,mountprog=%%PREFIX%%/sbin/mount_archive 0 0
+EOM
+}
+]
diff --git a/filesystems/archivemount/pkg-descr b/filesystems/archivemount/pkg-descr
new file mode 100644
index 000000000000..c1889e81a9c3
--- /dev/null
+++ b/filesystems/archivemount/pkg-descr
@@ -0,0 +1,4 @@
+Archivemount is a piece of glue code between libarchive
+(http://people.freebsd.org/~kientzle/libarchive/) and FUSE
+(http://fuse.sourceforge.net). It can be used to mount a (possibly compressed)
+archive (as in .tar.gz or .tar.bz2) and use it like an ordinary filesystem.
diff --git a/filesystems/automount/Makefile b/filesystems/automount/Makefile
new file mode 100644
index 000000000000..d20e8eafb67e
--- /dev/null
+++ b/filesystems/automount/Makefile
@@ -0,0 +1,36 @@
+PORTNAME= automount
+DISTVERSION= 1.7.9
+CATEGORIES= filesystems sysutils
+MASTER_SITES= https://raw.github.com/vermaden/automount/master/
+
+MAINTAINER= vermaden@interia.pl
+COMMENT= FreeBSD's devd(8) based automount solution
+WWW= https://github.com/vermaden/automount/
+
+LICENSE= BSD2CLAUSE
+
+PLIST_FILES= sbin/automount etc/devd/automount_devd.conf etc/automount.conf.sample
+
+NO_BUILD= yes
+NO_ARCH= yes
+
+OPTIONS_DEFINE= NTFS3G EXT4 EXFAT HFS
+OPTIONS_DEFAULT= NTFS3G EXT4 EXFAT HFS
+NTFS3G_DESC= Enable NTFS write support with ntfs-3g over FUSE
+NTFS3G_RUN_DEPENDS= fusefs-ntfs>=0:filesystems/ntfs
+EXT4_DESC= Support EXT2/3/4 filesystem
+EXT4_RUN_DEPENDS= fusefs-lkl>=0:filesystems/lkl
+HFS_DESC= Support macOS HFS filesystem
+HFS_RUN_DEPENDS= fusefs-hfsfuse>=0:filesystems/hfsfuse
+EXFAT_DESC= Support Microsoft exFAT filesystem
+EXFAT_RUN_DEPENDS= fusefs-exfat>=0:filesystems/exfat \
+ exfat-utils>=0:filesystems/exfat-utils
+
+do-install:
+ ${INSTALL_SCRIPT} ${WRKDIR}/automount ${STAGEDIR}${PREFIX}/sbin
+ ${INSTALL_DATA} ${WRKDIR}/automount_devd.conf \
+ ${STAGEDIR}${PREFIX}/etc/devd
+ ${INSTALL_DATA} ${WRKDIR}/automount.conf \
+ ${STAGEDIR}${PREFIX}/etc/automount.conf.sample
+
+.include <bsd.port.mk>
diff --git a/filesystems/automount/distinfo b/filesystems/automount/distinfo
new file mode 100644
index 000000000000..4ac0eb1e32f9
--- /dev/null
+++ b/filesystems/automount/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1692819472
+SHA256 (automount-1.7.9.tar.gz) = 30e2ec4b6168979f0aada174b73dc8cdfc6097d8a7d7add57504b6733ee21b37
+SIZE (automount-1.7.9.tar.gz) = 7802
diff --git a/filesystems/automount/pkg-descr b/filesystems/automount/pkg-descr
new file mode 100644
index 000000000000..63bc37be8cf3
--- /dev/null
+++ b/filesystems/automount/pkg-descr
@@ -0,0 +1,8 @@
+The automount(8) is devd(8) based automounter for FreeBSD.
+
+It supports most popular filesystems:
+NTFS/FAT/exFAT/EXT2/EXT3/EXT4/UFS/HFS/XFS/ISO9660
+
+There are several ways to automount devices on FreeBSD.
+
+Make sure you are using only one solution at any given time.
diff --git a/filesystems/automount/pkg-message b/filesystems/automount/pkg-message
new file mode 100644
index 000000000000..e8a180cde268
--- /dev/null
+++ b/filesystems/automount/pkg-message
@@ -0,0 +1,10 @@
+[
+{ type: install
+ message: <<EOM
+
+You must run below command to activate automount(8).
+
+ # service devd restart
+EOM
+}
+]
diff --git a/filesystems/avfs/Makefile b/filesystems/avfs/Makefile
new file mode 100644
index 000000000000..e72960be92e5
--- /dev/null
+++ b/filesystems/avfs/Makefile
@@ -0,0 +1,43 @@
+PORTNAME= avfs
+PORTVERSION= 1.1.4
+CATEGORIES= filesystems sysutils
+MASTER_SITES= SF/avf/${PORTNAME}/${PORTVERSION}
+
+MAINTAINER= danfe@FreeBSD.org
+COMMENT= Virtual File System library
+WWW= https://avf.sourceforge.net/
+
+# FUSE daemon is licensed as GPLv2, shared library is LGPLv2
+LICENSE= LGPL20 GPLv2
+LICENSE_COMB= multi
+
+RUN_DEPENDS= ${LOCALBASE}/bin/bash:shells/bash
+
+USES= libtool pkgconfig tar:bz2 shebangfix perl5
+USE_PERL5= run
+SHEBANG_FILES= extfs/uimg scripts/umountavfs scripts/mountavfs
+USE_LDCONFIG= yes
+GNU_CONFIGURE= yes
+CONFIGURE_ENV= PERL="${PERL}"
+
+INSTALL_TARGET= install-strip
+
+OPTIONS_DEFINE= DAV DEBUG FUSE ZSTD
+OPTIONS_SUB= yes
+
+DAV_DESC= Build the DAV module (requires libneon)
+DAV_LIB_DEPENDS= libneon.so:www/neon
+DAV_CONFIGURE_ENABLE= dav
+
+DEBUG_CONFIGURE_ENABLE= debug
+
+FUSE_CONFIGURE_ENABLE= fuse
+FUSE_USES= fuse
+
+ZSTD_LIB_DEPENDS= libzstd.so:archivers/zstd
+ZSTD_CONFIGURE_WITH= zstd
+
+post-patch:
+ @${REINPLACE_CMD} -e '/#include/s,neon/,,' ${WRKSRC}/modules/dav*.?
+
+.include <bsd.port.mk>
diff --git a/filesystems/avfs/distinfo b/filesystems/avfs/distinfo
new file mode 100644
index 000000000000..da7f15db88bc
--- /dev/null
+++ b/filesystems/avfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905202
+SHA256 (avfs-1.1.4.tar.bz2) = 3a7981af8557f864ae10d4b204c29969588fdb526e117456e8efd54bf8faa12b
+SIZE (avfs-1.1.4.tar.bz2) = 614657
diff --git a/filesystems/avfs/files/patch-scripts_mountavfs b/filesystems/avfs/files/patch-scripts_mountavfs
new file mode 100644
index 000000000000..1042b3533c9e
--- /dev/null
+++ b/filesystems/avfs/files/patch-scripts_mountavfs
@@ -0,0 +1,11 @@
+--- scripts/mountavfs.orig 2016-09-16 18:43:19 UTC
++++ scripts/mountavfs
+@@ -14,7 +14,7 @@ else
+ MntDir=${HOME}/.avfs
+ fi
+
+-grep -qE "avfsd ${MntDir}" /proc/mounts || {
++mount -p | grep -qE "${MntDir}.*fusefs" || {
+ if [ ! -e "$MntDir" ]; then
+ mkdir -p "$MntDir"
+ fi
diff --git a/filesystems/avfs/files/patch-scripts_umountavfs b/filesystems/avfs/files/patch-scripts_umountavfs
new file mode 100644
index 000000000000..e93c9c659029
--- /dev/null
+++ b/filesystems/avfs/files/patch-scripts_umountavfs
@@ -0,0 +1,16 @@
+--- scripts/umountavfs.orig 2016-09-16 18:43:19 UTC
++++ scripts/umountavfs
+@@ -14,11 +14,11 @@ else
+ MntDir="${HOME}/.avfs"
+ fi
+
+-grep -qE "${MntDir}.*avfsd" /proc/mounts && {
++mount -p | grep -qE "${MntDir}.*fusefs" && {
+ echo unMounting AVFS on $MntDir...
+ if type -p fusermount > /dev/null 2>&1 ; then
+ fusermount -u -z "$MntDir"
+ else
+- umount -l "$MntDir"
++ umount "$MntDir"
+ fi
+ }
diff --git a/filesystems/avfs/pkg-descr b/filesystems/avfs/pkg-descr
new file mode 100644
index 000000000000..4bdc41f8adbd
--- /dev/null
+++ b/filesystems/avfs/pkg-descr
@@ -0,0 +1,8 @@
+AVFS is a system, which enables all programs to look inside gzip, tar,
+zip, etc. files or view remote (ftp, http, dav, etc.) files, without
+recompiling the programs.
+
+Shared library and FUSE daemon are provided.
+
+AVFS is (C) under the GNU GPL. The shared library supporting AVFS with
+LD_PRELOAD is (C) under the GNU LGPL.
diff --git a/filesystems/avfs/pkg-plist b/filesystems/avfs/pkg-plist
new file mode 100644
index 000000000000..77e9a9d3032b
--- /dev/null
+++ b/filesystems/avfs/pkg-plist
@@ -0,0 +1,51 @@
+bin/avfs-config
+%%FUSE%%bin/avfsd
+bin/davpass
+bin/ftppass
+%%FUSE%%bin/mountavfs
+%%FUSE%%bin/umountavfs
+include/avfs.h
+include/virtual.h
+lib/avfs/extfs/README
+lib/avfs/extfs/a
+lib/avfs/extfs/apt
+lib/avfs/extfs/audio
+lib/avfs/extfs/bpp
+lib/avfs/extfs/deb
+lib/avfs/extfs/deba
+lib/avfs/extfs/debd
+lib/avfs/extfs/dpkg
+lib/avfs/extfs/extfs.ini
+lib/avfs/extfs/ftplist
+lib/avfs/extfs/hp48
+lib/avfs/extfs/iso9660
+lib/avfs/extfs/lslR
+lib/avfs/extfs/mailfs
+lib/avfs/extfs/patchfs
+lib/avfs/extfs/rpm
+lib/avfs/extfs/rpms
+lib/avfs/extfs/trpm
+lib/avfs/extfs/u7z
+lib/avfs/extfs/uace
+lib/avfs/extfs/uadf
+lib/avfs/extfs/uar
+lib/avfs/extfs/uarc
+lib/avfs/extfs/uarj
+lib/avfs/extfs/uc1541
+lib/avfs/extfs/ucab
+lib/avfs/extfs/ucpio
+lib/avfs/extfs/udar
+lib/avfs/extfs/uextrar
+lib/avfs/extfs/uha
+lib/avfs/extfs/uimg
+lib/avfs/extfs/ulha
+lib/avfs/extfs/upp
+lib/avfs/extfs/uxdms
+lib/avfs/extfs/uxpk
+lib/avfs/extfs/uzip
+lib/avfs/extfs/uzoo
+lib/libavfs.a
+lib/libavfs.so
+lib/libavfs.so.0
+lib/libavfs.so.0.0.2
+libdata/pkgconfig/avfs.pc
diff --git a/filesystems/bindfs/Makefile b/filesystems/bindfs/Makefile
new file mode 100644
index 000000000000..5b631a370acb
--- /dev/null
+++ b/filesystems/bindfs/Makefile
@@ -0,0 +1,28 @@
+PORTNAME= bindfs
+DISTVERSION= 1.17.7
+PORTREVISION= 1
+CATEGORIES= filesystems
+MASTER_SITES= https://bindfs.org/downloads/
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= doralitze@chaotikum.org
+COMMENT= FUSE based bindfs implementation way more powerful than nullfs
+WWW= https://bindfs.org/
+
+LICENSE= GPLv2
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+USES= fuse:3 localbase:ldflags pkgconfig
+GNU_CONFIGURE= yes
+
+CONFIGURE_ENV+= fuse3_LIBS="-L${LOCALBASE}/lib -lfuse3"
+CONFIGURE_ARGS= --with-fuse3
+
+PLIST_FILES= bin/bindfs \
+ share/man/man1/bindfs.1.gz
+
+post-patch:
+ @${REINPLACE_CMD} -e 's|-pthread|-lthr|g' \
+ ${PATCH_WRKSRC}/configure
+
+.include <bsd.port.mk>
diff --git a/filesystems/bindfs/distinfo b/filesystems/bindfs/distinfo
new file mode 100644
index 000000000000..c6ae2d4b1980
--- /dev/null
+++ b/filesystems/bindfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1718036736
+SHA256 (bindfs-1.17.7.tar.gz) = c0b060e94c3a231a1d4aa0bcf266ff189981a4ef38e42fbe23296a7d81719b7a
+SIZE (bindfs-1.17.7.tar.gz) = 427251
diff --git a/filesystems/bindfs/pkg-descr b/filesystems/bindfs/pkg-descr
new file mode 100644
index 000000000000..67d40ef6ebe3
--- /dev/null
+++ b/filesystems/bindfs/pkg-descr
@@ -0,0 +1,4 @@
+This port features a fuse implementation of bindfs. Bindfs is like nullfs exept
+for the fact that it features more options and filters. The most important
+difference is that you may overwrite the ownership of files when mounting the
+desired directory somewhere else.
diff --git a/filesystems/cfs/Makefile b/filesystems/cfs/Makefile
new file mode 100644
index 000000000000..64e9f5e1b7a5
--- /dev/null
+++ b/filesystems/cfs/Makefile
@@ -0,0 +1,36 @@
+PORTNAME= cfs
+DISTVERSION= 1.5.0
+PORTREVISION= 1
+CATEGORIES= filesystems security
+MASTER_SITES= http://www.bayofrum.net/dist/${PORTNAME}/
+
+MAINTAINER= crees@FreeBSD.org
+COMMENT= Cryptographic file system implemented as a user-space NFS server
+WWW= https://www.bayofrum.net/cgi-bin/fossil/cfs/
+
+LICENSE= BSD0CLAUSE
+
+ALL_TARGET= cfs
+MAKE_ARGS= CC="${CC}"
+
+CFSD_BOOTSTRAP= ${PREFIX}/cfsd-bootstrap
+USE_RC_SUBR= cfsd
+SUB_FILES= pkg-message
+SUB_LIST= CFSD_BOOTSTRAP=${CFSD_BOOTSTRAP}
+PLIST_SUB= CFSD_BOOTSTRAP=${CFSD_BOOTSTRAP}
+
+post-patch:
+ ${REINPLACE_CMD} 's/^\.TH SSH/.TH CFSSH/' ${WRKSRC}/cfssh.1
+
+do-install:
+ cd ${WRKSRC}; \
+ ${INSTALL_PROGRAM} ccat cfsd cname ${STAGEDIR}${PREFIX}/sbin; \
+ ${INSTALL_PROGRAM} cattach cdetach cmkdir cpasswd ${STAGEDIR}${PREFIX}/bin; \
+ ${INSTALL_SCRIPT} cfssh ${STAGEDIR}${PREFIX}/bin/cfssh; \
+ ${INSTALL_MAN} cattach.1 cdetach.1 cmkdir.1 cpasswd.1 cfssh.1 ${STAGEDIR}${PREFIX}/share/man/man1; \
+ ${INSTALL_MAN} ccat.8 cfsd.8 cname.8 ${STAGEDIR}${PREFIX}/share/man/man8; \
+ ${MKDIR} ${STAGEDIR}${PREFIX}/share/doc/cfs; \
+ ${INSTALL_DATA} README.install notes.ms ${STAGEDIR}${PREFIX}/share/doc/cfs
+ ${INSTALL} -d -m 0 ${STAGEDIR}${CFSD_BOOTSTRAP}
+
+.include <bsd.port.mk>
diff --git a/filesystems/cfs/distinfo b/filesystems/cfs/distinfo
new file mode 100644
index 000000000000..6c65d06b258a
--- /dev/null
+++ b/filesystems/cfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1676460427
+SHA256 (cfs-1.5.0.tar.gz) = dfae1656fb9a063ce3eeae3774de2c59af86f7bf72d1461237a0b61df58a7810
+SIZE (cfs-1.5.0.tar.gz) = 110065
diff --git a/filesystems/cfs/files/cfsd.in b/filesystems/cfs/files/cfsd.in
new file mode 100644
index 000000000000..4a090ed7482e
--- /dev/null
+++ b/filesystems/cfs/files/cfsd.in
@@ -0,0 +1,49 @@
+#!/bin/sh
+
+# PROVIDE: cfsd
+# REQUIRE: mountd
+# KEYWORD: shutdown
+#
+# Add the following line to /etc/rc.conf to enable cfsd:
+#
+# cfsd_enable=YES
+#
+# Additional options:
+#
+# cfsd_port=3049 # the port to listen to
+# cfsd_mountpoint=/crypt # the CFS mountpoint
+#
+
+. /etc/rc.subr
+
+name=cfsd
+rcvar=cfsd_enable
+desc="Cryptographic File System daemon"
+
+load_rc_config $name
+
+: ${cfsd_enable:=no}
+: ${cfsd_port=3049}
+: ${cfsd_mountpoint=/crypt}
+
+command=%%PREFIX%%/sbin/cfsd
+command_args="$cfsd_port > /dev/null 2>&1"
+required_dirs="%%CFSD_BOOTSTRAP%% $cfsd_mountpoint"
+start_postcmd=cfsd_poststart
+stop_precmd=cfsd_prestop
+
+cfsd_poststart()
+{
+ if [ -n "$cfsd_mountpoint" ]; then
+ mount -o port="$cfsd_port",udp,nfsv2,nolockd 127.0.0.1:%%CFSD_BOOTSTRAP%% "$cfsd_mountpoint"
+ fi
+}
+
+cfsd_prestop()
+{
+ if [ -n "$cfsd_mountpoint" ]; then
+ umount "$cfsd_mountpoint"
+ fi
+}
+
+run_rc_command $1
diff --git a/filesystems/cfs/files/pkg-message.in b/filesystems/cfs/files/pkg-message.in
new file mode 100644
index 000000000000..11b2ce5ab5e1
--- /dev/null
+++ b/filesystems/cfs/files/pkg-message.in
@@ -0,0 +1,26 @@
+[
+{ type: install
+ message: <<EOM
+Quick start instructions:
+
+ - add the following entry to /etc/exports:
+
+ %%CFSD_BOOTSTRAP%% 127.0.0.1
+
+ - create the default CFS mountpoint (if you want to use a different
+ mountpoint, set the cfsd_mountpoint variable in /etc/rc.conf):
+
+ # mkdir /crypt
+
+ - enable rpcbind, mountd and cfsd in /etc/rc.conf:
+
+ cfsd_enable="YES"
+ mountd_enable="YES"
+
+ - start mountd and cfsd, or restart:
+
+ # service mountd start
+ # service cfsd start
+EOM
+}
+]
diff --git a/filesystems/cfs/pkg-descr b/filesystems/cfs/pkg-descr
new file mode 100644
index 000000000000..0ade618d36f1
--- /dev/null
+++ b/filesystems/cfs/pkg-descr
@@ -0,0 +1,9 @@
+This is CFS, Matt Blaze's Cryptographic File System. It provides
+transparent encryption and decryption of selected directory trees.
+It is implemented as a user-level NFS server and thus does not
+require any kernel modifications.
+
+For an overview of how to use it, read "${PREFIX}/share/doc/cfs/notes.ms"
+and the manual pages. There is a paper describing CFS at:
+
+ https://www.scs.stanford.edu/nyu/02fa/lab/cfs.pdf
diff --git a/filesystems/cfs/pkg-plist b/filesystems/cfs/pkg-plist
new file mode 100644
index 000000000000..cb9d85095792
--- /dev/null
+++ b/filesystems/cfs/pkg-plist
@@ -0,0 +1,19 @@
+bin/cattach
+bin/cdetach
+bin/cmkdir
+bin/cpasswd
+bin/cfssh
+sbin/ccat
+sbin/cfsd
+sbin/cname
+share/doc/cfs/README.install
+share/doc/cfs/notes.ms
+share/man/man1/cattach.1.gz
+share/man/man1/cdetach.1.gz
+share/man/man1/cmkdir.1.gz
+share/man/man1/cpasswd.1.gz
+share/man/man1/cfssh.1.gz
+share/man/man8/ccat.8.gz
+share/man/man8/cfsd.8.gz
+share/man/man8/cname.8.gz
+@dir(,,0) %%CFSD_BOOTSTRAP%%
diff --git a/filesystems/chironfs/Makefile b/filesystems/chironfs/Makefile
new file mode 100644
index 000000000000..018db229218e
--- /dev/null
+++ b/filesystems/chironfs/Makefile
@@ -0,0 +1,30 @@
+PORTNAME= chironfs
+PORTVERSION= 1.1.1
+PORTREVISION= 3
+CATEGORIES= filesystems
+MASTER_SITES= https://BSDforge.com/projects/source/sysutils/chironfs/
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= portmaster@BSDforge.com
+COMMENT= FUSE based filesystem with replication at the filesystem level
+WWW= https://BSDforge.com/projects/sysutils/fusefs-chironfs/
+
+LICENSE= GPLv3
+LICENSE_FILE= ${WRKSRC}/doc/copyright
+
+USES= fuse localbase:ldflags
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+
+PLIST_FILES= bin/chironfs bin/chirctl share/man/man8/chironfs.8.gz
+PORTDOCS= *
+
+OPTIONS_DEFINE= DOCS
+
+post-patch:
+ @${REINPLACE_CMD} -e 's,-liconv,${ICONV_LIB},' ${WRKSRC}/src/Makefile.*
+
+post-patch-DOCS-off:
+ @${REINPLACE_CMD} -e 's, doc , ,' ${WRKSRC}/Makefile.in
+
+.include <bsd.port.mk>
diff --git a/filesystems/chironfs/distinfo b/filesystems/chironfs/distinfo
new file mode 100644
index 000000000000..91f1eb78d555
--- /dev/null
+++ b/filesystems/chironfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905042
+SHA256 (chironfs-1.1.1.tar.gz) = 9381aa3773fb4797e6aed5a3a5e83a3d342e7950aab3f63fc94a4fdca92791c9
+SIZE (chironfs-1.1.1.tar.gz) = 444036
diff --git a/filesystems/chironfs/pkg-descr b/filesystems/chironfs/pkg-descr
new file mode 100644
index 000000000000..8cc07f74f9c9
--- /dev/null
+++ b/filesystems/chironfs/pkg-descr
@@ -0,0 +1,8 @@
+Chiron FS is a FUSE based filesystem which implements
+replication at the FILESYSTEM LEVEL like RAID 1 does at
+the DEVICE LEVEL.
+
+The replicated filesystems may be of any kind you want.
+The only requisite is that you mount it.
+No need for special configuration files. The setup is as
+simple as one mount command (or one line in fstab).
diff --git a/filesystems/clamfs/Makefile b/filesystems/clamfs/Makefile
new file mode 100644
index 000000000000..bbd947525e7f
--- /dev/null
+++ b/filesystems/clamfs/Makefile
@@ -0,0 +1,42 @@
+PORTNAME= clamfs
+DISTVERSION= 1.2.0
+PORTREVISION= 5
+CATEGORIES= filesystems security
+MASTER_SITES= https://github.com/burghardt/${PORTNAME}/releases/download/${PORTNAME}-${DISTVERSION}/
+
+MAINTAINER= anastasios@mageirias.com
+COMMENT= User-space fs with on-access antivirus scanning
+WWW= https://github.com/burghardt/clamfs
+
+LICENSE= GPLv2
+
+BUILD_DEPENDS= boost-libs>=1.33:devel/boost-libs
+LIB_DEPENDS= libPocoFoundation.so:devel/poco \
+ libPocoNet.so:devel/poco \
+ libPocoXML.so:devel/poco \
+ librlog.so:devel/rlog
+RUN_DEPENDS= clamd:security/clamav
+
+USES= autoreconf compiler:c++11-lib fuse:3 pkgconfig
+
+GNU_CONFIGURE= yes
+
+PLIST_FILES= bin/clamfs \
+ share/man/man1/clamfs.1.gz
+
+PORTDOCS= *
+OPTIONS_DEFINE= DOCS
+
+post-patch:
+ @${REINPLACE_CMD} -e 's|-Werror ||g' ${WRKSRC}/configure.ac
+
+post-patch-DOCS-on:
+ @${REINPLACE_CMD} -e '/socket=/s/ctl/sock/' \
+ ${WRKSRC}/doc/clamfs.xml ${WRKSRC}/doc/debug.xml
+
+post-install-DOCS-on:
+ @${MKDIR} ${STAGEDIR}${DOCSDIR}
+ ${INSTALL_DATA} ${WRKSRC}/doc/clamfs.xml ${STAGEDIR}${DOCSDIR}
+ ${INSTALL_DATA} ${WRKSRC}/doc/debug.xml ${STAGEDIR}${DOCSDIR}
+
+.include <bsd.port.mk>
diff --git a/filesystems/clamfs/distinfo b/filesystems/clamfs/distinfo
new file mode 100644
index 000000000000..de1d9eab16af
--- /dev/null
+++ b/filesystems/clamfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1651043979
+SHA256 (clamfs-1.2.0.tar.gz) = d391afeedb4e5418f8a65c42598489f55047604c7e3eabf0ee2f44110899e42a
+SIZE (clamfs-1.2.0.tar.gz) = 196903
diff --git a/filesystems/clamfs/pkg-descr b/filesystems/clamfs/pkg-descr
new file mode 100644
index 000000000000..25c5ebda1e8d
--- /dev/null
+++ b/filesystems/clamfs/pkg-descr
@@ -0,0 +1,10 @@
+ClamFS is a FUSE-based user-space file system for Linux with
+on-access anti-virus file scanning through clamd daemon
+
+Features
+ - User-space file system
+ - Configuration stored in XML files
+ - FUSE used as file system back-end
+ - Scan files using ClamAV
+ - ScanCache speeds up file access
+ - Sends mail to administrator when detect virus
diff --git a/filesystems/clamfs/pkg-message b/filesystems/clamfs/pkg-message
new file mode 100644
index 000000000000..28c11e54ac06
--- /dev/null
+++ b/filesystems/clamfs/pkg-message
@@ -0,0 +1,16 @@
+[
+{ type: install
+ message: <<EOM
+In order to use clamfs, you should load fusefs.ko module and start clamd.
+
+Type:
+
+ sudo kldload fusefs.ko
+ sudo service clamav-freshclam onestart
+ sudo service clamav-daemon onestart
+
+For more info please visit:
+ https://github.com/burghardt/clamfs#additional-configuration-steps-for-freebsd
+EOM
+}
+]
diff --git a/filesystems/cramfs/Makefile b/filesystems/cramfs/Makefile
new file mode 100644
index 000000000000..7faf71c22319
--- /dev/null
+++ b/filesystems/cramfs/Makefile
@@ -0,0 +1,30 @@
+PORTNAME= cramfs
+PORTVERSION= 1.1
+PORTREVISION= 1
+CATEGORIES= filesystems sysutils
+MASTER_SITES= SF
+
+MAINTAINER= portmaster@BSDforge.com
+COMMENT= Linux Compressed ROM FileSystem
+WWW= https://sourceforge.net/projects/cramfs/
+
+LICENSE= GPLv2+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+USES= gmake
+
+MAKEFILE= GNUmakefile
+
+PLIST_FILES= sbin/cramfsck sbin/mkcramfs
+
+.include <bsd.port.options.mk>
+
+.if ${OPSYS} == FreeBSD
+CFLAGS+= -Wno-error=incompatible-function-pointer-types
+.endif
+
+do-install:
+ ${INSTALL_PROGRAM} ${WRKSRC}/cramfsck ${STAGEDIR}${PREFIX}/sbin
+ ${INSTALL_PROGRAM} ${WRKSRC}/mkcramfs ${STAGEDIR}${PREFIX}/sbin
+
+.include <bsd.port.mk>
diff --git a/filesystems/cramfs/distinfo b/filesystems/cramfs/distinfo
new file mode 100644
index 000000000000..766181316d36
--- /dev/null
+++ b/filesystems/cramfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905204
+SHA256 (cramfs-1.1.tar.gz) = 133caca2c4e7c64106555154ee0ff693f5cf5beb9421ce2eb86baee997d22368
+SIZE (cramfs-1.1.tar.gz) = 24179
diff --git a/filesystems/cramfs/files/patch-GNUmakefile b/filesystems/cramfs/files/patch-GNUmakefile
new file mode 100644
index 000000000000..39ee95d61ca9
--- /dev/null
+++ b/filesystems/cramfs/files/patch-GNUmakefile
@@ -0,0 +1,10 @@
+--- GNUmakefile.orig Wed Nov 29 12:51:59 2006
++++ GNUmakefile Wed Nov 29 12:52:06 2006
+@@ -1,5 +1,5 @@
+-CC = gcc
+-CFLAGS = -W -Wall -O2 -g
++CC ?= gcc
++CFLAGS ?= -W -Wall -O2 -g
+ CPPFLAGS = -I.
+ LDLIBS = -lz
+ PROGS = mkcramfs cramfsck
diff --git a/filesystems/cramfs/files/patch-cramfsck.c b/filesystems/cramfs/files/patch-cramfsck.c
new file mode 100644
index 000000000000..9a685b5565dc
--- /dev/null
+++ b/filesystems/cramfs/files/patch-cramfsck.c
@@ -0,0 +1,39 @@
+--- cramfsck.c.orig Wed Nov 29 12:49:40 2006
++++ cramfsck.c Wed Nov 29 12:51:12 2006
+@@ -47,13 +47,14 @@
+ #include <stdlib.h>
+ #include <errno.h>
+ #include <string.h>
+-#include <sys/sysmacros.h>
+ #include <utime.h>
+ #include <sys/ioctl.h>
+ #define _LINUX_STRING_H_
+-#include <linux/fs.h>
+ #include <linux/cramfs_fs.h>
+ #include <zlib.h>
++
++#define BLKGETSIZE _IO(0x12,96)
++#define MAP_ANONYMOUS 0x20
+
+ /* Exit codes used by fsck-type programs */
+ #define FSCK_OK 0 /* No errors */
+@@ -603,8 +603,17 @@
+ }
+
+ if (opt_extract) {
+- if (mknod(path, i->mode, devtype) < 0) {
+- die(FSCK_ERROR, 1, "mknod failed: %s", path);
++ switch(type) {
++ default:
++ if (mknod(path, i->mode, devtype) < 0) {
++ die(FSCK_ERROR, 1, "mknod failed: %s", path);
++ }
++ break;
++ case 'p':
++ if (mkfifo(path, i->mode) < 0) {
++ die(FSCK_ERROR, 1, "mkfifo failed: %s", path);
++ }
++ break;
+ }
+ change_file_status(path, i);
+ }
diff --git a/filesystems/cramfs/files/patch-mkcramfs.c b/filesystems/cramfs/files/patch-mkcramfs.c
new file mode 100644
index 000000000000..5e4f1328f7a5
--- /dev/null
+++ b/filesystems/cramfs/files/patch-mkcramfs.c
@@ -0,0 +1,12 @@
+--- mkcramfs.c.orig Wed Nov 29 12:47:30 2006
++++ mkcramfs.c Wed Nov 29 12:49:25 2006
+@@ -36,6 +36,9 @@
+ #include <linux/cramfs_fs.h>
+ #include <zlib.h>
+
++#define MAP_ANONYMOUS MAP_ANON
++typedef long long loff_t;
++
+ /* Exit codes used by mkfs-type programs */
+ #define MKFS_OK 0 /* No errors */
+ #define MKFS_ERROR 8 /* Operational error */
diff --git a/filesystems/cramfs/pkg-descr b/filesystems/cramfs/pkg-descr
new file mode 100644
index 000000000000..827f6c3addcd
--- /dev/null
+++ b/filesystems/cramfs/pkg-descr
@@ -0,0 +1,3 @@
+Cramfs is a Linux filesystem designed to be simple, small,
+and to compress things well. It is used on a number of
+embedded systems and small devices.
diff --git a/filesystems/cryptofs/Makefile b/filesystems/cryptofs/Makefile
new file mode 100644
index 000000000000..32a62fa52c02
--- /dev/null
+++ b/filesystems/cryptofs/Makefile
@@ -0,0 +1,28 @@
+PORTNAME= cryptofs
+PORTVERSION= 0.6.0
+PORTREVISION= 7
+CATEGORIES= filesystems
+MASTER_SITES= https://BSDforge.com/projects/source/sysutils/fusefs-cryptofs/
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= portmaster@BSDforge.com
+COMMENT= Encrypted filesystem for FUSE
+WWW= https://BSDforge.com/projects/sysutils/fusefs-cryptofs/
+
+LICENSE= GPLv2+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+LIB_DEPENDS= libgcrypt.so:security/libgcrypt
+
+GNU_CONFIGURE= yes
+USES= fuse gnome pkgconfig
+USE_GNOME= glib20
+DOCS= README cryptofs.conf
+
+OPTIONS_DEFINE= DOCS
+
+post-install-DOCS-on:
+ @${MKDIR} ${STAGEDIR}${DOCSDIR}
+ cd ${WRKSRC} && ${INSTALL_DATA} ${DOCS} ${STAGEDIR}${DOCSDIR}
+
+.include <bsd.port.mk>
diff --git a/filesystems/cryptofs/distinfo b/filesystems/cryptofs/distinfo
new file mode 100644
index 000000000000..ecdb77dac141
--- /dev/null
+++ b/filesystems/cryptofs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905170
+SHA256 (cryptofs-0.6.0.tar.gz) = d884199e38ee09848841dda247db1db0361236b1ce8cc7dd3acb5031f80f6b57
+SIZE (cryptofs-0.6.0.tar.gz) = 352805
diff --git a/filesystems/cryptofs/pkg-descr b/filesystems/cryptofs/pkg-descr
new file mode 100644
index 000000000000..1f24e29d4552
--- /dev/null
+++ b/filesystems/cryptofs/pkg-descr
@@ -0,0 +1,17 @@
+CryptoFS is a encrypted filesystem for Filesystem in Userspace (FUSE) and
+the Linux Userland FileSystem (LUFS). Visit http://fuse.sourceforge.net/
+for more information on FUSE, or http://lufs.sourceforge.net/lufs/ for
+more information on LUFS.
+
+CryptoFS will use a normal directory to store files encrypted. The
+mountpoint will contain the decrypted files. Every file stored in this
+mountpoint will be written encrypted (data and filename) to the directory
+that was mounted. If you unmount the directory the encrypted data can only
+be access by mounting the directory with the correct key again. Like other
+FUSE/LUFS filesystems it does not need root access or any complicated setup
+like creating a filesystem on a encrypted disk using the loop device.
+
+CryptoFS can be build for FUSE, and LUFS. When you build for FUSE you get
+a program to mount the filesystem. For LUFS a shared library will be built
+that can be used by LUFS's lufsd. Both methods can use the same encrypted
+directory.
diff --git a/filesystems/cryptofs/pkg-plist b/filesystems/cryptofs/pkg-plist
new file mode 100644
index 000000000000..f7ae325d2bbd
--- /dev/null
+++ b/filesystems/cryptofs/pkg-plist
@@ -0,0 +1,3 @@
+bin/cryptofs
+%%PORTDOCS%%%%DOCSDIR%%/README
+%%PORTDOCS%%%%DOCSDIR%%/cryptofs.conf
diff --git a/filesystems/curlftpfs/Makefile b/filesystems/curlftpfs/Makefile
new file mode 100644
index 000000000000..6789a2976b05
--- /dev/null
+++ b/filesystems/curlftpfs/Makefile
@@ -0,0 +1,35 @@
+PORTNAME= curlftpfs
+PORTVERSION= 0.9.2
+PORTREVISION= 8
+CATEGORIES= filesystems
+MASTER_SITES= SF
+PKGNAMEPREFIX= fusefs-
+DIST_SUBDIR= ${PORTNAME}
+
+PATCH_SITES= https://sources.debian.org/data/main/c/curlftpfs/0.9.2-9/debian/patches/
+PATCHFILES= fix-CURLOPT_INFILESIZE.patch \
+ free_ftpfs_file-memleak-fix.patch \
+ nocache-memleak-fix.patch \
+ curlftpfs__no_verify_hostname.patch \
+ consistent-feature-flag.patch
+PATCH_DIST_STRIP= -p1
+
+MAINTAINER= rodrigo@FreeBSD.org
+COMMENT= Mount remote FTP directories
+WWW= https://curlftpfs.sourceforge.net/
+
+LICENSE= GPLv2
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+LIB_DEPENDS= libcurl.so:ftp/curl
+
+USES= fuse gnome pkgconfig
+USE_GNOME= glib20
+
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX= ${PREFIX}/share
+
+PLIST_FILES= bin/curlftpfs \
+ share/man/man1/${PORTNAME}.1.gz
+
+.include <bsd.port.mk>
diff --git a/filesystems/curlftpfs/distinfo b/filesystems/curlftpfs/distinfo
new file mode 100644
index 000000000000..822419798166
--- /dev/null
+++ b/filesystems/curlftpfs/distinfo
@@ -0,0 +1,13 @@
+TIMESTAMP = 1730467218
+SHA256 (curlftpfs/curlftpfs-0.9.2.tar.gz) = 4eb44739c7078ba0edde177bdd266c4cfb7c621075f47f64c85a06b12b3c6958
+SIZE (curlftpfs/curlftpfs-0.9.2.tar.gz) = 365503
+SHA256 (curlftpfs/fix-CURLOPT_INFILESIZE.patch) = 19734139dfcd5252f5b8005343afba89e809bed6b476901c24dc6c3535e36501
+SIZE (curlftpfs/fix-CURLOPT_INFILESIZE.patch) = 644
+SHA256 (curlftpfs/free_ftpfs_file-memleak-fix.patch) = accd3b5a322bacbf4ccdc8433ce3fc97b6d6284a56ab29daa1579424e7e41f39
+SIZE (curlftpfs/free_ftpfs_file-memleak-fix.patch) = 425
+SHA256 (curlftpfs/nocache-memleak-fix.patch) = 75db4498ca4879078e25e87da4ef57d648f22aee692e3b5ae23030762f6b4ac2
+SIZE (curlftpfs/nocache-memleak-fix.patch) = 1864
+SHA256 (curlftpfs/curlftpfs__no_verify_hostname.patch) = f69d4537447acbb559a14efbd8f880cde2b20f06ca2b0edd2229f8bb319675db
+SIZE (curlftpfs/curlftpfs__no_verify_hostname.patch) = 872
+SHA256 (curlftpfs/consistent-feature-flag.patch) = afd83c6640c281517e9aea548f760f911e4f5bf00485645e4368ffb0b90c9784
+SIZE (curlftpfs/consistent-feature-flag.patch) = 1724
diff --git a/filesystems/curlftpfs/files/patch-ftpfs.c b/filesystems/curlftpfs/files/patch-ftpfs.c
new file mode 100644
index 000000000000..766e1e826e68
--- /dev/null
+++ b/filesystems/curlftpfs/files/patch-ftpfs.c
@@ -0,0 +1,304 @@
+--- ftpfs.c.orig 2008-04-29 23:05:47 UTC
++++ ftpfs.c
+@@ -257,6 +257,7 @@ static int ftpfs_getdir(const char* path, fuse_cache_d
+ int err = 0;
+ CURLcode curl_res;
+ char* dir_path = get_fulldir_path(path);
++ char* dir_path_uri = path_to_uri(dir_path);
+
+ DEBUG(1, "ftpfs_getdir: %s\n", dir_path);
+ struct buffer buf;
+@@ -264,7 +265,7 @@ static int ftpfs_getdir(const char* path, fuse_cache_d
+
+ pthread_mutex_lock(&ftpfs.lock);
+ cancel_previous_multi();
+- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, dir_path);
++ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, dir_path_uri);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_WRITEDATA, &buf);
+ curl_res = curl_easy_perform(ftpfs.connection);
+ pthread_mutex_unlock(&ftpfs.lock);
+@@ -278,6 +279,7 @@ static int ftpfs_getdir(const char* path, fuse_cache_d
+ NULL, NULL, NULL, 0, h, filler);
+ }
+
++ free_uri(dir_path_uri);
+ free(dir_path);
+ buf_free(&buf);
+ return op_return(err, "ftpfs_getdir");
+@@ -287,6 +289,7 @@ static int ftpfs_getattr(const char* path, struct stat
+ int err;
+ CURLcode curl_res;
+ char* dir_path = get_dir_path(path);
++ char* dir_path_uri = path_to_uri(dir_path);
+
+ DEBUG(2, "ftpfs_getattr: %s dir_path=%s\n", path, dir_path);
+ struct buffer buf;
+@@ -294,7 +297,7 @@ static int ftpfs_getattr(const char* path, struct stat
+
+ pthread_mutex_lock(&ftpfs.lock);
+ cancel_previous_multi();
+- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, dir_path);
++ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, dir_path_uri);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_WRITEDATA, &buf);
+ curl_res = curl_easy_perform(ftpfs.connection);
+ pthread_mutex_unlock(&ftpfs.lock);
+@@ -309,6 +312,7 @@ static int ftpfs_getattr(const char* path, struct stat
+ err = parse_dir((char*)buf.p, dir_path + strlen(ftpfs.host) - 1,
+ name, sbuf, NULL, 0, NULL, NULL);
+
++ free_uri(dir_path_uri);
+ free(dir_path);
+ buf_free(&buf);
+ if (err) return op_return(-ENOENT, "ftpfs_getattr");
+@@ -329,6 +333,7 @@ static size_t ftpfs_read_chunk(const char* full_path,
+ int running_handles = 0;
+ int err = 0;
+ struct ftpfs_file* fh = get_ftpfs_file(fi);
++ char* full_path_uri = path_to_uri(full_path); /* TODO: optimize bu pushing up conversion to context */
+
+ DEBUG(2, "ftpfs_read_chunk: %s %p %zu %lld %p %p\n",
+ full_path, rbuf, size, offset, fi, fh);
+@@ -355,7 +360,7 @@ static size_t ftpfs_read_chunk(const char* full_path,
+
+ cancel_previous_multi();
+
+- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path);
++ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path_uri);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_WRITEDATA, &fh->buf);
+ if (offset) {
+ char range[15];
+@@ -444,6 +449,7 @@ static size_t ftpfs_read_chunk(const char* full_path,
+
+ pthread_mutex_unlock(&ftpfs.lock);
+
++ free_uri(full_path_uri);
+ if (err) return CURLFTPFS_BAD_READ;
+ return size;
+ }
+@@ -497,11 +503,12 @@ int write_thread_ctr = 0;
+ static void *ftpfs_write_thread(void *data) {
+ struct ftpfs_file *fh = data;
+ char range[15];
+-
++ char* full_path_uri = path_to_uri(fh->full_path); /* TODO: optimize bu pushing up conversion to context */
++
+ DEBUG(2, "enter streaming write thread #%d path=%s pos=%lld\n", ++write_thread_ctr, fh->full_path, fh->pos);
+
+
+- curl_easy_setopt_or_die(fh->write_conn, CURLOPT_URL, fh->full_path);
++ curl_easy_setopt_or_die(fh->write_conn, CURLOPT_URL, full_path_uri);
+ curl_easy_setopt_or_die(fh->write_conn, CURLOPT_UPLOAD, 1);
+ curl_easy_setopt_or_die(fh->write_conn, CURLOPT_INFILESIZE, -1);
+ curl_easy_setopt_or_die(fh->write_conn, CURLOPT_READFUNCTION, write_data_bg);
+@@ -541,6 +548,8 @@ static void *ftpfs_write_thread(void *data) {
+
+ sem_post(&fh->data_written); /* ftpfs_write may return */
+
++ free_uri(full_path_uri);
++
+ return NULL;
+ }
+
+@@ -619,16 +628,19 @@ static void free_ftpfs_file(struct ftpfs_file *fh) {
+ }
+
+ static int buffer_file(struct ftpfs_file *fh) {
++ char* full_path_uri = path_to_uri(fh->full_path); /* TODO: optimize bu pushing up conversion to context */
+ // If we want to write to the file, we have to load it all at once,
+ // modify it in memory and then upload it as a whole as most FTP servers
+ // don't support resume for uploads.
+ pthread_mutex_lock(&ftpfs.lock);
+ cancel_previous_multi();
+- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, fh->full_path);
++ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path_uri);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_WRITEDATA, &fh->buf);
+ CURLcode curl_res = curl_easy_perform(ftpfs.connection);
+ pthread_mutex_unlock(&ftpfs.lock);
+
++ free_uri(full_path_uri);
++
+ if (curl_res != 0) {
+ return -EACCES;
+ }
+@@ -641,10 +653,11 @@ static int create_empty_file(const char * path)
+ int err = 0;
+
+ char *full_path = get_full_path(path);
++ char* full_path_uri = path_to_uri(full_path);
+
+ pthread_mutex_lock(&ftpfs.lock);
+ cancel_previous_multi();
+- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path);
++ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path_uri);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_INFILESIZE, 0);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_UPLOAD, 1);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_READDATA, NULL);
+@@ -654,7 +667,9 @@ static int create_empty_file(const char * path)
+
+ if (curl_res != 0) {
+ err = -EPERM;
+- }
++ }
++
++ free_uri(full_path_uri);
+ free(full_path);
+ return err;
+ }
+@@ -873,6 +888,7 @@ static int ftpfs_chmod(const char* path, mode_t mode)
+
+ struct curl_slist* header = NULL;
+ char* full_path = get_dir_path(path);
++ char* full_path_uri = path_to_uri(full_path);
+ char* filename = get_file_name(path);
+ char* cmd = g_strdup_printf("SITE CHMOD %.3o %s", mode_c, filename);
+ struct buffer buf;
+@@ -883,7 +899,7 @@ static int ftpfs_chmod(const char* path, mode_t mode)
+ pthread_mutex_lock(&ftpfs.lock);
+ cancel_previous_multi();
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_POSTQUOTE, header);
+- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path);
++ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path_uri);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_WRITEDATA, &buf);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_NOBODY, ftpfs.safe_nobody);
+ CURLcode curl_res = curl_easy_perform(ftpfs.connection);
+@@ -894,12 +910,13 @@ static int ftpfs_chmod(const char* path, mode_t mode)
+ if (curl_res != 0) {
+ err = -EPERM;
+ }
+-
++
+ buf_free(&buf);
+ curl_slist_free_all(header);
++ free_uri(full_path_uri);
+ free(full_path);
+ free(filename);
+- free(cmd);
++ free(cmd);
+ return op_return(err, "ftpfs_chmod");
+ }
+
+@@ -910,6 +927,7 @@ static int ftpfs_chown(const char* path, uid_t uid, gi
+
+ struct curl_slist* header = NULL;
+ char* full_path = get_dir_path(path);
++ char* full_path_uri = path_to_uri(full_path);
+ char* filename = get_file_name(path);
+ char* cmd = g_strdup_printf("SITE CHUID %i %s", uid, filename);
+ char* cmd2 = g_strdup_printf("SITE CHGID %i %s", gid, filename);
+@@ -922,7 +940,7 @@ static int ftpfs_chown(const char* path, uid_t uid, gi
+ pthread_mutex_lock(&ftpfs.lock);
+ cancel_previous_multi();
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_POSTQUOTE, header);
+- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path);
++ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path_uri);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_WRITEDATA, &buf);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_NOBODY, ftpfs.safe_nobody);
+ CURLcode curl_res = curl_easy_perform(ftpfs.connection);
+@@ -936,6 +954,7 @@ static int ftpfs_chown(const char* path, uid_t uid, gi
+
+ buf_free(&buf);
+ curl_slist_free_all(header);
++ free_uri(full_path_uri);
+ free(full_path);
+ free(filename);
+ free(cmd);
+@@ -999,6 +1018,7 @@ static int ftpfs_rmdir(const char* path) {
+ int err = 0;
+ struct curl_slist* header = NULL;
+ char* full_path = get_dir_path(path);
++ char* full_path_uri = path_to_uri(full_path);
+ char* filename = get_file_name(path);
+ char* cmd = g_strdup_printf("RMD %s", filename);
+ struct buffer buf;
+@@ -1012,7 +1032,7 @@ static int ftpfs_rmdir(const char* path) {
+ pthread_mutex_lock(&ftpfs.lock);
+ cancel_previous_multi();
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_POSTQUOTE, header);
+- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path);
++ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path_uri);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_WRITEDATA, &buf);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_NOBODY, ftpfs.safe_nobody);
+ CURLcode curl_res = curl_easy_perform(ftpfs.connection);
+@@ -1026,6 +1046,7 @@ static int ftpfs_rmdir(const char* path) {
+
+ buf_free(&buf);
+ curl_slist_free_all(header);
++ free_uri(full_path_uri);
+ free(full_path);
+ free(filename);
+ free(cmd);
+@@ -1036,6 +1057,7 @@ static int ftpfs_mkdir(const char* path, mode_t mode)
+ int err = 0;
+ struct curl_slist* header = NULL;
+ char* full_path = get_dir_path(path);
++ char* full_path_uri = path_to_uri(full_path);
+ char* filename = get_file_name(path);
+ char* cmd = g_strdup_printf("MKD %s", filename);
+ struct buffer buf;
+@@ -1046,7 +1068,7 @@ static int ftpfs_mkdir(const char* path, mode_t mode)
+ pthread_mutex_lock(&ftpfs.lock);
+ cancel_previous_multi();
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_POSTQUOTE, header);
+- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path);
++ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path_uri);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_WRITEDATA, &buf);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_NOBODY, ftpfs.safe_nobody);
+ CURLcode curl_res = curl_easy_perform(ftpfs.connection);
+@@ -1060,6 +1082,7 @@ static int ftpfs_mkdir(const char* path, mode_t mode)
+
+ buf_free(&buf);
+ curl_slist_free_all(header);
++ free_uri(full_path_uri);
+ free(full_path);
+ free(filename);
+ free(cmd);
+@@ -1074,6 +1097,7 @@ static int ftpfs_unlink(const char* path) {
+ int err = 0;
+ struct curl_slist* header = NULL;
+ char* full_path = get_dir_path(path);
++ char* full_path_uri = path_to_uri(full_path);
+ char* filename = get_file_name(path);
+ char* cmd = g_strdup_printf("DELE %s", filename);
+ struct buffer buf;
+@@ -1084,7 +1108,7 @@ static int ftpfs_unlink(const char* path) {
+ pthread_mutex_lock(&ftpfs.lock);
+ cancel_previous_multi();
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_POSTQUOTE, header);
+- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path);
++ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, full_path_uri);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_WRITEDATA, &buf);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_NOBODY, ftpfs.safe_nobody);
+ CURLcode curl_res = curl_easy_perform(ftpfs.connection);
+@@ -1098,6 +1122,7 @@ static int ftpfs_unlink(const char* path) {
+
+ buf_free(&buf);
+ curl_slist_free_all(header);
++ free_uri(full_path_uri);
+ free(full_path);
+ free(filename);
+ free(cmd);
+@@ -1299,6 +1324,7 @@ static int ftpfs_readlink(const char *path, char *link
+ int err;
+ CURLcode curl_res;
+ char* dir_path = get_dir_path(path);
++ char* dir_path_uri = path_to_uri(dir_path);
+
+ DEBUG(2, "dir_path: %s %s\n", path, dir_path);
+ struct buffer buf;
+@@ -1306,7 +1332,7 @@ static int ftpfs_readlink(const char *path, char *link
+
+ pthread_mutex_lock(&ftpfs.lock);
+ cancel_previous_multi();
+- curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, dir_path);
++ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_URL, dir_path_uri);
+ curl_easy_setopt_or_die(ftpfs.connection, CURLOPT_WRITEDATA, &buf);
+ curl_res = curl_easy_perform(ftpfs.connection);
+ pthread_mutex_unlock(&ftpfs.lock);
+@@ -1321,6 +1347,7 @@ static int ftpfs_readlink(const char *path, char *link
+ err = parse_dir((char*)buf.p, dir_path + strlen(ftpfs.host) - 1,
+ name, NULL, linkbuf, size, NULL, NULL);
+
++ free_uri(dir_path_uri);
+ free(dir_path);
+ buf_free(&buf);
+ if (err) return op_return(-ENOENT, "ftpfs_readlink");
diff --git a/filesystems/curlftpfs/files/patch-ftpfs.h b/filesystems/curlftpfs/files/patch-ftpfs.h
new file mode 100644
index 000000000000..1f577d3af78a
--- /dev/null
+++ b/filesystems/curlftpfs/files/patch-ftpfs.h
@@ -0,0 +1,11 @@
+--- ftpfs.h.orig 2008-04-25 10:32:30 UTC
++++ ftpfs.h
+@@ -75,7 +75,7 @@ extern struct ftpfs ftpfs;
+ do { if (level <= ftpfs.debug) {\
+ int i = 0; \
+ while (++i < level) fprintf(stderr, " "); \
+- fprintf(stderr, "%ld ", time(NULL));\
++ fprintf(stderr, "%lld ", time(NULL));\
+ fprintf(stderr, __FILE__ ":%d ", __LINE__);\
+ fprintf(stderr, args);\
+ }\
diff --git a/filesystems/curlftpfs/files/patch-path__utils.c b/filesystems/curlftpfs/files/patch-path__utils.c
new file mode 100644
index 000000000000..7855c90e7043
--- /dev/null
+++ b/filesystems/curlftpfs/files/patch-path__utils.c
@@ -0,0 +1,75 @@
+--- path_utils.c.orig 2007-11-20 19:27:58 UTC
++++ path_utils.c
+@@ -92,3 +92,72 @@ char* get_dir_path(const char* path) {
+
+ return ret;
+ }
++
++/*
++ * the chars not needed to be escaped:
++ * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
++ */
++static inline int is_unreserved_rfc3986(char c)
++{
++ int is_locase_alpha = (c >= 'a' && c <= 'z');
++ int is_upcase_alpha = (c >= 'A' && c <= 'Z');
++ int is_digit = (c >= '0' && c <= '9');
++ int is_special = c == '-'
++ || c == '.'
++ || c == '_'
++ || c == '~';
++ int is_unreserved = is_locase_alpha
++ || is_upcase_alpha
++ || is_digit
++ || is_special;
++
++ return is_unreserved;
++}
++
++static inline int is_unreserved(char c)
++{
++ return is_unreserved_rfc3986(c) || c == '/';
++}
++
++char* path_to_uri(const char* path)
++{
++ static const char hex[] = "0123456789ABCDEF";
++ size_t path_len = strlen(path);
++ size_t host_len = strlen(ftpfs.host);
++ /* at worst: c -> %XX */
++ char * encoded_path = malloc (3 * path_len + 1);
++ const char * s = path;
++ char * d = encoded_path;
++
++ /*
++ * 'path' is always prefixed with 'ftpfs.host'
++ */
++ memcpy (d, ftpfs.host, host_len);
++ s += host_len;
++ d += host_len;
++
++ for (; *s; ++s)
++ {
++ char c = *s;
++ if (is_unreserved (c))
++ {
++ *d++ = c;
++ }
++ else
++ {
++ unsigned int hi = ((unsigned)c >> 4) & 0xF;
++ unsigned int lo = ((unsigned)c >> 0) & 0xF;
++ *d++ = '%';
++ *d++ = hex[hi];
++ *d++ = hex[lo];
++ }
++ }
++ *d = '\0';
++
++ return encoded_path;
++}
++
++void free_uri(char* path)
++{
++ free(path);
++}
diff --git a/filesystems/curlftpfs/files/patch-path__utils.h b/filesystems/curlftpfs/files/patch-path__utils.h
new file mode 100644
index 000000000000..8c1c22344c95
--- /dev/null
+++ b/filesystems/curlftpfs/files/patch-path__utils.h
@@ -0,0 +1,14 @@
+--- path_utils.h.orig 2007-11-20 19:27:58 UTC
++++ path_utils.h
+@@ -6,4 +6,11 @@ char* get_full_path(const char* path);
+ char* get_fulldir_path(const char* path);
+ char* get_dir_path(const char* path);
+
++/*
++ * Transforms UNIX path to RFC3986 encoded path
++ * (CURLOPT_URL accepts only such paths)
++ */
++char* path_to_uri(const char* path);
++void free_uri(char* path);
++
+ #endif /* __CURLFTPFS_PATH_UTILS_H__ */
diff --git a/filesystems/curlftpfs/pkg-descr b/filesystems/curlftpfs/pkg-descr
new file mode 100644
index 000000000000..49c7d0da385d
--- /dev/null
+++ b/filesystems/curlftpfs/pkg-descr
@@ -0,0 +1,11 @@
+CurlFtpFS is a filesystem for accessing FTP hosts based on FUSE and
+libcurl.
+
+CurlFtpFS differentiates itself from other FTP filesystems because it
+features:
+
+ * SSLv3 and TLSv1 support
+ * connecting through tunneling HTTP proxies
+ * automatically reconnection if the server times out
+ * transform absolute symlinks to point back into the ftp file
+ system
diff --git a/filesystems/darling-dmg/Makefile b/filesystems/darling-dmg/Makefile
new file mode 100644
index 000000000000..a965a7139c5c
--- /dev/null
+++ b/filesystems/darling-dmg/Makefile
@@ -0,0 +1,33 @@
+PORTNAME= darling-dmg
+DISTVERSIONPREFIX=v
+DISTVERSION= 1.0.4
+CATEGORIES= filesystems sysutils
+
+MAINTAINER= freebsd@sysctl.cz
+COMMENT= FUSE module for .dmg files (containing an HFS+ filesystem)
+WWW= https://github.com/darlinghq/darling-dmg
+
+LICENSE= GPLv3
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+BUILD_DEPENDS= libxml2>0:textproc/libxml2
+LIB_DEPENDS= libicuuc.so:devel/icu
+
+USES= cmake fuse ssl
+USE_GNOME= libxml2
+
+USE_GITHUB= yes
+GH_ACCOUNT= darlinghq
+GH_PROJECT= darling-dmg
+GH_TAGNAME= a36bf0c
+
+PLIST_FILES= bin/darling-dmg \
+ lib/libdmg.so
+
+.include <bsd.port.pre.mk>
+
+post-patch:
+ ${REINPLACE_CMD} 's|%%LOCALBASE%%|${LOCALBASE}|g' \
+ ${WRKSRC}/CMakeLists.txt
+
+.include <bsd.port.post.mk>
diff --git a/filesystems/darling-dmg/distinfo b/filesystems/darling-dmg/distinfo
new file mode 100644
index 000000000000..686997207b39
--- /dev/null
+++ b/filesystems/darling-dmg/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1717086354
+SHA256 (darlinghq-darling-dmg-v1.0.4-a36bf0c_GH0.tar.gz) = 94278f67eac84d906410ab46a9364c5c4cf08c2374385c7decf02c79a05d94e1
+SIZE (darlinghq-darling-dmg-v1.0.4-a36bf0c_GH0.tar.gz) = 56210
diff --git a/filesystems/darling-dmg/files/patch-CMakeLists.txt b/filesystems/darling-dmg/files/patch-CMakeLists.txt
new file mode 100644
index 000000000000..bfb3590a26cf
--- /dev/null
+++ b/filesystems/darling-dmg/files/patch-CMakeLists.txt
@@ -0,0 +1,16 @@
+--- CMakeLists.txt.orig 2019-07-20 22:33:49 UTC
++++ CMakeLists.txt
+@@ -41,7 +41,12 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
+ "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules/")
+
+ add_definitions(-D_FILE_OFFSET_BITS=64)
+-SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -ggdb -O0")
++SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
++
++if(${CMAKE_SYSTEM_NAME} MATCHES FreeBSD)
++ include_directories("%%LOCALBASE%%//include")
++ link_directories("%%LOCALBASE%%/lib")
++endif()
+
+ include(FindLibxml2)
+
diff --git a/filesystems/darling-dmg/pkg-descr b/filesystems/darling-dmg/pkg-descr
new file mode 100644
index 000000000000..0a7d431c5991
--- /dev/null
+++ b/filesystems/darling-dmg/pkg-descr
@@ -0,0 +1,7 @@
+FUSE module for .dmg files (containing an HFS+ filesystem)
+
+Supported file types
+
+* DMG (UDIF) files containing an Apple Disk Image.
+* Apple Disk Images containing an HFS+/HFSX file system.
+* HFS+/HFSX file systems (incl. file systems embedded within HFS).
diff --git a/filesystems/dsbmc-cli/Makefile b/filesystems/dsbmc-cli/Makefile
new file mode 100644
index 000000000000..618c45a973a4
--- /dev/null
+++ b/filesystems/dsbmc-cli/Makefile
@@ -0,0 +1,22 @@
+PORTNAME= dsbmc-cli
+PORTVERSION= 0.4
+PORTREVISION= 1
+CATEGORIES= filesystems sysutils
+MASTER_SITES= http://freeshell.de/~mk/download/
+
+MAINTAINER= mk@nic-nac-project.org
+COMMENT= Command-line client for DSBMD
+WWW= https://freeshell.de/~mk/projects/dsbmc-cli.html
+
+LICENSE= BSD2CLAUSE
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+RUN_DEPENDS= dsbmd>=0.3:filesystems/dsbmd
+
+USES= tar:tgz
+
+MAKE_ARGS= MANDIR="${PREFIX}/share/man/man1"
+
+PLIST_FILES= bin/dsbmc-cli share/man/man1/dsbmc-cli.1.gz
+
+.include <bsd.port.mk>
diff --git a/filesystems/dsbmc-cli/distinfo b/filesystems/dsbmc-cli/distinfo
new file mode 100644
index 000000000000..4df195151c9a
--- /dev/null
+++ b/filesystems/dsbmc-cli/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1559776172
+SHA256 (dsbmc-cli-0.4.tgz) = 68b081f9d6634a57ac8f317af7f0523cd04505790e6a5680a8c26e43bac308a6
+SIZE (dsbmc-cli-0.4.tgz) = 21308
diff --git a/filesystems/dsbmc-cli/pkg-descr b/filesystems/dsbmc-cli/pkg-descr
new file mode 100644
index 000000000000..676ace3523cf
--- /dev/null
+++ b/filesystems/dsbmc-cli/pkg-descr
@@ -0,0 +1,4 @@
+dsbmc-cli is a command-line client for DSBMD that provides a simple interface
+to query information about storage devices, and to send requests to mount,
+unmount and eject these. Furthermore, it can be used as automounter and
+autounmounter.
diff --git a/filesystems/dsbmc/Makefile b/filesystems/dsbmc/Makefile
new file mode 100644
index 000000000000..dc7efcab0ba1
--- /dev/null
+++ b/filesystems/dsbmc/Makefile
@@ -0,0 +1,24 @@
+PORTNAME= dsbmc
+DISTVERSION= 1.2
+PORTREVISION= 1
+CATEGORIES= filesystems sysutils
+
+MAINTAINER= mk@nic-nac-project.org
+COMMENT= Qt client for DSBMD that lets you mount media, and more
+WWW= https://github.com/mrclksr/DSBMC
+
+LICENSE= BSD2CLAUSE
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+RUN_DEPENDS= dsbmd>=0.3:filesystems/dsbmd
+
+USES= compiler:c++11-lang desktop-file-utils gl qmake qt:5 tar:tgz
+
+USE_GL= gl
+USE_QT= buildtools:build core gui linguisttools:build widgets
+
+USE_GITHUB= yes
+GH_ACCOUNT= mrclksr
+GH_PROJECT= DSBMC
+
+.include <bsd.port.mk>
diff --git a/filesystems/dsbmc/distinfo b/filesystems/dsbmc/distinfo
new file mode 100644
index 000000000000..54db0704df9e
--- /dev/null
+++ b/filesystems/dsbmc/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1612973352
+SHA256 (mrclksr-DSBMC-1.2_GH0.tar.gz) = 511c2e2454290614c526872c9abeaf127a7d074b2acec5edf4a02cac2bb324f5
+SIZE (mrclksr-DSBMC-1.2_GH0.tar.gz) = 38680
diff --git a/filesystems/dsbmc/files/patch-src_mainwin.cpp b/filesystems/dsbmc/files/patch-src_mainwin.cpp
new file mode 100644
index 000000000000..eb6e5ef3efba
--- /dev/null
+++ b/filesystems/dsbmc/files/patch-src_mainwin.cpp
@@ -0,0 +1,13 @@
+Add Qt5.14 compatibility
+
+--- src/mainwin.cpp.orig 2020-04-04 08:18:00 UTC
++++ src/mainwin.cpp
+@@ -27,6 +27,8 @@
+ #include <QSpinBox>
+ #include <QMenuBar>
+ #include <QMessageBox>
++#include <QMoveEvent>
++#include <QResizeEvent>
+ #include <QStatusBar>
+ #include <errno.h>
+
diff --git a/filesystems/dsbmc/pkg-descr b/filesystems/dsbmc/pkg-descr
new file mode 100644
index 000000000000..89f7c093e72d
--- /dev/null
+++ b/filesystems/dsbmc/pkg-descr
@@ -0,0 +1,2 @@
+DSBMC is a Qt client for DSBMD. It allows you to mount, unmount, open media
+in a file manager, set the reading speed of a CD/DVD or play a CD/DVD.
diff --git a/filesystems/dsbmc/pkg-plist b/filesystems/dsbmc/pkg-plist
new file mode 100644
index 000000000000..8eb4f23eed53
--- /dev/null
+++ b/filesystems/dsbmc/pkg-plist
@@ -0,0 +1,3 @@
+bin/dsbmc
+share/applications/dsbmc.desktop
+%%DATADIR%%/dsbmc_de.qm
diff --git a/filesystems/dsbmd/Makefile b/filesystems/dsbmd/Makefile
new file mode 100644
index 000000000000..915d7182d96a
--- /dev/null
+++ b/filesystems/dsbmd/Makefile
@@ -0,0 +1,43 @@
+PORTNAME= dsbmd
+PORTVERSION= 1.11.4
+CATEGORIES= filesystems sysutils
+
+MAINTAINER= mk@nic-nac-project.org
+COMMENT= Media mounting daemon
+WWW= https://github.com/mrclksr/DSBMD
+
+LICENSE= BSD2CLAUSE
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+USES= tar:tgz
+
+USE_RC_SUBR= dsbmd
+
+USE_GITHUB= yes
+GH_ACCOUNT= mrclksr
+GH_PROJECT= DSBMD
+
+PLIST_FILES= "@sample etc/dsbmd.conf.sample" \
+ libexec/dsbmd
+
+PORTDOCS= readme.mdoc
+
+OPTIONS_DEFINE= DOCS EXFAT EXT4 HFS LKL MTP NTFS PTP
+OPTIONS_DEFAULT= EXT4 MTP NTFS PTP
+
+EXFAT_DESC= exFAT filesystem support
+EXT4_DESC= Ext4 filesystem support
+HFS_DESC= HFS+ support
+LKL_DESC= Btrfs and XFS support through Linux Kernel Library
+NTFS_DESC= Mount NTFS filesystems with read and write support
+PTP_DESC= Picture Transfer Protocol support
+
+EXFAT_RUN_DEPENDS= mount.exfat:filesystems/exfat
+EXT4_RUN_DEPENDS= fuse-ext2:filesystems/ext2
+HFS_RUN_DEPENDS= hfsfuse:filesystems/hfsfuse
+LKL_RUN_DEPENDS= lklfuse:filesystems/lkl
+MTP_RUN_DEPENDS= jmtpfs:filesystems/jmtpfs
+NTFS_RUN_DEPENDS= ntfs-3g:filesystems/ntfs
+PTP_RUN_DEPENDS= gphotofs:filesystems/gphotofs
+
+.include <bsd.port.mk>
diff --git a/filesystems/dsbmd/distinfo b/filesystems/dsbmd/distinfo
new file mode 100644
index 000000000000..893dc203c2e4
--- /dev/null
+++ b/filesystems/dsbmd/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1618517134
+SHA256 (mrclksr-DSBMD-1.11.4_GH0.tar.gz) = 8efd286bb21f516f1285602ba052212e200392b06a1979ca0338f05d65a8535d
+SIZE (mrclksr-DSBMD-1.11.4_GH0.tar.gz) = 53458
diff --git a/filesystems/dsbmd/files/dsbmd.in b/filesystems/dsbmd/files/dsbmd.in
new file mode 100644
index 000000000000..95eb922d3c64
--- /dev/null
+++ b/filesystems/dsbmd/files/dsbmd.in
@@ -0,0 +1,44 @@
+#!/bin/sh
+
+# PROVIDE: dsbmd
+# REQUIRE: LOGIN devfs devd mountlate
+# KEYWORD: shutdown
+#
+# Add these lines to /etc/rc.conf.local or /etc/rc.conf
+# to enable this service:
+#
+# dsbmd_enable (bool): Set to NO by default.
+# Set it to YES to enable dsbmd.
+#
+
+. /etc/rc.subr
+
+name=dsbmd
+command=%%PREFIX%%/libexec/dsbmd
+rcvar=dsbmd_enable
+pidfile=/var/run/dsbmd.pid
+stop_cmd=dsbmd_stop
+
+load_rc_config $name
+
+: ${dsbmd_enable:="NO"}
+
+dsbmd_stop()
+{
+ if [ -f ${pidfile} ]; then
+ echo "Stopping ${name}."
+ pid=$(cat ${pidfile})
+ n=0
+ while [ $n -lt 5 ]; do
+ kill ${pid} 2>/dev/null || return 0
+ n=$(($n + 1))
+ sleep 1
+ done
+ kill -KILL ${pid} 2>/dev/null
+ else
+ echo "${name} is not running."
+ return 1
+ fi
+}
+
+run_rc_command "$1"
diff --git a/filesystems/dsbmd/pkg-descr b/filesystems/dsbmd/pkg-descr
new file mode 100644
index 000000000000..0829e6d49107
--- /dev/null
+++ b/filesystems/dsbmd/pkg-descr
@@ -0,0 +1,9 @@
+DSBMD is a media/filesystem type detecting daemon that allows clients to mount
+storage devices.
+
+DSBMD watches the mount table for changes, monitors devd events for new storage
+devices, polls CD/DVD drives and card readers for media change events, deter-
+mines media types, volume names, and filesystem types. Mountable devices,
+changes in the mount table as well as device add/remove events and altered
+states of mountable devices are presented to clients. Clients can request DSBMD
+to mount, unmount, and eject media, or set the CD/DVD reading speed.
diff --git a/filesystems/e2fsprogs-core/Makefile b/filesystems/e2fsprogs-core/Makefile
new file mode 100644
index 000000000000..03e90db801f3
--- /dev/null
+++ b/filesystems/e2fsprogs-core/Makefile
@@ -0,0 +1,331 @@
+PORTNAME= e2fsprogs
+PORTVERSION= 1.47.1
+PORTREVISION?= 0 # NOTE: when bumping PORTREVISION, also bump ../e2fsprogs/Makefile!
+CATEGORIES?= filesystems sysutils
+MASTER_SITES= KERNEL_ORG/linux/kernel/people/tytso/${PORTNAME}/v${PORTVERSION}
+
+MAINTAINER?= mandree@FreeBSD.org
+COMMENT?= Utilities & library to manipulate ext2/3/4 filesystems
+WWW= https://e2fsprogs.sourceforge.net/
+
+LICENSE?= GPLv2+
+.if !defined(_no_license_file)
+LICENSE_FILE?= ${WRKSRC}/NOTICE
+.endif
+LICENSE_DISTFILES_GPLv2+ = ${DISTNAME}${EXTRACT_SUFX}
+
+USES= cpe gmake makeinfo pkgconfig tar:xz
+CPE_VENDOR= e2fsprogs_project
+USE_CSTD= gnu99
+# this seems a bit redundant to the --rpath below, but
+# the latter should be more robust in case someone needs
+# to deal with the file systems from a system not yet fully booted.
+.if !defined(PKGNAMESUFFIX)
+USE_LDCONFIG= ${PREFIX}/lib/e2fsprogs
+.endif
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX= ${PREFIX}/share
+
+# while we use the system blkid, we need to --enable-libblkid
+# so that the tools get built:
+CONFIGURE_ARGS?=--disable-fsck \
+ --disable-e2initrd-helper \
+ --disable-libuuid \
+ --disable-uuidd \
+ --enable-libblkid \
+ --enable-elf-shlibs \
+ --libdir='${PREFIX}/lib/e2fsprogs/' \
+ --includedir='${PREFIX}/include/e2fsprogs/' \
+ --with-root-prefix='${PREFIX}' \
+ LDFLAGS='${LDFLAGS} -L${LOCALBASE}/lib -Wl,--rpath -Wl,${LOCALBASE}/lib/e2fsprogs'
+CONFIGURE_ENV?= LIBS='-Wl,--as-needed ${LIBS} -lexecinfo -lelf'
+CPPFLAGS+= ${_FUSEFS_CFLAGS} -I${WRKSRC}/lib -I${LOCALBASE}/include
+CFLAGS+= -Wno-unused-command-line-argument # -D_FILE_OFFSET_BITS=64 # the latter for fuse-libs
+MAKE_ARGS+= pkgconfigdir='${PREFIX}/libdata/pkgconfig'
+MAKE_ENV+= CHECK_CMD=@true
+
+PORTSCOUT= ignore:1 # cannot handle the version in the directory
+
+.if !defined(MASTERDIR)
+CPPFLAGS+= -D__GNUC_PREREQ\(a,b\)=1
+
+INSTALL_TARGET= install install-libs
+
+OPTIONS_DEFINE= DOCS NLS FUSEFS PARALLELTESTS SLOWTESTS BASHTESTS LIBUNWIND
+OPTIONS_EXCLUDE+= EXAMPLES
+OPTIONS_SUB= yes
+
+OPTIONS_SINGLE= SELFTEST
+OPTIONS_SINGLE_SELFTEST= NOTESTS SMALLTESTS ALLTESTS
+OPTIONS_DEFAULT= SMALLTESTS
+FUSEFS_DESC= Build user-land ext2/3/4 FUSE module (slow!)
+SELFTEST_DESC= Choose which set of self-tests to run
+NOTESTS_DESC= Do not run any self-tests (Tier-1, DISCOURAGED)
+SMALLTESTS_DESC=Run tests that need <500 MB disk space (DEFAULT)
+ALLTESTS_DESC= Run most self-tests (needs more RAM/disk space)
+PARALLELTESTS_DESC= Parallelize self-tests (needs more disk space)
+SLOWTESTS_DESC= Enable slow tests that are skipped by default
+BASHTESTS_DESC= Enable tests that require the GNU bash shell
+LIBUNWIND_DESC= Backtrace with libunwind (do set WITH_DEBUG_PORTS+=${PKGORIGIN}!)
+
+FUSEFS_CONFIGURE_ENABLE= fuse2fs
+FUSEFS_USES= fuse:3
+# we can't use FUSEFS_CFLAGS, see below for workaround
+FUSEFS_LIBS= -Wl,--as-needed -lfuse3 -lpthread
+FUSEFS_LDFLAGS= -L${LOCALBASE}/lib
+
+NLS_USES= gettext iconv:build
+
+BASHTESTS_BUILD_DEPENDS= ${BASH_CMD}:shells/bash
+BASH_CMD= ${LOCALBASE}/bin/bash
+
+LIB_DEPENDS+= libblkid.so:filesystems/e2fsprogs-libblkid
+LIB_DEPENDS+= libuuid.so:misc/e2fsprogs-libuuid
+
+LIBUNWIND_LIB_DEPENDS= libunwind.so:devel/libunwind
+LIBUNWIND_LIBS+= -L${LOCALBASE}/lib -lunwind
+LIBUNWIND_LDFLAGS+= -rdynamic
+LIBUNWIND_EXTRA_PATCHES=${FILESDIR}/extrapatch-e2fsck_sigcatcher.c
+
+PORTDOCS= NOTICE README RELEASE-NOTES SUBMITTING-PATCHES
+.endif
+
+# even under DEVELOPER, no REINPLACE_CMD warnings desired
+# it simply makes no sense to warn about dozens of files
+# for systematic edits that run over files that don't need the edits.
+# a "warn if nothing was edited by one command" would be acceptable,
+# but until we have that in the framework, just
+# avoid Tools/scripts/sed_checked altogether:
+REINPLACE_CMD= ${SED} ${REINPLACE_ARGS}
+
+PKGDEINSTALL= ${PKGINSTALL}
+
+MAKE_ARGS+= V=1
+
+.include <bsd.port.options.mk>
+
+.if ${MASTERDIR} == ${.CURDIR}
+PKGNAMESUFFIX= -core
+.endif
+
+.if !empty(PORT_OPTIONS:MFUSEFS)
+# this dance is required becuse the -I must go before the default -I${LOCALBASE}/include, so we can't use FUSEFS_CFLAGS
+_FUSEFS_CFLAGS= -I${LOCALBASE}/include/fuse3
+.else
+_FUSEFS_CFLAGS=
+.endif
+
+. if ! empty(ARCH:Mpowerpc*)
+# Fix powerpc64/powerpc SIGSEGV,
+# see https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=231570 (ppc64)
+# see https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=242798 (ppc32 - untested)
+USES+= compiler:c11
+. endif
+
+.if empty(PORT_OPTIONS:MNOTESTS) && ${MASTERDIR} == ${.CURDIR}
+USES+= perl5
+USE_PERL5= build
+.endif
+
+.include <bsd.port.pre.mk>
+
+.if ${PORT_OPTIONS:MNLS}
+. if empty(ICONV_LIB)
+libintl= ${LOCALBASE}/lib/libintl.a
+. else
+libintl= ${LOCALBASE}/lib/libintl.a ${LOCALBASE}/lib/libiconv.a
+. endif
+.else
+CONFIGURE_ARGS+=--disable-nls
+libintl=
+.endif
+
+.if ${MASTERDIR} == ${.CURDIR} && (${ARCH} == "aarch64" || ${ARCH} == "riscv64")
+EXTRA_PATCHES+= ${FILESDIR}/extrapatch-no-sbrk
+.endif
+
+post-patch::
+.if !empty(DISTFILES)
+ @${REINPLACE_CMD} -e 's/<malloc\.h>/<stdlib.h>/' ${WRKSRC}/*/*.c
+ @${REINPLACE_CMD} -e 's,/etc/blkid.tab,${ETCDIR}/blkid.tab,' ${WRKSRC}/misc/blkid* ${WRKSRC}/lib/blkid/blkidP.h
+ @${REINPLACE_CMD} -E -e 's/__GNUC_PREREQ\>/__GNUC_PREREQ__/' ${WRKSRC}/*/*/*.[ch] ${WRKSRC}/*/*.c
+. if empty(PORT_OPTIONS:MALLTESTS)
+. for i in \
+ d_fallocate_blkmap \
+ f_baddir \
+ f_bbfile \
+ f_convert_bmap \
+ f_detect_junk \
+ f_inode_ea_collision \
+ f_lpffile \
+ f_no_cache_corrupt_inode \
+ f_opt_extent \
+ j_corrupt_descr_csum \
+ m_bigjournal \
+ m_hugefile_slack \
+ m_offset \
+ m_raid_opt \
+ r_32to64bit \
+ r_32to64bit_expand_full \
+ r_32to64bit_meta \
+ r_32to64bit_move_itable \
+ r_64to32bit \
+ r_64to32bit_meta \
+ r_expand_full \
+ r_min_itable \
+ t_change_uuid_mounted \
+ t_dangerous \
+ t_disable_changed_csum_seed_mounted \
+ t_disable_mcsum \
+ t_disable_mcsum_noinitbg \
+ t_disable_mcsum_yesinitbg \
+ t_enable_mcsum \
+ t_enable_mcsum_initbg \
+ t_iexpand_full \
+ t_iexpand_mcsum \
+ t_uninit_bg_rm \
+ u_dryrun \
+ u_mke2fs_opt_offset
+ @${MV} ${WRKSRC}/tests/${i} ${WRKSRC}/tests/disabled_test-${i}
+. endfor
+. endif
+. if ${PORT_OPTIONS:MBASHTESTS}
+ ${REINPLACE_CMD} -e 's}^SHELL *=.*}SHELL = ${_CHECK_SHELL}}' ${WRKSRC}/MCONFIG.in
+. else
+. for i in f_large_dir
+ @${MV} ${WRKSRC}/tests/${i} ${WRKSRC}/tests/disabled_test-${i}
+. endfor
+. endif
+.endif
+
+##############################################################
+# Master port stuff that is not to be seen by the slave ports.
+##############################################################
+.if ${MASTERDIR} == ${.CURDIR}
+# NOTE: The previous .if block goes all the way to the end of the file.
+
+.if !empty(PORT_OPTIONS:MNOTESTS) && (${OPSYS} == FreeBSD) && (${OSVERSION} >= 1500000 || (${ARCH} != amd64))
+BROKEN= it was not tested on your system by the maintainer; you must run self-tests
+.endif
+
+pre-build:
+# fix up Makefile ordering for parallel builds
+ cd ${WRKSRC}/lib/et && ${DO_MAKE_BUILD} compile_et
+ cd ${WRKSRC}/lib/ss && _ET_DIR_OVERRIDE=../et ../et/compile_et ss_err.et \
+ && ${REINPLACE_CMD} -f ${FILESDIR}/fix-ss_err.h.sed ss_err.h
+ cd ${WRKSRC}/lib/support && ${DO_MAKE_BUILD} prof_err.h
+
+.if ${PORT_OPTIONS:MPARALLELTESTS}
+_CHECK_JOBS=${_MAKE_JOBS}
+.else
+_CHECK_JOBS=
+.endif
+
+_checkaddargs=
+.if ${PORT_OPTIONS:MBASHTESTS}
+_CHECK_SHELL=${LOCALBASE}/bin/bash
+_checkaddargs+=--eval SHELL:=${BASH_CMD}
+.else
+_CHECK_SHELL=${SH}
+.endif
+
+.if !defined(TMPDIR)
+_checkaddargs+=TMPDIR=${WRKDIR}/tmp
+.endif
+
+.if ${PORT_OPTIONS:MSLOWTESTS}
+_check_target=SKIP_SLOW_TESTS= check
+_check_timeout=7200
+.else
+_check_target=check
+_check_timeout=180
+.endif
+
+.if ${PORT_OPTIONS:MLIBUNWIND}
+_staticlibs+=${LOCALBASE}/lib/libunwind.a /usr/lib/liblzma.a /usr/lib/libmd.a
+.endif
+
+post-build:
+# Relink e2fsck statically - We need to make sure that tools for the root file
+# system are statically linked against anything that is outside the root fs,
+# else we're in trouble if e2fsck is needed for boot:
+# (we don't use e2fsck.static, since we can link libc.so dynamically)
+# NOTE: we need to link libgcc statically, it might be under /usr/local!
+# => do not add a -Bdynamic - but instead list the dynamic libraries
+# before the -Bstatic
+ cd ${WRKSRC}/e2fsck && ${RM} -f e2fsck \
+ && ${MAKE_CMD} e2fsck V=1 \
+ LIBS="-static-libgcc -lc -Bstatic ../lib/libsupport.a ../lib/libext2fs.a ../lib/libcom_err.a \
+ ${_staticlibs} /usr/lib/libexecinfo.a /usr/lib/libelf.a \
+ ${LOCALBASE}/lib/libblkid.a ${LOCALBASE}/lib/libuuid.a ${libintl} ../lib/libe2p.a " \
+ && ${STRIP_CMD} e2fsck
+# Regression check: avoid a port (not upstream!) regression from 1.40.5,
+# check that e2fsck isn't dynalinked against anything but libc.so:
+ @${ECHO_CMD} -n "===> checking that e2fsck depends on no shared objects outside /lib: "
+ @a="$$(ldd ${WRKSRC}/e2fsck/e2fsck 2>/dev/null \
+ | ${GREP} -v 'not a dynamic executable' \
+ | ${GREP} '=>' \
+ | ${AWK} '{print $$3;}' \
+ | ${EGREP} -v '^/lib/lib.*\.so\.' || :)"; \
+ if test "x$$a" = "x" ; then echo 'PASS' ; else \
+ echo 'FAIL' ; echo '===> e2fsck depends on:' ; echo "$$a" ; exit 1 ; fi
+# Update translation binary files
+.if ${PORT_OPTIONS:MNLS}
+ cd ${WRKSRC}/po && ${MAKE_CMD} update-gmo
+.endif
+# Build fsck(8) wrapper
+ ${CC} ${CPPFLAGS} ${CFLAGS} ${LDFLAGS} -s ${LIBS} \
+ -o ${WRKSRC}/fsck_ext2fs ${FILESDIR}/fsck_ext2fs.c
+# While the ${MAKE} check can take a minute on an end user's system, the
+# correctness of tools such as e2fsck is critical to the health of the
+# file systems. The upstream is not using any *BSD as his development
+# system, and therefore let's exercise due diligence in running the self-
+# test on each and every system and not just package building hosts.
+# There have been subtle failures induced by Linux-isms in the past.
+# -- Matthias Andree, package maintainer, 2007-09-18
+.if empty(PORT_OPTIONS:MNOTESTS)
+ @${ECHO_CMD} '===> Running e2fsprogs self-test suite'
+# do not add -j options unconditionally to ${MAKE_CMD} below, this might break
+# due to excessive disk space use.
+ cd ${WRKSRC}/tests && \
+ ulimit -t ${_check_timeout} && \
+ ${MKDIR} ${WRKDIR}/tmp && \
+ ${SETENV} e2fsprogs_inhibit_SIGINFO=1 BLKID_FILE=${WRKDIR}/tmp/blkid.tab SHELL=${_CHECK_SHELL} \
+ ${MAKE_CMD} ${_check_target} ${_CHECK_JOBS} ${_checkaddargs} \
+ || { head -n30000 ${WRKSRC}/tests/*.failed 2>/dev/null ; exit 1 ; }
+.else
+ @${ECHO_CMD} '===> SKIPPING e2fsprogs self-test suite (DISCOURAGED!)'
+.endif
+
+post-install:
+ ${INSTALL_PROGRAM} ${WRKSRC}/fsck_ext2fs ${STAGEDIR}${PREFIX}/sbin/
+ ${LN} -fs e2fsck ${STAGEDIR}${PREFIX}/sbin/fsck.ext2
+ ${LN} -fs e2fsck ${STAGEDIR}${PREFIX}/sbin/fsck.ext3
+ ${LN} -fs e2fsck ${STAGEDIR}${PREFIX}/sbin/fsck.ext4
+ # now the remainder of the usual post-install jobs:
+ ${INSTALL_MAN} ${FILESDIR}/fsck_ext2fs.8 ${STAGEDIR}${PREFIX}/share/man/man8/
+.if ${PORT_OPTIONS:MDOCS}
+ ${MKDIR} ${STAGEDIR}${DOCSDIR}
+.for i in ${PORTDOCS}
+ ${INSTALL_DATA} ${WRKSRC}/${i} ${STAGEDIR}${DOCSDIR}
+.endfor
+.endif
+ # remove or relocate files installed by other ports already, or shadowing system files:
+ cd ${STAGEDIR}${PREFIX} && \
+ ${XARGS} <${FILESDIR}/unwanted ${RM} && \
+ ${RMDIR} include/e2fsprogs/blkid
+ ${MV} ${STAGEDIR}${PREFIX}/bin/compile_et ${STAGEDIR}${PREFIX}/bin/e2fsprogs-compile_et
+ ${MV} ${STAGEDIR}${PREFIX}/share/man/man1/compile_et.1 ${STAGEDIR}${PREFIX}/share/man/man1/e2fsprogs-compile_et.1
+ ${MKDIR} ${STAGEDIR}${DATADIR}/et/
+ ${MV} ${STAGEDIR}${PREFIX}/share/et/* ${STAGEDIR}${DATADIR}/et/
+ ${REINPLACE_CMD} -e 's}^DIR=.*$$}DIR=${DATADIR}/et}' -i '' ${STAGEDIR}${PREFIX}/bin/e2fsprogs-compile_et
+ ${RMDIR} ${STAGEDIR}${PREFIX}/share/et
+ ${MV} -f ${STAGEDIR}${PREFIX}/share/man/man3/com_err.3 \
+ ${STAGEDIR}${PREFIX}/share/man/man3/e2fsprogs-com_err.3
+ ${RM} ${STAGEDIR}${PREFIX}/share/man/man3/libblkid.3
+
+#
+# the next line closes .if ${MASTERDIR} == ${.CURDIR}
+.endif
+
+.include <bsd.port.post.mk>
diff --git a/filesystems/e2fsprogs-core/distinfo b/filesystems/e2fsprogs-core/distinfo
new file mode 100644
index 000000000000..fba31cb081b8
--- /dev/null
+++ b/filesystems/e2fsprogs-core/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1717066777
+SHA256 (e2fsprogs-1.47.1.tar.xz) = 5a33dc047fd47284bca4bb10c13cfe7896377ae3d01cb81a05d406025d99e0d1
+SIZE (e2fsprogs-1.47.1.tar.xz) = 7271444
diff --git a/filesystems/e2fsprogs-core/files/extrapatch-e2fsck_sigcatcher.c b/filesystems/e2fsprogs-core/files/extrapatch-e2fsck_sigcatcher.c
new file mode 100644
index 000000000000..10288de1dc58
--- /dev/null
+++ b/filesystems/e2fsprogs-core/files/extrapatch-e2fsck_sigcatcher.c
@@ -0,0 +1,19 @@
+--- e2fsck/sigcatcher.c.orig 2020-01-06 23:10:17 UTC
++++ e2fsck/sigcatcher.c
+@@ -17,6 +17,7 @@
+ #ifdef HAVE_EXECINFO_H
+ #include <execinfo.h>
+ #endif
++#include <libunwind.h>
+
+ #include "e2fsck.h"
+
+@@ -376,7 +377,7 @@ static void die_signal_handler(int signum, siginfo_t *
+ void *stack_syms[32];
+ int frames;
+
+- frames = backtrace(stack_syms, 32);
++ frames = unw_backtrace(stack_syms, 32);
+ backtrace_symbols_fd(stack_syms, frames, 2);
+ }
+ #endif
diff --git a/filesystems/e2fsprogs-core/files/extrapatch-no-sbrk b/filesystems/e2fsprogs-core/files/extrapatch-no-sbrk
new file mode 100644
index 000000000000..6aa12d2b05a5
--- /dev/null
+++ b/filesystems/e2fsprogs-core/files/extrapatch-no-sbrk
@@ -0,0 +1,34 @@
+diff -up ./e2fsck/e2fsck.h.orig ./e2fsck/e2fsck.h
+--- ./e2fsck/e2fsck.h.orig 2018-05-16 01:42:44.000000000 +0200
++++ ./e2fsck/e2fsck.h 2018-07-07 12:50:43.420944000 +0200
+@@ -134,7 +134,7 @@ struct dx_dirblock_info {
+ #define DX_FLAG_FIRST 4
+ #define DX_FLAG_LAST 8
+
+-#define RESOURCE_TRACK
++#undef RESOURCE_TRACK
+
+ #ifdef RESOURCE_TRACK
+ /*
+diff -up ./resize/resource_track.c.orig ./resize/resource_track.c
+--- ./resize/resource_track.c.orig 2018-05-16 01:42:44.000000000 +0200
++++ ./resize/resource_track.c 2018-07-07 14:24:54.728576000 +0200
+@@ -27,7 +27,6 @@ void init_resource_track(struct resource
+ io_stats io_start = 0;
+
+ track->desc = desc;
+- track->brk_start = sbrk(0);
+ gettimeofday(&track->time_start, 0);
+ #ifdef HAVE_GETRUSAGE
+ #ifdef sun
+@@ -84,9 +83,7 @@ void print_resource_track(ext2_resize_t
+ kbytes(malloc_info.arena), kbytes(malloc_info.hblkhd),
+ kbytes(malloc_info.uordblks), kbytes(malloc_info.fordblks));
+ #else
+- printf("Memory used: %lu, ",
+- (unsigned long) (((char *) sbrk(0)) -
+- ((char *) track->brk_start)));
++ printf("Memory used: unknown, ");
+ #endif
+ #ifdef HAVE_GETRUSAGE
+ getrusage(RUSAGE_SELF, &r);
diff --git a/filesystems/e2fsprogs-core/files/fix-ss_err.h.sed b/filesystems/e2fsprogs-core/files/fix-ss_err.h.sed
new file mode 100644
index 000000000000..1b72045c519b
--- /dev/null
+++ b/filesystems/e2fsprogs-core/files/fix-ss_err.h.sed
@@ -0,0 +1,3 @@
+/#define __ss_err_h__/a\
+#include <stdio.h>
+#include <com_err.h>
diff --git a/filesystems/e2fsprogs-core/files/fsck_ext2fs.8 b/filesystems/e2fsprogs-core/files/fsck_ext2fs.8
new file mode 100644
index 000000000000..3ab4c664f740
--- /dev/null
+++ b/filesystems/e2fsprogs-core/files/fsck_ext2fs.8
@@ -0,0 +1,95 @@
+.TH fsck_ext2fs 8 2006-07-02 "Matthias Andree" "FreeBSD Ports"
+.\"
+.\" fsck_ext2fs.8 - manual page for fsck_ext2fs wrapper
+.\"
+.\" (C) Copyright 2006 by Matthias Andree <matthias.andree@gmx.de>
+.\"
+.\" License: This file may be redistributed in accordance with the terms
+.\" of the GNU General Public License v2.
+.\"
+.\" Upstream $Id: fsck_ext2fs.8,v 1.3 2006/07/02 11:45:21 emma Exp $
+.\"
+.SH NAME
+.B fsck_ext2fs
+\- compatibility wrapper for e2fsck
+.SH SYNOPSIS
+.P
+.B fsck_ext2fs
+[\fB\-Fpfnyv\fR] [\fB\-b\fR \fIblock\fR]
+.SH DESCRIPTION
+.P
+\fBfsck_ext2fs\fR maps the traditional FreeBSD \fBfsck_ffs\fR options to
+options with the same functionality for \fBe2fsck,\fR runs \fBe2fsck\fR
+and then maps its exit status to values that FreeBSD understands.
+\fBe2fsck\fR is a utility to check and repair ext2 and ext3 file
+systems.
+
+.SH OPTIONS
+.IP \fB\-F\fR
+(check foreground mode required) Immediately exits with status 1 to tell
+\fBfsck\fR that ext2fs cannot be checked in the background. \fBfsck\fR
+usually runs \fBfsck_*\fR programs twice, first with \fB\-F\fR to find
+out if they can do background checking, then either immediately without
+\fB\-F\fR for foreground checking or deferred in the background with
+\fB\-B\fR.
+.IP \fB\-p\fR
+(preen mode) This option suppresses adding the \fB\-f\fR option (unless
+\fB\-f\fR is also given) and adds the \fB\-p\fR option to the
+\fBe2fsck\fR command line. This causes \fBe2fsck\fR to automatically fix
+any filesystem problems that can safely be fixed without operator
+intervention. Without this option given, \fBe2fsck\fR will be run with
+the \fB\-f\fR option to force a check, since interactive scan and repair
+mode is the default on FreeBSD, but not on Linux where \fBe2fsck\fR
+comes from.
+.IP \fB\-f\fR
+(force check) This option forces the check of a clean file system while
+preening and is passed to \fBe2fsck\fR verbatim.
+.IP \fB\-n\fR
+("no" mode) This option causes the file system to be opened in read-only
+mode and assume "no" as answer to all questions. This is the only way to
+safely run \fBfsck\fR on a mounted ext2 or ext3 file system. This option
+is passed to \fBe2fsck\fR verbatim.
+.IP \fB\-y\fR
+("yes" mode) This option is passed verbatim to \fBe2fsck\fR and causes
+it to assume "yes" as answer to all questions. This allows the
+non-interactive use of e2fsck but is rather aggressive. Use with care.
+.IP \fB\-v\fR
+(verbose output) This option is passed verbatim to \fBe2fsck\fR and
+causes it to verbosely report its progress.
+.IP "\fB\-b\fR \fIblock\fR"
+(use alternate super block) This option is passed verbatim to
+\fBe2fsck\fR and selects an alternate super block, for use when the
+primary super block has been damaged. Please see the \fBe2fsck\fR(8)
+manual page for details.
+
+.SH EXIT STATUS
+If errors remain after \fBe2fsck\fR, an invalid option or too many
+options have been specified, \fBe2fsck\fR was killed with a signal or
+the \fIfork\fB system call failed, \fBfsck_ext2fs\fR exits with status
+EXIT_FAILURE (usually 1). If \fBe2fsck\fR cannot be started, exits with
+status 127. If the file system is clean after \fBe2fsck\fR operation,
+exits with status EXIT_SUCCESS (0).
+
+.SH NOTES
+.P
+This utility is merely meant as an adaptor so that \fBe2fsck\fR can be
+run during the boot process, it does not support all options that
+\fBe2fsck\fR offers. If you need one of its advanced options, please run
+\fBe2fsck\fR directly.
+
+.SH FILES
+.TP
+.I /sbin/e2fsck
+is the location of the \fBe2fsck\fR program to run.
+
+.SH AUTHOR
+.P
+Matthias Andree <matthias.andree@gmx.de> wrote the program and this
+manual page.
+.SH CONFORMING TO
+The FreeBSD 6.1 command line interface for \fBfsck_ufs\fR(8).
+.SH SEE ALSO
+.BR fsck (8),
+.BR e2fsck (8)
+and
+.BR fsck_ufs (8).
diff --git a/filesystems/e2fsprogs-core/files/fsck_ext2fs.c b/filesystems/e2fsprogs-core/files/fsck_ext2fs.c
new file mode 100644
index 000000000000..9634c414242e
--- /dev/null
+++ b/filesystems/e2fsprogs-core/files/fsck_ext2fs.c
@@ -0,0 +1,145 @@
+/*
+ * fsck_ext2fs - wrapper for e2fsck on FreeBSD
+ * Copyright (C) 2004,2006 Matthias Andree <matthias.andree@gmx.de>
+ * redistributable in accordance with the
+ * GNU General Public License v2
+ *
+ * Upstream: $Id: fsck_ext2fs.c,v 1.6 2006/07/02 11:37:49 emma Exp $
+ *
+ * format: gindent -kr
+ */
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/wait.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <errno.h>
+
+__attribute__ ((noreturn))
+static int die(const char *tag)
+{
+ perror(tag);
+ exit(EXIT_FAILURE);
+}
+
+int main(int argc, char **argv)
+{
+ int ch, i = 1, force = 0, status, verbose = 0, t;
+ long block = 0;
+ enum { normal, preen, yes, no } mode = normal;
+ char *cmd[256];
+ pid_t pid;
+
+ cmd[0] = "/sbin/e2fsck";
+ while ((ch = getopt(argc, argv, "BFpfnyb:v")) != -1) {
+ switch (ch) {
+ case 'p':
+ mode = preen;
+ break;
+ case 'f':
+ force = 1;
+ break;
+ case 'n':
+ mode = no;
+ break;
+ case 'y':
+ mode = yes;
+ break;
+ case 'b':
+ block = atol(optarg);
+ break;
+ case 'v':
+ verbose++;
+ break;
+ case 'F':
+ /* e2fsck does not support background checking,
+ * hence exit with nonzero status to force
+ * the foreground check. */
+ exit(1);
+ case 'B':
+ default:
+ fprintf(stderr, "%s: unknown option -%c\n",
+ argv[0], optopt);
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ if (force)
+ cmd[i++] = "-f";
+
+ switch (mode) {
+ case normal:
+ /* FreeBSD needs -f to force a check only in context
+ * with -p -- so map normal to force to match
+ * expectations */
+ if (!force)
+ cmd[i++] = "-f";
+ break;
+ case yes:
+ cmd[i++] = "-y";
+ break;
+ case no:
+ cmd[i++] = "-n";
+ break;
+ case preen:
+ cmd[i++] = "-p";
+ break;
+ }
+
+ if (block) {
+ static char b[30];
+
+ sprintf(b, "-b %ld", block);
+ cmd[i++] = b;
+ }
+
+ /* silently limit verbose to 15 so we don't overflow the cmd array */
+ if (verbose > 15)
+ verbose = 15;
+
+ for (t = verbose; t > 1; t--)
+ cmd[i++] = "-v";
+
+ while (optind < argc) {
+ cmd[i++] = argv[optind++];
+ /* sanity check so we don't overflow the cmd buffer */
+ if (i+1 == sizeof(cmd)/sizeof(cmd[0])) {
+ errno = E2BIG;
+ die(argv[0]);
+ }
+ }
+
+ cmd[i++] = 0;
+
+ if (verbose) {
+ for (i=0; cmd[i]; i++)
+ fputs(cmd[i], stderr),
+ fputc(' ', stderr);
+ fputc('\n', stderr);
+ }
+
+ pid = fork();
+ switch (pid) {
+ case -1:
+ /* error */
+ die("fork");
+ break;
+ case 0:
+ /* child */
+ (void) execv(cmd[0], cmd);
+ perror("execve");
+ _exit(127);
+ default:
+ /* parent */
+ if (pid != waitpid(pid, &status, 0))
+ die("waitpid");
+ if (WIFSIGNALED(status)
+ || (WIFEXITED(status) && WEXITSTATUS(status) >= 4))
+ exit(EXIT_FAILURE);
+ }
+ exit(EXIT_SUCCESS);
+}
diff --git a/filesystems/e2fsprogs-core/files/patch-e2fsck__unix.c b/filesystems/e2fsprogs-core/files/patch-e2fsck__unix.c
new file mode 100644
index 000000000000..fe98d8988b57
--- /dev/null
+++ b/filesystems/e2fsprogs-core/files/patch-e2fsck__unix.c
@@ -0,0 +1,78 @@
+// SIGINFO is a Berkeley extension, so we need to
+// remove the #define _XOPEN_SOURCE 600
+// It would hide all non-POSIX declarations, including SIGINFO.
+
+--- e2fsck/unix.c.orig 2024-05-21 02:52:47 UTC
++++ e2fsck/unix.c
+@@ -9,8 +9,6 @@
+ * %End-Header%
+ */
+
+-#define _XOPEN_SOURCE 600 /* for inclusion of sa_handler in Solaris */
+-
+ #include "config.h"
+ #include <stdio.h>
+ #ifdef HAVE_STDLIB_H
+@@ -37,7 +35,7 @@ extern int optind;
+ #include <sys/ioctl.h>
+ #endif
+ #ifdef HAVE_MALLOC_H
+-#include <malloc.h>
++#include <stdlib.h>
+ #endif
+ #ifdef HAVE_SYS_TYPES_H
+ #include <sys/types.h>
+@@ -608,6 +606,24 @@ static int e2fsck_update_progress(e2fsck_t ctx, int pa
+ return 0;
+ }
+
++static int e2fsck_progress_once(e2fsck_t ctx, int pass, unsigned long cur, unsigned long max)
++{
++ char buf[80];
++ float percent;
++
++ if (pass == 0)
++ return 0;
++
++ percent = calc_percent(&e2fsck_tbl, pass, cur, max);
++ e2fsck_simple_progress(ctx, ctx->device_name,
++ percent, 0);
++
++ printf("\n");
++ ctx->progress = 0;
++ return 0;
++}
++
++
+ #define PATH_SET "PATH=/sbin"
+
+ /*
+@@ -641,6 +657,17 @@ static void signal_progress_on(int sig EXT2FS_ATTR((un
+ ctx->progress = e2fsck_update_progress;
+ }
+
++static void signal_progress_now(int sig EXT2FS_ATTR((unused)))
++{
++ e2fsck_t ctx = e2fsck_global_ctx;
++
++ if (!ctx)
++ return;
++
++ ctx->progress = e2fsck_progress_once;
++ ctx->progress_fd = 0;
++}
++
+ static void signal_progress_off(int sig EXT2FS_ATTR((unused)))
+ {
+ e2fsck_t ctx = e2fsck_global_ctx;
+@@ -1127,6 +1154,10 @@ static errcode_t PRS(int argc, char *argv[], e2fsck_t
+ sigaction(SIGUSR1, &sa, 0);
+ sa.sa_handler = signal_progress_off;
+ sigaction(SIGUSR2, &sa, 0);
++ sa.sa_handler = signal_progress_now;
++ if (!getenv("e2fsprogs_inhibit_SIGINFO")) {
++ sigaction(SIGINFO, &sa, 0);
++ }
+ #endif
+
+ /* Update our PATH to include /sbin if we need to run badblocks */
diff --git a/filesystems/e2fsprogs-core/files/patch-lib__uuid__gen_uuid.c b/filesystems/e2fsprogs-core/files/patch-lib__uuid__gen_uuid.c
new file mode 100644
index 000000000000..13e7b8c2f6b5
--- /dev/null
+++ b/filesystems/e2fsprogs-core/files/patch-lib__uuid__gen_uuid.c
@@ -0,0 +1,57 @@
+--- lib/uuid/gen_uuid.c.orig 2024-05-21 02:52:47 UTC
++++ lib/uuid/gen_uuid.c
+@@ -92,6 +92,7 @@
+ #ifdef HAVE_SYS_RESOURCE_H
+ #include <sys/resource.h>
+ #endif
++#include <ifaddrs.h>
+
+ #include "uuidP.h"
+ #include "uuidd.h"
+@@ -288,6 +289,28 @@ static int get_node_id(unsigned char *node_id)
+ }
+ }
+ close(sd);
++#else
++ struct ifaddrs *ifaddrsp, *ifaddrp;
++ unsigned char *a;
++
++ if (getifaddrs(&ifaddrsp) < 0)
++ return -1;
++ for (ifaddrp = ifaddrsp; ifaddrp != NULL; ifaddrp = ifaddrp->ifa_next)
++ {
++ if (ifaddrp->ifa_addr == NULL)
++ continue;
++ if (ifaddrp->ifa_addr->sa_family != AF_LINK)
++ continue;
++ a = LLADDR((struct sockaddr_dl *)ifaddrp->ifa_addr);
++ if (!a[0] && !a[1] && !a[2] && !a[3] && !a[4] && !a[5])
++ continue;
++ if (node_id) {
++ memcpy(node_id, a, 6);
++ freeifaddrs(ifaddrsp);
++ return 1;
++ }
++ }
++ freeifaddrs(ifaddrsp);
+ #endif
+ return 0;
+ }
+@@ -472,7 +495,7 @@ static void close_all_fds(void)
+ }
+ #endif /* defined(USE_UUIDD) && defined(HAVE_SYS_UN_H) */
+
+-#if __GNUC_PREREQ (4, 6)
++#if __GNUC_PREREQ__ (4, 6)
+ #pragma GCC diagnostic push
+ #if !defined(USE_UUIDD) || !defined(HAVE_SYS_UN_H)
+ #pragma GCC diagnostic ignored "-Wunused-parameter"
+@@ -560,7 +583,7 @@ fail:
+ #endif
+ return -1;
+ }
+-#if __GNUC_PREREQ (4, 6)
++#if __GNUC_PREREQ__ (4, 6)
+ #pragma GCC diagnostic pop
+ #endif
+
diff --git a/filesystems/e2fsprogs-core/files/patch-lib_blkid_devname.c b/filesystems/e2fsprogs-core/files/patch-lib_blkid_devname.c
new file mode 100644
index 000000000000..9a59112ed239
--- /dev/null
+++ b/filesystems/e2fsprogs-core/files/patch-lib_blkid_devname.c
@@ -0,0 +1,110 @@
+--- lib/blkid/devname.c.orig 2020-03-21 04:24:04 UTC
++++ lib/blkid/devname.c
+@@ -40,6 +40,9 @@
+ #include <sys/sysmacros.h>
+ #endif
+ #include <time.h>
++#ifdef __FreeBSD__
++#include <sys/sysctl.h>
++#endif
+
+ #include "blkidP.h"
+
+@@ -397,11 +400,15 @@ evms_probe_all(blkid_cache cache, int only_if_new)
+ static int probe_all(blkid_cache cache, int only_if_new)
+ {
+ FILE *proc;
++#ifndef __FreeBSD__
+ char line[1024];
++ int ma, mi;
++#else
++ char *line;
++#endif /* __FreeBSD__ */
+ char ptname0[129], ptname1[129], *ptname = 0;
+ char *ptnames[2];
+ dev_t devs[2];
+- int ma, mi;
+ unsigned long long sz;
+ int lens[2] = { 0, 0 };
+ int which = 0, last = 0;
+@@ -423,20 +430,68 @@ static int probe_all(blkid_cache cache, int only_if_ne
+ lvm_probe_all(cache, only_if_new);
+ #endif
+
++#ifndef __FreeBSD__
+ proc = fopen(PROC_PARTITIONS, "r");
+ if (!proc)
+ return -BLKID_ERR_PROC;
+
+ while (fgets(line, sizeof(line), proc)) {
++#else
++ size_t len, bufsiz = 4096;
++ char *buf = NULL;
++
++ for(;;) {
++ buf = realloc(buf, bufsiz);
++ if (!buf) return -BLKID_ERR_MEM;
++ len = bufsiz - 1;
++ if (sysctlbyname("kern.geom.conftxt", buf, &len, NULL, 0)) {
++ if (ENOMEM != errno) {
++ free(buf);
++ return -BLKID_ERR_IO;
++ }
++ bufsiz <<= 1;
++ } else {
++ if (len < bufsiz) buf[len] = '\0';
++ else buf[bufsiz - 1] = '\0';
++ break;
++ }
++ }
++ char *str = buf;
++ while ((line = strsep(&str, "\n"))) {
++#endif /* __FreeBSD__ */
+ last = which;
+ which ^= 1;
+ ptname = ptnames[which];
+
++#ifndef __FreeBSD__
+ if (sscanf(line, " %d %d %llu %128[^\n ]",
+ &ma, &mi, &sz, ptname) != 4)
+ continue;
+ devs[which] = makedev(ma, mi);
++#else
++ char type[6];
++ int dummy;
+
++ if (sscanf(line, "%*d %5s %128[^ ] %lld %d",
++ type, ptname, &sz, &dummy) != 4)
++ continue;
++ sz /= 1024;
++
++ if (strcmp("PART", type) && strcmp("DISK", type))
++ continue;
++ {
++ struct stat st;
++ char dn[128];
++ if (snprintf(dn, sizeof dn, "/dev/%s", ptname) >= sizeof dn)
++ continue;
++
++ if (stat(dn, &st))
++ continue;
++
++ devs[which] = st.st_rdev;
++ }
++#endif /* __FreeBSD__ */
++
+ DBG(DEBUG_DEVNAME, printf("read partition name %s\n", ptname));
+
+ /* Skip whole disk devs unless they have no partitions.
+@@ -507,7 +562,11 @@ static int probe_all(blkid_cache cache, int only_if_ne
+ if (lens[which])
+ probe_one(cache, ptname, devs[which], 0, only_if_new);
+
++#ifndef __FreeBSD__
+ fclose(proc);
++#else
++ free(buf);
++#endif /* __FreeBSD__ */
+ blkid_flush_cache(cache);
+ return 0;
+ }
diff --git a/filesystems/e2fsprogs-core/files/patch-lib_et_com__err.3 b/filesystems/e2fsprogs-core/files/patch-lib_et_com__err.3
new file mode 100644
index 000000000000..bc3b522f46ea
--- /dev/null
+++ b/filesystems/e2fsprogs-core/files/patch-lib_et_com__err.3
@@ -0,0 +1,11 @@
+--- lib/et/com_err.3.orig 2021-08-19 02:53:01 UTC
++++ lib/et/com_err.3
+@@ -18,6 +18,8 @@ proc = reset_com_err_hook ();
+ void initialize_XXXX_error_table ();
+ .fi
+ .SH DESCRIPTION
++This is the manual page for com_err as bundled with the e2fsprogs package.
++.P
+ .I Com_err
+ displays an error message on the standard error stream
+ .I stderr
diff --git a/filesystems/e2fsprogs-core/files/patch-lib_support_plausible.c b/filesystems/e2fsprogs-core/files/patch-lib_support_plausible.c
new file mode 100644
index 000000000000..3d23b30e9c8f
--- /dev/null
+++ b/filesystems/e2fsprogs-core/files/patch-lib_support_plausible.c
@@ -0,0 +1,11 @@
+--- lib/support/plausible.c.orig 2020-01-06 23:10:17 UTC
++++ lib/support/plausible.c
+@@ -62,7 +62,7 @@ static void *magic_handle;
+ static int magic_library_available(void)
+ {
+ if (!magic_handle) {
+- magic_handle = dlopen("libmagic.so.1", RTLD_NOW);
++ magic_handle = dlopen("libmagic.so", RTLD_NOW);
+ if (!magic_handle)
+ return 0;
+
diff --git a/filesystems/e2fsprogs-core/files/patch-lib_support_sort__r.h b/filesystems/e2fsprogs-core/files/patch-lib_support_sort__r.h
new file mode 100644
index 000000000000..c01a084feb6b
--- /dev/null
+++ b/filesystems/e2fsprogs-core/files/patch-lib_support_sort__r.h
@@ -0,0 +1,13 @@
+--- lib/support/sort_r.h.orig 2024-05-21 02:52:47 UTC
++++ lib/support/sort_r.h
+@@ -238,10 +238,6 @@ static _SORT_R_INLINE void sort_r_simple(void *base, s
+
+ #if defined _SORT_R_BSD
+
+- /* Ensure qsort_r is defined */
+- extern void qsort_r(void *base, size_t nel, size_t width, void *thunk,
+- int (*compar)(void *_thunk,
+- const void *_a, const void *_b));
+
+ #endif
+
diff --git a/filesystems/e2fsprogs-core/files/patch-misc__Makefile.in b/filesystems/e2fsprogs-core/files/patch-misc__Makefile.in
new file mode 100644
index 000000000000..ec0ff218a622
--- /dev/null
+++ b/filesystems/e2fsprogs-core/files/patch-misc__Makefile.in
@@ -0,0 +1,81 @@
+--- misc/Makefile.in.orig 2021-01-29 22:02:31 UTC
++++ misc/Makefile.in
+@@ -38,17 +38,17 @@ MKDIR_P = @MKDIR_P@
+
+ SPROGS= mke2fs badblocks tune2fs dumpe2fs $(BLKID_PROG) logsave \
+ $(E2IMAGE_PROG) @FSCK_PROG@ e2undo
+-USPROGS= mklost+found filefrag e2freefrag $(UUIDD_PROG) \
++USPROGS= mklost+found e2freefrag $(UUIDD_PROG) \
+ $(E4DEFRAG_PROG) $(E4CRYPT_PROG)
+ SMANPAGES= tune2fs.8 mklost+found.8 mke2fs.8 dumpe2fs.8 badblocks.8 \
+ e2label.8 $(FINDFS_MAN) $(BLKID_MAN) $(E2IMAGE_MAN) \
+- logsave.8 filefrag.8 e2freefrag.8 e2undo.8 \
+- $(UUIDD_MAN) $(E4DEFRAG_MAN) $(E4CRYPT_MAN) @FSCK_MAN@ \
++ logsave.8 e2freefrag.8 e2undo.8 \
++ $(E4DEFRAG_MAN) $(E4CRYPT_MAN) @FSCK_MAN@ \
+ e2mmpstatus.8
+ FMANPAGES= mke2fs.conf.5 ext4.5
+
+-UPROGS= chattr lsattr $(FUSE_PROG) @UUID_CMT@ uuidgen
+-UMANPAGES= chattr.1 lsattr.1 @UUID_CMT@ uuidgen.1
++UPROGS= chattr lsattr $(FUSE_PROG)
++UMANPAGES= chattr.1 lsattr.1
+ UMANPAGES+= @FUSE_CMT@ fuse2fs.1
+
+ LPROGS= @E2INITRD_PROG@
+@@ -154,14 +154,14 @@ profiled:
+
+ mke2fs.conf: $(srcdir)/mke2fs.conf.in
+ if test -f $(srcdir)/mke2fs.conf.custom.in ; then \
+- cp $(srcdir)/mke2fs.conf.custom.in mke2fs.conf; \
++ cp $(srcdir)/mke2fs.conf.custom.in mke2fs.conf.dist; \
+ else \
+- cp $(srcdir)/mke2fs.conf.in mke2fs.conf; \
++ cp $(srcdir)/mke2fs.conf.in mke2fs.conf.dist; \
+ fi
+
+ default_profile.c: mke2fs.conf $(srcdir)/profile-to-c.awk
+ $(E) " PROFILE_TO_C mke2fs.conf"
+- $(Q) $(AWK) -f $(srcdir)/profile-to-c.awk < mke2fs.conf \
++ $(Q) $(AWK) -f $(srcdir)/profile-to-c.awk < mke2fs.conf.dist \
+ > default_profile.c
+ findsuper: findsuper.o
+ $(E) " LD $@"
+@@ -612,34 +612,9 @@ install: all $(SMANPAGES) $(UMANPAGES) installdirs
+ (cd $(DESTDIR)$(man5dir); \
+ $(LN) $(LINK_INSTALL_FLAGS) ext4.5 $$i.5); \
+ done
+- $(Q) if test -f $(DESTDIR)$(root_sysconfdir)/mke2fs.conf; then \
+- if cmp -s $(DESTDIR)$(root_sysconfdir)/mke2fs.conf \
+- mke2fs.conf; then \
+- true; \
+- else \
+- if grep -q ext4dev $(DESTDIR)$(root_sysconfdir)/mke2fs.conf ; then \
+- $(ES) " INSTALL_DATA $(root_sysconfdir)/mke2fs.conf.e2fsprogs-new"; \
+- $(INSTALL_DATA) mke2fs.conf \
+- $(DESTDIR)$(root_sysconfdir)/mke2fs.conf.e2fsprogs-new; \
+- echo "Warning: installing mke2fs.conf in $(DESTDIR)$(root_sysconfdir)/mke2fs.conf.e2fsprogs-new"; \
+- echo "Check to see if you need to update your $(root_sysconfdir)/mke2fs.conf"; \
+- else \
+- $(ES) " INSTALL_DATA $(root_sysconfdir)/mke2fs.conf"; \
+- mv $(DESTDIR)$(root_sysconfdir)/mke2fs.conf \
+- $(DESTDIR)$(root_sysconfdir)/mke2fs.conf.e2fsprogs-old; \
+- $(INSTALL_DATA) mke2fs.conf \
+- $(DESTDIR)$(root_sysconfdir)/mke2fs.conf; \
+- echo "Your mke2fs.conf is too old. Backing up old version in"; \
+- echo "$(DESTDIR)$(root_sysconfdir)/mke2fs.conf.e2fsprogs-old. Please check to see"; \
+- echo "if you have any local customizations that you wish to preserve."; \
+- fi; \
+- echo " "; \
+- fi; \
+- else \
+- $(ES) " INSTALL_DATA $(root_sysconfdir)/mke2fs.conf"; \
+- $(INSTALL_DATA) mke2fs.conf \
+- $(DESTDIR)$(root_sysconfdir)/mke2fs.conf; \
+- fi
++ $(Q) $(ES) " INSTALL_DATA $(root_sysconfdir)/mke2fs.conf"; \
++ $(INSTALL_DATA) mke2fs.conf.dist \
++ $(DESTDIR)$(root_sysconfdir)/mke2fs.conf.dist
+
+ install-strip: install
+ $(Q) for i in $(SPROGS); do \
diff --git a/filesystems/e2fsprogs-core/files/patch-misc_blkid.8.in b/filesystems/e2fsprogs-core/files/patch-misc_blkid.8.in
new file mode 100644
index 000000000000..c6532a4a1a2e
--- /dev/null
+++ b/filesystems/e2fsprogs-core/files/patch-misc_blkid.8.in
@@ -0,0 +1,17 @@
+--- misc/blkid.8.in.orig 2020-03-21 04:24:04 UTC
++++ misc/blkid.8.in
+@@ -144,10 +144,10 @@ option.
+ Display tokens from only the specified device. It is possible to
+ give multiple
+ .I device
+-options on the command line. If none is given, all devices which
+-appear in
+-.I /proc/partitions
+-are shown, if they are recognized.
++options on the command line. If none is given, all DISK and PART devices which
++appear in the
++.I kern.geom.conftxt
++sysctl variable are shown, if they are recognized.
+ .SH "RETURN CODE"
+ If the specified token was found, or if any tags were shown from (specified)
+ devices, 0 is returned. If the specified token was not found, or no
diff --git a/filesystems/e2fsprogs-core/files/patch-misc_e2fuzz.c b/filesystems/e2fsprogs-core/files/patch-misc_e2fuzz.c
new file mode 100644
index 000000000000..a9f56490e5b6
--- /dev/null
+++ b/filesystems/e2fsprogs-core/files/patch-misc_e2fuzz.c
@@ -0,0 +1,13 @@
+--- misc/e2fuzz.c.orig 2020-03-23 08:29:36 UTC
++++ misc/e2fuzz.c
+@@ -278,8 +278,8 @@ static int process_fs(const char *fsname)
+ c |= 0x80;
+ if (verbose)
+ printf("Corrupting byte %lld in block %lld to 0x%x\n",
+- off % fs->blocksize,
+- off / fs->blocksize, c);
++ (long long)off % fs->blocksize,
++ (long long)off / fs->blocksize, c);
+ if (dryrun)
+ continue;
+ #ifdef HAVE_PWRITE64
diff --git a/filesystems/e2fsprogs-core/files/patch-tests_Makefile.in b/filesystems/e2fsprogs-core/files/patch-tests_Makefile.in
new file mode 100644
index 000000000000..a5f9b50df891
--- /dev/null
+++ b/filesystems/e2fsprogs-core/files/patch-tests_Makefile.in
@@ -0,0 +1,11 @@
+--- tests/Makefile.in.orig 2021-01-29 05:51:02 UTC
++++ tests/Makefile.in
+@@ -17,7 +17,7 @@ all:: @DO_TEST_SUITE@ test_one test_script
+ test_one: $(srcdir)/test_one.in Makefile mke2fs.conf test_data.tmp
+ @echo "Creating test_one script..."
+ @[ -f test_one ] && chmod u+w test_one || true
+- @echo "#!/bin/sh" > test_one
++ @echo "#!${SHELL}" > test_one
+ @echo "HTREE=y" >> test_one
+ @echo "QUOTA=y" >> test_one
+ @echo "SRCDIR=@srcdir@" >> test_one
diff --git a/filesystems/e2fsprogs-core/files/patch-tests_f__detect__junk_script b/filesystems/e2fsprogs-core/files/patch-tests_f__detect__junk_script
new file mode 100644
index 000000000000..45b544cf691d
--- /dev/null
+++ b/filesystems/e2fsprogs-core/files/patch-tests_f__detect__junk_script
@@ -0,0 +1,11 @@
+--- tests/f_detect_junk/script.orig 2023-02-07 03:31:53 UTC
++++ tests/f_detect_junk/script
+@@ -9,7 +9,7 @@ FSCK_OPT=-fn
+ IMAGE=$test_dir/image.bz2
+
+ bzip2 -d < $IMAGE > $TMPFILE
+-$DD if=/dev/zero of=$TMPFILE conv=notrunc oflag=append bs=1024k count=16 > /dev/null 2>&1
++$DD if=/dev/zero of=$TMPFILE conv=notrunc bs=1024k count=16 2>/dev/null >>$TMPFILE
+
+ # Run fsck to fix things?
+ if [ -x $DEBUGFS_EXE ]; then
diff --git a/filesystems/e2fsprogs-core/files/patch-tests_m__offset_script b/filesystems/e2fsprogs-core/files/patch-tests_m__offset_script
new file mode 100644
index 000000000000..9cc4232eec3a
--- /dev/null
+++ b/filesystems/e2fsprogs-core/files/patch-tests_m__offset_script
@@ -0,0 +1,11 @@
+--- tests/m_offset/script.orig 2023-02-02 15:57:32 UTC
++++ tests/m_offset/script
+@@ -13,7 +13,7 @@ $MKE2FS -F -b 1024 -E offset=524288 "$TMPFILE" 1024 >>
+ # compute crc of the first and last 512 1k blocks
+ crc_first2=`$DD if="$TMPFILE" bs=1k count=512 2>/dev/null | $CRCSUM`
+ crc_last2=`$DD if="$TMPFILE" bs=1k count=512 skip=1536 2>/dev/null | $CRCSUM`
+-crc_exp=`yes a | $DD bs=1k count=512 2>/dev/null | $CRCSUM`
++crc_exp=`yes a | $DD bs=1k count=512 iflag=fullblock 2>/dev/null | $CRCSUM`
+ # a warning should be only emitted by the first mke2fs call
+ warning=`grep -c "offset specified without an explicit file system size." \
+ "$OUT"`
diff --git a/filesystems/e2fsprogs-core/files/patch-tests_t__mmp__fail_script b/filesystems/e2fsprogs-core/files/patch-tests_t__mmp__fail_script
new file mode 100644
index 000000000000..77fd70e4ccf2
--- /dev/null
+++ b/filesystems/e2fsprogs-core/files/patch-tests_t__mmp__fail_script
@@ -0,0 +1,19 @@
+--- tests/t_mmp_fail/script.orig 2023-02-07 03:31:53 UTC
++++ tests/t_mmp_fail/script
+@@ -10,14 +10,14 @@ fi
+
+ $TUNE2FS -O project $TMPFILE >> $test_name.log 2>&1
+ status=$?
+-if [ "$status" == 0 ] ; then
++if [ "$status" = 0 ] ; then
+ echo "'tune2fs -O project' succeeded on small inode" > $test_name.failed
+ echo "$test_name: $test_description: failed"
+ return 1
+ fi
+ $TUNE2FS -o bad_option $TMPFILE >> $test_name.log 2>&1
+ status=$?
+-if [ "$status" == 0 ] ; then
++if [ "$status" = 0 ] ; then
+ echo "'tune2fs -o bad_option' succeeded" > $test_name.failed
+ echo "$test_name: $test_description: failed"
+ return 1
diff --git a/filesystems/e2fsprogs-core/files/unwanted b/filesystems/e2fsprogs-core/files/unwanted
new file mode 100644
index 000000000000..693deb364915
--- /dev/null
+++ b/filesystems/e2fsprogs-core/files/unwanted
@@ -0,0 +1,8 @@
+include/e2fsprogs/blkid/blkid.h
+include/e2fsprogs/blkid/blkid_types.h
+lib/e2fsprogs/libblkid.a
+lib/e2fsprogs/libblkid.so
+lib/e2fsprogs/libblkid.so.1
+lib/e2fsprogs/libblkid.so.1.0
+libdata/pkgconfig/blkid.pc
+man/man3/libblkid.3
diff --git a/filesystems/e2fsprogs-core/pkg-descr b/filesystems/e2fsprogs-core/pkg-descr
new file mode 100644
index 000000000000..d03ad983f1fb
--- /dev/null
+++ b/filesystems/e2fsprogs-core/pkg-descr
@@ -0,0 +1 @@
+Set of utilities and library to manipulate an ext2, ext3 or ext4 filesystem.
diff --git a/filesystems/e2fsprogs-core/pkg-install b/filesystems/e2fsprogs-core/pkg-install
new file mode 100644
index 000000000000..114087fa032a
--- /dev/null
+++ b/filesystems/e2fsprogs-core/pkg-install
@@ -0,0 +1,76 @@
+#!/bin/sh
+set -eu
+
+PKGNAME="$1"
+MODE="$2" # PRE-INSTALL, POST-INSTALL, DEINSTALL, POST-DEINSTALL
+
+case "$MODE" in
+POST-INSTALL)
+ #
+ # install configuration file and update config files from
+ # old "ext4dev" to current "ext4" name.
+ #
+ if test -s ${PKG_PREFIX}/etc/mke2fs.conf; then
+ if cmp -s ${PKG_PREFIX}/etc/mke2fs.conf.dist \
+ ${PKG_PREFIX}/etc/mke2fs.conf; then
+ true
+ else
+ rc=0
+ grep -q ext4dev ${PKG_PREFIX}/etc/mke2fs.conf || rc=$?
+ # !!! the echo messages below deliberately contain spacing errors
+ # so that the file names can be double-clicked in a typical console
+ # window for copying and pasting without keen targeting with the mouse.
+ case $rc in
+ 1) # ext4dev not found (old name)
+ cp -f -p ${PKG_PREFIX}/etc/mke2fs.conf.dist \
+ ${PKG_PREFIX}/etc/mke2fs.conf.e2fsprogs-new
+ echo "==========================================================================="
+ echo "Warning: installing mke2fs.conf in ${PKG_PREFIX}/etc/mke2fs.conf.e2fsprogs-new"
+ echo "Check to see if you need to update your ${PKG_PREFIX}/etc/mke2fs.conf ."
+ echo "==========================================================================="
+ ;;
+ 0) # ext4dev found (old name)
+ mv ${PKG_PREFIX}/etc/mke2fs.conf \
+ ${PKG_PREFIX}/etc/mke2fs.conf.e2fsprogs-old
+ cp -f -p ${PKG_PREFIX}/etc/mke2fs.conf.dist \
+ ${PKG_PREFIX}/etc/mke2fs.conf
+ echo "==========================================================================="
+ echo "Your mke2fs.conf is too old. Backing up old version in"
+ echo "${PKG_PREFIX}/etc/mke2fs.conf.e2fsprogs-old . Please check to see"
+ echo "if you have any local customizations that you wish to preserve."
+ echo "==========================================================================="
+ ;;
+ *) # grep failed
+ exit $rc
+ ;;
+ esac
+ fi
+ else
+ # missing -> install
+ cp -p ${PKG_PREFIX}/etc/mke2fs.conf.dist \
+ ${PKG_PREFIX}/etc/mke2fs.conf
+ fi
+
+ ;;
+DEINSTALL)
+ # !!! the echo messages below deliberately contain spacing errors
+ # so that the file names can be double-clicked in a typical console
+ # window for copying and pasting without keen targeting with the mouse.
+ if cmp -s ${PKG_PREFIX}/etc/mke2fs.conf \
+ ${PKG_PREFIX}/etc/mke2fs.conf.dist
+ then
+ rm -f ${PKG_PREFIX}/etc/mke2fs.conf
+ elif [ "_${PKG_UPGRADE-upgrade}" = _upgrade ] ; then
+ echo "If and only if you are deleting e2fsprogs forever,"
+ echo "remember to delete ${PKG_PREFIX}/etc/mke2fs.conf ."
+ fi
+ # e2fsck.conf is no longer part of the distribution, but still supported,
+ # => no pkg-list @sample line possible
+ # and no reference e2fsck.conf.sample or e2fsck.conf.dist is available
+ if test -f ${PKG_PREFIX}/etc/e2fsck.conf -a "_${PKG_UPGRADE-upgrade}" = _upgrade
+ then
+ echo "If and only if you are deleting e2fsprogs forever,"
+ echo "remember to delete ${PKG_PREFIX}/etc/e2fsck.conf ."
+ fi
+ ;;
+esac
diff --git a/filesystems/e2fsprogs-core/pkg-message b/filesystems/e2fsprogs-core/pkg-message
new file mode 100644
index 000000000000..68a7a422b142
--- /dev/null
+++ b/filesystems/e2fsprogs-core/pkg-message
@@ -0,0 +1,8 @@
+[
+{ message: <<EOM
+Note: this is a modified version of the e2fsprogs package, not the official
+package. Report all building and run-time trouble that originates in the
+package to the port maintainer, mandree@FreeBSD.org.
+EOM
+}
+]
diff --git a/filesystems/e2fsprogs-core/pkg-plist b/filesystems/e2fsprogs-core/pkg-plist
new file mode 100644
index 000000000000..369ce002d590
--- /dev/null
+++ b/filesystems/e2fsprogs-core/pkg-plist
@@ -0,0 +1,127 @@
+bin/chattr
+bin/e2fsprogs-compile_et
+%%FUSEFS%%bin/fuse2fs
+bin/lsattr
+bin/mk_cmds
+etc/mke2fs.conf.dist
+include/e2fsprogs/com_err.h
+include/e2fsprogs/e2p/e2p.h
+include/e2fsprogs/et/com_err.h
+include/e2fsprogs/ext2fs/bitops.h
+include/e2fsprogs/ext2fs/ext2_err.h
+include/e2fsprogs/ext2fs/ext2_ext_attr.h
+include/e2fsprogs/ext2fs/ext2_fs.h
+include/e2fsprogs/ext2fs/ext2_io.h
+include/e2fsprogs/ext2fs/ext2_types.h
+include/e2fsprogs/ext2fs/ext2fs.h
+include/e2fsprogs/ext2fs/ext3_extents.h
+include/e2fsprogs/ext2fs/hashmap.h
+include/e2fsprogs/ext2fs/qcow2.h
+include/e2fsprogs/ext2fs/tdb.h
+include/e2fsprogs/ss/ss.h
+include/e2fsprogs/ss/ss_err.h
+lib/e2fsprogs/libcom_err.a
+lib/e2fsprogs/libcom_err.so
+lib/e2fsprogs/libcom_err.so.2
+lib/e2fsprogs/libcom_err.so.2.1
+lib/e2fsprogs/libe2p.a
+lib/e2fsprogs/libe2p.so
+lib/e2fsprogs/libe2p.so.2
+lib/e2fsprogs/libe2p.so.2.3
+lib/e2fsprogs/libext2fs.a
+lib/e2fsprogs/libext2fs.so
+lib/e2fsprogs/libext2fs.so.2
+lib/e2fsprogs/libext2fs.so.2.4
+lib/e2fsprogs/libss.so.2.0
+lib/e2fsprogs/libss.so
+lib/e2fsprogs/libss.a
+lib/e2fsprogs/libss.so.2
+libdata/pkgconfig/com_err.pc
+libdata/pkgconfig/e2p.pc
+libdata/pkgconfig/ext2fs.pc
+libdata/pkgconfig/ss.pc
+share/man/man1/chattr.1.gz
+share/man/man1/e2fsprogs-compile_et.1.gz
+%%FUSEFS%%share/man/man1/fuse2fs.1.gz
+share/man/man1/lsattr.1.gz
+share/man/man1/mk_cmds.1.gz
+share/man/man3/e2fsprogs-com_err.3.gz
+share/man/man5/e2fsck.conf.5.gz
+share/man/man5/mke2fs.conf.5.gz
+share/man/man5/ext2.5.gz
+share/man/man5/ext3.5.gz
+share/man/man5/ext4.5.gz
+share/man/man8/badblocks.8.gz
+share/man/man8/debugfs.8.gz
+share/man/man8/dumpe2fs.8.gz
+share/man/man8/e2fsck.8.gz
+share/man/man8/e2image.8.gz
+share/man/man8/e2label.8.gz
+share/man/man8/e2mmpstatus.8.gz
+share/man/man8/e2undo.8.gz
+share/man/man8/mke2fs.8.gz
+share/man/man8/mklost+found.8.gz
+share/man/man8/resize2fs.8.gz
+share/man/man8/tune2fs.8.gz
+share/man/man8/fsck.ext2.8.gz
+share/man/man8/fsck.ext3.8.gz
+share/man/man8/fsck.ext4.8.gz
+share/man/man8/mkfs.ext2.8.gz
+share/man/man8/mkfs.ext3.8.gz
+share/man/man8/mkfs.ext4.8.gz
+share/man/man8/findfs.8.gz
+share/man/man8/blkid.8.gz
+share/man/man8/logsave.8.gz
+share/man/man8/fsck_ext2fs.8.gz
+share/man/man8/e2freefrag.8.gz
+sbin/badblocks
+sbin/blkid
+sbin/debugfs
+sbin/dumpe2fs
+sbin/e2freefrag
+sbin/e2fsck
+sbin/e2image
+sbin/e2label
+sbin/e2mmpstatus
+sbin/e2undo
+sbin/findfs
+sbin/fsck.ext2
+sbin/fsck.ext3
+sbin/fsck.ext4
+sbin/fsck_ext2fs
+sbin/logsave
+sbin/mke2fs
+sbin/mkfs.ext2
+sbin/mkfs.ext3
+sbin/mkfs.ext4
+sbin/mklost+found
+sbin/resize2fs
+sbin/tune2fs
+%%DATADIR%%/et/et_c.awk
+%%DATADIR%%/et/et_h.awk
+%%PORTDOCS%%share/info/libext2fs.info.gz
+%%NLS%%share/locale/ca/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/cs/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/da/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/de/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/eo/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/es/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/fi/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/fr/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/fur/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/hu/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/id/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/it/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/ms/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/nl/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/pl/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/pt/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/ro/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/sr/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/sv/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/tr/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/uk/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/vi/LC_MESSAGES/e2fsprogs.mo
+%%NLS%%share/locale/zh_CN/LC_MESSAGES/e2fsprogs.mo
+share/ss/ct_c.awk
+share/ss/ct_c.sed
diff --git a/filesystems/e2fsprogs-libblkid/Makefile b/filesystems/e2fsprogs-libblkid/Makefile
new file mode 100644
index 000000000000..961808badcf4
--- /dev/null
+++ b/filesystems/e2fsprogs-libblkid/Makefile
@@ -0,0 +1,31 @@
+PORTREVISION= 0
+CATEGORIES= filesystems misc devel
+PKGNAMESUFFIX= -libblkid
+
+COMMENT= Blkid library from e2fsprogs package
+
+LICENSE= LGPL20+
+_no_license_file= sorry
+
+LIB_DEPENDS= libuuid.so:misc/e2fsprogs-libuuid
+
+CONFIGURE_ARGS= --enable-elf-shlibs --disable-libuuid --enable-libblkid
+
+MASTERDIR= ${.CURDIR}/../../filesystems/e2fsprogs-core
+MAKE_ARGS= LIB_SUBDIRS=lib/blkid LDFLAGS_SHLIB=-L${LOCALBASE}/lib
+USE_LDCONFIG= yes
+ALL_TARGET= libs
+LDFLAGS+= -L${LOCALBASE}/lib
+INSTALL_TARGET= install install-shlibs
+INSTALL_WRKSRC= ${WRKSRC}/lib/blkid
+
+PKGDIR= ${.CURDIR}
+
+pre-build:
+ ${MKDIR} ${WRKSRC}/lib/blkid/elfshared
+ cd ${WRKSRC}/util && ${MAKE_CMD} subst
+
+post-build:
+ cd ${INSTALL_WRKSRC} && ${MAKE_CMD} check
+
+.include "${MASTERDIR}/Makefile"
diff --git a/filesystems/e2fsprogs-libblkid/pkg-descr b/filesystems/e2fsprogs-libblkid/pkg-descr
new file mode 100644
index 000000000000..27a1c50756ac
--- /dev/null
+++ b/filesystems/e2fsprogs-libblkid/pkg-descr
@@ -0,0 +1 @@
+Block device identification library from the e2fsprogs package.
diff --git a/filesystems/e2fsprogs-libblkid/pkg-plist b/filesystems/e2fsprogs-libblkid/pkg-plist
new file mode 100644
index 000000000000..c3c0e82f85c5
--- /dev/null
+++ b/filesystems/e2fsprogs-libblkid/pkg-plist
@@ -0,0 +1,8 @@
+include/blkid/blkid.h
+include/blkid/blkid_types.h
+lib/libblkid.so.1.0
+lib/libblkid.so.1
+lib/libblkid.so
+lib/libblkid.a
+libdata/pkgconfig/blkid.pc
+share/man/man3/libblkid.3.gz
diff --git a/filesystems/e2fsprogs/Makefile b/filesystems/e2fsprogs/Makefile
new file mode 100644
index 000000000000..dd338500a5c7
--- /dev/null
+++ b/filesystems/e2fsprogs/Makefile
@@ -0,0 +1,21 @@
+PORTNAME= e2fsprogs
+CATEGORIES= filesystems sysutils
+PORTVERSION= 1.47.1
+PORTREVISION= 0
+BUILD_DEPENDS= e2fsprogs-core=${PORTVERSION}${${PORTREVISION} > 0:?_${PORTREVISION}:}:filesystems/e2fsprogs-core
+RUN_DEPENDS= ${BUILD_DEPENDS}
+DISTFILES= # empty
+NO_BUILD= yes
+LICENSE= GPLv2+
+USES= cpe
+CPE_VENDOR= e2fsprogs_project
+
+MAINTAINER= mandree@FreeBSD.org
+COMMENT= Wrapper to install e2fsprogs into /sbin
+
+do-install:
+ ${MKDIR} ${STAGEDIR}/sbin
+ ${CP} -p ${LOCALBASE}/sbin/fsck_ext2fs ${STAGEDIR}/sbin
+ ${CP} -p ${LOCALBASE}/sbin/e2fsck ${STAGEDIR}/sbin
+
+.include <bsd.port.mk>
diff --git a/filesystems/e2fsprogs/pkg-descr b/filesystems/e2fsprogs/pkg-descr
new file mode 100644
index 000000000000..6df887766576
--- /dev/null
+++ b/filesystems/e2fsprogs/pkg-descr
@@ -0,0 +1,3 @@
+This is a helper package that will copy and register the essential binaries
+from e2fsprogs-core to /sbin, so that it is possible to have /usr in an ext2,
+ext3, or ext4 file system, and still have a proper fsck in /sbin.
diff --git a/filesystems/e2fsprogs/pkg-plist b/filesystems/e2fsprogs/pkg-plist
new file mode 100644
index 000000000000..796b2c90dfc4
--- /dev/null
+++ b/filesystems/e2fsprogs/pkg-plist
@@ -0,0 +1,2 @@
+/sbin/e2fsck
+/sbin/fsck_ext2fs
diff --git a/filesystems/e2tools/Makefile b/filesystems/e2tools/Makefile
new file mode 100644
index 000000000000..3f32f39fee53
--- /dev/null
+++ b/filesystems/e2tools/Makefile
@@ -0,0 +1,19 @@
+PORTNAME= e2tools
+DISTVERSION= 0.1.2
+CATEGORIES= filesystems sysutils
+MASTER_SITES= https://github.com/${PORTNAME}/${PORTNAME}/releases/download/v${DISTVERSION}/
+
+MAINTAINER= fuz@FreeBSD.org
+COMMENT= Utilities to manipulate files in an ext2/ext3 filesystem
+WWW= https://e2tools.github.io/
+
+LICENSE= GPLv2
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+LIB_DEPENDS= libext2fs.so:filesystems/e2fsprogs-core
+
+USES= pkgconfig
+GNU_CONFIGURE_MANPREFIX= ${PREFIX}/share
+GNU_CONFIGURE= yes
+
+.include <bsd.port.mk>
diff --git a/filesystems/e2tools/distinfo b/filesystems/e2tools/distinfo
new file mode 100644
index 000000000000..0e8055b72248
--- /dev/null
+++ b/filesystems/e2tools/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1726571041
+SHA256 (e2tools-0.1.2.tar.gz) = b19593bbfc85e9c14c0d2bc8525887901c8fe02588c76df60ab843bf0573c4a2
+SIZE (e2tools-0.1.2.tar.gz) = 159729
diff --git a/filesystems/e2tools/pkg-descr b/filesystems/e2tools/pkg-descr
new file mode 100644
index 000000000000..3e72d7e69163
--- /dev/null
+++ b/filesystems/e2tools/pkg-descr
@@ -0,0 +1,17 @@
+e2tools is a simple set of GPL'ed utilities to read, write, and
+manipulate files in an ext2/ext3 filesystem. These utilities access a
+filesystem directly using the ext2fs library. I wrote these tools in
+order to copy files into a linux filesystem on a machine that does not
+have ext2 support. Of course, they can also be used on a Linux machine
+to read/write to disk images or floppies without having to mount them
+or have root access.
+
+Supported functionality:
+
+ - copy files: e2cp
+ - move files: e2mv
+ - remove files: e2rm
+ - create directory: e2mkdir
+ - create hard links: e2ln
+ - list files/directories: e2ls
+ - output the last part of a file: e2tail
diff --git a/filesystems/e2tools/pkg-plist b/filesystems/e2tools/pkg-plist
new file mode 100644
index 000000000000..2ab92a262c94
--- /dev/null
+++ b/filesystems/e2tools/pkg-plist
@@ -0,0 +1,16 @@
+bin/e2cp
+bin/e2ln
+bin/e2ls
+bin/e2mkdir
+bin/e2mv
+bin/e2rm
+bin/e2tail
+bin/e2tools
+share/man/man1/e2cp.1.gz
+share/man/man1/e2ln.1.gz
+share/man/man1/e2ls.1.gz
+share/man/man1/e2mkdir.1.gz
+share/man/man1/e2mv.1.gz
+share/man/man1/e2rm.1.gz
+share/man/man1/e2tail.1.gz
+share/man/man7/e2tools.7.gz
diff --git a/filesystems/encfs/Makefile b/filesystems/encfs/Makefile
new file mode 100644
index 000000000000..a78fbf67063c
--- /dev/null
+++ b/filesystems/encfs/Makefile
@@ -0,0 +1,35 @@
+PORTNAME= encfs
+DISTVERSIONPREFIX= v
+DISTVERSION= 1.9.5
+PORTREVISION= 9
+CATEGORIES= filesystems
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= dmgk@FreeBSD.org
+COMMENT= Encrypted pass-through FUSE filesystem
+WWW= http://www.arg0.net/encfs
+
+LICENSE= GPLv3
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+USES= cmake compiler:c++11-lib cpe fuse ssl
+CPE_VENDOR= ${PORTNAME}_project
+USE_GITHUB= yes
+GH_ACCOUNT= vgough
+
+OPTIONS_DEFINE= BUNDLED_TINYXML MANPAGES NLS
+OPTIONS_DEFAULT= BUNDLED_TINYXML MANPAGES
+OPTIONS_SUB= yes
+
+BUNDLED_TINYXML_DESC= Use bundled TinyXML2 instead of textproc/tinyxml2
+BUNDLED_TINYXML_CMAKE_BOOL= USE_INTERNAL_TINYXML
+BUNDLED_TINYXML_LIB_DEPENDS_OFF= libtinyxml2.so:textproc/tinyxml2
+
+MANPAGES_DESC= Install manpages (requires Perl 5)
+MANPAGES_USES= perl5
+MANPAGES_USE= perl5=build
+
+NLS_USES= gettext
+NLS_CMAKE_BOOL= ENABLE_NLS
+
+.include <bsd.port.mk>
diff --git a/filesystems/encfs/distinfo b/filesystems/encfs/distinfo
new file mode 100644
index 000000000000..9998faa7d611
--- /dev/null
+++ b/filesystems/encfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1524928468
+SHA256 (vgough-encfs-v1.9.5_GH0.tar.gz) = 4709f05395ccbad6c0a5b40a4619d60aafe3473b1a79bafb3aa700b1f756fd63
+SIZE (vgough-encfs-v1.9.5_GH0.tar.gz) = 2798888
diff --git a/filesystems/encfs/files/patch-CMakeLists.txt b/filesystems/encfs/files/patch-CMakeLists.txt
new file mode 100644
index 000000000000..f4e66aaaa10b
--- /dev/null
+++ b/filesystems/encfs/files/patch-CMakeLists.txt
@@ -0,0 +1,12 @@
+--- CMakeLists.txt.orig 2024-02-25 17:41:27 UTC
++++ CMakeLists.txt
+@@ -346,9 +346,6 @@ if (POD2MAN)
+
+ if (POD2MAN)
+ set (MAN_DESTINATION "share/man/man1")
+- if (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD")
+- set (MAN_DESTINATION "man/man1")
+- endif()
+
+ add_custom_target (encfs-man ALL
+ COMMAND ${POD2MAN} -u --section=1 --release=${ENCFS_VERSION} --center=${ENCFS_NAME}
diff --git a/filesystems/encfs/files/patch-encfs_NullCipher.cpp b/filesystems/encfs/files/patch-encfs_NullCipher.cpp
new file mode 100644
index 000000000000..08e4db20abe8
--- /dev/null
+++ b/filesystems/encfs/files/patch-encfs_NullCipher.cpp
@@ -0,0 +1,11 @@
+--- encfs/NullCipher.cpp.orig 2022-05-14 16:04:54 UTC
++++ encfs/NullCipher.cpp
+@@ -76,7 +76,7 @@ class NullDestructor {
+ NullDestructor &operator=(const NullDestructor &) = delete; // copy assignment
+ NullDestructor& operator=(NullDestructor&& other) = delete; // move assignment
+
+- void operator()(NullKey *&) {}
++ void operator()(NullKey *) {}
+ };
+ std::shared_ptr<AbstractCipherKey> gNullKey(new NullKey(), NullDestructor());
+
diff --git a/filesystems/encfs/pkg-descr b/filesystems/encfs/pkg-descr
new file mode 100644
index 000000000000..0fafe1d67b16
--- /dev/null
+++ b/filesystems/encfs/pkg-descr
@@ -0,0 +1,5 @@
+EncFS is an encrypted pass-through filesystem which runs in userspace,
+using the FUSE kernel module. Similar in design to CFS and other
+pass-through filesystems, all data is encrypted and stored in the
+underlying filesystem. Unlike loopback filesystems, there is no
+predetermined or pre-allocated filesystem size.
diff --git a/filesystems/encfs/pkg-plist b/filesystems/encfs/pkg-plist
new file mode 100644
index 000000000000..e75b46eceeaa
--- /dev/null
+++ b/filesystems/encfs/pkg-plist
@@ -0,0 +1,56 @@
+bin/encfs
+bin/encfsctl
+bin/encfssh
+%%MANPAGES%%share/man/man1/encfs.1.gz
+%%MANPAGES%%share/man/man1/encfsctl.1.gz
+%%MANPAGES%%share/man/man1/encfssh.1.gz
+%%NLS%%share/locale/ar/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/be/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/bg/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/bs/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/ca/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/cs/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/da/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/de_AT/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/de_CH/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/de_DE/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/de/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/el/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/eo/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/es_ES/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/es_PE/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/es/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/et/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/fi/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/fr_FR/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/fr/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/gl/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/he/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/hr/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/hu/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/id/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/it/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/ja/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/ko/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/lv/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/nb/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/nds/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/nl/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/nn/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/oc/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/pl/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/pt_BR/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/pt_PT/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/pt/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/ro/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/ru/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/sk/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/sr/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/sv/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/ta/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/tr/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/uk/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/vi/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/zh_CN/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/zh_HK/LC_MESSAGES/encfs.mo
+%%NLS%%share/locale/zh_TW/LC_MESSAGES/encfs.mo
diff --git a/filesystems/exfat-utils/Makefile b/filesystems/exfat-utils/Makefile
new file mode 100644
index 000000000000..ca8e499a18f3
--- /dev/null
+++ b/filesystems/exfat-utils/Makefile
@@ -0,0 +1,29 @@
+PORTNAME= exfat
+DISTVERSIONPREFIX= v
+DISTVERSION= 1.4.0
+PORTREVISION= 1
+CATEGORIES= filesystems sysutils
+PKGNAMESUFFIX= -utils
+
+MAINTAINER= samm@FreeBSD.org
+COMMENT= Utilities to create, check, label and dump exFAT filesystem
+WWW= https://github.com/relan/exfat
+
+LICENSE= GPLv2+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+LIB_DEPENDS= libublio.so:devel/libublio
+
+USES= autoreconf cpe localbase pkgconfig
+CPE_VENDOR= ${PORTNAME}_project
+USE_GITHUB= yes
+GH_ACCOUNT= relan
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX= ${PREFIX}/share
+
+PLIST_FILES= sbin/exfatlabel sbin/dumpexfat sbin/exfatfsck sbin/mkexfatfs \
+ sbin/fsck.exfat sbin/mkfs.exfat sbin/exfatattrib \
+ share/man/man8/exfatlabel.8.gz share/man/man8/mkexfatfs.8.gz share/man/man8/exfatfsck.8.gz \
+ share/man/man8/dumpexfat.8.gz share/man/man8/exfatattrib.8.gz
+
+.include <bsd.port.mk>
diff --git a/filesystems/exfat-utils/distinfo b/filesystems/exfat-utils/distinfo
new file mode 100644
index 000000000000..4b38f1e77983
--- /dev/null
+++ b/filesystems/exfat-utils/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1685989221
+SHA256 (relan-exfat-v1.4.0_GH0.tar.gz) = af560659f55dca0270f94809530f359d6bdad5d313133c68b458fb0a8eeab1c8
+SIZE (relan-exfat-v1.4.0_GH0.tar.gz) = 62390
diff --git a/filesystems/exfat-utils/files/patch-Makefile.am b/filesystems/exfat-utils/files/patch-Makefile.am
new file mode 100644
index 000000000000..672480a6c8cc
--- /dev/null
+++ b/filesystems/exfat-utils/files/patch-Makefile.am
@@ -0,0 +1,8 @@
+--- Makefile.am.orig 2023-06-05 18:39:49 UTC
++++ Makefile.am
+@@ -20,4 +20,4 @@
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ #
+
+-SUBDIRS = libexfat attrib dump fsck fuse label mkfs
++SUBDIRS = libexfat attrib dump fsck label mkfs
diff --git a/filesystems/exfat-utils/files/patch-configure.ac b/filesystems/exfat-utils/files/patch-configure.ac
new file mode 100644
index 000000000000..23a8ce7511e0
--- /dev/null
+++ b/filesystems/exfat-utils/files/patch-configure.ac
@@ -0,0 +1,21 @@
+--- configure.ac.orig 2023-06-05 18:39:27 UTC
++++ configure.ac
+@@ -37,10 +37,6 @@ PKG_CHECK_MODULES([UBLIO], [libublio], [
+ AC_DEFINE([USE_UBLIO], [1],
+ [Define if block devices are not supported.])
+ ], [:])
+-PKG_CHECK_MODULES([FUSE3], [fuse3],
+- [AC_DEFINE([FUSE_USE_VERSION], [30], [Required FUSE API version.])],
+- [PKG_CHECK_MODULES([FUSE2], [fuse >= 2.6],
+- [AC_DEFINE([FUSE_USE_VERSION], [26], [Required FUSE API version.])])])
+ case "$host_os" in
+ *-gnu)
+ AC_DEFINE([_XOPEN_SOURCE], [500], [Enable pread() and pwrite().])
+@@ -53,7 +49,6 @@ AC_CONFIG_FILES([
+ attrib/Makefile
+ dump/Makefile
+ fsck/Makefile
+- fuse/Makefile
+ label/Makefile
+ mkfs/Makefile
+ Makefile])
diff --git a/filesystems/exfat-utils/pkg-descr b/filesystems/exfat-utils/pkg-descr
new file mode 100644
index 000000000000..e9c5bd8916e4
--- /dev/null
+++ b/filesystems/exfat-utils/pkg-descr
@@ -0,0 +1,5 @@
+Utilities to manage extended file allocation table filesystem. This package
+provides tools to create, check and label the filesystem.
+It contains dumpexfat to dump properties of the filesystem, exfatfsck to report
+errors found on a exFAT filesystem, exfatlabel to label a exFAT filesystem and
+mkexfatfs to create a exFAT filesystem.
diff --git a/filesystems/exfat/Makefile b/filesystems/exfat/Makefile
new file mode 100644
index 000000000000..4910df1a26f8
--- /dev/null
+++ b/filesystems/exfat/Makefile
@@ -0,0 +1,28 @@
+PORTNAME= exfat
+DISTVERSIONPREFIX= v
+DISTVERSION= 1.4.0
+PORTREVISION= 1
+CATEGORIES= filesystems
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= samm@FreeBSD.org
+COMMENT= Full-featured exFAT FS implementation as a FUSE module
+WWW= https://github.com/relan/exfat
+
+LICENSE= GPLv2+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+LIB_DEPENDS= libublio.so:devel/libublio
+
+USES= autoreconf cpe fuse localbase pkgconfig
+CPE_VENDOR= ${PORTNAME}_project
+USE_GITHUB= yes
+GH_ACCOUNT= relan
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX= ${PREFIX}/share
+
+MAKE_ARGS= SUBDIRS="libexfat fuse"
+
+PLIST_FILES= sbin/mount.exfat-fuse sbin/mount.exfat share/man/man8/mount.exfat-fuse.8.gz
+
+.include <bsd.port.mk>
diff --git a/filesystems/exfat/distinfo b/filesystems/exfat/distinfo
new file mode 100644
index 000000000000..3d2567e5d62d
--- /dev/null
+++ b/filesystems/exfat/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1685988699
+SHA256 (relan-exfat-v1.4.0_GH0.tar.gz) = af560659f55dca0270f94809530f359d6bdad5d313133c68b458fb0a8eeab1c8
+SIZE (relan-exfat-v1.4.0_GH0.tar.gz) = 62390
diff --git a/filesystems/exfat/pkg-descr b/filesystems/exfat/pkg-descr
new file mode 100644
index 000000000000..3cf40b3ccad4
--- /dev/null
+++ b/filesystems/exfat/pkg-descr
@@ -0,0 +1,4 @@
+exfat-fuse is a free exFAT file system implementation with write support.
+exFAT is a simple file system created by Microsoft. It is intended to
+replace FAT32 removing some of its limitations. exFAT is a standard FS for
+SDXC memory cards.
diff --git a/filesystems/ext2/Makefile b/filesystems/ext2/Makefile
new file mode 100644
index 000000000000..3c3ec5000a85
--- /dev/null
+++ b/filesystems/ext2/Makefile
@@ -0,0 +1,34 @@
+PORTNAME= fusefs-ext2
+DISTVERSIONPREFIX= v
+DISTVERSION= 0.0.11
+PORTREVISION= 2
+CATEGORIES= filesystems
+
+MAINTAINER= ehaupt@FreeBSD.org
+COMMENT= FUSE module to mount ext2, ext3 and ext4 with read write support
+WWW= https://github.com/alperakcan/fuse-ext2
+
+LICENSE= GPLv2
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+BUILD_DEPENDS= mke2fs:filesystems/e2fsprogs-core
+RUN_DEPENDS= mke2fs:filesystems/e2fsprogs-core
+
+USES= autoreconf fuse libtool localbase:ldflags pkgconfig
+USE_GITHUB= yes
+GH_ACCOUNT= alperakcan
+GH_PROJECT= fuse-ext2
+GH_TAGNAME= e8f1063
+
+GNU_CONFIGURE= yes
+
+CPPFLAGS+= -I${LOCALBASE}/include/e2fsprogs
+LDFLAGS+= -L${LOCALBASE}/lib/e2fsprogs -Wl,--rpath \
+ -Wl,${LOCALBASE}/lib/e2fsprogs
+
+PLIST_FILES= bin/fuse-ext2 \
+ bin/fuse-ext2.probe \
+ libdata/pkgconfig/fuse-ext2.pc \
+ share/man/man1/fuse-ext2.1.gz
+
+.include <bsd.port.mk>
diff --git a/filesystems/ext2/distinfo b/filesystems/ext2/distinfo
new file mode 100644
index 000000000000..a1c8808c59aa
--- /dev/null
+++ b/filesystems/ext2/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1721752246
+SHA256 (alperakcan-fuse-ext2-v0.0.11-e8f1063_GH0.tar.gz) = 7dcc5be65236f83b121043ce6eae1c56a8658a459f6f4075436e7a9e4176fda9
+SIZE (alperakcan-fuse-ext2-v0.0.11-e8f1063_GH0.tar.gz) = 123443
diff --git a/filesystems/ext2/files/patch-fuse-ext2_fuse-ext2.c b/filesystems/ext2/files/patch-fuse-ext2_fuse-ext2.c
new file mode 100644
index 000000000000..6b12035108f4
--- /dev/null
+++ b/filesystems/ext2/files/patch-fuse-ext2_fuse-ext2.c
@@ -0,0 +1,61 @@
+--- fuse-ext2/fuse-ext2.c.orig 2019-05-09 08:29:33 UTC
++++ fuse-ext2/fuse-ext2.c
+@@ -18,15 +18,14 @@
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
++#include <stdbool.h>
+ #include "fuse-ext2.h"
+
+ static const char *HOME = "http://github.com/alperakcan/fuse-ext2/";
+
+ #if __FreeBSD__ == 10
+-static char def_opts[] = "allow_other,default_permissions,local,";
+ static char def_opts_rd[] = "noappledouble,";
+ #else
+-static char def_opts[] = "allow_other,default_permissions,";
+ static char def_opts_rd[] = "";
+ #endif
+
+@@ -171,8 +170,10 @@ static int parse_options (int argc, char *argv[], stru
+ static char * parse_mount_options (const char *orig_opts, struct extfs_data *opts)
+ {
+ char *options, *s, *opt, *val, *ret;
++ bool allow_other = true;
++ bool default_permissions = true;
+
+- ret = malloc(strlen(def_opts) + strlen(def_opts_rd) + strlen(orig_opts) + 256 + PATH_MAX);
++ ret = malloc(strlen(def_opts_rd) + strlen(orig_opts) + 256 + PATH_MAX);
+ if (!ret) {
+ return NULL;
+ }
+@@ -231,6 +232,14 @@ static char * parse_mount_options (const char *orig_op
+ #if __FreeBSD__ == 10
+ strcat(ret, "force,");
+ #endif
++ } else if (!strcmp(opt, "noallow_other")) {
++ allow_other = false;
++ strcat(ret, opt);
++ strcat(ret, ",");
++ } else if (!strcmp(opt, "nodefault_permissions")) {
++ default_permissions = false;
++ strcat(ret, opt);
++ strcat(ret, ",");
+ } else { /* Probably FUSE option. */
+ strcat(ret, opt);
+ if (val) {
+@@ -246,7 +255,13 @@ static char * parse_mount_options (const char *orig_op
+ opts->readonly = 1;
+ }
+
+- strcat(ret, def_opts);
++ if (allow_other)
++ strcat(ret, "allow_other,");
++ if (default_permissions)
++ strcat(ret, "default_permissions,");
++#if __FreeBSD__ == 10
++ strcat(ret, "local,");
++#endif
+ if (opts->readonly == 1) {
+ strcat(ret, def_opts_rd);
+ strcat(ret, "ro,");
diff --git a/filesystems/ext2/pkg-descr b/filesystems/ext2/pkg-descr
new file mode 100644
index 000000000000..e1d6775cdc20
--- /dev/null
+++ b/filesystems/ext2/pkg-descr
@@ -0,0 +1,2 @@
+Fuse-ext2 is a multi OS FUSE module to mount ext2, ext3 and ext4 file system
+devices and/or images with read write support.
diff --git a/filesystems/fstyp/Makefile b/filesystems/fstyp/Makefile
new file mode 100644
index 000000000000..df5bd1aeee56
--- /dev/null
+++ b/filesystems/fstyp/Makefile
@@ -0,0 +1,18 @@
+PORTNAME= fstyp
+PORTVERSION= 0.1
+PORTREVISION= 1
+CATEGORIES= filesystems sysutils
+MASTER_SITES= SF/${PORTNAME}/${PORTNAME}/${PORTNAME}-${PORTVERSION} http://thegaul.org/src/
+
+MAINTAINER= ports@FreeBSD.org
+COMMENT= Detect which filesystem type a device/partition contains
+WWW= http://nchc.dl.sourceforge.net/sourceforge/fstyp/
+
+USES= gmake
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+CONFIGURE_ENV+= ac_cv_prog_CC="${CC}"
+
+PLIST_FILES= bin/fstyp share/man/man8/fstyp.8.gz
+
+.include <bsd.port.mk>
diff --git a/filesystems/fstyp/distinfo b/filesystems/fstyp/distinfo
new file mode 100644
index 000000000000..b4ac12620020
--- /dev/null
+++ b/filesystems/fstyp/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905193
+SHA256 (fstyp-0.1.tar.gz) = a41fa79dc6abbc146101926856706aedf227d7f6b8e6c8375b741bc43b80aec6
+SIZE (fstyp-0.1.tar.gz) = 203414
diff --git a/filesystems/fstyp/pkg-descr b/filesystems/fstyp/pkg-descr
new file mode 100644
index 000000000000..2ab082ec691d
--- /dev/null
+++ b/filesystems/fstyp/pkg-descr
@@ -0,0 +1,2 @@
+fstyp can be used to heuristically detect which filesystem type a device or a
+partition contains. Useful for backup scripts.
diff --git a/filesystems/fswatch-mon/Makefile b/filesystems/fswatch-mon/Makefile
new file mode 100644
index 000000000000..024b1176b393
--- /dev/null
+++ b/filesystems/fswatch-mon/Makefile
@@ -0,0 +1,30 @@
+PORTNAME= fswatch
+DISTVERSION= 1.13.0
+PORTREVISION= 3
+CATEGORIES= filesystems sysutils
+MASTER_SITES= https://github.com/emcrisostomo/${PORTNAME}/releases/download/${DISTVERSION}/
+PKGNAMESUFFIX= -mon
+
+MAINTAINER= enrico.m.crisostomo@gmail.com
+COMMENT= Cross-platform file change monitor
+WWW= https://github.com/emcrisostomo/fswatch
+
+LICENSE= GPLv3
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+USES= compiler:c++11-lang libtool makeinfo
+USE_LDCONFIG= yes
+
+CONFLICTS_INSTALL= fswatch
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+INFO= fswatch
+INSTALL_TARGET= install-strip
+
+OPTIONS_DEFINE= DOCS NLS
+OPTIONS_SUB= yes
+
+NLS_USES= gettext
+NLS_CONFIGURE_ENABLE= nls
+
+.include <bsd.port.mk>
diff --git a/filesystems/fswatch-mon/distinfo b/filesystems/fswatch-mon/distinfo
new file mode 100644
index 000000000000..d761195bb2be
--- /dev/null
+++ b/filesystems/fswatch-mon/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1540284604
+SHA256 (fswatch-1.13.0.tar.gz) = 90bcf0e02fa586251aa3233cb805ca4087e81de2c5960150a0676cc42f8534bb
+SIZE (fswatch-1.13.0.tar.gz) = 819644
diff --git a/filesystems/fswatch-mon/pkg-descr b/filesystems/fswatch-mon/pkg-descr
new file mode 100644
index 000000000000..d388a01b25fc
--- /dev/null
+++ b/filesystems/fswatch-mon/pkg-descr
@@ -0,0 +1,15 @@
+fswatch is a file change monitor that receives notifications when the contents
+of the specified files or directories are modified. fswatch implements four
+kinds of monitors:
+
+ * A monitor based on the File System Events API of Apple OS X.
+ * A monitor based on kqueue, an event notification interface introduced in
+ FreeBSD 4.1 and supported on most *BSD systems (including OS X).
+ * A monitor based on inotify, a Linux kernel subsystem that reports file
+ system changes to applications.
+ * A monitor which periodically stats the file system, saves file modification
+ times in memory and manually calculates file system changes, which can work
+ on any operating system where stat (2) can be used.
+
+fswatch should build and work correctly on any system shipping either of the
+aforementioned APIs.
diff --git a/filesystems/fswatch-mon/pkg-plist b/filesystems/fswatch-mon/pkg-plist
new file mode 100644
index 000000000000..88bdd75d8212
--- /dev/null
+++ b/filesystems/fswatch-mon/pkg-plist
@@ -0,0 +1,47 @@
+bin/fswatch
+include/libfswatch/c++/event.hpp
+include/libfswatch/c++/filter.hpp
+include/libfswatch/c++/kqueue_monitor.hpp
+include/libfswatch/c++/libfswatch_exception.hpp
+include/libfswatch/c++/libfswatch_map.hpp
+include/libfswatch/c++/libfswatch_set.hpp
+include/libfswatch/c++/monitor.hpp
+include/libfswatch/c++/monitor_factory.hpp
+include/libfswatch/c++/path_utils.hpp
+include/libfswatch/c++/poll_monitor.hpp
+include/libfswatch/c++/string_utils.hpp
+include/libfswatch/c/cevent.h
+include/libfswatch/c/cfilter.h
+include/libfswatch/c/cmonitor.h
+include/libfswatch/c/error.h
+include/libfswatch/c/libfswatch.h
+include/libfswatch/c/libfswatch_log.h
+include/libfswatch/c/libfswatch_types.h
+lib/libfswatch.a
+lib/libfswatch.so
+lib/libfswatch.so.11
+lib/libfswatch.so.11.0.0
+share/man/man7/fswatch.7.gz
+%%NLS%%%%PORTDOCS%%%%DOCSDIR%%/ABOUT-NLS
+%%PORTDOCS%%%%DOCSDIR%%/AUTHORS
+%%PORTDOCS%%%%DOCSDIR%%/AUTHORS.libfswatch
+%%PORTDOCS%%%%DOCSDIR%%/CONTRIBUTING.md
+%%PORTDOCS%%%%DOCSDIR%%/COPYING
+%%PORTDOCS%%%%DOCSDIR%%/NEWS
+%%PORTDOCS%%%%DOCSDIR%%/NEWS.libfswatch
+%%PORTDOCS%%%%DOCSDIR%%/README.bsd
+%%PORTDOCS%%%%DOCSDIR%%/README.codestyle
+%%PORTDOCS%%%%DOCSDIR%%/README.freebsd
+%%PORTDOCS%%%%DOCSDIR%%/README.libfswatch.md
+%%PORTDOCS%%%%DOCSDIR%%/README.gnu-build-system
+%%PORTDOCS%%%%DOCSDIR%%/README.illumos
+%%PORTDOCS%%%%DOCSDIR%%/README.linux
+%%PORTDOCS%%%%DOCSDIR%%/README.md
+%%PORTDOCS%%%%DOCSDIR%%/README.osx
+%%PORTDOCS%%%%DOCSDIR%%/README.smartos
+%%PORTDOCS%%%%DOCSDIR%%/README.solaris
+%%PORTDOCS%%%%DOCSDIR%%/README.windows
+%%NLS%%share/locale/en@boldquot/LC_MESSAGES/fswatch.mo
+%%NLS%%share/locale/en@quot/LC_MESSAGES/fswatch.mo
+%%NLS%%share/locale/es/LC_MESSAGES/fswatch.mo
+%%NLS%%share/locale/it/LC_MESSAGES/fswatch.mo
diff --git a/filesystems/fusefs-libs/Makefile b/filesystems/fusefs-libs/Makefile
new file mode 100644
index 000000000000..49557f4a7c76
--- /dev/null
+++ b/filesystems/fusefs-libs/Makefile
@@ -0,0 +1,43 @@
+PORTNAME= fusefs
+DISTVERSION= 2.9.9
+PORTREVISION= 2
+CATEGORIES= filesystems sysutils
+MASTER_SITES= https://github.com/libfuse/libfuse/releases/download/fuse-${DISTVERSION}/
+PKGNAMESUFFIX= -libs
+DISTNAME= fuse-${DISTVERSION}
+
+MAINTAINER= se@FreeBSD.org
+COMMENT= FUSE allows filesystem implementation in userspace
+WWW= https://github.com/libfuse/libfuse
+
+LICENSE= LGPL21
+LICENSE_FILE= ${WRKSRC}/COPYING.LIB
+
+IGNORE_DragonFly= fusefs has not been implemented on DragonFly
+
+USES= autoreconf gettext-tools iconv libtool
+USE_LDCONFIG= yes
+
+GNU_CONFIGURE= yes
+CONFIGURE_ARGS= --with-pkgconfigdir=${PREFIX}/libdata/pkgconfig
+CONFIGURE_ENV= MOUNT_FUSE_PATH=${PREFIX}/sbin
+INSTALL_TARGET= install-strip
+
+PORTSCOUT= limit:^2\.
+
+PLIST_SUB= VERSION=${PORTVERSION}
+PORTDOCS= *
+
+OPTIONS_DEFINE= DOCS
+
+pre-configure:
+ ${CP} ${LOCALBASE}/share/gettext/config.rpath ${WRKSRC}
+
+do-install-DOCS-on:
+ @${MKDIR} ${STAGEDIR}${DOCSDIR}/libs
+ ${INSTALL_DATA} ${WRKSRC}/doc/how-fuse-works ${WRKSRC}/doc/kernel.txt ${STAGEDIR}${DOCSDIR}/libs
+
+post-install:
+ ${INSTALL_DATA} ${WRKSRC}/include/fuse_kernel.h ${STAGEDIR}${PREFIX}/include/fuse
+
+.include <bsd.port.mk>
diff --git a/filesystems/fusefs-libs/distinfo b/filesystems/fusefs-libs/distinfo
new file mode 100644
index 000000000000..932ca6834e61
--- /dev/null
+++ b/filesystems/fusefs-libs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1601617112
+SHA256 (fuse-2.9.9.tar.gz) = d0e69d5d608cc22ff4843791ad097f554dd32540ddc9bed7638cc6fea7c1b4b5
+SIZE (fuse-2.9.9.tar.gz) = 1813177
diff --git a/filesystems/fusefs-libs/files/patch-doc_Makefile.am b/filesystems/fusefs-libs/files/patch-doc_Makefile.am
new file mode 100644
index 000000000000..d80aa802128e
--- /dev/null
+++ b/filesystems/fusefs-libs/files/patch-doc_Makefile.am
@@ -0,0 +1,11 @@
+--- doc/Makefile.am.orig 2019-07-31 16:36:32 UTC
++++ doc/Makefile.am
+@@ -1,5 +1,8 @@
+ ## Process this file with automake to produce Makefile.in
+
++if BSD
++else
+ dist_man_MANS = fusermount.1 mount.fuse.8 ulockmgr_server.1
++endif
+
+ EXTRA_DIST = how-fuse-works kernel.txt Doxyfile html
diff --git a/filesystems/fusefs-libs/files/patch-lib_fuse__versionscript b/filesystems/fusefs-libs/files/patch-lib_fuse__versionscript
new file mode 100644
index 000000000000..f287af348fce
--- /dev/null
+++ b/filesystems/fusefs-libs/files/patch-lib_fuse__versionscript
@@ -0,0 +1,53 @@
+--- lib/fuse_versionscript.orig 2019-01-04 13:33:33 UTC
++++ lib/fuse_versionscript
+@@ -9,15 +9,15 @@ FUSE_2.2 {
+ fuse_loop_mt;
+ fuse_loop_mt_proc;
+ fuse_main;
+- fuse_main_compat1;
+- fuse_main_compat2;
+- fuse_mount_compat1;
+- fuse_new_compat1;
+- fuse_new_compat2;
++# fuse_main_compat1;
++# fuse_main_compat2;
++# fuse_mount_compat1;
++# fuse_new_compat1;
++# fuse_new_compat2;
+ fuse_process_cmd;
+ fuse_read_cmd;
+ fuse_set_getcontext_func;
+- fuse_setup_compat2;
++# fuse_setup_compat2;
+ };
+
+ FUSE_2.4 {
+@@ -56,10 +56,10 @@ FUSE_2.5 {
+
+ FUSE_2.5 {
+ global:
+- fuse_lowlevel_new_compat;
+- fuse_main_real_compat22;
+- fuse_mount_compat22;
+- fuse_new_compat22;
++# fuse_lowlevel_new_compat;
++# fuse_main_real_compat22;
++# fuse_mount_compat22;
++# fuse_new_compat22;
+ fuse_opt_parse;
+ fuse_opt_add_opt;
+ fuse_opt_add_arg;
+@@ -69,10 +69,10 @@ FUSE_2.5 {
+ fuse_remove_signal_handlers;
+ fuse_reply_create;
+ fuse_reply_open;
+- fuse_reply_open_compat;
++# fuse_reply_open_compat;
+ fuse_reply_statfs;
+- fuse_reply_statfs_compat;
+- fuse_setup_compat22;
++# fuse_reply_statfs_compat;
++# fuse_setup_compat22;
+ fuse_set_signal_handlers;
+ } FUSE_2.4;
+
diff --git a/filesystems/fusefs-libs/files/patch-lib_helper.c b/filesystems/fusefs-libs/files/patch-lib_helper.c
new file mode 100644
index 000000000000..a9cb4b6fd1aa
--- /dev/null
+++ b/filesystems/fusefs-libs/files/patch-lib_helper.c
@@ -0,0 +1,72 @@
+--- lib/helper.c.orig 2015-05-22 09:24:02 UTC
++++ lib/helper.c
+@@ -31,7 +31,7 @@ enum {
+ struct helper_opts {
+ int singlethread;
+ int foreground;
+- int nodefault_subtype;
++ int fsname;
+ char *mountpoint;
+ };
+
+@@ -42,8 +42,7 @@ static const struct fuse_opt fuse_helper
+ FUSE_HELPER_OPT("debug", foreground),
+ FUSE_HELPER_OPT("-f", foreground),
+ FUSE_HELPER_OPT("-s", singlethread),
+- FUSE_HELPER_OPT("fsname=", nodefault_subtype),
+- FUSE_HELPER_OPT("subtype=", nodefault_subtype),
++ FUSE_HELPER_OPT("fsname=", fsname),
+
+ FUSE_OPT_KEY("-h", KEY_HELP),
+ FUSE_OPT_KEY("--help", KEY_HELP),
+@@ -53,7 +52,6 @@ static const struct fuse_opt fuse_helper
+ FUSE_OPT_KEY("-d", FUSE_OPT_KEY_KEEP),
+ FUSE_OPT_KEY("debug", FUSE_OPT_KEY_KEEP),
+ FUSE_OPT_KEY("fsname=", FUSE_OPT_KEY_KEEP),
+- FUSE_OPT_KEY("subtype=", FUSE_OPT_KEY_KEEP),
+ FUSE_OPT_END
+ };
+
+@@ -123,24 +121,24 @@ static int fuse_helper_opt_proc(void *da
+ }
+ }
+
+-static int add_default_subtype(const char *progname, struct fuse_args *args)
++static int add_default_fsname(const char *progname, struct fuse_args *args)
+ {
+ int res;
+- char *subtype_opt;
++ char *fsname_opt;
+ const char *basename = strrchr(progname, '/');
+ if (basename == NULL)
+ basename = progname;
+ else if (basename[1] != '\0')
+ basename++;
+
+- subtype_opt = (char *) malloc(strlen(basename) + 64);
+- if (subtype_opt == NULL) {
++ fsname_opt = (char *) malloc(strlen(basename) + 64);
++ if (fsname_opt == NULL) {
+ fprintf(stderr, "fuse: memory allocation failed\n");
+ return -1;
+ }
+- sprintf(subtype_opt, "-osubtype=%s", basename);
+- res = fuse_opt_add_arg(args, subtype_opt);
+- free(subtype_opt);
++ sprintf(fsname_opt, "-ofsname=%s", basename);
++ res = fuse_opt_add_arg(args, fsname_opt);
++ free(fsname_opt);
+ return res;
+ }
+
+@@ -156,8 +154,8 @@ int fuse_parse_cmdline(struct fuse_args
+ if (res == -1)
+ return -1;
+
+- if (!hopts.nodefault_subtype) {
+- res = add_default_subtype(args->argv[0], args);
++ if (!hopts.fsname) {
++ res = add_default_fsname(args->argv[0], args);
+ if (res == -1)
+ goto err;
+ }
diff --git a/filesystems/fusefs-libs/files/patch-lib_mount__bsd.c b/filesystems/fusefs-libs/files/patch-lib_mount__bsd.c
new file mode 100644
index 000000000000..765ec8fb8159
--- /dev/null
+++ b/filesystems/fusefs-libs/files/patch-lib_mount__bsd.c
@@ -0,0 +1,77 @@
+--- lib/mount_bsd.c.orig 2015-05-22 09:24:02 UTC
++++ lib/mount_bsd.c
+@@ -10,6 +10,8 @@
+ #include "fuse_misc.h"
+ #include "fuse_opt.h"
+
++#include <sys/param.h>
++#include <sys/mount.h>
+ #include <sys/stat.h>
+ #include <sys/wait.h>
+ #include <sys/sysctl.h>
+@@ -78,6 +80,7 @@ static const struct fuse_opt fuse_mount_
+ FUSE_DUAL_OPT_KEY("ro", KEY_KERN),
+ FUSE_DUAL_OPT_KEY("rw", KEY_KERN),
+ FUSE_DUAL_OPT_KEY("auto", KEY_KERN),
++ FUSE_DUAL_OPT_KEY("automounted", KEY_KERN),
+ /* options supported under both Linux and FBSD */
+ FUSE_DUAL_OPT_KEY("allow_other", KEY_KERN),
+ FUSE_DUAL_OPT_KEY("default_permissions",KEY_KERN),
+@@ -192,56 +195,12 @@ void fuse_unmount_compat22(const char *m
+ free(umount_cmd);
+ }
+
+-static void do_unmount(char *dev, int fd)
+-{
+- char device_path[SPECNAMELEN + 12];
+- const char *argv[4];
+- const char umount_cmd[] = "/sbin/umount";
+- pid_t pid;
+-
+- snprintf(device_path, SPECNAMELEN + 12, _PATH_DEV "%s", dev);
+-
+- argv[0] = umount_cmd;
+- argv[1] = "-f";
+- argv[2] = device_path;
+- argv[3] = NULL;
+-
+- pid = fork();
+-
+- if (pid == -1)
+- return;
+-
+- if (pid == 0) {
+- close(fd);
+- execvp(umount_cmd, (char **)argv);
+- exit(1);
+- }
+-
+- waitpid(pid, NULL, 0);
+-}
+-
+ void fuse_kern_unmount(const char *mountpoint, int fd)
+ {
+ char *ep, dev[128];
+ struct stat sbuf;
+
+- (void)mountpoint;
+-
+- if (fstat(fd, &sbuf) == -1)
+- goto out;
+-
+- devname_r(sbuf.st_rdev, S_IFCHR, dev, 128);
+-
+- if (strncmp(dev, "fuse", 4))
+- goto out;
+-
+- strtol(dev + 4, &ep, 10);
+- if (*ep != '\0')
+- goto out;
+-
+- do_unmount(dev, fd);
+-
+-out:
++ unmount(mountpoint, MNT_FORCE);
+ close(fd);
+ }
+
diff --git a/filesystems/fusefs-libs/files/patch-lib_mount__util.c b/filesystems/fusefs-libs/files/patch-lib_mount__util.c
new file mode 100644
index 000000000000..1d6a5db2a488
--- /dev/null
+++ b/filesystems/fusefs-libs/files/patch-lib_mount__util.c
@@ -0,0 +1,23 @@
+--- lib/mount_util.c.orig 2015-05-22 09:24:02 UTC
++++ lib/mount_util.c
+@@ -344,20 +344,3 @@ int fuse_mnt_check_empty(const char *pro
+ }
+ return 0;
+ }
+-
+-int fuse_mnt_check_fuseblk(void)
+-{
+- char buf[256];
+- FILE *f = fopen("/proc/filesystems", "r");
+- if (!f)
+- return 1;
+-
+- while (fgets(buf, sizeof(buf), f))
+- if (strstr(buf, "fuseblk\n")) {
+- fclose(f);
+- return 1;
+- }
+-
+- fclose(f);
+- return 0;
+-}
diff --git a/filesystems/fusefs-libs/files/patch-lib_mount__util.h b/filesystems/fusefs-libs/files/patch-lib_mount__util.h
new file mode 100644
index 000000000000..07865d839d77
--- /dev/null
+++ b/filesystems/fusefs-libs/files/patch-lib_mount__util.h
@@ -0,0 +1,7 @@
+--- lib/mount_util.h.orig 2015-05-22 09:24:02 UTC
++++ lib/mount_util.h
+@@ -16,4 +16,3 @@ int fuse_mnt_umount(const char *progname
+ char *fuse_mnt_resolve_path(const char *progname, const char *orig);
+ int fuse_mnt_check_empty(const char *progname, const char *mnt,
+ mode_t rootmode, off_t rootsize);
+-int fuse_mnt_check_fuseblk(void);
diff --git a/filesystems/fusefs-libs/pkg-descr b/filesystems/fusefs-libs/pkg-descr
new file mode 100644
index 000000000000..73b81c35ecd0
--- /dev/null
+++ b/filesystems/fusefs-libs/pkg-descr
@@ -0,0 +1,3 @@
+FUSE makes it possible to implement a filesystem in a userspace program.
+Features include: simple yet comprehensive API, secure mounting by non-root
+users, support for FreeBSD kernels, multi-threaded operation.
diff --git a/filesystems/fusefs-libs/pkg-message b/filesystems/fusefs-libs/pkg-message
new file mode 100644
index 000000000000..3e54fcf60f9c
--- /dev/null
+++ b/filesystems/fusefs-libs/pkg-message
@@ -0,0 +1,7 @@
+[
+{ type: install
+ message: <<EOM
+Install the FUSE kernel module (kldload fusefs) to use this port.
+EOM
+}
+]
diff --git a/filesystems/fusefs-libs/pkg-plist b/filesystems/fusefs-libs/pkg-plist
new file mode 100644
index 000000000000..b4fd07c97bc6
--- /dev/null
+++ b/filesystems/fusefs-libs/pkg-plist
@@ -0,0 +1,20 @@
+include/fuse.h
+include/fuse/cuse_lowlevel.h
+include/fuse/fuse.h
+include/fuse/fuse_common.h
+include/fuse/fuse_common_compat.h
+include/fuse/fuse_compat.h
+include/fuse/fuse_kernel.h
+include/fuse/fuse_lowlevel.h
+include/fuse/fuse_lowlevel_compat.h
+include/fuse/fuse_opt.h
+include/ulockmgr.h
+lib/libfuse.a
+lib/libfuse.so
+lib/libfuse.so.2
+lib/libfuse.so.%%VERSION%%
+lib/libulockmgr.a
+lib/libulockmgr.so
+lib/libulockmgr.so.1
+lib/libulockmgr.so.1.0.1
+libdata/pkgconfig/fuse.pc
diff --git a/filesystems/fusefs-libs3/Makefile b/filesystems/fusefs-libs3/Makefile
new file mode 100644
index 000000000000..28bd5ec39c86
--- /dev/null
+++ b/filesystems/fusefs-libs3/Makefile
@@ -0,0 +1,31 @@
+PORTNAME= fusefs-libs3
+DISTVERSION= 3.16.2
+CATEGORIES= filesystems sysutils
+MASTER_SITES= https://github.com/libfuse/libfuse/releases/download/fuse-${DISTVERSION}/
+DISTNAME= fuse-${DISTVERSION}
+
+MAINTAINER= se@FreeBSD.org
+COMMENT= FUSE library version 3 for filesystems implemented in userspace
+WWW= https://github.com/libfuse/libfuse/wiki/Filesystems
+
+LICENSE= GPLv2 LGPL21
+LICENSE_COMB= multi
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+USES= compiler iconv meson ninja
+USE_LDCONFIG= yes
+
+LDFLAGS+= -L${LOCALBASE}/lib ${ICONV_LIB}
+
+PLIST_SUB= VERSION=${PORTVERSION}
+
+.include <bsd.port.pre.mk>
+
+.if ${OPSYS} == "FreeBSD" && ${OSVERSION} < 1400014
+EXTRA_PATCHES= ${FILESDIR}/extra-patch-test_meson.build
+.endif
+.if ${OPSYS} == DragonFly
+IGNORE= fusefs has not been implemented on DragonFly
+.endif
+
+.include <bsd.port.post.mk>
diff --git a/filesystems/fusefs-libs3/distinfo b/filesystems/fusefs-libs3/distinfo
new file mode 100644
index 000000000000..363a678a4cce
--- /dev/null
+++ b/filesystems/fusefs-libs3/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1697025258
+SHA256 (fuse-3.16.2.tar.gz) = f797055d9296b275e981f5f62d4e32e089614fc253d1ef2985851025b8a0ce87
+SIZE (fuse-3.16.2.tar.gz) = 14165836
diff --git a/filesystems/fusefs-libs3/files/extra-patch-test_meson.build b/filesystems/fusefs-libs3/files/extra-patch-test_meson.build
new file mode 100644
index 000000000000..f7a17a17e4e7
--- /dev/null
+++ b/filesystems/fusefs-libs3/files/extra-patch-test_meson.build
@@ -0,0 +1,15 @@
+--- test/meson.build.orig 2021-09-06 12:45:29 UTC
++++ test/meson.build
+@@ -7,9 +7,9 @@ foreach prog: [ 'test_write_cache', 'test_setattr' ]
+ dependencies: thread_dep,
+ install: false)
+ endforeach
+-td += executable('test_syscalls', 'test_syscalls.c',
+- include_directories: include_dirs,
+- install: false)
++#td += executable('test_syscalls', 'test_syscalls.c',
++# include_directories: include_dirs,
++# install: false)
+ td += executable('readdir_inode', 'readdir_inode.c',
+ include_directories: include_dirs,
+ install: false)
diff --git a/filesystems/fusefs-libs3/files/patch-example_meson.build b/filesystems/fusefs-libs3/files/patch-example_meson.build
new file mode 100644
index 000000000000..88340523ed75
--- /dev/null
+++ b/filesystems/fusefs-libs3/files/patch-example_meson.build
@@ -0,0 +1,9 @@
+--- example/meson.build.orig 2023-02-17 09:31:14 UTC
++++ example/meson.build
+@@ -1,5 +1,5 @@ examples = [ 'passthrough', 'passthrough_fh',
+ examples = [ 'passthrough', 'passthrough_fh',
+- 'hello', 'hello_ll', 'hello_ll_uds',
++ 'hello', 'hello_ll',
+ 'printcap', 'ioctl_client', 'poll_client',
+ 'ioctl', 'cuse', 'cuse_client' ]
+
diff --git a/filesystems/fusefs-libs3/files/patch-lib_mount__bsd.c b/filesystems/fusefs-libs3/files/patch-lib_mount__bsd.c
new file mode 100644
index 000000000000..7a757d511cf9
--- /dev/null
+++ b/filesystems/fusefs-libs3/files/patch-lib_mount__bsd.c
@@ -0,0 +1,10 @@
+--- lib/mount_bsd.c.orig 2023-02-17 09:31:14 UTC
++++ lib/mount_bsd.c
+@@ -8,7 +8,6 @@
+ See the file COPYING.LIB.
+ */
+
+-#include "config.h"
+ #include "fuse_i.h"
+ #include "fuse_misc.h"
+ #include "fuse_opt.h"
diff --git a/filesystems/fusefs-libs3/pkg-descr b/filesystems/fusefs-libs3/pkg-descr
new file mode 100644
index 000000000000..8897132a5e08
--- /dev/null
+++ b/filesystems/fusefs-libs3/pkg-descr
@@ -0,0 +1,7 @@
+FUSE makes it possible to implement a filesystem in a userspace program.
+
+This version 3 of the fuse library is not compatible with file-systems
+developed for version 2.
+
+A list of filesystems supported by this version of the library is
+maintained in the WiKi on GitHub.
diff --git a/filesystems/fusefs-libs3/pkg-message b/filesystems/fusefs-libs3/pkg-message
new file mode 100644
index 000000000000..3e54fcf60f9c
--- /dev/null
+++ b/filesystems/fusefs-libs3/pkg-message
@@ -0,0 +1,7 @@
+[
+{ type: install
+ message: <<EOM
+Install the FUSE kernel module (kldload fusefs) to use this port.
+EOM
+}
+]
diff --git a/filesystems/fusefs-libs3/pkg-plist b/filesystems/fusefs-libs3/pkg-plist
new file mode 100644
index 000000000000..e82082ae92f8
--- /dev/null
+++ b/filesystems/fusefs-libs3/pkg-plist
@@ -0,0 +1,11 @@
+include/fuse3/cuse_lowlevel.h
+include/fuse3/fuse.h
+include/fuse3/fuse_common.h
+include/fuse3/fuse_log.h
+include/fuse3/fuse_lowlevel.h
+include/fuse3/fuse_opt.h
+include/fuse3/libfuse_config.h
+lib/libfuse3.so
+lib/libfuse3.so.3
+lib/libfuse3.so.%%VERSION%%
+libdata/pkgconfig/fuse3.pc
diff --git a/filesystems/genromfs/Makefile b/filesystems/genromfs/Makefile
new file mode 100644
index 000000000000..4114b7c8345e
--- /dev/null
+++ b/filesystems/genromfs/Makefile
@@ -0,0 +1,20 @@
+PORTNAME= genromfs
+PORTVERSION= 0.5.7
+PORTREVISION= 1
+CATEGORIES= filesystems devel
+
+MAINTAINER= tomek@cedro.info
+COMMENT= Mkfs equivalent for romfs filesystem
+WWW= https://github.com/chexum/genromfs
+
+LICENSE= GPLv2
+
+USE_GITHUB= yes
+GH_ACCOUNT= chexum
+
+MAKE_ARGS= PREFIX=${STAGEDIR}${PREFIX}
+
+PLIST_FILES= bin/genromfs \
+ share/man/man8/genromfs.8.gz
+
+.include <bsd.port.mk>
diff --git a/filesystems/genromfs/distinfo b/filesystems/genromfs/distinfo
new file mode 100644
index 000000000000..d56cda096967
--- /dev/null
+++ b/filesystems/genromfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1634516173
+SHA256 (chexum-genromfs-0.5.7_GH0.tar.gz) = 2d16d217b11a28809454ddab0cd7c1c0865af8ea79ac0e86af03ab82320f02ab
+SIZE (chexum-genromfs-0.5.7_GH0.tar.gz) = 27929
diff --git a/filesystems/genromfs/files/patch-Makefile b/filesystems/genromfs/files/patch-Makefile
new file mode 100644
index 000000000000..1b9e509d6c3e
--- /dev/null
+++ b/filesystems/genromfs/files/patch-Makefile
@@ -0,0 +1,36 @@
+--- Makefile.orig 2009-02-15 10:48:15 UTC
++++ Makefile
+@@ -5,7 +5,7 @@ all: genromfs
+
+ PACKAGE = genromfs
+ VERSION = 0.5.7
+-CC = gcc
++CC = cc
+ CFLAGS = -O2 -Wall -DVERSION=\"$(VERSION)\"#-g#
+ LDFLAGS = -s#-g
+
+@@ -17,9 +17,9 @@ FILES = COPYING NEWS ChangeLog Makefile \
+ checkdist \
+ .gitignore selftest
+
+-prefix = /usr
+-bindir = $(prefix)/bin
+-mandir = $(prefix)/man
++PREFIX ?= /usr
++bindir = /bin
++mandir = /share/man
+
+ genromfs: genromfs.o
+ $(CC) $(LDFLAGS) genromfs.o -o genromfs
+@@ -53,11 +53,6 @@ install-bin:
+ install -m 755 genromfs $(PREFIX)$(bindir)/
+
+ install-man:
+- # genromfs 0.5 installed the man page in this file,
+- # remove it before someone notices :)
+- if [ -f $(PREFIX)$(bindir)/man8 ]; then \
+- rm -f $(PREFIX)$(bindir)/man8; \
+- fi
+ mkdir -p $(PREFIX)$(mandir)/man8
+ install -m 644 genromfs.8 $(PREFIX)$(mandir)/man8/
+
diff --git a/filesystems/genromfs/pkg-descr b/filesystems/genromfs/pkg-descr
new file mode 100644
index 000000000000..af0611e1fed2
--- /dev/null
+++ b/filesystems/genromfs/pkg-descr
@@ -0,0 +1,6 @@
+The mkfs equivalent for romfs filesystem. Port created for NuttX RTOS.
+ROM FileSystem (ROMFS), read only filesystem, mainly for initial RAM
+disks of installation disks. Using this filesystem, you get a very
+similar feature, and even the possibility of a small kernel, with a
+file system which doesn't take up useful memory from the router
+functions in the basement of your office.
diff --git a/filesystems/gitfs/Makefile b/filesystems/gitfs/Makefile
new file mode 100644
index 000000000000..d943f6188d14
--- /dev/null
+++ b/filesystems/gitfs/Makefile
@@ -0,0 +1,45 @@
+PORTNAME= gitfs
+DISTVERSION= 0.5.2
+PORTREVISION= 2
+CATEGORIES= filesystems devel
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= ports@FreeBSD.org
+COMMENT= Version controlled file system
+WWW= https://www.presslabs.com/code/gitfs/
+
+LICENSE= APACHE20
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+DEPRECATED= Abandonware, last release on 2019
+EXPIRATION_DATE=2024-12-31
+
+RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}atomiclong>=0.1.1:devel/py-atomiclong@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}cffi>=1.12.3:devel/py-cffi@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}fusepy>=3.0.1:filesystems/py-fusepy@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}pycparser>=2.19:devel/py-pycparser@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}pygit2>=0.28.2:devel/py-pygit2@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}raven>=6.10.0:devel/py-raven@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}six>=1.12.0:devel/py-six@${PY_FLAVOR}
+TEST_DEPENDS= ${PYTHON_PKGNAMEPREFIX}pytest>=4.6.5:devel/py-pytest@${PY_FLAVOR}
+
+USE_GITHUB= yes
+GH_ACCOUNT= PressLabs
+
+NO_ARCH= yes
+USES= python
+USE_PYTHON= autoplist distutils concurrent optsuffix
+
+post-patch:
+ @${REINPLACE_CMD} -e 's/==/>=/' ${WRKSRC}/*requirements.txt
+
+# XXX Integrations tests want MOUNT_PATH, REPO_* passed via TEST_ENV
+do-test:
+ @(cd ${TEST_WRKSRC} && ${SETENV} ${TEST_ENV} ${PYTHON_CMD} -m pytest)
+
+post-patch: patch-py3k-mock
+patch-py3k-mock:
+ @${GREP} -Flr 'mock import' ${WRKSRC} | ${XARGS} ${REINPLACE_CMD} \
+ -i .bak.mock -e 's/mock import/unittest.&/'
+
+.include <bsd.port.mk>
diff --git a/filesystems/gitfs/distinfo b/filesystems/gitfs/distinfo
new file mode 100644
index 000000000000..a44e0ec16308
--- /dev/null
+++ b/filesystems/gitfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1571569210
+SHA256 (PressLabs-gitfs-0.5.2_GH0.tar.gz) = 921e24311e3b8ea3a5448d698a11a747618ee8dd62d5d43a85801de0b111cbf3
+SIZE (PressLabs-gitfs-0.5.2_GH0.tar.gz) = 64141
diff --git a/filesystems/gitfs/files/patch-gitfs_utils_args.py b/filesystems/gitfs/files/patch-gitfs_utils_args.py
new file mode 100644
index 000000000000..bc4d1d42d80d
--- /dev/null
+++ b/filesystems/gitfs/files/patch-gitfs_utils_args.py
@@ -0,0 +1,36 @@
+https://github.com/PressLabs/gitfs/issues/258
+https://github.com/PressLabs/gitfs/issues/257
+
+--- gitfs/utils/args.py.orig 2019-10-20 11:00:10 UTC
++++ gitfs/utils/args.py
+@@ -44,7 +44,7 @@ class Args(object):
+ ("foreground", (False, "bool")),
+ ("branch", ("master", "string")),
+ ("allow_other", (False, "bool")),
+- ("allow_root", (True, "bool")),
++ ("allow_root", (False, "bool")),
+ ("commiter_name", (self.get_commiter_user, "string")),
+ ("commiter_email", (self.get_commiter_email, "string")),
+ ("max_size", (10, "float")),
+@@ -76,12 +76,6 @@ class Args(object):
+ return self.check_args(self.set_defaults(args))
+
+ def check_args(self, args):
+- # check allow_other and allow_root
+- if args.allow_other:
+- args.allow_root = False
+- else:
+- args.allow_root = True
+-
+ # check log_level
+ if args.debug:
+ args.log_level = "debug"
+@@ -182,7 +176,7 @@ class Args(object):
+ return "{}@{}".format(args.user, socket.gethostname())
+
+ def get_repo_path(self, args):
+- return tempfile.mkdtemp(dir="/var/lib/gitfs")
++ return tempfile.mkdtemp(prefix="gitfs")
+
+ def get_ssh_key(self, args):
+ return os.environ["HOME"] + "/.ssh/id_rsa"
diff --git a/filesystems/gitfs/pkg-descr b/filesystems/gitfs/pkg-descr
new file mode 100644
index 000000000000..ce7e2bf5144f
--- /dev/null
+++ b/filesystems/gitfs/pkg-descr
@@ -0,0 +1,3 @@
+gitfs is a FUSE file system that fully integrates with git. You can
+mount a remote repository's branch locally, and any subsequent changes
+made to the files will be automatically committed to the remote.
diff --git a/filesystems/gphotofs/Makefile b/filesystems/gphotofs/Makefile
new file mode 100644
index 000000000000..bbd1226738d5
--- /dev/null
+++ b/filesystems/gphotofs/Makefile
@@ -0,0 +1,22 @@
+PORTNAME= gphotofs
+PORTVERSION= 0.5
+PORTREVISION= 5
+CATEGORIES= filesystems graphics sysutils
+MASTER_SITES= SF/gphoto/${PORTNAME}/${PORTVERSION}.0
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= danfe@FreeBSD.org
+COMMENT= Mount PTP camera as a file system
+WWW= http://gphoto.sourceforge.net/proj/gphotofs/
+
+LICENSE= GPLv2
+
+LIB_DEPENDS= libgphoto2.so:graphics/libgphoto2
+
+USES= fuse gnome pkgconfig tar:bzip2
+USE_GNOME= glib20
+GNU_CONFIGURE= yes
+
+PLIST_FILES= bin/gphotofs
+
+.include <bsd.port.mk>
diff --git a/filesystems/gphotofs/distinfo b/filesystems/gphotofs/distinfo
new file mode 100644
index 000000000000..8c2f49dc3b94
--- /dev/null
+++ b/filesystems/gphotofs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905199
+SHA256 (gphotofs-0.5.tar.bz2) = 676ec4de69a81c193ffc31bdc7b587ac2a2cc3780b14f0e7c9c4c0a517b343cc
+SIZE (gphotofs-0.5.tar.bz2) = 261357
diff --git a/filesystems/gphotofs/pkg-descr b/filesystems/gphotofs/pkg-descr
new file mode 100644
index 000000000000..4ed340e8b05e
--- /dev/null
+++ b/filesystems/gphotofs/pkg-descr
@@ -0,0 +1,3 @@
+gphotofs is a FUSE filesystem module to mount your camera as a filesystem.
+This allow using your camera with any tool able to read from a mounted
+filesystem.
diff --git a/filesystems/gvfs/Makefile b/filesystems/gvfs/Makefile
new file mode 100644
index 000000000000..46c238fc6b35
--- /dev/null
+++ b/filesystems/gvfs/Makefile
@@ -0,0 +1,89 @@
+PORTNAME= gvfs
+PORTVERSION= 1.50.2
+PORTREVISION= 3
+CATEGORIES= filesystems devel gnome
+MASTER_SITES= GNOME
+DIST_SUBDIR= gnome
+
+MAINTAINER= gnome@FreeBSD.org
+COMMENT= GNOME virtual file system
+WWW= https://www.gnome.org/
+
+LICENSE= GPLv2
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+BUILD_DEPENDS= docbook-xsl>=0:textproc/docbook-xsl
+LIB_DEPENDS= libgcrypt.so:security/libgcrypt \
+ libdbus-1.so:devel/dbus \
+ libgcr-base-3.so:security/gcr3 \
+ libsoup-3.0.so:devel/libsoup3 \
+ libgudev-1.0.so:devel/libgudev \
+ libudisks2.so:sysutils/libudisks \
+ libsecret-1.so:security/libsecret
+RUN_DEPENDS= bsdisks>0:sysutils/bsdisks \
+ lsof:sysutils/lsof
+PORTSCOUT= limitw:1,even
+
+USES= cpe gettext gnome libarchive localbase meson \
+ pkgconfig python:build shebangfix tar:xz
+USE_GNOME= glib20 libxml2 libxslt:build
+SHEBANG_FILES= meson_post_install.py
+MESON_ARGS= -Dsystemduserunitdir=no \
+ -Dtmpfilesdir=no \
+ -Dadmin=false \
+ -Dlogind=false \
+ -Dlibusb=false \
+ -Dman=true
+USE_LDCONFIG= yes
+CPE_VENDOR= gnome
+
+GLIB_SCHEMAS= org.gnome.system.gvfs.enums.xml
+
+OPTIONS_SUB= yes
+OPTIONS_DEFINE= AVAHI FUSE AFC GOA SMB CDDA GOOGLE GPHOTO MTP NFS BLURAY
+OPTIONS_DEFAULT=AVAHI SMB CDDA GPHOTO MTP NFS BLURAY
+
+AFC_DESC= Apple device support
+GOA_DESC= GNOME Online Accounts volume monitor support
+GOOGLE_DESC= Google backend
+
+AVAHI_LIB_DEPENDS= libavahi-client.so:net/avahi-app
+AVAHI_MESON_TRUE= dnssd
+AVAHI_VARS= GLIB_SCHEMAS+=org.gnome.system.dns_sd.gschema.xml
+
+BLURAY_LIB_DEPENDS= libbluray.so:multimedia/libbluray
+BLURAY_MESON_TRUE= bluray
+BLURAY_DESC= Blu-ray metadata support
+
+FUSE_USES= fuse:3
+FUSE_MESON_TRUE= fuse
+
+AFC_LIB_DEPENDS= libimobiledevice-1.0.so:comms/libimobiledevice \
+ libplist-2.0.so:devel/libplist
+AFC_MESON_TRUE= afc
+
+GOA_LIB_DEPENDS= libgoa-1.0.so:net/gnome-online-accounts
+GOA_MESON_TRUE= goa
+
+SMB_USES= samba:lib
+SMB_MESON_TRUE= smb
+SMB_VARS= GLIB_SCHEMAS+=org.gnome.system.smb.gschema.xml
+
+CDDA_LIB_DEPENDS= libcdio_paranoia.so:sysutils/libcdio-paranoia \
+ libcdio.so:sysutils/libcdio
+CDDA_MESON_TRUE= cdda
+
+GOOGLE_IMPLIES= GOA
+GOOGLE_LIB_DEPENDS= libgdata.so:devel/libgdata
+GOOGLE_MESON_TRUE= google
+
+GPHOTO_LIB_DEPENDS= libgphoto2.so:graphics/libgphoto2
+GPHOTO_MESON_TRUE= gphoto2
+
+MTP_LIB_DEPENDS= libmtp.so:multimedia/libmtp
+MTP_MESON_TRUE= mtp
+
+NFS_LIB_DEPENDS= libnfs.so:net/libnfs
+NFS_MESON_TRUE= nfs
+
+.include <bsd.port.mk>
diff --git a/filesystems/gvfs/distinfo b/filesystems/gvfs/distinfo
new file mode 100644
index 000000000000..57983f695276
--- /dev/null
+++ b/filesystems/gvfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1658680082
+SHA256 (gnome/gvfs-1.50.2.tar.xz) = 03d72b8c15ef438110f0cf457b5655266c8b515d0412b30f4d55cfa0da06ac5e
+SIZE (gnome/gvfs-1.50.2.tar.xz) = 1214464
diff --git a/filesystems/gvfs/files/patch-client_gvfsfusedaemon.c b/filesystems/gvfs/files/patch-client_gvfsfusedaemon.c
new file mode 100644
index 000000000000..0d9c69189b48
--- /dev/null
+++ b/filesystems/gvfs/files/patch-client_gvfsfusedaemon.c
@@ -0,0 +1,12 @@
+--- client/gvfsfusedaemon.c.orig 2012-05-15 20:01:49.000000000 +0200
++++ client/gvfsfusedaemon.c 2012-05-31 14:00:26.000000000 +0200
+@@ -2361,7 +2361,9 @@
+ subthread = g_thread_new ("gvfs-fuse-sub", (GThreadFunc) subthread_main, NULL);
+
+ /* Indicate O_TRUNC support for open() */
++#ifdef FUSE_CAP_ATOMIC_O_TRUNC
+ conn->want |= FUSE_CAP_ATOMIC_O_TRUNC;
++#endif
+
+ return NULL;
+ }
diff --git a/filesystems/gvfs/files/patch-daemon_gvfswritechannel.c b/filesystems/gvfs/files/patch-daemon_gvfswritechannel.c
new file mode 100644
index 000000000000..54c4216873e4
--- /dev/null
+++ b/filesystems/gvfs/files/patch-daemon_gvfswritechannel.c
@@ -0,0 +1,10 @@
+--- daemon/gvfswritechannel.c.orig 2007-12-22 18:50:10.000000000 -0500
++++ daemon/gvfswritechannel.c 2007-12-22 18:50:20.000000000 -0500
+@@ -30,6 +30,7 @@
+ #include <sys/un.h>
+ #include <unistd.h>
+ #include <fcntl.h>
++#include <string.h>
+
+ #include <glib.h>
+ #include <glib-object.h>
diff --git a/filesystems/gvfs/pkg-descr b/filesystems/gvfs/pkg-descr
new file mode 100644
index 000000000000..5ea65916b9a7
--- /dev/null
+++ b/filesystems/gvfs/pkg-descr
@@ -0,0 +1,4 @@
+GVFS allows applications and users to treat any number of file system
+concepts as a part of the local filesystem. With GVFS, filesystems across
+the internet, on connected devices, and in multiple formats are as simple
+to access (and write code for) as any directory on the local machine.
diff --git a/filesystems/gvfs/pkg-plist b/filesystems/gvfs/pkg-plist
new file mode 100644
index 000000000000..b4919f0bf62e
--- /dev/null
+++ b/filesystems/gvfs/pkg-plist
@@ -0,0 +1,156 @@
+include/gvfs-client/gvfs/gvfsurimapper.h
+include/gvfs-client/gvfs/gvfsuriutils.h
+lib/gio/modules/libgioremote-volume-monitor.so
+lib/gio/modules/libgvfsdbus.so
+lib/gvfs/libgvfscommon.so
+lib/gvfs/libgvfsdaemon.so
+%%AFC%%libexec/gvfs-afc-volume-monitor
+%%GOA%%libexec/gvfs-goa-volume-monitor
+%%GPHOTO%%libexec/gvfs-gphoto2-volume-monitor
+%%MTP%%libexec/gvfs-mtp-volume-monitor
+libexec/gvfs-udisks2-volume-monitor
+libexec/gvfsd
+%%AFC%%libexec/gvfsd-afc
+libexec/gvfsd-afp
+libexec/gvfsd-afp-browse
+libexec/gvfsd-archive
+libexec/gvfsd-burn
+%%CDDA%%libexec/gvfsd-cdda
+libexec/gvfsd-computer
+libexec/gvfsd-dav
+%%AVAHI%%libexec/gvfsd-dnssd
+libexec/gvfsd-ftp
+%%FUSE%%libexec/gvfsd-fuse
+%%GOOGLE%%libexec/gvfsd-google
+%%GPHOTO%%libexec/gvfsd-gphoto2
+libexec/gvfsd-http
+libexec/gvfsd-localtest
+libexec/gvfsd-metadata
+%%MTP%%libexec/gvfsd-mtp
+libexec/gvfsd-network
+%%NFS%%libexec/gvfsd-nfs
+libexec/gvfsd-recent
+libexec/gvfsd-sftp
+%%SMB%%libexec/gvfsd-smb
+%%SMB%%libexec/gvfsd-smb-browse
+libexec/gvfsd-trash
+%%FUSE%%share/man/man1/gvfsd-fuse.1.gz
+share/man/man1/gvfsd-metadata.1.gz
+share/man/man1/gvfsd.1.gz
+share/man/man7/gvfs.7.gz
+%%AVAHI%%share/GConf/gsettings/gvfs-dns-sd.convert
+%%SMB%%share/GConf/gsettings/gvfs-smb.convert
+share/dbus-1/services/org.gtk.vfs.Daemon.service
+%%AFC%%share/dbus-1/services/org.gtk.vfs.AfcVolumeMonitor.service
+%%GPHOTO%%share/dbus-1/services/org.gtk.vfs.GPhoto2VolumeMonitor.service
+%%GOA%%share/dbus-1/services/org.gtk.vfs.GoaVolumeMonitor.service
+%%MTP%%share/dbus-1/services/org.gtk.vfs.MTPVolumeMonitor.service
+share/dbus-1/services/org.gtk.vfs.Metadata.service
+share/dbus-1/services/org.gtk.vfs.UDisks2VolumeMonitor.service
+%%AFC%%%%DATADIR%%/mounts/afc.mount
+%%DATADIR%%/mounts/afp-browse.mount
+%%DATADIR%%/mounts/afp.mount
+%%DATADIR%%/mounts/archive.mount
+%%DATADIR%%/mounts/burn.mount
+%%CDDA%%%%DATADIR%%/mounts/cdda.mount
+%%DATADIR%%/mounts/computer.mount
+%%AVAHI%%%%DATADIR%%/mounts/dav+sd.mount
+%%DATADIR%%/mounts/dav.mount
+%%AVAHI%%%%DATADIR%%/mounts/dns-sd.mount
+%%DATADIR%%/mounts/ftp.mount
+%%DATADIR%%/mounts/ftpis.mount
+%%DATADIR%%/mounts/ftps.mount
+%%GOOGLE%%%%DATADIR%%/mounts/google.mount
+%%GPHOTO%%%%DATADIR%%/mounts/gphoto2.mount
+%%DATADIR%%/mounts/http.mount
+%%DATADIR%%/mounts/localtest.mount
+%%MTP%%%%DATADIR%%/mounts/mtp.mount
+%%DATADIR%%/mounts/network.mount
+%%NFS%%%%DATADIR%%/mounts/nfs.mount
+%%DATADIR%%/mounts/recent.mount
+%%DATADIR%%/mounts/sftp.mount
+%%SMB%%%%DATADIR%%/mounts/smb-browse.mount
+%%SMB%%%%DATADIR%%/mounts/smb.mount
+%%DATADIR%%/mounts/trash.mount
+%%AFC%%%%DATADIR%%/remote-volume-monitors/afc.monitor
+%%GOA%%%%DATADIR%%/remote-volume-monitors/goa.monitor
+%%GPHOTO%%%%DATADIR%%/remote-volume-monitors/gphoto2.monitor
+%%MTP%%%%DATADIR%%/remote-volume-monitors/mtp.monitor
+%%DATADIR%%/remote-volume-monitors/udisks2.monitor
+share/locale/af/LC_MESSAGES/gvfs.mo
+share/locale/ar/LC_MESSAGES/gvfs.mo
+share/locale/as/LC_MESSAGES/gvfs.mo
+share/locale/ast/LC_MESSAGES/gvfs.mo
+share/locale/be/LC_MESSAGES/gvfs.mo
+share/locale/be@latin/LC_MESSAGES/gvfs.mo
+share/locale/bg/LC_MESSAGES/gvfs.mo
+share/locale/bn/LC_MESSAGES/gvfs.mo
+share/locale/bn_IN/LC_MESSAGES/gvfs.mo
+share/locale/bs/LC_MESSAGES/gvfs.mo
+share/locale/ca/LC_MESSAGES/gvfs.mo
+share/locale/ca@valencia/LC_MESSAGES/gvfs.mo
+share/locale/cs/LC_MESSAGES/gvfs.mo
+share/locale/da/LC_MESSAGES/gvfs.mo
+share/locale/de/LC_MESSAGES/gvfs.mo
+share/locale/el/LC_MESSAGES/gvfs.mo
+share/locale/en@shaw/LC_MESSAGES/gvfs.mo
+share/locale/en_GB/LC_MESSAGES/gvfs.mo
+share/locale/eo/LC_MESSAGES/gvfs.mo
+share/locale/es/LC_MESSAGES/gvfs.mo
+share/locale/et/LC_MESSAGES/gvfs.mo
+share/locale/eu/LC_MESSAGES/gvfs.mo
+share/locale/fa/LC_MESSAGES/gvfs.mo
+share/locale/fi/LC_MESSAGES/gvfs.mo
+share/locale/fr/LC_MESSAGES/gvfs.mo
+share/locale/fur/LC_MESSAGES/gvfs.mo
+share/locale/ga/LC_MESSAGES/gvfs.mo
+share/locale/gl/LC_MESSAGES/gvfs.mo
+share/locale/gu/LC_MESSAGES/gvfs.mo
+share/locale/he/LC_MESSAGES/gvfs.mo
+share/locale/hi/LC_MESSAGES/gvfs.mo
+share/locale/hr/LC_MESSAGES/gvfs.mo
+share/locale/hu/LC_MESSAGES/gvfs.mo
+share/locale/id/LC_MESSAGES/gvfs.mo
+share/locale/it/LC_MESSAGES/gvfs.mo
+share/locale/ja/LC_MESSAGES/gvfs.mo
+share/locale/kk/LC_MESSAGES/gvfs.mo
+share/locale/kn/LC_MESSAGES/gvfs.mo
+share/locale/ko/LC_MESSAGES/gvfs.mo
+share/locale/ku/LC_MESSAGES/gvfs.mo
+share/locale/lt/LC_MESSAGES/gvfs.mo
+share/locale/lv/LC_MESSAGES/gvfs.mo
+share/locale/mai/LC_MESSAGES/gvfs.mo
+share/locale/mk/LC_MESSAGES/gvfs.mo
+share/locale/ml/LC_MESSAGES/gvfs.mo
+share/locale/mr/LC_MESSAGES/gvfs.mo
+share/locale/ms/LC_MESSAGES/gvfs.mo
+share/locale/nb/LC_MESSAGES/gvfs.mo
+share/locale/nds/LC_MESSAGES/gvfs.mo
+share/locale/ne/LC_MESSAGES/gvfs.mo
+share/locale/nl/LC_MESSAGES/gvfs.mo
+share/locale/nn/LC_MESSAGES/gvfs.mo
+share/locale/oc/LC_MESSAGES/gvfs.mo
+share/locale/or/LC_MESSAGES/gvfs.mo
+share/locale/pa/LC_MESSAGES/gvfs.mo
+share/locale/pl/LC_MESSAGES/gvfs.mo
+share/locale/pt/LC_MESSAGES/gvfs.mo
+share/locale/pt_BR/LC_MESSAGES/gvfs.mo
+share/locale/ro/LC_MESSAGES/gvfs.mo
+share/locale/ru/LC_MESSAGES/gvfs.mo
+share/locale/sk/LC_MESSAGES/gvfs.mo
+share/locale/sl/LC_MESSAGES/gvfs.mo
+share/locale/sq/LC_MESSAGES/gvfs.mo
+share/locale/sr/LC_MESSAGES/gvfs.mo
+share/locale/sr@latin/LC_MESSAGES/gvfs.mo
+share/locale/sv/LC_MESSAGES/gvfs.mo
+share/locale/ta/LC_MESSAGES/gvfs.mo
+share/locale/te/LC_MESSAGES/gvfs.mo
+share/locale/tg/LC_MESSAGES/gvfs.mo
+share/locale/th/LC_MESSAGES/gvfs.mo
+share/locale/tr/LC_MESSAGES/gvfs.mo
+share/locale/ug/LC_MESSAGES/gvfs.mo
+share/locale/uk/LC_MESSAGES/gvfs.mo
+share/locale/vi/LC_MESSAGES/gvfs.mo
+share/locale/zh_CN/LC_MESSAGES/gvfs.mo
+share/locale/zh_HK/LC_MESSAGES/gvfs.mo
+share/locale/zh_TW/LC_MESSAGES/gvfs.mo
diff --git a/filesystems/hfsexplorer/Makefile b/filesystems/hfsexplorer/Makefile
new file mode 100644
index 000000000000..1ca4b1fad3b7
--- /dev/null
+++ b/filesystems/hfsexplorer/Makefile
@@ -0,0 +1,51 @@
+PORTNAME= hfsexplorer
+DISTVERSIONPREFIX= ${PORTNAME}-
+DISTVERSION= 2021.10.9
+CATEGORIES= filesystems sysutils java
+
+MAINTAINER= ports@FreeBSD.org
+COMMENT= HFSExplorer read Mac-formatted harddisks and disk images
+WWW= https://www.catacombae.org/hfsexplorer/
+
+LICENSE= GPLv3
+
+BUILD_DEPENDS= ant:devel/apache-ant
+
+USE_GITHUB= yes
+GH_ACCOUNT= unsound
+USE_JAVA= yes
+
+DESKTOP_ENTRIES= "hfsexplorer" \
+ "reader Mac-formatted harddisk" \
+ "${DATADIR}/res/icon.png" \
+ "${PORTNAME}" \
+ "System;Utility;Java;" \
+ false
+
+NO_ARCH= yes
+
+OPTIONS_DEFINE= DOCS
+
+do-configure:
+ @cd ${WRKSRC}/dist/bin && ${REINPLACE_CMD} -e 's|BASEDIR=".*"|BASEDIR="${DATADIR}/lib"|g' \
+ hfsx resview unhfs
+ @${REINPLACE_CMD} -e 's|BASEDIR=".*"|BASEDIR="${DATADIR}/lib"|g' \
+ ${WRKSRC}/dist/bin/hfsexplorer
+
+do-build:
+ @cd ${WRKSRC} && ${SH} buildall
+
+do-install:
+ @${MKDIR} ${STAGEDIR}${DATADIR}/lib
+ @${MKDIR} ${STAGEDIR}${DATADIR}/res
+.for f in hfsx resview unhfs
+ cd ${WRKSRC} && ${INSTALL_SCRIPT} dist/bin/${f} ${STAGEDIR}${PREFIX}/bin
+.endfor
+ cd ${WRKSRC} && ${INSTALL_SCRIPT} dist/bin/hfsexplorer ${STAGEDIR}${PREFIX}/bin/${PORTNAME}
+ cd ${WRKSRC} && ${INSTALL_DATA} dist/lib/*.jar ${STAGEDIR}${DATADIR}/lib
+ cd ${WRKSRC} && ${INSTALL_DATA} dist/res/icon.png ${STAGEDIR}${DATADIR}/res
+
+do-install-DOCS-on:
+ cd ${WRKSRC}/dist/doc && ${COPYTREE_SHARE} html ${STAGEDIR}${DOCSDIR}/
+
+.include <bsd.port.mk>
diff --git a/filesystems/hfsexplorer/distinfo b/filesystems/hfsexplorer/distinfo
new file mode 100644
index 000000000000..6d63ef3e632c
--- /dev/null
+++ b/filesystems/hfsexplorer/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1692888874
+SHA256 (unsound-hfsexplorer-hfsexplorer-2021.10.9_GH0.tar.gz) = 99cc26d26fdd9013169cae0b0ae9b845a9edb2ac3f4c9ddf865d6ffbb3669b9c
+SIZE (unsound-hfsexplorer-hfsexplorer-2021.10.9_GH0.tar.gz) = 1403267
diff --git a/filesystems/hfsexplorer/files/patch-build.xml b/filesystems/hfsexplorer/files/patch-build.xml
new file mode 100644
index 000000000000..f76cc72470ee
--- /dev/null
+++ b/filesystems/hfsexplorer/files/patch-build.xml
@@ -0,0 +1,20 @@
+--- build.xml.orig 2023-08-24 16:44:05 UTC
++++ build.xml
+@@ -3,7 +3,7 @@
+ <project basedir="." default="all" name="HFSExplorer">
+ <property environment="env"/>
+ <property name="debuglevel" value="source,lines,vars"/>
+- <condition property="java.target.level" value="1.5">
++ <condition property="java.target.level" value="6">
+ <or>
+ <equals arg1="${ant.java.version}" arg2="1.5"/>
+ <equals arg1="${ant.java.version}" arg2="1.6"/>
+@@ -12,7 +12,7 @@
+ </or>
+ </condition>
+ <property name="java.target.level" value="${ant.java.version}"/>
+- <condition property="java.source.level" value="1.5">
++ <condition property="java.source.level" value="6">
+ <or>
+ <equals arg1="${ant.java.version}" arg2="1.5"/>
+ <equals arg1="${ant.java.version}" arg2="1.6"/>
diff --git a/filesystems/hfsexplorer/pkg-descr b/filesystems/hfsexplorer/pkg-descr
new file mode 100644
index 000000000000..e3aef13452e6
--- /dev/null
+++ b/filesystems/hfsexplorer/pkg-descr
@@ -0,0 +1,11 @@
+HFSExplorer is an application that can read Mac-formatted hard disks and disk
+images. It can read the file systems HFS (Mac OS Standard), HFS+ (Mac OS
+Extended) and HFSX (Mac OS Extended with case sensitive file names).
+
+HFSExplorer allows you to browse your Mac volumes with a graphical file system
+browser, extract files (copy to hard disk), view detailed information about the
+volume and create disk images from the volume.
+HFSExplorer can also read most .dmg disk images created on a Mac, including zlib
+/ bzip2 compressed images and AES-128 encrypted images. It supports the
+partition schemes Master Boot Record, GUID Partition Table and Apple Partition
+Map natively.
diff --git a/filesystems/hfsexplorer/pkg-plist b/filesystems/hfsexplorer/pkg-plist
new file mode 100644
index 000000000000..c61f0354a525
--- /dev/null
+++ b/filesystems/hfsexplorer/pkg-plist
@@ -0,0 +1,21 @@
+bin/hfsexplorer
+bin/hfsx
+bin/resview
+bin/unhfs
+%%DATADIR%%/lib/apache-ant-1.7.0-bzip2.jar
+%%DATADIR%%/lib/csframework.jar
+%%DATADIR%%/lib/hfsx.jar
+%%DATADIR%%/lib/hfsx_dmglib.jar
+%%DATADIR%%/lib/iharder-base64.jar
+%%DATADIR%%/lib/swing-layout-1.0.4.jar
+%%DATADIR%%/res/icon.png
+%%PORTDOCS%%%%DOCSDIR%%/html/img/HFSExplorer_logo.png
+%%PORTDOCS%%%%DOCSDIR%%/html/index.html
+%%PORTDOCS%%%%DOCSDIR%%/html/troubleshooting.html
+%%PORTDOCS%%%%DOCSDIR%%/html/usage.html
+@dir %%DATADIR%%/res
+@dir %%DATADIR%%/lib
+@dir %%DATADIR%%
+%%PORTDOCS%%@dir %%DOCSDIR%%/html/img
+%%PORTDOCS%%@dir %%DOCSDIR%%/html
+%%PORTDOCS%%@dir %%DOCSDIR%%
diff --git a/filesystems/hfsfuse/Makefile b/filesystems/hfsfuse/Makefile
new file mode 100644
index 000000000000..cfc69e5b055e
--- /dev/null
+++ b/filesystems/hfsfuse/Makefile
@@ -0,0 +1,42 @@
+PORTNAME= hfsfuse
+DISTVERSION= 0.132
+PORTREVISION= 1
+CATEGORIES= filesystems
+MASTER_SITES= https://github.com/0x09/hfsfuse/releases/download/${DISTVERSION}/
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= me@cameronkatri.com
+COMMENT= FUSE driver for HFS+ filesystems
+WWW= https://github.com/0x09/hfsfuse
+
+LICENSE= MIT
+LICENSE_FILE= ${WRKSRC}/src/COPYING
+
+LIB_DEPENDS= libublio.so:devel/libublio \
+ libutf8proc.so:textproc/utf8proc
+
+USES= fuse gmake
+USE_CSTD= c99
+USE_GITHUB= yes
+GH_ACCOUNT= 0x09
+
+MAKE_ARGS= CONFIG_CFLAGS="${CFLAGS}" \
+ WITH_UBLIO=system \
+ WITH_UTF8PROC=system
+ALL_TARGET= config all
+
+PLIST_FILES= bin/hfsdump \
+ bin/hfsfuse
+PORTDOCS= README.md
+
+OPTIONS_DEFINE= DOCS
+
+do-install:
+ cd ${WRKSRC} && ${INSTALL_PROGRAM} hfsdump hfsfuse \
+ ${STAGEDIR}${PREFIX}/bin
+
+do-install-DOCS-on:
+ @${MKDIR} ${STAGEDIR}${DOCSDIR}
+ ${INSTALL_DATA} ${WRKSRC}/README.md ${STAGEDIR}${DOCSDIR}
+
+.include <bsd.port.mk>
diff --git a/filesystems/hfsfuse/distinfo b/filesystems/hfsfuse/distinfo
new file mode 100644
index 000000000000..57ed21da5d32
--- /dev/null
+++ b/filesystems/hfsfuse/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1621259070
+SHA256 (0x09-hfsfuse-0.132_GH0.tar.gz) = 699052701ccd46c82a473e17ac61e7ad56873189781069eb927b8c88eb8f9467
+SIZE (0x09-hfsfuse-0.132_GH0.tar.gz) = 246864
diff --git a/filesystems/hfsfuse/pkg-descr b/filesystems/hfsfuse/pkg-descr
new file mode 100644
index 000000000000..f919854c8e6e
--- /dev/null
+++ b/filesystems/hfsfuse/pkg-descr
@@ -0,0 +1,8 @@
+FUSE driver for HFS+ based on NetBSD's kernel driver with
+modifications.
+
+This driver is read-only and cannot write to or damage the target
+filesystem in any way.
+
+hfsfuse also includes a standalone tool, hfsdump, to inspect the
+contents of an HFS+ volume without FUSE.
diff --git a/filesystems/hfsutils/Makefile b/filesystems/hfsutils/Makefile
new file mode 100644
index 000000000000..80c19431f37e
--- /dev/null
+++ b/filesystems/hfsutils/Makefile
@@ -0,0 +1,56 @@
+PORTNAME= hfsutils
+PORTVERSION= 3.2.6
+PORTREVISION= 4
+CATEGORIES= filesystems sysutils
+MASTER_SITES= ftp://ftp.mars.org/pub/hfs/
+
+MAINTAINER= ports@FreeBSD.org
+COMMENT= Utilities for accessing Apple's HFS volumes
+WWW= https://www.mars.org/home/rob/proj/hfs/
+
+LICENSE= GPLv2+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+CONFLICTS= hfs
+
+USES= gmake # passing -jX breaks BSD make(1)
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+ALL_TARGET= all hfsck/hfsck
+
+PORTDOCS= *
+
+OPTIONS_DEFINE= TCLTK DEVLIBS DOCS
+OPTIONS_SUB= yes
+
+TCLTK_DESC= Enable Tcl interface (HFS "shell") and Tk-based GUI
+DEVLIBS_DESC= Install developer libraries and header files
+
+TCLTK_CATEGORIES= tcl tk
+TCLTK_USES= tk
+TCLTK_CPPFLAGS= -I${LOCALBASE}/include
+TCLTK_CONFIGURE_ON= --with-tcl=${TCL_LIBDIR} --with-tk=${TK_LIBDIR}
+TCLTK_CONFIGURE_OFF= --without-tcl --without-tk
+
+DEVLIBS_CONFIGURE_ON= --enable-devlibs
+
+post-patch:
+# Unbreak against Tcl 8.6
+ @${ECHO_CMD} '#define USE_INTERP_RESULT 1' >> ${WRKSRC}/config.h.in
+# Allow staging (support DESTDIR)
+ @${FIND} ${WRKSRC} -type f -name Makefile.in | ${XARGS} \
+ ${REINPLACE_CMD} -e '/^...DEST =/s,@,$$(DESTDIR)&,'
+
+post-install:
+ ${INSTALL_PROGRAM} ${WRKSRC}/hfsck/hfsck ${STAGEDIR}${PREFIX}/bin
+
+post-install-TCLTK-on:
+ @${CHMOD} 755 ${STAGEDIR}${PREFIX}/bin/hfs
+
+post-install-DOCS-on:
+ @${MKDIR} ${STAGEDIR}${DOCSDIR}
+.for f in BLURB CHANGES README TODO doc/*.txt
+ ${INSTALL_DATA} ${WRKSRC}/${f} ${STAGEDIR}${DOCSDIR}
+.endfor
+
+.include <bsd.port.mk>
diff --git a/filesystems/hfsutils/distinfo b/filesystems/hfsutils/distinfo
new file mode 100644
index 000000000000..518b017fcb0c
--- /dev/null
+++ b/filesystems/hfsutils/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905175
+SHA256 (hfsutils-3.2.6.tar.gz) = bc9d22d6d252b920ec9cdf18e00b7655a6189b3f34f42e58d5bb152957289840
+SIZE (hfsutils-3.2.6.tar.gz) = 207697
diff --git a/filesystems/hfsutils/files/patch-Makefile.in b/filesystems/hfsutils/files/patch-Makefile.in
new file mode 100644
index 000000000000..d736f4db0809
--- /dev/null
+++ b/filesystems/hfsutils/files/patch-Makefile.in
@@ -0,0 +1,36 @@
+--- Makefile.in.orig 1998-08-31 18:40:14 UTC
++++ Makefile.in
+@@ -64,7 +64,8 @@ TARGETS = $(CLITARGETS) $(TCLTARGETS) $(
+
+ CLITARGETS = hattrib hcd hcopy hdel hdir hformat hls hmkdir hmount hpwd \
+ hrename hrmdir humount hvol
+-TCLTARGETS = hfssh hfs
++TCLTARGETS = hfssh
++TCLSCRIPTS = hfs
+ TKTARGETS = xhfs
+
+ LIBHFS = libhfs/libhfs.a
+@@ -96,7 +97,7 @@ UTILOBJS = crc.o binhex.o copyin.o copyo
+ all :: @MAKE_TARGETS@
+
+ all_cli :: $(CLITARGETS)
+-all_tcl :: $(TCLTARGETS)
++all_tcl :: $(TCLTARGETS) $(TCLSCRIPTS)
+ all_tk :: $(TKTARGETS)
+ all_lib :: $(LIBHFS) $(LIBRSRC)
+
+@@ -129,9 +130,13 @@ install_tcl :: all_tcl
+ $(BININSTALL) $$file "$(BINDEST)/."; \
+ done
+
++ for file in $(TCLSCRIPTS); do \
++ $(LIBINSTALL) $$file "$(BINDEST)/."; \
++ done
++
+ if [ -f "$(BINDEST)/hfs" ]; then \
+ sed -e '1d' "$(BINDEST)/hfs" > "$(BINDEST)/hfs.new"; \
+- $(BININSTALL) "$(BINDEST)/hfs.new" "$(BINDEST)/hfs"; \
++ $(LIBINSTALL) "$(BINDEST)/hfs.new" "$(BINDEST)/hfs"; \
+ rm -f "$(BINDEST)/hfs.new"; \
+ fi
+
diff --git a/filesystems/hfsutils/pkg-descr b/filesystems/hfsutils/pkg-descr
new file mode 100644
index 000000000000..5a79840b7135
--- /dev/null
+++ b/filesystems/hfsutils/pkg-descr
@@ -0,0 +1,14 @@
+HFS is the "Hierarchical File System" used on modern Macintosh computers.
+With this package, you can read and write Macintosh-formatted media such as
+floppy disks, CD-ROMs, and SCSI hard disks on most Unix platforms. You can
+also format raw media or file into an HFS volume.
+
+This package contains a number of different tools:
+
+ - Several command-line programs (hmount, hls, hcopy, et al.)
+ - Tk-based front-end for browsing and copying files through a
+ variety of transfer modes (MacBinary, BinHex, text, etc.)
+ - Tcl package and interface for scriptable access to volumes
+ - C library for low-level access to volumes
+
+Support for Apple's new Extended Format (HFS+) is currently not available.
diff --git a/filesystems/hfsutils/pkg-plist b/filesystems/hfsutils/pkg-plist
new file mode 100644
index 000000000000..287d168c53cd
--- /dev/null
+++ b/filesystems/hfsutils/pkg-plist
@@ -0,0 +1,40 @@
+bin/hattrib
+bin/hcd
+bin/hcopy
+bin/hdel
+bin/hdir
+bin/hformat
+%%TCLTK%%bin/hfs
+bin/hfsck
+%%TCLTK%%bin/hfssh
+bin/hls
+bin/hmkdir
+bin/hmount
+bin/hpwd
+bin/hrename
+bin/hrmdir
+bin/humount
+bin/hvol
+%%TCLTK%%bin/xhfs
+%%DEVLIBS%%include/hfs.h
+%%DEVLIBS%%include/rsrc.h
+%%DEVLIBS%%lib/libhfs.a
+%%DEVLIBS%%lib/librsrc.a
+share/man/man1/hattrib.1.gz
+share/man/man1/hcd.1.gz
+share/man/man1/hcopy.1.gz
+share/man/man1/hdel.1.gz
+share/man/man1/hdir.1.gz
+share/man/man1/hformat.1.gz
+%%TCLTK%%share/man/man1/hfs.1.gz
+%%TCLTK%%share/man/man1/hfssh.1.gz
+share/man/man1/hfsutils.1.gz
+share/man/man1/hls.1.gz
+share/man/man1/hmkdir.1.gz
+share/man/man1/hmount.1.gz
+share/man/man1/hpwd.1.gz
+share/man/man1/hrename.1.gz
+share/man/man1/hrmdir.1.gz
+share/man/man1/humount.1.gz
+share/man/man1/hvol.1.gz
+%%TCLTK%%share/man/man1/xhfs.1.gz
diff --git a/filesystems/httpdirfs/Makefile b/filesystems/httpdirfs/Makefile
new file mode 100644
index 000000000000..8cda154772d7
--- /dev/null
+++ b/filesystems/httpdirfs/Makefile
@@ -0,0 +1,38 @@
+PORTNAME= httpdirfs
+DISTVERSION= 1.2.6
+CATEGORIES= filesystems
+PKGNAMEPREFIX= fusefs-
+
+PATCH_SITES= https://github.com/fangfufu/httpdirfs/commit/
+PATCHFILES= 43bdf7e71fde43084519e86051533a6b20c31474.patch:-p1 \
+ 08700415d7b61d9f611a858481b26858fe92eb7a.patch:-p1
+
+MAINTAINER= 0mp@FreeBSD.org
+COMMENT= FUSE filesystem to mount HTTP directory listings, with a permanent cache
+WWW= https://github.com/fangfufu/httpdirfs
+
+LICENSE= GPL3OPENSSL
+LICENSE_NAME= GPLv3 or later with execption to link with OpenSSL
+LICENSE_FILE= ${WRKSRC}/LICENSE
+LICENSE_PERMS= dist-mirror dist-sell pkg-mirror pkg-sell auto-accept
+
+LIB_DEPENDS= libcurl.so:ftp/curl \
+ libexpat.so:textproc/expat2 \
+ libgumbo.so:devel/gumbo \
+ libuuid.so:misc/e2fsprogs-libuuid
+
+USES= fuse:3 meson pkgconfig ssl
+
+USE_GITHUB= yes
+GH_ACCOUNT= fangfufu
+
+PLIST_FILES= bin/httpdirfs
+PORTDOCS= README.md
+
+OPTIONS_DEFINE= DOCS
+
+post-install-DOCS-on:
+ @${MKDIR} ${STAGEDIR}${DOCSDIR}
+ ${INSTALL_DATA} ${WRKSRC}/README.md ${STAGEDIR}${DOCSDIR}/
+
+.include <bsd.port.mk>
diff --git a/filesystems/httpdirfs/distinfo b/filesystems/httpdirfs/distinfo
new file mode 100644
index 000000000000..49205edda4c0
--- /dev/null
+++ b/filesystems/httpdirfs/distinfo
@@ -0,0 +1,7 @@
+TIMESTAMP = 1730405732
+SHA256 (fangfufu-httpdirfs-1.2.6_GH0.tar.gz) = 0d5b7f846947c2cf61e7851658f29501a7934d23a6a2c914e76efb889d7e1993
+SIZE (fangfufu-httpdirfs-1.2.6_GH0.tar.gz) = 81582
+SHA256 (43bdf7e71fde43084519e86051533a6b20c31474.patch) = f6022cf2d14226606a6dbca676f31e7f0f859ca634725e87f0d299d063145004
+SIZE (43bdf7e71fde43084519e86051533a6b20c31474.patch) = 4476
+SHA256 (08700415d7b61d9f611a858481b26858fe92eb7a.patch) = fb01a8e7e6a8416ff549147a89bd6ddf865a08e74c5d7808cc9fb7710732aa6d
+SIZE (08700415d7b61d9f611a858481b26858fe92eb7a.patch) = 1726
diff --git a/filesystems/httpdirfs/pkg-descr b/filesystems/httpdirfs/pkg-descr
new file mode 100644
index 000000000000..14bcef6ad8c5
--- /dev/null
+++ b/filesystems/httpdirfs/pkg-descr
@@ -0,0 +1,11 @@
+HTTPDirFS stands for Hyper Text Transfer Protocol Directory Filesystem. It may
+be used to to mount HTTP directory listings as if it was a partition.
+
+HTTP connections are reused due to the use of cURL-multi interface. The FUSE
+component runs in multithreaded mode.
+
+There is a permanent cache system which can cache all the file segments that
+have been downloaded.
+
+The support for Airsonic / Subsonic server is also included. This allows the
+user to mount a remote music collection locally.
diff --git a/filesystems/httpfs/Makefile b/filesystems/httpfs/Makefile
new file mode 100644
index 000000000000..40eaf89aa25b
--- /dev/null
+++ b/filesystems/httpfs/Makefile
@@ -0,0 +1,53 @@
+PORTNAME= httpfs
+PORTVERSION= 2.${VERSION}
+PORTREVISION= 2
+PORTEPOCH= 1
+CATEGORIES= filesystems www
+MASTER_SITES= SF/${PORTNAME}/${PORTNAME}2/
+PKGNAMEPREFIX= fusefs-
+DISTNAME= ${PORTNAME}2-${VERSION}
+
+MAINTAINER= ports@FreeBSD.org
+COMMENT= Fuse-based http filesystem
+WWW= https://httpfs.sourceforge.net/
+
+LICENSE= GPLv2+
+LICENSE_FILE= ${WRKSRC}/debian/copyright
+
+DEPRECATED= Abandonware, last release in 2012 and there are multiple issues unresolved
+EXPIRATION_DATE=2024-12-31
+
+USES= fuse pkgconfig gmake
+
+WRKSRC= ${WRKDIR}/${PORTNAME}2-${VERSION}
+VERSION= 0.1.5
+CFLAGS+= -D__BSD_VISIBLE
+PLIST_FILES= bin/httpfs2
+
+CERT_STORE= ${LOCALBASE}/share/certs/ca-root-nss.crt
+MAKE_ENV+= CERT_STORE=${CERT_STORE}
+
+OPTIONS_DEFINE= GNUTLS
+OPTIONS_DEFAULT= GNUTLS
+
+GNUTLS_LIB_DEPENDS= libgnutls.so:security/gnutls
+GNUTLS_RUN_DEPENDS= ${CERT_STORE}:security/ca_root_nss
+
+do-install:
+ ${INSTALL_PROGRAM} ${WRKSRC}/httpfs2 ${STAGEDIR}${PREFIX}/bin
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MGNUTLS}
+ALL_TARGET= full
+PLIST_FILES+= bin/httpfs2-mt bin/httpfs2-ssl bin/httpfs2-ssl-mt
+.else
+ALL_TARGET= httpfs2
+.endif
+
+do-install-GNUTLS-on:
+ cd ${WRKSRC} && \
+ ${INSTALL_PROGRAM} httpfs2-mt httpfs2-ssl httpfs2-ssl-mt \
+ ${STAGEDIR}${PREFIX}/bin
+
+.include <bsd.port.mk>
diff --git a/filesystems/httpfs/distinfo b/filesystems/httpfs/distinfo
new file mode 100644
index 000000000000..350e69639b94
--- /dev/null
+++ b/filesystems/httpfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905182
+SHA256 (httpfs2-0.1.5.tar.gz) = 01cb4bb38deb344f540da6f1464dc7edbdeb51213ad810b8c9c282c1e17e0fc1
+SIZE (httpfs2-0.1.5.tar.gz) = 16870
diff --git a/filesystems/httpfs/files/patch-Makefile b/filesystems/httpfs/files/patch-Makefile
new file mode 100644
index 000000000000..4e2252a2840b
--- /dev/null
+++ b/filesystems/httpfs/files/patch-Makefile
@@ -0,0 +1,60 @@
+--- Makefile.orig 2012-09-03 14:58:02 UTC
++++ Makefile
+@@ -1,5 +1,5 @@
+ MAIN_CFLAGS := -g -Os -Wall $(shell pkg-config fuse --cflags)
+-MAIN_CPPFLAGS := -Wall -Wno-unused-function -Wconversion -Wtype-limits -DUSE_AUTH -D_XOPEN_SOURCE=700 -D_ISOC99_SOURCE
++MAIN_CPPFLAGS := -Wall -Wno-unused-function -Wconversion -DUSE_AUTH -D_XOPEN_SOURCE=700 -D_ISOC99_SOURCE
+ THR_CPPFLAGS := -DUSE_THREAD
+ THR_LDFLAGS := -lpthread
+ MAIN_LDFLAGS := $(shell pkg-config fuse --libs | sed -e s/-lrt// -e s/-ldl// -e s/-pthread// -e "s/ / /g")
+@@ -10,7 +10,7 @@ ifeq ($(shell pkg-config --atleast-version 2.10 gnutls
+
+ variants += -ssl -ssl-mt
+
+- CERT_STORE := /etc/ssl/certs/ca-certificates.crt
++# CERT_STORE := /etc/ssl/certs/ca-certificates.crt
+ SSL_CPPFLAGS := -DUSE_SSL $(shell pkg-config gnutls --cflags) -DCERT_STORE=\"$(CERT_STORE)\"
+ SSL_LDFLAGS := $(shell pkg-config gnutls --libs)
+ endif
+@@ -23,7 +23,8 @@ manpages = $(addsuffix .1,$(binaries))
+
+ intermediates += $(addsuffix .xml,$(manpages))
+
+-targets = $(binaries) $(manpages)
++#targets = $(binaries) $(manpages)
++targets = $(binaries)
+
+ full:
+ $(MAKE) all $(addprefix all,$(variants))
+@@ -44,8 +45,8 @@ clean-recursive:
+ %-full:
+ $(MAKE) $* $(addprefix $*,$(variants))
+
+-%.1: %.1.txt
+- a2x -f manpage $<
++#%.1: %.1.txt
++# a2x -f manpage $<
+
+ %-ssl: $*
+ $(MAKE) CPPFLAGS='$(CPPFLAGS) $(SSL_CPPFLAGS)' LDFLAGS='$(LDFLAGS) $(SSL_LDFLAGS)' binsuffix=-ssl$(binsuffix) $*
+@@ -60,20 +61,6 @@ clean-recursive:
+ $(MAKE) CPPFLAGS='$(CPPFLAGS) -DRETRY_ON_RESET' binsuffix=-rst$(binsuffix) $*
+
+ # Rules to automatically make a Debian package
+-
+-package = $(shell dpkg-parsechangelog | grep ^Source: | sed -e s,'^Source: ',,)
+-version = $(shell dpkg-parsechangelog | grep ^Version: | sed -e s,'^Version: ',, -e 's,-.*,,')
+-revision = $(shell dpkg-parsechangelog | grep ^Version: | sed -e -e 's,.*-,,')
+-architecture = $(shell dpkg --print-architecture)
+-tar_dir = $(package)-$(version)
+-tar_gz = $(tar_dir).tar.gz
+-pkg_deb_dir = pkgdeb
+-unpack_dir = $(pkg_deb_dir)/$(tar_dir)
+-orig_tar_gz = $(pkg_deb_dir)/$(package)_$(version).orig.tar.gz
+-pkg_deb_src = $(pkg_deb_dir)/$(package)_$(version)-$(revision)_source.changes
+-pkg_deb_bin = $(pkg_deb_dir)/$(package)_$(version)-$(revision)_$(architecture).changes
+-
+-deb_pkg_key = CB8C5858
+
+ debclean:
+ rm -rf $(pkg_deb_dir)
diff --git a/filesystems/httpfs/files/patch-httpfs2.c b/filesystems/httpfs/files/patch-httpfs2.c
new file mode 100644
index 000000000000..c18b96efd4a4
--- /dev/null
+++ b/filesystems/httpfs/files/patch-httpfs2.c
@@ -0,0 +1,53 @@
+--- httpfs2.c.orig 2012-09-03 14:58:02 UTC
++++ httpfs2.c
+@@ -35,7 +35,7 @@
+ #include <assert.h>
+ #include <ctype.h>
+ #include <sys/stat.h>
+-#include <sys/dir.h>
++#include <dirent.h>
+ #include <sys/types.h>
+ #include <sys/time.h>
+ #include <sys/socket.h>
+@@ -188,7 +188,7 @@ static char * b64_encode(unsigned const char* ptr, lon
+
+ static int httpfs_stat(fuse_ino_t ino, struct stat *stbuf)
+ {
+- stbuf->st_ino = ino;
++ stbuf->st_ino = (uint32_t)ino;
+ switch (ino) {
+ case 1:
+ stbuf->st_mode = S_IFDIR | 0755;
+@@ -257,7 +257,7 @@ static void dirbuf_add(fuse_req_t req, struct dirbuf *
+ b->size += fuse_add_direntry(req, NULL, 0, name, NULL, 0);
+ b->p = (char *) realloc(b->p, b->size);
+ memset(&stbuf, 0, sizeof(stbuf));
+- stbuf.st_ino = ino;
++ stbuf.st_ino = (uint32_t)ino;
+ fuse_add_direntry(req, b->p + oldsize, b->size - oldsize, name, &stbuf,
+ (off_t) b->size);
+ }
+@@ -667,11 +667,12 @@ static char * url_encode(char * path) {
+
+ static int init_url(struct_url* url)
+ {
+- memset(url, 0, sizeof(url));
++ memset(url, 0, sizeof(*url));
+ url->sock_type = SOCK_CLOSED;
+ url->timeout = TIMEOUT;
+ #ifdef USE_SSL
+- url->cafile = CERT_STORE;
++ if ((url->cafile = getenv("CERT_STORE")) == NULL)
++ url->cafile = CERT_STORE;
+ #endif
+ return 0;
+ }
+@@ -911,7 +912,7 @@ int main(int argc, char *argv[])
+ return 3;
+ }
+ #ifdef USE_SSL
+- else {
++ else if(main_url.ss != NULL) {
+ print_ssl_info(main_url.ss);
+ }
+ #endif
diff --git a/filesystems/httpfs/pkg-descr b/filesystems/httpfs/pkg-descr
new file mode 100644
index 000000000000..f66315b8419d
--- /dev/null
+++ b/filesystems/httpfs/pkg-descr
@@ -0,0 +1,4 @@
+httpfs depends on FUSE. It uses HTTP/1.1 extensions to read arbitrary
+bytes from a file on a web-server. This is particular interesting for
+an iso, since it can be investigated (loop device) without actually
+downloading the whole iso.
diff --git a/filesystems/ifuse/Makefile b/filesystems/ifuse/Makefile
new file mode 100644
index 000000000000..03bafe10619b
--- /dev/null
+++ b/filesystems/ifuse/Makefile
@@ -0,0 +1,27 @@
+PORTNAME= ifuse
+PORTVERSION= 1.1.4
+PORTREVISION= 2
+CATEGORIES= filesystems
+MASTER_SITES= https://github.com/libimobiledevice/${PORTNAME}/releases/download/${PORTVERSION}/
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= ports@FreeBSD.org
+COMMENT= FUSE-based filesystem for mounting iOS devices over USB
+WWW= https://www.libimobiledevice.org
+
+LICENSE= LGPL21+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+LIB_DEPENDS= libplist-2.0.so:devel/libplist \
+ libimobiledevice-1.0.so:comms/libimobiledevice
+RUN_DEPENDS= usbmuxd:comms/usbmuxd
+
+USES= fuse localbase gnome pkgconfig tar:bzip2
+USE_GNOME= glib20
+
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+
+PLIST_FILES= bin/${PORTNAME} share/man/man1/ifuse.1.gz
+
+.include <bsd.port.mk>
diff --git a/filesystems/ifuse/distinfo b/filesystems/ifuse/distinfo
new file mode 100644
index 000000000000..b21401ae8148
--- /dev/null
+++ b/filesystems/ifuse/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1611120705
+SHA256 (ifuse-1.1.4.tar.bz2) = 3550702ef94b2f5f16c7db91c6b3282b2aed1340665834a03e47458e09d98d87
+SIZE (ifuse-1.1.4.tar.bz2) = 94137
diff --git a/filesystems/ifuse/pkg-descr b/filesystems/ifuse/pkg-descr
new file mode 100644
index 000000000000..ec833ee456f5
--- /dev/null
+++ b/filesystems/ifuse/pkg-descr
@@ -0,0 +1,4 @@
+iFuse is a tool for reaching iOS devices filesystems over USB, without
+the need of jailbreaking and installing an SSH server on your iGadget.
+iFuse is useful if you want to mount the device manually or if you
+don't have GNOME with GVFS nor KDE with kio-ufc installed.
diff --git a/filesystems/ifuse/pkg-message b/filesystems/ifuse/pkg-message
new file mode 100644
index 000000000000..d0087f79ebe9
--- /dev/null
+++ b/filesystems/ifuse/pkg-message
@@ -0,0 +1,16 @@
+[
+{ type: install
+ message: <<EOM
+To mount your iGadget you first need to launch usbmuxd; see...
+
+$ usbmuxd --help
+
+...for help. Then, plug in your device and run iFuse:
+
+# ifuse -o allow_other /mnt/ipod
+
+After that, you'll be able to reach its files and use, e.g., gtkpod to
+add/delete music/pictures.
+EOM
+}
+]
diff --git a/filesystems/jmtpfs/Makefile b/filesystems/jmtpfs/Makefile
new file mode 100644
index 000000000000..a5ff5c2f3d75
--- /dev/null
+++ b/filesystems/jmtpfs/Makefile
@@ -0,0 +1,31 @@
+PORTNAME= jmtpfs
+DISTVERSION= g20190420
+CATEGORIES= filesystems
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= rozhuk.im@gmail.com
+COMMENT= MTP device filesystem
+WWW= https://github.com/kiorky/jmtpfs
+
+LICENSE= GPLv3
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+LIB_DEPENDS= libmtp.so:multimedia/libmtp
+
+USE_GITHUB= yes
+GH_ACCOUNT= kiorky
+GH_TAGNAME= af0b79bc555ee60088306fdd2b78b2d51b781da3
+
+USES= autoreconf compiler:c++11-lib fuse pkgconfig
+GNU_CONFIGURE= yes
+INSTALL_TARGET= install-strip
+PLIST_FILES= bin/${PORTNAME}
+PORTDOCS= AUTHORS NEWS README.rst
+
+OPTIONS_DEFINE= DOCS
+
+post-install-DOCS-on:
+ (cd ${WRKSRC} && ${COPYTREE_SHARE} \
+ "${PORTDOCS}" ${STAGEDIR}${DOCSDIR})
+
+.include <bsd.port.mk>
diff --git a/filesystems/jmtpfs/distinfo b/filesystems/jmtpfs/distinfo
new file mode 100644
index 000000000000..4371cfe4d47c
--- /dev/null
+++ b/filesystems/jmtpfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1572307386
+SHA256 (kiorky-jmtpfs-g20190420-af0b79bc555ee60088306fdd2b78b2d51b781da3_GH0.tar.gz) = 2e442aa0d087422c00e4382fbbd80ee7ee4b87e65cad25782b1a0317cce18c77
+SIZE (kiorky-jmtpfs-g20190420-af0b79bc555ee60088306fdd2b78b2d51b781da3_GH0.tar.gz) = 243976
diff --git a/filesystems/jmtpfs/pkg-descr b/filesystems/jmtpfs/pkg-descr
new file mode 100644
index 000000000000..5be262a8d2f0
--- /dev/null
+++ b/filesystems/jmtpfs/pkg-descr
@@ -0,0 +1,14 @@
+jmtpfs is a FUSE and libmtp based filesystem for accessing MTP
+(Media Transfer Protocol) devices. It was specifically designed for
+exchaning files between Linux (and Mac OS X) systems and newer Android
+devices that support MTP but not USB Mass Storage.
+
+The goal is to create a well behaved filesystem, allowing tools like
+find and rsync to work as expected. MTP file types are set automatically
+based on file type detection using libmagic. Setting the file appears
+to be necessary for some Android apps, like Gallery, to be able to find
+and use the files.
+
+Since it is meant as an Android file transfer utility, and I don't have
+any non-Android MTP devices to test with, playlists and other non-file
+based data are not supported.
diff --git a/filesystems/kio-fuse/Makefile b/filesystems/kio-fuse/Makefile
new file mode 100644
index 000000000000..21368d99edb4
--- /dev/null
+++ b/filesystems/kio-fuse/Makefile
@@ -0,0 +1,22 @@
+PORTNAME= kio-fuse
+DISTVERSION= 5.1.0
+CATEGORIES= filesystems sysutils kde
+MASTER_SITES= KDE/stable/${PORTNAME}
+
+MAINTAINER= kde@FreeBSD.org
+COMMENT= FUSE Interface for KIO
+WWW= https://invent.kde.org/system/kio-fuse
+
+LICENSE= GPLv3+
+LICENSE_FILE= ${WRKSRC}/LICENSES/GPL-3.0-or-later.txt
+
+USES= cmake compiler:c++11-lang fuse:3 kde:5 pkgconfig qt:5 tar:xz
+USE_KDE= config coreaddons kio service \
+ ecm:build
+USE_QT= concurrent core dbus network \
+ buildtools:build qmake:build
+
+PLIST_FILES= lib/libexec/kio-fuse \
+ share/dbus-1/services/org.kde.KIOFuse.service
+
+.include <bsd.port.mk>
diff --git a/filesystems/kio-fuse/distinfo b/filesystems/kio-fuse/distinfo
new file mode 100644
index 000000000000..b839419dae7d
--- /dev/null
+++ b/filesystems/kio-fuse/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1705202711
+SHA256 (kio-fuse-5.1.0.tar.xz) = 7d104581227d5a19b424b33f4168d181556b1015d6df2218e01a88d64449e94b
+SIZE (kio-fuse-5.1.0.tar.xz) = 48820
diff --git a/filesystems/kio-fuse/files/patch-CMakeLists.txt b/filesystems/kio-fuse/files/patch-CMakeLists.txt
new file mode 100644
index 000000000000..f6a3612f75c0
--- /dev/null
+++ b/filesystems/kio-fuse/files/patch-CMakeLists.txt
@@ -0,0 +1,19 @@
+--- CMakeLists.txt.orig 2024-01-14 03:25:35 UTC
++++ CMakeLists.txt
+@@ -72,10 +72,12 @@ ecm_generate_dbus_service_file(
+ DESTINATION ${KDE_INSTALL_DBUSSERVICEDIR}
+ )
+
+-if(DEFINED KDE_INSTALL_SYSTEMDUSERUNITDIR)
+- ecm_install_configured_files(INPUT kio-fuse.service.in DESTINATION ${KDE_INSTALL_SYSTEMDUSERUNITDIR})
+-else()
+- ecm_install_configured_files(INPUT kio-fuse.service.in DESTINATION ${SYSTEMD_USER_UNIT_INSTALL_DIR})
++if(CMAKE_SYSTEM_NAME MATCHES "Linux")
++ if(DEFINED KDE_INSTALL_SYSTEMDUSERUNITDIR)
++ ecm_install_configured_files(INPUT kio-fuse.service.in DESTINATION ${KDE_INSTALL_SYSTEMDUSERUNITDIR})
++ else()
++ ecm_install_configured_files(INPUT kio-fuse.service.in DESTINATION ${SYSTEMD_USER_UNIT_INSTALL_DIR})
++ endif()
+ endif()
+
+ feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
diff --git a/filesystems/kio-fuse/pkg-descr b/filesystems/kio-fuse/pkg-descr
new file mode 100644
index 000000000000..5b433586114d
--- /dev/null
+++ b/filesystems/kio-fuse/pkg-descr
@@ -0,0 +1,7 @@
+KIO-Fuse allows you to mount remote directories into the root hierarchy of your
+local file system, thereby exposing KDE's advanced access capabilities (SSH,
+SAMBA/Windows, FTP, TAR/GZip/BZip2, WebDav, etc) to POSIX-compliant
+applications such as Firefox, OpenOffice, GNOME apps, shell utilities and more.
+
+KIO-Fuse works by acting as a bridge between KDE's KIO filesystem design and
+FUSE.
diff --git a/filesystems/kio-fuse/pkg-message b/filesystems/kio-fuse/pkg-message
new file mode 100644
index 000000000000..46e15e48af4c
--- /dev/null
+++ b/filesystems/kio-fuse/pkg-message
@@ -0,0 +1,10 @@
+[
+{ type: install
+ message: <<EOM
+To fully use KIO-fuse, you will need FUSE and usermount enabled, e.g.
+ kldload fusefs
+ sysctl vfs.usermount=1
+to make these changes permanent, see loader.conf(5) and sysctl.conf(5).
+EOM
+}
+]
diff --git a/filesystems/libbde/Makefile b/filesystems/libbde/Makefile
new file mode 100644
index 000000000000..9a0115c8c2fe
--- /dev/null
+++ b/filesystems/libbde/Makefile
@@ -0,0 +1,31 @@
+PORTNAME= libbde
+DISTVERSION= alpha-20231220
+CATEGORIES= filesystems devel
+MASTER_SITES= https://github.com/libyal/libbde/releases/download/${PORTVERSION:E}/ \
+ LOCAL/antoine
+
+MAINTAINER= antoine@FreeBSD.org
+COMMENT= Library and tools to access the BitLocker Drive Encryption volumes
+WWW= https://github.com/libyal/libbde
+
+LICENSE= LGPL3+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+LIB_DEPENDS= libcaes.so:security/libcaes
+
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+CONFIGURE_ARGS= --enable-python --with-libcaes=${LOCALBASE} --with-openssl=no
+CONFIGURE_ENV= PYTHON_CONFIG=${PYTHON_CMD}-config
+USES= fuse libtool pathfix pkgconfig python
+USE_LDCONFIG= yes
+INSTALL_TARGET= install-strip
+WRKSRC= ${WRKDIR}/${PORTNAME}-${PORTVERSION:E}
+
+OPTIONS_DEFINE= NLS
+
+NLS_USES= gettext
+NLS_CONFIGURE_ON= --with-libintl-prefix=${LOCALBASE}
+NLS_CONFIGURE_OFF= --disable-nls
+
+.include <bsd.port.mk>
diff --git a/filesystems/libbde/distinfo b/filesystems/libbde/distinfo
new file mode 100644
index 000000000000..7d8c38ce375a
--- /dev/null
+++ b/filesystems/libbde/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1707835740
+SHA256 (libbde-alpha-20231220.tar.gz) = 21fa33dd40edcea07d50b16ef926db459a6f2db551232dd8c1597484f1367241
+SIZE (libbde-alpha-20231220.tar.gz) = 1739799
diff --git a/filesystems/libbde/pkg-descr b/filesystems/libbde/pkg-descr
new file mode 100644
index 000000000000..9acfb6bca20f
--- /dev/null
+++ b/filesystems/libbde/pkg-descr
@@ -0,0 +1,2 @@
+Library and tools to access the BitLocker Drive Encryption (BDE) encrypted
+volumes.
diff --git a/filesystems/libbde/pkg-plist b/filesystems/libbde/pkg-plist
new file mode 100644
index 000000000000..d9f871ed4a9a
--- /dev/null
+++ b/filesystems/libbde/pkg-plist
@@ -0,0 +1,19 @@
+bin/bdeinfo
+bin/bdemount
+include/libbde.h
+include/libbde/codepage.h
+include/libbde/definitions.h
+include/libbde/error.h
+include/libbde/extern.h
+include/libbde/features.h
+include/libbde/types.h
+lib/libbde.a
+lib/libbde.so
+lib/libbde.so.1
+lib/libbde.so.1.0.0
+%%PYTHON_SITELIBDIR%%/pybde.a
+%%PYTHON_SITELIBDIR%%/pybde.so
+libdata/pkgconfig/libbde.pc
+share/man/man1/bdeinfo.1.gz
+share/man/man1/bdemount.1.gz
+share/man/man3/libbde.3.gz
diff --git a/filesystems/libfsapfs/Makefile b/filesystems/libfsapfs/Makefile
new file mode 100644
index 000000000000..30db939185aa
--- /dev/null
+++ b/filesystems/libfsapfs/Makefile
@@ -0,0 +1,32 @@
+PORTNAME= libfsapfs
+# If/When moving from experimental to alpha, switch to DISTVERSIONPREFIX to prevent PORTEPOCH
+DISTVERSION= experimental-20231122
+CATEGORIES= filesystems devel
+MASTER_SITES= https://github.com/libyal/libfsapfs/releases/download/${PORTVERSION:E}/ \
+ LOCAL/antoine
+
+MAINTAINER= antoine@FreeBSD.org
+COMMENT= Library and tools to access the Apple File System (APFS)
+WWW= https://github.com/libyal/libfsapfs
+
+LICENSE= LGPL3+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+LIB_DEPENDS= libcaes.so:security/libcaes
+
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+CONFIGURE_ARGS= --enable-python --with-libcaes=${LOCALBASE} --with-openssl=no
+CONFIGURE_ENV= PYTHON_CONFIG=${PYTHON_CMD}-config
+USES= fuse libtool pathfix pkgconfig python
+USE_LDCONFIG= yes
+INSTALL_TARGET= install-strip
+WRKSRC= ${WRKDIR}/${PORTNAME}-${PORTVERSION:E}
+
+OPTIONS_DEFINE= NLS
+
+NLS_USES= gettext
+NLS_CONFIGURE_ON= --with-libintl-prefix=${LOCALBASE}
+NLS_CONFIGURE_OFF= --disable-nls
+
+.include <bsd.port.mk>
diff --git a/filesystems/libfsapfs/distinfo b/filesystems/libfsapfs/distinfo
new file mode 100644
index 000000000000..c5ac079f5d26
--- /dev/null
+++ b/filesystems/libfsapfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1707836234
+SHA256 (libfsapfs-experimental-20231122.tar.gz) = 0a324de50aaf30c7a685cc9b296f4e9ed101a2558aae95334410fbf5c108cc30
+SIZE (libfsapfs-experimental-20231122.tar.gz) = 2164984
diff --git a/filesystems/libfsapfs/pkg-descr b/filesystems/libfsapfs/pkg-descr
new file mode 100644
index 000000000000..61a4927c5eb0
--- /dev/null
+++ b/filesystems/libfsapfs/pkg-descr
@@ -0,0 +1 @@
+Library and tools to access the Apple File System (APFS)
diff --git a/filesystems/libfsapfs/pkg-plist b/filesystems/libfsapfs/pkg-plist
new file mode 100644
index 000000000000..939747d660de
--- /dev/null
+++ b/filesystems/libfsapfs/pkg-plist
@@ -0,0 +1,19 @@
+bin/fsapfsinfo
+bin/fsapfsmount
+include/libfsapfs.h
+include/libfsapfs/codepage.h
+include/libfsapfs/definitions.h
+include/libfsapfs/error.h
+include/libfsapfs/extern.h
+include/libfsapfs/features.h
+include/libfsapfs/types.h
+lib/libfsapfs.a
+lib/libfsapfs.so
+lib/libfsapfs.so.1
+lib/libfsapfs.so.1.0.0
+%%PYTHON_SITELIBDIR%%/pyfsapfs.a
+%%PYTHON_SITELIBDIR%%/pyfsapfs.so
+libdata/pkgconfig/libfsapfs.pc
+share/man/man1/fsapfsinfo.1.gz
+share/man/man1/fsapfsmount.1.gz
+share/man/man3/libfsapfs.3.gz
diff --git a/filesystems/libfsext/Makefile b/filesystems/libfsext/Makefile
new file mode 100644
index 000000000000..7216b4326bad
--- /dev/null
+++ b/filesystems/libfsext/Makefile
@@ -0,0 +1,30 @@
+PORTNAME= libfsext
+# If/When moving from experimental to alpha, switch to DISTVERSIONPREFIX to prevent PORTEPOCH
+DISTVERSION= experimental-20231129
+CATEGORIES= filesystems devel
+MASTER_SITES= https://github.com/libyal/libfsext/releases/download/${PORTVERSION:E}/ \
+ LOCAL/antoine
+
+MAINTAINER= antoine@FreeBSD.org
+COMMENT= Library and tools to access the Extended File System
+WWW= https://github.com/libyal/libfsext
+
+LICENSE= LGPL3+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+CONFIGURE_ARGS= --enable-python --with-openssl=no
+CONFIGURE_ENV= PYTHON_CONFIG=${PYTHON_CMD}-config
+USES= fuse libtool pathfix pkgconfig python
+USE_LDCONFIG= yes
+INSTALL_TARGET= install-strip
+WRKSRC= ${WRKDIR}/${PORTNAME}-${PORTVERSION:E}
+
+OPTIONS_DEFINE= NLS
+
+NLS_USES= gettext
+NLS_CONFIGURE_ON= --with-libintl-prefix=${LOCALBASE}
+NLS_CONFIGURE_OFF= --disable-nls
+
+.include <bsd.port.mk>
diff --git a/filesystems/libfsext/distinfo b/filesystems/libfsext/distinfo
new file mode 100644
index 000000000000..af5acaab6f00
--- /dev/null
+++ b/filesystems/libfsext/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1707836309
+SHA256 (libfsext-experimental-20231129.tar.gz) = e5faf530e370c0bac1d584d236150577d0ca1b4692fbf0321d6568999323fcf1
+SIZE (libfsext-experimental-20231129.tar.gz) = 1719851
diff --git a/filesystems/libfsext/pkg-descr b/filesystems/libfsext/pkg-descr
new file mode 100644
index 000000000000..285d40feb04f
--- /dev/null
+++ b/filesystems/libfsext/pkg-descr
@@ -0,0 +1 @@
+Library and tools to access the Extended File System
diff --git a/filesystems/libfsext/pkg-plist b/filesystems/libfsext/pkg-plist
new file mode 100644
index 000000000000..81ea09be91c1
--- /dev/null
+++ b/filesystems/libfsext/pkg-plist
@@ -0,0 +1,19 @@
+bin/fsextinfo
+bin/fsextmount
+include/libfsext.h
+include/libfsext/codepage.h
+include/libfsext/definitions.h
+include/libfsext/error.h
+include/libfsext/extern.h
+include/libfsext/features.h
+include/libfsext/types.h
+lib/libfsext.a
+lib/libfsext.so
+lib/libfsext.so.1
+lib/libfsext.so.1.0.0
+%%PYTHON_SITELIBDIR%%/pyfsext.a
+%%PYTHON_SITELIBDIR%%/pyfsext.so
+libdata/pkgconfig/libfsext.pc
+share/man/man1/fsextinfo.1.gz
+share/man/man1/fsextmount.1.gz
+share/man/man3/libfsext.3.gz
diff --git a/filesystems/libfsfat/Makefile b/filesystems/libfsfat/Makefile
new file mode 100644
index 000000000000..d18cdf5fd726
--- /dev/null
+++ b/filesystems/libfsfat/Makefile
@@ -0,0 +1,30 @@
+PORTNAME= libfsfat
+# If/When moving from experimental to alpha, switch to DISTVERSIONPREFIX to prevent PORTEPOCH
+DISTVERSION= experimental-20231122
+CATEGORIES= filesystems devel
+MASTER_SITES= https://github.com/libyal/libfsfat/releases/download/${PORTVERSION:E}/ \
+ LOCAL/antoine
+
+MAINTAINER= antoine@FreeBSD.org
+COMMENT= Library and tools to access the File Allocation Table File System
+WWW= https://github.com/libyal/libfsfat
+
+LICENSE= LGPL3+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+CONFIGURE_ARGS= --enable-python --with-openssl=no
+CONFIGURE_ENV= PYTHON_CONFIG=${PYTHON_CMD}-config
+USES= fuse libtool pathfix pkgconfig python
+USE_LDCONFIG= yes
+INSTALL_TARGET= install-strip
+WRKSRC= ${WRKDIR}/${PORTNAME}-${PORTVERSION:E}
+
+OPTIONS_DEFINE= NLS
+
+NLS_USES= gettext
+NLS_CONFIGURE_ON= --with-libintl-prefix=${LOCALBASE}
+NLS_CONFIGURE_OFF= --disable-nls
+
+.include <bsd.port.mk>
diff --git a/filesystems/libfsfat/distinfo b/filesystems/libfsfat/distinfo
new file mode 100644
index 000000000000..0f2626e7770f
--- /dev/null
+++ b/filesystems/libfsfat/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1707836386
+SHA256 (libfsfat-experimental-20231122.tar.gz) = bc74cd55a1f3a1102dd9c2cde7958d017e6455d82ef387249b12ad58c62df7c5
+SIZE (libfsfat-experimental-20231122.tar.gz) = 1665538
diff --git a/filesystems/libfsfat/pkg-descr b/filesystems/libfsfat/pkg-descr
new file mode 100644
index 000000000000..f303433616cc
--- /dev/null
+++ b/filesystems/libfsfat/pkg-descr
@@ -0,0 +1 @@
+Library and tools to access the File Allocation Table (FAT) file system
diff --git a/filesystems/libfsfat/pkg-plist b/filesystems/libfsfat/pkg-plist
new file mode 100644
index 000000000000..c657a6fc2311
--- /dev/null
+++ b/filesystems/libfsfat/pkg-plist
@@ -0,0 +1,19 @@
+bin/fsfatinfo
+bin/fsfatmount
+include/libfsfat.h
+include/libfsfat/codepage.h
+include/libfsfat/definitions.h
+include/libfsfat/error.h
+include/libfsfat/extern.h
+include/libfsfat/features.h
+include/libfsfat/types.h
+lib/libfsfat.a
+lib/libfsfat.so
+lib/libfsfat.so.1
+lib/libfsfat.so.1.0.0
+%%PYTHON_SITELIBDIR%%/pyfsfat.a
+%%PYTHON_SITELIBDIR%%/pyfsfat.so
+libdata/pkgconfig/libfsfat.pc
+share/man/man1/fsfatinfo.1.gz
+share/man/man1/fsfatmount.1.gz
+share/man/man3/libfsfat.3.gz
diff --git a/filesystems/libfshfs/Makefile b/filesystems/libfshfs/Makefile
new file mode 100644
index 000000000000..242a99cdb3a7
--- /dev/null
+++ b/filesystems/libfshfs/Makefile
@@ -0,0 +1,30 @@
+PORTNAME= libfshfs
+# If/When moving from experimental to alpha, switch to DISTVERSIONPREFIX to prevent PORTEPOCH
+DISTVERSION= experimental-20231125
+CATEGORIES= filesystems devel
+MASTER_SITES= https://github.com/libyal/libfshfs/releases/download/${PORTVERSION:E}/ \
+ LOCAL/antoine
+
+MAINTAINER= antoine@FreeBSD.org
+COMMENT= Library and tools to access the Mac OS Hierarchical File System (HFS)
+WWW= https://github.com/libyal/libfshfs
+
+LICENSE= LGPL3+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+CONFIGURE_ARGS= --enable-python --with-openssl=no
+CONFIGURE_ENV= PYTHON_CONFIG=${PYTHON_CMD}-config
+USES= fuse libtool pathfix pkgconfig python
+USE_LDCONFIG= yes
+INSTALL_TARGET= install-strip
+WRKSRC= ${WRKDIR}/${PORTNAME}-${PORTVERSION:E}
+
+OPTIONS_DEFINE= NLS
+
+NLS_USES= gettext
+NLS_CONFIGURE_ON= --with-libintl-prefix=${LOCALBASE}
+NLS_CONFIGURE_OFF= --disable-nls
+
+.include <bsd.port.mk>
diff --git a/filesystems/libfshfs/distinfo b/filesystems/libfshfs/distinfo
new file mode 100644
index 000000000000..d97397cb447c
--- /dev/null
+++ b/filesystems/libfshfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1707836459
+SHA256 (libfshfs-experimental-20231125.tar.gz) = af9063a07814265cd79ed823ea3a44c08de3d4defa3c95750866f8572ad8bf8c
+SIZE (libfshfs-experimental-20231125.tar.gz) = 2027202
diff --git a/filesystems/libfshfs/pkg-descr b/filesystems/libfshfs/pkg-descr
new file mode 100644
index 000000000000..b7634c525b9c
--- /dev/null
+++ b/filesystems/libfshfs/pkg-descr
@@ -0,0 +1 @@
+Library and tools to access the Mac OS Hierarchical File System (HFS)
diff --git a/filesystems/libfshfs/pkg-plist b/filesystems/libfshfs/pkg-plist
new file mode 100644
index 000000000000..d5c0ac017d37
--- /dev/null
+++ b/filesystems/libfshfs/pkg-plist
@@ -0,0 +1,19 @@
+bin/fshfsinfo
+bin/fshfsmount
+include/libfshfs.h
+include/libfshfs/codepage.h
+include/libfshfs/definitions.h
+include/libfshfs/error.h
+include/libfshfs/extern.h
+include/libfshfs/features.h
+include/libfshfs/types.h
+lib/libfshfs.a
+lib/libfshfs.so
+lib/libfshfs.so.1
+lib/libfshfs.so.1.0.0
+%%PYTHON_SITELIBDIR%%/pyfshfs.a
+%%PYTHON_SITELIBDIR%%/pyfshfs.so
+libdata/pkgconfig/libfshfs.pc
+share/man/man1/fshfsinfo.1.gz
+share/man/man1/fshfsmount.1.gz
+share/man/man3/libfshfs.3.gz
diff --git a/filesystems/libfsntfs/Makefile b/filesystems/libfsntfs/Makefile
new file mode 100644
index 000000000000..ea2b8a262cfc
--- /dev/null
+++ b/filesystems/libfsntfs/Makefile
@@ -0,0 +1,34 @@
+PORTNAME= libfsntfs
+# If/When moving from experimental to alpha, switch to DISTVERSIONPREFIX to prevent PORTEPOCH
+DISTVERSION= experimental-20231125
+CATEGORIES= filesystems devel
+MASTER_SITES= https://github.com/libyal/libfsntfs/releases/download/${PORTVERSION:E}/ \
+ LOCAL/antoine
+
+MAINTAINER= antoine@FreeBSD.org
+COMMENT= Library and tools to access the New Technology File System (NTFS)
+WWW= https://github.com/libyal/libfsntfs
+
+LICENSE= LGPL3+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+LIB_DEPENDS= libfwnt.so:devel/libfwnt
+
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+CONFIGURE_ARGS= --enable-python --with-openssl=no \
+ --with-libfwnt=${LOCALBASE}
+CONFIGURE_ENV= PYTHON_CONFIG=${PYTHON_CMD}-config
+USES= cpe libtool fuse pathfix pkgconfig python
+CPE_VENDOR= ${PORTNAME}_project
+USE_LDCONFIG= yes
+INSTALL_TARGET= install-strip
+WRKSRC= ${WRKDIR}/${PORTNAME}-${PORTVERSION:E}
+
+OPTIONS_DEFINE= NLS
+
+NLS_USES= gettext
+NLS_CONFIGURE_ON= --with-libintl-prefix=${LOCALBASE}
+NLS_CONFIGURE_OFF= --disable-nls
+
+.include <bsd.port.mk>
diff --git a/filesystems/libfsntfs/distinfo b/filesystems/libfsntfs/distinfo
new file mode 100644
index 000000000000..82438122469a
--- /dev/null
+++ b/filesystems/libfsntfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1707836581
+SHA256 (libfsntfs-experimental-20231125.tar.gz) = c180863cc7aaacf950251e4758a0c4c8a30c100b6b96b63884b9d6717f3975a6
+SIZE (libfsntfs-experimental-20231125.tar.gz) = 2104151
diff --git a/filesystems/libfsntfs/pkg-descr b/filesystems/libfsntfs/pkg-descr
new file mode 100644
index 000000000000..8aa270b801b3
--- /dev/null
+++ b/filesystems/libfsntfs/pkg-descr
@@ -0,0 +1 @@
+Library and tools to access the New Technology File System (NTFS)
diff --git a/filesystems/libfsntfs/pkg-plist b/filesystems/libfsntfs/pkg-plist
new file mode 100644
index 000000000000..35bb09d1e8d8
--- /dev/null
+++ b/filesystems/libfsntfs/pkg-plist
@@ -0,0 +1,18 @@
+bin/fsntfsinfo
+bin/fsntfsmount
+include/libfsntfs.h
+include/libfsntfs/codepage.h
+include/libfsntfs/definitions.h
+include/libfsntfs/error.h
+include/libfsntfs/extern.h
+include/libfsntfs/features.h
+include/libfsntfs/types.h
+lib/libfsntfs.a
+lib/libfsntfs.so
+lib/libfsntfs.so.1
+lib/libfsntfs.so.1.0.0
+%%PYTHON_SITELIBDIR%%/pyfsntfs.a
+%%PYTHON_SITELIBDIR%%/pyfsntfs.so
+libdata/pkgconfig/libfsntfs.pc
+share/man/man1/fsntfsinfo.1.gz
+share/man/man3/libfsntfs.3.gz
diff --git a/filesystems/libfsxfs/Makefile b/filesystems/libfsxfs/Makefile
new file mode 100644
index 000000000000..3bdd9186fa3d
--- /dev/null
+++ b/filesystems/libfsxfs/Makefile
@@ -0,0 +1,30 @@
+PORTNAME= libfsxfs
+# If/When moving from experimental to alpha, switch to DISTVERSIONPREFIX to prevent PORTEPOCH
+DISTVERSION= experimental-20231124
+CATEGORIES= filesystems devel
+MASTER_SITES= https://github.com/libyal/libfsxfs/releases/download/${PORTVERSION:E}/ \
+ LOCAL/antoine
+
+MAINTAINER= antoine@FreeBSD.org
+COMMENT= Library and tools to access the SGI X File System
+WWW= https://github.com/libyal/libfsxfs
+
+LICENSE= LGPL3+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+CONFIGURE_ARGS= --enable-python --with-openssl=no
+CONFIGURE_ENV= PYTHON_CONFIG=${PYTHON_CMD}-config
+USES= fuse libtool pathfix pkgconfig python
+USE_LDCONFIG= yes
+INSTALL_TARGET= install-strip
+WRKSRC= ${WRKDIR}/${PORTNAME}-${PORTVERSION:E}
+
+OPTIONS_DEFINE= NLS
+
+NLS_USES= gettext
+NLS_CONFIGURE_ON= --with-libintl-prefix=${LOCALBASE}
+NLS_CONFIGURE_OFF= --disable-nls
+
+.include <bsd.port.mk>
diff --git a/filesystems/libfsxfs/distinfo b/filesystems/libfsxfs/distinfo
new file mode 100644
index 000000000000..a141316a4050
--- /dev/null
+++ b/filesystems/libfsxfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1707836670
+SHA256 (libfsxfs-experimental-20231124.tar.gz) = f4817abfa9e10d11b506422e13b596a41dd278443a39278a13f220b9683d7c9b
+SIZE (libfsxfs-experimental-20231124.tar.gz) = 1709527
diff --git a/filesystems/libfsxfs/pkg-descr b/filesystems/libfsxfs/pkg-descr
new file mode 100644
index 000000000000..644af6e193f2
--- /dev/null
+++ b/filesystems/libfsxfs/pkg-descr
@@ -0,0 +1 @@
+Library and tools to access the SGI X File System
diff --git a/filesystems/libfsxfs/pkg-plist b/filesystems/libfsxfs/pkg-plist
new file mode 100644
index 000000000000..1c0c6102a1a8
--- /dev/null
+++ b/filesystems/libfsxfs/pkg-plist
@@ -0,0 +1,19 @@
+bin/fsxfsinfo
+bin/fsxfsmount
+include/libfsxfs.h
+include/libfsxfs/codepage.h
+include/libfsxfs/definitions.h
+include/libfsxfs/error.h
+include/libfsxfs/extern.h
+include/libfsxfs/features.h
+include/libfsxfs/types.h
+lib/libfsxfs.a
+lib/libfsxfs.so
+lib/libfsxfs.so.1
+lib/libfsxfs.so.1.0.0
+%%PYTHON_SITELIBDIR%%/pyfsxfs.a
+%%PYTHON_SITELIBDIR%%/pyfsxfs.so
+libdata/pkgconfig/libfsxfs.pc
+share/man/man1/fsxfsinfo.1.gz
+share/man/man1/fsxfsmount.1.gz
+share/man/man3/libfsxfs.3.gz
diff --git a/filesystems/libmodi/Makefile b/filesystems/libmodi/Makefile
new file mode 100644
index 000000000000..d79664531122
--- /dev/null
+++ b/filesystems/libmodi/Makefile
@@ -0,0 +1,32 @@
+PORTNAME= libmodi
+# If/When moving from experimental to alpha, switch to DISTVERSIONPREFIX to prevent PORTEPOCH
+DISTVERSION= experimental-20231123
+CATEGORIES= filesystems devel
+MASTER_SITES= https://github.com/libyal/libmodi/releases/download/${PORTVERSION:E}/ \
+ LOCAL/antoine
+
+MAINTAINER= antoine@FreeBSD.org
+COMMENT= Library and tools to access the Mac OS disk image formats
+WWW= https://github.com/libyal/libmodi
+
+LICENSE= LGPL3+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+LIB_DEPENDS= libcaes.so:security/libcaes
+
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+CONFIGURE_ARGS= --enable-python --with-libcaes=${LOCALBASE} --with-openssl=no
+CONFIGURE_ENV= PYTHON_CONFIG=${PYTHON_CMD}-config
+USES= fuse libtool pathfix pkgconfig python
+USE_LDCONFIG= yes
+INSTALL_TARGET= install-strip
+WRKSRC= ${WRKDIR}/${PORTNAME}-${PORTVERSION:E}
+
+OPTIONS_DEFINE= NLS
+
+NLS_USES= gettext
+NLS_CONFIGURE_ON= --with-libintl-prefix=${LOCALBASE}
+NLS_CONFIGURE_OFF= --disable-nls
+
+.include <bsd.port.mk>
diff --git a/filesystems/libmodi/distinfo b/filesystems/libmodi/distinfo
new file mode 100644
index 000000000000..5895684e3a45
--- /dev/null
+++ b/filesystems/libmodi/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1707837223
+SHA256 (libmodi-experimental-20231123.tar.gz) = 01aa4f2ac8a0e2673a37952cdb98a21d0572ac40771cc83fc2170f78533fb8bc
+SIZE (libmodi-experimental-20231123.tar.gz) = 2075035
diff --git a/filesystems/libmodi/pkg-descr b/filesystems/libmodi/pkg-descr
new file mode 100644
index 000000000000..b94a8a7477fa
--- /dev/null
+++ b/filesystems/libmodi/pkg-descr
@@ -0,0 +1 @@
+Library and tools to access the Mac OS disk image formats
diff --git a/filesystems/libmodi/pkg-plist b/filesystems/libmodi/pkg-plist
new file mode 100644
index 000000000000..406b08b3b485
--- /dev/null
+++ b/filesystems/libmodi/pkg-plist
@@ -0,0 +1,18 @@
+bin/modiinfo
+bin/modimount
+include/libmodi.h
+include/libmodi/codepage.h
+include/libmodi/definitions.h
+include/libmodi/error.h
+include/libmodi/extern.h
+include/libmodi/features.h
+include/libmodi/types.h
+lib/libmodi.a
+lib/libmodi.so
+lib/libmodi.so.1
+lib/libmodi.so.1.0.0
+%%PYTHON_SITELIBDIR%%/pymodi.a
+%%PYTHON_SITELIBDIR%%/pymodi.so
+libdata/pkgconfig/libmodi.pc
+share/man/man1/modiinfo.1.gz
+share/man/man3/libmodi.3.gz
diff --git a/filesystems/linux-c7-dosfstools/Makefile b/filesystems/linux-c7-dosfstools/Makefile
new file mode 100644
index 000000000000..a6f1c766cdcf
--- /dev/null
+++ b/filesystems/linux-c7-dosfstools/Makefile
@@ -0,0 +1,19 @@
+PORTNAME= dosfstools
+PORTVERSION= 3.0.20
+DISTVERSIONSUFFIX= -10.el7
+CATEGORIES= filesystems sysutils linux
+
+MAINTAINER= emulation@FreeBSD.org
+COMMENT= Utilities for MS-DOS FAT filesystems (CentOS ${LINUX_DIST_VER})
+WWW= https://github.com/dosfstools/dosfstools
+
+LICENSE= GPLv3+
+
+USES= cpe linux:c7
+USE_LINUX_RPM= nolib
+CPE_VENDOR= dosfstools_project
+
+OPTIONS_DEFINE= DOCS
+PLIST= ${PKGDIR}/pkg-plist
+
+.include <bsd.port.mk>
diff --git a/filesystems/linux-c7-dosfstools/distinfo b/filesystems/linux-c7-dosfstools/distinfo
new file mode 100644
index 000000000000..e9e50c078ffd
--- /dev/null
+++ b/filesystems/linux-c7-dosfstools/distinfo
@@ -0,0 +1,9 @@
+TIMESTAMP = 1627157205
+SHA256 (centos/dosfstools-3.0.20-10.el7.aarch64.rpm) = 6fd4743d87914e69224466fcb2d53c44fce3891b64bb0561fd83ef3c5c8dbbff
+SIZE (centos/dosfstools-3.0.20-10.el7.aarch64.rpm) = 102152
+SHA256 (centos/dosfstools-3.0.20-10.el7.i686.rpm) = 1ab8831faff8ef12b3cac4aafdd9d5d7819d2fc0ff248c424b72dc703498d6d8
+SIZE (centos/dosfstools-3.0.20-10.el7.i686.rpm) = 103912
+SHA256 (centos/dosfstools-3.0.20-10.el7.x86_64.rpm) = cbf47c845706e9d0a764b49d9d020128616dcbf16959479d6575c21da06369e9
+SIZE (centos/dosfstools-3.0.20-10.el7.x86_64.rpm) = 103572
+SHA256 (centos/dosfstools-3.0.20-10.el7.src.rpm) = 633b517e35baf03cb3aa15a71fc3bf0075488c4d61e7fb802e80368b437a6ace
+SIZE (centos/dosfstools-3.0.20-10.el7.src.rpm) = 95519
diff --git a/filesystems/linux-c7-dosfstools/pkg-descr b/filesystems/linux-c7-dosfstools/pkg-descr
new file mode 100644
index 000000000000..cc3d686d3e87
--- /dev/null
+++ b/filesystems/linux-c7-dosfstools/pkg-descr
@@ -0,0 +1,2 @@
+Linux binaries for fsck.vfat and mkfs.vfat utilities, which check
+and create file systems of the FAT family.
diff --git a/filesystems/linux-c7-dosfstools/pkg-plist b/filesystems/linux-c7-dosfstools/pkg-plist
new file mode 100644
index 000000000000..6effb0571f67
--- /dev/null
+++ b/filesystems/linux-c7-dosfstools/pkg-plist
@@ -0,0 +1,28 @@
+usr/sbin/dosfsck
+usr/sbin/dosfslabel
+usr/sbin/fatlabel
+usr/sbin/fsck.fat
+usr/sbin/fsck.msdos
+usr/sbin/fsck.vfat
+usr/sbin/mkdosfs
+usr/sbin/mkfs.fat
+usr/sbin/mkfs.msdos
+usr/sbin/mkfs.vfat
+%%PORTDOCS%%%%DOCSDIR%%/COPYING
+%%PORTDOCS%%%%DOCSDIR%%/ChangeLog
+%%PORTDOCS%%%%DOCSDIR%%/ChangeLog.dosfstools-2.x
+%%PORTDOCS%%%%DOCSDIR%%/README.dosfstools-2.x
+%%PORTDOCS%%%%DOCSDIR%%/TODO.dosfstools-2.x
+usr/share/man/de/man8/fatlabel.8.gz
+usr/share/man/de/man8/fsck.fat.8.gz
+usr/share/man/de/man8/mkfs.fat.8.gz
+usr/share/man/man8/dosfsck.8.gz
+usr/share/man/man8/fatlabel.8.gz
+usr/share/man/man8/fsck.fat.8.gz
+usr/share/man/man8/fsck.fat.8.manpage-fix.gz
+usr/share/man/man8/fsck.msdos.8.gz
+usr/share/man/man8/fsck.vfat.8.gz
+usr/share/man/man8/mkdosfs.8.gz
+usr/share/man/man8/mkfs.fat.8.gz
+usr/share/man/man8/mkfs.msdos.8.gz
+usr/share/man/man8/mkfs.vfat.8.gz
diff --git a/filesystems/lizardfs/Makefile b/filesystems/lizardfs/Makefile
new file mode 100644
index 000000000000..f99fb0532899
--- /dev/null
+++ b/filesystems/lizardfs/Makefile
@@ -0,0 +1,57 @@
+PORTNAME= lizardfs
+PORTVERSION= 3.12.0
+DISTVERSIONPREFIX= v
+PORTREVISION= 22
+CATEGORIES= filesystems sysutils
+
+MAINTAINER= jhixson@FreeBSD.org
+COMMENT= Open Source Distributed Filesystem
+WWW= https://lizardfs.org/
+
+LICENSE= GPLv3+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+BUILD_DEPENDS= a2x:textproc/asciidoc \
+ spdlog>=1.4.2:devel/spdlog
+LIB_DEPENDS= libboost_system.so:devel/boost-libs \
+ libfmt.so:devel/libfmt
+
+USES= cmake compiler:c11 fuse python shebangfix
+USE_RC_SUBR= mfscgiserv \
+ mfschunkserver \
+ mfsmaster \
+ mfsmetalogger \
+ mfspingserv
+
+USERS= mfs
+GROUPS= mfs
+
+SHEBANG_FILES= src/cgi/cgiserv.py.in \
+ src/cgi/lizardfs-cgiserver.py.in \
+ src/cgi/mfs.cgi.in \
+ src/cgi/chart.cgi.in
+
+USE_GITHUB= yes
+USE_LDCONFIG= yes
+
+CFLAGS+= -DSPDLOG_FMT_EXTERNAL=1
+LDFLAGS+= -L${LOCALBASE}/lib -lfmt
+CMAKE_BUILD_TYPE= Release
+CMAKE_ARGS= \
+ -DENABLE_WERROR=OFF \
+ -DENABLE_LIGHTMFS=ON \
+ -DENABLE_DEBIAN_PATHS=OFF \
+ -DENABLE_UTILS=ON \
+ -DENABLE_TESTS=OFF \
+ -DENABLE_DOCS=ON \
+ -DENABLE_VERBOSE_ASCIIDOC=ON \
+ -DENABLE_TCMALLOC=OFF \
+ -DENABLE_POLONAISE=OFF \
+ -DENABLE_CLIENT_LIB=ON \
+ -DENABLE_URAFT=ON \
+ -DENABLE_TRACES=OFF \
+ -DENABLE_CRC=ON \
+ -DENABLE_REQUEST_LOG=OFF \
+ -DENABLE_NFS_GANESHA=OFF
+
+.include <bsd.port.mk>
diff --git a/filesystems/lizardfs/distinfo b/filesystems/lizardfs/distinfo
new file mode 100644
index 000000000000..ffb58e32e777
--- /dev/null
+++ b/filesystems/lizardfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1548551617
+SHA256 (lizardfs-lizardfs-v3.12.0_GH0.tar.gz) = d21220dc7542539b48d5bff7abe047a8c6bdbab19cb03579f88f146dee3ec5f6
+SIZE (lizardfs-lizardfs-v3.12.0_GH0.tar.gz) = 2973894
diff --git a/filesystems/lizardfs/files/mfscgiserv.in b/filesystems/lizardfs/files/mfscgiserv.in
new file mode 100644
index 000000000000..0876470c2221
--- /dev/null
+++ b/filesystems/lizardfs/files/mfscgiserv.in
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+# PROVIDE: mfscgiserv
+# REQUIRE: DAEMON
+# KEYWORD: shutdown
+#
+# Add the following lines to /etc/rc.conf to enable mfscgiserv:
+#
+# mfscgiserv_enable="YES"
+#
+
+. /etc/rc.subr
+
+name=mfscgiserv
+rcvar=mfscgiserv_enable
+
+command=%%PREFIX%%/sbin/${name}
+pid_file=/var/mfs/.${name}.lock
+procname="python"
+
+stop_cmd="$command stop"
+status_cmd="$command test"
+
+load_rc_config $name
+
+# set defaults
+: ${mfscgiserv_enable="NO"}
+
+run_rc_command "$1"
diff --git a/filesystems/lizardfs/files/mfschunkserver.in b/filesystems/lizardfs/files/mfschunkserver.in
new file mode 100644
index 000000000000..b4dbe0baae4a
--- /dev/null
+++ b/filesystems/lizardfs/files/mfschunkserver.in
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+# PROVIDE: mfschunkserver
+# REQUIRE: DAEMON
+# KEYWORD: shutdown
+#
+# Add the following lines to /etc/rc.conf.local or /etc/rc.conf to enable mfschunkserver:
+#
+# mfschunkserver_enable="YES"
+#
+
+. /etc/rc.subr
+
+name=mfschunkserver
+rcvar=mfschunkserver_enable
+
+config_file=%%PREFIX%%/etc/mfs/${name}.cfg
+
+required_files=${config_file}
+
+command=%%PREFIX%%/sbin/${name}
+pid_file=/var/mfs/.${name}.lock
+command_args="-c $config_file"
+
+load_rc_config $name
+
+# set defaults
+: ${mfschunkserver_enable="NO"}
+
+run_rc_command "$1"
diff --git a/filesystems/lizardfs/files/mfsmaster.in b/filesystems/lizardfs/files/mfsmaster.in
new file mode 100644
index 000000000000..3a3bc49bdefd
--- /dev/null
+++ b/filesystems/lizardfs/files/mfsmaster.in
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+# PROVIDE: mfsmaster
+# REQUIRE: DAEMON
+# KEYWORD: nostart shutdown
+#
+# Add the following lines to /etc/rc.conf to enable mfsmaster:
+#
+# mfsmaster_enable="YES"
+#
+
+. /etc/rc.subr
+
+name=mfsmaster
+rcvar=mfsmaster_enable
+
+config_file=%%PREFIX%%/etc/mfs/${name}.cfg
+
+required_files=${config_file}
+
+command=%%PREFIX%%/sbin/${name}
+pid_file=/var/mfs/.${name}.lock
+command_args="-c $config_file"
+
+load_rc_config $name
+
+# set defaults
+: ${mfsmaster_enable="NO"}
+
+run_rc_command "$1"
diff --git a/filesystems/lizardfs/files/mfsmetalogger.in b/filesystems/lizardfs/files/mfsmetalogger.in
new file mode 100644
index 000000000000..e1fae34ddb88
--- /dev/null
+++ b/filesystems/lizardfs/files/mfsmetalogger.in
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+# PROVIDE: mfsmetalogger
+# REQUIRE: DAEMON
+# KEYWORD: shutdown
+#
+# Add the following lines to /etc/rc.conf to enable mfsmetalogger:
+#
+# mfsmetalogger_enable="YES"
+#
+
+. /etc/rc.subr
+
+name=mfsmetalogger
+rcvar=mfsmetalogger_enable
+
+config_file=%%PREFIX%%/etc/mfs/${name}.cfg
+
+required_files=${config_file}
+
+command=%%PREFIX%%/sbin/${name}
+pid_file=/var/mfs/.${name}.lock
+command_args="-c $config_file"
+
+load_rc_config $name
+
+# set defaults
+: ${mfsmetalogger_enable="NO"}
+
+run_rc_command "$1"
diff --git a/filesystems/lizardfs/files/mfspingserv.in b/filesystems/lizardfs/files/mfspingserv.in
new file mode 100644
index 000000000000..625628e37fd6
--- /dev/null
+++ b/filesystems/lizardfs/files/mfspingserv.in
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+# PROVIDE: mfspingserv
+# REQUIRE: DAEMON
+# KEYWORD: nostart shutdown
+#
+# Add the following lines to /etc/rc.conf to enable mfspingserv:
+#
+# mfspingserv_enable="YES"
+#
+# mfspingserv_port=""
+#
+
+. /etc/rc.subr
+
+name=mfspingserv
+rcvar=mfspingserv_enable
+
+command=%%PREFIX%%/sbin/${name}
+pid_file=/var/mfs/.${name}.lock
+command_args="${mfspingserv_port}"
+
+load_rc_config $name
+
+# set defaults
+: ${mfspingserv_enable="NO"}
+: ${mfspingserv_port="19042"}
+
+run_rc_command "$1"
diff --git a/filesystems/lizardfs/files/patch-CMakeLists.txt b/filesystems/lizardfs/files/patch-CMakeLists.txt
new file mode 100644
index 000000000000..fd2d4079393b
--- /dev/null
+++ b/filesystems/lizardfs/files/patch-CMakeLists.txt
@@ -0,0 +1,37 @@
+--- CMakeLists.txt.orig 2017-12-20 09:59:37 UTC
++++ CMakeLists.txt
+@@ -167,13 +167,7 @@ endif()
+ message(STATUS "THROW_INSTEAD_OF_ABORT: ${THROW_INSTEAD_OF_ABORT}")
+ endif()
+
+-get_property(LIB64 GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS)
+-if (LIB64)
+- set(LIBSUFFIX "64")
+-else()
+- set(LIBSUFFIX "")
+-endif()
+-message(STATUS "LIB64: ${LIB64}")
++set(LIBSUFFIX "")
+
+ if(ENABLE_DEBIAN_PATHS)
+ if (NOT CMAKE_INSTALL_PREFIX STREQUAL "/")
+@@ -193,8 +187,8 @@ else()
+ set(SBIN_SUBDIR "sbin")
+ set(LIB_SUBDIR "lib${LIBSUFFIX}")
+ set(ETC_SUBDIR "etc/mfs")
+- set(RUN_SUBDIR "var/run/mfs")
+- set(DATA_SUBDIR "var/lib/mfs")
++ set(RUN_SUBDIR "/var/run/mfs")
++ set(DATA_SUBDIR "/var/mfs")
+ set(MAN_SUBDIR "share/man")
+ set(CGI_SUBDIR "share/mfscgi")
+ set(INCL_SUBDIR "include/lizardfs")
+@@ -205,8 +199,6 @@ set(ETC_PATH ${INSTALL_PREFIX_NO_SLASH}/${ETC_SUBDIR
+ set(SBIN_PATH ${INSTALL_PREFIX_NO_SLASH}/${SBIN_SUBDIR})
+ set(LIB_PATH ${INSTALL_PREFIX_NO_SLASH}/${LIB_SUBDIR})
+ set(ETC_PATH ${INSTALL_PREFIX_NO_SLASH}/${ETC_SUBDIR})
+-set(RUN_PATH ${INSTALL_PREFIX_NO_SLASH}/${RUN_SUBDIR})
+-set(DATA_PATH ${INSTALL_PREFIX_NO_SLASH}/${DATA_SUBDIR})
+ set(MAN_PATH ${INSTALL_PREFIX_NO_SLASH}/${MAN_SUBDIR})
+ set(CGI_PATH ${INSTALL_PREFIX_NO_SLASH}/${CGI_SUBDIR})
+ set(INCL_PATH ${INSTALL_PREFIX_NO_SLASH}/${INCL_SUBDIR})
diff --git a/filesystems/lizardfs/files/patch-cmake_CheckIncludes.cmake b/filesystems/lizardfs/files/patch-cmake_CheckIncludes.cmake
new file mode 100644
index 000000000000..0dfe41ad59fb
--- /dev/null
+++ b/filesystems/lizardfs/files/patch-cmake_CheckIncludes.cmake
@@ -0,0 +1,13 @@
+--- cmake/CheckIncludes.cmake.orig 2022-12-24 21:43:32 UTC
++++ cmake/CheckIncludes.cmake
+@@ -3,7 +3,9 @@ include(CheckIncludeFiles)
+ function(check_includes INCLUDES)
+ set(INCLUDE_MISSING FALSE)
+ foreach(INCLUDE_FILE ${INCLUDES})
+- check_include_files(${INCLUDE_FILE} ${INCLUDE_FILE}_FOUND)
++ string(MAKE_C_IDENTIFIER "${INCLUDE_FILE}" c_include)
++ check_include_files(${INCLUDE_FILE} ${c_include}_FOUND)
++ set(${INCLUDE_FILE}_FOUND ${${c_include}_FOUND})
+ if(NOT ${INCLUDE_FILE}_FOUND)
+ set(INCLUDE_MISSING TRUE)
+ set(MISSING_INCLUDES ${MISSING_INCLUDES} ${INCLUDE_FILE})
diff --git a/filesystems/lizardfs/files/patch-cmake__Libraries.cmake b/filesystems/lizardfs/files/patch-cmake__Libraries.cmake
new file mode 100644
index 000000000000..95dbb0c4a80a
--- /dev/null
+++ b/filesystems/lizardfs/files/patch-cmake__Libraries.cmake
@@ -0,0 +1,14 @@
+--- cmake/Libraries.cmake.orig 2017-12-20 09:59:37 UTC
++++ cmake/Libraries.cmake
+@@ -7,11 +7,6 @@ if(ENABLE_TESTS)
+ "ef5e700c8a0f3ee123e2e0209b8b4961")
+ endif()
+
+-download_external(SPDLOG "spdlog-0.14.0"
+- "https://github.com/gabime/spdlog/archive/v0.14.0.zip"
+- "f213d83c466aa7044a132e2488d71b11"
+- "spdlog-1")
+-
+ # Find standard libraries
+ find_package(Socket REQUIRED)
+ find_package(Threads REQUIRED)
diff --git a/filesystems/lizardfs/files/patch-src_common_slogger.cc b/filesystems/lizardfs/files/patch-src_common_slogger.cc
new file mode 100644
index 000000000000..02566193f6ea
--- /dev/null
+++ b/filesystems/lizardfs/files/patch-src_common_slogger.cc
@@ -0,0 +1,11 @@
+--- src/common/slogger.cc.orig 2019-01-28 19:24:32 UTC
++++ src/common/slogger.cc
+@@ -86,7 +86,7 @@ void lzfs::drop_all_logs() {
+ bool lzfs::add_log_syslog() {
+ #ifndef _WIN32
+ try {
+- spdlog::syslog_logger("syslog");
++ spdlog::syslog_logger_mt("syslog");
+ return true;
+ } catch (const spdlog::spdlog_ex &e) {
+ lzfs_pretty_syslog(LOG_ERR, "Adding syslog log failed: %s", e.what());
diff --git a/filesystems/lizardfs/files/patch-src_common_slogger.h b/filesystems/lizardfs/files/patch-src_common_slogger.h
new file mode 100644
index 000000000000..2d5a7367b467
--- /dev/null
+++ b/filesystems/lizardfs/files/patch-src_common_slogger.h
@@ -0,0 +1,12 @@
+--- src/common/slogger.h.orig 2017-12-20 09:59:37 UTC
++++ src/common/slogger.h
+@@ -27,6 +27,9 @@
+ #endif
+ #include "common/small_vector.h"
+ #include "spdlog/spdlog.h"
++#include "spdlog/sinks/syslog_sink.h"
++#include "spdlog/sinks/stdout_color_sinks.h"
++#include "spdlog/sinks/rotating_file_sink.h"
+
+ typedef std::shared_ptr<spdlog::logger> LoggerPtr;
+
diff --git a/filesystems/lizardfs/pkg-descr b/filesystems/lizardfs/pkg-descr
new file mode 100644
index 000000000000..e80d3740401b
--- /dev/null
+++ b/filesystems/lizardfs/pkg-descr
@@ -0,0 +1,3 @@
+LizardFS is a highly reliable, scalable and efficient distributed file
+system. It spreads data over a number of physical servers, making it
+visible to an end user as a single file system.
diff --git a/filesystems/lizardfs/pkg-plist b/filesystems/lizardfs/pkg-plist
new file mode 100644
index 000000000000..d9d585a1e3cd
--- /dev/null
+++ b/filesystems/lizardfs/pkg-plist
@@ -0,0 +1,119 @@
+bin/chunk_converter
+bin/cpp-interpreter.sh
+bin/crc_converter
+bin/file-generate
+bin/file-overwrite
+bin/file-validate
+bin/flockcmd
+bin/lizardfs
+bin/lizardfs-admin
+bin/lizardfs-probe
+bin/lzfs_ping_pong
+bin/mfsappendchunks
+bin/mfscheckfile
+bin/mfsdeleattr
+bin/mfsdirinfo
+bin/mfsfileinfo
+bin/mfsfilerepair
+bin/mfsgeteattr
+bin/mfsgetgoal
+bin/mfsgettrashtime
+bin/mfsmakesnapshot
+bin/mfsmount
+bin/mfsping
+bin/mfspingserv
+bin/mfsrepquota
+bin/mfsrgetgoal
+bin/mfsrgettrashtime
+bin/mfsrsetgoal
+bin/mfsrsettrashtime
+bin/mfsseteattr
+bin/mfssetgoal
+bin/mfssetquota
+bin/mfssettrashtime
+bin/mfstools.sh
+bin/posixlockcmd
+etc/bash_completion.d/lizardfs
+etc/mfs/globaliolimits.cfg.dist
+etc/mfs/iolimits.cfg.dist
+etc/mfs/mfschunkserver.cfg.dist
+etc/mfs/mfsexports.cfg.dist
+etc/mfs/mfsgoals.cfg.dist
+etc/mfs/mfshdd.cfg.dist
+etc/mfs/mfsmaster.cfg.dist
+etc/mfs/mfsmetalogger.cfg.dist
+etc/mfs/mfsmount.cfg.dist
+etc/mfs/mfstopology.cfg.dist
+include/lizardfs/lizardfs_c_api.h
+include/lizardfs/lizardfs_error_codes.h
+lib/libchunk_operations_eio.so
+lib/liblizardfs-client-cpp.a
+lib/liblizardfs-client-cpp_pic.a
+lib/liblizardfs-client.a
+lib/liblizardfs-client.so
+lib/liblizardfs-client_pic.a
+lib/liblizardfsmount_shared.so
+lib/libredirect_bind.so
+lib/libslow_chunk_scan.so
+sbin/lizardfs-cgiserver
+sbin/mfscgiserv
+sbin/mfschunkserver
+sbin/mfsmaster
+sbin/mfsmetadump
+sbin/mfsmetalogger
+sbin/mfsmetarestore
+sbin/mfsrestoremaster
+share/man/man1/lizardfs-appendchunks.1.gz
+share/man/man1/lizardfs-checkfile.1.gz
+share/man/man1/lizardfs-deleattr.1.gz
+share/man/man1/lizardfs-dirinfo.1.gz
+share/man/man1/lizardfs-fileinfo.1.gz
+share/man/man1/lizardfs-filerepair.1.gz
+share/man/man1/lizardfs-geteattr.1.gz
+share/man/man1/lizardfs-getgoal.1.gz
+share/man/man1/lizardfs-gettrashtime.1.gz
+share/man/man1/lizardfs-makesnapshot.1.gz
+share/man/man1/lizardfs-repquota.1.gz
+share/man/man1/lizardfs-rgetgoal.1.gz
+share/man/man1/lizardfs-rgettrashtime.1.gz
+share/man/man1/lizardfs-rremove.1.gz
+share/man/man1/lizardfs-rsetgoal.1.gz
+share/man/man1/lizardfs-rsettrashtime.1.gz
+share/man/man1/lizardfs-seteattr.1.gz
+share/man/man1/lizardfs-setgoal.1.gz
+share/man/man1/lizardfs-setquota.1.gz
+share/man/man1/lizardfs-settrashtime.1.gz
+share/man/man1/lizardfs.1.gz
+share/man/man1/mfsmount.1.gz
+share/man/man5/globaliolimits.cfg.5.gz
+share/man/man5/iolimits.cfg.5.gz
+share/man/man5/mfschunkserver.cfg.5.gz
+share/man/man5/mfsexports.cfg.5.gz
+share/man/man5/mfsgoals.cfg.5.gz
+share/man/man5/mfshdd.cfg.5.gz
+share/man/man5/mfsmaster.cfg.5.gz
+share/man/man5/mfsmetalogger.cfg.5.gz
+share/man/man5/mfsmount.cfg.5.gz
+share/man/man5/mfstopology.cfg.5.gz
+share/man/man7/lizardfs.7.gz
+share/man/man7/mfs.7.gz
+share/man/man7/moosefs.7.gz
+share/man/man8/lizardfs-admin.8.gz
+share/man/man8/lizardfs-cgiserver.8.gz
+share/man/man8/lizardfs-probe.8.gz
+share/man/man8/mfscgiserv.8.gz
+share/man/man8/mfschunkserver.8.gz
+share/man/man8/mfsmaster.8.gz
+share/man/man8/mfsmetadump.8.gz
+share/man/man8/mfsmetalogger.8.gz
+share/man/man8/mfsmetarestore.8.gz
+share/man/man8/mfsrestoremaster.8.gz
+share/mfscgi/chart.cgi
+share/mfscgi/err.gif
+share/mfscgi/favicon.ico
+share/mfscgi/index.html
+share/mfscgi/logomini.png
+share/mfscgi/mfs.cgi
+share/mfscgi/mfs.css
+/var/mfs/metadata.mfs.empty
+@dir /var/mfs
diff --git a/filesystems/lkl/Makefile b/filesystems/lkl/Makefile
new file mode 100644
index 000000000000..c56be9005f7e
--- /dev/null
+++ b/filesystems/lkl/Makefile
@@ -0,0 +1,42 @@
+PORTNAME= lkl
+DISTVERSION= 4.16.g20180628
+PORTREVISION= 4
+CATEGORIES= filesystems
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= cem@FreeBSD.org
+COMMENT= Full-featured Linux BTRFS, Ext4, XFS as a FUSE module
+WWW= https://github.com/lkl/linux/
+
+LICENSE= GPLv2
+
+BUILD_DEPENDS= gnubc>0:math/gnubc \
+ gnustat:sysutils/coreutils \
+ gsed:textproc/gsed
+
+USES= bison:build fuse gmake python:build shebangfix
+SHEBANG_FILES= ../../arch/lkl/scripts/headers_install.py
+BINARY_ALIAS= sed=gsed \
+ stat=gnustat
+USE_BINUTILS= yes:build
+USE_GCC= yes:build
+USE_GITHUB= yes
+GH_PROJECT= linux
+GH_TAGNAME= 86dd3afb590eccc1903611bdaa8bac87757eb80d
+
+ONLY_FOR_ARCHS= amd64
+ONLY_FOR_ARCHS_REASON=ld formats not available for other architectures
+
+WRKSRC_SUBDIR= tools/lkl
+MAKE_JOBS_UNSAFE=yes
+MAKE_ARGS+= V=1
+# Need ports versions of 'bc', 'ld' to build!
+MAKE_ARGS+= PATH="${LOCALBASE}/bin:${PATH}" CC="${CC}" HOSTCC="${CC}"
+
+PLIST_FILES= bin/lklfuse lib/liblkl.a
+
+do-install:
+ ${INSTALL_PROGRAM} ${WRKSRC}/lklfuse ${STAGEDIR}${PREFIX}/bin
+ ${INSTALL_DATA} ${WRKSRC}/liblkl.a ${STAGEDIR}${PREFIX}/lib
+
+.include <bsd.port.mk>
diff --git a/filesystems/lkl/distinfo b/filesystems/lkl/distinfo
new file mode 100644
index 000000000000..3a765d45de46
--- /dev/null
+++ b/filesystems/lkl/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1530225787
+SHA256 (lkl-linux-4.16.g20180628-86dd3afb590eccc1903611bdaa8bac87757eb80d_GH0.tar.gz) = d63cccf64ab8938389b0054e3e68ee467100bfc98475b1864ab7dac542d51317
+SIZE (lkl-linux-4.16.g20180628-86dd3afb590eccc1903611bdaa8bac87757eb80d_GH0.tar.gz) = 164254140
diff --git a/filesystems/lkl/files/patch-Makefile b/filesystems/lkl/files/patch-Makefile
new file mode 100644
index 000000000000..09b164e2c5f6
--- /dev/null
+++ b/filesystems/lkl/files/patch-Makefile
@@ -0,0 +1,15 @@
+--- Makefile.orig 2018-06-12 22:43:19 UTC
++++ Makefile
+@@ -61,10 +61,10 @@ endif
+
+ # rule to build lkl.o
+ $(OUTPUT)lib/lkl.o: bin/stat
+- $(Q)$(MAKE) -C ../.. ARCH=lkl $(KOPT) $(KCONFIG)
++ $(Q)$(MAKE) -C ../.. ARCH=lkl LDFLAGS= $(KOPT) $(KCONFIG)
+ # this workaround is for arm32 linker (ld.gold)
+ $(Q)export PATH=$(srctree)/tools/lkl/bin/:${PATH} ;\
+- $(MAKE) -C ../.. ARCH=lkl $(KOPT) install INSTALL_PATH=$(OUTPUT)
++ $(MAKE) -C ../.. ARCH=lkl LDFLAGS= $(KOPT) install INSTALL_PATH=$(OUTPUT)
+
+ # rules to link libs
+ $(OUTPUT)%$(SOSUF): LDFLAGS += -shared
diff --git a/filesystems/lkl/files/patch-Targets b/filesystems/lkl/files/patch-Targets
new file mode 100644
index 000000000000..e1fe24075c09
--- /dev/null
+++ b/filesystems/lkl/files/patch-Targets
@@ -0,0 +1,18 @@
+--- Targets.orig 2018-06-12 22:43:19 UTC
++++ Targets
+@@ -10,15 +10,6 @@ LDLIBS_lib/hijack/liblkl-hijack-$(LKL_HOST_CONFIG_ANDR
+ progs-$(LKL_HOST_CONFIG_FUSE) += lklfuse
+ LDLIBS_lklfuse-y := -lfuse
+
+-progs-$(LKL_HOST_CONFIG_ARCHIVE) += fs2tar
+-LDLIBS_fs2tar-y := -larchive
+-LDLIBS_fs2tar-$(LKL_HOST_CONFIG_NEEDS_LARGP) += -largp
+-
+-
+-progs-$(LKL_HOST_CONFIG_ARCHIVE) += cptofs
+-LDLIBS_cptofs-y := -larchive
+-LDLIBS_cptofs-$(LKL_HOST_CONFIG_NEEDS_LARGP) += -largp
+-
+ progs-y += tests/boot
+ progs-y += tests/disk
+ progs-y += tests/net-test
diff --git a/filesystems/lkl/pkg-descr b/filesystems/lkl/pkg-descr
new file mode 100644
index 000000000000..bee83838ac5e
--- /dev/null
+++ b/filesystems/lkl/pkg-descr
@@ -0,0 +1 @@
+Linux as a library; and BTRFS, Ext4, and XFS for FUSE.
diff --git a/filesystems/ltfs/Makefile b/filesystems/ltfs/Makefile
new file mode 100644
index 000000000000..15a3f5985c9d
--- /dev/null
+++ b/filesystems/ltfs/Makefile
@@ -0,0 +1,52 @@
+PORTNAME= ltfs
+DISTVERSIONPREFIX= v
+DISTVERSION= 2.4.6.2
+DISTVERSIONSUFFIX= -10513
+CATEGORIES= filesystems sysutils
+
+MAINTAINER= kbowling@FreeBSD.org
+COMMENT= Reference implementation of LTFS for stand-alone tape drive
+WWW= https://github.com/LinearTapeFileSystem/ltfs
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+LIB_DEPENDS= libicudata.so:devel/icu \
+ libpkg.so:${PKG_ORIGIN} \
+ libuuid.so:misc/e2fsprogs-libuuid
+
+USES= autoreconf compiler:c11 fuse gnome libtool:build pkgconfig \
+ python shebangfix ssl
+
+USE_GITHUB= yes
+GH_ACCOUNT= LinearTapeFileSystem
+USE_GNOME= libxml2
+USE_LDCONFIG= yes
+
+SHEBANG_FILES= src/utils/ltfs_ordered_copy
+
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX= ${PREFIX}/share
+
+CONFIGURE_ARGS+= --enable-icu-6x
+
+#INSTALL_TARGET= install-strip
+
+OPTIONS_DEFINE= DEBUG SNMP
+OPTIONS_SUB= yes
+
+DEBUG_DESC= Build without optimization and extended debug flags
+SNMP_DESC= SNMP trap support
+
+DEBUG_CONFIGURE_ON= --enable-debug
+DEBUG_CONFIGURE_OFF= --enable-fast
+
+SNMP_LIB_DEPENDS= libnetsnmp.so:net-mgmt/net-snmp
+SNMP_USES= perl5
+SNMP_CONFIGURE_ENABLE= snmp
+
+post-install:
+ @${RM} ${STAGEDIR}${DATADIR}/ltfs
+ @${RMDIR} ${STAGEDIR}${DATADIR}
+
+.include <bsd.port.mk>
diff --git a/filesystems/ltfs/distinfo b/filesystems/ltfs/distinfo
new file mode 100644
index 000000000000..bdad82fb2bfd
--- /dev/null
+++ b/filesystems/ltfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1721794312
+SHA256 (LinearTapeFileSystem-ltfs-v2.4.6.2-10513_GH0.tar.gz) = 3ea9b210507f6bb2c9cd8f9d92f0c2ee321e24241dc5a402e557409a71531c91
+SIZE (LinearTapeFileSystem-ltfs-v2.4.6.2-10513_GH0.tar.gz) = 629281
diff --git a/filesystems/ltfs/files/patch-src_tape__drivers_freebsd_cam_cam__tc.c b/filesystems/ltfs/files/patch-src_tape__drivers_freebsd_cam_cam__tc.c
new file mode 100644
index 000000000000..d4be8240818e
--- /dev/null
+++ b/filesystems/ltfs/files/patch-src_tape__drivers_freebsd_cam_cam__tc.c
@@ -0,0 +1,11 @@
+--- src/tape_drivers/freebsd/cam/cam_tc.c.orig 2023-09-17 04:20:07 UTC
++++ src/tape_drivers/freebsd/cam/cam_tc.c
+@@ -1241,7 +1241,7 @@ static int camtape_get_next_block_to_xfer(void *device
+ camtape_process_errors(softc, rc, msg, "READPOS", true);
+ else {
+ pos->partition = ext_data.partition;
+- pos->block = scsi_8btou64(ext_data.last_object)
++ pos->block = scsi_8btou64(ext_data.last_object);
+ ltfsmsg(LTFS_DEBUG, 30398D, "next-block-to-xfer",
+ (unsigned long long) pos->block, 0, 0, softc->drive_serial);
+ }
diff --git a/filesystems/ltfs/pkg-descr b/filesystems/ltfs/pkg-descr
new file mode 100644
index 000000000000..910dcd0a543f
--- /dev/null
+++ b/filesystems/ltfs/pkg-descr
@@ -0,0 +1,3 @@
+Linear Tape File System (LTFS) is a filesystem to mount a LTFS formatted tape
+in a tape drive. Once LTFS mounts a LTFS formatted tape as filesystem, users
+can access to the tape via filesystem API.
diff --git a/filesystems/ltfs/pkg-message b/filesystems/ltfs/pkg-message
new file mode 100644
index 000000000000..a0fee2742d98
--- /dev/null
+++ b/filesystems/ltfs/pkg-message
@@ -0,0 +1,15 @@
+[
+{ type: install
+ message: <<EOM
+This only works with IBM Enterprise Tape, or IBM-branded LTO-5 and newer tape
+drives, although there is a file backend for simulation purposes.
+
+You will only be able to read and write tapes with a blocksize <= MAXPHYS,
+which is 128KB by default. Put the following in your kernel config file and
+recompile/reinstall to allow reading and writing tapes up to the maximum LTFS
+blocksize of 1MB:
+
+options MAXPHYS=(1024*1056)
+EOM
+}
+]
diff --git a/filesystems/ltfs/pkg-plist b/filesystems/ltfs/pkg-plist
new file mode 100644
index 000000000000..60e9532496db
--- /dev/null
+++ b/filesystems/ltfs/pkg-plist
@@ -0,0 +1,54 @@
+bin/ltfs
+bin/ltfs_ordered_copy
+bin/ltfsck
+bin/mkltfs
+etc/ltfs.conf
+etc/ltfs.conf.local
+include/ltfs/config.h
+include/ltfs/libltfs/arch/arch_info.h
+include/ltfs/libltfs/arch/errormap.h
+include/ltfs/libltfs/arch/signal_internal.h
+include/ltfs/libltfs/arch/time_internal.h
+include/ltfs/libltfs/config_file.h
+include/ltfs/libltfs/dcache_ops.h
+include/ltfs/libltfs/iosched_ops.h
+include/ltfs/libltfs/kmi_ops.h
+include/ltfs/libltfs/ltfs_error.h
+include/ltfs/libltfs/ltfs_fsops.h
+include/ltfs/libltfs/ltfs_locking_new.h
+include/ltfs/libltfs/ltfs_locking_old.h
+include/ltfs/libltfs/ltfs_locking.h
+include/ltfs/libltfs/ltfs_thread.h
+include/ltfs/libltfs/ltfs_types.h
+include/ltfs/libltfs/ltfs.h
+include/ltfs/libltfs/ltfslogging.h
+include/ltfs/libltfs/ltfstrace.h
+include/ltfs/libltfs/plugin.h
+include/ltfs/libltfs/queue.h
+include/ltfs/libltfs/tape_ops.h
+include/ltfs/libltfs/tape.h
+include/ltfs/libltfs/uthash_ext.h
+include/ltfs/libltfs/uthash.h
+include/ltfs/libltfs/xml.h
+include/ltfs/tape_drivers/ibm_tape.h
+include/ltfs/tape_drivers/spc_op_codes.h
+include/ltfs/tape_drivers/ssc_op_codes.h
+include/ltfs/tape_drivers/tape_drivers.h
+lib/libltfs.a
+lib/libltfs.so
+lib/libltfs.so.0
+lib/libltfs.so.0.0.0
+lib/ltfs/libiosched-fcfs.so
+lib/ltfs/libiosched-unified.so
+lib/ltfs/libkmi-flatfile.so
+lib/ltfs/libkmi-simple.so
+lib/ltfs/libtape-cam.so
+lib/ltfs/libtape-file.so
+lib/ltfs/libtape-itdtimg.so
+libdata/pkgconfig/ltfs.pc
+share/man/man1/ltfs_ordered_copy.1.gz
+share/man/man8/ltfs-sde.8.gz
+share/man/man8/ltfsck.8.gz
+share/man/man8/mkltfs.8.gz
+%%SNMP%%share/snmp/LTFS-MIB.txt
+%%SNMP%%share/snmp/LtfsSnmpTrapDef.txt
diff --git a/filesystems/mergerfs/Makefile b/filesystems/mergerfs/Makefile
new file mode 100644
index 000000000000..288a63552490
--- /dev/null
+++ b/filesystems/mergerfs/Makefile
@@ -0,0 +1,27 @@
+PORTNAME= mergerfs
+DISTVERSION= 2.40.2
+CATEGORIES= filesystems
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= ehaupt@FreeBSD.org
+COMMENT= Featureful FUSE based union filesystem
+WWW= https://github.com/trapexit/mergerfs
+
+LICENSE= ISCL
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+NOT_FOR_ARCHS= i386
+
+USES= fuse gmake localbase:ldflags
+USE_GITHUB= yes
+GH_ACCOUNT= trapexit
+
+PLIST_FILES= bin/mergerfs \
+ lib/mergerfs/preload.so \
+ share/man/man1/mergerfs.1.gz
+
+post-install:
+ ${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/mergerfs \
+ ${STAGEDIR}${PREFIX}/lib/mergerfs/preload.so
+
+.include <bsd.port.mk>
diff --git a/filesystems/mergerfs/distinfo b/filesystems/mergerfs/distinfo
new file mode 100644
index 000000000000..37bfb871ee16
--- /dev/null
+++ b/filesystems/mergerfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1727772197
+SHA256 (trapexit-mergerfs-2.40.2_GH0.tar.gz) = b4f45e635f29b0a8ba1727e6c1f503356d47943a14af8b4586d3e36350f82464
+SIZE (trapexit-mergerfs-2.40.2_GH0.tar.gz) = 743230
diff --git a/filesystems/mergerfs/files/patch-libfuse_lib_cpu.hpp b/filesystems/mergerfs/files/patch-libfuse_lib_cpu.hpp
new file mode 100644
index 000000000000..953ff7e2e86b
--- /dev/null
+++ b/filesystems/mergerfs/files/patch-libfuse_lib_cpu.hpp
@@ -0,0 +1,16 @@
+--- libfuse/lib/cpu.hpp.orig 2024-02-29 20:41:22 UTC
++++ libfuse/lib/cpu.hpp
+@@ -5,8 +5,12 @@
+ #endif
+
+ #include <pthread.h>
++#ifdef __FreeBSD__
++#define sched_getaffinity(pid, size, set) 0
++#define pthread_setaffinity_np(thread, size, set) 0
++#else
+ #include <sched.h>
+-
++#endif
+ #include <set>
+ #include <unordered_map>
+ #include <vector>
diff --git a/filesystems/mergerfs/files/patch-libfuse_lib_fuse.c b/filesystems/mergerfs/files/patch-libfuse_lib_fuse.c
new file mode 100644
index 000000000000..cdbfe55e710c
--- /dev/null
+++ b/filesystems/mergerfs/files/patch-libfuse_lib_fuse.c
@@ -0,0 +1,14 @@
+--- libfuse/lib/fuse.c.orig 2024-02-29 20:41:22 UTC
++++ libfuse/lib/fuse.c
+@@ -48,8 +48,10 @@
+ #include <time.h>
+ #include <unistd.h>
+
+-#ifdef HAVE_MALLOC_TRIM
++#ifdef __linux__
+ #include <malloc.h>
++#else
++#define malloc_trim(x) ((void)(x))
+ #endif
+
+ #define FUSE_UNKNOWN_INO UINT64_MAX
diff --git a/filesystems/mergerfs/files/patch-libfuse_util_fusermount.c b/filesystems/mergerfs/files/patch-libfuse_util_fusermount.c
new file mode 100644
index 000000000000..7657ee4ce378
--- /dev/null
+++ b/filesystems/mergerfs/files/patch-libfuse_util_fusermount.c
@@ -0,0 +1,15 @@
+--- libfuse/util/fusermount.c.orig 2024-02-29 20:41:22 UTC
++++ libfuse/util/fusermount.c
+@@ -28,7 +28,12 @@
+ #include <sys/fsuid.h>
+ #include <sys/socket.h>
+ #include <sys/utsname.h>
++#ifdef __linux__
+ #include <sched.h>
++#else
++#define sched_getaffinity(pid, size, set) 0
++#define pthread_setaffinity_np(thread, size, set) 0
++#endif
+
+ #define FUSE_COMMFD_ENV "_FUSE_COMMFD"
+
diff --git a/filesystems/mergerfs/files/patch-src_fs__readahead.cpp b/filesystems/mergerfs/files/patch-src_fs__readahead.cpp
new file mode 100644
index 000000000000..3bb873358455
--- /dev/null
+++ b/filesystems/mergerfs/files/patch-src_fs__readahead.cpp
@@ -0,0 +1,14 @@
+--- src/fs_readahead.cpp.orig 2024-02-29 20:41:22 UTC
++++ src/fs_readahead.cpp
+@@ -25,7 +25,11 @@
+ #include <fstream>
+ #include <string>
+
++#ifdef __FreeBSD__
++#include <sys/types.h>
++#else
+ #include <sys/sysmacros.h>
++#endif
+
+ namespace l
+ {
diff --git a/filesystems/mergerfs/files/patch-src_fs__umount2.hpp b/filesystems/mergerfs/files/patch-src_fs__umount2.hpp
new file mode 100644
index 000000000000..ce291a314c01
--- /dev/null
+++ b/filesystems/mergerfs/files/patch-src_fs__umount2.hpp
@@ -0,0 +1,17 @@
+--- src/fs_umount2.hpp.orig 2024-02-29 20:41:22 UTC
++++ src/fs_umount2.hpp
+@@ -19,7 +19,14 @@
+ #pragma once
+
+ #include <errno.h>
++#ifdef __linux__
+ #include <sys/mount.h>
++#else
++#include <sys/param.h>
++#include <sys/mount.h>
++#define umount2(target, flags) unmount(target, flags)
++#define MNT_DETACH 0
++#endif
+
+ #include <string>
+
diff --git a/filesystems/mergerfs/files/patch-tools_preload.c b/filesystems/mergerfs/files/patch-tools_preload.c
new file mode 100644
index 000000000000..a9a3ad06b3c3
--- /dev/null
+++ b/filesystems/mergerfs/files/patch-tools_preload.c
@@ -0,0 +1,29 @@
+--- tools/preload.c.orig 2024-02-29 20:41:22 UTC
++++ tools/preload.c
+@@ -25,10 +25,25 @@
+ #include <string.h>
+ #include <sys/ioctl.h>
+ #include <stdarg.h>
+-#include <sys/stat.h>
++#include <sys/stat.h>
++#ifdef __linux__
++#define S_IFMT S_IFMT
++#define S_IFREG S_IFREG
++#else
++#define S_IFMT 0
++#define S_IFREG 0
++#endif
+ #include <sys/types.h>
+ #include <unistd.h>
+ #include <fcntl.h>
++
++#ifdef __linux__
++#define O_TMPFILE O_TMPFILE
++#define O_PATH O_PATH
++#else
++#define O_TMPFILE 0
++#define O_PATH 0
++#endif
+
+ typedef char IOCTL_BUF[4096];
+ #define IOCTL_APP_TYPE 0xDF
diff --git a/filesystems/mergerfs/pkg-descr b/filesystems/mergerfs/pkg-descr
new file mode 100644
index 000000000000..cff399af2600
--- /dev/null
+++ b/filesystems/mergerfs/pkg-descr
@@ -0,0 +1,3 @@
+mergerfs is a union filesystem geared towards simplifying storage and
+management of files across numerous commodity storage devices. It is
+similar to mhddfs, unionfs, and aufs.
diff --git a/filesystems/mhddfs/Makefile b/filesystems/mhddfs/Makefile
new file mode 100644
index 000000000000..5ae9b30c5a9e
--- /dev/null
+++ b/filesystems/mhddfs/Makefile
@@ -0,0 +1,33 @@
+PORTNAME= mhddfs
+PORTVERSION= 0.1.37
+PORTREVISION= 1
+CATEGORIES= filesystems
+MASTER_SITES= http://mhddfs.uvw.ru/downloads/
+PKGNAMEPREFIX= fusefs-
+DISTNAME= ${PORTNAME}_${PORTVERSION}
+
+MAINTAINER= proler@gmail.com
+COMMENT= Multi HDD [FUSE] File System
+WWW= http://mhddfs.uvw.ru/
+
+USES= fuse pkgconfig gmake
+MAKE_ARGS= WITHOUT_XATTR=1
+WRKSRC= ${WRKDIR}/${PORTNAME}-${PORTVERSION}
+
+PLIST_FILES= bin/${PORTNAME} share/man/man1/mhddfs.1.gz
+PORTDOCS= README ChangeLog
+
+OPTIONS_DEFINE= DOCS
+
+post-patch:
+ @${REINPLACE_CMD} -e 's|<sys/vfs.h>|<sys/statvfs.h>|' \
+ ${WRKSRC}/src/main.c
+
+do-install:
+ ${INSTALL_PROGRAM} ${WRKSRC}/${PORTNAME} ${STAGEDIR}${PREFIX}/bin
+ ${INSTALL_MAN} ${WRKSRC}/${PORTNAME}.1 ${STAGEDIR}${PREFIX}/share/man/man1
+ @${MKDIR} ${STAGEDIR}${DOCSDIR}
+ ${INSTALL_DATA} ${WRKSRC}/README ${STAGEDIR}${DOCSDIR}
+ ${INSTALL_DATA} ${WRKSRC}/ChangeLog ${STAGEDIR}${DOCSDIR}
+
+.include <bsd.port.mk>
diff --git a/filesystems/mhddfs/distinfo b/filesystems/mhddfs/distinfo
new file mode 100644
index 000000000000..9eb0b83fedb0
--- /dev/null
+++ b/filesystems/mhddfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905183
+SHA256 (mhddfs_0.1.37.tar.gz) = cac6b528b65e7468aa1988bf8ca3cb5cf505f3b543e063649a62e8d1cf800b3b
+SIZE (mhddfs_0.1.37.tar.gz) = 40042
diff --git a/filesystems/mhddfs/files/patch-Makefile b/filesystems/mhddfs/files/patch-Makefile
new file mode 100644
index 000000000000..27dc30fcdb9d
--- /dev/null
+++ b/filesystems/mhddfs/files/patch-Makefile
@@ -0,0 +1,50 @@
+--- ./Makefile.orig 2014-03-03 13:17:15.751580055 +0100
++++ ./Makefile 2014-03-03 13:17:55.792585399 +0100
+@@ -83,14 +83,14 @@
+ $(shell rpm --eval '%_rpmdir')/*/mhddfs-*$(VERSION)-$(RELEASE)* .
+
+ $(TARGET): obj/obj-stamp $(OBJ)
+- gcc $(CFLAGS) $(OBJ) -o $@ $(LDFLAGS)
++ $(CC) $(CFLAGS) $(OBJ) -o $@ $(LDFLAGS)
+
+ obj/obj-stamp:
+ mkdir -p obj
+ touch $@
+
+ obj/%.o: src/%.c
+- gcc $(CFLAGS) -c $< -o $@
++ $(CC) $(CFLAGS) -c $< -o $@
+
+ clean:
+ rm -fr obj $(TARGET) pwrite_test statvfs rename
+@@ -98,7 +98,7 @@
+ rm -fr rename-test/mnt
+
+ rename: tests/rename.c
+- gcc -o $@ $<
++ $(CC) -o $@ $<
+
+ release_svn_thread:
+ @echo current version $(VERSION)
+@@ -113,10 +113,10 @@
+ screen -t vim vim Makefile src/*.[ch] README* ChangeLog mhddfs.1
+
+ pwrite_test: src/test/pwrite.c
+- gcc -o $@ $<
++ $(CC) -o $@ $<
+
+ statvfs: src/test/statvfs.c
+- gcc -o $@ $<
++ $(CC) -o $@ $<
+
+ images-mount: test1.img test2.img
+ mount|grep -q `pwd`/test1 || sudo mount -o loop test1.img test1
+@@ -160,7 +160,7 @@
+ while make test; do echo ok; echo; done
+
+ ptest:
+- gcc -o $@ tests/plocks.c -l pthread
++ $(CC) -o $@ tests/plocks.c -l pthread
+ -./$@
+ rm -f $@
+
diff --git a/filesystems/mhddfs/pkg-descr b/filesystems/mhddfs/pkg-descr
new file mode 100644
index 000000000000..76148714af7e
--- /dev/null
+++ b/filesystems/mhddfs/pkg-descr
@@ -0,0 +1,8 @@
+mhddfs - Multi HDD [FUSE] File System
+
+File system for unifying several mount points into one
+This FUSE-based file system allows mount points (or directories) to be
+combined, simulating a single big volume which can merge several hard
+drives or remote file systems. It is like unionfs, but can choose the
+drive with the most free space to create new files on, and can move
+data transparently between drives.
diff --git a/filesystems/moosefs2-cgi/Makefile b/filesystems/moosefs2-cgi/Makefile
new file mode 100644
index 000000000000..d33138f4f30c
--- /dev/null
+++ b/filesystems/moosefs2-cgi/Makefile
@@ -0,0 +1,9 @@
+PKGNAMESUFFIX= -cgi
+
+COMMENT= MooseFS CGI interface
+
+MFS_COMPONENT= cgi
+
+MASTERDIR= ${.CURDIR}/../moosefs2-master
+
+.include "${MASTERDIR}/Makefile"
diff --git a/filesystems/moosefs2-cgi/pkg-descr b/filesystems/moosefs2-cgi/pkg-descr
new file mode 100644
index 000000000000..36025c132006
--- /dev/null
+++ b/filesystems/moosefs2-cgi/pkg-descr
@@ -0,0 +1,7 @@
+MooseFS is a Fault tolerant, High Available, Highly Performing, Scale-Out,
+network distributed file system. It spreads data over several physical commodity
+servers, which are visible to the user as one resource.
+
+For standard file operations MooseFS acts like any other Unix-like file system.
+
+This port provides: MooseFS CGI monitor.
diff --git a/filesystems/moosefs2-cgi/pkg-plist b/filesystems/moosefs2-cgi/pkg-plist
new file mode 100644
index 000000000000..d601df00caac
--- /dev/null
+++ b/filesystems/moosefs2-cgi/pkg-plist
@@ -0,0 +1,8 @@
+share/mfscgi/mfs.cgi
+share/mfscgi/mfs.css
+share/mfscgi/logomini.png
+share/mfscgi/index.html
+share/mfscgi/err.gif
+share/mfscgi/chart.cgi
+share/mfscgi/favicon.ico
+share/mfscgi/acidtab.js
diff --git a/filesystems/moosefs2-cgiserv/Makefile b/filesystems/moosefs2-cgiserv/Makefile
new file mode 100644
index 000000000000..afe97c58fc27
--- /dev/null
+++ b/filesystems/moosefs2-cgiserv/Makefile
@@ -0,0 +1,10 @@
+PORTREVISION= 1
+PKGNAMESUFFIX= -cgiserv
+
+COMMENT= MooseFS CGI web server
+
+MFS_COMPONENT= cgiserv
+
+MASTERDIR= ${.CURDIR}/../moosefs2-master
+
+.include "${MASTERDIR}/Makefile"
diff --git a/filesystems/moosefs2-cgiserv/pkg-descr b/filesystems/moosefs2-cgiserv/pkg-descr
new file mode 100644
index 000000000000..521dda4d677c
--- /dev/null
+++ b/filesystems/moosefs2-cgiserv/pkg-descr
@@ -0,0 +1,7 @@
+MooseFS is a Fault tolerant, High Available, Highly Performing, Scale-Out,
+network distributed file system. It spreads data over several physical commodity
+servers, which are visible to the user as one resource.
+
+For standard file operations MooseFS acts like any other Unix-like file system.
+
+This port provides: Simple CGI-capable HTTP server to run MooseFS CGI monitor.
diff --git a/filesystems/moosefs2-cgiserv/pkg-plist b/filesystems/moosefs2-cgiserv/pkg-plist
new file mode 100644
index 000000000000..3f3ea8249528
--- /dev/null
+++ b/filesystems/moosefs2-cgiserv/pkg-plist
@@ -0,0 +1,5 @@
+sbin/mfscgiserv
+share/man/man8/mfscgiserv.8.gz
+@owner mfs
+@group mfs
+@dir %%MFS_WORKDIR%%/mfs
diff --git a/filesystems/moosefs2-chunkserver/Makefile b/filesystems/moosefs2-chunkserver/Makefile
new file mode 100644
index 000000000000..a194e2c20296
--- /dev/null
+++ b/filesystems/moosefs2-chunkserver/Makefile
@@ -0,0 +1,10 @@
+PORTREVISION= 1
+PKGNAMESUFFIX= -chunkserver
+
+COMMENT= MooseFS data storage and synchronization component
+
+MFS_COMPONENT= chunkserver
+
+MASTERDIR= ${.CURDIR}/../moosefs2-master
+
+.include "${MASTERDIR}/Makefile"
diff --git a/filesystems/moosefs2-chunkserver/pkg-descr b/filesystems/moosefs2-chunkserver/pkg-descr
new file mode 100644
index 000000000000..49022d32fbbc
--- /dev/null
+++ b/filesystems/moosefs2-chunkserver/pkg-descr
@@ -0,0 +1,7 @@
+MooseFS is a Fault tolerant, High Available, Highly Performing, Scale-Out,
+network distributed file system. It spreads data over several physical commodity
+servers, which are visible to the user as one resource.
+
+For standard file operations MooseFS acts like any other Unix-like file system.
+
+This port provides: MooseFS data server.
diff --git a/filesystems/moosefs2-chunkserver/pkg-plist b/filesystems/moosefs2-chunkserver/pkg-plist
new file mode 100644
index 000000000000..da630f1080bb
--- /dev/null
+++ b/filesystems/moosefs2-chunkserver/pkg-plist
@@ -0,0 +1,11 @@
+@sample etc/mfs/mfschunkserver.cfg.sample
+@sample etc/mfs/mfshdd.cfg.sample
+sbin/mfschunkserver
+sbin/mfschunktool
+share/man/man5/mfschunkserver.cfg.5.gz
+share/man/man5/mfshdd.cfg.5.gz
+share/man/man8/mfschunkserver.8.gz
+share/man/man8/mfschunktool.8.gz
+@owner mfs
+@group mfs
+@dir %%MFS_WORKDIR%%/mfs
diff --git a/filesystems/moosefs2-cli/Makefile b/filesystems/moosefs2-cli/Makefile
new file mode 100644
index 000000000000..1a6757a94e1c
--- /dev/null
+++ b/filesystems/moosefs2-cli/Makefile
@@ -0,0 +1,10 @@
+PORTREVISION= 1
+PKGNAMESUFFIX= -cli
+
+COMMENT= MooseFS command line interface
+
+MFS_COMPONENT= cli
+
+MASTERDIR= ${.CURDIR}/../moosefs2-master
+
+.include "${MASTERDIR}/Makefile"
diff --git a/filesystems/moosefs2-cli/pkg-descr b/filesystems/moosefs2-cli/pkg-descr
new file mode 100644
index 000000000000..9b4fd59436bf
--- /dev/null
+++ b/filesystems/moosefs2-cli/pkg-descr
@@ -0,0 +1,7 @@
+MooseFS is a Fault tolerant, High Available, Highly Performing, Scale-Out,
+network distributed file system. It spreads data over several physical commodity
+servers, which are visible to the user as one resource.
+
+For standard file operations MooseFS acts like any other Unix-like file system.
+
+This port provides: MooseFS CLI utilities.
diff --git a/filesystems/moosefs2-cli/pkg-plist b/filesystems/moosefs2-cli/pkg-plist
new file mode 100644
index 000000000000..b89b6b5ecf83
--- /dev/null
+++ b/filesystems/moosefs2-cli/pkg-plist
@@ -0,0 +1,2 @@
+bin/mfscli
+share/man/man1/mfscli.1.gz
diff --git a/filesystems/moosefs2-client/Makefile b/filesystems/moosefs2-client/Makefile
new file mode 100644
index 000000000000..9cf2d724e61e
--- /dev/null
+++ b/filesystems/moosefs2-client/Makefile
@@ -0,0 +1,10 @@
+PORTREVISION= 1
+PKGNAMESUFFIX= -client
+
+COMMENT= MooseFS client tools
+
+MFS_COMPONENT= client
+
+MASTERDIR= ${.CURDIR}/../moosefs2-master
+
+.include "${MASTERDIR}/Makefile"
diff --git a/filesystems/moosefs2-client/pkg-descr b/filesystems/moosefs2-client/pkg-descr
new file mode 100644
index 000000000000..de72d7e2d737
--- /dev/null
+++ b/filesystems/moosefs2-client/pkg-descr
@@ -0,0 +1,7 @@
+MooseFS is a Fault tolerant, High Available, Highly Performing, Scale-Out,
+network distributed file system. It spreads data over several physical commodity
+servers, which are visible to the user as one resource.
+
+For standard file operations MooseFS acts like any other Unix-like file system.
+
+This port provides: MooseFS clients: mfsmount and mfstools.
diff --git a/filesystems/moosefs2-client/pkg-plist b/filesystems/moosefs2-client/pkg-plist
new file mode 100644
index 000000000000..8697bf3f7775
--- /dev/null
+++ b/filesystems/moosefs2-client/pkg-plist
@@ -0,0 +1,47 @@
+bin/mfsappendchunks
+bin/mfscheckfile
+bin/mfsdirinfo
+bin/mfsfileinfo
+bin/mfsfilerepair
+bin/mfsmakesnapshot
+bin/mfsgetgoal
+bin/mfssetgoal
+bin/mfsrgetgoal
+bin/mfsrsetgoal
+bin/mfsgettrashtime
+bin/mfssettrashtime
+bin/mfsrgettrashtime
+bin/mfsrsettrashtime
+bin/mfsgeteattr
+bin/mfsseteattr
+bin/mfsdeleattr
+bin/mfsgetquota
+bin/mfssetquota
+bin/mfsdelquota
+bin/mfsfilepaths
+bin/mfsmount
+bin/mfstools
+@sample etc/mfs/mfsmount.cfg.sample
+share/man/man1/mfsappendchunks.1.gz
+share/man/man1/mfscheckfile.1.gz
+share/man/man1/mfsdeleattr.1.gz
+share/man/man1/mfsdelquota.1.gz
+share/man/man1/mfsdirinfo.1.gz
+share/man/man1/mfsfileinfo.1.gz
+share/man/man1/mfsfilepaths.1.gz
+share/man/man1/mfsfilerepair.1.gz
+share/man/man1/mfsgeteattr.1.gz
+share/man/man1/mfsgetgoal.1.gz
+share/man/man1/mfsgetquota.1.gz
+share/man/man1/mfsgettrashtime.1.gz
+share/man/man1/mfsmakesnapshot.1.gz
+share/man/man1/mfsrgetgoal.1.gz
+share/man/man1/mfsrgettrashtime.1.gz
+share/man/man1/mfsrsetgoal.1.gz
+share/man/man1/mfsrsettrashtime.1.gz
+share/man/man1/mfsseteattr.1.gz
+share/man/man1/mfssetgoal.1.gz
+share/man/man1/mfssetquota.1.gz
+share/man/man1/mfssettrashtime.1.gz
+share/man/man1/mfstools.1.gz
+share/man/man8/mfsmount.8.gz
diff --git a/filesystems/moosefs2-master/Makefile b/filesystems/moosefs2-master/Makefile
new file mode 100644
index 000000000000..f71b0645904f
--- /dev/null
+++ b/filesystems/moosefs2-master/Makefile
@@ -0,0 +1,107 @@
+PORTNAME= moosefs2
+PORTVERSION= 2.0.91
+PORTREVISION= 1
+CATEGORIES= filesystems sysutils
+MASTER_SITES= http://ppa.moosefs.com/src/
+PKGNAMESUFFIX?= -master
+DISTNAME= moosefs-${PORTVERSION}-1
+
+MAINTAINER= freebsd@moosefs.com
+COMMENT?= Fault-tolerant distributed filesystem
+WWW= https://moosefs.com/
+
+LICENSE= GPLv2
+
+USES= python:build
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+WRKSRC= ${WRKDIR}/moosefs-${PORTVERSION}
+PLIST= ${.CURDIR}/pkg-plist
+DESCR= ${.CURDIR}/pkg-descr
+
+MFS_COMPONENT?= master
+MFS_USER= mfs
+MFS_GROUP= mfs
+MFS_WORKDIR= /var
+
+USERS= ${MFS_USER}
+GROUPS= ${MFS_GROUP}
+
+CONFIGURE_ARGS+= --localstatedir=${MFS_WORKDIR} \
+ --with-default-user=${MFS_USER} \
+ --with-default-group=${MFS_GROUP} \
+
+.if ${MFS_COMPONENT} == cgi
+MFS_CGIDIR= ${PREFIX}/share/mfscgi
+USES= python
+CONFIGURE_ARGS+= --enable-mfscgi \
+ --with-mfscgi-dir=${MFS_CGIDIR}
+.else
+CONFIGURE_ARGS+= --disable-mfscgi
+.endif
+
+.if ${MFS_COMPONENT} == cgiserv
+MFS_CGISERVDIR= ${PREFIX}/sbin
+USES= python
+USE_RC_SUBR= mfscgiserv
+SUB_FILES+= pkg-message-cgiserv
+PKGMESSAGE= ${WRKDIR}/pkg-message-cgiserv
+PLIST_SUB+= MFS_WORKDIR="${MFS_WORKDIR}"
+CONFIGURE_ARGS+= --enable-mfscgiserv \
+ --with-mfscgiserv-dir=${MFS_CGISERVDIR}
+RUN_DEPENDS= moosefs2-cgi>0:filesystems/moosefs2-cgi
+.else
+CONFIGURE_ARGS+= --disable-mfscgiserv
+.endif
+
+.if ${MFS_COMPONENT} == chunkserver
+USE_RC_SUBR= mfschunkserver
+SUB_FILES+= pkg-message-chunkserver
+PKGMESSAGE= ${WRKDIR}/pkg-message-chunkserver
+PLIST_SUB+= MFS_WORKDIR="${MFS_WORKDIR}"
+CONFIGURE_ARGS+= --enable-mfschunkserver
+.else
+CONFIGURE_ARGS+= --disable-mfschunkserver
+.endif
+
+.if ${MFS_COMPONENT} == cli
+USES= python
+CONFIGURE_ARGS+= --enable-mfscli
+.else
+CONFIGURE_ARGS+= --disable-mfscli
+.endif
+
+.if ${MFS_COMPONENT} == client
+USES= compiler:c11 fuse pkgconfig
+CONFIGURE_ARGS+= --enable-mfsmount
+.else
+CONFIGURE_ARGS+= --disable-mfsmount
+.endif
+
+.if ${MFS_COMPONENT} == master
+USE_RC_SUBR= mfsmaster
+PLIST_SUB+= MFS_WORKDIR="${MFS_WORKDIR}"
+SUB_FILES+= pkg-message-master
+PKGMESSAGE= ${WRKDIR}/pkg-message-master
+CONFIGURE_ARGS+= --enable-mfsmaster
+.else
+CONFIGURE_ARGS+= --disable-mfsmaster
+.endif
+
+.if ${MFS_COMPONENT} == metalogger
+USE_RC_SUBR= mfsmetalogger
+SUB_FILES+= pkg-message-metalogger
+PKGMESSAGE= ${WRKDIR}/pkg-message-metalogger
+PLIST_SUB+= MFS_WORKDIR="${MFS_WORKDIR}"
+CONFIGURE_ARGS+= --enable-mfsmetalogger
+.else
+CONFIGURE_ARGS+= --disable-mfsmetalogger
+.endif
+
+.if ${MFS_COMPONENT} == netdump
+CONFIGURE_ARGS+= --enable-mfsnetdump
+.else
+CONFIGURE_ARGS+= --disable-mfsnetdump
+.endif
+
+.include <bsd.port.mk>
diff --git a/filesystems/moosefs2-master/distinfo b/filesystems/moosefs2-master/distinfo
new file mode 100644
index 000000000000..967bb6ec0f40
--- /dev/null
+++ b/filesystems/moosefs2-master/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1475264147
+SHA256 (moosefs-2.0.91-1.tar.gz) = c63c578b06395e913a163c2076effe39d3fd66b09caff6b23f6303d4a22fe249
+SIZE (moosefs-2.0.91-1.tar.gz) = 970133
diff --git a/filesystems/moosefs2-master/files/mfscgiserv.in b/filesystems/moosefs2-master/files/mfscgiserv.in
new file mode 100644
index 000000000000..39f9f59ddb6d
--- /dev/null
+++ b/filesystems/moosefs2-master/files/mfscgiserv.in
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+# PROVIDE: mfscgiserv
+# REQUIRE: DAEMON
+# KEYWORD: shutdown
+#
+# Add the following lines to /etc/rc.conf to enable mfscgiserv:
+#
+# mfscgiserv_enable="YES"
+#
+
+. /etc/rc.subr
+
+name=mfscgiserv
+rcvar=mfscgiserv_enable
+
+command=%%PREFIX%%/sbin/${name}
+pid_file=%%MFS_WORKDIR%%/mfs/.${name}.lock
+procname="python"
+
+stop_cmd="$command stop"
+status_cmd="$command test"
+
+load_rc_config $name
+
+# set defaults
+: ${mfscgiserv_enable="NO"}
+
+run_rc_command "$1"
diff --git a/filesystems/moosefs2-master/files/mfschunkserver.in b/filesystems/moosefs2-master/files/mfschunkserver.in
new file mode 100644
index 000000000000..3083fe91b543
--- /dev/null
+++ b/filesystems/moosefs2-master/files/mfschunkserver.in
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+# PROVIDE: mfschunkserver
+# REQUIRE: DAEMON
+# KEYWORD: shutdown
+#
+# Add the following lines to /etc/rc.conf.local or /etc/rc.conf to enable mfschunkserver:
+#
+# mfschunkserver_enable="YES"
+#
+
+. /etc/rc.subr
+
+name=mfschunkserver
+rcvar=mfschunkserver_enable
+
+config_file=%%PREFIX%%/etc/mfs/${name}.cfg
+
+required_files=${config_file}
+
+command=%%PREFIX%%/sbin/${name}
+pid_file=%%MFS_WORKDIR%%/mfs/.${name}.lock
+command_args="-c $config_file"
+
+load_rc_config $name
+
+# set defaults
+: ${mfschunkserver_enable="NO"}
+
+run_rc_command "$1"
diff --git a/filesystems/moosefs2-master/files/mfsmaster.in b/filesystems/moosefs2-master/files/mfsmaster.in
new file mode 100644
index 000000000000..a551d441c5b1
--- /dev/null
+++ b/filesystems/moosefs2-master/files/mfsmaster.in
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+# PROVIDE: mfsmaster
+# REQUIRE: DAEMON
+# KEYWORD: nostart shutdown
+#
+# Add the following lines to /etc/rc.conf to enable mfsmaster:
+#
+# mfsmaster_enable="YES"
+#
+
+. /etc/rc.subr
+
+name=mfsmaster
+rcvar=mfsmaster_enable
+
+config_file=%%PREFIX%%/etc/mfs/${name}.cfg
+
+required_files=${config_file}
+
+command=%%PREFIX%%/sbin/${name}
+pid_file=%%MFS_WORKDIR%%/mfs/.${name}.lock
+command_args="-c $config_file"
+
+load_rc_config $name
+
+# set defaults
+: ${mfsmaster_enable="NO"}
+
+run_rc_command "$1"
diff --git a/filesystems/moosefs2-master/files/mfsmetalogger.in b/filesystems/moosefs2-master/files/mfsmetalogger.in
new file mode 100644
index 000000000000..994a1a69f4ec
--- /dev/null
+++ b/filesystems/moosefs2-master/files/mfsmetalogger.in
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+# PROVIDE: mfsmetalogger
+# REQUIRE: DAEMON
+# KEYWORD: shutdown
+#
+# Add the following lines to /etc/rc.conf to enable mfsmetalogger:
+#
+# mfsmetalogger_enable="YES"
+#
+
+. /etc/rc.subr
+
+name=mfsmetalogger
+rcvar=mfsmetalogger_enable
+
+config_file=%%PREFIX%%/etc/mfs/${name}.cfg
+
+required_files=${config_file}
+
+command=%%PREFIX%%/sbin/${name}
+pid_file=%%MFS_WORKDIR%%/mfs/.${name}.lock
+command_args="-c $config_file"
+
+load_rc_config $name
+
+# set defaults
+: ${mfsmetalogger_enable="NO"}
+
+run_rc_command "$1"
diff --git a/filesystems/moosefs2-master/files/patch-mfsdata_Makefile.in b/filesystems/moosefs2-master/files/patch-mfsdata_Makefile.in
new file mode 100644
index 000000000000..ac1bd4685b43
--- /dev/null
+++ b/filesystems/moosefs2-master/files/patch-mfsdata_Makefile.in
@@ -0,0 +1,30 @@
+--- mfsdata/Makefile.in.orig 2015-08-12 14:50:32 UTC
++++ mfsdata/Makefile.in
+@@ -504,11 +504,11 @@ install-data-hook:
+ @CREATE_DATA_DIR_TRUE@ fi ; \
+ @CREATE_DATA_DIR_TRUE@ fi ; \
+ @CREATE_DATA_DIR_TRUE@ fi
+-@BUILD_CHUNKSERVER_TRUE@ $(INSTALL_DATA) $(builddir)/mfschunkserver.cfg $(DESTDIR)$(sysconfdir)/mfs/mfschunkserver.cfg.dist
+-@BUILD_CHUNKSERVER_TRUE@ $(INSTALL_DATA) $(srcdir)/mfshdd.cfg $(DESTDIR)$(sysconfdir)/mfs/mfshdd.cfg.dist
+-@BUILD_MASTER_TRUE@ $(INSTALL_DATA) $(builddir)/mfsmaster.cfg $(DESTDIR)$(sysconfdir)/mfs/mfsmaster.cfg.dist
+-@BUILD_MASTER_TRUE@ $(INSTALL_DATA) $(builddir)/mfsexports.cfg $(DESTDIR)$(sysconfdir)/mfs/mfsexports.cfg.dist
+-@BUILD_MASTER_TRUE@ $(INSTALL_DATA) $(builddir)/mfstopology.cfg $(DESTDIR)$(sysconfdir)/mfs/mfstopology.cfg.dist
++@BUILD_CHUNKSERVER_TRUE@ $(INSTALL_DATA) $(builddir)/mfschunkserver.cfg $(DESTDIR)$(sysconfdir)/mfs/mfschunkserver.cfg.sample
++@BUILD_CHUNKSERVER_TRUE@ $(INSTALL_DATA) $(srcdir)/mfshdd.cfg $(DESTDIR)$(sysconfdir)/mfs/mfshdd.cfg.sample
++@BUILD_MASTER_TRUE@ $(INSTALL_DATA) $(builddir)/mfsmaster.cfg $(DESTDIR)$(sysconfdir)/mfs/mfsmaster.cfg.sample
++@BUILD_MASTER_TRUE@ $(INSTALL_DATA) $(builddir)/mfsexports.cfg $(DESTDIR)$(sysconfdir)/mfs/mfsexports.cfg.sample
++@BUILD_MASTER_TRUE@ $(INSTALL_DATA) $(builddir)/mfstopology.cfg $(DESTDIR)$(sysconfdir)/mfs/mfstopology.cfg.sample
+ @BUILD_MASTER_TRUE@ $(INSTALL_DATA) $(srcdir)/metadata.mfs $(DESTDIR)$(DATA_PATH)/metadata.mfs.empty
+ @BUILD_MASTER_TRUE@ if [ "`id -u`" = "0" ]; then \
+ @BUILD_MASTER_TRUE@ if id -u $(DEFAULT_USER) 2> /dev/null > /dev/null ; then \
+@@ -517,8 +517,8 @@ install-data-hook:
+ @BUILD_MASTER_TRUE@ fi ; \
+ @BUILD_MASTER_TRUE@ fi ; \
+ @BUILD_MASTER_TRUE@ fi
+-@BUILD_MOUNT_TRUE@ $(INSTALL_DATA) $(builddir)/mfsmount.cfg $(DESTDIR)$(sysconfdir)/mfs/mfsmount.cfg.dist
+-@BUILD_METALOGGER_TRUE@ $(INSTALL_DATA) $(builddir)/mfsmetalogger.cfg $(DESTDIR)$(sysconfdir)/mfs/mfsmetalogger.cfg.dist
++@BUILD_MOUNT_TRUE@ $(INSTALL_DATA) $(builddir)/mfsmount.cfg $(DESTDIR)$(sysconfdir)/mfs/mfsmount.cfg.sample
++@BUILD_METALOGGER_TRUE@ $(INSTALL_DATA) $(builddir)/mfsmetalogger.cfg $(DESTDIR)$(sysconfdir)/mfs/mfsmetalogger.cfg.sample
+
+ # Tell versions [3.59,3.63) of GNU make to not export all variables.
+ # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/filesystems/moosefs2-master/files/pkg-message-cgiserv.in b/filesystems/moosefs2-master/files/pkg-message-cgiserv.in
new file mode 100644
index 000000000000..b93e90eb8847
--- /dev/null
+++ b/filesystems/moosefs2-master/files/pkg-message-cgiserv.in
@@ -0,0 +1,14 @@
+[
+{ type: install
+ message: <<EOM
+A startup script has been installed as:
+
+%%PREFIX%%/etc/rc.d/mfscgiserv
+
+Use it to start/stop the mfscgiserv service after you have added
+the following line to your rc.conf file:
+
+mfscgiserv_enable="YES"
+EOM
+}
+]
diff --git a/filesystems/moosefs2-master/files/pkg-message-chunkserver.in b/filesystems/moosefs2-master/files/pkg-message-chunkserver.in
new file mode 100644
index 000000000000..5ad0ee1a4388
--- /dev/null
+++ b/filesystems/moosefs2-master/files/pkg-message-chunkserver.in
@@ -0,0 +1,14 @@
+[
+{ type: install
+ message: <<EOM
+A startup script has been installed as:
+
+%%PREFIX%%/etc/rc.d/mfschunkserver
+
+Use it to start/stop the mfschunkserver service after you have added
+the following line to your rc.conf file:
+
+mfschunkserver_enable="YES"
+EOM
+}
+]
diff --git a/filesystems/moosefs2-master/files/pkg-message-master.in b/filesystems/moosefs2-master/files/pkg-message-master.in
new file mode 100644
index 000000000000..748bcc9eee7a
--- /dev/null
+++ b/filesystems/moosefs2-master/files/pkg-message-master.in
@@ -0,0 +1,14 @@
+[
+{ type: install
+ message: <<EOM
+A startup script has been installed as:
+
+%%PREFIX%%/etc/rc.d/mfsmaster
+
+Use it to start/stop the mfsmaster service after you have added
+the following line to your rc.conf file:
+
+mfsmaster_enable="YES"
+EOM
+}
+]
diff --git a/filesystems/moosefs2-master/files/pkg-message-metalogger.in b/filesystems/moosefs2-master/files/pkg-message-metalogger.in
new file mode 100644
index 000000000000..0a294c00bc0c
--- /dev/null
+++ b/filesystems/moosefs2-master/files/pkg-message-metalogger.in
@@ -0,0 +1,14 @@
+[
+{ type: install
+ message: <<EOM
+A startup script has been installed as:
+
+%%PREFIX%%/etc/rc.d/mfsmetalogger
+
+Use it to start/stop the mfsmetalogger service after you have added
+the following line to your rc.conf file:
+
+mfsmetalogger_enable="YES"
+EOM
+}
+]
diff --git a/filesystems/moosefs2-master/pkg-descr b/filesystems/moosefs2-master/pkg-descr
new file mode 100644
index 000000000000..5a93d68ac286
--- /dev/null
+++ b/filesystems/moosefs2-master/pkg-descr
@@ -0,0 +1,7 @@
+MooseFS is a Fault tolerant, High Available, Highly Performing, Scale-Out,
+network distributed file system. It spreads data over several physical commodity
+servers, which are visible to the user as one resource.
+
+For standard file operations MooseFS acts like any other Unix-like file system.
+
+This port provides: MooseFS master (metadata) server.
diff --git a/filesystems/moosefs2-master/pkg-plist b/filesystems/moosefs2-master/pkg-plist
new file mode 100644
index 000000000000..d750cf15d914
--- /dev/null
+++ b/filesystems/moosefs2-master/pkg-plist
@@ -0,0 +1,16 @@
+@sample etc/mfs/mfsmaster.cfg.sample
+@sample etc/mfs/mfsexports.cfg.sample
+@sample etc/mfs/mfstopology.cfg.sample
+sbin/mfsmaster
+sbin/mfsmetadump
+sbin/mfsmetarestore
+share/man/man5/mfsexports.cfg.5.gz
+share/man/man5/mfsmaster.cfg.5.gz
+share/man/man5/mfstopology.cfg.5.gz
+share/man/man8/mfsmaster.8.gz
+share/man/man8/mfsmetadump.8.gz
+share/man/man8/mfsmetarestore.8.gz
+@owner mfs
+@group mfs
+@dir %%MFS_WORKDIR%%/mfs
+%%MFS_WORKDIR%%/mfs/metadata.mfs.empty
diff --git a/filesystems/moosefs2-metalogger/Makefile b/filesystems/moosefs2-metalogger/Makefile
new file mode 100644
index 000000000000..6922aac6de8f
--- /dev/null
+++ b/filesystems/moosefs2-metalogger/Makefile
@@ -0,0 +1,10 @@
+PORTREVISION= 1
+PKGNAMESUFFIX= -metalogger
+
+COMMENT= MooseFS metadata backup server
+
+MFS_COMPONENT= metalogger
+
+MASTERDIR= ${.CURDIR}/../moosefs2-master
+
+.include "${MASTERDIR}/Makefile"
diff --git a/filesystems/moosefs2-metalogger/pkg-descr b/filesystems/moosefs2-metalogger/pkg-descr
new file mode 100644
index 000000000000..02e050e7169b
--- /dev/null
+++ b/filesystems/moosefs2-metalogger/pkg-descr
@@ -0,0 +1,7 @@
+MooseFS is a Fault tolerant, High Available, Highly Performing, Scale-Out,
+network distributed file system. It spreads data over several physical commodity
+servers, which are visible to the user as one resource.
+
+For standard file operations MooseFS acts like any other Unix-like file system.
+
+This port provides: MooseFS metalogger (metadata replication) server.
diff --git a/filesystems/moosefs2-metalogger/pkg-plist b/filesystems/moosefs2-metalogger/pkg-plist
new file mode 100644
index 000000000000..c27833ff6e37
--- /dev/null
+++ b/filesystems/moosefs2-metalogger/pkg-plist
@@ -0,0 +1,7 @@
+@sample etc/mfs/mfsmetalogger.cfg.sample
+sbin/mfsmetalogger
+share/man/man5/mfsmetalogger.cfg.5.gz
+share/man/man8/mfsmetalogger.8.gz
+@owner mfs
+@group mfs
+@dir %%MFS_WORKDIR%%/mfs
diff --git a/filesystems/moosefs2-netdump/Makefile b/filesystems/moosefs2-netdump/Makefile
new file mode 100644
index 000000000000..819857812fb0
--- /dev/null
+++ b/filesystems/moosefs2-netdump/Makefile
@@ -0,0 +1,10 @@
+PORTREVISION= 1
+PKGNAMESUFFIX= -netdump
+
+COMMENT= MooseFS network packet dump utility
+
+MFS_COMPONENT= netdump
+
+MASTERDIR= ${.CURDIR}/../moosefs2-master
+
+.include "${MASTERDIR}/Makefile"
diff --git a/filesystems/moosefs2-netdump/pkg-descr b/filesystems/moosefs2-netdump/pkg-descr
new file mode 100644
index 000000000000..6691c4931b69
--- /dev/null
+++ b/filesystems/moosefs2-netdump/pkg-descr
@@ -0,0 +1,7 @@
+MooseFS is a Fault tolerant, High Available, Highly Performing, Scale-Out,
+network distributed file system. It spreads data over several physical commodity
+servers, which are visible to the user as one resource.
+
+For standard file operations MooseFS acts like any other Unix-like file system.
+
+This port provides: MooseFS network packet dump utility
diff --git a/filesystems/moosefs2-netdump/pkg-plist b/filesystems/moosefs2-netdump/pkg-plist
new file mode 100644
index 000000000000..d9fe247254f3
--- /dev/null
+++ b/filesystems/moosefs2-netdump/pkg-plist
@@ -0,0 +1,2 @@
+sbin/mfsnetdump
+share/man/man8/mfsnetdump.8.gz
diff --git a/filesystems/moosefs3-cgi/Makefile b/filesystems/moosefs3-cgi/Makefile
new file mode 100644
index 000000000000..7d037c1e09ae
--- /dev/null
+++ b/filesystems/moosefs3-cgi/Makefile
@@ -0,0 +1,9 @@
+PKGNAMESUFFIX= -cgi
+
+COMMENT= MooseFS CGI interface
+
+MFS_COMPONENT= cgi
+
+MASTERDIR= ${.CURDIR}/../moosefs3-master
+
+.include "${MASTERDIR}/Makefile"
diff --git a/filesystems/moosefs3-cgi/pkg-descr b/filesystems/moosefs3-cgi/pkg-descr
new file mode 100644
index 000000000000..36025c132006
--- /dev/null
+++ b/filesystems/moosefs3-cgi/pkg-descr
@@ -0,0 +1,7 @@
+MooseFS is a Fault tolerant, High Available, Highly Performing, Scale-Out,
+network distributed file system. It spreads data over several physical commodity
+servers, which are visible to the user as one resource.
+
+For standard file operations MooseFS acts like any other Unix-like file system.
+
+This port provides: MooseFS CGI monitor.
diff --git a/filesystems/moosefs3-cgi/pkg-plist b/filesystems/moosefs3-cgi/pkg-plist
new file mode 100644
index 000000000000..d601df00caac
--- /dev/null
+++ b/filesystems/moosefs3-cgi/pkg-plist
@@ -0,0 +1,8 @@
+share/mfscgi/mfs.cgi
+share/mfscgi/mfs.css
+share/mfscgi/logomini.png
+share/mfscgi/index.html
+share/mfscgi/err.gif
+share/mfscgi/chart.cgi
+share/mfscgi/favicon.ico
+share/mfscgi/acidtab.js
diff --git a/filesystems/moosefs3-cgiserv/Makefile b/filesystems/moosefs3-cgiserv/Makefile
new file mode 100644
index 000000000000..3b34f14aa4a4
--- /dev/null
+++ b/filesystems/moosefs3-cgiserv/Makefile
@@ -0,0 +1,10 @@
+PORTREVISION= 1
+PKGNAMESUFFIX= -cgiserv
+
+COMMENT= MooseFS CGI web server
+
+MFS_COMPONENT= cgiserv
+
+MASTERDIR= ${.CURDIR}/../moosefs3-master
+
+.include "${MASTERDIR}/Makefile"
diff --git a/filesystems/moosefs3-cgiserv/pkg-descr b/filesystems/moosefs3-cgiserv/pkg-descr
new file mode 100644
index 000000000000..521dda4d677c
--- /dev/null
+++ b/filesystems/moosefs3-cgiserv/pkg-descr
@@ -0,0 +1,7 @@
+MooseFS is a Fault tolerant, High Available, Highly Performing, Scale-Out,
+network distributed file system. It spreads data over several physical commodity
+servers, which are visible to the user as one resource.
+
+For standard file operations MooseFS acts like any other Unix-like file system.
+
+This port provides: Simple CGI-capable HTTP server to run MooseFS CGI monitor.
diff --git a/filesystems/moosefs3-cgiserv/pkg-plist b/filesystems/moosefs3-cgiserv/pkg-plist
new file mode 100644
index 000000000000..3f3ea8249528
--- /dev/null
+++ b/filesystems/moosefs3-cgiserv/pkg-plist
@@ -0,0 +1,5 @@
+sbin/mfscgiserv
+share/man/man8/mfscgiserv.8.gz
+@owner mfs
+@group mfs
+@dir %%MFS_WORKDIR%%/mfs
diff --git a/filesystems/moosefs3-chunkserver/Makefile b/filesystems/moosefs3-chunkserver/Makefile
new file mode 100644
index 000000000000..34b4fb34d732
--- /dev/null
+++ b/filesystems/moosefs3-chunkserver/Makefile
@@ -0,0 +1,10 @@
+PORTREVISION= 1
+PKGNAMESUFFIX= -chunkserver
+
+COMMENT= MooseFS data storage and synchronization component
+
+MFS_COMPONENT= chunkserver
+
+MASTERDIR= ${.CURDIR}/../moosefs3-master
+
+.include "${MASTERDIR}/Makefile"
diff --git a/filesystems/moosefs3-chunkserver/pkg-descr b/filesystems/moosefs3-chunkserver/pkg-descr
new file mode 100644
index 000000000000..49022d32fbbc
--- /dev/null
+++ b/filesystems/moosefs3-chunkserver/pkg-descr
@@ -0,0 +1,7 @@
+MooseFS is a Fault tolerant, High Available, Highly Performing, Scale-Out,
+network distributed file system. It spreads data over several physical commodity
+servers, which are visible to the user as one resource.
+
+For standard file operations MooseFS acts like any other Unix-like file system.
+
+This port provides: MooseFS data server.
diff --git a/filesystems/moosefs3-chunkserver/pkg-plist b/filesystems/moosefs3-chunkserver/pkg-plist
new file mode 100644
index 000000000000..c255b94a42bd
--- /dev/null
+++ b/filesystems/moosefs3-chunkserver/pkg-plist
@@ -0,0 +1,13 @@
+@sample etc/mfs/mfschunkserver.cfg.sample
+@sample etc/mfs/mfshdd.cfg.sample
+sbin/mfschunkserver
+sbin/mfschunktool
+sbin/mfscsstatsdump
+share/man/man5/mfschunkserver.cfg.5.gz
+share/man/man5/mfshdd.cfg.5.gz
+share/man/man8/mfschunkserver.8.gz
+share/man/man8/mfschunktool.8.gz
+share/man/man8/mfscsstatsdump.8.gz
+@owner mfs
+@group mfs
+@dir %%MFS_WORKDIR%%/mfs
diff --git a/filesystems/moosefs3-cli/Makefile b/filesystems/moosefs3-cli/Makefile
new file mode 100644
index 000000000000..ae2879d67725
--- /dev/null
+++ b/filesystems/moosefs3-cli/Makefile
@@ -0,0 +1,10 @@
+PORTREVISION= 1
+PKGNAMESUFFIX= -cli
+
+COMMENT= MooseFS command line interface
+
+MFS_COMPONENT= cli
+
+MASTERDIR= ${.CURDIR}/../moosefs3-master
+
+.include "${MASTERDIR}/Makefile"
diff --git a/filesystems/moosefs3-cli/pkg-descr b/filesystems/moosefs3-cli/pkg-descr
new file mode 100644
index 000000000000..9b4fd59436bf
--- /dev/null
+++ b/filesystems/moosefs3-cli/pkg-descr
@@ -0,0 +1,7 @@
+MooseFS is a Fault tolerant, High Available, Highly Performing, Scale-Out,
+network distributed file system. It spreads data over several physical commodity
+servers, which are visible to the user as one resource.
+
+For standard file operations MooseFS acts like any other Unix-like file system.
+
+This port provides: MooseFS CLI utilities.
diff --git a/filesystems/moosefs3-cli/pkg-plist b/filesystems/moosefs3-cli/pkg-plist
new file mode 100644
index 000000000000..b89b6b5ecf83
--- /dev/null
+++ b/filesystems/moosefs3-cli/pkg-plist
@@ -0,0 +1,2 @@
+bin/mfscli
+share/man/man1/mfscli.1.gz
diff --git a/filesystems/moosefs3-client/Makefile b/filesystems/moosefs3-client/Makefile
new file mode 100644
index 000000000000..90d9fc570de2
--- /dev/null
+++ b/filesystems/moosefs3-client/Makefile
@@ -0,0 +1,10 @@
+PORTREVISION= 1
+PKGNAMESUFFIX= -client
+
+COMMENT= MooseFS client tools
+
+MFS_COMPONENT= client
+
+MASTERDIR= ${.CURDIR}/../moosefs3-master
+
+.include "${MASTERDIR}/Makefile"
diff --git a/filesystems/moosefs3-client/pkg-descr b/filesystems/moosefs3-client/pkg-descr
new file mode 100644
index 000000000000..de72d7e2d737
--- /dev/null
+++ b/filesystems/moosefs3-client/pkg-descr
@@ -0,0 +1,7 @@
+MooseFS is a Fault tolerant, High Available, Highly Performing, Scale-Out,
+network distributed file system. It spreads data over several physical commodity
+servers, which are visible to the user as one resource.
+
+For standard file operations MooseFS acts like any other Unix-like file system.
+
+This port provides: MooseFS clients: mfsmount and mfstools.
diff --git a/filesystems/moosefs3-client/pkg-plist b/filesystems/moosefs3-client/pkg-plist
new file mode 100644
index 000000000000..2dc2199c4f06
--- /dev/null
+++ b/filesystems/moosefs3-client/pkg-plist
@@ -0,0 +1,88 @@
+@sample etc/mfs/mfsmount.cfg.sample
+bin/mfsmount
+bin/mfsappendchunks
+bin/mfscheckfile
+bin/mfsdirinfo
+bin/mfsfileinfo
+bin/mfsfilerepair
+bin/mfsmakesnapshot
+bin/mfsrmsnapshot
+bin/mfsgetgoal
+bin/mfssetgoal
+bin/mfscopygoal
+bin/mfsrgetgoal
+bin/mfsrsetgoal
+bin/mfsgetsclass
+bin/mfssetsclass
+bin/mfscopysclass
+bin/mfsxchgsclass
+bin/mfslistsclass
+bin/mfsgettrashtime
+bin/mfssettrashtime
+bin/mfscopytrashtime
+bin/mfsrgettrashtime
+bin/mfsrsettrashtime
+bin/mfsgeteattr
+bin/mfsseteattr
+bin/mfsdeleattr
+bin/mfscopyeattr
+bin/mfsgetquota
+bin/mfssetquota
+bin/mfsdelquota
+bin/mfscopyquota
+bin/mfschkarchive
+bin/mfsclrarchive
+bin/mfssetarchive
+bin/mfsfilepaths
+bin/mfsscadmin
+bin/mfstools
+include/mfsio.h
+lib/libmfsio.a
+lib/libmfsio.so
+lib/libmfsio.so.1
+lib/libmfsio.so.1.0.0
+share/man/man1/mfsappendchunks.1.gz
+share/man/man1/mfscheckfile.1.gz
+share/man/man1/mfsdirinfo.1.gz
+share/man/man1/mfsfileinfo.1.gz
+share/man/man1/mfsfilerepair.1.gz
+share/man/man1/mfsmakesnapshot.1.gz
+share/man/man1/mfsrmsnapshot.1.gz
+share/man/man1/mfsgetgoal.1.gz
+share/man/man1/mfssetgoal.1.gz
+share/man/man1/mfscopygoal.1.gz
+share/man/man1/mfsrgetgoal.1.gz
+share/man/man1/mfsrsetgoal.1.gz
+share/man/man1/mfsgetsclass.1.gz
+share/man/man1/mfssetsclass.1.gz
+share/man/man1/mfscopysclass.1.gz
+share/man/man1/mfsxchgsclass.1.gz
+share/man/man1/mfslistsclass.1.gz
+share/man/man1/mfsgettrashtime.1.gz
+share/man/man1/mfssettrashtime.1.gz
+share/man/man1/mfscopytrashtime.1.gz
+share/man/man1/mfsrgettrashtime.1.gz
+share/man/man1/mfsrsettrashtime.1.gz
+share/man/man1/mfsgeteattr.1.gz
+share/man/man1/mfsseteattr.1.gz
+share/man/man1/mfsdeleattr.1.gz
+share/man/man1/mfscopyeattr.1.gz
+share/man/man1/mfsgetquota.1.gz
+share/man/man1/mfssetquota.1.gz
+share/man/man1/mfsdelquota.1.gz
+share/man/man1/mfscopyquota.1.gz
+share/man/man1/mfschkarchive.1.gz
+share/man/man1/mfsclrarchive.1.gz
+share/man/man1/mfssetarchive.1.gz
+share/man/man1/mfsfilepaths.1.gz
+share/man/man1/mfsgoal.1.gz
+share/man/man1/mfstrashtime.1.gz
+share/man/man1/mfseattr.1.gz
+share/man/man1/mfsquota.1.gz
+share/man/man1/mfsarchive.1.gz
+share/man/man1/mfssnapshots.1.gz
+share/man/man1/mfsdiagtools.1.gz
+share/man/man1/mfssclass.1.gz
+share/man/man1/mfsscadmin.1.gz
+share/man/man1/mfstools.1.gz
+share/man/man8/mfsmount.8.gz
diff --git a/filesystems/moosefs3-master/Makefile b/filesystems/moosefs3-master/Makefile
new file mode 100644
index 000000000000..603cdeffcbe9
--- /dev/null
+++ b/filesystems/moosefs3-master/Makefile
@@ -0,0 +1,111 @@
+PORTNAME= moosefs3
+DISTVERSION= 3.0.117
+DISTVERSIONSUFFIX= 1
+PORTREVISION= 1
+CATEGORIES= filesystems sysutils
+MASTER_SITES= http://ppa.moosefs.com/src/
+PKGNAMESUFFIX?= -master
+DISTNAME= moosefs-${DISTVERSION}-${DISTVERSIONSUFFIX}
+
+MAINTAINER= freebsd@moosefs.com
+COMMENT?= Fault-tolerant distributed filesystem
+WWW= https://moosefs.com/
+
+LICENSE= GPLv2
+
+USES= python:build
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+WRKSRC= ${WRKDIR}/moosefs-${PORTVERSION}
+PLIST= ${.CURDIR}/pkg-plist
+DESCR= ${.CURDIR}/pkg-descr
+
+MFS_COMPONENT?= master
+MFS_USER= mfs
+MFS_GROUP= mfs
+MFS_WORKDIR= /var
+
+USERS= ${MFS_USER}
+GROUPS= ${MFS_GROUP}
+
+CONFIGURE_ARGS+= --localstatedir=${MFS_WORKDIR} \
+ --with-default-user=${MFS_USER} \
+ --with-default-group=${MFS_GROUP}
+
+CONFLICTS= moosefs2-${MFS_COMPONENT}
+
+.if ${MFS_COMPONENT} == cgi
+MFS_CGIDIR= ${PREFIX}/share/mfscgi
+USES= python
+CONFIGURE_ARGS+= --enable-mfscgi \
+ --with-mfscgi-dir=${MFS_CGIDIR}
+.else
+CONFIGURE_ARGS+= --disable-mfscgi
+.endif
+
+.if ${MFS_COMPONENT} == cgiserv
+MFS_CGISERVDIR= ${PREFIX}/sbin
+USES= python
+USE_RC_SUBR= mfscgiserv
+SUB_FILES+= pkg-message-cgiserv
+PKGMESSAGE= ${WRKDIR}/pkg-message-cgiserv
+PLIST_SUB+= MFS_WORKDIR="${MFS_WORKDIR}"
+CONFIGURE_ARGS+= --enable-mfscgiserv \
+ --with-mfscgiserv-dir=${MFS_CGISERVDIR}
+RUN_DEPENDS= moosefs3-cgi>0:filesystems/moosefs3-cgi
+.else
+CONFIGURE_ARGS+= --disable-mfscgiserv
+.endif
+
+.if ${MFS_COMPONENT} == chunkserver
+USE_RC_SUBR= mfschunkserver
+SUB_FILES+= pkg-message-chunkserver
+PKGMESSAGE= ${WRKDIR}/pkg-message-chunkserver
+PLIST_SUB+= MFS_WORKDIR="${MFS_WORKDIR}"
+CONFIGURE_ARGS+= --enable-mfschunkserver
+.else
+CONFIGURE_ARGS+= --disable-mfschunkserver
+.endif
+
+.if ${MFS_COMPONENT} == cli
+USES= python
+CONFIGURE_ARGS+= --enable-mfscli
+.else
+CONFIGURE_ARGS+= --disable-mfscli
+.endif
+
+.if ${MFS_COMPONENT} == client
+USES= compiler:c11 fuse:3 libtool pkgconfig
+USE_LDCONFIG= yes
+CONFIGURE_ARGS+= --enable-mfsmount
+.else
+CONFIGURE_ARGS+= --disable-mfsmount
+.endif
+
+.if ${MFS_COMPONENT} == master
+USE_RC_SUBR= mfsmaster
+PLIST_SUB+= MFS_WORKDIR="${MFS_WORKDIR}"
+SUB_FILES+= pkg-message-master
+PKGMESSAGE= ${WRKDIR}/pkg-message-master
+CONFIGURE_ARGS+= --enable-mfsmaster
+.else
+CONFIGURE_ARGS+= --disable-mfsmaster
+.endif
+
+.if ${MFS_COMPONENT} == metalogger
+USE_RC_SUBR= mfsmetalogger
+SUB_FILES+= pkg-message-metalogger
+PKGMESSAGE= ${WRKDIR}/pkg-message-metalogger
+PLIST_SUB+= MFS_WORKDIR="${MFS_WORKDIR}"
+CONFIGURE_ARGS+= --enable-mfsmetalogger
+.else
+CONFIGURE_ARGS+= --disable-mfsmetalogger
+.endif
+
+.if ${MFS_COMPONENT} == netdump
+CONFIGURE_ARGS+= --enable-mfsnetdump
+.else
+CONFIGURE_ARGS+= --disable-mfsnetdump
+.endif
+
+.include <bsd.port.mk>
diff --git a/filesystems/moosefs3-master/distinfo b/filesystems/moosefs3-master/distinfo
new file mode 100644
index 000000000000..a07f18a467bb
--- /dev/null
+++ b/filesystems/moosefs3-master/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1675457214
+SHA256 (moosefs-3.0.117-1.tar.gz) = d77947d0d8b699e2373926a1274ae81a9a8b24445c5ab986a1ec5e9203e3c3ba
+SIZE (moosefs-3.0.117-1.tar.gz) = 1249353
diff --git a/filesystems/moosefs3-master/files/mfscgiserv.in b/filesystems/moosefs3-master/files/mfscgiserv.in
new file mode 100644
index 000000000000..39f9f59ddb6d
--- /dev/null
+++ b/filesystems/moosefs3-master/files/mfscgiserv.in
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+# PROVIDE: mfscgiserv
+# REQUIRE: DAEMON
+# KEYWORD: shutdown
+#
+# Add the following lines to /etc/rc.conf to enable mfscgiserv:
+#
+# mfscgiserv_enable="YES"
+#
+
+. /etc/rc.subr
+
+name=mfscgiserv
+rcvar=mfscgiserv_enable
+
+command=%%PREFIX%%/sbin/${name}
+pid_file=%%MFS_WORKDIR%%/mfs/.${name}.lock
+procname="python"
+
+stop_cmd="$command stop"
+status_cmd="$command test"
+
+load_rc_config $name
+
+# set defaults
+: ${mfscgiserv_enable="NO"}
+
+run_rc_command "$1"
diff --git a/filesystems/moosefs3-master/files/mfschunkserver.in b/filesystems/moosefs3-master/files/mfschunkserver.in
new file mode 100644
index 000000000000..3083fe91b543
--- /dev/null
+++ b/filesystems/moosefs3-master/files/mfschunkserver.in
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+# PROVIDE: mfschunkserver
+# REQUIRE: DAEMON
+# KEYWORD: shutdown
+#
+# Add the following lines to /etc/rc.conf.local or /etc/rc.conf to enable mfschunkserver:
+#
+# mfschunkserver_enable="YES"
+#
+
+. /etc/rc.subr
+
+name=mfschunkserver
+rcvar=mfschunkserver_enable
+
+config_file=%%PREFIX%%/etc/mfs/${name}.cfg
+
+required_files=${config_file}
+
+command=%%PREFIX%%/sbin/${name}
+pid_file=%%MFS_WORKDIR%%/mfs/.${name}.lock
+command_args="-c $config_file"
+
+load_rc_config $name
+
+# set defaults
+: ${mfschunkserver_enable="NO"}
+
+run_rc_command "$1"
diff --git a/filesystems/moosefs3-master/files/mfsmaster.in b/filesystems/moosefs3-master/files/mfsmaster.in
new file mode 100644
index 000000000000..74056169626f
--- /dev/null
+++ b/filesystems/moosefs3-master/files/mfsmaster.in
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+# PROVIDE: mfsmaster
+# REQUIRE: DAEMON
+# KEYWORD: nostart shutdown
+# BEFORE: mountlate
+#
+# Add the following lines to /etc/rc.conf to enable mfsmaster:
+#
+# mfsmaster_enable="YES"
+#
+
+. /etc/rc.subr
+
+name=mfsmaster
+rcvar=mfsmaster_enable
+
+config_file=%%PREFIX%%/etc/mfs/${name}.cfg
+
+required_files=${config_file}
+
+command=%%PREFIX%%/sbin/${name}
+pid_file=%%MFS_WORKDIR%%/mfs/.${name}.lock
+command_args="-c $config_file"
+
+load_rc_config $name
+
+# set defaults
+: ${mfsmaster_enable="NO"}
+
+run_rc_command "$1"
diff --git a/filesystems/moosefs3-master/files/mfsmetalogger.in b/filesystems/moosefs3-master/files/mfsmetalogger.in
new file mode 100644
index 000000000000..994a1a69f4ec
--- /dev/null
+++ b/filesystems/moosefs3-master/files/mfsmetalogger.in
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+# PROVIDE: mfsmetalogger
+# REQUIRE: DAEMON
+# KEYWORD: shutdown
+#
+# Add the following lines to /etc/rc.conf to enable mfsmetalogger:
+#
+# mfsmetalogger_enable="YES"
+#
+
+. /etc/rc.subr
+
+name=mfsmetalogger
+rcvar=mfsmetalogger_enable
+
+config_file=%%PREFIX%%/etc/mfs/${name}.cfg
+
+required_files=${config_file}
+
+command=%%PREFIX%%/sbin/${name}
+pid_file=%%MFS_WORKDIR%%/mfs/.${name}.lock
+command_args="-c $config_file"
+
+load_rc_config $name
+
+# set defaults
+: ${mfsmetalogger_enable="NO"}
+
+run_rc_command "$1"
diff --git a/filesystems/moosefs3-master/files/pkg-message-cgiserv.in b/filesystems/moosefs3-master/files/pkg-message-cgiserv.in
new file mode 100644
index 000000000000..b93e90eb8847
--- /dev/null
+++ b/filesystems/moosefs3-master/files/pkg-message-cgiserv.in
@@ -0,0 +1,14 @@
+[
+{ type: install
+ message: <<EOM
+A startup script has been installed as:
+
+%%PREFIX%%/etc/rc.d/mfscgiserv
+
+Use it to start/stop the mfscgiserv service after you have added
+the following line to your rc.conf file:
+
+mfscgiserv_enable="YES"
+EOM
+}
+]
diff --git a/filesystems/moosefs3-master/files/pkg-message-chunkserver.in b/filesystems/moosefs3-master/files/pkg-message-chunkserver.in
new file mode 100644
index 000000000000..5ad0ee1a4388
--- /dev/null
+++ b/filesystems/moosefs3-master/files/pkg-message-chunkserver.in
@@ -0,0 +1,14 @@
+[
+{ type: install
+ message: <<EOM
+A startup script has been installed as:
+
+%%PREFIX%%/etc/rc.d/mfschunkserver
+
+Use it to start/stop the mfschunkserver service after you have added
+the following line to your rc.conf file:
+
+mfschunkserver_enable="YES"
+EOM
+}
+]
diff --git a/filesystems/moosefs3-master/files/pkg-message-master.in b/filesystems/moosefs3-master/files/pkg-message-master.in
new file mode 100644
index 000000000000..748bcc9eee7a
--- /dev/null
+++ b/filesystems/moosefs3-master/files/pkg-message-master.in
@@ -0,0 +1,14 @@
+[
+{ type: install
+ message: <<EOM
+A startup script has been installed as:
+
+%%PREFIX%%/etc/rc.d/mfsmaster
+
+Use it to start/stop the mfsmaster service after you have added
+the following line to your rc.conf file:
+
+mfsmaster_enable="YES"
+EOM
+}
+]
diff --git a/filesystems/moosefs3-master/files/pkg-message-metalogger.in b/filesystems/moosefs3-master/files/pkg-message-metalogger.in
new file mode 100644
index 000000000000..0a294c00bc0c
--- /dev/null
+++ b/filesystems/moosefs3-master/files/pkg-message-metalogger.in
@@ -0,0 +1,14 @@
+[
+{ type: install
+ message: <<EOM
+A startup script has been installed as:
+
+%%PREFIX%%/etc/rc.d/mfsmetalogger
+
+Use it to start/stop the mfsmetalogger service after you have added
+the following line to your rc.conf file:
+
+mfsmetalogger_enable="YES"
+EOM
+}
+]
diff --git a/filesystems/moosefs3-master/pkg-descr b/filesystems/moosefs3-master/pkg-descr
new file mode 100644
index 000000000000..5a93d68ac286
--- /dev/null
+++ b/filesystems/moosefs3-master/pkg-descr
@@ -0,0 +1,7 @@
+MooseFS is a Fault tolerant, High Available, Highly Performing, Scale-Out,
+network distributed file system. It spreads data over several physical commodity
+servers, which are visible to the user as one resource.
+
+For standard file operations MooseFS acts like any other Unix-like file system.
+
+This port provides: MooseFS master (metadata) server.
diff --git a/filesystems/moosefs3-master/pkg-plist b/filesystems/moosefs3-master/pkg-plist
new file mode 100644
index 000000000000..f144525c0af2
--- /dev/null
+++ b/filesystems/moosefs3-master/pkg-plist
@@ -0,0 +1,20 @@
+@sample etc/mfs/mfsmaster.cfg.sample
+@sample etc/mfs/mfsexports.cfg.sample
+@sample etc/mfs/mfstopology.cfg.sample
+sbin/mfsmaster
+sbin/mfsmetadump
+sbin/mfsmetadirinfo
+sbin/mfsmetarestore
+sbin/mfsstatsdump
+share/man/man5/mfsexports.cfg.5.gz
+share/man/man5/mfsmaster.cfg.5.gz
+share/man/man5/mfstopology.cfg.5.gz
+share/man/man8/mfsmaster.8.gz
+share/man/man8/mfsmetarestore.8.gz
+share/man/man8/mfsmetadump.8.gz
+share/man/man8/mfsmetadirinfo.8.gz
+share/man/man8/mfsstatsdump.8.gz
+@owner mfs
+@group mfs
+@dir %%MFS_WORKDIR%%/mfs
+%%MFS_WORKDIR%%/mfs/metadata.mfs.empty
diff --git a/filesystems/moosefs3-metalogger/Makefile b/filesystems/moosefs3-metalogger/Makefile
new file mode 100644
index 000000000000..086c97898f87
--- /dev/null
+++ b/filesystems/moosefs3-metalogger/Makefile
@@ -0,0 +1,10 @@
+PORTREVISION= 1
+PKGNAMESUFFIX= -metalogger
+
+COMMENT= MooseFS metadata backup server
+
+MFS_COMPONENT= metalogger
+
+MASTERDIR= ${.CURDIR}/../moosefs3-master
+
+.include "${MASTERDIR}/Makefile"
diff --git a/filesystems/moosefs3-metalogger/pkg-descr b/filesystems/moosefs3-metalogger/pkg-descr
new file mode 100644
index 000000000000..02e050e7169b
--- /dev/null
+++ b/filesystems/moosefs3-metalogger/pkg-descr
@@ -0,0 +1,7 @@
+MooseFS is a Fault tolerant, High Available, Highly Performing, Scale-Out,
+network distributed file system. It spreads data over several physical commodity
+servers, which are visible to the user as one resource.
+
+For standard file operations MooseFS acts like any other Unix-like file system.
+
+This port provides: MooseFS metalogger (metadata replication) server.
diff --git a/filesystems/moosefs3-metalogger/pkg-plist b/filesystems/moosefs3-metalogger/pkg-plist
new file mode 100644
index 000000000000..c27833ff6e37
--- /dev/null
+++ b/filesystems/moosefs3-metalogger/pkg-plist
@@ -0,0 +1,7 @@
+@sample etc/mfs/mfsmetalogger.cfg.sample
+sbin/mfsmetalogger
+share/man/man5/mfsmetalogger.cfg.5.gz
+share/man/man8/mfsmetalogger.8.gz
+@owner mfs
+@group mfs
+@dir %%MFS_WORKDIR%%/mfs
diff --git a/filesystems/moosefs3-netdump/Makefile b/filesystems/moosefs3-netdump/Makefile
new file mode 100644
index 000000000000..7e51b535aa18
--- /dev/null
+++ b/filesystems/moosefs3-netdump/Makefile
@@ -0,0 +1,10 @@
+PORTREVISION= 1
+PKGNAMESUFFIX= -netdump
+
+COMMENT= MooseFS network packet dump utility
+
+MFS_COMPONENT= netdump
+
+MASTERDIR= ${.CURDIR}/../moosefs3-master
+
+.include "${MASTERDIR}/Makefile"
diff --git a/filesystems/moosefs3-netdump/pkg-descr b/filesystems/moosefs3-netdump/pkg-descr
new file mode 100644
index 000000000000..6691c4931b69
--- /dev/null
+++ b/filesystems/moosefs3-netdump/pkg-descr
@@ -0,0 +1,7 @@
+MooseFS is a Fault tolerant, High Available, Highly Performing, Scale-Out,
+network distributed file system. It spreads data over several physical commodity
+servers, which are visible to the user as one resource.
+
+For standard file operations MooseFS acts like any other Unix-like file system.
+
+This port provides: MooseFS network packet dump utility
diff --git a/filesystems/moosefs3-netdump/pkg-plist b/filesystems/moosefs3-netdump/pkg-plist
new file mode 100644
index 000000000000..d9fe247254f3
--- /dev/null
+++ b/filesystems/moosefs3-netdump/pkg-plist
@@ -0,0 +1,2 @@
+sbin/mfsnetdump
+share/man/man8/mfsnetdump.8.gz
diff --git a/filesystems/mp3fs/Makefile b/filesystems/mp3fs/Makefile
new file mode 100644
index 000000000000..8f5249983c00
--- /dev/null
+++ b/filesystems/mp3fs/Makefile
@@ -0,0 +1,27 @@
+PORTNAME= mp3fs
+PORTVERSION= 1.1.1
+PORTEPOCH= 1
+CATEGORIES= filesystems audio
+MASTER_SITES= https://github.com/khenriks/${PORTNAME}/releases/download/v${PORTVERSION}/
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= stefan.rumetshofer@drei.at
+COMMENT= FUSE-based filesystem for transcoding FLAC to MP3 on the fly
+WWW= https://github.com/khenriks/mp3fs
+
+LICENSE= GPLv3+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+LIB_DEPENDS= libFLAC.so:audio/flac \
+ libid3tag.so:audio/libid3tag \
+ libmp3lame.so:audio/lame \
+ libvorbis.so:audio/libvorbis
+
+USES= fuse localbase pkgconfig
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+PLIST_FILES= bin/mp3fs \
+ share/man/man1/mp3fs.1.gz
+
+CFLAGS+= -D__XSI_VISIBLE
+.include <bsd.port.mk>
diff --git a/filesystems/mp3fs/distinfo b/filesystems/mp3fs/distinfo
new file mode 100644
index 000000000000..e5d4f1dc027f
--- /dev/null
+++ b/filesystems/mp3fs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1664396192
+SHA256 (mp3fs-1.1.1.tar.gz) = 942b588fb623ea58ce8cac8844e6ff2829ad4bc9b4c163bba58e3fa9ebc15608
+SIZE (mp3fs-1.1.1.tar.gz) = 804399
diff --git a/filesystems/mp3fs/pkg-descr b/filesystems/mp3fs/pkg-descr
new file mode 100644
index 000000000000..391cbd7593b3
--- /dev/null
+++ b/filesystems/mp3fs/pkg-descr
@@ -0,0 +1,8 @@
+MP3FS is a read-only FUSE filesystem which transcodes audio formats (currently
+FLAC) to MP3 on the fly when opened and read. This was written to enable me to
+use my FLAC collection with software and/or hardware which only understands
+the MP3 format e.g. gmediaserver to a Netgear MP101 MP3 player.
+
+It is also a novel alternative to traditional MP3 encoders. Just use your
+favorite file browser to select the files you want encoded and copy them
+somewhere!
diff --git a/filesystems/mtools/Makefile b/filesystems/mtools/Makefile
new file mode 100644
index 000000000000..33b2c796964c
--- /dev/null
+++ b/filesystems/mtools/Makefile
@@ -0,0 +1,58 @@
+PORTNAME= mtools
+PORTVERSION= 4.0.43
+PORTREVISION= 1
+CATEGORIES= filesystems emulators
+MASTER_SITES= GNU
+
+MAINTAINER= skreuzer@FreeBSD.org
+COMMENT= Tools for manipulating MS-DOS disks and images
+WWW= https://www.gnu.org/software/mtools/intro.html
+
+LICENSE= GPLv3
+
+CONFLICTS_INSTALL= multimarkdown
+
+USES= gmake makeinfo tar:lz
+GNU_CONFIGURE= yes
+CONFIGURE_ENV= ac_cv_header_malloc_h=no
+CONFIGURE_ARGS= --enable-xdf
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+
+SUB_FILES= pkg-message
+
+INFO= mtools
+
+OPTIONS_DEFINE= ICONV X11
+OPTIONS_DEFAULT=ICONV X11
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MICONV}
+USES+= iconv
+CPPFLAGS+= -I${LOCALBASE}/include
+LDFLAGS+= -L${LOCALBASE}/lib ${ICONV_LIB}
+LIB_DEPENDS+= libiconv.so:converters/libiconv
+.else
+CONFIGURE_ENV+= ac_cv_header_iconv_h=no
+.endif
+
+.if ${PORT_OPTIONS:MX11}
+USES+= xorg
+USE_XORG= x11 sm ice xau
+PLIST_SUB+= X11=""
+.else
+CONFIGURE_ARGS+= --without-x
+PLIST_SUB+= X11="@comment "
+MAKE_ENV+= WITHOUT_X11=yes
+.endif
+
+post-patch:
+ @${REINPLACE_CMD} -e '/LOCAL_CONF_FILE/s,/etc/default,${LOCALBASE}/etc,' \
+ ${WRKSRC}/mtoolsPaths.h
+ @${REINPLACE_CMD} -e 's|^\(SAMPLE FILE\)$$|#\1|' \
+ ${WRKSRC}/mtools.conf
+
+post-install:
+ ${INSTALL_DATA} ${WRKSRC}/mtools.conf ${STAGEDIR}${PREFIX}/etc/mtools.conf.sample
+
+.include <bsd.port.mk>
diff --git a/filesystems/mtools/distinfo b/filesystems/mtools/distinfo
new file mode 100644
index 000000000000..fdded9f52cc2
--- /dev/null
+++ b/filesystems/mtools/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1679438048
+SHA256 (mtools-4.0.43.tar.lz) = 997ffe4125a19de1fd433ed63f128f7d54bc1a5915f3cdb36da6491ef917f217
+SIZE (mtools-4.0.43.tar.lz) = 383347
diff --git a/filesystems/mtools/files/patch-Makefile.in b/filesystems/mtools/files/patch-Makefile.in
new file mode 100644
index 000000000000..1c9d84b0e764
--- /dev/null
+++ b/filesystems/mtools/files/patch-Makefile.in
@@ -0,0 +1,40 @@
+--- Makefile.in.orig 2022-10-09 09:55:19 UTC
++++ Makefile.in
+@@ -72,11 +72,14 @@ INSTALL_INFO = @INSTALL_INFO@
+ .SUFFIXES: .o .c
+ .SUFFIXES: .o .c
+
+-MAN1 = floppyd.1 floppyd_installtest.1 mattrib.1 mbadblocks.1 mcat.1 \
++MAN1 = mattrib.1 mbadblocks.1 mcat.1 \
+ mcd.1 mcopy.1 mdel.1 mdeltree.1 mdir.1 mdu.1 mformat.1 \
+ minfo.1 mkmanifest.1 mlabel.1 mmd.1 mmount.1 mmove.1 mpartition.1 \
+ mrd.1 mren.1 mshortname.1 mshowfat.1 mtoolstest.1 mtools.1 mtype.1 \
+ mzip.1
++ifndef WITHOUT_X11
++MAN1 += floppyd.1 floppyd_installtest.1
++endif
+
+ MAN1EXT = 1
+ MAN1DIR = $(DESTDIR)$(mandir)/man${MAN1EXT}
+@@ -119,7 +122,7 @@ privileges.c remap.c scsi_io.c scsi.c signal.c stream.
+ swap.c unix2dos.s unixdir.c tty.c vfat.c mkmanifest.c \
+ @FLOPPYD_IO_SRC@ @XDF_IO_SRC@
+
+-SCRIPTS = mcheck mxtar uz tgz mcomp amuFormat.sh
++SCRIPTS = mcheck mxtar mcomp amuFormat.sh
+
+ LINKS=mattrib mcat mcd mcopy mdel mdeltree mdir mdu \
+ mformat minfo mlabel mmd mmount mmove mpartition mrd mren mtype \
+@@ -264,11 +267,9 @@ install-links: $(DESTDIR)$(bindir)/mtools
+ install-scripts: $(DESTDIR)$(bindir)/mtools
+ @$(top_srcdir)/mkinstalldirs $(DESTDIR)$(bindir)
+ @for j in $(SCRIPTS) ; do \
+- $(INSTALL_PROGRAM) $(srcdir)/scripts/$$j $(DESTDIR)$(bindir)/$$j ; \
++ $(BSD_INSTALL_SCRIPT) $(srcdir)/scripts/$$j $(DESTDIR)$(bindir)/$$j ; \
+ echo $(DESTDIR)$(bindir)/$$j ; \
+ done
+- rm -f $(DESTDIR)$(bindir)/lz
+- cd $(DESTDIR)$(bindir) && $(LN_S) uz lz
+
+ install-man:
+ @$(top_srcdir)/mkinstalldirs $(MAN1DIR)
diff --git a/filesystems/mtools/files/patch-configure b/filesystems/mtools/files/patch-configure
new file mode 100644
index 000000000000..f7dc9e442ebd
--- /dev/null
+++ b/filesystems/mtools/files/patch-configure
@@ -0,0 +1,63 @@
+--- configure.orig 2020-11-28 11:54:35 UTC
++++ configure
+@@ -5696,10 +5696,10 @@ host_os3=`echo $host_os2 | sed 's/^\([^0-9]*\)[0-9]*$/
+ host_cpu1=`echo $host_cpu | sed 's/\./_/g'`
+ host_vendor1=`echo $host_vendor | sed 's/\./_/g'`
+ HOST_ID="-DCPU_$host_cpu1 -DVENDOR_$host_vendor1 -DOS_$host_os1"
+-if [ $host_os1 != $host_os2 ] ; then
++if [ "$host_os1" != "$host_os2" ] ; then
+ HOST_ID="$HOST_ID -DOS_$host_os2"
+ fi
+-if [ $host_os1 != $host_os3 ] && [ $host_os2 != $host_os3 ] ; then
++if [ "$host_os1" != "$host_os3" ] && [ "$host_os2" != "$host_os3" ] ; then
+ HOST_ID="$HOST_ID -DOS_$host_os3"
+ fi
+
+@@ -5725,39 +5725,39 @@ if [ "X$GCC" = "Xyes" ] ; then
+ esac
+ CFLAGS="$CFLAGS $Wall"
+ else
+- if [ $host_os3 = hpux ] ; then
++ if [ "$host_os3" = hpux ] ; then
+ CPPFLAGS="$CPPFLAGS -Ae"
+ fi
+
+- if [ $host_os3 = xenix ] ; then
++ if [ "$host_os3" = xenix ] ; then
+ CFLAGS="$CFLAGS -M2e"
+ fi
+ fi
+
+-if [ $host_os3 = hpux ] ; then
++if [ "$host_os3" = hpux ] ; then
+ LDFLAGS="$LDFLAGS -z"
+ fi
+
+-if [ $host_os3 = xenix ] ; then
++if [ "$host_os3" = xenix ] ; then
+ LDFLAGS="$LDFLAGS -M2e -i -f 5000"
+ fi
+
+-if [ $host_os2 = sysv4 ] ; then
++if [ "$host_os2" = sysv4 ] ; then
+ SHLIB="-lc -L/usr/ucblib -lucb"
+ else
+ SHLIB=""
+ fi
+
+-if [ $host_os3 = isc ] ; then
++if [ "$host_os3" = isc ] ; then
+ CFLAGS="$CFLAGS -D_SYSV3"
+ SHLIB="-lc_s"
+ fi
+
+-if [ $host_os3 = solaris -a x$newVold = xxyes ] ; then
++if [ "$host_os3" = solaris -a x$newVold = xxyes ] ; then
+ SHLIB="$SHLIB -s -lvolmgt"
+ fi
+
+-if [ $host_os3 = nextstep ] ; then
++if [ "$host_os3" = nextstep ] ; then
+ CFLAGS="$CFLAGS -DBSD"
+ SHLIB=""
+ fi
diff --git a/filesystems/mtools/files/patch-mtools.texi b/filesystems/mtools/files/patch-mtools.texi
new file mode 100644
index 000000000000..02360f495ddc
--- /dev/null
+++ b/filesystems/mtools/files/patch-mtools.texi
@@ -0,0 +1,11 @@
+--- mtools.texi.orig 2020-11-26 23:02:51 UTC
++++ mtools.texi
+@@ -39,7 +39,7 @@ mtools - utilities to access DOS disks in Unix.
+
+ @dircategory DOS
+ @direntry
+-* Mtools: (mtools). Mtools: utilities to access DOS disks in Unix.
++* Mtools: (mtools). Mtools: utilities to access DOS disks in Unix.
+ @end direntry
+
+
diff --git a/filesystems/mtools/files/patch-scsi.c b/filesystems/mtools/files/patch-scsi.c
new file mode 100644
index 000000000000..c0338b7ed945
--- /dev/null
+++ b/filesystems/mtools/files/patch-scsi.c
@@ -0,0 +1,29 @@
+--- scsi.c.orig 2018-12-02 16:23:26 UTC
++++ scsi.c
+@@ -62,7 +62,7 @@
+ #include <sys/scsicmd.h>
+ #endif
+
+-#if (defined(OS_freebsd)) && (__FreeBSD__ >= 2)
++#if (defined(OS_freebsd)) && (__FreeBSD__ >= 3)
+ #include <camlib.h>
+ #endif
+
+@@ -82,7 +82,7 @@ int scsi_max_length(void)
+ int scsi_open(const char *name, int flag UNUSEDP, int mode UNUSEDP,
+ void **extra_data UNUSEDP)
+ {
+-#if (defined(OS_freebsd)) && (__FreeBSD__ >= 2)
++#if (defined(OS_freebsd)) && (__FreeBSD__ >= 3)
+ struct cam_device *cam_dev;
+ cam_dev = cam_open_device(name, O_RDWR);
+ *extra_data = (void *) cam_dev;
+@@ -245,7 +245,7 @@ int scsi_cmd(int fd, unsigned char *cdb, int cmdlen, s
+ }
+
+ return 0;
+-#elif (defined OS_freebsd) && (__FreeBSD__ >= 2)
++#elif (defined OS_freebsd) && (__FreeBSD__ >= 3)
+ #define MSG_SIMPLE_Q_TAG 0x20 /* O/O */
+ union ccb *ccb;
+ int flags;
diff --git a/filesystems/mtools/files/pkg-message.in b/filesystems/mtools/files/pkg-message.in
new file mode 100644
index 000000000000..fb262add717d
--- /dev/null
+++ b/filesystems/mtools/files/pkg-message.in
@@ -0,0 +1,7 @@
+[
+{ type: install
+ message: <<EOM
+Please verify %%PREFIX%%/etc/mtools.conf for your machine.
+EOM
+}
+]
diff --git a/filesystems/mtools/pkg-descr b/filesystems/mtools/pkg-descr
new file mode 100644
index 000000000000..5ab285231a70
--- /dev/null
+++ b/filesystems/mtools/pkg-descr
@@ -0,0 +1,4 @@
+Mtools is a collection of utilities for accessing MS-DOS disks and file
+system images from Unix without mounting them. It supports Win95-style
+long file names, OS/2 XDF-formatted disks, ZIP/JAZ disks, and 2MB disks
+(store up to 1992kB on a high-density 3.5" diskette).
diff --git a/filesystems/mtools/pkg-plist b/filesystems/mtools/pkg-plist
new file mode 100644
index 000000000000..8fe66ac5cb9c
--- /dev/null
+++ b/filesystems/mtools/pkg-plist
@@ -0,0 +1,60 @@
+bin/amuFormat.sh
+%%X11%%bin/floppyd
+%%X11%%bin/floppyd_installtest
+bin/mattrib
+bin/mbadblocks
+bin/mcat
+bin/mcd
+bin/mcheck
+bin/mcomp
+bin/mcopy
+bin/mdel
+bin/mdeltree
+bin/mdir
+bin/mdu
+bin/mformat
+bin/minfo
+bin/mkmanifest
+bin/mlabel
+bin/mmd
+bin/mmount
+bin/mmove
+bin/mpartition
+bin/mrd
+bin/mren
+bin/mshowfat
+bin/mtools
+bin/mtoolstest
+bin/mtype
+bin/mxtar
+bin/mzip
+bin/mshortname
+%%X11%%share/man/man1/floppyd.1.gz
+%%X11%%share/man/man1/floppyd_installtest.1.gz
+share/man/man1/mattrib.1.gz
+share/man/man1/mbadblocks.1.gz
+share/man/man1/mcat.1.gz
+share/man/man1/mcd.1.gz
+share/man/man1/mcopy.1.gz
+share/man/man1/mdel.1.gz
+share/man/man1/mdeltree.1.gz
+share/man/man1/mdir.1.gz
+share/man/man1/mdu.1.gz
+share/man/man1/mformat.1.gz
+share/man/man1/minfo.1.gz
+share/man/man1/mkmanifest.1.gz
+share/man/man1/mlabel.1.gz
+share/man/man1/mmd.1.gz
+share/man/man1/mmount.1.gz
+share/man/man1/mmove.1.gz
+share/man/man1/mpartition.1.gz
+share/man/man1/mrd.1.gz
+share/man/man1/mren.1.gz
+share/man/man1/mshowfat.1.gz
+share/man/man1/mtools.1.gz
+share/man/man1/mtoolstest.1.gz
+share/man/man1/mtype.1.gz
+share/man/man1/mzip.1.gz
+share/man/man1/mshortname.1.gz
+share/man/man5/mtools.5.gz
+@sample etc/mtools.conf.sample
diff --git a/filesystems/mtpfs/Makefile b/filesystems/mtpfs/Makefile
new file mode 100644
index 000000000000..45280de5a66a
--- /dev/null
+++ b/filesystems/mtpfs/Makefile
@@ -0,0 +1,34 @@
+PORTNAME= mtpfs
+PORTVERSION= 1.1
+PORTREVISION= 5
+CATEGORIES= filesystems sysutils
+
+MAINTAINER= jhixson@FreeBSD.org
+COMMENT= MTP device filesystem
+WWW= https://www.adebenham.com/mtpfs/
+
+LICENSE= GPLv3
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+LIB_DEPENDS= libmtp.so:multimedia/libmtp \
+ libid3.so:audio/id3lib \
+ libid3tag.so:audio/libid3tag \
+ libmad.so:audio/libmad
+
+USES= autoreconf fuse gnome pkgconfig
+USE_GITHUB= yes
+GH_ACCOUNT= cjd
+GH_TAGNAME= fd3864dd6f0e8183fa2598d4cf890401d3a1e09a
+USE_GNOME= glib20
+
+GNU_CONFIGURE= yes
+
+PLIST_FILES= bin/mtpfs
+
+.include <bsd.port.options.mk>
+
+.if ${OPSYS} == FreeBSD
+CFLAGS+= -Wno-error=incompatible-function-pointer-types
+.endif
+
+.include <bsd.port.mk>
diff --git a/filesystems/mtpfs/distinfo b/filesystems/mtpfs/distinfo
new file mode 100644
index 000000000000..f5a1fe2cc047
--- /dev/null
+++ b/filesystems/mtpfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1593705811
+SHA256 (cjd-mtpfs-1.1-fd3864dd6f0e8183fa2598d4cf890401d3a1e09a_GH0.tar.gz) = f004136a82452d13362581277eb2496033aa13a6c3f35d0501327248f3120456
+SIZE (cjd-mtpfs-1.1-fd3864dd6f0e8183fa2598d4cf890401d3a1e09a_GH0.tar.gz) = 82022
diff --git a/filesystems/mtpfs/files/patch-Makefile.am b/filesystems/mtpfs/files/patch-Makefile.am
new file mode 100644
index 000000000000..88b3b171b057
--- /dev/null
+++ b/filesystems/mtpfs/files/patch-Makefile.am
@@ -0,0 +1,10 @@
+--- Makefile.am.orig 2020-07-02 17:25:56 UTC
++++ Makefile.am
+@@ -1,6 +1,6 @@
+ bin_PROGRAMS = mtpfs
+ mtpfs_SOURCES = mtpfs.c mtpfs.h
+-mtpfs_CPPFLAGS = -DFUSE_USE_VERSION=22 $(FUSE_CFLAGS) $(GLIB_CFLAGS) $(MTP_CFLAGS)
++mtpfs_CPPFLAGS = -DFUSE_USE_VERSION=26 $(FUSE_CFLAGS) $(GLIB_CFLAGS) $(MTP_CFLAGS)
+ mtpfs_LDADD = $(FUSE_LIBS) $(GLIB_LIBS) $(MTP_LIBS)
+
+ if USEMAD
diff --git a/filesystems/mtpfs/files/patch-Makefile.in b/filesystems/mtpfs/files/patch-Makefile.in
new file mode 100644
index 000000000000..81605bc20d6b
--- /dev/null
+++ b/filesystems/mtpfs/files/patch-Makefile.in
@@ -0,0 +1,11 @@
+--- Makefile.in.orig 2016-12-15 23:55:52 UTC
++++ Makefile.in
+@@ -287,7 +287,7 @@ top_build_prefix = @top_build_prefix@
+ top_builddir = @top_builddir@
+ top_srcdir = @top_srcdir@
+ mtpfs_SOURCES = mtpfs.c mtpfs.h $(am__append_1)
+-mtpfs_CPPFLAGS = -DFUSE_USE_VERSION=22 $(FUSE_CFLAGS) $(GLIB_CFLAGS) \
++mtpfs_CPPFLAGS = -DFUSE_USE_VERSION=26 $(FUSE_CFLAGS) $(GLIB_CFLAGS) \
+ $(MTP_CFLAGS) $(am__append_2)
+ mtpfs_LDADD = $(FUSE_LIBS) $(GLIB_LIBS) $(MTP_LIBS) $(am__append_3)
+ all: all-am
diff --git a/filesystems/mtpfs/files/patch-mtpfs.c b/filesystems/mtpfs/files/patch-mtpfs.c
new file mode 100644
index 000000000000..2c9be7d4cdb1
--- /dev/null
+++ b/filesystems/mtpfs/files/patch-mtpfs.c
@@ -0,0 +1,11 @@
+--- mtpfs.c.orig 2016-12-15 23:55:52 UTC
++++ mtpfs.c
+@@ -1774,7 +1774,7 @@ main (int argc, char *argv[])
+
+ DBG ("Start fuse");
+
+- fuse_stat = fuse_main (argc, argv, &mtpfs_oper);
++ fuse_stat = fuse_main (argc, argv, &mtpfs_oper, NULL);
+ DBG ("fuse_main returned %d\n", fuse_stat);
+ return fuse_stat;
+ }
diff --git a/filesystems/mtpfs/files/patch-mtpfs.h b/filesystems/mtpfs/files/patch-mtpfs.h
new file mode 100644
index 000000000000..92ca2ae91cda
--- /dev/null
+++ b/filesystems/mtpfs/files/patch-mtpfs.h
@@ -0,0 +1,11 @@
+--- mtpfs.h.orig 2016-12-15 23:55:52 UTC
++++ mtpfs.h
+@@ -17,7 +17,7 @@
+ #include <fcntl.h>
+ #include <dirent.h>
+ #include <errno.h>
+-#include <sys/statfs.h>
++#include <sys/mount.h>
+
+ #include <libmtp.h>
+ #include <glib.h>
diff --git a/filesystems/mtpfs/pkg-descr b/filesystems/mtpfs/pkg-descr
new file mode 100644
index 000000000000..95934af17d80
--- /dev/null
+++ b/filesystems/mtpfs/pkg-descr
@@ -0,0 +1,2 @@
+MTPFS is a FUSE filesystem that supports reading and writing from any
+MTP device (as supported by libmtp)
diff --git a/filesystems/nbt/Makefile b/filesystems/nbt/Makefile
new file mode 100644
index 000000000000..b7f9c57a61dc
--- /dev/null
+++ b/filesystems/nbt/Makefile
@@ -0,0 +1,44 @@
+PORTNAME= nbt
+PORTVERSION= ${REVISION_DATE}
+PORTREVISION= 1
+CATEGORIES= filesystems
+MASTER_SITES= SF/nbtfsutils
+PKGNAMEPREFIX= fusefs-
+DISTNAME= nbtfsutils-${REVISION_DATE}-${REVISION_HASH}-src
+
+MAINTAINER= msl0000023508@gmail.com
+COMMENT= Editing Named Binary Tag (NBT) as using a file system
+WWW= https://sourceforge.net/projects/nbtfsutils/
+
+LICENSE= BEERWARE MIT MPL20
+LICENSE_COMB= multi
+LICENSE_NAME_BEERWARE= "THE BEER-WARE LICENSE" (Revision 42)
+LICENSE_TEXT_BEERWARE= Lukas Niederbremer <webmaster@flippeh.de> and Clark Gaebel <cg.wowus.cg@gmail.com> \
+ wrote this file. As long as you retain this notice you can do whatever you \
+ want with this stuff. If we meet some day, and you think this stuff is worth \
+ it, you can buy us a beer in return.
+LICENSE_FILE_MPL20= ${WRKSRC}/MPL-2.0
+LICENSE_PERMS_BEERWARE= dist-mirror dist-sell pkg-mirror pkg-sell auto-accept
+
+USES= fuse tar:bz2
+USE_LDCONFIG= yes
+
+REVISION_DATE= 20231114
+REVISION_HASH= 7683255
+
+MAKE_ENV= MANDIR=\${PREFIX}/share/man
+INSTALL_TARGET= install-commands install-dev
+CFLAGS+= ${CPPFLAGS}
+CPPFLAGS+= -I ${LOCALBASE}/include
+LDFLAGS+= -L ${LOCALBASE}/lib
+NO_WRKSUBDIR= yes
+
+do-build:
+ @cd ${BUILD_WRKSRC} && ${DO_MAKE_BUILD} libnbt.so && ${DO_MAKE_BUILD} all
+
+post-install:
+.for l in lib/libnbt.so.1 bin/nbtdump bin/regiondump sbin/mkfs.nbt sbin/mount.nbt
+ ${STRIP_CMD} ${STAGEDIR}${PREFIX}/${l}
+.endfor
+
+.include <bsd.port.mk>
diff --git a/filesystems/nbt/distinfo b/filesystems/nbt/distinfo
new file mode 100644
index 000000000000..ea368f58e177
--- /dev/null
+++ b/filesystems/nbt/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1699967468
+SHA256 (nbtfsutils-20231114-7683255-src.tar.bz2) = 5d2db44859b39269c8b59188c99a04a9fc0932ef83634c06f37907aa09becd78
+SIZE (nbtfsutils-20231114-7683255-src.tar.bz2) = 44255
diff --git a/filesystems/nbt/pkg-descr b/filesystems/nbt/pkg-descr
new file mode 100644
index 000000000000..1060a6bd8392
--- /dev/null
+++ b/filesystems/nbt/pkg-descr
@@ -0,0 +1,11 @@
+Named Binary Tag (NBT) is a binary format designed for and used by the game
+Minecraft to store various data including worlds, player data and many other
+things. This project provides a way to access those data by simply mounting
+the corresponding data file as a file system, then reading and writing any
+value as usual file system nodes.
+
+NBT parser and writer are originally written by Lukas Niederbremer as cNBT
+project which this project is based on.
+
+This package provides the FUSE-based file system implementation, as well as
+NBT maintenance command-line tools and library (cNBT).
diff --git a/filesystems/nbt/pkg-plist b/filesystems/nbt/pkg-plist
new file mode 100644
index 000000000000..c94aa0406782
--- /dev/null
+++ b/filesystems/nbt/pkg-plist
@@ -0,0 +1,15 @@
+bin/nbtdump
+bin/regiondump
+sbin/mkfs.nbt
+sbin/mount.nbt
+share/man/man1/nbtdump.1.gz
+share/man/man1/regiondump.1.gz
+share/man/man8/mkfs.nbt.8.gz
+share/man/man8/mount.nbt.8.gz
+include/nbt/buffer.h
+include/nbt/list.h
+include/nbt/nbt.h
+include/nbt/version.h
+lib/libnbt.a
+lib/libnbt.so
+lib/libnbt.so.1
diff --git a/filesystems/ntfs-compression/Makefile b/filesystems/ntfs-compression/Makefile
new file mode 100644
index 000000000000..5932750c15e0
--- /dev/null
+++ b/filesystems/ntfs-compression/Makefile
@@ -0,0 +1,26 @@
+PORTNAME= ntfs-compression
+DISTVERSIONPREFIX= v
+DISTVERSION= 1.0
+CATEGORIES= filesystems
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= danfe@FreeBSD.org
+COMMENT= NTFS-3G plugin for reading XPRESS or LZX compressed files
+WWW= https://github.com/ebiggers/ntfs-3g-system-compression
+
+LICENSE= GPLv2+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+LIB_DEPENDS= libntfs-3g.so:filesystems/ntfs
+
+USES= autoreconf libtool pkgconfig
+GNU_CONFIGURE= yes
+INSTALL_TARGET= install-strip
+
+USE_GITHUB= yes
+GH_ACCOUNT= ebiggers
+GH_PROJECT= ntfs-3g-system-compression
+
+PLIST_FILES= lib/ntfs-3g/ntfs-plugin-80000017.so
+
+.include <bsd.port.mk>
diff --git a/filesystems/ntfs-compression/distinfo b/filesystems/ntfs-compression/distinfo
new file mode 100644
index 000000000000..fbc99b05fba6
--- /dev/null
+++ b/filesystems/ntfs-compression/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1517610042
+SHA256 (ebiggers-ntfs-3g-system-compression-v1.0_GH0.tar.gz) = bb003e1a9dbd4ed1217d157a548ea5b2ffdafd75c78ee8a2282c323a94686b2c
+SIZE (ebiggers-ntfs-3g-system-compression-v1.0_GH0.tar.gz) = 37513
diff --git a/filesystems/ntfs-compression/pkg-descr b/filesystems/ntfs-compression/pkg-descr
new file mode 100644
index 000000000000..603491ffe814
--- /dev/null
+++ b/filesystems/ntfs-compression/pkg-descr
@@ -0,0 +1,8 @@
+A plugin which enables the NTFS-3G FUSE driver to transparently read
+from system-compressed files.
+
+System compression, also known as "Compact OS", is a Windows feature
+that allows rarely modified files to be compressed using the XPRESS or
+LZX compression formats. It is implemented using reparse points. This
+feature appeared in Windows 10 and many Windows 10 systems have been
+using it by default.
diff --git a/filesystems/ntfs/Makefile b/filesystems/ntfs/Makefile
new file mode 100644
index 000000000000..2ff33fa98b38
--- /dev/null
+++ b/filesystems/ntfs/Makefile
@@ -0,0 +1,61 @@
+PORTNAME= ntfs
+PORTVERSION= 2022.10.3
+PORTREVISION= 1
+CATEGORIES= filesystems
+MASTER_SITES= https://download.tuxera.com/opensource/
+PKGNAMEPREFIX= fusefs-
+DISTNAME= ${PORTNAME}-3g_ntfsprogs-${PORTVERSION}
+
+MAINTAINER= freebsd@dussan.org
+COMMENT= Mount NTFS partitions (read/write) and disk images
+WWW= https://github.com/tuxera/ntfs-3g
+
+LICENSE= GPLv2+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+LIB_DEPENDS= libuuid.so:misc/e2fsprogs-libuuid
+
+USES= fuse pkgconfig iconv libtool localbase:ldflags tar:tgz
+USE_LDCONFIG= yes
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+CONFIGURE_ARGS= --exec-prefix=${PREFIX} --disable-mount-helper \
+ --disable-mtab --with-fuse=external --disable-ldconfig
+INSTALL_TARGET= install-strip
+
+OPTIONS_DEFINE= CRYPTO DOCS EXTRAS LOCK UBLIO
+OPTIONS_DEFAULT=EXTRAS LOCK UBLIO
+OPTIONS_SUB= yes
+
+CRYPTO_DESC= Enable crypto-related code and utilities
+CRYPTO_LIB_DEPENDS= libgcrypt.so:security/libgcrypt \
+ libgnutls.so:security/gnutls \
+ libgpg-error.so:security/libgpg-error
+CRYPTO_CONFIGURE_ON= --enable-crypto
+
+EXTRAS_DESC= Build and install extra NTFS utilities
+EXTRAS_CONFIGURE_ON= --enable-extras
+
+LOCK_DESC= Lock the device when mounting (avoids access)
+LOCK_CFLAGS= -DUSE_LOCK
+
+UBLIO_DESC= Enable user space cache for improved speed
+UBLIO_EXTRA_PATCHES= ${FILESDIR}/extra-patch-ublio
+UBLIO_LIB_DEPENDS= libublio.so:devel/libublio
+UBLIO_CFLAGS= -DUSE_UBLIO
+
+SUB_FILES= pkg-message
+DOCSDIR= ${PREFIX}/share/doc/ntfs-3g
+
+post-patch:
+ @${REINPLACE_CMD} -e 's|ENODATA|ENOATTR|' \
+ ${WRKSRC}/libntfs-3g/object_id.c \
+ ${WRKSRC}/libntfs-3g/reparse.c \
+ ${WRKSRC}/libntfs-3g/security.c
+ @${REINPLACE_CMD} -e '/$$(MAKE).*install-exec-hook/d' \
+ ${WRKSRC}/libntfs-3g/Makefile.in
+
+post-install-DOCS-on:
+ ${INSTALL_DATA} ${FILESDIR}/README.FreeBSD ${STAGEDIR}${DOCSDIR}/
+
+.include <bsd.port.mk>
diff --git a/filesystems/ntfs/distinfo b/filesystems/ntfs/distinfo
new file mode 100644
index 000000000000..51633f525273
--- /dev/null
+++ b/filesystems/ntfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1666281899
+SHA256 (ntfs-3g_ntfsprogs-2022.10.3.tgz) = f20e36ee68074b845e3629e6bced4706ad053804cbaf062fbae60738f854170c
+SIZE (ntfs-3g_ntfsprogs-2022.10.3.tgz) = 1324320
diff --git a/filesystems/ntfs/files/README.FreeBSD b/filesystems/ntfs/files/README.FreeBSD
new file mode 100644
index 000000000000..ffaedb7707c3
--- /dev/null
+++ b/filesystems/ntfs/files/README.FreeBSD
@@ -0,0 +1,126 @@
+==============================================================================
+NTFS-3G README for the FreeBSD port
+==============================================================================
+
+1. Introduction
+2. Port specific notes
+3. Mounting at startup with /etc/fstab
+4. Ublio configuration
+5. Known issues
+
+==============================================================================
+1. Introduction
+==============================================================================
+
+The NTFS-3G project provides a read/write filesystem driver for NTFS. It uses
+the FUSE library (an OS-independent library to create filesystem drivers) and
+FreeBSD fusefs(5) kernel module (port of the kernel-dependent part of FUSE).
+For more information see:
+
+NTFS-3G site: https://github.com/tuxera/ntfs-3g
+FUSE site: https://github.com/libfuse/libfuse
+
+==============================================================================
+2. Port specific notes
+==============================================================================
+
+The port has a patch to align read/write operations to the media block size
+(required on FreeBSD).
+
+The port has 2 options: LOCK (to prevent access to the device by external
+programs than NTFS-3G once mounted, default on Linux), and UBLIO (use a user
+space cache library, see devel/libublio, not required on Linux).
+
+The reason for using UBLIO is that FreeBSD removed support for block devices,
+being them now character devices. The former ones had a cache, and NTFS-3G was
+optimized for it (Linux still uses them). The same happens on Mac OS X (based
+on FreeBSD 5). So using UBLIO both improves performance (~10 times faster),
+and reduces disk load.
+
+==============================================================================
+3. Mounting at startup with /etc/fstab
+==============================================================================
+
+To mount at startup you need to have the following line in /boot/loader.conf:
+
+ fusefs_load="YES"
+
+or have "fusefs" added to the "kld_list" in the /etc/rc.conf.
+
+Then create the following symlink:
+
+$ ln -s `which ntfs-3g` /usr/sbin/mount_ntfs-3g
+
+And add the appropriate line to /etc/fstab: the filesystem should be "ntfs-3g"
+instead of "ntfs", and the additional "late" parameter is required. Example:
+
+/dev/ad4s1 /wxp ntfs-3g rw,late 0 0
+
+==============================================================================
+4. Ublio configuration
+==============================================================================
+
+The UBLIO layer is configured through environment variables, which are read
+when mounting the filesystem. The following are available:
+
+NTFS_USE_UBLIO - Enable the UBLIO cache.
+UBLIO_BLOCKSIZE - Actual reads/writes will be multiples of this quantity.
+UBLIO_ITEMS - Number of cache entries, each of UBLIO_BLOCKSIZE length.
+UBLIO_GRACE - Number of times a cache entry will refuse being recycled.
+UBLIO_SYNC_IO - If enabled, all writes will be immediately executed.
+
+To give an idea about tuning, here are the default values with some notes
+(they are only based on some simple benchmarks, and may be wrong):
+
+NTFS_USE_UBLIO - 1. Disabling it drastically decreases performance.
+UBLIO_BLOCKSIZE - 262144 (256KB). Larger improves reading/writing speed of
+ large files, and smaller makes filesystem operations
+ (creation, deletion, moving, find(1)) perform faster.
+ Try 2/4MB and 512/256KB for the different approaches. Note
+ that after that points performance decreases again.
+UBLIO_ITEMS - 64. Higher increases speed of filesystem operations. Try 128.
+UBLIO_GRACE - 32. Makes the cache items have more chances to be reused.
+UBLIO_SYNC_IO - 0. If enabled, highly decreases writing speed, but the data
+ is immediately written to the disk.
+
+For example (improves performance over large files, but read below):
+
+# env UBLIO_BLOCKSIZE=2097152 ntfs-3g /dev/ad0s1 /mnt
+
+Alternatively these variables could be set in the shell startup file. For
+example if you are using it in /etc/fstab add them to /etc/profile. If you use
+it as a user, instead, editing the shell startup in HOME is enough.
+
+Note that higher values for UBLIO_BLOCKSIZE and UBLIO_ITEMS increase the
+memory usage by their product in bytes. For example, if you set it to 1MB it
+would consume 64MB. To decrease it to 16MB you could set UBLIO_BLOCKSIZE to
+256KB (currently this is the default). Small values like 4096 can be used and
+also perform fine.
+
+It is also possible to enforce block aligned I/O on regular files by setting
+the FORCE_ALIGNED_IO variable (it will be set to 512 bytes), but this is only
+useful for testing purposes and in practice has no use.
+
+==============================================================================
+5. Known issues
+==============================================================================
+
+- For mkntfs(8) -F must be used to allow non-block device to be processed.
+
+- Current implementation does not properly work with partitions of size which
+is not a multiply of UBLIO_BLOCKSIZE (cannot read/write last cluster). For
+instance, you may not be able to create ntfs filesystem because of this with
+
+ Initializing device with zeroes: 99%Failed to complete writing to
+ /dev/ada0s1 after three retries.
+
+- When reading/writing the same file repeatedly while doing many simultaneous
+operations on different files sometimes the former one fails: read(2) returns
+-1 and sets errno to EAGAIN. This is because of a difference between the FUSE
+kernel implementation in Linux and FreeBSD, and is being worked on. An example
+scenario would be playing a song in XMMS, while building many ports, which
+could cause XMMS skip the song. Another observed problem is the current
+directory not being found, but entering again would work (Linux access is
+path-based while FreeBSD is vnode-based, which may be reused).
+
+==============================================================================
diff --git a/filesystems/ntfs/files/extra-patch-ublio b/filesystems/ntfs/files/extra-patch-ublio
new file mode 100644
index 000000000000..36f1bb32acc9
--- /dev/null
+++ b/filesystems/ntfs/files/extra-patch-ublio
@@ -0,0 +1,27 @@
+--- ./libntfs-3g/Makefile.in.orig 2012-08-29 19:51:35.000000000 -0500
++++ ./libntfs-3g/Makefile.in 2012-08-29 20:00:20.000000000 -0500
+@@ -251,6 +251,7 @@
+ @INSTALL_LIBRARY_FALSE@noinst_LTLIBRARIES = libntfs-3g.la
+ libntfs_3g_la_CFLAGS = $(AM_CFLAGS) -I$(top_srcdir)/include/ntfs-3g
+ libntfs_3g_la_LDFLAGS = -version-info $(LIBNTFS_3G_VERSION) -no-undefined
++libntfs_3g_la_LIBADD = -lublio
+ libntfs_3g_la_SOURCES = acls.c attrib.c attrlist.c bitmap.c bootsect.c \
+ cache.c collate.c compat.c compress.c debug.c device.c dir.c \
+ efs.c index.c inode.c lcnalloc.c logfile.c logging.c mft.c \
+--- src/ntfs-3g.c.orig 2011-04-10 20:04:41.000000000 +0200
++++ src/ntfs-3g.c 2011-04-25 18:56:07.000000000 +0200
+@@ -3262,9 +3262,13 @@
+ #else
+ .utime = ntfs_fuse_utime,
+ #endif
++#ifndef __FreeBSD__
++ .bmap = ntfs_fuse_bmap,
++#else
++ .bmap = NULL,
++#endif
+ .fsync = ntfs_fuse_fsync,
+ .fsyncdir = ntfs_fuse_fsync,
+- .bmap = ntfs_fuse_bmap,
+ .destroy = ntfs_fuse_destroy2,
+ #if !KERNELPERMS | (POSIXACLS & !KERNELACLS)
+ .access = ntfs_fuse_access,
diff --git a/filesystems/ntfs/files/patch-configure b/filesystems/ntfs/files/patch-configure
new file mode 100644
index 000000000000..cee7cc4a9090
--- /dev/null
+++ b/filesystems/ntfs/files/patch-configure
@@ -0,0 +1,30 @@
+--- configure.orig 2017-03-23 09:42:56 UTC
++++ configure
+@@ -12871,7 +12871,7 @@ $as_echo_n "checking fuse compatibility... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking fuse compatibility" >&5
+ $as_echo_n "checking fuse compatibility... " >&6; }
+ case "${target_os}" in
+- linux*|solaris*)
++ freebsd*|linux*|solaris*)
+
+ # Check whether --with-fuse was given.
+ if test "${with_fuse+set}" = set; then :
+@@ -12885,9 +12885,6 @@ fi
+ darwin*|netbsd*|kfreebsd*-gnu)
+ with_fuse="external"
+ ;;
+- freebsd*)
+- as_fn_error $? "Please see FreeBSD support at http://www.freshports.org/sysutils/fusefs-ntfs" "$LINENO" 5
+- ;;
+ *)
+ as_fn_error $? "ntfs-3g can be built for Linux, FreeBSD, Mac OS X, NetBSD, and Solaris only." "$LINENO" 5
+ ;;
+@@ -15177,7 +15174,7 @@ fi
+ fi
+
+ # Settings
+-pkgconfigdir="\$(libdir)/pkgconfig"
++pkgconfigdir="\$(prefix)/libdata/pkgconfig"
+ ntfs3gincludedir="\$(includedir)/ntfs-3g"
+ # Executables should be installed to the root filesystem, otherwise
+ # automounting NTFS volumes can fail during boot if the driver binaries
diff --git a/filesystems/ntfs/files/patch-libntfs-3g__unix_io.c b/filesystems/ntfs/files/patch-libntfs-3g__unix_io.c
new file mode 100644
index 000000000000..b3e4c3dad80a
--- /dev/null
+++ b/filesystems/ntfs/files/patch-libntfs-3g__unix_io.c
@@ -0,0 +1,623 @@
+--- libntfs-3g/unix_io.c.orig 2010-03-06 13:12:25.000000000 -0300
++++ libntfs-3g/unix_io.c 2010-10-04 15:17:18.000000000 -0300
+@@ -54,6 +54,22 @@
+ #include <linux/fd.h>
+ #endif
+
++/*
++ * The following build definitions are available:
++ * USE_ALIGNED_IO - All I/O is done by blocks.
++ * USE_UBLIO - Use the ublio user space cache library.
++ * USE_LOCK - Lock the device/file when mounted.
++ */
++
++#ifdef __FreeBSD__
++#include <sys/disk.h>
++#define USE_ALIGNED_IO 1
++#endif
++
++#if USE_UBLIO
++#include <sys/uio.h>
++#endif
++
+ #include "types.h"
+ #include "mst.h"
+ #include "debug.h"
+@@ -61,13 +77,90 @@
+ #include "logging.h"
+ #include "misc.h"
+
+-#define DEV_FD(dev) (*(int *)dev->d_private)
++#if USE_UBLIO
++#define UBLIO_USE_API 1
++#include "ublio.h"
++#define UBLIO_DEFAULT_ENABLE 1
++#define UBLIO_DEFAULT_BLOCKSIZE 262144
++#define UBLIO_DEFAULT_ITEMS 64
++#define UBLIO_DEFAULT_GRACE 32
++#define UBLIO_DEFAULT_SYNC_IO 0
++#endif
++
++#if USE_ALIGNED_IO
++#define RAW_IO_ALIGNED(dev, offset, count) \
++ (DEV_HANDLE(dev)->block_size == 0 || \
++ ((offset) % DEV_HANDLE(dev)->block_size == 0 && \
++ (count) % DEV_HANDLE(dev)->block_size == 0))
++#define RAW_IO_ALIGN(dev, offset) \
++ ((offset) / DEV_HANDLE(dev)->block_size * DEV_HANDLE(dev)->block_size)
++#define RAW_IO_MAX_SIZE (128 * 1024 * 1024)
++#endif
++
++struct unix_filehandle {
++ int fd;
++#if USE_ALIGNED_IO
++ s64 pos;
++ s32 block_size;
++ s64 media_size;
++#endif
++#if USE_UBLIO
++ ublio_filehandle_t ublio_fh;
++#endif
++};
++
++#define DEV_HANDLE(dev) ((struct unix_filehandle *)dev->d_private)
++#define DEV_FD(dev) (DEV_HANDLE(dev)->fd)
+
+ /* Define to nothing if not present on this system. */
+ #ifndef O_EXCL
+ # define O_EXCL 0
+ #endif
+
++#if USE_ALIGNED_IO
++/**
++ * Get block_size and media_size
++ */
++static int
++raw_io_get_size(struct ntfs_device *dev)
++{
++ int bs;
++ off_t ms;
++ struct stat sb;
++
++ if (fstat(DEV_FD(dev), &sb) < 0) {
++ ntfs_log_perror("Failed to stat '%s'", dev->d_name);
++ return -1;
++ }
++
++ if (S_ISREG(sb.st_mode)) {
++ DEV_HANDLE(dev)->media_size = sb.st_size;
++ ntfs_log_trace("%s: regular file (media_size %lld)\n",
++ dev->d_name, DEV_HANDLE(dev)->media_size);
++ if (getenv("FORCE_ALIGNED_IO"))
++ DEV_HANDLE(dev)->block_size = 512;
++ return 0;
++ }
++
++ if (ioctl(DEV_FD(dev), DIOCGSECTORSIZE, &bs) < 0) {
++ ntfs_log_perror("Failed to ioctl(DIOCGSECTORSIZE) '%s'",
++ dev->d_name);
++ return -1;
++ }
++ DEV_HANDLE(dev)->block_size = bs;
++ ntfs_log_trace("%s: block size %d\n", dev->d_name, bs);
++
++ if (ioctl(DEV_FD(dev), DIOCGMEDIASIZE, &ms) < 0) {
++ ntfs_log_perror("Failed to ioctl(DIOCGMEDIASIZE) '%s'",
++ dev->d_name);
++ return -1;
++ }
++ DEV_HANDLE(dev)->media_size = ms;
++ ntfs_log_trace("%s: media size %lld\n", dev->d_name, ms);
++ return 0;
++}
++#endif
++
+ /**
+ * fsync replacement which makes every effort to try to get the data down to
+ * disk, using different means for different operating systems. Specifically,
+@@ -113,9 +206,21 @@
+ */
+ static int ntfs_device_unix_io_open(struct ntfs_device *dev, int flags)
+ {
++#if USE_ALIGNED_IO
++ size_t sectsize;
++#endif
++#if USE_LOCK
+ struct flock flk;
++#endif
+ struct stat sbuf;
+- int err;
++ struct unix_filehandle *ufh;
++ int err = 0;
++ int is_special = 0;
++#if USE_UBLIO
++ struct ublio_param up;
++ int use_ublio = 0;
++ char *xenv, *xgarbage;
++#endif
+
+ if (NDevOpen(dev)) {
+ errno = EBUSY;
+@@ -125,20 +230,28 @@
+ ntfs_log_perror("Failed to access '%s'", dev->d_name);
+ return -1;
+ }
+- if (S_ISBLK(sbuf.st_mode))
+- NDevSetBlock(dev);
++ if (S_ISBLK(sbuf.st_mode) || S_ISCHR(sbuf.st_mode))
++ is_special = 1;
+
+- dev->d_private = ntfs_malloc(sizeof(int));
+- if (!dev->d_private)
++ ufh = ntfs_malloc(sizeof(*ufh));
++ if (!ufh)
+ return -1;
++ dev->d_private = ufh;
++#if USE_ALIGNED_IO
++ ufh->fd = -1;
++ ufh->pos = 0;
++ ufh->block_size = 0;
++ ufh->media_size = 0;
++#endif
++
+ /*
+ * Open file for exclusive access if mounting r/w.
+ * Fuseblk takes care about block devices.
+ */
+- if (!NDevBlock(dev) && (flags & O_RDWR) == O_RDWR)
++ if (!is_special && (flags & O_RDWR) == O_RDWR)
+ flags |= O_EXCL;
+- *(int*)dev->d_private = open(dev->d_name, flags);
+- if (*(int*)dev->d_private == -1) {
++ ufh->fd = open(dev->d_name, flags);
++ if (ufh->fd == -1) {
+ err = errno;
+ goto err_out;
+ }
+@@ -146,6 +259,37 @@
+ if ((flags & O_RDWR) != O_RDWR)
+ NDevSetReadOnly(dev);
+
++#if USE_UBLIO
++ ufh->ublio_fh = NULL;
++ if ((xenv = getenv("NTFS_USE_UBLIO")) &&
++ (xenv[0] == '0' || xenv[0] == '1') && xenv[1] == '\0')
++ use_ublio = (xenv[0] == '1');
++ else
++ use_ublio = UBLIO_DEFAULT_ENABLE;
++ if ((xenv = getenv("UBLIO_BLOCKSIZE")))
++ up.up_blocksize = strtoul(xenv, &xgarbage, 10);
++ if (!xenv || *xgarbage != '\0')
++ up.up_blocksize = UBLIO_DEFAULT_BLOCKSIZE;
++ if ((xenv = getenv("UBLIO_ITEMS")))
++ up.up_items = strtoul(xenv, &xgarbage, 10);
++ if (!xenv || *xgarbage != '\0')
++ up.up_items = UBLIO_DEFAULT_ITEMS;
++ if ((xenv = getenv("UBLIO_GRACE")))
++ up.up_grace = strtoul(xenv, &xgarbage, 10);
++ if (!xenv || *xgarbage != '\0')
++ up.up_grace = UBLIO_DEFAULT_GRACE;
++ if ((xenv = getenv("UBLIO_SYNC_IO")) &&
++ (xenv[0] == '0' || xenv[0] == '1') && xenv[1] == '\0')
++ up.up_sync_io = (xenv[0] == '1');
++ else
++ up.up_sync_io = UBLIO_DEFAULT_SYNC_IO;
++ up.up_priv = &ufh->fd;
++ up.up_pread = NULL;
++ up.up_preadv = NULL;
++ up.up_pwrite = NULL;
++ up.up_pwritev = NULL;
++#endif
++#if USE_LOCK
+ memset(&flk, 0, sizeof(flk));
+ if (NDevReadOnly(dev))
+ flk.l_type = F_RDLCK;
+@@ -153,7 +297,21 @@
+ flk.l_type = F_WRLCK;
+ flk.l_whence = SEEK_SET;
+ flk.l_start = flk.l_len = 0LL;
+- if (fcntl(DEV_FD(dev), F_SETLK, &flk)) {
++#endif
++#if USE_ALIGNED_IO
++ if (raw_io_get_size(dev) < 0) {
++ err = errno;
++ close(DEV_FD(dev));
++ goto err_out;
++ }
++ if (S_ISBLK(sbuf.st_mode) || S_ISCHR(sbuf.st_mode))
++ NDevSetBlock(dev);
++#else
++ if (S_ISBLK(sbuf.st_mode))
++ NDevSetBlock(dev);
++#endif /* USE_ALIGNED_IO */
++#if USE_LOCK
++ if (!NDevBlock(dev) && fcntl(DEV_FD(dev), F_SETLK, &flk)) {
+ err = errno;
+ ntfs_log_perror("Failed to %s lock '%s'", NDevReadOnly(dev) ?
+ "read" : "write", dev->d_name);
+@@ -161,7 +319,16 @@
+ ntfs_log_perror("Failed to close '%s'", dev->d_name);
+ goto err_out;
+ }
+-
++#endif
++#if USE_UBLIO
++ if (use_ublio) {
++ ufh->ublio_fh = ublio_open(&up);
++ if (!ufh->ublio_fh) {
++ close(DEV_FD(dev));
++ goto err_out;
++ }
++ }
++#endif
+ NDevSetOpen(dev);
+ return 0;
+ err_out:
+@@ -181,7 +348,10 @@
+ */
+ static int ntfs_device_unix_io_close(struct ntfs_device *dev)
+ {
++ /* XXX no error if fysnc, fcntl (ublio_close) fails? */
++#if USE_LOCK
+ struct flock flk;
++#endif
+
+ if (!NDevOpen(dev)) {
+ errno = EBADF;
+@@ -194,12 +364,18 @@
+ return -1;
+ }
+
++#if USE_LOCK
+ memset(&flk, 0, sizeof(flk));
+ flk.l_type = F_UNLCK;
+ flk.l_whence = SEEK_SET;
+ flk.l_start = flk.l_len = 0LL;
+- if (fcntl(DEV_FD(dev), F_SETLK, &flk))
++ if (!NDevBlock(dev) && fcntl(DEV_FD(dev), F_SETLK, &flk))
+ ntfs_log_perror("Could not unlock %s", dev->d_name);
++#endif
++#if USE_UBLIO
++ if (DEV_HANDLE(dev)->ublio_fh)
++ ublio_close(DEV_HANDLE(dev)->ublio_fh);
++#endif
+ if (close(DEV_FD(dev))) {
+ ntfs_log_perror("Failed to close device %s", dev->d_name);
+ return -1;
+@@ -223,9 +399,234 @@
+ static s64 ntfs_device_unix_io_seek(struct ntfs_device *dev, s64 offset,
+ int whence)
+ {
++#if USE_ALIGNED_IO
++ s64 abs_pos;
++
++ ntfs_log_trace("seek offset = 0x%llx, whence = %d.\n", offset, whence);
++ switch (whence) {
++ case SEEK_SET:
++ abs_pos = offset;
++ break;
++
++ case SEEK_CUR:
++ abs_pos = DEV_HANDLE(dev)->pos + offset;
++ break;
++
++ case SEEK_END:
++ abs_pos = DEV_HANDLE(dev)->media_size + offset;
++ break;
++
++ default:
++ ntfs_log_trace("Wrong mode %d.\n", whence);
++ errno = EINVAL;
++ return -1;
++ }
++
++ if (abs_pos < 0 || abs_pos > DEV_HANDLE(dev)->media_size) {
++ ntfs_log_trace("Seeking outsize seekable area.\n");
++ errno = EINVAL;
++ return -1;
++ }
++ DEV_HANDLE(dev)->pos = abs_pos;
++ return abs_pos;
++#else
+ return lseek(DEV_FD(dev), offset, whence);
++#endif
+ }
+
++#if USE_ALIGNED_IO
++
++#if USE_UBLIO
++#define pread_wrap(fd, buf, count, off) \
++ (DEV_HANDLE(fd)->ublio_fh ? \
++ ublio_pread(DEV_HANDLE(fd)->ublio_fh, buf, count, off) : \
++ pread(DEV_FD(fd), buf, count, off))
++#define pwrite_wrap(fd, buf, count, off) \
++ (DEV_HANDLE(fd)->ublio_fh ? \
++ ublio_pwrite(DEV_HANDLE(fd)->ublio_fh, buf, count, off) : \
++ pwrite(DEV_FD(fd), buf, count, off))
++#else
++#define pread_wrap(fd, buf, count, off) \
++ pread(DEV_FD(fd), buf, count, off)
++#define pwrite_wrap(fd, buf, count, off) \
++ pwrite(DEV_FD(fd), buf, count, off)
++#endif
++
++/**
++ * aligned_pread - Perform an aligned positioned read from the device
++ */
++static s64 aligned_pread(struct ntfs_device *dev, void *buf, s64 count, s64 offset)
++{
++ s64 start, start_aligned;
++ s64 end, end_aligned;
++ size_t count_aligned;
++ char *buf_aligned;
++ ssize_t nr;
++
++ /* short-circuit for regular files */
++ start = offset;
++ if (count > RAW_IO_MAX_SIZE)
++ count = RAW_IO_MAX_SIZE;
++ if (RAW_IO_ALIGNED(dev, start, count))
++ return pread_wrap(dev, buf, count, start);
++
++ /*
++ * +- start_aligned +- end_aligned
++ * | |
++ * | +- start +- end |
++ * v v v v
++ * |----------|----------|----------|
++ * ^ ^
++ * +----- count ------+
++ * ^ ^
++ * +-------- count_aligned ---------+
++ */
++ start_aligned = RAW_IO_ALIGN(dev, start);
++ end = start + count;
++ end_aligned = RAW_IO_ALIGN(dev, end) +
++ (RAW_IO_ALIGNED(dev, end, 0) ? 0 : DEV_HANDLE(dev)->block_size);
++ count_aligned = end_aligned - start_aligned;
++ ntfs_log_trace(
++ "%s: count = 0x%llx/0x%x, start = 0x%llx/0x%llx, end = 0x%llx/0x%llx\n",
++ dev->d_name, count, count_aligned,
++ start, start_aligned, end, end_aligned);
++
++ /* allocate buffer */
++ buf_aligned = ntfs_malloc(count_aligned);
++ if (buf_aligned == NULL) {
++ ntfs_log_trace("ntfs_malloc(%d) failed\n", count_aligned);
++ return -1;
++ }
++
++ /* read aligned data */
++ nr = pread_wrap(dev, buf_aligned, count_aligned, start_aligned);
++ if (nr == 0)
++ return 0;
++ if (nr < 0 || nr < start - start_aligned) {
++ free(buf_aligned);
++ return -1;
++ }
++
++ /* copy out */
++ memcpy(buf, buf_aligned + (start - start_aligned), count);
++ free(buf_aligned);
++
++ nr -= start - start_aligned;
++ if (nr > count)
++ nr = count;
++ return nr;
++}
++
++/**
++ * aligned_pwrite - Perform an aligned positioned write from the device
++ */
++static s64 aligned_pwrite(struct ntfs_device *dev, void *buf, s64 count, s64 offset)
++{
++ s64 start, start_aligned;
++ s64 end, end_aligned;
++ size_t count_aligned;
++ char *buf_aligned;
++ ssize_t nw;
++
++ if (NDevReadOnly(dev)) {
++ errno = EROFS;
++ return -1;
++ }
++ NDevSetDirty(dev);
++
++ /* short-circuit for regular files */
++ start = offset;
++ if (count > RAW_IO_MAX_SIZE)
++ count = RAW_IO_MAX_SIZE;
++ if (RAW_IO_ALIGNED(dev, start, count))
++ return pwrite_wrap(dev, buf, count, start);
++
++ /*
++ * +- start_aligned +- end_aligned
++ * | |
++ * | +- start +- end |
++ * v v v v
++ * |----------|----------|----------|
++ * ^ ^
++ * +----- count ------+
++ * ^ ^
++ * +-------- count_aligned ---------+
++ */
++ start_aligned = RAW_IO_ALIGN(dev, start);
++ end = start + count;
++ end_aligned = RAW_IO_ALIGN(dev, end) +
++ (RAW_IO_ALIGNED(dev, end, 0) ? 0 : DEV_HANDLE(dev)->block_size);
++ count_aligned = end_aligned - start_aligned;
++ ntfs_log_trace(
++ "%s: count = 0x%llx/0x%x, start = 0x%llx/0x%llx, end = 0x%llx/0x%llx\n",
++ dev->d_name, count, count_aligned,
++ start, start_aligned, end, end_aligned);
++
++ /* allocate buffer */
++ buf_aligned = ntfs_malloc(count_aligned);
++ if (buf_aligned == NULL) {
++ ntfs_log_trace("ntfs_malloc(%d) failed\n", count_aligned);
++ return -1;
++ }
++
++ /* read aligned lead-in */
++ if (pread_wrap(dev, buf_aligned, DEV_HANDLE(dev)->block_size, start_aligned) != DEV_HANDLE(dev)->block_size) {
++ ntfs_log_trace("read lead-in failed\n");
++ free(buf_aligned);
++ return -1;
++ }
++
++ /* read aligned lead-out */
++ if (end != end_aligned && count_aligned > DEV_HANDLE(dev)->block_size) {
++ if (pread_wrap(dev, buf_aligned + count_aligned - DEV_HANDLE(dev)->block_size, DEV_HANDLE(dev)->block_size, end_aligned - DEV_HANDLE(dev)->block_size) != DEV_HANDLE(dev)->block_size) {
++ ntfs_log_trace("read lead-out failed\n");
++ free(buf_aligned);
++ return -1;
++ }
++ }
++
++ /* copy data to write */
++ memcpy(buf_aligned + (start - start_aligned), buf, count);
++
++ /* write aligned data */
++ nw = pwrite_wrap(dev, buf_aligned, count_aligned, start_aligned);
++ free(buf_aligned);
++ if (nw < 0 || nw < start - start_aligned)
++ return -1;
++
++ nw -= start - start_aligned;
++ if (nw > count)
++ nw = count;
++ return nw;
++}
++
++/**
++ * aligned_read - Perform an aligned read from the device
++ */
++static s64 aligned_read(struct ntfs_device *dev, void *buf, s64 count)
++{
++ s64 nr = aligned_pread(dev, buf, count, DEV_HANDLE(dev)->pos);
++ if (nr > 0)
++ DEV_HANDLE(dev)->pos += nr;
++ return nr;
++}
++
++/**
++ * aligned_write - Perform an aligned read from the device
++ */
++static s64 aligned_write(struct ntfs_device *dev, void *buf, s64 count)
++{
++ s64 nw = aligned_pwrite(dev, buf, count, DEV_HANDLE(dev)->pos);
++ if (nw > 0)
++ DEV_HANDLE(dev)->pos += nw;
++ return nw;
++}
++
++#undef ublio_pwrite
++#undef ublio_pread
++
++#endif
++
+ /**
+ * ntfs_device_unix_io_read - Read from the device, from the current location
+ * @dev:
+@@ -239,6 +640,29 @@
+ static s64 ntfs_device_unix_io_read(struct ntfs_device *dev, void *buf,
+ s64 count)
+ {
++#if USE_ALIGNED_IO
++ return aligned_read(dev, buf, count);
++#elif USE_UBLIO
++ if (DEV_HANDLE(dev)->ublio_fh) {
++ off_t offset;
++ ssize_t res;
++
++ offset = lseek(DEV_FD(dev), 0, SEEK_CUR);
++ if (offset == -1)
++ return -1;
++
++ res = ublio_pread(DEV_HANDLE(dev)->ublio_fh, buf, count,
++ offset);
++ if (res == -1)
++ return -1;
++
++ if (lseek(DEV_FD(dev), res, SEEK_CUR) == -1)
++ return -1;
++
++ return res;
++ }
++#endif
++
+ return read(DEV_FD(dev), buf, count);
+ }
+
+@@ -260,6 +684,28 @@
+ return -1;
+ }
+ NDevSetDirty(dev);
++#if USE_ALIGNED_IO
++ return aligned_write(dev, buf, count);
++#elif USE_UBLIO
++ if (DEV_HANDLE(dev)->ublio_fh)
++ off_t offset;
++ ssize_t res;
++
++ offset = lseek(DEV_FD(dev), 0, SEEK_CUR);
++ if (offset == -1)
++ return -1;
++
++ res = ublio_pwrite(DEV_HANDLE(dev)->ublio_fh, (void *)buf,
++ count, offset);
++ if (res == -1)
++ return -1;
++
++ if (lseek(DEV_FD(dev), res, SEEK_CUR) == -1)
++ return -1;
++
++ return res;
++ }
++#endif
+ return write(DEV_FD(dev), buf, count);
+ }
+
+@@ -277,6 +723,13 @@
+ static s64 ntfs_device_unix_io_pread(struct ntfs_device *dev, void *buf,
+ s64 count, s64 offset)
+ {
++#if USE_ALIGNED_IO
++ return aligned_pread(dev, buf, count, offset);
++#elif USE_UBLIO
++ if (DEV_HANDLE(dev)->ublio_fh)
++ return ublio_pread(DEV_HANDLE(dev)->ublio_fh, buf, count,
++ offset);
++#endif
+ return pread(DEV_FD(dev), buf, count, offset);
+ }
+
+@@ -299,6 +752,13 @@
+ return -1;
+ }
+ NDevSetDirty(dev);
++#if USE_ALIGNED_IO
++ return aligned_pwrite(dev, buf, count, offset);
++#elif USE_UBLIO
++ if (DEV_HANDLE(dev)->ublio_fh)
++ return ublio_pwrite(DEV_HANDLE(dev)->ublio_fh, (void *)buf,
++ count, offset);
++#endif
+ return pwrite(DEV_FD(dev), buf, count, offset);
+ }
+
+@@ -315,7 +775,14 @@
+ int res = 0;
+
+ if (!NDevReadOnly(dev)) {
++#if USE_UBLIO
++ if (DEV_HANDLE(dev)->ublio_fh)
++ res = ublio_fsync(DEV_HANDLE(dev)->ublio_fh);
++ if (!DEV_HANDLE(dev)->ublio_fh || !res)
++ res = ntfs_fsync(DEV_FD(dev));
++#else
+ res = ntfs_fsync(DEV_FD(dev));
++#endif
+ if (res)
+ ntfs_log_perror("Failed to sync device %s", dev->d_name);
+ else
diff --git a/filesystems/ntfs/files/patch-ntfsprogs_mkntfs.c b/filesystems/ntfs/files/patch-ntfsprogs_mkntfs.c
new file mode 100644
index 000000000000..4338563b5e04
--- /dev/null
+++ b/filesystems/ntfs/files/patch-ntfsprogs_mkntfs.c
@@ -0,0 +1,18 @@
+--- ntfsprogs/mkntfs.c.orig 2015-03-14 14:10:12 UTC
++++ ntfsprogs/mkntfs.c
+@@ -3488,6 +3488,7 @@ static BOOL mkntfs_open_partition(ntfs_v
+ goto done;
+ }
+
++#ifndef __FreeBSD__
+ if (!S_ISBLK(sbuf.st_mode)) {
+ ntfs_log_error("%s is not a block device.\n", vol->dev->d_name);
+ if (!opts.force) {
+@@ -3526,6 +3527,7 @@ static BOOL mkntfs_open_partition(ntfs_v
+ ntfs_log_warning("mkntfs forced anyway.\n");
+ #endif
+ }
++#endif
+ /* Make sure the file system is not mounted. */
+ if (ntfs_check_if_mounted(vol->dev->d_name, &mnt_flags)) {
+ ntfs_log_perror("Failed to determine whether %s is mounted", vol->dev->d_name);
diff --git a/filesystems/ntfs/files/pkg-message.in b/filesystems/ntfs/files/pkg-message.in
new file mode 100644
index 000000000000..dad797469e8e
--- /dev/null
+++ b/filesystems/ntfs/files/pkg-message.in
@@ -0,0 +1,13 @@
+[
+{ type: install
+ message: <<EOM
+NTFS-3G has been installed. It requires fusefs(5) support to operate,
+so issue the ``kldload fusefs'' command or ``sysrc kld_list+=fusefs''
+to make it load automatically when the system starts.
+
+For further information, implementation details, and known issues see
+the FreeBSD README (%%DOCSDIR%%/README.FreeBSD) in
+addition to the official README (contains some Linux-specific parts).
+EOM
+}
+]
diff --git a/filesystems/ntfs/pkg-descr b/filesystems/ntfs/pkg-descr
new file mode 100644
index 000000000000..539b307f498c
--- /dev/null
+++ b/filesystems/ntfs/pkg-descr
@@ -0,0 +1,4 @@
+The ntfs-3g driver is an open-source, freely available read/write NTFS
+driver which provides safe and fast handling of the Windows NTFS file
+systems. Almost the full POSIX filesystem functionality is supported,
+the major exceptions are changing file ownership and the access rights.
diff --git a/filesystems/ntfs/pkg-plist b/filesystems/ntfs/pkg-plist
new file mode 100644
index 000000000000..93dcc52a90fd
--- /dev/null
+++ b/filesystems/ntfs/pkg-plist
@@ -0,0 +1,90 @@
+bin/lowntfs-3g
+bin/ntfs-3g
+bin/ntfs-3g.probe
+bin/ntfscat
+bin/ntfscluster
+bin/ntfscmp
+%%CRYPTO%%%%EXTRAS%%bin/ntfsdecrypt
+bin/ntfsfix
+bin/ntfsinfo
+bin/ntfsls
+%%EXTRAS%%bin/ntfsrecover
+%%EXTRAS%%bin/ntfssecaudit
+%%EXTRAS%%bin/ntfstruncate
+%%EXTRAS%%bin/ntfsusermap
+%%EXTRAS%%bin/ntfswipe
+include/ntfs-3g/acls.h
+include/ntfs-3g/attrib.h
+include/ntfs-3g/attrlist.h
+include/ntfs-3g/bitmap.h
+include/ntfs-3g/bootsect.h
+include/ntfs-3g/cache.h
+include/ntfs-3g/collate.h
+include/ntfs-3g/compat.h
+include/ntfs-3g/compress.h
+include/ntfs-3g/debug.h
+include/ntfs-3g/device.h
+include/ntfs-3g/device_io.h
+include/ntfs-3g/dir.h
+include/ntfs-3g/ea.h
+include/ntfs-3g/efs.h
+include/ntfs-3g/endians.h
+include/ntfs-3g/index.h
+include/ntfs-3g/inode.h
+include/ntfs-3g/ioctl.h
+include/ntfs-3g/layout.h
+include/ntfs-3g/lcnalloc.h
+include/ntfs-3g/logfile.h
+include/ntfs-3g/logging.h
+include/ntfs-3g/mft.h
+include/ntfs-3g/misc.h
+include/ntfs-3g/mst.h
+include/ntfs-3g/ntfstime.h
+include/ntfs-3g/object_id.h
+include/ntfs-3g/param.h
+include/ntfs-3g/plugin.h
+include/ntfs-3g/realpath.h
+include/ntfs-3g/reparse.h
+include/ntfs-3g/runlist.h
+include/ntfs-3g/security.h
+include/ntfs-3g/support.h
+include/ntfs-3g/types.h
+include/ntfs-3g/unistr.h
+include/ntfs-3g/volume.h
+include/ntfs-3g/xattrs.h
+lib/libntfs-3g.a
+lib/libntfs-3g.so
+lib/libntfs-3g.so.89
+lib/libntfs-3g.so.89.0.0
+libdata/pkgconfig/libntfs-3g.pc
+share/man/man8/mkntfs.8.gz
+share/man/man8/ntfs-3g.8.gz
+share/man/man8/ntfs-3g.probe.8.gz
+share/man/man8/ntfscat.8.gz
+share/man/man8/ntfsclone.8.gz
+share/man/man8/ntfscluster.8.gz
+share/man/man8/ntfscmp.8.gz
+share/man/man8/ntfscp.8.gz
+share/man/man8/ntfsdecrypt.8.gz
+share/man/man8/ntfsfallocate.8.gz
+share/man/man8/ntfsfix.8.gz
+share/man/man8/ntfsinfo.8.gz
+share/man/man8/ntfslabel.8.gz
+share/man/man8/ntfsls.8.gz
+share/man/man8/ntfsprogs.8.gz
+share/man/man8/ntfsrecover.8.gz
+share/man/man8/ntfsresize.8.gz
+share/man/man8/ntfssecaudit.8.gz
+share/man/man8/ntfstruncate.8.gz
+share/man/man8/ntfsundelete.8.gz
+share/man/man8/ntfsusermap.8.gz
+share/man/man8/ntfswipe.8.gz
+sbin/mkntfs
+sbin/ntfsclone
+sbin/ntfscp
+sbin/ntfslabel
+sbin/ntfsresize
+sbin/ntfsundelete
+%%PORTDOCS%%%%DOCSDIR%%/README
+%%PORTDOCS%%%%DOCSDIR%%/README.FreeBSD
+@dir lib/ntfs-3g
diff --git a/filesystems/ntfs2btrfs/Makefile b/filesystems/ntfs2btrfs/Makefile
new file mode 100644
index 000000000000..7bc3fb88d004
--- /dev/null
+++ b/filesystems/ntfs2btrfs/Makefile
@@ -0,0 +1,25 @@
+PORTNAME= ntfs2btrfs
+PORTVERSION= 20230501
+CATEGORIES= filesystems sysutils
+
+MAINTAINER= danfe@FreeBSD.org
+COMMENT= NTFS to Btrfs in-place conversion utility
+WWW= https://github.com/maharmstone/ntfs2btrfs
+
+LICENSE= GPLv2+
+
+BUILD_DEPENDS= ${LOCALBASE}/include/fmt/format.h:devel/libfmt
+LIB_DEPENDS= liblzo2.so:archivers/lzo2 libzstd.so:archivers/zstd
+
+USES= cmake pkgconfig
+USE_GITHUB= yes
+GH_ACCOUNT= maharmstone
+
+PLIST_FILES= sbin/${PORTNAME} share/man/man8/${PORTNAME}.8.gz
+
+post-patch:
+# One should not try to mmap(2) disk devices on FreeBSD, it won't work
+ @${REINPLACE_CMD} -e '3449s,WIN32,_${OPSYS}__,' \
+ ${WRKSRC}/src/ntfs2btrfs.cpp
+
+.include <bsd.port.mk>
diff --git a/filesystems/ntfs2btrfs/distinfo b/filesystems/ntfs2btrfs/distinfo
new file mode 100644
index 000000000000..e0ecb1e9b75e
--- /dev/null
+++ b/filesystems/ntfs2btrfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1682974776
+SHA256 (maharmstone-ntfs2btrfs-20230501_GH0.tar.gz) = 15924a22e9d80e4ca28bf5524708dd8f69d840df1e781a659ce953fee7d90730
+SIZE (maharmstone-ntfs2btrfs-20230501_GH0.tar.gz) = 98816
diff --git a/filesystems/ntfs2btrfs/files/patch-src_ntfs.cpp b/filesystems/ntfs2btrfs/files/patch-src_ntfs.cpp
new file mode 100644
index 000000000000..74817c12412f
--- /dev/null
+++ b/filesystems/ntfs2btrfs/files/patch-src_ntfs.cpp
@@ -0,0 +1,11 @@
+--- src/ntfs.cpp.orig 2023-05-01 20:59:36 UTC
++++ src/ntfs.cpp
+@@ -465,7 +465,7 @@ string_view ntfs::find_sd(uint32_t id, ntfs_file& secu
+ }
+
+ static void walk_btree(const index_root& ir, const list<mapping>& mappings, const index_node_header& inh, ntfs& dev,
+- const invocable<const index_entry&, string_view> auto& func, unsigned int level) {
++ const function<void(const index_entry&, string_view)>& func, unsigned int level) {
+ auto ent = reinterpret_cast<const index_entry*>((uint8_t*)&inh + inh.first_entry);
+
+ do {
diff --git a/filesystems/ntfs2btrfs/pkg-descr b/filesystems/ntfs2btrfs/pkg-descr
new file mode 100644
index 000000000000..6845f5661a10
--- /dev/null
+++ b/filesystems/ntfs2btrfs/pkg-descr
@@ -0,0 +1,5 @@
+Ntfs2btrfs is a tool which does in-place conversion of Microsoft's NTFS
+file system to the open-source file system Btrfs, much as btrfs-convert
+does for ext2. The original file system image is saved as a reflink copy
+at `image/ntfs.img', and can be deleted to free up space if you want to
+keep the conversion.
diff --git a/filesystems/openzfs-kmod/Makefile b/filesystems/openzfs-kmod/Makefile
new file mode 100644
index 000000000000..3dc28a9feadb
--- /dev/null
+++ b/filesystems/openzfs-kmod/Makefile
@@ -0,0 +1,68 @@
+PORTNAME= openzfs
+PORTVERSION= 2023113000
+DISTVERSIONPREFIX= v
+CATEGORIES= filesystems sysutils
+PKGNAMESUFFIX?= -kmod
+
+MAINTAINER= freqlabs@FreeBSD.org
+COMMENT= OpenZFS kernel module for FreeBSD
+WWW= https://github.com/openzfs/zfs
+
+LICENSE= CDDL
+
+BROKEN_i386= build fails
+
+USES= cpe kmod
+USE_GITHUB= yes
+GH_PROJECT= zfs
+GH_TAGNAME= 494aaae
+KMODTARGET?= openzfs.ko
+
+PLIST_FILES= ${KMODDIR}/${KMODTARGET}
+
+OPTIONS_DEFINE= DEBUG INVARIANTS GCOV
+OPTIONS_DEFAULT= DEBUG INVARIANTS
+OPTIONS_SUB= yes
+
+GCOV_DESC= Build kernel module with GCOV support (Requires gcc)
+
+INVARIANTS_DESC= Build kernel module with INVARIANTS
+INVARIANTS_IMPLIES= DEBUG
+
+.include <bsd.port.options.mk>
+
+MAKE_OPTS+= SYSDIR=${SRC_BASE}/sys
+
+.if ${PORT_OPTIONS:MDEBUG}
+MAKE_OPTS+= WITH_DEBUG=true
+PLIST_FILES+= ${KMODDIR}/${KMODTARGET}.debug
+.endif
+
+.if ${PORT_OPTIONS:MINVARIANTS}
+MAKE_OPTS+= WITH_INVARIANTS=true
+.endif
+
+.if ${PORT_OPTIONS:MGCOV}
+USE_GCC= yes
+MAKE_OPTS+= WITH_GCOV=true
+.endif
+
+ZFS_META_GITREV= ${GH_PROJECT}-${GH_TAGNAME}
+ZFS_META_RELEASE= ${GH_PROJECT}_${GH_TAGNAME}
+ZFS_META_VERSION= ${DISTVERSIONPREFIX}${PORTVERSION}
+
+post-patch:
+ ${ECHO} '#define ZFS_META_GITREV "${ZFS_META_GITREV}"' > ${WRKSRC}/include/zfs_gitrev.h
+ ${ECHO} '#define ZFS_META_RELEASE "${ZFS_META_RELEASE}"' > ${WRKSRC}/zfs_config.h
+ ${ECHO} '#define ZFS_META_VERSION "${ZFS_META_VERSION}"' >> ${WRKSRC}/zfs_config.h
+
+do-build:
+ (cd ${WRKSRC}/module/ && make -f Makefile.bsd CC=${CC} ${MAKE_OPTS})
+
+do-install:
+ ${INSTALL} ${WRKSRC}/module/openzfs.ko ${STAGEDIR}${KMODDIR}/${KMODTARGET}
+.if ${PORT_OPTIONS:MDEBUG}
+ ${INSTALL} ${WRKSRC}/module/openzfs.ko.debug ${STAGEDIR}${KMODDIR}/${KMODTARGET}.debug
+.endif
+
+.include <bsd.port.mk>
diff --git a/filesystems/openzfs-kmod/distinfo b/filesystems/openzfs-kmod/distinfo
new file mode 100644
index 000000000000..46df98bb02c8
--- /dev/null
+++ b/filesystems/openzfs-kmod/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1701967598
+SHA256 (openzfs-zfs-v2023113000-494aaae_GH0.tar.gz) = 7f77e73bacb7bb081e3344fb20e5ebffd6a6c0b10cad1b6c572d44866a94eea6
+SIZE (openzfs-zfs-v2023113000-494aaae_GH0.tar.gz) = 33039586
diff --git a/filesystems/openzfs-kmod/pkg-descr b/filesystems/openzfs-kmod/pkg-descr
new file mode 100644
index 000000000000..423d6ae3c738
--- /dev/null
+++ b/filesystems/openzfs-kmod/pkg-descr
@@ -0,0 +1 @@
+Kernel module for OpenZFS on FreeBSD
diff --git a/filesystems/openzfs-kmod/pkg-message b/filesystems/openzfs-kmod/pkg-message
new file mode 100644
index 000000000000..9554fc733667
--- /dev/null
+++ b/filesystems/openzfs-kmod/pkg-message
@@ -0,0 +1,12 @@
+[
+{ type: install
+ message: <<EOM
+Amend /boot/loader.conf as follows to use this module:
+
+- change zfs_load="YES" to NO
+- change opensolaris_load="YES" to NO
+- add openzfs_load="YES"
+- (for ARM64) add cryptodev_load="YES"
+EOM
+}
+]
diff --git a/filesystems/openzfs/Makefile b/filesystems/openzfs/Makefile
new file mode 100644
index 000000000000..bec123954ce9
--- /dev/null
+++ b/filesystems/openzfs/Makefile
@@ -0,0 +1,71 @@
+PORTNAME= openzfs
+PORTVERSION= 2023113000
+DISTVERSIONPREFIX= v
+PORTREVISION= 1
+CATEGORIES= filesystems sysutils
+
+MAINTAINER= freqlabs@FreeBSD.org
+COMMENT= OpenZFS userland for FreeBSD
+WWW= https://github.com/openzfs/zfs
+
+LICENSE= CDDL
+
+BROKEN_aarch64= invokes x86 assembler
+BROKEN_riscv64= fails to compile: btree_test.c:462:49: result of comparison of constant -1 with expression of type 'char' is always true
+
+BUILD_DEPENDS= ksh93:shells/ksh93
+RUN_DEPENDS= openzfs-kmod>=0:filesystems/openzfs-kmod
+
+USES+= autoreconf:build cpe libtool gmake gettext-runtime python:build shebangfix ssl
+SHEBANG_GLOB= *.ksh *.ksh.in *.kshlib *.py.in
+SHEBANG_FILES= tests/zfs-tests/tests/functional/trim/trim.cfg \
+ cmd/arcstat.in \
+ cmd/dbufstat.in \
+ cmd/zilstat.in \
+ cmd/arc_summary
+
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+CONFIGURE_ARGS= MAKE=gmake --prefix=${PREFIX} --with-config="user"
+
+OPTIONS_DEFINE= DEBUG PYTHON TESTS
+PYTHON_DESC= Build the pyzfs library, arc_summary, arcstat, and dbufstat utilities
+TESTS_DESC= Install the ZFS Test Suite
+OPTIONS_SUB= yes
+
+USE_GITHUB= yes
+GH_PROJECT= zfs
+GH_TAGNAME= 494aaae
+
+USE_LDCONFIG= yes
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MDEBUG}
+CONFIGURE_ARGS+= --enable-debug --enable-debuginfo
+.endif
+
+.if ${PORT_OPTIONS:MPYTHON}
+CONFIGURE_ARGS+= --with-python=${PYTHON_VER}
+BUILD_DEPENDS+= ${PYTHON_PKGNAMEPREFIX}packaging>0:devel/py-packaging@${PY_FLAVOR}
+BUILD_DEPENDS+= ${PYTHON_PKGNAMEPREFIX}cffi>0:devel/py-cffi@${PY_FLAVOR}
+RUN_DEPENDS+= ${PYTHON_PKGNAMEPREFIX}cffi>0:devel/py-cffi@${PY_FLAVOR}
+RUN_DEPENDS+= ${PYTHON_PKGNAMEPREFIX}sysctl>0:devel/py-sysctl@${PY_FLAVOR}
+.else
+CONFIGURE_ARGS+= --without-python
+PYTHON_NO_DEPENDS=yes
+.endif
+
+post-extract:
+ # Change certain shebangs into something that shebang fix understands
+ cd ${WRKSRC} && ${SED} -i '' '1s:@PYTHON_SHEBANG@:python3:' \
+ tests/test-runner/bin/zts-report.py.in \
+ tests/test-runner/bin/test-runner.py.in \
+ cmd/arcstat.in \
+ cmd/dbufstat.in \
+ cmd/zilstat.in
+
+pre-configure:
+ cd ${WRKSRC} && ./autogen.sh
+
+.include <bsd.port.mk>
diff --git a/filesystems/openzfs/distinfo b/filesystems/openzfs/distinfo
new file mode 100644
index 000000000000..6b9911e58395
--- /dev/null
+++ b/filesystems/openzfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1701967689
+SHA256 (openzfs-zfs-v2023113000-494aaae_GH0.tar.gz) = 7f77e73bacb7bb081e3344fb20e5ebffd6a6c0b10cad1b6c572d44866a94eea6
+SIZE (openzfs-zfs-v2023113000-494aaae_GH0.tar.gz) = 33039586
diff --git a/filesystems/openzfs/pkg-descr b/filesystems/openzfs/pkg-descr
new file mode 100644
index 000000000000..38b91fde925c
--- /dev/null
+++ b/filesystems/openzfs/pkg-descr
@@ -0,0 +1 @@
+Port of the OpenZFS project to FreeBSD
diff --git a/filesystems/openzfs/pkg-message b/filesystems/openzfs/pkg-message
new file mode 100644
index 000000000000..1101f72fc507
--- /dev/null
+++ b/filesystems/openzfs/pkg-message
@@ -0,0 +1,11 @@
+[
+{ type: install
+ message: <<EOM
+Ensure that any zfs-related commands, such as zpool, zfs, as used in scripts
+and in your terminal sessions, use the correct path of ${PREFIX}/sbin/ and
+not the /sbin/ commands provided by the FreeBSD base system.
+
+Consider setting this in your shell profile defaults!
+EOM
+}
+]
diff --git a/filesystems/openzfs/pkg-plist b/filesystems/openzfs/pkg-plist
new file mode 100644
index 000000000000..ea46b291888d
--- /dev/null
+++ b/filesystems/openzfs/pkg-plist
@@ -0,0 +1,2621 @@
+%%PYTHON%%bin/arc_summary
+%%PYTHON%%bin/arcstat
+%%PYTHON%%bin/dbufstat
+%%PYTHON%%bin/zilstat
+%%TESTS%%bin/raidz_test
+etc/bash_completion.d/zfs
+etc/sudoers.d/zfs
+etc/zfs/vdev_id.conf.alias.example
+etc/zfs/vdev_id.conf.multipath.example
+etc/zfs/vdev_id.conf.sas_direct.example
+etc/zfs/vdev_id.conf.sas_switch.example
+etc/zfs/vdev_id.conf.scsi.example
+etc/zfs/zfs-functions
+etc/zfs/zpool.d/ata_err
+etc/zfs/zpool.d/cmd_to
+etc/zfs/zpool.d/defect
+etc/zfs/zpool.d/dm-deps
+etc/zfs/zpool.d/enc
+etc/zfs/zpool.d/encdev
+etc/zfs/zpool.d/fault_led
+etc/zfs/zpool.d/health
+etc/zfs/zpool.d/hours_on
+etc/zfs/zpool.d/iostat
+etc/zfs/zpool.d/iostat-10s
+etc/zfs/zpool.d/iostat-1s
+etc/zfs/zpool.d/label
+etc/zfs/zpool.d/locate_led
+etc/zfs/zpool.d/lsblk
+etc/zfs/zpool.d/media
+etc/zfs/zpool.d/model
+etc/zfs/zpool.d/nonmed
+etc/zfs/zpool.d/nvme_err
+etc/zfs/zpool.d/off_ucor
+etc/zfs/zpool.d/pend_sec
+etc/zfs/zpool.d/pwr_cyc
+etc/zfs/zpool.d/r_proc
+etc/zfs/zpool.d/r_ucor
+etc/zfs/zpool.d/realloc
+etc/zfs/zpool.d/rep_ucor
+etc/zfs/zpool.d/serial
+etc/zfs/zpool.d/ses
+etc/zfs/zpool.d/size
+etc/zfs/zpool.d/slot
+etc/zfs/zpool.d/smart
+etc/zfs/zpool.d/smart_test
+etc/zfs/zpool.d/smartx
+etc/zfs/zpool.d/temp
+etc/zfs/zpool.d/test_ended
+etc/zfs/zpool.d/test_progress
+etc/zfs/zpool.d/test_status
+etc/zfs/zpool.d/test_type
+etc/zfs/zpool.d/upath
+etc/zfs/zpool.d/vendor
+etc/zfs/zpool.d/w_proc
+etc/zfs/zpool.d/w_ucor
+include/libspl/assert.h
+include/libspl/atomic.h
+include/libspl/fcntl.h
+include/libspl/libgen.h
+include/libspl/libshare.h
+include/libspl/rpc/xdr.h
+include/libspl/statcommon.h
+include/libspl/stdlib.h
+include/libspl/string.h
+include/libspl/sys/acl.h
+include/libspl/sys/acl_impl.h
+include/libspl/sys/asm_linkage.h
+include/libspl/sys/byteorder.h
+include/libspl/sys/callb.h
+include/libspl/sys/cmn_err.h
+include/libspl/sys/cred.h
+include/libspl/sys/debug.h
+include/libspl/sys/dkio.h
+include/libspl/sys/dklabel.h
+include/libspl/sys/dktp/fdisk.h
+include/libspl/sys/fcntl.h
+include/libspl/sys/feature_tests.h
+include/libspl/sys/file.h
+include/libspl/sys/ia32/asm_linkage.h
+include/libspl/sys/inttypes.h
+include/libspl/sys/isa_defs.h
+include/libspl/sys/kmem.h
+include/libspl/sys/kstat.h
+include/libspl/sys/list.h
+include/libspl/sys/list_impl.h
+include/libspl/sys/mhd.h
+include/libspl/sys/mkdev.h
+include/libspl/sys/mnttab.h
+include/libspl/sys/mount.h
+include/libspl/sys/param.h
+include/libspl/sys/policy.h
+include/libspl/sys/poll.h
+include/libspl/sys/priv.h
+include/libspl/sys/processor.h
+include/libspl/sys/simd.h
+include/libspl/sys/stack.h
+include/libspl/sys/stat.h
+include/libspl/sys/stdtypes.h
+include/libspl/sys/string.h
+include/libspl/sys/sunddi.h
+include/libspl/sys/sysmacros.h
+include/libspl/sys/systeminfo.h
+include/libspl/sys/time.h
+include/libspl/sys/trace_spl.h
+include/libspl/sys/trace_zfs.h
+include/libspl/sys/types.h
+include/libspl/sys/types32.h
+include/libspl/sys/uio.h
+include/libspl/sys/vfs.h
+include/libspl/sys/vnode.h
+include/libspl/sys/wmsum.h
+include/libspl/sys/zfs_context_os.h
+include/libspl/sys/zone.h
+include/libspl/umem.h
+include/libspl/unistd.h
+include/libspl/zone.h
+include/libzfs/cityhash.h
+include/libzfs/libnvpair.h
+include/libzfs/libuutil.h
+include/libzfs/libuutil_common.h
+include/libzfs/libuutil_impl.h
+include/libzfs/libzfs.h
+include/libzfs/libzfs_core.h
+include/libzfs/libzfsbootenv.h
+include/libzfs/libzutil.h
+include/libzfs/sys/abd.h
+include/libzfs/sys/abd_impl.h
+include/libzfs/sys/aggsum.h
+include/libzfs/sys/arc.h
+include/libzfs/sys/arc_impl.h
+include/libzfs/sys/asm_linkage.h
+include/libzfs/sys/avl.h
+include/libzfs/sys/avl_impl.h
+include/libzfs/sys/bitmap.h
+include/libzfs/sys/bitops.h
+include/libzfs/sys/blake3.h
+include/libzfs/sys/blkptr.h
+include/libzfs/sys/bplist.h
+include/libzfs/sys/bpobj.h
+include/libzfs/sys/bptree.h
+include/libzfs/sys/bqueue.h
+include/libzfs/sys/brt.h
+include/libzfs/sys/brt_impl.h
+include/libzfs/sys/btree.h
+include/libzfs/sys/crypto/api.h
+include/libzfs/sys/crypto/common.h
+include/libzfs/sys/crypto/icp.h
+include/libzfs/sys/dataset_kstats.h
+include/libzfs/sys/dbuf.h
+include/libzfs/sys/ddt.h
+include/libzfs/sys/dmu.h
+include/libzfs/sys/dmu_impl.h
+include/libzfs/sys/dmu_objset.h
+include/libzfs/sys/dmu_recv.h
+include/libzfs/sys/dmu_redact.h
+include/libzfs/sys/dmu_send.h
+include/libzfs/sys/dmu_traverse.h
+include/libzfs/sys/dmu_tx.h
+include/libzfs/sys/dmu_zfetch.h
+include/libzfs/sys/dnode.h
+include/libzfs/sys/dsl_bookmark.h
+include/libzfs/sys/dsl_crypt.h
+include/libzfs/sys/dsl_dataset.h
+include/libzfs/sys/dsl_deadlist.h
+include/libzfs/sys/dsl_deleg.h
+include/libzfs/sys/dsl_destroy.h
+include/libzfs/sys/dsl_dir.h
+include/libzfs/sys/dsl_pool.h
+include/libzfs/sys/dsl_prop.h
+include/libzfs/sys/dsl_scan.h
+include/libzfs/sys/dsl_synctask.h
+include/libzfs/sys/dsl_userhold.h
+include/libzfs/sys/edonr.h
+include/libzfs/sys/efi_partition.h
+include/libzfs/sys/fm/fs/zfs.h
+include/libzfs/sys/fm/protocol.h
+include/libzfs/sys/fm/util.h
+include/libzfs/sys/frame.h
+include/libzfs/sys/fs/zfs.h
+include/libzfs/sys/hkdf.h
+include/libzfs/sys/lua/lauxlib.h
+include/libzfs/sys/lua/lua.h
+include/libzfs/sys/lua/luaconf.h
+include/libzfs/sys/lua/lualib.h
+include/libzfs/sys/metaslab.h
+include/libzfs/sys/metaslab_impl.h
+include/libzfs/sys/mmp.h
+include/libzfs/sys/mntent.h
+include/libzfs/sys/mod.h
+include/libzfs/sys/multilist.h
+include/libzfs/sys/nvpair.h
+include/libzfs/sys/nvpair_impl.h
+include/libzfs/sys/objlist.h
+include/libzfs/sys/pathname.h
+include/libzfs/sys/qat.h
+include/libzfs/sys/range_tree.h
+include/libzfs/sys/rrwlock.h
+include/libzfs/sys/sa.h
+include/libzfs/sys/sa_impl.h
+include/libzfs/sys/sha2.h
+include/libzfs/sys/skein.h
+include/libzfs/sys/spa.h
+include/libzfs/sys/spa_checkpoint.h
+include/libzfs/sys/spa_checksum.h
+include/libzfs/sys/spa_impl.h
+include/libzfs/sys/spa_log_spacemap.h
+include/libzfs/sys/space_map.h
+include/libzfs/sys/space_reftree.h
+include/libzfs/sys/sysevent.h
+include/libzfs/sys/sysevent/dev.h
+include/libzfs/sys/sysevent/eventdefs.h
+include/libzfs/sys/txg.h
+include/libzfs/sys/txg_impl.h
+include/libzfs/sys/u8_textprep.h
+include/libzfs/sys/u8_textprep_data.h
+include/libzfs/sys/uberblock.h
+include/libzfs/sys/uberblock_impl.h
+include/libzfs/sys/uio_impl.h
+include/libzfs/sys/unique.h
+include/libzfs/sys/uuid.h
+include/libzfs/sys/vdev.h
+include/libzfs/sys/vdev_disk.h
+include/libzfs/sys/vdev_draid.h
+include/libzfs/sys/vdev_file.h
+include/libzfs/sys/vdev_impl.h
+include/libzfs/sys/vdev_indirect_births.h
+include/libzfs/sys/vdev_indirect_mapping.h
+include/libzfs/sys/vdev_initialize.h
+include/libzfs/sys/vdev_raidz.h
+include/libzfs/sys/vdev_raidz_impl.h
+include/libzfs/sys/vdev_rebuild.h
+include/libzfs/sys/vdev_removal.h
+include/libzfs/sys/vdev_trim.h
+include/libzfs/sys/xvattr.h
+include/libzfs/sys/zap.h
+include/libzfs/sys/zap_impl.h
+include/libzfs/sys/zap_leaf.h
+include/libzfs/sys/zcp.h
+include/libzfs/sys/zcp_global.h
+include/libzfs/sys/zcp_iter.h
+include/libzfs/sys/zcp_prop.h
+include/libzfs/sys/zcp_set.h
+include/libzfs/sys/zfeature.h
+include/libzfs/sys/zfs_acl.h
+include/libzfs/sys/zfs_bootenv.h
+include/libzfs/sys/zfs_chksum.h
+include/libzfs/sys/zfs_context.h
+include/libzfs/sys/zfs_debug.h
+include/libzfs/sys/zfs_delay.h
+include/libzfs/sys/zfs_file.h
+include/libzfs/sys/zfs_fuid.h
+include/libzfs/sys/zfs_impl.h
+include/libzfs/sys/zfs_project.h
+include/libzfs/sys/zfs_quota.h
+include/libzfs/sys/zfs_racct.h
+include/libzfs/sys/zfs_ratelimit.h
+include/libzfs/sys/zfs_refcount.h
+include/libzfs/sys/zfs_rlock.h
+include/libzfs/sys/zfs_sa.h
+include/libzfs/sys/zfs_stat.h
+include/libzfs/sys/zfs_sysfs.h
+include/libzfs/sys/zfs_vfsops.h
+include/libzfs/sys/zfs_vnops.h
+include/libzfs/sys/zfs_znode.h
+include/libzfs/sys/zil.h
+include/libzfs/sys/zil_impl.h
+include/libzfs/sys/zio.h
+include/libzfs/sys/zio_checksum.h
+include/libzfs/sys/zio_compress.h
+include/libzfs/sys/zio_crypt.h
+include/libzfs/sys/zio_impl.h
+include/libzfs/sys/zio_priority.h
+include/libzfs/sys/zrlock.h
+include/libzfs/sys/zstd/zstd.h
+include/libzfs/sys/zthr.h
+include/libzfs/thread_pool.h
+include/libzfs/zfeature_common.h
+include/libzfs/zfs_comutil.h
+include/libzfs/zfs_deleg.h
+include/libzfs/zfs_fletcher.h
+include/libzfs/zfs_namecheck.h
+include/libzfs/zfs_prop.h
+lib/libnvpair.a
+lib/libnvpair.so
+lib/libnvpair.so.3
+lib/libnvpair.so.3.0.0
+lib/libuutil.a
+lib/libuutil.so
+lib/libuutil.so.3
+lib/libuutil.so.3.0.0
+lib/libzfs.a
+lib/libzfs.so
+lib/libzfs.so.4
+lib/libzfs.so.4.1.0
+lib/libzfs_core.a
+lib/libzfs_core.so
+lib/libzfs_core.so.3
+lib/libzfs_core.so.3.0.0
+lib/libzfsbootenv.a
+lib/libzfsbootenv.so
+lib/libzfsbootenv.so.1
+lib/libzfsbootenv.so.1.0.0
+lib/libzpool.a
+lib/libzpool.so
+lib/libzpool.so.5
+lib/libzpool.so.5.0.0
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/__init__.py
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/__pycache__/_constants%%PYTHON_EXT_SUFFIX%%.pyc
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/__pycache__/_error_translation%%PYTHON_EXT_SUFFIX%%.pyc
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/__pycache__/_libzfs_core%%PYTHON_EXT_SUFFIX%%.pyc
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/__pycache__/_nvlist%%PYTHON_EXT_SUFFIX%%.pyc
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/__pycache__/ctypes%%PYTHON_EXT_SUFFIX%%.pyc
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/__pycache__/exceptions%%PYTHON_EXT_SUFFIX%%.pyc
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/_constants.py
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/_error_translation.py
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/_libzfs_core.py
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/_nvlist.py
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/bindings/__init__.py
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/bindings/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/bindings/__pycache__/libnvpair%%PYTHON_EXT_SUFFIX%%.pyc
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/bindings/__pycache__/libzfs_core%%PYTHON_EXT_SUFFIX%%.pyc
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/bindings/libnvpair.py
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/bindings/libzfs_core.py
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/ctypes.py
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/exceptions.py
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/test/__init__.py
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/test/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/test/__pycache__/test_libzfs_core%%PYTHON_EXT_SUFFIX%%.pyc
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/test/__pycache__/test_nvlist%%PYTHON_EXT_SUFFIX%%.pyc
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/test/test_libzfs_core.py
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/libzfs_core/test/test_nvlist.py
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/pyzfs-2.2.2-py%%PYTHON_VER%%.egg-info/PKG-INFO
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/pyzfs-2.2.2-py%%PYTHON_VER%%.egg-info/SOURCES.txt
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/pyzfs-2.2.2-py%%PYTHON_VER%%.egg-info/dependency_links.txt
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/pyzfs-2.2.2-py%%PYTHON_VER%%.egg-info/not-zip-safe
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/pyzfs-2.2.2-py%%PYTHON_VER%%.egg-info/requires.txt
+%%PYTHON%%%%PYTHON_SITELIBDIR%%/pyzfs-2.2.2-py%%PYTHON_VER%%.egg-info/top_level.txt
+lib/security/pam_zfs_key.so
+libdata/pkgconfig/libzfs.pc
+libdata/pkgconfig/libzfs_core.pc
+libdata/pkgconfig/libzfsbootenv.pc
+libexec/zfs/zfs_prepare_disk
+libexec/zfs/zpool.d/ata_err
+libexec/zfs/zpool.d/cmd_to
+libexec/zfs/zpool.d/defect
+libexec/zfs/zpool.d/dm-deps
+libexec/zfs/zpool.d/enc
+libexec/zfs/zpool.d/encdev
+libexec/zfs/zpool.d/fault_led
+libexec/zfs/zpool.d/health
+libexec/zfs/zpool.d/hours_on
+libexec/zfs/zpool.d/iostat
+libexec/zfs/zpool.d/iostat-10s
+libexec/zfs/zpool.d/iostat-1s
+libexec/zfs/zpool.d/label
+libexec/zfs/zpool.d/locate_led
+libexec/zfs/zpool.d/lsblk
+libexec/zfs/zpool.d/media
+libexec/zfs/zpool.d/model
+libexec/zfs/zpool.d/nonmed
+libexec/zfs/zpool.d/nvme_err
+libexec/zfs/zpool.d/off_ucor
+libexec/zfs/zpool.d/pend_sec
+libexec/zfs/zpool.d/pwr_cyc
+libexec/zfs/zpool.d/r_proc
+libexec/zfs/zpool.d/r_ucor
+libexec/zfs/zpool.d/realloc
+libexec/zfs/zpool.d/rep_ucor
+libexec/zfs/zpool.d/serial
+libexec/zfs/zpool.d/ses
+libexec/zfs/zpool.d/size
+libexec/zfs/zpool.d/slot
+libexec/zfs/zpool.d/smart
+libexec/zfs/zpool.d/smart_test
+libexec/zfs/zpool.d/smartx
+libexec/zfs/zpool.d/temp
+libexec/zfs/zpool.d/test_ended
+libexec/zfs/zpool.d/test_progress
+libexec/zfs/zpool.d/test_status
+libexec/zfs/zpool.d/test_type
+libexec/zfs/zpool.d/upath
+libexec/zfs/zpool.d/vendor
+libexec/zfs/zpool.d/w_proc
+libexec/zfs/zpool.d/w_ucor
+libexec/zfs/zpool_influxdb
+sbin/fsck.zfs
+sbin/zdb
+sbin/zfs
+sbin/zfs_ids_to_path
+sbin/zhack
+sbin/zinject
+sbin/zpool
+sbin/zstream
+sbin/zstreamdump
+sbin/ztest
+share/man/man1/arcstat.1.gz
+%%TESTS%%share/man/man1/raidz_test.1.gz
+%%TESTS%%share/man/man1/test-runner.1.gz
+share/man/man1/zhack.1.gz
+share/man/man1/ztest.1.gz
+share/man/man1/zvol_wait.1.gz
+share/man/man4/spl.4.gz
+share/man/man4/zfs.4.gz
+share/man/man5/vdev_id.conf.5.gz
+share/man/man7/dracut.zfs.7.gz
+share/man/man7/vdevprops.7.gz
+share/man/man7/zfsconcepts.7.gz
+share/man/man7/zfsprops.7.gz
+share/man/man7/zpool-features.7.gz
+share/man/man7/zpoolconcepts.7.gz
+share/man/man7/zpoolprops.7.gz
+share/man/man8/fsck.zfs.8.gz
+share/man/man8/mount.zfs.8.gz
+share/man/man8/vdev_id.8.gz
+share/man/man8/zdb.8.gz
+share/man/man8/zed.8.gz
+share/man/man8/zfs-allow.8.gz
+share/man/man8/zfs-bookmark.8.gz
+share/man/man8/zfs-change-key.8.gz
+share/man/man8/zfs-clone.8.gz
+share/man/man8/zfs-create.8.gz
+share/man/man8/zfs-destroy.8.gz
+share/man/man8/zfs-diff.8.gz
+share/man/man8/zfs-get.8.gz
+share/man/man8/zfs-groupspace.8.gz
+share/man/man8/zfs-hold.8.gz
+share/man/man8/zfs-inherit.8.gz
+share/man/man8/zfs-jail.8.gz
+share/man/man8/zfs-list.8.gz
+share/man/man8/zfs-load-key.8.gz
+share/man/man8/zfs-mount-generator.8.gz
+share/man/man8/zfs-mount.8.gz
+share/man/man8/zfs-program.8.gz
+share/man/man8/zfs-project.8.gz
+share/man/man8/zfs-projectspace.8.gz
+share/man/man8/zfs-promote.8.gz
+share/man/man8/zfs-receive.8.gz
+share/man/man8/zfs-recv.8.gz
+share/man/man8/zfs-redact.8.gz
+share/man/man8/zfs-release.8.gz
+share/man/man8/zfs-rename.8.gz
+share/man/man8/zfs-rollback.8.gz
+share/man/man8/zfs-send.8.gz
+share/man/man8/zfs-set.8.gz
+share/man/man8/zfs-share.8.gz
+share/man/man8/zfs-snapshot.8.gz
+share/man/man8/zfs-unallow.8.gz
+share/man/man8/zfs-unjail.8.gz
+share/man/man8/zfs-unload-key.8.gz
+share/man/man8/zfs-unmount.8.gz
+share/man/man8/zfs-upgrade.8.gz
+share/man/man8/zfs-userspace.8.gz
+share/man/man8/zfs-wait.8.gz
+share/man/man8/zfs.8.gz
+share/man/man8/zfs_ids_to_path.8.gz
+share/man/man8/zfs_prepare_disk.8.gz
+share/man/man8/zgenhostid.8.gz
+share/man/man8/zinject.8.gz
+share/man/man8/zpool-add.8.gz
+share/man/man8/zpool-attach.8.gz
+share/man/man8/zpool-checkpoint.8.gz
+share/man/man8/zpool-clear.8.gz
+share/man/man8/zpool-create.8.gz
+share/man/man8/zpool-destroy.8.gz
+share/man/man8/zpool-detach.8.gz
+share/man/man8/zpool-events.8.gz
+share/man/man8/zpool-export.8.gz
+share/man/man8/zpool-get.8.gz
+share/man/man8/zpool-history.8.gz
+share/man/man8/zpool-import.8.gz
+share/man/man8/zpool-initialize.8.gz
+share/man/man8/zpool-iostat.8.gz
+share/man/man8/zpool-labelclear.8.gz
+share/man/man8/zpool-list.8.gz
+share/man/man8/zpool-offline.8.gz
+share/man/man8/zpool-online.8.gz
+share/man/man8/zpool-reguid.8.gz
+share/man/man8/zpool-remove.8.gz
+share/man/man8/zpool-reopen.8.gz
+share/man/man8/zpool-replace.8.gz
+share/man/man8/zpool-resilver.8.gz
+share/man/man8/zpool-scrub.8.gz
+share/man/man8/zpool-set.8.gz
+share/man/man8/zpool-split.8.gz
+share/man/man8/zpool-status.8.gz
+share/man/man8/zpool-sync.8.gz
+share/man/man8/zpool-trim.8.gz
+share/man/man8/zpool-upgrade.8.gz
+share/man/man8/zpool-wait.8.gz
+share/man/man8/zpool.8.gz
+share/man/man8/zpool_influxdb.8.gz
+share/man/man8/zstream.8.gz
+share/man/man8/zstreamdump.8.gz
+share/pam-configs/zfs_key
+%%TESTS%%share/zfs/common.sh
+%%TESTS%%share/zfs/compatibility.d/2018
+%%TESTS%%share/zfs/compatibility.d/2019
+%%TESTS%%share/zfs/compatibility.d/2020
+%%TESTS%%share/zfs/compatibility.d/2021
+%%TESTS%%share/zfs/compatibility.d/compat-2018
+%%TESTS%%share/zfs/compatibility.d/compat-2019
+%%TESTS%%share/zfs/compatibility.d/compat-2020
+%%TESTS%%share/zfs/compatibility.d/compat-2021
+%%TESTS%%share/zfs/compatibility.d/freebsd-11.0
+%%TESTS%%share/zfs/compatibility.d/freebsd-11.1
+%%TESTS%%share/zfs/compatibility.d/freebsd-11.2
+%%TESTS%%share/zfs/compatibility.d/freebsd-11.3
+%%TESTS%%share/zfs/compatibility.d/freebsd-11.4
+%%TESTS%%share/zfs/compatibility.d/freebsd-12.0
+%%TESTS%%share/zfs/compatibility.d/freebsd-12.1
+%%TESTS%%share/zfs/compatibility.d/freebsd-12.2
+%%TESTS%%share/zfs/compatibility.d/freebsd-12.3
+%%TESTS%%share/zfs/compatibility.d/freebsd-12.4
+%%TESTS%%share/zfs/compatibility.d/freebsd-13.0
+%%TESTS%%share/zfs/compatibility.d/freebsd-13.1
+%%TESTS%%share/zfs/compatibility.d/freebsd-13.2
+%%TESTS%%share/zfs/compatibility.d/freenas-11.0
+%%TESTS%%share/zfs/compatibility.d/freenas-11.1
+%%TESTS%%share/zfs/compatibility.d/freenas-11.2
+%%TESTS%%share/zfs/compatibility.d/freenas-11.3
+%%TESTS%%share/zfs/compatibility.d/freenas-9.10.2
+%%TESTS%%share/zfs/compatibility.d/grub2
+%%TESTS%%share/zfs/compatibility.d/openzfs-2.0-freebsd
+%%TESTS%%share/zfs/compatibility.d/openzfs-2.0-linux
+%%TESTS%%share/zfs/compatibility.d/openzfs-2.1-freebsd
+%%TESTS%%share/zfs/compatibility.d/openzfs-2.1-linux
+%%TESTS%%share/zfs/compatibility.d/openzfs-2.2
+%%TESTS%%share/zfs/compatibility.d/openzfs-2.2-freebsd
+%%TESTS%%share/zfs/compatibility.d/openzfs-2.2-linux
+%%TESTS%%share/zfs/compatibility.d/openzfsonosx-1.7.0
+%%TESTS%%share/zfs/compatibility.d/openzfsonosx-1.8.1
+%%TESTS%%share/zfs/compatibility.d/openzfsonosx-1.9.3
+%%TESTS%%share/zfs/compatibility.d/openzfsonosx-1.9.4
+%%TESTS%%share/zfs/compatibility.d/truenas-12.0
+%%TESTS%%share/zfs/compatibility.d/ubuntu-18.04
+%%TESTS%%share/zfs/compatibility.d/ubuntu-20.04
+%%TESTS%%share/zfs/compatibility.d/ubuntu-22.04
+%%TESTS%%share/zfs/compatibility.d/zol-0.6.1
+%%TESTS%%share/zfs/compatibility.d/zol-0.6.4
+%%TESTS%%share/zfs/compatibility.d/zol-0.6.5
+%%TESTS%%share/zfs/compatibility.d/zol-0.7
+%%TESTS%%share/zfs/compatibility.d/zol-0.8
+%%TESTS%%share/zfs/runfiles/common.run
+%%TESTS%%share/zfs/runfiles/freebsd.run
+%%TESTS%%share/zfs/runfiles/linux.run
+%%TESTS%%share/zfs/runfiles/longevity.run
+%%TESTS%%share/zfs/runfiles/perf-regression.run
+%%TESTS%%share/zfs/runfiles/sanity.run
+%%TESTS%%share/zfs/runfiles/sunos.run
+%%TESTS%%share/zfs/test-runner/bin/test-runner.py
+%%TESTS%%share/zfs/test-runner/bin/zts-report.py
+%%TESTS%%share/zfs/test-runner/include/logapi.shlib
+%%TESTS%%share/zfs/zfs-helpers.sh
+%%TESTS%%share/zfs/zfs-tests.sh
+%%TESTS%%share/zfs/zfs-tests/bin/badsend
+%%TESTS%%share/zfs/zfs-tests/bin/blake3_test
+%%TESTS%%share/zfs/zfs-tests/bin/btree_test
+%%TESTS%%share/zfs/zfs-tests/bin/chg_usr_exec
+%%TESTS%%share/zfs/zfs-tests/bin/cp_files
+%%TESTS%%share/zfs/zfs-tests/bin/ctime
+%%TESTS%%share/zfs/zfs-tests/bin/dir_rd_update
+%%TESTS%%share/zfs/zfs-tests/bin/dosmode_readonly_write
+%%TESTS%%share/zfs/zfs-tests/bin/draid
+%%TESTS%%share/zfs/zfs-tests/bin/edonr_test
+%%TESTS%%share/zfs/zfs-tests/bin/ereports
+%%TESTS%%share/zfs/zfs-tests/bin/file_append
+%%TESTS%%share/zfs/zfs-tests/bin/file_check
+%%TESTS%%share/zfs/zfs-tests/bin/file_trunc
+%%TESTS%%share/zfs/zfs-tests/bin/file_write
+%%TESTS%%share/zfs/zfs-tests/bin/get_diff
+%%TESTS%%share/zfs/zfs-tests/bin/largest_file
+%%TESTS%%share/zfs/zfs-tests/bin/libzfs_input_check
+%%TESTS%%share/zfs/zfs-tests/bin/mkbusy
+%%TESTS%%share/zfs/zfs-tests/bin/mkfile
+%%TESTS%%share/zfs/zfs-tests/bin/mkfiles
+%%TESTS%%share/zfs/zfs-tests/bin/mktree
+%%TESTS%%share/zfs/zfs-tests/bin/mmap_exec
+%%TESTS%%share/zfs/zfs-tests/bin/mmap_seek
+%%TESTS%%share/zfs/zfs-tests/bin/mmap_sync
+%%TESTS%%share/zfs/zfs-tests/bin/mmapwrite
+%%TESTS%%share/zfs/zfs-tests/bin/nvlist_to_lua
+%%TESTS%%share/zfs/zfs-tests/bin/randwritecomp
+%%TESTS%%share/zfs/zfs-tests/bin/readmmap
+%%TESTS%%share/zfs/zfs-tests/bin/rename_dir
+%%TESTS%%share/zfs/zfs-tests/bin/rm_lnkcnt_zero_file
+%%TESTS%%share/zfs/zfs-tests/bin/send_doall
+%%TESTS%%share/zfs/zfs-tests/bin/sha2_test
+%%TESTS%%share/zfs/zfs-tests/bin/skein_test
+%%TESTS%%share/zfs/zfs-tests/bin/stride_dd
+%%TESTS%%share/zfs/zfs-tests/bin/suid_write_to_file
+%%TESTS%%share/zfs/zfs-tests/bin/threadsappend
+%%TESTS%%share/zfs/zfs-tests/bin/truncate_test
+%%TESTS%%share/zfs/zfs-tests/bin/zfs_diff-socket
+%%TESTS%%share/zfs/zfs-tests/callbacks/zfs_dbgmsg.ksh
+%%TESTS%%share/zfs/zfs-tests/callbacks/zfs_dmesg.ksh
+%%TESTS%%share/zfs/zfs-tests/callbacks/zfs_failsafe.ksh
+%%TESTS%%share/zfs/zfs-tests/callbacks/zfs_mmp.ksh
+%%TESTS%%share/zfs/zfs-tests/include/blkdev.shlib
+%%TESTS%%share/zfs/zfs-tests/include/commands.cfg
+%%TESTS%%share/zfs/zfs-tests/include/default.cfg
+%%TESTS%%share/zfs/zfs-tests/include/libtest.shlib
+%%TESTS%%share/zfs/zfs-tests/include/math.shlib
+%%TESTS%%share/zfs/zfs-tests/include/properties.shlib
+%%TESTS%%share/zfs/zfs-tests/include/tunables.cfg
+%%TESTS%%share/zfs/zfs-tests/include/zpool_script.shlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/acl/acl.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/acl/acl_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/acl/off/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/acl/off/dosmode.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/acl/off/posixmode.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/acl/off/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/acl/posix-sa/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/acl/posix-sa/posix_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/acl/posix-sa/posix_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/acl/posix-sa/posix_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/acl/posix-sa/posix_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/acl/posix-sa/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/acl/posix/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/acl/posix/posix_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/acl/posix/posix_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/acl/posix/posix_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/acl/posix/posix_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/acl/posix/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/alloc_class/alloc_class.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/alloc_class/alloc_class.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/alloc_class/alloc_class_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/alloc_class/alloc_class_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/alloc_class/alloc_class_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/alloc_class/alloc_class_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/alloc_class/alloc_class_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/alloc_class/alloc_class_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/alloc_class/alloc_class_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/alloc_class/alloc_class_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/alloc_class/alloc_class_009_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/alloc_class/alloc_class_010_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/alloc_class/alloc_class_011_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/alloc_class/alloc_class_012_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/alloc_class/alloc_class_013_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/alloc_class/alloc_class_014_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/alloc_class/alloc_class_015_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/alloc_class/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/alloc_class/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/append/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/append/file_append.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/append/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/append/threadsappend_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/arc/arcstats_runtime_tuning.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/arc/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/arc/dbufstats_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/arc/dbufstats_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/arc/dbufstats_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/arc/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/atime/atime.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/atime/atime_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/atime/atime_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/atime/atime_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/atime/atime_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/atime/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/atime/root_atime_off.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/atime/root_atime_on.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/atime/root_relatime_on.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/atime/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/block_cloning/block_cloning.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/block_cloning/block_cloning_copyfilerange.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/block_cloning/block_cloning_copyfilerange_cross_dataset.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/block_cloning/block_cloning_copyfilerange_fallback.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/block_cloning/block_cloning_copyfilerange_fallback_same_txg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/block_cloning/block_cloning_copyfilerange_partial.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/block_cloning/block_cloning_disabled_copyfilerange.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/block_cloning/block_cloning_disabled_ficlone.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/block_cloning/block_cloning_disabled_ficlonerange.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/block_cloning/block_cloning_ficlone.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/block_cloning/block_cloning_ficlonerange.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/block_cloning/block_cloning_ficlonerange_partial.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/block_cloning/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/block_cloning/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/bootfs/bootfs_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/bootfs/bootfs_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/bootfs/bootfs_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/bootfs/bootfs_004_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/bootfs/bootfs_005_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/bootfs/bootfs_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/bootfs/bootfs_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/bootfs/bootfs_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/bootfs/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/bootfs/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/btree/btree_negative.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/btree/btree_positive.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cache/cache.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cache/cache.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cache/cache_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cache/cache_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cache/cache_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cache/cache_004_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cache/cache_005_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cache/cache_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cache/cache_007_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cache/cache_008_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cache/cache_009_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cache/cache_010_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cache/cache_011_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cache/cache_012_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cache/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cache/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cachefile/cachefile.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cachefile/cachefile.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cachefile/cachefile_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cachefile/cachefile_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cachefile/cachefile_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cachefile/cachefile_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cachefile/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cachefile/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/case_all_values.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/casenorm.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/casenorm.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/insensitive_formd_delete.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/insensitive_formd_lookup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/insensitive_none_delete.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/insensitive_none_lookup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/mixed_create_failure.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/mixed_formd_delete.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/mixed_formd_lookup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/mixed_formd_lookup_ci.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/mixed_none_delete.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/mixed_none_lookup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/mixed_none_lookup_ci.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/norm_all_values.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/sensitive_formd_delete.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/sensitive_formd_lookup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/sensitive_none_delete.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/sensitive_none_lookup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/casenorm/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/channel_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.args_to_lua.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.args_to_lua.out
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.args_to_lua.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.divide_by_zero.err
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.divide_by_zero.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.divide_by_zero.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.exists.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.exists.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.integer_illegal.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.integer_overflow.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.language_functions_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.language_functions_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.large_prog.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.large_prog.out
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.large_prog.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.lib_base.lua
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.lib_coroutine.lua
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.lib_strings.lua
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.lib_table.lua
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.libraries.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.memory_limit.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.nested_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.nested_neg.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.nested_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.nested_pos.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.nvlist_to_lua.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.recursive.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.recursive_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.recursive_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.return_large.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.return_large.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.return_nvlist_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.return_nvlist_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.return_recursive_table.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.return_recursive_table.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.stack_gsub.err
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.stack_gsub.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.stack_gsub.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.timeout.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.timeout.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.bookmark.copy.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.bookmark.copy.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.bookmark.create.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.bookmark.create.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.destroy_fs.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.destroy_snap.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.get_count_and_limit.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.get_index_props.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.get_index_props.out
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.get_index_props.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.get_mountpoint.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.get_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.get_number_props.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.get_number_props.out
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.get_number_props.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.get_string_props.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.get_string_props.out
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.get_string_props.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.get_type.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.get_userquota.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.get_written.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.inherit.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.list_bookmarks.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.list_children.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.list_clones.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.list_holds.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.list_snapshots.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.list_system_props.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.list_user_props.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.parse_args_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.promote_conflict.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.promote_conflict.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.promote_multiple.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.promote_simple.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.rollback_mult.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.rollback_one.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.set_props.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.set_props.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.snapshot_destroy.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.snapshot_destroy.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.snapshot_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.snapshot_neg.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.snapshot_recursive.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.snapshot_recursive.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.snapshot_rename.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.snapshot_rename.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.snapshot_simple.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.snapshot_simple.zcp
+%%TESTS%%share/zfs/zfs-tests/tests/functional/channel_program/synctask_core/tst.terminate_by_signal.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/chattr/chattr_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/chattr/chattr_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/chattr/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/chattr/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/checksum/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/checksum/default.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/checksum/filetest_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/checksum/filetest_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/checksum/run_blake3_test.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/checksum/run_edonr_test.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/checksum/run_sha2_test.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/checksum/run_skein_test.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/checksum/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/clean_mirror/clean_mirror_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/clean_mirror/clean_mirror_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/clean_mirror/clean_mirror_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/clean_mirror/clean_mirror_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/clean_mirror/clean_mirror_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/clean_mirror/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/clean_mirror/default.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/clean_mirror/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/cli_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zdb/zdb_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zdb/zdb_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zdb/zdb_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zdb/zdb_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zdb/zdb_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zdb/zdb_args_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zdb/zdb_args_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zdb/zdb_backup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zdb/zdb_block_size_histogram.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zdb/zdb_checksum.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zdb/zdb_decompress.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zdb/zdb_decompress_zstd.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zdb/zdb_display_block.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zdb/zdb_encrypted.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zdb/zdb_label_checksum.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zdb/zdb_object_range_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zdb/zdb_object_range_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zdb/zdb_objset_id.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zdb/zdb_recover.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zdb/zdb_recover_2.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs/zfs_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs/zfs_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs/zfs_003_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_bookmark/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_bookmark/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_bookmark/zfs_bookmark_cliargs.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_change-key/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_change-key/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_change-key/zfs_change-key.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_change-key/zfs_change-key_child.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_change-key/zfs_change-key_clones.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_change-key/zfs_change-key_format.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_change-key/zfs_change-key_inherit.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_change-key/zfs_change-key_load.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_change-key/zfs_change-key_location.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_change-key/zfs_change-key_pbkdf2iters.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_clone/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_clone/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_008_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_009_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_010_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_deeply_nested.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_encrypted.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_rm_nested.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_copies/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_copies/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_004_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_005_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/properties.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_008_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_009_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_010_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_011_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_012_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_013_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_014_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_crypt_combos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_dryrun.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_encrypted.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_nomount.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_verbose.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_clone_livelist_condense_and_disable.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_clone_livelist_condense_races.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_clone_livelist_dedup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_005_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_006_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_007_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_009_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_010_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_011_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_012_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_013_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_014_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_015_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_016_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_clone_livelist.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_dev_removal.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_dev_removal_condense.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_diff/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_diff/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_diff/zfs_diff_changes.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_diff/zfs_diff_cliargs.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_diff/zfs_diff_encrypted.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_diff/zfs_diff_mangle.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_diff/zfs_diff_timestamp.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_diff/zfs_diff_types.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_get/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_get/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_005_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_006_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_007_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_009_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_010_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_list_d.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_ids_to_path/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_ids_to_path/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_ids_to_path/zfs_ids_to_path_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_inherit/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_inherit/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_inherit/zfs_inherit_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_inherit/zfs_inherit_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_inherit/zfs_inherit_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_inherit/zfs_inherit_mountpoint.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_jail/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_jail/jail.conf
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_jail/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_jail/zfs_jail_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_load-key/HEXKEY
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_load-key/PASSPHRASE
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_load-key/RAWKEY
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_load-key/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_load-key/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_load-key/zfs_load-key.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_load-key/zfs_load-key.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_load-key/zfs_load-key_all.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_load-key/zfs_load-key_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_load-key/zfs_load-key_file.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_load-key/zfs_load-key_https.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_load-key/zfs_load-key_location.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_load-key/zfs_load-key_noop.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_load-key/zfs_load-key_recursive.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_009_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_010_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_011_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_012_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_013_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_014_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_all_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_all_fail.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_all_mountpoints.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_encrypted.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_remount.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_test_race.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_multi_mount.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_program/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_program/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_program/zfs_program_json.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_promote/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_promote/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_006_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_007_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_encryptionroot.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_property/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_property/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_property/zfs_written_property_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/receive-o-x_props_aliases.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/receive-o-x_props_override.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_-e.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_-wR-encrypted-mix.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_004_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_005_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_007_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_009_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_010_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_011_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_012_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_013_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_014_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_015_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_016_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_compressed_corrective.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_corrective.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_from_encrypted.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_from_zstd.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_large_block_corrective.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_new_props.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_raw.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_raw_-d.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_raw_incremental.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_to_encrypted.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_receive/zstd_test_data.txt
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_004_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_005_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_009_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_010_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_011_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_012_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_013_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_014_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_encrypted_child.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_mountpoint.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_nounmount.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_to_encrypted.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_reservation/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_reservation/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_reservation/zfs_reservation_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_reservation/zfs_reservation_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rollback/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rollback/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_003_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_004_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_send/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_send/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send-b.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_004_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_encrypted.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_encrypted_unloaded.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_raw.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_skip_missing.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_sparse.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/cache_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/cache_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/canmount_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/canmount_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/canmount_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/canmount_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/checksum_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/compression_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/mountpoint_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/mountpoint_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/mountpoint_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/onoffs_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/property_alias_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/readonly_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/reservation_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/ro_props_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/share_mount_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/snapdir_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/user_property_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/user_property_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/user_property_003_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/user_property_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/version_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_003_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_feature_activation.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_keylocation.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_nomount.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_share/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_share/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_007_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_008_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_009_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_010_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_011_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_012_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_013_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_concurrent_shares.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_snapshot/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_snapshot/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_003_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_004_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_005_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_007_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_008_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_009_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_sysfs/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_sysfs/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_sysfs/zfeature_set_unsupported.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_sysfs/zfs_get_unsupported.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_sysfs/zfs_set_unsupported.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_sysfs/zfs_sysfs_live.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_sysfs/zpool_get_unsupported.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_sysfs/zpool_set_unsupported.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unload-key/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unload-key/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unload-key/zfs_unload-key.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unload-key/zfs_unload-key_all.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unload-key/zfs_unload-key_recursive.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unmount/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unmount/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_007_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_008_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_009_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_all_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_nested.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_unload_keys.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unshare/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unshare/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_004_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_005_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_upgrade/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_upgrade/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_006_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_007_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_wait/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_wait/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_wait/zfs_wait.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_wait/zfs_wait_deleteq.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zfs_wait/zfs_wait_getsubopt.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zhack/library.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zhack/zhack_label_repair_001.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zhack/zhack_label_repair_002.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zhack/zhack_label_repair_003.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zhack/zhack_label_repair_004.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool/zpool_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool/zpool_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool/zpool_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool/zpool_colors.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_add/add-o_ashift.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_add/add_nested_replacing_spare.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_add/add_prop_ashift.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_add/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_add/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_007_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_008_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_009_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_010_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_dryrun_output.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_attach/attach-o_ashift.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_attach/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_attach/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_attach/zpool_attach_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_clear/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_clear/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear_003_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear_readonly.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/create-o_ashift.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/draidcfg.gz
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create.shlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_007_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_009_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_010_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_011_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_012_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_014_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_015_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_016_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_017_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_018_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_019_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_020_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_021_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_022_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_023_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_024_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_crypt_combos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_draid_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_draid_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_draid_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_draid_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_dryrun_output.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_encrypted.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_004_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_009_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_tempname.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_destroy/zpool_destroy.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_destroy/zpool_destroy_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_destroy/zpool_destroy_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_destroy/zpool_destroy_003_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_detach/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_detach/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_detach/zpool_detach_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_events/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_events/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_events/zpool_events.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_events/zpool_events.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_events/zpool_events_clear.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_events/zpool_events_clear_retained.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_events/zpool_events_cliargs.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_events/zpool_events_duplicates.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_events/zpool_events_errors.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_events/zpool_events_follow.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_events/zpool_events_poolname.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_expand/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_expand/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand_003_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_export/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_export/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export_003_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_get/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_get/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_get/vdev_get.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_get/vdev_get_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_004_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_parsable.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_history/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_history/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_history/zpool_history_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_history/zpool_history_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/blockfiles/cryptv0.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/blockfiles/missing_ivset.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/blockfiles/unclean_export.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_device_added.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_device_removed.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_device_replaced.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_mirror_attached.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_mirror_detached.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_paths_changed.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_shared_device.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/import_devices_missing.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/import_log_missing.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/import_paths_changed.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/import_rewind_config_changed.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/import_rewind_device_replaced.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_009_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_010_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_011_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_012_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_013_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_014_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_015_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_016_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_017_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_all_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_encrypted.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_encrypted_load.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_errata3.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_errata4.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_features_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_features_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_features_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_hostid_changed.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_hostid_changed_cachefile.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_hostid_changed_cachefile_unclean_export.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_hostid_changed_unclean_export.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_missing_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_missing_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_missing_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_rename_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_initialize/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_initialize/zpool_initialize.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_initialize/zpool_initialize_attach_detach_add_remove.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_initialize/zpool_initialize_fault_export_import_online.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_initialize/zpool_initialize_import_export.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_initialize/zpool_initialize_offline_export_import_online.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_initialize/zpool_initialize_online_offline.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_initialize/zpool_initialize_split.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_initialize/zpool_initialize_start_and_cancel_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_initialize/zpool_initialize_start_and_cancel_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_initialize/zpool_initialize_suspend_resume.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_initialize/zpool_initialize_uninit.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_initialize/zpool_initialize_unsupported_vdevs.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_initialize/zpool_initialize_verify_checksums.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_initialize/zpool_initialize_verify_initialized.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_labelclear/labelclear.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_labelclear/zpool_labelclear_active.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_labelclear/zpool_labelclear_exported.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_labelclear/zpool_labelclear_removed.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_labelclear/zpool_labelclear_valid.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_offline/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_offline/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_offline/zpool_offline_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_offline/zpool_offline_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_offline/zpool_offline_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_online/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_online/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_online/zpool_online_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_online/zpool_online_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_remove/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_remove/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_remove/zpool_remove.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_remove/zpool_remove_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_remove/zpool_remove_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_remove/zpool_remove_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_reopen/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_reopen/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_reopen/zpool_reopen.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_reopen/zpool_reopen.shlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_reopen/zpool_reopen_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_reopen/zpool_reopen_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_reopen/zpool_reopen_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_reopen/zpool_reopen_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_reopen/zpool_reopen_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_reopen/zpool_reopen_006_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_reopen/zpool_reopen_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_replace/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_replace/replace-o_ashift.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_replace/replace_prop_ashift.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_replace/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_replace/zpool_replace_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_resilver/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_resilver/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_resilver/zpool_resilver.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_resilver/zpool_resilver_bad_args.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_resilver/zpool_resilver_concurrent.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_resilver/zpool_resilver_restart.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_scrub/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_scrub/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_error_scrub_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_error_scrub_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_error_scrub_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_error_scrub_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_encrypted_unloaded.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_multiple_copies.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_offline_device.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_print_repairing.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_set/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_set/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_set/user_property_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_set/user_property_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_set/vdev_set_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_set/zpool_set_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_set/zpool_set_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_set/zpool_set_003_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_set/zpool_set_ashift.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_set/zpool_set_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_set/zpool_set_features.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_split/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_split/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_split/zpool_split.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_split/zpool_split_cliargs.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_split/zpool_split_devices.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_split/zpool_split_dryrun_output.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_split/zpool_split_encryption.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_split/zpool_split_indirect.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_split/zpool_split_props.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_split/zpool_split_resilver.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_split/zpool_split_vdevs.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_split/zpool_split_wholedisk.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_status/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_status/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_status/zpool_status_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_status/zpool_status_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_status/zpool_status_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_status/zpool_status_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_status/zpool_status_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_status/zpool_status_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_status/zpool_status_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_status/zpool_status_features_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_sync/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_sync/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_sync/zpool_sync_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_sync/zpool_sync_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_attach_detach_add_remove.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_fault_export_import_online.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_import_export.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_multiple.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_offline_export_import_online.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_online_offline.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_partial.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_rate.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_rate_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_secure.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_split.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_start_and_cancel_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_start_and_cancel_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_suspend_resume.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_unsupported_vdevs.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_verify_checksums.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_verify_trimmed.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-broken-mirror1.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-broken-mirror2.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v10.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v11.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v12.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v13.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v14.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v15.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror1.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror2.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror3.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz1.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz2.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz3.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe1.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe2.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe3.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2mirror1.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2mirror2.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2mirror3.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz1.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz2.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz3.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2stripe1.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2stripe2.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2stripe3.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3hotspare1.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3hotspare2.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3hotspare3.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror1.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror2.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror3.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz1.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz2.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz21.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz22.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz23.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz3.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3stripe1.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3stripe2.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3stripe3.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v4.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v5.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v6.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v7.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v8.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v9.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v999.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-vBROKEN.dat.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_005_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_006_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_009_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_features_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/scan/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/scan/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/scan/zpool_wait_rebuild.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/scan/zpool_wait_replace.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/scan/zpool_wait_replace_cancel.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/scan/zpool_wait_resilver.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/scan/zpool_wait_scrub_basic.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/scan/zpool_wait_scrub_cancel.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/scan/zpool_wait_scrub_flag.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/zpool_wait.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/zpool_wait_discard.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/zpool_wait_freeing.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/zpool_wait_initialize_basic.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/zpool_wait_initialize_cancel.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/zpool_wait_initialize_flag.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/zpool_wait_multiple.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/zpool_wait_no_activity.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/zpool_wait_remove.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/zpool_wait_remove_cancel.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/zpool_wait_trim_basic.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/zpool_wait_trim_cancel.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/zpool_wait_trim_flag.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_root/zpool_wait/zpool_wait_usage.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/arc_summary_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/arc_summary_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/arcstat_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/misc.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zdb_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zfs_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zfs_allow_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zfs_clone_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zfs_create_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zfs_destroy_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zfs_get_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zfs_inherit_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zfs_mount_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zfs_promote_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zfs_receive_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zfs_rename_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zfs_rollback_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zfs_send_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zfs_set_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zfs_share_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zfs_snapshot_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zfs_unallow_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zfs_unmount_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zfs_unshare_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zfs_upgrade_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zilstat_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_add_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_attach_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_clear_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_create_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_destroy_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_detach_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_export_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_get_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_history_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_import_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_import_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_offline_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_online_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_remove_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_replace_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_scrub_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_set_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_status_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_upgrade_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/misc/zpool_wait_privilege.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zfs_list/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zfs_list/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_004_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_005_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_008_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zpool_iostat/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zpool_iostat/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_-c_disable.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_-c_homedir.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_-c_searchpath.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_003_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zpool_list/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zpool_list/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zpool_list/zpool_list_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zpool_list/zpool_list_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zpool_status/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zpool_status/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zpool_status/zpool_status_-c_disable.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zpool_status/zpool_status_-c_homedir.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zpool_status/zpool_status_-c_searchpath.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cli_user/zpool_status/zpool_status_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/compression/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/compression/compress.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/compression/compress_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/compression/compress_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/compression/compress_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/compression/compress_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/compression/compress_zstd_bswap.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/compression/l2arc_compressed_arc.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/compression/l2arc_compressed_arc_disabled.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/compression/l2arc_encrypted.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/compression/l2arc_encrypted_no_compressed_arc.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/compression/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/compression/testpool_zstd.tar.gz
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cp_files/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cp_files/cp_files_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/cp_files/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/crtime/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/crtime/crtime_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/crtime/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/ctime/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/ctime/ctime_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/ctime/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/deadman/deadman.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/deadman/deadman_ratelimit.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/deadman/deadman_sync.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/deadman/deadman_zio.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/delegate.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/delegate_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/zfs_allow_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/zfs_allow_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/zfs_allow_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/zfs_allow_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/zfs_allow_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/zfs_allow_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/zfs_allow_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/zfs_allow_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/zfs_allow_009_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/zfs_allow_010_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/zfs_allow_011_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/zfs_allow_012_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/zfs_unallow_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/zfs_unallow_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/zfs_unallow_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/zfs_unallow_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/zfs_unallow_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/zfs_unallow_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/zfs_unallow_007_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/delegate/zfs_unallow_008_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/devices/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/devices/devices.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/devices/devices_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/devices/devices_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/devices/devices_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/devices/devices_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/devices/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/dos_attributes/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/dos_attributes/read_dos_attrs_001.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/dos_attributes/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/dos_attributes/write_dos_attrs_001.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/events/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/events/events.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/events/events_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/events/events_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/events/events_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/events/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/events/zed_cksum_config.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/events/zed_cksum_reported.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/events/zed_fd_spill.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/events/zed_io_config.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/events/zed_rc_filter.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/exec/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/exec/exec_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/exec/exec_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/exec/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fadvise/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fadvise/fadvise_sequential.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fadvise/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fallocate/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fallocate/fallocate_prealloc.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fallocate/fallocate_punch-hole.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fallocate/fallocate_zero-range.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fallocate/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fault/auto_offline_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fault/auto_online_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fault/auto_online_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fault/auto_replace_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fault/auto_replace_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fault/auto_spare_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fault/auto_spare_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fault/auto_spare_ashift.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fault/auto_spare_multiple.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fault/auto_spare_shared.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fault/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fault/decompress_fault.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fault/decrypt_fault.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fault/fault.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fault/scrub_after_resilver.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fault/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/fault/zpool_status_-s.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/features/async_destroy/async_destroy_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/features/async_destroy/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/features/async_destroy/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/features/large_dnode/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/features/large_dnode/large_dnode_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/features/large_dnode/large_dnode_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/features/large_dnode/large_dnode_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/features/large_dnode/large_dnode_004_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/features/large_dnode/large_dnode_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/features/large_dnode/large_dnode_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/features/large_dnode/large_dnode_007_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/features/large_dnode/large_dnode_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/features/large_dnode/large_dnode_009_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/features/large_dnode/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/grow/grow.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/grow/grow_pool_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/grow/grow_replicas_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/history/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/history/history.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/history/history_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/history/history_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/history/history_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/history/history_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/history/history_005_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/history/history_006_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/history/history_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/history/history_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/history/history_009_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/history/history_010_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/history/history_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/history/i386.migratedpool.DAT.Z
+%%TESTS%%share/zfs/zfs-tests/tests/functional/history/i386.orig_history.txt
+%%TESTS%%share/zfs/zfs-tests/tests/functional/history/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/history/sparc.migratedpool.DAT.Z
+%%TESTS%%share/zfs/zfs-tests/tests/functional/history/sparc.orig_history.txt
+%%TESTS%%share/zfs/zfs-tests/tests/functional/history/zfs-pool-v4.dat.Z
+%%TESTS%%share/zfs/zfs-tests/tests/functional/hkdf/hkdf_test
+%%TESTS%%share/zfs/zfs-tests/tests/functional/idmap_mount/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/idmap_mount/idmap_mount.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/idmap_mount/idmap_mount_001.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/idmap_mount/idmap_mount_002.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/idmap_mount/idmap_mount_003.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/idmap_mount/idmap_mount_004.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/idmap_mount/idmap_mount_005.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/idmap_mount/idmap_mount_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/idmap_mount/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/README.config
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/README.state
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config001.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config002.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config003.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config004.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config005.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config006.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config007.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config008.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config009.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config010.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config011.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config012.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config013.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config014.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config015.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config016.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config017.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config018.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config019.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config020.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config021.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config022.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config023.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/config024.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/inherit.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/inherit_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state001.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state002.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state003.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state004.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state005.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state006.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state007.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state008.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state009.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state010.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state011.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state012.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state013.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state014.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state015.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state016.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state017.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state018.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state019.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state020.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state021.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state022.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state023.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inheritance/state024.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inuse/inuse.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inuse/inuse_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inuse/inuse_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inuse/inuse_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inuse/inuse_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inuse/inuse_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inuse/inuse_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inuse/inuse_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inuse/inuse_009_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/inuse/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/io/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/io/io.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/io/io_uring.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/io/libaio.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/io/mmap.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/io/posixaio.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/io/psync.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/io/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/io/sync.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/l2arc/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/l2arc/l2arc.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/l2arc/l2arc_arcstats_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/l2arc/l2arc_l2miss_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/l2arc/l2arc_mfuonly_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/l2arc/persist_l2arc_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/l2arc/persist_l2arc_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/l2arc/persist_l2arc_003_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/l2arc/persist_l2arc_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/l2arc/persist_l2arc_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/l2arc/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/large_files/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/large_files/large_files_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/large_files/large_files_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/large_files/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/largest_pool/largest_pool.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/largest_pool/largest_pool_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/libzfs/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/libzfs/libzfs_input.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/libzfs/many_fds
+%%TESTS%%share/zfs/zfs-tests/tests/functional/libzfs/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/limits/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/limits/filesystem_count.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/limits/filesystem_limit.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/limits/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/limits/snapshot_count.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/limits/snapshot_limit.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/link_count/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/link_count/link_count_001.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/link_count/link_count_root_inode.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/link_count/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/log_spacemap/log_spacemap_import_logs.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/migration/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/migration/migration.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/migration/migration.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/migration/migration_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/migration/migration_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/migration/migration_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/migration/migration_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/migration/migration_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/migration/migration_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/migration/migration_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/migration/migration_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/migration/migration_009_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/migration/migration_010_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/migration/migration_011_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/migration/migration_012_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/migration/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmap/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmap/mmap.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmap/mmap_libaio_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmap/mmap_mixed.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmap/mmap_read_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmap/mmap_seek_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmap/mmap_sync_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmap/mmap_write_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmap/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmp/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmp/mmp.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmp/mmp.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmp/mmp_active_import.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmp/mmp_exported_import.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmp/mmp_hostid.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmp/mmp_inactive_import.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmp/mmp_interval.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmp/mmp_on_off.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmp/mmp_on_thread.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmp/mmp_on_uberblocks.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmp/mmp_on_zdb.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmp/mmp_reset_interval.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmp/mmp_write_distribution.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmp/mmp_write_uberblocks.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmp/multihost_history.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mmp/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mount/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mount/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mount/umount_001.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mount/umount_unlinked_drain.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mount/umountall_001.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mv_files/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mv_files/mv_files.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mv_files/mv_files_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mv_files/mv_files_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mv_files/mv_files_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mv_files/random_creation.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/mv_files/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/nestedfs/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/nestedfs/nestedfs_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/nestedfs/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/no_space/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/no_space/enospc.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/no_space/enospc_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/no_space/enospc_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/no_space/enospc_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/no_space/enospc_df.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/no_space/enospc_ganging.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/no_space/enospc_rm.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/no_space/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/nopwrite/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/nopwrite/nopwrite.shlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/nopwrite/nopwrite_copies.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/nopwrite/nopwrite_mtime.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/nopwrite/nopwrite_negative.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/nopwrite/nopwrite_promoted_clone.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/nopwrite/nopwrite_recsize.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/nopwrite/nopwrite_sync.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/nopwrite/nopwrite_varying_compression.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/nopwrite/nopwrite_volume.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/nopwrite/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/online_offline/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/online_offline/online_offline.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/online_offline/online_offline_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/online_offline/online_offline_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/online_offline/online_offline_003_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/online_offline/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pam/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pam/pam_basic.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pam/pam_change_unmounted.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pam/pam_nounmount.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pam/pam_recursive.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pam/pam_short_password.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pam/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pam/utilities.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/checkpoint_after_rewind.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/checkpoint_big_rewind.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/checkpoint_capacity.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/checkpoint_conf_change.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/checkpoint_discard.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/checkpoint_discard_busy.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/checkpoint_discard_many.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/checkpoint_indirect.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/checkpoint_invalid.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/checkpoint_lun_expsz.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/checkpoint_open.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/checkpoint_removal.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/checkpoint_rewind.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/checkpoint_ro_rewind.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/checkpoint_sm_scale.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/checkpoint_twice.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/checkpoint_vdev_add.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/checkpoint_zdb.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/checkpoint_zhack_feat.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/pool_checkpoint.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_checkpoint/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_names/pool_names_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pool_names/pool_names_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/poolversion/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/poolversion/poolversion_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/poolversion/poolversion_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/poolversion/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/privilege/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/privilege/privilege_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/privilege/privilege_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/privilege/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/procfs/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/procfs/pool_state.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/procfs/procfs_list_basic.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/procfs/procfs_list_concurrent_readers.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/procfs/procfs_list_stale_read.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/procfs/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projectid_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projectid_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projectid_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projectquota.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projectquota_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projectquota_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projectquota_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projectquota_004_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projectquota_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projectquota_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projectquota_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projectquota_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projectquota_009_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projectquota_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projectspace_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projectspace_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projectspace_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projectspace_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projecttree_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projecttree_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/projecttree_003_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/projectquota/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/pyzfs/pyzfs_unittest.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/quota/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/quota/quota.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/quota/quota.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/quota/quota_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/quota/quota_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/quota/quota_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/quota/quota_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/quota/quota_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/quota/quota_006_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/quota/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/raidz/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/raidz/raidz_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/raidz/raidz_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/raidz/raidz_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/raidz/raidz_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/raidz/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/redacted.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/redacted.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/redacted_compressed.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/redacted_contents.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/redacted_deleted.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/redacted_disabled_feature.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/redacted_embedded.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/redacted_holes.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/redacted_incrementals.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/redacted_largeblocks.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/redacted_many_clones.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/redacted_mixed_recsize.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/redacted_mounts.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/redacted_negative.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/redacted_origin.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/redacted_panic.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/redacted_props.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/redacted_resume.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/redacted_size.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/redacted_volume.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redacted_send/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redundancy/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redundancy/redundancy.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redundancy/redundancy.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redundancy/redundancy_draid.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redundancy/redundancy_draid1.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redundancy/redundancy_draid2.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redundancy/redundancy_draid3.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redundancy/redundancy_draid_damaged1.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redundancy/redundancy_draid_damaged2.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redundancy/redundancy_draid_spare1.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redundancy/redundancy_draid_spare2.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redundancy/redundancy_draid_spare3.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redundancy/redundancy_mirror.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redundancy/redundancy_raidz.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redundancy/redundancy_raidz1.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redundancy/redundancy_raidz2.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redundancy/redundancy_raidz3.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redundancy/redundancy_stripe.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/redundancy/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/refquota/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/refquota/refquota_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/refquota/refquota_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/refquota/refquota_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/refquota/refquota_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/refquota/refquota_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/refquota/refquota_006_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/refquota/refquota_007_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/refquota/refquota_008_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/refquota/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/refreserv/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/refreserv/refreserv.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/refreserv/refreserv_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/refreserv/refreserv_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/refreserv/refreserv_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/refreserv/refreserv_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/refreserv/refreserv_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/refreserv/refreserv_multi_raidz.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/refreserv/refreserv_raidz.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/refreserv/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_all_vdev.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_cancel.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_check_space.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_condense_export.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_multiple_indirection.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_nopwrite.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_remap_deadlists.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_reservation.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_resume_export.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_sanity.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_with_add.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_with_create_fs.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_with_dedup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_with_errors.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_with_export.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_with_faulted.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_with_ganging.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_with_indirect.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_with_remove.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_with_scrub.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_with_send.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_with_send_recv.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_with_snapshot.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_with_write.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/removal_with_zdb.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/remove_attach_mirror.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/remove_expanded.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/remove_indirect.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/remove_mirror.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/remove_mirror_sanity.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/removal/remove_raidz.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rename_dirs/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rename_dirs/rename_dirs_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rename_dirs/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/renameat2/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/renameat2/renameat2_exchange.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/renameat2/renameat2_noreplace.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/renameat2/renameat2_whiteout.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/renameat2/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/replacement/attach_import.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/replacement/attach_multiple.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/replacement/attach_rebuild.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/replacement/attach_resilver.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/replacement/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/replacement/detach.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/replacement/rebuild_disabled_feature.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/replacement/rebuild_multiple.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/replacement/rebuild_raidz.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/replacement/replace_import.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/replacement/replace_rebuild.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/replacement/replace_resilver.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/replacement/replacement.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/replacement/resilver_restart_001.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/replacement/resilver_restart_002.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/replacement/scrub_cancel.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/replacement/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation.shlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_009_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_010_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_011_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_012_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_013_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_014_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_015_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_016_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_017_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_018_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_019_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_020_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_021_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/reservation_022_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/reservation/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rootpool/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rootpool/rootpool_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rootpool/rootpool_003_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rootpool/rootpool_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rootpool/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/dedup.zsend.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/dedup_encrypted_zvol.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/dedup_encrypted_zvol.zsend.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/fs.tar.gz
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/recv_dedup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/recv_dedup_encrypted_zvol.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_009_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_010_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_011_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_012_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_013_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_014_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_016_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_019_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_020_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_021_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_022_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_024_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_025_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_026_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_027_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_028_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_029_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_030_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/rsend_031_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send-L_toggle.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send-c_embedded_blocks.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send-c_incremental.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send-c_lz4_disabled.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send-c_mixed_compression.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send-c_props.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send-c_recv_dedup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send-c_recv_lz4_disabled.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send-c_resume.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send-c_stream_size_estimate.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send-c_verify_contents.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send-c_verify_ratio.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send-c_volume.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send-c_zstream_recompress.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send-c_zstreamdump.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send-cpL_varied_recsize.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send-wR_encrypted_zvol.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send_doall.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send_encrypted_files.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send_encrypted_freeobjects.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send_encrypted_hierarchy.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send_encrypted_incremental.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send_encrypted_props.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send_encrypted_truncated_files.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send_freeobjects.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send_holds.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send_hole_birth.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send_invalid.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send_mixed_raw.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send_partial_dataset.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send_raw_ashift.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send_raw_large_blocks.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send_raw_spill_block.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send_realloc_dnode_size.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send_realloc_encrypted_files.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send_realloc_files.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/send_spill_block.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/rsend/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/scrub_mirror/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/scrub_mirror/default.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/scrub_mirror/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog_008_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog_009_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog_010_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog_011_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog_012_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog_013_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog_014_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog_015_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog_016_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog_replay_fs_001.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog_replay_fs_002.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/slog/slog_replay_volume.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/clone_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/rollback_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/rollback_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/rollback_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/snapshot.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/snapshot_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/snapshot_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/snapshot_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/snapshot_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/snapshot_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/snapshot_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/snapshot_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/snapshot_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/snapshot_009_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/snapshot_010_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/snapshot_011_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/snapshot_012_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/snapshot_013_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/snapshot_014_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/snapshot_015_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/snapshot_016_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/snapshot_017_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapshot/snapshot_018_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapused/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapused/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapused/snapused.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapused/snapused_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapused/snapused_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapused/snapused_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapused/snapused_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/snapused/snapused_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/sparse/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/sparse/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/sparse/sparse.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/sparse/sparse_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/stat/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/stat/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/stat/stat_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/suid/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/suid/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/suid/suid_write_to_none.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/suid/suid_write_to_sgid.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/suid/suid_write_to_suid.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/suid/suid_write_to_suid_sgid.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/suid/suid_write_zil_replay.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/trim/autotrim_config.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/trim/autotrim_integrity.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/trim/autotrim_trim_integrity.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/trim/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/trim/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/trim/trim.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/trim/trim.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/trim/trim_config.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/trim/trim_integrity.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/trim/trim_l2arc.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/truncate/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/truncate/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/truncate/truncate.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/truncate/truncate_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/truncate/truncate_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/truncate/truncate_timestamps.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/upgrade/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/upgrade/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/upgrade/upgrade_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/upgrade/upgrade_projectquota_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/upgrade/upgrade_readonly_pool.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/upgrade/upgrade_userobj_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/user_namespace/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/user_namespace/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/user_namespace/user_namespace.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/user_namespace/user_namespace_001.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/user_namespace/user_namespace_002.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/user_namespace/user_namespace_003.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/user_namespace/user_namespace_004.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/user_namespace/user_namespace_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/13709_reproducer.bz2
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/groupspace_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/groupspace_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/groupspace_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userquota.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userquota_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userquota_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userquota_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userquota_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userquota_005_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userquota_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userquota_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userquota_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userquota_009_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userquota_010_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userquota_011_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userquota_012_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userquota_013_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userquota_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userspace_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userspace_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userspace_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userspace_encrypted.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userspace_encrypted_13709.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/userquota/userspace_send_encrypted.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/vdev_zaps/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/vdev_zaps/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/vdev_zaps/vdev_zaps.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/vdev_zaps/vdev_zaps_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/vdev_zaps/vdev_zaps_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/vdev_zaps/vdev_zaps_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/vdev_zaps/vdev_zaps_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/vdev_zaps/vdev_zaps_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/vdev_zaps/vdev_zaps_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/vdev_zaps/vdev_zaps_007_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/write_dirs/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/write_dirs/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/write_dirs/write_dirs_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/write_dirs/write_dirs_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/xattr/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/xattr/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/xattr/xattr.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/xattr/xattr_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/xattr/xattr_002_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/xattr/xattr_003_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/xattr/xattr_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/xattr/xattr_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/xattr/xattr_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/xattr/xattr_007_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/xattr/xattr_008_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/xattr/xattr_009_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/xattr/xattr_010_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/xattr/xattr_011_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/xattr/xattr_012_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/xattr/xattr_013_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/xattr/xattr_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/xattr/xattr_compat.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zpool_influxdb/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zpool_influxdb/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zpool_influxdb/zpool_influxdb.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_ENOSPC/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_ENOSPC/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_ENOSPC/zvol_ENOSPC.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_ENOSPC/zvol_ENOSPC_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_cli/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_cli/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_cli/zvol_cli.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_cli/zvol_cli_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_cli/zvol_cli_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_cli/zvol_cli_003_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_common.shlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_misc/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_misc/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_001_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_003_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_005_neg.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_common.kshlib
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_fua.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_hierarchy.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_rename_inuse.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_snapdev.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_trim.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_volmode.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_zil.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_stress/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_stress/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_stress/zvol_stress.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_swap/cleanup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_swap/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_001_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_002_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_003_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_004_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_005_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_006_pos.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/perf/fio/mkfiles.fio
+%%TESTS%%share/zfs/zfs-tests/tests/perf/fio/random_reads.fio
+%%TESTS%%share/zfs/zfs-tests/tests/perf/fio/random_readwrite.fio
+%%TESTS%%share/zfs/zfs-tests/tests/perf/fio/random_readwrite_fixed.fio
+%%TESTS%%share/zfs/zfs-tests/tests/perf/fio/random_writes.fio
+%%TESTS%%share/zfs/zfs-tests/tests/perf/fio/sequential_reads.fio
+%%TESTS%%share/zfs/zfs-tests/tests/perf/fio/sequential_readwrite.fio
+%%TESTS%%share/zfs/zfs-tests/tests/perf/fio/sequential_writes.fio
+%%TESTS%%share/zfs/zfs-tests/tests/perf/nfs-sample.cfg
+%%TESTS%%share/zfs/zfs-tests/tests/perf/perf.shlib
+%%TESTS%%share/zfs/zfs-tests/tests/perf/regression/random_reads.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/perf/regression/random_readwrite.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/perf/regression/random_readwrite_fixed.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/perf/regression/random_writes.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/perf/regression/random_writes_zil.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/perf/regression/sequential_reads.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/perf/regression/sequential_reads_arc_cached.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/perf/regression/sequential_reads_arc_cached_clone.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/perf/regression/sequential_reads_dbuf_cached.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/perf/regression/sequential_writes.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/perf/regression/setup.ksh
+%%TESTS%%share/zfs/zfs-tests/tests/perf/scripts/prefetch_io.sh
+%%TESTS%%share/zfs/zfs.sh
+%%TESTS%%share/zfs/zimport.sh
+%%TESTS%%share/zfs/zloop.sh
diff --git a/filesystems/p5-Filesys-Statvfs/Makefile b/filesystems/p5-Filesys-Statvfs/Makefile
new file mode 100644
index 000000000000..cb5c0edb80b7
--- /dev/null
+++ b/filesystems/p5-Filesys-Statvfs/Makefile
@@ -0,0 +1,15 @@
+PORTNAME= Filesys-Statvfs
+PORTVERSION= 0.82
+PORTREVISION= 1
+CATEGORIES= filesystems sysutils perl5
+MASTER_SITES= CPAN
+PKGNAMEPREFIX= p5-
+
+MAINTAINER= pirzyk@FreeBSD.org
+COMMENT= Perl extension for statvfs() and fstatvfs()
+WWW= https://metacpan.org/release/Filesys-Statvfs
+
+USES= perl5
+USE_PERL5= configure
+
+.include <bsd.port.mk>
diff --git a/filesystems/p5-Filesys-Statvfs/distinfo b/filesystems/p5-Filesys-Statvfs/distinfo
new file mode 100644
index 000000000000..d86ff35b399a
--- /dev/null
+++ b/filesystems/p5-Filesys-Statvfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905189
+SHA256 (Filesys-Statvfs-0.82.tar.gz) = dc9494ca17af2b5226d50313efc5f02f3ff268d71c653cdb39bdd65fb3cf916a
+SIZE (Filesys-Statvfs-0.82.tar.gz) = 3964
diff --git a/filesystems/p5-Filesys-Statvfs/pkg-descr b/filesystems/p5-Filesys-Statvfs/pkg-descr
new file mode 100644
index 000000000000..af468cd421ee
--- /dev/null
+++ b/filesystems/p5-Filesys-Statvfs/pkg-descr
@@ -0,0 +1,13 @@
+Interface for statvfs() and fstatvfs()
+
+Unless you need access to the bsize, flag, and namemax values, you should
+probably look at using Filesys::DfPortable or Filesys::Df instead.
+
+The statvfs() and fstatvfs() functions will return a list of values, or
+will return undef and set $! if there was an error.
+
+The values returned are described in the statvfs header or the statvfs()
+man page.
+
+The module assumes that if you have statvfs(), fstatvfs() will also be
+available.
diff --git a/filesystems/p5-Filesys-Statvfs/pkg-plist b/filesystems/p5-Filesys-Statvfs/pkg-plist
new file mode 100644
index 000000000000..4cd96e0eafc2
--- /dev/null
+++ b/filesystems/p5-Filesys-Statvfs/pkg-plist
@@ -0,0 +1,3 @@
+%%SITE_ARCH%%/Filesys/Statvfs.pm
+%%SITE_ARCH%%/auto/Filesys/Statvfs/Statvfs.so
+%%PERL5_MAN3%%/Filesys::Statvfs.3.gz
diff --git a/filesystems/p5-Fuse/Makefile b/filesystems/p5-Fuse/Makefile
new file mode 100644
index 000000000000..d26754813ba8
--- /dev/null
+++ b/filesystems/p5-Fuse/Makefile
@@ -0,0 +1,23 @@
+PORTNAME= Fuse
+PORTVERSION= 0.16.1
+PORTREVISION= 2
+CATEGORIES= filesystems sysutils perl5
+MASTER_SITES= CPAN
+MASTER_SITE_SUBDIR= CPAN:DPATES
+PKGNAMEPREFIX= p5-
+
+MAINTAINER= perl@FreeBSD.org
+COMMENT= Write filesystems in Perl using FUSE
+WWW= https://metacpan.org/release/Fuse
+
+LICENSE= LGPL21
+
+USES= perl5 fuse pkgconfig
+USE_PERL5= configure
+
+PORTSCOUT= limit:^[0-9\.]*$$
+
+post-install:
+ ${STRIP_CMD} ${STAGEDIR}${PREFIX}/${SITE_ARCH_REL}/auto/Fuse/Fuse.so
+
+.include <bsd.port.mk>
diff --git a/filesystems/p5-Fuse/distinfo b/filesystems/p5-Fuse/distinfo
new file mode 100644
index 000000000000..a779be4f8ec4
--- /dev/null
+++ b/filesystems/p5-Fuse/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905168
+SHA256 (Fuse-0.16.1.tar.gz) = 13a2e923f247781acb79259f4e57ee62aa392e36a6df110fa56e1970010d1127
+SIZE (Fuse-0.16.1.tar.gz) = 43004
diff --git a/filesystems/p5-Fuse/pkg-descr b/filesystems/p5-Fuse/pkg-descr
new file mode 100644
index 000000000000..06ddb4bde5c6
--- /dev/null
+++ b/filesystems/p5-Fuse/pkg-descr
@@ -0,0 +1,14 @@
+This lets you implement filesystems in perl, through the FUSE
+(Filesystem in USErspace) kernel/lib interface.
+
+FUSE expects you to implement callbacks for the various functions.
+
+In the following definitions, "errno" can be 0 (for a success),
+-EINVAL, -ENOENT, -EONFIRE, any integer less than 1 really.
+
+You can import standard error constants by saying something like "use
+POSIX qw(EDOTDOT ENOANO);".
+
+Every constant you need (file types, open() flags, error values, etc)
+can be imported either from POSIX or from Fcntl, often both. See their
+respective documentations, for more information.
diff --git a/filesystems/p5-Fuse/pkg-plist b/filesystems/p5-Fuse/pkg-plist
new file mode 100644
index 000000000000..8125fb7a462a
--- /dev/null
+++ b/filesystems/p5-Fuse/pkg-plist
@@ -0,0 +1,4 @@
+%%SITE_ARCH%%/Fuse.pm
+%%SITE_ARCH%%/auto/Fuse/Fuse.so
+%%SITE_ARCH%%/auto/Fuse/autosplit.ix
+%%PERL5_MAN3%%/Fuse.3.gz
diff --git a/filesystems/pear-Horde_Vfs/Makefile b/filesystems/pear-Horde_Vfs/Makefile
new file mode 100644
index 000000000000..a119b27240b5
--- /dev/null
+++ b/filesystems/pear-Horde_Vfs/Makefile
@@ -0,0 +1,24 @@
+PORTNAME= Horde_Vfs
+PORTVERSION= 2.4.2
+CATEGORIES= filesystems sysutils www pear
+PKGNAMEPREFIX= ${PEAR_PKGNAMEPREFIX}
+
+MAINTAINER= horde@FreeBSD.org
+COMMENT= Horde Virtual File System API
+WWW= https://pear.horde.org
+
+USE_HORDE_RUN= Horde_Exception \
+ Horde_Translation \
+ Horde_Util
+
+OPTIONS_DEFINE= FTP
+FTP_DESC= Depend on FTP PHP extension
+
+USES= horde
+
+FTP_USES= php
+FTP_USE= PHP=ftp
+
+CONFLICTS_INSTALL= php*-pear-Horde_Vfs # bin/horde-vfs
+
+.include <bsd.port.mk>
diff --git a/filesystems/pear-Horde_Vfs/distinfo b/filesystems/pear-Horde_Vfs/distinfo
new file mode 100644
index 000000000000..f93c76e1c8b9
--- /dev/null
+++ b/filesystems/pear-Horde_Vfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1641590948
+SHA256 (Horde/Horde_Vfs-2.4.2.tgz) = dcfdf4653b4d4f03ee24e4c686b8e9149aba7c7ccec56b60d51a79916a37a836
+SIZE (Horde/Horde_Vfs-2.4.2.tgz) = 75828
diff --git a/filesystems/pear-Horde_Vfs/pkg-descr b/filesystems/pear-Horde_Vfs/pkg-descr
new file mode 100644
index 000000000000..dd4d38627a97
--- /dev/null
+++ b/filesystems/pear-Horde_Vfs/pkg-descr
@@ -0,0 +1,11 @@
+This package provides a Virtual File System API, with backends for:
+* SQL
+* FTP
+* Local filesystems
+* Hybrid SQL and filesystem
+* Samba
+* SSH2/SFTP
+* IMAP (Kolab)
+
+Reading, writing and listing of files are all supported, and there are both
+object-based and array-based interfaces to directory listings.
diff --git a/filesystems/pod/Makefile b/filesystems/pod/Makefile
new file mode 100644
index 000000000000..c529f422b50e
--- /dev/null
+++ b/filesystems/pod/Makefile
@@ -0,0 +1,21 @@
+PORTNAME= pod
+PORTVERSION= 0.5.2
+PORTREVISION= 16
+CATEGORIES= filesystems audio
+MASTER_SITES= SF/fuse${PORTNAME}/fuse${PORTNAME}/FUSEPod%20v${PORTVERSION}
+PKGNAMEPREFIX= fusefs-
+DISTNAME= fusepod-${PORTVERSION}
+
+MAINTAINER= ports@FreeBSD.org
+COMMENT= FUSE-based filesystem for iPod
+WWW= https://fusepod.sourceforge.net/
+
+LIB_DEPENDS= libgpod.so:audio/libgpod\
+ libtag.so:audio/taglib
+
+USES= compiler:c++11-lang fuse pkgconfig tar:bzip2
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+PLIST_FILES= bin/fusepod share/man/man1/fusepod.1.gz
+
+.include <bsd.port.mk>
diff --git a/filesystems/pod/distinfo b/filesystems/pod/distinfo
new file mode 100644
index 000000000000..e4ce1b828068
--- /dev/null
+++ b/filesystems/pod/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905181
+SHA256 (fusepod-0.5.2.tar.bz2) = 210d77cb2ec7701d4af681e63c4f52bc4d0c8cbfa493f55d3d9580e7106b857f
+SIZE (fusepod-0.5.2.tar.bz2) = 80923
diff --git a/filesystems/pod/files/patch-configure b/filesystems/pod/files/patch-configure
new file mode 100644
index 000000000000..2cf3daa10dd1
--- /dev/null
+++ b/filesystems/pod/files/patch-configure
@@ -0,0 +1,11 @@
+--- configure.orig Wed Aug 22 22:03:08 2007
++++ configure Wed Aug 22 22:03:20 2007
+@@ -3455,7 +3455,7 @@
+ taglib_LIBS=`$TAGLIB_CONFIG --libs`
+ fi
+
+-CPPFLAGS="$CPPFLAGS -Wall -O2 -D_FILE_OFFSET_BITS=64 -DFUSE_USE_VERSION=25 $FUSE_CPPFLAGS $libgpod_CFLAGS $taglib_CFLAGS"
++CPPFLAGS="$CPPFLAGS -Wall -O2 -D_FILE_OFFSET_BITS=64 -DFUSE_USE_VERSION=25 $FUSE_CFLAGS $libgpod_CFLAGS $taglib_CFLAGS"
+ LIBS="$FUSE_LIBS $libgpod_LIBS $taglib_LIBS"
+
+ ac_config_files="$ac_config_files Makefile src/Makefile man/Makefile"
diff --git a/filesystems/pod/files/patch-src_fusepod__ipod.h b/filesystems/pod/files/patch-src_fusepod__ipod.h
new file mode 100644
index 000000000000..c0f147ea9465
--- /dev/null
+++ b/filesystems/pod/files/patch-src_fusepod__ipod.h
@@ -0,0 +1,12 @@
+--- src/fusepod_ipod.h.orig 2021-08-02 02:27:26 UTC
++++ src/fusepod_ipod.h
+@@ -15,9 +15,7 @@
+ #ifndef _FUSEPOD_IPOD_H_
+ #define _FUSEPOD_IPOD_H_
+
+-extern "C" {
+ #include <gpod/itdb.h>
+-}
+
+ #include <string>
+ #include <cstring>
diff --git a/filesystems/pod/files/patch-src_fusepod__util.h b/filesystems/pod/files/patch-src_fusepod__util.h
new file mode 100644
index 000000000000..e4bb07a47865
--- /dev/null
+++ b/filesystems/pod/files/patch-src_fusepod__util.h
@@ -0,0 +1,10 @@
+--- src/fusepod_util.h.orig 2019-04-09 11:38:35 UTC
++++ src/fusepod_util.h
+@@ -15,6 +15,7 @@
+ #ifndef _FUSEPOD_UTIL_H_
+ #define _FUSEPOD_UTIL_H_
+
++#include <strings.h>
+ #include <vector>
+ #include <string>
+
diff --git a/filesystems/pod/pkg-descr b/filesystems/pod/pkg-descr
new file mode 100644
index 000000000000..9628c63574f1
--- /dev/null
+++ b/filesystems/pod/pkg-descr
@@ -0,0 +1,4 @@
+FUSEPod is a userspace filesystem which mounts your iPod into a directory
+for easy browsing of your songs on your iPod. It features a configurable
+directory layout, read/write support, read support for playlists and finds
+where your iPod is.
diff --git a/filesystems/progsreiserfs/Makefile b/filesystems/progsreiserfs/Makefile
new file mode 100644
index 000000000000..77c84c817a49
--- /dev/null
+++ b/filesystems/progsreiserfs/Makefile
@@ -0,0 +1,44 @@
+PORTNAME= progsreiserfs
+DISTVERSION= 0.3.1-rc8
+PORTREVISION= 8
+CATEGORIES= filesystems sysutils
+MASTER_SITES= http://www.cgsecurity.org/
+
+MAINTAINER= ports@FreeBSD.org
+COMMENT= Utilities and library to manipulate ReiserFS partitions
+WWW= https://reiserfs.osdn.org.ua
+
+LICENSE= GPLv2
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+USES= libtool
+USE_LDCONFIG= yes
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+CONFIGURE_ARGS= --disable-debug --disable-Werror
+CFLAGS+= -Dgetopt_long_only=getopt_long
+
+EXTRA_PATCHES= ${FILESDIR}/extrapatch-progsreiserfs_libmisc_Makefile.in
+
+OPTIONS_DEFINE= NLS
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MNLS}
+USES+= gettext
+CPPFLAGS+= -I${LOCALBASE}/include
+LDFLAGS+= -L${LOCALBASE}/lib
+.else
+CONFIGURE_ARGS+=--disable-nls
+.endif
+
+post-patch:
+ @${REINPLACE_CMD} '/_LDADD =/s/=/= $$(INTLLIBS)/' \
+ ${WRKSRC}/demos/Makefile.in
+ @${REINPLACE_CMD} -e 's|sys/int_types.h|inttypes.h|' \
+ ${WRKSRC}/libreiserfs/tools.c ${WRKSRC}/include/reiserfs/*
+
+post-install:
+ ${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/*.so
+
+.include <bsd.port.mk>
diff --git a/filesystems/progsreiserfs/distinfo b/filesystems/progsreiserfs/distinfo
new file mode 100644
index 000000000000..851742dec79c
--- /dev/null
+++ b/filesystems/progsreiserfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905181
+SHA256 (progsreiserfs-0.3.1-rc8.tar.gz) = 1473899a21df0679a32ebde5a35c158468a7e51a0cb6fd89d77c42bfde9b6399
+SIZE (progsreiserfs-0.3.1-rc8.tar.gz) = 399279
diff --git a/filesystems/progsreiserfs/files/extrapatch-progsreiserfs_libmisc_Makefile.in b/filesystems/progsreiserfs/files/extrapatch-progsreiserfs_libmisc_Makefile.in
new file mode 100644
index 000000000000..b482ec8293dd
--- /dev/null
+++ b/filesystems/progsreiserfs/files/extrapatch-progsreiserfs_libmisc_Makefile.in
@@ -0,0 +1,37 @@
+--- progsreiserfs/libmisc/Makefile.in.orig 2002-12-12 12:38:22 UTC
++++ progsreiserfs/libmisc/Makefile.in
+@@ -110,7 +110,7 @@ am__quote = @am__quote@
+ install_sh = @install_sh@
+
+ noinst_LTLIBRARIES = libmisc.la
+-libmisc_la_SOURCES = tools.c getopt.c getopt1.c
++libmisc_la_SOURCES = tools.c getopt.c
+
+ INCLUDES = -I$(top_srcdir)/include @INTLINCS@
+ subdir = progsreiserfs/libmisc
+@@ -121,7 +121,7 @@ LTLIBRARIES = $(noinst_LTLIBRARIES)
+
+ libmisc_la_LDFLAGS =
+ libmisc_la_LIBADD =
+-am_libmisc_la_OBJECTS = tools.lo getopt.lo getopt1.lo
++am_libmisc_la_OBJECTS = tools.lo getopt.lo
+ libmisc_la_OBJECTS = $(am_libmisc_la_OBJECTS)
+
+ DEFS = @DEFS@
+@@ -130,7 +130,7 @@ CPPFLAGS = @CPPFLAGS@
+ LDFLAGS = @LDFLAGS@
+ LIBS = @LIBS@
+ depcomp = $(SHELL) $(top_srcdir)/depcomp
+-@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/getopt.Plo $(DEPDIR)/getopt1.Plo \
++@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/getopt.Plo \
+ @AMDEP_TRUE@ $(DEPDIR)/tools.Plo
+ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+@@ -177,7 +177,6 @@ distclean-compile:
+ -rm -f *.tab.c
+
+ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getopt.Plo@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getopt1.Plo@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/tools.Plo@am__quote@
+
+ distclean-depend:
diff --git a/filesystems/progsreiserfs/files/patch-libdal_file.c b/filesystems/progsreiserfs/files/patch-libdal_file.c
new file mode 100644
index 000000000000..76a7926d532f
--- /dev/null
+++ b/filesystems/progsreiserfs/files/patch-libdal_file.c
@@ -0,0 +1,26 @@
+--- libdal/file.c.orig 2002-12-12 12:32:34 UTC
++++ libdal/file.c
+@@ -14,6 +14,7 @@
+
+ #if defined(__freebsd__)
+ # define O_LARGEFILE 0
++# include <sys/disk.h>
+ #endif
+
+ #ifndef DJGPP
+@@ -154,6 +155,15 @@ static count_t file_len(dal_t *dal) {
+
+ #endif
+
++#ifdef DIOCGMEDIASIZE
++
++ if (ioctl(*((int *)dal->entity), DIOCGMEDIASIZE, &size) >= 0)
++ return (count_t)(size / dal->blocksize);
++
++ file_save_error(dal);
++
++#endif
++
+ if ((max_off = lseek(*((int *)dal->entity), 0, SEEK_END)) == (off_t)-1) {
+ file_save_error(dal);
+ return 0;
diff --git a/filesystems/progsreiserfs/files/patch-libreiserfs_journal.c b/filesystems/progsreiserfs/files/patch-libreiserfs_journal.c
new file mode 100644
index 000000000000..da24c4593308
--- /dev/null
+++ b/filesystems/progsreiserfs/files/patch-libreiserfs_journal.c
@@ -0,0 +1,11 @@
+--- libreiserfs/journal.c.orig 2002-12-12 12:32:35 UTC
++++ libreiserfs/journal.c
+@@ -482,7 +482,7 @@ static int callback_journal_replay(reise
+ blk_t reiserfs_journal_boundary_transactions(reiserfs_journal_t *journal,
+ reiserfs_journal_trans_t *oldest, reiserfs_journal_trans_t *newest)
+ {
+- reiserfs_gauge_t *gauge;
++ reiserfs_gauge_t *gauge = NULL;
+ struct reiserfs_replay_desc desc;
+
+ desc.oldest_id = 0xffffffff; desc.newest_id = 0x0;
diff --git a/filesystems/progsreiserfs/pkg-descr b/filesystems/progsreiserfs/pkg-descr
new file mode 100644
index 000000000000..db3516d4aedd
--- /dev/null
+++ b/filesystems/progsreiserfs/pkg-descr
@@ -0,0 +1,6 @@
+This is a library for reiserfs filesystem access and manipulation.
+The primary goal is to develop the nice, full functionality library
+wich might be linked against any projects which needed reiserfs filesystem
+access. There are GNU Parted, GNU GRUB, Yaboot, Partimage, EVMS, etc.
+
+progsreiserfs supports versions 3.5, 3.6 with standard and relocated journal.
diff --git a/filesystems/progsreiserfs/pkg-plist b/filesystems/progsreiserfs/pkg-plist
new file mode 100644
index 000000000000..76e0ff06b7ad
--- /dev/null
+++ b/filesystems/progsreiserfs/pkg-plist
@@ -0,0 +1,40 @@
+include/dal/dal.h
+include/dal/file.h
+include/reiserfs/bitmap.h
+include/reiserfs/block.h
+include/reiserfs/core.h
+include/reiserfs/dir.h
+include/reiserfs/endian.h
+include/reiserfs/exception.h
+include/reiserfs/file.h
+include/reiserfs/filesystem.h
+include/reiserfs/gauge.h
+include/reiserfs/hashes.h
+include/reiserfs/journal.h
+include/reiserfs/key.h
+include/reiserfs/node.h
+include/reiserfs/object.h
+include/reiserfs/path.h
+include/reiserfs/reiserfs.h
+include/reiserfs/segment.h
+include/reiserfs/tools.h
+include/reiserfs/tree.h
+lib/libdal-0.3.so.0
+lib/libdal-0.3.so.0.0.1
+lib/libdal.a
+lib/libdal.so
+lib/libreiserfs-0.3.so.0
+lib/libreiserfs-0.3.so.0.0.1
+lib/libreiserfs.a
+lib/libreiserfs.so
+share/man/man8/cpfs.reiserfs.8.gz
+share/man/man8/mkfs.reiserfs.8.gz
+share/man/man8/reiserfs.8.gz
+share/man/man8/resizefs.reiserfs.8.gz
+share/man/man8/tunefs.reiserfs.8.gz
+sbin/cpfs.reiserfs
+sbin/fsck.reiserfs
+sbin/mkfs.reiserfs
+sbin/resizefs.reiserfs
+sbin/tunefs.reiserfs
+share/aclocal/progsreiserfs.m4
diff --git a/filesystems/py-dfvfs/Makefile b/filesystems/py-dfvfs/Makefile
new file mode 100644
index 000000000000..cf96f98a9a0c
--- /dev/null
+++ b/filesystems/py-dfvfs/Makefile
@@ -0,0 +1,60 @@
+PORTNAME= dfvfs
+PORTVERSION= 20231208
+PORTREVISION= 1
+CATEGORIES= filesystems security devel python
+MASTER_SITES= https://github.com/log2timeline/dfvfs/releases/download/${PORTVERSION}/ \
+ LOCAL/antoine
+PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
+
+MAINTAINER= antoine@FreeBSD.org
+COMMENT= Digital Forensics Virtual File System
+WWW= https://github.com/log2timeline/dfvfs
+
+LICENSE= APACHE20
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+RUN_DEPENDS= libbde>=a:filesystems/libbde \
+ libewf>=0:devel/libewf \
+ libfsapfs>=e:filesystems/libfsapfs \
+ libfsext>=e:filesystems/libfsext \
+ libfsfat>=e:filesystems/libfsfat \
+ libfshfs>=e:filesystems/libfshfs \
+ libfsntfs>=e:filesystems/libfsntfs \
+ libfsxfs>=e:filesystems/libfsxfs \
+ libfvde>=0:sysutils/libfvde \
+ libfwnt>=e:devel/libfwnt \
+ libluksde>=e:devel/libluksde \
+ libmodi>=e:filesystems/libmodi \
+ libphdi>=e:devel/libphdi \
+ libqcow>=a:devel/libqcow \
+ libsigscan>=e:devel/libsigscan \
+ libsmdev>=a:devel/libsmdev \
+ libsmraw>=a:devel/libsmraw \
+ libvhdi>=e:devel/libvhdi \
+ libvmdk>=e:devel/libvmdk \
+ libvsapm>=e:devel/libvsapm \
+ libvsgpt>=e:devel/libvsgpt \
+ libvshadow>=0:devel/libvshadow \
+ libvslvm>=e:devel/libvslvm \
+ ${PYTHON_PKGNAMEPREFIX}dfdatetime>=0:security/py-dfdatetime@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}dtfabric>=0:devel/py-dtfabric@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}pytsk>=0:sysutils/py-pytsk@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}sqlite3>=0:databases/py-sqlite3@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}xattr>=0:devel/py-xattr@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}pyyaml>=3.10:devel/py-pyyaml@${PY_FLAVOR}
+
+USES= python
+USE_LOCALE= en_US.UTF-8
+USE_PYTHON= autoplist concurrent cryptography distutils
+DO_MAKE_TEST= ${SETENV} ${TEST_ENV} ${PYTHON_CMD}
+TEST_TARGET= run_tests.py
+
+NO_ARCH= yes
+
+# Upstream archive contains files with UTF-8 names
+EXTRACT_CMD= ${SETENV} LC_ALL=en_US.UTF-8 /usr/bin/bsdtar
+
+post-patch:
+ ${REINPLACE_CMD} "/cffi/d" ${WRKSRC}/requirements.txt
+
+.include <bsd.port.mk>
diff --git a/filesystems/py-dfvfs/distinfo b/filesystems/py-dfvfs/distinfo
new file mode 100644
index 000000000000..7566b547002f
--- /dev/null
+++ b/filesystems/py-dfvfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1707754540
+SHA256 (dfvfs-20231208.tar.gz) = 522e5225738c14b9134001a7147cf5688538efe4ca42c6536837bb650a204664
+SIZE (dfvfs-20231208.tar.gz) = 98086866
diff --git a/filesystems/py-dfvfs/pkg-descr b/filesystems/py-dfvfs/pkg-descr
new file mode 100644
index 000000000000..cfddc03f0d97
--- /dev/null
+++ b/filesystems/py-dfvfs/pkg-descr
@@ -0,0 +1,5 @@
+dfVFS, or Digital Forensics Virtual File System, provides read-only access to
+file-system objects from various storage media types and file formats. The goal
+of dfVFS is to provide a generic interface for accessing file-system objects,
+for which it uses several back-ends that provide the actual implementation of
+the various storage media types, volume systems and file systems.
diff --git a/filesystems/py-fs/Makefile b/filesystems/py-fs/Makefile
new file mode 100644
index 000000000000..f9b5d57677ca
--- /dev/null
+++ b/filesystems/py-fs/Makefile
@@ -0,0 +1,20 @@
+PORTNAME= fs
+PORTVERSION= 0.5.4
+PORTREVISION= 1
+CATEGORIES= filesystems devel python
+MASTER_SITES= PYPI
+PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
+
+MAINTAINER= douglas@douglasthrift.net
+COMMENT= Python filesystem abstraction
+WWW= https://pyfilesystem.org/
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/LICENSE.txt
+
+USES= dos2unix python
+USE_PYTHON= autoplist concurrent distutils
+
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/filesystems/py-fs/distinfo b/filesystems/py-fs/distinfo
new file mode 100644
index 000000000000..1c22b48a1ee9
--- /dev/null
+++ b/filesystems/py-fs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905183
+SHA256 (fs-0.5.4.tar.gz) = ba2cca8773435a7c86059d57cb4b8ea30fda40f8610941f7822d1ce3ffd36197
+SIZE (fs-0.5.4.tar.gz) = 231333
diff --git a/filesystems/py-fs/files/patch-2to3 b/filesystems/py-fs/files/patch-2to3
new file mode 100644
index 000000000000..5e5874a2a21b
--- /dev/null
+++ b/filesystems/py-fs/files/patch-2to3
@@ -0,0 +1,5882 @@
+--- fs/appdirfs.py.orig 2015-04-12 17:24:29 UTC
++++ fs/appdirfs.py
+@@ -84,6 +84,6 @@ class UserLogFS(OSFS):
+
+ if __name__ == "__main__":
+ udfs = UserDataFS('exampleapp', appauthor='pyfs')
+- print udfs
++ print(udfs)
+ udfs2 = UserDataFS('exampleapp2', appauthor='pyfs', create=False)
+- print udfs2
++ print(udfs2)
+--- fs/appdirs.py.orig 2022-03-04 17:14:43 UTC
++++ fs/appdirs.py
+@@ -21,7 +21,7 @@ import os
+ PY3 = sys.version_info[0] == 3
+
+ if PY3:
+- unicode = str
++ str = str
+
+ class AppDirsError(Exception):
+ pass
+@@ -248,7 +248,7 @@ def _get_win_folder_from_registry(csidl_name):
+ registry for this guarantees us the correct answer for all CSIDL_*
+ names.
+ """
+- import _winreg
++ import winreg
+
+ shell_folder_name = {
+ "CSIDL_APPDATA": "AppData",
+@@ -256,9 +256,9 @@ def _get_win_folder_from_registry(csidl_name):
+ "CSIDL_LOCAL_APPDATA": "Local AppData",
+ }[csidl_name]
+
+- key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER,
++ key = winreg.OpenKey(winreg.HKEY_CURRENT_USER,
+ r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders")
+- dir, type = _winreg.QueryValueEx(key, shell_folder_name)
++ dir, type = winreg.QueryValueEx(key, shell_folder_name)
+ return dir
+
+ def _get_win_folder_with_pywin32(csidl_name):
+@@ -268,7 +268,7 @@ def _get_win_folder_with_pywin32(csidl_name):
+ # not return unicode strings when there is unicode data in the
+ # path.
+ try:
+- dir = unicode(dir)
++ dir = str(dir)
+
+ # Downgrade to short path name if have highbit chars. See
+ # <http://bugs.activestate.com/show_bug.cgi?id=85099>.
+@@ -337,9 +337,9 @@ if __name__ == "__main__":
+ print("-- app dirs (without optional 'version')")
+ dirs = AppDirs(appname, appauthor, version="1.0")
+ for prop in props:
+- print("%s: %s" % (prop, getattr(dirs, prop)))
++ print(("%s: %s" % (prop, getattr(dirs, prop))))
+
+ print("\n-- app dirs (with optional 'version')")
+ dirs = AppDirs(appname, appauthor)
+ for prop in props:
+- print("%s: %s" % (prop, getattr(dirs, prop)))
++ print(("%s: %s" % (prop, getattr(dirs, prop))))
+--- fs/base.py.orig 2022-03-04 17:14:43 UTC
++++ fs/base.py
+@@ -12,8 +12,8 @@ For more information regarding implementing a working
+
+ """
+
+-from __future__ import with_statement
+
++
+ __all__ = ['DummyLock',
+ 'silence_fserrors',
+ 'NullFile',
+@@ -109,7 +109,7 @@ class NullFile(object):
+ def flush(self):
+ pass
+
+- def next(self):
++ def __next__(self):
+ raise StopIteration
+
+ def readline(self, *args, **kwargs):
+@@ -900,7 +900,7 @@ class FS(object):
+ chunk_size=1024 * 64,
+ progress_callback=progress_callback,
+ finished_callback=finished_callback)
+- except Exception, e:
++ except Exception as e:
+ if error_callback is not None:
+ error_callback(e)
+ finally:
+@@ -1156,7 +1156,7 @@ class FS(object):
+ def _shutil_copyfile(cls, src_syspath, dst_syspath):
+ try:
+ shutil.copyfile(src_syspath, dst_syspath)
+- except IOError, e:
++ except IOError as e:
+ # shutil reports ENOENT when a parent directory is missing
+ if getattr(e, "errno", None) == errno.ENOENT:
+ if not os.path.exists(dirname(dst_syspath)):
+--- fs/browsewin.py.orig 2022-03-04 17:14:43 UTC
++++ fs/browsewin.py
+@@ -24,7 +24,7 @@ class InfoFrame(wx.Frame):
+
+ self.SetTitle("FS Object info - %s (%s)" % (path, desc))
+
+- keys = info.keys()
++ keys = list(info.keys())
+ keys.sort()
+
+ self.list_ctrl = wx.ListCtrl(self, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER)
+@@ -36,7 +36,7 @@ class InfoFrame(wx.Frame):
+ self.list_ctrl.SetColumnWidth(1, 300)
+
+ for key in sorted(keys, key=lambda k:k.lower()):
+- self.list_ctrl.Append((key, unicode(info.get(key))))
++ self.list_ctrl.Append((key, str(info.get(key))))
+
+ self.Center()
+
+@@ -50,7 +50,7 @@ class BrowseFrame(wx.Frame):
+
+ self.fs = fs
+ self.hide_dotfiles = hide_dotfiles
+- self.SetTitle("FS Browser - " + unicode(fs))
++ self.SetTitle("FS Browser - " + str(fs))
+
+ self.tree = wx.gizmos.TreeListCtrl(self, -1, style=wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT)
+
+@@ -105,7 +105,7 @@ class BrowseFrame(wx.Frame):
+ try:
+ paths = ( [(True, p) for p in self.fs.listdir(path, absolute=True, dirs_only=True)] +
+ [(False, p) for p in self.fs.listdir(path, absolute=True, files_only=True)] )
+- except FSError, e:
++ except FSError as e:
+ msg = "Failed to get directory listing for %s\n\nThe following error was reported:\n\n%s" % (path, e)
+ wx.MessageDialog(self, msg, "Error listing directory", wx.OK).ShowModal()
+ paths = []
+@@ -194,6 +194,6 @@ def browse(fs, hide_dotfiles=False):
+
+
+ if __name__ == "__main__":
+- from osfs import OSFS
++ from .osfs import OSFS
+ home_fs = OSFS("~/")
+ browse(home_fs, True)
+--- fs/commands/fscp.py.orig 2022-03-04 17:14:43 UTC
++++ fs/commands/fscp.py
+@@ -3,7 +3,7 @@ from fs.utils import copyfile, copyfile_non_atomic
+ from fs.path import pathjoin, iswildcard
+ from fs.commands.runner import Command
+ import sys
+-import Queue as queue
++import queue as queue
+ import time
+ import threading
+
+@@ -31,7 +31,7 @@ class FileOpThread(threading.Thread):
+ self.dest_fs.makedir(path, recursive=True, allow_recreate=True)
+ else:
+ self.action(fs, path, self.dest_fs, dest_path, overwrite=True)
+- except Exception, e:
++ except Exception as e:
+ self.on_error(e)
+ self.queue.task_done()
+ break
+@@ -147,7 +147,7 @@ Copy SOURCE to DESTINATION"""
+ file_queue,
+ self.on_done,
+ self.on_error)
+- for i in xrange(options.threads)]
++ for i in range(options.threads)]
+
+ for thread in threads:
+ thread.start()
+@@ -188,7 +188,7 @@ Copy SOURCE to DESTINATION"""
+
+ if self.action_errors:
+ for error in self.action_errors:
+- self.error(self.wrap_error(unicode(error)) + '\n')
++ self.error(self.wrap_error(str(error)) + '\n')
+ sys.stdout.flush()
+ else:
+ if complete and options.progress:
+@@ -204,9 +204,9 @@ Copy SOURCE to DESTINATION"""
+ try:
+ if self.options.verbose:
+ if path_type == self.DIR:
+- print "mkdir %s" % dst_fs.desc(dst_path)
++ print("mkdir %s" % dst_fs.desc(dst_path))
+ else:
+- print "%s -> %s" % (src_fs.desc(src_path), dst_fs.desc(dst_path))
++ print("%s -> %s" % (src_fs.desc(src_path), dst_fs.desc(dst_path)))
+ elif self.options.progress:
+ self.done_files += 1
+ sys.stdout.write(self.progress_bar(self.total_files, self.done_files, self.get_verb()))
+--- fs/commands/fsinfo.py.orig 2022-03-04 17:14:43 UTC
++++ fs/commands/fsinfo.py
+@@ -31,12 +31,12 @@ Display information regarding an FS resource"""
+ return val
+
+ def make_printable(text):
+- if not isinstance(text, basestring):
++ if not isinstance(text, str):
+ try:
+ text = str(text)
+ except:
+ try:
+- text = unicode(text)
++ text = str(text)
+ except:
+ text = repr(text)
+ return text
+@@ -48,16 +48,16 @@ Display information regarding an FS resource"""
+ dirs_only=options.dirsonly):
+ if not options.omit:
+ if options.simple:
+- file_line = u'%s\n' % self.wrap_filename(path)
++ file_line = '%s\n' % self.wrap_filename(path)
+ else:
+- file_line = u'[%s] %s\n' % (self.wrap_filename(path), self.wrap_faded(fs.desc(path)))
++ file_line = '[%s] %s\n' % (self.wrap_filename(path), self.wrap_faded(fs.desc(path)))
+ self.output(file_line)
+ info = fs.getinfo(path)
+
+- for k, v in info.items():
++ for k, v in list(info.items()):
+ if k.startswith('_'):
+ del info[k]
+- elif not isinstance(v, (basestring, int, long, float, bool, datetime)):
++ elif not isinstance(v, (str, int, float, bool, datetime)):
+ del info[k]
+
+ if keys:
+--- fs/commands/fsls.py.orig 2022-03-04 17:14:43 UTC
++++ fs/commands/fsls.py
+@@ -37,7 +37,7 @@ List contents of [PATH]"""
+ output = self.output
+
+ if not args:
+- args = [u'.']
++ args = ['.']
+
+ dir_paths = []
+ file_paths = []
+@@ -75,13 +75,13 @@ List contents of [PATH]"""
+
+ if options.syspath:
+ # Path without a syspath, just won't be displayed
+- dir_paths = filter(None, [fs.getsyspath(path, allow_none=True) for path in dir_paths])
+- file_paths = filter(None, [fs.getsyspath(path, allow_none=True) for path in file_paths])
++ dir_paths = [_f for _f in [fs.getsyspath(path, allow_none=True) for path in dir_paths] if _f]
++ file_paths = [_f for _f in [fs.getsyspath(path, allow_none=True) for path in file_paths] if _f]
+
+ if options.url:
+ # Path without a syspath, just won't be displayed
+- dir_paths = filter(None, [fs.getpathurl(path, allow_none=True) for path in dir_paths])
+- file_paths = filter(None, [fs.getpathurl(path, allow_none=True) for path in file_paths])
++ dir_paths = [_f for _f in [fs.getpathurl(path, allow_none=True) for path in dir_paths] if _f]
++ file_paths = [_f for _f in [fs.getpathurl(path, allow_none=True) for path in file_paths] if _f]
+
+ dirs = frozenset(dir_paths)
+ paths = sorted(dir_paths + file_paths, key=lambda p: p.lower())
+@@ -95,7 +95,7 @@ List contents of [PATH]"""
+ def columnize(paths, num_columns):
+
+ col_height = (len(paths) + num_columns - 1) / num_columns
+- columns = [[] for _ in xrange(num_columns)]
++ columns = [[] for _ in range(num_columns)]
+ col_no = 0
+ col_pos = 0
+ for path in paths:
+@@ -128,11 +128,11 @@ List contents of [PATH]"""
+
+ def condense_columns(columns):
+ max_column_height = max([len(col) for col in columns])
+- lines = [[] for _ in xrange(max_column_height)]
++ lines = [[] for _ in range(max_column_height)]
+ for column in columns:
+ for line, path in zip(lines, column):
+ line.append(path)
+- return '\n'.join(u' '.join(line) for line in lines)
++ return '\n'.join(' '.join(line) for line in lines)
+
+ if options.long:
+ for path in paths:
+@@ -151,7 +151,7 @@ List contents of [PATH]"""
+ while num_cols:
+ col_height = (num_paths + num_cols - 1) // num_cols
+ line_width = 0
+- for col_no in xrange(num_cols):
++ for col_no in range(num_cols):
+ try:
+ col_width = max(path_widths[col_no * col_height: (col_no + 1) * col_height])
+ except ValueError:
+--- fs/commands/fsserve.py.orig 2015-04-12 17:24:29 UTC
++++ fs/commands/fsserve.py
+@@ -82,7 +82,7 @@ Serves the contents of PATH with one of a number of me
+ try:
+ self.output("Starting sftp server on %s:%i\n" % (options.addr, port), verbose=True)
+ server.serve_forever()
+- except Exception, e:
++ except Exception as e:
+ pass
+ finally:
+ server.server_close()
+@@ -90,7 +90,7 @@ Serves the contents of PATH with one of a number of me
+ else:
+ self.error("Server type '%s' not recognised\n" % options.type)
+
+- except IOError, e:
++ except IOError as e:
+ if e.errno == errno.EACCES:
+ self.error('Permission denied\n')
+ return 1
+--- fs/commands/fstree.py.orig 2022-03-04 17:14:43 UTC
++++ fs/commands/fstree.py
+@@ -34,7 +34,7 @@ Recursively display the contents of PATH in an ascii t
+
+ for fs, path, is_dir in self.get_resources(args, single=True):
+ if not is_dir:
+- self.error(u"'%s' is not a dir\n" % path)
++ self.error("'%s' is not a dir\n" % path)
+ return 1
+ fs.cache_hint(True)
+ if options.gui:
+--- fs/commands/runner.py.orig 2022-03-04 17:14:43 UTC
++++ fs/commands/runner.py
+@@ -68,7 +68,7 @@ else:
+
+
+ def _unicode(text):
+- if not isinstance(text, unicode):
++ if not isinstance(text, str):
+ return text.decode('ascii', 'replace')
+ return text
+
+@@ -128,17 +128,17 @@ class Command(object):
+ text = _unicode(text)
+ if not self.terminal_colors:
+ return text
+- return u'\x1b[2m%s\x1b[0m' % text
++ return '\x1b[2m%s\x1b[0m' % text
+
+ def wrap_link(self, text):
+ if not self.terminal_colors:
+ return text
+- return u'\x1b[1;33m%s\x1b[0m' % text
++ return '\x1b[1;33m%s\x1b[0m' % text
+
+ def wrap_strong(self, text):
+ if not self.terminal_colors:
+ return text
+- return u'\x1b[1m%s\x1b[0m' % text
++ return '\x1b[1m%s\x1b[0m' % text
+
+ def wrap_table_header(self, name):
+ if not self.terminal_colors:
+@@ -215,10 +215,10 @@ class Command(object):
+ return resources
+
+ def ask(self, msg):
+- return raw_input('%s: %s ' % (self.name, msg))
++ return input('%s: %s ' % (self.name, msg))
+
+ def text_encode(self, text):
+- if not isinstance(text, unicode):
++ if not isinstance(text, str):
+ text = text.decode('ascii', 'replace')
+ text = text.encode(self.encoding, 'replace')
+ return text
+@@ -226,7 +226,7 @@ class Command(object):
+ def output(self, msgs, verbose=False):
+ if verbose and not self.options.verbose:
+ return
+- if isinstance(msgs, basestring):
++ if isinstance(msgs, str):
+ msgs = (msgs,)
+ for msg in msgs:
+ self.output_file.write(self.text_encode(msg))
+@@ -276,7 +276,7 @@ class Command(object):
+
+ opener_table = []
+
+- for fs_opener in opener.openers.itervalues():
++ for fs_opener in opener.openers.values():
+ names = fs_opener.names
+ desc = getattr(fs_opener, 'desc', '')
+ opener_table.append((names, desc))
+@@ -346,12 +346,12 @@ class Command(object):
+ opener.add(new_opener)
+
+ if not six.PY3:
+- args = [unicode(arg, sys.getfilesystemencoding()) for arg in args]
++ args = [str(arg, sys.getfilesystemencoding()) for arg in args]
+ self.verbose = options.verbose
+ try:
+ return self.do_run(options, args) or 0
+- except FSError, e:
+- self.error(self.wrap_error(unicode(e)) + '\n')
++ except FSError as e:
++ self.error(self.wrap_error(str(e)) + '\n')
+ if options.debug:
+ raise
+ return 1
+@@ -361,8 +361,8 @@ class Command(object):
+ return 0
+ except SystemExit:
+ return 0
+- except Exception, e:
+- self.error(self.wrap_error('Error - %s\n' % unicode(e)))
++ except Exception as e:
++ self.error(self.wrap_error('Error - %s\n' % str(e)))
+ if options.debug:
+ raise
+ return 1
+--- fs/contrib/archivefs.py.orig 2022-03-04 17:14:43 UTC
++++ fs/contrib/archivefs.py
+@@ -62,7 +62,7 @@ class ArchiveFS(FS):
+ :param thread_synchronize: set to True (default) to enable thread-safety
+ """
+ super(ArchiveFS, self).__init__(thread_synchronize=thread_synchronize)
+- if isinstance(f, basestring):
++ if isinstance(f, str):
+ self.fileobj = None
+ self.root_path = f
+ else:
+@@ -83,7 +83,7 @@ class ArchiveFS(FS):
+ return "<ArchiveFS: %s>" % self.root_path
+
+ def __unicode__(self):
+- return u"<ArchiveFS: %s>" % self.root_path
++ return "<ArchiveFS: %s>" % self.root_path
+
+ def getmeta(self, meta_name, default=NoDefaultMeta):
+ if meta_name == 'read_only':
+@@ -446,7 +446,7 @@ class ArchiveMountFS(mountfs.MountFS):
+ else:
+ listing = self.listdir(path, *args, **kwargs)
+ if dirs_only:
+- listing = filter(isdir, listing)
++ listing = list(filter(isdir, listing))
+ return listing
+
+ if wildcard is None:
+--- fs/contrib/bigfs/__init__.py.orig 2022-03-04 17:14:43 UTC
++++ fs/contrib/bigfs/__init__.py
+@@ -149,7 +149,7 @@ class _ExceptionProxy(object):
+ def __setattr__(self, name, value):
+ raise ValueError("File has been closed")
+
+- def __nonzero__(self):
++ def __bool__(self):
+ return False
+
+
+@@ -193,7 +193,7 @@ class BigFS(FS):
+ return "<BigFS: %s>" % self.big_path
+
+ def __unicode__(self):
+- return unicode(self.__str__())
++ return str(self.__str__())
+
+
+ def _parse_resource_list(self, g):
+--- fs/contrib/bigfs/subrangefile.py.orig 2022-03-04 17:14:43 UTC
++++ fs/contrib/bigfs/subrangefile.py
+@@ -33,7 +33,7 @@ class SubrangeFile:
+ return "<SubrangeFile: %s@%d size=%d>" % (self.name, self.startOffset, self.fileSize)
+
+ def __unicode__(self):
+- return unicode(self.__str__())
++ return str(self.__str__())
+
+ def size(self):
+ return self.fileSize
+--- fs/contrib/davfs/__init__.py.orig 2015-04-12 17:24:29 UTC
++++ fs/contrib/davfs/__init__.py
+@@ -16,21 +16,21 @@ Requires the dexml module:
+ # Copyright (c) 2009-2010, Cloud Matrix Pty. Ltd.
+ # All rights reserved; available under the terms of the MIT License.
+
+-from __future__ import with_statement
+
++
+ import os
+ import sys
+-import httplib
++import http.client
+ import socket
+-from urlparse import urlparse
++from urllib.parse import urlparse
+ import stat as statinfo
+-from urllib import quote as urlquote
+-from urllib import unquote as urlunquote
++from urllib.parse import quote as urlquote
++from urllib.parse import unquote as urlunquote
+ import base64
+ import re
+ import time
+ import datetime
+-import cookielib
++import http.cookiejar
+ import fnmatch
+ import xml.dom.pulldom
+ import threading
+@@ -78,8 +78,8 @@ class DAVFS(FS):
+ """
+
+ connection_classes = {
+- "http": httplib.HTTPConnection,
+- "https": httplib.HTTPSConnection,
++ "http": http.client.HTTPConnection,
++ "https": http.client.HTTPSConnection,
+ }
+
+ _DEFAULT_PORT_NUMBERS = {
+@@ -116,7 +116,7 @@ class DAVFS(FS):
+ self._connections = []
+ self._free_connections = {}
+ self._connection_lock = threading.Lock()
+- self._cookiejar = cookielib.CookieJar()
++ self._cookiejar = http.cookiejar.CookieJar()
+ super(DAVFS,self).__init__(thread_synchronize=thread_synchronize)
+ # Check that the server speaks WebDAV, and normalize the URL
+ # after any redirects have been followed.
+@@ -221,14 +221,14 @@ class DAVFS(FS):
+ self._free_connections = {}
+ self._connection_lock = threading.Lock()
+ self._url_p = urlparse(self.url)
+- self._cookiejar = cookielib.CookieJar()
++ self._cookiejar = http.cookiejar.CookieJar()
+
+ def getpathurl(self, path, allow_none=False):
+ """Convert a client-side path into a server-side URL."""
+ path = relpath(normpath(path))
+ if path.endswith("/"):
+ path = path[:-1]
+- if isinstance(path,unicode):
++ if isinstance(path,str):
+ path = path.encode("utf8")
+ return self.url + urlquote(path)
+
+@@ -291,7 +291,7 @@ class DAVFS(FS):
+ """Perform a single HTTP request, without any error handling."""
+ if self.closed:
+ raise RemoteConnectionError("",msg="FS is closed")
+- if isinstance(url,basestring):
++ if isinstance(url,str):
+ url = urlparse(url)
+ if self.credentials is not None:
+ username = self.credentials.get("username","")
+@@ -310,7 +310,7 @@ class DAVFS(FS):
+ if hasattr(body,"md5"):
+ md5 = body.md5.decode("hex").encode("base64")
+ con.putheader("Content-MD5",md5)
+- for hdr,val in headers.iteritems():
++ for hdr,val in headers.items():
+ con.putheader(hdr,val)
+ self._cookiejar.add_cookie_header(FakeReq(con,url.scheme,url.path))
+ con.endheaders()
+@@ -332,7 +332,7 @@ class DAVFS(FS):
+ self._give_connection(url,con)
+ resp.close = new_close
+ return resp
+- except socket.error, e:
++ except socket.error as e:
+ if not fresh:
+ return self._raw_request(url,method,body,headers,num_tries)
+ if e.args[0] in _RETRYABLE_ERRORS:
+@@ -479,7 +479,7 @@ class DAVFS(FS):
+ if not entry_ok:
+ continue
+ if wildcard is not None:
+- if isinstance(wildcard,basestring):
++ if isinstance(wildcard,str):
+ if not fnmatch.fnmatch(nm,wildcard):
+ continue
+ else:
+@@ -530,7 +530,7 @@ class DAVFS(FS):
+ if not entry_ok:
+ continue
+ if wildcard is not None:
+- if isinstance(wildcard,basestring):
++ if isinstance(wildcard,str):
+ if not fnmatch.fnmatch(nm,wildcard):
+ continue
+ else:
+@@ -610,7 +610,7 @@ class DAVFS(FS):
+ if self._isurl(path,res.href):
+ info.update(self._info_from_propfind(res))
+ if "st_mode" not in info:
+- info["st_mode"] = 0700 | statinfo.S_IFREG
++ info["st_mode"] = 0o700 | statinfo.S_IFREG
+ return info
+ finally:
+ response.close()
+@@ -647,7 +647,7 @@ class DAVFS(FS):
+ # TODO: should check for status of the propfind first...
+ # check for directory indicator
+ if findElements("DAV:","collection"):
+- info["st_mode"] = 0700 | statinfo.S_IFDIR
++ info["st_mode"] = 0o700 | statinfo.S_IFDIR
+ # check for content length
+ cl = findElements("DAV:","getcontentlength")
+ if cl:
+@@ -674,7 +674,7 @@ class DAVFS(FS):
+ if etag:
+ info["etag"] = etag
+ if "st_mode" not in info:
+- info["st_mode"] = 0700 | statinfo.S_IFREG
++ info["st_mode"] = 0o700 | statinfo.S_IFREG
+ return info
+
+
+--- fs/contrib/davfs/util.py.orig 2022-03-04 17:14:43 UTC
++++ fs/contrib/davfs/util.py
+@@ -8,7 +8,7 @@
+
+ import os
+ import re
+-import cookielib
++import http.cookiejar
+
+
+ def get_fileno(file):
+@@ -130,7 +130,7 @@ class FakeResp:
+ # is a tweaked version of the cookielib function of the same name.
+ #
+ _test_cookie = "sessionid=e9c9b002befa93bd865ce155270307ef; Domain=.cloud.me; expires=Wed, 10-Feb-2010 03:27:20 GMT; httponly; Max-Age=1209600; Path=/, sessionid_https=None; Domain=.cloud.me; expires=Wed, 10-Feb-2010 03:27:20 GMT; httponly; Max-Age=1209600; Path=/; secure"
+-if len(cookielib.parse_ns_headers([_test_cookie])) != 2:
++if len(http.cookiejar.parse_ns_headers([_test_cookie])) != 2:
+ def parse_ns_headers(ns_headers):
+ """Improved parser for netscape-style cookies.
+
+@@ -170,13 +170,13 @@ if len(cookielib.parse_ns_headers([_test_cookie])) !=
+ # convert expires date to seconds since epoch
+ if v.startswith('"'): v = v[1:]
+ if v.endswith('"'): v = v[:-1]
+- v = cookielib.http2time(v) # None if invalid
++ v = http.cookiejar.http2time(v) # None if invalid
+ pairs.append((k, v))
+ if pairs:
+ if not version_set:
+ pairs.append(("version", "0"))
+ result.append(pairs)
+ return result
+- cookielib.parse_ns_headers = parse_ns_headers
+- assert len(cookielib.parse_ns_headers([_test_cookie])) == 2
++ http.cookiejar.parse_ns_headers = parse_ns_headers
++ assert len(http.cookiejar.parse_ns_headers([_test_cookie])) == 2
+
+--- fs/contrib/davfs/xmlobj.py.orig 2022-03-04 17:14:43 UTC
++++ fs/contrib/davfs/xmlobj.py
+@@ -9,9 +9,9 @@ of dexml.Model subclasses.
+
+ """
+
+-from urlparse import urlparse, urlunparse
++from urllib.parse import urlparse, urlunparse
+
+-from httplib import responses as STATUS_CODE_TEXT
++from http.client import responses as STATUS_CODE_TEXT
+ STATUS_CODE_TEXT[207] = "Multi-Status"
+
+ import dexml
+@@ -86,7 +86,7 @@ class StatusField(fields.Value):
+ return val
+
+ def __set__(self,instance,value):
+- if isinstance(value,basestring):
++ if isinstance(value,str):
+ # sanity check it
+ bits = value.split(" ")
+ if len(bits) < 3 or bits[0] != "HTTP/1.1":
+--- fs/contrib/sqlitefs.py.orig 2015-04-12 17:24:29 UTC
++++ fs/contrib/sqlitefs.py
+@@ -24,7 +24,7 @@ def fetchone(cursor):
+ '''
+ row = None
+ try:
+- row = cursor.next()
++ row = next(cursor)
+ except:
+ pass
+ return(row)
+@@ -62,7 +62,7 @@ class SqliteFsFileBase(object):
+ __repr__ = __str__
+
+ def __unicode__(self):
+- return u"<SqliteFS File in %s %s>" % (self.fs, self.path)
++ return "<SqliteFS File in %s %s>" % (self.fs, self.path)
+
+ def __del__(self):
+ if not self.closed:
+@@ -74,7 +74,7 @@ class SqliteFsFileBase(object):
+ def __iter__(self):
+ raise OperationFailedError('__iter__', self.path)
+
+- def next(self):
++ def __next__(self):
+ raise OperationFailedError('next', self.path)
+
+ def readline(self, *args, **kwargs):
+@@ -139,8 +139,8 @@ class SqliteReadableFile(SqliteFsFileBase):
+ def __iter__(self):
+ return iter(self.real_stream)
+
+- def next(self):
+- return self.real_stream.next()
++ def __next__(self):
++ return next(self.real_stream)
+
+ def readline(self, *args, **kwargs):
+ return self.real_stream.readline(*args, **kwargs)
+@@ -438,7 +438,7 @@ class SqliteFS(FS):
+ get the directory information dictionary.
+ '''
+ info = dict()
+- info['st_mode'] = 0755
++ info['st_mode'] = 0o755
+ return info
+
+ def _get_file_info(self, path):
+@@ -460,7 +460,7 @@ class SqliteFS(FS):
+ info['created'] = row[2]
+ info['last_modified'] = row[3]
+ info['last_accessed'] = row[4]
+- info['st_mode'] = 0666
++ info['st_mode'] = 0o666
+ return(info)
+
+ def _isfile(self,path):
+@@ -551,7 +551,7 @@ class SqliteFS(FS):
+ pass
+
+ if( absolute == False):
+- pathlist = map(lambda dpath:frombase(path,dpath), pathlist)
++ pathlist = [frombase(path,dpath) for dpath in pathlist]
+
+ return(pathlist)
+
+--- fs/contrib/tahoelafs/__init__.py.orig 2022-03-04 17:14:43 UTC
++++ fs/contrib/tahoelafs/__init__.py
+@@ -70,8 +70,8 @@ from fs import _thread_synchronize_default, SEEK_END
+ from fs.remote import CacheFSMixin, RemoteFileBuffer
+ from fs.base import fnmatch, NoDefaultMeta
+
+-from util import TahoeUtil
+-from connection import Connection
++from .util import TahoeUtil
++from .connection import Connection
+
+ from six import b
+
+@@ -240,7 +240,7 @@ class _TahoeLAFS(FS):
+ continue
+
+ if wildcard is not None:
+- if isinstance(wildcard,basestring):
++ if isinstance(wildcard,str):
+ if not fnmatch.fnmatch(item['name'], wildcard):
+ continue
+ else:
+@@ -269,7 +269,7 @@ class _TahoeLAFS(FS):
+
+ try:
+ self.tahoeutil.unlink(self.dircap, path)
+- except Exception, e:
++ except Exception as e:
+ raise errors.ResourceInvalidError(path)
+
+ @_fix_path
+@@ -341,8 +341,8 @@ class _TahoeLAFS(FS):
+
+ def _log(self, level, message):
+ if not logger.isEnabledFor(level): return
+- logger.log(level, u'(%d) %s' % (id(self),
+- unicode(message).encode('ASCII', 'replace')))
++ logger.log(level, '(%d) %s' % (id(self),
++ str(message).encode('ASCII', 'replace')))
+
+ @_fix_path
+ def getpathurl(self, path, allow_none=False, webapi=None):
+@@ -353,11 +353,11 @@ class _TahoeLAFS(FS):
+ webapi = self.connection.webapi
+ self._log(DEBUG, "Retrieving URL for %s over %s" % (path, webapi))
+ path = self.tahoeutil.fixwinpath(path, False)
+- return u"%s/uri/%s%s" % (webapi, self.dircap, path)
++ return "%s/uri/%s%s" % (webapi, self.dircap, path)
+
+ @_fix_path
+ def getrange(self, path, offset, length=None):
+- return self.connection.get(u'/uri/%s%s' % (self.dircap, path),
++ return self.connection.get('/uri/%s%s' % (self.dircap, path),
+ offset=offset, length=length)
+
+ @_fix_path
+@@ -379,10 +379,10 @@ class _TahoeLAFS(FS):
+ file.seek(0)
+
+ if size > self.largefilesize:
+- self.connection.put(u'/uri/%s%s' % (self.dircap, path),
++ self.connection.put('/uri/%s%s' % (self.dircap, path),
+ "PyFilesystem.TahoeLAFS: Upload started, final size %d" % size)
+
+- self.connection.put(u'/uri/%s%s' % (self.dircap, path), file, size=size)
++ self.connection.put('/uri/%s%s' % (self.dircap, path), file, size=size)
+
+ @_fix_path
+ def getinfo(self, path):
+--- fs/contrib/tahoelafs/connection.py.orig 2015-04-12 17:24:29 UTC
++++ fs/contrib/tahoelafs/connection.py
+@@ -10,17 +10,19 @@ if python3:
+ from urllib.parse import urlencode, pathname2url, quote
+ from urllib.request import Request, urlopen
+ else:
+- from urllib import urlencode, pathname2url
+- from urllib2 import Request, urlopen, quote
++ from urllib.parse import urlencode
++ from urllib.request import pathname2url
++ from urllib.request import Request, urlopen
++ from urllib.parse import quote
+
+ class PutRequest(Request):
+ def __init__(self, *args, **kwargs):
+- self.get_method = lambda: u'PUT'
++ self.get_method = lambda: 'PUT'
+ Request.__init__(self, *args, **kwargs)
+
+ class DeleteRequest(Request):
+ def __init__(self, *args, **kwargs):
+- self.get_method = lambda: u'DELETE'
++ self.get_method = lambda: 'DELETE'
+ Request.__init__(self, *args, **kwargs)
+
+ class Connection:
+@@ -32,7 +34,7 @@ class Connection:
+ '''
+ Retrieve length of string or file object and prepare HTTP headers.
+ '''
+- if isinstance(f, basestring):
++ if isinstance(f, str):
+ # Just set up content length
+ size = len(f)
+ elif getattr(f, 'read', None):
+@@ -50,20 +52,20 @@ class Connection:
+
+ def _urlencode(self, data):
+ _data = {}
+- for k, v in data.items():
++ for k, v in list(data.items()):
+ _data[k.encode('utf-8')] = v.encode('utf-8')
+ return urlencode(_data)
+
+ def _quotepath(self, path, params={}):
+ q = quote(path.encode('utf-8'), safe='/')
+ if params:
+- return u"%s?%s" % (q, self._urlencode(params))
++ return "%s?%s" % (q, self._urlencode(params))
+ return q
+
+ def _urlopen(self, req):
+ try:
+ return urlopen(req)
+- except Exception, e:
++ except Exception as e:
+ if not getattr(e, 'getcode', None):
+ raise errors.RemoteConnectionError(str(e))
+ code = e.getcode()
+@@ -85,7 +87,7 @@ class Connection:
+ data = self._urlencode(data)
+ path = self._quotepath(path)
+ if data:
+- path = u'?'.join([path, data])
++ path = '?'.join([path, data])
+
+ headers = {}
+ headers.update(self.headers)
+--- fs/contrib/tahoelafs/test_tahoelafs.py.orig 2022-03-04 17:14:43 UTC
++++ fs/contrib/tahoelafs/test_tahoelafs.py
+@@ -35,7 +35,7 @@ class TestTahoeLAFS(unittest.TestCase,FSTestCases):#,T
+
+ def test_dircap(self):
+ # Is dircap in correct format?
+- self.assert_(self.dircap.startswith('URI:DIR2:') and len(self.dircap) > 50)
++ self.assertTrue(self.dircap.startswith('URI:DIR2:') and len(self.dircap) > 50)
+
+ def test_concurrent_copydir(self):
+ # makedir() on TahoeLAFS is currently not atomic
+--- fs/contrib/tahoelafs/util.py.orig 2022-03-04 17:14:43 UTC
++++ fs/contrib/tahoelafs/util.py
+@@ -19,7 +19,7 @@ except ImportError:
+ try:
+ import json
+ except ImportError:
+- print "simplejson (http://pypi.python.org/pypi/simplejson/) required"
++ print("simplejson (http://pypi.python.org/pypi/simplejson/) required")
+ raise
+
+ from .connection import Connection
+@@ -29,22 +29,22 @@ python3 = int(platform.python_version_tuple()[0]) > 2
+ if python3:
+ from urllib.error import HTTPError
+ else:
+- from urllib2 import HTTPError
++ from urllib.error import HTTPError
+
+ class TahoeUtil:
+ def __init__(self, webapi):
+ self.connection = Connection(webapi)
+
+ def createdircap(self):
+- return self.connection.post(u'/uri', params={u't': u'mkdir'}).read()
++ return self.connection.post('/uri', params={'t': 'mkdir'}).read()
+
+ def unlink(self, dircap, path=None):
+ path = self.fixwinpath(path, False)
+- self.connection.delete(u'/uri/%s%s' % (dircap, path))
++ self.connection.delete('/uri/%s%s' % (dircap, path))
+
+ def info(self, dircap, path):
+ path = self.fixwinpath(path, False)
+- meta = json.load(self.connection.get(u'/uri/%s%s' % (dircap, path), {u't': u'json'}))
++ meta = json.load(self.connection.get('/uri/%s%s' % (dircap, path), {'t': 'json'}))
+ return self._info(path, meta)
+
+ def fixwinpath(self, path, direction=True):
+@@ -74,7 +74,7 @@ class TahoeUtil:
+ if type == 'unknown':
+ raise errors.ResourceNotFoundError(path)
+
+- info = {'name': unicode(self.fixwinpath(path, True)),
++ info = {'name': str(self.fixwinpath(path, True)),
+ 'type': type,
+ 'size': data.get('size', 0),
+ 'ctime': None,
+@@ -83,22 +83,22 @@ class TahoeUtil:
+ info['ctime'] = data['metadata'].get('ctime')
+
+ if info['type'] == 'dirnode':
+- info['st_mode'] = 0777 | statinfo.S_IFDIR
++ info['st_mode'] = 0o777 | statinfo.S_IFDIR
+ else:
+- info['st_mode'] = 0644
++ info['st_mode'] = 0o644
+
+ return info
+
+ def list(self, dircap, path=None):
+ path = self.fixwinpath(path, False)
+
+- data = json.load(self.connection.get(u'/uri/%s%s' % (dircap, path), {u't': u'json'}))
++ data = json.load(self.connection.get('/uri/%s%s' % (dircap, path), {'t': 'json'}))
+
+ if len(data) < 2 or data[0] != 'dirnode':
+ raise errors.ResourceInvalidError('Metadata in unknown format!')
+
+ data = data[1]['children']
+- for i in data.keys():
++ for i in list(data.keys()):
+ x = self._info(i, data[i])
+ yield x
+
+@@ -106,7 +106,7 @@ class TahoeUtil:
+ path = self.fixwinpath(path, False)
+ path = pathsplit(path)
+
+- self.connection.post(u"/uri/%s%s" % (dircap, path[0]), data={u't': u'mkdir', u'name': path[1]})
++ self.connection.post("/uri/%s%s" % (dircap, path[0]), data={'t': 'mkdir', 'name': path[1]})
+
+ def move(self, dircap, src, dst):
+ if src == '/' or dst == '/':
+@@ -120,8 +120,8 @@ class TahoeUtil:
+
+ if src_tuple[0] == dst_tuple[0]:
+ # Move inside one directory
+- self.connection.post(u"/uri/%s%s" % (dircap, src_tuple[0]), data={u't': u'rename',
+- u'from_name': src_tuple[1], u'to_name': dst_tuple[1]})
++ self.connection.post("/uri/%s%s" % (dircap, src_tuple[0]), data={'t': 'rename',
++ 'from_name': src_tuple[1], 'to_name': dst_tuple[1]})
+ return
+
+ # Move to different directory. Firstly create link on dst, then remove from src
+@@ -133,7 +133,7 @@ class TahoeUtil:
+ self.unlink(dircap, dst)
+
+ uri = self.info(dircap, src)['uri']
+- self.connection.put(u"/uri/%s%s" % (dircap, dst), data=uri, params={u't': u'uri'})
++ self.connection.put("/uri/%s%s" % (dircap, dst), data=uri, params={'t': 'uri'})
+ if uri != self.info(dircap, dst)['uri']:
+ raise errors.OperationFailedError('Move failed')
+
+--- fs/errors.py.orig 2015-04-12 17:24:29 UTC
++++ fs/errors.py
+@@ -57,19 +57,19 @@ class FSError(Exception):
+
+ def __str__(self):
+ keys = {}
+- for k,v in self.__dict__.iteritems():
+- if isinstance(v,unicode):
++ for k,v in self.__dict__.items():
++ if isinstance(v,str):
+ v = v.encode(sys.getfilesystemencoding())
+ keys[k] = v
+ return str(self.msg % keys)
+
+ def __unicode__(self):
+ keys = {}
+- for k,v in self.__dict__.iteritems():
++ for k,v in self.__dict__.items():
+ if isinstance(v, six.binary_type):
+ v = v.decode(sys.getfilesystemencoding(), 'replace')
+ keys[k] = v
+- return unicode(self.msg, encoding=sys.getfilesystemencoding(), errors='replace') % keys
++ return str(self.msg, encoding=sys.getfilesystemencoding(), errors='replace') % keys
+
+ def __reduce__(self):
+ return (self.__class__,(),self.__dict__.copy(),)
+@@ -217,33 +217,33 @@ def convert_fs_errors(func):
+ def wrapper(*args,**kwds):
+ try:
+ return func(*args,**kwds)
+- except ResourceNotFoundError, e:
++ except ResourceNotFoundError as e:
+ raise OSError(errno.ENOENT,str(e))
+- except ParentDirectoryMissingError, e:
++ except ParentDirectoryMissingError as e:
+ if sys.platform == "win32":
+ raise OSError(errno.ESRCH,str(e))
+ else:
+ raise OSError(errno.ENOENT,str(e))
+- except ResourceInvalidError, e:
++ except ResourceInvalidError as e:
+ raise OSError(errno.EINVAL,str(e))
+- except PermissionDeniedError, e:
++ except PermissionDeniedError as e:
+ raise OSError(errno.EACCES,str(e))
+- except ResourceLockedError, e:
++ except ResourceLockedError as e:
+ if sys.platform == "win32":
+ raise WindowsError(32,str(e))
+ else:
+ raise OSError(errno.EACCES,str(e))
+- except DirectoryNotEmptyError, e:
++ except DirectoryNotEmptyError as e:
+ raise OSError(errno.ENOTEMPTY,str(e))
+- except DestinationExistsError, e:
++ except DestinationExistsError as e:
+ raise OSError(errno.EEXIST,str(e))
+- except StorageSpaceError, e:
++ except StorageSpaceError as e:
+ raise OSError(errno.ENOSPC,str(e))
+- except RemoteConnectionError, e:
++ except RemoteConnectionError as e:
+ raise OSError(errno.ENETDOWN,str(e))
+- except UnsupportedError, e:
++ except UnsupportedError as e:
+ raise OSError(errno.ENOSYS,str(e))
+- except FSError, e:
++ except FSError as e:
+ raise OSError(errno.EFAULT,str(e))
+ return wrapper
+
+@@ -255,7 +255,7 @@ def convert_os_errors(func):
+ def wrapper(self,*args,**kwds):
+ try:
+ return func(self,*args,**kwds)
+- except (OSError,IOError), e:
++ except (OSError,IOError) as e:
+ (exc_type,exc_inst,tb) = sys.exc_info()
+ path = getattr(e,"filename",None)
+ if path and path[0] == "/" and hasattr(self,"root_path"):
+@@ -263,53 +263,53 @@ def convert_os_errors(func):
+ if isprefix(self.root_path,path):
+ path = path[len(self.root_path):]
+ if not hasattr(e,"errno") or not e.errno:
+- raise OperationFailedError(opname,details=e),None,tb
++ raise OperationFailedError(opname,details=e).with_traceback(tb)
+ if e.errno == errno.ENOENT:
+- raise ResourceNotFoundError(path,opname=opname,details=e),None,tb
++ raise ResourceNotFoundError(path,opname=opname,details=e).with_traceback(tb)
+ if e.errno == errno.EFAULT:
+ # This can happen when listdir a directory that is deleted by another thread
+ # Best to interpret it as a resource not found
+- raise ResourceNotFoundError(path,opname=opname,details=e),None,tb
++ raise ResourceNotFoundError(path,opname=opname,details=e).with_traceback(tb)
+ if e.errno == errno.ESRCH:
+- raise ResourceNotFoundError(path,opname=opname,details=e),None,tb
++ raise ResourceNotFoundError(path,opname=opname,details=e).with_traceback(tb)
+ if e.errno == errno.ENOTEMPTY:
+- raise DirectoryNotEmptyError(path,opname=opname,details=e),None,tb
++ raise DirectoryNotEmptyError(path,opname=opname,details=e).with_traceback(tb)
+ if e.errno == errno.EEXIST:
+- raise DestinationExistsError(path,opname=opname,details=e),None,tb
++ raise DestinationExistsError(path,opname=opname,details=e).with_traceback(tb)
+ if e.errno == 183: # some sort of win32 equivalent to EEXIST
+- raise DestinationExistsError(path,opname=opname,details=e),None,tb
++ raise DestinationExistsError(path,opname=opname,details=e).with_traceback(tb)
+ if e.errno == errno.ENOTDIR:
+- raise ResourceInvalidError(path,opname=opname,details=e),None,tb
++ raise ResourceInvalidError(path,opname=opname,details=e).with_traceback(tb)
+ if e.errno == errno.EISDIR:
+- raise ResourceInvalidError(path,opname=opname,details=e),None,tb
++ raise ResourceInvalidError(path,opname=opname,details=e).with_traceback(tb)
+ if e.errno == errno.EINVAL:
+- raise ResourceInvalidError(path,opname=opname,details=e),None,tb
++ raise ResourceInvalidError(path,opname=opname,details=e).with_traceback(tb)
+ if e.errno == errno.ENOSPC:
+- raise StorageSpaceError(opname,path=path,details=e),None,tb
++ raise StorageSpaceError(opname,path=path,details=e).with_traceback(tb)
+ if e.errno == errno.EPERM:
+- raise PermissionDeniedError(opname,path=path,details=e),None,tb
++ raise PermissionDeniedError(opname,path=path,details=e).with_traceback(tb)
+ if hasattr(errno,"ENONET") and e.errno == errno.ENONET:
+- raise RemoteConnectionError(opname,path=path,details=e),None,tb
++ raise RemoteConnectionError(opname,path=path,details=e).with_traceback(tb)
+ if e.errno == errno.ENETDOWN:
+- raise RemoteConnectionError(opname,path=path,details=e),None,tb
++ raise RemoteConnectionError(opname,path=path,details=e).with_traceback(tb)
+ if e.errno == errno.ECONNRESET:
+- raise RemoteConnectionError(opname,path=path,details=e),None,tb
++ raise RemoteConnectionError(opname,path=path,details=e).with_traceback(tb)
+ if e.errno == errno.EACCES:
+ if sys.platform == "win32":
+ if e.args[0] and e.args[0] == 32:
+- raise ResourceLockedError(path,opname=opname,details=e),None,tb
+- raise PermissionDeniedError(opname,details=e),None,tb
++ raise ResourceLockedError(path,opname=opname,details=e).with_traceback(tb)
++ raise PermissionDeniedError(opname,details=e).with_traceback(tb)
+ # Sometimes windows gives some random errors...
+ if sys.platform == "win32":
+ if e.errno in (13,):
+- raise ResourceInvalidError(path,opname=opname,details=e),None,tb
++ raise ResourceInvalidError(path,opname=opname,details=e).with_traceback(tb)
+ if e.errno == errno.ENAMETOOLONG:
+- raise PathError(path,details=e),None,tb
++ raise PathError(path,details=e).with_traceback(tb)
+ if e.errno == errno.EOPNOTSUPP:
+- raise UnsupportedError(opname,details=e),None,tb
++ raise UnsupportedError(opname,details=e).with_traceback(tb)
+ if e.errno == errno.ENOSYS:
+- raise UnsupportedError(opname,details=e),None,tb
+- raise OperationFailedError(opname,details=e),None,tb
++ raise UnsupportedError(opname,details=e).with_traceback(tb)
++ raise OperationFailedError(opname,details=e).with_traceback(tb)
+ return wrapper
+
+
+--- fs/expose/dokan/__init__.py.orig 2015-04-12 17:24:29 UTC
++++ fs/expose/dokan/__init__.py
+@@ -54,8 +54,8 @@ systems with Dokan installed.
+ # Copyright (c) 2009-2010, Cloud Matrix Pty. Ltd.
+ # All rights reserved; available under the terms of the MIT License.
+
+-from __future__ import with_statement
+
++
+ import sys
+
+ import os
+@@ -64,7 +64,7 @@ import errno
+ import time
+ import stat as statinfo
+ import subprocess
+-import cPickle
++import pickle
+ import datetime
+ import ctypes
+ from collections import deque
+@@ -76,7 +76,7 @@ from fs.local_functools import wraps
+ from fs.wrapfs import WrapFS
+
+ try:
+- import libdokan
++ from . import libdokan
+ except (NotImplementedError, EnvironmentError, ImportError, NameError,):
+ is_available = False
+ sys.modules.pop("fs.expose.dokan.libdokan", None)
+@@ -171,12 +171,12 @@ def handle_fs_errors(func):
+ def wrapper(*args,**kwds):
+ try:
+ res = func(*args,**kwds)
+- except OSError, e:
++ except OSError as e:
+ if e.errno:
+ res = -1 * _errno2syserrcode(e.errno)
+ else:
+ res = -1
+- except Exception, e:
++ except Exception as e:
+ raise
+ else:
+ if res is None:
+@@ -424,7 +424,7 @@ class FSOperations(object):
+ info.contents.Context = 1
+ try:
+ f = self.fs.open(path, mode)
+- print path, mode, repr(f)
++ print(path, mode, repr(f))
+ except ResourceInvalidError:
+ info.contents.IsDirectory = True
+ except FSError:
+@@ -896,10 +896,10 @@ def mount(fs, drive, foreground=False, ready_callback=
+ def check_ready(mp=None):
+ if ready_callback is not False:
+ check_alive(mp)
+- for _ in xrange(100):
++ for _ in range(100):
+ try:
+ os.stat(drive+":\\")
+- except EnvironmentError, e:
++ except EnvironmentError as e:
+ check_alive(mp)
+ time.sleep(0.05)
+ else:
+@@ -989,7 +989,7 @@ class MountProcess(subprocess.Popen):
+ cmd = cmd + "data = cPickle.loads(%s); "
+ cmd = cmd + "from fs.expose.dokan import MountProcess; "
+ cmd = cmd + "MountProcess._do_mount(data)"
+- cmd = cmd % (repr(cPickle.dumps((fs,drive,dokan_opts,nowait),-1)),)
++ cmd = cmd % (repr(pickle.dumps((fs,drive,dokan_opts,nowait),-1)),)
+ cmd = [sys.executable,"-c",cmd]
+ super(MountProcess,self).__init__(cmd,**kwds)
+
+--- fs/expose/ftp.py.orig 2015-04-12 17:24:29 UTC
++++ fs/expose/ftp.py
+@@ -28,7 +28,7 @@ from fs.osfs import OSFS
+ from fs.errors import convert_fs_errors
+ from fs import iotools
+
+-from six import text_type as unicode
++from six import text_type as str
+
+
+ # Get these once so we can reuse them:
+@@ -107,9 +107,9 @@ class FTPFS(ftpserver.AbstractedFS):
+ def chdir(self, path):
+ # We dont' use the decorator here, we actually decode a version of the
+ # path for use with pyfs, but keep the original for use with pyftpdlib.
+- if not isinstance(path, unicode):
++ if not isinstance(path, str):
+ # pyftpdlib 0.7.x
+- unipath = unicode(path, self.encoding)
++ unipath = str(path, self.encoding)
+ else:
+ # pyftpdlib 1.x
+ unipath = path
+@@ -134,7 +134,7 @@ class FTPFS(ftpserver.AbstractedFS):
+ @convert_fs_errors
+ @decode_args
+ def listdir(self, path):
+- return map(lambda x: x.encode(self.encoding), self.fs.listdir(path))
++ return [x.encode(self.encoding) for x in self.fs.listdir(path)]
+
+ @convert_fs_errors
+ @decode_args
+@@ -190,7 +190,7 @@ class FTPFS(ftpserver.AbstractedFS):
+ kwargs['st_mode'] = info['mode']
+ else:
+ # Otherwise, build one. Not executable by default.
+- mode = 0660
++ mode = 0o660
+ # Merge in the type (dir or file). File is tested first, some file systems
+ # such as ArchiveMountFS treat archive files as directories too. By checking
+ # file first, any such files will be only files (not directories).
+@@ -198,7 +198,7 @@ class FTPFS(ftpserver.AbstractedFS):
+ mode |= stat.S_IFREG
+ elif self.fs.isdir(path):
+ mode |= stat.S_IFDIR
+- mode |= 0110 # Merge in exec bit to signal dir is listable
++ mode |= 0o110 # Merge in exec bit to signal dir is listable
+ kwargs['st_mode'] = mode
+ return FakeStat(**kwargs)
+
+--- fs/expose/fuse/__init__.py.orig 2015-04-12 17:24:29 UTC
++++ fs/expose/fuse/__init__.py
+@@ -56,7 +56,7 @@ import errno
+ import time
+ import stat as statinfo
+ import subprocess
+-import cPickle
++import pickle
+
+ import logging
+ logger = logging.getLogger("fs.expose.fuse")
+@@ -404,9 +404,9 @@ class FSOperations(Operations):
+ # The interesting stuff
+ if 'st_mode' not in info:
+ if self.fs.isdir(path):
+- info['st_mode'] = 0755
++ info['st_mode'] = 0o755
+ else:
+- info['st_mode'] = 0666
++ info['st_mode'] = 0o666
+ mode = info['st_mode']
+ if not statinfo.S_ISDIR(mode) and not statinfo.S_ISREG(mode):
+ if self.fs.isdir(path):
+@@ -432,7 +432,7 @@ class FSOperations(Operations):
+ except KeyError:
+ pass
+ else:
+- info["st_size"] = max(written_sizes.values() + [info["st_size"]])
++ info["st_size"] = max(list(written_sizes.values()) + [info["st_size"]])
+ return info
+
+
+@@ -491,7 +491,7 @@ def unmount(path):
+ else:
+ args = ["fusermount", "-u", path]
+
+- for num_tries in xrange(3):
++ for num_tries in range(3):
+ p = subprocess.Popen(args,
+ stderr=subprocess.PIPE,
+ stdout=subprocess.PIPE)
+@@ -554,7 +554,7 @@ class MountProcess(subprocess.Popen):
+ cmd = cmd + 'data = loads(%s); '
+ cmd = cmd + 'from fs.expose.fuse import MountProcess; '
+ cmd = cmd + 'MountProcess._do_mount_nowait(data)'
+- cmd = cmd % (repr(cPickle.dumps((fs, path, fuse_opts), -1)),)
++ cmd = cmd % (repr(pickle.dumps((fs, path, fuse_opts), -1)),)
+ cmd = [sys.executable, "-c", cmd]
+ super(MountProcess, self).__init__(cmd, **kwds)
+ else:
+@@ -567,7 +567,7 @@ class MountProcess(subprocess.Popen):
+ cmd = cmd + 'data = loads(%s); '
+ cmd = cmd + 'from fs.expose.fuse import MountProcess; '
+ cmd = cmd + 'MountProcess._do_mount_wait(data)'
+- cmd = cmd % (repr(cPickle.dumps((fs, path, fuse_opts, r, w), -1)),)
++ cmd = cmd % (repr(pickle.dumps((fs, path, fuse_opts, r, w), -1)),)
+ cmd = [sys.executable, "-c", cmd]
+ super(MountProcess, self).__init__(cmd, **kwds)
+ os.close(w)
+@@ -635,8 +635,8 @@ class MountProcess(subprocess.Popen):
+ opts["unmount_callback"] = unmount_callback
+ try:
+ mount(fs, path, **opts)
+- except Exception, e:
+- os.write(w, b("E") + unicode(e).encode('ascii', errors='replace'))
++ except Exception as e:
++ os.write(w, b("E") + str(e).encode('ascii', errors='replace'))
+ os.close(w)
+
+ if not successful:
+@@ -653,5 +653,5 @@ if __name__ == "__main__":
+ os.makedirs(mount_point)
+
+ def ready_callback():
+- print "READY"
++ print("READY")
+ mount(TempFS(), mount_point, foreground=True, ready_callback=ready_callback)
+--- fs/expose/fuse/fuse_ctypes.py.orig 2015-04-12 17:24:29 UTC
++++ fs/expose/fuse/fuse_ctypes.py
+@@ -12,8 +12,8 @@
+ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+-from __future__ import division
+
++
+ from ctypes import *
+ from ctypes.util import find_library
+ from errno import *
+@@ -273,7 +273,7 @@ def time_of_timespec(ts):
+ return ts.tv_sec + ts.tv_nsec / 10 ** 9
+
+ def set_st_attrs(st, attrs):
+- for key, val in attrs.items():
++ for key, val in list(attrs.items()):
+ if key in ('st_atime', 'st_mtime', 'st_ctime'):
+ timespec = getattr(st, key + 'spec')
+ timespec.tv_sec = int(val)
+@@ -314,7 +314,7 @@ class FUSE(object):
+ kwargs.setdefault('fsname', operations.__class__.__name__)
+ args.append('-o')
+ args.append(','.join(key if val == True else '%s=%s' % (key, val)
+- for key, val in kwargs.items()))
++ for key, val in list(kwargs.items())))
+ args.append(mountpoint)
+ argv = (c_char_p * len(args))(*args)
+
+@@ -331,7 +331,7 @@ class FUSE(object):
+ """Decorator for the methods that follow"""
+ try:
+ return func(*args, **kwargs) or 0
+- except OSError, e:
++ except OSError as e:
+ return -(e.errno or EFAULT)
+ except:
+ print_exc()
+@@ -400,7 +400,7 @@ class FUSE(object):
+ def statfs(self, path, buf):
+ stv = buf.contents
+ attrs = self.operations('statfs', path)
+- for key, val in attrs.items():
++ for key, val in list(attrs.items()):
+ if hasattr(stv, key):
+ setattr(stv, key, val)
+ return 0
+@@ -576,7 +576,7 @@ class Operations(object):
+
+ if path != '/':
+ raise OSError(ENOENT, '')
+- return dict(st_mode=(S_IFDIR | 0755), st_nlink=2)
++ return dict(st_mode=(S_IFDIR | 0o755), st_nlink=2)
+
+ def getxattr(self, path, name, position=0):
+ raise OSError(ENOTSUP, '')
+@@ -667,13 +667,13 @@ class Operations(object):
+
+ class LoggingMixIn:
+ def __call__(self, op, path, *args):
+- print '->', op, path, repr(args)
++ print('->', op, path, repr(args))
+ ret = '[Unknown Error]'
+ try:
+ ret = getattr(self, op)(path, *args)
+ return ret
+- except OSError, e:
++ except OSError as e:
+ ret = str(e)
+ raise
+ finally:
+- print '<-', op, repr(ret)
++ print('<-', op, repr(ret))
+--- fs/expose/fuse/fuse.py.orig 2015-04-12 17:24:29 UTC
++++ fs/expose/fuse/fuse.py
+@@ -12,8 +12,8 @@
+ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+-from __future__ import division
+
++
+ from ctypes import *
+ from ctypes.util import find_library
+ from errno import *
+@@ -269,7 +269,7 @@ def time_of_timespec(ts):
+ return ts.tv_sec + ts.tv_nsec / 10 ** 9
+
+ def set_st_attrs(st, attrs):
+- for key, val in attrs.items():
++ for key, val in list(attrs.items()):
+ if key in ('st_atime', 'st_mtime', 'st_ctime'):
+ timespec = getattr(st, key + 'spec')
+ timespec.tv_sec = int(val)
+@@ -312,7 +312,7 @@ class FUSE(object):
+ kwargs.setdefault('fsname', operations.__class__.__name__)
+ args.append('-o')
+ args.append(','.join(key if val == True else '%s=%s' % (key, val)
+- for key, val in kwargs.items()))
++ for key, val in list(kwargs.items())))
+ args.append(mountpoint)
+ argv = (c_char_p * len(args))(*args)
+
+@@ -331,7 +331,7 @@ class FUSE(object):
+ """Decorator for the methods that follow"""
+ try:
+ return func(*args, **kwargs) or 0
+- except OSError, e:
++ except OSError as e:
+ return -(e.errno or EFAULT)
+ except:
+ print_exc()
+@@ -406,7 +406,7 @@ class FUSE(object):
+ def statfs(self, path, buf):
+ stv = buf.contents
+ attrs = self.operations('statfs', path)
+- for key, val in attrs.items():
++ for key, val in list(attrs.items()):
+ if hasattr(stv, key):
+ setattr(stv, key, val)
+ return 0
+@@ -579,7 +579,7 @@ class Operations(object):
+
+ if path != '/':
+ raise FuseOSError(ENOENT)
+- return dict(st_mode=(S_IFDIR | 0755), st_nlink=2)
++ return dict(st_mode=(S_IFDIR | 0o755), st_nlink=2)
+
+ def getxattr(self, path, name, position=0):
+ raise FuseOSError(ENOTSUP)
+@@ -670,13 +670,13 @@ class Operations(object):
+
+ class LoggingMixIn:
+ def __call__(self, op, path, *args):
+- print '->', op, path, repr(args)
++ print('->', op, path, repr(args))
+ ret = '[Unhandled Exception]'
+ try:
+ ret = getattr(self, op)(path, *args)
+ return ret
+- except OSError, e:
++ except OSError as e:
+ ret = str(e)
+ raise
+ finally:
+- print '<-', op, repr(ret)
++ print('<-', op, repr(ret))
+--- fs/expose/fuse/fuse3.py.orig 2022-03-04 17:14:43 UTC
++++ fs/expose/fuse/fuse3.py
+@@ -229,7 +229,7 @@ def time_of_timespec(ts):
+ return ts.tv_sec + ts.tv_nsec / 10 ** 9
+
+ def set_st_attrs(st, attrs):
+- for key, val in attrs.items():
++ for key, val in list(attrs.items()):
+ if key in ('st_atime', 'st_mtime', 'st_ctime'):
+ timespec = getattr(st, key + 'spec')
+ timespec.tv_sec = int(val)
+@@ -274,7 +274,7 @@ class FUSE(object):
+ kwargs.setdefault('fsname', operations.__class__.__name__)
+ args.append('-o')
+ args.append(','.join(key if val == True else '%s=%s' % (key, val)
+- for key, val in kwargs.items()))
++ for key, val in list(kwargs.items())))
+ args.append(mountpoint)
+ argv = (c_char_p * len(args))(*args)
+
+@@ -361,7 +361,7 @@ class FUSE(object):
+ def statfs(self, path, buf):
+ stv = buf.contents
+ attrs = self.operations('statfs', path)
+- for key, val in attrs.items():
++ for key, val in list(attrs.items()):
+ if hasattr(stv, key):
+ setattr(stv, key, val)
+ return 0
+--- fs/expose/http.py.orig 2015-04-12 17:24:29 UTC
++++ fs/expose/http.py
+@@ -1,13 +1,13 @@
+ __all__ = ["serve_fs"]
+
+-import SimpleHTTPServer
+-import SocketServer
++import http.server
++import socketserver
+ from fs.path import pathjoin, dirname
+ from fs.errors import FSError
+ from time import mktime
+-from cStringIO import StringIO
++from io import StringIO
+ import cgi
+-import urllib
++import urllib.request, urllib.parse, urllib.error
+ import posixpath
+ import time
+ import threading
+@@ -16,13 +16,13 @@ import socket
+ def _datetime_to_epoch(d):
+ return mktime(d.timetuple())
+
+-class FSHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
++class FSHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
+
+ """A hacked together version of SimpleHTTPRequestHandler"""
+
+ def __init__(self, fs, request, client_address, server):
+ self._fs = fs
+- SimpleHTTPServer.SimpleHTTPRequestHandler.__init__(self, request, client_address, server)
++ http.server.SimpleHTTPRequestHandler.__init__(self, request, client_address, server)
+
+ def do_GET(self):
+ """Serve a GET request."""
+@@ -69,7 +69,7 @@ class FSHTTPRequestHandler(SimpleHTTPServer.SimpleHTTP
+ try:
+ info = self._fs.getinfo(path)
+ f = self._fs.open(path, 'rb')
+- except FSError, e:
++ except FSError as e:
+ self.send_error(404, str(e))
+ return None
+ self.send_response(200)
+@@ -98,7 +98,7 @@ class FSHTTPRequestHandler(SimpleHTTPServer.SimpleHTTP
+ paths = [p+'/' for p in sorted(dir_paths, key=lambda p:p.lower())] + sorted(file_paths, key=lambda p:p.lower())
+ #list.sort(key=lambda a: a.lower())
+ f = StringIO()
+- displaypath = cgi.escape(urllib.unquote(self.path))
++ displaypath = cgi.escape(urllib.parse.unquote(self.path))
+ f.write('<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">')
+ f.write("<html>\n<title>Directory listing for %s</title>\n" % displaypath)
+ f.write("<body>\n<h2>Directory listing for %s</h2>\n" % displaypath)
+@@ -106,11 +106,11 @@ class FSHTTPRequestHandler(SimpleHTTPServer.SimpleHTTP
+
+ parent = dirname(path)
+ if path != parent:
+- f.write('<li><a href="%s">../</a></li>' % urllib.quote(parent.rstrip('/') + '/'))
++ f.write('<li><a href="%s">../</a></li>' % urllib.parse.quote(parent.rstrip('/') + '/'))
+
+ for path in paths:
+ f.write('<li><a href="%s">%s</a>\n'
+- % (urllib.quote(path), cgi.escape(path)))
++ % (urllib.parse.quote(path), cgi.escape(path)))
+ f.write("</ul>\n<hr>\n</body>\n</html>\n")
+ length = f.tell()
+ f.seek(0)
+@@ -124,7 +124,7 @@ class FSHTTPRequestHandler(SimpleHTTPServer.SimpleHTTP
+ # abandon query parameters
+ path = path.split('?',1)[0]
+ path = path.split('#',1)[0]
+- path = posixpath.normpath(urllib.unquote(path))
++ path = posixpath.normpath(urllib.parse.unquote(path))
+ return path
+
+
+@@ -143,7 +143,7 @@ def serve_fs(fs, address='', port=8000):
+
+ #class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
+ # pass
+- httpd = SocketServer.TCPServer((address, port), Handler, bind_and_activate=False)
++ httpd = socketserver.TCPServer((address, port), Handler, bind_and_activate=False)
+ #httpd = ThreadedTCPServer((address, port), Handler, bind_and_activate=False)
+ httpd.allow_reuse_address = True
+ httpd.server_bind()
+--- fs/expose/importhook.py.orig 2015-04-12 17:24:29 UTC
++++ fs/expose/importhook.py
+@@ -60,7 +60,7 @@ class FSImportHook(object):
+ def __init__(self,fs_or_url):
+ # If given a string, try to open it as an FS url.
+ # Don't open things on the local filesystem though.
+- if isinstance(fs_or_url,basestring):
++ if isinstance(fs_or_url,str):
+ if ":/" not in fs_or_url:
+ raise ImportError
+ try:
+@@ -182,7 +182,7 @@ class FSImportHook(object):
+ mod.__loader__ = self
+ sys.modules[fullname] = mod
+ try:
+- exec code in mod.__dict__
++ exec(code, mod.__dict__)
+ mod.__file__ = self.get_filename(fullname,info)
+ if self.is_package(fullname,info):
+ if self.path is None:
+@@ -231,7 +231,7 @@ class FSImportHook(object):
+ """Read the specified data file."""
+ try:
+ return self.fs.getcontents(path, 'rb')
+- except FSError, e:
++ except FSError as e:
+ raise IOError(str(e))
+
+ def get_filename(self,fullname,info=None):
+--- fs/expose/sftp.py.orig 2015-04-12 17:24:29 UTC
++++ fs/expose/sftp.py
+@@ -24,12 +24,12 @@ is, you probably don't want to use it.
+
+ """
+
+-from __future__ import with_statement
+
++
+ import os
+ import stat as statinfo
+ import time
+-import SocketServer
++import socketserver
+ import threading
+
+ import paramiko
+@@ -73,11 +73,11 @@ def report_sftp_errors(func):
+ def wrapper(*args,**kwds):
+ try:
+ return func(*args, **kwds)
+- except ResourceNotFoundError, e:
++ except ResourceNotFoundError as e:
+ return paramiko.SFTP_NO_SUCH_FILE
+- except UnsupportedError, e:
++ except UnsupportedError as e:
+ return paramiko.SFTP_OP_UNSUPPORTED
+- except FSError, e:
++ except FSError as e:
+ return paramiko.SFTP_FAILURE
+ return wrapper
+
+@@ -114,7 +114,7 @@ class SFTPServerInterface(paramiko.SFTPServerInterface
+
+ @report_sftp_errors
+ def list_folder(self, path):
+- if not isinstance(path, unicode):
++ if not isinstance(path, str):
+ path = path.decode(self.encoding)
+ stats = []
+ for entry in self.fs.listdir(path, absolute=True):
+@@ -125,7 +125,7 @@ class SFTPServerInterface(paramiko.SFTPServerInterface
+
+ @report_sftp_errors
+ def stat(self, path):
+- if not isinstance(path, unicode):
++ if not isinstance(path, str):
+ path = path.decode(self.encoding)
+
+ info = self.fs.getinfo(path)
+@@ -146,9 +146,9 @@ class SFTPServerInterface(paramiko.SFTPServerInterface
+ stat.st_mtime = time.mktime(info.get("modified_time").timetuple())
+
+ if isdir(self.fs, path, info):
+- stat.st_mode = 0777 | statinfo.S_IFDIR
++ stat.st_mode = 0o777 | statinfo.S_IFDIR
+ else:
+- stat.st_mode = 0777 | statinfo.S_IFREG
++ stat.st_mode = 0o777 | statinfo.S_IFREG
+ return stat
+
+ def lstat(self, path):
+@@ -156,16 +156,16 @@ class SFTPServerInterface(paramiko.SFTPServerInterface
+
+ @report_sftp_errors
+ def remove(self, path):
+- if not isinstance(path, unicode):
++ if not isinstance(path, str):
+ path = path.decode(self.encoding)
+ self.fs.remove(path)
+ return paramiko.SFTP_OK
+
+ @report_sftp_errors
+ def rename(self, oldpath, newpath):
+- if not isinstance(oldpath, unicode):
++ if not isinstance(oldpath, str):
+ oldpath = oldpath.decode(self.encoding)
+- if not isinstance(newpath, unicode):
++ if not isinstance(newpath, str):
+ newpath = newpath.decode(self.encoding)
+ if self.fs.isfile(oldpath):
+ self.fs.move(oldpath, newpath)
+@@ -175,14 +175,14 @@ class SFTPServerInterface(paramiko.SFTPServerInterface
+
+ @report_sftp_errors
+ def mkdir(self, path, attr):
+- if not isinstance(path, unicode):
++ if not isinstance(path, str):
+ path = path.decode(self.encoding)
+ self.fs.makedir(path)
+ return paramiko.SFTP_OK
+
+ @report_sftp_errors
+ def rmdir(self, path):
+- if not isinstance(path, unicode):
++ if not isinstance(path, str):
+ path = path.decode(self.encoding)
+ self.fs.removedir(path)
+ return paramiko.SFTP_OK
+@@ -224,7 +224,7 @@ class SFTPHandle(paramiko.SFTPHandle):
+ super(SFTPHandle, self).__init__(flags)
+ mode = flags_to_mode(flags)
+ self.owner = owner
+- if not isinstance(path, unicode):
++ if not isinstance(path, str):
+ path = path.decode(self.owner.encoding)
+ self.path = path
+ self._file = owner.fs.open(path, mode)
+@@ -263,7 +263,7 @@ class SFTPServer(paramiko.SFTPServer):
+ super(SFTPServer, self).finish_subsystem()
+
+
+-class SFTPRequestHandler(SocketServer.BaseRequestHandler):
++class SFTPRequestHandler(socketserver.BaseRequestHandler):
+ """SocketServer RequestHandler subclass for BaseSFTPServer.
+
+ This RequestHandler subclass creates a paramiko Transport, sets up the
+@@ -305,7 +305,7 @@ class SFTPRequestHandler(SocketServer.BaseRequestHandl
+
+
+
+-class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
++class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
+ pass
+
+
+@@ -334,7 +334,7 @@ class BaseSFTPServer(ThreadedTCPServer):
+ self.host_key = host_key
+ if RequestHandlerClass is None:
+ RequestHandlerClass = SFTPRequestHandler
+- SocketServer.TCPServer.__init__(self, address, RequestHandlerClass)
++ socketserver.TCPServer.__init__(self, address, RequestHandlerClass)
+
+ def shutdown_request(self, request):
+ # Prevent TCPServer from closing the connection prematurely
+--- fs/expose/wsgi/__init__.py.orig 2022-03-04 17:14:43 UTC
++++ fs/expose/wsgi/__init__.py
+@@ -1 +1 @@
+-from wsgi import serve_fs
++from .wsgi import serve_fs
+--- fs/expose/wsgi/serve_home.py.orig 2015-04-12 17:24:29 UTC
++++ fs/expose/wsgi/serve_home.py
+@@ -1,10 +1,10 @@
+ from wsgiref.simple_server import make_server
+
+ from fs.osfs import OSFS
+-from wsgi import serve_fs
++from .wsgi import serve_fs
+ osfs = OSFS('~/')
+ application = serve_fs(osfs)
+
+ httpd = make_server('', 8000, application)
+-print "Serving on http://127.0.0.1:8000"
++print("Serving on http://127.0.0.1:8000")
+ httpd.serve_forever()
+--- fs/expose/wsgi/wsgi.py.orig 2015-04-12 17:24:29 UTC
++++ fs/expose/wsgi/wsgi.py
+@@ -1,5 +1,5 @@
+
+-import urlparse
++import urllib.parse
+ import mimetypes
+
+ from fs.errors import FSError
+@@ -10,7 +10,7 @@ from datetime import datetime
+ try:
+ from mako.template import Template
+ except ImportError:
+- print "Requires mako templates http://www.makotemplates.org/"
++ print("Requires mako templates http://www.makotemplates.org/")
+ raise
+
+
+@@ -28,7 +28,7 @@ class WSGIServer(object):
+ def __init__(self, serve_fs, indexes=True, dir_template=None, chunk_size=16*1024*1024):
+
+ if dir_template is None:
+- from dirtemplate import template as dir_template
++ from .dirtemplate import template as dir_template
+
+ self.serve_fs = serve_fs
+ self.indexes = indexes
+@@ -57,7 +57,7 @@ class WSGIServer(object):
+ serving_file = None
+ try:
+ serving_file = self.serve_fs.open(path, 'rb')
+- except Exception, e:
++ except Exception as e:
+ if serving_file is not None:
+ serving_file.close()
+ return self.serve_500(request, str(e))
+--- fs/expose/xmlrpc.py.orig 2022-03-04 17:14:43 UTC
++++ fs/expose/xmlrpc.py
+@@ -15,8 +15,8 @@ an FS object, which can then be exposed using whatever
+
+ """
+
+-import xmlrpclib
+-from SimpleXMLRPCServer import SimpleXMLRPCServer
++import xmlrpc.client
++from xmlrpc.server import SimpleXMLRPCServer
+ from datetime import datetime
+ import base64
+
+@@ -61,13 +61,13 @@ class RPCFSInterface(object):
+
+ def getmeta(self, meta_name):
+ meta = self.fs.getmeta(meta_name)
+- if isinstance(meta, basestring):
++ if isinstance(meta, str):
+ meta = self.decode_path(meta)
+ return meta
+
+ def getmeta_default(self, meta_name, default):
+ meta = self.fs.getmeta(meta_name, default)
+- if isinstance(meta, basestring):
++ if isinstance(meta, str):
+ meta = self.decode_path(meta)
+ return meta
+
+@@ -77,7 +77,7 @@ class RPCFSInterface(object):
+ def get_contents(self, path, mode="rb"):
+ path = self.decode_path(path)
+ data = self.fs.getcontents(path, mode)
+- return xmlrpclib.Binary(data)
++ return xmlrpc.client.Binary(data)
+
+ def set_contents(self, path, data):
+ path = self.decode_path(path)
+@@ -119,16 +119,16 @@ class RPCFSInterface(object):
+
+ def settimes(self, path, accessed_time, modified_time):
+ path = self.decode_path(path)
+- if isinstance(accessed_time, xmlrpclib.DateTime):
++ if isinstance(accessed_time, xmlrpc.client.DateTime):
+ accessed_time = datetime.strptime(accessed_time.value, "%Y%m%dT%H:%M:%S")
+- if isinstance(modified_time, xmlrpclib.DateTime):
++ if isinstance(modified_time, xmlrpc.client.DateTime):
+ modified_time = datetime.strptime(modified_time.value, "%Y%m%dT%H:%M:%S")
+ return self.fs.settimes(path, accessed_time, modified_time)
+
+ def getinfo(self, path):
+ path = self.decode_path(path)
+ info = self.fs.getinfo(path)
+- info = dict((k, v) for k, v in info.iteritems()
++ info = dict((k, v) for k, v in info.items()
+ if k in self._allowed_info)
+ return info
+
+--- fs/filelike.py.orig 2022-03-04 17:14:43 UTC
++++ fs/filelike.py
+@@ -52,9 +52,9 @@ if PY3:
+ from six import BytesIO as _StringIO
+ else:
+ try:
+- from cStringIO import StringIO as _StringIO
++ from io import StringIO as _StringIO
+ except ImportError:
+- from StringIO import StringIO as _StringIO
++ from io import StringIO as _StringIO
+
+
+ class FileLikeBase(object):
+@@ -305,7 +305,7 @@ class FileLikeBase(object):
+ self.close()
+ return False
+
+- def next(self):
++ def __next__(self):
+ """next() method complying with the iterator protocol.
+
+ File-like objects are their own iterators, with each call to
+--- fs/ftpfs.py.orig 2015-04-12 17:24:29 UTC
++++ fs/ftpfs.py
+@@ -37,9 +37,9 @@ if PY3:
+ from six import BytesIO as StringIO
+ else:
+ try:
+- from cStringIO import StringIO
++ from io import StringIO
+ except ImportError:
+- from StringIO import StringIO
++ from io import StringIO
+
+ import time
+
+@@ -221,10 +221,10 @@ class FTPListDataParser(object):
+ elif c == 'r':
+ result.try_retr = True
+ elif c == 's':
+- result.size = long(buf[i+1:j])
++ result.size = int(buf[i+1:j])
+ elif c == 'm':
+ result.mtime_type = MTIME_TYPE.LOCAL
+- result.mtime = long(buf[i+1:j])
++ result.mtime = int(buf[i+1:j])
+ elif c == 'i':
+ result.id_type = ID_TYPE.FULL
+ result.id = buf[i+1:j-i-1]
+@@ -285,7 +285,7 @@ class FTPListDataParser(object):
+
+ elif state == 4: # getting tentative size
+ try:
+- size = long(buf[i:j])
++ size = int(buf[i:j])
+ except ValueError:
+ pass
+ state = 5
+@@ -295,25 +295,25 @@ class FTPListDataParser(object):
+ if month >= 0:
+ state = 6
+ else:
+- size = long(buf[i:j])
++ size = int(buf[i:j])
+
+ elif state == 6: # have size and month
+- mday = long(buf[i:j])
++ mday = int(buf[i:j])
+ state = 7
+
+ elif state == 7: # have size, month, mday
+ if (j - i == 4) and (buf[i+1] == ':'):
+- hour = long(buf[i])
+- minute = long(buf[i+2:i+4])
++ hour = int(buf[i])
++ minute = int(buf[i+2:i+4])
+ result.mtime_type = MTIME_TYPE.REMOTE_MINUTE
+ result.mtime = self._guess_time(month, mday, hour, minute)
+ elif (j - i == 5) and (buf[i+2] == ':'):
+- hour = long(buf[i:i+2])
+- minute = long(buf[i+3:i+5])
++ hour = int(buf[i:i+2])
++ minute = int(buf[i+3:i+5])
+ result.mtime_type = MTIME_TYPE.REMOTE_MINUTE
+ result.mtime = self._guess_time(month, mday, hour, minute)
+ elif j - i >= 4:
+- year = long(buf[i:j])
++ year = int(buf[i:j])
+ result.mtime_type = MTIME_TYPE.REMOTE_DAY
+ result.mtime = self._get_mtime(year, month, mday)
+ else:
+@@ -379,7 +379,7 @@ class FTPListDataParser(object):
+ j = i
+
+ j = buf.index('-', j)
+- mday = long(buf[i:j])
++ mday = int(buf[i:j])
+
+ j = _skip(buf, j, '-')
+ i = j
+@@ -391,13 +391,13 @@ class FTPListDataParser(object):
+ j = _skip(buf, j, '-')
+ i = j
+ j = buf.index(' ', j)
+- year = long(buf[i:j])
++ year = int(buf[i:j])
+
+ j = _skip(buf, j, ' ')
+ i = j
+
+ j = buf.index(':', j)
+- hour = long(buf[i:j])
++ hour = int(buf[i:j])
+ j = _skip(buf, j, ':')
+ i = j
+
+@@ -406,7 +406,7 @@ class FTPListDataParser(object):
+ if j == buflen:
+ raise IndexError # abort, abort!
+
+- minute = long(buf[i:j])
++ minute = int(buf[i:j])
+
+ result.mtime_type = MTIME_TYPE.REMOTE_MINUTE
+ result.mtime = self._get_mtime(year, month, mday, hour, minute)
+@@ -430,17 +430,17 @@ class FTPListDataParser(object):
+ result = FTPListData(buf)
+
+ j = buf.index('-', j)
+- month = long(buf[i:j])
++ month = int(buf[i:j])
+
+ j = _skip(buf, j, '-')
+ i = j
+ j = buf.index('-', j)
+- mday = long(buf[i:j])
++ mday = int(buf[i:j])
+
+ j = _skip(buf, j, '-')
+ i = j
+ j = buf.index(' ', j)
+- year = long(buf[i:j])
++ year = int(buf[i:j])
+ if year < 50:
+ year += 2000
+ if year < 1000:
+@@ -449,14 +449,14 @@ class FTPListDataParser(object):
+ j = _skip(buf, j, ' ')
+ i = j
+ j = buf.index(':', j)
+- hour = long(buf[i:j])
++ hour = int(buf[i:j])
+ j = _skip(buf, j, ':')
+ i = j
+ while not (buf[j] in 'AP'):
+ j += 1
+ if j == buflen:
+ raise IndexError
+- minute = long(buf[i:j])
++ minute = int(buf[i:j])
+
+ if buf[j] == 'A':
+ j += 1
+@@ -482,7 +482,7 @@ class FTPListDataParser(object):
+ i = j
+ j = buf.index(' ', j)
+
+- result.size = long(buf[i:j])
++ result.size = int(buf[i:j])
+ result.try_retr = True
+
+ j = _skip(buf, j, ' ')
+@@ -546,10 +546,10 @@ class FTPMlstDataParser(object):
+ int(factvalue[12:14]),
+ 0, 0, 0))
+ elif factname == 'size':
+- result.size = long(factvalue)
++ result.size = int(factvalue)
+ elif factname == 'sizd':
+ # some FTP servers report directory size with sizd
+- result.size = long(factvalue)
++ result.size = int(factvalue)
+ elif factname == 'type':
+ if factvalue.lower() == 'file':
+ result.try_retr = True
+@@ -605,7 +605,7 @@ def fileftperrors(f):
+ try:
+ try:
+ ret = f(self, *args, **kwargs)
+- except Exception, e:
++ except Exception as e:
+ self.ftpfs._translate_exception(args[0] if args else '', e)
+ finally:
+ self._lock.release()
+@@ -795,16 +795,16 @@ class _FTPFile(object):
+ self.conn.close()
+ self.conn = None
+ self.ftp.voidresp()
+- except error_temp, error_perm:
++ except error_temp as error_perm:
+ pass
+ if self.ftp is not None:
+ try:
+ self.ftp.close()
+- except error_temp, error_perm:
++ except error_temp as error_perm:
+ pass
+ self.closed = True
+
+- def next(self):
++ def __next__(self):
+ return self.readline()
+
+ def readline(self, size=None):
+@@ -823,7 +823,7 @@ def ftperrors(f):
+ try:
+ try:
+ ret = f(self, *args, **kwargs)
+- except Exception, e:
++ except Exception as e:
+ self._translate_exception(args[0] if args else '', e)
+ finally:
+ self._leave_dircache()
+@@ -834,7 +834,7 @@ def ftperrors(f):
+
+
+ def _encode(s):
+- if isinstance(s, unicode):
++ if isinstance(s, str):
+ return s.encode('utf-8')
+ return s
+
+@@ -956,7 +956,7 @@ class FTPFS(FS):
+ return features
+
+ def on_line(line):
+- if not isinstance(line, unicode):
++ if not isinstance(line, str):
+ line = line.decode('utf-8')
+ info = parse_ftp_list_line(line, self.use_mlst)
+ if info:
+@@ -986,7 +986,7 @@ class FTPFS(FS):
+ else: # Matrix FTP server has bug
+ on_line(list_line)
+ # if it's a dir, then we can send a MLSD
+- if dirlist[dirlist.keys()[0]]['try_cwd']:
++ if dirlist[list(dirlist.keys())[0]]['try_cwd']:
+ dirlist = {}
+ self.ftp.retrlines("MLSD " + encoded_path, on_line)
+ else:
+@@ -996,11 +996,11 @@ class FTPFS(FS):
+ self.dircache[path] = dirlist
+
+ def is_symlink(info):
+- return info['try_retr'] and info['try_cwd'] and info.has_key('target')
++ return info['try_retr'] and info['try_cwd'] and 'target' in info
+
+ def resolve_symlink(linkpath):
+ linkinfo = self.getinfo(linkpath)
+- if not linkinfo.has_key('resolved'):
++ if 'resolved' not in linkinfo:
+ linkinfo['resolved'] = linkpath
+ if is_symlink(linkinfo):
+ target = linkinfo['target']
+@@ -1036,7 +1036,7 @@ class FTPFS(FS):
+ else:
+ dircache = self.dircache
+ paths = [normpath(abspath(path)) for path in paths]
+- for cached_path in dircache.keys():
++ for cached_path in list(dircache.keys()):
+ for path in paths:
+ if isbase(cached_path, path):
+ dircache.pop(cached_path, None)
+@@ -1083,7 +1083,7 @@ class FTPFS(FS):
+ else:
+ ftp.connect(self.host, self.port, self.timeout)
+ ftp.login(self.user, self.passwd, self.acct)
+- except socket_error, e:
++ except socket_error as e:
+ raise RemoteConnectionError(str(e), details=e)
+ return ftp
+
+@@ -1104,7 +1104,7 @@ class FTPFS(FS):
+ return '<FTPFS %s>' % self.host
+
+ def __unicode__(self):
+- return u'<FTPFS %s>' % self.host
++ return '<FTPFS %s>' % self.host
+
+ @convert_os_errors
+ def _translate_exception(self, path, exception):
+@@ -1225,7 +1225,7 @@ class FTPFS(FS):
+ raise ResourceNotFoundError(path)
+ if not self.isdir(path):
+ raise ResourceInvalidError(path)
+- paths = self._readdir(path).keys()
++ paths = list(self._readdir(path).keys())
+
+ return self._listdir_helper(path, paths, wildcard, full, absolute, dirs_only, files_only)
+
+@@ -1266,7 +1266,7 @@ class FTPFS(FS):
+ self.ftp.mkd(_encode(path))
+ except error_reply:
+ return
+- except error_perm, e:
++ except error_perm as e:
+ if recursive or allow_recreate:
+ return
+ if str(e).split(' ', 1)[0]=='550':
+@@ -1337,7 +1337,7 @@ class FTPFS(FS):
+ try:
+ self.refresh_dircache(dirname(src), dirname(dst))
+ self.ftp.rename(_encode(src), _encode(dst))
+- except error_perm, exception:
++ except error_perm as exception:
+ code, message = str(exception).split(' ', 1)
+ if code == "550":
+ if not self.exists(dirname(dst)):
+--- fs/httpfs.py.orig 2015-04-12 17:24:29 UTC
++++ fs/httpfs.py
+@@ -10,8 +10,8 @@ from fs.path import normpath
+ from fs.errors import ResourceNotFoundError, UnsupportedError
+ from fs.filelike import FileWrapper
+ from fs import iotools
+-
+-from urllib2 import urlopen, URLError
++from urllib.request import urlopen
++from urllib.error import URLError
+ from datetime import datetime
+
+
+@@ -50,9 +50,9 @@ class HTTPFS(FS):
+ url = self._make_url(path)
+ try:
+ f = urlopen(url)
+- except URLError, e:
++ except URLError as e:
+ raise ResourceNotFoundError(path, details=e)
+- except OSError, e:
++ except OSError as e:
+ raise ResourceNotFoundError(path, details=e)
+
+ return FileWrapper(f)
+--- fs/iotools.py.orig 2022-03-04 17:14:43 UTC
++++ fs/iotools.py
+@@ -1,6 +1,6 @@
+-from __future__ import unicode_literals
+-from __future__ import print_function
+
++
++
+ from fs import SEEK_SET, SEEK_CUR, SEEK_END
+
+ import io
+@@ -178,7 +178,7 @@ def make_bytes_io(data, encoding=None, errors=None):
+ if hasattr(data, 'mode') and 'b' in data.mode:
+ # It's already a binary file
+ return data
+- if not isinstance(data, basestring):
++ if not isinstance(data, str):
+ # It's a file, but we don't know if its binary
+ # TODO: Is there a better way than reading the entire file?
+ data = data.read() or b''
+--- fs/memoryfs.py.orig 2022-03-04 17:14:43 UTC
++++ fs/memoryfs.py
+@@ -78,10 +78,10 @@ class MemoryFile(object):
+ return "<MemoryFile in %s %s>" % (self.memory_fs, self.path)
+
+ def __repr__(self):
+- return u"<MemoryFile in %s %s>" % (self.memory_fs, self.path)
++ return "<MemoryFile in %s %s>" % (self.memory_fs, self.path)
+
+ def __unicode__(self):
+- return u"<MemoryFile in %s %s>" % (self.memory_fs, self.path)
++ return "<MemoryFile in %s %s>" % (self.memory_fs, self.path)
+
+ def __del__(self):
+ if not self.closed:
+@@ -101,7 +101,7 @@ class MemoryFile(object):
+ def next(self):
+ if 'r' not in self.mode and '+' not in self.mode:
+ raise IOError("File not open for reading")
+- return self.mem_file.next()
++ return next(self.mem_file)
+
+ @seek_and_lock
+ def readline(self, *args, **kwargs):
+@@ -218,7 +218,7 @@ class DirEntry(object):
+ if self.isfile():
+ return "<file %s>" % self.name
+ elif self.isdir():
+- return "<dir %s>" % "".join("%s: %s" % (k, v.desc_contents()) for k, v in self.contents.iteritems())
++ return "<dir %s>" % "".join("%s: %s" % (k, v.desc_contents()) for k, v in self.contents.items())
+
+ def isdir(self):
+ return self.type == "dir"
+@@ -559,10 +559,10 @@ class MemoryFS(FS):
+ raise ResourceNotFoundError(path)
+ if dir_entry.isfile():
+ raise ResourceInvalidError(path, msg="not a directory: %(path)s")
+- paths = dir_entry.contents.keys()
++ paths = list(dir_entry.contents.keys())
+ for (i,p) in enumerate(paths):
+- if not isinstance(p,unicode):
+- paths[i] = unicode(p)
++ if not isinstance(p,str):
++ paths[i] = str(p)
+ return self._listdir_helper(path, paths, wildcard, full, absolute, dirs_only, files_only)
+
+ @synchronize
+@@ -578,10 +578,10 @@ class MemoryFS(FS):
+ info['accessed_time'] = dir_entry.accessed_time
+
+ if dir_entry.isdir():
+- info['st_mode'] = 0755 | stat.S_IFDIR
++ info['st_mode'] = 0o755 | stat.S_IFDIR
+ else:
+ info['size'] = len(dir_entry.data or b(''))
+- info['st_mode'] = 0666 | stat.S_IFREG
++ info['st_mode'] = 0o666 | stat.S_IFREG
+
+ return info
+
+@@ -671,12 +671,12 @@ class MemoryFS(FS):
+ @synchronize
+ def setxattr(self, path, key, value):
+ dir_entry = self._dir_entry(path)
+- key = unicode(key)
++ key = str(key)
+ dir_entry.xattrs[key] = value
+
+ @synchronize
+ def getxattr(self, path, key, default=None):
+- key = unicode(key)
++ key = str(key)
+ dir_entry = self._dir_entry(path)
+ return dir_entry.xattrs.get(key, default)
+
+@@ -691,4 +691,4 @@ class MemoryFS(FS):
+ @synchronize
+ def listxattrs(self, path):
+ dir_entry = self._dir_entry(path)
+- return dir_entry.xattrs.keys()
++ return list(dir_entry.xattrs.keys())
+--- fs/mountfs.py.orig 2022-03-04 17:14:43 UTC
++++ fs/mountfs.py
+@@ -61,7 +61,7 @@ class DirMount(object):
+ return "<DirMount %s, %s>" % (self.path, self.fs)
+
+ def __unicode__(self):
+- return u"<DirMount %s, %s>" % (self.path, self.fs)
++ return "<DirMount %s, %s>" % (self.path, self.fs)
+
+
+ class FileMount(object):
+@@ -90,12 +90,12 @@ class MountFS(FS):
+ self.mount_tree = PathMap()
+
+ def __str__(self):
+- return "<%s [%s]>" % (self.__class__.__name__,self.mount_tree.items(),)
++ return "<%s [%s]>" % (self.__class__.__name__,list(self.mount_tree.items()),)
+
+ __repr__ = __str__
+
+ def __unicode__(self):
+- return u"<%s [%s]>" % (self.__class__.__name__,self.mount_tree.items(),)
++ return "<%s [%s]>" % (self.__class__.__name__,list(self.mount_tree.items()),)
+
+ def _delegate(self, path):
+ path = abspath(normpath(path))
+@@ -119,7 +119,7 @@ class MountFS(FS):
+ return self, "/", path
+
+ try:
+- self.mount_tree.iternames(path).next()
++ next(self.mount_tree.iternames(path))
+ except StopIteration:
+ return None, None, None
+ else:
+@@ -129,7 +129,7 @@ class MountFS(FS):
+ def close(self):
+ # Explicitly closes children if requested
+ if self.auto_close:
+- for mount in self.mount_tree.itervalues():
++ for mount in self.mount_tree.values():
+ mount.fs.close()
+ # Free references (which may incidently call the close method of the child filesystems)
+ self.mount_tree.clear()
+--- fs/multifs.py.orig 2022-03-04 17:14:43 UTC
++++ fs/multifs.py
+@@ -106,7 +106,7 @@ class MultiFS(FS):
+
+ @synchronize
+ def __unicode__(self):
+- return u"<MultiFS: %s>" % ", ".join(unicode(fs) for fs in self.fs_sequence)
++ return "<MultiFS: %s>" % ", ".join(str(fs) for fs in self.fs_sequence)
+
+ def _get_priority(self, name):
+ return self.fs_priorities[name]
+@@ -128,7 +128,7 @@ class MultiFS(FS):
+
+ def _priority_sort(self):
+ """Sort filesystems by priority order"""
+- priority_order = sorted(self.fs_lookup.keys(), key=lambda n: self.fs_priorities[n], reverse=True)
++ priority_order = sorted(list(self.fs_lookup.keys()), key=lambda n: self.fs_priorities[n], reverse=True)
+ self.fs_sequence = [self.fs_lookup[name] for name in priority_order]
+
+ @synchronize
+@@ -214,7 +214,7 @@ class MultiFS(FS):
+ return self.writefs
+ for fs in self:
+ if fs.exists(path):
+- for fs_name, fs_object in self.fs_lookup.iteritems():
++ for fs_name, fs_object in self.fs_lookup.items():
+ if fs is fs_object:
+ return fs_name, fs
+ raise ResourceNotFoundError(path, msg="Path does not map to any filesystem: %(path)s")
+--- fs/opener.py.orig 2022-03-04 17:14:43 UTC
++++ fs/opener.py
+@@ -72,7 +72,7 @@ from fs.filelike import FileWrapper
+ from os import getcwd
+ import os.path
+ import re
+-from urlparse import urlparse
++from urllib.parse import urlparse
+
+ class OpenerError(Exception):
+ """The base exception thrown by openers"""
+@@ -794,7 +794,7 @@ example:
+ def get_fs(cls, registry, fs_name, fs_name_params, fs_path, writeable, create_dir):
+
+ from fs.mountfs import MountFS
+- from ConfigParser import ConfigParser
++ from configparser import ConfigParser
+ cfg = ConfigParser()
+
+ if '#' in fs_path:
+@@ -830,7 +830,7 @@ example:
+ def get_fs(cls, registry, fs_name, fs_name_params, fs_path, writeable, create_dir):
+
+ from fs.multifs import MultiFS
+- from ConfigParser import ConfigParser
++ from configparser import ConfigParser
+ cfg = ConfigParser()
+
+ if '#' in fs_path:
+--- fs/osfs/__init__.py.orig 2015-11-13 22:18:37 UTC
++++ fs/osfs/__init__.py
+@@ -48,13 +48,13 @@ def _os_stat(path):
+
+
+ @convert_os_errors
+-def _os_mkdir(name, mode=0777):
++def _os_mkdir(name, mode=0o777):
+ """Replacement for os.mkdir that raises FSError subclasses."""
+ return os.mkdir(name, mode)
+
+
+ @convert_os_errors
+-def _os_makedirs(name, mode=0777):
++def _os_makedirs(name, mode=0o777):
+ """Replacement for os.makdirs that raises FSError subclasses.
+
+ This implementation also correctly handles win32 long filenames (those
+@@ -71,7 +71,7 @@ def _os_makedirs(name, mode=0777):
+ if head and tail and not os.path.exists(head):
+ try:
+ _os_makedirs(head, mode)
+- except OSError, e:
++ except OSError as e:
+ if e.errno != errno.EEXIST:
+ raise
+ if tail == os.curdir:
+@@ -98,11 +98,11 @@ class OSFS(OSFSXAttrMixin, OSFSWatchMixin, FS):
+ 'atomic.setcontents': False}
+
+ if platform.system() == 'Windows':
+- _meta["invalid_path_chars"] = ''.join(chr(n) for n in xrange(31)) + '\\:*?"<>|'
++ _meta["invalid_path_chars"] = ''.join(chr(n) for n in range(31)) + '\\:*?"<>|'
+ else:
+ _meta["invalid_path_chars"] = '\0'
+
+- def __init__(self, root_path, thread_synchronize=_thread_synchronize_default, encoding=None, create=False, dir_mode=0700, use_long_paths=True):
++ def __init__(self, root_path, thread_synchronize=_thread_synchronize_default, encoding=None, create=False, dir_mode=0o700, use_long_paths=True):
+ """
+ Creates an FS object that represents the OS Filesystem under a given root path
+
+@@ -124,13 +124,13 @@ class OSFS(OSFSXAttrMixin, OSFSWatchMixin, FS):
+ if sys.platform == "win32":
+ if use_long_paths and not root_path.startswith("\\\\?\\"):
+ if not root_path.startswith("\\"):
+- root_path = u"\\\\?\\" + root_path
++ root_path = "\\\\?\\" + root_path
+ else:
+ # Explicitly mark UNC paths, seems to work better.
+ if root_path.startswith("\\\\"):
+- root_path = u"\\\\?\\UNC\\" + root_path[2:]
++ root_path = "\\\\?\\UNC\\" + root_path[2:]
+ else:
+- root_path = u"\\\\?" + root_path
++ root_path = "\\\\?" + root_path
+ # If it points at the root of a drive, it needs a trailing slash.
+ if len(root_path) == 6 and not root_path.endswith("\\"):
+ root_path = root_path + "\\"
+@@ -155,16 +155,16 @@ class OSFS(OSFSXAttrMixin, OSFSWatchMixin, FS):
+ return "<OSFS: %r>" % self.root_path
+
+ def __unicode__(self):
+- return u"<OSFS: %s>" % self.root_path
++ return "<OSFS: %s>" % self.root_path
+
+ def _decode_path(self, p):
+- if isinstance(p, unicode):
++ if isinstance(p, str):
+ return p
+ return p.decode(self.encoding, 'replace')
+
+ def getsyspath(self, path, allow_none=False):
+ self.validatepath(path)
+- path = relpath(normpath(path)).replace(u"/", os.sep)
++ path = relpath(normpath(path)).replace("/", os.sep)
+ path = os.path.join(self.root_path, path)
+ if not path.startswith(self.root_path):
+ raise PathError(path, msg="OSFS given path outside root: %(path)s")
+@@ -234,7 +234,7 @@ class OSFS(OSFSXAttrMixin, OSFSWatchMixin, FS):
+ encoding = encoding or 'utf-8'
+ try:
+ return io.open(sys_path, mode=mode, buffering=buffering, encoding=encoding, errors=errors, newline=newline)
+- except EnvironmentError, e:
++ except EnvironmentError as e:
+ # Win32 gives EACCES when opening a directory.
+ if sys.platform == "win32" and e.errno in (errno.EACCES,):
+ if self.isdir(path):
+@@ -301,7 +301,7 @@ class OSFS(OSFSXAttrMixin, OSFSWatchMixin, FS):
+ sys_path = self.getsyspath(path)
+ try:
+ os.remove(sys_path)
+- except OSError, e:
++ except OSError as e:
+ if e.errno == errno.EACCES and sys.platform == "win32":
+ # sometimes windows says this for attempts to remove a dir
+ if os.path.isdir(sys_path):
+@@ -338,7 +338,7 @@ class OSFS(OSFSXAttrMixin, OSFSWatchMixin, FS):
+ path_dst = self.getsyspath(dst)
+ try:
+ os.rename(path_src, path_dst)
+- except OSError, e:
++ except OSError as e:
+ if e.errno:
+ # POSIX rename() can rename over an empty directory but gives
+ # ENOTEMPTY if the dir has contents. Raise UnsupportedError
+--- fs/osfs/watch_inotify.py.orig 2015-04-12 17:24:29 UTC
++++ fs/osfs/watch_inotify.py
+@@ -18,7 +18,7 @@ from fs.watch import *
+
+ try:
+ import pyinotify
+-except Exception, e:
++except Exception as e:
+ # pyinotify sometimes raises its own custom errors on import.
+ # How on earth are we supposed to catch them when we can't import them?
+ if isinstance(e,ImportError):
+@@ -39,7 +39,7 @@ class OSFSWatchMixin(WatchableFSMixin):
+ def close(self):
+ super(OSFSWatchMixin,self).close()
+ self.notify_watchers(CLOSED)
+- for watcher_list in self._watchers.values():
++ for watcher_list in list(self._watchers.values()):
+ for watcher in watcher_list:
+ self.del_watcher(watcher)
+ self.__watch_lock.acquire()
+@@ -58,7 +58,7 @@ class OSFSWatchMixin(WatchableFSMixin):
+ w = super_add_watcher(callback,path,events,recursive)
+ w._pyinotify_id = None
+ syspath = self.getsyspath(path)
+- if isinstance(syspath,unicode):
++ if isinstance(syspath,str):
+ syspath = syspath.encode(sys.getfilesystemencoding())
+ # Each watch gets its own WatchManager, since it's tricky to make
+ # a single WatchManager handle multiple callbacks with different
+@@ -73,7 +73,7 @@ class OSFSWatchMixin(WatchableFSMixin):
+ kwds = dict(rec=recursive,auto_add=recursive,quiet=False)
+ try:
+ wids = wm.add_watch(syspath,evtmask,process_events,**kwds)
+- except pyinotify.WatchManagerError, e:
++ except pyinotify.WatchManagerError as e:
+ raise OperationFailedError("add_watcher",details=e)
+ w._pyinotify_id = wids[syspath]
+ self.__watch_lock.acquire()
+@@ -239,7 +239,7 @@ class SharedThreadedNotifier(threading.Thread):
+ while self.running:
+ try:
+ ready_fds = self._poller.poll()
+- except _select_error, e:
++ except _select_error as e:
+ if e[0] != errno.EINTR:
+ raise
+ else:
+--- fs/osfs/watch_win32.py.orig 2015-04-12 17:24:29 UTC
++++ fs/osfs/watch_win32.py
+@@ -10,7 +10,7 @@ import os
+ import sys
+ import errno
+ import threading
+-import Queue
++import queue
+ import stat
+ import struct
+ import ctypes
+@@ -226,7 +226,7 @@ class WatchedDirectory(object):
+ ctypes.byref(self.result),len(self.result),
+ self.recursive,self.flags,None,
+ overlapped,None)
+- except WindowsError, e:
++ except WindowsError as e:
+ self.error = e
+ self.close()
+
+@@ -262,7 +262,7 @@ class WatchThread(threading.Thread):
+ self.watched_directories = {}
+ self.ready = threading.Event()
+ self._iocp = None
+- self._new_watches = Queue.Queue()
++ self._new_watches = queue.Queue()
+
+ def close(self):
+ if not self.closed:
+@@ -383,11 +383,11 @@ class WatchThread(threading.Thread):
+ hash(w),0)
+ w.post()
+ w.ready.set()
+- except Queue.Empty:
++ except queue.Empty:
+ pass
+ finally:
+ self.ready.set()
+- for w in self.watched_directories.itervalues():
++ for w in self.watched_directories.values():
+ w.close()
+ if self._iocp:
+ CloseHandle(self._iocp)
+--- fs/osfs/xattrs.py.orig 2022-03-04 17:14:43 UTC
++++ fs/osfs/xattrs.py
+@@ -49,7 +49,7 @@ if xattr is not None:
+
+ @convert_os_errors
+ def listxattrs(self, path):
+- return xattr.xattr(self.getsyspath(path)).keys()
++ return list(xattr.xattr(self.getsyspath(path)).keys())
+
+ else:
+
+--- fs/path.py.orig 2015-04-12 17:24:29 UTC
++++ fs/path.py
+@@ -44,7 +44,7 @@ def normpath(path):
+ if not _requires_normalization(path):
+ return path.rstrip('/')
+
+- prefix = u'/' if path.startswith('/') else u''
++ prefix = '/' if path.startswith('/') else ''
+ components = []
+ append = components.append
+ special = ('..', '.', '').__contains__
+@@ -60,7 +60,7 @@ def normpath(path):
+ # causing a circular import.
+ from fs.errors import BackReferenceError
+ raise BackReferenceError('Too many backrefs in \'%s\'' % path)
+- return prefix + u'/'.join(components)
++ return prefix + '/'.join(components)
+
+
+ if os.sep != '/':
+@@ -100,11 +100,11 @@ def recursepath(path, reverse=False):
+ """
+
+ if path in ('', '/'):
+- return [u'/']
++ return ['/']
+
+ path = abspath(normpath(path)) + '/'
+
+- paths = [u'/']
++ paths = ['/']
+ find = path.find
+ append = paths.append
+ pos = 1
+@@ -133,7 +133,7 @@ def abspath(path):
+
+ """
+ if not path.startswith('/'):
+- return u'/' + path
++ return '/' + path
+ return path
+
+
+@@ -176,7 +176,7 @@ def pathjoin(*paths):
+ absolute = True
+ relpaths.append(p)
+
+- path = normpath(u"/".join(relpaths))
++ path = normpath("/".join(relpaths))
+ if absolute:
+ path = abspath(path)
+ return path
+@@ -419,7 +419,7 @@ def relativefrom(base, path):
+ break
+ common += 1
+
+- return u'/'.join([u'..'] * (len(base) - common) + path[common:])
++ return '/'.join(['..'] * (len(base) - common) + path[common:])
+
+
+ class PathMap(object):
+@@ -559,7 +559,7 @@ class PathMap(object):
+ m = m[name]
+ except KeyError:
+ return
+- for (nm, subm) in m.iteritems():
++ for (nm, subm) in m.items():
+ if not nm:
+ yield abspath(root)
+ else:
+@@ -568,7 +568,7 @@ class PathMap(object):
+ yield subk
+
+ def __iter__(self):
+- return self.iterkeys()
++ return iter(self.keys())
+
+ def keys(self,root="/"):
+ return list(self.iterkeys(root))
+@@ -583,7 +583,7 @@ class PathMap(object):
+ m = m[name]
+ except KeyError:
+ return
+- for (nm, subm) in m.iteritems():
++ for (nm, subm) in m.items():
+ if not nm:
+ yield subm
+ else:
+@@ -604,7 +604,7 @@ class PathMap(object):
+ m = m[name]
+ except KeyError:
+ return
+- for (nm, subm) in m.iteritems():
++ for (nm, subm) in m.items():
+ if not nm:
+ yield (abspath(normpath(root)), subm)
+ else:
+@@ -627,7 +627,7 @@ class PathMap(object):
+ m = m[name]
+ except KeyError:
+ return
+- for (nm, subm) in m.iteritems():
++ for (nm, subm) in m.items():
+ if nm and subm:
+ yield nm
+
+@@ -651,9 +651,9 @@ def iswildcard(path):
+ return not _wild_chars.isdisjoint(path)
+
+ if __name__ == "__main__":
+- print recursepath('a/b/c')
++ print(recursepath('a/b/c'))
+
+- print relativefrom('/', '/foo')
+- print relativefrom('/foo/bar', '/foo/baz')
+- print relativefrom('/foo/bar/baz', '/foo/egg')
+- print relativefrom('/foo/bar/baz/egg', '/foo/egg')
++ print(relativefrom('/', '/foo'))
++ print(relativefrom('/foo/bar', '/foo/baz'))
++ print(relativefrom('/foo/bar/baz', '/foo/egg'))
++ print(relativefrom('/foo/bar/baz/egg', '/foo/egg'))
+--- fs/remote.py.orig 2015-04-12 17:24:29 UTC
++++ fs/remote.py
+@@ -20,8 +20,8 @@ FS subclasses interfacing with a remote filesystem. T
+
+ """
+
+-from __future__ import with_statement
+
++
+ import time
+ import stat as statinfo
+ from errno import EINVAL
+@@ -422,11 +422,11 @@ class CachedInfo(object):
+ self.has_full_children = other.has_full_children
+ @classmethod
+ def new_file_stub(cls):
+- info = {"info" : 0700 | statinfo.S_IFREG}
++ info = {"info" : 0o700 | statinfo.S_IFREG}
+ return cls(info,has_full_info=False)
+ @classmethod
+ def new_dir_stub(cls):
+- info = {"info" : 0700 | statinfo.S_IFDIR}
++ info = {"info" : 0o700 | statinfo.S_IFDIR}
+ return cls(info,has_full_info=False)
+
+
+@@ -512,7 +512,7 @@ class CacheFSMixin(FS):
+ if self.max_cache_size is not None and old_ci is None:
+ while self.__cache_size >= self.max_cache_size:
+ try:
+- to_del = iter(self.__cache).next()
++ to_del = next(iter(self.__cache))
+ except StopIteration:
+ break
+ else:
+@@ -592,7 +592,7 @@ class CacheFSMixin(FS):
+
+ def isdir(self, path):
+ try:
+- self.__cache.iternames(path).next()
++ next(self.__cache.iternames(path))
+ return True
+ except StopIteration:
+ pass
+@@ -607,7 +607,7 @@ class CacheFSMixin(FS):
+
+ def isfile(self, path):
+ try:
+- self.__cache.iternames(path).next()
++ next(self.__cache.iternames(path))
+ return False
+ except StopIteration:
+ pass
+--- fs/remotefs.py.orig 2015-04-12 17:24:29 UTC
++++ fs/remotefs.py
+@@ -1,5 +1,5 @@
+ # Work in Progress - Do not use
+-from __future__ import with_statement
++
+ from fs.base import FS
+ from fs.expose.serve import packetstream
+
+@@ -7,7 +7,7 @@ from collections import defaultdict
+ import threading
+ from threading import Lock, RLock
+ from json import dumps
+-import Queue as queue
++import queue as queue
+ import socket
+
+ from six import b
+@@ -35,12 +35,12 @@ class PacketHandler(threading.Thread):
+ while True:
+ data = read(1024*16)
+ if not data:
+- print "No data"
++ print("No data")
+ break
+- print "data", repr(data)
++ print("data", repr(data))
+ for header, payload in decoder.feed(data):
+- print repr(header)
+- print repr(payload)
++ print(repr(header))
++ print(repr(payload))
+ on_packet(header, payload)
+
+ def _new_call_id(self):
+@@ -77,8 +77,8 @@ class PacketHandler(threading.Thread):
+
+ while True:
+ header, payload = queue.get()
+- print repr(header)
+- print repr(payload)
++ print(repr(header))
++ print(repr(payload))
+ if client_ref is not None and header.get('client_ref') != client_ref:
+ continue
+ break
+@@ -167,9 +167,9 @@ class RemoteFS(FS):
+ def ping(self, msg):
+ call_id = self.packet_handler.send_packet({'type':'rpc', 'method':'ping'}, msg)
+ header, payload = self.packet_handler.get_packet(call_id)
+- print "PING"
+- print header
+- print payload
++ print("PING")
++ print(header)
++ print(payload)
+
+ def close(self):
+ self.transport.close()
+--- fs/rpcfs.py.orig 2015-04-12 17:24:29 UTC
++++ fs/rpcfs.py
+@@ -8,7 +8,7 @@ class from the :mod:`fs.expose.xmlrpc` module.
+
+ """
+
+-import xmlrpclib
++import xmlrpc.client
+ import socket
+ import base64
+
+@@ -28,11 +28,11 @@ def re_raise_faults(func):
+ def wrapper(*args, **kwds):
+ try:
+ return func(*args, **kwds)
+- except (xmlrpclib.Fault), f:
++ except (xmlrpc.client.Fault) as f:
+ #raise
+ # Make sure it's in a form we can handle
+
+- print f.faultString
++ print(f.faultString)
+ bits = f.faultString.split(" ")
+ if bits[0] not in ["<type", "<class"]:
+ raise f
+@@ -41,7 +41,7 @@ def re_raise_faults(func):
+ cls = bits[0]
+ msg = ">:".join(bits[1:])
+ cls = cls.strip('\'')
+- print "-" + cls
++ print("-" + cls)
+ cls = _object_by_name(cls)
+ # Re-raise using the remainder of the fault code as message
+ if cls:
+@@ -50,7 +50,7 @@ def re_raise_faults(func):
+ else:
+ raise cls(msg)
+ raise f
+- except socket.error, e:
++ except socket.error as e:
+ raise RemoteConnectionError(str(e), details=e)
+ return wrapper
+
+@@ -126,9 +126,9 @@ class RPCFS(FS):
+ kwds = dict(allow_none=True, use_datetime=True)
+
+ if self._transport is not None:
+- proxy = xmlrpclib.ServerProxy(self.uri, self._transport, **kwds)
++ proxy = xmlrpc.client.ServerProxy(self.uri, self._transport, **kwds)
+ else:
+- proxy = xmlrpclib.ServerProxy(self.uri, **kwds)
++ proxy = xmlrpc.client.ServerProxy(self.uri, **kwds)
+
+ return ReRaiseFaults(proxy)
+
+@@ -170,7 +170,7 @@ class RPCFS(FS):
+ meta = self.proxy.getmeta(meta_name)
+ else:
+ meta = self.proxy.getmeta_default(meta_name, default)
+- if isinstance(meta, basestring):
++ if isinstance(meta, str):
+ # To allow transport of meta with invalid xml chars (like null)
+ meta = self.encode_path(meta)
+ return meta
+@@ -185,7 +185,7 @@ class RPCFS(FS):
+ # TODO: chunked transport of large files
+ epath = self.encode_path(path)
+ if "w" in mode:
+- self.proxy.set_contents(epath, xmlrpclib.Binary(b("")))
++ self.proxy.set_contents(epath, xmlrpc.client.Binary(b("")))
+ if "r" in mode or "a" in mode or "+" in mode:
+ try:
+ data = self.proxy.get_contents(epath, "rb").data
+@@ -194,7 +194,7 @@ class RPCFS(FS):
+ raise ResourceNotFoundError(path)
+ if not self.isdir(dirname(path)):
+ raise ParentDirectoryMissingError(path)
+- self.proxy.set_contents(path, xmlrpclib.Binary(b("")))
++ self.proxy.set_contents(path, xmlrpc.client.Binary(b("")))
+ else:
+ data = b("")
+ f = StringIO(data)
+@@ -210,7 +210,7 @@ class RPCFS(FS):
+ self._lock.acquire()
+ try:
+ oldflush()
+- self.proxy.set_contents(epath, xmlrpclib.Binary(f.getvalue()))
++ self.proxy.set_contents(epath, xmlrpc.client.Binary(f.getvalue()))
+ finally:
+ self._lock.release()
+
+--- fs/s3fs.py.orig 2015-11-13 16:37:26 UTC
++++ fs/s3fs.py
+@@ -41,7 +41,7 @@ else:
+ try:
+ return self._map[(threading.currentThread(),attr)]
+ except KeyError:
+- raise AttributeError, attr
++ raise AttributeError(attr)
+ def __setattr__(self,attr,value):
+ self._map[(threading.currentThread(),attr)] = value
+
+@@ -106,7 +106,7 @@ class S3FS(FS):
+ prefix = prefix[1:]
+ if not prefix.endswith(separator) and prefix != "":
+ prefix = prefix + separator
+- if isinstance(prefix,unicode):
++ if isinstance(prefix,str):
+ prefix = prefix.encode("utf8")
+ if aws_access_key is None:
+ if "AWS_ACCESS_KEY_ID" not in os.environ:
+@@ -149,7 +149,7 @@ class S3FS(FS):
+ b.get_key(self._prefix)
+ else:
+ b = self._s3conn.get_bucket(self._bucket_name, validate=1)
+- except S3ResponseError, e:
++ except S3ResponseError as e:
+ if "404 Not Found" not in str(e):
+ raise
+ b = self._s3conn.create_bucket(self._bucket_name)
+@@ -179,7 +179,7 @@ class S3FS(FS):
+ s3path = self._prefix + path
+ if s3path and s3path[-1] == self._separator:
+ s3path = s3path[:-1]
+- if isinstance(s3path,unicode):
++ if isinstance(s3path,str):
+ s3path = s3path.encode("utf8")
+ return s3path
+
+@@ -220,9 +220,9 @@ class S3FS(FS):
+
+ def _sync_set_contents(self,key,contents):
+ """Synchronously set the contents of a key."""
+- if isinstance(key,basestring):
++ if isinstance(key,str):
+ key = self._s3bukt.new_key(key)
+- if isinstance(contents,basestring):
++ if isinstance(contents,str):
+ key.set_contents_from_string(contents)
+ elif hasattr(contents,"md5"):
+ hexmd5 = contents.md5
+@@ -338,7 +338,7 @@ class S3FS(FS):
+ # the directory itself, which other tools may not create.
+ ks = self._s3bukt.list(prefix=s3path,delimiter=self._separator)
+ try:
+- iter(ks).next()
++ next(iter(ks))
+ except StopIteration:
+ return False
+ else:
+@@ -398,7 +398,7 @@ class S3FS(FS):
+ # Skip over the entry for the directory itself, if it exists
+ name = self._uns3path(k.name,s3path)
+ if name != "":
+- if not isinstance(name,unicode):
++ if not isinstance(name,str):
+ name = name.decode("utf8")
+ if name.endswith(self._separator):
+ name = name[:-1]
+@@ -572,14 +572,14 @@ class S3FS(FS):
+ else:
+ info["name"] = basename(self._uns3key(k.name))
+ if self._key_is_dir(key):
+- info["st_mode"] = 0700 | statinfo.S_IFDIR
++ info["st_mode"] = 0o700 | statinfo.S_IFDIR
+ else:
+- info["st_mode"] = 0700 | statinfo.S_IFREG
++ info["st_mode"] = 0o700 | statinfo.S_IFREG
+ if hasattr(key,"size"):
+ info['size'] = int(key.size)
+ etag = getattr(key,"etag",None)
+ if etag is not None:
+- if isinstance(etag,unicode):
++ if isinstance(etag,str):
+ etag = etag.encode("utf8")
+ info['etag'] = etag.strip('"').strip("'")
+ if hasattr(key,"last_modified"):
+@@ -632,7 +632,7 @@ class S3FS(FS):
+ s3path_src = self._s3path(src)
+ try:
+ self._s3bukt.copy_key(s3path_dst,self._bucket_name,s3path_src)
+- except S3ResponseError, e:
++ except S3ResponseError as e:
+ if "404 Not Found" in str(e):
+ msg = "Source is not a file: %(path)s"
+ raise ResourceInvalidError(src, msg=msg)
+@@ -663,7 +663,7 @@ class S3FS(FS):
+ for k in self._s3bukt.list(prefix=prefix):
+ name = relpath(self._uns3path(k.name,prefix))
+ if name != "":
+- if not isinstance(name,unicode):
++ if not isinstance(name,str):
+ name = name.decode("utf8")
+ if not k.name.endswith(self._separator):
+ if wildcard is not None:
+@@ -691,7 +691,7 @@ class S3FS(FS):
+ for k in self._s3bukt.list(prefix=prefix):
+ name = relpath(self._uns3path(k.name,prefix))
+ if name != "":
+- if not isinstance(name,unicode):
++ if not isinstance(name,str):
+ name = name.decode("utf8")
+ if wildcard is not None:
+ if callable(wildcard):
+@@ -718,7 +718,7 @@ class S3FS(FS):
+ for k in self._s3bukt.list(prefix=prefix):
+ name = relpath(self._uns3path(k.name,prefix))
+ if name != "":
+- if not isinstance(name,unicode):
++ if not isinstance(name,str):
+ name = name.decode("utf8")
+ if not k.name.endswith(self._separator):
+ if wildcard is not None:
+@@ -733,16 +733,16 @@ class S3FS(FS):
+
+
+ def _eq_utf8(name1,name2):
+- if isinstance(name1,unicode):
++ if isinstance(name1,str):
+ name1 = name1.encode("utf8")
+- if isinstance(name2,unicode):
++ if isinstance(name2,str):
+ name2 = name2.encode("utf8")
+ return name1 == name2
+
+ def _startswith_utf8(name1,name2):
+- if isinstance(name1,unicode):
++ if isinstance(name1,str):
+ name1 = name1.encode("utf8")
+- if isinstance(name2,unicode):
++ if isinstance(name2,str):
+ name2 = name2.encode("utf8")
+ return name1.startswith(name2)
+
+--- fs/sftpfs.py.orig 2015-04-12 17:24:29 UTC
++++ fs/sftpfs.py
+@@ -131,7 +131,7 @@ class SFTPFS(FS):
+ self._client = None
+
+ self.hostname = None
+- if isinstance(connection, basestring):
++ if isinstance(connection, str):
+ self.hostname = connection
+ elif isinstance(connection, tuple):
+ self.hostname = '%s:%s' % connection
+@@ -183,7 +183,7 @@ class SFTPFS(FS):
+ if not connection.is_authenticated():
+ try:
+ connection.auth_none(username)
+- except paramiko.BadAuthenticationType, e:
++ except paramiko.BadAuthenticationType as e:
+ self.close()
+ allowed = ', '.join(e.allowed_types)
+ raise RemoteConnectionError(msg='no auth - server requires one of the following: %s' % allowed, details=e)
+@@ -192,14 +192,14 @@ class SFTPFS(FS):
+ self.close()
+ raise RemoteConnectionError(msg='no auth')
+
+- except paramiko.SSHException, e:
++ except paramiko.SSHException as e:
+ self.close()
+ raise RemoteConnectionError(msg='SSH exception (%s)' % str(e), details=e)
+
+ self._transport = connection
+
+ def __unicode__(self):
+- return u'<SFTPFS: %s>' % self.desc('/')
++ return '<SFTPFS: %s>' % self.desc('/')
+
+ @classmethod
+ def _agent_auth(cls, transport, username):
+@@ -307,7 +307,7 @@ class SFTPFS(FS):
+ self.closed = True
+
+ def _normpath(self, path):
+- if not isinstance(path, unicode):
++ if not isinstance(path, str):
+ path = path.decode(self.encoding)
+ npath = pathjoin(self.root_path, relpath(normpath(path)))
+ if not isprefix(self.root_path, npath):
+@@ -355,10 +355,10 @@ class SFTPFS(FS):
+ def desc(self, path):
+ npath = self._normpath(path)
+ if self.hostname:
+- return u'sftp://%s%s' % (self.hostname, path)
++ return 'sftp://%s%s' % (self.hostname, path)
+ else:
+ addr, port = self._transport.getpeername()
+- return u'sftp://%s:%i%s' % (addr, port, self.client.normalize(npath))
++ return 'sftp://%s:%i%s' % (addr, port, self.client.normalize(npath))
+
+ @synchronize
+ @convert_os_errors
+@@ -368,7 +368,7 @@ class SFTPFS(FS):
+ npath = self._normpath(path)
+ try:
+ self.client.stat(npath)
+- except IOError, e:
++ except IOError as e:
+ if getattr(e,"errno",None) == ENOENT:
+ return False
+ raise
+@@ -382,7 +382,7 @@ class SFTPFS(FS):
+ npath = self._normpath(path)
+ try:
+ stat = self.client.stat(npath)
+- except IOError, e:
++ except IOError as e:
+ if getattr(e,"errno",None) == ENOENT:
+ return False
+ raise
+@@ -394,7 +394,7 @@ class SFTPFS(FS):
+ npath = self._normpath(path)
+ try:
+ stat = self.client.stat(npath)
+- except IOError, e:
++ except IOError as e:
+ if getattr(e,"errno",None) == ENOENT:
+ return False
+ raise
+@@ -409,10 +409,10 @@ class SFTPFS(FS):
+ if dirs_only or files_only:
+ attrs = self.client.listdir_attr(npath)
+ attrs_map = dict((a.filename, a) for a in attrs)
+- paths = list(attrs_map.iterkeys())
++ paths = list(attrs_map.keys())
+ else:
+ paths = self.client.listdir(npath)
+- except IOError, e:
++ except IOError as e:
+ if getattr(e,"errno",None) == ENOENT:
+ if self.isfile(path):
+ raise ResourceInvalidError(path,msg="Can't list directory contents of a file: %(path)s")
+@@ -424,19 +424,19 @@ class SFTPFS(FS):
+ if attrs_map:
+ if dirs_only:
+ filter_paths = []
+- for apath, attr in attrs_map.iteritems():
++ for apath, attr in attrs_map.items():
+ if isdir(self, path, attr.__dict__):
+ filter_paths.append(apath)
+ paths = filter_paths
+ elif files_only:
+ filter_paths = []
+- for apath, attr in attrs_map.iteritems():
++ for apath, attr in attrs_map.items():
+ if isfile(self, apath, attr.__dict__):
+ filter_paths.append(apath)
+ paths = filter_paths
+
+ for (i,p) in enumerate(paths):
+- if not isinstance(p,unicode):
++ if not isinstance(p,str):
+ paths[i] = p.decode(self.encoding)
+
+ return self._listdir_helper(path, paths, wildcard, full, absolute, False, False)
+@@ -448,8 +448,8 @@ class SFTPFS(FS):
+ try:
+ attrs = self.client.listdir_attr(npath)
+ attrs_map = dict((a.filename, a) for a in attrs)
+- paths = attrs_map.keys()
+- except IOError, e:
++ paths = list(attrs_map.keys())
++ except IOError as e:
+ if getattr(e,"errno",None) == ENOENT:
+ if self.isfile(path):
+ raise ResourceInvalidError(path,msg="Can't list directory contents of a file: %(path)s")
+@@ -460,19 +460,19 @@ class SFTPFS(FS):
+
+ if dirs_only:
+ filter_paths = []
+- for path, attr in attrs_map.iteritems():
++ for path, attr in attrs_map.items():
+ if isdir(self, path, attr.__dict__):
+ filter_paths.append(path)
+ paths = filter_paths
+ elif files_only:
+ filter_paths = []
+- for path, attr in attrs_map.iteritems():
++ for path, attr in attrs_map.items():
+ if isfile(self, path, attr.__dict__):
+ filter_paths.append(path)
+ paths = filter_paths
+
+ for (i, p) in enumerate(paths):
+- if not isinstance(p, unicode):
++ if not isinstance(p, str):
+ paths[i] = p.decode(self.encoding)
+
+ def getinfo(p):
+@@ -491,7 +491,7 @@ class SFTPFS(FS):
+ npath = self._normpath(path)
+ try:
+ self.client.mkdir(npath)
+- except IOError, _e:
++ except IOError as _e:
+ # Error code is unreliable, try to figure out what went wrong
+ try:
+ stat = self.client.stat(npath)
+@@ -519,7 +519,7 @@ class SFTPFS(FS):
+ npath = self._normpath(path)
+ try:
+ self.client.remove(npath)
+- except IOError, e:
++ except IOError as e:
+ if getattr(e,"errno",None) == ENOENT:
+ raise ResourceNotFoundError(path)
+ elif self.isdir(path):
+@@ -542,7 +542,7 @@ class SFTPFS(FS):
+ raise ResourceNotFoundError(path)
+ try:
+ self.client.rmdir(npath)
+- except IOError, e:
++ except IOError as e:
+ if getattr(e,"errno",None) == ENOENT:
+ if self.isfile(path):
+ raise ResourceInvalidError(path,msg="Can't use removedir() on a file: %(path)s")
+@@ -565,7 +565,7 @@ class SFTPFS(FS):
+ ndst = self._normpath(dst)
+ try:
+ self.client.rename(nsrc,ndst)
+- except IOError, e:
++ except IOError as e:
+ if getattr(e,"errno",None) == ENOENT:
+ raise ResourceNotFoundError(src)
+ if not self.isdir(dirname(dst)):
+@@ -581,7 +581,7 @@ class SFTPFS(FS):
+ self.remove(dst)
+ try:
+ self.client.rename(nsrc,ndst)
+- except IOError, e:
++ except IOError as e:
+ if getattr(e,"errno",None) == ENOENT:
+ raise ResourceNotFoundError(src)
+ if self.exists(dst):
+@@ -599,7 +599,7 @@ class SFTPFS(FS):
+ self.removedir(dst)
+ try:
+ self.client.rename(nsrc,ndst)
+- except IOError, e:
++ except IOError as e:
+ if getattr(e,"errno",None) == ENOENT:
+ raise ResourceNotFoundError(src)
+ if self.exists(dst):
+@@ -612,7 +612,7 @@ class SFTPFS(FS):
+ @classmethod
+ def _extract_info(cls, stats):
+ fromtimestamp = datetime.datetime.fromtimestamp
+- info = dict((k, v) for k, v in stats.iteritems() if k in cls._info_vars and not k.startswith('_'))
++ info = dict((k, v) for k, v in stats.items() if k in cls._info_vars and not k.startswith('_'))
+ info['size'] = info['st_size']
+ ct = info.get('st_ctime')
+ if ct is not None:
+--- fs/tempfs.py.orig 2015-04-12 17:24:29 UTC
++++ fs/tempfs.py
+@@ -29,7 +29,7 @@ class TempFS(OSFS):
+ _meta['atomic.move'] = True
+ _meta['atomic.copy'] = True
+
+- def __init__(self, identifier=None, temp_dir=None, dir_mode=0700, thread_synchronize=_thread_synchronize_default):
++ def __init__(self, identifier=None, temp_dir=None, dir_mode=0o700, thread_synchronize=_thread_synchronize_default):
+ """Creates a temporary Filesystem
+
+ identifier -- A string that is included in the name of the temporary directory,
+@@ -49,7 +49,7 @@ class TempFS(OSFS):
+ __str__ = __repr__
+
+ def __unicode__(self):
+- return u'<TempFS: %s>' % self._temp_dir
++ return '<TempFS: %s>' % self._temp_dir
+
+ def __getstate__(self):
+ # If we are picking a TempFS, we want to preserve its contents,
+--- fs/tests/__init__.py.orig 2015-11-13 22:33:26 UTC
++++ fs/tests/__init__.py
+@@ -5,8 +5,8 @@
+
+ """
+
+-from __future__ import with_statement
+
++
+ # Send any output from the logging module to stdout, so it will
+ # be captured by nose and reported appropriately
+ import sys
+@@ -61,7 +61,7 @@ class FSTestCases(object):
+ self.assertEqual(self.fs.validatepath('.foo'), None)
+ self.assertEqual(self.fs.validatepath('foo'), None)
+ self.assertEqual(self.fs.validatepath('foo/bar'), None)
+- self.assert_(self.fs.isvalidpath('foo/bar'))
++ self.assertTrue(self.fs.isvalidpath('foo/bar'))
+
+ def test_tree(self):
+ """Test tree print"""
+@@ -79,8 +79,8 @@ class FSTestCases(object):
+ stupid_meta = 'thismetashouldnotexist!"r$$%^&&*()_+'
+ self.assertRaises(NoMetaError, self.fs.getmeta, stupid_meta)
+ self.assertFalse(self.fs.hasmeta(stupid_meta))
+- self.assertEquals(None, self.fs.getmeta(stupid_meta, None))
+- self.assertEquals(3.14, self.fs.getmeta(stupid_meta, 3.14))
++ self.assertEqual(None, self.fs.getmeta(stupid_meta, None))
++ self.assertEqual(3.14, self.fs.getmeta(stupid_meta, 3.14))
+ for meta_name in meta_names:
+ try:
+ meta = self.fs.getmeta(meta_name)
+@@ -101,15 +101,15 @@ class FSTestCases(object):
+ except NoSysPathError:
+ pass
+ else:
+- self.assertTrue(isinstance(syspath, unicode))
++ self.assertTrue(isinstance(syspath, str))
+ syspath = self.fs.getsyspath("/", allow_none=True)
+ if syspath is not None:
+- self.assertTrue(isinstance(syspath, unicode))
++ self.assertTrue(isinstance(syspath, str))
+
+ def test_debug(self):
+ str(self.fs)
+ repr(self.fs)
+- self.assert_(hasattr(self.fs, 'desc'))
++ self.assertTrue(hasattr(self.fs, 'desc'))
+
+ def test_open_on_directory(self):
+ self.fs.makedir("testdir")
+@@ -132,20 +132,20 @@ class FSTestCases(object):
+ f.close()
+ self.assertTrue(self.check("test1.txt"))
+ f = self.fs.open("test1.txt", "rb")
+- self.assertEquals(f.read(), b("testing"))
++ self.assertEqual(f.read(), b("testing"))
+ f.close()
+ f = self.fs.open("test1.txt", "wb")
+ f.write(b("test file overwrite"))
+ f.close()
+ self.assertTrue(self.check("test1.txt"))
+ f = self.fs.open("test1.txt", "rb")
+- self.assertEquals(f.read(), b("test file overwrite"))
++ self.assertEqual(f.read(), b("test file overwrite"))
+ f.close()
+
+ def test_createfile(self):
+ test = b('now with content')
+ self.fs.createfile("test.txt")
+- self.assert_(self.fs.exists("test.txt"))
++ self.assertTrue(self.fs.exists("test.txt"))
+ self.assertEqual(self.fs.getcontents("test.txt", "rb"), b(''))
+ self.fs.setcontents("test.txt", test)
+ self.fs.createfile("test.txt")
+@@ -163,36 +163,36 @@ class FSTestCases(object):
+ def test_setcontents(self):
+ # setcontents() should accept both a string...
+ self.fs.setcontents("hello", b("world"))
+- self.assertEquals(self.fs.getcontents("hello", "rb"), b("world"))
++ self.assertEqual(self.fs.getcontents("hello", "rb"), b("world"))
+ # ...and a file-like object
+ self.fs.setcontents("hello", StringIO(b("to you, good sir!")))
+- self.assertEquals(self.fs.getcontents(
++ self.assertEqual(self.fs.getcontents(
+ "hello", "rb"), b("to you, good sir!"))
+ # setcontents() should accept both a string...
+ self.fs.setcontents("hello", b("world"), chunk_size=2)
+- self.assertEquals(self.fs.getcontents("hello", "rb"), b("world"))
++ self.assertEqual(self.fs.getcontents("hello", "rb"), b("world"))
+ # ...and a file-like object
+ self.fs.setcontents("hello", StringIO(
+ b("to you, good sir!")), chunk_size=2)
+- self.assertEquals(self.fs.getcontents(
++ self.assertEqual(self.fs.getcontents(
+ "hello", "rb"), b("to you, good sir!"))
+ self.fs.setcontents("hello", b(""))
+- self.assertEquals(self.fs.getcontents("hello", "rb"), b(""))
++ self.assertEqual(self.fs.getcontents("hello", "rb"), b(""))
+
+ def test_setcontents_async(self):
+ # setcontents() should accept both a string...
+ self.fs.setcontents_async("hello", b("world")).wait()
+- self.assertEquals(self.fs.getcontents("hello", "rb"), b("world"))
++ self.assertEqual(self.fs.getcontents("hello", "rb"), b("world"))
+ # ...and a file-like object
+ self.fs.setcontents_async("hello", StringIO(
+ b("to you, good sir!"))).wait()
+- self.assertEquals(self.fs.getcontents("hello"), b("to you, good sir!"))
++ self.assertEqual(self.fs.getcontents("hello"), b("to you, good sir!"))
+ self.fs.setcontents_async("hello", b("world"), chunk_size=2).wait()
+- self.assertEquals(self.fs.getcontents("hello", "rb"), b("world"))
++ self.assertEqual(self.fs.getcontents("hello", "rb"), b("world"))
+ # ...and a file-like object
+ self.fs.setcontents_async("hello", StringIO(
+ b("to you, good sir!")), chunk_size=2).wait()
+- self.assertEquals(self.fs.getcontents(
++ self.assertEqual(self.fs.getcontents(
+ "hello", "rb"), b("to you, good sir!"))
+
+ def test_isdir_isfile(self):
+@@ -214,19 +214,19 @@ class FSTestCases(object):
+ def test_listdir(self):
+ def check_unicode(items):
+ for item in items:
+- self.assertTrue(isinstance(item, unicode))
+- self.fs.setcontents(u"a", b(''))
++ self.assertTrue(isinstance(item, str))
++ self.fs.setcontents("a", b(''))
+ self.fs.setcontents("b", b(''))
+ self.fs.setcontents("foo", b(''))
+ self.fs.setcontents("bar", b(''))
+ # Test listing of the root directory
+ d1 = self.fs.listdir()
+ self.assertEqual(len(d1), 4)
+- self.assertEqual(sorted(d1), [u"a", u"b", u"bar", u"foo"])
++ self.assertEqual(sorted(d1), ["a", "b", "bar", "foo"])
+ check_unicode(d1)
+ d1 = self.fs.listdir("")
+ self.assertEqual(len(d1), 4)
+- self.assertEqual(sorted(d1), [u"a", u"b", u"bar", u"foo"])
++ self.assertEqual(sorted(d1), ["a", "b", "bar", "foo"])
+ check_unicode(d1)
+ d1 = self.fs.listdir("/")
+ self.assertEqual(len(d1), 4)
+@@ -234,7 +234,7 @@ class FSTestCases(object):
+ # Test listing absolute paths
+ d2 = self.fs.listdir(absolute=True)
+ self.assertEqual(len(d2), 4)
+- self.assertEqual(sorted(d2), [u"/a", u"/b", u"/bar", u"/foo"])
++ self.assertEqual(sorted(d2), ["/a", "/b", "/bar", "/foo"])
+ check_unicode(d2)
+ # Create some deeper subdirectories, to make sure their
+ # contents are not inadvertantly included
+@@ -248,25 +248,25 @@ class FSTestCases(object):
+ dirs_only = self.fs.listdir(dirs_only=True)
+ files_only = self.fs.listdir(files_only=True)
+ contains_a = self.fs.listdir(wildcard="*a*")
+- self.assertEqual(sorted(dirs_only), [u"p", u"q"])
+- self.assertEqual(sorted(files_only), [u"a", u"b", u"bar", u"foo"])
+- self.assertEqual(sorted(contains_a), [u"a", u"bar"])
++ self.assertEqual(sorted(dirs_only), ["p", "q"])
++ self.assertEqual(sorted(files_only), ["a", "b", "bar", "foo"])
++ self.assertEqual(sorted(contains_a), ["a", "bar"])
+ check_unicode(dirs_only)
+ check_unicode(files_only)
+ check_unicode(contains_a)
+ # Test listing a subdirectory
+ d3 = self.fs.listdir("p/1/2/3")
+ self.assertEqual(len(d3), 4)
+- self.assertEqual(sorted(d3), [u"a", u"b", u"bar", u"foo"])
++ self.assertEqual(sorted(d3), ["a", "b", "bar", "foo"])
+ check_unicode(d3)
+ # Test listing a subdirectory with absoliute and full paths
+ d4 = self.fs.listdir("p/1/2/3", absolute=True)
+ self.assertEqual(len(d4), 4)
+- self.assertEqual(sorted(d4), [u"/p/1/2/3/a", u"/p/1/2/3/b", u"/p/1/2/3/bar", u"/p/1/2/3/foo"])
++ self.assertEqual(sorted(d4), ["/p/1/2/3/a", "/p/1/2/3/b", "/p/1/2/3/bar", "/p/1/2/3/foo"])
+ check_unicode(d4)
+ d4 = self.fs.listdir("p/1/2/3", full=True)
+ self.assertEqual(len(d4), 4)
+- self.assertEqual(sorted(d4), [u"p/1/2/3/a", u"p/1/2/3/b", u"p/1/2/3/bar", u"p/1/2/3/foo"])
++ self.assertEqual(sorted(d4), ["p/1/2/3/a", "p/1/2/3/b", "p/1/2/3/bar", "p/1/2/3/foo"])
+ check_unicode(d4)
+ # Test that appropriate errors are raised
+ self.assertRaises(ResourceNotFoundError, self.fs.listdir, "zebra")
+@@ -275,32 +275,32 @@ class FSTestCases(object):
+ def test_listdirinfo(self):
+ def check_unicode(items):
+ for (nm, info) in items:
+- self.assertTrue(isinstance(nm, unicode))
++ self.assertTrue(isinstance(nm, str))
+
+ def check_equal(items, target):
+ names = [nm for (nm, info) in items]
+ self.assertEqual(sorted(names), sorted(target))
+- self.fs.setcontents(u"a", b(''))
++ self.fs.setcontents("a", b(''))
+ self.fs.setcontents("b", b(''))
+ self.fs.setcontents("foo", b(''))
+ self.fs.setcontents("bar", b(''))
+ # Test listing of the root directory
+ d1 = self.fs.listdirinfo()
+ self.assertEqual(len(d1), 4)
+- check_equal(d1, [u"a", u"b", u"bar", u"foo"])
++ check_equal(d1, ["a", "b", "bar", "foo"])
+ check_unicode(d1)
+ d1 = self.fs.listdirinfo("")
+ self.assertEqual(len(d1), 4)
+- check_equal(d1, [u"a", u"b", u"bar", u"foo"])
++ check_equal(d1, ["a", "b", "bar", "foo"])
+ check_unicode(d1)
+ d1 = self.fs.listdirinfo("/")
+ self.assertEqual(len(d1), 4)
+- check_equal(d1, [u"a", u"b", u"bar", u"foo"])
++ check_equal(d1, ["a", "b", "bar", "foo"])
+ check_unicode(d1)
+ # Test listing absolute paths
+ d2 = self.fs.listdirinfo(absolute=True)
+ self.assertEqual(len(d2), 4)
+- check_equal(d2, [u"/a", u"/b", u"/bar", u"/foo"])
++ check_equal(d2, ["/a", "/b", "/bar", "/foo"])
+ check_unicode(d2)
+ # Create some deeper subdirectories, to make sure their
+ # contents are not inadvertantly included
+@@ -314,25 +314,25 @@ class FSTestCases(object):
+ dirs_only = self.fs.listdirinfo(dirs_only=True)
+ files_only = self.fs.listdirinfo(files_only=True)
+ contains_a = self.fs.listdirinfo(wildcard="*a*")
+- check_equal(dirs_only, [u"p", u"q"])
+- check_equal(files_only, [u"a", u"b", u"bar", u"foo"])
+- check_equal(contains_a, [u"a", u"bar"])
++ check_equal(dirs_only, ["p", "q"])
++ check_equal(files_only, ["a", "b", "bar", "foo"])
++ check_equal(contains_a, ["a", "bar"])
+ check_unicode(dirs_only)
+ check_unicode(files_only)
+ check_unicode(contains_a)
+ # Test listing a subdirectory
+ d3 = self.fs.listdirinfo("p/1/2/3")
+ self.assertEqual(len(d3), 4)
+- check_equal(d3, [u"a", u"b", u"bar", u"foo"])
++ check_equal(d3, ["a", "b", "bar", "foo"])
+ check_unicode(d3)
+ # Test listing a subdirectory with absoliute and full paths
+ d4 = self.fs.listdirinfo("p/1/2/3", absolute=True)
+ self.assertEqual(len(d4), 4)
+- check_equal(d4, [u"/p/1/2/3/a", u"/p/1/2/3/b", u"/p/1/2/3/bar", u"/p/1/2/3/foo"])
++ check_equal(d4, ["/p/1/2/3/a", "/p/1/2/3/b", "/p/1/2/3/bar", "/p/1/2/3/foo"])
+ check_unicode(d4)
+ d4 = self.fs.listdirinfo("p/1/2/3", full=True)
+ self.assertEqual(len(d4), 4)
+- check_equal(d4, [u"p/1/2/3/a", u"p/1/2/3/b", u"p/1/2/3/bar", u"p/1/2/3/foo"])
++ check_equal(d4, ["p/1/2/3/a", "p/1/2/3/b", "p/1/2/3/bar", "p/1/2/3/foo"])
+ check_unicode(d4)
+ # Test that appropriate errors are raised
+ self.assertRaises(ResourceNotFoundError, self.fs.listdirinfo, "zebra")
+@@ -343,7 +343,7 @@ class FSTestCases(object):
+ self.fs.setcontents('b.txt', b('world'))
+ self.fs.makeopendir('foo').setcontents('c', b('123'))
+ sorted_walk = sorted([(d, sorted(fs)) for (d, fs) in self.fs.walk()])
+- self.assertEquals(sorted_walk,
++ self.assertEqual(sorted_walk,
+ [("/", ["a.txt", "b.txt"]),
+ ("/foo", ["c"])])
+ # When searching breadth-first, shallow entries come first
+@@ -371,10 +371,10 @@ class FSTestCases(object):
+ self.fs.makeopendir('.svn').setcontents('ignored', b(''))
+ for dir_path, paths in self.fs.walk(wildcard='*.txt'):
+ for path in paths:
+- self.assert_(path.endswith('.txt'))
++ self.assertTrue(path.endswith('.txt'))
+ for dir_path, paths in self.fs.walk(wildcard=lambda fn: fn.endswith('.txt')):
+ for path in paths:
+- self.assert_(path.endswith('.txt'))
++ self.assertTrue(path.endswith('.txt'))
+
+ def test_walk_dir_wildcard(self):
+ self.fs.setcontents('a.txt', b('hello'))
+@@ -383,35 +383,35 @@ class FSTestCases(object):
+ self.fs.makeopendir('.svn').setcontents('ignored', b(''))
+ for dir_path, paths in self.fs.walk(dir_wildcard=lambda fn: not fn.endswith('.svn')):
+ for path in paths:
+- self.assert_('.svn' not in path)
++ self.assertTrue('.svn' not in path)
+
+ def test_walkfiles(self):
+ self.fs.makeopendir('bar').setcontents('a.txt', b('123'))
+ self.fs.makeopendir('foo').setcontents('b', b('123'))
+- self.assertEquals(sorted(
++ self.assertEqual(sorted(
+ self.fs.walkfiles()), ["/bar/a.txt", "/foo/b"])
+- self.assertEquals(sorted(self.fs.walkfiles(
++ self.assertEqual(sorted(self.fs.walkfiles(
+ dir_wildcard="*foo*")), ["/foo/b"])
+- self.assertEquals(sorted(self.fs.walkfiles(
++ self.assertEqual(sorted(self.fs.walkfiles(
+ wildcard="*.txt")), ["/bar/a.txt"])
+
+ def test_walkdirs(self):
+ self.fs.makeopendir('bar').setcontents('a.txt', b('123'))
+ self.fs.makeopendir('foo').makeopendir(
+ "baz").setcontents('b', b('123'))
+- self.assertEquals(sorted(self.fs.walkdirs()), [
++ self.assertEqual(sorted(self.fs.walkdirs()), [
+ "/", "/bar", "/foo", "/foo/baz"])
+- self.assertEquals(sorted(self.fs.walkdirs(
++ self.assertEqual(sorted(self.fs.walkdirs(
+ wildcard="*foo*")), ["/", "/foo", "/foo/baz"])
+
+ def test_unicode(self):
+- alpha = u"\N{GREEK SMALL LETTER ALPHA}"
+- beta = u"\N{GREEK SMALL LETTER BETA}"
++ alpha = "\N{GREEK SMALL LETTER ALPHA}"
++ beta = "\N{GREEK SMALL LETTER BETA}"
+ self.fs.makedir(alpha)
+ self.fs.setcontents(alpha + "/a", b(''))
+ self.fs.setcontents(alpha + "/" + beta, b(''))
+ self.assertTrue(self.check(alpha))
+- self.assertEquals(sorted(self.fs.listdir(alpha)), ["a", beta])
++ self.assertEqual(sorted(self.fs.listdir(alpha)), ["a", beta])
+
+ def test_makedir(self):
+ check = self.check
+@@ -420,11 +420,11 @@ class FSTestCases(object):
+ self.assertRaises(
+ ParentDirectoryMissingError, self.fs.makedir, "a/b/c")
+ self.fs.makedir("a/b/c", recursive=True)
+- self.assert_(check("a/b/c"))
++ self.assertTrue(check("a/b/c"))
+ self.fs.makedir("foo/bar/baz", recursive=True)
+- self.assert_(check("foo/bar/baz"))
++ self.assertTrue(check("foo/bar/baz"))
+ self.fs.makedir("a/b/child")
+- self.assert_(check("a/b/child"))
++ self.assertTrue(check("a/b/child"))
+ self.assertRaises(DestinationExistsError, self.fs.makedir, "/a/b")
+ self.fs.makedir("/a/b", allow_recreate=True)
+ self.fs.setcontents("/a/file", b(''))
+@@ -446,30 +446,30 @@ class FSTestCases(object):
+ def test_removedir(self):
+ check = self.check
+ self.fs.makedir("a")
+- self.assert_(check("a"))
++ self.assertTrue(check("a"))
+ self.fs.removedir("a")
+ self.assertRaises(ResourceNotFoundError, self.fs.removedir, "a")
+- self.assert_(not check("a"))
++ self.assertTrue(not check("a"))
+ self.fs.makedir("a/b/c/d", recursive=True)
+ self.assertRaises(DirectoryNotEmptyError, self.fs.removedir, "a/b")
+ self.fs.removedir("a/b/c/d")
+- self.assert_(not check("a/b/c/d"))
++ self.assertTrue(not check("a/b/c/d"))
+ self.fs.removedir("a/b/c")
+- self.assert_(not check("a/b/c"))
++ self.assertTrue(not check("a/b/c"))
+ self.fs.removedir("a/b")
+- self.assert_(not check("a/b"))
++ self.assertTrue(not check("a/b"))
+ # Test recursive removal of empty parent dirs
+ self.fs.makedir("foo/bar/baz", recursive=True)
+ self.fs.removedir("foo/bar/baz", recursive=True)
+- self.assert_(not check("foo/bar/baz"))
+- self.assert_(not check("foo/bar"))
+- self.assert_(not check("foo"))
++ self.assertTrue(not check("foo/bar/baz"))
++ self.assertTrue(not check("foo/bar"))
++ self.assertTrue(not check("foo"))
+ self.fs.makedir("foo/bar/baz", recursive=True)
+ self.fs.setcontents("foo/file.txt", b("please don't delete me"))
+ self.fs.removedir("foo/bar/baz", recursive=True)
+- self.assert_(not check("foo/bar/baz"))
+- self.assert_(not check("foo/bar"))
+- self.assert_(check("foo/file.txt"))
++ self.assertTrue(not check("foo/bar/baz"))
++ self.assertTrue(not check("foo/bar"))
++ self.assertTrue(check("foo/file.txt"))
+ # Ensure that force=True works as expected
+ self.fs.makedir("frollic/waggle", recursive=True)
+ self.fs.setcontents("frollic/waddle.txt", b("waddlewaddlewaddle"))
+@@ -477,41 +477,41 @@ class FSTestCases(object):
+ self.assertRaises(
+ ResourceInvalidError, self.fs.removedir, "frollic/waddle.txt")
+ self.fs.removedir("frollic", force=True)
+- self.assert_(not check("frollic"))
++ self.assertTrue(not check("frollic"))
+ # Test removing unicode dirs
+- kappa = u"\N{GREEK CAPITAL LETTER KAPPA}"
++ kappa = "\N{GREEK CAPITAL LETTER KAPPA}"
+ self.fs.makedir(kappa)
+- self.assert_(self.fs.isdir(kappa))
++ self.assertTrue(self.fs.isdir(kappa))
+ self.fs.removedir(kappa)
+ self.assertRaises(ResourceNotFoundError, self.fs.removedir, kappa)
+- self.assert_(not self.fs.isdir(kappa))
++ self.assertTrue(not self.fs.isdir(kappa))
+ self.fs.makedir(pathjoin("test", kappa), recursive=True)
+- self.assert_(check(pathjoin("test", kappa)))
++ self.assertTrue(check(pathjoin("test", kappa)))
+ self.fs.removedir("test", force=True)
+- self.assert_(not check("test"))
++ self.assertTrue(not check("test"))
+
+ def test_rename(self):
+ check = self.check
+ # test renaming a file in the same directory
+ self.fs.setcontents("foo.txt", b("Hello, World!"))
+- self.assert_(check("foo.txt"))
++ self.assertTrue(check("foo.txt"))
+ self.fs.rename("foo.txt", "bar.txt")
+- self.assert_(check("bar.txt"))
+- self.assert_(not check("foo.txt"))
++ self.assertTrue(check("bar.txt"))
++ self.assertTrue(not check("foo.txt"))
+ # test renaming a directory in the same directory
+ self.fs.makedir("dir_a")
+ self.fs.setcontents("dir_a/test.txt", b("testerific"))
+- self.assert_(check("dir_a"))
++ self.assertTrue(check("dir_a"))
+ self.fs.rename("dir_a", "dir_b")
+- self.assert_(check("dir_b"))
+- self.assert_(check("dir_b/test.txt"))
+- self.assert_(not check("dir_a/test.txt"))
+- self.assert_(not check("dir_a"))
++ self.assertTrue(check("dir_b"))
++ self.assertTrue(check("dir_b/test.txt"))
++ self.assertTrue(not check("dir_a/test.txt"))
++ self.assertTrue(not check("dir_a"))
+ # test renaming a file into a different directory
+ self.fs.makedir("dir_a")
+ self.fs.rename("dir_b/test.txt", "dir_a/test.txt")
+- self.assert_(not check("dir_b/test.txt"))
+- self.assert_(check("dir_a/test.txt"))
++ self.assertTrue(not check("dir_b/test.txt"))
++ self.assertTrue(check("dir_a/test.txt"))
+ # test renaming a file into a non-existent directory
+ self.assertRaises(ParentDirectoryMissingError,
+ self.fs.rename, "dir_a/test.txt", "nonexistent/test.txt")
+@@ -530,7 +530,7 @@ class FSTestCases(object):
+ test_str = b("Hello, World!")
+ self.fs.setcontents("info.txt", test_str)
+ info = self.fs.getinfo("info.txt")
+- for k, v in info.iteritems():
++ for k, v in info.items():
+ self.assertEqual(self.fs.getinfokeys('info.txt', k), {k: v})
+
+ test_info = {}
+@@ -562,26 +562,26 @@ class FSTestCases(object):
+
+ self.fs.makedir("foo/bar", recursive=True)
+ makefile("foo/bar/a.txt")
+- self.assert_(check("foo/bar/a.txt"))
+- self.assert_(checkcontents("foo/bar/a.txt"))
++ self.assertTrue(check("foo/bar/a.txt"))
++ self.assertTrue(checkcontents("foo/bar/a.txt"))
+ self.fs.move("foo/bar/a.txt", "foo/b.txt")
+- self.assert_(not check("foo/bar/a.txt"))
+- self.assert_(check("foo/b.txt"))
+- self.assert_(checkcontents("foo/b.txt"))
++ self.assertTrue(not check("foo/bar/a.txt"))
++ self.assertTrue(check("foo/b.txt"))
++ self.assertTrue(checkcontents("foo/b.txt"))
+
+ self.fs.move("foo/b.txt", "c.txt")
+- self.assert_(not check("foo/b.txt"))
+- self.assert_(check("/c.txt"))
+- self.assert_(checkcontents("/c.txt"))
++ self.assertTrue(not check("foo/b.txt"))
++ self.assertTrue(check("/c.txt"))
++ self.assertTrue(checkcontents("/c.txt"))
+
+ makefile("foo/bar/a.txt")
+ self.assertRaises(
+ DestinationExistsError, self.fs.move, "foo/bar/a.txt", "/c.txt")
+- self.assert_(check("foo/bar/a.txt"))
+- self.assert_(check("/c.txt"))
++ self.assertTrue(check("foo/bar/a.txt"))
++ self.assertTrue(check("/c.txt"))
+ self.fs.move("foo/bar/a.txt", "/c.txt", overwrite=True)
+- self.assert_(not check("foo/bar/a.txt"))
+- self.assert_(check("/c.txt"))
++ self.assertTrue(not check("foo/bar/a.txt"))
++ self.assertTrue(check("/c.txt"))
+
+ def test_movedir(self):
+ check = self.check
+@@ -602,29 +602,29 @@ class FSTestCases(object):
+
+ self.fs.movedir("a", "copy of a")
+
+- self.assert_(self.fs.isdir("copy of a"))
+- self.assert_(check("copy of a/1.txt"))
+- self.assert_(check("copy of a/2.txt"))
+- self.assert_(check("copy of a/3.txt"))
+- self.assert_(check("copy of a/foo/bar/baz.txt"))
++ self.assertTrue(self.fs.isdir("copy of a"))
++ self.assertTrue(check("copy of a/1.txt"))
++ self.assertTrue(check("copy of a/2.txt"))
++ self.assertTrue(check("copy of a/3.txt"))
++ self.assertTrue(check("copy of a/foo/bar/baz.txt"))
+
+- self.assert_(not check("a/1.txt"))
+- self.assert_(not check("a/2.txt"))
+- self.assert_(not check("a/3.txt"))
+- self.assert_(not check("a/foo/bar/baz.txt"))
+- self.assert_(not check("a/foo/bar"))
+- self.assert_(not check("a/foo"))
+- self.assert_(not check("a"))
++ self.assertTrue(not check("a/1.txt"))
++ self.assertTrue(not check("a/2.txt"))
++ self.assertTrue(not check("a/3.txt"))
++ self.assertTrue(not check("a/foo/bar/baz.txt"))
++ self.assertTrue(not check("a/foo/bar"))
++ self.assertTrue(not check("a/foo"))
++ self.assertTrue(not check("a"))
+
+ self.fs.makedir("a")
+ self.assertRaises(
+ DestinationExistsError, self.fs.movedir, "copy of a", "a")
+ self.fs.movedir("copy of a", "a", overwrite=True)
+- self.assert_(not check("copy of a"))
+- self.assert_(check("a/1.txt"))
+- self.assert_(check("a/2.txt"))
+- self.assert_(check("a/3.txt"))
+- self.assert_(check("a/foo/bar/baz.txt"))
++ self.assertTrue(not check("copy of a"))
++ self.assertTrue(check("a/1.txt"))
++ self.assertTrue(check("a/2.txt"))
++ self.assertTrue(check("a/3.txt"))
++ self.assertTrue(check("a/foo/bar/baz.txt"))
+
+ def test_cant_copy_from_os(self):
+ sys_executable = os.path.abspath(os.path.realpath(sys.executable))
+@@ -645,28 +645,28 @@ class FSTestCases(object):
+
+ self.fs.makedir("foo/bar", recursive=True)
+ makefile("foo/bar/a.txt")
+- self.assert_(check("foo/bar/a.txt"))
+- self.assert_(checkcontents("foo/bar/a.txt"))
++ self.assertTrue(check("foo/bar/a.txt"))
++ self.assertTrue(checkcontents("foo/bar/a.txt"))
+ # import rpdb2; rpdb2.start_embedded_debugger('password');
+ self.fs.copy("foo/bar/a.txt", "foo/b.txt")
+- self.assert_(check("foo/bar/a.txt"))
+- self.assert_(check("foo/b.txt"))
+- self.assert_(checkcontents("foo/bar/a.txt"))
+- self.assert_(checkcontents("foo/b.txt"))
++ self.assertTrue(check("foo/bar/a.txt"))
++ self.assertTrue(check("foo/b.txt"))
++ self.assertTrue(checkcontents("foo/bar/a.txt"))
++ self.assertTrue(checkcontents("foo/b.txt"))
+
+ self.fs.copy("foo/b.txt", "c.txt")
+- self.assert_(check("foo/b.txt"))
+- self.assert_(check("/c.txt"))
+- self.assert_(checkcontents("/c.txt"))
++ self.assertTrue(check("foo/b.txt"))
++ self.assertTrue(check("/c.txt"))
++ self.assertTrue(checkcontents("/c.txt"))
+
+ makefile("foo/bar/a.txt", b("different contents"))
+- self.assert_(checkcontents("foo/bar/a.txt", b("different contents")))
++ self.assertTrue(checkcontents("foo/bar/a.txt", b("different contents")))
+ self.assertRaises(
+ DestinationExistsError, self.fs.copy, "foo/bar/a.txt", "/c.txt")
+- self.assert_(checkcontents("/c.txt"))
++ self.assertTrue(checkcontents("/c.txt"))
+ self.fs.copy("foo/bar/a.txt", "/c.txt", overwrite=True)
+- self.assert_(checkcontents("foo/bar/a.txt", b("different contents")))
+- self.assert_(checkcontents("/c.txt", b("different contents")))
++ self.assertTrue(checkcontents("foo/bar/a.txt", b("different contents")))
++ self.assertTrue(checkcontents("/c.txt", b("different contents")))
+
+ def test_copydir(self):
+ check = self.check
+@@ -690,24 +690,24 @@ class FSTestCases(object):
+ makefile("a/foo/bar/baz.txt")
+
+ self.fs.copydir("a", "copy of a")
+- self.assert_(check("copy of a/1.txt"))
+- self.assert_(check("copy of a/2.txt"))
+- self.assert_(check("copy of a/3.txt"))
+- self.assert_(check("copy of a/foo/bar/baz.txt"))
++ self.assertTrue(check("copy of a/1.txt"))
++ self.assertTrue(check("copy of a/2.txt"))
++ self.assertTrue(check("copy of a/3.txt"))
++ self.assertTrue(check("copy of a/foo/bar/baz.txt"))
+ checkcontents("copy of a/1.txt")
+
+- self.assert_(check("a/1.txt"))
+- self.assert_(check("a/2.txt"))
+- self.assert_(check("a/3.txt"))
+- self.assert_(check("a/foo/bar/baz.txt"))
++ self.assertTrue(check("a/1.txt"))
++ self.assertTrue(check("a/2.txt"))
++ self.assertTrue(check("a/3.txt"))
++ self.assertTrue(check("a/foo/bar/baz.txt"))
+ checkcontents("a/1.txt")
+
+ self.assertRaises(DestinationExistsError, self.fs.copydir, "a", "b")
+ self.fs.copydir("a", "b", overwrite=True)
+- self.assert_(check("b/1.txt"))
+- self.assert_(check("b/2.txt"))
+- self.assert_(check("b/3.txt"))
+- self.assert_(check("b/foo/bar/baz.txt"))
++ self.assertTrue(check("b/1.txt"))
++ self.assertTrue(check("b/2.txt"))
++ self.assertTrue(check("b/3.txt"))
++ self.assertTrue(check("b/foo/bar/baz.txt"))
+ checkcontents("b/1.txt")
+
+ def test_copydir_with_dotfile(self):
+@@ -724,13 +724,13 @@ class FSTestCases(object):
+ makefile("a/.hidden.txt")
+
+ self.fs.copydir("a", "copy of a")
+- self.assert_(check("copy of a/1.txt"))
+- self.assert_(check("copy of a/2.txt"))
+- self.assert_(check("copy of a/.hidden.txt"))
++ self.assertTrue(check("copy of a/1.txt"))
++ self.assertTrue(check("copy of a/2.txt"))
++ self.assertTrue(check("copy of a/.hidden.txt"))
+
+- self.assert_(check("a/1.txt"))
+- self.assert_(check("a/2.txt"))
+- self.assert_(check("a/.hidden.txt"))
++ self.assertTrue(check("a/1.txt"))
++ self.assertTrue(check("a/2.txt"))
++ self.assertTrue(check("a/.hidden.txt"))
+
+ def test_readwriteappendseek(self):
+ def checkcontents(path, check_contents):
+@@ -743,7 +743,7 @@ class FSTestCases(object):
+ all_strings = b("").join(test_strings)
+
+ self.assertRaises(ResourceNotFoundError, self.fs.open, "a.txt", "r")
+- self.assert_(not self.fs.exists("a.txt"))
++ self.assertTrue(not self.fs.exists("a.txt"))
+ f1 = self.fs.open("a.txt", "wb")
+ pos = 0
+ for s in test_strings:
+@@ -751,26 +751,26 @@ class FSTestCases(object):
+ pos += len(s)
+ self.assertEqual(pos, f1.tell())
+ f1.close()
+- self.assert_(self.fs.exists("a.txt"))
+- self.assert_(checkcontents("a.txt", all_strings))
++ self.assertTrue(self.fs.exists("a.txt"))
++ self.assertTrue(checkcontents("a.txt", all_strings))
+
+ f2 = self.fs.open("b.txt", "wb")
+ f2.write(test_strings[0])
+ f2.close()
+- self.assert_(checkcontents("b.txt", test_strings[0]))
++ self.assertTrue(checkcontents("b.txt", test_strings[0]))
+ f3 = self.fs.open("b.txt", "ab")
+ # On win32, tell() gives zero until you actually write to the file
+ # self.assertEquals(f3.tell(),len(test_strings[0]))
+ f3.write(test_strings[1])
+- self.assertEquals(f3.tell(), len(test_strings[0])+len(test_strings[1]))
++ self.assertEqual(f3.tell(), len(test_strings[0])+len(test_strings[1]))
+ f3.write(test_strings[2])
+- self.assertEquals(f3.tell(), len(all_strings))
++ self.assertEqual(f3.tell(), len(all_strings))
+ f3.close()
+- self.assert_(checkcontents("b.txt", all_strings))
++ self.assertTrue(checkcontents("b.txt", all_strings))
+ f4 = self.fs.open("b.txt", "wb")
+ f4.write(test_strings[2])
+ f4.close()
+- self.assert_(checkcontents("b.txt", test_strings[2]))
++ self.assertTrue(checkcontents("b.txt", test_strings[2]))
+ f5 = self.fs.open("c.txt", "wb")
+ for s in test_strings:
+ f5.write(s+b("\n"))
+@@ -815,7 +815,7 @@ class FSTestCases(object):
+ with self.fs.open("hello", "wb") as f:
+ f.truncate(30)
+
+- self.assertEquals(self.fs.getsize("hello"), 30)
++ self.assertEqual(self.fs.getsize("hello"), 30)
+
+ # Some file systems (FTPFS) don't support both reading and writing
+ if self.fs.getmeta('file.read_and_write', True):
+@@ -825,7 +825,7 @@ class FSTestCases(object):
+
+ with self.fs.open("hello", "rb") as f:
+ f.seek(25)
+- self.assertEquals(f.read(), b("123456"))
++ self.assertEqual(f.read(), b("123456"))
+
+ def test_write_past_end_of_file(self):
+ if self.fs.getmeta('file.read_and_write', True):
+@@ -833,7 +833,7 @@ class FSTestCases(object):
+ f.seek(25)
+ f.write(b("EOF"))
+ with self.fs.open("write_at_end", "rb") as f:
+- self.assertEquals(f.read(), b("\x00")*25 + b("EOF"))
++ self.assertEqual(f.read(), b("\x00")*25 + b("EOF"))
+
+ def test_with_statement(self):
+ # This is a little tricky since 'with' is actually new syntax.
+@@ -856,15 +856,15 @@ class FSTestCases(object):
+ code += " raise ValueError\n"
+ code = compile(code, "<string>", 'exec')
+ self.assertRaises(ValueError, eval, code, globals(), locals())
+- self.assertEquals(self.fs.getcontents('f.txt', 'rb'), contents)
++ self.assertEqual(self.fs.getcontents('f.txt', 'rb'), contents)
+
+ def test_pickling(self):
+ if self.fs.getmeta('pickle_contents', True):
+ self.fs.setcontents("test1", b("hello world"))
+ fs2 = pickle.loads(pickle.dumps(self.fs))
+- self.assert_(fs2.isfile("test1"))
++ self.assertTrue(fs2.isfile("test1"))
+ fs3 = pickle.loads(pickle.dumps(self.fs, -1))
+- self.assert_(fs3.isfile("test1"))
++ self.assertTrue(fs3.isfile("test1"))
+ else:
+ # Just make sure it doesn't throw an exception
+ fs2 = pickle.loads(pickle.dumps(self.fs))
+@@ -879,9 +879,9 @@ class FSTestCases(object):
+ r = random.Random(0)
+ randint = r.randint
+ int2byte = six.int2byte
+- for _i in xrange(num_chunks):
++ for _i in range(num_chunks):
+ c = b("").join(int2byte(randint(
+- 0, 255)) for _j in xrange(chunk_size//8))
++ 0, 255)) for _j in range(chunk_size//8))
+ yield c * 8
+ f = self.fs.open("bigfile", "wb")
+ try:
+@@ -894,7 +894,7 @@ class FSTestCases(object):
+ try:
+ try:
+ while True:
+- if chunks.next() != f.read(chunk_size):
++ if next(chunks) != f.read(chunk_size):
+ assert False, "bigfile was corrupted"
+ except StopIteration:
+ if f.read() != b(""):
+@@ -929,9 +929,9 @@ class FSTestCases(object):
+ """Test read(0) returns empty string"""
+ self.fs.setcontents('foo.txt', b('Hello, World'))
+ with self.fs.open('foo.txt', 'rb') as f:
+- self.assert_(len(f.read(0)) == 0)
++ self.assertTrue(len(f.read(0)) == 0)
+ with self.fs.open('foo.txt', 'rt') as f:
+- self.assert_(len(f.read(0)) == 0)
++ self.assertTrue(len(f.read(0)) == 0)
+
+ # May be disabled - see end of file
+
+@@ -977,7 +977,7 @@ class ThreadingTestCases(object):
+ for t in threads:
+ t.join()
+ for (c, e, t) in errors:
+- raise e, None, t
++ raise e.with_traceback(t)
+ finally:
+ sys.setcheckinterval(check_interval)
+
+@@ -994,12 +994,12 @@ class ThreadingTestCases(object):
+ def thread1():
+ c = b("thread1 was 'ere")
+ setcontents("thread1.txt", c)
+- self.assertEquals(self.fs.getcontents("thread1.txt", 'rb'), c)
++ self.assertEqual(self.fs.getcontents("thread1.txt", 'rb'), c)
+
+ def thread2():
+ c = b("thread2 was 'ere")
+ setcontents("thread2.txt", c)
+- self.assertEquals(self.fs.getcontents("thread2.txt", 'rb'), c)
++ self.assertEqual(self.fs.getcontents("thread2.txt", 'rb'), c)
+ self._runThreads(thread1, thread2)
+
+ def test_setcontents_threaded_samefile(self):
+@@ -1016,19 +1016,19 @@ class ThreadingTestCases(object):
+ c = b("thread1 was 'ere")
+ setcontents("threads.txt", c)
+ self._yield()
+- self.assertEquals(self.fs.listdir("/"), ["threads.txt"])
++ self.assertEqual(self.fs.listdir("/"), ["threads.txt"])
+
+ def thread2():
+ c = b("thread2 was 'ere")
+ setcontents("threads.txt", c)
+ self._yield()
+- self.assertEquals(self.fs.listdir("/"), ["threads.txt"])
++ self.assertEqual(self.fs.listdir("/"), ["threads.txt"])
+
+ def thread3():
+ c = b("thread3 was 'ere")
+ setcontents("threads.txt", c)
+ self._yield()
+- self.assertEquals(self.fs.listdir("/"), ["threads.txt"])
++ self.assertEqual(self.fs.listdir("/"), ["threads.txt"])
+ try:
+ self._runThreads(thread1, thread2, thread3)
+ except ResourceLockedError:
+@@ -1079,23 +1079,23 @@ class ThreadingTestCases(object):
+ def makedir():
+ try:
+ self.fs.makedir("testdir")
+- except DestinationExistsError, e:
++ except DestinationExistsError as e:
+ errors.append(e)
+
+ def makedir_noerror():
+ try:
+ self.fs.makedir("testdir", allow_recreate=True)
+- except DestinationExistsError, e:
++ except DestinationExistsError as e:
+ errors.append(e)
+
+ def removedir():
+ try:
+ self.fs.removedir("testdir")
+- except (ResourceNotFoundError, ResourceLockedError), e:
++ except (ResourceNotFoundError, ResourceLockedError) as e:
+ errors.append(e)
+ # One thread should succeed, one should error
+ self._runThreads(makedir, makedir)
+- self.assertEquals(len(errors), 1)
++ self.assertEqual(len(errors), 1)
+ self.fs.removedir("testdir")
+ # One thread should succeed, two should error
+ errors = []
+@@ -1106,18 +1106,18 @@ class ThreadingTestCases(object):
+ # All threads should succeed
+ errors = []
+ self._runThreads(makedir_noerror, makedir_noerror, makedir_noerror)
+- self.assertEquals(len(errors), 0)
++ self.assertEqual(len(errors), 0)
+ self.assertTrue(self.fs.isdir("testdir"))
+ self.fs.removedir("testdir")
+ # makedir() can beat removedir() and vice-versa
+ errors = []
+ self._runThreads(makedir, removedir)
+ if self.fs.isdir("testdir"):
+- self.assertEquals(len(errors), 1)
++ self.assertEqual(len(errors), 1)
+ self.assertFalse(isinstance(errors[0], DestinationExistsError))
+ self.fs.removedir("testdir")
+ else:
+- self.assertEquals(len(errors), 0)
++ self.assertEqual(len(errors), 0)
+
+ def test_concurrent_copydir(self):
+ self.fs.makedir("a")
+@@ -1136,10 +1136,10 @@ class ThreadingTestCases(object):
+ # This should error out since we're not overwriting
+ self.assertRaises(
+ DestinationExistsError, self._runThreads, copydir, copydir)
+- self.assert_(self.fs.isdir('a'))
+- self.assert_(self.fs.isdir('a'))
++ self.assertTrue(self.fs.isdir('a'))
++ self.assertTrue(self.fs.isdir('a'))
+ copydir_overwrite()
+- self.assert_(self.fs.isdir('a'))
++ self.assertTrue(self.fs.isdir('a'))
+ # This should run to completion and give a valid state, unless
+ # files get locked when written to.
+ try:
+@@ -1160,19 +1160,19 @@ class ThreadingTestCases(object):
+ "contents the second"), b("number three")]
+
+ def thread1():
+- for i in xrange(30):
++ for i in range(30):
+ for c in contents:
+ self.fs.setcontents("thread1.txt", c)
+- self.assertEquals(self.fs.getsize("thread1.txt"), len(c))
+- self.assertEquals(self.fs.getcontents(
++ self.assertEqual(self.fs.getsize("thread1.txt"), len(c))
++ self.assertEqual(self.fs.getcontents(
+ "thread1.txt", 'rb'), c)
+
+ def thread2():
+- for i in xrange(30):
++ for i in range(30):
+ for c in contents:
+ self.fs.setcontents("thread2.txt", c)
+- self.assertEquals(self.fs.getsize("thread2.txt"), len(c))
+- self.assertEquals(self.fs.getcontents(
++ self.assertEqual(self.fs.getsize("thread2.txt"), len(c))
++ self.assertEqual(self.fs.getcontents(
+ "thread2.txt", 'rb'), c)
+ self._runThreads(thread1, thread2)
+
+--- fs/tests/test_archivefs.py.orig 2022-03-04 17:14:43 UTC
++++ fs/tests/test_archivefs.py
+@@ -58,7 +58,7 @@ class TestReadArchiveFS(unittest.TestCase):
+ contents = f.read()
+ return contents
+ def check_contents(path, expected):
+- self.assert_(read_contents(path)==expected)
++ self.assertTrue(read_contents(path)==expected)
+ check_contents("a.txt", b("Hello, World!"))
+ check_contents("1.txt", b("1"))
+ check_contents("foo/bar/baz.txt", b("baz"))
+@@ -67,29 +67,29 @@ class TestReadArchiveFS(unittest.TestCase):
+ def read_contents(path):
+ return self.fs.getcontents(path)
+ def check_contents(path, expected):
+- self.assert_(read_contents(path)==expected)
++ self.assertTrue(read_contents(path)==expected)
+ check_contents("a.txt", b("Hello, World!"))
+ check_contents("1.txt", b("1"))
+ check_contents("foo/bar/baz.txt", b("baz"))
+
+ def test_is(self):
+- self.assert_(self.fs.isfile('a.txt'))
+- self.assert_(self.fs.isfile('1.txt'))
+- self.assert_(self.fs.isfile('foo/bar/baz.txt'))
+- self.assert_(self.fs.isdir('foo'))
+- self.assert_(self.fs.isdir('foo/bar'))
+- self.assert_(self.fs.exists('a.txt'))
+- self.assert_(self.fs.exists('1.txt'))
+- self.assert_(self.fs.exists('foo/bar/baz.txt'))
+- self.assert_(self.fs.exists('foo'))
+- self.assert_(self.fs.exists('foo/bar'))
++ self.assertTrue(self.fs.isfile('a.txt'))
++ self.assertTrue(self.fs.isfile('1.txt'))
++ self.assertTrue(self.fs.isfile('foo/bar/baz.txt'))
++ self.assertTrue(self.fs.isdir('foo'))
++ self.assertTrue(self.fs.isdir('foo/bar'))
++ self.assertTrue(self.fs.exists('a.txt'))
++ self.assertTrue(self.fs.exists('1.txt'))
++ self.assertTrue(self.fs.exists('foo/bar/baz.txt'))
++ self.assertTrue(self.fs.exists('foo'))
++ self.assertTrue(self.fs.exists('foo/bar'))
+
+ def test_listdir(self):
+ def check_listing(path, expected):
+ dir_list = self.fs.listdir(path)
+- self.assert_(sorted(dir_list) == sorted(expected))
++ self.assertTrue(sorted(dir_list) == sorted(expected))
+ for item in dir_list:
+- self.assert_(isinstance(item,unicode))
++ self.assertTrue(isinstance(item,str))
+ check_listing('/', ['a.txt', '1.txt', 'foo', 'b.txt'])
+ check_listing('foo', ['second.txt', 'bar'])
+ check_listing('foo/bar', ['baz.txt'])
+@@ -114,7 +114,7 @@ class TestWriteArchiveFS(unittest.TestCase):
+
+ makefile("a.txt", b("Hello, World!"))
+ makefile("b.txt", b("b"))
+- makefile(u"\N{GREEK SMALL LETTER ALPHA}/\N{GREEK CAPITAL LETTER OMEGA}.txt", b("this is the alpha and the omega"))
++ makefile("\N{GREEK SMALL LETTER ALPHA}/\N{GREEK CAPITAL LETTER OMEGA}.txt", b("this is the alpha and the omega"))
+ makefile("foo/bar/baz.txt", b("baz"))
+ makefile("foo/second.txt", b("hai"))
+
+@@ -125,7 +125,7 @@ class TestWriteArchiveFS(unittest.TestCase):
+
+ def test_valid(self):
+ zf = zipfile.ZipFile(self.temp_filename, "r")
+- self.assert_(zf.testzip() is None)
++ self.assertTrue(zf.testzip() is None)
+ zf.close()
+
+ def test_creation(self):
+@@ -140,7 +140,7 @@ class TestWriteArchiveFS(unittest.TestCase):
+ check_contents("b.txt", b("b"))
+ check_contents("foo/bar/baz.txt", b("baz"))
+ check_contents("foo/second.txt", b("hai"))
+- check_contents(u"\N{GREEK SMALL LETTER ALPHA}/\N{GREEK CAPITAL LETTER OMEGA}.txt", b("this is the alpha and the omega"))
++ check_contents("\N{GREEK SMALL LETTER ALPHA}/\N{GREEK CAPITAL LETTER OMEGA}.txt", b("this is the alpha and the omega"))
+
+
+ #~ class TestAppendArchiveFS(TestWriteArchiveFS):
+--- fs/tests/test_errors.py.orig 2022-03-04 17:14:43 UTC
++++ fs/tests/test_errors.py
+@@ -29,4 +29,4 @@ class TestFSError(unittest.TestCase):
+
+ def test_unicode_representation_of_error_with_non_ascii_characters(self):
+ path_error = PathError('/Shïrê/Frødø')
+- _ = unicode(path_error)
+\ No newline at end of file
++ _ = str(path_error)
+--- fs/tests/test_expose.py.orig 2022-03-04 17:14:43 UTC
++++ fs/tests/test_expose.py
+@@ -149,7 +149,7 @@ if dokan.is_available:
+
+ def tearDown(self):
+ self.mount_proc.unmount()
+- for _ in xrange(10):
++ for _ in range(10):
+ try:
+ if self.mount_proc.poll() is None:
+ self.mount_proc.terminate()
+--- fs/tests/test_fs.py.orig 2022-03-04 17:14:43 UTC
++++ fs/tests/test_fs.py
+@@ -20,7 +20,7 @@ from fs import osfs
+ class TestOSFS(unittest.TestCase,FSTestCases,ThreadingTestCases):
+
+ def setUp(self):
+- self.temp_dir = tempfile.mkdtemp(u"fstest")
++ self.temp_dir = tempfile.mkdtemp("fstest")
+ self.fs = osfs.OSFS(self.temp_dir)
+
+ def tearDown(self):
+@@ -35,14 +35,14 @@ class TestOSFS(unittest.TestCase,FSTestCases,Threading
+
+ self.assertRaises(errors.InvalidCharsInPathError, self.fs.open, 'invalid\0file', 'wb')
+ self.assertFalse(self.fs.isvalidpath('invalid\0file'))
+- self.assert_(self.fs.isvalidpath('validfile'))
+- self.assert_(self.fs.isvalidpath('completely_valid/path/foo.bar'))
++ self.assertTrue(self.fs.isvalidpath('validfile'))
++ self.assertTrue(self.fs.isvalidpath('completely_valid/path/foo.bar'))
+
+
+ class TestSubFS(unittest.TestCase,FSTestCases,ThreadingTestCases):
+
+ def setUp(self):
+- self.temp_dir = tempfile.mkdtemp(u"fstest")
++ self.temp_dir = tempfile.mkdtemp("fstest")
+ self.parent_fs = osfs.OSFS(self.temp_dir)
+ self.parent_fs.makedir("foo/bar", recursive=True)
+ self.fs = self.parent_fs.opendir("foo/bar")
+@@ -118,7 +118,7 @@ class TestTempFS(unittest.TestCase,FSTestCases,Threadi
+ def tearDown(self):
+ td = self.fs._temp_dir
+ self.fs.close()
+- self.assert_(not os.path.exists(td))
++ self.assertTrue(not os.path.exists(td))
+
+ def check(self, p):
+ td = self.fs._temp_dir
+@@ -129,5 +129,5 @@ class TestTempFS(unittest.TestCase,FSTestCases,Threadi
+
+ self.assertRaises(errors.InvalidCharsInPathError, self.fs.open, 'invalid\0file', 'wb')
+ self.assertFalse(self.fs.isvalidpath('invalid\0file'))
+- self.assert_(self.fs.isvalidpath('validfile'))
+- self.assert_(self.fs.isvalidpath('completely_valid/path/foo.bar'))
++ self.assertTrue(self.fs.isvalidpath('validfile'))
++ self.assertTrue(self.fs.isvalidpath('completely_valid/path/foo.bar'))
+--- fs/tests/test_ftpfs.py.orig 2022-03-04 17:14:43 UTC
++++ fs/tests/test_ftpfs.py
+@@ -10,7 +10,7 @@ import tempfile
+ import subprocess
+ import time
+ from os.path import abspath
+-import urllib
++import urllib.request, urllib.parse, urllib.error
+
+ from six import PY3
+
+@@ -37,7 +37,7 @@ class TestFTPFS(unittest.TestCase, FSTestCases, Thread
+ ftp_port += 1
+ use_port = str(ftp_port)
+ #ftp_port = 10000
+- self.temp_dir = tempfile.mkdtemp(u"ftpfstests")
++ self.temp_dir = tempfile.mkdtemp("ftpfstests")
+
+ file_path = __file__
+ if ':' not in file_path:
+@@ -58,7 +58,7 @@ class TestFTPFS(unittest.TestCase, FSTestCases, Thread
+ start_time = time.time()
+ while time.time() - start_time < 5:
+ try:
+- ftpurl = urllib.urlopen('ftp://127.0.0.1:%s' % use_port)
++ ftpurl = urllib.request.urlopen('ftp://127.0.0.1:%s' % use_port)
+ except IOError:
+ time.sleep(0)
+ else:
+--- fs/tests/test_importhook.py.orig 2022-03-04 17:14:43 UTC
++++ fs/tests/test_importhook.py
+@@ -25,7 +25,7 @@ class TestFSImportHook(unittest.TestCase):
+ for ph in list(sys.path_hooks):
+ if issubclass(ph,FSImportHook):
+ sys.path_hooks.remove(mph)
+- for (k,v) in sys.modules.items():
++ for (k,v) in list(sys.modules.items()):
+ if k.startswith("fsih_"):
+ del sys.modules[k]
+ elif hasattr(v,"__loader__"):
+@@ -64,22 +64,22 @@ class TestFSImportHook(unittest.TestCase):
+ ih = FSImportHook(t)
+ sys.meta_path.append(ih)
+ try:
+- self.assertEquals(ih.find_module("fsih_hello"),ih)
+- self.assertEquals(ih.find_module("fsih_helo"),None)
+- self.assertEquals(ih.find_module("fsih_pkg"),ih)
+- self.assertEquals(ih.find_module("fsih_pkg.sub1"),ih)
+- self.assertEquals(ih.find_module("fsih_pkg.sub2"),ih)
+- self.assertEquals(ih.find_module("fsih_pkg.sub3"),None)
++ self.assertEqual(ih.find_module("fsih_hello"),ih)
++ self.assertEqual(ih.find_module("fsih_helo"),None)
++ self.assertEqual(ih.find_module("fsih_pkg"),ih)
++ self.assertEqual(ih.find_module("fsih_pkg.sub1"),ih)
++ self.assertEqual(ih.find_module("fsih_pkg.sub2"),ih)
++ self.assertEqual(ih.find_module("fsih_pkg.sub3"),None)
+ m = ih.load_module("fsih_hello")
+- self.assertEquals(m.message,"hello world!")
++ self.assertEqual(m.message,"hello world!")
+ self.assertRaises(ImportError,ih.load_module,"fsih_helo")
+ ih.load_module("fsih_pkg")
+ m = ih.load_module("fsih_pkg.sub1")
+- self.assertEquals(m.message,"hello world!")
+- self.assertEquals(m.a,42)
++ self.assertEqual(m.message,"hello world!")
++ self.assertEqual(m.a,42)
+ m = ih.load_module("fsih_pkg.sub2")
+- self.assertEquals(m.message,"hello world!")
+- self.assertEquals(m.a,42 * 2)
++ self.assertEqual(m.message,"hello world!")
++ self.assertEqual(m.a,42 * 2)
+ self.assertRaises(ImportError,ih.load_module,"fsih_pkg.sub3")
+ finally:
+ sys.meta_path.remove(ih)
+@@ -88,7 +88,7 @@ class TestFSImportHook(unittest.TestCase):
+ def _check_imports_are_working(self):
+ try:
+ import fsih_hello
+- self.assertEquals(fsih_hello.message,"hello world!")
++ self.assertEqual(fsih_hello.message,"hello world!")
+ try:
+ import fsih_helo
+ except ImportError:
+@@ -97,11 +97,11 @@ class TestFSImportHook(unittest.TestCase):
+ assert False, "ImportError not raised"
+ import fsih_pkg
+ import fsih_pkg.sub1
+- self.assertEquals(fsih_pkg.sub1.message,"hello world!")
+- self.assertEquals(fsih_pkg.sub1.a,42)
++ self.assertEqual(fsih_pkg.sub1.message,"hello world!")
++ self.assertEqual(fsih_pkg.sub1.a,42)
+ import fsih_pkg.sub2
+- self.assertEquals(fsih_pkg.sub2.message,"hello world!")
+- self.assertEquals(fsih_pkg.sub2.a,42 * 2)
++ self.assertEqual(fsih_pkg.sub2.message,"hello world!")
++ self.assertEqual(fsih_pkg.sub2.a,42 * 2)
+ try:
+ import fsih_pkg.sub3
+ except ImportError:
+@@ -109,7 +109,7 @@ class TestFSImportHook(unittest.TestCase):
+ else:
+ assert False, "ImportError not raised"
+ finally:
+- for k in sys.modules.keys():
++ for k in list(sys.modules.keys()):
+ if k.startswith("fsih_"):
+ del sys.modules[k]
+
+--- fs/tests/test_iotools.py.orig 2022-03-04 17:14:43 UTC
++++ fs/tests/test_iotools.py
+@@ -1,5 +1,5 @@
+-from __future__ import unicode_literals
+
++
+ from fs import iotools
+
+ import io
+@@ -7,9 +7,9 @@ import unittest
+ from os.path import dirname, join, abspath
+
+ try:
+- unicode
++ str
+ except NameError:
+- unicode = str
++ str = str
+
+
+ class OpenFilelike(object):
+@@ -37,20 +37,20 @@ class TestIOTools(unittest.TestCase):
+ """Test make_stream"""
+ with self.get_bin_file() as f:
+ text = f.read()
+- self.assert_(isinstance(text, bytes))
++ self.assertTrue(isinstance(text, bytes))
+
+ with self.get_bin_file() as f:
+ with iotools.make_stream("data/UTF-8-demo.txt", f, 'rt') as f2:
+ text = f2.read()
+- self.assert_(isinstance(text, unicode))
++ self.assertTrue(isinstance(text, str))
+
+ def test_decorator(self):
+ """Test filelike_to_stream decorator"""
+ o = OpenFilelike(self.get_bin_file)
+ with o.open('file', 'rb') as f:
+ text = f.read()
+- self.assert_(isinstance(text, bytes))
++ self.assertTrue(isinstance(text, bytes))
+
+ with o.open('file', 'rt') as f:
+ text = f.read()
+- self.assert_(isinstance(text, unicode))
++ self.assertTrue(isinstance(text, str))
+--- fs/tests/test_mountfs.py.orig 2022-03-04 17:14:43 UTC
++++ fs/tests/test_mountfs.py
+@@ -12,11 +12,11 @@ class TestMountFS(unittest.TestCase):
+ m2 = MemoryFS()
+ multi_fs.mount('/m1', m1)
+ multi_fs.mount('/m2', m2)
+- self.assert_(not m1.closed)
+- self.assert_(not m2.closed)
++ self.assertTrue(not m1.closed)
++ self.assertTrue(not m2.closed)
+ multi_fs.close()
+- self.assert_(m1.closed)
+- self.assert_(m2.closed)
++ self.assertTrue(m1.closed)
++ self.assertTrue(m2.closed)
+
+ def test_no_auto_close(self):
+ """Test MountFS auto close can be disabled"""
+@@ -25,11 +25,11 @@ class TestMountFS(unittest.TestCase):
+ m2 = MemoryFS()
+ multi_fs.mount('/m1', m1)
+ multi_fs.mount('/m2', m2)
+- self.assert_(not m1.closed)
+- self.assert_(not m2.closed)
++ self.assertTrue(not m1.closed)
++ self.assertTrue(not m2.closed)
+ multi_fs.close()
+- self.assert_(not m1.closed)
+- self.assert_(not m2.closed)
++ self.assertTrue(not m1.closed)
++ self.assertTrue(not m2.closed)
+
+ def test_mountfile(self):
+ """Test mounting a file"""
+@@ -42,16 +42,16 @@ class TestMountFS(unittest.TestCase):
+ mount_fs = MountFS()
+ mount_fs.mountfile('bar.txt', foo_dir.open, foo_dir.getinfo)
+
+- self.assert_(mount_fs.isdir('/'))
+- self.assert_(mount_fs.isdir('./'))
+- self.assert_(mount_fs.isdir(''))
++ self.assertTrue(mount_fs.isdir('/'))
++ self.assertTrue(mount_fs.isdir('./'))
++ self.assertTrue(mount_fs.isdir(''))
+
+ # Check we can see the mounted file in the dir list
+ self.assertEqual(mount_fs.listdir(), ["bar.txt"])
+- self.assert_(not mount_fs.exists('nobodyhere.txt'))
+- self.assert_(mount_fs.exists('bar.txt'))
+- self.assert_(mount_fs.isfile('bar.txt'))
+- self.assert_(not mount_fs.isdir('bar.txt'))
++ self.assertTrue(not mount_fs.exists('nobodyhere.txt'))
++ self.assertTrue(mount_fs.exists('bar.txt'))
++ self.assertTrue(mount_fs.isfile('bar.txt'))
++ self.assertTrue(not mount_fs.isdir('bar.txt'))
+
+ # Check open and getinfo callables
+ self.assertEqual(mount_fs.getcontents('bar.txt'), quote)
+@@ -67,9 +67,9 @@ class TestMountFS(unittest.TestCase):
+ self.assertEqual(mem_fs.getsize('foo/bar.txt'), len('baz'))
+
+ # Check unmount
+- self.assert_(mount_fs.unmount("bar.txt"))
++ self.assertTrue(mount_fs.unmount("bar.txt"))
+ self.assertEqual(mount_fs.listdir(), [])
+- self.assert_(not mount_fs.exists('bar.txt'))
++ self.assertTrue(not mount_fs.exists('bar.txt'))
+
+ # Check unount a second time is a null op, and returns False
+ self.assertFalse(mount_fs.unmount("bar.txt"))
+--- fs/tests/test_multifs.py.orig 2022-03-04 17:14:43 UTC
++++ fs/tests/test_multifs.py
+@@ -13,11 +13,11 @@ class TestMultiFS(unittest.TestCase):
+ m2 = MemoryFS()
+ multi_fs.addfs('m1', m1)
+ multi_fs.addfs('m2', m2)
+- self.assert_(not m1.closed)
+- self.assert_(not m2.closed)
++ self.assertTrue(not m1.closed)
++ self.assertTrue(not m2.closed)
+ multi_fs.close()
+- self.assert_(m1.closed)
+- self.assert_(m2.closed)
++ self.assertTrue(m1.closed)
++ self.assertTrue(m2.closed)
+
+ def test_no_auto_close(self):
+ """Test MultiFS auto close can be disables"""
+@@ -26,11 +26,11 @@ class TestMultiFS(unittest.TestCase):
+ m2 = MemoryFS()
+ multi_fs.addfs('m1', m1)
+ multi_fs.addfs('m2', m2)
+- self.assert_(not m1.closed)
+- self.assert_(not m2.closed)
++ self.assertTrue(not m1.closed)
++ self.assertTrue(not m2.closed)
+ multi_fs.close()
+- self.assert_(not m1.closed)
+- self.assert_(not m2.closed)
++ self.assertTrue(not m1.closed)
++ self.assertTrue(not m2.closed)
+
+
+ def test_priority(self):
+@@ -45,7 +45,7 @@ class TestMultiFS(unittest.TestCase):
+ multi_fs.addfs("m1", m1)
+ multi_fs.addfs("m2", m2)
+ multi_fs.addfs("m3", m3)
+- self.assert_(multi_fs.getcontents("name") == b("m3"))
++ self.assertTrue(multi_fs.getcontents("name") == b("m3"))
+
+ m1 = MemoryFS()
+ m2 = MemoryFS()
+@@ -57,7 +57,7 @@ class TestMultiFS(unittest.TestCase):
+ multi_fs.addfs("m1", m1)
+ multi_fs.addfs("m2", m2, priority=10)
+ multi_fs.addfs("m3", m3)
+- self.assert_(multi_fs.getcontents("name") == b("m2"))
++ self.assertTrue(multi_fs.getcontents("name") == b("m2"))
+
+ m1 = MemoryFS()
+ m2 = MemoryFS()
+@@ -69,7 +69,7 @@ class TestMultiFS(unittest.TestCase):
+ multi_fs.addfs("m1", m1)
+ multi_fs.addfs("m2", m2, priority=10)
+ multi_fs.addfs("m3", m3, priority=10)
+- self.assert_(multi_fs.getcontents("name") == b("m3"))
++ self.assertTrue(multi_fs.getcontents("name") == b("m3"))
+
+ m1 = MemoryFS()
+ m2 = MemoryFS()
+@@ -81,5 +81,5 @@ class TestMultiFS(unittest.TestCase):
+ multi_fs.addfs("m1", m1, priority=11)
+ multi_fs.addfs("m2", m2, priority=10)
+ multi_fs.addfs("m3", m3, priority=10)
+- self.assert_(multi_fs.getcontents("name") == b("m1"))
++ self.assertTrue(multi_fs.getcontents("name") == b("m1"))
+
+--- fs/tests/test_opener.py.orig 2022-03-04 17:14:43 UTC
++++ fs/tests/test_opener.py
+@@ -14,7 +14,7 @@ from fs import path
+ class TestOpener(unittest.TestCase):
+
+ def setUp(self):
+- self.temp_dir = tempfile.mkdtemp(u"fstest_opener")
++ self.temp_dir = tempfile.mkdtemp("fstest_opener")
+
+ def tearDown(self):
+ shutil.rmtree(self.temp_dir)
+--- fs/tests/test_path.py.orig 2022-03-04 17:14:43 UTC
++++ fs/tests/test_path.py
+@@ -23,7 +23,7 @@ class TestPathFunctions(unittest.TestCase):
+ ("a/b/c", "a/b/c"),
+ ("a/b/../c/", "a/c"),
+ ("/","/"),
+- (u"a/\N{GREEK SMALL LETTER BETA}/c",u"a/\N{GREEK SMALL LETTER BETA}/c"),
++ ("a/\N{GREEK SMALL LETTER BETA}/c","a/\N{GREEK SMALL LETTER BETA}/c"),
+ ]
+ for path, result in tests:
+ self.assertEqual(normpath(path), result)
+@@ -44,7 +44,7 @@ class TestPathFunctions(unittest.TestCase):
+ ("a/b", "./d", "e", "a/b/d/e"),
+ ("/", "/", "/"),
+ ("/", "", "/"),
+- (u"a/\N{GREEK SMALL LETTER BETA}","c",u"a/\N{GREEK SMALL LETTER BETA}/c"),
++ ("a/\N{GREEK SMALL LETTER BETA}","c","a/\N{GREEK SMALL LETTER BETA}/c"),
+ ]
+ for testpaths in tests:
+ paths = testpaths[:-1]
+@@ -101,12 +101,12 @@ class TestPathFunctions(unittest.TestCase):
+ self.assertEqual(pathsplit(path), result)
+
+ def test_recursepath(self):
+- self.assertEquals(recursepath("/"),["/"])
+- self.assertEquals(recursepath("hello"),["/","/hello"])
+- self.assertEquals(recursepath("/hello/world/"),["/","/hello","/hello/world"])
+- self.assertEquals(recursepath("/hello/world/",reverse=True),["/hello/world","/hello","/"])
+- self.assertEquals(recursepath("hello",reverse=True),["/hello","/"])
+- self.assertEquals(recursepath("",reverse=True),["/"])
++ self.assertEqual(recursepath("/"),["/"])
++ self.assertEqual(recursepath("hello"),["/","/hello"])
++ self.assertEqual(recursepath("/hello/world/"),["/","/hello","/hello/world"])
++ self.assertEqual(recursepath("/hello/world/",reverse=True),["/hello/world","/hello","/"])
++ self.assertEqual(recursepath("hello",reverse=True),["/hello","/"])
++ self.assertEqual(recursepath("",reverse=True),["/"])
+
+ def test_isdotfile(self):
+ for path in ['.foo',
+@@ -114,7 +114,7 @@ class TestPathFunctions(unittest.TestCase):
+ 'foo/.svn',
+ 'foo/bar/.svn',
+ '/foo/.bar']:
+- self.assert_(isdotfile(path))
++ self.assertTrue(isdotfile(path))
+
+ for path in ['asfoo',
+ 'df.svn',
+@@ -142,10 +142,10 @@ class TestPathFunctions(unittest.TestCase):
+ self.assertEqual(basename(path), test_basename)
+
+ def test_iswildcard(self):
+- self.assert_(iswildcard('*'))
+- self.assert_(iswildcard('*.jpg'))
+- self.assert_(iswildcard('foo/*'))
+- self.assert_(iswildcard('foo/{}'))
++ self.assertTrue(iswildcard('*'))
++ self.assertTrue(iswildcard('*.jpg'))
++ self.assertTrue(iswildcard('foo/*'))
++ self.assertTrue(iswildcard('foo/{}'))
+ self.assertFalse(iswildcard('foo'))
+ self.assertFalse(iswildcard('img.jpg'))
+ self.assertFalse(iswildcard('foo/bar'))
+@@ -171,9 +171,9 @@ class Test_PathMap(unittest.TestCase):
+ def test_basics(self):
+ map = PathMap()
+ map["hello"] = "world"
+- self.assertEquals(map["/hello"],"world")
+- self.assertEquals(map["/hello/"],"world")
+- self.assertEquals(map.get("hello"),"world")
++ self.assertEqual(map["/hello"],"world")
++ self.assertEqual(map["/hello/"],"world")
++ self.assertEqual(map.get("hello"),"world")
+
+ def test_iteration(self):
+ map = PathMap()
+@@ -183,17 +183,17 @@ class Test_PathMap(unittest.TestCase):
+ map["hello/kitty"] = 4
+ map["hello/kitty/islame"] = 5
+ map["batman/isawesome"] = 6
+- self.assertEquals(set(map.iterkeys()),set(("/hello/world","/hello/world/howareya","/hello/world/iamfine","/hello/kitty","/hello/kitty/islame","/batman/isawesome")))
+- self.assertEquals(sorted(map.values()),range(1,7))
+- self.assertEquals(sorted(map.items("/hello/world/")),[("/hello/world",1),("/hello/world/howareya",2),("/hello/world/iamfine",3)])
+- self.assertEquals(zip(map.keys(),map.values()),map.items())
+- self.assertEquals(zip(map.keys("batman"),map.values("batman")),map.items("batman"))
+- self.assertEquals(set(map.iternames("hello")),set(("world","kitty")))
+- self.assertEquals(set(map.iternames("/hello/kitty")),set(("islame",)))
++ self.assertEqual(set(map.keys()),set(("/hello/world","/hello/world/howareya","/hello/world/iamfine","/hello/kitty","/hello/kitty/islame","/batman/isawesome")))
++ self.assertEqual(sorted(map.values()),list(range(1,7)))
++ self.assertEqual(sorted(map.items("/hello/world/")),[("/hello/world",1),("/hello/world/howareya",2),("/hello/world/iamfine",3)])
++ self.assertEqual(list(zip(list(map.keys()),list(map.values()))),list(map.items()))
++ self.assertEqual(list(zip(map.keys("batman"),map.values("batman"))),map.items("batman"))
++ self.assertEqual(set(map.iternames("hello")),set(("world","kitty")))
++ self.assertEqual(set(map.iternames("/hello/kitty")),set(("islame",)))
+
+ del map["hello/kitty/islame"]
+- self.assertEquals(set(map.iternames("/hello/kitty")),set())
+- self.assertEquals(set(map.iterkeys()),set(("/hello/world","/hello/world/howareya","/hello/world/iamfine","/hello/kitty","/batman/isawesome")))
+- self.assertEquals(set(map.values()),set(range(1,7)) - set((5,)))
++ self.assertEqual(set(map.iternames("/hello/kitty")),set())
++ self.assertEqual(set(map.keys()),set(("/hello/world","/hello/world/howareya","/hello/world/iamfine","/hello/kitty","/batman/isawesome")))
++ self.assertEqual(set(map.values()),set(range(1,7)) - set((5,)))
+
+
+--- fs/tests/test_remote.py.orig 2022-03-04 17:14:43 UTC
++++ fs/tests/test_remote.py
+@@ -116,37 +116,37 @@ class TestRemoteFileBuffer(unittest.TestCase, FSTestCa
+ self.fakeOn()
+
+ f = self.fs.open('test.txt', 'rb')
+- self.assertEquals(f.read(10), contents[:10])
++ self.assertEqual(f.read(10), contents[:10])
+ f.wrapped_file.seek(0, SEEK_END)
+- self.assertEquals(f._rfile.tell(), 10)
++ self.assertEqual(f._rfile.tell(), 10)
+ f.seek(20)
+- self.assertEquals(f.tell(), 20)
+- self.assertEquals(f._rfile.tell(), 20)
++ self.assertEqual(f.tell(), 20)
++ self.assertEqual(f._rfile.tell(), 20)
+ f.seek(0, SEEK_END)
+- self.assertEquals(f._rfile.tell(), len(contents))
++ self.assertEqual(f._rfile.tell(), len(contents))
+ f.close()
+
+ f = self.fs.open('test.txt', 'ab')
+- self.assertEquals(f.tell(), len(contents))
++ self.assertEqual(f.tell(), len(contents))
+ f.close()
+
+ self.fakeOff()
+
+ # Writing over the rfile edge
+ f = self.fs.open('test.txt', 'wb+')
+- self.assertEquals(f.tell(), 0)
++ self.assertEqual(f.tell(), 0)
+ f.seek(len(contents) - 5)
+ # Last 5 characters not loaded from remote file
+- self.assertEquals(f._rfile.tell(), len(contents) - 5)
++ self.assertEqual(f._rfile.tell(), len(contents) - 5)
+ # Confirm that last 5 characters are still in rfile buffer
+- self.assertEquals(f._rfile.read(), contents[-5:])
++ self.assertEqual(f._rfile.read(), contents[-5:])
+ # Rollback position 5 characters before eof
+ f._rfile.seek(len(contents[:-5]))
+ # Write 10 new characters (will make contents longer for 5 chars)
+ f.write(b('1234567890'))
+ f.flush()
+ # We are on the end of file (and buffer not serve anything anymore)
+- self.assertEquals(f.read(), b(''))
++ self.assertEqual(f.read(), b(''))
+ f.close()
+
+ self.fakeOn()
+@@ -154,7 +154,7 @@ class TestRemoteFileBuffer(unittest.TestCase, FSTestCa
+ # Check if we wrote everything OK from
+ # previous writing over the remote buffer edge
+ f = self.fs.open('test.txt', 'rb')
+- self.assertEquals(f.read(), contents[:-5] + b('1234567890'))
++ self.assertEqual(f.read(), contents[:-5] + b('1234567890'))
+ f.close()
+
+ self.fakeOff()
+@@ -199,36 +199,36 @@ class TestRemoteFileBuffer(unittest.TestCase, FSTestCa
+
+ f = self.fs.open('test.txt', 'rb+')
+ # Check if we read just 10 characters
+- self.assertEquals(f.read(10), contents[:10])
+- self.assertEquals(f._rfile.tell(), 10)
++ self.assertEqual(f.read(10), contents[:10])
++ self.assertEqual(f._rfile.tell(), 10)
+ # Write garbage to file to mark it as _changed
+ f.write(b('x'))
+ # This should read the rest of file and store file back to again.
+ f.flush()
+ f.seek(0)
+ # Try if we have unocrrupted file locally...
+- self.assertEquals(f.read(), contents[:10] + b('x') + contents[11:])
++ self.assertEqual(f.read(), contents[:10] + b('x') + contents[11:])
+ f.close()
+
+ # And if we have uncorrupted file also on storage
+ f = self.fs.open('test.txt', 'rb')
+- self.assertEquals(f.read(), contents[:10] + b('x') + contents[11:])
++ self.assertEqual(f.read(), contents[:10] + b('x') + contents[11:])
+ f.close()
+
+ # Now try it again, but write garbage behind edge of remote file
+ f = self.fs.open('test.txt', 'rb+')
+- self.assertEquals(f.read(10), contents[:10])
++ self.assertEqual(f.read(10), contents[:10])
+ # Write garbage to file to mark it as _changed
+ f.write(contents2)
+ f.flush()
+ f.seek(0)
+ # Try if we have unocrrupted file locally...
+- self.assertEquals(f.read(), contents[:10] + contents2)
++ self.assertEqual(f.read(), contents[:10] + contents2)
+ f.close()
+
+ # And if we have uncorrupted file also on storage
+ f = self.fs.open('test.txt', 'rb')
+- self.assertEquals(f.read(), contents[:10] + contents2)
++ self.assertEqual(f.read(), contents[:10] + contents2)
+ f.close()
+
+
+--- fs/tests/test_rpcfs.py.orig 2015-04-12 17:24:29 UTC
++++ fs/tests/test_rpcfs.py
+@@ -48,7 +48,7 @@ class TestRPCFS(unittest.TestCase, FSTestCases, Thread
+ while not self.server:
+ try:
+ self.server = self.makeServer(self.temp_fs,("127.0.0.1",port))
+- except socket.error, e:
++ except socket.error as e:
+ if e.args[1] == "Address already in use":
+ port += 1
+ else:
+@@ -63,7 +63,7 @@ class TestRPCFS(unittest.TestCase, FSTestCases, Thread
+ #self.server.serve_forever()
+ while self.serve_more_requests:
+ self.server.handle_request()
+- except Exception, e:
++ except Exception as e:
+ pass
+
+ self.end_event.set()
+@@ -93,7 +93,7 @@ class TestRPCFS(unittest.TestCase, FSTestCases, Thread
+ sock.settimeout(.1)
+ sock.connect(sa)
+ sock.send(b("\n"))
+- except socket.error, e:
++ except socket.error as e:
+ pass
+ finally:
+ if sock is not None:
+--- fs/tests/test_utils.py.orig 2022-03-04 17:14:43 UTC
++++ fs/tests/test_utils.py
+@@ -16,11 +16,11 @@ class TestUtils(unittest.TestCase):
+ fs.setcontents("foo/bar/fruit", b("apple"))
+
+ def _check_fs(self, fs):
+- self.assert_(fs.isfile("f1"))
+- self.assert_(fs.isfile("f2"))
+- self.assert_(fs.isfile("f3"))
+- self.assert_(fs.isdir("foo/bar"))
+- self.assert_(fs.isfile("foo/bar/fruit"))
++ self.assertTrue(fs.isfile("f1"))
++ self.assertTrue(fs.isfile("f2"))
++ self.assertTrue(fs.isfile("f3"))
++ self.assertTrue(fs.isdir("foo/bar"))
++ self.assertTrue(fs.isfile("foo/bar/fruit"))
+ self.assertEqual(fs.getcontents("f1", "rb"), b("file 1"))
+ self.assertEqual(fs.getcontents("f2", "rb"), b("file 2"))
+ self.assertEqual(fs.getcontents("f3", "rb"), b("file 3"))
+@@ -61,7 +61,7 @@ class TestUtils(unittest.TestCase):
+ fs1sub = fs1.makeopendir("from")
+ self._make_fs(fs1sub)
+ utils.movedir((fs1, "from"), (fs2, "copy"))
+- self.assert_(not fs1.exists("from"))
++ self.assertTrue(not fs1.exists("from"))
+ self._check_fs(fs2.opendir("copy"))
+
+ fs1 = TempFS()
+@@ -69,7 +69,7 @@ class TestUtils(unittest.TestCase):
+ fs1sub = fs1.makeopendir("from")
+ self._make_fs(fs1sub)
+ utils.movedir((fs1, "from"), (fs2, "copy"))
+- self.assert_(not fs1.exists("from"))
++ self.assertTrue(not fs1.exists("from"))
+ self._check_fs(fs2.opendir("copy"))
+
+ def test_movedir_root(self):
+@@ -79,7 +79,7 @@ class TestUtils(unittest.TestCase):
+ fs1sub = fs1.makeopendir("from")
+ self._make_fs(fs1sub)
+ utils.movedir((fs1, "from"), fs2)
+- self.assert_(not fs1.exists("from"))
++ self.assertTrue(not fs1.exists("from"))
+ self._check_fs(fs2)
+
+ fs1 = TempFS()
+@@ -87,7 +87,7 @@ class TestUtils(unittest.TestCase):
+ fs1sub = fs1.makeopendir("from")
+ self._make_fs(fs1sub)
+ utils.movedir((fs1, "from"), fs2)
+- self.assert_(not fs1.exists("from"))
++ self.assertTrue(not fs1.exists("from"))
+ self._check_fs(fs2)
+
+ def test_remove_all(self):
+@@ -101,15 +101,15 @@ class TestUtils(unittest.TestCase):
+ fs.setcontents("foo/baz", b("baz"))
+
+ utils.remove_all(fs, "foo/bar")
+- self.assert_(not fs.exists("foo/bar/fruit"))
+- self.assert_(fs.exists("foo/bar"))
+- self.assert_(fs.exists("foo/baz"))
++ self.assertTrue(not fs.exists("foo/bar/fruit"))
++ self.assertTrue(fs.exists("foo/bar"))
++ self.assertTrue(fs.exists("foo/baz"))
+ utils.remove_all(fs, "")
+- self.assert_(not fs.exists("foo/bar/fruit"))
+- self.assert_(not fs.exists("foo/bar/baz"))
+- self.assert_(not fs.exists("foo/baz"))
+- self.assert_(not fs.exists("foo"))
+- self.assert_(not fs.exists("f1"))
+- self.assert_(fs.isdirempty('/'))
++ self.assertTrue(not fs.exists("foo/bar/fruit"))
++ self.assertTrue(not fs.exists("foo/bar/baz"))
++ self.assertTrue(not fs.exists("foo/baz"))
++ self.assertTrue(not fs.exists("foo"))
++ self.assertTrue(not fs.exists("f1"))
++ self.assertTrue(fs.isdirempty('/'))
+
+
+--- fs/tests/test_watch.py.orig 2022-03-04 17:14:43 UTC
++++ fs/tests/test_watch.py
+@@ -71,7 +71,7 @@ class WatcherTestCases:
+ for event in event_list:
+ if isinstance(event,cls):
+ if path is None or event.path == path:
+- for (k,v) in attrs.iteritems():
++ for (k,v) in attrs.items():
+ if getattr(event,k) != v:
+ break
+ else:
+@@ -98,7 +98,7 @@ class WatcherTestCases:
+ self.assertEventOccurred(CREATED,"/hello")
+ self.clearCapturedEvents()
+ old_atime = self.fs.getinfo("hello").get("accessed_time")
+- self.assertEquals(self.fs.getcontents("hello"), b("hello world"))
++ self.assertEqual(self.fs.getcontents("hello"), b("hello world"))
+ if not isinstance(self.watchfs,PollingWatchableFS):
+ # Help it along by updting the atime.
+ # TODO: why is this necessary?
+@@ -113,7 +113,7 @@ class WatcherTestCases:
+ # update it if it's too old, or don't update it at all!
+ # Try to force the issue, wait for it to change, but eventually
+ # give up and bail out.
+- for i in xrange(10):
++ for i in range(10):
+ if self.fs.getinfo("hello").get("accessed_time") != old_atime:
+ if not self.checkEventOccurred(MODIFIED,"/hello"):
+ self.assertEventOccurred(ACCESSED,"/hello")
+@@ -142,7 +142,7 @@ class WatcherTestCases:
+ self.waitForEvents()
+ for evt in events:
+ assert isinstance(evt,MODIFIED)
+- self.assertEquals(evt.path,"/hello")
++ self.assertEqual(evt.path,"/hello")
+
+ def test_watch_single_file_remove(self):
+ self.fs.makedir("testing")
+@@ -153,9 +153,9 @@ class WatcherTestCases:
+ self.waitForEvents()
+ self.fs.remove("testing/hello")
+ self.waitForEvents()
+- self.assertEquals(len(events),1)
++ self.assertEqual(len(events),1)
+ assert isinstance(events[0],REMOVED)
+- self.assertEquals(events[0].path,"/testing/hello")
++ self.assertEqual(events[0].path,"/testing/hello")
+
+ def test_watch_iter_changes(self):
+ changes = iter_changes(self.watchfs)
+@@ -195,9 +195,9 @@ class TestWatchers_TempFS(unittest.TestCase,FSTestCase
+ watchfs = osfs.OSFS(self.fs.root_path)
+ self.watchfs = ensure_watchable(watchfs,poll_interval=0.1)
+ if watch_inotify is not None:
+- self.assertEquals(watchfs,self.watchfs)
++ self.assertEqual(watchfs,self.watchfs)
+ if watch_win32 is not None:
+- self.assertEquals(watchfs,self.watchfs)
++ self.assertEqual(watchfs,self.watchfs)
+
+ def tearDown(self):
+ self.watchfs.close()
+--- fs/tests/test_wrapfs.py.orig 2022-03-04 17:14:43 UTC
++++ fs/tests/test_wrapfs.py
+@@ -26,7 +26,7 @@ class TestWrapFS(unittest.TestCase, FSTestCases, Threa
+ #__test__ = False
+
+ def setUp(self):
+- self.temp_dir = tempfile.mkdtemp(u"fstest")
++ self.temp_dir = tempfile.mkdtemp("fstest")
+ self.fs = wrapfs.WrapFS(osfs.OSFS(self.temp_dir))
+
+ def tearDown(self):
+@@ -41,7 +41,7 @@ from fs.wrapfs.lazyfs import LazyFS
+ class TestLazyFS(unittest.TestCase, FSTestCases, ThreadingTestCases):
+
+ def setUp(self):
+- self.temp_dir = tempfile.mkdtemp(u"fstest")
++ self.temp_dir = tempfile.mkdtemp("fstest")
+ self.fs = LazyFS((osfs.OSFS,(self.temp_dir,)))
+
+ def tearDown(self):
+@@ -63,13 +63,13 @@ class TestLimitSizeFS(TestWrapFS):
+
+ def tearDown(self):
+ remove_all(self.fs, "/")
+- self.assertEquals(self.fs.cur_size,0)
++ self.assertEqual(self.fs.cur_size,0)
+ super(TestLimitSizeFS,self).tearDown()
+ self.fs.close()
+
+ def test_storage_error(self):
+ total_written = 0
+- for i in xrange(1024*2):
++ for i in range(1024*2):
+ try:
+ total_written += 1030
+ self.fs.setcontents("file %i" % i, b("C")*1030)
+@@ -85,11 +85,11 @@ from fs.wrapfs.hidedotfilesfs import HideDotFilesFS
+ class TestHideDotFilesFS(unittest.TestCase):
+
+ def setUp(self):
+- self.temp_dir = tempfile.mkdtemp(u"fstest")
+- open(os.path.join(self.temp_dir, u".dotfile"), 'w').close()
+- open(os.path.join(self.temp_dir, u"regularfile"), 'w').close()
+- os.mkdir(os.path.join(self.temp_dir, u".dotdir"))
+- os.mkdir(os.path.join(self.temp_dir, u"regulardir"))
++ self.temp_dir = tempfile.mkdtemp("fstest")
++ open(os.path.join(self.temp_dir, ".dotfile"), 'w').close()
++ open(os.path.join(self.temp_dir, "regularfile"), 'w').close()
++ os.mkdir(os.path.join(self.temp_dir, ".dotdir"))
++ os.mkdir(os.path.join(self.temp_dir, "regulardir"))
+ self.fs = HideDotFilesFS(osfs.OSFS(self.temp_dir))
+
+ def tearDown(self):
+@@ -97,15 +97,15 @@ class TestHideDotFilesFS(unittest.TestCase):
+ self.fs.close()
+
+ def test_hidden(self):
+- self.assertEquals(len(self.fs.listdir(hidden=False)), 2)
+- self.assertEquals(len(list(self.fs.ilistdir(hidden=False))), 2)
++ self.assertEqual(len(self.fs.listdir(hidden=False)), 2)
++ self.assertEqual(len(list(self.fs.ilistdir(hidden=False))), 2)
+
+ def test_nonhidden(self):
+- self.assertEquals(len(self.fs.listdir(hidden=True)), 4)
+- self.assertEquals(len(list(self.fs.ilistdir(hidden=True))), 4)
++ self.assertEqual(len(self.fs.listdir(hidden=True)), 4)
++ self.assertEqual(len(list(self.fs.ilistdir(hidden=True))), 4)
+
+ def test_default(self):
+- self.assertEquals(len(self.fs.listdir()), 2)
+- self.assertEquals(len(list(self.fs.ilistdir())), 2)
++ self.assertEqual(len(self.fs.listdir()), 2)
++ self.assertEqual(len(list(self.fs.ilistdir())), 2)
+
+
+--- fs/tests/test_xattr.py.orig 2022-03-04 17:14:43 UTC
++++ fs/tests/test_xattr.py
+@@ -37,19 +37,19 @@ class XAttrTestCases:
+
+ def test_list_xattrs(self):
+ def do_list(p):
+- self.assertEquals(sorted(self.fs.listxattrs(p)),[])
++ self.assertEqual(sorted(self.fs.listxattrs(p)),[])
+ self.fs.setxattr(p,"xattr1","value1")
+- self.assertEquals(self.fs.getxattr(p,"xattr1"),"value1")
+- self.assertEquals(sorted(self.fs.listxattrs(p)),["xattr1"])
+- self.assertTrue(isinstance(self.fs.listxattrs(p)[0],unicode))
++ self.assertEqual(self.fs.getxattr(p,"xattr1"),"value1")
++ self.assertEqual(sorted(self.fs.listxattrs(p)),["xattr1"])
++ self.assertTrue(isinstance(self.fs.listxattrs(p)[0],str))
+ self.fs.setxattr(p,"attr2","value2")
+- self.assertEquals(sorted(self.fs.listxattrs(p)),["attr2","xattr1"])
+- self.assertTrue(isinstance(self.fs.listxattrs(p)[0],unicode))
+- self.assertTrue(isinstance(self.fs.listxattrs(p)[1],unicode))
++ self.assertEqual(sorted(self.fs.listxattrs(p)),["attr2","xattr1"])
++ self.assertTrue(isinstance(self.fs.listxattrs(p)[0],str))
++ self.assertTrue(isinstance(self.fs.listxattrs(p)[1],str))
+ self.fs.delxattr(p,"xattr1")
+- self.assertEquals(sorted(self.fs.listxattrs(p)),["attr2"])
++ self.assertEqual(sorted(self.fs.listxattrs(p)),["attr2"])
+ self.fs.delxattr(p,"attr2")
+- self.assertEquals(sorted(self.fs.listxattrs(p)),[])
++ self.assertEqual(sorted(self.fs.listxattrs(p)),[])
+ self.fs.setcontents("test.txt",b("hello"))
+ do_list("test.txt")
+ self.fs.makedir("mystuff")
+@@ -64,16 +64,16 @@ class XAttrTestCases:
+ self.fs.makedir("stuff")
+ self.fs.copy("a.txt","stuff/a.txt")
+ self.assertTrue(self.fs.exists("stuff/a.txt"))
+- self.assertEquals(self.fs.getxattr("stuff/a.txt","myattr"),"myvalue")
+- self.assertEquals(self.fs.getxattr("stuff/a.txt","testattr"),"testvalue")
+- self.assertEquals(self.fs.getxattr("a.txt","myattr"),"myvalue")
+- self.assertEquals(self.fs.getxattr("a.txt","testattr"),"testvalue")
++ self.assertEqual(self.fs.getxattr("stuff/a.txt","myattr"),"myvalue")
++ self.assertEqual(self.fs.getxattr("stuff/a.txt","testattr"),"testvalue")
++ self.assertEqual(self.fs.getxattr("a.txt","myattr"),"myvalue")
++ self.assertEqual(self.fs.getxattr("a.txt","testattr"),"testvalue")
+ self.fs.setxattr("stuff","dirattr","a directory")
+ self.fs.copydir("stuff","stuff2")
+- self.assertEquals(self.fs.getxattr("stuff2/a.txt","myattr"),"myvalue")
+- self.assertEquals(self.fs.getxattr("stuff2/a.txt","testattr"),"testvalue")
+- self.assertEquals(self.fs.getxattr("stuff2","dirattr"),"a directory")
+- self.assertEquals(self.fs.getxattr("stuff","dirattr"),"a directory")
++ self.assertEqual(self.fs.getxattr("stuff2/a.txt","myattr"),"myvalue")
++ self.assertEqual(self.fs.getxattr("stuff2/a.txt","testattr"),"testvalue")
++ self.assertEqual(self.fs.getxattr("stuff2","dirattr"),"a directory")
++ self.assertEqual(self.fs.getxattr("stuff","dirattr"),"a directory")
+
+ def test_move_xattrs(self):
+ self.fs.setcontents("a.txt",b("content"))
+@@ -82,29 +82,29 @@ class XAttrTestCases:
+ self.fs.makedir("stuff")
+ self.fs.move("a.txt","stuff/a.txt")
+ self.assertTrue(self.fs.exists("stuff/a.txt"))
+- self.assertEquals(self.fs.getxattr("stuff/a.txt","myattr"),"myvalue")
+- self.assertEquals(self.fs.getxattr("stuff/a.txt","testattr"),"testvalue")
++ self.assertEqual(self.fs.getxattr("stuff/a.txt","myattr"),"myvalue")
++ self.assertEqual(self.fs.getxattr("stuff/a.txt","testattr"),"testvalue")
+ self.fs.setxattr("stuff","dirattr","a directory")
+ self.fs.movedir("stuff","stuff2")
+- self.assertEquals(self.fs.getxattr("stuff2/a.txt","myattr"),"myvalue")
+- self.assertEquals(self.fs.getxattr("stuff2/a.txt","testattr"),"testvalue")
+- self.assertEquals(self.fs.getxattr("stuff2","dirattr"),"a directory")
++ self.assertEqual(self.fs.getxattr("stuff2/a.txt","myattr"),"myvalue")
++ self.assertEqual(self.fs.getxattr("stuff2/a.txt","testattr"),"testvalue")
++ self.assertEqual(self.fs.getxattr("stuff2","dirattr"),"a directory")
+
+ def test_remove_file(self):
+ def listxattrs(path):
+ return list(self.fs.listxattrs(path))
+ # Check that xattrs aren't preserved after a file is removed
+ self.fs.createfile("myfile")
+- self.assertEquals(listxattrs("myfile"),[])
++ self.assertEqual(listxattrs("myfile"),[])
+ self.fs.setxattr("myfile","testattr","testvalue")
+- self.assertEquals(listxattrs("myfile"),["testattr"])
++ self.assertEqual(listxattrs("myfile"),["testattr"])
+ self.fs.remove("myfile")
+ self.assertRaises(ResourceNotFoundError,listxattrs,"myfile")
+ self.fs.createfile("myfile")
+- self.assertEquals(listxattrs("myfile"),[])
++ self.assertEqual(listxattrs("myfile"),[])
+ self.fs.setxattr("myfile","testattr2","testvalue2")
+- self.assertEquals(listxattrs("myfile"),["testattr2"])
+- self.assertEquals(self.fs.getxattr("myfile","testattr2"),"testvalue2")
++ self.assertEqual(listxattrs("myfile"),["testattr2"])
++ self.assertEqual(self.fs.getxattr("myfile","testattr2"),"testvalue2")
+ # Check that removing a file without xattrs still works
+ self.fs.createfile("myfile2")
+ self.fs.remove("myfile2")
+@@ -114,16 +114,16 @@ class XAttrTestCases:
+ return list(self.fs.listxattrs(path))
+ # Check that xattrs aren't preserved after a dir is removed
+ self.fs.makedir("mydir")
+- self.assertEquals(listxattrs("mydir"),[])
++ self.assertEqual(listxattrs("mydir"),[])
+ self.fs.setxattr("mydir","testattr","testvalue")
+- self.assertEquals(listxattrs("mydir"),["testattr"])
++ self.assertEqual(listxattrs("mydir"),["testattr"])
+ self.fs.removedir("mydir")
+ self.assertRaises(ResourceNotFoundError,listxattrs,"mydir")
+ self.fs.makedir("mydir")
+- self.assertEquals(listxattrs("mydir"),[])
++ self.assertEqual(listxattrs("mydir"),[])
+ self.fs.setxattr("mydir","testattr2","testvalue2")
+- self.assertEquals(listxattrs("mydir"),["testattr2"])
+- self.assertEquals(self.fs.getxattr("mydir","testattr2"),"testvalue2")
++ self.assertEqual(listxattrs("mydir"),["testattr2"])
++ self.assertEqual(self.fs.getxattr("mydir","testattr2"),"testvalue2")
+ # Check that removing a dir without xattrs still works
+ self.fs.makedir("mydir2")
+ self.fs.removedir("mydir2")
+@@ -149,7 +149,7 @@ class TestXAttr_TempFS(unittest.TestCase,FSTestCases,X
+ except AttributeError:
+ td = self.fs.wrapped_fs._temp_dir
+ self.fs.close()
+- self.assert_(not os.path.exists(td))
++ self.assertTrue(not os.path.exists(td))
+
+ def check(self, p):
+ try:
+--- fs/tests/test_zipfs.py.orig 2022-03-04 17:14:43 UTC
++++ fs/tests/test_zipfs.py
+@@ -52,7 +52,7 @@ class TestReadZipFS(unittest.TestCase):
+ return contents
+
+ def check_contents(path, expected):
+- self.assert_(read_contents(path) == expected)
++ self.assertTrue(read_contents(path) == expected)
+ check_contents("a.txt", b("Hello, World!"))
+ check_contents("1.txt", b("1"))
+ check_contents("foo/bar/baz.txt", b("baz"))
+@@ -62,30 +62,30 @@ class TestReadZipFS(unittest.TestCase):
+ return self.fs.getcontents(path, 'rb')
+
+ def check_contents(path, expected):
+- self.assert_(read_contents(path) == expected)
++ self.assertTrue(read_contents(path) == expected)
+ check_contents("a.txt", b("Hello, World!"))
+ check_contents("1.txt", b("1"))
+ check_contents("foo/bar/baz.txt", b("baz"))
+
+ def test_is(self):
+- self.assert_(self.fs.isfile('a.txt'))
+- self.assert_(self.fs.isfile('1.txt'))
+- self.assert_(self.fs.isfile('foo/bar/baz.txt'))
+- self.assert_(self.fs.isdir('foo'))
+- self.assert_(self.fs.isdir('foo/bar'))
+- self.assert_(self.fs.exists('a.txt'))
+- self.assert_(self.fs.exists('1.txt'))
+- self.assert_(self.fs.exists('foo/bar/baz.txt'))
+- self.assert_(self.fs.exists('foo'))
+- self.assert_(self.fs.exists('foo/bar'))
++ self.assertTrue(self.fs.isfile('a.txt'))
++ self.assertTrue(self.fs.isfile('1.txt'))
++ self.assertTrue(self.fs.isfile('foo/bar/baz.txt'))
++ self.assertTrue(self.fs.isdir('foo'))
++ self.assertTrue(self.fs.isdir('foo/bar'))
++ self.assertTrue(self.fs.exists('a.txt'))
++ self.assertTrue(self.fs.exists('1.txt'))
++ self.assertTrue(self.fs.exists('foo/bar/baz.txt'))
++ self.assertTrue(self.fs.exists('foo'))
++ self.assertTrue(self.fs.exists('foo/bar'))
+
+ def test_listdir(self):
+
+ def check_listing(path, expected):
+ dir_list = self.fs.listdir(path)
+- self.assert_(sorted(dir_list) == sorted(expected))
++ self.assertTrue(sorted(dir_list) == sorted(expected))
+ for item in dir_list:
+- self.assert_(isinstance(item, unicode))
++ self.assertTrue(isinstance(item, str))
+ check_listing('/', ['a.txt', '1.txt', 'foo', 'b.txt'])
+ check_listing('foo', ['second.txt', 'bar'])
+ check_listing('foo/bar', ['baz.txt'])
+@@ -108,7 +108,7 @@ class TestWriteZipFS(unittest.TestCase):
+
+ makefile("a.txt", b("Hello, World!"))
+ makefile("b.txt", b("b"))
+- makefile(u"\N{GREEK SMALL LETTER ALPHA}/\N{GREEK CAPITAL LETTER OMEGA}.txt", b("this is the alpha and the omega"))
++ makefile("\N{GREEK SMALL LETTER ALPHA}/\N{GREEK CAPITAL LETTER OMEGA}.txt", b("this is the alpha and the omega"))
+ makefile("foo/bar/baz.txt", b("baz"))
+ makefile("foo/second.txt", b("hai"))
+
+@@ -119,7 +119,7 @@ class TestWriteZipFS(unittest.TestCase):
+
+ def test_valid(self):
+ zf = zipfile.ZipFile(self.temp_filename, "r")
+- self.assert_(zf.testzip() is None)
++ self.assertTrue(zf.testzip() is None)
+ zf.close()
+
+ def test_creation(self):
+@@ -134,7 +134,7 @@ class TestWriteZipFS(unittest.TestCase):
+ check_contents("b.txt", b("b"))
+ check_contents("foo/bar/baz.txt", b("baz"))
+ check_contents("foo/second.txt", b("hai"))
+- check_contents(u"\N{GREEK SMALL LETTER ALPHA}/\N{GREEK CAPITAL LETTER OMEGA}.txt", b("this is the alpha and the omega"))
++ check_contents("\N{GREEK SMALL LETTER ALPHA}/\N{GREEK CAPITAL LETTER OMEGA}.txt", b("this is the alpha and the omega"))
+
+
+ class TestAppendZipFS(TestWriteZipFS):
+@@ -159,7 +159,7 @@ class TestAppendZipFS(TestWriteZipFS):
+ zip_fs = zipfs.ZipFS(self.temp_filename, 'a')
+
+ makefile("foo/bar/baz.txt", b("baz"))
+- makefile(u"\N{GREEK SMALL LETTER ALPHA}/\N{GREEK CAPITAL LETTER OMEGA}.txt", b("this is the alpha and the omega"))
++ makefile("\N{GREEK SMALL LETTER ALPHA}/\N{GREEK CAPITAL LETTER OMEGA}.txt", b("this is the alpha and the omega"))
+ makefile("foo/second.txt", b("hai"))
+
+ zip_fs.close()
+--- fs/utils.py.orig 2015-11-13 23:12:33 UTC
++++ fs/utils.py
+@@ -384,7 +384,7 @@ def isfile(fs,path,info=None):
+ def contains_files(fs, path='/'):
+ """Check if there are any files in the filesystem"""
+ try:
+- iter(fs.walkfiles(path)).next()
++ next(iter(fs.walkfiles(path)))
+ except StopIteration:
+ return False
+ return True
+@@ -426,7 +426,7 @@ def find_duplicates(fs,
+ for path in compare_paths:
+ file_sizes[fs.getsize(path)].append(path)
+
+- size_duplicates = [paths for paths in file_sizes.itervalues() if len(paths) > 1]
++ size_duplicates = [paths for paths in file_sizes.values() if len(paths) > 1]
+
+ signatures = defaultdict(list)
+
+@@ -453,7 +453,7 @@ def find_duplicates(fs,
+ # If 'quick' is True then the signature comparison is adequate (although
+ # it may result in false positives)
+ if quick:
+- for paths in signatures.itervalues():
++ for paths in signatures.values():
+ if len(paths) > 1:
+ yield paths
+ return
+@@ -482,7 +482,7 @@ def find_duplicates(fs,
+ # byte by byte.
+ # All path groups in this loop have the same size and same signature, so are
+ # highly likely to be identical.
+- for paths in signatures.itervalues():
++ for paths in signatures.values():
+
+ while len(paths) > 1:
+
+@@ -535,7 +535,7 @@ def print_fs(fs,
+ if file_out is None:
+ file_out = sys.stdout
+
+- file_encoding = getattr(file_out, 'encoding', u'utf-8') or u'utf-8'
++ file_encoding = getattr(file_out, 'encoding', 'utf-8') or 'utf-8'
+ file_encoding = file_encoding.upper()
+
+ if terminal_colors is None:
+@@ -546,44 +546,44 @@ def print_fs(fs,
+
+ def write(line):
+ if PY3:
+- file_out.write((line + u'\n'))
++ file_out.write((line + '\n'))
+ else:
+- file_out.write((line + u'\n').encode(file_encoding, 'replace'))
++ file_out.write((line + '\n').encode(file_encoding, 'replace'))
+
+ def wrap_prefix(prefix):
+ if not terminal_colors:
+ return prefix
+- return u'\x1b[32m%s\x1b[0m' % prefix
++ return '\x1b[32m%s\x1b[0m' % prefix
+
+ def wrap_dirname(dirname):
+ if not terminal_colors:
+ return dirname
+- return u'\x1b[1;34m%s\x1b[0m' % dirname
++ return '\x1b[1;34m%s\x1b[0m' % dirname
+
+ def wrap_error(msg):
+ if not terminal_colors:
+ return msg
+- return u'\x1b[31m%s\x1b[0m' % msg
++ return '\x1b[31m%s\x1b[0m' % msg
+
+ def wrap_filename(fname):
+ if not terminal_colors:
+ return fname
+- if fname.startswith(u'.'):
+- fname = u'\x1b[33m%s\x1b[0m' % fname
++ if fname.startswith('.'):
++ fname = '\x1b[33m%s\x1b[0m' % fname
+ return fname
+ dircount = [0]
+ filecount = [0]
+ def print_dir(fs, path, levels=[]):
+ if file_encoding == 'UTF-8' and terminal_colors:
+- char_vertline = u'│'
+- char_newnode = u'├'
+- char_line = u'──'
+- char_corner = u'â•°'
++ char_vertline = '│'
++ char_newnode = '├'
++ char_line = '──'
++ char_corner = 'â•°'
+ else:
+- char_vertline = u'|'
+- char_newnode = u'|'
+- char_line = u'--'
+- char_corner = u'`'
++ char_vertline = '|'
++ char_newnode = '|'
++ char_line = '--'
++ char_corner = '`'
+
+ try:
+ dirs = fs.listdir(path, dirs_only=True)
+@@ -593,18 +593,18 @@ def print_fs(fs,
+ files = fs.listdir(path, files_only=True, wildcard=files_wildcard)
+ dir_listing = ( [(True, p) for p in dirs] +
+ [(False, p) for p in files] )
+- except Exception, e:
++ except Exception as e:
+ prefix = ''.join([(char_vertline + ' ', ' ')[last] for last in levels]) + ' '
+- write(wrap_prefix(prefix[:-1] + ' ') + wrap_error(u"unable to retrieve directory list (%s) ..." % str(e)))
++ write(wrap_prefix(prefix[:-1] + ' ') + wrap_error("unable to retrieve directory list (%s) ..." % str(e)))
+ return 0
+
+ if hide_dotfiles:
+ dir_listing = [(isdir, p) for isdir, p in dir_listing if not p.startswith('.')]
+
+ if dirs_first:
+- dir_listing.sort(key = lambda (isdir, p):(not isdir, p.lower()))
++ dir_listing.sort(key = lambda isdir_p:(not isdir_p[0], isdir_p[1].lower()))
+ else:
+- dir_listing.sort(key = lambda (isdir, p):p.lower())
++ dir_listing.sort(key = lambda isdir_p1:isdir_p1[1].lower())
+
+ for i, (is_dir, item) in enumerate(dir_listing):
+ if is_dir:
+@@ -685,9 +685,9 @@ if __name__ == "__main__":
+ t1.tree()
+
+ t2 = TempFS()
+- print t2.listdir()
++ print(t2.listdir())
+ movedir(t1, t2)
+
+- print t2.listdir()
++ print(t2.listdir())
+ t1.tree()
+ t2.tree()
+--- fs/watch.py.orig 2022-03-04 17:14:43 UTC
++++ fs/watch.py
+@@ -32,7 +32,7 @@ an iterator over the change events.
+ import sys
+ import weakref
+ import threading
+-import Queue
++import queue
+ import traceback
+
+ from fs.path import *
+@@ -54,10 +54,10 @@ class EVENT(object):
+ self.path = path
+
+ def __str__(self):
+- return unicode(self).encode("utf8")
++ return str(self).encode("utf8")
+
+ def __unicode__(self):
+- return u"<fs.watch.%s object (path='%s') at %s>" % (self.__class__.__name__,self.path,hex(id(self)))
++ return "<fs.watch.%s object (path='%s') at %s>" % (self.__class__.__name__,self.path,hex(id(self)))
+
+ def clone(self,fs=None,path=None):
+ if fs is None:
+@@ -102,7 +102,7 @@ class MOVED_DST(EVENT):
+ self.source = source
+
+ def __unicode__(self):
+- return u"<fs.watch.%s object (path=%r,src=%r) at %s>" % (self.__class__.__name__,self.path,self.source,hex(id(self)))
++ return "<fs.watch.%s object (path=%r,src=%r) at %s>" % (self.__class__.__name__,self.path,self.source,hex(id(self)))
+
+ def clone(self,fs=None,path=None,source=None):
+ evt = super(MOVED_DST,self).clone(fs,path)
+@@ -120,7 +120,7 @@ class MOVED_SRC(EVENT):
+ self.destination = destination
+
+ def __unicode__(self):
+- return u"<fs.watch.%s object (path=%r,dst=%r) at %s>" % (self.__class__.__name__,self.path,self.destination,hex(id(self)))
++ return "<fs.watch.%s object (path=%r,dst=%r) at %s>" % (self.__class__.__name__,self.path,self.destination,hex(id(self)))
+
+ def clone(self,fs=None,path=None,destination=None):
+ evt = super(MOVED_SRC,self).clone(fs,path)
+@@ -182,7 +182,7 @@ class Watcher(object):
+ try:
+ self.callback(event)
+ except Exception:
+- print >>sys.stderr, "error in FS watcher callback", self.callback
++ print("error in FS watcher callback", self.callback, file=sys.stderr)
+ traceback.print_exc()
+
+
+@@ -213,7 +213,7 @@ class WatchableFSMixin(FS):
+ if isinstance(watcher_or_callback,Watcher):
+ self._watchers[watcher_or_callback.path].remove(watcher_or_callback)
+ else:
+- for watchers in self._watchers.itervalues():
++ for watchers in self._watchers.values():
+ for i,watcher in enumerate(watchers):
+ if watcher.callback is watcher_or_callback:
+ del watchers[i]
+@@ -221,7 +221,7 @@ class WatchableFSMixin(FS):
+
+ def _find_watchers(self,callback):
+ """Find watchers registered with the given callback."""
+- for watchers in self._watchers.itervalues():
++ for watchers in self._watchers.values():
+ for watcher in watchers:
+ if watcher.callback is callback:
+ yield watcher
+@@ -235,7 +235,7 @@ class WatchableFSMixin(FS):
+ if path is None:
+ path = event.path
+ if path is None:
+- for watchers in self._watchers.itervalues():
++ for watchers in self._watchers.values():
+ for watcher in watchers:
+ watcher.handle_event(event)
+ else:
+@@ -443,7 +443,7 @@ class WatchableFS(WatchableFSMixin,WrapFS):
+
+ def _post_move(self,src,dst,data):
+ (src_paths,dst_paths) = data
+- for src_path,isdir in sorted(src_paths.items(),reverse=True):
++ for src_path,isdir in sorted(list(src_paths.items()),reverse=True):
+ path = pathjoin(src,src_path)
+ self.notify_watchers(REMOVED,path)
+
+@@ -554,7 +554,7 @@ class PollingWatchableFS(WatchableFS):
+ else:
+ was_accessed = False
+ was_modified = False
+- for (k,v) in new_info.iteritems():
++ for (k,v) in new_info.items():
+ if k not in old_info:
+ was_modified = True
+ break
+@@ -612,7 +612,7 @@ class iter_changes(object):
+
+ def __init__(self,fs=None,path="/",events=None,**kwds):
+ self.closed = False
+- self._queue = Queue.Queue()
++ self._queue = queue.Queue()
+ self._watching = set()
+ if fs is not None:
+ self.add_watcher(fs,path,events,**kwds)
+@@ -628,7 +628,7 @@ class iter_changes(object):
+ raise StopIteration
+ try:
+ event = self._queue.get(timeout=timeout)
+- except Queue.Empty:
++ except queue.Empty:
+ raise StopIteration
+ if event is None:
+ raise StopIteration
+--- fs/wrapfs/__init__.py.orig 2015-04-12 17:24:29 UTC
++++ fs/wrapfs/__init__.py
+@@ -32,12 +32,12 @@ def rewrite_errors(func):
+ def wrapper(self,*args,**kwds):
+ try:
+ return func(self,*args,**kwds)
+- except ResourceError, e:
++ except ResourceError as e:
+ (exc_type,exc_inst,tb) = sys.exc_info()
+ try:
+ e.path = self._decode(e.path)
+ except (AttributeError, ValueError, TypeError):
+- raise e, None, tb
++ raise e.with_traceback(tb)
+ raise
+ return wrapper
+
+@@ -119,7 +119,7 @@ class WrapFS(FS):
+ return (mode, mode)
+
+ def __unicode__(self):
+- return u"<%s: %s>" % (self.__class__.__name__,self.wrapped_fs,)
++ return "<%s: %s>" % (self.__class__.__name__,self.wrapped_fs,)
+
+ #def __str__(self):
+ # return unicode(self).encode(sys.getdefaultencoding(),"replace")
+--- fs/wrapfs/debugfs.py.orig 2022-03-04 17:14:43 UTC
++++ fs/wrapfs/debugfs.py
+@@ -66,7 +66,7 @@ class DebugFS(object):
+ logger.log(level, message)
+
+ def __parse_param(self, value):
+- if isinstance(value, basestring):
++ if isinstance(value, str):
+ if len(value) > 60:
+ value = "%s ... (length %d)" % (repr(value[:60]), len(value))
+ else:
+@@ -75,7 +75,7 @@ class DebugFS(object):
+ value = "%s (%d items)" % (repr(value[:3]), len(value))
+ elif isinstance(value, dict):
+ items = {}
+- for k, v in value.items()[:3]:
++ for k, v in list(value.items())[:3]:
+ items[k] = v
+ value = "%s (%d items)" % (repr(items), len(value))
+ else:
+@@ -84,7 +84,7 @@ class DebugFS(object):
+
+ def __parse_args(self, *arguments, **kwargs):
+ args = [self.__parse_param(a) for a in arguments]
+- for k, v in kwargs.items():
++ for k, v in list(kwargs.items()):
+ args.append("%s=%s" % (k, self.__parse_param(v)))
+
+ args = ','.join(args)
+@@ -105,10 +105,10 @@ class DebugFS(object):
+
+ try:
+ attr = getattr(self.__wrapped_fs, key)
+- except AttributeError, e:
++ except AttributeError as e:
+ self.__log(DEBUG, "Asking for not implemented method %s" % key)
+ raise e
+- except Exception, e:
++ except Exception as e:
+ self.__log(CRITICAL, "Exception %s: %s" % \
+ (e.__class__.__name__, str(e)))
+ raise e
+@@ -122,19 +122,19 @@ class DebugFS(object):
+ try:
+ value = attr(*args, **kwargs)
+ self.__report("Call method", key, value, *args, **kwargs)
+- except FSError, e:
++ except FSError as e:
+ self.__log(ERROR, "Call method %s%s -> Exception %s: %s" % \
+ (key, self.__parse_args(*args, **kwargs), \
+ e.__class__.__name__, str(e)))
+ (exc_type,exc_inst,tb) = sys.exc_info()
+- raise e, None, tb
+- except Exception, e:
++ raise e.with_traceback(tb)
++ except Exception as e:
+ self.__log(CRITICAL,
+ "Call method %s%s -> Non-FS exception %s: %s" %\
+ (key, self.__parse_args(*args, **kwargs), \
+ e.__class__.__name__, str(e)))
+ (exc_type,exc_inst,tb) = sys.exc_info()
+- raise e, None, tb
++ raise e.with_traceback(tb)
+ return value
+
+ if self.__verbose:
+--- fs/wrapfs/hidedotfilesfs.py.orig 2022-03-04 17:14:43 UTC
++++ fs/wrapfs/hidedotfilesfs.py
+@@ -87,7 +87,7 @@ class HideDotFilesFS(WrapFS):
+ path = normpath(path)
+ iter_dir = iter(self.listdir(path,hidden=True))
+ try:
+- iter_dir.next()
++ next(iter_dir)
+ except StopIteration:
+ return True
+ return False
+--- fs/wrapfs/lazyfs.py.orig 2022-03-04 17:14:43 UTC
++++ fs/wrapfs/lazyfs.py
+@@ -39,14 +39,14 @@ class LazyFS(WrapFS):
+ # It appears that python2.5 has trouble printing out
+ # classes that define a __unicode__ method.
+ try:
+- return u"<LazyFS: %s>" % (self._fsclass,)
++ return "<LazyFS: %s>" % (self._fsclass,)
+ except TypeError:
+ try:
+- return u"<LazyFS: %s>" % (self._fsclass.__name__,)
++ return "<LazyFS: %s>" % (self._fsclass.__name__,)
+ except AttributeError:
+- return u"<LazyFS: <unprintable>>"
++ return "<LazyFS: <unprintable>>"
+ else:
+- return u"<LazyFS: %s>" % (wrapped_fs,)
++ return "<LazyFS: %s>" % (wrapped_fs,)
+
+ def __getstate__(self):
+ state = super(LazyFS,self).__getstate__()
+--- fs/wrapfs/limitsizefs.py.orig 2022-03-04 17:14:43 UTC
++++ fs/wrapfs/limitsizefs.py
+@@ -9,7 +9,7 @@ total size of files stored in the wrapped FS.
+
+ """
+
+-from __future__ import with_statement
++
+
+ from fs.errors import *
+ from fs.path import *
+--- fs/wrapfs/subfs.py.orig 2022-03-04 17:14:43 UTC
++++ fs/wrapfs/subfs.py
+@@ -34,7 +34,7 @@ class SubFS(WrapFS):
+ return '<SubFS: %s/%s>' % (self.wrapped_fs, self.sub_dir.lstrip('/'))
+
+ def __unicode__(self):
+- return u'<SubFS: %s/%s>' % (self.wrapped_fs, self.sub_dir.lstrip('/'))
++ return '<SubFS: %s/%s>' % (self.wrapped_fs, self.sub_dir.lstrip('/'))
+
+ def __repr__(self):
+ return "SubFS(%r, %r)" % (self.wrapped_fs, self.sub_dir)
+--- fs/xattrs.py.orig 2015-04-12 17:24:29 UTC
++++ fs/xattrs.py
+@@ -23,7 +23,7 @@ if it has native xattr support, and return a wrapped v
+
+ import sys
+ try:
+- import cPickle as pickle
++ import pickle as pickle
+ except ImportError:
+ import pickle
+
+@@ -104,7 +104,7 @@ class SimulateXAttr(WrapFS):
+ """Set an extended attribute on the given path."""
+ if not self.exists(path):
+ raise ResourceNotFoundError(path)
+- key = unicode(key)
++ key = str(key)
+ attrs = self._get_attr_dict(path)
+ attrs[key] = str(value)
+ self._set_attr_dict(path, attrs)
+@@ -133,7 +133,7 @@ class SimulateXAttr(WrapFS):
+ """List all the extended attribute keys set on the given path."""
+ if not self.exists(path):
+ raise ResourceNotFoundError(path)
+- return self._get_attr_dict(path).keys()
++ return list(self._get_attr_dict(path).keys())
+
+ def _encode(self,path):
+ """Prevent requests for operations on .xattr files."""
+@@ -189,7 +189,7 @@ class SimulateXAttr(WrapFS):
+ d_attr_file = self._get_attr_path(dst)
+ try:
+ self.wrapped_fs.copy(s_attr_file,d_attr_file,overwrite=True)
+- except ResourceNotFoundError,e:
++ except ResourceNotFoundError as e:
+ pass
+
+ def move(self,src,dst,**kwds):
+--- fs/zipfs.py.orig 2015-04-12 17:25:37 UTC
++++ fs/zipfs.py
+@@ -16,9 +16,9 @@ from fs.filelike import StringIO
+ from fs import iotools
+
+ from zipfile import ZipFile, ZIP_DEFLATED, ZIP_STORED, BadZipfile, LargeZipFile
+-from memoryfs import MemoryFS
++from .memoryfs import MemoryFS
+
+-import tempfs
++from . import tempfs
+
+ from six import PY3
+
+@@ -74,7 +74,7 @@ class _ExceptionProxy(object):
+ def __setattr__(self, name, value):
+ raise ValueError("Zip file has been closed")
+
+- def __nonzero__(self):
++ def __bool__(self):
+ return False
+
+
+@@ -117,7 +117,7 @@ class ZipFS(FS):
+ self.zip_mode = mode
+ self.encoding = encoding
+
+- if isinstance(zip_file, basestring):
++ if isinstance(zip_file, str):
+ zip_file = os.path.expanduser(os.path.expandvars(zip_file))
+ zip_file = os.path.normpath(os.path.abspath(zip_file))
+ self._zip_file_string = True
+@@ -126,10 +126,10 @@ class ZipFS(FS):
+
+ try:
+ self.zf = ZipFile(zip_file, mode, compression_type, allow_zip_64)
+- except BadZipfile, bzf:
++ except BadZipfile as bzf:
+ raise ZipOpenError("Not a zip file or corrupt (%s)" % str(zip_file),
+ details=bzf)
+- except IOError, ioe:
++ except IOError as ioe:
+ if str(ioe).startswith('[Errno 22] Invalid argument'):
+ raise ZipOpenError("Not a zip file or corrupt (%s)" % str(zip_file),
+ details=ioe)
+@@ -151,7 +151,7 @@ class ZipFS(FS):
+ return "<ZipFS: %s>" % self.zip_path
+
+ def __unicode__(self):
+- return u"<ZipFS: %s>" % self.zip_path
++ return "<ZipFS: %s>" % self.zip_path
+
+ def _decode_path(self, path):
+ if PY3:
+@@ -280,7 +280,7 @@ class ZipFS(FS):
+ try:
+ zi = self.zf.getinfo(self._encode_path(path))
+ zinfo = dict((attrib, getattr(zi, attrib)) for attrib in dir(zi) if not attrib.startswith('_'))
+- for k, v in zinfo.iteritems():
++ for k, v in zinfo.items():
+ if callable(v):
+ zinfo[k] = v()
+ except KeyError:
+--- setup.py.orig 2015-11-14 11:44:01 UTC
++++ setup.py
+@@ -38,8 +38,6 @@ with open('README.txt', 'r') as f:
+
+
+ extra = {}
+-if PY3:
+- extra["use_2to3"] = True
+
+ setup(install_requires=['setuptools', 'six'],
+ name='fs',
diff --git a/filesystems/py-fs/pkg-descr b/filesystems/py-fs/pkg-descr
new file mode 100644
index 000000000000..712dede347d6
--- /dev/null
+++ b/filesystems/py-fs/pkg-descr
@@ -0,0 +1,8 @@
+Pyfilesystem is a Python module that provides a simplified common interface to
+many types of filesystem. Filesystems exposed via Pyfilesystem can also be
+served over the network, or 'mounted' on the native filesystem.
+
+Pyfilesystem simplifies working directories and paths, even if you only intend
+to work with local files. Differences in path formats between platforms are
+abstracted away, and you can write code that sand-boxes any changes to a given
+directory.
diff --git a/filesystems/py-fs2/Makefile b/filesystems/py-fs2/Makefile
new file mode 100644
index 000000000000..b6f702cdbce5
--- /dev/null
+++ b/filesystems/py-fs2/Makefile
@@ -0,0 +1,26 @@
+PORTNAME= fs
+PORTVERSION= 2.4.16
+CATEGORIES= filesystems devel
+MASTER_SITES= PYPI
+PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
+PKGNAMESUFFIX= 2
+
+MAINTAINER= bofh@FreeBSD.org
+COMMENT= Python Filesystem abstraction layer, version 2.x
+WWW= https://www.pyfilesystem.org/
+
+LICENSE= MIT
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}appdirs>=1.4.3:devel/py-appdirs@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}pytz>0:devel/py-pytz@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}six>=1.10:devel/py-six@${PY_FLAVOR}
+
+USES= python
+USE_PYTHON= autoplist concurrent distutils
+
+NO_ARCH= yes
+
+PORTSCOUT= limit:^2\.
+
+.include <bsd.port.mk>
diff --git a/filesystems/py-fs2/distinfo b/filesystems/py-fs2/distinfo
new file mode 100644
index 000000000000..0aee290aa7cd
--- /dev/null
+++ b/filesystems/py-fs2/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1681495093
+SHA256 (fs-2.4.16.tar.gz) = ae97c7d51213f4b70b6a958292530289090de3a7e15841e108fbe144f069d313
+SIZE (fs-2.4.16.tar.gz) = 187441
diff --git a/filesystems/py-fs2/pkg-descr b/filesystems/py-fs2/pkg-descr
new file mode 100644
index 000000000000..6807f41b753b
--- /dev/null
+++ b/filesystems/py-fs2/pkg-descr
@@ -0,0 +1,5 @@
+Filesystem Abstraction for Python. Work with files and directories in archives,
+memory, the cloud etc. as easily as your local drive. Write code now, decide
+later where the data will be stored; unit test without writing real files;
+upload files to the cloud without learning a new API; sandbox your file writing
+code; etc.
diff --git a/filesystems/py-fsspec-xrootd/Makefile b/filesystems/py-fsspec-xrootd/Makefile
new file mode 100644
index 000000000000..b121c44958f9
--- /dev/null
+++ b/filesystems/py-fsspec-xrootd/Makefile
@@ -0,0 +1,26 @@
+PORTNAME= fsspec-xrootd
+PORTVERSION= 0.4.0
+CATEGORIES= filesystems devel python
+MASTER_SITES= PYPI
+PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
+DISTNAME= fsspec_xrootd-${PORTVERSION}
+
+MAINTAINER= sunpoet@FreeBSD.org
+COMMENT= XRootD implementation for fsspec
+WWW= https://coffeateam.github.io/fsspec-xrootd/ \
+ https://github.com/CoffeaTeam/fsspec-xrootd
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}setuptools>=42:devel/py-setuptools@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}setuptools-scm>=3.4:devel/py-setuptools-scm@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR}
+RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}fsspec>=0:filesystems/py-fsspec@${PY_FLAVOR}
+
+USES= python
+USE_PYTHON= autoplist concurrent pep517
+
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/filesystems/py-fsspec-xrootd/distinfo b/filesystems/py-fsspec-xrootd/distinfo
new file mode 100644
index 000000000000..2d8ab0f7585e
--- /dev/null
+++ b/filesystems/py-fsspec-xrootd/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1725559717
+SHA256 (fsspec_xrootd-0.4.0.tar.gz) = d7f124430d26ab9139d33bc50fa8abfde3624db5dcaa5c18f56af9bf17f16f13
+SIZE (fsspec_xrootd-0.4.0.tar.gz) = 23442
diff --git a/filesystems/py-fsspec-xrootd/pkg-descr b/filesystems/py-fsspec-xrootd/pkg-descr
new file mode 100644
index 000000000000..cd72b8510731
--- /dev/null
+++ b/filesystems/py-fsspec-xrootd/pkg-descr
@@ -0,0 +1,3 @@
+To allow fsspec to use XRootD accessible storage systems, install fsspec-xrootd
+alongside fsspec and have easy access to files stored on XRootD servers. Once
+installed, fsspec will be able to work with urls with the 'root' protocol.
diff --git a/filesystems/py-fsspec/Makefile b/filesystems/py-fsspec/Makefile
new file mode 100644
index 000000000000..13612b3d29ca
--- /dev/null
+++ b/filesystems/py-fsspec/Makefile
@@ -0,0 +1,28 @@
+PORTNAME= fsspec
+PORTVERSION= 2024.10.0
+CATEGORIES= filesystems devel python
+MASTER_SITES= PYPI
+PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
+
+MAINTAINER= sunpoet@FreeBSD.org
+COMMENT= File-system specification
+WWW= https://filesystem-spec.readthedocs.io/en/latest/ \
+ https://github.com/fsspec/filesystem_spec
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}hatch-vcs>=0:devel/py-hatch-vcs@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}hatchling>=0:devel/py-hatchling@${PY_FLAVOR}
+
+USES= python
+USE_PYTHON= autoplist concurrent pep517
+
+NO_ARCH= yes
+
+OPTIONS_DEFINE= GITHUB
+GITHUB_DESC= GitHub file system
+
+GITHUB_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}requests>=0:www/py-requests@${PY_FLAVOR}
+
+.include <bsd.port.mk>
diff --git a/filesystems/py-fsspec/distinfo b/filesystems/py-fsspec/distinfo
new file mode 100644
index 000000000000..09aee0a26075
--- /dev/null
+++ b/filesystems/py-fsspec/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1729653348
+SHA256 (fsspec-2024.10.0.tar.gz) = eda2d8a4116d4f2429db8550f2457da57279247dd930bb12f821b58391359493
+SIZE (fsspec-2024.10.0.tar.gz) = 286853
diff --git a/filesystems/py-fsspec/pkg-descr b/filesystems/py-fsspec/pkg-descr
new file mode 100644
index 000000000000..7d23085ccff9
--- /dev/null
+++ b/filesystems/py-fsspec/pkg-descr
@@ -0,0 +1,3 @@
+Filesystem Spec is a project to unify various projects and classes to work with
+remote filesystems and file-system-like abstractions using a standard pythonic
+interface.
diff --git a/filesystems/py-fusepy/Makefile b/filesystems/py-fusepy/Makefile
new file mode 100644
index 000000000000..7161a1b1fe0d
--- /dev/null
+++ b/filesystems/py-fusepy/Makefile
@@ -0,0 +1,24 @@
+PORTNAME= fusepy
+PORTVERSION= 3.0.1
+PORTREVISION= 1
+CATEGORIES= filesystems devel python
+MASTER_SITES= PYPI
+PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
+
+MAINTAINER= sunpoet@FreeBSD.org
+COMMENT= Simple ctypes bindings for FUSE
+WWW= https://github.com/fusepy/fusepy
+
+LICENSE= ISCL
+
+BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}setuptools>=0:devel/py-setuptools@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR}
+
+USES= fuse python
+USE_PYTHON= autoplist concurrent pep517
+
+NO_ARCH= yes
+
+CONFLICTS_INSTALL= ${PYTHON_PKGNAMEPREFIX}fusefs # fuse.py
+
+.include <bsd.port.mk>
diff --git a/filesystems/py-fusepy/distinfo b/filesystems/py-fusepy/distinfo
new file mode 100644
index 000000000000..ef6c8fc3299e
--- /dev/null
+++ b/filesystems/py-fusepy/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1537143232
+SHA256 (fusepy-3.0.1.tar.gz) = 72ff783ec2f43de3ab394e3f7457605bf04c8cf288a2f4068b4cde141d4ee6bd
+SIZE (fusepy-3.0.1.tar.gz) = 11519
diff --git a/filesystems/py-fusepy/pkg-descr b/filesystems/py-fusepy/pkg-descr
new file mode 100644
index 000000000000..898b2d3e9be3
--- /dev/null
+++ b/filesystems/py-fusepy/pkg-descr
@@ -0,0 +1,2 @@
+fusepy is a Python module that provides a simple interface to FUSE and MacFUSE.
+It's just one file and is implemented using ctypes.
diff --git a/filesystems/py-gcsfs/Makefile b/filesystems/py-gcsfs/Makefile
new file mode 100644
index 000000000000..b02e89e48711
--- /dev/null
+++ b/filesystems/py-gcsfs/Makefile
@@ -0,0 +1,37 @@
+PORTNAME= gcsfs
+PORTVERSION= 2024.10.0
+CATEGORIES= filesystems devel python
+MASTER_SITES= PYPI
+PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
+
+MAINTAINER= sunpoet@FreeBSD.org
+COMMENT= Convenient Filesystem interface over GCS
+WWW= https://gcsfs.readthedocs.io/en/latest/ \
+ https://github.com/fsspec/gcsfs
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/LICENSE.txt
+
+BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}setuptools>=0:devel/py-setuptools@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR}
+RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}aiohttp>=0:www/py-aiohttp@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}decorator>=4.1.2:devel/py-decorator@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}fsspec>=${PORTVERSION}<${PORTVERSION}_99:filesystems/py-fsspec@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}google-auth-oauthlib>=0:security/py-google-auth-oauthlib@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}google-auth>=1.2:security/py-google-auth@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}google-cloud-storage>=0:www/py-google-cloud-storage@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}requests>=0:www/py-requests@${PY_FLAVOR}
+
+USES= python
+USE_PYTHON= autoplist concurrent pep517
+
+NO_ARCH= yes
+
+OPTIONS_DEFINE= GCSFUSE CRC
+GCSFUSE_DESC= Fuse support
+CRC_DESC= CRC support
+
+GCSFUSE_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}crcmod>=0:devel/py-crcmod@${PY_FLAVOR}
+CRC_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}fusepy>=0:filesystems/py-fusepy@${PY_FLAVOR}
+
+.include <bsd.port.mk>
diff --git a/filesystems/py-gcsfs/distinfo b/filesystems/py-gcsfs/distinfo
new file mode 100644
index 000000000000..e0a97da9c6a0
--- /dev/null
+++ b/filesystems/py-gcsfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1729653350
+SHA256 (gcsfs-2024.10.0.tar.gz) = 5df54cfe568e8fdeea5aafa7fed695cdc69a9a674e991ca8c1ce634f5df1d314
+SIZE (gcsfs-2024.10.0.tar.gz) = 79588
diff --git a/filesystems/py-gcsfs/pkg-descr b/filesystems/py-gcsfs/pkg-descr
new file mode 100644
index 000000000000..781572993acc
--- /dev/null
+++ b/filesystems/py-gcsfs/pkg-descr
@@ -0,0 +1 @@
+Pythonic file-system for Google Cloud Storage
diff --git a/filesystems/py-libzfs/Makefile b/filesystems/py-libzfs/Makefile
new file mode 100644
index 000000000000..c4bc9fd0007b
--- /dev/null
+++ b/filesystems/py-libzfs/Makefile
@@ -0,0 +1,35 @@
+PORTNAME= libzfs
+PORTVERSION= 1.1.2023020700
+CATEGORIES= filesystems devel python
+PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
+
+MAINTAINER= freqlabs@FreeBSD.org
+COMMENT= Python libzfs bindings
+WWW= https://github.com/freenas/py-libzfs
+
+LICENSE= BSD2CLAUSE
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+USE_GITHUB= yes
+GH_ACCOUNT= truenas
+GH_PROJECT= py-libzfs
+GH_TAGNAME= c1bd4a0
+
+HAS_CONFIGURE= yes
+USES= compiler:c11 python
+USE_PYTHON= autoplist distutils cython
+
+CONFIGURE_ENV= freebsd_src=${SRC_BASE}
+MAKE_ENV= freebsd_src=${SRC_BASE}
+
+.include <bsd.port.options.mk>
+
+.if ${OPSYS} == FreeBSD && (${OSVERSION} >= 1500018 || (${OSVERSION} >= 1401000 && ${OSVERSION} < 1500000))
+EXTRA_PATCHES+= ${FILESDIR}/extra-zpool-add.patch
+.endif
+
+.if !exists(${SRC_BASE}/sys/Makefile)
+IGNORE= requires kernel source files in ${SRC_BASE}
+.endif
+
+.include <bsd.port.mk>
diff --git a/filesystems/py-libzfs/distinfo b/filesystems/py-libzfs/distinfo
new file mode 100644
index 000000000000..3ae8f5fa9a4d
--- /dev/null
+++ b/filesystems/py-libzfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1675808317
+SHA256 (truenas-py-libzfs-1.1.2023020700-c1bd4a0_GH0.tar.gz) = 23b2d6e1b6ed78be2d12068f9b1b0b01270afaaf0f017817a5fb109d358aa818
+SIZE (truenas-py-libzfs-1.1.2023020700-c1bd4a0_GH0.tar.gz) = 99656
diff --git a/filesystems/py-libzfs/files/extra-zpool-add.patch b/filesystems/py-libzfs/files/extra-zpool-add.patch
new file mode 100644
index 000000000000..7d0688ca4f13
--- /dev/null
+++ b/filesystems/py-libzfs/files/extra-zpool-add.patch
@@ -0,0 +1,44 @@
+From b5ffe1f1d6097df6e2f5cc6dd3c968872ec60804 Mon Sep 17 00:00:00 2001
+From: Ameer Hamza <ahamza@ixsystems.com>
+Date: Tue, 2 Apr 2024 23:56:55 +0500
+Subject: [PATCH] zpool_add API changed in upstream zfs master
+
+---
+ libzfs.pyx | 5 +++--
+ pxd/libzfs.pxd | 2 +-
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/libzfs.pyx b/libzfs.pyx
+index a59fca8..71efa96 100644
+--- a/libzfs.pyx
++++ ./libzfs.pyx
+@@ -3175,13 +3175,14 @@ cdef class ZFSPool(object):
+ hopts = self.root.generate_history_opts(fsopts, '-o')
+ self.root.write_history('zfs create', hopts, name)
+
+- def attach_vdevs(self, vdevs_tree):
++ def attach_vdevs(self, vdevs_tree, check_ashift=0):
+ cdef const char *command = 'zpool add'
+ cdef ZFSVdev vd = self.root.make_vdev_tree(vdevs_tree, {'ashift': self.properties['ashift'].parsed})
+ cdef int ret
++ cdef boolean_t ashift = check_ashift
+
+ with nogil:
+- ret = libzfs.zpool_add(self.handle, vd.nvlist.handle)
++ ret = libzfs.zpool_add(self.handle, vd.nvlist.handle, ashift)
+
+ if ret != 0:
+ raise self.root.get_error()
+diff --git a/pxd/libzfs.pxd b/pxd/libzfs.pxd
+index 3ab9374..6afa275 100644
+--- a/pxd/libzfs.pxd
++++ ./pxd/libzfs.pxd
+@@ -228,7 +228,7 @@ cdef extern from "libzfs.h" nogil:
+ extern int zpool_create(libzfs_handle_t *, const char *, nvpair.nvlist_t *,
+ nvpair.nvlist_t *, nvpair.nvlist_t *)
+ extern int zpool_destroy(zpool_handle_t *, const char *)
+- extern int zpool_add(zpool_handle_t *, nvpair.nvlist_t *)
++ extern int zpool_add(zpool_handle_t *, nvpair.nvlist_t *, boolean_t)
+
+ IF HAVE_ZPOOL_SCAN == 3:
+ extern int zpool_scan(zpool_handle_t *, zfs.pool_scan_func_t, zfs.pool_scrub_cmd_t)
diff --git a/filesystems/py-libzfs/pkg-descr b/filesystems/py-libzfs/pkg-descr
new file mode 100644
index 000000000000..51a23404441a
--- /dev/null
+++ b/filesystems/py-libzfs/pkg-descr
@@ -0,0 +1 @@
+Python libzfs bindings using cython.
diff --git a/filesystems/py-llfuse/Makefile b/filesystems/py-llfuse/Makefile
new file mode 100644
index 000000000000..2b69e3173c74
--- /dev/null
+++ b/filesystems/py-llfuse/Makefile
@@ -0,0 +1,26 @@
+PORTNAME= llfuse
+PORTVERSION= 1.5.1
+CATEGORIES= filesystems devel python
+MASTER_SITES= PYPI \
+ https://github.com/python-llfuse/python-llfuse/releases/download/release-${PORTVERSION}/
+PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
+
+MAINTAINER= sunpoet@FreeBSD.org
+COMMENT= Python bindings for the low-level FUSE API
+WWW= https://github.com/python-llfuse/python-llfuse
+
+LICENSE= LGPL20+
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}setuptools>=0:devel/py-setuptools@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR}
+
+USES= compiler:c++11-lang fuse pkgconfig python
+USE_PYTHON= autoplist concurrent cython pep517 pytest
+
+TEST_ENV= PYTHONPATH=${STAGEDIR}${PYTHON_SITELIBDIR}
+
+post-install:
+ ${FIND} ${STAGEDIR}${PYTHON_SITELIBDIR} -name '*.so' -exec ${STRIP_CMD} {} +
+
+.include <bsd.port.mk>
diff --git a/filesystems/py-llfuse/distinfo b/filesystems/py-llfuse/distinfo
new file mode 100644
index 000000000000..30da47d20723
--- /dev/null
+++ b/filesystems/py-llfuse/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1725559735
+SHA256 (llfuse-1.5.1.tar.gz) = 7c9be52289cf647e3d735104531cc23a1a89fd1be3a621613a1cc0991f1b2699
+SIZE (llfuse-1.5.1.tar.gz) = 959557
diff --git a/filesystems/py-llfuse/pkg-descr b/filesystems/py-llfuse/pkg-descr
new file mode 100644
index 000000000000..b6da83cc7e55
--- /dev/null
+++ b/filesystems/py-llfuse/pkg-descr
@@ -0,0 +1,3 @@
+Python-LLFUSE is a set of Python bindings for the low level FUSE API. It
+requires at least FUSE 2.8.0 and supports both Python 2.x and 3.x. It runs
+under Linux, OS-X, FreeBSD and NetBSD.
diff --git a/filesystems/py-prometheus-zfs/Makefile b/filesystems/py-prometheus-zfs/Makefile
new file mode 100644
index 000000000000..b25e5527cb09
--- /dev/null
+++ b/filesystems/py-prometheus-zfs/Makefile
@@ -0,0 +1,33 @@
+PORTNAME= prometheus-zfs
+DISTVERSIONPREFIX= v
+DISTVERSION= 1.0.4
+CATEGORIES= filesystems sysutils python
+PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
+
+MAINTAINER= 0mp@FreeBSD.org
+COMMENT= Prometheus exporter for ZFS statistics using py-libzfs
+WWW= https://github.com/matusnovak/prometheus-zfs
+
+LICENSE= UNLICENSE
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}libzfs>=0:filesystems/py-libzfs@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}prometheus-client>=0:net-mgmt/py-prometheus-client@${PY_FLAVOR}
+
+USES= python shebangfix
+USE_GITHUB= yes
+GH_ACCOUNT= matusnovak
+USE_RC_SUBR= zfsprom
+SHEBANG_FILES= zfsprom.py
+
+NO_ARCH= yes
+NO_BUILD= yes
+
+SUB_LIST= PYTHON_CMD=${PYTHON_CMD}
+
+PLIST_FILES= sbin/zfsprom.py
+
+do-install:
+ ${INSTALL_SCRIPT} ${WRKSRC}/zfsprom.py ${STAGEDIR}${PREFIX}/sbin
+
+.include <bsd.port.mk>
diff --git a/filesystems/py-prometheus-zfs/distinfo b/filesystems/py-prometheus-zfs/distinfo
new file mode 100644
index 000000000000..89dbf2a5a11c
--- /dev/null
+++ b/filesystems/py-prometheus-zfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1642968848
+SHA256 (matusnovak-prometheus-zfs-v1.0.4_GH0.tar.gz) = aa005e5df3b8dfd3e4944a09cf7dbb21fe4150653a5e6b95681283ec86e6df25
+SIZE (matusnovak-prometheus-zfs-v1.0.4_GH0.tar.gz) = 3933
diff --git a/filesystems/py-prometheus-zfs/files/zfsprom.in b/filesystems/py-prometheus-zfs/files/zfsprom.in
new file mode 100644
index 000000000000..f4e3fbfc2e49
--- /dev/null
+++ b/filesystems/py-prometheus-zfs/files/zfsprom.in
@@ -0,0 +1,32 @@
+#! /bin/sh -
+#
+# SPDX-License-Identifier: (BSD-2-Clause or Unlicense)
+#
+# Copyright (c) 2021 Mateusz Piotrowski <0mp@FreeBSD.org>
+#
+
+# Add the following lines to rc.conf(5) to configure the zfsprom service:
+#
+# zfsprom_enable (bool): Set to "YES" to enable the service.
+# Default: "NO".
+
+# PROVIDE: zfsprom
+# REQUIRE: DAEMON
+# KEYWORD: shutdown
+
+. /etc/rc.subr
+
+name="zfsprom"
+rcvar="zfsprom_enable"
+
+load_rc_config "${name}"
+
+: "${zfsprom_enable:=NO}"
+
+pidfile="/var/run/${name}.pid"
+procname="%%PREFIX%%/sbin/zfsprom.py"
+command_interpreter="%%PYTHON_CMD%%"
+command="/usr/sbin/daemon"
+command_args="-o /var/log/${name}.log -p ${pidfile} -- ${procname}"
+
+run_rc_command "$1"
diff --git a/filesystems/py-prometheus-zfs/pkg-descr b/filesystems/py-prometheus-zfs/pkg-descr
new file mode 100644
index 000000000000..a75059149294
--- /dev/null
+++ b/filesystems/py-prometheus-zfs/pkg-descr
@@ -0,0 +1,3 @@
+This is a simple exporter for the Prometheus metrics for ZFS using
+py-libzfs. It comes with a zfsprom service that can be run in the
+background as an HTTP server.
diff --git a/filesystems/py-pyfakefs/Makefile b/filesystems/py-pyfakefs/Makefile
new file mode 100644
index 000000000000..5fd0516b932c
--- /dev/null
+++ b/filesystems/py-pyfakefs/Makefile
@@ -0,0 +1,24 @@
+PORTNAME= pyfakefs
+PORTVERSION= 5.7.1
+CATEGORIES= filesystems devel python
+MASTER_SITES= PYPI
+PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
+
+MAINTAINER= sunpoet@FreeBSD.org
+COMMENT= Implement a fake file system that mocks the Python file system modules
+WWW= https://pytest-pyfakefs.readthedocs.io/en/stable/ \
+ https://github.com/jmcgeheeiv/pyfakefs
+
+LICENSE= APACHE20
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}setuptools>=0:devel/py-setuptools@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR}
+TEST_DEPENDS= ${PYTHON_PKGNAMEPREFIX}undefined>=0:devel/py-undefined@${PY_FLAVOR}
+
+USES= python
+USE_PYTHON= autoplist concurrent pep517 pytest
+
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/filesystems/py-pyfakefs/distinfo b/filesystems/py-pyfakefs/distinfo
new file mode 100644
index 000000000000..d76b6044cd26
--- /dev/null
+++ b/filesystems/py-pyfakefs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1729509154
+SHA256 (pyfakefs-5.7.1.tar.gz) = 24774c632f3b67ea26fd56b08115ba7c339d5cd65655410bca8572d73a1ae9a4
+SIZE (pyfakefs-5.7.1.tar.gz) = 211163
diff --git a/filesystems/py-pyfakefs/pkg-descr b/filesystems/py-pyfakefs/pkg-descr
new file mode 100644
index 000000000000..4e82fbb5cd45
--- /dev/null
+++ b/filesystems/py-pyfakefs/pkg-descr
@@ -0,0 +1,13 @@
+pyfakefs implements a fake file system that mocks the Python file system
+modules. Using pyfakefs, your tests operate on a fake file system in memory
+without touching the real disk. The software under test requires no modification
+to work with pyfakefs.
+
+Pyfakefs creates a new empty in-memory file system at each test start, which
+replaces the real filesystem during the test. Think of pyfakefs as making a
+per-test temporary directory, except for an entire file system.
+
+There are several means to achieve this: by using the fs fixture if running
+pytest, by using fake_filesystem_unittest.TestCase as a base class if using
+unittest, by using a fake_filesystem_unittest.Patcher instance as a context
+manager, or by using the patchfs decorator.
diff --git a/filesystems/py-s3fs/Makefile b/filesystems/py-s3fs/Makefile
new file mode 100644
index 000000000000..055547d3f385
--- /dev/null
+++ b/filesystems/py-s3fs/Makefile
@@ -0,0 +1,33 @@
+PORTNAME= s3fs
+PORTVERSION= 2024.10.0
+CATEGORIES= filesystems devel python
+MASTER_SITES= PYPI
+PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
+
+MAINTAINER= sunpoet@FreeBSD.org
+COMMENT= Convenient Filesystem interface over S3
+WWW= https://s3fs.readthedocs.io/en/latest/ \
+ https://github.com/fsspec/s3fs
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/LICENSE.txt
+
+BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}setuptools>=0:devel/py-setuptools@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR}
+RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}aiobotocore>=2.5.4<3.0.0:devel/py-aiobotocore@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}aiohttp>=0:www/py-aiohttp@${PY_FLAVOR} \
+ ${PYTHON_PKGNAMEPREFIX}fsspec>=${PORTVERSION}<${PORTVERSION}_99:filesystems/py-fsspec@${PY_FLAVOR}
+
+USES= python
+USE_PYTHON= autoplist concurrent pep517
+
+NO_ARCH= yes
+
+OPTIONS_DEFINE= AWSCLI BOTO3
+AWSCLI_DESC= Use awscli
+BOTO3_DESC= Use boto3
+
+AWSCLI_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}awscli>=1.29.17:devel/py-awscli@${PY_FLAVOR}
+BOTO3_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}boto3>=1.28.17:www/py-boto3@${PY_FLAVOR}
+
+.include <bsd.port.mk>
diff --git a/filesystems/py-s3fs/distinfo b/filesystems/py-s3fs/distinfo
new file mode 100644
index 000000000000..e12bca6c5c7a
--- /dev/null
+++ b/filesystems/py-s3fs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1729653364
+SHA256 (s3fs-2024.10.0.tar.gz) = 58b8c3650f8b99dbedf361543da3533aac8707035a104db5d80b094617ad4a3f
+SIZE (s3fs-2024.10.0.tar.gz) = 75916
diff --git a/filesystems/py-s3fs/pkg-descr b/filesystems/py-s3fs/pkg-descr
new file mode 100644
index 000000000000..ba62075e68c6
--- /dev/null
+++ b/filesystems/py-s3fs/pkg-descr
@@ -0,0 +1,2 @@
+S3FS builds on aiobotocore to provide a convenient Python filesystem interface
+for S3.
diff --git a/filesystems/py-zfs-autobackup/Makefile b/filesystems/py-zfs-autobackup/Makefile
new file mode 100644
index 000000000000..5c4b9f55ec28
--- /dev/null
+++ b/filesystems/py-zfs-autobackup/Makefile
@@ -0,0 +1,24 @@
+PORTNAME= zfs-autobackup
+DISTVERSIONPREFIX= v
+DISTVERSION= 3.2.2
+CATEGORIES= filesystems sysutils python
+PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
+
+MAINTAINER= skozlov@FreeBSD.org
+COMMENT= Periodicly backup zfs filesystems to other locations
+WWW= https://github.com/psy0rz/zfs_autobackup
+
+LICENSE= GPLv3
+
+RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}colorama>0:devel/py-colorama@${PY_FLAVOR}
+
+USES= python
+USE_PYTHON= autoplist distutils
+
+USE_GITHUB= yes
+GH_ACCOUNT= psy0rz
+GH_PROJECT= zfs_autobackup
+
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/filesystems/py-zfs-autobackup/distinfo b/filesystems/py-zfs-autobackup/distinfo
new file mode 100644
index 000000000000..bc8df6ea038e
--- /dev/null
+++ b/filesystems/py-zfs-autobackup/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1694871100
+SHA256 (psy0rz-zfs_autobackup-v3.2.2_GH0.tar.gz) = 736019c61a7829c3f60124e9213e51099cffad5a2d10826e3008c8f3b788b88e
+SIZE (psy0rz-zfs_autobackup-v3.2.2_GH0.tar.gz) = 115708
diff --git a/filesystems/py-zfs-autobackup/pkg-descr b/filesystems/py-zfs-autobackup/pkg-descr
new file mode 100644
index 000000000000..a76d09ca93f4
--- /dev/null
+++ b/filesystems/py-zfs-autobackup/pkg-descr
@@ -0,0 +1,20 @@
+This is a tool written to make replicating ZFS datasets easy and reliable.
+
+You can either use it as a backup tool, replication tool or snapshot tool.
+You can select what to backup by setting a custom ZFS property. This allows you
+to set and forget: Configure it so it backups your entire pool, and you never
+have to worry about backupping again. Even new datasets you create later will be
+backupped. Other settings are just specified on the commandline. This also makes
+it easier to setup and test zfs-autobackup and helps you fix all the issues you
+might encounter. When you're done you can just copy/paste your command to a cron
+or script.
+Since its using ZFS commands, you can see what its actually doing by specifying
+--debug. This also helps a lot if you run into some strange problem or error.
+You can just copy-paste the command that fails and play around with it on the
+commandline. (also something I missed in other tools)
+An important feature thats missing from other tools is a reliable --test option:
+This allows you to see what zfs-autobackup will do and tune your parameters. It
+will do everything, except make changes to your zfs datasets. Another nice
+thing is progress reporting: Its very useful with HUGE datasets,
+when you want to know how many hours/days it will take. zfs-autobackup tries to
+be the easiest to use backup tool for zfs.
diff --git a/filesystems/rar2fs/Makefile b/filesystems/rar2fs/Makefile
new file mode 100644
index 000000000000..14727f144467
--- /dev/null
+++ b/filesystems/rar2fs/Makefile
@@ -0,0 +1,37 @@
+PORTNAME= rar2fs
+DISTVERSION= 1.29.6
+DISTVERSIONPREFIX= v
+CATEGORIES= filesystems
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= n_carlsson@outlook.com
+COMMENT= Mount RAR archives as file system
+WWW= https://hasse69.github.io/rar2fs/
+
+LICENSE= GPLv3+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+BUILD_DEPENDS= ${NONEXISTENT}:${LIBUNRAR_PORT}:patch
+LIB_DEPENDS= libunrar.so:${LIBUNRAR_PORT}
+
+USES= autoreconf compiler:c11 gmake fuse
+USE_GITHUB= yes
+GH_ACCOUNT= hasse69
+
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+CONFIGURE_ARGS= --disable-static-unrar \
+ --with-fuse-lib=${LOCALBASE}/lib \
+ --with-fuse=${LOCALBASE}/include/fuse \
+ --with-unrar=`${MAKE} -C ${PORTSDIR}/${LIBUNRAR_PORT} -VWRKSRC` \
+ --with-unrar-lib=${LOCALBASE}/lib
+CONFIGURE_ENV= LIBUNRAR_PKG=${LIBUNRAR_PKG}
+
+PLIST_FILES= bin/${PORTNAME} \
+ bin/mkr2i \
+ share/man/man1/rar2fs.1.gz
+
+LIBUNRAR_PORT= archivers/libunrar
+LIBUNRAR_PKG= ${LIBUNRAR_PORT:S|archivers/||}
+
+.include <bsd.port.mk>
diff --git a/filesystems/rar2fs/distinfo b/filesystems/rar2fs/distinfo
new file mode 100644
index 000000000000..abf89d3cdeef
--- /dev/null
+++ b/filesystems/rar2fs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1718328615
+SHA256 (hasse69-rar2fs-v1.29.6_GH0.tar.gz) = c9c2381dea863bccf4e6ebfe1b4c9934e506644f321b1f664524cf467fa5e769
+SIZE (hasse69-rar2fs-v1.29.6_GH0.tar.gz) = 126654
diff --git a/filesystems/rar2fs/files/patch-configure.ac b/filesystems/rar2fs/files/patch-configure.ac
new file mode 100644
index 000000000000..02ff1d32cef8
--- /dev/null
+++ b/filesystems/rar2fs/files/patch-configure.ac
@@ -0,0 +1,24 @@
+--- configure.ac.orig 2017-01-05 12:03:06 UTC
++++ configure.ac
+@@ -434,6 +434,21 @@ if test x"$UNRAR_LIBS" != x; then
+ fi
+ ########################################################
+
++########################################################
++# Check if we need to set -DOPENSSL_AES
++if test x"$UNRAR_LIBS" != x; then
++ AC_CHECK_TOOL(PKG_STATIC,pkg-static)
++ AC_MSG_CHECKING([if unrar library needs -DOPENSSL_AES])
++ openssl_aes=`$PKG_STATIC query '%Ok %Ov' $LIBUNRAR_PKG | grep '^OPENSSL_AES' | cut -f 2 -d ' '`
++ if test x"$openssl_aes" != x"on"; then
++ AC_MSG_RESULT([no])
++ else
++ AC_MSG_RESULT([yes])
++ UNRAR_CXXFLAGS="$UNRAR_CXXFLAGS -DOPENSSL_AES"
++ fi
++fi
++########################################################
++
+ AM_ICONV
+
+ AC_MSG_CHECKING(for commit hash in git repo)
diff --git a/filesystems/rar2fs/files/patch-src_dllext.cpp b/filesystems/rar2fs/files/patch-src_dllext.cpp
new file mode 100644
index 000000000000..e3a8682f763a
--- /dev/null
+++ b/filesystems/rar2fs/files/patch-src_dllext.cpp
@@ -0,0 +1,199 @@
+Add compatibility with libunrar >= 7. Based upon upstream commits:
+
+https://github.com/hasse69/rar2fs/commit/d1d31f416269f4abb1262850b1fe645713a14fc4
+https://github.com/hasse69/rar2fs/commit/89d144d17bb23bd2ff143a3aac3593cbfc2dd3c1
+
+--- src/dllext.cpp.orig 2021-05-02 06:17:04 UTC
++++ src/dllext.cpp
+@@ -169,13 +169,21 @@ int PASCAL RARListArchiveEx(HANDLE hArcData, RARArchiv
+ }
+ else
+ {
++#if RARVER_MAJOR >= 7
++ wcscpy(N->LinkTargetW,Arc.FileHead.RedirName.c_str());
++#else
+ wcscpy(N->LinkTargetW,Arc.FileHead.RedirName);
++#endif
+ N->LinkTargetFlags |= LINK_T_UNICODE; // Make sure UNICODE is set
+ }
+ }
+ else if (Arc.FileHead.RedirType == FSREDIR_FILECOPY)
+ {
++#if RARVER_MAJOR >= 7
++ wcscpy(N->LinkTargetW,Arc.FileHead.RedirName.c_str());
++#else
+ wcscpy(N->LinkTargetW,Arc.FileHead.RedirName);
++#endif
+ N->LinkTargetFlags |= LINK_T_FILECOPY;
+ }
+ }
+@@ -208,6 +216,13 @@ void PASCAL RARNextVolumeName(char *arch, bool oldstyl
+ {
+ #if RARVER_MAJOR < 5
+ NextVolumeName(arch, NULL, 0, oldstylevolume);
++#elif RARVER_MAJOR >= 7
++ wstring ArchiveW;
++ size_t len=strlen(arch);
++ ArchiveW.assign(arch,arch+len);
++ NextVolumeName(ArchiveW,oldstylevolume);
++ string NextArchive(ArchiveW.begin(),ArchiveW.end());
++ strcpy(arch,NextArchive.c_str());
+ #else
+ wchar NextName[NM];
+ CharToWide(arch, NextName, ASIZE(NextName));
+@@ -221,6 +236,14 @@ void PASCAL RARVolNameToFirstName(char *arch, bool old
+ {
+ #if RARVER_MAJOR < 5
+ VolNameToFirstName(arch, arch, !oldstylevolume);
++#elif RARVER_MAJOR >=7
++ wstring ArcName;
++ size_t len=strlen(arch);
++ ArcName.assign(arch,arch+len);
++ VolNameToFirstName(ArcName, ArcName, !oldstylevolume);
++ string FirstName(ArcName.begin(),ArcName.end());
++ strcpy(arch,FirstName.c_str());
++ return;
+ #else
+ wchar ArcName[NM];
+ CharToWide(arch, ArcName, ASIZE(ArcName));
+@@ -239,7 +262,6 @@ void PASCAL RARGetFileInfo(HANDLE hArcData, const char
+ void PASCAL RARGetFileInfo(HANDLE hArcData, const char *FileName, struct RARWcb *wcb)
+ {
+ #if RARVER_MAJOR > 4
+- char FileNameUtf[NM];
+ DataSet *Data = (DataSet *)hArcData;
+ Archive& Arc = Data->Arc;
+ struct RARHeaderDataEx h;
+@@ -248,8 +270,17 @@ void PASCAL RARGetFileInfo(HANDLE hArcData, const char
+ wcb->bytes = 0;
+ while (!RARReadHeaderEx(hArcData, &h))
+ {
++#if RARVER_MAJOR >= 7
++ size_t FileNameLen=Arc.FileHead.FileName.size()*sizeof(char32_t);
++ string FileNameUtf(FileNameLen,'\0');
++ WideToUtf(Arc.FileHead.FileName.c_str(),&FileNameUtf[0],FileNameLen);
++ FileNameUtf.resize(strlen(FileNameUtf.c_str()));
++ if (!strcmp(FileNameUtf.c_str(), FileName))
++#else
++ char FileNameUtf[NM];
+ WideToUtf(Arc.FileHead.FileName,FileNameUtf,ASIZE(FileNameUtf));
+ if (!strcmp(FileNameUtf, FileName))
++#endif
+ {
+ wcb->bytes = ListFileHeader(wcb->data, Arc);
+ return;
+@@ -368,7 +399,11 @@ static size_t ListFileHeader(wchar *wcs,Archive &Arc)
+ static size_t ListFileHeader(wchar *wcs,Archive &Arc)
+ {
+ FileHeader &hd=Arc.FileHead;
++#if RARVER_MAJOR >= 7
++ wstring *Name=&hd.FileName;
++#else
+ wchar *Name=hd.FileName;
++#endif
+ RARFORMAT Format=Arc.Format;
+
+ void *wcs_start = (void *)wcs;
+@@ -433,25 +468,45 @@ static size_t ListFileHeader(wchar *wcs,Archive &Arc)
+ {
+ if (Format==RARFMT15)
+ {
++#if RARVER_MAJOR >= 7
++ string LinkTargetA;
++#else
+ char LinkTargetA[NM];
++#endif
+ if (Arc.FileHead.Encrypted)
+ {
+ // Link data are encrypted. We would need to ask for password
+ // and initialize decryption routine to display the link target.
++#if RARVER_MAJOR >= 7
++ LinkTargetA="*<-?->";
++#else
+ strncpyz(LinkTargetA,"*<-?->",ASIZE(LinkTargetA));
++#endif
+ }
+ else
+ {
+ int DataSize=(int)Min((size_t)hd.PackSize,ASIZE(LinkTargetA)-1);
++#if RARVER_MAJOR >= 7
++ Arc.Read(&LinkTargetA,DataSize);
++#else
+ Arc.Read(LinkTargetA,DataSize);
++#endif
+ LinkTargetA[DataSize > 0 ? DataSize : 0] = 0;
+ }
++#if RARVER_MAJOR >= 7
++ wstring LinkTarget(LinkTargetA.begin(),LinkTargetA.end());
++ wcs += msprintf(wcs, L"\n%12ls: %ls",St(MListTarget),LinkTarget.c_str());
++ }
++ else
++ wcs += msprintf(wcs, L"\n%12ls: %ls",St(MListTarget),hd.RedirName.c_str());
++#else
+ wchar LinkTarget[NM];
+ CharToWide(LinkTargetA,LinkTarget,ASIZE(LinkTarget));
+ wcs += msprintf(wcs, L"\n%12ls: %ls",St(MListTarget),LinkTarget);
+ }
+ else
+ wcs += msprintf(wcs, L"\n%12ls: %ls",St(MListTarget),hd.RedirName);
++#endif
+ }
+
+ if (!hd.Dir)
+@@ -487,11 +542,20 @@ static size_t ListFileHeader(wchar *wcs,Archive &Arc)
+ hd.FileHash.CRC32);
+ if (hd.FileHash.Type==HASH_BLAKE2)
+ {
++#if RARVER_MAJOR >= 7
++ wstring BlakeStr;
++ BinToHex(hd.FileHash.Digest,BLAKE2_DIGEST_SIZE,BlakeStr);
++#else
+ wchar BlakeStr[BLAKE2_DIGEST_SIZE*2+1];
+ BinToHex(hd.FileHash.Digest,BLAKE2_DIGEST_SIZE,NULL,BlakeStr,ASIZE(BlakeStr));
++#endif
+ wcs += msprintf(wcs, L"\n%12ls: %ls",
+ hd.UseHashKey ? L"BLAKE2 MAC":hd.SplitAfter ? L"Pack-BLAKE2":L"BLAKE2",
++#if RARVER_MAJOR >= 7
++ BlakeStr.c_str());
++#else
+ BlakeStr);
++#endif
+ }
+
+ const wchar *HostOS=L"";
+@@ -529,7 +593,11 @@ static size_t ListFileHeader(wchar *wcs,Archive &Arc)
+
+ if (hd.Version)
+ {
++#if RARVER_MAJOR >= 7
++ uint Version=ParseVersionFileName(*Name,false);
++#else
+ uint Version=ParseVersionFileName(Name,false);
++#endif
+ if (Version!=0)
+ wcs += msprintf(wcs, L"\n%12ls: %u",St(MListFileVer),Version);
+ }
+@@ -538,9 +606,17 @@ static size_t ListFileHeader(wchar *wcs,Archive &Arc)
+ {
+ wcs += msprintf(wcs, L"\n%12ls: ",L"Unix owner");
+ if (*hd.UnixOwnerName!=0)
++#if RARVER_MAJOR >= 7
++ wcs += msprintf(wcs, L"%ls:",GetWide(hd.UnixOwnerName).c_str());
++#else
+ wcs += msprintf(wcs, L"%ls:",GetWide(hd.UnixOwnerName));
++#endif
+ if (*hd.UnixGroupName!=0)
++#if RARVER_MAJOR >= 7
++ wcs += msprintf(wcs, L"%ls",GetWide(hd.UnixGroupName).c_str());
++#else
+ wcs += msprintf(wcs, L"%ls",GetWide(hd.UnixGroupName));
++#endif
+ if ((*hd.UnixOwnerName!=0 || *hd.UnixGroupName!=0) && (hd.UnixOwnerNumeric || hd.UnixGroupNumeric))
+ wcs += msprintf(wcs, L" ");
+ if (hd.UnixOwnerNumeric)
+@@ -555,5 +631,3 @@ static size_t ListFileHeader(wchar *wcs,Archive &Arc)
+ }
+
+ #endif
+-
+-
diff --git a/filesystems/rar2fs/pkg-descr b/filesystems/rar2fs/pkg-descr
new file mode 100644
index 000000000000..8bb098de582c
--- /dev/null
+++ b/filesystems/rar2fs/pkg-descr
@@ -0,0 +1,7 @@
+rar2fs is a FUSE based file system that can mount a source RAR
+archive/volume or a directory containing any number of RAR
+archives and access (read only) the contents as plain files/directories.
+Other files located in the source directory are handled transparently.
+Both compressed and non-compressed archives/volumes are supported but
+full media seek support (aka. indexing) is only available for
+non-compressed plaintext archives.
diff --git a/filesystems/rubygem-aws-sdk-efs/Makefile b/filesystems/rubygem-aws-sdk-efs/Makefile
new file mode 100644
index 000000000000..f362964453ef
--- /dev/null
+++ b/filesystems/rubygem-aws-sdk-efs/Makefile
@@ -0,0 +1,20 @@
+PORTNAME= aws-sdk-efs
+PORTVERSION= 1.86.0
+CATEGORIES= filesystems devel rubygems
+MASTER_SITES= RG
+
+MAINTAINER= sunpoet@FreeBSD.org
+COMMENT= Official AWS Ruby gem for Amazon Elastic File System (EFS)
+WWW= https://github.com/aws/aws-sdk-ruby/tree/version-3/gems/aws-sdk-efs
+
+LICENSE= APACHE20
+LICENSE_FILE= ${WRKSRC}/LICENSE.txt
+
+RUN_DEPENDS= rubygem-aws-sdk-core>=3.210.0<4:devel/rubygem-aws-sdk-core \
+ rubygem-aws-sigv4>=1.5<2:devel/rubygem-aws-sigv4
+
+USES= gem
+
+NO_ARCH= yes
+
+.include <bsd.port.mk>
diff --git a/filesystems/rubygem-aws-sdk-efs/distinfo b/filesystems/rubygem-aws-sdk-efs/distinfo
new file mode 100644
index 000000000000..2b61149e6faa
--- /dev/null
+++ b/filesystems/rubygem-aws-sdk-efs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1729856552
+SHA256 (rubygem/aws-sdk-efs-1.86.0.gem) = f62c273472bf5010a6e71dc87fd0cc343fc7e52ad4bfe774ee01d34ad1ea41fa
+SIZE (rubygem/aws-sdk-efs-1.86.0.gem) = 65024
diff --git a/filesystems/rubygem-aws-sdk-efs/pkg-descr b/filesystems/rubygem-aws-sdk-efs/pkg-descr
new file mode 100644
index 000000000000..6bee43ab7c62
--- /dev/null
+++ b/filesystems/rubygem-aws-sdk-efs/pkg-descr
@@ -0,0 +1 @@
+Official AWS Ruby gem for Amazon Elastic File System (EFS).
diff --git a/filesystems/rubygem-winrm-fs/Makefile b/filesystems/rubygem-winrm-fs/Makefile
new file mode 100644
index 000000000000..531f6a52c7c4
--- /dev/null
+++ b/filesystems/rubygem-winrm-fs/Makefile
@@ -0,0 +1,24 @@
+PORTNAME= winrm-fs
+PORTVERSION= 1.3.5
+CATEGORIES= filesystems sysutils rubygems
+MASTER_SITES= RG
+
+MAINTAINER= ruby@FreeBSD.org
+COMMENT= Library for file system operations via WinRM
+WWW= https://github.com/WinRb/winrm-fs
+
+LICENSE= APACHE20
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+RUN_DEPENDS= rubygem-erubi>=1.8<2:www/rubygem-erubi \
+ rubygem-logging>=1.6.1<3.0:devel/rubygem-logging \
+ rubygem-rubyzip>=2.0<3:archivers/rubygem-rubyzip \
+ rubygem-winrm>=2.0<3:sysutils/rubygem-winrm
+
+USES= gem
+
+NO_ARCH= yes
+
+PLIST_FILES= bin/rwinrmcp
+
+.include <bsd.port.mk>
diff --git a/filesystems/rubygem-winrm-fs/distinfo b/filesystems/rubygem-winrm-fs/distinfo
new file mode 100644
index 000000000000..cd58beb1948e
--- /dev/null
+++ b/filesystems/rubygem-winrm-fs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1626714674
+SHA256 (rubygem/winrm-fs-1.3.5.gem) = 0d2cdd9e1fb6fc8d01f56a32dce41d98ae6eefb481937ed0e058faa0cd0c693d
+SIZE (rubygem/winrm-fs-1.3.5.gem) = 21504
diff --git a/filesystems/rubygem-winrm-fs/pkg-descr b/filesystems/rubygem-winrm-fs/pkg-descr
new file mode 100644
index 000000000000..68293f4f359f
--- /dev/null
+++ b/filesystems/rubygem-winrm-fs/pkg-descr
@@ -0,0 +1 @@
+Ruby library for file system operations via Windows Remote Management
diff --git a/filesystems/s3backer/Makefile b/filesystems/s3backer/Makefile
new file mode 100644
index 000000000000..725ee9d03d17
--- /dev/null
+++ b/filesystems/s3backer/Makefile
@@ -0,0 +1,26 @@
+PORTNAME= s3backer
+DISTVERSION= 1.5.4
+PORTREVISION= 1
+CATEGORIES= filesystems
+MASTER_SITES= https://s3.amazonaws.com/archie-public/s3backer/
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= bsdports@staktrace.com
+COMMENT= FUSE filesystem that uses Amazon S3 as a backing store
+WWW= https://github.com/archiecobbs/s3backer
+
+LICENSE= GPLv2
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+LIB_DEPENDS= libcurl.so:ftp/curl \
+ libexpat.so:textproc/expat2
+
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+# Need to have curl/curl.h on the include path. Is there a better
+# way to do this than sending CPPFLAGS to configure?
+CONFIGURE_ARGS= CPPFLAGS="-I${LOCALBASE}/include"
+
+USES= fuse pkgconfig ssl
+
+.include <bsd.port.mk>
diff --git a/filesystems/s3backer/distinfo b/filesystems/s3backer/distinfo
new file mode 100644
index 000000000000..5962e7dd3853
--- /dev/null
+++ b/filesystems/s3backer/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1584785989
+SHA256 (s3backer-1.5.4.tar.gz) = 7e73bb8378a4ccf7b1904a078fbc4731b07138951cbe1c20ce7aa0eb3e8da0d0
+SIZE (s3backer-1.5.4.tar.gz) = 201362
diff --git a/filesystems/s3backer/pkg-descr b/filesystems/s3backer/pkg-descr
new file mode 100644
index 000000000000..bb97b04b3ce2
--- /dev/null
+++ b/filesystems/s3backer/pkg-descr
@@ -0,0 +1,22 @@
+s3backer is a filesystem that contains a single file backed by the
+Amazon Simple Storage Service (Amazon S3). As a filesystem, it is
+very simple: it provides a single normal file having a fixed size.
+Underneath, the file is divided up into blocks, and the content of
+each block is stored in a unique Amazon S3 object. In other words,
+what s3backer provides is really more like an S3-backed virtual
+hard disk device, rather than a filesystem.
+
+In typical usage, a normal filesystem is mounted on top of the file
+exported by the s3backer filesystem using a loopback mount (or disk
+image mount on Mac OS X).
+
+By not attempting to implement a complete filesystem, which is a
+complex undertaking and difficult to get right, s3backer can stay
+very lightweight and simple. Only three HTTP operations are used:
+GET, PUT, and DELETE. All of the experience and knowledge about
+how to properly implement filesystems that already exists can be
+reused.
+
+By utilizing existing filesystems atop s3backer, you get full UNIX
+filesystem semantics. Subtle bugs or missing functionality relating
+to hard links, extended attributes, POSIX locking, etc. are avoided.
diff --git a/filesystems/s3backer/pkg-plist b/filesystems/s3backer/pkg-plist
new file mode 100644
index 000000000000..0cf15714456a
--- /dev/null
+++ b/filesystems/s3backer/pkg-plist
@@ -0,0 +1,7 @@
+bin/s3backer
+share/man/man1/s3backer.1.gz
+share/doc/packages/s3backer/CHANGES
+share/doc/packages/s3backer/COPYING
+share/doc/packages/s3backer/INSTALL
+share/doc/packages/s3backer/README
+share/doc/packages/s3backer/TODO
diff --git a/filesystems/s3fs/Makefile b/filesystems/s3fs/Makefile
new file mode 100644
index 000000000000..20cdfb4ae528
--- /dev/null
+++ b/filesystems/s3fs/Makefile
@@ -0,0 +1,36 @@
+PORTNAME= s3fs
+DISTVERSIONPREFIX= v
+DISTVERSION= 1.92
+PORTREVISION= 1
+CATEGORIES= filesystems
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= dmgk@FreeBSD.org
+COMMENT= FUSE-based file system backed by Amazon S3
+WWW= https://github.com/s3fs-fuse/s3fs-fuse
+
+LICENSE= GPLv2
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+LIB_DEPENDS= libcurl.so:ftp/curl \
+ libxml2.so:textproc/libxml2
+
+USES= autoreconf fuse pkgconfig ssl
+
+USE_GITHUB= yes
+GH_ACCOUNT= s3fs-fuse
+GH_PROJECT= s3fs-fuse
+
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+
+CONFIGURE_ENV+= ac_cv_prog_GITCMD=no
+
+PLIST_FILES= bin/s3fs share/man/man1/s3fs.1.gz
+
+post-patch:
+ @${REINPLACE_CMD} -e 's/libcrypto >= 0.9//' ${WRKSRC}/configure.ac
+ @${REINPLACE_CMD} -e '/DEPS_LIBS/s/$$/ -lcrypto/' \
+ ${WRKSRC}/src/Makefile.am
+
+.include <bsd.port.mk>
diff --git a/filesystems/s3fs/distinfo b/filesystems/s3fs/distinfo
new file mode 100644
index 000000000000..0b27b3158f5a
--- /dev/null
+++ b/filesystems/s3fs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1685836142
+SHA256 (s3fs-fuse-s3fs-fuse-v1.92_GH0.tar.gz) = 76ebea3c0784c5c0f6b84e009d555806aff86258886ced39eee316bf02ae8750
+SIZE (s3fs-fuse-s3fs-fuse-v1.92_GH0.tar.gz) = 283295
diff --git a/filesystems/s3fs/files/patch-test_mknod__test.c b/filesystems/s3fs/files/patch-test_mknod__test.c
new file mode 100644
index 000000000000..c3e06b5e0bae
--- /dev/null
+++ b/filesystems/s3fs/files/patch-test_mknod__test.c
@@ -0,0 +1,13 @@
+--- test/mknod_test.c.orig 2023-05-21 23:25:50 UTC
++++ test/mknod_test.c
+@@ -28,7 +28,10 @@
+ #include <string.h>
+ #include <errno.h>
+ #ifndef __APPLE__
++#elif
++#ifndef __FreeBSD__
+ #include <sys/sysmacros.h>
++#endif
+ #endif
+
+ //---------------------------------------------------------
diff --git a/filesystems/s3fs/pkg-descr b/filesystems/s3fs/pkg-descr
new file mode 100644
index 000000000000..67900733a8f9
--- /dev/null
+++ b/filesystems/s3fs/pkg-descr
@@ -0,0 +1,2 @@
+FUSE-based file system backed by Amazon S3. Mount a bucket as a local
+file system read/write. Store files/folders natively and transparently.
diff --git a/filesystems/s3fs/pkg-message b/filesystems/s3fs/pkg-message
new file mode 100644
index 000000000000..0d5dfff241e3
--- /dev/null
+++ b/filesystems/s3fs/pkg-message
@@ -0,0 +1,7 @@
+[
+{ type: install
+ message: <<EOM
+The usage of s3fs can be found at https://github.com/s3fs-fuse/s3fs-fuse/wiki/Fuse-Over-Amazon if you want to understand it.
+EOM
+}
+]
diff --git a/filesystems/sandboxfs/Makefile b/filesystems/sandboxfs/Makefile
new file mode 100644
index 000000000000..51512f949899
--- /dev/null
+++ b/filesystems/sandboxfs/Makefile
@@ -0,0 +1,91 @@
+PORTNAME= sandboxfs
+DISTVERSIONPREFIX= sandboxfs-
+DISTVERSION= 0.2.0
+PORTREVISION= 42
+CATEGORIES= filesystems
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= mikael@FreeBSD.org
+COMMENT= Virtual file system for sandboxing
+WWW= https://github.com/bazelbuild/sandboxfs
+
+LICENSE= APACHE20
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+USES= cargo fuse
+USE_GITHUB= yes
+GH_ACCOUNT= bazelbuild
+
+CARGO_CRATES= aho-corasick-0.7.10 \
+ arc-swap-0.4.5 \
+ atty-0.2.14 \
+ backtrace-0.3.46 \
+ backtrace-sys-0.1.35 \
+ bitflags-1.2.1 \
+ cc-1.0.50 \
+ cfg-if-0.1.10 \
+ cpuprofiler-0.0.4 \
+ env_logger-0.5.13 \
+ error-chain-0.12.2 \
+ failure-0.1.7 \
+ failure_derive-0.1.7 \
+ fuse-0.3.1 \
+ getopts-0.2.21 \
+ getrandom-0.1.14 \
+ hermit-abi-0.1.11 \
+ humantime-1.3.0 \
+ itoa-0.4.5 \
+ lazy_static-1.4.0 \
+ libc-0.2.69 \
+ log-0.3.9 \
+ log-0.4.8 \
+ memchr-2.3.3 \
+ nix-0.12.1 \
+ num_cpus-1.13.0 \
+ pkg-config-0.3.17 \
+ ppv-lite86-0.2.6 \
+ proc-macro2-1.0.10 \
+ quick-error-1.2.3 \
+ quote-1.0.3 \
+ rand-0.7.3 \
+ rand_chacha-0.2.2 \
+ rand_core-0.5.1 \
+ rand_hc-0.2.0 \
+ redox_syscall-0.1.56 \
+ regex-1.3.7 \
+ regex-syntax-0.6.17 \
+ remove_dir_all-0.5.2 \
+ rustc-demangle-0.1.16 \
+ ryu-1.0.3 \
+ serde-1.0.106 \
+ serde_derive-1.0.106 \
+ serde_json-1.0.51 \
+ signal-hook-0.1.13 \
+ signal-hook-registry-1.2.0 \
+ syn-1.0.17 \
+ synstructure-0.12.3 \
+ tempfile-3.1.0 \
+ termcolor-1.1.0 \
+ thread-scoped-1.0.2 \
+ thread_local-1.0.1 \
+ threadpool-1.7.1 \
+ time-0.1.43 \
+ unicode-width-0.1.7 \
+ unicode-xid-0.2.0 \
+ users-0.9.1 \
+ version_check-0.9.1 \
+ void-1.0.2 \
+ wasi-0.9.0+wasi-snapshot-preview1 \
+ winapi-0.3.8 \
+ winapi-i686-pc-windows-gnu-0.4.0 \
+ winapi-util-0.1.5 \
+ winapi-x86_64-pc-windows-gnu-0.4.0 \
+ xattr-0.2.2
+
+PLIST_FILES= bin/sandboxfs \
+ share/man/man1/sandboxfs.1.gz
+
+post-install:
+ ${INSTALL_MAN} ${WRKSRC}/man/sandboxfs.1 ${STAGEDIR}${PREFIX}/share/man/man1
+
+.include <bsd.port.mk>
diff --git a/filesystems/sandboxfs/distinfo b/filesystems/sandboxfs/distinfo
new file mode 100644
index 000000000000..42005c53f6bd
--- /dev/null
+++ b/filesystems/sandboxfs/distinfo
@@ -0,0 +1,133 @@
+TIMESTAMP = 1587409578
+SHA256 (rust/crates/aho-corasick-0.7.10.tar.gz) = 8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada
+SIZE (rust/crates/aho-corasick-0.7.10.tar.gz) = 111039
+SHA256 (rust/crates/arc-swap-0.4.5.tar.gz) = d663a8e9a99154b5fb793032533f6328da35e23aac63d5c152279aa8ba356825
+SIZE (rust/crates/arc-swap-0.4.5.tar.gz) = 48047
+SHA256 (rust/crates/atty-0.2.14.tar.gz) = d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8
+SIZE (rust/crates/atty-0.2.14.tar.gz) = 5470
+SHA256 (rust/crates/backtrace-0.3.46.tar.gz) = b1e692897359247cc6bb902933361652380af0f1b7651ae5c5013407f30e109e
+SIZE (rust/crates/backtrace-0.3.46.tar.gz) = 68107
+SHA256 (rust/crates/backtrace-sys-0.1.35.tar.gz) = 7de8aba10a69c8e8d7622c5710229485ec32e9d55fdad160ea559c086fdcd118
+SIZE (rust/crates/backtrace-sys-0.1.35.tar.gz) = 635446
+SHA256 (rust/crates/bitflags-1.2.1.tar.gz) = cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693
+SIZE (rust/crates/bitflags-1.2.1.tar.gz) = 16745
+SHA256 (rust/crates/cc-1.0.50.tar.gz) = 95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd
+SIZE (rust/crates/cc-1.0.50.tar.gz) = 49792
+SHA256 (rust/crates/cfg-if-0.1.10.tar.gz) = 4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822
+SIZE (rust/crates/cfg-if-0.1.10.tar.gz) = 7933
+SHA256 (rust/crates/cpuprofiler-0.0.4.tar.gz) = 43f8479dbcfd2bbaa0c0c26779b913052b375981cdf533091f2127ea3d42e52b
+SIZE (rust/crates/cpuprofiler-0.0.4.tar.gz) = 97586
+SHA256 (rust/crates/env_logger-0.5.13.tar.gz) = 15b0a4d2e39f8420210be8b27eeda28029729e2fd4291019455016c348240c38
+SIZE (rust/crates/env_logger-0.5.13.tar.gz) = 25275
+SHA256 (rust/crates/error-chain-0.12.2.tar.gz) = d371106cc88ffdfb1eabd7111e432da544f16f3e2d7bf1dfe8bf575f1df045cd
+SIZE (rust/crates/error-chain-0.12.2.tar.gz) = 29761
+SHA256 (rust/crates/failure-0.1.7.tar.gz) = b8529c2421efa3066a5cbd8063d2244603824daccb6936b079010bb2aa89464b
+SIZE (rust/crates/failure-0.1.7.tar.gz) = 37416
+SHA256 (rust/crates/failure_derive-0.1.7.tar.gz) = 030a733c8287d6213886dd487564ff5c8f6aae10278b3588ed177f9d18f8d231
+SIZE (rust/crates/failure_derive-0.1.7.tar.gz) = 4902
+SHA256 (rust/crates/fuse-0.3.1.tar.gz) = 80e57070510966bfef93662a81cb8aa2b1c7db0964354fa9921434f04b9e8660
+SIZE (rust/crates/fuse-0.3.1.tar.gz) = 25001
+SHA256 (rust/crates/getopts-0.2.21.tar.gz) = 14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5
+SIZE (rust/crates/getopts-0.2.21.tar.gz) = 18457
+SHA256 (rust/crates/getrandom-0.1.14.tar.gz) = 7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb
+SIZE (rust/crates/getrandom-0.1.14.tar.gz) = 24698
+SHA256 (rust/crates/hermit-abi-0.1.11.tar.gz) = 8a0d737e0f947a1864e93d33fdef4af8445a00d1ed8dc0c8ddb73139ea6abf15
+SIZE (rust/crates/hermit-abi-0.1.11.tar.gz) = 9203
+SHA256 (rust/crates/humantime-1.3.0.tar.gz) = df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f
+SIZE (rust/crates/humantime-1.3.0.tar.gz) = 17020
+SHA256 (rust/crates/itoa-0.4.5.tar.gz) = b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e
+SIZE (rust/crates/itoa-0.4.5.tar.gz) = 11194
+SHA256 (rust/crates/lazy_static-1.4.0.tar.gz) = e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646
+SIZE (rust/crates/lazy_static-1.4.0.tar.gz) = 10443
+SHA256 (rust/crates/libc-0.2.69.tar.gz) = 99e85c08494b21a9054e7fe1374a732aeadaff3980b6990b94bfd3a70f690005
+SIZE (rust/crates/libc-0.2.69.tar.gz) = 472393
+SHA256 (rust/crates/log-0.3.9.tar.gz) = e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b
+SIZE (rust/crates/log-0.3.9.tar.gz) = 16686
+SHA256 (rust/crates/log-0.4.8.tar.gz) = 14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7
+SIZE (rust/crates/log-0.4.8.tar.gz) = 31297
+SHA256 (rust/crates/memchr-2.3.3.tar.gz) = 3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400
+SIZE (rust/crates/memchr-2.3.3.tar.gz) = 22566
+SHA256 (rust/crates/nix-0.12.1.tar.gz) = 319fffb13b63c0f4ff5a4e1c97566e7e741561ff5d03bf8bbf11653454bbd70b
+SIZE (rust/crates/nix-0.12.1.tar.gz) = 173207
+SHA256 (rust/crates/num_cpus-1.13.0.tar.gz) = 05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3
+SIZE (rust/crates/num_cpus-1.13.0.tar.gz) = 14704
+SHA256 (rust/crates/pkg-config-0.3.17.tar.gz) = 05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677
+SIZE (rust/crates/pkg-config-0.3.17.tar.gz) = 14533
+SHA256 (rust/crates/ppv-lite86-0.2.6.tar.gz) = 74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b
+SIZE (rust/crates/ppv-lite86-0.2.6.tar.gz) = 20522
+SHA256 (rust/crates/proc-macro2-1.0.10.tar.gz) = df246d292ff63439fea9bc8c0a270bed0e390d5ebd4db4ba15aba81111b5abe3
+SIZE (rust/crates/proc-macro2-1.0.10.tar.gz) = 35622
+SHA256 (rust/crates/quick-error-1.2.3.tar.gz) = a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0
+SIZE (rust/crates/quick-error-1.2.3.tar.gz) = 15066
+SHA256 (rust/crates/quote-1.0.3.tar.gz) = 2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f
+SIZE (rust/crates/quote-1.0.3.tar.gz) = 22939
+SHA256 (rust/crates/rand-0.7.3.tar.gz) = 6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03
+SIZE (rust/crates/rand-0.7.3.tar.gz) = 112246
+SHA256 (rust/crates/rand_chacha-0.2.2.tar.gz) = f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402
+SIZE (rust/crates/rand_chacha-0.2.2.tar.gz) = 13267
+SHA256 (rust/crates/rand_core-0.5.1.tar.gz) = 90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19
+SIZE (rust/crates/rand_core-0.5.1.tar.gz) = 21116
+SHA256 (rust/crates/rand_hc-0.2.0.tar.gz) = ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c
+SIZE (rust/crates/rand_hc-0.2.0.tar.gz) = 11670
+SHA256 (rust/crates/redox_syscall-0.1.56.tar.gz) = 2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84
+SIZE (rust/crates/redox_syscall-0.1.56.tar.gz) = 17117
+SHA256 (rust/crates/regex-1.3.7.tar.gz) = a6020f034922e3194c711b82a627453881bc4682166cabb07134a10c26ba7692
+SIZE (rust/crates/regex-1.3.7.tar.gz) = 235600
+SHA256 (rust/crates/regex-syntax-0.6.17.tar.gz) = 7fe5bd57d1d7414c6b5ed48563a2c855d995ff777729dcd91c369ec7fea395ae
+SIZE (rust/crates/regex-syntax-0.6.17.tar.gz) = 294004
+SHA256 (rust/crates/remove_dir_all-0.5.2.tar.gz) = 4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e
+SIZE (rust/crates/remove_dir_all-0.5.2.tar.gz) = 8907
+SHA256 (rust/crates/rustc-demangle-0.1.16.tar.gz) = 4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783
+SIZE (rust/crates/rustc-demangle-0.1.16.tar.gz) = 19137
+SHA256 (rust/crates/ryu-1.0.3.tar.gz) = 535622e6be132bccd223f4bb2b8ac8d53cda3c7a6394944d3b2b33fb974f9d76
+SIZE (rust/crates/ryu-1.0.3.tar.gz) = 41983
+SHA256 (rust/crates/serde-1.0.106.tar.gz) = 36df6ac6412072f67cf767ebbde4133a5b2e88e76dc6187fa7104cd16f783399
+SIZE (rust/crates/serde-1.0.106.tar.gz) = 73343
+SHA256 (rust/crates/serde_derive-1.0.106.tar.gz) = 9e549e3abf4fb8621bd1609f11dfc9f5e50320802273b12f3811a67e6716ea6c
+SIZE (rust/crates/serde_derive-1.0.106.tar.gz) = 49719
+SHA256 (rust/crates/serde_json-1.0.51.tar.gz) = da07b57ee2623368351e9a0488bb0b261322a15a6e0ae53e243cbdc0f4208da9
+SIZE (rust/crates/serde_json-1.0.51.tar.gz) = 72691
+SHA256 (rust/crates/signal-hook-0.1.13.tar.gz) = 10b9f3a1686a29f53cfd91ee5e3db3c12313ec02d33765f02c1a9645a1811e2c
+SIZE (rust/crates/signal-hook-0.1.13.tar.gz) = 26045
+SHA256 (rust/crates/signal-hook-registry-1.2.0.tar.gz) = 94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41
+SIZE (rust/crates/signal-hook-registry-1.2.0.tar.gz) = 14490
+SHA256 (rust/crates/syn-1.0.17.tar.gz) = 0df0eb663f387145cab623dea85b09c2c5b4b0aef44e945d928e682fce71bb03
+SIZE (rust/crates/syn-1.0.17.tar.gz) = 198158
+SHA256 (rust/crates/synstructure-0.12.3.tar.gz) = 67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545
+SIZE (rust/crates/synstructure-0.12.3.tar.gz) = 17788
+SHA256 (rust/crates/tempfile-3.1.0.tar.gz) = 7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9
+SIZE (rust/crates/tempfile-3.1.0.tar.gz) = 25823
+SHA256 (rust/crates/termcolor-1.1.0.tar.gz) = bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f
+SIZE (rust/crates/termcolor-1.1.0.tar.gz) = 17193
+SHA256 (rust/crates/thread-scoped-1.0.2.tar.gz) = bcbb6aa301e5d3b0b5ef639c9a9c7e2f1c944f177b460c04dc24c69b1fa2bd99
+SIZE (rust/crates/thread-scoped-1.0.2.tar.gz) = 4321
+SHA256 (rust/crates/thread_local-1.0.1.tar.gz) = d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14
+SIZE (rust/crates/thread_local-1.0.1.tar.gz) = 12609
+SHA256 (rust/crates/threadpool-1.7.1.tar.gz) = e2f0c90a5f3459330ac8bc0d2f879c693bb7a2f59689c1083fc4ef83834da865
+SIZE (rust/crates/threadpool-1.7.1.tar.gz) = 15756
+SHA256 (rust/crates/time-0.1.43.tar.gz) = ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438
+SIZE (rust/crates/time-0.1.43.tar.gz) = 28653
+SHA256 (rust/crates/unicode-width-0.1.7.tar.gz) = caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479
+SIZE (rust/crates/unicode-width-0.1.7.tar.gz) = 16644
+SHA256 (rust/crates/unicode-xid-0.2.0.tar.gz) = 826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c
+SIZE (rust/crates/unicode-xid-0.2.0.tar.gz) = 14994
+SHA256 (rust/crates/users-0.9.1.tar.gz) = c72f4267aea0c3ec6d07eaabea6ead7c5ddacfafc5e22bcf8d186706851fb4cf
+SIZE (rust/crates/users-0.9.1.tar.gz) = 20456
+SHA256 (rust/crates/version_check-0.9.1.tar.gz) = 078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce
+SIZE (rust/crates/version_check-0.9.1.tar.gz) = 11459
+SHA256 (rust/crates/void-1.0.2.tar.gz) = 6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d
+SIZE (rust/crates/void-1.0.2.tar.gz) = 2356
+SHA256 (rust/crates/wasi-0.9.0+wasi-snapshot-preview1.tar.gz) = cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519
+SIZE (rust/crates/wasi-0.9.0+wasi-snapshot-preview1.tar.gz) = 31521
+SHA256 (rust/crates/winapi-0.3.8.tar.gz) = 8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6
+SIZE (rust/crates/winapi-0.3.8.tar.gz) = 1128308
+SHA256 (rust/crates/winapi-i686-pc-windows-gnu-0.4.0.tar.gz) = ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6
+SIZE (rust/crates/winapi-i686-pc-windows-gnu-0.4.0.tar.gz) = 2918815
+SHA256 (rust/crates/winapi-util-0.1.5.tar.gz) = 70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178
+SIZE (rust/crates/winapi-util-0.1.5.tar.gz) = 10164
+SHA256 (rust/crates/winapi-x86_64-pc-windows-gnu-0.4.0.tar.gz) = 712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f
+SIZE (rust/crates/winapi-x86_64-pc-windows-gnu-0.4.0.tar.gz) = 2947998
+SHA256 (rust/crates/xattr-0.2.2.tar.gz) = 244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c
+SIZE (rust/crates/xattr-0.2.2.tar.gz) = 11750
+SHA256 (bazelbuild-sandboxfs-sandboxfs-0.2.0_GH0.tar.gz) = bff68e7d33ae56a3f34a79a74b2576599f5ccc381a237bbc10b5a3c3ea106b60
+SIZE (bazelbuild-sandboxfs-sandboxfs-0.2.0_GH0.tar.gz) = 118702
diff --git a/filesystems/sandboxfs/files/patch-powerpc b/filesystems/sandboxfs/files/patch-powerpc
new file mode 100644
index 000000000000..df525d6e5b13
--- /dev/null
+++ b/filesystems/sandboxfs/files/patch-powerpc
@@ -0,0 +1,62 @@
+--- cargo-crates/libc-0.2.69/src/unix/bsd/freebsdlike/freebsd/mod.rs.orig 2020-03-17 20:35:43 UTC
++++ cargo-crates/libc-0.2.69/src/unix/bsd/freebsdlike/freebsd/mod.rs
+@@ -1486,6 +1486,9 @@ cfg_if! {
+ } else if #[cfg(target_arch = "powerpc64")] {
+ mod powerpc64;
+ pub use self::powerpc64::*;
++ } else if #[cfg(target_arch = "powerpc")] {
++ mod powerpc;
++ pub use self::powerpc::*;
+ } else {
+ // Unknown target_arch
+ }
+--- cargo-crates/libc-0.2.69/src/unix/bsd/freebsdlike/freebsd/powerpc.rs.orig 2021-06-23 22:40:24 UTC
++++ cargo-crates/libc-0.2.69/src/unix/bsd/freebsdlike/freebsd/powerpc.rs
+@@ -0,0 +1,47 @@
++pub type c_char = u8;
++pub type c_long = i32;
++pub type c_ulong = u32;
++pub type wchar_t = i32;
++pub type time_t = i64;
++pub type suseconds_t = i32;
++pub type register_t = i32;
++
++s! {
++ pub struct stat {
++ pub st_dev: ::dev_t,
++ pub st_ino: ::ino_t,
++ pub st_mode: ::mode_t,
++ pub st_nlink: ::nlink_t,
++ pub st_uid: ::uid_t,
++ pub st_gid: ::gid_t,
++ pub st_rdev: ::dev_t,
++ pub st_atime: ::time_t,
++ pub st_atime_nsec: ::c_long,
++ pub st_mtime: ::time_t,
++ pub st_mtime_nsec: ::c_long,
++ pub st_ctime: ::time_t,
++ pub st_ctime_nsec: ::c_long,
++ pub st_size: ::off_t,
++ pub st_blocks: ::blkcnt_t,
++ pub st_blksize: ::blksize_t,
++ pub st_flags: ::fflags_t,
++ pub st_gen: u32,
++ pub st_lspare: i32,
++ pub st_birthtime: ::time_t,
++ pub st_birthtime_nsec: ::c_long,
++ }
++}
++
++// should be pub(crate), but that requires Rust 1.18.0
++cfg_if! {
++ if #[cfg(libc_const_size_of)] {
++ #[doc(hidden)]
++ pub const _ALIGNBYTES: usize = ::mem::size_of::<::c_int>() - 1;
++ } else {
++ #[doc(hidden)]
++ pub const _ALIGNBYTES: usize = 4 - 1;
++ }
++}
++
++pub const MAP_32BIT: ::c_int = 0x00080000;
++pub const MINSIGSTKSZ: ::size_t = 2048; // 512 * 4
diff --git a/filesystems/sandboxfs/files/patch-src_lib.rs b/filesystems/sandboxfs/files/patch-src_lib.rs
new file mode 100644
index 000000000000..ffee85062382
--- /dev/null
+++ b/filesystems/sandboxfs/files/patch-src_lib.rs
@@ -0,0 +1,15 @@
+--- src/lib.rs.orig 2020-04-20 18:46:46 UTC
++++ src/lib.rs
+@@ -463,10 +463,10 @@ impl SandboxFS {
+ #[cfg(target_os = "linux")]
+ let code = Errno::ENODATA;
+
+- #[cfg(target_os = "macos")]
++ #[cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "macos"))]
+ let code = Errno::ENOATTR;
+
+- #[cfg(not(any(target_os = "linux", target_os = "macos")))]
++ #[cfg(not(any(target_os = "dragonfly", target_os = "freebsd", target_os = "linux", target_os = "macos")))]
+ compile_error!("Don't know what error to return on a missing getxattr");
+
+ Err(KernelError::from_errno(code))
diff --git a/filesystems/sandboxfs/files/patch-src_nodes_conv.rs b/filesystems/sandboxfs/files/patch-src_nodes_conv.rs
new file mode 100644
index 000000000000..949974945d2c
--- /dev/null
+++ b/filesystems/sandboxfs/files/patch-src_nodes_conv.rs
@@ -0,0 +1,41 @@
+Unbreak on i386
+
+error[E0308]: mismatched types
+ --> src/nodes/conv.rs:72:19
+ |
+72 | Timespec::new(val.tv_sec() as sys::time::time_t, usec)
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected i64, found i32
+
+--- src/nodes/conv.rs.orig 2020-04-20 18:46:46 UTC
++++ src/nodes/conv.rs
+@@ -69,7 +69,7 @@ pub fn timeval_to_timespec(val: sys::time::TimeVal) ->
+ } else {
+ val.tv_usec() as i32
+ };
+- Timespec::new(val.tv_sec() as sys::time::time_t, usec)
++ Timespec::new((val.tv_sec() as sys::time::time_t).into(), usec)
+ }
+
+ /// Converts a `sys::time::TimeVal` object into a `sys::time::TimeSpec`.
+@@ -328,6 +328,10 @@ mod tests {
+ // modified and may not be queryable, so stub them out.
+ attr.ctime = BAD_TIME;
+ attr.crtime = BAD_TIME;
++ // Ignore rdev too
++ attr.rdev = 0;
++ // XXX: gid is always 0 when the tests run on tmpfs(5)
++ attr.gid = exp_attr.gid;
+ assert!(fileattrs_eq(&exp_attr, &attr));
+ }
+
+@@ -365,6 +369,10 @@ mod tests {
+ // modified and may not be queryable, so stub them out.
+ attr.ctime = BAD_TIME;
+ attr.crtime = BAD_TIME;
++ // Ignore rdev too
++ attr.rdev = 0;
++ // XXX: gid is always 0 when the tests run on tmpfs(5)
++ attr.gid = exp_attr.gid;
+ assert!(fileattrs_eq(&exp_attr, &attr));
+ }
+
diff --git a/filesystems/sandboxfs/files/patch-src_nodes_mod.rs b/filesystems/sandboxfs/files/patch-src_nodes_mod.rs
new file mode 100644
index 000000000000..696e611469c7
--- /dev/null
+++ b/filesystems/sandboxfs/files/patch-src_nodes_mod.rs
@@ -0,0 +1,23 @@
+libc crate defines ENOTSUP as an alias for EOPNOTSUPP. nix crate
+does not re-export EOPNOTSUPP on FreeBSD but ENOTSUP is available.
+
+--- src/nodes/mod.rs.orig 2020-04-20 18:46:46 UTC
++++ src/nodes/mod.rs
+@@ -97,7 +97,7 @@ fn setattr_mode(attr: &mut fuse::FileAttr, path: Optio
+ if attr.kind == fuse::FileType::Symlink {
+ // TODO(jmmv): Should use NoFollowSymlink to support changing the mode of a symlink if
+ // requested to do so, but this is not supported on Linux.
+- return Err(nix::Error::from_errno(Errno::EOPNOTSUPP));
++ return Err(nix::Error::from_errno(Errno::ENOTSUP));
+ }
+
+ let result = try_path(path, |p|
+@@ -144,7 +144,7 @@ fn setattr_times(attr: &mut fuse::FileAttr, path: Opti
+ if attr.kind == fuse::FileType::Symlink {
+ eprintln!(
+ "utimensat not present; ignoring request to change symlink times for {:?}", path);
+- Err(nix::Error::from_errno(Errno::EOPNOTSUPP))
++ Err(nix::Error::from_errno(Errno::ENOTSUP))
+ } else {
+ try_path(path, |p| sys::stat::utimes(p, &atime, &mtime))
+ }
diff --git a/filesystems/sandboxfs/pkg-descr b/filesystems/sandboxfs/pkg-descr
new file mode 100644
index 000000000000..92e275c2262c
--- /dev/null
+++ b/filesystems/sandboxfs/pkg-descr
@@ -0,0 +1,9 @@
+Sandboxfs is a FUSE file system that exposes a combination of
+multiple files and directories from the host's file system in the
+form of a virtual tree with an arbitrary layout. You can think of
+a sandbox as an arbitrary view into the host's file system with
+different access privileges per directory.
+
+Sandboxfs is designed to allow running commands with limited access
+to the file system by using the virtual tree as their new root, and
+to do so consistently across a variety of platforms.
diff --git a/filesystems/sandboxfs/pkg-message b/filesystems/sandboxfs/pkg-message
new file mode 100644
index 000000000000..7ec584f0028f
--- /dev/null
+++ b/filesystems/sandboxfs/pkg-message
@@ -0,0 +1,10 @@
+[
+{ type: install
+ message: <<EOM
+WARNING: The interaction points with sandboxfs are subject to change
+at this point. In particular, the command-line interface and the
+data format used to reconfigure sandboxfs while it's running will
+most certainly change.
+EOM
+}
+]
diff --git a/filesystems/scan_ffs/Makefile b/filesystems/scan_ffs/Makefile
new file mode 100644
index 000000000000..59d5340aa7fb
--- /dev/null
+++ b/filesystems/scan_ffs/Makefile
@@ -0,0 +1,18 @@
+PORTNAME= scan_ffs
+PORTVERSION= 1.2
+PORTREVISION= 1
+CATEGORIES= filesystems sysutils
+MASTER_SITES= http://www.ranner.eu/stuff/
+
+MAINTAINER= michael@ranner.eu
+COMMENT= Scan_ffs recovers lost disklabel
+
+USES= tar:bzip2
+
+PLIST_FILES= sbin/scan_ffs share/man/man8/scan_ffs.8.gz
+
+do-install:
+ ${INSTALL_PROGRAM} ${WRKSRC}/scan_ffs ${STAGEDIR}${PREFIX}/sbin
+ ${INSTALL_MAN} ${WRKSRC}/scan_ffs.8 ${STAGEDIR}${PREFIX}/share/man/man8
+
+.include <bsd.port.mk>
diff --git a/filesystems/scan_ffs/distinfo b/filesystems/scan_ffs/distinfo
new file mode 100644
index 000000000000..f5fe89273c1e
--- /dev/null
+++ b/filesystems/scan_ffs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905190
+SHA256 (scan_ffs-1.2.tar.bz2) = a6d52583a275c02ca8c504a302e065b20512da5795cd2929cda13184c5305d4a
+SIZE (scan_ffs-1.2.tar.bz2) = 5119
diff --git a/filesystems/scan_ffs/pkg-descr b/filesystems/scan_ffs/pkg-descr
new file mode 100644
index 000000000000..d156d70ae1b7
--- /dev/null
+++ b/filesystems/scan_ffs/pkg-descr
@@ -0,0 +1,12 @@
+scan_ffs(8) recovers accidential lost or deleted disklabels.
+
+This is the life-saver of typos. If you have ever been working too long,
+and just happened to type 'disklabel -rw da0 floppy', instead of 'diskla-
+bel -rw fd0 floppy', you know what I am talking about.
+
+This little program will take a raw disk device (which you might have to
+create) that covers the whole disk, and finds all probable UFS/FFS parti-
+tions on the disk. It has various options to make it go faster, and to
+print out information to help in the reconstruction of the disklabel.
+
+Ported from OpenBSD to FreeBSD 4/5 with support for UFS1 and UFS2.
diff --git a/filesystems/securefs/Makefile b/filesystems/securefs/Makefile
new file mode 100644
index 000000000000..89cd7aa324d1
--- /dev/null
+++ b/filesystems/securefs/Makefile
@@ -0,0 +1,33 @@
+PORTNAME= securefs
+DISTVERSION= 0.14.3
+PORTREVISION= 2
+CATEGORIES= filesystems
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= ports@FreeBSD.org
+COMMENT= Filesystem in userspace with transparent encryption and decryption
+WWW= https://github.com/netheril96/securefs
+
+LICENSE= MIT
+LICENSE_FILE= ${WRKSRC}/LICENSE.md
+
+BUILD_DEPENDS= ${LOCALBASE}/include/tclap/TCLAPConfig.h:devel/tclap
+LIB_DEPENDS= libutf8proc.so:textproc/utf8proc \
+ libargon2.so:security/libargon2 \
+ libjsoncpp.so:devel/jsoncpp \
+ libcryptopp.so:security/cryptopp \
+ libabsl_strings.so:devel/abseil
+
+USES= cmake compiler:c++17-lang fuse pkgconfig
+
+USE_GITHUB= yes
+GH_ACCOUNT= netheril96
+
+PLIST_FILES= bin/securefs
+
+CMAKE_OFF= SECUREFS_ENABLE_BUILD_TEST \
+ SECUREFS_ENABLE_UNIT_TEST \
+ SECUREFS_USE_VCPKG
+CMAKE_ARGS= -DCMAKE_CXX_STANDARD=17
+
+.include <bsd.port.mk>
diff --git a/filesystems/securefs/distinfo b/filesystems/securefs/distinfo
new file mode 100644
index 000000000000..caa7b87bbd5f
--- /dev/null
+++ b/filesystems/securefs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1697868086
+SHA256 (netheril96-securefs-0.14.3_GH0.tar.gz) = 3323e027fc4399dbbaf2a2e5cde11dae4b4e19ff08b2f9208dc6742a9f2f0611
+SIZE (netheril96-securefs-0.14.3_GH0.tar.gz) = 419328
diff --git a/filesystems/securefs/pkg-descr b/filesystems/securefs/pkg-descr
new file mode 100644
index 000000000000..cbd0e2663d3e
--- /dev/null
+++ b/filesystems/securefs/pkg-descr
@@ -0,0 +1,4 @@
+securefs mounts a regular directory onto a mount point. The mount point appears
+as a regular filesystem, where one can read/write/create files, directories and
+symbolic links. The underlying directory will be automatically updated to
+contain the encrypted and authenticated contents.
diff --git a/filesystems/simple-mtpfs/Makefile b/filesystems/simple-mtpfs/Makefile
new file mode 100644
index 000000000000..2c04141d0886
--- /dev/null
+++ b/filesystems/simple-mtpfs/Makefile
@@ -0,0 +1,46 @@
+PORTNAME= simple-mtpfs
+DISTVERSIONPREFIX= v
+DISTVERSION= 0.4.0
+PORTREVISION= 1
+CATEGORIES= filesystems
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= ports@FreeBSD.org
+COMMENT= Simple MTP fuse filesystem driver
+WWW= https://github.com/phatina/simple-mtpfs
+
+LICENSE= GPLv2+
+
+BUILD_DEPENDS= autoconf-archive>0.2017:devel/autoconf-archive
+LIB_DEPENDS= libmtp.so:multimedia/libmtp
+
+USE_GITHUB= yes
+GH_ACCOUNT= phatina
+
+USES= autoreconf compiler:c++17-lang fuse localbase pkgconfig
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+MAKEFILE= makefile
+INSTALL_TARGET= install-strip
+PLIST_FILES= bin/${PORTNAME} \
+ share/man/man1/${PORTNAME}.1.gz
+PORTDOCS= AUTHORS NEWS README.md
+
+OPTIONS_DEFINE= DOCS
+
+# XXX move to PREFIX when bug 193596 lands
+.if exists(/etc/autofs)
+PLIST_FILES+= /etc/autofs/special_${PORTNAME}
+SUB_FILES+= special_${PORTNAME}
+.endif
+
+post-install:
+ (cd ${WRKSRC} && ${COPYTREE_SHARE} \
+ "${PORTDOCS}" ${STAGEDIR}${DOCSDIR})
+.if exists(/etc/autofs)
+ @${MKDIR} ${STAGEDIR}/etc/autofs
+ ${INSTALL_SCRIPT} ${WRKDIR}/special_${PORTNAME} \
+ ${STAGEDIR}/etc/autofs
+.endif
+
+.include <bsd.port.mk>
diff --git a/filesystems/simple-mtpfs/distinfo b/filesystems/simple-mtpfs/distinfo
new file mode 100644
index 000000000000..d9a8c2d015ab
--- /dev/null
+++ b/filesystems/simple-mtpfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1595446039
+SHA256 (phatina-simple-mtpfs-v0.4.0_GH0.tar.gz) = 1d011df3fa09ad0a5c09d48d84c03e6cddf86390af9eb4e0c178193f32f0e2fc
+SIZE (phatina-simple-mtpfs-v0.4.0_GH0.tar.gz) = 36234
diff --git a/filesystems/simple-mtpfs/files/patch-src__simple-mtpfs-fuse.cpp b/filesystems/simple-mtpfs/files/patch-src__simple-mtpfs-fuse.cpp
new file mode 100644
index 000000000000..d1dbca44fbe2
--- /dev/null
+++ b/filesystems/simple-mtpfs/files/patch-src__simple-mtpfs-fuse.cpp
@@ -0,0 +1,32 @@
+# Allow fake device file to use with fstab(5)
+
+--- src/simple-mtpfs-fuse.cpp.orig 2015-08-24 11:34:39 UTC
++++ src/simple-mtpfs-fuse.cpp
+@@ -309,12 +309,6 @@ bool SMTPFileSystem::parseOptions(int ar
+
+ --m_options.m_device_no;
+
+- // device file and -- device are mutually exclusive, fail if both set
+- if (m_options.m_device_no && m_options.m_device_file) {
+- m_options.m_good = false;
+- return false;
+- }
+-
+ m_options.m_good = true;
+ return true;
+ }
+@@ -379,11 +373,9 @@ bool SMTPFileSystem::exec()
+ return false;
+ }
+
+- if (m_options.m_device_file) {
+- // Try to use device file first, if provided
+- if (!m_device.connect(m_options.m_device_file))
+- return false;
+- } else {
++ // Try to use device file first, ignore otherwise
++ if (!m_options.m_device_file ||
++ !m_device.connect(m_options.m_device_file)) {
+ // Connect to MTP device by order number, if no device file supplied
+ if (!m_device.connect(m_options.m_device_no))
+ return false;
diff --git a/filesystems/simple-mtpfs/files/special_simple-mtpfs.in b/filesystems/simple-mtpfs/files/special_simple-mtpfs.in
new file mode 100644
index 000000000000..7f45b8649e53
--- /dev/null
+++ b/filesystems/simple-mtpfs/files/special_simple-mtpfs.in
@@ -0,0 +1,18 @@
+#!/bin/sh
+#
+# Intended for use with /etc/auto_master containing
+# /mtp -simple-mtpfs -allow_other
+#
+
+out=$(%%PREFIX%%/bin/simple-mtpfs --list-devices)
+[ $? -eq 0 ] || exit 1
+
+if [ $# -eq 0 ]; then
+ echo "$out" | sed 's/[^:]*: //' | sort -u
+ exit 0
+fi
+
+devno=$(echo "$out" | (fgrep "$1" || echo 0) | sed 's/:.*//')
+[ $devno -gt 0 ] || exit 1
+
+echo "/ -fstype=none,--device=$devno,mountprog=%%PREFIX%%/bin/simple-mtpfs :none"
diff --git a/filesystems/simple-mtpfs/pkg-descr b/filesystems/simple-mtpfs/pkg-descr
new file mode 100644
index 000000000000..4b44f0a90134
--- /dev/null
+++ b/filesystems/simple-mtpfs/pkg-descr
@@ -0,0 +1,6 @@
+Simple FUSE filesystem for reading from and writing to MTP devices.
+
+SIMPLE-MTPFS (Simple Media Transfer Protocol FileSystem) is a file system for
+Linux (and other operating systems with a FUSE implementation, such as Mac OS X
+or FreeBSD) capable of operating on files on MTP devices attached via USB to
+local machine.
diff --git a/filesystems/smbnetfs/Makefile b/filesystems/smbnetfs/Makefile
new file mode 100644
index 000000000000..a577b6ece99b
--- /dev/null
+++ b/filesystems/smbnetfs/Makefile
@@ -0,0 +1,54 @@
+PORTNAME= smbnetfs
+PORTVERSION= 0.6.3
+PORTREVISION= 1
+CATEGORIES= filesystems net
+MASTER_SITES= SF/${PORTNAME}/${PORTNAME}/SMBNetFS-${PORTVERSION}
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= ports@virtual-estates.net
+COMMENT= Mount smb shares (Fuse filesystem)
+WWW= https://sourceforge.net/projects/smbnetfs/
+
+LICENSE= GPLv2
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+OPTIONS_DEFINE= DOCS LIBSECRET
+
+LIBSECRET_DESC= Use libsecret to store credentials
+LIBSECRET_CONFIGURE_WITH= libsecret
+LIBSECRET_LIB_DEPENDS= libsecret-*.so:security/libsecret
+
+DOCSDIR= ${PREFIX}/share/doc/${PORTNAME}-${PORTVERSION}
+
+USES= compiler:c11 fuse gnome iconv pkgconfig samba:lib tar:bzip2
+USE_GNOME= glib20:build
+
+GNU_CONFIGURE= yes
+# A hack to disable gratuitous linking with -lglib-2.0
+CONFIGURE_ENV+= GLIB_LIBS=-L/var/empty
+CFLAGS+= -I${SAMBAINCLUDES} -DFUSE_USE_VERSION=${FUSE_VERSION}
+LDFLAGS+= -L${SAMBALIBS}
+SUB_FILES= pkg-message
+# configure just generated config.h -- we do not need to redo it:
+MAKE_ARGS+= AUTOHEADER=${TRUE}
+
+.include <bsd.port.pre.mk>
+
+.if ${ICONV_LIB} == ""
+CONFIGURE_ENV+= ac_cv_lib_iconv_iconv_open=yes
+CONFIGURE_ARGS+=--with-libiconv=native
+.endif
+
+# Uses/fuse.mk should be doing the below:
+.if ${LIBFUSE_VER} == 3
+CONFIGURE_ENV+= FUSE_CFLAGS="-I${LOCALBASE}/include/fuse3" \
+ FUSE_LIBS="-L${LOCALBASE}/lib -lfuse3"
+FUSEPKG= fuse3
+LDFLAGS+= -lthr
+.else
+FUSEPKG= fuse
+.endif
+FUSE_VERSION= "`pkgconf --modversion ${FUSEPKG} | \
+ ${SED} -E 's,^([0-9]+)\.([0-9]+)\..*,\1\2,'`"
+
+.include <bsd.port.post.mk>
diff --git a/filesystems/smbnetfs/distinfo b/filesystems/smbnetfs/distinfo
new file mode 100644
index 000000000000..3e27f3e6cd71
--- /dev/null
+++ b/filesystems/smbnetfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1681329971
+SHA256 (smbnetfs-0.6.3.tar.bz2) = eac37b9769fbe9c3f4baf3eb64c61a6b59ad4f2aa05dfddcba5a1ac4adf4d560
+SIZE (smbnetfs-0.6.3.tar.bz2) = 187460
diff --git a/filesystems/smbnetfs/files/patch-fuse3 b/filesystems/smbnetfs/files/patch-fuse3
new file mode 100644
index 000000000000..c30563999e05
--- /dev/null
+++ b/filesystems/smbnetfs/files/patch-fuse3
@@ -0,0 +1,216 @@
+Allow use of either libfuse3 or libfuse...
+
+ -mi
+
+--- src/event.c 2018-01-04 15:59:38 -0500
++++ src/event.c 2018-02-01 11:12:59 -0500
+@@ -5,5 +5,5 @@
+ #include <pthread.h>
+ #include <libsmbclient.h>
+-#include <fuse/fuse.h>
++#include <fuse.h>
+ #include <glib.h>
+
+--- configure 2018-01-04 16:00:23 -0500
++++ configure 2018-02-01 11:16:43 -0500
+@@ -4059,5 +4059,5 @@
+ fi
+ LIBS="$LIBS $FUSE_LIBS"
+-CFLAGS="$CFLAGS -D_REENTRANT -D_GNU_SOURCE -DFUSE_USE_VERSION=26 $FUSE_CFLAGS"
++CFLAGS="$CFLAGS -D_REENTRANT -D_GNU_SOURCE $FUSE_CFLAGS"
+
+
+--- src/event.h 2018-01-04 15:59:38.000000000 -0500
++++ src/event.h 2018-02-01 11:20:21.779895000 -0500
+@@ -2,5 +2,5 @@
+ #define __EVENT_H__
+
+-#include <fuse/fuse.h>
++#include <fuse.h>
+
+ int event_set_query_browser_flag(int flag);
+--- src/function.h 2018-01-04 15:59:38.000000000 -0500
++++ src/function.h 2018-02-01 11:21:10.116105000 -0500
+@@ -2,5 +2,5 @@
+ #define __FUNCTION_H__
+
+-#include <fuse/fuse.h>
++#include <fuse.h>
+
+ extern struct fuse_operations smb_oper;
+--- src/function.c 2018-01-04 20:59:38.000000000 +0000
++++ src/function.c 2018-02-01 18:28:01.664078000 +0000
+@@ -149,5 +151,13 @@
+ }
+
+-static int function_rename(const char *from, const char *to){
++static int function_rename(const char *from, const char *to
++#if FUSE_USE_VERSION > 29
++ , unsigned int flags __unused
++#endif
++){
++ /*
++ * XXX Maybe, we should check the flags-argument to better
++ * XXX manage the caller's expectations?
++ */
+ DPRINTF(5, "(%s, %s)\n", from, to);
+ if (smbitem_what_is(from) != SMBITEM_SMB_SHARE_ITEM) return -EINVAL;
+@@ -188,6 +198,15 @@
+ }
+
++
+ static int function_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
+- off_t offset, struct fuse_file_info *fi){
++ off_t offset, struct fuse_file_info *fi
++#if FUSE_USE_VERSION > 29
++ , enum fuse_readdir_flags flags __unused
++#define CALL_FILLER(buf, path, st, offset) \
++ filler(buf, path, st, offset, 0)
++#else
++#define CALL_FILLER filler
++#endif
++){
+ samba_fd fd;
+ int error, rec_cnt;
+@@ -208,6 +227,6 @@
+ error = EINVAL;
+ st.st_mode = S_IFDIR;
+- if (filler(buf, ".", &st, 0)) goto error0;
+- if (filler(buf, "..", &st, 0)) goto error0;
++ if (CALL_FILLER(buf, ".", &st, 0)) goto error0;
++ if (CALL_FILLER(buf, "..", &st, 0)) goto error0;
+
+ show_hidden_hosts = function_get_hidden_hosts_visibility();
+@@ -227,5 +246,5 @@
+ goto error0;
+ }
+- if (filler(buf, dir->childs[i]->name, &st, 0)) goto end;
++ if (CALL_FILLER(buf, dir->childs[i]->name, &st, 0)) goto end;
+ }
+ error = 0;
+@@ -299,9 +318,9 @@
+ memset(&st, 0, sizeof(st));
+ st.st_mode = S_IFDIR;
+- if (filler(buf, ".", &st, 0)) goto end;
+- if (filler(buf, "..", &st, 0)) goto end;
++ if (CALL_FILLER(buf, ".", &st, 0)) goto end;
++ if (CALL_FILLER(buf, "..", &st, 0)) goto end;
+ rec_cnt += 2;
+ }
+- if (filler(buf, rec->d_name, &st, 0)){
++ if (CALL_FILLER(buf, rec->d_name, &st, 0)){
+ error = EINVAL;
+ goto end;
+@@ -317,6 +336,6 @@
+ error = EINVAL;
+ st.st_mode = S_IFDIR;
+- if (filler(buf, ".", &st, 0)) goto end;
+- if (filler(buf, "..", &st, 0)) goto end;
++ if (CALL_FILLER(buf, ".", &st, 0)) goto end;
++ if (CALL_FILLER(buf, "..", &st, 0)) goto end;
+ rec_cnt += 2;
+ }
+@@ -341,5 +360,11 @@
+ }
+
+-static int function_stat(const char *path, struct stat *stbuf){
++static int function_fstat(const char *path, struct stat *stbuf,
++ struct fuse_file_info *fi);
++static int function_stat(const char *path, struct stat *stbuf
++#if FUSE_USE_VERSION > 29
++ , struct fuse_file_info *fi
++#endif
++){
+ int i, count;
+ size_t len;
+@@ -347,4 +372,8 @@
+ char buf[2048];
+
++#if FUSE_USE_VERSION > 29
++ if (fi != NULL)
++ return function_fstat(path, stbuf, fi);
++#endif
+ DPRINTF(5, "(%s)\n", path);
+ if (stat_workaround_is_name_ignored(path)) return -ENOENT;
+@@ -462,5 +491,9 @@
+ }
+
+-static int function_chmod(const char *path, mode_t mode){
++static int function_chmod(const char *path, mode_t mode
++#if FUSE_USE_VERSION > 29
++ , struct fuse_file_info *fi __unused /* XXX make some use of it? */
++#endif
++){
+ DPRINTF(5, "(%s, %o)\n", path, mode);
+ if (smbitem_what_is(path) != SMBITEM_SMB_SHARE_ITEM) return -EINVAL;
+@@ -469,4 +502,5 @@
+ }
+
++#if FUSE_USE_VERSION < 30
+ static int function_utimes(const char *path, struct utimbuf *buffer){
+ struct timeval tbuf[2];
+@@ -483,4 +517,21 @@
+ return 0;
+ }
++#else
++static int function_utimens(const char *path, const struct timespec tv[2],
++ struct fuse_file_info *fi __unused)
++{
++ struct timeval tbuf[2];
++
++ DPRINTF(5, "(%s, %lu)\n", path, (unsigned long)tv[0].tv_sec);
++ if (smbitem_what_is(path) != SMBITEM_SMB_SHARE_ITEM) return -EINVAL;
++
++ tbuf[0].tv_sec = tv[0].tv_sec;
++ tbuf[0].tv_usec = tv[0].tv_nsec / 1000;
++ tbuf[1].tv_sec = tv[1].tv_sec;
++ tbuf[1].tv_usec = tv[1].tv_nsec / 1000;
++ if (samba_utimes(path, tbuf) != 0) return -errno;
++ return 0;
++}
++#endif
+
+ /* libfuse does not support lsetxattr() and fsetxattr(), but samba does */
+@@ -542,5 +593,9 @@
+ }
+
+-static int function_chown(const char *path, uid_t uid, gid_t gid){
++static int function_chown(const char *path, uid_t uid, gid_t gid
++#if FUSE_USE_VERSION > 29
++ , struct fuse_file_info *fi __unused
++#endif
++){
+ (void) path;
+ (void) uid;
+@@ -552,7 +607,15 @@
+ }
+
+-static int function_truncate(const char *path, off_t size){
++static int function_truncate(const char *path, off_t size
++#if FUSE_USE_VERSION > 29
++ , struct fuse_file_info *fi
++#endif
++){
+ samba_fd fd;
+
++#if FUSE_USE_VERSION > 29
++ if (fi != NULL)
++ return function_ftruncate(path, size, fi);
++#endif
+ DPRINTF(5, "(%s, %lld)\n", path, (long long) size);
+ if (size < 0) return -EINVAL;
+@@ -602,8 +665,14 @@
+ .rmdir = function_rmdir,
+ .getattr = function_stat,
++#if FUSE_USE_VERSION < 30
+ .fgetattr = function_fstat,
+ .ftruncate = function_ftruncate,
++#endif
+ .chmod = function_chmod,
++#if FUSE_USE_VERSION < 30
+ .utime = function_utimes,
++#else
++ .utimens = function_utimens,
++#endif
+ .setxattr = function_setxattr,
+ .getxattr = function_getxattr,
diff --git a/filesystems/smbnetfs/files/pkg-message.in b/filesystems/smbnetfs/files/pkg-message.in
new file mode 100644
index 000000000000..0fcdc867d05a
--- /dev/null
+++ b/filesystems/smbnetfs/files/pkg-message.in
@@ -0,0 +1,33 @@
+[
+{ type: install
+ message: <<EOM
+===> Basic Instructions:
+
+Load fusefs:
+ # kldload fusefs
+
+To load fusefs at boot time, add it to rc.conf:
+ # sysrc kld_list+=fusefs
+
+After fusefs is loaded, and setting
+ # sysctl vfs.usermount=1
+
+you should make .smb directory in your homedir:
+ % mkdir ~/.smb
+
+Copy your smb.conf (usually in %%PREFIX%%/etc/) and
+%%DOCSDIR%%/smbnetfs.conf to this directory:
+ % cp %%PREFIX%%/etc/smb.conf %%DOCSDIR%%/smbnetfs.conf ~/.smb/
+
+Make mountpoint for smb network and mount it:
+ % mkdir ~/mountpoint
+ % smbnetfs ~/mountpoint
+
+Now you can get access to smb shares in your network, for example:
+ % cd ~/mountpoint/ip-addr
+
+XXX Note, use of Gnome keyring was replaced in version 0.6.1 with
+XXX libsecret, which this port does not enable by default.
+EOM
+}
+]
diff --git a/filesystems/smbnetfs/pkg-descr b/filesystems/smbnetfs/pkg-descr
new file mode 100644
index 000000000000..b8083d7ddc58
--- /dev/null
+++ b/filesystems/smbnetfs/pkg-descr
@@ -0,0 +1,18 @@
+SMBNetFS is a filesystem that allow you to use samba/microsoft network
+in the same manner as the network neighborhood in Microsoft Windows.
+
+Featuries:
+ * you can use Samba/Microsoft network as a regular Unix filesystem
+ * workgroup/computer/share entries are dynamically created
+ * Windows domain supported
+ * kerberos support (New)
+ * user defined workgroup/link/hosts are supported
+ * national character supported
+ * in config files you can specify different user/password to access
+ different network shares
+ * you can access any computer in the world by "cd mountpoint/ip-addr"
+ command, where "ip-addr" is the IP address of the desired computer. Do
+ not warry that there is no file with such name :-)
+ * command "cd mountpoint/username:password@computer_or_ip" allows
+ you to access "computer_or_ip" as user "username" with password
+ "password" (this is insecure, but usefull)
diff --git a/filesystems/smbnetfs/pkg-plist b/filesystems/smbnetfs/pkg-plist
new file mode 100644
index 000000000000..655ee52c5eb8
--- /dev/null
+++ b/filesystems/smbnetfs/pkg-plist
@@ -0,0 +1,5 @@
+bin/smbnetfs
+%%PORTDOCS%%%%DOCSDIR%%/INSTALL
+%%PORTDOCS%%%%DOCSDIR%%/ENGLISH.FAQ
+%%PORTDOCS%%%%DOCSDIR%%/RUSSIAN.FAQ
+%%PORTDOCS%%%%DOCSDIR%%/smbnetfs.conf
diff --git a/filesystems/sqlfs/Makefile b/filesystems/sqlfs/Makefile
new file mode 100644
index 000000000000..820783f9370f
--- /dev/null
+++ b/filesystems/sqlfs/Makefile
@@ -0,0 +1,41 @@
+PORTNAME= sqlfs
+PORTVERSION= 1.1
+PORTREVISION= 1
+PORTEPOCH= 1
+CATEGORIES= filesystems
+MASTER_SITES= SAVANNAH/libsqlfs
+PKGNAMEPREFIX= fusefs-
+DISTNAME= lib${PORTNAME}-${PORTVERSION}
+
+MAINTAINER= ports@FreeBSD.org
+COMMENT= SQLite backed FUSE file system
+WWW= https://www.nongnu.org/libsqlfs/
+
+LICENSE= LGPL21+
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+DEPRECATED= Abandoned upstream, superseded by forks
+EXPIRATION_DATE=2024-12-31
+
+USES= fuse sqlite
+
+PORTDOCS= README
+PLIST_FILES= bin/sqlfs
+
+OPTIONS_DEFINE= DOCS
+
+do-build:
+ (cd ${WRKSRC} && ${CC} -DFUSE -DFUSE_USE_VERSION=25 \
+ -D_FILE_OFFSET_BITS=64 -D_REENTRANT ${CFLAGS} \
+ -I. -I${LOCALBASE}/include -L${LOCALBASE}/lib \
+ -lfuse -lsqlite${SQLITE_VER} sqlfs.c fuse_main.c \
+ -o sqlfs)
+
+do-install:
+ ${INSTALL_PROGRAM} ${WRKSRC}/sqlfs ${STAGEDIR}${PREFIX}/bin
+
+do-install-DOCS-on:
+ @${MKDIR} ${STAGEDIR}${DOCSDIR}
+ ${INSTALL_DATA} ${PORTDOCS:S,^,${WRKSRC}/,} ${STAGEDIR}${DOCSDIR}
+
+.include <bsd.port.mk>
diff --git a/filesystems/sqlfs/distinfo b/filesystems/sqlfs/distinfo
new file mode 100644
index 000000000000..dea05271c448
--- /dev/null
+++ b/filesystems/sqlfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905177
+SHA256 (libsqlfs-1.1.tar.gz) = 0ca70ae5f6153186e54931365bb4932a29c96be3e39aa9a981d838b53f3705ff
+SIZE (libsqlfs-1.1.tar.gz) = 329744
diff --git a/filesystems/sqlfs/files/patch-fuse_main.c b/filesystems/sqlfs/files/patch-fuse_main.c
new file mode 100644
index 000000000000..2e9fff3146e2
--- /dev/null
+++ b/filesystems/sqlfs/files/patch-fuse_main.c
@@ -0,0 +1,65 @@
+--- fuse_main.c.orig 2006-10-25 15:28:26 UTC
++++ fuse_main.c
+@@ -17,12 +17,60 @@ Foundation, Inc., 51 Franklin Street, Fi
+
+ *****************************************************************************/
+
++#include <stdlib.h>
++#include <stdio.h>
++#include <sysexits.h>
+ #include "sqlfs.h"
+
++void usage() __dead2;
++
++void usage()
++{
++ fprintf(stderr, "Usage: %s -o dbname [-h] dir\n", getprogname());
++
++ exit(EX_USAGE);
++}
+
+ int main(int argc, char **argv)
+ {
+- sqlfs_init("/tmp/fsdata");
++ char c;
++ int ret;
++ char *dbname = NULL;
++ char *args[2];
++ char *prog = argv[0];
++
++ while ((c = getopt(argc, argv, "o:h")) != -1)
++ switch (c) {
++ case 'o':
++ dbname = strdup(optarg);
++ break;
++ case 'h':
++ /* FALLTHROUGH */
++ default:
++ usage();
++ /* NOTREACHED */
++ }
++ argc -= optind;
++ argv += optind;
++
++ if (dbname == NULL) {
++ dbname = getenv("SQLFS_DBNAME");
++ }
++
++ if (dbname == NULL || argc < 1)
++ usage();
++ /* NOTREACHED */
++
++ ret = sqlfs_init(dbname);
++ if (ret != 0)
++ return ret;
++
++ fprintf(stderr, "init\n");
++
++ args[0] = strdup(getprogname());
++ args[1] = strdup(argv[0]);
+
+- return sqlfs_fuse_main(argc, argv);
++ ret = sqlfs_fuse_main(2, args);
++
++ return ret;
+ }
diff --git a/filesystems/sqlfs/pkg-descr b/filesystems/sqlfs/pkg-descr
new file mode 100644
index 000000000000..378379443d03
--- /dev/null
+++ b/filesystems/sqlfs/pkg-descr
@@ -0,0 +1,6 @@
+The sqlfs filesystem implements a POSIX style file system on top of an SQLite
+database. It allows applications to have access to a full read/write
+file system in a single file, complete with its own file hierarchy and name
+space. This is useful for applications which needs structured storage, such
+as embedding documents within documents, or management of configuration
+data or preferences.
diff --git a/filesystems/sqlfs/pkg-message b/filesystems/sqlfs/pkg-message
new file mode 100644
index 000000000000..7d5fccea8529
--- /dev/null
+++ b/filesystems/sqlfs/pkg-message
@@ -0,0 +1,13 @@
+[
+{ type: install
+ message: <<EOM
+Now sqlfs filesystem is installed.
+You can mount it by issuing
+% sqlfs -o /path/to/sqlite/database /path/to/mountpoint
+
+Alternatively you can supply database name via SQLFS_DBNAME env variable
+
+For additional information see supplied documentation.
+EOM
+}
+]
diff --git a/filesystems/squashfs-tools-ng/Makefile b/filesystems/squashfs-tools-ng/Makefile
new file mode 100644
index 000000000000..c2b6818c66d2
--- /dev/null
+++ b/filesystems/squashfs-tools-ng/Makefile
@@ -0,0 +1,43 @@
+PORTNAME= squashfs-tools-ng
+PORTVERSION= 1.3.2
+CATEGORIES= filesystems sysutils
+MASTER_SITES= https://infraroot.at/pub/squashfs/
+
+MAINTAINER= danfe@FreeBSD.org
+COMMENT= New set of tools and libraries to work with SquashFS images
+WWW= https://infraroot.at/projects/squashfs-tools-ng/
+
+LICENSE= GPLv3+ LGPL3+
+LICENSE_COMB= dual
+LICENSE_FILE= ${WRKSRC}/COPYING.md
+
+USES= libtool pkgconfig tar:xz
+GNU_CONFIGURE= yes
+USE_LDCONFIG= yes
+INSTALL_TARGET= install-strip
+TEST_TARGET= check
+
+OPTIONS_DEFINE= DOCS LZ4 LZO TOOLS ZSTD
+OPTIONS_DEFAULT= LZ4 LZO TOOLS ZSTD
+OPTIONS_SUB= yes
+TOOLS_DESC= Build the tools, not just the library
+
+LZ4_LIB_DEPENDS= liblz4.so:archivers/liblz4
+LZ4_CONFIGURE_OFF= --without-lz4
+
+LZO_LIB_DEPENDS= liblzo2.so:archivers/lzo2
+LZO_CONFIGURE_ENV= LZO_CFLAGS="-I${LOCALBASE}/include" \
+ LZO_LIBS="-L${LOCALBASE}/lib -llzo2"
+LZO_CONFIGURE_OFF= --without-lzo
+
+TOOLS_CONFIGURE_OFF= --without-tools
+
+ZSTD_LIB_DEPENDS= libzstd.so:archivers/zstd
+ZSTD_CONFIGURE_OFF= --without-zstd
+
+post-install-DOCS-on:
+ @${MKDIR} ${STAGEDIR}${DOCSDIR}
+ ${INSTALL_DATA} ${WRKSRC}/CHANGELOG.md ${WRKSRC}/README.md \
+ ${WRKSRC}/doc/* ${STAGEDIR}${DOCSDIR}
+
+.include <bsd.port.mk>
diff --git a/filesystems/squashfs-tools-ng/distinfo b/filesystems/squashfs-tools-ng/distinfo
new file mode 100644
index 000000000000..e39b6384c88e
--- /dev/null
+++ b/filesystems/squashfs-tools-ng/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1727359852
+SHA256 (squashfs-tools-ng-1.3.2.tar.xz) = 0d907ac3e735c351e47c867fb51d94bffa3b05fb95bec01f31e848b7c44215a9
+SIZE (squashfs-tools-ng-1.3.2.tar.xz) = 585380
diff --git a/filesystems/squashfs-tools-ng/pkg-descr b/filesystems/squashfs-tools-ng/pkg-descr
new file mode 100644
index 000000000000..e11c2c62ff02
--- /dev/null
+++ b/filesystems/squashfs-tools-ng/pkg-descr
@@ -0,0 +1,19 @@
+SquashFS is a highly compressed, read-only file system often used as
+a root file system on embedded devices, live systems, or simply as a
+compressed archive format.
+
+This project originally started out as a fork of squashfs-tools 4.3,
+after encountering some short comings and realizing that there have
+been no updates on the SourceForge site or mailing list for a long
+time. Even before the first public release, the fork was replaced
+with a complete re-write after growing frustrated with the existing
+code base.
+
+The utilities provided by squashfs-tools-ng offer alternative tooling
+and are intentionally named differently, so both packages can be
+installed side by side.
+
+The actual guts of squashfs-tools-ng are encapsulated in a library
+with a generic API designed to make SquashFS available to other
+applications as an embeddable, extensible archive format (or simply
+to read, write, or manipulate SquashFS file systems).
diff --git a/filesystems/squashfs-tools-ng/pkg-plist b/filesystems/squashfs-tools-ng/pkg-plist
new file mode 100644
index 000000000000..c45f36f07a70
--- /dev/null
+++ b/filesystems/squashfs-tools-ng/pkg-plist
@@ -0,0 +1,44 @@
+%%TOOLS%%bin/gensquashfs
+%%TOOLS%%bin/rdsquashfs
+%%TOOLS%%bin/sqfs2tar
+%%TOOLS%%bin/sqfsdiff
+%%TOOLS%%bin/tar2sqfs
+include/sqfs/block.h
+include/sqfs/block_processor.h
+include/sqfs/block_writer.h
+include/sqfs/compressor.h
+include/sqfs/data_reader.h
+include/sqfs/dir.h
+include/sqfs/dir_reader.h
+include/sqfs/dir_writer.h
+include/sqfs/error.h
+include/sqfs/frag_table.h
+include/sqfs/id_table.h
+include/sqfs/inode.h
+include/sqfs/io.h
+include/sqfs/meta_reader.h
+include/sqfs/meta_writer.h
+include/sqfs/predef.h
+include/sqfs/super.h
+include/sqfs/table.h
+include/sqfs/xattr.h
+include/sqfs/xattr_reader.h
+include/sqfs/xattr_writer.h
+lib/libsquashfs.a
+lib/libsquashfs.so
+lib/libsquashfs.so.1
+lib/libsquashfs.so.1.4.1
+libdata/pkgconfig/libsquashfs1.pc
+%%PORTDOCS%%%%DOCSDIR%%/CHANGELOG.md
+%%PORTDOCS%%%%DOCSDIR%%/README.md
+%%PORTDOCS%%%%DOCSDIR%%/architecture.md
+%%PORTDOCS%%%%DOCSDIR%%/benchmark.ods
+%%PORTDOCS%%%%DOCSDIR%%/benchmark.txt
+%%PORTDOCS%%%%DOCSDIR%%/format.adoc
+%%PORTDOCS%%%%DOCSDIR%%/mainpage.dox
+%%PORTDOCS%%%%DOCSDIR%%/parallelism.txt
+%%TOOLS%%share/man/man1/gensquashfs.1.gz
+%%TOOLS%%share/man/man1/rdsquashfs.1.gz
+%%TOOLS%%share/man/man1/sqfs2tar.1.gz
+%%TOOLS%%share/man/man1/sqfsdiff.1.gz
+%%TOOLS%%share/man/man1/tar2sqfs.1.gz
diff --git a/filesystems/squashfs-tools/Makefile b/filesystems/squashfs-tools/Makefile
new file mode 100644
index 000000000000..d7a8a1105688
--- /dev/null
+++ b/filesystems/squashfs-tools/Makefile
@@ -0,0 +1,66 @@
+PORTNAME= squashfs-tools
+PORTVERSION= 4.6.1
+PORTREVISION= 1
+CATEGORIES= filesystems sysutils
+MASTER_SITES= SF/squashfs/squashfs/squashfs${PORTVERSION}
+DISTFILES= squashfs${PORTVERSION}${EXTRACT_SUFX}
+
+MAINTAINER= danfe@FreeBSD.org
+COMMENT= Set of tools to manipulate squashfs images
+WWW= https://squashfs.sourceforge.net/
+
+LICENSE= GPLv2
+LICENSE_FILE= ${WRKSRC}/../COPYING
+
+BUILD_DEPENDS= gsed:textproc/gsed help2man:misc/help2man
+
+USES= alias cpe gmake
+
+MAKE_ARGS= INSTALL_MANPAGES_DIR=${PREFIX}/share/man/man1
+
+BINARY_ALIAS= sed=gsed
+
+PLIST_FILES= bin/mksquashfs bin/sqfscat bin/sqfstar bin/unsquashfs \
+ share/man/man1/mksquashfs.1.gz share/man/man1/sqfscat.1.gz \
+ share/man/man1/sqfstar.1.gz share/man/man1/unsquashfs.1.gz
+
+OPTIONS_DEFINE= DOCS LZ4 LZMA LZO XZ ZSTD
+OPTIONS_DEFAULT= LZ4 LZMA LZO XZ ZSTD
+LZMA_DESC= LZMA1 compression support (obsolete)
+XZ_DESC= XZ (LZMA2) compression support
+
+WRKSRC= ${WRKDIR}/${DISTNAME}/squashfs-tools
+
+CPE_PRODUCT= squashfs
+CPE_VENDOR= squashfs_project
+
+PORTDOCS= ACKNOWLEDGEMENTS ACTIONS-README CHANGES \
+ README-${PORTVERSION} TECHNICAL-INFO USAGE-* \
+ pseudo-file.example
+
+LZ4_LIB_DEPENDS= liblz4.so:archivers/liblz4
+LZ4_MAKE_ARGS= LZ4_SUPPORT=1
+
+LZMA_MASTER_SITES= SF/sevenzip/LZMA%20SDK/:lzma
+LZMA_DISTFILES= lzma922.tar.bz2:lzma
+LZMA_MAKE_ARGS= LZMA_SUPPORT=1 LZMA_DIR=${WRKDIR} EXTRA_CFLAGS=-D_7ZIP_ST
+
+LZO_LIB_DEPENDS= liblzo2.so:archivers/lzo2
+LZO_MAKE_ARGS= LZO_SUPPORT=1 LZO_LIBDIR=-L${LOCALBASE}/lib
+
+XZ_MAKE_ARGS= XZ_SUPPORT=1
+
+ZSTD_LIB_DEPENDS= libzstd.so:archivers/zstd
+ZSTD_MAKE_ARGS= ZSTD_SUPPORT=1
+
+post-patch:
+ @${REINPLACE_CMD} -e '/^#include "squashfs_fs\.h"/ { x; \
+ s,^,typedef struct __sFILE FILE;,; G; }' \
+ ${WRKSRC}/lzma_wrapper.c
+
+post-install:
+ @${LN} -f ${WRKSRC:H}/examples/pseudo-file.example ${WRKSRC:H}
+ @${MKDIR} ${STAGEDIR}${DOCSDIR}
+ ${INSTALL_DATA} ${PORTDOCS:S|^|${WRKSRC:H}/|} ${STAGEDIR}${DOCSDIR}
+
+.include <bsd.port.mk>
diff --git a/filesystems/squashfs-tools/distinfo b/filesystems/squashfs-tools/distinfo
new file mode 100644
index 000000000000..4747eff52625
--- /dev/null
+++ b/filesystems/squashfs-tools/distinfo
@@ -0,0 +1,5 @@
+TIMESTAMP = 1679779447
+SHA256 (squashfs4.6.1.tar.gz) = 94201754b36121a9f022a190c75f718441df15402df32c2b520ca331a107511c
+SIZE (squashfs4.6.1.tar.gz) = 286848
+SHA256 (lzma922.tar.bz2) = 9aade84f229fb25f7aef39d8866b375fe6d35a9e18098d7cd86a99e294902944
+SIZE (lzma922.tar.bz2) = 546148
diff --git a/filesystems/squashfs-tools/files/patch-Makefile b/filesystems/squashfs-tools/files/patch-Makefile
new file mode 100644
index 000000000000..cb729b5d2dc4
--- /dev/null
+++ b/filesystems/squashfs-tools/files/patch-Makefile
@@ -0,0 +1,75 @@
+--- Makefile.orig 2022-03-17 19:32:02 UTC
++++ Makefile
+@@ -101,7 +101,7 @@ COMP_DEFAULT = gzip
+ # If your C library or build/target environment doesn't support XATTRs then
+ # comment out the next line to build Mksquashfs and Unsquashfs without XATTR
+ # support
+-XATTR_SUPPORT = 1
++# XATTR_SUPPORT = 1
+
+ # Select whether you wish xattrs to be stored by Mksquashfs and extracted
+ # by Unsquashfs by default. If selected users can disable xattr support by
+@@ -109,7 +109,7 @@ XATTR_SUPPORT = 1
+ #
+ # If unselected, Mksquashfs/Unsquashfs won't store and extract xattrs by
+ # default. Users can enable xattrs by using the -xattrs option.
+-XATTR_DEFAULT = 1
++# XATTR_DEFAULT = 1
+
+
+ ###############################################
+@@ -177,7 +177,7 @@ UNSQUASHFS_OBJS = unsquashfs.o unsquash-1.o unsquash-2
+
+ CFLAGS ?= -O2
+ CFLAGS += $(EXTRA_CFLAGS) $(INCLUDEDIR) -D_FILE_OFFSET_BITS=64 \
+- -D_LARGEFILE_SOURCE -D_GNU_SOURCE -DCOMP_DEFAULT=\"$(COMP_DEFAULT)\" \
++ -D_LARGEFILE_SOURCE -DFNM_EXTMATCH=0 -D_GNU_SOURCE -DCOMP_DEFAULT=\"$(COMP_DEFAULT)\" \
+ -Wall
+
+ LIBS = -lpthread -lm
+@@ -217,6 +217,7 @@ endif
+
+ ifeq ($(LZO_SUPPORT),1)
+ CFLAGS += -DLZO_SUPPORT
++INCLUDEDIR += -I$(LOCALBASE)/include
+ MKSQUASHFS_OBJS += lzo_wrapper.o
+ UNSQUASHFS_OBJS += lzo_wrapper.o
+ LIBS += -llzo2
+@@ -225,17 +226,19 @@ endif
+
+ ifeq ($(LZ4_SUPPORT),1)
+ CFLAGS += -DLZ4_SUPPORT
++INCLUDEDIR += -I$(LOCALBASE)/include
+ MKSQUASHFS_OBJS += lz4_wrapper.o
+ UNSQUASHFS_OBJS += lz4_wrapper.o
+-LIBS += -llz4
++LIBS += -L$(LOCALBASE)/lib -llz4
+ COMPRESSORS += lz4
+ endif
+
+ ifeq ($(ZSTD_SUPPORT),1)
+ CFLAGS += -DZSTD_SUPPORT
++INCLUDEDIR += -I$(LOCALBASE)/include
+ MKSQUASHFS_OBJS += zstd_wrapper.o
+ UNSQUASHFS_OBJS += zstd_wrapper.o
+-LIBS += -lzstd
++LIBS += -L$(LOCALBASE)/lib -lzstd
+ COMPRESSORS += zstd
+ endif
+
+@@ -417,9 +420,9 @@ clean:
+
+ .PHONY: install
+ install: mksquashfs unsquashfs
+- mkdir -p $(INSTALL_DIR)
+- cp mksquashfs $(INSTALL_DIR)
+- cp unsquashfs $(INSTALL_DIR)
+- ln -fs unsquashfs $(INSTALL_DIR)/sqfscat
+- ln -fs mksquashfs $(INSTALL_DIR)/sqfstar
+- ../generate-manpages/install-manpages.sh $(shell pwd)/.. "$(INSTALL_MANPAGES_DIR)" "$(USE_PREBUILT_MANPAGES)"
++ mkdir -p $(DESTDIR)$(PREFIX)/bin
++ $(BSD_INSTALL_PROGRAM) mksquashfs $(DESTDIR)$(PREFIX)/bin
++ $(BSD_INSTALL_PROGRAM) unsquashfs $(DESTDIR)$(PREFIX)/bin
++ ln -fs unsquashfs $(DESTDIR)$(INSTALL_DIR)/sqfscat
++ ln -fs mksquashfs $(DESTDIR)$(INSTALL_DIR)/sqfstar
++ ../generate-manpages/install-manpages.sh $(shell pwd)/.. "$(DESTDIR)$(INSTALL_MANPAGES_DIR)" "$(USE_PREBUILT_MANPAGES)"
diff --git a/filesystems/squashfs-tools/files/patch-action.c b/filesystems/squashfs-tools/files/patch-action.c
new file mode 100644
index 000000000000..2c07b6980c84
--- /dev/null
+++ b/filesystems/squashfs-tools/files/patch-action.c
@@ -0,0 +1,17 @@
+Hack for lack of strdupa() in BSD libc
+
+--- action.c.orig 2014-05-10 04:54:13 UTC
++++ action.c
+@@ -44,6 +44,12 @@
+ #include "action.h"
+ #include "error.h"
+
++#ifndef strdupa
++#include <string.h> // required for str*()
++#include <stdlib.h> // required for alloca
++#define strdupa(foo) (strncpy( alloca( strlen(foo) + 1 ), foo, strlen( foo ) + 1 ))
++#endif
++
+ /*
+ * code to parse actions
+ */
diff --git a/filesystems/squashfs-tools/files/patch-pseudo.c b/filesystems/squashfs-tools/files/patch-pseudo.c
new file mode 100644
index 000000000000..3639ca3e0c1a
--- /dev/null
+++ b/filesystems/squashfs-tools/files/patch-pseudo.c
@@ -0,0 +1,13 @@
+--- pseudo.c.orig 2014-05-10 04:54:13 UTC
++++ pseudo.c
+@@ -34,6 +34,10 @@
+ #include <sys/wait.h>
+ #include <ctype.h>
+
++#ifdef __FreeBSD__
++#include <sys/stat.h>
++#endif
++
+ #include "pseudo.h"
+ #include "error.h"
+ #include "progressbar.h"
diff --git a/filesystems/squashfs-tools/pkg-descr b/filesystems/squashfs-tools/pkg-descr
new file mode 100644
index 000000000000..af37d38d07e0
--- /dev/null
+++ b/filesystems/squashfs-tools/pkg-descr
@@ -0,0 +1,8 @@
+Squashfs is a compressed read-only filesystem for Linux. Squashfs is
+intended for general read-only filesystem use, for archival use (i.e.
+in cases where a .tar.gz file may be used), and in constrained block
+device/memory systems (e.g. embedded systems) where low overhead is
+needed. The filesystem is currently stable, and has been tested on
+PowerPC, i586, Sparc and ARM architectures.
+
+squashfs-tools are the set of tools to manipulate squashfs images.
diff --git a/filesystems/squashfuse/Makefile b/filesystems/squashfuse/Makefile
new file mode 100644
index 000000000000..e79c6b87eb82
--- /dev/null
+++ b/filesystems/squashfuse/Makefile
@@ -0,0 +1,29 @@
+PORTNAME= squashfuse
+DISTVERSION= 0.5.2
+PORTREVISION= 1
+CATEGORIES= filesystems
+MASTER_SITES= https://github.com/vasi/${PORTNAME}/releases/download/${DISTVERSION}/
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= jsmith@resonatingmedia.com
+COMMENT= Mount a squashfs archive and treat it like a local file system
+WWW= https://github.com/vasi/squashfuse
+
+LICENSE= BSD2CLAUSE
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+LIB_DEPENDS= liblzo2.so:archivers/lzo2 \
+ liblz4.so:archivers/liblz4 \
+ libzstd.so:archivers/zstd
+
+USES= fuse:3 libtool localbase:ldflags pkgconfig
+USE_LDCONFIG= yes
+
+GNU_CONFIGURE= yes
+
+INSTALL_TARGET= install-strip
+
+CONFIGURE_ARGS= --disable-static \
+ --with-pkgconfigdir=${PREFIX}/libdata/pkgconfig
+
+.include <bsd.port.mk>
diff --git a/filesystems/squashfuse/distinfo b/filesystems/squashfuse/distinfo
new file mode 100644
index 000000000000..430954dba40e
--- /dev/null
+++ b/filesystems/squashfuse/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730016280
+SHA256 (squashfuse-0.5.2.tar.gz) = 54e4baaa20796e86a214a1f62bab07c7c361fb7a598375576d585712691178f5
+SIZE (squashfuse-0.5.2.tar.gz) = 438619
diff --git a/filesystems/squashfuse/pkg-descr b/filesystems/squashfuse/pkg-descr
new file mode 100644
index 000000000000..df92832d0777
--- /dev/null
+++ b/filesystems/squashfuse/pkg-descr
@@ -0,0 +1,2 @@
+Squashfuse is a command line utility for mounting SquashFS archives
+in user-space. It supports almost all features of the SquashFS format.
diff --git a/filesystems/squashfuse/pkg-plist b/filesystems/squashfuse/pkg-plist
new file mode 100644
index 000000000000..c895195a0a6c
--- /dev/null
+++ b/filesystems/squashfuse/pkg-plist
@@ -0,0 +1,27 @@
+bin/squashfuse
+bin/squashfuse_ll
+include/squashfuse/cache.h
+include/squashfuse/common.h
+include/squashfuse/config.h
+include/squashfuse/decompress.h
+include/squashfuse/dir.h
+include/squashfuse/file.h
+include/squashfuse/fs.h
+include/squashfuse/ll.h
+include/squashfuse/squashfs_fs.h
+include/squashfuse/squashfuse.h
+include/squashfuse/stack.h
+include/squashfuse/table.h
+include/squashfuse/traverse.h
+include/squashfuse/util.h
+include/squashfuse/xattr.h
+lib/libsquashfuse.so
+lib/libsquashfuse.so.0
+lib/libsquashfuse.so.0.0.0
+lib/libsquashfuse_ll.so
+lib/libsquashfuse_ll.so.0
+lib/libsquashfuse_ll.so.0.0.0
+libdata/pkgconfig/squashfuse.pc
+libdata/pkgconfig/squashfuse_ll.pc
+share/man/man1/squashfuse.1.gz
+share/man/man1/squashfuse_ll.1.gz
diff --git a/filesystems/sshfs/Makefile b/filesystems/sshfs/Makefile
new file mode 100644
index 000000000000..6dd076551ea4
--- /dev/null
+++ b/filesystems/sshfs/Makefile
@@ -0,0 +1,32 @@
+PORTNAME= sshfs
+PORTVERSION= 3.7.3
+PORTREVISION= 2
+DISTVERSIONPREFIX= ${PORTNAME}-
+CATEGORIES= filesystems
+PKGNAMEPREFIX= fusefs-
+
+PATCH_SITES= https://github.com/${GH_ACCOUNT}/${GH_PROJECT}/commit/
+PATCHFILES+= a73501f2159875aef082ab0a61731a8b7673d477.patch:-p1 # https://github.com/libfuse/sshfs/pull/212
+
+MAINTAINER= bofh@FreeBSD.org
+COMMENT= Mount remote directories over ssh
+WWW= https://github.com/libfuse/sshfs
+
+LICENSE= GPLv2
+LICENSE_FILE= ${WRKSRC}/COPYING
+
+USES= compiler:c11 fuse:3 gnome meson pkgconfig
+USE_GITHUB= yes
+GH_ACCOUNT= libfuse
+USE_GNOME= glib20
+
+CFLAGS+= -DNDEBUG
+
+PLIST_FILES= bin/sshfs
+
+OPTIONS_DEFINE= DOCS
+
+DOCS_BUILD_DEPENDS= rst2man:textproc/py-docutils
+DOCS_PLIST_FILES= share/man/man1/sshfs.1.gz
+
+.include <bsd.port.mk>
diff --git a/filesystems/sshfs/distinfo b/filesystems/sshfs/distinfo
new file mode 100644
index 000000000000..10d8cf33b962
--- /dev/null
+++ b/filesystems/sshfs/distinfo
@@ -0,0 +1,5 @@
+TIMESTAMP = 1655312051
+SHA256 (libfuse-sshfs-sshfs-3.7.3_GH0.tar.gz) = 52a1a1e017859dfe72a550e6fef8ad4f8703ce312ae165f74b579fd7344e3a26
+SIZE (libfuse-sshfs-sshfs-3.7.3_GH0.tar.gz) = 63968
+SHA256 (a73501f2159875aef082ab0a61731a8b7673d477.patch) = ef0fc2d7d292eb1bef4c2c63d0f5c1be00f29f9f4360cefe27fed70f69a31d10
+SIZE (a73501f2159875aef082ab0a61731a8b7673d477.patch) = 3032
diff --git a/filesystems/sshfs/files/patch-meson.build b/filesystems/sshfs/files/patch-meson.build
new file mode 100644
index 000000000000..34209e1f6504
--- /dev/null
+++ b/filesystems/sshfs/files/patch-meson.build
@@ -0,0 +1,27 @@
+--- meson.build.orig 2018-12-22 14:33:52 UTC
++++ meson.build
+@@ -19,12 +19,7 @@ int main(void) {
+ (void) get_4();
+ return 0;
+ }'''
+-if not cc.compiles(code, args: [ '-O0', '-Werror=unused-result' ])
+- message('Compiler warns about unused result even when casting to void')
+- add_global_arguments('-Wno-unused-result', language: 'c')
+-endif
+
+-
+ rst2man = find_program('rst2man', 'rst2man.py', required: false)
+
+ cfg = configuration_data()
+@@ -62,11 +57,6 @@ if rst2man.found()
+ else
+ message('rst2man not found, not building manual page.')
+ endif
+-
+-meson.add_install_script('utils/install_helper.sh',
+- get_option('sbindir'),
+- get_option('bindir'))
+-
+
+ subdir('test')
+
diff --git a/filesystems/sshfs/pkg-descr b/filesystems/sshfs/pkg-descr
new file mode 100644
index 000000000000..91ee403527c4
--- /dev/null
+++ b/filesystems/sshfs/pkg-descr
@@ -0,0 +1 @@
+SSHFS allows you to mount a remote directory over a normal ssh connection.
diff --git a/filesystems/sshfs/pkg-message b/filesystems/sshfs/pkg-message
new file mode 100644
index 000000000000..187edabe7faf
--- /dev/null
+++ b/filesystems/sshfs/pkg-message
@@ -0,0 +1,26 @@
+[
+{ type: install
+ message: <<EOM
+Basic Instructions:
+There are three ways to do this:
+
+1)
+% sshfs -o idmap=user username@example.org: /path/to/mount/point
+
+or
+
+2)
+% mount_fusefs auto /path/to/mount/point sshfs -o idmap=user \
+ username@example.org:
+
+or
+
+3)
+% env FUSE_DEV_NAME=/dev/fuse0 sshfs -o idmap=user \
+ username@example.org:
+% mount_fusefs /dev/fuse0 /path/to/mount/point
+
+For further options see ``sshfs -h''.
+EOM
+}
+]
diff --git a/filesystems/tclvfs/Makefile b/filesystems/tclvfs/Makefile
new file mode 100644
index 000000000000..192f2df2af56
--- /dev/null
+++ b/filesystems/tclvfs/Makefile
@@ -0,0 +1,18 @@
+PORTNAME= tclvfs
+PORTVERSION= 20080503
+PORTREVISION= 1
+CATEGORIES= filesystems devel
+MASTER_SITES= SF/${PORTNAME}/${PORTNAME}/${PORTNAME}-${PORTVERSION}/
+
+MAINTAINER= tcltk@FreeBSD.org
+COMMENT= Tcl VirtualFileSystem layer
+WWW= https://sourceforge.net/projects/tclvfs/
+
+LIB_DEPENDS= libTrf2.1.4.so:devel/tcl-trf
+
+USES+= gmake tcl:tea
+TCL_PKG= vfs1.3
+
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+
+.include <bsd.port.mk>
diff --git a/filesystems/tclvfs/distinfo b/filesystems/tclvfs/distinfo
new file mode 100644
index 000000000000..2ec546790727
--- /dev/null
+++ b/filesystems/tclvfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905188
+SHA256 (tclvfs-20080503.tar.gz) = 0d90362078c8f59347b14be377e9306336b6d25d147397f845e705a6fa1d38f2
+SIZE (tclvfs-20080503.tar.gz) = 258723
diff --git a/filesystems/tclvfs/files/patch-Makefile.in b/filesystems/tclvfs/files/patch-Makefile.in
new file mode 100644
index 000000000000..f14d9d60f5a4
--- /dev/null
+++ b/filesystems/tclvfs/files/patch-Makefile.in
@@ -0,0 +1,12 @@
+--- Makefile.in.orig 2013-04-30 12:23:15.000000000 +0200
++++ Makefile.in 2013-04-30 12:23:54.000000000 +0200
+@@ -256,7 +256,8 @@
+
+ VPATH = $(srcdir)/generic:$(srcdir)/unix:$(srcdir)/win
+
+-.c.@OBJEXT@:
++
++vfs.@OBJEXT@: $(srcdir)/generic/vfs.c
+ $(COMPILE) -c `@CYGPATH@ $<` -o $@
+
+ #========================================================================
diff --git a/filesystems/tclvfs/files/patch-generic_vfs.c b/filesystems/tclvfs/files/patch-generic_vfs.c
new file mode 100644
index 000000000000..1c52b734021d
--- /dev/null
+++ b/filesystems/tclvfs/files/patch-generic_vfs.c
@@ -0,0 +1,14 @@
+--- generic/vfs.c.orig 2006-08-30 21:38:03.000000000 +0200
++++ generic/vfs.c 2013-09-24 10:26:34.000000000 +0200
+@@ -1656,7 +1656,10 @@
+ return returnVal;
+ }
+
+-static CONST char**
++#ifndef CONST86
++#define CONST86
++#endif
++static CONST char*CONST86 *
+ VfsFileAttrStrings(pathPtr, objPtrRef)
+ Tcl_Obj* pathPtr;
+ Tcl_Obj** objPtrRef;
diff --git a/filesystems/tclvfs/pkg-descr b/filesystems/tclvfs/pkg-descr
new file mode 100644
index 000000000000..462b43010f65
--- /dev/null
+++ b/filesystems/tclvfs/pkg-descr
@@ -0,0 +1,4 @@
+The TclVfs project aims to provide an extension to the Tcl language which
+allows Virtual Filesystems to be built using Tcl scripts only. It is also a
+repository of such Tcl-implemented filesystems (metakit, zip, ftp, tar, http,
+webdav, namespace, url)
diff --git a/filesystems/tclvfs/pkg-plist b/filesystems/tclvfs/pkg-plist
new file mode 100644
index 000000000000..1edebfbba711
--- /dev/null
+++ b/filesystems/tclvfs/pkg-plist
@@ -0,0 +1,28 @@
+lib/%%TCL_PKG%%/ftpvfs.tcl
+lib/%%TCL_PKG%%/httpvfs.tcl
+lib/%%TCL_PKG%%/lib%%TCL_PKG%%.so
+lib/%%TCL_PKG%%/mk4vfs.tcl
+lib/%%TCL_PKG%%/mk4vfscompat.tcl
+lib/%%TCL_PKG%%/pkgIndex.tcl
+lib/%%TCL_PKG%%/starkit.tcl
+lib/%%TCL_PKG%%/tarvfs.tcl
+lib/%%TCL_PKG%%/tclIndex
+lib/%%TCL_PKG%%/tclprocvfs.tcl
+lib/%%TCL_PKG%%/template/collatevfs.tcl
+lib/%%TCL_PKG%%/template/deltavfs.tcl
+lib/%%TCL_PKG%%/template/fishvfs.tcl
+lib/%%TCL_PKG%%/template/globfind.tcl
+lib/%%TCL_PKG%%/template/quotavfs.tcl
+lib/%%TCL_PKG%%/template/tdelta.tcl
+lib/%%TCL_PKG%%/template/templatevfs.tcl
+lib/%%TCL_PKG%%/template/versionvfs.tcl
+lib/%%TCL_PKG%%/testvfs.tcl
+lib/%%TCL_PKG%%/tkvfs.tcl
+lib/%%TCL_PKG%%/vfsUrl.tcl
+lib/%%TCL_PKG%%/vfsUtils.tcl
+lib/%%TCL_PKG%%/vfslib.tcl
+lib/%%TCL_PKG%%/webdavvfs.tcl
+lib/%%TCL_PKG%%/zipvfs.tcl
+lib/%%TCL_PKG%%/zipvfscompat.tcl
+share/man/mann/vfs.n.gz
+share/man/mann/vfslib.n.gz
diff --git a/filesystems/ufs/Makefile b/filesystems/ufs/Makefile
new file mode 100644
index 000000000000..411c31af777c
--- /dev/null
+++ b/filesystems/ufs/Makefile
@@ -0,0 +1,25 @@
+PORTNAME= ufs
+DISTVERSION= 0.4.3
+CATEGORIES= filesystems sysutils
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= fuz@FreeBSD.org
+COMMENT= FUSE driver for FreeBSD's UFSv2
+WWW= https://github.com/realchonk/fuse-ufs
+
+# dependencies are all MIT licensed
+LICENSE= BSD2CLAUSE MIT
+LICENSE_COMB= multi
+LICENSE_FILE= ${WRKSRC}/LICENSE.md
+
+USES= cargo fuse:3
+USE_GITHUB= yes
+GH_ACCOUNT= realchonk
+GH_PROJECT= fuse-ufs
+CARGO_INSTALL_PATH= fuse-ufs
+
+post-install:
+ ${INSTALL_MAN} ${WRKSRC}/docs/fuse-ufs.8 ${STAGEDIR}${PREFIX}/share/man/man8/
+ ${LN} ${STAGEDIR}${PREFIX}/bin/fuse-ufs ${STAGEDIR}${PREFIX}/bin/mount.ufs
+
+.include <bsd.port.mk>
diff --git a/filesystems/ufs/Makefile.crates b/filesystems/ufs/Makefile.crates
new file mode 100644
index 000000000000..5753ed67fb60
--- /dev/null
+++ b/filesystems/ufs/Makefile.crates
@@ -0,0 +1,108 @@
+CARGO_CRATES= aho-corasick-1.1.3 \
+ anstream-0.6.17 \
+ anstyle-1.0.9 \
+ anstyle-parse-0.2.6 \
+ anstyle-query-1.1.2 \
+ anstyle-wincon-3.0.6 \
+ anyhow-1.0.91 \
+ arbitrary-1.3.2 \
+ assert_cmd-2.0.16 \
+ bincode-2.0.0-rc.3 \
+ bincode_derive-2.0.0-rc.3 \
+ bindgen-0.70.1 \
+ bitflags-2.6.0 \
+ bstr-1.10.0 \
+ byteorder-1.5.0 \
+ cc-1.1.31 \
+ cexpr-0.6.0 \
+ cfg-if-1.0.0 \
+ cfg_aliases-0.1.1 \
+ clang-sys-1.8.1 \
+ clap-4.5.20 \
+ clap-verbosity-flag-2.2.2 \
+ clap_builder-4.5.20 \
+ clap_derive-4.5.18 \
+ clap_lex-0.7.2 \
+ colorchoice-1.0.3 \
+ cstr-0.2.12 \
+ daemonize-0.5.0 \
+ difflib-0.4.0 \
+ doc-comment-0.3.3 \
+ either-1.13.0 \
+ env_filter-0.1.2 \
+ env_logger-0.11.5 \
+ errno-0.3.9 \
+ fastrand-2.1.1 \
+ fuse2rs-0.0.2 \
+ fuser-0.14.0 \
+ getrandom-0.2.15 \
+ glob-0.3.1 \
+ heck-0.5.0 \
+ humantime-2.1.0 \
+ is_terminal_polyfill-1.70.1 \
+ itertools-0.13.0 \
+ jobserver-0.1.32 \
+ lazy_static-1.5.0 \
+ libc-0.2.161 \
+ libfuzzer-sys-0.4.7 \
+ libloading-0.8.5 \
+ linux-raw-sys-0.4.14 \
+ log-0.4.22 \
+ memchr-2.7.4 \
+ minimal-lexical-0.2.1 \
+ nix-0.28.0 \
+ nom-7.1.3 \
+ once_cell-1.20.2 \
+ page_size-0.6.0 \
+ pkg-config-0.3.31 \
+ ppv-lite86-0.2.20 \
+ predicates-3.1.2 \
+ predicates-core-1.0.8 \
+ predicates-tree-1.0.11 \
+ prettyplease-0.2.25 \
+ proc-macro2-1.0.89 \
+ quote-1.0.37 \
+ rand-0.8.5 \
+ rand_chacha-0.3.1 \
+ rand_core-0.6.4 \
+ regex-1.11.1 \
+ regex-automata-0.4.8 \
+ regex-syntax-0.8.5 \
+ relative-path-1.9.3 \
+ rstest-0.19.0 \
+ rstest_macros-0.19.0 \
+ rstest_reuse-0.7.0 \
+ rustc-hash-1.1.0 \
+ rustc_version-0.4.1 \
+ rustix-0.38.37 \
+ semver-1.0.23 \
+ serde-1.0.213 \
+ serde_derive-1.0.213 \
+ shlex-1.3.0 \
+ smallvec-1.13.2 \
+ strsim-0.11.1 \
+ syn-2.0.85 \
+ tempfile-3.13.0 \
+ termtree-0.4.1 \
+ unicode-ident-1.0.13 \
+ utf8parse-0.2.2 \
+ virtue-0.0.13 \
+ wait-timeout-0.2.0 \
+ wasi-0.11.0+wasi-snapshot-preview1 \
+ winapi-0.3.9 \
+ winapi-i686-pc-windows-gnu-0.4.0 \
+ winapi-x86_64-pc-windows-gnu-0.4.0 \
+ windows-sys-0.52.0 \
+ windows-sys-0.59.0 \
+ windows-targets-0.52.6 \
+ windows_aarch64_gnullvm-0.52.6 \
+ windows_aarch64_msvc-0.52.6 \
+ windows_i686_gnu-0.52.6 \
+ windows_i686_gnullvm-0.52.6 \
+ windows_i686_msvc-0.52.6 \
+ windows_x86_64_gnu-0.52.6 \
+ windows_x86_64_gnullvm-0.52.6 \
+ windows_x86_64_msvc-0.52.6 \
+ xattr-1.3.1 \
+ zerocopy-0.7.35 \
+ zerocopy-derive-0.7.35
diff --git a/filesystems/ufs/distinfo b/filesystems/ufs/distinfo
new file mode 100644
index 000000000000..3551e171a522
--- /dev/null
+++ b/filesystems/ufs/distinfo
@@ -0,0 +1,219 @@
+TIMESTAMP = 1729861106
+SHA256 (rust/crates/aho-corasick-1.1.3.crate) = 8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916
+SIZE (rust/crates/aho-corasick-1.1.3.crate) = 183311
+SHA256 (rust/crates/anstream-0.6.17.crate) = 23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338
+SIZE (rust/crates/anstream-0.6.17.crate) = 29445
+SHA256 (rust/crates/anstyle-1.0.9.crate) = 8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56
+SIZE (rust/crates/anstyle-1.0.9.crate) = 15770
+SHA256 (rust/crates/anstyle-parse-0.2.6.crate) = 3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9
+SIZE (rust/crates/anstyle-parse-0.2.6.crate) = 22343
+SHA256 (rust/crates/anstyle-query-1.1.2.crate) = 79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c
+SIZE (rust/crates/anstyle-query-1.1.2.crate) = 9969
+SHA256 (rust/crates/anstyle-wincon-3.0.6.crate) = 2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125
+SIZE (rust/crates/anstyle-wincon-3.0.6.crate) = 12271
+SHA256 (rust/crates/anyhow-1.0.91.crate) = c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8
+SIZE (rust/crates/anyhow-1.0.91.crate) = 47348
+SHA256 (rust/crates/arbitrary-1.3.2.crate) = 7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110
+SIZE (rust/crates/arbitrary-1.3.2.crate) = 32037
+SHA256 (rust/crates/assert_cmd-2.0.16.crate) = dc1835b7f27878de8525dc71410b5a31cdcc5f230aed5ba5df968e09c201b23d
+SIZE (rust/crates/assert_cmd-2.0.16.crate) = 26554
+SHA256 (rust/crates/bincode-2.0.0-rc.3.crate) = f11ea1a0346b94ef188834a65c068a03aec181c94896d481d7a0a40d85b0ce95
+SIZE (rust/crates/bincode-2.0.0-rc.3.crate) = 57746
+SHA256 (rust/crates/bincode_derive-2.0.0-rc.3.crate) = 7e30759b3b99a1b802a7a3aa21c85c3ded5c28e1c83170d82d70f08bbf7f3e4c
+SIZE (rust/crates/bincode_derive-2.0.0-rc.3.crate) = 6335
+SHA256 (rust/crates/bindgen-0.70.1.crate) = f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f
+SIZE (rust/crates/bindgen-0.70.1.crate) = 226363
+SHA256 (rust/crates/bitflags-2.6.0.crate) = b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de
+SIZE (rust/crates/bitflags-2.6.0.crate) = 45357
+SHA256 (rust/crates/bstr-1.10.0.crate) = 40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c
+SIZE (rust/crates/bstr-1.10.0.crate) = 380426
+SHA256 (rust/crates/byteorder-1.5.0.crate) = 1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b
+SIZE (rust/crates/byteorder-1.5.0.crate) = 23288
+SHA256 (rust/crates/cc-1.1.31.crate) = c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f
+SIZE (rust/crates/cc-1.1.31.crate) = 84637
+SHA256 (rust/crates/cexpr-0.6.0.crate) = 6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766
+SIZE (rust/crates/cexpr-0.6.0.crate) = 17966
+SHA256 (rust/crates/cfg-if-1.0.0.crate) = baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd
+SIZE (rust/crates/cfg-if-1.0.0.crate) = 7934
+SHA256 (rust/crates/cfg_aliases-0.1.1.crate) = fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e
+SIZE (rust/crates/cfg_aliases-0.1.1.crate) = 6009
+SHA256 (rust/crates/clang-sys-1.8.1.crate) = 0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4
+SIZE (rust/crates/clang-sys-1.8.1.crate) = 44009
+SHA256 (rust/crates/clap-4.5.20.crate) = b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8
+SIZE (rust/crates/clap-4.5.20.crate) = 56376
+SHA256 (rust/crates/clap-verbosity-flag-2.2.2.crate) = e099138e1807662ff75e2cebe4ae2287add879245574489f9b1588eb5e5564ed
+SIZE (rust/crates/clap-verbosity-flag-2.2.2.crate) = 13009
+SHA256 (rust/crates/clap_builder-4.5.20.crate) = 19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54
+SIZE (rust/crates/clap_builder-4.5.20.crate) = 163812
+SHA256 (rust/crates/clap_derive-4.5.18.crate) = 4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab
+SIZE (rust/crates/clap_derive-4.5.18.crate) = 30131
+SHA256 (rust/crates/clap_lex-0.7.2.crate) = 1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97
+SIZE (rust/crates/clap_lex-0.7.2.crate) = 12805
+SHA256 (rust/crates/colorchoice-1.0.3.crate) = 5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990
+SIZE (rust/crates/colorchoice-1.0.3.crate) = 7923
+SHA256 (rust/crates/cstr-0.2.12.crate) = 68523903c8ae5aacfa32a0d9ae60cadeb764e1da14ee0d26b1f3089f13a54636
+SIZE (rust/crates/cstr-0.2.12.crate) = 6078
+SHA256 (rust/crates/daemonize-0.5.0.crate) = ab8bfdaacb3c887a54d41bdf48d3af8873b3f5566469f8ba21b92057509f116e
+SIZE (rust/crates/daemonize-0.5.0.crate) = 7125
+SHA256 (rust/crates/difflib-0.4.0.crate) = 6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8
+SIZE (rust/crates/difflib-0.4.0.crate) = 7638
+SHA256 (rust/crates/doc-comment-0.3.3.crate) = fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10
+SIZE (rust/crates/doc-comment-0.3.3.crate) = 4123
+SHA256 (rust/crates/either-1.13.0.crate) = 60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0
+SIZE (rust/crates/either-1.13.0.crate) = 19169
+SHA256 (rust/crates/env_filter-0.1.2.crate) = 4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab
+SIZE (rust/crates/env_filter-0.1.2.crate) = 13327
+SHA256 (rust/crates/env_logger-0.11.5.crate) = e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d
+SIZE (rust/crates/env_logger-0.11.5.crate) = 30683
+SHA256 (rust/crates/errno-0.3.9.crate) = 534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba
+SIZE (rust/crates/errno-0.3.9.crate) = 10690
+SHA256 (rust/crates/fastrand-2.1.1.crate) = e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6
+SIZE (rust/crates/fastrand-2.1.1.crate) = 14983
+SHA256 (rust/crates/fuse2rs-0.0.2.crate) = 8316e54f1a37c6c64ce2a0f6393c61cbedcc8456e3dc76a1b824f69060a47afd
+SIZE (rust/crates/fuse2rs-0.0.2.crate) = 10252
+SHA256 (rust/crates/fuser-0.14.0.crate) = 2e697f6f62c20b6fad1ba0f84ae909f25971cf16e735273524e3977c94604cf8
+SIZE (rust/crates/fuser-0.14.0.crate) = 95109
+SHA256 (rust/crates/getrandom-0.2.15.crate) = c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7
+SIZE (rust/crates/getrandom-0.2.15.crate) = 37163
+SHA256 (rust/crates/glob-0.3.1.crate) = d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b
+SIZE (rust/crates/glob-0.3.1.crate) = 18880
+SHA256 (rust/crates/heck-0.5.0.crate) = 2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea
+SIZE (rust/crates/heck-0.5.0.crate) = 11517
+SHA256 (rust/crates/humantime-2.1.0.crate) = 9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4
+SIZE (rust/crates/humantime-2.1.0.crate) = 16749
+SHA256 (rust/crates/is_terminal_polyfill-1.70.1.crate) = 7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf
+SIZE (rust/crates/is_terminal_polyfill-1.70.1.crate) = 7492
+SHA256 (rust/crates/itertools-0.13.0.crate) = 413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186
+SIZE (rust/crates/itertools-0.13.0.crate) = 146261
+SHA256 (rust/crates/jobserver-0.1.32.crate) = 48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0
+SIZE (rust/crates/jobserver-0.1.32.crate) = 27549
+SHA256 (rust/crates/lazy_static-1.5.0.crate) = bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe
+SIZE (rust/crates/lazy_static-1.5.0.crate) = 14025
+SHA256 (rust/crates/libc-0.2.161.crate) = 8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1
+SIZE (rust/crates/libc-0.2.161.crate) = 765389
+SHA256 (rust/crates/libfuzzer-sys-0.4.7.crate) = a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7
+SIZE (rust/crates/libfuzzer-sys-0.4.7.crate) = 128332
+SHA256 (rust/crates/libloading-0.8.5.crate) = 4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4
+SIZE (rust/crates/libloading-0.8.5.crate) = 28902
+SHA256 (rust/crates/linux-raw-sys-0.4.14.crate) = 78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89
+SIZE (rust/crates/linux-raw-sys-0.4.14.crate) = 1826665
+SHA256 (rust/crates/log-0.4.22.crate) = a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24
+SIZE (rust/crates/log-0.4.22.crate) = 44027
+SHA256 (rust/crates/memchr-2.7.4.crate) = 78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3
+SIZE (rust/crates/memchr-2.7.4.crate) = 96670
+SHA256 (rust/crates/minimal-lexical-0.2.1.crate) = 68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a
+SIZE (rust/crates/minimal-lexical-0.2.1.crate) = 94841
+SHA256 (rust/crates/nix-0.28.0.crate) = ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4
+SIZE (rust/crates/nix-0.28.0.crate) = 311086
+SHA256 (rust/crates/nom-7.1.3.crate) = d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a
+SIZE (rust/crates/nom-7.1.3.crate) = 117570
+SHA256 (rust/crates/once_cell-1.20.2.crate) = 1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775
+SIZE (rust/crates/once_cell-1.20.2.crate) = 33394
+SHA256 (rust/crates/page_size-0.6.0.crate) = 30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da
+SIZE (rust/crates/page_size-0.6.0.crate) = 8479
+SHA256 (rust/crates/pkg-config-0.3.31.crate) = 953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2
+SIZE (rust/crates/pkg-config-0.3.31.crate) = 20880
+SHA256 (rust/crates/ppv-lite86-0.2.20.crate) = 77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04
+SIZE (rust/crates/ppv-lite86-0.2.20.crate) = 22478
+SHA256 (rust/crates/predicates-3.1.2.crate) = 7e9086cc7640c29a356d1a29fd134380bee9d8f79a17410aa76e7ad295f42c97
+SIZE (rust/crates/predicates-3.1.2.crate) = 23986
+SHA256 (rust/crates/predicates-core-1.0.8.crate) = ae8177bee8e75d6846599c6b9ff679ed51e882816914eec639944d7c9aa11931
+SIZE (rust/crates/predicates-core-1.0.8.crate) = 8552
+SHA256 (rust/crates/predicates-tree-1.0.11.crate) = 41b740d195ed3166cd147c8047ec98db0e22ec019eb8eeb76d343b795304fb13
+SIZE (rust/crates/predicates-tree-1.0.11.crate) = 8393
+SHA256 (rust/crates/prettyplease-0.2.25.crate) = 64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033
+SIZE (rust/crates/prettyplease-0.2.25.crate) = 58681
+SHA256 (rust/crates/proc-macro2-1.0.89.crate) = f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e
+SIZE (rust/crates/proc-macro2-1.0.89.crate) = 49446
+SHA256 (rust/crates/quote-1.0.37.crate) = b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af
+SIZE (rust/crates/quote-1.0.37.crate) = 28558
+SHA256 (rust/crates/rand-0.8.5.crate) = 34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404
+SIZE (rust/crates/rand-0.8.5.crate) = 87113
+SHA256 (rust/crates/rand_chacha-0.3.1.crate) = e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88
+SIZE (rust/crates/rand_chacha-0.3.1.crate) = 15251
+SHA256 (rust/crates/rand_core-0.6.4.crate) = ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c
+SIZE (rust/crates/rand_core-0.6.4.crate) = 22666
+SHA256 (rust/crates/regex-1.11.1.crate) = b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191
+SIZE (rust/crates/regex-1.11.1.crate) = 254170
+SHA256 (rust/crates/regex-automata-0.4.8.crate) = 368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3
+SIZE (rust/crates/regex-automata-0.4.8.crate) = 617784
+SHA256 (rust/crates/regex-syntax-0.8.5.crate) = 2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c
+SIZE (rust/crates/regex-syntax-0.8.5.crate) = 357541
+SHA256 (rust/crates/relative-path-1.9.3.crate) = ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2
+SIZE (rust/crates/relative-path-1.9.3.crate) = 22400
+SHA256 (rust/crates/rstest-0.19.0.crate) = 9d5316d2a1479eeef1ea21e7f9ddc67c191d497abc8fc3ba2467857abbb68330
+SIZE (rust/crates/rstest-0.19.0.crate) = 32932
+SHA256 (rust/crates/rstest_macros-0.19.0.crate) = 04a9df72cc1f67020b0d63ad9bfe4a323e459ea7eb68e03bd9824db49f9a4c25
+SIZE (rust/crates/rstest_macros-0.19.0.crate) = 61243
+SHA256 (rust/crates/rstest_reuse-0.7.0.crate) = b3a8fb4672e840a587a66fc577a5491375df51ddb88f2a2c2a792598c326fe14
+SIZE (rust/crates/rstest_reuse-0.7.0.crate) = 12828
+SHA256 (rust/crates/rustc-hash-1.1.0.crate) = 08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2
+SIZE (rust/crates/rustc-hash-1.1.0.crate) = 9331
+SHA256 (rust/crates/rustc_version-0.4.1.crate) = cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92
+SIZE (rust/crates/rustc_version-0.4.1.crate) = 12245
+SHA256 (rust/crates/rustix-0.38.37.crate) = 8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811
+SIZE (rust/crates/rustix-0.38.37.crate) = 371243
+SHA256 (rust/crates/semver-1.0.23.crate) = 61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b
+SIZE (rust/crates/semver-1.0.23.crate) = 30622
+SHA256 (rust/crates/serde-1.0.213.crate) = 3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1
+SIZE (rust/crates/serde-1.0.213.crate) = 78349
+SHA256 (rust/crates/serde_derive-1.0.213.crate) = 7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5
+SIZE (rust/crates/serde_derive-1.0.213.crate) = 56625
+SHA256 (rust/crates/shlex-1.3.0.crate) = 0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64
+SIZE (rust/crates/shlex-1.3.0.crate) = 18713
+SHA256 (rust/crates/smallvec-1.13.2.crate) = 3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67
+SIZE (rust/crates/smallvec-1.13.2.crate) = 35216
+SHA256 (rust/crates/strsim-0.11.1.crate) = 7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f
+SIZE (rust/crates/strsim-0.11.1.crate) = 14266
+SHA256 (rust/crates/syn-2.0.85.crate) = 5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56
+SIZE (rust/crates/syn-2.0.85.crate) = 275231
+SHA256 (rust/crates/tempfile-3.13.0.crate) = f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b
+SIZE (rust/crates/tempfile-3.13.0.crate) = 34910
+SHA256 (rust/crates/termtree-0.4.1.crate) = 3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76
+SIZE (rust/crates/termtree-0.4.1.crate) = 4557
+SHA256 (rust/crates/unicode-ident-1.0.13.crate) = e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe
+SIZE (rust/crates/unicode-ident-1.0.13.crate) = 43279
+SHA256 (rust/crates/utf8parse-0.2.2.crate) = 06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821
+SIZE (rust/crates/utf8parse-0.2.2.crate) = 13499
+SHA256 (rust/crates/virtue-0.0.13.crate) = 9dcc60c0624df774c82a0ef104151231d37da4962957d691c011c852b2473314
+SIZE (rust/crates/virtue-0.0.13.crate) = 26483
+SHA256 (rust/crates/wait-timeout-0.2.0.crate) = 9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6
+SIZE (rust/crates/wait-timeout-0.2.0.crate) = 12441
+SHA256 (rust/crates/wasi-0.11.0+wasi-snapshot-preview1.crate) = 9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423
+SIZE (rust/crates/wasi-0.11.0+wasi-snapshot-preview1.crate) = 28131
+SHA256 (rust/crates/winapi-0.3.9.crate) = 5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419
+SIZE (rust/crates/winapi-0.3.9.crate) = 1200382
+SHA256 (rust/crates/winapi-i686-pc-windows-gnu-0.4.0.crate) = ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6
+SIZE (rust/crates/winapi-i686-pc-windows-gnu-0.4.0.crate) = 2918815
+SHA256 (rust/crates/winapi-x86_64-pc-windows-gnu-0.4.0.crate) = 712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f
+SIZE (rust/crates/winapi-x86_64-pc-windows-gnu-0.4.0.crate) = 2947998
+SHA256 (rust/crates/windows-sys-0.52.0.crate) = 282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d
+SIZE (rust/crates/windows-sys-0.52.0.crate) = 2576877
+SHA256 (rust/crates/windows-sys-0.59.0.crate) = 1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b
+SIZE (rust/crates/windows-sys-0.59.0.crate) = 2387323
+SHA256 (rust/crates/windows-targets-0.52.6.crate) = 9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973
+SIZE (rust/crates/windows-targets-0.52.6.crate) = 6403
+SHA256 (rust/crates/windows_aarch64_gnullvm-0.52.6.crate) = 32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3
+SIZE (rust/crates/windows_aarch64_gnullvm-0.52.6.crate) = 435718
+SHA256 (rust/crates/windows_aarch64_msvc-0.52.6.crate) = 09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469
+SIZE (rust/crates/windows_aarch64_msvc-0.52.6.crate) = 832615
+SHA256 (rust/crates/windows_i686_gnu-0.52.6.crate) = 8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b
+SIZE (rust/crates/windows_i686_gnu-0.52.6.crate) = 880402
+SHA256 (rust/crates/windows_i686_gnullvm-0.52.6.crate) = 0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66
+SIZE (rust/crates/windows_i686_gnullvm-0.52.6.crate) = 475940
+SHA256 (rust/crates/windows_i686_msvc-0.52.6.crate) = 240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66
+SIZE (rust/crates/windows_i686_msvc-0.52.6.crate) = 901163
+SHA256 (rust/crates/windows_x86_64_gnu-0.52.6.crate) = 147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78
+SIZE (rust/crates/windows_x86_64_gnu-0.52.6.crate) = 836363
+SHA256 (rust/crates/windows_x86_64_gnullvm-0.52.6.crate) = 24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d
+SIZE (rust/crates/windows_x86_64_gnullvm-0.52.6.crate) = 435707
+SHA256 (rust/crates/windows_x86_64_msvc-0.52.6.crate) = 589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec
+SIZE (rust/crates/windows_x86_64_msvc-0.52.6.crate) = 832564
+SHA256 (rust/crates/xattr-1.3.1.crate) = 8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f
+SIZE (rust/crates/xattr-1.3.1.crate) = 12580
+SHA256 (rust/crates/zerocopy-0.7.35.crate) = 1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0
+SIZE (rust/crates/zerocopy-0.7.35.crate) = 152645
+SHA256 (rust/crates/zerocopy-derive-0.7.35.crate) = fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e
+SIZE (rust/crates/zerocopy-derive-0.7.35.crate) = 37829
+SHA256 (realchonk-fuse-ufs-0.4.3_GH0.tar.gz) = 937915f823c5872a97974743299396bc17bc50d2e45b86b8bcbed4cb825bcb0a
+SIZE (realchonk-fuse-ufs-0.4.3_GH0.tar.gz) = 1368650
diff --git a/filesystems/ufs/pkg-descr b/filesystems/ufs/pkg-descr
new file mode 100644
index 000000000000..a4268e90af05
--- /dev/null
+++ b/filesystems/ufs/pkg-descr
@@ -0,0 +1,7 @@
+A FUSE file system driver for FreeBSD's UFSv2.
+
+Features:
+
+ - Read support for FreeBSD UFSv2
+ - Extended Attributes (no ACLs)
+ - Bi-Endian support (eg. mounting big endian FS on little endian system)
diff --git a/filesystems/ufs/pkg-plist b/filesystems/ufs/pkg-plist
new file mode 100644
index 000000000000..4cc756be2006
--- /dev/null
+++ b/filesystems/ufs/pkg-plist
@@ -0,0 +1,3 @@
+bin/fuse-ufs
+bin/mount.ufs
+share/man/man8/fuse-ufs.8.gz
diff --git a/filesystems/ufs_copy/Makefile b/filesystems/ufs_copy/Makefile
new file mode 100644
index 000000000000..4a600350aa63
--- /dev/null
+++ b/filesystems/ufs_copy/Makefile
@@ -0,0 +1,28 @@
+PORTNAME= ufs_copy
+PORTVERSION= 20060921
+PORTREVISION= 2
+CATEGORIES= filesystems sysutils
+MASTER_SITES= https://people.freebsd.org/~simokawa/ufs/
+DISTNAME= ufs-${PORTVERSION}
+
+MAINTAINER= nobutaka@FreeBSD.org
+COMMENT= Fast copy utility for UFS filesystem
+WWW= https://people.freebsd.org/~simokawa/ufs/
+
+LICENSE= BSD4CLAUSE
+
+USES= uidfix
+WRKSRC= ${WRKDIR}/ufs
+MAKE_ARGS= BINDIR=${PREFIX}/sbin
+
+PORTDOCS= README
+
+OPTIONS_DEFINE= DOCS
+
+PLIST_FILES= sbin/ufs_copy
+
+post-install-DOCS-on:
+ @${MKDIR} ${STAGEDIR}${DOCSDIR}
+ ${INSTALL_DATA} ${WRKSRC}/${PORTDOCS} ${STAGEDIR}${DOCSDIR}
+
+.include <bsd.port.mk>
diff --git a/filesystems/ufs_copy/distinfo b/filesystems/ufs_copy/distinfo
new file mode 100644
index 000000000000..3e8ccd65ccd4
--- /dev/null
+++ b/filesystems/ufs_copy/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905208
+SHA256 (ufs-20060921.tar.gz) = 0dc787a8c10334fa7bbfc56b166498a3057f6adff34dac4f6454a88c75d967ed
+SIZE (ufs-20060921.tar.gz) = 9734
diff --git a/filesystems/ufs_copy/files/patch-ufs_copy.c b/filesystems/ufs_copy/files/patch-ufs_copy.c
new file mode 100644
index 000000000000..3c5bfd367a81
--- /dev/null
+++ b/filesystems/ufs_copy/files/patch-ufs_copy.c
@@ -0,0 +1,72 @@
+--- ufs_copy.c.orig 2006-09-21 06:28:09 UTC
++++ ufs_copy.c
+@@ -111,9 +111,11 @@ int
+ main(int argc, char *argv[])
+ {
+ struct fstab *fs;
+- int ch, eval=0;
++ int ch, eval=0, md;
+ char *snapshot = NULL;
+- char *src, *dst;
++ char *src, *dst, *snap = NULL;
++ char mddev[256];
++ FILE *readp;
+
+ #ifdef USEMMAP
+ while ((ch = getopt(argc, argv, "aBb:ceMms:v")) != -1)
+@@ -174,6 +176,21 @@ main(int argc, char *argv[])
+ eval = system(buf);
+ if (eval)
+ errx(eval, "mksnap_ffs failed");
++
++ snprintf(buf, sizeof(buf),
++ "/sbin/mdconfig -a -n -t vnode -f %s", src);
++ fprintf(stderr, "%s\n", buf);
++ readp = popen(buf, "r");
++ if (readp == NULL)
++ errx(eval, "mdconfig failed");
++ eval = fscanf(readp, "%d", &md);
++ if (eval != 1)
++ errx(eval, "mdconfig failed");
++ pclose(readp);
++ snprintf(mddev, sizeof(mddev), "/dev/md%d", md);
++ snap = src;
++ src = mddev;
++ fprintf(stderr, "attached %s as memory disk %s\n", snap, mddev);
+ }
+
+ if ((fs = getfsfile(src)) == NULL) {
+@@ -188,9 +205,19 @@ main(int argc, char *argv[])
+ }
+
+ if (snapshot) {
+- fprintf(stderr, "removing snapshot file %s ... ", src);
++ char buf[1024];
++
++ snprintf(buf, sizeof(buf),
++ "/sbin/mdconfig -d -u %d", md);
++ fprintf(stderr, "%s\n", buf);
++ eval = system(buf);
++ if (eval)
++ errx(eval, "mdconfig failed");
++ fprintf(stderr, "detached memory disk %s\n", mddev);
++
++ fprintf(stderr, "removing snapshot file %s ... ", snap);
+ fflush(stderr);
+- if (unlink(src) == 0)
++ if (unlink(snap) == 0)
+ fprintf(stderr, "done\n");
+ else
+ fprintf(stderr, "failed\n");
+@@ -262,6 +289,11 @@ copy_ufs(const char *src_path, const char *dst_path)
+ }
+ }
+ bcopy(&src, &dst, sizeof(dst));
++#if (defined(__FreeBSD_version) && __FreeBSD_version >= 1300100)
++ dst.d_si = NULL;
++#else
++ dst.d_sbcsum = NULL;
++#endif
+ dst.d_name = dst_path;
+ dst.d_fd = open(dst_path, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR );
+ if (dst.d_fd < 0) {
diff --git a/filesystems/ufs_copy/pkg-descr b/filesystems/ufs_copy/pkg-descr
new file mode 100644
index 000000000000..3bc45eb518d3
--- /dev/null
+++ b/filesystems/ufs_copy/pkg-descr
@@ -0,0 +1,3 @@
+The ufs_copy copies a UFS filesystem image like dd(1).
+It doesn't copy free blocks for speed and it generates a sparse destination
+file for saving space.
diff --git a/filesystems/unionfs/Makefile b/filesystems/unionfs/Makefile
new file mode 100644
index 000000000000..4db9d90fc34c
--- /dev/null
+++ b/filesystems/unionfs/Makefile
@@ -0,0 +1,38 @@
+PORTNAME= unionfs
+DISTVERSIONPREFIX= v
+DISTVERSION= 2.2
+CATEGORIES= filesystems
+PKGNAMEPREFIX= fusefs-
+
+MAINTAINER= 0mp@FreeBSD.org
+COMMENT= FUSE based implementation of the well-known unionfs
+WWW= https://github.com/rpodgorny/unionfs-fuse
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+TEST_DEPENDS= ${PYTHON_PKGNAMEPREFIX}pytest>=0:devel/py-pytest@${PY_FLAVOR}
+
+USES= cmake fuse localbase:ldflags python:test
+
+USE_GITHUB= yes
+GH_ACCOUNT= rpodgorny
+GH_PROJECT= unionfs-fuse
+
+SUB_FILES= pkg-message
+
+PLIST_FILES= bin/unionfs \
+ bin/unionfsctl \
+ share/man/man8/unionfs.8.gz
+
+post-install:
+ @${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/*
+
+pre-test:
+ ${RLN} ${BUILD_WRKSRC}/src/unionfs ${WRKSRC}/src/unionfs
+ ${RLN} ${BUILD_WRKSRC}/src/unionfsctl ${WRKSRC}/src/unionfsctl
+
+do-test:
+ cd ${WRKSRC} && ${SETNEV} ${MAKE_ENV} ${PYTHON_CMD} -m pytest -k test_help --verbose
+
+.include <bsd.port.mk>
diff --git a/filesystems/unionfs/distinfo b/filesystems/unionfs/distinfo
new file mode 100644
index 000000000000..de0face115d1
--- /dev/null
+++ b/filesystems/unionfs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1635114774
+SHA256 (rpodgorny-unionfs-fuse-v2.2_GH0.tar.gz) = 248a0fee9979146b79b05fc728621869da5936c1f43a27e36e7515b301817e43
+SIZE (rpodgorny-unionfs-fuse-v2.2_GH0.tar.gz) = 47955
diff --git a/filesystems/unionfs/files/patch-CMakeLists.txt b/filesystems/unionfs/files/patch-CMakeLists.txt
new file mode 100644
index 000000000000..107d85a0e259
--- /dev/null
+++ b/filesystems/unionfs/files/patch-CMakeLists.txt
@@ -0,0 +1,15 @@
+--- CMakeLists.txt.orig 2015-01-14 10:08:20 UTC
++++ CMakeLists.txt
+@@ -9,12 +9,6 @@ IF(NOT CMAKE_CONFIGURATION_TYPES AND NOT
+ SET(CMAKE_BUILD_TYPE RelWithDebInfo)
+ ENDIF(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
+
+-# Select flags.
+-SET(CMAKE_C_FLAGS "-pipe -W -Wall -DFORTIFY_SOURCE=2")
+-SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")
+-SET(CMAKE_C_FLAGS_RELEASE "-O2")
+-SET(CMAKE_C_FLAGS_DEBUG "-O0 -g -DDEBUG")
+-
+ if (UNIX AND APPLE)
+ include_directories("/usr/local/include/osxfuse/fuse")
+ endif()
diff --git a/filesystems/unionfs/files/patch-src__usyslog.c b/filesystems/unionfs/files/patch-src__usyslog.c
new file mode 100644
index 000000000000..42f8ec61068b
--- /dev/null
+++ b/filesystems/unionfs/files/patch-src__usyslog.c
@@ -0,0 +1,11 @@
+--- src/usyslog.c.orig 2015-01-14 10:08:20 UTC
++++ src/usyslog.c
+@@ -23,7 +23,7 @@
+
+ #if __APPLE__
+ #include <malloc/malloc.h>
+-#else
++#elif !defined(__FreeBSD__)
+ #include <malloc.h>
+ #endif
+
diff --git a/filesystems/unionfs/files/pkg-message.in b/filesystems/unionfs/files/pkg-message.in
new file mode 100644
index 000000000000..4859a839c805
--- /dev/null
+++ b/filesystems/unionfs/files/pkg-message.in
@@ -0,0 +1,20 @@
+[
+{ type: install
+ message: <<EOM
+You will need to load the kernel module 'fuse' to use this package. To load
+this at boot time, add the following line to /boot/loader.conf:
+
+fuse_load="YES"
+
+If you want unprivileged users to be able to use unionfs, add the following
+line to /etc/sysctl.conf:
+
+vfs.usermount=1
+
+You can enable them immediately with:
+
+kldload fuse
+sysctl vfs.usermount=1
+EOM
+}
+]
diff --git a/filesystems/unionfs/pkg-descr b/filesystems/unionfs/pkg-descr
new file mode 100644
index 000000000000..850c1a069c5a
--- /dev/null
+++ b/filesystems/unionfs/pkg-descr
@@ -0,0 +1,2 @@
+This is an effort to create a unionfs filesystem implementation which is way
+more flexible than the current in-kernel unionfs solution.
diff --git a/filesystems/unreliablefs/Makefile b/filesystems/unreliablefs/Makefile
new file mode 100644
index 000000000000..532c5a696b2d
--- /dev/null
+++ b/filesystems/unreliablefs/Makefile
@@ -0,0 +1,43 @@
+PORTNAME= unreliablefs
+DISTVERSION= 0.2.0
+CATEGORIES= filesystems
+PKGNAMEPREFIX= fusefs-
+PATCH_SITES= https://github.com/ligurio/unreliablefs/commit/
+PATCHFILES= e97d259b1cda3c1342c9cb472d31230e50b0776d.patch:-p1
+
+MAINTAINER= 0mp@FreeBSD.org
+COMMENT= FUSE-based fault injection filesystem
+WWW= https://github.com/ligurio/unreliablefs
+
+LICENSE= MIT
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+TEST_DEPENDS= ${PYTHON_PKGNAMEPREFIX}pytest>=0:devel/py-pytest@${PY_FLAVOR} \
+ fio:benchmarks/fio
+
+USES= compiler:c++11-lang cmake fuse pkgconfig python:env
+USE_CSTD= c11
+USE_GITHUB= yes
+GH_ACCOUNT= ligurio
+
+PLIST_FILES= bin/${PORTNAME} \
+ share/man/man1/${PORTNAME}.1.gz \
+ share/man/man5/${PORTNAME}.conf.5.gz
+
+do-test:
+# fusefs(5) must be loaded.
+ if ! kldload -n fusefs; then \
+ ${ECHO_MSG} "Cannot load the fusefs kernel module"; \
+ ${FALSE}; \
+ fi
+# /dev/fuse must be writtable and readable to the user running the tests.
+ if [ ! -r /dev/fuse ] || [ ! -w /dev/fuse ]; then \
+ ${ECHO_MSG} "Current user does cannot access /dev/fuse"; \
+ ${FALSE}; \
+ fi
+# The test suite assumes that the binaries are available in the ${WRKSRC}/build
+# directory, which is not the case here.
+ ${LN} -Fs ${INSTALL_WRKSRC} ${WRKSRC}/build
+ cd ${WRKSRC} && ${SETENV} ${TEST_ENV} pytest --verbose -rxXs tests/
+
+.include <bsd.port.mk>
diff --git a/filesystems/unreliablefs/distinfo b/filesystems/unreliablefs/distinfo
new file mode 100644
index 000000000000..42458d53119d
--- /dev/null
+++ b/filesystems/unreliablefs/distinfo
@@ -0,0 +1,5 @@
+TIMESTAMP = 1628591422
+SHA256 (ligurio-unreliablefs-0.2.0_GH0.tar.gz) = 51ea2bdd0ef2b9d4e0960e244ab34d50d8f01fc8f2acb34b13d58ab9208b03f5
+SIZE (ligurio-unreliablefs-0.2.0_GH0.tar.gz) = 34574
+SHA256 (e97d259b1cda3c1342c9cb472d31230e50b0776d.patch) = 42cbe74153bb90b1b528a5b738c45e6086f32bcfb691c7d66acabd9b05ff7746
+SIZE (e97d259b1cda3c1342c9cb472d31230e50b0776d.patch) = 830
diff --git a/filesystems/unreliablefs/pkg-descr b/filesystems/unreliablefs/pkg-descr
new file mode 100644
index 000000000000..dfc24ceb8f34
--- /dev/null
+++ b/filesystems/unreliablefs/pkg-descr
@@ -0,0 +1,10 @@
+UnreliableFS is a FUSE-based fault injection filesystem that allows to change
+fault-injections in runtime using simple configuration file.
+
+Supported fault injections are:
+
+- errinj_errno - return error value and set random errno.
+- errinj_kill_caller - send SIGKILL to a process that invoked file operation.
+- errinj_noop - replace file operation with no operation (similar to
+ libeatmydata, but applicable to any file operation).
+- errinj_slowdown - slowdown invoked file operation.
diff --git a/filesystems/vzvol/Makefile b/filesystems/vzvol/Makefile
new file mode 100644
index 000000000000..98aa8be7bc74
--- /dev/null
+++ b/filesystems/vzvol/Makefile
@@ -0,0 +1,50 @@
+PORTNAME= vzvol
+DISTVERSIONPREFIX= v
+DISTVERSION= 0.7.0
+PORTREVISION= 3
+CATEGORIES= filesystems sysutils
+
+MAINTAINER= rainbow@sanitylinux.org
+COMMENT= Feature-rich ZFS zvol management tool
+WWW= https://github.com/RainbowHackerHorse/vzvol
+
+LICENSE= BSD2CLAUSE
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+GROUPS= operator
+
+USE_GITHUB= yes
+GH_ACCOUNT= RainbowHackerHorse
+NO_BUILD= yes
+NO_ARCH= yes
+
+PORTDOCS= README.md CONTRIBUTORS
+
+OPTIONS_DEFINE= DOCS PROGRESS VIRTUALBOX
+OPTIONS_GROUP= FILESYSTEMS
+OPTIONS_GROUP_FILESYSTEMS= EXT XFS
+OPTIONS_DEFAULT= EXT PROGRESS VIRTUALBOX XFS
+
+EXT_RUN_DEPENDS= mke2fs:filesystems/e2fsprogs-core
+PROGRESS_RUN_DEPENDS= pv:sysutils/pv
+VIRTUALBOX_RUN_DEPENDS= VBoxManage:emulators/virtualbox-ose
+XFS_RUN_DEPENDS= mkfs.xfs:filesystems/xfsprogs
+
+EXT_DESC= Install support for ext2, ext3, and ext4
+PROGRESS_DESC= Enables progress bars for import
+VIRTUALBOX_DESC= Support .VMDK creation with VirtualBox tools
+XFS_DESC= Install support for XFS filesystem
+
+do-install:
+ ${INSTALL_MAN} ${WRKSRC}/man/freebsd/vzvol.8 ${STAGEDIR}${PREFIX}/share/man/man8/
+ ${INSTALL_SCRIPT} ${WRKSRC}/bin/vzvol ${STAGEDIR}${PREFIX}/sbin
+.for dir in shared freebsd linux
+ @${MKDIR} ${STAGEDIR}${PREFIX}/lib/vzvol/lib/${dir}
+ ${INSTALL_SCRIPT} ${WRKSRC}/lib/${dir}/* ${STAGEDIR}${PREFIX}/lib/vzvol/lib/${dir}
+.endfor
+
+do-install-DOCS-on:
+ @${MKDIR} ${STAGEDIR}${DOCSDIR}
+ ${INSTALL_DATA} ${WRKSRC}/docs/* ${STAGEDIR}${DOCSDIR}
+
+.include <bsd.port.mk>
diff --git a/filesystems/vzvol/distinfo b/filesystems/vzvol/distinfo
new file mode 100644
index 000000000000..c9c7eef70932
--- /dev/null
+++ b/filesystems/vzvol/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1528566896
+SHA256 (RainbowHackerHorse-vzvol-v0.7.0_GH0.tar.gz) = 9e9f0586c3c1c22bf29fb250851968c092bedd517535c02caedbfbe728452579
+SIZE (RainbowHackerHorse-vzvol-v0.7.0_GH0.tar.gz) = 11181
diff --git a/filesystems/vzvol/pkg-descr b/filesystems/vzvol/pkg-descr
new file mode 100644
index 000000000000..d3aea5ba1fbb
--- /dev/null
+++ b/filesystems/vzvol/pkg-descr
@@ -0,0 +1,5 @@
+vzvol is a zvol manager, that allows a user to create,
+format, and manage zvols in the context of use for
+virtualization. It is meant to simplify the management of
+these devices, as well as allow the creation of a shim
+.VMDK file to allow the use of a zvol with VirtualBox.
diff --git a/filesystems/vzvol/pkg-plist b/filesystems/vzvol/pkg-plist
new file mode 100644
index 000000000000..a243674c5e1c
--- /dev/null
+++ b/filesystems/vzvol/pkg-plist
@@ -0,0 +1,22 @@
+lib/vzvol/lib/freebsd/vzvol_fs_fat32.sh
+lib/vzvol/lib/freebsd/vzvol_import.sh
+lib/vzvol/lib/freebsd/vzvol_pkgcheck.sh
+lib/vzvol/lib/linux/vzvol_fs_fat32.sh
+lib/vzvol/lib/linux/vzvol_import.sh
+lib/vzvol/lib/linux/vzvol_pkgcheck.sh
+lib/vzvol/lib/shared/vzvol_create.sh
+lib/vzvol/lib/shared/vzvol_delete.sh
+lib/vzvol/lib/shared/vzvol_errorcode.sh
+lib/vzvol/lib/shared/vzvol_existondisk.sh
+lib/vzvol/lib/shared/vzvol_fs.sh
+lib/vzvol/lib/shared/vzvol_fs_type.sh
+lib/vzvol/lib/shared/vzvol_fscheck.sh
+lib/vzvol/lib/shared/vzvol_getargz.sh
+lib/vzvol/lib/shared/vzvol_list.sh
+lib/vzvol/lib/shared/vzvol_permissions.sh
+lib/vzvol/lib/shared/vzvol_showhelp.sh
+lib/vzvol/lib/shared/vzvol_type.sh
+lib/vzvol/lib/shared/vzvol_vmdk.sh
+lib/vzvol/lib/shared/zvol_check.sh
+sbin/vzvol
+share/man/man8/vzvol.8.gz
diff --git a/filesystems/webdavfs/Makefile b/filesystems/webdavfs/Makefile
new file mode 100644
index 000000000000..fcf14c2f1f5f
--- /dev/null
+++ b/filesystems/webdavfs/Makefile
@@ -0,0 +1,47 @@
+PORTNAME= fusefs-webdavfs
+DISTVERSION= g20200520
+PORTREVISION= 23
+CATEGORIES= filesystems
+
+MAINTAINER= eugen@FreeBSD.org
+COMMENT= FUSE filesystem for WEBDAV shares
+WWW= https://github.com/miquels/webdavfs
+
+LICENSE= BSD3CLAUSE BSD4CLAUSE MIT
+LICENSE_COMB= multi
+LICENSE_FILE_BSD3CLAUSE= ${WRKDIR}/webdavfs-${GH_TAGNAME}/vendor/bazil.org/fuse/LICENSE
+LICENSE_FILE_BSD4CLAUSE= ${WRKDIR}/webdavfs-${GH_TAGNAME}/vendor/github.com/pborman/getopt/LICENSE
+LICENSE_FILE_MIT= ${WRKDIR}/webdavfs-${GH_TAGNAME}/LICENSE.md
+LICENSE_DISTFILES_MIT= ${DISTNAME}${EXTRACT_SUFX}
+LICENSE_DISTFILES_BSD3CLAUSE= bazil-fuse-${FUSE_GH_TAGNAME}_GH0${EXTRACT_SUFX}
+LICENSE_DISTFILES_BSD4CLAUSE= pborman-getopt-${GETOPT_GH_TAGNAME}_GH0${EXTRACT_SUFX}
+
+# This needs to be Go 1.7 or newer.
+USES= go:modules
+
+USE_GITHUB= yes
+GH_ACCOUNT= miquels
+GH_PROJECT= webdavfs
+GH_TAGNAME= 117d633
+
+# 2020-12-04 pborman/getopt
+GETOPT_GH_TAGNAME= ee0cd42419d3
+# 2020-05-25 bazil/fuse
+FUSE_GH_TAGNAME= 65cc252bf669
+# 2020-05-20 golang/net
+NET_GH_TAGNAME= 59133d7f0dd7
+
+GH_TUPLE= bazil:fuse:${FUSE_GH_TAGNAME}:bazil_fuse/vendor/bazil.org/fuse \
+ golang:net:${NET_GH_TAGNAME}:golang_net/vendor/golang.org/x/net \
+ pborman:getopt:${GETOPT_GH_TAGNAME}:pborman_getopt/vendor/github.com/pborman/getopt
+
+GO_TARGET= :${PREFIX}/sbin/mount.webdavfs
+
+PLIST_FILES= sbin/mount.webdavfs sbin/mount_webdavfs
+
+SUB_FILES= pkg-message mount_webdavfs
+
+post-install:
+ ${INSTALL_SCRIPT} ${WRKDIR}/mount_webdavfs ${STAGEDIR}${PREFIX}/sbin
+
+.include <bsd.port.mk>
diff --git a/filesystems/webdavfs/distinfo b/filesystems/webdavfs/distinfo
new file mode 100644
index 000000000000..190ae655ec4c
--- /dev/null
+++ b/filesystems/webdavfs/distinfo
@@ -0,0 +1,9 @@
+TIMESTAMP = 1623902743
+SHA256 (miquels-webdavfs-g20200520-117d633_GH0.tar.gz) = a70042e90006a2da61c9a0c79eb717984d67ec60dfd5de7cc912e4aa429cabeb
+SIZE (miquels-webdavfs-g20200520-117d633_GH0.tar.gz) = 22930
+SHA256 (bazil-fuse-65cc252bf669_GH0.tar.gz) = 5586365a61aed3e37375ccd8b2341c7486e1b8ed46b37fa162b83ef56d84be2a
+SIZE (bazil-fuse-65cc252bf669_GH0.tar.gz) = 187896
+SHA256 (golang-net-59133d7f0dd7_GH0.tar.gz) = ea0a358ca3f8e31ba20c4f20177c4fb8a081ad5119543ea454cabfd8707b5b16
+SIZE (golang-net-59133d7f0dd7_GH0.tar.gz) = 1174691
+SHA256 (pborman-getopt-ee0cd42419d3_GH0.tar.gz) = 8eaa2477da03612e053997e0cc0f541947e8cbd3b6e89c4bed628341a58623f2
+SIZE (pborman-getopt-ee0cd42419d3_GH0.tar.gz) = 39691
diff --git a/filesystems/webdavfs/files/mount_webdavfs.in b/filesystems/webdavfs/files/mount_webdavfs.in
new file mode 100644
index 000000000000..a8600c2c88ef
--- /dev/null
+++ b/filesystems/webdavfs/files/mount_webdavfs.in
@@ -0,0 +1,33 @@
+#!/bin/sh
+
+mountprog=%%PREFIX%%/sbin/mount.webdavfs
+
+while getopts "fo:DF:T:" opt
+do
+ case "$opt" in
+ o) case "$OPTARG" in
+ username=*) username=${OPTARG#username=} ;;
+ password=*) password=${OPTARG#password=} ;;
+ rw) ;;
+ *) options="$options,$OPTARG" ;;
+ esac ;;
+ T) traceopts="$traceopts,$OPTARG" ;;
+ *) flags="$flags -$opt $OPTARG" ;;
+ esac
+done
+shift $((OPTIND - 1))
+
+[ -n "$username" ] && options="$options,username=$username"
+[ -n "$password" ] && options="$options,password=$password"
+options=${options#,}
+
+traceopts=${traceopts#,}
+[ -n "$traceopts" ] && flags="$flags -T $traceopts"
+
+if [ -z "$options" ]; then
+ exec $mountprog $flags "$@"
+else
+ exec $mountprog $flags -o "$options" "$@"
+fi
+
+
diff --git a/filesystems/webdavfs/files/pkg-message.in b/filesystems/webdavfs/files/pkg-message.in
new file mode 100644
index 000000000000..eaf4a6f48f16
--- /dev/null
+++ b/filesystems/webdavfs/files/pkg-message.in
@@ -0,0 +1,10 @@
+[
+{ type: install
+ message: <<EOM
+Make sure you have fusefs.ko loaded then use mount.webdavfs command
+or add an entry to the /etc/fstab such as:
+
+https://webdav.server.net/path /mnt/path fusefs rw,late,mountprog=%%PREFIX%%/sbin/mount_webdavfs,username=login,password=pass,-F=/var/tmp/trace.log,-T=webdav,-T=httpreq,-T=httphdr 0 0
+EOM
+}
+]
diff --git a/filesystems/webdavfs/pkg-descr b/filesystems/webdavfs/pkg-descr
new file mode 100644
index 000000000000..6b585d937353
--- /dev/null
+++ b/filesystems/webdavfs/pkg-descr
@@ -0,0 +1,6 @@
+FUSE webdav filesystem.
+
+This filesystem behaves like a real network filesystem - no unnecessary
+copying of entire files. Currently, it claims read-write support for
+Apache's mod_dav and PHP's SabreDav (used by e.g. NextCloud) only.
+It forces read-only mode for other DAV servers.
diff --git a/filesystems/wimlib/Makefile b/filesystems/wimlib/Makefile
new file mode 100644
index 000000000000..8f5fa210b35d
--- /dev/null
+++ b/filesystems/wimlib/Makefile
@@ -0,0 +1,30 @@
+PORTNAME= wimlib
+PORTVERSION= 1.13.0
+PORTREVISION= 3
+CATEGORIES= filesystems sysutils
+MASTER_SITES= https://wimlib.net/downloads/
+
+MAINTAINER= mail_of_sergey@mail.ru
+COMMENT= Manipulate Windows Imaging (WIM) archives
+WWW= https://wimlib.net/
+
+LICENSE= GPLv3+
+LICENSE_FILE= ${WRKSRC}/COPYING.GPLv3
+
+USES= gmake gnome fuse libtool pkgconfig
+USE_GNOME= libxml2
+USE_LDCONFIG= yes
+
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
+CONFIGURE_ARGS= --disable-static
+
+OPTIONS_DEFINE= NTFS
+OPTIONS_DEFAULT= NTFS
+
+NTFS_DESC= Build with libntfs-3g for NTFS support (recommended)
+
+NTFS_CONFIGURE_WITH= ntfs-3g
+NTFS_LIB_DEPENDS= libntfs-3g.so:filesystems/ntfs
+
+.include <bsd.port.mk>
diff --git a/filesystems/wimlib/distinfo b/filesystems/wimlib/distinfo
new file mode 100644
index 000000000000..7daf28637a57
--- /dev/null
+++ b/filesystems/wimlib/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1543424329
+SHA256 (wimlib-1.13.0.tar.gz) = 51d92cafaae0180c7a91b50620f86ffbcec6d6aef360d38dd47e274e65d7970b
+SIZE (wimlib-1.13.0.tar.gz) = 1035146
diff --git a/filesystems/wimlib/pkg-descr b/filesystems/wimlib/pkg-descr
new file mode 100644
index 000000000000..e806457b59ad
--- /dev/null
+++ b/filesystems/wimlib/pkg-descr
@@ -0,0 +1,18 @@
+Allows to read and write Windows Imaging (WIM) files and deployment
+of Windows operating systems.
+
+General capabilities:
+
+- Apply (extract) a WIM image (wimapply)
+- Capture (create) a WIM image (wimcapture)
+- Append, delete, and export WIM images (wimappend, wimdelete, wimexport)
+- Modify a WIM image (wimupdate)
+- Extract files or directories from a WIM image (wimextract)
+- Optimize a WIM archive, removing wasted space
+ and optionally recompressing (wimoptimize)
+- Split or join a WIM archive (wimsplit, wimjoin)
+- Mount a WIM image (wimmount, wimmountrw)
+
+Sample of usage:
+
+http://www.ultimatedeployment.org/win7pxelinux3.html
diff --git a/filesystems/wimlib/pkg-plist b/filesystems/wimlib/pkg-plist
new file mode 100644
index 000000000000..ebb96360f340
--- /dev/null
+++ b/filesystems/wimlib/pkg-plist
@@ -0,0 +1,57 @@
+bin/mkwinpeimg
+bin/wimappend
+bin/wimapply
+bin/wimcapture
+bin/wimdelete
+bin/wimdir
+bin/wimexport
+bin/wimextract
+bin/wiminfo
+bin/wimjoin
+bin/wimlib-imagex
+bin/wimmount
+bin/wimmountrw
+bin/wimoptimize
+bin/wimsplit
+bin/wimunmount
+bin/wimupdate
+bin/wimverify
+include/wimlib.h
+lib/libwim.so
+lib/libwim.so.15
+lib/libwim.so.15.15.0
+libdata/pkgconfig/wimlib.pc
+share/man/man1/mkwinpeimg.1.gz
+share/man/man1/wimappend.1.gz
+share/man/man1/wimapply.1.gz
+share/man/man1/wimcapture.1.gz
+share/man/man1/wimdelete.1.gz
+share/man/man1/wimdir.1.gz
+share/man/man1/wimexport.1.gz
+share/man/man1/wimextract.1.gz
+share/man/man1/wiminfo.1.gz
+share/man/man1/wimjoin.1.gz
+share/man/man1/wimlib-imagex-append.1.gz
+share/man/man1/wimlib-imagex-apply.1.gz
+share/man/man1/wimlib-imagex-capture.1.gz
+share/man/man1/wimlib-imagex-delete.1.gz
+share/man/man1/wimlib-imagex-dir.1.gz
+share/man/man1/wimlib-imagex-export.1.gz
+share/man/man1/wimlib-imagex-extract.1.gz
+share/man/man1/wimlib-imagex-info.1.gz
+share/man/man1/wimlib-imagex-join.1.gz
+share/man/man1/wimlib-imagex-mount.1.gz
+share/man/man1/wimlib-imagex-mountrw.1.gz
+share/man/man1/wimlib-imagex-optimize.1.gz
+share/man/man1/wimlib-imagex-split.1.gz
+share/man/man1/wimlib-imagex-unmount.1.gz
+share/man/man1/wimlib-imagex-update.1.gz
+share/man/man1/wimlib-imagex-verify.1.gz
+share/man/man1/wimlib-imagex.1.gz
+share/man/man1/wimmount.1.gz
+share/man/man1/wimmountrw.1.gz
+share/man/man1/wimoptimize.1.gz
+share/man/man1/wimsplit.1.gz
+share/man/man1/wimunmount.1.gz
+share/man/man1/wimupdate.1.gz
+share/man/man1/wimverify.1.gz
diff --git a/filesystems/xfsm/Makefile b/filesystems/xfsm/Makefile
new file mode 100644
index 000000000000..45e8a6629152
--- /dev/null
+++ b/filesystems/xfsm/Makefile
@@ -0,0 +1,15 @@
+PORTNAME= xfsm
+PORTVERSION= 1.99
+PORTREVISION= 2
+CATEGORIES= filesystems sysutils
+MASTER_SITES= SUNSITE/system/status/xstatus
+
+MAINTAINER= ports@FreeBSD.org
+COMMENT= X File System Monitor
+
+USES= imake tar:tgz xorg
+USE_XORG= xbitmaps x11 xext
+MAKE_ARGS= CC="${CC}" CCOPTIONS="-DFreeBSD"
+PLIST_FILES= bin/xfsm share/man/man1/${PORTNAME}.1.gz
+
+.include <bsd.port.mk>
diff --git a/filesystems/xfsm/distinfo b/filesystems/xfsm/distinfo
new file mode 100644
index 000000000000..084adda37eca
--- /dev/null
+++ b/filesystems/xfsm/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905176
+SHA256 (xfsm-1.99.tgz) = 6ba199530b282cecea0e82d636f155f73fa5cddf3cef3c66b6a57864801b22da
+SIZE (xfsm-1.99.tgz) = 51872
diff --git a/filesystems/xfsm/files/patch-xfsm_util.c b/filesystems/xfsm/files/patch-xfsm_util.c
new file mode 100644
index 000000000000..3cbc2489196d
--- /dev/null
+++ b/filesystems/xfsm/files/patch-xfsm_util.c
@@ -0,0 +1,11 @@
+--- xfsm_util.c.orig Thu Feb 18 04:35:38 1999
++++ xfsm_util.c Wed Mar 15 03:08:33 2000
+@@ -152,7 +152,7 @@
+ /* *** FreeBSD has fsize which is the physical block size *** */
+ /* *** and bsize which is the optimal transfer block size *** */
+ /* *** and which depends on the filesystem parameter. *** */
+- calc_bsize=stats[i].f_fsize;
++ calc_bsize=stats[i].f_bsize;
+ #endif /* FreeBSD */
+
+ /* *** take the longer of the two 'problematic' strings *** */
diff --git a/filesystems/xfsm/pkg-descr b/filesystems/xfsm/pkg-descr
new file mode 100644
index 000000000000..9a9c488303d7
--- /dev/null
+++ b/filesystems/xfsm/pkg-descr
@@ -0,0 +1,6 @@
+xfsm stands for X File System Monitor and runs under MIT's X11
+window system on several flavors of UNIX. It is a tool designed
+to make monitoring your file systems' status easy by displaying
+a simple bar graph for each file system greater than size 0. It
+updates the file systems' statistics at regular, user definable
+intervals.
diff --git a/filesystems/xfsprogs/Makefile b/filesystems/xfsprogs/Makefile
new file mode 100644
index 000000000000..d6322b0c38c9
--- /dev/null
+++ b/filesystems/xfsprogs/Makefile
@@ -0,0 +1,44 @@
+PORTNAME= xfsprogs
+DISTVERSION= 3.2.4
+PORTREVISION= 4
+CATEGORIES= filesystems sysutils
+MASTER_SITES= ftp://oss.sgi.com/projects/xfs/cmd_tars/ \
+ ftp://oss.sgi.com/projects/xfs/previous/cmd_tars/
+
+MAINTAINER= ports@FreeBSD.org
+COMMENT= Utilities for managing XFS filesystems
+WWW= http://oss.sgi.com/projects/xfs/
+
+LICENSE= LGPL21 GPLv2
+LICENSE_COMB= multi
+LICENSE_FILE= ${WRKSRC}/doc/COPYING
+
+USES= cpe gettext gmake libtool:build readline
+CPE_VENDOR= sgi
+CPE_PRODUCT= ${PORTNAME}
+GNU_CONFIGURE= yes
+GNU_CONFIGURE_MANPREFIX= ${PREFIX}/share
+CONFIGURE_ENV= OPTIMIZER=-fcommon
+CONFIGURE_ARGS= --disable-shared --enable-readline
+ALL_TARGET= # empty
+MAKE_ARGS= V=1
+
+OPTIONS_DEFINE= DOCS
+
+post-patch:
+ @${REINPLACE_CMD} -e '/utmp/d' \
+ ${WRKSRC}/quota/report.c ${WRKSRC}/quota/util.c
+ @${REINPLACE_CMD} \
+ -e 's|/usr/local|${LOCALBASE}|g' \
+ -e 's/lio_listio/timer_create/' \
+ ${WRKSRC}/configure
+ @${REINPLACE_CMD} -e '/#!/s|bash|sh|' \
+ ${WRKSRC}/include/install-sh ${WRKSRC}/install-sh
+
+post-install:
+.for f in mkfs.xfs xfs_copy xfs_db xfs_estimate xfs_fsr xfs_growfs xfs_io \
+ xfs_logprint xfs_mdrestore xfs_quota xfs_repair xfs_rtcp
+ ${STRIP_CMD} ${STAGEDIR}${PREFIX}/sbin/${f}
+.endfor
+
+.include <bsd.port.mk>
diff --git a/filesystems/xfsprogs/distinfo b/filesystems/xfsprogs/distinfo
new file mode 100644
index 000000000000..cbbd873ecf05
--- /dev/null
+++ b/filesystems/xfsprogs/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1438219249
+SHA256 (xfsprogs-3.2.4.tar.gz) = dde65ead82d3cbfa9b4ded9796b6d22095d7d759a22d41ae6f1a4ec458bb0465
+SIZE (xfsprogs-3.2.4.tar.gz) = 1482424
diff --git a/filesystems/xfsprogs/files/patch-fsr_xfs__fsr.c b/filesystems/xfsprogs/files/patch-fsr_xfs__fsr.c
new file mode 100644
index 000000000000..2ded0bf3606c
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-fsr_xfs__fsr.c
@@ -0,0 +1,266 @@
+--- fsr/xfs_fsr.c.orig 2015-07-24 04:28:04 UTC
++++ fsr/xfs_fsr.c
+@@ -26,15 +26,13 @@
+
+ #include <fcntl.h>
+ #include <errno.h>
+-#include <malloc.h>
+-#include <mntent.h>
++#include <sys/mount.h>
+ #include <syslog.h>
+ #include <signal.h>
+ #include <sys/ioctl.h>
+ #include <sys/wait.h>
+-#include <sys/vfs.h>
+ #include <sys/statvfs.h>
+-#include <sys/xattr.h>
++#include <sys/extattr.h>
+
+
+ #ifndef XFS_XFLAG_NODEFRAG
+@@ -184,10 +182,13 @@ aborter(int unused)
+ static char *
+ find_mountpoint(char *mtab, char *argname, struct stat64 *sb)
+ {
+- struct mntent *t;
++ struct statfs *t;
+ struct stat64 ms;
+- FILE *mtabp;
+ char *mntp = NULL;
++ int nt;
++
++#ifdef __linux__
++ FILE *mtabp;
+
+ mtabp = setmntent(mtab, "r");
+ if (!mtabp) {
+@@ -195,40 +196,43 @@ find_mountpoint(char *mtab, char *argnam
+ progname, mtab);
+ exit(1);
+ }
++#endif
+
+- while ((t = getmntent(mtabp))) {
++ for (nt = getmntinfo(&t, MNT_NOWAIT); nt--; t++) {
+ if (S_ISDIR(sb->st_mode)) { /* mount point */
+- if (stat64(t->mnt_dir, &ms) < 0)
++ if (stat64(t->f_mntonname, &ms) < 0)
+ continue;
+ if (sb->st_ino != ms.st_ino)
+ continue;
+ if (sb->st_dev != ms.st_dev)
+ continue;
+- if (strcmp(t->mnt_type, MNTTYPE_XFS) != 0)
++ if (strcmp(t->f_fstypename, MNTTYPE_XFS) != 0)
+ continue;
+ } else { /* device */
+ struct stat64 sb2;
+
+- if (stat64(t->mnt_fsname, &ms) < 0)
++ if (stat64(t->f_mntfromname, &ms) < 0)
+ continue;
+ if (sb->st_rdev != ms.st_rdev)
+ continue;
+- if (strcmp(t->mnt_type, MNTTYPE_XFS) != 0)
++ if (strcmp(t->f_fstypename, MNTTYPE_XFS) != 0)
+ continue;
+
+ /*
+ * Make sure the mountpoint given by mtab is accessible
+ * before using it.
+ */
+- if (stat64(t->mnt_dir, &sb2) < 0)
++ if (stat64(t->f_mntonname, &sb2) < 0)
+ continue;
+ }
+
+- mntp = t->mnt_dir;
++ mntp = t->f_mntonname;
+ break;
+ }
+
++#ifdef __linux__
+ endmntent(mtabp);
++#endif
+ return mntp;
+ }
+
+@@ -304,6 +308,7 @@ main(int argc, char **argv)
+ }
+ }
+
++#ifdef __linux__
+ /*
+ * If the user did not specify an explicit mount table, try to use
+ * /proc/mounts if it is available, else /etc/mtab. We prefer
+@@ -317,6 +322,7 @@ main(int argc, char **argv)
+ else
+ mtab = _PATH_MOUNTED;
+ }
++#endif
+
+ if (vflag)
+ setbuf(stdout, NULL);
+@@ -392,7 +398,7 @@ usage(int ret)
+ " -t time How long to run in seconds.\n"
+ " -p passes Number of passes before terminating global re-org.\n"
+ " -f leftoff Use this instead of %s.\n"
+-" -m mtab Use something other than /etc/mtab.\n"
++" -m mtab Use this instead of /etc/mtab (ignored on FreeBSD).\n"
+ " -d Debug, print even more.\n"
+ " -v Verbose, more -v's more verbose.\n"
+ " -V Print version number and exit.\n"
+@@ -406,17 +412,20 @@ usage(int ret)
+ static void
+ initallfs(char *mtab)
+ {
+- FILE *fp;
+- struct mntent *mp;
+- int mi;
++ struct statfs *mp;
++ int mi, nmp;
+ char *cp;
+ struct stat64 sb;
+
++#ifdef __linux__
++ FILE *fp;
++
+ fp = setmntent(mtab, "r");
+ if (fp == NULL) {
+ fsrprintf(_("could not open mtab file: %s\n"), mtab);
+ exit(1);
+ }
++#endif
+
+ /* malloc a number of descriptors, increased later if needed */
+ if (!(fsbase = (fsdesc_t *)malloc(fsbufsize * sizeof(fsdesc_t)))) {
+@@ -428,23 +437,19 @@ initallfs(char *mtab)
+ /* find all rw xfs file systems */
+ mi = 0;
+ fs = fsbase;
+- while ((mp = getmntent(fp))) {
++ for (nmp = getmntinfo(&mp, MNT_NOWAIT); nmp--; mp++) {
+ int rw = 0;
+
+- if (strcmp(mp->mnt_type, MNTTYPE_XFS ) != 0 ||
+- stat64(mp->mnt_fsname, &sb) == -1 ||
++ if (strcmp(mp->f_fstypename, MNTTYPE_XFS ) != 0 ||
++ stat64(mp->f_mntfromname, &sb) == -1 ||
+ !S_ISBLK(sb.st_mode))
+ continue;
+
+- cp = strtok(mp->mnt_opts,",");
+- do {
+- if (strcmp("rw", cp) == 0)
+- rw++;
+- } while ((cp = strtok(NULL, ",")) != NULL);
++ rw = !(mp->f_flags & MNT_RDONLY);
+ if (rw == 0) {
+ if (dflag)
+ fsrprintf(_("Skipping %s: not mounted rw\n"),
+- mp->mnt_fsname);
++ mp->f_mntfromname);
+ continue;
+ }
+
+@@ -464,15 +469,15 @@ initallfs(char *mtab)
+ fs = (fsbase + mi); /* Needed ? */
+ }
+
+- fs->dev = strdup(mp->mnt_fsname);
+- fs->mnt = strdup(mp->mnt_dir);
++ fs->dev = strdup(mp->f_mntfromname);
++ fs->mnt = strdup(mp->f_mntonname);
+
+ if (fs->dev == NULL) {
+- fsrprintf(_("strdup(%s) failed\n"), mp->mnt_fsname);
++ fsrprintf(_("strdup(%s) failed\n"), mp->f_mntfromname);
+ exit(1);
+ }
+ if (fs->mnt == NULL) {
+- fsrprintf(_("strdup(%s) failed\n"), mp->mnt_dir);
++ fsrprintf(_("strdup(%s) failed\n"), mp->f_mntonname);
+ exit(1);
+ }
+ mi++;
+@@ -480,7 +485,9 @@ initallfs(char *mtab)
+ }
+ numfs = mi;
+ fsend = (fsbase + numfs);
++#ifdef __linux__
+ endmntent(fp);
++#endif
+ if (numfs == 0) {
+ fsrprintf(_("no rw xfs file systems in mtab: %s\n"), mtab);
+ exit(0);
+@@ -1027,7 +1034,7 @@ fsr_setup_attr_fork(
+ xfs_bstat_t *bstatp)
+ {
+ struct stat64 tstatbuf;
+- int i;
++ int i, ns;
+ int diff = 0;
+ int last_forkoff = 0;
+ int no_change_cnt = 0;
+@@ -1036,6 +1043,9 @@ fsr_setup_attr_fork(
+ if (!(bstatp->bs_xflags & XFS_XFLAG_HASATTR))
+ return 0;
+
++ if (extattr_string_to_namespace("user", &ns) == -1)
++ return -1;
++
+ /*
+ * use the old method if we have attr1 or the kernel does not yet
+ * support passing the fork offset in the bulkstat data.
+@@ -1043,8 +1053,8 @@ fsr_setup_attr_fork(
+ if (!(fsgeom.flags & XFS_FSOP_GEOM_FLAGS_ATTR2) ||
+ bstatp->bs_forkoff == 0) {
+ /* attr1 */
+- ret = fsetxattr(tfd, "user.X", "X", 1, XATTR_CREATE);
+- if (ret) {
++ ret = extattr_set_fd(tfd, ns, "X", "X", 1);
++ if (ret == -1) {
+ fsrprintf(_("could not set ATTR\n"));
+ return -1;
+ }
+@@ -1085,7 +1095,7 @@ fsr_setup_attr_fork(
+ if (!diff)
+ goto out;
+
+- snprintf(name, sizeof(name), "user.%d", i);
++ snprintf(name, sizeof(name), "%d", i);
+
+ /*
+ * If there is no attribute, then we need to create one to get
+@@ -1093,8 +1103,8 @@ fsr_setup_attr_fork(
+ */
+ if (!tbstat.bs_forkoff) {
+ ASSERT(i == 0);
+- ret = fsetxattr(tfd, name, "XX", 2, XATTR_CREATE);
+- if (ret) {
++ ret = extattr_set_fd(tfd, ns, name, "XX", 2);
++ if (ret == -1) {
+ fsrprintf(_("could not set ATTR\n"));
+ return -1;
+ }
+@@ -1141,7 +1151,8 @@ fsr_setup_attr_fork(
+ if (diff < 0 && fsx.fsx_nextents > 0) {
+ char val[2048];
+ memset(val, 'X', 2048);
+- if (fsetxattr(tfd, name, val, 2048, 0)) {
++ if (extattr_set_fd(tfd, ns, name, val, 2048)
++ == -1) {
+ fsrprintf(_("big ATTR set failed\n"));
+ return -1;
+ }
+@@ -1185,8 +1196,8 @@ fsr_setup_attr_fork(
+ }
+
+ /* we need to grow the attr fork, so create another attr */
+- ret = fsetxattr(tfd, name, "XX", 2, XATTR_CREATE);
+- if (ret) {
++ ret = extattr_set_fd(tfd, ns, name, "XX", 2);
++ if (ret == -1) {
+ fsrprintf(_("could not set ATTR\n"));
+ return -1;
+ }
diff --git a/filesystems/xfsprogs/files/patch-include_freebsd.h b/filesystems/xfsprogs/files/patch-include_freebsd.h
new file mode 100644
index 000000000000..e6f636c3509c
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-include_freebsd.h
@@ -0,0 +1,17 @@
+--- include/freebsd.h.orig 2015-07-24 04:28:04 UTC
++++ include/freebsd.h
+@@ -37,10 +37,14 @@
+ #define ftruncate64 ftruncate
+ #define lseek64 lseek
+ #define stat64 stat
++#define lstat64 lstat
+ #define pwrite64 pwrite
+ #define pread64 pread
+ #define fdatasync fsync
+ #define memalign(a,sz) valloc(sz)
++#define nftw64 nftw
++#define statvfs64 statvfs
++#define posix_fadvise64 posix_fadvise
+
+ #define constpp char * const *
+
diff --git a/filesystems/xfsprogs/files/patch-include_libxfs.h b/filesystems/xfsprogs/files/patch-include_libxfs.h
new file mode 100644
index 000000000000..229231935310
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-include_libxfs.h
@@ -0,0 +1,10 @@
+--- include/libxfs.h.orig 2015-07-24 04:28:04 UTC
++++ include/libxfs.h
+@@ -27,7 +27,6 @@
+ #include <xfs/list.h>
+ #include <xfs/hlist.h>
+ #include <xfs/cache.h>
+-#include <xfs/bitops.h>
+ #include <xfs/kmem.h>
+ #include <xfs/radix-tree.h>
+ #include <xfs/swab.h>
diff --git a/filesystems/xfsprogs/files/patch-include_list.h b/filesystems/xfsprogs/files/patch-include_list.h
new file mode 100644
index 000000000000..ec1874b585ca
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-include_list.h
@@ -0,0 +1,11 @@
+--- include/list.h.orig 2014-01-20 22:47:46 UTC
++++ include/list.h
+@@ -29,7 +29,7 @@ struct list_head {
+
+ #define LIST_HEAD_INIT(name) { &(name), &(name) }
+
+-#define LIST_HEAD(name) \
++#define XFS_LIST_HEAD(name) \
+ struct list_head name = LIST_HEAD_INIT(name)
+
+ #define INIT_LIST_HEAD(list) list_head_init(list)
diff --git a/filesystems/xfsprogs/files/patch-include_xfs__bit.h b/filesystems/xfsprogs/files/patch-include_xfs__bit.h
new file mode 100644
index 000000000000..768cb386f418
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-include_xfs__bit.h
@@ -0,0 +1,11 @@
+--- include/xfs_bit.h.orig 2015-07-24 04:28:04 UTC
++++ include/xfs_bit.h
+@@ -47,7 +47,7 @@ static inline int xfs_highbit32(__uint32
+ /* Get high bit set out of 64-bit argument, -1 if none set */
+ static inline int xfs_highbit64(__uint64_t v)
+ {
+- return fls64(v) - 1;
++ return flsll(v) - 1;
+ }
+
+ /* Get low bit set out of 32-bit argument, -1 if none set */
diff --git a/filesystems/xfsprogs/files/patch-io_mmap.c b/filesystems/xfsprogs/files/patch-io_mmap.c
new file mode 100644
index 000000000000..89fdc3d72548
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-io_mmap.c
@@ -0,0 +1,41 @@
+--- io/mmap.c.orig 2015-07-24 04:28:04 UTC
++++ io/mmap.c
+@@ -575,6 +575,7 @@ mwrite_f(
+ return 0;
+ }
+
++#ifdef __linux__
+ static void
+ mremap_help(void)
+ {
+@@ -634,6 +635,7 @@ mremap_f(
+
+ return 0;
+ }
++#endif
+
+ void
+ mmap_init(void)
+@@ -689,6 +691,7 @@ mmap_init(void)
+ _("writes data into a region in the current memory mapping");
+ mwrite_cmd.help = mwrite_help;
+
++#ifdef __linux__
+ mremap_cmd.name = "mremap";
+ mremap_cmd.altname = "mrm";
+ mremap_cmd.cfunc = mremap_f;
+@@ -699,11 +702,14 @@ mmap_init(void)
+ mremap_cmd.oneline =
+ _("alters the size of the current memory mapping");
+ mremap_cmd.help = mremap_help;
++#endif
+
+ add_command(&mmap_cmd);
+ add_command(&mread_cmd);
+ add_command(&msync_cmd);
+ add_command(&munmap_cmd);
+ add_command(&mwrite_cmd);
++#ifdef __linux__
+ add_command(&mremap_cmd);
++#endif
+ }
diff --git a/filesystems/xfsprogs/files/patch-io_readdir.c b/filesystems/xfsprogs/files/patch-io_readdir.c
new file mode 100644
index 000000000000..b3c1d2968f4f
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-io_readdir.c
@@ -0,0 +1,20 @@
+--- io/readdir.c.orig 2015-07-24 04:28:04 UTC
++++ io/readdir.c
+@@ -72,7 +72,7 @@ dump_dirent(
+ long long offset,
+ struct dirent *dirent)
+ {
+- printf("%08llx: d_ino: 0x%08lx", offset, dirent->d_ino);
++ printf("%08llx: d_ino: 0x%08x", offset, dirent->d_ino);
+ #ifdef _DIRENT_HAVE_D_OFF
+ printf(" d_off: 0x%08lx", dirent->d_off);
+ #endif
+@@ -109,7 +109,7 @@ read_directory(
+
+ if (dump) {
+ dump_dirent(offset, dirent);
+- offset = dirent->d_off;
++ offset = telldir(dir);
+ }
+ }
+
diff --git a/filesystems/xfsprogs/files/patch-libhandle_handle.c b/filesystems/xfsprogs/files/patch-libhandle_handle.c
new file mode 100644
index 000000000000..0ecca06fd629
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-libhandle_handle.c
@@ -0,0 +1,10 @@
+--- libhandle/handle.c.orig 2015-07-24 04:28:04 UTC
++++ libhandle/handle.c
+@@ -23,6 +23,7 @@
+
+ /* just pick a value we know is more than big enough */
+ #define MAXHANSIZ 64
++#define XATTR_LIST_MAX 65536
+
+ /*
+ * The actual content of a handle is supposed to be opaque here.
diff --git a/filesystems/xfsprogs/files/patch-libhandle_jdm.c b/filesystems/xfsprogs/files/patch-libhandle_jdm.c
new file mode 100644
index 000000000000..ef504248d1cb
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-libhandle_jdm.c
@@ -0,0 +1,11 @@
+--- libhandle/jdm.c.orig 2015-07-24 04:28:04 UTC
++++ libhandle/jdm.c
+@@ -21,6 +21,8 @@
+ #include <xfs/jdm.h>
+ #include <xfs/parent.h>
+
++#define XATTR_LIST_MAX 65536
++
+ /* internal fshandle - typecast to a void for external use */
+ #define FSHANDLE_SZ 8
+ typedef struct fshandle {
diff --git a/filesystems/xfsprogs/files/patch-libxcmd_paths.c b/filesystems/xfsprogs/files/patch-libxcmd_paths.c
new file mode 100644
index 000000000000..59037da27541
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-libxcmd_paths.c
@@ -0,0 +1,11 @@
+--- libxcmd/paths.c.orig 2015-07-24 04:28:04 UTC
++++ libxcmd/paths.c
+@@ -364,7 +364,7 @@ fs_table_initialise_mounts(
+ continue;
+ if (!realpath(stats[i].f_mntfromname, rmntfromname))
+ continue;
+- if (!realpath(stats[i].f_mntonname, rmnttomname)))
++ if (!realpath(stats[i].f_mntonname, rmntonname))
+ continue;
+
+ if (path &&
diff --git a/filesystems/xfsprogs/files/patch-libxfs_crc32.c b/filesystems/xfsprogs/files/patch-libxfs_crc32.c
new file mode 100644
index 000000000000..32f53647b5d6
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-libxfs_crc32.c
@@ -0,0 +1,10 @@
+--- libxfs/crc32.c.orig 2015-07-24 04:28:04 UTC
++++ libxfs/crc32.c
+@@ -33,6 +33,7 @@
+ * match the hardware acceleration available on Intel CPUs.
+ */
+
++#include <inttypes.h>
+ #include <libxfs.h>
+ #include "crc32defs.h"
+
diff --git a/filesystems/xfsprogs/files/patch-libxfs_rdwr.c b/filesystems/xfsprogs/files/patch-libxfs_rdwr.c
new file mode 100644
index 000000000000..d89bf99c7ee7
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-libxfs_rdwr.c
@@ -0,0 +1,19 @@
+--- libxfs/rdwr.c.orig 2015-07-24 04:28:04 UTC
++++ libxfs/rdwr.c
+@@ -16,6 +16,7 @@
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++#include <inttypes.h>
+ #include <xfs/libxfs.h>
+ #include "init.h"
+
+@@ -371,7 +372,7 @@ libxfs_bcompare(struct cache_node *node,
+ #ifdef IO_BCOMPARE_CHECK
+ if (!(libxfs_bcache->c_flags & CACHE_MISCOMPARE_PURGE)) {
+ fprintf(stderr,
+- "%lx: Badness in key lookup (length)\n"
++ "%p: Badness in key lookup (length)\n"
+ "bp=(bno 0x%llx, len %u bytes) key=(bno 0x%llx, len %u bytes)\n",
+ pthread_self(),
+ (unsigned long long)bp->b_bn, (int)bp->b_bcount,
diff --git a/filesystems/xfsprogs/files/patch-libxfs_util.c b/filesystems/xfsprogs/files/patch-libxfs_util.c
new file mode 100644
index 000000000000..cb15c74f5518
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-libxfs_util.c
@@ -0,0 +1,10 @@
+--- libxfs/util.c.orig 2015-07-24 04:28:04 UTC
++++ libxfs/util.c
+@@ -16,6 +16,7 @@
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++#include <inttypes.h>
+ #include <xfs.h>
+ #include <time.h>
+ #include <stdio.h>
diff --git a/filesystems/xfsprogs/files/patch-libxfs_xfs__attr__remote.c b/filesystems/xfsprogs/files/patch-libxfs_xfs__attr__remote.c
new file mode 100644
index 000000000000..969d1bdf444a
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-libxfs_xfs__attr__remote.c
@@ -0,0 +1,10 @@
+--- libxfs/xfs_attr_remote.c.orig 2015-07-24 04:28:04 UTC
++++ libxfs/xfs_attr_remote.c
+@@ -19,6 +19,7 @@
+ #include <xfs.h>
+
+ #define ATTR_RMTVALUE_MAPSIZE 1 /* # of map entries at once */
++#define XATTR_SIZE_MAX 65536
+
+ /*
+ * Each contiguous block has a header, so it is not just a simple attribute
diff --git a/filesystems/xfsprogs/files/patch-libxlog_util.c b/filesystems/xfsprogs/files/patch-libxlog_util.c
new file mode 100644
index 000000000000..3b2f23613efb
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-libxlog_util.c
@@ -0,0 +1,10 @@
+--- libxlog/util.c.orig 2015-07-28 23:02:16 UTC
++++ libxlog/util.c
+@@ -16,6 +16,7 @@
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++#include <inttypes.h>
+ #include <xfs/libxlog.h>
+
+ int print_exit;
diff --git a/filesystems/xfsprogs/files/patch-po_de.po b/filesystems/xfsprogs/files/patch-po_de.po
new file mode 100644
index 000000000000..bf9faedd7eda
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-po_de.po
@@ -0,0 +1,11 @@
+--- po/de.po.orig 2015-07-24 04:28:04 UTC
++++ po/de.po
+@@ -3084,7 +3084,7 @@ msgid "%s will take about %.1f megabytes\n"
+ #: .././estimate/xfs_estimate.c:191
+ #, c-format
+ msgid "%s will take about %.1f megabytes\n"
+-msgstr "%s wird etwa %.lf Megabytes einnehmen\n"
++msgstr "%s wird etwa %.1f Megabytes einnehmen\n"
+
+ #: .././estimate/xfs_estimate.c:198
+ #, c-format
diff --git a/filesystems/xfsprogs/files/patch-repair_agheader.c b/filesystems/xfsprogs/files/patch-repair_agheader.c
new file mode 100644
index 000000000000..d0d0f14ea0a6
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-repair_agheader.c
@@ -0,0 +1,10 @@
+--- repair/agheader.c.orig 2015-07-24 04:28:04 UTC
++++ repair/agheader.c
+@@ -16,6 +16,7 @@
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++#include <inttypes.h>
+ #include <libxfs.h>
+ #include "globals.h"
+ #include "agheader.h"
diff --git a/filesystems/xfsprogs/files/patch-repair_attr__repair.c b/filesystems/xfsprogs/files/patch-repair_attr__repair.c
new file mode 100644
index 000000000000..6ea276ef3e88
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-repair_attr__repair.c
@@ -0,0 +1,10 @@
+--- repair/attr_repair.c.orig 2015-07-24 04:28:04 UTC
++++ repair/attr_repair.c
+@@ -16,6 +16,7 @@
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++#include <inttypes.h>
+ #include <libxfs.h>
+ #include "globals.h"
+ #include "err_protos.h"
diff --git a/filesystems/xfsprogs/files/patch-repair_attr__repair.h b/filesystems/xfsprogs/files/patch-repair_attr__repair.h
new file mode 100644
index 000000000000..9ae0d545ec7e
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-repair_attr__repair.h
@@ -0,0 +1,10 @@
+--- repair/attr_repair.h.orig 2015-07-24 04:28:04 UTC
++++ repair/attr_repair.h
+@@ -71,6 +71,7 @@ struct xfs_acl {
+ * For v4 superblocks, that is limited to 25 entries. For v5 superblocks, it is
+ * limited only by the maximum size of the xattr that stores the information.
+ */
++#define XATTR_SIZE_MAX 65536
+ #define XFS_ACL_MAX_ENTRIES(mp) \
+ (xfs_sb_version_hascrc(&mp->m_sb) \
+ ? (XATTR_SIZE_MAX - sizeof(struct xfs_acl)) / \
diff --git a/filesystems/xfsprogs/files/patch-repair_bmap.c b/filesystems/xfsprogs/files/patch-repair_bmap.c
new file mode 100644
index 000000000000..754e1d435384
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-repair_bmap.c
@@ -0,0 +1,10 @@
+--- repair/bmap.c.orig 2015-07-24 04:28:04 UTC
++++ repair/bmap.c
+@@ -16,6 +16,7 @@
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++#include <inttypes.h>
+ #include <libxfs.h>
+ #include "err_protos.h"
+ #include "bmap.h"
diff --git a/filesystems/xfsprogs/files/patch-repair_dino__chunks.c b/filesystems/xfsprogs/files/patch-repair_dino__chunks.c
new file mode 100644
index 000000000000..e99a31e860bc
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-repair_dino__chunks.c
@@ -0,0 +1,10 @@
+--- repair/dino_chunks.c.orig 2015-07-24 04:28:04 UTC
++++ repair/dino_chunks.c
+@@ -16,6 +16,7 @@
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++#include <inttypes.h>
+ #include <libxfs.h>
+ #include "avl.h"
+ #include "globals.h"
diff --git a/filesystems/xfsprogs/files/patch-repair_dinode.c b/filesystems/xfsprogs/files/patch-repair_dinode.c
new file mode 100644
index 000000000000..681657d22168
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-repair_dinode.c
@@ -0,0 +1,10 @@
+--- repair/dinode.c.orig 2015-07-24 04:28:04 UTC
++++ repair/dinode.c
+@@ -16,6 +16,7 @@
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++#include <inttypes.h>
+ #include <libxfs.h>
+ #include "avl.h"
+ #include "globals.h"
diff --git a/filesystems/xfsprogs/files/patch-repair_dir2.c b/filesystems/xfsprogs/files/patch-repair_dir2.c
new file mode 100644
index 000000000000..9056ade2151f
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-repair_dir2.c
@@ -0,0 +1,10 @@
+--- repair/dir2.c.orig 2015-07-24 04:28:04 UTC
++++ repair/dir2.c
+@@ -16,6 +16,7 @@
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++#include <inttypes.h>
+ #include <libxfs.h>
+ #include "avl.h"
+ #include "globals.h"
diff --git a/filesystems/xfsprogs/files/patch-repair_incore.c b/filesystems/xfsprogs/files/patch-repair_incore.c
new file mode 100644
index 000000000000..97637a572c82
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-repair_incore.c
@@ -0,0 +1,10 @@
+--- repair/incore.c.orig 2015-07-24 04:28:04 UTC
++++ repair/incore.c
+@@ -16,6 +16,7 @@
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++#include <inttypes.h>
+ #include <libxfs.h>
+ #include "avl.h"
+ #include "btree.h"
diff --git a/filesystems/xfsprogs/files/patch-repair_phase2.c b/filesystems/xfsprogs/files/patch-repair_phase2.c
new file mode 100644
index 000000000000..6a3b7ecda94b
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-repair_phase2.c
@@ -0,0 +1,10 @@
+--- repair/phase2.c.orig 2015-07-28 23:02:16 UTC
++++ repair/phase2.c
+@@ -16,6 +16,7 @@
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++#include <inttypes.h>
+ #include <xfs/libxlog.h>
+ #include "avl.h"
+ #include "globals.h"
diff --git a/filesystems/xfsprogs/files/patch-repair_phase3.c b/filesystems/xfsprogs/files/patch-repair_phase3.c
new file mode 100644
index 000000000000..3d5de760b8b7
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-repair_phase3.c
@@ -0,0 +1,10 @@
+--- repair/phase3.c.orig 2015-07-24 04:28:04 UTC
++++ repair/phase3.c
+@@ -16,6 +16,7 @@
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++#include <inttypes.h>
+ #include <libxfs.h>
+ #include "threads.h"
+ #include "prefetch.h"
diff --git a/filesystems/xfsprogs/files/patch-repair_phase4.c b/filesystems/xfsprogs/files/patch-repair_phase4.c
new file mode 100644
index 000000000000..79b6ee00e029
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-repair_phase4.c
@@ -0,0 +1,10 @@
+--- repair/phase4.c.orig 2015-07-24 04:28:04 UTC
++++ repair/phase4.c
+@@ -16,6 +16,7 @@
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++#include <inttypes.h>
+ #include <libxfs.h>
+ #include "threads.h"
+ #include "prefetch.h"
diff --git a/filesystems/xfsprogs/files/patch-repair_phase6.c b/filesystems/xfsprogs/files/patch-repair_phase6.c
new file mode 100644
index 000000000000..6285609ca09b
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-repair_phase6.c
@@ -0,0 +1,19 @@
+--- repair/phase6.c.orig 2015-07-24 04:28:04 UTC
++++ repair/phase6.c
+@@ -16,6 +16,7 @@
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++#include <inttypes.h>
+ #include <libxfs.h>
+ #include "threads.h"
+ #include "prefetch.h"
+@@ -49,7 +50,7 @@ typedef struct dotdot_update {
+ int ino_offset;
+ } dotdot_update_t;
+
+-static LIST_HEAD(dotdot_update_list);
++static XFS_LIST_HEAD(dotdot_update_list);
+ static int dotdot_update;
+
+ static void
diff --git a/filesystems/xfsprogs/files/patch-repair_phase7.c b/filesystems/xfsprogs/files/patch-repair_phase7.c
new file mode 100644
index 000000000000..a89d928ac70e
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-repair_phase7.c
@@ -0,0 +1,10 @@
+--- repair/phase7.c.orig 2015-07-24 04:28:04 UTC
++++ repair/phase7.c
+@@ -16,6 +16,7 @@
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++#include <inttypes.h>
+ #include <libxfs.h>
+ #include "avl.h"
+ #include "globals.h"
diff --git a/filesystems/xfsprogs/files/patch-repair_progress.c b/filesystems/xfsprogs/files/patch-repair_progress.c
new file mode 100644
index 000000000000..eb0d4c92c28c
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-repair_progress.c
@@ -0,0 +1,8 @@
+--- repair/progress.c.orig 2015-07-24 04:28:04 UTC
++++ repair/progress.c
+@@ -1,4 +1,5 @@
+
++#include <inttypes.h>
+ #include <libxfs.h>
+ #include "globals.h"
+ #include "progress.h"
diff --git a/filesystems/xfsprogs/files/patch-repair_sb.c b/filesystems/xfsprogs/files/patch-repair_sb.c
new file mode 100644
index 000000000000..c2a88d67f7c6
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-repair_sb.c
@@ -0,0 +1,10 @@
+--- repair/sb.c.orig 2015-07-24 04:28:04 UTC
++++ repair/sb.c
+@@ -16,6 +16,7 @@
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++#include <inttypes.h>
+ #include <libxfs.h>
+ #include <libxlog.h>
+ #include "agheader.h"
diff --git a/filesystems/xfsprogs/files/patch-repair_scan.c b/filesystems/xfsprogs/files/patch-repair_scan.c
new file mode 100644
index 000000000000..6d57dfd276d5
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-repair_scan.c
@@ -0,0 +1,10 @@
+--- repair/scan.c.orig 2015-07-24 04:28:04 UTC
++++ repair/scan.c
+@@ -16,6 +16,7 @@
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++#include <inttypes.h>
+ #include <libxfs.h>
+ #include "avl.h"
+ #include "globals.h"
diff --git a/filesystems/xfsprogs/files/patch-repair_xfs__repair.c b/filesystems/xfsprogs/files/patch-repair_xfs__repair.c
new file mode 100644
index 000000000000..f86768dfeb1f
--- /dev/null
+++ b/filesystems/xfsprogs/files/patch-repair_xfs__repair.c
@@ -0,0 +1,10 @@
+--- repair/xfs_repair.c.orig 2015-07-24 04:28:04 UTC
++++ repair/xfs_repair.c
+@@ -16,6 +16,7 @@
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++#include <inttypes.h>
+ #include <xfs/libxlog.h>
+ #include <sys/resource.h>
+ #include "avl.h"
diff --git a/filesystems/xfsprogs/pkg-descr b/filesystems/xfsprogs/pkg-descr
new file mode 100644
index 000000000000..ec87fe1373cd
--- /dev/null
+++ b/filesystems/xfsprogs/pkg-descr
@@ -0,0 +1,7 @@
+A set of commands to work with XFS filesystems, including mkfs.xfs(8).
+
+XFS is a high performance journaling filesystem which originated on the
+SGI IRIX platform. It is completely multi-threaded, can support large
+files and large filesystems, extended attributes, variable block sizes,
+is extent based, and makes extensive use of B-trees (for directories,
+extents, free space) to aid both performance and scalability.
diff --git a/filesystems/xfsprogs/pkg-plist b/filesystems/xfsprogs/pkg-plist
new file mode 100644
index 000000000000..7b0c0fdc61a6
--- /dev/null
+++ b/filesystems/xfsprogs/pkg-plist
@@ -0,0 +1,49 @@
+share/man/man5/projects.5.gz
+share/man/man5/projid.5.gz
+share/man/man5/xfs.5.gz
+share/man/man8/fsck.xfs.8.gz
+share/man/man8/mkfs.xfs.8.gz
+share/man/man8/xfs_admin.8.gz
+share/man/man8/xfs_bmap.8.gz
+share/man/man8/xfs_copy.8.gz
+share/man/man8/xfs_db.8.gz
+share/man/man8/xfs_estimate.8.gz
+share/man/man8/xfs_freeze.8.gz
+share/man/man8/xfs_fsr.8.gz
+share/man/man8/xfs_growfs.8.gz
+share/man/man8/xfs_info.8.gz
+share/man/man8/xfs_io.8.gz
+share/man/man8/xfs_logprint.8.gz
+share/man/man8/xfs_mdrestore.8.gz
+share/man/man8/xfs_metadump.8.gz
+share/man/man8/xfs_mkfile.8.gz
+share/man/man8/xfs_ncheck.8.gz
+share/man/man8/xfs_quota.8.gz
+share/man/man8/xfs_repair.8.gz
+share/man/man8/xfs_rtcp.8.gz
+sbin/fsck.xfs
+sbin/mkfs.xfs
+sbin/xfs_admin
+sbin/xfs_bmap
+sbin/xfs_copy
+sbin/xfs_db
+sbin/xfs_estimate
+sbin/xfs_freeze
+sbin/xfs_fsr
+sbin/xfs_growfs
+sbin/xfs_info
+sbin/xfs_io
+sbin/xfs_logprint
+sbin/xfs_mdrestore
+sbin/xfs_metadump
+sbin/xfs_mkfile
+sbin/xfs_ncheck
+sbin/xfs_quota
+sbin/xfs_repair
+sbin/xfs_rtcp
+share/locale/de/LC_MESSAGES/xfsprogs.mo
+share/locale/pl/LC_MESSAGES/xfsprogs.mo
+%%PORTDOCS%%%%DOCSDIR%%/CHANGES.gz
+%%PORTDOCS%%%%DOCSDIR%%/CREDITS
+%%PORTDOCS%%%%DOCSDIR%%/COPYING
+%%PORTDOCS%%%%DOCSDIR%%/README
diff --git a/filesystems/xfuse/Makefile b/filesystems/xfuse/Makefile
new file mode 100644
index 000000000000..335e950fc5f8
--- /dev/null
+++ b/filesystems/xfuse/Makefile
@@ -0,0 +1,26 @@
+PORTNAME= xfuse
+DISTVERSION= 0.4.4
+PORTREVISION= 2
+CATEGORIES= filesystems
+MASTER_SITES= CRATESIO
+MASTER_SITE_SUBDIR= xfs-fuse/${DISTVERSION}
+PKGNAMEPREFIX= fusefs-
+DISTNAME= xfs-fuse-${DISTVERSIONPREFIX}${DISTVERSION}${DISTVERSIONSUFFIX}
+DISTFILES= ${CARGO_DIST_SUBDIR}/${DISTNAME}${CARGO_CRATE_EXT}
+
+MAINTAINER= asomers@FreeBSD.org
+COMMENT= Read-only FUSE server implementing XFS
+WWW= https://github.com/KhaledEmaraDev/xfuse
+
+LICENSE= BSD2CLAUSE
+LICENSE_FILE= ${WRKSRC}/LICENSE.md
+
+USES= cargo fuse:3
+
+PLIST_FILES= bin/xfs-fuse \
+ share/man/man1/xfs-fuse.1.gz
+
+post-install:
+ ${INSTALL_MAN} ${WRKSRC}/doc/xfs-fuse.1 ${STAGEDIR}${PREFIX}/share/man/man1
+
+.include <bsd.port.mk>
diff --git a/filesystems/xfuse/Makefile.crates b/filesystems/xfuse/Makefile.crates
new file mode 100644
index 000000000000..0cb7306bc004
--- /dev/null
+++ b/filesystems/xfuse/Makefile.crates
@@ -0,0 +1,142 @@
+CARGO_CRATES= aho-corasick-1.0.5 \
+ anstream-0.6.14 \
+ anstyle-1.0.2 \
+ anstyle-parse-0.2.4 \
+ anstyle-query-1.0.3 \
+ anstyle-wincon-3.0.3 \
+ assert_cmd-2.0.11 \
+ autocfg-1.1.0 \
+ bincode-2.0.0-rc.3 \
+ bincode_derive-2.0.0-rc.3 \
+ bitflags-1.3.2 \
+ bitflags-2.4.0 \
+ bstr-1.6.2 \
+ byteorder-1.4.3 \
+ cc-1.0.83 \
+ cfg-if-1.0.0 \
+ clap-4.4.18 \
+ clap_builder-4.4.18 \
+ clap_derive-4.4.7 \
+ clap_lex-0.6.0 \
+ colorchoice-1.0.1 \
+ crc-2.1.0 \
+ crc-catalog-1.1.1 \
+ difflib-0.4.0 \
+ doc-comment-0.3.3 \
+ either-1.9.0 \
+ enum-as-inner-0.6.0 \
+ enum_dispatch-0.3.12 \
+ errno-0.3.3 \
+ errno-dragonfly-0.1.2 \
+ fastrand-2.0.0 \
+ function_name-0.3.0 \
+ function_name-proc-macro-0.3.0 \
+ fuser-0.13.0 \
+ futures-0.3.28 \
+ futures-channel-0.3.28 \
+ futures-core-0.3.28 \
+ futures-executor-0.3.28 \
+ futures-io-0.3.28 \
+ futures-macro-0.3.28 \
+ futures-sink-0.3.28 \
+ futures-task-0.3.28 \
+ futures-timer-3.0.2 \
+ futures-util-0.3.28 \
+ getrandom-0.2.10 \
+ glob-0.3.1 \
+ heck-0.4.1 \
+ is_terminal_polyfill-1.70.0 \
+ itertools-0.10.5 \
+ lazy_static-1.4.0 \
+ libc-0.2.155 \
+ linux-raw-sys-0.4.5 \
+ log-0.4.21 \
+ matchers-0.1.0 \
+ mdconfig-0.2.0 \
+ memchr-2.6.1 \
+ nix-0.27.1 \
+ nu-ansi-term-0.46.0 \
+ num-derive-0.4.2 \
+ num-traits-0.2.14 \
+ once_cell-1.18.0 \
+ overload-0.1.1 \
+ page_size-0.5.0 \
+ pin-project-lite-0.2.13 \
+ pin-utils-0.1.0 \
+ pkg-config-0.3.27 \
+ ppv-lite86-0.2.17 \
+ predicates-3.0.3 \
+ predicates-core-1.0.6 \
+ predicates-tree-1.0.9 \
+ proc-macro2-1.0.66 \
+ quote-1.0.33 \
+ rand-0.8.5 \
+ rand_chacha-0.3.1 \
+ rand_core-0.6.4 \
+ redox_syscall-0.3.5 \
+ regex-1.9.4 \
+ regex-automata-0.1.10 \
+ regex-automata-0.3.7 \
+ regex-syntax-0.6.29 \
+ regex-syntax-0.7.5 \
+ relative-path-1.9.3 \
+ rstest-0.19.0 \
+ rstest_macros-0.19.0 \
+ rstest_reuse-0.6.0 \
+ rustc_version-0.4.0 \
+ rustix-0.38.10 \
+ same-file-1.0.6 \
+ semver-1.0.18 \
+ serde-1.0.188 \
+ serde_derive-1.0.188 \
+ sharded-slab-0.1.4 \
+ slab-0.4.9 \
+ smallvec-1.8.0 \
+ strsim-0.10.0 \
+ syn-2.0.29 \
+ sysctl-0.5.5 \
+ tempfile-3.8.0 \
+ terminal_size-0.3.0 \
+ termtree-0.4.1 \
+ thiserror-1.0.48 \
+ thiserror-impl-1.0.48 \
+ thread_local-1.1.7 \
+ tracing-0.1.37 \
+ tracing-attributes-0.1.26 \
+ tracing-core-0.1.31 \
+ tracing-log-0.2.0 \
+ tracing-subscriber-0.3.18 \
+ unicode-ident-1.0.11 \
+ utf8parse-0.2.1 \
+ uuid-1.9.1 \
+ valuable-0.1.0 \
+ virtue-0.0.13 \
+ wait-timeout-0.2.0 \
+ walkdir-2.4.0 \
+ wasi-0.11.0+wasi-snapshot-preview1 \
+ winapi-0.3.9 \
+ winapi-i686-pc-windows-gnu-0.4.0 \
+ winapi-util-0.1.5 \
+ winapi-x86_64-pc-windows-gnu-0.4.0 \
+ windows-sys-0.48.0 \
+ windows-sys-0.52.0 \
+ windows-targets-0.48.5 \
+ windows-targets-0.52.5 \
+ windows_aarch64_gnullvm-0.48.5 \
+ windows_aarch64_gnullvm-0.52.5 \
+ windows_aarch64_msvc-0.48.5 \
+ windows_aarch64_msvc-0.52.5 \
+ windows_i686_gnu-0.48.5 \
+ windows_i686_gnu-0.52.5 \
+ windows_i686_gnullvm-0.52.5 \
+ windows_i686_msvc-0.48.5 \
+ windows_i686_msvc-0.52.5 \
+ windows_x86_64_gnu-0.48.5 \
+ windows_x86_64_gnu-0.52.5 \
+ windows_x86_64_gnullvm-0.48.5 \
+ windows_x86_64_gnullvm-0.52.5 \
+ windows_x86_64_msvc-0.48.5 \
+ windows_x86_64_msvc-0.52.5 \
+ xattr-1.0.1 \
+ zerocopy-0.6.6 \
+ zerocopy-derive-0.6.6
diff --git a/filesystems/xfuse/distinfo b/filesystems/xfuse/distinfo
new file mode 100644
index 000000000000..8f05c642335c
--- /dev/null
+++ b/filesystems/xfuse/distinfo
@@ -0,0 +1,287 @@
+TIMESTAMP = 1724178833
+SHA256 (rust/crates/xfs-fuse-0.4.4.crate) = 4a80e87f3b435d7ced5b399c65ecc6acf531bcc175ddc8a45da97480f1e859d6
+SIZE (rust/crates/xfs-fuse-0.4.4.crate) = 49565
+SHA256 (rust/crates/aho-corasick-1.0.5.crate) = 0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783
+SIZE (rust/crates/aho-corasick-1.0.5.crate) = 172064
+SHA256 (rust/crates/anstream-0.6.14.crate) = 418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b
+SIZE (rust/crates/anstream-0.6.14.crate) = 29160
+SHA256 (rust/crates/anstyle-1.0.2.crate) = 15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea
+SIZE (rust/crates/anstyle-1.0.2.crate) = 13983
+SHA256 (rust/crates/anstyle-parse-0.2.4.crate) = c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4
+SIZE (rust/crates/anstyle-parse-0.2.4.crate) = 23069
+SHA256 (rust/crates/anstyle-query-1.0.3.crate) = a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5
+SIZE (rust/crates/anstyle-query-1.0.3.crate) = 9742
+SHA256 (rust/crates/anstyle-wincon-3.0.3.crate) = 61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19
+SIZE (rust/crates/anstyle-wincon-3.0.3.crate) = 12179
+SHA256 (rust/crates/assert_cmd-2.0.11.crate) = 86d6b683edf8d1119fe420a94f8a7e389239666aa72e65495d91c00462510151
+SIZE (rust/crates/assert_cmd-2.0.11.crate) = 25346
+SHA256 (rust/crates/autocfg-1.1.0.crate) = d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa
+SIZE (rust/crates/autocfg-1.1.0.crate) = 13272
+SHA256 (rust/crates/bincode-2.0.0-rc.3.crate) = f11ea1a0346b94ef188834a65c068a03aec181c94896d481d7a0a40d85b0ce95
+SIZE (rust/crates/bincode-2.0.0-rc.3.crate) = 57746
+SHA256 (rust/crates/bincode_derive-2.0.0-rc.3.crate) = 7e30759b3b99a1b802a7a3aa21c85c3ded5c28e1c83170d82d70f08bbf7f3e4c
+SIZE (rust/crates/bincode_derive-2.0.0-rc.3.crate) = 6335
+SHA256 (rust/crates/bitflags-1.3.2.crate) = bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a
+SIZE (rust/crates/bitflags-1.3.2.crate) = 23021
+SHA256 (rust/crates/bitflags-2.4.0.crate) = b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635
+SIZE (rust/crates/bitflags-2.4.0.crate) = 36954
+SHA256 (rust/crates/bstr-1.6.2.crate) = 4c2f7349907b712260e64b0afe2f84692af14a454be26187d9df565c7f69266a
+SIZE (rust/crates/bstr-1.6.2.crate) = 380096
+SHA256 (rust/crates/byteorder-1.4.3.crate) = 14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610
+SIZE (rust/crates/byteorder-1.4.3.crate) = 22512
+SHA256 (rust/crates/cc-1.0.83.crate) = f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0
+SIZE (rust/crates/cc-1.0.83.crate) = 68343
+SHA256 (rust/crates/cfg-if-1.0.0.crate) = baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd
+SIZE (rust/crates/cfg-if-1.0.0.crate) = 7934
+SHA256 (rust/crates/clap-4.4.18.crate) = 1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c
+SIZE (rust/crates/clap-4.4.18.crate) = 55269
+SHA256 (rust/crates/clap_builder-4.4.18.crate) = 4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7
+SIZE (rust/crates/clap_builder-4.4.18.crate) = 163538
+SHA256 (rust/crates/clap_derive-4.4.7.crate) = cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442
+SIZE (rust/crates/clap_derive-4.4.7.crate) = 29046
+SHA256 (rust/crates/clap_lex-0.6.0.crate) = 702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1
+SIZE (rust/crates/clap_lex-0.6.0.crate) = 12272
+SHA256 (rust/crates/colorchoice-1.0.1.crate) = 0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422
+SIZE (rust/crates/colorchoice-1.0.1.crate) = 7895
+SHA256 (rust/crates/crc-2.1.0.crate) = 49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23
+SIZE (rust/crates/crc-2.1.0.crate) = 8683
+SHA256 (rust/crates/crc-catalog-1.1.1.crate) = ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403
+SIZE (rust/crates/crc-catalog-1.1.1.crate) = 8698
+SHA256 (rust/crates/difflib-0.4.0.crate) = 6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8
+SIZE (rust/crates/difflib-0.4.0.crate) = 7638
+SHA256 (rust/crates/doc-comment-0.3.3.crate) = fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10
+SIZE (rust/crates/doc-comment-0.3.3.crate) = 4123
+SHA256 (rust/crates/either-1.9.0.crate) = a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07
+SIZE (rust/crates/either-1.9.0.crate) = 16660
+SHA256 (rust/crates/enum-as-inner-0.6.0.crate) = 5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a
+SIZE (rust/crates/enum-as-inner-0.6.0.crate) = 12079
+SHA256 (rust/crates/enum_dispatch-0.3.12.crate) = 8f33313078bb8d4d05a2733a94ac4c2d8a0df9a2b84424ebf4f33bfc224a890e
+SIZE (rust/crates/enum_dispatch-0.3.12.crate) = 22400
+SHA256 (rust/crates/errno-0.3.3.crate) = 136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd
+SIZE (rust/crates/errno-0.3.3.crate) = 10543
+SHA256 (rust/crates/errno-dragonfly-0.1.2.crate) = aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf
+SIZE (rust/crates/errno-dragonfly-0.1.2.crate) = 1810
+SHA256 (rust/crates/fastrand-2.0.0.crate) = 6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764
+SIZE (rust/crates/fastrand-2.0.0.crate) = 14402
+SHA256 (rust/crates/function_name-0.3.0.crate) = b1ab577a896d09940b5fe12ec5ae71f9d8211fff62c919c03a3750a9901e98a7
+SIZE (rust/crates/function_name-0.3.0.crate) = 4017
+SHA256 (rust/crates/function_name-proc-macro-0.3.0.crate) = 673464e1e314dd67a0fd9544abc99e8eb28d0c7e3b69b033bcff9b2d00b87333
+SIZE (rust/crates/function_name-proc-macro-0.3.0.crate) = 2020
+SHA256 (rust/crates/fuser-0.13.0.crate) = 21370f84640642c8ea36dfb2a6bfc4c55941f476fcf431f6fef25a5ddcf0169b
+SIZE (rust/crates/fuser-0.13.0.crate) = 86991
+SHA256 (rust/crates/futures-0.3.28.crate) = 23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40
+SIZE (rust/crates/futures-0.3.28.crate) = 53229
+SHA256 (rust/crates/futures-channel-0.3.28.crate) = 955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2
+SIZE (rust/crates/futures-channel-0.3.28.crate) = 32281
+SHA256 (rust/crates/futures-core-0.3.28.crate) = 4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c
+SIZE (rust/crates/futures-core-0.3.28.crate) = 14780
+SHA256 (rust/crates/futures-executor-0.3.28.crate) = ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0
+SIZE (rust/crates/futures-executor-0.3.28.crate) = 17743
+SHA256 (rust/crates/futures-io-0.3.28.crate) = 4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964
+SIZE (rust/crates/futures-io-0.3.28.crate) = 8910
+SHA256 (rust/crates/futures-macro-0.3.28.crate) = 89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72
+SIZE (rust/crates/futures-macro-0.3.28.crate) = 11272
+SHA256 (rust/crates/futures-sink-0.3.28.crate) = f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e
+SIZE (rust/crates/futures-sink-0.3.28.crate) = 7852
+SHA256 (rust/crates/futures-task-0.3.28.crate) = 76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65
+SIZE (rust/crates/futures-task-0.3.28.crate) = 11848
+SHA256 (rust/crates/futures-timer-3.0.2.crate) = e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c
+SIZE (rust/crates/futures-timer-3.0.2.crate) = 19879
+SHA256 (rust/crates/futures-util-0.3.28.crate) = 26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533
+SIZE (rust/crates/futures-util-0.3.28.crate) = 158510
+SHA256 (rust/crates/getrandom-0.2.10.crate) = be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427
+SIZE (rust/crates/getrandom-0.2.10.crate) = 34955
+SHA256 (rust/crates/glob-0.3.1.crate) = d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b
+SIZE (rust/crates/glob-0.3.1.crate) = 18880
+SHA256 (rust/crates/heck-0.4.1.crate) = 95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8
+SIZE (rust/crates/heck-0.4.1.crate) = 11567
+SHA256 (rust/crates/is_terminal_polyfill-1.70.0.crate) = f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800
+SIZE (rust/crates/is_terminal_polyfill-1.70.0.crate) = 7451
+SHA256 (rust/crates/itertools-0.10.5.crate) = b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473
+SIZE (rust/crates/itertools-0.10.5.crate) = 115354
+SHA256 (rust/crates/lazy_static-1.4.0.crate) = e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646
+SIZE (rust/crates/lazy_static-1.4.0.crate) = 10443
+SHA256 (rust/crates/libc-0.2.155.crate) = 97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c
+SIZE (rust/crates/libc-0.2.155.crate) = 743539
+SHA256 (rust/crates/linux-raw-sys-0.4.5.crate) = 57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503
+SIZE (rust/crates/linux-raw-sys-0.4.5.crate) = 1274380
+SHA256 (rust/crates/log-0.4.21.crate) = 90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c
+SIZE (rust/crates/log-0.4.21.crate) = 43442
+SHA256 (rust/crates/matchers-0.1.0.crate) = 8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558
+SIZE (rust/crates/matchers-0.1.0.crate) = 6948
+SHA256 (rust/crates/mdconfig-0.2.0.crate) = cff02ee7b2a0815081bdc7c3dc00681c30577072db35787ea392aef8857fe34b
+SIZE (rust/crates/mdconfig-0.2.0.crate) = 11390
+SHA256 (rust/crates/memchr-2.6.1.crate) = f478948fd84d9f8e86967bf432640e46adfb5a4bd4f14ef7e864ab38220534ae
+SIZE (rust/crates/memchr-2.6.1.crate) = 93821
+SHA256 (rust/crates/nix-0.27.1.crate) = 2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053
+SIZE (rust/crates/nix-0.27.1.crate) = 286494
+SHA256 (rust/crates/nu-ansi-term-0.46.0.crate) = 77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84
+SIZE (rust/crates/nu-ansi-term-0.46.0.crate) = 24311
+SHA256 (rust/crates/num-derive-0.4.2.crate) = ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202
+SIZE (rust/crates/num-derive-0.4.2.crate) = 14709
+SHA256 (rust/crates/num-traits-0.2.14.crate) = 9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290
+SIZE (rust/crates/num-traits-0.2.14.crate) = 45476
+SHA256 (rust/crates/once_cell-1.18.0.crate) = dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d
+SIZE (rust/crates/once_cell-1.18.0.crate) = 32969
+SHA256 (rust/crates/overload-0.1.1.crate) = b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39
+SIZE (rust/crates/overload-0.1.1.crate) = 24439
+SHA256 (rust/crates/page_size-0.5.0.crate) = 1b7663cbd190cfd818d08efa8497f6cd383076688c49a391ef7c0d03cd12b561
+SIZE (rust/crates/page_size-0.5.0.crate) = 8346
+SHA256 (rust/crates/pin-project-lite-0.2.13.crate) = 8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58
+SIZE (rust/crates/pin-project-lite-0.2.13.crate) = 29141
+SHA256 (rust/crates/pin-utils-0.1.0.crate) = 8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184
+SIZE (rust/crates/pin-utils-0.1.0.crate) = 7580
+SHA256 (rust/crates/pkg-config-0.3.27.crate) = 26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964
+SIZE (rust/crates/pkg-config-0.3.27.crate) = 18838
+SHA256 (rust/crates/ppv-lite86-0.2.17.crate) = 5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de
+SIZE (rust/crates/ppv-lite86-0.2.17.crate) = 22242
+SHA256 (rust/crates/predicates-3.0.3.crate) = 09963355b9f467184c04017ced4a2ba2d75cbcb4e7462690d388233253d4b1a9
+SIZE (rust/crates/predicates-3.0.3.crate) = 22743
+SHA256 (rust/crates/predicates-core-1.0.6.crate) = b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174
+SIZE (rust/crates/predicates-core-1.0.6.crate) = 8084
+SHA256 (rust/crates/predicates-tree-1.0.9.crate) = 368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf
+SIZE (rust/crates/predicates-tree-1.0.9.crate) = 7960
+SHA256 (rust/crates/proc-macro2-1.0.66.crate) = 18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9
+SIZE (rust/crates/proc-macro2-1.0.66.crate) = 43575
+SHA256 (rust/crates/quote-1.0.33.crate) = 5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae
+SIZE (rust/crates/quote-1.0.33.crate) = 28090
+SHA256 (rust/crates/rand-0.8.5.crate) = 34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404
+SIZE (rust/crates/rand-0.8.5.crate) = 87113
+SHA256 (rust/crates/rand_chacha-0.3.1.crate) = e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88
+SIZE (rust/crates/rand_chacha-0.3.1.crate) = 15251
+SHA256 (rust/crates/rand_core-0.6.4.crate) = ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c
+SIZE (rust/crates/rand_core-0.6.4.crate) = 22666
+SHA256 (rust/crates/redox_syscall-0.3.5.crate) = 567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29
+SIZE (rust/crates/redox_syscall-0.3.5.crate) = 23404
+SHA256 (rust/crates/regex-1.9.4.crate) = 12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29
+SIZE (rust/crates/regex-1.9.4.crate) = 253112
+SHA256 (rust/crates/regex-automata-0.1.10.crate) = 6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132
+SIZE (rust/crates/regex-automata-0.1.10.crate) = 114533
+SHA256 (rust/crates/regex-automata-0.3.7.crate) = 49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629
+SIZE (rust/crates/regex-automata-0.3.7.crate) = 607421
+SHA256 (rust/crates/regex-syntax-0.6.29.crate) = f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1
+SIZE (rust/crates/regex-syntax-0.6.29.crate) = 299752
+SHA256 (rust/crates/regex-syntax-0.7.5.crate) = dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da
+SIZE (rust/crates/regex-syntax-0.7.5.crate) = 343366
+SHA256 (rust/crates/relative-path-1.9.3.crate) = ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2
+SIZE (rust/crates/relative-path-1.9.3.crate) = 22400
+SHA256 (rust/crates/rstest-0.19.0.crate) = 9d5316d2a1479eeef1ea21e7f9ddc67c191d497abc8fc3ba2467857abbb68330
+SIZE (rust/crates/rstest-0.19.0.crate) = 32932
+SHA256 (rust/crates/rstest_macros-0.19.0.crate) = 04a9df72cc1f67020b0d63ad9bfe4a323e459ea7eb68e03bd9824db49f9a4c25
+SIZE (rust/crates/rstest_macros-0.19.0.crate) = 61243
+SHA256 (rust/crates/rstest_reuse-0.6.0.crate) = 88530b681abe67924d42cca181d070e3ac20e0740569441a9e35a7cedd2b34a4
+SIZE (rust/crates/rstest_reuse-0.6.0.crate) = 9971
+SHA256 (rust/crates/rustc_version-0.4.0.crate) = bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366
+SIZE (rust/crates/rustc_version-0.4.0.crate) = 12175
+SHA256 (rust/crates/rustix-0.38.10.crate) = ed6248e1caa625eb708e266e06159f135e8c26f2bb7ceb72dc4b2766d0340964
+SIZE (rust/crates/rustix-0.38.10.crate) = 342427
+SHA256 (rust/crates/same-file-1.0.6.crate) = 93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502
+SIZE (rust/crates/same-file-1.0.6.crate) = 10183
+SHA256 (rust/crates/semver-1.0.18.crate) = b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918
+SIZE (rust/crates/semver-1.0.18.crate) = 29703
+SHA256 (rust/crates/serde-1.0.188.crate) = cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e
+SIZE (rust/crates/serde-1.0.188.crate) = 76230
+SHA256 (rust/crates/serde_derive-1.0.188.crate) = 4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2
+SIZE (rust/crates/serde_derive-1.0.188.crate) = 55563
+SHA256 (rust/crates/sharded-slab-0.1.4.crate) = 900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31
+SIZE (rust/crates/sharded-slab-0.1.4.crate) = 52479
+SHA256 (rust/crates/slab-0.4.9.crate) = 8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67
+SIZE (rust/crates/slab-0.4.9.crate) = 17108
+SHA256 (rust/crates/smallvec-1.8.0.crate) = f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83
+SIZE (rust/crates/smallvec-1.8.0.crate) = 27992
+SHA256 (rust/crates/strsim-0.10.0.crate) = 73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623
+SIZE (rust/crates/strsim-0.10.0.crate) = 11355
+SHA256 (rust/crates/syn-2.0.29.crate) = c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a
+SIZE (rust/crates/syn-2.0.29.crate) = 241664
+SHA256 (rust/crates/sysctl-0.5.5.crate) = ec7dddc5f0fee506baf8b9fdb989e242f17e4b11c61dfbb0635b705217199eea
+SIZE (rust/crates/sysctl-0.5.5.crate) = 18414
+SHA256 (rust/crates/tempfile-3.8.0.crate) = cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef
+SIZE (rust/crates/tempfile-3.8.0.crate) = 31720
+SHA256 (rust/crates/terminal_size-0.3.0.crate) = 21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7
+SIZE (rust/crates/terminal_size-0.3.0.crate) = 10096
+SHA256 (rust/crates/termtree-0.4.1.crate) = 3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76
+SIZE (rust/crates/termtree-0.4.1.crate) = 4557
+SHA256 (rust/crates/thiserror-1.0.48.crate) = 9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7
+SIZE (rust/crates/thiserror-1.0.48.crate) = 18862
+SHA256 (rust/crates/thiserror-impl-1.0.48.crate) = 49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35
+SIZE (rust/crates/thiserror-impl-1.0.48.crate) = 15096
+SHA256 (rust/crates/thread_local-1.1.7.crate) = 3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152
+SIZE (rust/crates/thread_local-1.1.7.crate) = 13585
+SHA256 (rust/crates/tracing-0.1.37.crate) = 8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8
+SIZE (rust/crates/tracing-0.1.37.crate) = 73888
+SHA256 (rust/crates/tracing-attributes-0.1.26.crate) = 5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab
+SIZE (rust/crates/tracing-attributes-0.1.26.crate) = 32060
+SHA256 (rust/crates/tracing-core-0.1.31.crate) = 0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a
+SIZE (rust/crates/tracing-core-0.1.31.crate) = 61263
+SHA256 (rust/crates/tracing-log-0.2.0.crate) = ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3
+SIZE (rust/crates/tracing-log-0.2.0.crate) = 17561
+SHA256 (rust/crates/tracing-subscriber-0.3.18.crate) = ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b
+SIZE (rust/crates/tracing-subscriber-0.3.18.crate) = 196312
+SHA256 (rust/crates/unicode-ident-1.0.11.crate) = 301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c
+SIZE (rust/crates/unicode-ident-1.0.11.crate) = 42067
+SHA256 (rust/crates/utf8parse-0.2.1.crate) = 711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a
+SIZE (rust/crates/utf8parse-0.2.1.crate) = 13435
+SHA256 (rust/crates/uuid-1.9.1.crate) = 5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439
+SIZE (rust/crates/uuid-1.9.1.crate) = 47492
+SHA256 (rust/crates/valuable-0.1.0.crate) = 830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d
+SIZE (rust/crates/valuable-0.1.0.crate) = 27718
+SHA256 (rust/crates/virtue-0.0.13.crate) = 9dcc60c0624df774c82a0ef104151231d37da4962957d691c011c852b2473314
+SIZE (rust/crates/virtue-0.0.13.crate) = 26483
+SHA256 (rust/crates/wait-timeout-0.2.0.crate) = 9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6
+SIZE (rust/crates/wait-timeout-0.2.0.crate) = 12441
+SHA256 (rust/crates/walkdir-2.4.0.crate) = d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee
+SIZE (rust/crates/walkdir-2.4.0.crate) = 23550
+SHA256 (rust/crates/wasi-0.11.0+wasi-snapshot-preview1.crate) = 9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423
+SIZE (rust/crates/wasi-0.11.0+wasi-snapshot-preview1.crate) = 28131
+SHA256 (rust/crates/winapi-0.3.9.crate) = 5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419
+SIZE (rust/crates/winapi-0.3.9.crate) = 1200382
+SHA256 (rust/crates/winapi-i686-pc-windows-gnu-0.4.0.crate) = ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6
+SIZE (rust/crates/winapi-i686-pc-windows-gnu-0.4.0.crate) = 2918815
+SHA256 (rust/crates/winapi-util-0.1.5.crate) = 70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178
+SIZE (rust/crates/winapi-util-0.1.5.crate) = 10164
+SHA256 (rust/crates/winapi-x86_64-pc-windows-gnu-0.4.0.crate) = 712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f
+SIZE (rust/crates/winapi-x86_64-pc-windows-gnu-0.4.0.crate) = 2947998
+SHA256 (rust/crates/windows-sys-0.48.0.crate) = 677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9
+SIZE (rust/crates/windows-sys-0.48.0.crate) = 2628884
+SHA256 (rust/crates/windows-sys-0.52.0.crate) = 282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d
+SIZE (rust/crates/windows-sys-0.52.0.crate) = 2576877
+SHA256 (rust/crates/windows-targets-0.48.5.crate) = 9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c
+SIZE (rust/crates/windows-targets-0.48.5.crate) = 6904
+SHA256 (rust/crates/windows-targets-0.52.5.crate) = 6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb
+SIZE (rust/crates/windows-targets-0.52.5.crate) = 6376
+SHA256 (rust/crates/windows_aarch64_gnullvm-0.48.5.crate) = 2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8
+SIZE (rust/crates/windows_aarch64_gnullvm-0.48.5.crate) = 418492
+SHA256 (rust/crates/windows_aarch64_gnullvm-0.52.5.crate) = 7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263
+SIZE (rust/crates/windows_aarch64_gnullvm-0.52.5.crate) = 433266
+SHA256 (rust/crates/windows_aarch64_msvc-0.48.5.crate) = dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc
+SIZE (rust/crates/windows_aarch64_msvc-0.48.5.crate) = 798483
+SHA256 (rust/crates/windows_aarch64_msvc-0.52.5.crate) = 9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6
+SIZE (rust/crates/windows_aarch64_msvc-0.52.5.crate) = 827944
+SHA256 (rust/crates/windows_i686_gnu-0.48.5.crate) = a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e
+SIZE (rust/crates/windows_i686_gnu-0.48.5.crate) = 844891
+SHA256 (rust/crates/windows_i686_gnu-0.52.5.crate) = 88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670
+SIZE (rust/crates/windows_i686_gnu-0.52.5.crate) = 875699
+SHA256 (rust/crates/windows_i686_gnullvm-0.52.5.crate) = 87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9
+SIZE (rust/crates/windows_i686_gnullvm-0.52.5.crate) = 473064
+SHA256 (rust/crates/windows_i686_msvc-0.48.5.crate) = 8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406
+SIZE (rust/crates/windows_i686_msvc-0.48.5.crate) = 864300
+SHA256 (rust/crates/windows_i686_msvc-0.52.5.crate) = db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf
+SIZE (rust/crates/windows_i686_msvc-0.52.5.crate) = 895404
+SHA256 (rust/crates/windows_x86_64_gnu-0.48.5.crate) = 53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e
+SIZE (rust/crates/windows_x86_64_gnu-0.48.5.crate) = 801619
+SHA256 (rust/crates/windows_x86_64_gnu-0.52.5.crate) = 4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9
+SIZE (rust/crates/windows_x86_64_gnu-0.52.5.crate) = 831539
+SHA256 (rust/crates/windows_x86_64_gnullvm-0.48.5.crate) = 0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc
+SIZE (rust/crates/windows_x86_64_gnullvm-0.48.5.crate) = 418486
+SHA256 (rust/crates/windows_x86_64_gnullvm-0.52.5.crate) = 852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596
+SIZE (rust/crates/windows_x86_64_gnullvm-0.52.5.crate) = 433246
+SHA256 (rust/crates/windows_x86_64_msvc-0.48.5.crate) = ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538
+SIZE (rust/crates/windows_x86_64_msvc-0.48.5.crate) = 798412
+SHA256 (rust/crates/windows_x86_64_msvc-0.52.5.crate) = bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0
+SIZE (rust/crates/windows_x86_64_msvc-0.52.5.crate) = 827905
+SHA256 (rust/crates/xattr-1.0.1.crate) = f4686009f71ff3e5c4dbcf1a282d0a44db3f021ba69350cd42086b3e5f1c6985
+SIZE (rust/crates/xattr-1.0.1.crate) = 12258
+SHA256 (rust/crates/zerocopy-0.6.6.crate) = 854e949ac82d619ee9a14c66a1b674ac730422372ccb759ce0c39cabcf2bf8e6
+SIZE (rust/crates/zerocopy-0.6.6.crate) = 47473
+SHA256 (rust/crates/zerocopy-derive-0.6.6.crate) = 125139de3f6b9d625c39e2efdd73d41bdac468ccd556556440e322be0e1bbd91
+SIZE (rust/crates/zerocopy-derive-0.6.6.crate) = 522443
diff --git a/filesystems/xfuse/pkg-descr b/filesystems/xfuse/pkg-descr
new file mode 100644
index 000000000000..cbbff2467b70
--- /dev/null
+++ b/filesystems/xfuse/pkg-descr
@@ -0,0 +1,11 @@
+This is read-only implementation of the XFS filesystem, a high-performance
+64-bit journaling file system created by Silicon Graphics, Inc (SGI) in 1993,
+and popular in various Linux distributions.
+
+While the implementation is in early stages, it should be useful enough for
+migration purposes.
+
+This project runs in userland through the use of the FUSE kernel module. This is
+the only run-time requirement.
+
+This project was done as part of Google Summer of Code 2021.
diff --git a/filesystems/zap/Makefile b/filesystems/zap/Makefile
new file mode 100644
index 000000000000..bb12e0484463
--- /dev/null
+++ b/filesystems/zap/Makefile
@@ -0,0 +1,33 @@
+PORTNAME= zap
+DISTVERSION= 0.8.3
+PORTREVISION= 1
+CATEGORIES= filesystems sysutils
+
+MAINTAINER= jrm@FreeBSD.org
+COMMENT= Maintain and replicate ZFS snapshots
+WWW= https://github.com/Jehops/zap
+
+LICENSE= BSD2CLAUSE
+
+USE_GITHUB= yes
+GH_ACCOUNT= Jehops
+
+NO_ARCH= yes
+NO_BUILD= yes
+
+USERS= ${PORTNAME}
+GROUPS= ${PORTNAME}
+
+PLIST_FILES= bin/${PORTNAME} \
+ share/man/man1/${PORTNAME}.1.gz
+PORTDOCS= README.org
+
+OPTIONS_DEFINE= DOCS
+
+do-install:
+ ${INSTALL_SCRIPT} ${WRKSRC}/${PORTNAME} ${STAGEDIR}${PREFIX}/bin
+ ${INSTALL_MAN} ${WRKSRC}/${PORTNAME}.1 ${STAGEDIR}${PREFIX}/share/man/man1
+ @${MKDIR} ${STAGEDIR}${DOCSDIR}
+ (cd ${WRKSRC} && ${INSTALL_DATA} ${PORTDOCS} ${STAGEDIR}${DOCSDIR})
+
+.include <bsd.port.mk>
diff --git a/filesystems/zap/distinfo b/filesystems/zap/distinfo
new file mode 100644
index 000000000000..2e0b3bc02b22
--- /dev/null
+++ b/filesystems/zap/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1627519959
+SHA256 (Jehops-zap-0.8.3_GH0.tar.gz) = 59a38f1c8e820cfda7426389265b104cc1a5d2bbfd454d729f8ec18718b05937
+SIZE (Jehops-zap-0.8.3_GH0.tar.gz) = 10876
diff --git a/filesystems/zap/pkg-descr b/filesystems/zap/pkg-descr
new file mode 100644
index 000000000000..eb2e26271169
--- /dev/null
+++ b/filesystems/zap/pkg-descr
@@ -0,0 +1,10 @@
+Maintain and replicate ZFS snapshots
+
+zap automates the management of zfs snapshots. With a few, simple
+crontab entries, it can be used to create a comprehensive zfs backup
+system. There are no configuration files. All parameters are supplied
+on the command line or in zfs properties and all snapshot information
+is stored in snapshot names.
+
+zap plays nice with manually created snapshots or snapshots from other
+tools. It will only operate on snapshots it creates.
diff --git a/filesystems/zap/pkg-message b/filesystems/zap/pkg-message
new file mode 100644
index 000000000000..c7a25a6452ce
--- /dev/null
+++ b/filesystems/zap/pkg-message
@@ -0,0 +1,11 @@
+[
+{ type: install
+ message: <<EOM
+See
+
+http://ftfl.ca/blog/2016-12-27-zfs-replication.html
+
+for a description of a replication strategy.
+EOM
+}
+]
diff --git a/filesystems/zfs-periodic/Makefile b/filesystems/zfs-periodic/Makefile
new file mode 100644
index 000000000000..33b3525a8c5b
--- /dev/null
+++ b/filesystems/zfs-periodic/Makefile
@@ -0,0 +1,43 @@
+PORTNAME= zfs-periodic
+PORTVERSION= 1.0.20130213
+CATEGORIES= filesystems sysutils
+
+MAINTAINER= peter@pean.org
+COMMENT= Simple way of maintaining zfs snapshots using the periodic system
+WWW= https://github.com/ross/zfs-periodic
+
+USE_GITHUB= yes
+GH_ACCOUNT= ross
+GH_TAGNAME= a481121
+
+NO_ARCH= yes
+NO_BUILD= yes
+
+PERIODIC_DIRS= etc/periodic/hourly etc/periodic/daily \
+ etc/periodic/weekly etc/periodic/monthly \
+ etc/periodic
+
+PERIODIC_FILES= etc/periodic/hourly/000.zfs-snapshot \
+ etc/periodic/daily/000.zfs-snapshot \
+ etc/periodic/weekly/000.zfs-snapshot \
+ etc/periodic/monthly/000.zfs-snapshot
+
+PLIST_FILES= ${PERIODIC_FILES} bin/zfs-snapshot
+
+post-patch:
+.for _file in ${PERIODIC_FILES}
+ @${REINPLACE_CMD} -e "s|/etc/periodic/zfs-snapshot|${PREFIX}/bin/zfs-snapshot|" \
+ ${WRKSRC}/${_file}
+.endfor
+
+do-install:
+ ${INSTALL_SCRIPT} ${WRKSRC}/etc/periodic/zfs-snapshot ${STAGEDIR}${PREFIX}/bin
+.for _dir in ${PERIODIC_DIRS}
+ @${MKDIR} ${STAGEDIR}${PREFIX}/${_dir}
+.endfor
+
+.for _file in ${PERIODIC_FILES}
+ ${INSTALL_SCRIPT} ${WRKSRC}/${_file} ${STAGEDIR}${PREFIX}/${_file}
+.endfor
+
+.include <bsd.port.mk>
diff --git a/filesystems/zfs-periodic/distinfo b/filesystems/zfs-periodic/distinfo
new file mode 100644
index 000000000000..6dc4d093226b
--- /dev/null
+++ b/filesystems/zfs-periodic/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905184
+SHA256 (ross-zfs-periodic-1.0.20130213-a481121_GH0.tar.gz) = e0d12bb3ff466e3aaabd09c2b9685b5e5ee5f91e0d62126c05ba33c60a7b9a9b
+SIZE (ross-zfs-periodic-1.0.20130213-a481121_GH0.tar.gz) = 2527
diff --git a/filesystems/zfs-periodic/pkg-descr b/filesystems/zfs-periodic/pkg-descr
new file mode 100644
index 000000000000..29e40518d2ff
--- /dev/null
+++ b/filesystems/zfs-periodic/pkg-descr
@@ -0,0 +1,2 @@
+Scripts that uses the periodic system to create and manage zfs
+snapshots. Easily configured via /etc/periodic.conf
diff --git a/filesystems/zfs-periodic/pkg-message b/filesystems/zfs-periodic/pkg-message
new file mode 100644
index 000000000000..010d2e7d1ce1
--- /dev/null
+++ b/filesystems/zfs-periodic/pkg-message
@@ -0,0 +1,30 @@
+[
+{ type: install
+ message: <<EOM
+In order to enable periodic snapshots you need
+to add these lines to your /etc/periodic.conf
+
+hourly_output="root"
+hourly_show_success="NO"
+hourly_show_info="YES"
+hourly_show_badconfig="NO"
+hourly_zfs_snapshot_enable="YES"
+hourly_zfs_snapshot_pools="tank"
+hourly_zfs_snapshot_keep=6
+daily_zfs_snapshot_enable="YES"
+daily_zfs_snapshot_pools="tank"
+daily_zfs_snapshot_keep=7
+weekly_zfs_snapshot_enable="YES"
+weekly_zfs_snapshot_pools="tank"
+weekly_zfs_snapshot_keep=5
+monthly_zfs_snapshot_enable="YES"
+monthly_zfs_snapshot_pools="tank"
+monthly_zfs_snapshot_keep=2
+
+To get hourly snapshots you also need to add
+something like this to /etc/crontab:
+
+2 * * * * root periodic hourly
+EOM
+}
+]
diff --git a/filesystems/zfs-replicate/Makefile b/filesystems/zfs-replicate/Makefile
new file mode 100644
index 000000000000..cf5805523867
--- /dev/null
+++ b/filesystems/zfs-replicate/Makefile
@@ -0,0 +1,43 @@
+PORTNAME= zfs-replicate
+PORTVERSION= 2.0.2
+DISTVERSIONPREFIX= v
+CATEGORIES= filesystems sysutils
+
+MAINTAINER= tschetter.victor@gmail.com
+COMMENT= ZFS Snapshot Replication Script
+WWW= https://github.com/aaronhurt/zfs-replicate
+
+USES= shebangfix
+
+NO_BUILD= yes
+NO_ARCH= yes
+
+OPTIONS_DEFINE= DOCS EXAMPLES
+
+SHEBANG_FILES= zfs-replicate.sh
+
+PORTDOCS= README.md
+PORTDATA= config.sample.sh
+
+USE_GITHUB= yes
+GH_ACCOUNT= aaronhurt
+
+PLIST_FILES= sbin/zfs-replicate
+
+do-install:
+ ${INSTALL_SCRIPT} ${WRKSRC}/zfs-replicate.sh \
+ ${STAGEDIR}${PREFIX}/sbin/zfs-replicate
+
+do-install-DOCS-on:
+ @${MKDIR} ${STAGEDIR}${DOCSDIR}
+.for file in ${PORTDOCS}
+ ${INSTALL_DATA} ${WRKSRC}/${file} ${STAGEDIR}${DOCSDIR}
+.endfor
+
+do-install-EXAMPLES-on:
+ @${MKDIR} ${STAGEDIR}${DATADIR}
+.for data in ${PORTDATA}
+ ${INSTALL_DATA} ${WRKSRC}/${data} ${STAGEDIR}${DATADIR}
+.endfor
+
+.include <bsd.port.mk>
diff --git a/filesystems/zfs-replicate/distinfo b/filesystems/zfs-replicate/distinfo
new file mode 100644
index 000000000000..d5712e4d42a4
--- /dev/null
+++ b/filesystems/zfs-replicate/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1725286224
+SHA256 (aaronhurt-zfs-replicate-v2.0.2_GH0.tar.gz) = a1db4fef430033c780d1616514ef4b8f71ed17c8a02347a565d3af67863683b6
+SIZE (aaronhurt-zfs-replicate-v2.0.2_GH0.tar.gz) = 12678
diff --git a/filesystems/zfs-replicate/pkg-descr b/filesystems/zfs-replicate/pkg-descr
new file mode 100644
index 000000000000..e711cf2aa663
--- /dev/null
+++ b/filesystems/zfs-replicate/pkg-descr
@@ -0,0 +1,2 @@
+Advanced ZFS replication script to replicate zfs datasets/volumes between hosts
+(or between pools on the same host) via incremental snapshots.
diff --git a/filesystems/zfs-replicate/pkg-message b/filesystems/zfs-replicate/pkg-message
new file mode 100644
index 000000000000..385ffcd0e03a
--- /dev/null
+++ b/filesystems/zfs-replicate/pkg-message
@@ -0,0 +1,15 @@
+[
+{ type: install
+ message: <<EOM
+To run zfs-replicate, copy /usr/local/share/zfs-replicate/config.sample.sh to
+/usr/local/share/zfs-replicate/config.sh, customize to your environment, and
+run using "zfs-replicate -c /usr/local/share/zfs-replicate/config.sh"
+
+The only option that does not have a default, and needs to be set is the REPLICATE_SETS
+
+To check last log, run "zfs-replicate -c /usr/local/share/zfs-replicate/config.sh -s"
+
+See https://github.com/aaronhurt/zfs-replicate for documentation.
+EOM
+}
+]
diff --git a/filesystems/zfs-snap-diff/Makefile b/filesystems/zfs-snap-diff/Makefile
new file mode 100644
index 000000000000..f0a2268c0c79
--- /dev/null
+++ b/filesystems/zfs-snap-diff/Makefile
@@ -0,0 +1,27 @@
+PORTNAME= zfs-snap-diff
+PORTVERSION= 1.1.3
+DISTVERSIONPREFIX= v
+PORTREVISION= 22
+CATEGORIES= filesystems sysutils
+
+MAINTAINER= ports@FreeBSD.org
+COMMENT= View ZFS snapshot differences via a web browser
+WWW= https://github.com/j-keck/zfs-snap-diff
+
+LICENSE= MIT
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+USES= go:modules
+USE_GITHUB= yes
+GH_ACCOUNT= j-keck
+GH_TUPLE= BurntSushi:toml:v0.3.1:burntsushi_toml/vendor/github.com/BurntSushi/toml \
+ j-keck:go-diff:v1.0.0:j_keck_go_diff/vendor/github.com/j-keck/go-diff \
+ j-keck:plog:v0.7.0:j_keck_plog/vendor/github.com/j-keck/plog
+
+PLIST_FILES= bin/zfs-snap-diff
+
+GO_BUILDFLAGS= -ldflags="-X main.version=${DISTVERSIONPREFIX}${PORTVERSION}"
+
+GO_TARGET= ./cmd/zfs-snap-diff
+
+.include <bsd.port.mk>
diff --git a/filesystems/zfs-snap-diff/distinfo b/filesystems/zfs-snap-diff/distinfo
new file mode 100644
index 000000000000..d8811a1f5672
--- /dev/null
+++ b/filesystems/zfs-snap-diff/distinfo
@@ -0,0 +1,9 @@
+TIMESTAMP = 1630838434
+SHA256 (j-keck-zfs-snap-diff-v1.1.3_GH0.tar.gz) = 06febe95bb37463435d7d33acba51f7619c32837d13df996a8f4a11b1e4274ed
+SIZE (j-keck-zfs-snap-diff-v1.1.3_GH0.tar.gz) = 7179727
+SHA256 (BurntSushi-toml-v0.3.1_GH0.tar.gz) = 6593da894578ba510a470735ffbdc88ce88033094dc5a8f4d3957ab87e18803f
+SIZE (BurntSushi-toml-v0.3.1_GH0.tar.gz) = 42077
+SHA256 (j-keck-go-diff-v1.0.0_GH0.tar.gz) = 5a07596dcdee6e089b49309162c8e63bc02400652897a1f529d37f0602868dea
+SIZE (j-keck-go-diff-v1.0.0_GH0.tar.gz) = 41609
+SHA256 (j-keck-plog-v0.7.0_GH0.tar.gz) = 251c06cdf08dd8a9a03cab0028a64cda8893ef092474be2a49016b3a8280384f
+SIZE (j-keck-plog-v0.7.0_GH0.tar.gz) = 11649
diff --git a/filesystems/zfs-snap-diff/pkg-descr b/filesystems/zfs-snap-diff/pkg-descr
new file mode 100644
index 000000000000..cf148fee69aa
--- /dev/null
+++ b/filesystems/zfs-snap-diff/pkg-descr
@@ -0,0 +1,6 @@
+With zfs-snap-diff you can explore file differences and restore changes from
+older file versions in different zfs snapshots. You can restore the whole file
+from an older version, or select single changes to revert in the 'diff' view.
+
+zfs-snap-diff has a web frontend, so it can run on your local work machine or
+on your remote file / backup server (no Xserver necessary).
diff --git a/filesystems/zfs-snapshot-clean/Makefile b/filesystems/zfs-snapshot-clean/Makefile
new file mode 100644
index 000000000000..b275df946eb6
--- /dev/null
+++ b/filesystems/zfs-snapshot-clean/Makefile
@@ -0,0 +1,21 @@
+PORTNAME= zfs-snapshot-clean
+PORTVERSION= 0.2.0
+DISTVERSIONPREFIX= v
+CATEGORIES= filesystems sysutils
+
+MAINTAINER= ports@FreeBSD.org
+COMMENT= Tool to sieve ZFS snapshots as per given spec a la 'pdumpfs-clean'
+WWW= https://github.com/knu/zfs-snapshot-clean
+
+LICENSE= BSD2CLAUSE
+
+USE_GITHUB= yes
+GH_ACCOUNT= knu
+
+NO_BUILD= yes
+PLIST_FILES= sbin/${PORTNAME}
+
+do-install:
+ ${INSTALL_SCRIPT} ${WRKSRC}/${PORTNAME} ${STAGEDIR}${PREFIX}/sbin/
+
+.include <bsd.port.mk>
diff --git a/filesystems/zfs-snapshot-clean/distinfo b/filesystems/zfs-snapshot-clean/distinfo
new file mode 100644
index 000000000000..b2cbb033a9fa
--- /dev/null
+++ b/filesystems/zfs-snapshot-clean/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905189
+SHA256 (knu-zfs-snapshot-clean-v0.2.0_GH0.tar.gz) = a6cc354df2b245309293e40d29a98a5245e07357ff918f2f75be55eb8b5d78fa
+SIZE (knu-zfs-snapshot-clean-v0.2.0_GH0.tar.gz) = 2962
diff --git a/filesystems/zfs-snapshot-clean/pkg-descr b/filesystems/zfs-snapshot-clean/pkg-descr
new file mode 100644
index 000000000000..b2633bdb9cff
--- /dev/null
+++ b/filesystems/zfs-snapshot-clean/pkg-descr
@@ -0,0 +1,13 @@
+zfs-snapshot-clean
+------------------
+
+This is a tool to sieve ZFS snapshots as per given spec a la
+`pdumpfs-clean'.
+
+Typical usage is as follows:
+
+ for vol in zpool/home zpool/var; do
+ zfs snapshot "$vol@$(date +%Y-%m-%d)" && zfs-snapshot-clean "$vol"
+ done
+
+Run `zfs-snapshot-clean -h' for details.
diff --git a/filesystems/zfs-snapshot-mgmt/Makefile b/filesystems/zfs-snapshot-mgmt/Makefile
new file mode 100644
index 000000000000..b54509bfd61a
--- /dev/null
+++ b/filesystems/zfs-snapshot-mgmt/Makefile
@@ -0,0 +1,28 @@
+PORTNAME= zfs-snapshot-mgmt
+PORTVERSION= 20090201
+PORTREVISION= 4
+CATEGORIES= filesystems sysutils
+MASTER_SITES= http://marcin.studio4plus.com/files/
+
+MAINTAINER= johntdarrah@gmail.com
+COMMENT= Automatic ZFS snapshot management tool
+WWW= http://marcin.studio4plus.com/en/zfs-file-history/howto.html
+
+USES= ruby:run shebangfix
+SHEBANG_FILES= zfs-snapshot-mgmt
+
+NO_BUILD= yes
+NO_ARCH= yes
+
+SUB_FILES= pkg-message
+
+post-patch: .SILENT
+ ${FIND} ${WRKSRC} -type f -exec ${REINPLACE_CMD} \
+ -e 's|/usr/local|${PREFIX}|g' {} +
+
+do-install:
+ ${INSTALL_SCRIPT} ${WRKSRC}/${PORTNAME} ${STAGEDIR}${PREFIX}/bin
+ ${INSTALL_MAN} ${WRKSRC}/${PORTNAME}.8 ${STAGEDIR}${PREFIX}/share/man/man8
+ ${INSTALL_DATA} ${WRKSRC}/${PORTNAME}.conf.sample ${STAGEDIR}${PREFIX}/etc
+
+.include <bsd.port.mk>
diff --git a/filesystems/zfs-snapshot-mgmt/distinfo b/filesystems/zfs-snapshot-mgmt/distinfo
new file mode 100644
index 000000000000..f7206ebb56ac
--- /dev/null
+++ b/filesystems/zfs-snapshot-mgmt/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905184
+SHA256 (zfs-snapshot-mgmt-20090201.tar.gz) = 972f6eb51cc08dd2ab83491cb8942e310a9838f953edb7471df462446b59a8c4
+SIZE (zfs-snapshot-mgmt-20090201.tar.gz) = 4903
diff --git a/filesystems/zfs-snapshot-mgmt/files/patch-zfs-snapshot-mgmt b/filesystems/zfs-snapshot-mgmt/files/patch-zfs-snapshot-mgmt
new file mode 100644
index 000000000000..382543b79b93
--- /dev/null
+++ b/filesystems/zfs-snapshot-mgmt/files/patch-zfs-snapshot-mgmt
@@ -0,0 +1,32 @@
+--- zfs-snapshot-mgmt~
++++ zfs-snapshot-mgmt
+@@ -154,7 +154,11 @@ class FSInfo
+ end
+
+ def pool
++ if name["/"]
+ name[/\A.*?\//].chop
++ else
++ name
++ end
+ end
+
+ private
+@@ -175,7 +179,7 @@ private
+
+ end
+
+-class Config
++class ZConfig
+ attr_reader :snapshot_prefix, :filesystems, :pools
+
+ def initialize(value)
+@@ -194,7 +198,7 @@ class Config
+
+ config_yaml = File.open(CONFIG_FILE_NAME).read(CONFIG_SIZE_MAX)
+ die "Config file too long" if config_yaml.nil?
+-config = Config.new(YAML::load(config_yaml))
++config = ZConfig.new(YAML::load(config_yaml))
+
+ now_minutes = Time.now.to_i / 60
+
diff --git a/filesystems/zfs-snapshot-mgmt/files/pkg-message.in b/filesystems/zfs-snapshot-mgmt/files/pkg-message.in
new file mode 100644
index 000000000000..8b9ac6273efe
--- /dev/null
+++ b/filesystems/zfs-snapshot-mgmt/files/pkg-message.in
@@ -0,0 +1,19 @@
+[
+{ type: install
+ message: <<EOM
+To actually turn on the automatic snapshots you have to do the following:
+
+1. Add an appropriate crontab entry, e.g.:
+
+ echo "*/5 * * * * root %%PREFIX%%/bin/zfs-snapshot-mgmt" >> /etc/crontab
+
+See zfs-snapshot-mgmt(8) manpage for more details.
+EOM
+},
+{ type: remove
+ message: <<EOM
+Remember to remove zfs-snapshot-mgmt entry from cron configuration.
+Otherwise the system will be constantly trying to call the deinstalled script.
+EOM
+}
+]
diff --git a/filesystems/zfs-snapshot-mgmt/pkg-descr b/filesystems/zfs-snapshot-mgmt/pkg-descr
new file mode 100644
index 000000000000..81fff38ffbd5
--- /dev/null
+++ b/filesystems/zfs-snapshot-mgmt/pkg-descr
@@ -0,0 +1 @@
+A simple ruby script for automating creation and removal of ZFS snapshots.
diff --git a/filesystems/zfs-snapshot-mgmt/pkg-plist b/filesystems/zfs-snapshot-mgmt/pkg-plist
new file mode 100644
index 000000000000..5ce124a03a6c
--- /dev/null
+++ b/filesystems/zfs-snapshot-mgmt/pkg-plist
@@ -0,0 +1,3 @@
+bin/zfs-snapshot-mgmt
+@sample etc/zfs-snapshot-mgmt.conf.sample
+share/man/man8/zfs-snapshot-mgmt.8.gz
diff --git a/filesystems/zfs-stats-lite/Makefile b/filesystems/zfs-stats-lite/Makefile
new file mode 100644
index 000000000000..b60914e31921
--- /dev/null
+++ b/filesystems/zfs-stats-lite/Makefile
@@ -0,0 +1,22 @@
+PORTNAME= zfs-stats-lite
+PORTVERSION= 1.4
+CATEGORIES= filesystems sysutils
+MASTER_SITES= http://druidbsd.sourceforge.net/download/
+
+MAINTAINER= ports@FreeBSD.org
+COMMENT= Display human-readable ZFS statistics
+WWW= https://druidbsd.sourceforge.net/download.shtml #zfs-stats-lite
+
+LICENSE= BSD2CLAUSE
+
+CONFLICTS_INSTALL= zfs-stats
+
+NO_BUILD= yes
+NO_ARCH= yes
+
+PLIST_FILES= bin/zfs-stats
+
+do-install:
+ ${INSTALL_SCRIPT} ${WRKSRC}/zfs-stats ${STAGEDIR}${PREFIX}/bin/zfs-stats
+
+.include <bsd.port.mk>
diff --git a/filesystems/zfs-stats-lite/distinfo b/filesystems/zfs-stats-lite/distinfo
new file mode 100644
index 000000000000..d7f18ce72cc1
--- /dev/null
+++ b/filesystems/zfs-stats-lite/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905185
+SHA256 (zfs-stats-lite-1.4.tar.gz) = bb09a299fe24eb062eda4ca65b7931ce11c523a0b3aa0a72021108609a3b3b10
+SIZE (zfs-stats-lite-1.4.tar.gz) = 8241
diff --git a/filesystems/zfs-stats-lite/pkg-descr b/filesystems/zfs-stats-lite/pkg-descr
new file mode 100644
index 000000000000..3407c2d67b0f
--- /dev/null
+++ b/filesystems/zfs-stats-lite/pkg-descr
@@ -0,0 +1,5 @@
+zfs-stats displays ZFS statistics in human-readable format including
+ARC, L2ARC, zfetch (DMU) and vdev cache statistics.
+
+This script is a fork of filesystems/zfs-stats which has no dependency on perl or
+other ports.
diff --git a/filesystems/zfs-stats/Makefile b/filesystems/zfs-stats/Makefile
new file mode 100644
index 000000000000..41a1aff92ef0
--- /dev/null
+++ b/filesystems/zfs-stats/Makefile
@@ -0,0 +1,24 @@
+PORTNAME= zfs-stats
+DISTVERSION= 1.3.2
+CATEGORIES= filesystems sysutils
+
+MAINTAINER= mm@FreeBSD.org
+COMMENT= Displays general ZFS information and human-readable statistics
+WWW= https://github.com/mmatuska/zfs-stats
+
+LICENSE= BSD2CLAUSE
+
+USES= perl5
+USE_GITHUB= yes
+GH_ACCOUNT= mmatuska
+
+NO_BUILD= yes
+
+PLIST_FILES= bin/zfs-mon \
+ bin/zfs-stats
+
+do-install:
+ ${INSTALL_SCRIPT} ${WRKSRC}/zfs-stats ${STAGEDIR}${PREFIX}/bin/zfs-stats
+ ${INSTALL_SCRIPT} ${WRKSRC}/zfs-mon ${STAGEDIR}${PREFIX}/bin/zfs-mon
+
+.include <bsd.port.mk>
diff --git a/filesystems/zfs-stats/distinfo b/filesystems/zfs-stats/distinfo
new file mode 100644
index 000000000000..3856c2623bc4
--- /dev/null
+++ b/filesystems/zfs-stats/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1694551891
+SHA256 (mmatuska-zfs-stats-1.3.2_GH0.tar.gz) = 2c94742fcb0caeb508110031b05783557ba5b4938bacec052a1294fac3fc2afe
+SIZE (mmatuska-zfs-stats-1.3.2_GH0.tar.gz) = 10950
diff --git a/filesystems/zfs-stats/pkg-descr b/filesystems/zfs-stats/pkg-descr
new file mode 100644
index 000000000000..3cd64d8cc2f4
--- /dev/null
+++ b/filesystems/zfs-stats/pkg-descr
@@ -0,0 +1,8 @@
+ZFS statistics tool for FreeBSD.
+
+The zfs-stats script displays general ZFS information and
+human-readable statistics for the following subsystems:
+ * ARC
+ * L2ARC
+ * DMU (zfetch)
+ * vdev cache
diff --git a/filesystems/zfsnap/Makefile b/filesystems/zfsnap/Makefile
new file mode 100644
index 000000000000..65385b1144fc
--- /dev/null
+++ b/filesystems/zfsnap/Makefile
@@ -0,0 +1,37 @@
+PORTNAME= zfsnap
+PORTVERSION= 1.11.1
+DISTVERSIONPREFIX= v
+PORTREVISION= 1
+CATEGORIES= filesystems sysutils
+
+MAINTAINER= yamagi@yamagi.org
+COMMENT= Simple sh script to make zfs rolling snaphosts with cron
+WWW= https://github.com/zfsnap/zfsnap
+
+LICENSE= BSD3CLAUSE
+
+NO_BUILD= yes
+USE_GITHUB= yes
+
+PERIODICDIR?= ${PREFIX}/etc/periodic
+PLIST_SUB+= PERIODICDIR="${PERIODICDIR:S,^${PREFIX}/,,}"
+
+post-extract:
+.for period in hourly daily weekly monthly reboot
+ @${SED} -e "s/xPERIODICx/${period}/g" -e "s#xPREFIXx#${PREFIX}/sbin#g" ${WRKSRC}/xPERIODICx_zfSnap.sh > ${WRKSRC}/${period}_zfSnap.sh
+.endfor
+.for period in hourly daily weekly monthly
+ @${SED} -e "s/xPERIODICx/${period}/g" -e "s#xPREFIXx#${PREFIX}/sbin#g" ${WRKSRC}/xPERIODICx_zfSnap_delete.sh > ${WRKSRC}/${period}_zfSnap_delete.sh
+.endfor
+
+do-install:
+ ${INSTALL_SCRIPT} ${WRKSRC}/zfSnap.sh ${STAGEDIR}${PREFIX}/sbin/zfSnap
+.for period in hourly daily weekly monthly
+ @${MKDIR} ${STAGEDIR}${PERIODICDIR}/${period}
+ ${INSTALL_SCRIPT} ${WRKSRC}/${period}_zfSnap.sh ${STAGEDIR}${PERIODICDIR}/${period}/402.zfSnap
+ ${INSTALL_SCRIPT} ${WRKSRC}/${period}_zfSnap_delete.sh ${STAGEDIR}${PERIODICDIR}/${period}/403.zfSnap_delete
+.endfor
+ @${MKDIR} ${STAGEDIR}${PERIODICDIR}/reboot
+ ${INSTALL_SCRIPT} ${WRKSRC}/reboot_zfSnap.sh ${STAGEDIR}${PERIODICDIR}/reboot/402.zfSnap
+
+.include <bsd.port.mk>
diff --git a/filesystems/zfsnap/distinfo b/filesystems/zfsnap/distinfo
new file mode 100644
index 000000000000..195e29ee0742
--- /dev/null
+++ b/filesystems/zfsnap/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905205
+SHA256 (zfsnap-zfsnap-v1.11.1_GH0.tar.gz) = dd533d5faff9fa98deeb9ae0909784b67b0dc43d3870f259eeb390fbc1d03bcf
+SIZE (zfsnap-zfsnap-v1.11.1_GH0.tar.gz) = 4969
diff --git a/filesystems/zfsnap/files/patch-zfSnap.sh b/filesystems/zfsnap/files/patch-zfSnap.sh
new file mode 100644
index 000000000000..1cdd609dd8b3
--- /dev/null
+++ b/filesystems/zfsnap/files/patch-zfSnap.sh
@@ -0,0 +1,11 @@
+--- zfSnap.sh.orig 2013-01-18 03:37:09.000000000 +0700
++++ zfSnap.sh 2018-01-22 23:20:20.257104000 +0700
+@@ -199,6 +199,8 @@ rm_zfs_snapshot() {
+ }
+
+ skip_pool() {
++ local i
++
+ # more like skip pool???
+ if is_true $scrub_skip; then
+ for i in $scrub_pools; do
diff --git a/filesystems/zfsnap/pkg-descr b/filesystems/zfsnap/pkg-descr
new file mode 100644
index 000000000000..16d0cef6da58
--- /dev/null
+++ b/filesystems/zfsnap/pkg-descr
@@ -0,0 +1,8 @@
+zfSnap is a simple sh script for creating ZFS snapshots. When called from
+cron rolling snapshots can be created and deleted automatically. The main
+advantage of zfSnap is that it is written in 100% pure /bin/sh, does not
+require any additional software to run, and is simple to use.
+
+zfSnap keeps all information about snapshot in snapshot name. zfs snapshot
+names are in form: Timestamp--TTL where timestamp is date and time of
+snapshot creation and TTL is Time To Live in human readable form.
diff --git a/filesystems/zfsnap/pkg-message b/filesystems/zfsnap/pkg-message
new file mode 100644
index 000000000000..927cda7debfd
--- /dev/null
+++ b/filesystems/zfsnap/pkg-message
@@ -0,0 +1,55 @@
+[
+{ type: install
+ message: <<EOM
+ To run zfSnap periodically you can add these options to your
+ /etc/periodic.conf
+
+ xPERIODICx_zfsnap_enable - Enable xPERIODICx snapshots
+ (values: YES | NO)
+ xPERIODICx_zfsnap_fs - Space separated zfs filesystems
+ to create non-recursive snapshots
+ xPERIODICx_zfsnap_recursive_fs - Space separated zfs filesystems
+ to create recursive snapshots
+ xPERIODICx_zfsnap_ttl - Set Time To Live
+ xPERIODICx_zfsnap_verbose - Verbose output (values: YES | NO)
+ xPERIODICx_zfsnap_flags - zfSnap generic flags
+ (except -v and -d)
+ xPERIODICx_zfsnap_enable_prefix - Create snapshots with prefix
+ (Default = YES)
+ xPERIODICx_zfsnap_prefix - Set prefix to use for new snapshots
+ (Default = "xPERIODICx-")
+ (where xPERIODICx is any of hourly, daily, weekly, monthly, reboot)
+
+ xPERIODICx_zfsnap_delete_enable - Delete old snapshots periodically
+ (values: YES | NO)
+ xPERIODICx_zfsnap_delete_flags - zfSnap generic flags
+ (except -v and -d)
+ xPERIODICx_zfsnap_delete_verbose - Verbose output (values: YES | NO)
+ xPERIODICx_zfsnap_delete_prefixes - Space separated list of prefixes
+ of old zfSnap snapshots to delete
+ 'hourly-', 'daily-', 'weekly-',
+ 'monthly-' and 'reboot-' prefixes
+ are hard-coded
+ (where xPERIODICx is any of daily, weekly, monthly)
+
+
+ Add these lines to your /etc/crontab
+ 4 * * * * root periodic hourly
+ @reboot root periodic reboot
+
+ NOTE: it is not recommended to delete zfSnap snapshots every hour.
+ Deleting zfs snapshots takes more time than creating them.
+ There for it's better to delete snapshots once per day...
+
+
+ Periodic scripts provide very limited feature set. If you want to use
+ more advanced setup, you need to call zfSnap from crontab directly.
+ This way you can combine all sort of parameter combinations.
+
+ Don't forget to check https://github.com/graudeejs/zfSnap/wiki for more
+ info.
+
+ Feedback welcomed: graudeejs@gmail.com
+EOM
+}
+]
diff --git a/filesystems/zfsnap/pkg-plist b/filesystems/zfsnap/pkg-plist
new file mode 100644
index 000000000000..048f85a2e8f1
--- /dev/null
+++ b/filesystems/zfsnap/pkg-plist
@@ -0,0 +1,10 @@
+sbin/zfSnap
+%%PERIODICDIR%%/daily/402.zfSnap
+%%PERIODICDIR%%/daily/403.zfSnap_delete
+%%PERIODICDIR%%/hourly/402.zfSnap
+%%PERIODICDIR%%/hourly/403.zfSnap_delete
+%%PERIODICDIR%%/monthly/402.zfSnap
+%%PERIODICDIR%%/monthly/403.zfSnap_delete
+%%PERIODICDIR%%/reboot/402.zfSnap
+%%PERIODICDIR%%/weekly/402.zfSnap
+%%PERIODICDIR%%/weekly/403.zfSnap_delete
diff --git a/filesystems/zfsnap2/Makefile b/filesystems/zfsnap2/Makefile
new file mode 100644
index 000000000000..559ad86aef7b
--- /dev/null
+++ b/filesystems/zfsnap2/Makefile
@@ -0,0 +1,56 @@
+PORTNAME= zfsnap
+DISTVERSIONPREFIX= v
+DISTVERSION= 2.0.0-beta3
+PORTREVISION= 4
+CATEGORIES= filesystems sysutils
+PKGNAMESUFFIX= 2
+
+MAINTAINER= mm@FreeBSD.org
+COMMENT= Portable performant script to make rolling ZFS snapshots easy
+WWW= https://github.com/zfsnap/zfsnap
+
+LICENSE= BSD3CLAUSE
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+NO_BUILD= yes
+USE_GITHUB= yes
+
+OPTIONS_DEFINE= BASH ZSH DOCS
+OPTIONS_DEFAULT= BASH ZSH
+OPTIONS_SUB= yes
+
+PORTDOCS= AUTHORS NEWS PORTABILITY README.md
+
+PERIODICDIR?= ${PREFIX}/etc/periodic
+
+post-patch:
+ @${REINPLACE_CMD} -e "s,# ZFSNAP_LIB_DIR=.*,ZFSNAP_LIB_DIR=${PREFIX}/share/zfsnap,g" ${WRKSRC}/sbin/zfsnap.sh
+.for period in daily weekly monthly
+ @${SED} -e "s/xPERIODICx/${period}/g" -e "s#xPREFIXx#${PREFIX}/sbin#g" ${WRKSRC}/periodic/xPERIODICx_zfsnap.sh > ${WRKSRC}/periodic/${period}_zfsnap.sh
+.endfor
+
+do-install:
+ ${INSTALL_SCRIPT} ${WRKSRC}/sbin/zfsnap.sh ${STAGEDIR}${PREFIX}/sbin/zfsnap
+ cd ${WRKSRC}/share && ${COPYTREE_SHARE} zfsnap ${STAGEDIR}${PREFIX}/share/
+ cd ${WRKSRC} && ${COPYTREE_SHARE} completion ${STAGEDIR}${PREFIX}/share/zfsnap
+.for period in daily weekly monthly
+ @${MKDIR} ${STAGEDIR}${PERIODICDIR}/${period}
+ ${INSTALL_SCRIPT} ${WRKSRC}/periodic/${period}_zfsnap.sh ${STAGEDIR}${PERIODICDIR}/${period}/402.zfsnap
+.endfor
+ ${INSTALL_MAN} ${WRKSRC}/man/man8/zfsnap.8 ${STAGEDIR}${PREFIX}/share/man/man8/zfsnap.8
+ ${MKDIR} ${STAGEDIR}${DOCSDIR}
+.for file in ${PORTDOCS}
+ ${INSTALL_DATA} ${WRKSRC}/${file} ${STAGEDIR}${DOCSDIR}/${file}
+.endfor
+
+post-install-BASH-on:
+ ${MKDIR} ${STAGEDIR}${PREFIX}/etc/bash_completion.d
+ ${LN} -s ../../share/zfsnap/completion/zfsnap-completion.bash \
+ ${STAGEDIR}${PREFIX}/etc/bash_completion.d/zfsnap.sh
+
+post-install-ZSH-on:
+ ${MKDIR} ${STAGEDIR}${PREFIX}/share/zsh/site-functions
+ ${LN} -s ../../zfsnap/completion/zfsnap-completion.zsh \
+ ${STAGEDIR}${PREFIX}/share/zsh/site-functions/_zfsnap
+
+.include <bsd.port.mk>
diff --git a/filesystems/zfsnap2/distinfo b/filesystems/zfsnap2/distinfo
new file mode 100644
index 000000000000..944dc6c3b08e
--- /dev/null
+++ b/filesystems/zfsnap2/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1478466865
+SHA256 (zfsnap-zfsnap-v2.0.0-beta3_GH0.tar.gz) = d73be34b58d94b89010e2be6fc3d34bdc34b9675aaa2bebfe446dffb683e45d3
+SIZE (zfsnap-zfsnap-v2.0.0-beta3_GH0.tar.gz) = 29973
diff --git a/filesystems/zfsnap2/files/patch-periodic_xPERIODICx__zfsnap.sh b/filesystems/zfsnap2/files/patch-periodic_xPERIODICx__zfsnap.sh
new file mode 100644
index 000000000000..3b8bf6daee22
--- /dev/null
+++ b/filesystems/zfsnap2/files/patch-periodic_xPERIODICx__zfsnap.sh
@@ -0,0 +1,48 @@
+--- periodic/xPERIODICx_zfsnap.sh.orig 2020-07-28 02:17:05 UTC
++++ periodic/xPERIODICx_zfsnap.sh
+@@ -11,23 +11,29 @@ fi
+
+ # xPERIODICx_zfsnap_enable - Enable xPERIODICx snapshots (values: YES | NO)
+ # xPERIODICx_zfsnap_flags - `zfsnap snapshot` flags
+-# xPERIODICx_zfsnap_fs - Space-separated ZFS filesystems to create non-recursive snapshots
+-# xPERIODICx_zfsnap_recursive_fs - Space-separated ZFS filesystems to create recursive snapshots
++# xPERIODICx_zfsnap_delete_flags - `zfsnap destroy` flags
++# xPERIODICx_zfsnap_fs - Space-separated ZFS filesystems to manage non-recursive snapshots
++# xPERIODICx_zfsnap_recursive_fs - Space-separated ZFS filesystems to manage recursive snapshots
+ # xPERIODICx_zfsnap_ttl - Explicit TTL value
+ # xPERIODICx_zfsnap_verbose - Verbose output (values: YES | NO)
+ # xPERIODICx_zfsnap_enable_prefix - Create snapshots with prefix (values: YES | NO) (Default = YES)
+ # xPERIODICx_zfsnap_prefix - set prefix for snapshots (Default = xPERIODICx)
++# xPERIODICx_zfsnap_delete_prefixes - Space-separated list of prefixes of expired zfsnap snapshots to delete
+
+ case "${xPERIODICx_zfsnap_enable-"NO"}" in
+ [Yy][Ee][Ss])
+- OPTIONS="$xPERIODICx_zfsnap_flags"
++ CREATE_OPTIONS="$xPERIODICx_zfsnap_flags"
++ DESTROY_OPTIONS="$xPERIODICx_zfsnap_delete_flags"
+
+ case "${xPERIODICx_zfsnap_verbose-"NO"}" in
+- [Yy][Ee][Ss]) OPTIONS="$OPTIONS -v" ;;
++ [Yy][Ee][Ss])
++ CREATE_OPTIONS="$CREATE_OPTIONS -v"
++ DESTROY_OPTIONS="$DESTROY_OPTIONS -v"
++ ;;
+ esac
+
+ case "${xPERIODICx_zfsnap_enable_prefix-"YES"}" in
+- [Yy][Ee][Ss]) OPTIONS="$OPTIONS -p ${xPERIODICx_zfsnap_prefix:-"xPERIODICx-"}" ;;
++ [Yy][Ee][Ss]) CREATE_OPTIONS="$CREATE_OPTIONS -p ${xPERIODICx_zfsnap_prefix:-"xPERIODICx-"}" ;;
+ esac
+
+ case 'xPERIODICx' in
+@@ -49,7 +55,9 @@ case "${xPERIODICx_zfsnap_enable-"NO"}" in
+ ;;
+ esac
+
+- xPREFIXx/zfsnap snapshot $OPTIONS -a ${xPERIODICx_zfsnap_ttl:-"$default_ttl"} $xPERIODICx_zfsnap_fs -r $xPERIODICx_zfsnap_recursive_fs
++ # Destroy before create, just in case the pool is out of space
++ xPREFIXx/zfsnap destroy $DESTROY_OPTIONS -p "hourly- daily- weekly- monthly- reboot- $xPERIODICx_zfsnap_delete_prefixes" $xPERIODICx_zfsnap_fs -r $xPERIODICx_zfsnap_recursive_fs && \
++ xPREFIXx/zfsnap snapshot $CREATE_OPTIONS -a ${xPERIODICx_zfsnap_ttl:-"$default_ttl"} $xPERIODICx_zfsnap_fs -r $xPERIODICx_zfsnap_recursive_fs
+ exit $?
+ ;;
+
diff --git a/filesystems/zfsnap2/pkg-descr b/filesystems/zfsnap2/pkg-descr
new file mode 100644
index 000000000000..e5aa55629cad
--- /dev/null
+++ b/filesystems/zfsnap2/pkg-descr
@@ -0,0 +1,16 @@
+zfsnap makes rolling ZFS snapshots easy and - with cron - automatic.
+
+The main advantages of zfsnap are its portability, simplicity, and performance.
+It is written purely in /bin/sh and does not require any additional software -
+other than a few core *nix utilies.
+
+zfsnap stores all the information it needs about a snapshot directly in its
+name; no database or special ZFS properties are needed. The information is
+stored in a way that is human readable, making it much easier for a sysadmin to
+manage and audit backup schedules.
+
+Snapshot names are in the format of pool/fs@[prefix]Timestamp--TimeToLive
+(e.g. pool/fs@weekly-2014-04-07_05.30.00--6m). The prefix is optional but can
+be quite useful for filtering, Timestamp is the date and time when the snapshot
+was created, and TimeToLive (TTL) is the amount of time the snapshot will be
+kept until it can be deleted.
diff --git a/filesystems/zfsnap2/pkg-plist b/filesystems/zfsnap2/pkg-plist
new file mode 100644
index 000000000000..865f12042d3e
--- /dev/null
+++ b/filesystems/zfsnap2/pkg-plist
@@ -0,0 +1,14 @@
+%%BASH%%etc/bash_completion.d/zfsnap.sh
+etc/periodic/daily/402.zfsnap
+etc/periodic/monthly/402.zfsnap
+etc/periodic/weekly/402.zfsnap
+share/man/man8/zfsnap.8.gz
+sbin/zfsnap
+%%DATADIR%%/commands/destroy.sh
+%%DATADIR%%/commands/recurseback.sh
+%%DATADIR%%/commands/snapshot.sh
+%%DATADIR%%/completion/zfsnap-completion.bash
+%%DATADIR%%/completion/zfsnap-completion.tcsh
+%%DATADIR%%/completion/zfsnap-completion.zsh
+%%DATADIR%%/core.sh
+%%ZSH%%share/zsh/site-functions/_zfsnap
diff --git a/filesystems/zfstools/Makefile b/filesystems/zfstools/Makefile
new file mode 100644
index 000000000000..53d733ceddb3
--- /dev/null
+++ b/filesystems/zfstools/Makefile
@@ -0,0 +1,36 @@
+PORTNAME= zfstools
+DISTVERSIONPREFIX=v
+DISTVERSION= 0.3.6
+PORTREVISION= 2
+CATEGORIES= filesystems sysutils ruby
+MASTER_SITES= GH \
+ http://mirror.shatow.net/freebsd/${PORTNAME}/
+
+MAINTAINER= bdrewery@FreeBSD.org
+COMMENT= OpenSolaris-compatible auto snapshotting for ZFS
+WWW= https://github.com/bdrewery/zfstools
+
+LICENSE= BSD2CLAUSE
+LICENSE_FILE= ${WRKSRC}/LICENSE.txt
+
+USES= ruby shebangfix
+SHEBANG_FILES= bin/*
+
+USE_GITHUB= yes
+GH_ACCOUNT= bdrewery
+
+NO_BUILD= yes
+
+SUB_FILES= pkg-message
+
+OPTIONS_DEFINE= DOCS
+
+.include <bsd.port.options.mk>
+
+do-install:
+ @cd ${WRKSRC}/bin && ${COPYTREE_BIN} . ${STAGEDIR}${PREFIX}/sbin
+ @cd ${WRKSRC}/lib && ${COPYTREE_SHARE} . ${STAGEDIR}${RUBY_SITELIBDIR}
+ @${MKDIR} ${STAGEDIR}${DOCSDIR}
+ ${INSTALL_DATA} ${WRKSRC}/README.md ${STAGEDIR}${DOCSDIR}
+
+.include <bsd.port.mk>
diff --git a/filesystems/zfstools/distinfo b/filesystems/zfstools/distinfo
new file mode 100644
index 000000000000..3975d23051b6
--- /dev/null
+++ b/filesystems/zfstools/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905190
+SHA256 (bdrewery-zfstools-v0.3.6_GH0.tar.gz) = 060112d89f11e95415f07cdbc05fef29a6a1bc5046046c56d37f16b1232fb2cf
+SIZE (bdrewery-zfstools-v0.3.6_GH0.tar.gz) = 12323
diff --git a/filesystems/zfstools/files/pkg-message.in b/filesystems/zfstools/files/pkg-message.in
new file mode 100644
index 000000000000..6df0d4d832a2
--- /dev/null
+++ b/filesystems/zfstools/files/pkg-message.in
@@ -0,0 +1,32 @@
+[
+{ type: install
+ message: <<EOM
+To enable automatic snapshots, place lines such as these into /etc/crontab:
+
+ PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
+ 15,30,45 * * * * root %%PREFIX%%/sbin/zfs-auto-snapshot frequent 4
+ 0 * * * * root %%PREFIX%%/sbin/zfs-auto-snapshot hourly 24
+ 7 0 * * * root %%PREFIX%%/sbin/zfs-auto-snapshot daily 7
+ 14 0 * * 7 root %%PREFIX%%/sbin/zfs-auto-snapshot weekly 4
+ 28 0 1 * * root %%PREFIX%%/sbin/zfs-auto-snapshot monthly 12
+
+This will keep 4 15-minutely snapshots, 24 hourly snapshots, 7 daily snapshots,
+4 weekly snapshots and 12 monthly snapshots. Any resulting zero-sized snapshots
+will be automatically cleaned up.
+
+Enable snapshotting on a dataset or top-level pool with:
+
+ zfs set com.sun:auto-snapshot=true DATASET
+
+Children datasets can be disabled for snapshot with:
+
+ zfs set com.sun:auto-snapshot=false DATASET
+
+Or for specific intervals:
+
+ zfs set com.sun:auto-snapshot:frequent=false DATASET
+
+See website and command usage output for further details.
+EOM
+}
+]
diff --git a/filesystems/zfstools/pkg-descr b/filesystems/zfstools/pkg-descr
new file mode 100644
index 000000000000..3fbffa57a0df
--- /dev/null
+++ b/filesystems/zfstools/pkg-descr
@@ -0,0 +1,2 @@
+ZFSTools is an OpenSolaris-like and compatible auto snapshotting
+script, which also supports auto snapshotting mysql databases.
diff --git a/filesystems/zfstools/pkg-plist b/filesystems/zfstools/pkg-plist
new file mode 100644
index 000000000000..1dc611682ff4
--- /dev/null
+++ b/filesystems/zfstools/pkg-plist
@@ -0,0 +1,9 @@
+%%PORTDOCS%%%%DOCSDIR%%/README.md
+%%RUBY_SITELIBDIR%%/zfstools.rb
+%%RUBY_SITELIBDIR%%/zfstools/dataset.rb
+%%RUBY_SITELIBDIR%%/zfstools/features.rb
+%%RUBY_SITELIBDIR%%/zfstools/pool.rb
+%%RUBY_SITELIBDIR%%/zfstools/snapshot.rb
+sbin/zfs-auto-snapshot
+sbin/zfs-cleanup-snapshots
+sbin/zfs-snapshot-mysql
diff --git a/filesystems/zip/Makefile b/filesystems/zip/Makefile
new file mode 100644
index 000000000000..ed3d6a2bd0a4
--- /dev/null
+++ b/filesystems/zip/Makefile
@@ -0,0 +1,34 @@
+PORTNAME= fuse-zip
+PORTVERSION= 0.4.4
+PORTREVISION= 2
+CATEGORIES= filesystems sysutils
+MASTER_SITES= https://bitbucket.org/agalanin/fuse-zip/downloads/
+
+MAINTAINER= ports@FreeBSD.org
+COMMENT= FUSE filesystem to mount ZIP archives with write support
+WWW= https://bitbucket.org/agalanin/fuse-zip/
+
+LICENSE= LGPL3
+
+LIB_DEPENDS= libzip.so:archivers/libzip
+BUILD_DEPENDS= libzip>=0.11.1:archivers/libzip
+
+USES= gmake fuse pkgconfig
+
+PLIST_FILES= bin/${PORTNAME} share/man/man1/${PORTNAME}.1.gz
+PORTDOCS= README.md changelog
+
+OPTIONS_DEFINE= DOCS
+
+post-patch:
+ @${REINPLACE_CMD} -e 's|make|$${MAKE}|' ${WRKSRC}/Makefile
+
+do-install:
+ ${INSTALL_PROGRAM} ${WRKSRC}/${PORTNAME} ${STAGEDIR}${PREFIX}/bin
+ ${INSTALL_MAN} ${WRKSRC}/${PORTNAME}.1 ${STAGEDIR}${PREFIX}/share/man/man1
+
+do-install-DOCS-on:
+ @${MKDIR} ${STAGEDIR}${DOCSDIR}
+ ${INSTALL_DATA} ${PORTDOCS:S|^|${WRKSRC}/|} ${STAGEDIR}${DOCSDIR}
+
+.include <bsd.port.mk>
diff --git a/filesystems/zip/distinfo b/filesystems/zip/distinfo
new file mode 100644
index 000000000000..7d75d75162d5
--- /dev/null
+++ b/filesystems/zip/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1515487547
+SHA256 (fuse-zip-0.4.4.tar.gz) = c464a63ca7cc16eef7c14036fe09823ca9d96a0ef530e274845044a5440e47d2
+SIZE (fuse-zip-0.4.4.tar.gz) = 687132
diff --git a/filesystems/zip/pkg-descr b/filesystems/zip/pkg-descr
new file mode 100644
index 000000000000..d2d8b2a7d5c0
--- /dev/null
+++ b/filesystems/zip/pkg-descr
@@ -0,0 +1,4 @@
+fuse-zip is a FUSE file system to navigate, extract, create and modify ZIP
+archives based on libzip, implemented in C++. With fuse-zip, you can work
+with ZIP archives as real directories. Unlike KIO or Gnome VFS, it can be
+be used in any application without modifications.
diff --git a/filesystems/zisofs-tools/Makefile b/filesystems/zisofs-tools/Makefile
new file mode 100644
index 000000000000..bc5292711ea7
--- /dev/null
+++ b/filesystems/zisofs-tools/Makefile
@@ -0,0 +1,30 @@
+PORTNAME= zisofs-tools
+PORTVERSION= 1.0.8
+PORTREVISION= 2
+CATEGORIES= filesystems sysutils
+MASTER_SITES= KERNEL_ORG/linux/utils/fs/zisofs
+
+MAINTAINER= chip-set@mail.ru
+COMMENT= User utilities for zisofs
+
+PORTDOCS= CHANGES COPYING INSTALL MRULES README
+
+USES= gmake tar:bzip2 desthack
+GNU_CONFIGURE= yes
+
+MAKE_ARGS+= CFLAGS="${CFLAGS} -I${LOCALBASE}/include"
+
+PLIST_FILES= bin/mkzftree \
+ share/man/man1/mkzftree.1.gz
+
+OPTIONS_DEFINE= LFS DOCS
+OPTIONS_DEFAULT= LFS
+LFS_DESC= Enable Large Files Support
+
+LFS_CONFIGURE_ENABLE= largefile
+
+post-install:
+ @${MKDIR} ${STAGEDIR}${DOCSDIR}
+ ${INSTALL_DATA} ${PORTDOCS:S,^,${WRKSRC}/,} ${STAGEDIR}${DOCSDIR}/
+
+.include <bsd.port.mk>
diff --git a/filesystems/zisofs-tools/distinfo b/filesystems/zisofs-tools/distinfo
new file mode 100644
index 000000000000..55f66cc351ea
--- /dev/null
+++ b/filesystems/zisofs-tools/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1730905167
+SHA256 (zisofs-tools-1.0.8.tar.bz2) = ae4e53e4914934d41660248fb59d3c8761f1f1fd180d5ec993c17ddb3afd04f3
+SIZE (zisofs-tools-1.0.8.tar.bz2) = 52968
diff --git a/filesystems/zisofs-tools/files/patch-compress.c b/filesystems/zisofs-tools/files/patch-compress.c
new file mode 100644
index 000000000000..3606d9f3be0e
--- /dev/null
+++ b/filesystems/zisofs-tools/files/patch-compress.c
@@ -0,0 +1,11 @@
+--- compress.c.old 2008-01-17 17:19:55.000000000 -0200
++++ compress.c 2008-01-17 17:20:09.000000000 -0200
+@@ -15,7 +15,7 @@
+
+ #include <stdlib.h>
+ #include <stdio.h>
+-#include <utime.h>
++#include <time.h>
+ #include <unistd.h>
+ #include <zlib.h>
+
diff --git a/filesystems/zisofs-tools/pkg-descr b/filesystems/zisofs-tools/pkg-descr
new file mode 100644
index 000000000000..e834f8f04a46
--- /dev/null
+++ b/filesystems/zisofs-tools/pkg-descr
@@ -0,0 +1,6 @@
+The zisofs filesystem is an extension to the ISO9660 filesystem that allows
+files, on a file-by-file basis, to be stored compressed and decompressed in
+real time. The zisofs filesystem is supported by recent versions of Linux
+(2.4.14 or later).
+
+mkzftree - creates a zisofs/RockRidge compressed file tree
diff --git a/filesystems/zrepl-dsh2dsh/Makefile b/filesystems/zrepl-dsh2dsh/Makefile
new file mode 100644
index 000000000000..8ce302dfd1c2
--- /dev/null
+++ b/filesystems/zrepl-dsh2dsh/Makefile
@@ -0,0 +1,61 @@
+PORTNAME= zrepl
+DISTVERSIONPREFIX= v
+DISTVERSION= 0.8.9
+CATEGORIES= filesystems sysutils
+PKGNAMESUFFIX= -dsh2dsh
+
+MAINTAINER= dsh@bamus.cz
+COMMENT= ZFS dataset replication tool (fork with more features)
+WWW= https://github.com/dsh2dsh/${PORTNAME}
+
+LICENSE= MIT
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+USES= go:1.23,modules ncurses
+
+GO_MODULE= github.com/dsh2dsh/${PORTNAME}
+GO_BUILDFLAGS= -ldflags "${STRIP} -w -X github.com/dsh2dsh/${PORTNAME}/internal/version.${PORTNAME}Version=${DISTVERSIONFULL}"
+
+CONFLICTS_INSTALL= ${PORTNAME}
+
+SUB_FILES= pkg-message
+
+OPTIONS_DEFINE= EXAMPLES
+
+post-patch:
+ @${REINPLACE_CMD} \
+ -e 's|/usr/local/etc/${PORTNAME}|${ETCDIR}|g' \
+ -e 's|/usr/local|${PREFIX}|g' \
+ ${WRKSRC}/dist/freebsd/etc/periodic/daily/${PORTNAME} \
+ ${WRKSRC}/dist/freebsd/etc/periodic/weekly/500.${PORTNAME} \
+ ${WRKSRC}/dist/freebsd/etc/rc.d/${PORTNAME}
+
+post-install:
+ ${MKDIR} ${STAGEDIR}${ETCDIR} \
+ ${STAGEDIR}${EXAMPLESDIR} \
+ ${STAGEDIR}${PREFIX}/etc/newsyslog.conf.d \
+ ${STAGEDIR}${PREFIX}/etc/periodic/daily \
+ ${STAGEDIR}${PREFIX}/etc/periodic/weekly
+ ${INSTALL_SCRIPT} ${WRKSRC}/dist/freebsd/etc/rc.d/${PORTNAME} \
+ ${STAGEDIR}${PREFIX}/etc/rc.d
+ ${INSTALL_DATA} \
+ ${WRKSRC}/dist/freebsd/etc/newsyslog.conf.d/${PORTNAME}.conf \
+ ${STAGEDIR}${EXAMPLESDIR}/newsyslog.conf
+ ${INSTALL_DATA} ${WRKSRC}/dist/freebsd/etc/${PORTNAME}/${PORTNAME}.yml \
+ ${STAGEDIR}${ETCDIR}/${PORTNAME}.yml.sample
+ ${INSTALL_SCRIPT} \
+ ${WRKSRC}/dist/freebsd/etc/periodic/daily/${PORTNAME} \
+ ${STAGEDIR}${PREFIX}/etc/periodic/daily/${PORTNAME}
+ ${INSTALL_SCRIPT} \
+ ${WRKSRC}/dist/freebsd/etc/periodic/weekly/500.${PORTNAME} \
+ ${STAGEDIR}${PREFIX}/etc/periodic/weekly/500.${PORTNAME}
+
+post-install-EXAMPLES-on:
+ ${MKDIR} ${STAGEDIR}${EXAMPLESDIR}/hooks
+ (cd ${WRKSRC}/internal/config/samples && \
+ ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR})
+ ${INSTALL_DATA} \
+ ${WRKSRC}/dist/grafana/grafana-prometheus-${PORTNAME}.json \
+ ${STAGEDIR}${EXAMPLESDIR}
+
+.include <bsd.port.mk>
diff --git a/filesystems/zrepl-dsh2dsh/distinfo b/filesystems/zrepl-dsh2dsh/distinfo
new file mode 100644
index 000000000000..6f28a3b3592c
--- /dev/null
+++ b/filesystems/zrepl-dsh2dsh/distinfo
@@ -0,0 +1,5 @@
+TIMESTAMP = 1729520199
+SHA256 (go/sysutils_zrepl-dsh2dsh/zrepl-v0.8.9/v0.8.9.mod) = b1328a874b06ec042040304ef051aed69ba12d870b69789e77f3db456cf99946
+SIZE (go/sysutils_zrepl-dsh2dsh/zrepl-v0.8.9/v0.8.9.mod) = 3490
+SHA256 (go/sysutils_zrepl-dsh2dsh/zrepl-v0.8.9/v0.8.9.zip) = f0dbf0e40feb60e811dc46505eb9df0de82afe3b354c0d0d44945fcfb0dc49c8
+SIZE (go/sysutils_zrepl-dsh2dsh/zrepl-v0.8.9/v0.8.9.zip) = 600710
diff --git a/filesystems/zrepl-dsh2dsh/files/pkg-message.in b/filesystems/zrepl-dsh2dsh/files/pkg-message.in
new file mode 100644
index 000000000000..288cad6b2a1e
--- /dev/null
+++ b/filesystems/zrepl-dsh2dsh/files/pkg-message.in
@@ -0,0 +1,43 @@
+[
+{ type: install
+ message: <<EOM
+Messages from filesystems/zrepl-dsh2dsh:
+
+SETUP BEFORE FIRST USE:
+- Create the log file /var/log/zrepl.log:
+ # service newsyslog restart
+- Modify the %%PREFIX%%/etc/zrepl/zrepl.yml configuration file
+- Create ZFS datasets like:
+ # zfs create -o mountpoint=none -o readonly=on zdisk/zrepl
+ # zfs create zdisk/zrepl/localhost
+- Enable the zrepl daemon to start automatically at boot:
+ # sysrc zrepl_enable="YES"
+- Start the zrepl daemon:
+ # service zrepl start
+
+Documentation: https://github.com/dsh2dsh/zrepl?tab=readme-ov-file#changes-from-upstream
+ https://zrepl.github.io/
+Changelog: https://zrepl.github.io/master/changelog.html
+
+DANGER - SNAPSHOT PRUNING REQUIRES EXPLICIT KEEP RULES:
+For any ZFS snapshot that you want to keep, at least one rule must match.
+This also applies to snapshots taken by means other than zrepl
+(e.g. snapshots taken manually or via boot environment tools).
+
+For monitoring zrepl daemon health and snapshots add this line to
+/etc/periodic.conf:
+
+ daily_zrepl_enable="YES"
+
+In order to automatically warn the operator of impending certificate
+expiration, add this line to /etc/periodic.conf:
+
+ weekly_zrepl_enable="YES"
+
+More config details in the zrepl periodic script:
+
+ %%LOCALBASE%%/etc/periodic/weekly/500.zrepl
+
+EOM
+}
+]
diff --git a/filesystems/zrepl-dsh2dsh/pkg-descr b/filesystems/zrepl-dsh2dsh/pkg-descr
new file mode 100644
index 000000000000..2a89cb5c62d7
--- /dev/null
+++ b/filesystems/zrepl-dsh2dsh/pkg-descr
@@ -0,0 +1,19 @@
+Cross-platform ZFS replication tool written in Go that supports feature
+detection, bookmarks, and other new features.
+
+This is a fork with more features like
+
+ * support of shell patterns for datasets definitions
+ * new log formatters
+ * ability to log into a file
+ * ability to configure command piplines between `zfs send` and `zfs recv`
+ * Icinga/Nagios checks
+ * fast skip "keep all" pruning
+ * snapshots named using local time in timestamps
+ * configurable RPC timeout
+ * configurable path to zfs binary
+ * faster replication
+ * graceful shutdown
+ * redesigned `zrepl status` TUI
+
+and so on.
diff --git a/filesystems/zrepl-dsh2dsh/pkg-plist b/filesystems/zrepl-dsh2dsh/pkg-plist
new file mode 100644
index 000000000000..3e2aac89ae3b
--- /dev/null
+++ b/filesystems/zrepl-dsh2dsh/pkg-plist
@@ -0,0 +1,24 @@
+bin/zrepl
+etc/periodic/daily/zrepl
+etc/periodic/weekly/500.zrepl
+etc/rc.d/zrepl
+@sample %%ETCDIR%%/zrepl.yml.sample
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/bandwidth_limit.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/grafana-prometheus-zrepl.json
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/hooks/template.sh
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/local.yml
+@sample %%EXAMPLESDIR%%/newsyslog.conf etc/newsyslog.conf.d/zrepl.conf
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/pull.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/pull_ssh.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/push.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/quickstart_backup_to_external_disk.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/quickstart_continuous_server_backup_receiver.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/quickstart_continuous_server_backup_sender.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/quickstart_fan_out_replication_source.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/quickstart_fan_out_replication_target.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/sink.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/snap.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/snap_cron.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/source.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/source_ssh.yml
+@dir etc/newsyslog.conf.d
diff --git a/filesystems/zrepl/Makefile b/filesystems/zrepl/Makefile
new file mode 100644
index 000000000000..fccb602a1809
--- /dev/null
+++ b/filesystems/zrepl/Makefile
@@ -0,0 +1,61 @@
+PORTNAME= zrepl
+DISTVERSIONPREFIX= v
+DISTVERSION= 0.6.1
+PORTREVISION= 9
+CATEGORIES= filesystems sysutils
+
+MAINTAINER= driesm@FreeBSD.org
+COMMENT= ZFS dataset replication tool
+WWW= https://zrepl.github.io/
+
+LICENSE= MIT
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+USES= go:modules ncurses
+USE_RC_SUBR= zrepl
+USE_GITHUB= nodefault
+GH_TUPLE= golang:sys:v0.6.0:sys
+
+GO_MODULE= github.com/${PORTNAME}/${PORTNAME}
+GO_BUILDFLAGS= -ldflags "\
+ ${STRIP} -w\
+ -X ${GO_MODULE}/version.${PORTNAME}Version=${DISTVERSIONFULL}"
+
+SUB_FILES= pkg-message 500.zrepl
+
+OPTIONS_DEFINE= EXAMPLES MANPAGES
+OPTIONS_DEFAULT= MANPAGES
+
+MANPAGES_BUILD_DEPENDS= sphinx-multiversion:textproc/py-sphinx-multiversion-zrepl@${PY_FLAVOR}
+MANPAGES_USES= gmake python:build
+MANPAGES_PLIST_FILES= share/man/man1/zrepl.1.gz
+
+pre-patch:
+ ${RM} -r ${WRKSRC}/vendor/golang.org/x/sys
+ ${LN} -s ${WRKDIR}/sys-* ${WRKSRC}/vendor/golang.org/x/sys
+
+post-build-MANPAGES-on:
+ @${MAKE_CMD} -C ${WRKSRC}/docs SPHINXBUILD=sphinx-build-${PYTHON_VER} man
+
+post-install:
+ @${MKDIR} ${STAGEDIR}${EXAMPLESDIR} \
+ ${STAGEDIR}${ETCDIR} \
+ ${STAGEDIR}${PREFIX}/etc/newsyslog.conf.d \
+ ${STAGEDIR}${PREFIX}/etc/syslog.d \
+ ${STAGEDIR}/var/run/zrepl
+ ${INSTALL_DATA} ${FILESDIR}/newsyslog.conf ${STAGEDIR}${EXAMPLESDIR}/newsyslog.conf
+ ${INSTALL_DATA} ${FILESDIR}/syslog.conf ${STAGEDIR}${EXAMPLESDIR}/syslog.conf
+ ${INSTALL_DATA} ${FILESDIR}/zrepl.yml ${STAGEDIR}${ETCDIR}/zrepl.yml.sample
+ ${MKDIR} ${STAGEDIR}${PREFIX}/etc/periodic/weekly
+ ${INSTALL_SCRIPT} ${WRKDIR}/500.zrepl \
+ ${STAGEDIR}${PREFIX}/etc/periodic/weekly/500.zrepl
+
+post-install-EXAMPLES-on:
+ @${MKDIR} ${STAGEDIR}${EXAMPLESDIR}/hooks
+ (cd ${WRKSRC}/config/samples && ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR})
+ ${INSTALL_DATA} ${WRKSRC}/dist/grafana/grafana-prometheus-zrepl.json ${STAGEDIR}${EXAMPLESDIR}
+
+post-install-MANPAGES-on:
+ ${INSTALL_MAN} ${WRKSRC}/docs/_build/man/zrepl.1 ${STAGEDIR}${PREFIX}/share/man/man1
+
+.include <bsd.port.mk>
diff --git a/filesystems/zrepl/distinfo b/filesystems/zrepl/distinfo
new file mode 100644
index 000000000000..33e3320c0169
--- /dev/null
+++ b/filesystems/zrepl/distinfo
@@ -0,0 +1,7 @@
+TIMESTAMP = 1697090687
+SHA256 (go/sysutils_zrepl/zrepl-v0.6.1/v0.6.1.mod) = 27760d04eb9b7c3c1ca35069afde9f3855f2491f80412bd3aba6cccb557fb009
+SIZE (go/sysutils_zrepl/zrepl-v0.6.1/v0.6.1.mod) = 2186
+SHA256 (go/sysutils_zrepl/zrepl-v0.6.1/v0.6.1.zip) = 87756e2d173cb6c588ba58d05a564bab9dd1febdbb6dbab435425981f379d715
+SIZE (go/sysutils_zrepl/zrepl-v0.6.1/v0.6.1.zip) = 587381
+SHA256 (go/sysutils_zrepl/zrepl-v0.6.1/golang-sys-v0.6.0_GH0.tar.gz) = b4f6d17c7a128f76169964b437cb66b3f2dbf9a33361928ec19dfecf7b03fc54
+SIZE (go/sysutils_zrepl/zrepl-v0.6.1/golang-sys-v0.6.0_GH0.tar.gz) = 1434234
diff --git a/filesystems/zrepl/files/500.zrepl.in b/filesystems/zrepl/files/500.zrepl.in
new file mode 100644
index 000000000000..b7f1b3abb4d3
--- /dev/null
+++ b/filesystems/zrepl/files/500.zrepl.in
@@ -0,0 +1,41 @@
+#!/bin/sh
+
+# Check zrepl SSL certificates for impending expiration each week
+#
+# Add the following lines to /etc/periodic.conf:
+#
+# weekly_zrepl_enable (bool): Set to "NO" by default
+# weekly_zrepl_warntime (int): Set to one month's worth of seconds by default
+
+# If there is a global system configuration file, suck it in.
+#
+if [ -r /etc/defaults/periodic.conf ]
+then
+ . /etc/defaults/periodic.conf
+ source_periodic_confs
+fi
+
+# 30 days in seconds
+: ${weekly_zrepl_warntime="2592000"}
+
+rc=0
+case "$weekly_zrepl_enable" in
+ [Yy][Ee][Ss])
+ echo
+ echo "Check Zrepl certificates for upcoming expiration:"
+
+ for cert in `/usr/bin/find %%ETCDIR%% -maxdepth 1 -name *.crt`; do
+ /usr/bin/openssl x509 --in "${cert}" \
+ -checkend "${weekly_zrepl_warntime}"
+
+ if [ $? -gt 0 ]; then
+ echo "${cert} will expire soon"
+ /usr/bin/openssl x509 --in "${cert}" -noout -enddate
+ rc=3
+ fi
+ done
+ ;;
+ *) rc=0;;
+esac
+
+exit $rc
diff --git a/filesystems/zrepl/files/newsyslog.conf b/filesystems/zrepl/files/newsyslog.conf
new file mode 100644
index 000000000000..647b87247baa
--- /dev/null
+++ b/filesystems/zrepl/files/newsyslog.conf
@@ -0,0 +1,5 @@
+# Newsyslog configuration file for zrepl.
+# See newsyslog.conf(5) for details.
+#
+# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num]
+/var/log/zrepl.log 644 7 1000 @T00 JNC
diff --git a/filesystems/zrepl/files/patch-go.mod b/filesystems/zrepl/files/patch-go.mod
new file mode 100644
index 000000000000..abb50a71b69c
--- /dev/null
+++ b/filesystems/zrepl/files/patch-go.mod
@@ -0,0 +1,89 @@
+--- go.mod.orig 2023-03-24 22:49:20 UTC
++++ go.mod
+@@ -1,6 +1,6 @@
+ module github.com/zrepl/zrepl
+
+-go 1.12
++go 1.17
+
+ require (
+ github.com/fatih/color v1.7.0
+@@ -15,37 +15,68 @@ require (
+ github.com/google/uuid v1.1.2
+ github.com/jinzhu/copier v0.0.0-20170922082739-db4671f3a9b8
+ github.com/juju/ratelimit v1.0.1
+- github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect
+ github.com/kr/pretty v0.1.0
+- github.com/leodido/go-urn v1.2.1 // indirect
+ github.com/lib/pq v1.2.0
+- github.com/mattn/go-colorable v0.1.4 // indirect
+ github.com/mattn/go-isatty v0.0.8
+ github.com/montanaflynn/stats v0.5.0
+- github.com/onsi/ginkgo v1.10.2 // indirect
+- github.com/onsi/gomega v1.7.0 // indirect
+ github.com/pkg/errors v0.8.1
+ github.com/pkg/profile v1.2.1
+ github.com/problame/go-netssh v0.0.0-20200601114649-26439f9f0dc5
+ github.com/prometheus/client_golang v1.2.1
+ github.com/prometheus/common v0.7.0
+ github.com/robfig/cron/v3 v3.0.1
+- github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44 // indirect; go1.12 thinks it needs this
+ github.com/spf13/cobra v0.0.2
+ github.com/spf13/pflag v1.0.5
+ github.com/stretchr/testify v1.6.1
+ github.com/willf/bitset v1.1.10
+ github.com/yudai/gojsondiff v0.0.0-20170107030110-7b1b7adf999d
+- github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect; go1.12 thinks it needs this
+- github.com/yudai/pp v2.0.1+incompatible // indirect
+ github.com/zrepl/yaml-config v0.0.0-20191220194647-cbb6b0cf4bdd
+ gitlab.com/tslocum/cview v1.5.3
+ golang.org/x/net v0.0.0-20210119194325-5f4716e94777
+ golang.org/x/sync v0.0.0-20190423024810-112230192c58
+- golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c
++ golang.org/x/sys v0.6.0
+ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135
+- google.golang.org/genproto v0.0.0-20210122163508-8081c04a3579 // indirect
+ google.golang.org/grpc v1.35.0
+ google.golang.org/protobuf v1.25.0
++)
++
++require (
++ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
++ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4 // indirect
++ github.com/beorn7/perks v1.0.1 // indirect
++ github.com/cespare/xxhash/v2 v2.1.0 // indirect
++ github.com/davecgh/go-spew v1.1.1 // indirect
++ github.com/ftrvxmtrx/fd v0.0.0-20150925145434-c6d800382fff // indirect
++ github.com/gdamore/encoding v1.0.0 // indirect
++ github.com/go-playground/locales v0.13.0 // indirect
++ github.com/go-playground/universal-translator v0.17.0 // indirect
++ github.com/inconshreveable/mousetrap v1.0.0 // indirect
++ github.com/konsorten/go-windows-terminal-sequences v1.0.1 // indirect
++ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 // indirect
++ github.com/kr/text v0.1.0 // indirect
++ github.com/leodido/go-urn v1.2.1 // indirect
++ github.com/lucasb-eyer/go-colorful v1.0.3 // indirect
++ github.com/mattn/go-colorable v0.1.4 // indirect
++ github.com/mattn/go-runewidth v0.0.10 // indirect
++ github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
++ github.com/onsi/ginkgo v1.10.2 // indirect
++ github.com/onsi/gomega v1.7.0 // indirect
++ github.com/pmezard/go-difflib v1.0.0 // indirect
++ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 // indirect
++ github.com/prometheus/procfs v0.0.5 // indirect
++ github.com/rivo/uniseg v0.2.0 // indirect
++ github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44 // indirect; go1.12 thinks it needs this
++ github.com/sirupsen/logrus v1.4.2 // indirect
++ github.com/theckman/goconstraint v1.11.0 // indirect
++ github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect; go1.12 thinks it needs this
++ github.com/yudai/pp v2.0.1+incompatible // indirect
++ gitlab.com/tslocum/cbind v0.1.4 // indirect
++ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 // indirect
++ golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf // indirect
++ golang.org/x/text v0.3.5 // indirect
++ google.golang.org/appengine v1.4.0 // indirect
++ google.golang.org/genproto v0.0.0-20210122163508-8081c04a3579 // indirect
++ gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect
+ gopkg.in/go-playground/assert.v1 v1.2.1 // indirect
++ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect
+ )
diff --git a/filesystems/zrepl/files/patch-go.sum b/filesystems/zrepl/files/patch-go.sum
new file mode 100644
index 000000000000..7a439ab0bf98
--- /dev/null
+++ b/filesystems/zrepl/files/patch-go.sum
@@ -0,0 +1,28 @@
+--- go.sum.orig 2023-03-24 22:49:23 UTC
++++ go.sum
+@@ -25,7 +25,6 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.202012
+ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+ github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
+ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+-github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
+ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+ github.com/ftrvxmtrx/fd v0.0.0-20150925145434-c6d800382fff h1:zk1wwii7uXmI0znwU+lqg+wFL9G5+vm5I+9rv2let60=
+ github.com/ftrvxmtrx/fd v0.0.0-20150925145434-c6d800382fff/go.mod h1:yUhRXHewUVJ1k89wHKP68xfzk7kwXUx/DV1nx4EBMbw=
+@@ -92,8 +91,6 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m
+ github.com/juju/ratelimit v1.0.1 h1:+7AIFJVQ0EQgq/K9+0Krm7m530Du7tIz0METWzN0RgY=
+ github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk=
+ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+-github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM=
+-github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
+ github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
+ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY=
+@@ -235,6 +232,8 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go
+ golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk=
+ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
++golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
++golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+ golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M=
+ golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
diff --git a/filesystems/zrepl/files/patch-vendor_modules.txt b/filesystems/zrepl/files/patch-vendor_modules.txt
new file mode 100644
index 000000000000..90f922b88bf2
--- /dev/null
+++ b/filesystems/zrepl/files/patch-vendor_modules.txt
@@ -0,0 +1,277 @@
+--- vendor/modules.txt.orig 2023-03-24 22:50:20 UTC
++++ vendor/modules.txt
+@@ -1,21 +1,30 @@
+ # github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
++## explicit
+ github.com/alecthomas/template
+ github.com/alecthomas/template/parse
+ # github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4
++## explicit
+ github.com/alecthomas/units
+ # github.com/beorn7/perks v1.0.1
++## explicit; go 1.11
+ github.com/beorn7/perks/quantile
+ # github.com/cespare/xxhash/v2 v2.1.0
++## explicit; go 1.13
+ github.com/cespare/xxhash/v2
+ # github.com/davecgh/go-spew v1.1.1
++## explicit
+ github.com/davecgh/go-spew/spew
+ # github.com/fatih/color v1.7.0
++## explicit
+ github.com/fatih/color
+ # github.com/ftrvxmtrx/fd v0.0.0-20150925145434-c6d800382fff
++## explicit
+ github.com/ftrvxmtrx/fd
+ # github.com/gdamore/encoding v1.0.0
++## explicit; go 1.9
+ github.com/gdamore/encoding
+ # github.com/gdamore/tcell v1.2.0
++## explicit; go 1.12
+ github.com/gdamore/tcell
+ github.com/gdamore/tcell/terminfo
+ github.com/gdamore/tcell/terminfo/a/ansi
+@@ -26,6 +35,7 @@ github.com/gdamore/tcell/terminfo/v/vt102
+ github.com/gdamore/tcell/terminfo/v/vt220
+ github.com/gdamore/tcell/terminfo/x/xterm
+ # github.com/gdamore/tcell/v2 v2.2.0
++## explicit; go 1.12
+ github.com/gdamore/tcell/v2
+ github.com/gdamore/tcell/v2/terminfo
+ github.com/gdamore/tcell/v2/terminfo/a/aixterm
+@@ -65,117 +75,171 @@ github.com/gdamore/tcell/v2/terminfo/x/xterm
+ github.com/gdamore/tcell/v2/terminfo/x/xterm_kitty
+ github.com/gdamore/tcell/v2/terminfo/x/xterm_termite
+ # github.com/gitchander/permutation v0.0.0-20181107151852-9e56b92e9909
++## explicit
+ github.com/gitchander/permutation
+ # github.com/go-logfmt/logfmt v0.4.0
++## explicit
+ github.com/go-logfmt/logfmt
+ # github.com/go-playground/locales v0.13.0
++## explicit; go 1.13
+ github.com/go-playground/locales
+ github.com/go-playground/locales/currency
+ # github.com/go-playground/universal-translator v0.17.0
++## explicit; go 1.13
+ github.com/go-playground/universal-translator
+ # github.com/go-playground/validator v9.31.0+incompatible
++## explicit
+ github.com/go-playground/validator
+ # github.com/go-playground/validator/v10 v10.4.1
++## explicit; go 1.13
+ github.com/go-playground/validator/v10
+ # github.com/go-sql-driver/mysql v1.4.1-0.20190907122137-b2c03bcae3d4
++## explicit
+ github.com/go-sql-driver/mysql
+ # github.com/golang/protobuf v1.4.3
++## explicit; go 1.9
+ github.com/golang/protobuf/proto
+ github.com/golang/protobuf/ptypes
+ github.com/golang/protobuf/ptypes/any
+ github.com/golang/protobuf/ptypes/duration
+ github.com/golang/protobuf/ptypes/timestamp
+ # github.com/google/uuid v1.1.2
++## explicit
+ github.com/google/uuid
+ # github.com/inconshreveable/mousetrap v1.0.0
++## explicit
+ github.com/inconshreveable/mousetrap
+ # github.com/jinzhu/copier v0.0.0-20170922082739-db4671f3a9b8
++## explicit
+ github.com/jinzhu/copier
+ # github.com/juju/ratelimit v1.0.1
++## explicit
+ github.com/juju/ratelimit
+ # github.com/konsorten/go-windows-terminal-sequences v1.0.1
++## explicit
+ github.com/konsorten/go-windows-terminal-sequences
+ # github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515
++## explicit
+ github.com/kr/logfmt
+ # github.com/kr/pretty v0.1.0
++## explicit
+ github.com/kr/pretty
+ # github.com/kr/text v0.1.0
++## explicit
+ github.com/kr/text
+ # github.com/leodido/go-urn v1.2.1
++## explicit; go 1.13
+ github.com/leodido/go-urn
+ # github.com/lib/pq v1.2.0
++## explicit
+ github.com/lib/pq
+ github.com/lib/pq/oid
+ github.com/lib/pq/scram
+ # github.com/lucasb-eyer/go-colorful v1.0.3
++## explicit; go 1.12
+ github.com/lucasb-eyer/go-colorful
+ # github.com/mattn/go-colorable v0.1.4
++## explicit
+ github.com/mattn/go-colorable
+ # github.com/mattn/go-isatty v0.0.8
++## explicit
+ github.com/mattn/go-isatty
+ # github.com/mattn/go-runewidth v0.0.10
++## explicit; go 1.9
+ github.com/mattn/go-runewidth
+ # github.com/matttproud/golang_protobuf_extensions v1.0.1
++## explicit
+ github.com/matttproud/golang_protobuf_extensions/pbutil
+ # github.com/montanaflynn/stats v0.5.0
++## explicit
+ github.com/montanaflynn/stats
++# github.com/onsi/ginkgo v1.10.2
++## explicit
++# github.com/onsi/gomega v1.7.0
++## explicit
+ # github.com/pkg/errors v0.8.1
++## explicit
+ github.com/pkg/errors
+ # github.com/pkg/profile v1.2.1
++## explicit
+ github.com/pkg/profile
+ # github.com/pmezard/go-difflib v1.0.0
++## explicit
+ github.com/pmezard/go-difflib/difflib
+ # github.com/problame/go-netssh v0.0.0-20200601114649-26439f9f0dc5
++## explicit; go 1.11
+ github.com/problame/go-netssh
+ github.com/problame/go-netssh/internal/circlog
+ # github.com/prometheus/client_golang v1.2.1
++## explicit; go 1.11
+ github.com/prometheus/client_golang/prometheus
+ github.com/prometheus/client_golang/prometheus/internal
+ github.com/prometheus/client_golang/prometheus/promhttp
+ # github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4
++## explicit; go 1.9
+ github.com/prometheus/client_model/go
+ # github.com/prometheus/common v0.7.0
++## explicit; go 1.11
+ github.com/prometheus/common/expfmt
+ github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg
+ github.com/prometheus/common/log
+ github.com/prometheus/common/model
+ # github.com/prometheus/procfs v0.0.5
++## explicit
+ github.com/prometheus/procfs
+ github.com/prometheus/procfs/internal/fs
+ github.com/prometheus/procfs/internal/util
+ # github.com/rivo/uniseg v0.2.0
++## explicit; go 1.12
+ github.com/rivo/uniseg
+ # github.com/robfig/cron/v3 v3.0.1
++## explicit; go 1.12
+ github.com/robfig/cron/v3
+ # github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44
++## explicit
+ github.com/sergi/go-diff/diffmatchpatch
+ # github.com/sirupsen/logrus v1.4.2
++## explicit
+ github.com/sirupsen/logrus
+ # github.com/spf13/cobra v0.0.2
++## explicit
+ github.com/spf13/cobra
+ # github.com/spf13/pflag v1.0.5
++## explicit; go 1.12
+ github.com/spf13/pflag
+ # github.com/stretchr/testify v1.6.1
++## explicit; go 1.13
+ github.com/stretchr/testify/assert
+ github.com/stretchr/testify/require
+ # github.com/theckman/goconstraint v1.11.0
++## explicit
+ github.com/theckman/goconstraint/go1.11/gte
+ # github.com/willf/bitset v1.1.10
++## explicit
+ github.com/willf/bitset
+ # github.com/yudai/gojsondiff v0.0.0-20170107030110-7b1b7adf999d
++## explicit
+ github.com/yudai/gojsondiff
+ github.com/yudai/gojsondiff/formatter
+ # github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82
++## explicit
+ github.com/yudai/golcs
++# github.com/yudai/pp v2.0.1+incompatible
++## explicit
+ # github.com/zrepl/yaml-config v0.0.0-20191220194647-cbb6b0cf4bdd
++## explicit
+ github.com/zrepl/yaml-config
+ # gitlab.com/tslocum/cbind v0.1.4
++## explicit; go 1.15
+ gitlab.com/tslocum/cbind
+ # gitlab.com/tslocum/cview v1.5.3
++## explicit; go 1.12
+ gitlab.com/tslocum/cview
+ # golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9
++## explicit; go 1.11
+ golang.org/x/crypto/sha3
+ # golang.org/x/net v0.0.0-20210119194325-5f4716e94777
++## explicit; go 1.11
+ golang.org/x/net/http/httpguts
+ golang.org/x/net/http2
+ golang.org/x/net/http2/hpack
+@@ -184,8 +248,10 @@ golang.org/x/net/internal/timeseries
+ golang.org/x/net/trace
+ golang.org/x/net/websocket
+ # golang.org/x/sync v0.0.0-20190423024810-112230192c58
++## explicit
+ golang.org/x/sync/semaphore
+-# golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c
++# golang.org/x/sys v0.6.0
++## explicit; go 1.17
+ golang.org/x/sys/cpu
+ golang.org/x/sys/internal/unsafeheader
+ golang.org/x/sys/plan9
+@@ -194,8 +260,10 @@ golang.org/x/sys/windows
+ golang.org/x/sys/windows/registry
+ golang.org/x/sys/windows/svc/eventlog
+ # golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf
++## explicit; go 1.11
+ golang.org/x/term
+ # golang.org/x/text v0.3.5
++## explicit; go 1.11
+ golang.org/x/text/encoding
+ golang.org/x/text/encoding/internal/identifier
+ golang.org/x/text/secure/bidirule
+@@ -203,6 +271,7 @@ golang.org/x/text/transform
+ golang.org/x/text/unicode/bidi
+ golang.org/x/text/unicode/norm
+ # golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135
++## explicit
+ golang.org/x/tools/go/gcexportdata
+ golang.org/x/tools/go/internal/gcimporter
+ golang.org/x/tools/go/internal/packagesdriver
+@@ -211,10 +280,13 @@ golang.org/x/tools/internal/fastwalk
+ golang.org/x/tools/internal/gopathwalk
+ golang.org/x/tools/internal/semver
+ # google.golang.org/appengine v1.4.0
++## explicit
+ google.golang.org/appengine/cloudsql
+ # google.golang.org/genproto v0.0.0-20210122163508-8081c04a3579
++## explicit; go 1.11
+ google.golang.org/genproto/googleapis/rpc/status
+ # google.golang.org/grpc v1.35.0
++## explicit; go 1.11
+ google.golang.org/grpc
+ google.golang.org/grpc/attributes
+ google.golang.org/grpc/backoff
+@@ -260,6 +332,7 @@ google.golang.org/grpc/stats
+ google.golang.org/grpc/status
+ google.golang.org/grpc/tap
+ # google.golang.org/protobuf v1.25.0
++## explicit; go 1.9
+ google.golang.org/protobuf/encoding/prototext
+ google.golang.org/protobuf/encoding/protowire
+ google.golang.org/protobuf/internal/descfmt
+@@ -290,6 +363,10 @@ google.golang.org/protobuf/types/known/anypb
+ google.golang.org/protobuf/types/known/durationpb
+ google.golang.org/protobuf/types/known/timestamppb
+ # gopkg.in/alecthomas/kingpin.v2 v2.2.6
++## explicit
+ gopkg.in/alecthomas/kingpin.v2
++# gopkg.in/go-playground/assert.v1 v1.2.1
++## explicit
+ # gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c
++## explicit
+ gopkg.in/yaml.v3
diff --git a/filesystems/zrepl/files/pkg-message.in b/filesystems/zrepl/files/pkg-message.in
new file mode 100644
index 000000000000..b210277014d0
--- /dev/null
+++ b/filesystems/zrepl/files/pkg-message.in
@@ -0,0 +1,37 @@
+[
+{ type: install
+ message: <<EOM
+Messages from filesystems/zrepl:
+
+SETUP BEFORE FIRST USE:
+- Create the log file /var/log/zrepl.log:
+ # service newsyslog restart
+- Teach syslogd to redirect facility local0 to the zrepl.log file:
+ # service syslogd reload
+- Modify the %%PREFIX%%/etc/zrepl/zrepl.yml configuration file
+- For remote backups, create the SSH key pair and authorized_keys file
+- Enable the zrepl daemon to start automatically at boot:
+ # sysrc zrepl_enable="YES"
+- Start the zrepl daemon:
+ # service zrepl start
+
+Documentation: https://zrepl.github.io/
+Changelog: https://zrepl.github.io/master/changelog.html
+
+DANGER - SNAPSHOT PRUNING REQUIRES EXPLICIT KEEP RULES:
+For any ZFS snapshot that you want to keep, at least one rule must match.
+This also applies to snapshots taken by means other than zrepl
+(e.g. snapshots taken manually or via boot environment tools).
+
+In order to automatically warn the operator of impending certificate
+expiration, add this line to /etc/periodic.conf:
+
+ weekly_zrepl_enable="YES"
+
+More config details in the zrepl periodic script:
+
+ %%LOCALBASE%%/etc/periodic/weekly/500.zrepl
+
+EOM
+}
+]
diff --git a/filesystems/zrepl/files/syslog.conf b/filesystems/zrepl/files/syslog.conf
new file mode 100644
index 000000000000..c825c409d5a6
--- /dev/null
+++ b/filesystems/zrepl/files/syslog.conf
@@ -0,0 +1,7 @@
+# Syslog configuration file for zrepl.
+# See syslog.conf(5) for details.
+#
+# SELECTOR ACTION
+# FACILITY.[!<=>]LEVEL
+!zrepl
+local0.info /var/log/zrepl.log
diff --git a/filesystems/zrepl/files/zrepl.in b/filesystems/zrepl/files/zrepl.in
new file mode 100644
index 000000000000..6a2510f80572
--- /dev/null
+++ b/filesystems/zrepl/files/zrepl.in
@@ -0,0 +1,80 @@
+#!/bin/sh
+
+# PROVIDE: zrepl
+# REQUIRE: LOGIN
+# KEYWORD: shutdown
+#
+# Add the following lines to /etc/rc.conf.local or /etc/rc.conf
+# to enable this service:
+#
+# zrepl_enable (bool): Set to YES to enable the zrepl service.
+# Default: NO
+# zrepl_config (str): File containing zrepl configuration details.
+# Default: %%PREFIX%%/etc/zrepl/zrepl.yml
+# zrepl_user (str): The user account used to run the zrepl daemon.
+# Do not specifically set this to an empty string as this
+# will cause the daemon to run as root.
+# Default: root
+# zrepl_group (str): The group account used to run the zrepl daemon.
+# Do not specifically set this to an empty string as this
+# will cause the daemon to run with group wheel.
+# Default: wheel
+# zrepl_flags (str): Extra flags passed to zrepl
+# Default: ""
+# zrepl_facility (str): Syslog facility to use
+# Default: local0
+# zrepl_priority (str): Syslog priority to use
+# Default: alert
+
+. /etc/rc.subr
+name=zrepl
+rcvar=${name}_enable
+load_rc_config $name
+
+: ${zrepl_enable:="NO"}
+: ${zrepl_config:="%%PREFIX%%/etc/zrepl/zrepl.yml"}
+: ${zrepl_user:="root"}
+: ${zrepl_group:="wheel"}
+: ${zrepl_flags:=""}
+: ${zrepl_facility:="local0"}
+: ${zrepl_priority:="alert"}
+: ${zrepl_options:="${zrepl_flags} --config ${zrepl_config}"}
+
+pidfile="/var/run/zrepl.pid"
+command="/usr/sbin/daemon"
+procname="%%PREFIX%%/bin/zrepl"
+command_args="-p ${pidfile} -S -l ${zrepl_facility} -s ${zrepl_priority} -T ${name} \
+ ${procname} ${zrepl_options} daemon"
+
+start_precmd="zrepl_precmd"
+stop_postcmd="zrepl_postcmd"
+restart_precmd="zrepl_checkconfig"
+configtest_cmd="zrepl_checkconfig"
+extra_commands="configtest"
+
+zrepl_precmd()
+{
+ if [ ! -d "/var/run/zrepl/stdinserver" ]; then
+ install -d -g ${zrepl_group} -o ${zrepl_user} -m 0700 -- "/var/run/zrepl";
+ install -d -g ${zrepl_group} -o ${zrepl_user} -m 0700 -- "/var/run/zrepl/stdinserver";
+ fi
+
+ if [ ! -e "${pidfile}" ]; then
+ install -g ${zrepl_group} -o ${zrepl_user} -- /dev/null "${pidfile}";
+ fi
+
+ zrepl_checkconfig
+}
+
+zrepl_postcmd()
+{
+ rm -f -- "${pidfile}"
+}
+
+zrepl_checkconfig()
+{
+ echo "Performing sanity check on zrepl configuration:"
+ eval ${procname} ${zrepl_options} configcheck
+}
+
+run_rc_command "$1"
diff --git a/filesystems/zrepl/files/zrepl.yml b/filesystems/zrepl/files/zrepl.yml
new file mode 100644
index 000000000000..94e924c4eb7e
--- /dev/null
+++ b/filesystems/zrepl/files/zrepl.yml
@@ -0,0 +1,13 @@
+# zrepl main configuration file.
+# For documentation, refer to https://zrepl.github.io/
+#
+global:
+ logging:
+ - type: "stdout"
+ level: "error"
+ format: "human"
+ - type: "syslog"
+ level: "info"
+ format: "logfmt"
+
+# Add "jobs:" section(s) here for your specific use cases.
diff --git a/filesystems/zrepl/pkg-descr b/filesystems/zrepl/pkg-descr
new file mode 100644
index 000000000000..4913c21f125b
--- /dev/null
+++ b/filesystems/zrepl/pkg-descr
@@ -0,0 +1,2 @@
+Cross-platform ZFS replication tool written in Go that supports
+feature detection, bookmarks, and other new features.
diff --git a/filesystems/zrepl/pkg-plist b/filesystems/zrepl/pkg-plist
new file mode 100644
index 000000000000..a11961d1fa43
--- /dev/null
+++ b/filesystems/zrepl/pkg-plist
@@ -0,0 +1,25 @@
+bin/zrepl
+etc/periodic/weekly/500.zrepl
+@sample %%ETCDIR%%/zrepl.yml.sample
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/bandwidth_limit.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/grafana-prometheus-zrepl.json
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/hooks/template.sh
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/local.yml
+@sample %%EXAMPLESDIR%%/newsyslog.conf etc/newsyslog.conf.d/zrepl.conf
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/pull.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/pull_ssh.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/push.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/quickstart_backup_to_external_disk.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/quickstart_continuous_server_backup_receiver.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/quickstart_continuous_server_backup_sender.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/quickstart_fan_out_replication_source.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/quickstart_fan_out_replication_target.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/sink.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/snap.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/snap_cron.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/source.yml
+%%PORTEXAMPLES%%%%EXAMPLESDIR%%/source_ssh.yml
+@sample %%EXAMPLESDIR%%/syslog.conf etc/syslog.d/zrepl.conf
+@dir etc/newsyslog.conf.d
+@dir etc/syslog.d
+@dir(root,wheel,0750) /var/run/zrepl
diff --git a/filesystems/zxfer/Makefile b/filesystems/zxfer/Makefile
new file mode 100644
index 000000000000..9a0ecce6db0f
--- /dev/null
+++ b/filesystems/zxfer/Makefile
@@ -0,0 +1,30 @@
+PORTNAME= zxfer
+PORTVERSION= 1.1.7
+PORTREVISION= 1
+DISTVERSIONPREFIX= v
+CATEGORIES= filesystems sysutils
+
+MAINTAINER= ports@scaleengine.com
+COMMENT= Easily and reliably transfer ZFS filesystems
+WWW= https://github.com/allanjude/zxfer
+
+LICENSE= BSD2CLAUSE
+
+USE_GITHUB= yes
+GH_ACCOUNT= allanjude
+
+NO_BUILD= yes
+
+OPTIONS_DEFINE= RSYNC
+
+RSYNC_DESC= Enable RSYNC Support
+RSYNC_RUN_DEPENDS= rsync:net/rsync
+
+PLIST_FILES= share/man/man8/zxfer.8.gz \
+ sbin/zxfer
+
+do-install:
+ ${INSTALL_SCRIPT} ${WRKSRC}/zxfer ${STAGEDIR}${PREFIX}/sbin
+ ${INSTALL_MAN} ${WRKSRC}/zxfer.8 ${STAGEDIR}${PREFIX}/share/man/man8
+
+.include <bsd.port.mk>
diff --git a/filesystems/zxfer/distinfo b/filesystems/zxfer/distinfo
new file mode 100644
index 000000000000..8f43bc8feced
--- /dev/null
+++ b/filesystems/zxfer/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1554913055
+SHA256 (allanjude-zxfer-v1.1.7_GH0.tar.gz) = c95ed822748806e93b06902575cfbaf99b6a236d21a6bb6c0e3d4648f2d48f29
+SIZE (allanjude-zxfer-v1.1.7_GH0.tar.gz) = 52908
diff --git a/filesystems/zxfer/pkg-descr b/filesystems/zxfer/pkg-descr
new file mode 100644
index 000000000000..1e7e4caee271
--- /dev/null
+++ b/filesystems/zxfer/pkg-descr
@@ -0,0 +1,22 @@
+Zxfer is a fork of zfs-replicate. It allows the easy and reliable backup,
+restore or transfer of ZFS filesystems, either locally or remotely.
+
+Some of the features zxfer has:
+ * Written in sh with only one dependency, rsync. Rsync mode is not used
+ in a typical restore, hence in that situation all you need is the
+ zxfer script, your backup and an install CD/DVD.
+ * Reliability is first priority - the only methods of transfer allowed
+ are those that checksum/hash the transferred data.
+ * Transfer to or from a remote host via ssh.
+ * Recursive and incremental transfer of filesystems (via snapshots).
+ * Transfer properties and sources of those properties (e.g. local or
+ inherited).
+ * Override properties in the transfer, e.g. for archival purposes
+ it is useful to override "copies" and "compression".
+ * Create all filesystems on the destination as necessary.
+ * A comprehensive man page with examples.
+ * Can be set to beep on error or when done, useful for long transfers.
+ * Features an rsync mode for when two different snapshotting regimes are on
+ source and destination, and zfs send/receive won't work.
+
+LICENSE: BSD