go4gw version 1.01
------------------

go4gw is a daemon which can handle many different gopher gateways
written in perl. It should be started from inetd.

Bugs to gopher@boombox.micro.umn.edu

INSTALLATION
------------

You need to put the following line in /etc/services:

go4gw     	4320/tcp

And the following line in /etc/inetd.conf (depending on your system type):

go4gw  stream  tcp     nowait  nobody /usr/local/etc/go4gw  go4gw

The go4gw script has a few variables you might want to change:

$Gconf_file = "/usr/local/etc/go4gw.conf"; # configuration file
$Gport=4320;                               # port THIS daemon is running on
$Ghost="Slapshot.Stanford.EDU";            # host THIS daemon is running on

You need to set Gport to the same port as in /etc/services, and Ghost to
your fully qualified host name.

Why aren't these two auto-magically figured out?
Mainly for speed, but also because some `hostname` commands don't
have the domain, some do, etc. Its easier just to define them here.
Since all the other gateways are run in the context of this perl script,
the gateways don't need any of this stuff in them.

Gconf_file should be set to the location of your go4gw.conf file. The
format of this file is:

#
# format
# gateway : user : module : gopher title
#
whois:-2:/usr/local/etc/g2whois:Whois:
nntp:-2:/usr/local/etc/g2nntp:USENET News:
webster:-2:/usr/local/etc/g2webster:Webster:
#

Where gateway is the name of the gateway, user is either a numeric uid
or name,  module is the name of the perl script that go4gw will dynamically 
load, and title is the title that will show up in the gopher menu if go4gw 
is sent the string "". If the gateway doesn't take an empty string, the title
should be "" and it won't show up in the menu. By writing all your gateways so
they take a "" command, you can point a link at the go4gw daemon with
path set to "" and get a menu of all your gateways. The menu order will
be the same order as the go4gw.conf file.

Once you've done all this configuration you'll want to try HUP inetd.
Then you can test it out by running a gopher client to the newly
created port..


Writing go4gw gateways
-----------------------
go4gw gateways need to a follow a few simple conventions:

You need to have a routine called "${gateway}_main", where gateway
is the name of your gateway. For example, if your gateway is called 
whois, then you need:

whois_main {
  local($_) = @_;
  ...
}

In your module (/usr/local/etc/g2whois for example).

Your *_main will be passed the string sent to go4gw WITHOUT your gateway 
prefix. For example, if someone sends the following string to go4gw:

nntp ls su.jobs

Then go4gw will call &nntp_main("ls su.jobs"),  after loading g2nntp.

You should define any variables that users might have to change at the
front of your script, and prefix them with your gateway name. 

When your gateway has to return selector string, hostname, and port, it
should use the following variables:

$Ggw    -> name of this gateway
$Gport  -> port this gateway is running on
$Ghost  -> host this gateway is running on

For example, nntp might do the following:

&Greply("0$Subject\t$Ggw article $group $article\t$Ghost\t$Gport");

So when the user selects this they will send:

nntp article su.jobs 104

Back to the go4gw daemon, which will figure out that "article su.jobs 104"
needs to get passed to g2nntp.

The following variables and routines are defined in go4gw, and can be used 
by gateways:

$GnotServer    You can define this in perl scripts that want to include
               the go4gw script without running the server. See the
               g2nntp_groups script.

$Ggw           Can be used by gateway routines to determine their gateway     
               name.

$Gport         Can be used by gateway routines to determine which port go4gw
               is running on.

$Ghost         Can be used by gateway routines to determine which host go4gw
               is running on.

GSERVER        File handle which is opened when GopenServer is called.

&Greply(reply) Sends string back to gopher client with \r\n on the end.

&Gabort(mess)  Sends error message back to gopher client with 
               "3mess\r\n.\r\n" on end.
              
&GopenServer(server,port)
               Opens TCP port at server or calls Gabort.

&GcloseServer  Closes server.

$Gdebug        define this to turn on debugging in &Gsend and &Grecv.

&Gsend(cmd)    Sends "cmd\r\n" to GSERVER.

$_ = &Grecv;   Gets response from GSERVER and strips \r and \n.

&Gsorry        Sends message about data that cannot be delivered due to
               restrictions.

Other "standard" routines and variables may be added. They will start
with a 'G'.

Roland
