Small gopher client in SH
[gofetch.git] / gopher.sh
CommitLineData
0eb21b21
NR
1#!/bin/sh
2
3SERVER="$1"
4SELECTOR="$2"
5PORT="$3"
6MODE="$4"
7
8# Defaults:
9[ "$PORT" = "" ] && PORT=70
10if [ "$MODE" = "" ]; then
11 # "" or dir-like selector? -> 1 ; if not -> 0
12 echo "$SELECTOR" | grep "/$" >/dev/null && MODE=1 || MODE=0
13 [ "$SELECTOR" = "" ] && MODE=1
14fi
15
16if [ "$SERVER" = "" ]; then
17 echo "Syntax error: $0 [SERVER] ([SELECTOR]) ([PORT]) ([MODE])" >&2
18 exit 2
19fi
20
21# $0 [FILE]
22cat_menu() {
23 i=0
24 cat "$1" | grep '^[i0-9]' | while read ln; do
25 ln="`echo "$ln" | cut -f1`"
26 if echo "$ln" | grep "^i" >/dev/null 2>&1; then
27 echo "$ln" | sed "s:^.: :g"
28 elif echo "$ln" | grep "^[0-9]" >/dev/null 2>&1; then
29 i=`expr $i + 1`
30 i=`printf %2.f $i`
31 field="`echo "$ln" | cut -c1`"
32 case "$field" in
33 0) typ='TXT';;
34 1) typ='DIR';;
35 7) typ='SRH';;
36 8) typ='TEL';;
37 *) typ='???';;
38 esac
39 echo "$ln" | sed "s:^.:$typ $i :g"
40 #else
41 # Bad line
42 fi
43 done
44}
45
46# $0 [FILE]
47choices() {
48 i=0
49 cat "$1" | grep '^[0-9]' | while read choice; do
50 i=`expr $i + 1`
51 i=`printf %2.f $i`
52
53 echo "$i --> $choice"
54 done
55}
56
57# $0 [FILE] [INDEX] [FIELD]
58# Fields:
59# 1 = type/name
60# 2 = selector
61# 3 = server
62# 4 = port
63getsel() {
64 cat "$1" | grep '^[0-9]' | tail -n+"$2" | head -n 1 | cut -f"$3"
65}
66
67tmp="`mktemp gofetch.current_page.XXXXX`"
68finish() {
69 rm -rf "$tmp"
70}
71trap finish EXIT
72
73if [ $MODE = 1 ]; then
74 echo "$SELECTOR" | nc "$SERVER" "$PORT" | sed 's:\r::g' > "$tmp"
75else
76 echo "$SELECTOR" | nc "$SERVER" "$PORT" > "$tmp"
77fi
78
79case "$MODE" in
800)
81 cat "$tmp" | less
82;;
831)
84 CHOICE=start
85 while [ "$CHOICE" != "" ]; do
86 cat_menu "$tmp" | less
87 read -p "[$SELECTOR]: " CHOICE
88 index="`expr 1 \* "$CHOICE" 2>/dev/null`"
89 if [ "$index" != "" ]; then
90 goto_server="`getsel "$tmp" $index 3`"
91 goto_sel="`getsel "$tmp" $index 2`"
92 goto_port="`getsel "$tmp" $index 4`"
93 goto_mode="`getsel "$tmp" $index 1 | cut -c1`"
94 sh "$0" "$goto_server" "$goto_sel" "$goto_port" "$goto_mode"
95 fi
96 done
97;;
987)
99 read -p "Query: " SEARCH
100 selQuery="$SELECTOR $SEARCH"
101
102 exec sh "$0" "$SERVER" "$selQuery" "$PORT" 1
103;;
1048)
105 telnet -l "$SELECTOR" "$SERVER" "$PORT"
106 read DUMMY
107;;
1089)
109 echo "<BINARY FILE>" | less
110;;
111*)
112 echo "unknwon selector mode: <$MODE>" | less
113 exit 3
114;;
115esac