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