Releases: Netatalk/netatalk-client
0.9.4
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 #143
- build(deps): bump vmactions/openbsd-vm from 1.3.3 to 1.3.5 by @dependabot[bot] in #144
- build(deps): bump vmactions/freebsd-vm from 1.3.8 to 1.4.1 by @dependabot[bot] in #145
- improve semantics, multi-thread safety, and resiliency of the stateless client by @rdmark in #146
- afpgetstatus: list shared volumes and other improvements by @rdmark in #148
- have the clients prompt for password when not specified by @rdmark in #149
- improve error handling and thread safety in stateless daemon by @rdmark in #150
- more consistent fork management in stateless daemon, other improvements by @rdmark in #151
- turn afpfsd.h into a shim and create clean Stateless/FUSE separation by @rdmark in #152
- UID/GUI translation in afpfsl, serialize AFP operations, other fixes by @rdmark in #153
- proper daemonization when afpsld is auto-spawned by client library by @rdmark in #154
- build(deps): bump vmactions/freebsd-vm from 1.4.1 to 1.4.2 by @dependabot[bot] in #156
- build(deps): bump vmactions/openbsd-vm from 1.3.5 to 1.3.6 by @dependabot[bot] in #157
- build(deps): bump vmactions/netbsd-vm from 1.3.5 to 1.3.6 by @dependabot[bot] in #158
- MAC_ROMAN code page conversion support by @rdmark in #155
- give the FUSE client a more sophisticated time stamp logic by @rdmark in #159
- improve FUSE unmount logic, split unmount and detach semantics by @rdmark in #160
- afpcmd: use standard passwd and cat command names, fix readline bug by @rdmark in #166
- introduce not empty code to IPC protocol and add error handling to afpcmd by @rdmark in #168
- afpcmd disconnect command; afpsld client counting logic by @rdmark in #167
- afpcmd: graceful refresh of server connection after idling by @rdmark in #170
Full Changelog: 0.9.3...0.9.4
0.9.3
What is new in afpfs-ng-0.9.3, February 8, 2026
- Stateless client library
The stateless client library (libafpsl.so) together with the stateless client daemon (afpsld)
have been (re)introduced and thoroughly reworked to provide a more robust and efficient way
to interact with AFP servers without maintaining a persistent connection.
The stateless client daemon has gotten a unique name (afpsld) to allow it to coexist
with the FUSE client daemon (afpfsd), while removing all FUSE client specific code and dependencies
from the former.
- afpcmd client improvements
The afpcmd client has been reworked to use the new stateless client library and daemon,
rather than calling the midlevel API directly. This allows for better error handling and stability,
and also turns afpcmd into a reference implementation and showcase for the stateless client library.
Implemented password changing with all UAMs that support it, using the previously ineffective 'pass' command.
Two way batch file transfers from the command line.
Introduced support for password protected volumes.
Introduced verbose mode with -V or --verbose that prints detailed information about file transfers,
while adding a summary of the transfer at the end.
Removed the ineffecual 'user' command for changing the user on the fly.
Removed "synonyms" for commands (e.g. 'delete' for 'rm') to reduce the clutter and complexity of the command set.
- FUSE client improvements
Added support for libfuse 2.9 with older versions of macFUSE / OSXFUSE on macOS (although not fully tested).
Made the client sensitive to loglevels set by the afpfsd manager daemon.
Remapped afp_client volpass option from -V to -P to avoid overlap with the new verbose mode in afpcmd.
- library improvements
Fixed bug that prevented the use of 8 char passwords with the Randnum UAMs.
Scrub all passwords from memory immediately after use.
Fallback to guest (nobody) auth if no credentials are provided, and the server allows guest access.
Full implementation of Precomposed UTF8 to Decomposed UTF8 conversion.
Changed the UAM shorthand for 2-Way Randnum from '2wayrandnum' to 'randnum2'.
Removed unused GNU GMP and ncurses dependencies.
Many memory safety and reliability improvements.
What's Changed
- pass buffer length to pascal conversion functions consistently by @rdmark in #118
- restore workaround for netatalk UTF-8 server names by @rdmark in #119
- Revert "Remove obsoleted daemon subdir" by @rdmark in #124
- overhaul stateless client library and daemon, implement it in afpcmd by @rdmark in #120
- better robustness during file transfers in both clients by @rdmark in #125
- fix double-free bug in find_dirid_by_fullname by @rdmark in #123
- correct log level filtering logic in the FUSE client by @rdmark in #122
- purge superfluous dependencies from build system by @rdmark in #126
- compatibility with older glibc, error handling and memory safety by @rdmark in #128
- build(deps): bump actions/checkout from 6.0.1 to 6.0.2 by @dependabot[bot] in #130
- file transfer verbose mode for afpcmd, logging improvements by @rdmark in #129
- Memory Safety Improvements to Unicode string handling functions by @rdmark in #131
- initialize logger structure before attempting to use in FUSE client by @rdmark in #134
- improve logging routines in FUSE daemon and client by @rdmark in #136
- build(deps): bump vmactions/freebsd-vm from 1.3.7 to 1.3.8 by @dependabot[bot] in #138
- build(deps): bump vmactions/openbsd-vm from 1.3.1 to 1.3.3 by @dependabot[bot] in #139
- build(deps): bump vmactions/netbsd-vm from 1.3.1 to 1.3.3 by @dependabot[bot] in #140
- compatibility with libfuse v2 on macOS by @rdmark in #135
- stateless client disconnect, afpcmd user auth refactor by @rdmark in #137
- implementation of password changing for all UAMs and Stateless library by @rdmark in #142
Full Changelog: 0.9.2...0.9.3
0.9.2
What is new in afpfs-ng-0.9.2, January 14, 2026
- FUSE client improvements
Rearchitectured to a one afpfsd process per mount model for better stability and performance:
Launch the manager afpfsd process with 'afpfsd --manager' and mount daemons with 'afpfsd --socket-id '.
As before, mount_afpfs or afp_client will launch all daemons automatically.
This also enables multiple mounts on macOS with macFUSE which was not possible before.
Server connection suspend and resume support in afp_client.
Can now set log level and log type (syslog/stdout) for the FUSE client.
macOS Finder xattr support for custom icons and other metadata (requires macFUSE v5.1.3 or later).
- afpcmd client improvements
Added a new 'exit' command that detaches from the current volume and returns to the list of volumes.
When in volume selection mode, use the 'ls' command to list available volumes on the server.
Made the 'chmod' command work properly.
Can now set log level for the afpcmd client (always logs to syslog).
- AFP protocol compliance
AFP 3.2 Extended Attributes (xattr) support
AFP 3.3 Replay Cache support
AFP 3.4 compliant xattr error handling
Implemented FPEnumerateExt (command 66) for AFP 3.0
- General improvements
Removed obsolete workarounds for 20 year old netatalk bugs.
Proper support for long UTF-8 volume names in all clients.
Introduced UAM shorthands for easier use: clrtxt, randnum, dhx2, dhx, etc.
Converted man pages to mdoc format.
We now install development files (headers, pkg-config) for libafpclient with meson.
What's Changed
- build(deps): bump actions/checkout from 6.0.0 to 6.0.1 by @dependabot[bot] in #65
- build(deps): bump vmactions/netbsd-vm from 1.2.1 to 1.2.3 by @dependabot[bot] in #64
- build(deps): bump vmactions/openbsd-vm from 1.2.3 to 1.2.4 by @dependabot[bot] in #66
- Enable the mounting of multiple FUSE volumes simultaneously by @rdmark in #68
- Client support for AFP 3.3 replay cache by @rdmark in #69
- Use a per-mount afpfsd daemon process structure for all platforms by @rdmark in #71
- implement log level for the FUSE client by @rdmark in #72
- install development headers and pkgconfig file for libafpclient by @rdmark in #74
- build(deps): bump vmactions/freebsd-vm from 1.2.9 to 1.3.0 by @dependabot[bot] in #77
- build(deps): bump DavidAnson/markdownlint-cli2-action from 21.0.0 to 22.0.0 by @dependabot[bot] in #78
- fix incorrect dsi_send() calls and shore up error handling by @rdmark in #80
- Complete support for Extended Attribute reads and writes by @rdmark in #81
- update the afp_client status command for multiple afpfsd by @rdmark in #83
- build(deps): bump vmactions/openbsd-vm from 1.2.5 to 1.2.7 by @dependabot[bot] in #84
- Remove superfluous permissions declaration from test.yml by @rdmark in #86
- enable xattr writes with macFUSE as the bug is fixed with v5.1.3 by @rdmark in #87
- proper definition of AppleTalk Zone length by @rdmark in #92
- afp_client: properly support all subcommands with manager daemon by @rdmark in #91
- Improve AFP idle timeout and reconnection handling by @rdmark in #93
- afpcmd: log to syslog, control log level, bugfixes by @rdmark in #94
- convert man pages to roff with mdoc macros, drop cmark dependency by @rdmark in #96
- overhaul logging fidelity, better FUSE error reporting by @rdmark in #97
- build(deps): bump vmactions/netbsd-vm from 1.2.3 to 1.3.1 by @dependabot[bot] in #98
- build(deps): bump vmactions/openbsd-vm from 1.2.7 to 1.3.1 by @dependabot[bot] in #99
- build(deps): bump vmactions/freebsd-vm from 1.3.0 to 1.3.4 by @dependabot[bot] in #100
- Properly handle xattr errors for AFP 3.4 and enumerate for AFP 3.0 by @rdmark in #102
- refactor FUSE unmount flow to use proper libfuse3 API by @rdmark in #105
- introduce UAM shorhand names to be used when invoking the clients by @rdmark in #106
- build(deps): bump vmactions/freebsd-vm from 1.3.4 to 1.3.6 by @dependabot[bot] in #108
- build(deps): bump vmactions/freebsd-vm from 1.3.6 to 1.3.7 by @dependabot[bot] in #110
- store meson logs as job artifacts for each build job by @rdmark in #111
- print more information on afpfsd child status, and clean up logging routine by @rdmark in #109
- improve volume selection, reconnection, UTF8 volnames, server type detection by @rdmark in #112
- clean up obsolete netatalk workaround code by @rdmark in #115
- afpcmd: introduce exit command for detaching from volume by @rdmark in #116
Full Changelog: 0.9.1...0.9.2
0.9.1
What is new in afpfs-ng-0.9.1, December 7, 2025
- FUSE client improvements
Support for FUSE 3.0+ on Linux and FreeBSD, and macFUSE on macOS,
while maintaining compatibility with FUSE 2.9.9.
Implemented FUSE commands for create, flush, chown, truncate, and rename.
Enabled multi threaded FUSE operation handling for better performance and stability,
while introducing better thread safety across the board.
Volume name labels and proper volume creation time support in macFUSE.
On FreeBSD, afpfsd can now be started on the fly by the mount_afpfs tool.
Numerous bug fixes and stability improvements.
- afpcmd client improvements
Introduced a new copy (cp) command for file transfers on the AFP volume.
Shored up error handling for the cd, mv, put, and touch commands.
Now mapping error codes to human readable strings for better user feedback.
Fixed bug with 8 char passwords when using Cleartxt Password UAM.
The dir/ls command now takes an optional dir to list instead of the current directory.
- Meson build system enhancements
Support for libedit alongside readline for afpcmd builds,
commonly used on Alpine Linux and elsewhere.
Always build afpgetstatus tool even without ncurses/readline.
Fail the build if neither afpcmd nor the FUSE client can be built.
- Miscellaneous improvements
Introduced stylistic coding standards for C, Meson, Markdown, YAML, and shell script code.
The new codefmt.sh script can be used to automatically format code.
Fix all security and reliability bugs reported by SonarQube static analysis.
Now also compiling and running on NetBSD (FUSE only) and OpenBSD (afpcmd only).
What's Changed
- use libbsd for BSD extensions to glibc by @rdmark in #27
- afpcmd: consistently use file descriptor to access file in com_get_file() by @rdmark in #31
- use specific base image semantic versions in CI workflow by @rdmark in #32
- Fix SonarQube reliability bugs by @rdmark in #33
- Fix buffer overflow in afp_getsrvrparms_reply volume parsing by @rdmark in #35
- libafpclient: fix static analyzer warning in string termination by @rdmark in #36
- Port downstream patches from the Fedora Project by @rdmark in #39
- Introduce code formatting rules and reformat the whole codebase by @rdmark in #37
- pull in the original GNU copyright notice from readline by @rdmark in #40
- Bump actions/checkout from 5.0.0 to 6.0.0 by @dependabot[bot] in #45
- Bump DavidAnson/markdownlint-cli2-action from 20.0.0 to 21.0.0 by @dependabot[bot] in #44
- Enable multi-threaded FUSE to avoid frequent deadlocks by @rdmark in #47
- remove unused and bitrotted C source files by @rdmark in #48
- afpcmd: more sturdy logic when moving files and dirs by @rdmark in #50
- afpcmd: enable dir/ls to take an argument for dir to list by @rdmark in #51
- afpcmd: show test menu when built with debug, plus cleanup by @rdmark in #54
- handle 8 char ClearTxt UAM passwords by @rdmark in #55
- afpcmd: introduce a copy/cp command by @rdmark in #56
- Bump vmactions/freebsd-vm from 1.2.4 to 1.2.8 by @dependabot[bot] in #58
- afpcmd: improve error reporting and handling by @rdmark in #57
- Fix race conditions and thread safety issues in DSI request handling by @rdmark in #59
- FreeBSD compatibility in start_afpfsd() by @rdmark in #60
- support for libedit as an alternative to readline by @rdmark in #61
- a grab bag of stability improvements by @rdmark in #62
- support fuse3 in the AFP FUSE client by @rdmark in #63
New Contributors
- @dependabot[bot] made their first contribution in #45
Full Changelog: 0.9.0...0.9.1
0.9.0
What is new in afpfs-ng-0.9.0, February 9, 2025
- FUSE client improvements
Support for FUSE 2.99 on Linux, and macFUSE on macOS.
Shore up error handling and memory synchronization to avoid deadlocks.
Rename mount_afp to mount_afpfs to avoid name conflict with the native
macOS AFP client.
The ability to pass mount options to FUSE with -O is now supported,
amongst other patches contributed by R.J.V. Bertin.
- afpgetstatus improvements
Support for IPv6 addresses. Print much more information on the AFP server.
Introduce a -i flag to print the server's icon and icon mask.
- Meson build system
Autotools has been replaced by Meson. Configure and builds are much faster.
Extra debug output is now controlled at compile time with -Dbuildtype=debug.
If you want to build without debug output, use -Dbuildtype=release.
- Code quality
Consolidation and refactoring of the code. Numerous bug fixes.
Code compiles cleanly without warnings on supported platforms now.
What's Changed
- modern IP interfaces on freebsd by @rdmark in #11
- Meson build system by @rdmark in #12
- Compiler warnings by @rdmark in #13
- Check for gmp dependency to build with encrypted UAM support by @rdmark in #15
- Remove the Autotools build system by @rdmark in #14
- Remove obsolete Linux compat code by @rdmark in #16
- initialize libgcrypt by @rdmark in #18
- build with c11 standard by @rdmark in #19
- enable extra debug logging at compile time by @rdmark in #21
- Stricter error handling in main loop, plus debug logging by @rdmark in #22
- define more magic numbers as global constants by @rdmark in #20
- Read version string from build system, and bump to 0.9.0 by @rdmark in #24
- Protect against race condition in main loop by @rdmark in #25
- Convert documentation to Markdown format by @rdmark in #26
New Contributors
Full Changelog: https://github.com/rdmark/afpfs-ng/commits/0.9.0