Copyright (c) 1993-1996 Eugene G. Crosser

ifcico is a FidoNet(r) compatible mailer for U*IX platforms.

You may do virtually what you wish with this software, as long as the
explicit reference to its original author is retained:

Eugene G. Crosser <crosser@average.org>, 2:5020/230@FidoNet

THIS SOFTWARE IS PROVIDED AS IS AND COME WITH NO WARRANTY OF ANY KIND,
EITHER EXPRESSED OR IMPLIED.  IN NO EVENT WILL THE COPYRIGHT HOLDER BE
LIABLE FOR ANY DAMAGES RESULTING FROM THE USE OF THIS SOFTWARE.

This is a BETA version, it is far from being fully tested.  If you think
that you found a bug, contact the author at crosser@average.org.

All programs show a small help message when run with "-h" flag.

"ifcico" stands for "Internet - Fidonet Copy In / Copy Out", this is a
FidoNet(r) compatible transport agent.  Currently it supports FTS-0001,
YooHoo/2U2 and EMSI handshake protocols, Xmodem (untested), Telink
(untested), Modem7 (untested), SEAlink w/overdrive and crash recovery,
Bark file and update requests, WaZOO protocols: DietIFNA, plain Zmodem
(aka ZedZip, EMSI flag "ZMO") and ZedZap, WaZOO file and update requests
(nodelist flag should be XA).  Password protected requests are not
implemented.  There are plans to implement Janus (and maybe Hydra)
protocols in the future.

There is also a special protocol optimized to use over TCP/IP connection,
contributed by Stanislav Voronyi <stas@uanet.kharkov.ua>, it is identified
by EMSI proto code TCP (not registered).

Outbound directory structure is BinkleyTerm compatible, with domains and
point subdirectories (full 5d).  There are separate "listed" and
"protected" inbound directories for the incoming sessions with the nodes
present in the nodelist(s) and with nodes that have a password assigned
respectively.  Files received during an outbound session are always put
into the "protected" directory. (Only "protected" directory is looked up
by ifunpack by default, see ifgate subdir).

"Magic" file request processors are executable files placed in the
"magic" directory.  If request is made for a file with matching name,
the executable from the "magic" directory is run, and its stdout sent to
the requester.  Full requester's address, in the form "John Smith of
1:234/56.7" is passed to the executable in the command line.  See
"misc/FILES" for an example of a magic request processor.  Non-
executable files in the "magic" directory are "references".  If a
request is made for a file with matching name, the file is read line by
line, and request re-made for the name found in each line.  Up to 5
levels of recursion are allowed.

To run ifcico in master mode, you must make dialout devices read/writable
for ifcico, _and_ do the same for the directory where your uucp locks
are created (usually /usr/spool/uucp).

To make ifcico work in answer mode, you need a hack in uugetty.  Linux
"standard" getty_ps 2.0.7d, Gert Doering's mgetty .17 (from the
mgetty+sendfax package) and later versions, and FreeBSD standard uugetty
have fidonet support built in.  Getty must distinguish incoming FidoNet
type calls, and start ifcico with one parameter:

FTS-0001 call:		"ifcico tsync"
FTS-0006 call:		"ifcico yoohoo"
EMSI call:		"ifcico **EMSI_....."

(in the latter case the received EMSI packet should be passed without
trailing CR).

If you are using getty_ps, don't forget to (a) #define FIDO in tune.h,
and (b) create the file /etc/default/uugetty with the contents similar
to the following (case sensitive):

FIDO=/usr/lib/ifmail/ifcico
EMSI=yes

It is also recommended to increase getty's input buffer size to 0.5 - 1
Kb (in tune.h).

When called without parameters, ifcico runs in slave mode and determines
the type of inbound session itself.  This mode may be used when ifcico
runs as an internet or ISDN daemon.

To make ifcico scan for pending outbound mail and do appropriate calls,
start it with "-r1" flag.  To force polling of particular nodes, specify
these nodes in the command line (addresses should be in domain notation,
e.g. "ifcico f23.n5020 f155.n5020").  The latter implies master mode
(-r1).  Note that "hold" packets and files, as well as file requests, do
not cause the node to be polled.

Inbound directory is created automatically if it does not exist, along
with the "tmp" subdir. The latter is used while receiving files. After
being successfully received, the files are moved up to the "inbound"
directory.  "protinbound" and "listinbound" directories accept files
received during password protected sessions and session with the nodes
present in the nodelist(s) respectively.

Almost all features are controlled by the configuration file. See
"misc/config" file as an example, it contains a lot of comments.  To use
ifcico over TCP/IP, see "services" file with an example line for the
service entry, and "initd.conf" file with an example how to make ifcico
listen for incoming connects.  To initiate outgoing TCP/IP connect, use
"-a" flag.

Ifcico can use text format nodelists in original (MS/DOS) form with
<CR><LF>'s as well as in UNIX form, with <LF>'s only.  When you get
a fresh nodelist, or change the "nodelist" statements in the config
file, you must rebuild index with "ifindex" program.

ifcico returns maximum return code for all calls made.  Codes are as
follows:

0	Successfull call
1	Dialout port unavailable
2	Dial failed (no "CONNECT" or TCP connection failed)
3	Could not reset the modem (no "OK")
4	System locked
5	Retry time not reached
6	Fatal error in nodelist lookup
7	Call prohibited by config options
8	Phone number unavailable
9	No matching ports defined
10	Unused
>10	Session failures (not defined yet)
30	Could not establish session

For outgoing calls, status files are created for nodes, with the extension
".sts".  These are ascii files containg three decimal numbers in a single
line:

time retries code

'time' is the last call attempt time (attempts failing with "retry time
not reached" do not count).  It is unsigned long representing the number
of seconds since the epoch.

'retries' is the number of consequtive call attempts made that returned
"call failed" or "could not establish session".  This field is zeroed
when call succeeds.

'code' is the return code of the last attempt.

ifroute program (not working yet - under development) can be used in a
"queryprogram" driver with Smail.  It accepts destination address on the
command line and writes routing address to stdout, taking care of
hub/host/zonegate routing.

nlpatch program compiles a new version of the nodelist from the old
nodelist and nodediff.

Acknowledgements:

Some ideas taken from FidoGate-RFmail package written by Teemu Torma and
hacked by Martin Junius. Several source modules taken from INN 1.4 package.
Zmodem source taken from sz/rz programs by Chuck Forsberg (I may rewrite
it from scratch in future). Some TCP code contributed by Martin Junius and
Stanislav Voronyi.
