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 (17781B)


      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 ttry 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 .Bl -tag -width "SERVER_LISTEN_NAME" -compact
    501 .It Ev GATEWAY_INTERFACE
    502 .Qq Cm CGI/1.1
    503 .It Ev PATH_INFO
    504 Script which is executed
    505 .It Ev PATH_TRANSLATED
    506 Absolute path with script which is executed
    507 .It Ev QUERY_STRING
    508 Arguments (See above.)
    509 .It Ev SELECTOR
    510 Raw selector
    511 .It Ev REQUEST
    512 Raw selector
    513 .It Ev TRAVERSAL
    514 Traversal (See above.)
    515 .It Ev REMOTE_ADDR , REMOTE_HOST
    516 IP of the client
    517 .It Ev REQUEST_METHOD
    518 .Qq Cm GET
    519 .It Ev SCRIPT_NAME
    520 Script which is executed.
    521 .It Ev SERVER_NAME
    522 Server's hostname.
    523 .It Ev SERVER_PORT
    524 Server's port.
    525 .It Ev SERVER_LISTEN_NAME
    526 Ip the server received the connection on.
    527 .It Ev SERVER_PROTOCOL
    528 .Qq Cm gopher/1.0
    529 .It Ev SERVER_SOFTWARE
    530 .Qq Cm geomyidae
    531 .It Ev X_GOPHER_SEARCH
    532 Search (See above.)
    533 .It Ev SEARCHREQUEST
    534 Search (For backwards compatibility.)
    535 .It Ev HTTPS , GOPHERS
    536 Set, if TLS is used.
    537 .El
    538 .
    539 .Ss The REST path handling
    540 If a client requests a path in a selector, which has no corresponding
    541 file or path found,
    542 .Nm
    543 will try to traverse from the
    544 .Fl b Ar base
    545 path until a path component / directory is not found.
    546 Then
    547 .Nm
    548 tries to find some index.dcgi or index.cgi file in the last existing directory.
    549 If this is found and the index files are executable,
    550 .Nm
    551 will execute them using the traversal and
    552 .Ev TRAVERSAL
    553 parameter and environment variable being set to the rest path.
    554 .Bd -literal -offset indent
    555 Selector: /some/v1/service/add/something?args=value
    556 -> /some/v1/service exists
    557 -> /some/v1/service/index.dcgi exists
    558 -> /some/v1/service/index.dcgi "" "args=value" $host $port
    559 "/add/something" "/some/v1/service/add/something?args=value" is called
    560 .Ed
    561 .
    562 .Ss HTTP compatibility
    563 For maximum flexibility in case someone sends a HTTP request to gopher,
    564 .Nm
    565 supports a special case of CGI.
    566 See this example:
    567 .Bd -literal -offset indent
    568 Client request: GET /some/path HTTP/1.1
    569 -> /GET exists and is executable
    570 -> /GET "" "" $host $port "" "GET /some/path HTTP/1.1" is called
    571 .Ed
    572 .Pp
    573 This allows for example simple scripts for icecast upload compatibility
    574 or handling transparent HTTP right next to gopher, getting TLS for free.
    575 .
    576 .Ss Some CGI Examples
    577 Note: these are a very simple examples with no fitness checks with respect
    578 to safety/security.
    579 .Pp
    580 ex.
    581 .Pa uptime.cgi - standard CGI, no queries
    582 .
    583 .Bd -literal -offset indent
    584 #!/bin/sh
    585 #  uptime.cgi - prints system uptime(1)
    586 /usr/bin/uptime
    587 exit 0
    588 .Ed
    589 .
    590 .Pp
    591 Call the above with the following index.gph entry:
    592 .Pp
    593 .Dl [0|System Uptime|/uptime.cgi|frog.bog|70]
    594 .Pp
    595 A search query request must have an item Type of
    596 .Qq Cm "7"
    597 to be called from an
    598 .Pq index.gph
    599 file.
    600 It also needs a
    601 .Qq Cm "?\&"
    602 suffix in the
    603 .Ar <path>
    604 field:
    605 .Pp
    606 ex.
    607 .Pa hello.cgi - standard CGI with query
    608 .
    609 .Bd -literal -offset indent
    610 #!/bin/sh
    611 #  hello.cgi - welcome user
    612 NAME=$1
    613 HOSTNAME=$2
    614 echo ""
    615 echo Hello $NAME - welcome to $HOSTNAME
    616 exit 0
    617 .Ed
    618 .
    619 .Pp
    620 Call the above with the following index.gph entry:
    621 .Bd -literal -offset indent
    622 [7|Hello You - Please enter your name|/hello.cgi?FROG.bog|frog.bog|70]
    623 .Ed
    624 .
    625 .Pp
    626 And do a simple
    627 .Xr snarf 1
    628 query (note the inserted TAB):
    629 .Bd -literal -offset indent
    630 % snarf "gopher://frog.bog/7/hello.cgi?FROG.bog[TAB]Christoph" -
    631 Hello Christoph - welcome to FROG.bog
    632 .Ed
    633 .
    634 .Pp
    635 Dynamic CGI entries are similar to above except that the script
    636 needs to create output as described in the
    637 .Sx FORMATTING
    638 section:
    639 .Pp
    640 ex.
    641 .Pa jughead.dcgi - dynamic CGI script with query
    642 .
    643 .Bd -literal -offset indent
    644 #!/bin/sh
    645 # jughead.dcgi - jughead-like local gopher search
    646 KWRD="$1"
    647 ARCHIVE="/var/gopher/textfiles/"
    648 echo "[i|Search results for \\"${KWRD}\\":|Err||]"
    649 echo "[i||Err||]"
    650 # grep(1) recursive, case-insensitive KWRD search of ARCHIVE:
    651 for RESULT in $(/usr/bin/grep -i -l -m1 ${KWRD} -r $ARCHIVE)
    652 do
    653         DESC=$(/usr/bin/basename ${RESULT})
    654         PATH=$(echo "$RESULT" | /usr/bin/sed 's/^\\/var\\/gopher//')
    655         echo "[0|${DESC}|${PATH}|frog.bog|70]"
    656 done
    657 exit 0
    658 .Ed
    659 .
    660 .Pp
    661 Call the above with the following index.gph entry:
    662 .Pp
    663 .Dl [7|Search this Gopher|/jughead.dcgi?|frog.bog|70]
    664 .Pp
    665 A successful query might look like this:
    666 .Bd -filled -offset indent
    667 Search results for
    668 .Qq fubar :
    669 .Pp
    670 .Bl -tag -width "(XXXX)" -compact
    671 .It Sy (FILE)
    672 How_Things_Break.txt
    673 .It Sy (FILE)
    674 Origins_of_Words.txt
    675 .It Sy (FILE)
    676 Phrases_of_the_Ages.txt
    677 .El
    678 .Ed
    679 .
    680 .Pp
    681 Care should to be exercised to avoid creating mistyped entries, unwanted
    682 recursions, and/or unintended writes in the working directory.
    683 .Sh HAPROXY SUPPORT
    684 .Nm
    685 has
    686 .Em HAProxy
    687 support.
    688 It can be enabled using the
    689 .Fl y
    690 parameter.
    691 .
    692 .Sh LOG FILES
    693 The log file (ie. /var/log/gopherd.log) has the following structure:
    694 .Dl [ Ns Ar <date> Ns | Ns Ar <IP/Host> Ns | Ns Ar <port> Ns | Ns Ar <status> Ns ] Ar  <item path>
    695 .
    696 .Pp
    697 where,
    698 .Bl -tag -width "<XXXX XXXX>"
    699 .It Ar <date>
    700 Access date and time (std 'date' format).
    701 .br
    702 ex.
    703 .Qq Cm "2018-01-31 14:18:34 +0000"
    704 .It Ar <IP/Host>
    705 Client IP/Host served
    706 .br
    707 ex.
    708 .Qq Cm "104.23.33.1"
    709 .It Ar <port>
    710 Client port served
    711 .br
    712 ex.
    713 .Qq Cm "16857"
    714 .It Ar <status>
    715 Status of client request
    716 .br
    717 ex. - some common status entries:
    718 .Bl -tag -width "XXXX XXXXXXXX" -compact
    719 .It Qq Cm serving
    720 A successful request.
    721 .It Qq Cm not found
    722 An unsuccessful request.
    723 .It Qq Cm HTTP redirect
    724 Web link redirect (Type h).
    725 .It Qq Cm dir listing
    726 Unindexed directory listing.
    727 .El
    728 .It Ar <item path>
    729 Full path to item served
    730 .br
    731 ex.
    732 .Qq Pa "/PICS/simple2.jpg"
    733 for an image file;
    734 .Qq Pa "/PICS"
    735 for a directory access.
    736 .El
    737 .
    738 .Sh ENCRYPTION ONLY
    739 If you set the sticky bit
    740 .Pq Ql "chmod +t"
    741 on some file or directory,
    742 .Nm
    743 will only serve it over an encrypted connection.
    744 There is the special case, that when the sticky bit is set on the
    745 .Ar base
    746 directory, all content will only be served over TLS.
    747 .
    748 .Sh FILES
    749 .Pa README , LICENSE , CGI , index.gph , rc.d/ , LINKS , gph/
    750 .
    751 .Sh SEE ALSO
    752 Links for further information on gopher:
    753 .Pp
    754 .Lk gopher://gopher.floodgap.com "Floodgap Systems"
    755 .Pp
    756 .Lk gopher://gopherproject.org "The Gopher Project"
    757 .Sh STANDARDS
    758 .Rs
    759 .%A F. Anklesaria
    760 .%A M. McCahill
    761 .%A P. Lindner
    762 .%A D. Johnson
    763 .%A D. Torrey
    764 .%A B. Alberti
    765 .%D March 1993
    766 .%R RFC 1436
    767 .%T The Internet Gopher Protocol (a distributed document search and retrieval protocol)
    768 .Re
    769 .
    770 .Sh HISTORY
    771 .Bd -filled
    772 .Nm
    773 started as a Linux/BSD port of the Plan 9 gopherd_P9 server.
    774 Originally called gopherd_BSD, the name was later changed to
    775 .Qq Em Geomyidae
    776 (latin), the taxonomic family of burrowing rodents known as
    777 .Qq Em "pocket gophers"
    778 which are in fact the true gophers.
    779 Due to inconsistencies and the UNIX culture, the name was changed to lowercase in 2010.
    780 .Ed
    781 .
    782 .Sh AUTHORS
    783 See LICENSE file for authors in the distribution.
    784 .
    785 .Sh LICENSE
    786 .Nm
    787 is released under the MIT/X Consortium License.
    788 .
    789 .Sh BUGS
    790 Dynamic content functionality may vary across gopher clients.
    791 .
    792 .Ss "Reporting Bugs"
    793 Report bugs to:
    794 .An "Christoph Lohmann" Aq Mt 20h@R-36.net