#!/bin/sh ## ## === gosher === ## ## gosher is a simple gopher server in a POSIX shell script: ## ## $ ./gosher [ [] ## ## If PORT is not specified, the default is 70. If GOPHERDIR is not ## specified, "./" is assumed ## ## ## (c) 2018 Vincenzo 'KatolaZ' Nicosia ## ## ###################### ## ## If the script is called with basename "gosher", launch the netcat ## server... ## NETCAT=netcat OPREFIX=/tmp/outf_ IPREFIX=/tmp/inf_ ## function cleanup(){ [ -p "${OPREFIX}$$" ] && rm -f ${OPREFIX}$$ [ -p "${IPREFIX}$$" ] && rm -f ${IPREFIX}$$ exit 1 } MYNAME=$(basename $0) if [ -z "${MYNAME#gosher}" ]; then ## we are called as gosher -- launch the server PORT=${1:-70} GOPHERDIR=${2:-"./"} trap cleanup 0 HUP INT TRAP TERM QUIT OUTF=${OPREFIX}$$ INF=${IPREFIX}$$ mkfifo -m 600 $OUTF $INF while [ 1 -eq 1 ]; do ./gosher_serve ${GOPHERDIR} <$INF >$OUTF & ${NETCAT} -vv -l -p ${PORT} >$INF <$OUTF 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' ;; t*) echo $rline | cut -c 2- ;; *) 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