Introduction
Introduction Statistics Contact Development Disclaimer Help
geomyidae.8 - geomyidae - A small C-based gopherd.
git clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfri…
Log
Files
Refs
Tags
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 …
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…
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…
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…
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 in…
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 conte…
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 (se…
442 All scripts must be under the gopher root directory and be executable by…
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 stdou…
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 trave…
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…
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 se…
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 dir…
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 respe…
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 <st…
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 retr…
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 low…
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 [email protected]
You are viewing proxied material from bitreich.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.