geomyidae

A small C-based gopherd. (gopher://bitreich.org/1/scm/geomyidae)
git clone git://r-36.net/geomyidae
Log | Files | Refs | README | LICENSE

commit 5515917b4123b50a3ecce3dc22b85c16908014b9
parent cf8dcb97a53fa14b89ade9088299ba8c1e8d7dc7
Author: Christoph Lohmann <20h@r-36.net>
Date:   Sat,  2 Jul 2011 13:00:40 +0200

Justifying the manpage.

Diffstat:
geomyidae.8 | 1037+++++++++++++++++++++++++++++++++++++++++++------------------------------------
1 file changed, 560 insertions(+), 477 deletions(-)

diff --git a/geomyidae.8 b/geomyidae.8 @@ -1,477 +1,560 @@ -.\" geomyidae.8 handcrafted in GNU groff -mdoc using nvi -.\" -.Dd March 26, 2011 -.Dt GEOMYIDAE 8 -.Os -. -.Sh NAME -.Nm geomyidae -.Nd a gopher daemon for Linux/BSD -. -.Sh SYNOPSIS -.Nm -.Bk -words -.Op Fl d -.Op Fl l Ar logfile -.Op Fl v Ar loglevel -.Op Fl b Ar base -.Op Fl p Ar port -.Op Fl o Ar sport -.Op Fl u Ar user -.Op Fl g Ar group -.Op Fl h Ar host -.Op Fl i Ar IP -.Ek -. -.Sh DESCRIPTION -.Nm -is a daemon for serving the protocol specified in -.Em RFC 1436 -(Gopher). Under 1000 lines of C by design, it is lightweight yet supports -dynamic content, automatic file/directory indexing, logging and privilege -separation. -. -.Sh IMPLEMENTATION -Installation is straightforward: grab the zipped tar file, expand it in -an appropriate temp directory, change to the -.Qq "../geomyidae-x.xx" -directory, tweak the Makefile if desired (installs in -.Qq "/usr/bin" -by default), then run the -.Sq "make ; make install" -commands. The resulting executable should be run by root. -. -.Ss Basic Installation and Startup: -.Pp -.Bd -literal - % wget http://www.r-36.net/src/geomyidae/geomyidae-current.tgz; - % tar -xzvf geomyidae-*.tgz; - % cd geomyidae-*; - % make; sudo make install; - % sudo mkdir -p /var/gopher; - % sudo cp index.gph /var/gopher; - % sudo geomyidae -l /var/log/geomyidae.log -b /var/gopher -p 70; - % tail -f /var/log/geomyidae.log; - - Use whatever gopher client you like (ie. lynx) to browse: - % lynx gopher://localhost -.Ed -. -.Ss Running -geomyidae should normally be started by root, although it can be started -by a regular user provided that the base directory and its contents are owned -by the same user. geomyidae will only serve content within the base directory -tree and will drop privileges to the -.Fl u Ar user -and -.Fl g Ar group -values if set. See -.Ic OPTIONS -below for specifics. Launching geomyidae automatically is best done via a UNIX -run-time (rc.d) script; several sample rc.d scripts are included in the geomyidae -source archive. -. -.Sh OPTIONS -geomyidae options and default settings: -.Pp -.Bl -tag -width ".Fl test Ao Ar string Ac" -. -.It Fl d -Don't fork into background -. -.It Fl l Ar logfile -Specify file where log output is written (no default) -. -.It Fl v Ar loglevel -Set the logging level (default: 7) -. -.Bd -literal -Loglevels: - 0 - no logging - 1 - served plain files - 2 - directory listings - 4 - HTTP redirects - 8 - errors (e.g., not found) - e.g.: - 1 + 2 + 4 + 8 = 15 - (files + directories + HTTP + errors) -.Ed -. -.It Fl b Ar base -Root directory to serve (default: /var/gopher) -. -.It Fl p Ar port -Port geomyidae should listen on (default: 70) -. -.It Fl o Ar sport -Port geomyidae displays within base directory (default: 70) -. -Use in conjunction with -.Ic -p -for obfuscating actual port geomyidae is running on. -. -.It Fl u Ar user -Sets the user to which privileges drop when geomyidae is ready -to accept network connections (default: user geomyidae runs as). -Helps improve security by reducing privileges during request -processing. -. -.It Fl g Ar group -Sets the group to which privileges drop when geomyidae is ready -to accept network connections (default: group geomyidae runs as). -Helps improve security by reducing privileges during request -processing. -. -.It Fl h Ar host -Host to use in directory listings (default: localhost) -. -.It Fl i Ar IP -IP to which geomyidae binds to (default: 127.0.0.1) -.El -. -.Sh FORMATTING -Structured Gopher space(s) can be created with geomyidae through the -use of special indexing files of the form -.Ic <name>.gph -which, if present, geomyidae uses to format and/or filter the contents of -the base directory (/var/gopher by default) and create gopher menus. -However, index files are -.Em not -required: if no .gph files are found geomyidae simply lists the directory -contents in alphanumeric order. In addition, a directory can utilize -multiple index files to create a layered gopher environment without the -use of sub-directories: ie. pictures.gph, music.gph, documents.gph could -be "directories" within main.gph, yet all reside in /var/gopher along with -their respective files (*.jpg, *.mp3, *.pdf for example). -. -.Ss Anatomy of an index.gph file -In general, each line of an index.gph file has the following structure: -.Pp -.Bl -inset -offset indent -.It Ic [<type>|<desc>|<path>|<host>|<port>] -.El -.Pp -where, -.Bl -inset -offset indent -.It Ic <type> -= A valid gopher Item Type. -.Pp -Some common Gopher Types as defined in -.Em RFC 1436 -: -. -.Bd -literal - 0 Item is a file - 1 Gopher directory - 3 Error - 7 Item is an Index-Search server. - 8 Item points to a text-based telnet session. - 9 Binary file. Client reads until TCP connection closes! - g GIF format graphics file. - I Indeterminate image file. Client decides how to display. -.Ed -.Pp -In addition, geomyidae provides these: -.Bd -literal - h Item is a hypertext (HTTP) link - i Informational Item (used for descriptive purposes) -.Ed -. -.Pp -Note: geomyidae doesn't require "informational" text to be formally -Typed as "[i|...]"; any line -.Em not -beginning with "[" is treated as informational, greatly simplifying the -formatting of index.gph files. However, if a line begins with a "t", this -"t" is left out. This quirk is there to allow "informational" text lines -beginning with a "[" to display. For dynamically generated index files -it may be desirable to either formally Type informational text or run -it through a filter to add a second "t" - .ie sed 's/^t/&&/' . -. -.It Ic <desc> -= description of gopher item. Most printable characters should work. -. -.It Ic <path> -= full path to gopher item (base value is / ). Use the "Err" path for -items not intended to be served. -. -.It Ic <host> -= hostname or IP hosting the gopher item. Must be resolvable for the -intended clients. If this is set to -.Qq "server" -, the server's hostname is used. -.It Ic <port> -= TCP port number ( usually 70) -. -If this is set to -.Qq "port" -, the default port of the server is used. -.El -. -.Ss index.gph Example -A root.gph file for a server running on host=frog.bog, port=70. Note use -of optional [i]nformational Item (line 2) for vertical space insertion: -.Pp -.Bd -literal -offset indent -Welcome to Frog.bog -[i||Err||] -[0|About this server|about.txt|frog.bog|70] -[0|Daily Log|/dtail.cgi|frog.bog|70] -[1|Phlog: like a blog, but not|/PHLOG|frog.bog|70] -[9|Some binary file|widget.exe|frog.bog|70] -[I|Snowflake picture|snowflake.jpg|frog.bog|70] - -Links and Searches -[1|Go to R-36.net|/|gopher.r-36.net|70] -[h|Go to NetBSD.org|URL:http://netbsd.org|frog.bog|70] -[7|Query US Weather by Zipcode|/weather.cgi?|frog.bog|70] -[7|Search Veronica II|/v2/vs|gopher.floodgap.com|70] -[8|Telnet to SDF Public Access Unix System|null|freeshell.org|23] -.Ed -. -.Pp -The above looks something like this in a text-based gopher client: -.Pp -.Bl -tag -width ".It Ic WIDTHS" -compact -offset indent -.D1 Welcome to Frog.bog -.Pp -.It Ic (FILE) -About this server -.It Ic (FILE) -Daily Log -.It Ic (DIR) -Phlog: like a blog, but not -.It Ic (BIN) -Some binary file -.It Ic (IMG) -Snowflake picture -.El -.Pp -.Bl -tag -width ".It Ic WIDTHS" -compact -offset indent -.D1 Links and Searches -.It Ic (DIR) -Go to R-36.net -.It Ic (HTML) -Go to NetBSD.org -.It Ic (?) -Query US Weather by Zipcode -.It Ic (?) -Search Veronica II -.It Ic (TEL) -Telnet to SDF Public Access Unix System -.El -.Pp -.Sh DYNAMIC CONTENT (gopher CGI) -There are two options provided for dynamic content creation: standard CGI ( -.Ic .cgi -) and dynamic CGI -( -.Ic .dcgi -). Despite the names, both can accept input and generate dynamic content; -the only difference is the latter re-formats it's output so it appears to -the server as a standard geomyidae index (.gph) file. This makes the -creation of on-the-fly gopher directories much easier (see examples). -All scripts must be under the gopher root directory and be executable by -the same user:group running geomyidae. Consequently, it is best to use -the -u and -g server options to avoid running as root. -.Pp -Both .cgi and .dcgi scripts have the same argument call structure (as seen by geomyidae): -.Pp -.D1 executable.[d]cgi $search $arguments $host $port -.Pp -where -.Pp -.D1 search = query string (type 7) or Qo Qc (type 0) -.D1 arguments = Qo Qc -.D1 host = server's hostname ("localhost" by default) -.D1 port = server's port ("70" by default) -.Pp -All terms are tab-separated (per gopher protocol) which can cause some -surprises depending on how a script is written. See the CGI file (included -in the geomyidae source archive) for further elaboration. -. -.Ss Some CGI Examples -.Pp -Note: these are a very simple examples with no fitness checks with respect -to safety/security. -.Pp -ex. uptime.cgi - standard CGI, no queries -. -.Bd -literal -offset indent -#!/bin/sh -# uptime.cgi - prints system uptime(1) -/usr/bin/uptime -exit 0 -.Ed -. -.Pp -Call the above with the following index.gph entry: -.Pp -.D1 [0|System Uptime|/uptime.cgi|frog.bog|70] -.Pp -A search query request must have an item Type of "7" to be called -from an index.gph file. It also needs a "?" suffix in the <path> -field: -.Pp -ex. hello.cgi - standard CGI with query -. -.Bd -literal -offset indent -#!/bin/sh -# hello.cgi - welcome user -NAME=$1 -echo "" -echo Hello $NAME - welcome to Frog.bog -exit 0 -.Ed -. -.Pp -Call the above with the following index.gph entry: -.Pp -.D1 [7|Hello You - Please enter your name|/hello.cgi?|frog.bog|70] -. -.Pp -And do a simple -.Xr snarf 1 -query: -.Pp -.D1 % snarf Qo gopher://frog.bog/7/hello.cgi?Christoph Qc - -.D1 Hello Christoph - welcome to Frog.bog -. -.Pp -Dynamic CGI entries are similar to above except that the script -needs to create output as described in the -.Ic FORMATTING -section: -.Pp -ex. jughead.dcgi - dynamic CGI script with query -. -.Bd -literal -offset indent -#!/bin/sh -# jughead.dcgi - jughead-like local gopher search -KWRD="$1" -ARCHIVE="/var/gopher/textfiles/" -echo "[i|Search results for \\"${KWRD}\\":|Err||]" -echo "[i|----|Err||]" -# grep(1) recursive, case-insensitive KWRD search of ARCHIVE: -for RESULT in $(/usr/bin/grep -i -l -m1 ${KWRD} -r $ARCHIVE) -do - DESC=$(/usr/bin/basename ${RESULT}) - PATH=$(echo "$RESULT" | /usr/bin/sed 's/^\\/var\\/gopher//') - echo "[0|${DESC}|${PATH}|frog.bog|70]" -done -exit 0 -.Ed -. -.Pp -Call the above with the following index.gph entry: -.Pp -.D1 [7|Search this Gopher|/jughead.dcgi?|frog.bog|70] -.Pp -A successful query might look like this: -.Pp -.Bl -tag -width ".It Ic WIDTHS" -compact -offset indent -.D1 Search results for Qo fubar Qc : -.D1 ---- -.It Ic (FILE) -How_Things_Break.txt -.It Ic (FILE) -Origins_of_Words.txt -.It Ic (FILE) -Phrases_of_the_Ages.txt -.El -. -.Pp -Care should to be exercised to avoid creating miss-Typed entries, unwanted -recursions, and/or unintended writes in the working directory. -.Pp -.Sh LOG FILES -.Pp -The log file (ie. /var/log/gopherd.log) has the following structure: -. -.Pp -.Ic [<date>|<IP:port>] <item path> <query> (<status>) -. -.Pp -where, -. -.Bl -inset -.It Ic <date> -= access date and time (std 'date' format) -.Bl -inset -offset indent -ex. -.Qq "Sun Feb 17 06:11:10 PST 2008" -.El -.It Ic <IP:port> -= client IP address and port served -.Bl -inset -offset indent -ex. -.Qq "24.208.18.127:16857" -.El -.Pp -.It Ic <item path> -= full path to item served -.Bl -inset -offset indent -ex. -.D1 Qo "/PICS/simple2.jpg" Qc for an image file -.D1 Qo "/PICS" Qc for a directory access -.El -.It Ic <query> -= query term submitted (Type 7 requests only) -.Bl -inset -offset indent -ex. -.Dl % snarf Qq "gopher://frog.bog/7/hello.cgi?Christoph" -.Dl would log Qo "Christoph" Qc as the query term. -.El -.It Ic (<status>) -= status of client request -.Bl -inset -offset indent -ex. - some common status entries: -.El -.Pp -.Bl -hang -width XXXXXXXXXXXXXXXX -compact -offset XXXXXXXXXXXX -.It Qo (serving) Qc -=> a successful request -.It Qo (not found) Qc -=> an unsuccessful request -.It Qo (HTTP redirect) Qc -=> web link redirect (Type h) -.It Qo (dir listing) Qc -=> unindexed directory listing -.El -.El -. -.Sh FILES -README, LICENSE, CGI, index.gph, rc.d/ -. -.Sh "SEE ALSO" -Links for further information on gopher: -.Pp -.D1 Pa gopher://gopher.floodgap.com -.D1 Pa gopher://gopher.gopherproject.org -.Pp -.Sh STANDARDS -.Em Internet RFC 1436 -. -.Sh HISTORY -geomyidae started as a Linux/BSD port of the Plan 9 gopherd_P9 server. -Originally called gopherd_BSD, the name was later changed to Geomyidae -(latin), the taxonomic family of burrowing rodents known as "pocket -gophers" which are in fact the true gophers. Due to inconsistencies -and the UNIX culture, the name was changed to lowercase in 2010. -. -.Sh AUTHORS -See LICENSE file for authors in the distribution. -. -.Sh LICENSE -geomyidae is released under the MIT/X Consortium License. -. -.Sh BUGS -geomyidae occasionally aborts silently if too many simultaneous -requests are made. Limiting gopher traffic via firewall rules -may help. -.Pp -Dynamic content functionality may vary across gopher clients. -. -.Ss "Reporting Bugs" -Report bugs to: -.An "Christoph Lohmann" Aq 20h@R-36.net +.\" geomyidae.8 handcrafted in GNU groff -mdoc using nvi +.\" +.Dd March 26, 2011 +.Dt GEOMYIDAE 8 +.Os +. +.Sh NAME +.Nm geomyidae +.Nd a gopher daemon for Linux/BSD +. +.Sh SYNOPSIS +.Nm +.Bk -words +.Op Fl d +.Op Fl l Ar logfile +.Op Fl v Ar loglevel +.Op Fl b Ar base +.Op Fl p Ar port +.Op Fl o Ar sport +.Op Fl u Ar user +.Op Fl g Ar group +.Op Fl h Ar host +.Op Fl i Ar IP +.Ek +. +.Sh DESCRIPTION +.Bd -filled +.Nm +is a daemon for serving the protocol specified in +.Em RFC 1436 +(Gopher). Under 1000 lines of C by design, it is lightweight yet supports +dynamic content, automatic file/directory indexing, logging and privilege +separation. +.Ed +. +.Sh IMPLEMENTATION +.Bd -filled +Installation is straightforward: grab the zipped tar file, expand it in +an appropriate temp directory, change to the +.Qq "../geomyidae-x.xx" +directory, tweak the Makefile if desired (installs in +.Qq "/usr/bin" +by default), then run the +.Sq "make ; make install" +commands. The resulting executable should be run by root. +.Ed +. +.Ss Basic Installation and Startup: +.Pp +.Bd -literal + % wget http://www.r-36.net/src/geomyidae/geomyidae-current.tgz; + % tar -xzvf geomyidae-*.tgz; + % cd geomyidae-*; + % make; sudo make install; + % sudo mkdir -p /var/gopher; + % sudo cp index.gph /var/gopher; + % sudo geomyidae -l /var/log/geomyidae.log -b /var/gopher -p 70; + % tail -f /var/log/geomyidae.log; + + Use whatever gopher client you like (ie. lynx) to browse: + % lynx gopher://localhost +.Ed +. +.Ss Running +.Bd -filled +geomyidae should normally be started by root, although it can be started +by a regular user provided that the base directory and its contents are owned +by the same user. geomyidae will only serve content within the base directory +tree and will drop privileges to the +.Fl u Ar user +and +.Fl g Ar group +values if set. See +.Ic OPTIONS +below for specifics. Launching geomyidae automatically is best done via a UNIX +run-time (rc.d) script; several sample rc.d scripts are included in the geomyidae +source archive. +.Ed +. +.Sh OPTIONS +geomyidae options and default settings: +.Pp +.Bl -tag -width ".Fl test Ao Ar string Ac" +. +.Bd -filled +.It Fl d +Don't fork into background +.Ed +. +.Bd -filled +.It Fl l Ar logfile +Specify file where log output is written (no default) +.Ed +. +.Bd -filled +.It Fl v Ar loglevel +Set the logging level (default: 7) +.Ed +. +.Bd -literal +Loglevels: + 0 - no logging + 1 - served plain files + 2 - directory listings + 4 - HTTP redirects + 8 - errors (e.g., not found) + e.g.: + 1 + 2 + 4 + 8 = 15 + (files + directories + HTTP + errors) +.Ed +. +.Bd -filled +.It Fl b Ar base +Root directory to serve (default: /var/gopher) +.Ed +. +.Bd -filled +.It Fl p Ar port +Port geomyidae should listen on (default: 70) +.Ed +. +.Bd -filled +.It Fl o Ar sport +Port geomyidae displays within base directory (default: 70). +Use in conjunction with +.Ic -p +for obfuscating actual port geomyidae is running on. +.Ed +. +.Bd -filled +.It Fl u Ar user +Sets the user to which privileges drop when geomyidae is ready +to accept network connections (default: user geomyidae runs as). +Helps improve security by reducing privileges during request +processing. +.Ed +. +.Bd -filled +.It Fl g Ar group +Sets the group to which privileges drop when geomyidae is ready +to accept network connections (default: group geomyidae runs as). +Helps improve security by reducing privileges during request +processing. +.Ed -filled +. +.Bd -filled +.It Fl h Ar host +Host to use in directory listings (default: localhost) +.Ed +. +.Bd -filled +.It Fl i Ar IP +IP to which geomyidae binds to (default: 127.0.0.1) +.Ed +.El +. +.Sh FORMATTING +.Bd -filled +Structured Gopher space(s) can be created with geomyidae through the +use of special indexing files of the form +.Ic <name>.gph +which, if present, geomyidae uses to format and/or filter the contents of +the base directory (/var/gopher by default) and create gopher menus. +However, index files are +.Em not +required: if no .gph files are found geomyidae simply lists the directory +contents in alphanumeric order. In addition, a directory can utilize +multiple index files to create a layered gopher environment without the +use of sub-directories: ie. pictures.gph, music.gph, documents.gph could +be "directories" within main.gph, yet all reside in /var/gopher along with +their respective files (*.jpg, *.mp3, *.pdf for example). +.Ed +. +.Ss Anatomy of an index.gph file +.Bd -filled +In general, each line of an index.gph file has the following structure: +.Ed +.Pp +.Bl -inset -offset indent +.It Ic [<type>|<desc>|<path>|<host>|<port>] +.El +.Pp +where, +.Bl -inset -offset indent +.It Ic <type> += A valid gopher Item Type. +.Pp +Some common Gopher Types as defined in +.Em RFC 1436 +: +. +.Bd -literal + 0 Item is a file + 1 Gopher directory + 3 Error + 7 Item is an Index-Search server. + 8 Item points to a text-based telnet session. + 9 Binary file. Client reads until TCP connection closes! + g GIF format graphics file. + I Indeterminate image file. Client decides how to display. +.Ed +.Pp +In addition, geomyidae provides these: +.Bd -literal + h Item is a hypertext (HTTP) link + i Informational Item (used for descriptive purposes) +.Ed +. +.Pp +.Bd -filled +Note: geomyidae doesn't require "informational" text to be formally +Typed as "[i|...]"; any line +.Em not +beginning with "[" is treated as informational, greatly simplifying the +formatting of index.gph files. However, if a line begins with a "t", this +"t" is left out. This quirk is there to allow "informational" text lines +beginning with a "[" to display. For dynamically generated index files +it may be desirable to either formally Type informational text or run +it through a filter to add a second "t" - .ie sed 's/^t/&&/' . +.Ed +. +.Bd -filled +.It Ic <desc> += description of gopher item. Most printable characters should work. +.Ed +. +.Bd -filled +.It Ic <path> += full path to gopher item (base value is +.Qq "/" +). Use the +.Qq "Err" +path for items not intended to be served. +.Ed +. +.Bd -filled +.It Ic <host> += hostname or IP hosting the gopher item. Must be resolvable for the +intended clients. If this is set to +.Qq "server" +, the server's hostname is used. +.Ed +. +.Bd -filled +.It Ic <port> += TCP port number (usually 70) +. +If this is set to +.Qq "port" +, the default port of the server is used. +.Ed +.El +. +.Ss index.gph Example +.Bd -filled +A root.gph file for a server running on host=frog.bog, port=70. Note use +of optional [i]nformational Item (line 2) for vertical space insertion: +.Ed +.Pp +.Bd -literal -offset indent +Welcome to Frog.bog +[i||Err||] +[0|About this server|about.txt|frog.bog|70] +[0|Daily Log|/dtail.cgi|frog.bog|70] +[1|Phlog: like a blog, but not|/PHLOG|frog.bog|70] +[9|Some binary file|widget.exe|frog.bog|70] +[I|Snowflake picture|snowflake.jpg|frog.bog|70] + +Links and Searches +[1|Go to R-36.net|/|gopher.r-36.net|70] +[h|Go to NetBSD.org|URL:http://netbsd.org|frog.bog|70] +[7|Query US Weather by Zipcode|/weather.cgi?|frog.bog|70] +[7|Search Veronica II|/v2/vs|gopher.floodgap.com|70] +[8|Telnet to SDF Public Access Unix System|null|freeshell.org|23] +.Ed +. +.Pp +.Bd -filled +The above looks something like this in a text-based gopher client: +.Ed +.Pp +.Bl -tag -width ".It Ic WIDTHS" -compact -offset indent +.D1 Welcome to Frog.bog +.Pp +.It Ic (FILE) +About this server +.It Ic (FILE) +Daily Log +.It Ic (DIR) +Phlog: like a blog, but not +.It Ic (BIN) +Some binary file +.It Ic (IMG) +Snowflake picture +.El +.Pp +.Bl -tag -width ".It Ic WIDTHS" -compact -offset indent +.D1 Links and Searches +.It Ic (DIR) +Go to R-36.net +.It Ic (HTML) +Go to NetBSD.org +.It Ic (?) +Query US Weather by Zipcode +.It Ic (?) +Search Veronica II +.It Ic (TEL) +Telnet to SDF Public Access Unix System +.El +.Pp +.Sh DYNAMIC CONTENT (gopher CGI) +.Bd -filled +There are two options provided for dynamic content creation: standard CGI ( +.Ic .cgi +) and dynamic CGI +( +.Ic .dcgi +). Despite the names, both can accept input and generate dynamic content; +the only difference is the latter re-formats it's output so it appears to +the server as a standard geomyidae index (.gph) file. This makes the +creation of on-the-fly gopher directories much easier (see examples). +All scripts must be under the gopher root directory and be executable by +the same user:group running geomyidae. Consequently, it is best to use +the -u and -g server options to avoid running as root. +.Ed +.Pp +.Bd -filled +Both .cgi and .dcgi scripts have the same argument call structure (as seen by geomyidae): +.Ed +.Pp +.D1 executable.[d]cgi $search $arguments $host $port +.Pp +where +.Pp +.D1 search = query string (type 7) or Qo Qc (type 0) +.D1 arguments = Qo Qc +.D1 host = server's hostname ("localhost" by default) +.D1 port = server's port ("70" by default) +.Pp +.Bd -filled +All terms are tab-separated (per gopher protocol) which can cause some +surprises depending on how a script is written. See the CGI file (included +in the geomyidae source archive) for further elaboration. +.Ed +. +.Ss Some CGI Examples +.Pp +.Bd -filled +Note: these are a very simple examples with no fitness checks with respect +to safety/security. +.Ed +.Pp +.Bd -filled +ex. uptime.cgi - standard CGI, no queries +.Ed +. +.Bd -literal -offset indent +#!/bin/sh +# uptime.cgi - prints system uptime(1) +/usr/bin/uptime +exit 0 +.Ed +. +.Pp +.Bd -filled +Call the above with the following index.gph entry: +.Ed +.Pp +.D1 [0|System Uptime|/uptime.cgi|frog.bog|70] +.Pp +.Bd -filled +A search query request must have an item Type of "7" to be called +from an index.gph file. It also needs a "?" suffix in the <path> +field: +.Ed +.Pp +.Bd -filled +ex. hello.cgi - standard CGI with query +.Ed +. +.Bd -literal -offset indent +#!/bin/sh +# hello.cgi - welcome user +NAME=$1 +echo "" +echo Hello $NAME - welcome to Frog.bog +exit 0 +.Ed +. +.Pp +.Bd -filled +Call the above with the following index.gph entry: +.Ed +.Pp +.D1 [7|Hello You - Please enter your name|/hello.cgi?|frog.bog|70] +. +.Pp +.Bd -filled +And do a simple +.Xr snarf 1 +query: +.Ed +.Pp +.D1 % snarf Qo gopher://frog.bog/7/hello.cgi?Christoph Qc - +.D1 Hello Christoph - welcome to Frog.bog +. +.Pp +.Bd -filled +Dynamic CGI entries are similar to above except that the script +needs to create output as described in the +.Ic FORMATTING +section: +.Ed +.Pp +.Bd -filled +ex. jughead.dcgi - dynamic CGI script with query +.Ed +. +.Bd -literal -offset indent +#!/bin/sh +# jughead.dcgi - jughead-like local gopher search +KWRD="$1" +ARCHIVE="/var/gopher/textfiles/" +echo "[i|Search results for \\"${KWRD}\\":|Err||]" +echo "[i|----|Err||]" +# grep(1) recursive, case-insensitive KWRD search of ARCHIVE: +for RESULT in $(/usr/bin/grep -i -l -m1 ${KWRD} -r $ARCHIVE) +do + DESC=$(/usr/bin/basename ${RESULT}) + PATH=$(echo "$RESULT" | /usr/bin/sed 's/^\\/var\\/gopher//') + echo "[0|${DESC}|${PATH}|frog.bog|70]" +done +exit 0 +.Ed +. +.Pp +.Bd -filled +Call the above with the following index.gph entry: +.Ed +.Pp +.D1 [7|Search this Gopher|/jughead.dcgi?|frog.bog|70] +.Pp +.Bd -filled +A successful query might look like this: +.Ed +.Pp +.Bl -tag -width ".It Ic WIDTHS" -compact -offset indent +.D1 Search results for Qo fubar Qc : +.D1 ---- +.It Ic (FILE) +How_Things_Break.txt +.It Ic (FILE) +Origins_of_Words.txt +.It Ic (FILE) +Phrases_of_the_Ages.txt +.El +. +.Pp +.Bd -filled +Care should to be exercised to avoid creating miss-Typed entries, unwanted +recursions, and/or unintended writes in the working directory. +.Ed +.Pp +.Sh LOG FILES +.Pp +.Bd -filled +The log file (ie. /var/log/gopherd.log) has the following structure: +.Ed +. +.Pp +.Ic [<date>|<IP:port>] <item path> <query> (<status>) +. +.Pp +where, +. +.Bl -inset +.It Ic <date> += access date and time (std 'date' format) +.Bl -inset -offset indent +ex. +.Qq "Sun Feb 17 06:11:10 PST 2008" +.El +.It Ic <IP:port> += client IP address and port served +.Bl -inset -offset indent +ex. +.Qq "24.208.18.127:16857" +.El +.Pp +.It Ic <item path> += full path to item served +.Bl -inset -offset indent +ex. +.D1 Qo "/PICS/simple2.jpg" Qc for an image file +.D1 Qo "/PICS" Qc for a directory access +.El +.It Ic <query> += query term submitted (Type 7 requests only) +.Bl -inset -offset indent +ex. +.Dl % snarf Qq "gopher://frog.bog/7/hello.cgi?Christoph" +.Dl would log Qo "Christoph" Qc as the query term. +.El +.It Ic (<status>) += status of client request +.Bl -inset -offset indent +ex. - some common status entries: +.El +.Pp +.Bl -hang -width XXXXXXXXXXXXXXXX -compact -offset XXXXXXXXXXXX +.It Qo (serving) Qc +=> a successful request +.It Qo (not found) Qc +=> an unsuccessful request +.It Qo (HTTP redirect) Qc +=> web link redirect (Type h) +.It Qo (dir listing) Qc +=> unindexed directory listing +.El +.El +. +.Sh FILES +README, LICENSE, CGI, index.gph, rc.d/ +. +.Sh "SEE ALSO" +Links for further information on gopher: +.Pp +.D1 Pa gopher://gopher.floodgap.com +.D1 Pa gopher://gopher.gopherproject.org +.Pp +.Sh STANDARDS +.Em Internet RFC 1436 +. +.Sh HISTORY +.Bd -filled +geomyidae started as a Linux/BSD port of the Plan 9 gopherd_P9 server. +Originally called gopherd_BSD, the name was later changed to Geomyidae +(latin), the taxonomic family of burrowing rodents known as "pocket +gophers" which are in fact the true gophers. Due to inconsistencies +and the UNIX culture, the name was changed to lowercase in 2010. +.Ed +. +.Sh AUTHORS +See LICENSE file for authors in the distribution. +. +.Sh LICENSE +geomyidae is released under the MIT/X Consortium License. +. +.Sh BUGS +.Bd -filled +geomyidae occasionally aborts silently if too many simultaneous +requests are made. Limiting gopher traffic via firewall rules +may help. +.Pp +Dynamic content functionality may vary across gopher clients. +.Ed +. +.Ss "Reporting Bugs" +Report bugs to: +.An "Christoph Lohmann" Aq 20h@R-36.net