I updated all my "milter" mail filtering plugins for ACME's new OS:
The changes include conforming to the current milter API, updating the FreeBSD rc.conf startup scripts to modern standards, and a new data structure for storing IP addresses that handles IPv6.
The new data structure is actually pretty interestng. The previous version was a four-dimensional sparse array - four because IPv4 addresses have four octets. Netmasks were handled by special pointer values. Expanding that to handle IPv6's 16 octets would have meant a fourfold increase in code complexity. Instead I re-wrote it as a hash table. Handling netmasks / prefixes in a hash table was not simple, and handling prefix lengths that are not a multiple of 8 bits was an additional complication. But I managed it and it all seems to work perfectly.