+#!/bin/bash
+# deny-rsync [message]: send an rsync-protocol error message
+
+protocol_version=29
+exit_code=4 # same as a daemon that refuses an option
+
+# byte_escape 29 ==> \035
+function byte_escape {
+ octbyte="000$(bc <<<"obase=8; $1")"
+ echo -n "\\${octbyte: -3}"
+}
+
+msg="$1"
+if [ "${#msg}" -gt 255 ]; then
+ # message is too long for this naive script to handle
+ msg="${msg:0:252}..."
+fi
+
+# send protocol version
+echo -ne "$(byte_escape $protocol_version)\\000\\000\\000"
+
+# send checksum seed
+echo -ne "\\000\\000\\000\\000"
+
+# the following is equivalent to rwrite(FERROR, $msg)
+# message header: length 17; MPLEX_BASE + code FERROR
+echo -ne "$(byte_escape ${#msg})\\000\\000\\010"
+# data
+echo -n "$msg"
+
+exit $exit_code