diff options
Diffstat (limited to 'gosher')
-rwxr-xr-x | gosher | 121 |
1 files changed, 121 insertions, 0 deletions
@@ -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 + |