~aleteoryx/ntalk

ntalk/ntalk.sh -rwxr-xr-x 1.2 KiB
69a3bf45 — glenda 9talk/motd 12 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/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/$$"