geomyidae.8 (17739B)
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 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 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 Traversal (See above.) 505 .It Ev QUERY_STRING 506 Arguments (See above.) 507 .It Ev SELECTOR 508 Raw selector 509 .It Ev REQUEST 510 Raw selector 511 .It Ev REMOTE_ADDR , REMOTE_HOST 512 IP of the client 513 .It Ev REQUEST_METHOD 514 .Qq Cm GET 515 .It Ev SCRIPT_NAME 516 Script which is executed. 517 .It Ev SCRIPT_FILENAME 518 Absolute path with script which is executed. 519 .It Ev SERVER_NAME 520 Server's hostname. 521 .It Ev SERVER_PORT 522 Server's port. 523 .It Ev SERVER_LISTEN_NAME 524 Ip the server received the connection on. 525 .It Ev SERVER_PROTOCOL 526 .Qq Cm gopher/1.0 527 .It Ev SERVER_SOFTWARE 528 .Qq Cm geomyidae 529 .It Ev X_GOPHER_SEARCH 530 Search (See above.) 531 .It Ev SEARCHREQUEST 532 Search (For backwards compatibility.) 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