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