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