#!/bin/sh
[ $# -eq 1 ] || {
echo 1>&2 "usage: socat TCP-LISTEN:44322,fork EXEC:'$0 <DBFILE>'"
exit 1
}
DBFILE="$1"
touch "$DBFILE"
mkdir -p "$DBFILE.conn"
touch "$DBFILE.conn/$$"
numlines() { wc -l <"$DBFILE"; }
numbytes() { wc -c <"$DBFILE"; }
numconns() { ls "$DBFILE.conn/" | wc -l; }
cleanup() {
cd "$DBFILE.conn/"
for i in *; do
[ -e "/proc/$i" ] || rm "$i";
done
cd - >/dev/null
}
while read line; do
[ $((RANDOM % 64)) -eq 0 ] && cleanup
case "$line" in
(SEND\ *)
echo "${line##SEND\ }" >>"$DBFILE"
echo $(numlines) ;;
(SKIP\ *)
num="${line##SKIP\ }"
len=$(numlines)
slen=$((len - num))
slen=$((slen < 0 ? 0 : slen))
echo "$slen"
head -n "$len" <"$DBFILE" 2>/dev/null | tail -n "$slen"
echo "$len" ;;
(LAST\ *)
num="${line##LAST\ }"
len=$(numlines)
slen=$((len > num ? num : len))
echo "$slen"
head -n "$len" <"$DBFILE" | tail -n "$slen"
echo "$len" ;;
(POLL\ *)
len=$(($(numlines) - ${line##POLL\ }))
echo $((len < 0 ? 0 : len)) ;;
(HIST)
len=$(numlines)
echo "$len"
head -n "$len" <"$DBFILE"
echo "$len" ;;
(STAT)
echo "$(numlines) messages"
echo "$(numbytes) bytes"
echo "$(numconns) clients" ;;
(QUIT)
rm "$DBFILE.conn/$$"
exit 0 ;;
esac
done
rm "$DBFILE.conn/$$"