summaryrefslogtreecommitdiff
path: root/README.md
blob: 2518c6e4a39a7fc78d9a6eea92c2d9aa3f50b085 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
## gosher -- A simple Gopher server in a POSIX shell script


`gosher` is a Gopher server in a POSIX shell script. It requires only a
standard `netcat(1)`. 

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 "./". Before starting `gosher` you might need
to modify the values of the variables `NETCAT` and `STYLE` in `gosher`
(see "Which netcat?" 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`)
normally do.  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. In particular, `STYLE` can pe set equal to
either 'pipe' or 'fork'. Please check below what is the recommended
combination for your version of `netcat`:

	+----------------+--------------+--------------+
	| netcat version | STYLE='fork' | STYLE='pipe' |
	+----------------+--------------+--------------+
	|  traditional   |      YES     |      NO      |
	+----------------+--------------+--------------+
	|  OpenBSD       |      NO      |      YES     |
	+----------------+--------------+--------------+
	|  ncat          |      YES     |      YES     |
	+----------------+--------------+--------------+

**N.B.: Using STYLE='pipe' is preferable, since the '-c' option used by
the 'fork' mode is a potential security risk**

## Why `gosher`?

Just for fun. There are only a few TCP/IP application protocols left
that can be implemented in a few dozen lines of POSIX shell script, and
Gopher (RFC 1436) is one of those. 

## Why calling it `gosher`?

Well, `gosher` is just `gopher` where the `p` is replaced with an `s`,
and `sh(1)` is all that you need to run `gosher` (if we leave
`netcat(1)` out...).

Also, `gopher` is probably one of the few `kosher` protocols out there.

According to the Urban Dictionary, `gosher` is "an insult that can mean
anything", so choose your own.