diff options
| author | KatolaZ <katolaz@freaknet.org> | 2018-07-19 15:34:17 +0100 | 
|---|---|---|
| committer | KatolaZ <katolaz@freaknet.org> | 2018-07-19 15:34:17 +0100 | 
| commit | 464cedb474557f28b467164ae08bcb04a2d41ab3 (patch) | |
| tree | c5e581c73d28ca702308e95e61efc23b394a248d | |
| parent | 1c2336891610d7ff1077e4621e35285750d90e19 (diff) | |
added support for different netcat versions
| -rw-r--r-- | README.md | 30 | ||||
| -rwxr-xr-x | gosher | 75 | 
2 files changed, 86 insertions, 19 deletions
| @@ -9,13 +9,41 @@ You start the server using:      $ ./gosher [<PORT> [<GOPHERDIR>]  If PORT is not specified, it will bind on port 70. If GOPHERDIR is not -provided, it defaults to "./". +provided, it defaults to "./". Before starting `gosher` you might need +to modify the values of the variables `NETCAT` and `STYLE` in `gosher` +(see "Which netca?" below).  If the selector is a directory, `gosher` will look for a file named  `gophermap` to render the submenu. If a `gophermap` does not exist,  `gosher` looks for the index.gph gopherfile in the folder and, if it  exists, renders it as a gophermap. +## Which netcat? + +There are currently several different implementations of `netcat`, and +each of them works in a slightly different way and/or offers a different +set of options. For the sake of using `gosher`, the main issue is +whether your `netcat` implementation does exit or not when its standard +input gets closed.  Notably, the original `netcat` implementation by +hobbit@avian.org does **not** exit, while other common implementations +(OpenBSD `netcat`, `ncat` from the nmap project, and GNU `netcat`).  The +current version of `gosher` can work with different implementations of +`netcat`, provided that the variable `NETCAT` points to the `netcat` +version you want to use, and that the variable `STYLE` in `gosher` is set +correctly. Please check below what is the recommended combination for +your version of `netcat`: + +	+----------------+--------+ +	| netcat version | STYLE  | +	+----------------+--------+ +	|  traditional   | 'fork' | +	+----------------+--------+ +	|  OpenBSD       | 'pipe' | +	+----------------+--------+ +	|  ncat          | 'pipe' | +	+----------------+--------+ + +	  ## Why `gosher`?  Just for fun. There are only a few TCP/IP application protocols left @@ -10,9 +10,9 @@  ##  If PORT is not specified, the default is 70. If GOPHERDIR is not  ##  specified, "./" is assumed  ## -##   +##  ##  (c) 2018 Vincenzo 'KatolaZ' Nicosia <katolaz@freaknet.org> -##   +##  ##  ###################### @@ -22,25 +22,49 @@  ## server...  ## -NETCAT=netcat +## +## NETCAT: the netcat command to use, and any additional option +## +### Original netcat +##NETCAT="nc.traditional" +## +### ncat (from nmap) +##NETCAT="ncat" +## +### Openbsd netcat +NETCAT="nc.openbsd" + +## +## STYLE: The way in which netcat will talk to gosher_serve +## +### fork with "-c" (Does *not* work with OpenBSD netcat!!!!!) +#STYLE='fork' +## +### use named pipes (Does *not* work with original netcat!!!!!) +STYLE='pipe' +  OPREFIX=/tmp/outf_  IPREFIX=/tmp/inf_ -##DEBUG= -DEBUG=yes +DEBUG= +#DEBUG=yes + + +[ -n "$DEBUG" ] && { +	set -e +	set -x +}  ## function  cleanup(){ -	[ -p "${OPREFIX}$$" ] && rm -f ${OPREFIX}$$ -	[ -p "${IPREFIX}$$" ] && rm -f ${IPREFIX}$$ +	[ -n "$INF"  ] &&  [ -p "$INF"  ] && rm -f ${INF}  	exit 1 -  }  MYNAME=$(basename $0) -if [ -z "${MYNAME#gosher}" ]; then  +if [ -z "${MYNAME#gosher}" ]; then  	## we are called as gosher -- launch the server  	PORT=${1:-70} @@ -48,15 +72,23 @@ if [ -z "${MYNAME#gosher}" ]; then  	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 +	[ "$STYLE" = "pipe" ] && { +		mkfifo -m 600 $INF +		while [ 1 -eq 1 ]; do +			./gosher_serve ${GOPHERDIR} <$INF | ${NETCAT} -vvvvv -l -p ${PORT} >$INF +		done +		rm -f $INF +		exit 0 +	} +	[ "$STYLE" = 'fork' ] && { +		while [ 1 -eq 1 ]; do +			${NETCAT} -vv -l -p $PORT -c "~/gosher_serve ${GOPHERDIR}" +		done +		exit 0 +	} +	echo "Error!!! wrong STYLE specified!!!" >&2 +	exit 1  fi @@ -71,7 +103,9 @@ fi  invalid_selector(){  	sel="$1"  	echo "3Error: Invalid selector: \"$sel\"" -	echo "." +	printf ".\r\n" +	exec 1>&- +	exec 2>&-  	exit 1  } @@ -80,6 +114,9 @@ serve_selector(){  	sel="$1"  	cat "${sel}" +	echo "$0: selector $sel served -- exiting " >&2 +	exec 1>&- +	exec 2>&-  	exit 0  } @@ -104,6 +141,8 @@ serve_index(){                  esac          done < $IDX  	printf ".\r\n" +	exec 1>&- +	exec 2>&-  	exit 0  } | 
