I just added proper disk full checks to every (non-stdout) file write in WarpLink: https://hg.pushbx.org/ecm/warplink/rev/6fe1ccef6b07
I noticed that there were some checks already, but they only checked for ax returned as exactly zero. Turns out that this is sufficient on MS-DOS (tested current lMS-DOS, MS-DOS v5.00, and MS-DOS v7.10), as they always appear to return either the full ax equal to cx, or ax as zero if there isn't enough disk space.
The interrupt list only states that "the usual cause for AX < CX on return is a full disk", but it doesn't say that the return is never 0 < ax < cx. So that's probably why FreeDOS behaves differently.