geomyidae

A small C-based gopherd. (gopher://bitreich.org/1/scm/geomyidae)
git clone git://r-36.net/geomyidae
Log | Files | Refs | README | LICENSE

geomyidae.8 (17814B)


      1 .\" geomyidae.8 handcrafted in GNU groff -mdoc using nvi
      2 .\"
      3 .Dd January 4, 2025
      4 .Dt GEOMYIDAE 8
      5 .Os
      6 .
      7 .Sh NAME
      8 .Nm geomyidae
      9 .Nd a gopher daemon for Linux/BSD
     10 .
     11 .Sh SYNOPSIS
     12 .Nm
     13 .Bk -words
     14 .Op Fl 4
     15 .Op Fl 6
     16 .Op Fl c
     17 .Op Fl d
     18 .Op Fl e
     19 .Op Fl n
     20 .Op Fl s
     21 .Op Fl y
     22 .Op Fl l Ar logfile
     23 .Op Fl v Ar loglevel
     24 .Op Fl b Ar base
     25 .Op Fl p Ar port
     26 .Op Fl o Ar sport
     27 .Op Fl u Ar user
     28 .Op Fl g Ar group
     29 .Op Fl h Ar host
     30 .Op Fl i Ar interface ...
     31 .Op Fl t Ar keyfile certfile
     32 .Ek
     33 .
     34 .Sh DESCRIPTION
     35 .Nm
     36 is a daemon for serving the protocol specified in
     37 .Em RFC 1436
     38 (Gopher). Under 1000 lines of C by design, it is lightweight yet supports
     39 dynamic content, automatic file/directory indexing, logging and privilege
     40 separation.
     41 .
     42 .Sh IMPLEMENTATION
     43 Installation is straightforward: grab the zipped tar file, expand it in
     44 an appropriate temp directory, change to the
     45 .Qq Pa "../geomyidae-x.xx"
     46 directory, tweak the Makefile if desired (installs in
     47 .Qq Pa "/usr/bin"
     48 by default), then run the
     49 .Qq Ql "make ; make install"
     50 commands.
     51 The resulting executable should be run by root.
     52 .
     53 .Ss Basic Installation and Startup
     54 .Bd -literal -offset indent
     55 $ wget ftp://bitreich.org/releases/geomyidae/geomyidae-$VERSION.tar.lz
     56 $ lzip -d geomyidae-$VERSION.tar.lz
     57 $ tar -xvf geomyidae-*.tar
     58 $ cd geomyidae-*
     59 $ make; sudo make install
     60 $ sudo mkdir -p /var/gopher
     61 $ sudo cp index.gph /var/gopher
     62 $ sudo geomyidae -l /var/log/geomyidae.log -b /var/gopher -p 70
     63 $ tail -f /var/log/geomyidae.log
     64 .Ed
     65 .
     66 .Pp
     67 Use whatever gopher client you like (ie. sacc) to browse:
     68 .Bd -literal -offset indent
     69 $ sacc gopher://localhost
     70 .Ed
     71 .
     72 .Ss Running
     73 .Nm
     74 should normally be started by root, although it can be started
     75 by a regular user provided that the base directory and its contents are owned
     76 by the same user.
     77 .Nm
     78 will only serve content within the base directory
     79 tree and will drop privileges to the
     80 .Fl u Ar user
     81 and
     82 .Fl g Ar group
     83 values if set.
     84 See
     85 .Sx OPTIONS
     86 below for specifics.
     87 Launching
     88 .Nm
     89 automatically is best done via a UNIX
     90 run-time (rc.d) script; several sample rc.d scripts are included in the
     91 .Nm
     92 source archive.
     93 Logging in
     94 .Nm
     95 can be done through either logfiles or syslog.
     96 .
     97 .Sh OPTIONS
     98 .Nm
     99 options and default settings:
    100 .Bl -tag -width Ds
    101 .
    102 .It Fl 4
    103 Only use IPv4.
    104 .
    105 .It Fl 6
    106 Only use IPv6.
    107 .
    108 .It Fl c
    109 Use
    110 .Xr chroot 2
    111 for the
    112 .Ar base
    113 directory (by default off).
    114 .
    115 .It Fl d
    116 Don't fork into background.
    117 If no
    118 .Ar logfile
    119 is given, this implies logging to the standard output.
    120 .
    121 .It Fl e
    122 Disable execution of any CGI or DCGI script.
    123 .
    124 .It Fl n
    125 Perform reverse lookups.
    126 .
    127 .It Fl s
    128 Log using syslog for logging.
    129 .
    130 .It Fl y
    131 Enable HAProxy support.
    132 .
    133 .It Fl l Ar logfile
    134 Specify file where log output is written (no default).
    135 .
    136 .It Fl v Ar loglevel
    137 Set the logging level (default: 47).
    138 Loglevels:
    139 .Bl -tag -width "XX" -compact
    140 .It Cm 0
    141 no logging
    142 .It Cm 1
    143 served plain files
    144 .It Cm 2
    145 directory listings
    146 .It Cm 4
    147 HTTP redirects
    148 .It Cm 8
    149 errors (e.g., not found)
    150 .It Cm 16
    151 client connections
    152 .It Cm 32
    153 gopher+ redirects
    154 .El
    155 .Pp
    156 E.g.:
    157 .Bd -literal -offset indent
    158 1 + 2 + 4 + 8 + 32 = 47
    159 (files + directories + HTTP + errors + gopher+)
    160 .Ed
    161 .
    162 .It Fl b Ar base
    163 Root directory to serve
    164 .Po
    165 default:
    166 .Pa /var/gopher
    167 .Pc .
    168 .
    169 .It Fl p Ar port
    170 Port
    171 .Nm
    172 should listen on (default: 70).
    173 .
    174 .It Fl o Ar sport
    175 Port
    176 .Nm
    177 displays within base directory (default: 70).
    178 Use in conjunction with
    179 .Ic -p
    180 for obfuscating actual port
    181 .Nm
    182 is running on.
    183 .
    184 .It Fl u Ar user
    185 Sets the user to which privileges drop when
    186 .Nm
    187 is ready to accept network connections (default: user
    188 .Nm
    189 runs as).
    190 Helps improve security by reducing privileges during request
    191 processing.
    192 .
    193 .It Fl g Ar group
    194 Sets the group to which privileges drop when
    195 .Nm
    196 is ready to accept network connections (default: group
    197 .Nm
    198 runs as).
    199 Helps improve security by reducing privileges during request
    200 processing.
    201 .
    202 .It Fl h Ar host
    203 Host to use in directory listings (default: localhost).
    204 .
    205 .It Fl i Ar interface
    206 Defines the interface to which
    207 .Nm
    208 binds to
    209 .Po
    210 default:
    211 .Cm 0.0.0.0
    212 .Pc .
    213 Multiple interfaces can be given.
    214 .
    215 .It Fl t Ar keyfile certfile
    216 Activate gopher TLS and use the private key
    217 .Ar keyfile
    218 and the public key
    219 .Ar certfile
    220 for TLS connections (if the feature is compiled in.) See
    221 .Sx ENCRYPTION ONLY
    222 support below.
    223 .El
    224 .
    225 .Sh FORMATTING
    226 Structured Gopher space(s) can be created with
    227 .Nm
    228 through the use of special indexing files of the form
    229 .Pa <name>.gph
    230 which, if present,
    231 .Nm
    232 uses to format and/or filter the contents of the base directory
    233 .Po
    234 .Pa /var/gopher
    235 by default
    236 .Pc
    237 and create gopher menus.
    238 However, index files are
    239 .Em not
    240 required: if no
    241 .Pa index.gph ,
    242 .Pa index.cgi
    243 or
    244 .Pa index.dcgi
    245 file is found,
    246 .Nm
    247 simply lists the directory contents in alphanumeric order.
    248 In addition, a directory can utilize
    249 multiple index files to create a layered gopher environment without the
    250 use of sub-directories: ie.
    251 .Pa pictures.gph ,
    252 .Pa music.gph
    253 and
    254 .Pa documents.gph
    255 could be "directories" within
    256 .Pa main.gph ,
    257 yet all reside in
    258 .Pa /var/gopher
    259 along with their respective files (*.jpg, *.mp3, *.pdf for example).
    260 .
    261 .Ss Anatomy of an index.gph file
    262 A gph file consists of informational text and links.
    263 A link has the form:
    264 .Pp
    265 .Dl [ Ar <type> Ns | Ns Ar <desc> Ns | Ns Ar <path> Ns | Ns Ar <host> Ns | Ns Ar <port> ]
    266 .Pp
    267 where,
    268 .Bl -tag -width "<XXXX>"
    269 .It Ar <type>
    270 A valid gopher Item Type.
    271 .Pp
    272 Some common Gopher Types as defined in
    273 .Em RFC 1436 :
    274 .
    275 .Bl -tag -width "XX" -compact
    276 .It Cm 0
    277 Item is a file.
    278 .It Cm 1
    279 Gopher directory.
    280 .It Cm 3
    281 Error.
    282 .It Cm 7
    283 Item is an Index-Search server.
    284 .It Cm 8
    285 Item points to a text-based telnet session.
    286 .It Cm 9
    287 Binary file.
    288 Client reads until TCP connection closes!
    289 .It Cm g
    290 GIF format graphics file.
    291 .It Cm I
    292 Indeterminate image file.
    293 Client decides how to display.
    294 .El
    295 .Pp
    296 In addition,
    297 .Nm
    298 provides these:
    299 .Bl -tag -width "XX" -compact
    300 .It Cm h
    301 Item is a hypertext (HTTP) link.
    302 .It Cm i
    303 Informational Item (used for descriptive purposes).
    304 .El
    305 .Pp
    306 Unknown file types default to Type
    307 .Qq Cm "9"
    308 (binary).
    309 .
    310 .It Ar <desc>
    311 Description of gopher item.
    312 Most printable characters should work.
    313 .
    314 .It Ar <path>
    315 Full or relative path to gopher item (base value is
    316 .Qq Pa "/" ) .
    317 Use the
    318 .Qq Pa "Err"
    319 path for items not intended to be served.
    320 .
    321 .It Ar <host>
    322 Hostname or IP hosting the gopher item.
    323 Must be resolvable for the intended clients.
    324 If this is set to
    325 .Qq Cm "server" ,
    326 the server's hostname is used.
    327 .
    328 .It Ar <port>
    329 TCP port number (usually 70).
    330 If this is set to
    331 .Qq Cm "port" ,
    332 the default port of the server is used.
    333 .El
    334 .
    335 .Pp
    336 Note:
    337 .Nm
    338 doesn't require "informational" text to be formally typed as
    339 .Ql "[i|...]" ;
    340 any line
    341 .Em not
    342 beginning with
    343 .Ql "\(lB"
    344 is treated as informational, greatly simplifying the formatting of
    345 .Pa index.gph
    346 files.
    347 If you want to display some informational text beginning with
    348 .Ql "\(lB"
    349 you can use the special case of an empty item type.
    350 .Ql "[|[some link"
    351 will be shortened to
    352 .Ql "[some link" .
    353 For dynamically generated content it may be desirable to either formally type
    354 informational text or run it through a filter to prepend
    355 .Ql "[|"
    356 - \.ie
    357 .Ql "sed 's,^[,[|&,'" .
    358 .Pp
    359 Note 2: You can escape a pipe
    360 .Pq Ql "\(ba"
    361 character in for example a
    362 .Cm <desc>
    363 field by prepending a slash ("\\").
    364 .Pp
    365 Note 3: The gph parser is very forgiving.
    366 If the link structure is not parsed correctly, then the original line is printed.
    367 .
    368 .Ss index.gph Example
    369 A
    370 .Pa root.gph
    371 file for a server running on
    372 .Ql host=frog.bog ,
    373 .Ql port=70 .
    374 Note use of optional [i]nformational Item (line 2) for vertical space insertion:
    375 .Bd -literal -offset indent
    376 Welcome to Frog.bog
    377 [i||Err||]
    378 [0|About this server|about.txt|frog.bog|70]
    379 [0|Daily Log|/dtail.cgi|frog.bog|70]
    380 [1|Phlog: like a blog, but not|/PHLOG|frog.bog|70]
    381 [9|Some binary file|widget.exe|frog.bog|70]
    382 [I|Snowflake picture|snowflake.jpg|frog.bog|70]
    383 try our snowflakes!
    384 
    385 Links and Searches
    386 [1|Go to R-36.net|/|gopher.r-36.net|70]
    387 [h|Go to NetBSD.org|URL:http://netbsd.org|frog.bog|70]
    388 [7|Query US Weather by Zipcode|/weather.cgi?|frog.bog|70]
    389 [7|Search Veronica II|/v2/vs|gopher.floodgap.com|70]
    390 [8|Telnet to SDF Public Access Unix System|null|freeshell.org|23]
    391 .Ed
    392 .
    393 .Pp
    394 The above looks something like this in a text-based gopher client:
    395 .Bd -filled -offset indent
    396 .Bl -tag -width "(XXXXX)" -compact
    397 .It Sy Welcome to Frog.bog
    398 .Pp
    399 .It Sy (FILE)
    400 About this server
    401 .It Sy (FILE)
    402 Daily Log
    403 .It Sy (DIR)
    404 Phlog: like a blog, but not
    405 .It Sy (BIN)
    406 Some binary file
    407 .It Sy (IMG)
    408 Snowflake picture
    409 .El
    410 .Pp
    411 try our snowflakes!
    412 .Pp
    413 .Bl -tag -width "(XXXXX)" -compact
    414 .It Sy Links and Searches
    415 .It Sy (DIR)
    416 Go to R-36.net
    417 .It Sy (HTML)
    418 Go to NetBSD.org
    419 .It Sy (?)
    420 Query US Weather by Zipcode
    421 .It Sy (?)
    422 Search Veronica II
    423 .It Sy (TEL)
    424 Telnet to SDF Public Access Unix System
    425 .El
    426 .Ed
    427 .Sh DYNAMIC CONTENT (gopher CGI)
    428 There are two options provided for dynamic content creation and a special
    429 case: standard CGI
    430 .Pq Pa ".cgi" ,
    431 dynamic CGI
    432 .Pq Pa ".dcgi" ,
    433 and HTTP compatibility mode.
    434 Despite the names, all three can accept input and generate dynamic content;
    435 the only difference is that dcgi re-formats it's output so it appears to
    436 the server as a standard
    437 .Nm
    438 index
    439 .Pq Pa ".gph"
    440 file.
    441 This makes the creation of on-the-fly gopher directories much easier (see examples).
    442 All scripts must be under the gopher root directory and be executable by the same
    443 .Ar "user:group"
    444 running
    445 .Nm .
    446 Consequently, it is best to use the
    447 .Fl u
    448 and
    449 .Fl g
    450 server options to avoid running as root.
    451 .Pp
    452 Executed scripts get the full I/O of the socket bound to stdin and stdout.
    453 You are thus able to write long-lasting streaming services.
    454 Radio or TV stations over gopher are possible that way.
    455 .Pp
    456 Both
    457 .Pa ".cgi"
    458 and
    459 .Pa ".dcgi"
    460 scripts have the same argument call structure (as seen by
    461 .Nm ) :
    462 .Pp
    463 .Dl Ic executable.[d]cgi Ar search Ar arguments Ar host Ar port Ar traversal Ar selector
    464 .Pp
    465 where:
    466 .Bl -tag -width "XXXXXXXXX" -compact
    467 .It Ar search
    468 Query string (type 7) or "" (type 0).
    469 .It Ar arguments
    470 String behind "?" in selector or "".
    471 .It Ar host
    472 Server's hostname ("localhost" by default).
    473 .It Ar port
    474 Server's port ("70" by default).
    475 .It Ar traversal
    476 Remaining path from path traversal in REST case.
    477 .It Ar selector
    478 Raw selector or full req (See HTTP compatibility mode.)
    479 .El
    480 .Pp
    481 All terms are tab-separated (per gopher protocol) which can cause some
    482 surprises depending on how a script is written.
    483 See the CGI file (included in the
    484 .Nm
    485 source archive) for further elaboration.
    486 .Pp
    487 For a special REST path case for the arguments, see the CGI file for the
    488 description.
    489 .Pp
    490 QUIRK: The original gopher client tried to be too intelligent.
    491 It is using gopher+ when you request some resource.
    492 When "search" is just the value "+", "!", "$" or empty,
    493 .Nm
    494 will display a gopher+ redirect instead of invoking the script.
    495 Be careful to design your search script so the user is unlikely to enter those values.
    496 The designers of gopher+ did not think of classic gopher to survive.
    497 It survived gopher+.
    498 .Pp
    499 Additionally to the above arguments several environment variables are set.
    500 Only the programmatically relevant variables are listed here.
    501 For further information, see ind.c:setcgienviron() in the geomyidae
    502 source code.
    503 .Bl -tag -width "REMOTE_ADDR , REMOTE_HOST" -compact
    504 .It Ev PATH_INFO
    505 Traversal (See above.)
    506 .It Ev PATH_TRANSLATED
    507 Absolute path to script.
    508 .It Ev QUERY_STRING
    509 Arguments (See above.)
    510 .It Ev REMOTE_ADDR , REMOTE_HOST
    511 IP of the client
    512 .It Ev SCRIPT_NAME
    513 Script which is executed.
    514 .It Ev SERVER_NAME
    515 Server's hostname.
    516 .It Ev SERVER_PORT
    517 Server's port.
    518 .It Ev GOPHER_SELECTOR
    519 Raw gopher selector
    520 .It Ev GOPHER_REQUEST
    521 Raw gopher selector
    522 .It Ev GOPHER_SEARCH
    523 Search (See above.)
    524 .It Ev GOPHER_SCRIPT_FILENAME
    525 Absolute path with script which is executed.
    526 .It Ev GOPHER_DOCUMENT_ROOT
    527 Base root for serving files.
    528 .It Ev SERVER_LISTEN_NAME
    529 Ip the server received the connection on.
    530 .It Ev HTTPS , GOPHERS
    531 Set, if TLS is used.
    532 .El
    533 .
    534 .Ss The REST path handling
    535 If a client requests a path in a selector, which has no corresponding
    536 file or path found,
    537 .Nm
    538 will try to traverse from the
    539 .Fl b Ar base
    540 path until a path component / directory is not found.
    541 Then
    542 .Nm
    543 tries to find some index.dcgi or index.cgi file in the last existing directory.
    544 If this is found and the index files are executable,
    545 .Nm
    546 will execute them using the traversal and
    547 .Ev PATH_INFO
    548 parameter and environment variable being set to the rest path.
    549 .Bd -literal -offset indent
    550 Selector: /some/v1/service/add/something?args=value
    551 -> /some/v1/service exists
    552 -> /some/v1/service/index.dcgi exists
    553 -> /some/v1/service/index.dcgi "" "args=value" $host $port
    554 "/add/something" "/some/v1/service/add/something?args=value" is called
    555 .Ed
    556 .
    557 .Ss HTTP compatibility
    558 For maximum flexibility in case someone sends a HTTP request to gopher,
    559 .Nm
    560 supports a special case of CGI.
    561 See this example:
    562 .Bd -literal -offset indent
    563 Client request: GET /some/path HTTP/1.1
    564 -> /GET exists and is executable
    565 -> /GET "" "" $host $port "" "GET /some/path HTTP/1.1" is called
    566 .Ed
    567 .Pp
    568 This allows for example simple scripts for icecast upload compatibility
    569 or handling transparent HTTP right next to gopher, getting TLS for free.
    570 .
    571 .Ss Some CGI Examples
    572 Note: these are a very simple examples with no fitness checks with respect
    573 to safety/security.
    574 .Pp
    575 ex.
    576 .Pa uptime.cgi - standard CGI, no queries
    577 .
    578 .Bd -literal -offset indent
    579 #!/bin/sh
    580 #  uptime.cgi - prints system uptime(1)
    581 /usr/bin/uptime
    582 exit 0
    583 .Ed
    584 .
    585 .Pp
    586 Call the above with the following index.gph entry:
    587 .Pp
    588 .Dl [0|System Uptime|/uptime.cgi|frog.bog|70]
    589 .Pp
    590 A search query request must have an item Type of
    591 .Qq Cm "7"
    592 to be called from an
    593 .Pq index.gph
    594 file.
    595 It also needs a
    596 .Qq Cm "?\&"
    597 suffix in the
    598 .Ar <path>
    599 field:
    600 .Pp
    601 ex.
    602 .Pa hello.cgi - standard CGI with query
    603 .
    604 .Bd -literal -offset indent
    605 #!/bin/sh
    606 #  hello.cgi - welcome user
    607 NAME=$1
    608 HOSTNAME=$2
    609 echo ""
    610 echo Hello $NAME - welcome to $HOSTNAME
    611 exit 0
    612 .Ed
    613 .
    614 .Pp
    615 Call the above with the following index.gph entry:
    616 .Bd -literal -offset indent
    617 [7|Hello You - Please enter your name|/hello.cgi?FROG.bog|frog.bog|70]
    618 .Ed
    619 .
    620 .Pp
    621 And do a simple
    622 .Xr snarf 1
    623 query (note the inserted TAB):
    624 .Bd -literal -offset indent
    625 % snarf "gopher://frog.bog/7/hello.cgi?FROG.bog[TAB]Christoph" -
    626 Hello Christoph - welcome to FROG.bog
    627 .Ed
    628 .
    629 .Pp
    630 Dynamic CGI entries are similar to above except that the script
    631 needs to create output as described in the
    632 .Sx FORMATTING
    633 section:
    634 .Pp
    635 ex.
    636 .Pa jughead.dcgi - dynamic CGI script with query
    637 .
    638 .Bd -literal -offset indent
    639 #!/bin/sh
    640 # jughead.dcgi - jughead-like local gopher search
    641 KWRD="$1"
    642 ARCHIVE="/var/gopher/textfiles/"
    643 echo "[i|Search results for \\"${KWRD}\\":|Err||]"
    644 echo "[i||Err||]"
    645 # grep(1) recursive, case-insensitive KWRD search of ARCHIVE:
    646 for RESULT in $(/usr/bin/grep -i -l -m1 ${KWRD} -r $ARCHIVE)
    647 do
    648         DESC=$(/usr/bin/basename ${RESULT})
    649         PATH=$(echo "$RESULT" | /usr/bin/sed 's/^\\/var\\/gopher//')
    650         echo "[0|${DESC}|${PATH}|frog.bog|70]"
    651 done
    652 exit 0
    653 .Ed
    654 .
    655 .Pp
    656 Call the above with the following index.gph entry:
    657 .Pp
    658 .Dl [7|Search this Gopher|/jughead.dcgi?|frog.bog|70]
    659 .Pp
    660 A successful query might look like this:
    661 .Bd -filled -offset indent
    662 Search results for
    663 .Qq fubar :
    664 .Pp
    665 .Bl -tag -width "(XXXX)" -compact
    666 .It Sy (FILE)
    667 How_Things_Break.txt
    668 .It Sy (FILE)
    669 Origins_of_Words.txt
    670 .It Sy (FILE)
    671 Phrases_of_the_Ages.txt
    672 .El
    673 .Ed
    674 .
    675 .Pp
    676 Care should to be exercised to avoid creating mistyped entries, unwanted
    677 recursions, and/or unintended writes in the working directory.
    678 .Sh HAPROXY SUPPORT
    679 .Nm
    680 has
    681 .Em HAProxy
    682 support.
    683 It can be enabled using the
    684 .Fl y
    685 parameter.
    686 .
    687 .Sh LOG FILES
    688 The log file (ie. /var/log/gopherd.log) has the following structure:
    689 .Dl [ Ns Ar <date> Ns | Ns Ar <IP/Host> Ns | Ns Ar <port> Ns | Ns Ar <status> Ns ] Ar  <item path>
    690 .
    691 .Pp
    692 where,
    693 .Bl -tag -width "<XXXX XXXX>"
    694 .It Ar <date>
    695 Access date and time (std 'date' format).
    696 .br
    697 ex.
    698 .Qq Cm "2018-01-31 14:18:34 +0000"
    699 .It Ar <IP/Host>
    700 Client IP/Host served
    701 .br
    702 ex.
    703 .Qq Cm "104.23.33.1"
    704 .It Ar <port>
    705 Client port served
    706 .br
    707 ex.
    708 .Qq Cm "16857"
    709 .It Ar <status>
    710 Status of client request
    711 .br
    712 ex. - some common status entries:
    713 .Bl -tag -width "XXXX XXXXXXXX" -compact
    714 .It Qq Cm serving
    715 A successful request.
    716 .It Qq Cm not found
    717 An unsuccessful request.
    718 .It Qq Cm HTTP redirect
    719 Web link redirect (Type h).
    720 .It Qq Cm dir listing
    721 Unindexed directory listing.
    722 .El
    723 .It Ar <item path>
    724 Full path to item served
    725 .br
    726 ex.
    727 .Qq Pa "/PICS/simple2.jpg"
    728 for an image file;
    729 .Qq Pa "/PICS"
    730 for a directory access.
    731 .El
    732 .
    733 .Sh ENCRYPTION ONLY
    734 If you set the sticky bit
    735 .Pq Ql "chmod +t"
    736 on some file or directory,
    737 .Nm
    738 will only serve it over an encrypted connection.
    739 There is the special case, that when the sticky bit is set on the
    740 .Ar base
    741 directory, all content will only be served over TLS.
    742 .
    743 .Sh FILES
    744 .Pa README , LICENSE , CGI , index.gph , rc.d/ , LINKS , gph/
    745 .
    746 .Sh SEE ALSO
    747 Links for further information on gopher:
    748 .Pp
    749 .Lk gopher://gopher.floodgap.com "Floodgap Systems"
    750 .Pp
    751 .Lk gopher://gopherproject.org "The Gopher Project"
    752 .Sh STANDARDS
    753 .Rs
    754 .%A F. Anklesaria
    755 .%A M. McCahill
    756 .%A P. Lindner
    757 .%A D. Johnson
    758 .%A D. Torrey
    759 .%A B. Alberti
    760 .%D March 1993
    761 .%R RFC 1436
    762 .%T The Internet Gopher Protocol (a distributed document search and retrieval protocol)
    763 .Re
    764 .
    765 .Sh HISTORY
    766 .Bd -filled
    767 .Nm
    768 started as a Linux/BSD port of the Plan 9 gopherd_P9 server.
    769 Originally called gopherd_BSD, the name was later changed to
    770 .Qq Em Geomyidae
    771 (latin), the taxonomic family of burrowing rodents known as
    772 .Qq Em "pocket gophers"
    773 which are in fact the true gophers.
    774 Due to inconsistencies and the UNIX culture, the name was changed to lowercase in 2010.
    775 .Ed
    776 .
    777 .Sh AUTHORS
    778 See LICENSE file for authors in the distribution.
    779 .
    780 .Sh LICENSE
    781 .Nm
    782 is released under the MIT/X Consortium License.
    783 .
    784 .Sh BUGS
    785 Dynamic content functionality may vary across gopher clients.
    786 .
    787 .Ss "Reporting Bugs"
    788 Report bugs to:
    789 .An "Christoph Lohmann" Aq Mt 20h@R-36.net