Netatalk Changelog

Announcing Netatalk 4.6.0, Netatalk Client 1.0, and the new netatalk.io

Today we’re releasing Netatalk 4.6.0, the fastest and most capable AFP server we’ve ever shipped; Netatalk Client 1.0, our client’s first production release; and a rebuilt netatalk.io, the new home for both.

Apple is withdrawing AFP support in macOS Golden Gate. That ends an era, but not the protocol: millions of Macs and NAS devices, decades of archives, studios, labs, and retro-computing setups speak AFP every day. Our answer is to advance. This cycle modernised, hardened, and accelerated the whole stack, and for the first time Netatalk provides both sides of the connection. The server has long run almost anywhere, but mounting AFP was effectively Apple-only. With Netatalk Client 1.0 that constraint is gone: Linux, FreeBSD, NetBSD, OpenBSD, macOS, and illumos/Solaris can now all mount AFP volumes natively. AFP support isn’t just surviving Apple’s retreat — it is reaching more platforms than it ever has.

A file server rebuilt for speed

The network transport now negotiates transfer sizes as the AFP specification intends and aligns every frame to the network path and disk, so bulk transfers stream at full quantum with no wasted packets or buffers. The directory cache defaults to adaptive replacement (ARC) for 10–50% better hit ratios and now caches state, metadata, and resource-fork data, so browsing classic Mac content doesn’t touch the disk once cached. Hot paths were profiled syscall by syscall to strip redundant lookups and path walks, and background cache maintenance is now lock-free, ending latency spikes on busy and single-core systems.

The numbers: benchmarked with the project’s lantest tooling, each release in its stock configuration, 4.6.0 completes the full test set ~55% faster than 4.4.1 and ~45% faster than 4.5.1, and is 200–300% faster on the operations used most — 2.9× on bulk deletes, 2.7× on directory enumeration, 2.3× on file creation and server-side copies. All of it is on by default; every knob remains for specialists.

Strictly coherent caching, correct locking

The caching layers are now strictly coherent: every entry is validated, cross-process changes propagate immediately, and structural defects in the directory cache — some twenty years old — were found by a purpose-built attack test suite and fixed. Locking and delete semantics now match POSIX, macOS, and Samba: files viewed over AFP no longer wedge as “in use”, open forks behave like opens everywhere else, and byte-range locks land where other filesystems put them.

Netatalk alongside other accessors (Samba, NFS, etc)

That work unblocked the headline feature: Netatalk now shares volumes correctly with other protocols. What used to take several coordinated, easily mis-set options is now one switch — declare a volume multi-protocol and every coherency and locking default snaps to the safe value, whether the other accessor is Samba, NFS, or a local process; leave it off and a Netatalk-only server keeps the fast path. Option names match Samba’s, configuration parsing fails closed, and an end-to-end interoperability test — a kernel CIFS mount and a Netatalk Client mount on one shared volume — guards it in CI.

Spotlight search, feature complete

Finder search over AFP now just works: multi-word searches match every word, quoted phrases match exactly, folder-scoped searches stay in the folder, and result limits are honoured — served straight from the CNID database with no external indexer, on every supported platform. Pluggable backends remain for full-text indexing.

Modern database backends

SQLite is now the default catalog backend — zero-configuration and in-process — with MySQL/MariaDB for large or multi-server deployments. Both now distinguish contention, disk-full, and corruption instead of ending user sessions, and even 32-bit ID exhaustion recovers cleanly. The legacy Berkeley DB (dbd) scheme is deprecated and will be removed.

Security and resilience

This cycle closed more than twenty CVEs, hardened every authentication method (DHX, DHX2, SRP), and tightened wire-format parsing throughout. Even the classic AppleTalk transport was modernised — and gained its first unit tests. Every change is now gated by a continuous performance dashboard, a shaped-network test harness, thread-sanitised protocol suites, and JUnit-reported specification tests.

Netatalk Client 1.0: the other half of the connection

After more than two years and hundreds of merged changes, the Netatalk Client graduates from beta to the project’s official client:

A Linux box can serve, a BSD box can mount, and Macs old and new sit in between. AFP no longer depends on any vendor.

The new netatalk.io

The manual, wiki, release notes, security advisories, and source documentation now live on one fast, statically generated site — built from the same repositories it documents, so it can’t drift out of sync.

Thank you

This release is the work of a worldwide community that refused to let a great protocol fade away. Get Netatalk 4.6.0 and Netatalk Client 1.0 at netatalk.io.

Changes in 4.6.0

Changes in 4.5.2

Changes in 4.5.1

Changes in 4.5.0

Changes in 4.4.3

Changes in 4.4.2

Changes in 4.4.1

Changes in 4.4.0

Changes in 4.3.2

Changes in 4.3.1

Changes in 4.3.0

Changes in 4.2.4

Changes in 4.2.3

Changes in 4.2.2

Changes in 4.2.1

Changes in 4.2.0

Changes in 4.1.2

Changes in 4.1.1

Changes in 4.1.0

Changes in 4.0.8

Changes in 4.0.7

Changes in 4.0.6

Changes in 4.0.5

Changes in 4.0.4

Changes in 4.0.3

Changes in 4.0.2

Changes in 4.0.1

Changes in 4.0.0

Changes in 3.2.10

Changes in 3.2.9

Changes in 3.2.8

Changes in 3.2.7

Changes in 3.2.6

Changes in 3.2.5

Changes in 3.2.4

Changes in 3.2.3

Changes in 3.2.2

Changes in 3.2.1

Changes in 3.2.0

Changes in 3.1.19

Changes in 3.1.18

Changes in 3.1.17

Changes in 3.1.16

Changes in 3.1.15

Changes in 3.1.14

Changes in 3.1.13

Changes in 3.1.12

Changes in 3.1.11

Changes in 3.1.10

Changes in 3.1.9

Changes in 3.1.8

Changes in 3.1.7

Changes in 3.1.6

Changes in 3.1.5

Changes in 3.1.4

Changes in 3.1.3

Changes in 3.1.2

Changes in 3.1.1

Changes in 3.1.0

Changes in 3.0.9

Changes in 3.0.8

Changes in 3.0.7

Changes in 3.0.6

Changes in 3.0.5

Changes in 3.0.4

Changes in 3.0.3

Changes in 3.0.2

Changes in 3.0.1

Changes in 3.0

Changes in 3.0 beta2

Changes in 3.0 beta1

Changes in 3.0 alpha3

Changes in 3.0 alpha2

Changes in 3.0 alpha1

Changes in 2.4.10

Changes in 2.4.9

Changes in 2.4.8

Changes in 2.4.7

Changes in 2.4.6

Changes in 2.4.5

Changes in 2.4.4

Changes in 2.4.3

Changes in 2.4.2

Changes in 2.4.1

Changes in 2.4.0

Changes in 2.3.2

Changes in 2.3.1

Changes in 2.3.0

Changes in 2.2.10

Changes in 2.2.9

Changes in 2.2.8

Changes in 2.2.7

Changes in 2.2.6

Changes in 2.2.5

Changes in 2.2.4

Changes in 2.2.3

Changes in 2.2.2

Changes in 2.2.1

Changes in 2.2.0

Changes in 2.2beta4

Changes in 2.2beta3

Changes in 2.2beta2

Changes in 2.2beta1

Changes in 2.2alpha5

Changes in 2.2alpha4

Changes in 2.2alpha3

Changes in 2.2alpha2

Changes in 2.2alpha1

Changes in 2.1.6

Changes in 2.1.5

Changes in 2.1.4

Changes in 2.1.3

Changes in 2.1.2

Changes in 2.1.1

Changes in 2.1-release

Changes in 2.1-beta2

Changes in 2.1-beta1

Changes in 2.0.5

Changes in 2.0.4

Changes in 2.0.3

Changes in 2.0.2

Changes in 2.0.1

Changes in 2.0.0

Changes in 2.0-rc2

Changes in 2.0-rc1

Changes in 2.0-beta2

Changes in 2.0-beta1

Changes in 2.0-alpha2

Changes in 2.0-alpha1

Changes in 1.6.4

Changes in 1.6.3

Changes in 1.6.2

Changes in 1.6.1

Changes in 1.6.0

Changes in 1.6pre2

Changes in 1.6pre1

Changes in 1.5.5

Changes in 1.5.4

Changes in 1.5.3

Changes in 1.5.2

Changes in 1.5.1

Changes in 1.5.0

Changes in 1.5rc2

ASUN Changes

List of changes between version 1.4b2+asun and 1.5, from the historical ChangeLog file.

2003-01-16 Joe Marcus Clarke

2003-01-15 Steven N. Hirsch

2003-01-11 Steven N. Hirsch

2003-01-07 Rafal Marcin Lewczuk

2003-01-04 Joe Marcus Clarke

2002-09-26 Andrew Morgan

2002-09-24 Sebastian Rittau

2002-02-14 andy m

2002-02-09 joe c

2002-02-06 joe c

2002-02-03 andy m

2001-12-14 joe c

2001-12-10 joe c

2001-12-07 joe c

2001-12-04 joe c

2001-12-03 joe c

2001-11-27 joe c

2001-11-19 pooba53

2001-11-19 pooba53

2001-11-16 jnewman

2001-11-15 pooba53

2001-11-08 jeff b

2001-11-04 joe c

2001-10-31 Dan

2001-10-24 joe c

2001-10-23 jeff b

2001-10-21 joe c

2001-10-19 Lance Levsen

2001-10-18 joe c

2001-10-17 joe c

2001-10-16 Lance Levsen

2001-10-15 Lance Levsen

2001-10-14 Lance Levsen

2001-10-11 joe c

2001-10-10 joe c

2001-10-09 joe c

2001-10-04 jeff b

Released 1.5pre8

2001-10-03 joe c

2001-09-28 joe c

2001-09-27 joe c

2001-09-23 joe c

2001-09-22 joe c

2001-09-21 joe c

2001-09-19 joe c

2001-09-18 joe c

2001-09-17 jeff b

2001-09-14 jeff b

2001-09-13 joe c

2001-09-10 joe c

2001-09-10 jeff b

2001-09-06 jeff b

2001-09-05 joe c

2001-09-04 jeff b

2001-09-04 jeff b

2001-08-31 jeff b

2001-08-28 Lance Levsen

2001-08-27 jeff b

Released 1.5pre7

2001-08-21 jeff b

2001-08-16 Uwe Hees

2001-08-14 Sam Noble

2001-08-14 jeff b

2001-08-09 Sam Noble

2001-08-08 jeff b

2001-07-10 Lance Levsen

2001-06-30 andy m

2001-06-27 jeff b

2001-06-27 uwe hees

2001-06-26 andy m

2001-06-25 jeff b

2001-06-20 jeff b

2001-06-19 jeff b

2001-06-18 jeff b

2001-06-13 Sam Noble

2001-06-11 jeff b

2001-06-07 jeff b

2001-06-06 jeff b

2001-06-05 Dan L. (pooba53)

2001-06-04 jeff b

2001-06-01 jeff b

2001-05-25 jeff b

2001-05-22 jeff b

2001-05-09 jeff b

2001-05-08 jeff b

2001-05-07 jeff b

2001-05-03 jeff b

2001-05-01 jeff b

2001-04-25 morgan a

2001-04-24 jeff b

2001-04-20 jeff b

2001-04-16 jeff b

2001-04-12 jeff b

Released 1.5pre6

2001-04-10 jeff b

2001-04-03 jeff b

2001-04-02 jeff b

2001-03-26 jeff b

2001-03-22 Lance Levsen

2001-03-22 12:57 EST jeff b

2001-03-21 09:35 EST jeff b

2001-03-14 13:30 EST jeff b

2001-03-14 11:00 EST jeff b

2001-03-09 09:42 EST jeff b

2001-03-07 15:30 EST jeff b

Released 1.5pre5

2001-03-07 10:34 EST jeff b

2001-03-07 10:14 EST jeff b

2001-03-06 13:40 Lance Levsen

2001-03-06 11:47 Andrew Morgan

2001-02-28 15:43 Marc J. Millar

2001-02-28 jeff b

2001-02-27 jeff b

2001-02-26 jeff b

2001-02-23 jeff b

2001-02-20 jeff b

Released 1.5pre4

2001-01-02 jeff b

2000-09-22 Roland Schulz

2000-02-28 a sun

2000-02-23 a sun

2000-02-21 a sun

2000-02-17 a sun

2000-02-16 a sun

2000-02-14 a sun

2000-02-07 a sun

2000-01-25 a sun

2000-01-24 a sun

2000-01-18 a sun

2000-01-03 a sun

1999-12-27 a sun

1999-12-13 a sun

1999-12-06 a sun

1999-11-04 a sun

1999-11-02 a sun

1999-10-28 a sun

1999-10-27 a sun

1999-10-25 a sun

1999-10-21 a sun

1999-10-05 a sun

1999-09-19 a sun

1999-09-15 a sun

1999-09-09

1999-09-06 Adrian Sun

1999-08-31 Adrian Sun

1999-08-24 Adrian Sun

1999-08-13 a sun

1999-08-12 a sun

1999-08-11 a sun

1999-08-10 a sun

1999-08-08 a sun

1999-08-05 a sun

1999-08-04 Adrian Sun

1999-08-03 Adrian Sun

1999-08-02 a sun

1999-07-30 a sun

1999-07-27 a sun

1999-07-26 a sun

1999-07-18 a sun

1999-07-17 a sun

1999-07-16 a sun

1999-07-15 a sun

1999-07-11 a sun

1999-07-10 a sun

1999-07-08 a sun

1999-07-06 a sun

1999-07-05 a sun

1999-07-04 a sun

1999-07-03 a sun

1999-07-02 a sun

1999-07-01 a sun

1999-06-30 a sun

1999-06-28 a sun

1999-06-26 a sun

1999-06-23 a sun

1999-06-22 a sun

1999-06-20 a sun

(creatvol): display truncated volume name if it’s too long. * sys/{generic,solaris}/Makefile: added NO_CRYPTLIB option to deal with oses that have -lcrypt but shouldn’t use it.

1999-06-11 a sun

1999-06-10 a sun

1999-06-08 a sun

1999-06-07 a sun

1999-06-06 a sun

(afp_read): fixed the error messages here as well.

1999-06-05 a sun

1999-06-04 a sun

1999-06-03 a sun

1999-06-02 a sun

1999-05-28 a sun

1999-05-27 a sun

1999-05-26 a sun

1999-05-25 a sun

1999-05-25 a sun

1999-05-24 a sun

1999-05-22 a sun

1999-05-21 a sun

1999-05-19 a sun

1999-05-18 a sun

1999-05-16 a sun

1999-05-16 a sun

1999-05-15 a sun

(test_header): added more macbinary tests. it now has a workaround for apple’s incorrectly generated macbinary files.

1999-05-14 a sun

1999-05-12 a sun

1999-05-12 a sun

1999-05-11 a sun

1999-05-10 a sun

1999-05-09 a sun

1999-05-08 a sun

1999-05-07 a sun

1999-05-06 a sun

1999-05-04 a sun

1999-05-01 a sun

1999-04-27 a sun

(ad_fcntl_unlock): erk. fixed a typo that had the resource fork unlock accidentally getting the data fork locks.

1999-04-24 a sun

1999-04-21 a sun

1999-04-15 a sun

(afp_openfork): deal with read-only data forks that don’t have corresponding .AppleDouble files. we can’t really do anything with deny locks in this case. just make sure that read locks are set. * etc/afpd/file.c (getfilparams): oops. got the parentheses wrong around FILPBIT_FINFO. * etc/afpd/fork.c (afp_read): as we share open files now, check for fork type against of_flags instead of just checking to see if the file is open. this fixes a bug that caused resource forks to get filled with data fork information.

1999-04-09 a sun

1999-04-09 a sun

1999-04-09 a sun

1999-04-08 a sun

1999-04-03 a sun

1999-04-02 a sun

1999-03-31 a sun

1999-03-30 a sun

(ad_fcntl_lock): here are the current rules for file synchronization: 1) if there’s a appledouble header, we use the beginning of that for both data and resource forks. 2) if there isn’t, we use the end of the data fork (or past the end on 64-bit machines)

1999-03-28 a sun

1999-03-27 a sun

1999-03-22 a sun

1999-03-21 a sun

1999-03-17 a sun

1999-03-15 a sun

actually, both 64-bit machines and 32-bit machines use 0x7FFFFFFF now as i’m able to trigger a kernel oops in linux with the 64-bit code.

(afp_read/afp_write): make sure to use the same offset when doing a tmplock.

1999-03-14 a sun

1999-03-08 a sun

1999-03-06 a sun

also, i changed the default to using fcntl locks. if the above two are really necessary, i’ll probably switch to something a little more featureful like the berkeley db’s lock manager.

(note to myself: stuff new from asun2.1.3 from 1999-03-03)

1999-03-05 a sun

1999-03-03 a sun

1999-02-26 a sun

1999-02-23 a sun

1999-02-14 a sun

1999-02-07 a sun

(flushfork): make sure to flush the header if necessary (rfork length changed or modification date needs to be set).

(afp_write): ugh. this wasn’t returning the right values for the last byte written if the endflag was set. in addition, it was setting the modification date. that should be left to FPCloseFork and FPFlush(Fork). this fixes a problem that shows up with QuarkXPress.

NOTE: as of now, changes to the rfork info are the only things that aren’t flushed immediately when altered. * etc/afpd/fork.c (get/setforkparams), ofork.c: what ugliness. we need to report bitmap errors if we try to fiddle with the wrong fork. i added an of_flags field to keep things sorted. * libatalk/adouble/ad_open.c (ad_v1tov2): oops. in all of the movement, i forgot to make sure that the pre-asun2.2.0 features still compile.

1999-02-06 a sun

1999-02-05 a sun

1999-02-03 a sun

1999-02-02 a sun

1999-01-31 a sun

1999-01-30 a sun

1999-01-29 a sun

1999-01-24 a sun

1999-01-21 a sun

1999-01-20 a sun

1999-01-18 a sun

1999-01-16 a sun

1999-01-11 a sun

1999-01-10 a sun

1998-12-30 a sun

1998-12-29 a sun

1998-12-27 a sun

1998-12-21 a sun

1998-12-15 a sun

1998-12-14 a sun

1998-12-13 a sun

1998-12-11 a sun

1998-12-10 a sun

1998-12-09 a sun

1998-12-07 a sun

1998-12-05 a sun

1998-12-04 a sun

NOTE: you only should use this if you really need to do so. this and the codepage option can cause mass confusion if applied blindly to pre-existing directories.

1998-12-03 a sun

1998-12-02 a sun

1998-11-29 a sun

1998-11-24 a sun

1998-11-23 a sun

1998-11-19 a sun

1998-11-18 a sun

1998-11-17 a sun

1998-11-16 a sun

1998-11-16 a sun

1998-11-15 a sun

1998-11-13 a sun

1998-11-11 a sun

1998-11-09 a sun

1998-11-06 a sun

1998-10-30 a sun

1998-10-27 a sun

1998-10-26 a sun

1998-10-21 a sun

1998-10-19 a sun

1998-10-16 a sun

1998-10-15 a sun

1998-10-14 a sun

1998-10-10 a sun

1998-09-25 a sun

1998-09-21 a sun

1998-09-19 a sun

1998-09-18 a sun

1998-09-17 a sun

1998-09-13 a sun

1998-09-11 a sun

1998-09-03 a sun

1998-08-31 a sun

NOTE: you can’t have any spaces, and the parser forces you to include all options. in this case, there are some apple II options that need to be entered. they need to go away soon anyway. * etc/afpd/auth.c (getname): oops. i forgot to copy the gecos field into a temporary buffer before calling strtok.

1998-08-29 a sun

1998-08-28 a sun

1998-08-27 a sun

1998-08-26 a sun

1998-08-26 a sun

1998-08-25 a sun

1998-08-18 a sun

1998-08-17 a sun

1998-08-15 a sun

1998-08-13 a sun

1998-08-13 a sun

1998-08-12 a sun

1998-08-06 a sun

1998-07-23 a sun

1998-07-21 a sun

1998-07-20 a sun

1998-07-17 a sun

NOTE: quota-1.55-9 from redhat 5.x doesn’t return the correct size for rquota’s bsize. unless fixed, rquota will report incorrect values.

1998-07-08 a sun

1998-07-07 a sun

1998-07-06 a sun

1998-07-05 a sun

1998-07-04 a sun

1998-07-04 a sun

1998-06-29 a sun

1998-06-28 a sun

1998-06-19 a sun

Thu Jun 18 18:20:28 1998 a sun

Wed Jun 17 11:54:49 1998 a sun

UMICH Changes

List of changes between version 1.2 and 1.4b2, from the historical CHANGES file.

Note that the version numbers indicated in the headings are those of the prior version from which the changes were made.

Changes from the 1.4b1 release

Changes from the 1.3.3 release

Changes from the 1.3.1 release

Changes from the 1.3 release

Changes from the 1.2.1 release

Changes from the 1.2 release