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 to propagate to clients, cleaner error handling.
- Stateless client improvements
Proper daemonization when afpsld is auto-spawned by 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’ -> ‘cat’ and ‘pass’ -> ‘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.
Don’t 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