diff options
| author | KatolaZ <katolaz@freaknet.org> | 2018-07-13 23:14:46 +0100 | 
|---|---|---|
| committer | KatolaZ <katolaz@freaknet.org> | 2018-07-13 23:14:46 +0100 | 
| commit | ccb361e758752ccbefd7bcaaf0c99f61aae47b0d (patch) | |
| tree | 841fb8566549140d4d01e9334f5547d266a01cf8 /gprsh | |
first commit
Diffstat (limited to 'gprsh')
| -rwxr-xr-x | gprsh | 121 | 
1 files changed, 121 insertions, 0 deletions
| @@ -0,0 +1,121 @@ +#!/bin/sh + +## +##        === gprsh === +## +##  gprsh is a simple gopher server in a POSIX shell script: +## +##     $ ./gprsh [<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 "gprsh", launch the netcat +## server... +## + +MYNAME=$(basename $0) + +if [ -z "${MYNAME#gprsh}" ]; then  +	## we are called as gprsh -- launch the server + +	PORT=${1:-70} +	GOPHERDIR=${2:-"./"} +	 +	while [ 1 -eq 1 ]; do  +        	netcat -vv -k -l -p ${PORT} -c "./gprsh_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 + | 
