What is new in afpfs-ng-0.9.4, February 28, 2026
New Test Suite
- A new test suite for afpcmd and afpgetstatus has been added, with tests for both batch and interactive modes of afpcmd. The tests are designed to be run in a self-contained container environment, but can also be run on the host with the appropriate setup. They use Perl’s Test::More framework and are run with the prove tool. This is now running in CI on every commit and pull request.
AFP Client Library Improvements
- Turn afpfsd.h into a shim and create clean Stateless/FUSE separation, with shared IPC constants moved to afp_ipc.h, the stateless daemon structs moved to afp_server.h, and the FUSE-specific constants to fuse_ipc.h.
- MacRoman code page conversion support for better compatibility with AFP 2.x servers (Classic Mac OS).
- Separate the “mounted” and “attached” semantics, which allows for better error handling and more intuitive behavior in the stateless client and afpcmd.
- Serialize all AFP server operations to prevent concurrent DSI calls.
- Prevent SIGPIPE from propagating to clients, with cleaner error handling.
Stateless Client Improvements
- Proper daemonization when afpsld is auto-spawned by the client library, which is required by the kio-afp client on KDE and any other client that launches in the background.
- Count client connections and shut down the stateless client daemon (afpsld) when no clients are connected.
- Support for “not empty directory” errors when trying to delete directories with the rmdir command in afpcmd.
- Fix numerous race conditions and other bugs that could cause the daemon to crash or misbehave under load.
afpcmd Client Improvements
- Renamed view to cat and pass to passwd for better consistency with common command line tools.
- Graceful handling of server disconnects and other errors in interactive mode, with the ability to reconnect to the same volume or return to the volume selection menu.
- Do not tear down the server connection with the exit command in interactive mode, which allows other clients to continue using the same connection.
- Reintroduced the disconnect command in interactive mode, but with a new behavior that shuts down the AFP server connection and exits the client, rather than just detaching from the volume. This interrupts other clients using the same server connection.
- Less buggy readline support for interactive mode on *BSD and macOS, with better handling of escaped spaces.
- When no password is provided in the AFP URL, prompt the user for it.
FUSE Client Improvements
- Correctly store time stamps internally and convey them to libfuse, notably to not break file creation times after copying files with xattr with macFUSE on macOS.
- Cleaner handling of server disconnects and other errors.
- Prepend afp:// to URLs passed to mount_afpfs, if missing.
- When no password is provided in the AFP URL, prompt the user for it.
afpgetstatus Improvements
- Attempt to authenticate with guest UAM and list visible volumes.
- Support for setting the log level, be sensitive to the log level coming from the client library.
- Handle naked IPv6 addresses in afpgetstatus arguments.
- Shut down on SIGINT.
Other Fixes and Improvements
- Added a -Denable-docs option that allows opting out of installing documentation (enabled by default).
- Sundry buffer overflow and memory safety fixes in various places.
What’s Changed
- build(deps): bump vmactions/netbsd-vm from 1.3.3 to 1.3.5 by @dependabot[bot] in https://github.com/Netatalk/afpfs-ng/pull/143
- build(deps): bump vmactions/openbsd-vm from 1.3.3 to 1.3.5 by @dependabot[bot] in https://github.com/Netatalk/afpfs-ng/pull/144
- build(deps): bump vmactions/freebsd-vm from 1.3.8 to 1.4.1 by @dependabot[bot] in https://github.com/Netatalk/afpfs-ng/pull/145
- improve semantics, multi-thread safety, and resiliency of the stateless client by @rdmark in https://github.com/Netatalk/afpfs-ng/pull/146
- afpgetstatus: list shared volumes and other improvements by @rdmark in https://github.com/Netatalk/afpfs-ng/pull/148
- have the clients prompt for password when not specified by @rdmark in https://github.com/Netatalk/afpfs-ng/pull/149
- improve error handling and thread safety in stateless daemon by @rdmark in https://github.com/Netatalk/afpfs-ng/pull/150
- more consistent fork management in stateless daemon, other improvements by @rdmark in https://github.com/Netatalk/afpfs-ng/pull/151
- turn afpfsd.h into a shim and create clean Stateless/FUSE separation by @rdmark in https://github.com/Netatalk/afpfs-ng/pull/152
- UID/GUI translation in afpfsl, serialize AFP operations, other fixes by @rdmark in https://github.com/Netatalk/afpfs-ng/pull/153
- proper daemonization when afpsld is auto-spawned by client library by @rdmark in https://github.com/Netatalk/afpfs-ng/pull/154
- build(deps): bump vmactions/freebsd-vm from 1.4.1 to 1.4.2 by @dependabot[bot] in https://github.com/Netatalk/afpfs-ng/pull/156
- build(deps): bump vmactions/openbsd-vm from 1.3.5 to 1.3.6 by @dependabot[bot] in https://github.com/Netatalk/afpfs-ng/pull/157
- build(deps): bump vmactions/netbsd-vm from 1.3.5 to 1.3.6 by @dependabot[bot] in https://github.com/Netatalk/afpfs-ng/pull/158
- MAC_ROMAN code page conversion support by @rdmark in https://github.com/Netatalk/afpfs-ng/pull/155
- give the FUSE client a more sophisticated time stamp logic by @rdmark in https://github.com/Netatalk/afpfs-ng/pull/159
- improve FUSE unmount logic, split unmount and detach semantics by @rdmark in https://github.com/Netatalk/afpfs-ng/pull/160
- afpcmd: use standard passwd and cat command names, fix readline bug by @rdmark in https://github.com/Netatalk/afpfs-ng/pull/166
- introduce not empty code to IPC protocol and add error handling to afpcmd by @rdmark in https://github.com/Netatalk/afpfs-ng/pull/168
- afpcmd disconnect command; afpsld client counting logic by @rdmark in https://github.com/Netatalk/afpfs-ng/pull/167
- afpcmd: graceful refresh of server connection after idling by @rdmark in https://github.com/Netatalk/afpfs-ng/pull/170
Full Changelog: https://github.com/Netatalk/afpfs-ng/compare/0.9.3…0.9.4
Downloads
- afpfs-ng-0.9.4.tar.xz (0.2 MB)
- afpfs-ng-0.9.4.tar.xz.sha256sum (0.0 MB)
Footnotes
Release published on 2026-02-28
Generated from GitHub Release Notes