summaryrefslogtreecommitdiff
path: root/gosher
diff options
context:
space:
mode:
Diffstat (limited to 'gosher')
-rwxr-xr-xgosher121
1 files changed, 121 insertions, 0 deletions
diff --git a/gosher b/gosher
new file mode 100755
index 0000000..23319b8
--- /dev/null
+++ b/gosher
@@ -0,0 +1,121 @@
+#!/bin/sh
+
+##
+## === gosher ===
+##
+## gosher is a simple gopher server in a POSIX shell script:
+##
+## $ ./gosher [<PORT> [<GOPHERDIR>]
+##
+## If PORT is not specified, the default is 70. If GOPHERDIR is not
+## specified, "./" is assumed
+##
+##
+## (c) 2018 Vincenzo 'KatolaZ' Nicosia <katolaz@freaknet.org>
+##
+##
+
+######################
+
+##
+## If the script is called with basename "gosher", launch the netcat
+## server...
+##
+
+MYNAME=$(basename $0)
+
+if [ -z "${MYNAME#gosher}" ]; then
+ ## we are called as gosher -- launch the server
+
+ PORT=${1:-70}
+ GOPHERDIR=${2:-"./"}
+
+ while [ 1 -eq 1 ]; do
+ netcat -vv -k -l -p ${PORT} -c "./gosher_serve ${GOPHERDIR}"
+ ret=$?
+ done
+ exit 0
+fi
+
+
+######################
+
+##
+## ...otherwise, serve a request
+##
+
+
+## function
+invalid_selector(){
+ sel="$1"
+ echo "iInvalid selector: \"$sel\""
+ echo "."
+ exit 1
+}
+
+## function
+serve_selector(){
+ sel="$1"
+
+ cat "${sel}"
+ echo "."
+ exit 0
+}
+
+
+### transform a .gph file into a gophermap
+## function
+serve_index(){
+ IDX=$1
+ IFS='
+'
+ while read line; do
+ rline=$(echo $line | sed -r -e 's/\r//g')
+ case $rline in
+ '['*)
+ echo $rline | sed -r -e 's/\[//g;s/\]//g;s/\|/\t/g;s/\t//;s/$/\r/g'
+ ;;
+ *)
+ echo $line
+ esac
+ done < $IDX
+ exit 0
+}
+
+
+
+GOPHERDIR=${1:-"./"}
+
+read selector
+
+selector=$(echo $selector | sed -r 's:\r::g' )
+
+echo "iGOPHERDIR: ${GOPHERDIR}"
+echo "iselector: \"${selector}\""
+
+case $selector in
+ /*|"")
+ RP1=$(realpath "${GOPHERDIR}"/"${selector}" || "")
+ RP2=$(realpath "${GOPHERDIR}")"${selector}"
+ echo "iRP1: ${RP1}"
+ echo "iRP2: ${RP2}"
+ #echo "."
+
+ if [ "${RP1}" = "${RP2}" ]; then
+ if [ -f "${RP1}" ]; then
+ serve_selector "${RP1}"
+ elif [ -d "${RP1}" ]; then
+ [ -f "${RP1}/gophermap" ] && serve_selector "${RP1}/gophermap"
+ [ -f "${RP1}/index.gph" ] && serve_index "${RP1}/index.gph"
+ else
+ echo "3Err Unable to find file ${selector}"
+ fi
+ fi
+ invalid_selector "$selector"
+ ;;
+ *)
+ [ -f "${GOPHERDIR}/gophermap" ] && cat "${GOPHERDIR}/gophermap" && echo "." && exit 0
+ invalid_selector "/"
+ ;;
+esac
+