Releases: Netatalk/netatalk-client
Release list
0.9.5
Netatalk Client v0.9.5
Note: With this release version onwards, this project is now called Netatalk Client.
The names of tools and libraries are unchanged from afpfs-ng to signal continuity and (partial) compatibility.
AFP Client Library Improvements
- Support for the SRP UAM (Secure Remote Password), which is the most modern and secure password-based authentication method in the AFP protocol: supported by Mac OS X 10.7 Lion, Netatalk 4.5 and later
- Harden and bugfix libafpclient UAM handling code
- We now detect 2000s era Mac OS X servers, Time Capsules, and Windows (SFM, PCMacLan) servers
- Improved compatibility with modern Apple AFP servers and Time Capsule, including FinderInfo and ResourceFork handling,
Time Capsule-friendly file creation and fork writes, and support for AFP file exchange operations used by safe-save workflows. - AFP connection attempts now respect a timeout instead of blocking indefinitely, with a longer default timeout for Time
Capsule servers to tolerate disk spin-up. - Disable TCP Nagle on AFP connections for more responsive interactive and metadata-heavy workloads.
Stateless Client Library Improvements
- Allow library consumers to register a persistent logging callback with context and syslog severity. Local libafpsl
diagnostics and structured logs returned by every afpsld command use the same callback. - Add reusable metadata replacement and transfer helpers to libafpsl, with auto, filesystem-xattr,
macOS AppleDouble, and Netatalk AppleDouble storage modes and non-fatal warning flags for non-interactive consumers. - Add stateless APIs for generic extended attributes, FinderInfo, and ResourceFork metadata.
- Bind stateless volume operations to authenticated sessions and add explicit session resume support for long-lived
clients such as KIO workers.
afpcmd Client Improvements
- Pagination of long directory listings where we previously truncated the output at 256 entries.
- Preserve FinderInfo, ResourceFork, and generic extended attributes when transferring files, with selectable local
metadata storage modes. - Add xattr, finderinfo, and resourcefork commands for inspecting and modifying AFP metadata interactively.
- Add per-command recursive mode for interactive get, put, cp, chmod, and rm commands.
- Recover interactive sessions more reliably after idle server disconnects.
- Escape control characters in path output so unusual server-side filenames cannot corrupt terminal output.
FUSE Client Improvements
- Better macOS Finder compatibility through ResourceFork, FinderInfo, and generic extended attribute operations in
macFUSE. - Support Darwin rename and exchange callbacks, including safer Finder-style save operations that preserve stable file
IDs where the server supports AFP file exchange. - Restore reconnection after afp_client suspend and afp_client resume; suspended mounts now stay suspended until an
explicit resume command. - Avoid daemon termination during FUSE wakeups and unmount handling on platforms where SIGPIPE could otherwise arrive
before libfuse installs its own handler.
What's Changed
- touch up codefm.sh script with return code and stderr redirection by @rdmark in #172
- remove some unreachable code in the FUSE client by @rdmark in #184
- restructure UAM code into separate files by @rdmark in #194
- retry read/select on EINTR in FUSE client/daemon socket I/O by @rdmark in #197
- add SRP User Authentication Method by @rdmark in #196
- reduce log verbosity by guarding afp_main_loop debug logs with DEBUG macros by @rdmark in #201
- fix use-after-free in afp_unmount_volume by detaching after FUSE unmount by @rdmark in #202
- detect 2000s era Macs and Time Capsule machine types by @rdmark in #203
- libafpclient: detect Windows hosts by machine name by @rdmark in #210
- rebrand project to Netatalk Client by @rdmark in #223
- refactor afp_client.1 man page for clarity by @rdmark in #224
- replace commented out code with FIXMEs by @rdmark in #208
- fuse: bound client response string appends by @rdmark in #225
- bump libafpclient soversion to v1 by @rdmark in #227
- declare soversion v1 for libafpsl shared library by @rdmark in #236
- fix: add bounds check before memcpy in server.c by @orbisai0security in #233
- lib: harden AFP reply block parsing by @rdmark in #237
- handle SRP UAM login failed error by @rdmark in #238
- remove redundant afpcmd internal URL parsing self tests by @rdmark in #242
- compatibility with modern Apple AFP servers by @rdmark in #226
- route Apple xattrs through fork metadata by @rdmark in #243
- unified cleanup routine in appledouble_open to avoid memory leaks by @rdmark in #244
- fuse: harden secrets management in the client mount helper by @rdmark in #245
- introduce a global text sanitizer utility function by @rdmark in #246
- fuse: harden manager IPC validation by @rdmark in #247
- afpcmd: add per-command recursive operations by @rdmark in #248
- fuse: safe status message construction by @rdmark in #249
- full-featured logging interface over IPC for the Stateless library by @rdmark in #250
- libafpsl: add reusable metadata transfer helpers by @rdmark in #254
- bring protocol definitions up to date with AFP 3.4 by @rdmark in #256
- harden client logging format handling by @rdmark in #264
- introduce compatibility macro for unused attribute by @rdmark in #266
- bind stateless operations to authenticated sessions by @rdmark in #267
- introduce auto metadata mode that aligns with Netatalk by @rdmark in #268
- lib/afp.c: Disable TCP Nagle by @andylemin in #269
- escape control characters in afpcmd path output by @rdmark in #270
- recover afpcmd sessions after idle disconnects by @rdmark in #272
- bound xattr user prefix stripping by @rdmark in #275
- handle astyle errors granulary in codefm.sh script by @rdmark in #274
- update straggler references to the old project name by @rdmark in #276
- refactor AFP server type snapshots by @rdmark in #277
- normalize copyright headers across codebase by @rdmark in #278
- better client handling of server connection timeouts by @rdmark in #282
- restore FUSE reconnection after suspend and resume by @rdmark in #283
- afpcmd: pagination for long directory listings by @rdmark in #286
- consistent AFP nomenclature in help text and man pages by @rdmark in #284
- update changelog for v0.9.5 by @rdmark in #285
New Contributors
- @orbisai0security made their first contribution in #233
- @andylemin made their first contribution in #269
Full Changelog: 0.9.4...0.9.5
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