aboutsummaryrefslogtreecommitdiff
path: root/filesystems
diff options
context:
space:
mode:
authorRobert Clausecker <fuz@FreeBSD.org>2024-09-27 10:48:46 +0000
committerRobert Clausecker <fuz@FreeBSD.org>2024-11-06 15:17:35 +0000
commit6e2da9672f79f44048d597f0f61e4646cdeade9d (patch)
treec92e4b3158e3419e8cec38e00227d08dcdaab3e9 /filesystems
parent432f2ebe088377708fb08514ea86f2c19a5b0ad5 (diff)
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