AmiBinkD 2026
From
Spitfire@64:500/1 to
All on Sunday, August 23, 2026 08:29:51
AmiBinkD v10.33 - and where it sits among the other Amiga mailers ------------------------------------------------------------------
AmiBinkD is a port of binkd to AmigaOS 3.x. It talks straight to bsdsocket.library - no ixemul, no ixnet - and runs on real 68k iron or
under emulation. BinkP/1.1, CRAM-MD5, works with any FTN-aware Amiga
BBS.
v10.33 is out. Before the release notes, a word about something that
has come up: AmiBinkD is not the only non-ixemul mailer for the Amiga,
and it was not the first. Worth setting out plainly who has done what,
because three different projects are getting talked about as if they
were the same thing.
WHAT IS ACTUALLY OUT THERE
AmiBinkd v9.02 (2014, X-TReMe BBS)
The original Amiga binkd, and the one people mean when they say
"the old AmiBinkd is buggy". Nothing to do with this project
beyond the name, which I kept because sysops already knew it.
In hindsight that has caused more confusion than it saved.
FidoBlitz (Stephen, v0.19 May 2026)
A native Amiga Binkp/1.1 mailer written in AmiBlitz3. NOT a port
of anything - it is a fresh implementation of the protocol. That
is a different kind of work from what I am doing, and a harder
one in some ways: everything binkd already solved has to be
solved again.
binkd 1.1a-115 noixemul (Ervras, Aminet June 2026)
pgul's binkd adapted to AmigaOS 3.2 without ixemul, built with
bebbo's gcc, requires 68020 or better. Ships extras I do not:
srifreq, process_tic, a nodelist compiler, decompress. His repo
dates from April 2026, so he got a non-ixemul binkd running on
the Amiga before I did. Credit where it is due.
AmiBinkD v10.x (this one)
Also pgul's binkd, also no ixemul. Two differences that matter:
* It builds for plain 68000. No 020 required, no FPU, soft-float
throughout. If you are running a stock A500 or A2000, this is
the one that will start.
* It is deliberately still binkd. 18 of binkd's 34 source files
are untouched, and protocol.c - the binkp engine, 3,769 lines
- carries exactly one Amiga-specific line. Where it does
deviate it is almost always to work around something broken in
the Amiga C library, not to change how binkd behaves.
Two people ported the same program independently without knowing it.
That is how it goes in a hobby this size. Use whichever fits your
machine.
WHAT v10.33 FIXES, AND WHY IT MATTERS TO EVERYONE HERE
For weeks this board had a rare, ugly fault: now and then a write meant
for one file turned up in another. A .bsy lock file was found holding a
line of log text. About 0.2% of log lines - rare enough to look like
cosmic rays, often enough to eventually corrupt something that matters.
Four theories were wrong before the right one. What settled it was a
test that hammered TWO files at once from several Processes. Every
earlier test used a single file and passed cleanly, because with one
file a mixed-up descriptor still resolves to that same file. Two files
and it reproduced in ten seconds: 92 of 1000 log lines lost, and lock
markers written into the log.
The cause is in libnix, not in binkd. Every descriptor comes from
___allocfd, which scans a shared global table for a free slot and grows
it with realloc(), reassigning the global pointer. Disassembling that
layer - open, close, write, read, lseek, fopen, fwrite - there is not
one Forbid/Permit, not one semaphore, nothing atomic anywhere in it.
That is fine for a normal Amiga program. It is not fine if you run more
than one Process, because on AmigaOS they share ONE address space. Two Processes calling open() at the same moment can both take the same
slot. The loser's descriptor now points at the winner's file.
READ THAT AGAIN IF YOU WRITE AMIGA SOFTWARE. It is not a binkd bug and
it is not mine. Anything multi-Process built against libnix has it,
including - I would guess, though I have not tested his build - the
other binkd port above.
v10.33 keeps the heaviest user out of that table. Log() opened and
closed the logfile for EVERY line; it now goes through dos.library
directly and never allocates a descriptor. 4,133 log lines over two
days including outbound transfers, zero corrupted. Lock files and
transfers still use the library's descriptors, so this is not a
complete fix - but those run at a tiny fraction of the frequency.
YOUR PEERS MAY HAVE YOU LOGGED UNDER THE WRONG VERSION
The version was hardcoded in three separate places: the startup line,
the shutdown line, and the VER string sent to every node you poll. Two
got updated over the years and one did not.
From v10.19 to v10.32 every node this system polled recorded it as
v10.19 - including under a release published two days ago. Nothing
local was wrong. Only the REMOTE's log showed it, which is why it went
fourteen versions without anyone noticing. Worth grepping your own
sources for duplicated version literals.
UPGRADING
On v10.23 or earlier: your outbound mail is not being delivered.
Every bundle goes out announced as 0 bytes - libnix13's fstat()
reports st_size as 0 while returning success. Sessions look
completely normal in your log. Fixed in v10.24.
On v10.19 to v10.32: see above, your peers have you as v10.19.
AmiBinkD10_33.lha is in the file area, and on GitHub at
github.com/SpitfireTN/AmiBinkD
Nothing ships until it has run on the board for a day or more. A fix
that has not survived a real night of traffic is a guess.
Reign of Fire BBS - call.rofbbs.com - telnet 6800 / ssh call@
* ACIS Member. AmigaNet ArakNet C=Net DescipleNet FidoNet PiNet RetroNet
* C-Net/5
* Origin: call.rofbbs.com : 6800 6400 8502 : 423-541-8271 : rofbbs.com (64:500/1)
From
Spitfire@64:500/1 to
All on Monday, August 24, 2026 07:16:06
AmiBinkD v10.34 - correct identification, correct clock ------------------------------------------------------------------
AmiBinkD is a port of binkd to AmigaOS 3.x. It talks straight to bsdsocket.library - no ixemul, no ixnet - and runs on real 68k iron or
under emulation. BinkP/1.1, CRAM-MD5, works with any FTN-aware Amiga
BBS.
v10.34 is a small release with no protocol or transfer changes. It
fixes two things AmiBinkD has been telling you wrong since the
beginning, both of them visible to every node it talks to.
IT NOW SAYS WHAT IT IS AND WHAT IT RUNS ON
Every mailer identifies itself during the handshake. Here is what
arrives at my board from elsewhere:
binkd/1.1a-115/Linux binkp/1.1
Mystic/1.12A49 binkp/1.0
Mailer, version, operating system, then protocol. Through v10.33
AmiBinkD sent this:
AmiBinkD v10.33-binkp/1.1
No operating system named, a space where the convention uses a slash,
and the protocol token stuck on with a hyphen. binkd's own parser
searches for "binkp/" so it always worked, but a stricter one could
read "v10.33-binkp/1.1" as a single token, and nothing told the
remote sysop what the mailer was running on.
It now sends:
AmiBinkD/10.34/Amiga binkp/1.1
Every other mailer reports its platform. There is no good reason an
Amiga should be the one that stays quiet about it.
Related: the version number now has ONE definition in the source.
v10.33 had already collapsed three hardcoded copies into one after a
drift left the handshake reporting v10.19 for fourteen releases. This
finishes that job.
IT NOW KNOWS WHAT TIME ZONE IT IS IN
The handshake also carries your local time and UTC offset. AmiBinkD
was sending the right wall-clock time with "+0000" attached - telling
every node it polled that it sat on the Greenwich meridian, wherever
in the world it actually was. Anyone computing my real UTC time from
that was four hours out.
binkd normally works the offset out by comparing gmtime() against
localtime(). That cannot work here. AmigaOS has no timezone database,
and the C runtime's localtime() is literally gmtime(t - __timezone)
with __timezone never set - I disassembled it to be sure. The two
agree exactly, so the difference comes out as zero. It was never a configuration mistake; the generic method simply cannot work on this
platform.
AmiBinkD now asks locale.library, which is where AmigaOS actually
keeps the answer - the zone you set in Prefs/Locale, the same value
every other localised program reads. Nothing to configure, and it is
correct in any country.
Two things to know:
If your offset still shows +0000, open Prefs/Locale, set your time
zone, and press SAVE (not Use - Use only writes to ENV:, which is
RAM). An Amiga that has never saved Locale prefs reports a GMT
offset of zero, and AmiBinkD cannot tell that apart from a system
genuinely running on GMT.
Daylight saving is manual. AmigaOS has no concept of it anywhere -
loc_Flags is documented "always 0 for now" and the autodocs never
mention it. Locale holds STANDARD time, so in a summer-time region
the reported offset is an hour out for half the year. Either pick
the zone entry one hour off during summer, or set "tzoff" in your
config, which overrides Locale entirely - "tzoff -4h" here in
summer, "-5h" in winter. The second is tidier; it leaves the
system-wide Locale setting alone for everything else on the machine.
ABOUT IPv6 - SO NOBODY IS MISLED
AmiBinkD is IPv4 only, and I want to be plain about it rather than
let it be discovered.
This is not a missing build option. The AmigaOS TCP/IP API has no
IPv6 in it at all. Roadshow's sys/socket.h - the official AmigaOS 3.2 networking headers - defines 26 address families, ending at AF_SIP 24
and AF_MAX 26. There is no AF_INET6, no sockaddr_in6, no in6_addr
anywhere in the netinclude tree. AmiTCP and Miami are IPv4 only as
well. Upstream binkd speaks IPv6 on the PC because the host stack
hands it AF_INET6 sockets; the Amiga has none to hand over, so every
IPv6 branch in binkd's sources compiles out on this platform.
There is no Amiga TCP stack you could swap in to change this.
If you want IPv6 callers to reach your board, put a small v6-to-v4
relay in front of the BinkP port on a machine that does have IPv6 -
the host, if you run under emulation, or a router or second box in
front of real hardware. One socat process is enough:
socat TCP6-LISTEN:24554,ipv6only=1,fork,reuseaddr TCP4:127.0.0.1:24554
Verified here: an IPv6 caller completes the full BinkP greeting and
session through it. One caveat - the relay is what connects to
AmiBinkD, so your log records IPv6 callers as coming from 127.0.0.1.
Do not use address-based node restrictions on a port reached that
way. CRAM-MD5 password authentication is unaffected and remains the
real access control. Run the relay with logging on (socat's -d -d) if
you want the real peer address recorded somewhere.
UPGRADING
Drop in the new binary. No config changes are required and nothing
in the protocol or transfer path changed - if v10.33 was working for
you, v10.34 behaves identically on the wire apart from the two
strings above.
The one thing worth doing afterwards is checking your own greeting,
since that is what this release is about. Prefs/Locale first if your
offset reads +0000.
Reign of Fire BBS - rofbbs.com - call.rofbbs.com
* ACIS Member. AmigaNet ArakNet C=Net DescipleNet FidoNet PiNet RetroNet
* C-Net/5
* Origin: call.rofbbs.com : 6800 6400 8502 : 423-541-8271 : rofbbs.com (64:500/1)