#!/bin/sh [ $# -eq 1 ] || { echo 1>&2 "usage: socat TCP-LISTEN:44322,fork EXEC:'$0 '" 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/$$"