X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=gopher.sh;h=56fe265365b16ec7e29ce6272f09764cdea3d22b;hb=bb019694215fbf7f676a13296707cfef20291d78;hp=d0c9ea5eae3e0d7802d47f6089609f0a67146224;hpb=c8b05198d89f026d13a577f57d2dda8cb608a3be;p=gofetch.git diff --git a/gopher.sh b/gopher.sh old mode 100644 new mode 100755 index d0c9ea5..56fe265 --- a/gopher.sh +++ b/gopher.sh @@ -1,47 +1,117 @@ #!/bin/sh -# $0 [prog ($1 will be the query)] ([port]) - -[ "$ADDR" = "" ] && ADDR=127.0.0.1 -[ "$LOG" = "" ] && LOG=/tmp/log.err -[ "$PIDF" = "" ] && PIDF="`mktemp`" -[ "$TIMEOUT" = "" ] && TIMEOUT=10 -[ "$MAXCON" = "" ] && MAXCON=1024 -prog="$1" -port="$2" -[ "$port" = "" ] && port=70 - -if [ "$prog" = "" ]; then - rm "$PIDF" - echo "Syntax: $0 [prog (\$1 will be the query)] ([port])" >&2 - exit 1 +SERVER="$1" +SELECTOR="$2" +PORT="$3" +MODE="$4" + +# Defaults: +[ "$PORT" = "" ] && PORT=70 +if [ "$MODE" = "" ]; then + # "" or dir-like selector? -> 1 ; if not -> 0 + echo "$SELECTOR" | grep "/$" >/dev/null && MODE=1 || MODE=0 + [ "$SELECTOR" = "" ] && MODE=1 fi -tmpd=`mktemp -t -d .gopher-service.XXXXXX` -if [ ! -d "$tmpd" ]; then - rm "$PIDF" - echo "Cannot create temporary directory, aborting..." >&2 +if [ "$SERVER" = "" ]; then + echo "Syntax error: $0 [SERVER] ([SELECTOR]) ([PORT]) ([MODE])" >&2 exit 2 fi -touch "$PIDF" -echo "$PIDF" - -i=0 -while [ -e "$PIDF" ]; do - i=`expr $i + 1` - [ $i -gt "$MAXCON" ] && i=1 - fifo="$tmpd/fifo.$i" - rm -f "$fifo" - mkfifo "$fifo" - < "$fifo" nc -l -q0 -w"$TIMEOUT" "$ADDR" -p "$port" | ( - read -r query - query="`echo "$query" | cut -f2 -d' '`" - ( - "$prog" "$query" 2>> "$LOG" - rm "$fifo" - )& - ) > "$fifo" -done -rm -rf "$tmpd" +LINK_COLOR=2 # can be empty for no escape sequences + +# Start and end link tags +SL= +EL= +if [ "$LINK_COLOR" != "" ]; then + SL="`tput setf $LINK_COLOR``tput setaf $LINK_COLOR`" + EL="`tput init`"; +fi + +# $0 [FILE] +# Display a gopher menu for the given resource +cat_menu() { + i=0 + cat "$1" | grep '^[i0-9]' | while read ln; do + ln="`echo "$ln" | cut -f1`" + if echo "$ln" | grep "^i" >/dev/null 2>&1; then + echo "$ln" | sed "s:^.: :g" + elif echo "$ln" | grep "^[0-9]" >/dev/null 2>&1; then + i=`expr $i + 1` + i=`printf %2.f $i` + field="`echo "$ln" | cut -c1`" + case "$field" in + 0) typ='TXT';; + 1) typ='DIR';; + 7) typ='(?)';; + 8) typ='TEL';; + *) typ='!!!';; + esac + echo "$ln" | sed "s:^.\\(.*\\):$typ $i $SL\\1$EL:g" + #else + # Bad line + fi + done +} + +# $0 [FILE] [INDEX] [FIELD] +# Get a field from the given-by-index link in FILE +# +# Fields: +# 1 = type/name +# 2 = selector +# 3 = server +# 4 = port +getsel() { + cat "$1" | grep '^[0-9]' | tail -n+"$2" | head -n 1 | cut -f"$3" +} + +tmp="`mktemp -t gofetch.current_page.XXXXXX`" +finish() { + rm -rf "$tmp" +} +trap finish EXIT + +if [ $MODE = 1 ]; then + echo "$SELECTOR" | nc "$SERVER" "$PORT" | sed 's:\r::g' > "$tmp" +else + echo "$SELECTOR" | nc "$SERVER" "$PORT" > "$tmp" +fi +case "$MODE" in +0) + cat "$tmp" | less +;; +1) + CHOICE=start + while [ "$CHOICE" != "" ]; do + cat_menu "$tmp" | less + read -p "[$SELECTOR]: " CHOICE + index="`expr 1 \* "$CHOICE" 2>/dev/null`" + if [ "$index" != "" ]; then + goto_server="`getsel "$tmp" $index 3`" + goto_sel="`getsel "$tmp" $index 2`" + goto_port="`getsel "$tmp" $index 4`" + goto_mode="`getsel "$tmp" $index 1 | cut -c1`" + sh "$0" "$goto_server" "$goto_sel" "$goto_port" "$goto_mode" + fi + done +;; +7) + read -p "Query: " SEARCH + selQuery="$SELECTOR $SEARCH" + + exec sh "$0" "$SERVER" "$selQuery" "$PORT" 1 +;; +8) + telnet -l "$SELECTOR" "$SERVER" "$PORT" + read DUMMY +;; +9) + echo "" | less +;; +*) + echo "unknwon selector mode: <$MODE>" | less + exit 3 +;; +esac