Looking at the source for the FISH kioslave, it seems that FISH invokes the following commands on the zaurus:
> /file/name
echo '### 001'
This bit seems to work because the file is created, FISH then pipes the data to:
( [ "`expr %1 / 4096`" -gt 0 ] && dd bs=4096 count=`expr %1 / 4096` 2>/dev/null; [ "`expr %1 % 4096`" -gt 0 ] && dd bs=`expr %1 % 4096` count=1 2>/dev/null; ) | ( cat > /file/name || echo Error $?; cat > /dev/null )
where %1 is replaced by the size of the file in bytes. Whilst this looks horribly complicated the standard expr, dd, cat and echo commands on the Zaurus do seem to execute it OK, I tested it by feeding stdin from local file, so now I'm thinking the problem must lie somewhere in the data feed from the PC to the Zaurus.
I may give up at this point unless anyone has any other ideas.