@comment Tell Emacs to use -*-texinfo-*- mode
@comment $Id: network.tex,v 2.6 91/09/02 01:37:53 adrian Exp $

@node Networking, Doors, Events, Top
@chapter Networking
@cindex Networking

Fnordadel has the ability to
@cindex Network
@dfn{network}, that is, to share mail,
rooms and files, with other Fnordadels and other Citadels supporting
the ``C86Net'' style of networking.  Since Fnordadel is a descendant
of Citadel-86, it retains compatibility with Citadel-86 networking
(well, mostly---@pxref{Networking with Citadel-86}).
Other Citadel variants supporting C86Net
include STadel (Fnordadel's immediate ancestor), Citadel-68K for the
Amiga, Fortress, and some others.

When two Citadels network, they follow a standard procedure.
First, one must call the other.  Fnordadel can be induced to make net
calls by means of
@vindex event
@code{#event}s and
@vindex polling
@code{#polling}; read
further in this chapter for
more on these.  Fnordadel can also receive net calls from any system at
any time (assuming there's no user logged in, of course.)  When two
Citadels have connected for the purposes of networking, they first must
stabilize the call, the caller (which starts out as the
@dfn{master}) must
@cindex Master (network mode)
identify itself, and passwords, if you use them, must be exchanged.  Then the
caller makes a series of requests; these can be for room sharing, file
sending or requesting, mail delivery, or whatever.  After the caller has made
all of its requests,
@cindex Role reversal
@dfn{role reversal} is performed; this essentially makes
the caller and the callee switch roles in mid-call, leaving the callee as
the master and the caller as the
@cindex Slave (network mode)
@dfn{slave}.  The callee now issues any
requests that it has to make in the same manner as the caller did.  When
the callee is finished, the two systems hang up.

Simple, huh?  Well, as it happens, this simple system has proven
quite flexible and useful; networking has become a fairly large part of
Citadel activity.  So it's only natural that it's had a large amount of
programming effort devoted to it, and thus, a lot of stuff we've got to
tell you about it. So hang on to your hat, and off we go!

@node Networking Configuration, The Net Menu, Networking, Networking
@section Networking Configuration
@cindex Networking configuration
@cindex Configuration, networking

There is a whole whack of things that either need to be set or
can be set in @file{ctdlcnfg.sys} to control Fnordadel's networking ability.
We divide these into two groups: required parameters and optional ones.
Please note that there is no way to ``turn off'' Fnordadel's networking
ability.  You may choose not to explicitly network with any systems, but
other Citadels will still be able to call yours and send you mail, at
the very least.

@node Required parameters, Optional parameters, Networking Configuration, Networking Configuration
@subsection Required parameters

These parameters @emph{must} be defined properly in @file{ctdlcnfg.sys}
for proper networking to occur; indeed, Fnordadel will stubbornly refuse to
come up at all unless certain ones are defined.  So define all
these.

@table @code
@item #nodename
@vindex nodename
@cindex Network node name
@cindex Node name
This is a string of 19 characters or less.  It
defines the name by which your system will be known on
the network.  The allowable characters in this string are:
@itemize @bullet
@item
Upper and lower case letters
@item
Digits
@item
Space characters (@samp{ })
@item
Any of @samp{* _ - .}
@end itemize
@noindent
Spaces are equivalent to @samp{_} (underscore) characters; therefore
@samp{The_Rock} and @samp{The Rock} amount to the same thing.  (We
encourage the use of @samp{_} rather than @samp{ }; aside from our entirely
subjective opinion that it looks better, it also helps when interfacing
with other networks that might not support spaces in nodenames.)
We'd also like
to recommend against using @samp{.} in your
@vindex nodename
@code{#nodename}; it may
cause confusion with domains in later versions of the
software.

We'd like it if
@vindex nodename
@code{#nodename}s were kept to nine
characters or less; indeed, @code{configur} will preach at
you a bit if you define a
@vindex nodename
@code{#nodename} with more than nine
characters.  This is mainly because of mail routing
considerations (@pxref{Mail Routing}); explicitly addressing
mail to systems with long weird nodenames is a pain, and
prone to error.  We'd prefer that you used a short
@vindex nodename
@code{#nodename} together with a descriptive
@vindex organization
@code{#organization}
(@pxref{Optional parameters}.)

@item #nodeid
@vindex nodeid
@cindex Network node ID
@cindex Node ID
This string, limited to 19 characters, defines the
unique ID by which your node will be known.  It is used
by the internals of the networking software, so it will
never be shown directly to users.

What can this unique string consist of, you ask?
Why, it's no more than your telephone number.  It must follow
a strict format:
@example
<@var{country code}> <@var{area code}> <@var{phone number}>
@end example
Country codes are listed in @ref{Country Codes}.  (Canada
is @samp{CA}, and the United States is @samp{US}.)  The area code and
phone number are what you'd expect.  Punctuation (dashes,
parentheses and so on) are allowed; they're stripped when
the string is actually used for anything.  As an example,
the following is @code{secret}'s
@vindex nodeid
@code{#nodeid}:
@example
#nodeid "CA (403) 425-1779"
@end example

@item #define sharedrooms
@vindex sharedrooms
@cindex Room sharing limit
This variable defines the maximum number of rooms
which may be shared with any one system on your net-list.
The limit has historically been 16; this value should be
perfectly adequate for most systems.  If you're sharing a
lot of rooms (say, you're a major hub system), you'll want
to put this higher.  Each shared room slot occupies 10
bytes for each node in your net-list.

Once you've
configured your system for the first time,
@code{sharedrooms} can only be changed
@pindex nchange
by running @code{nchange}; see @file{nchange.man} for more.  Do @emph{not}
simply change the value in @file{ctdlcnfg.sys} and run @code{configur};
@pindex configur
things will either come to a screeching halt (if you're
lucky), or blow up violently (if you're not).

@item #netdir
@vindex netdir
@cindex Network files directory
This is the directory in which Fnordadel will
put all the files needed in networking; these files will
include @file{ctdlnet.sys} (your net-list), @file{ctdlloop.zap} (the
loop-zapper database; @pxref{The loop-zapper}), and many
files of a temporary nature.  Make sure this directory is
on a device with some amount of free space (i.e., don't try
to cram it on a floppy which has 3k free) because the
temporary files written here can sometimes be fairly large
if you do a lot of networking.

Note that
@vindex spooldir
@code{#spooldir} is a synonym for
@vindex netdir
@code{#netdir}.
@end table

@node Optional parameters, Setting up for networking, Required parameters, Networking Configuration
@subsection Optional parameters

Many of these parameters are of the ``nice to have, but
not absolutely necessary'' variety.  Fnordadel will try to use
reasonable defaults where applicable.

@table @code
@item #organization
@vindex organization
@cindex Network organization name
@cindex Organization name
To make up for short
@vindex nodename
@code{#nodename}s (@pxref{Required parameters}),
you may define a string of up to 39
characters which will be used to provide a slightly better
description of your system in networked messages.  It is
displayed at the end of message headers in shared rooms.
For example, let's say we're running a @sc{bbs} called
``The Round Table''.  Now, this is longer than 9 characters,
so we don't want to use it as-is for a
@vindex nodename
@code{#nodename}.  So, we define
@vindex nodename
@code{#nodename} as @samp{RT}, which is easy to remember and type, and
use an
@vindex organization
@code{#organization} like this:
@example
#organization "The Round Table, Edmonton"
@end example
The headers on messages from our board will appear
like this:
@example
90Jul20 8:24 pm from Biff @@ RT (The Round Table, Edmonton)
@end example
@vindex organization
The @code{#organization} field can say anything, really;
some people like to put witty little sayings in there or
whatever.  Just keep it clean.

@item #domain
@vindex domain
@cindex Domains
@cindex Network domains
The @code{#domain} field tells the system what Citadel-86-style domain
your system belongs to.  A domain is a group of network systems, usually
organized by geographical region, but the grouping could be based on
anything at all.  If you don't know what domain you're a part of, leave
this field commented out or define it to be the empty string (i.e.
@code{#domain ""}).  You can set the field later.

This field is
primarily for Citadel-86 compatibility, which uses state or province
abbreviations as domains.  Ask around your area to see if a domain exists,
and join it if so.  If not, start your own, or join a domain from another
region.  Please don't put a junk value in this field; leave it blank
unless you're joining or starting a real domain.  @xref{Domains}.

If you define a domain, it will appear in the headers of messages
originating on your system.  The domains of other systems will appear
in message headers from those systems.
Continuing the example from above, with system RT, if we define
@vindex domain
@code{#domain} as @samp{Alta}, message headers will look like this:
@example
90Jul20 8:24 pm from Biff @@ RT.Alta (The Round Table, Edmonton)
@end example

@vindex receiptk
@cindex Network file receipt limit
@vindex receiptdir
@cindex Network file receipt directory
@item #define receiptk
@itemx #receiptdir
Since Fnordadel can accept files sent from other
systems on the network, we have to tell it how much we're
willing to accept, and where to put these files.

The variable @code{receiptk} should be defined as the
number of kilobytes which will be allowed to accumulate in
your receipt directory before Fnordadel will refuse to
accept any more files over the network.  Notice that this
really doesn't have anything to do with the amount of free
space available on your storage device, though obviously
if you run out of space, files will not be received.  What
actually happens is that prior to the receipt of a file,
Fnordadel will add up the sizes of the files currently
in your receipt directory and compare the number with
your defined @code{receiptk}; if the addition of the new file
would cause the total amount of used space to
exceed @code{receiptk}, then the file will be refused.
The upshot: clean out your receipt directory after you
receive files from other systems.

@vindex receiptk
@code{#receiptk} defaults to @samp{100}.

@vindex receiptdir
@code{#receiptdir} is, as you'd expect, the name of the
directory in which to put received files.  If you do not
define it, it defaults to
@vindex netdir
@code{#netdir}.

@item #define allnet
@vindex allnet
@cindex Network privileges
This simple binary switch tells Fnordadel whether
you want to give out net privs to all new users.  If set
to @samp{1}, all users will be given net privs when their account
is created; when set to @samp{0}, the Sysop must explicitly grant
net privileges individually (@pxref{User Status Commands}).
See @code{[N]et-save} in @ref{The Message Editor}, and
@code{.E(nter) N(et-message)} in @ref{Multi-key message entry commands}, for
a description of what the possession of net privs allows a user to do and how.
See also @file{flipbits.man} for a description of a utility to set the
@pindex flipbits
net privilege flag for all users en masse.

@vindex netlog
@cindex Network activity log
@vindex netdebug
@cindex Network debugging
@item #define netlog
@itemx #define netdebug
These two binary switches set Fnordadel defaults
for network logging and debugging.  If set to @samp{1}, then the
logging/debugging is automatically turned on when you run
Fnordadel.  @xref{Logging and Debugging}.

@item #define zaploops
@vindex zaploops
@cindex Loop zapping
This binary switch tells Fnordadel to enable or
disable the loop-zapper.  The loop-zapper is used to
control
@cindex Vortex
@dfn{vortexes} in networked rooms; that is, the
phenomenon whereby erroneous backbone connections
somewhere along the network result in duplicate messages
being sent to your system.  @xref{The loop-zapper}.
Suffice it to say that
setting @code{zaploops} to @samp{1} will enable it; to @samp{0} will disable
it.

@pindex +zap (citadel)
The @code{citadel} command line switch @samp{+zap} is
another way to enable the loop-zapper.

@item #define purgenet
@vindex purgenet
@cindex Purge messages (network)
This binary switch, if set to @samp{1}, tells Fnordadel to use its
message purge feature on incoming network traffic, as well
as locally-entered messages.  For more information on the
purge feature, @pxref{Message purging}.  In a nutshell, the feature
lets Fnordadel automatically delete messages from undesireable
users or entire net nodes, which you specify.  Use with caution.

@item #define keepdiscards
@vindex keepdiscards
@cindex Discarded messages
@cindex Loop zapping
@cindex Purge messages (network)
This binary switch controls Fnordadel's treatment
of incoming net messages that are discarded, either by the
loop-zapper (@pxref{The loop-zapper}) or the message purger (see
above).  If set to @samp{1}, the flag instructs Fnordadel to keep
discarded messages in the
@vindex netdir
@code{#netdir}, for you to look at later.
At that time you may do such things as delete them or integrate
them into the message base.  @xref{The Net Menu}, for more
details on the commands to handle discarded messages.

If the flag is set to @samp{0}, messages discarded by the
loop-zapper or message-purger are lost forever.

@item #define forward-mail
@vindex forward-mail
@cindex Mail forwarding
@cindex Network mail forwarding
Another switch.  If set to @samp{1}, it tells Fnordadel
to allow mail to be forwarded through your system to
others.  If, for some reason, you want to disallow mail
forwarding, set @code{forward-mail} to @samp{0}.  @xref{Mail Routing}.

@item #define anonnetmail
@vindex anonnetmail
@cindex Network mail
This binary switch, if set to @samp{1}, allows your system to
receive net-mail from systems that are unknown to it.  This is
the default behavior of the system.  If you have unwanted
volumes of mail being dumped on you by mystery nodes, you can
set this parameter to @samp{0} and Fnordadel will reject netmail from unknown
systems thereafter.

@item #define anonfilexfer
@vindex anonfilexfer
@cindex Network file transfers
This binary switch is like the one above, but controls
file transfers with anonymous nodes.  If the flag is set to
@samp{1}, file transfers to and from unknown nodes are permitted.  If
set to @samp{0}, they are prevented.

@item #define pathalias
@vindex pathalias
@cindex Path aliases
Here's yet another binary switch; when @samp{1}, it
enables Fnordadel's path aliasing capability.  @xref{Mail Routing}.

@item #hub
@vindex hub
@cindex Network hub
@cindex Mail forwarding
@cindex Network mail forwarding
This is a string variable which should be set
to the nodename of the system to which undeliverable
mail is to be forwarded (which system, hopefully, will
be better equipped to deal with it than yours is.)
@xref{Hubbing}, for more information on
@vindex hub
@code{#hub}.

@vindex ld-cost
@cindex Mail cost
@cindex Network mail cost
@vindex hub-cost
@cindex Mail cost
@cindex Network mail cost
@item #define ld-cost
@itemx #define hub-cost
These integer variables define the cost, measured in ld-credits, of using the
Fnordadel long-distance mail routing and hub forwarding facilities,
respectively.  Ld-credits are given to users by the Sysop (see
@ref{User Status Commands}, for how to do so), and control who can send mail
that costs you money.
@end table

@node Setting up for networking, Related parameters, Optional parameters, Networking Configuration
@subsection Setting up for networking

Networking proceeds in one of two ways: your system can call another one, or
other systems can call yours.  Usually you'll do both, for local network
connections; for long-distance ones, you'll want to make specific arrangements.
There are two mechanisms for achieving networking: events, and polling.

@node Network events, Polling, Setting up for networking, Setting up for networking
@subsubsection Network events
@cindex Network event

If you don't know about events yet, go read
@ref{Events}.  As they relate to networking, events allow
you to schedule network sessions, during which your @sc{bbs}
will presumably call other systems (or be called by
other systems) for the sole purpose of networking.

The format of the event definition is laid
out in @ref{Events in General}; here we present an example only, with
a couple of points of note:
@vindex event
@example
#event NETWORK all 3:01 39 ld-net 1
@end example
The above line will set up a network event which
goes off at 3:01 in the morning, lasting for 39 minutes;
it will be named @samp{ld-net}; and it will apply to network
#1.  This means that your system will call only those nodes
that are part of net #1 during this session, though calls
@emph{from} all systems will be accepted.

During a network event, the @sc{bbs} is closed to the
users.  If a user connects, he will, after a delay, be
shown a message to the effect of ``The system will be in
net mode for @var{xx} minutes longer; call back later.'' If a
user is logged in before an event is scheduled to go off,
he will be warned five minutes beforehand that he'd better
terminate quickly.  When the event arrives, he will be
booted unceremoniously.

Upon commencing a net event, Fnordadel will call
all systems in the specified net for which there is
outgoing material.  In addition, you can configure things
so that certain nodes will be called whether there is work
or not; this is known as ``polling''.  (Note that this is
different from
@vindex polling
@code{#polling}, detailed in @ref{Polling},
below; we really must change the terminology@dots{})  See the @code{[F]}
command in @ref{Editing Nodes}.

Note that the event will always last the specified
number of minutes, whether the @sc{bbs} has finished calling
systems or not.  Indeed, you may want to set up a net
session for the sole purpose of reserving a time slot for
other systems to call yours.  (As we've mentioned before,
Fnordadel can receive network calls at any time, whether
it's in a network event or not.  But setting up an event
ensures that no user will be logged in.)

@node Polling, Summary of network events and polling, Network events, Setting up for networking
@subsubsection Polling
@cindex Network polling
@cindex Polling, network

@dfn{Polling}, in this context, refers to the ability
of Fnordadel to dynamically enter network mode whenever
there is outgoing work and the @sc{bbs} has been idle for a set
length of time.  This allows greater flexibility than does
the network event mechanism.

Essentially, we must tell Fnordadel the time
periods during which we want polling to be active; we must
also tell it the required length of idle time before
systems will be polled.  The syntax of the
@vindex polling
@code{#polling}
definition is as follows:
@cindex Polling declaration
@example
#polling <@var{net}> <@var{start-time}> <@var{end-time}> [@var{days}]
@end example
@noindent
The fields mean:
@table @var
@item net
The net number to poll (usually 0).
@item start-time
The time (in 24-hour format) to start polling.
@item end-time
The time to end polling.
@item days
An optional field which is either
@samp{all}, or a comma-separated list of days, as in
@samp{Mon,Wed,Fri}.
@end table
Most systems that engage in any local networking
put a fairly standard
@vindex polling
@code{#polling} line in:
@example
#polling 0 0:00 23:59 all
@end example
This causes the @sc{bbs} to poll network number 0 all
day long.

You can also define more than one
@vindex polling
@code{#polling}
duration; for example,
@example
#polling 1 4:00 20:00 all
#polling 2 20:01 3:00 all
@end example
@noindent
will cause net #1 to be polled from 4AM to 8PM, and net
#2 to be polled from 8:01PM to 3AM.

If you've got any
@vindex polling
@code{#polling} defined, you'll also
want to define the variable @code{poll-delay}.  This is the
length of time, measured in minutes, for which the @sc{bbs}
must be idle before Fnordadel will start polling.  A
decent value (or, at least, what we use) is around 15
minutes.

@node Summary of network events and polling,  , Polling, Setting up for networking
@subsubsection Summary of network events and polling

Most systems that engage in only local networking
find that
@vindex polling
@code{#polling} is perfectly adequate for
decent propagation times; setting up network events
is usually unnecessary.  Of course, if you've got users
calling within 30 seconds after the previous one hangs
up, you won't get much polling done; but we've never
seen a system that doesn't have idle time scattered
throughout the day.

If you do any long-distance networking, you'll
probably want to use a mixture of network events for
the long-distance stuff and polling for the local stuff.
It would be distinctly unwise to set up polling
for nets containing long-distance systems; you don't
want your board calling cross-country every time someone
enters a message in the applicable shared rooms, do you?
Instead, set up an event during the wee hours of the
morning, and get all the long-distance networking done
then.  You might want to coordinate things with your
long-distance connection; if both of you jump into a
network event at the same time, things will go quicker.

@node Special net keys
@subsubsection Special keys in network events
@cindex Special net keys
@cindex Commands during network events

There are a couple of special keys that you can hit while Fnordadel is in a
network event to make it do things.  You can use these only when Fnordadel
isn't in the middle of an actual net call.

@table @samp
@cindex Background process, Fnordadel as a
@findex ^Z (send Fnordadel to background)
@item ^Z
@dfn{Take Fnordadel to the background}.  If you run Fnordadel under some sort
of multitasker, hitting @samp{^Z} while in a network event causes the same
thing as when you hit it any other time---it causes Fnordadel to drop into
the background.  @xref{Multitasking and Fnordadel}.

@cindex Quit Fnordadel in net mode
@findex Q (quit Fnordadel in net mode)
@item Q
@dfn{Quit Fnordadel}.  Hitting @samp{Q} while in a net event causes Fnordadel
to exit completely, after confirmation.  This is a good way to stop the
system from calling those long-distance systems 100 times during the day.
@end table

@node Related parameters,  , Setting up for networking, Networking Configuration
@subsection Related parameters

There are a few other parameters that aren't strictly
networking parameters, but which will cause you networking grief
if they aren't defined properly.  They have to do with your
modem; @pxref{Modem Stuff}, for detailed descriptions.  Ones to watch:
@example
#define usa
@vindex usa
#define local-time
@vindex local-time
#define ld-time
@vindex ld-time
@end example

@node The Net Menu, Editing Nodes, Networking Configuration, Networking
@section The Net Menu
@cindex Network menu
@cindex Commands, networking configuration

The Net menu hides under the Sysop menu, which is reachable by
hitting @samp{^L} at a room prompt.  (@xref{Sysop Special Functions},
for more on Sysop commands.)
If you hit @samp{N} at the @samp{sysop cmd:} prompt, you'll be in the Net menu, from
which you can choose one of the following commands:
@cindex Network menu
@example
[A]dd node
[D]iscarded messages
[E]dit node
[F]orce poll to node
[P]oll network
[R]equest file
[S]end file
[V]iew net list
e[X]it to sysop functions
@end example

@table @code
@item [A]dd node
This command allows you to add new nodes to your net-list;
you must add a node to your net-list before you can send @emph{anything} to it.

You will first be asked for the node's name; type its
nodename (the hopefully short name by which the other node is
known.)  If the system is a Citadel-86, it probably has a long
and twisted name, so make sure you've got it spelled
correctly, or things like mail routing, auto-reply to incoming net-mail,
and other stuff won't work quite right.  Names will never exceed 19
characters, in any case.  Then, it'll ask you for the node ID of
the new system.  This is the node's phone number; it is, obviously,
vitally important to get this right.  It should be in the same format
as your own
@vindex nodeid
@code{#nodeid} (@pxref{Required parameters}).

Next, you'll be queried about the baud rate supported by
the new node; enter the standard baud rate code (@samp{0} is 300, @samp{1} is
1200, @samp{2} is 2400, @samp{3} is 9600 and @samp{4} is 19200).  Use
the highest baud rate
supported by the other node, even if it is higher than the highest
baud rate that yours supports.  Fnordadel is smart enough to pick
the lower of the two when it dials out; and this way you don't have
to edit your net-list if you happen to acquire a faster modem.  

Lastly, Fnordadel will ask you whether the system is
a long-distance node or not.  Make sure you tell the truth here;
this setting affects a number of things, including the method by
which dialout is done.  (@xref{Long-distance dialing}.)

The rest of the settings for the new node will default to
(hopefully) reasonable values.  In some cases you'll have to
immediately edit the node to set other things like net passwords,
Citadel-86 status, and so on.

@item [D]iscarded messages
@cindex Discarded messages
This command gets you into a small sub-section where you can
view and deal with incoming net messages that were zapped or purged
by your system, if you configured things to save such messages.
(@xref{Optional parameters}, for the way to configure this;
@pxref{The loop-zapper}, for details on the loop-zapper;
and @pxref{Optional parameters}, and @ref{Message purging}, for details on
the message purge feature.)  After
hitting @samp{D}, the system will either tell you there are no discarded
messages, or it will tell you the number of
discarded messages, show you the first one, and then give you the
following prompt:
@example
[A]gain, [D]elete, [I]ntegrate, [N]ext, [S]top:
@end example
@table @code
@item [A]gain
Redisplay the current message and prompt again.
@item [D]elete
Delete the current discarded message, if you confirm your desire to
do so, and advance to the next discarded message, if there is one.
@item [I]ntegrate
This is the interesting command.  If you confirm the
action, this tells Fnordadel to integrate the current discarded
message into your message base as though it had never been
zapped or purged.  It will be passed along to any backbone
systems sharing the room, just as it normally would have been.

You might run into difficulty if the message was in a
room that no longer exists on your system, or whose name has
been changed.  The same is true if the message came from an
STadel or derivative, and the room is aliased there to something
other than the name in use on your system, or if the room is
aliased to a different name on your own system (@pxref{Shared room aliasing}).
In any of these cases, Fnordadel won't know where to put the
message now, so it will ask you if placing the message in the
@code{Aide>} room is okay.  Once it's there, you can move it.  If you
don't okay the placement in @code{Aide>}, nothing is done.

If the message is successfully integrated into a room,
you will be asked if the discard message file should be deleted,
and then shown the next discarded message, if there is one.
If the message is not integrated, you will be returned to the
discard prompt.
@item [N]ext
Take you to the next discarded message, if there is one.
@item [S]top
Stop the discard message processing and return you to the net commands menu.
@end table

@item [E]dit node
This command takes you to the net node edit sub-menu.
@xref{Editing Nodes}, for an in-depth look.

@item [F]orce-poll node
This is a quickie command for forcing Fnordadel to make
a single net call to another system.  Supply a system name, and
Fnordadel will call the system regardless of traffic pending,
receive-only status, l-d status or anything else.

@item [P]oll network
This command allows you to force a one-time poll of the
specified network.  If anyone is logged in at the time, they will
be immediately terminated (with extreme prejudice, we might
add) and Fnordadel will call all nodes in the specified net
for which there is work.

@item [R]equest file
Use this command when you wish to get some files from some
system with which you network directly.  You'll be asked for the
system from which to request files, the room on the other system
from which to get them, the filename(s) to get, and the directory
on your system in which to place the received files.  The room on
the other system must be ``network readable'' (@pxref{How to share a room})
for the request to work.  You may use wildcards (@samp{*} and @samp{?}) in the
filename specification.

The file request will be spooled for later; the next time
your system connects with the other one, the request will be made
and, if the other system can oblige, the files will be transferred.

Note that it is possible to request files from a system
with which you have not previously networked.  Simply add the node
to your net-list in the standard manner, and @samp{[R]equest} the file as
usual---the other node doesn't have to know about yours.  (We use
this in the distribution of Fnordadel; any other node can call
us and request new versions, assuming they know the name of the
room and the filenames.  @xref{Fnordadel Support}.)

@item [S]end file
This command allows you to send a file or files to a node
with which you network directly.  You'll be asked for the target
node name and the name(s) of the file(s) to transfer; you should
provide the full path-spec, and wildcards (@samp{*} and @samp{?}) are permitted.
The sendfile will be spooled for later; the next time your system
connects with the other one, the sendfile will be made, subject
to space availability on the other system.  If there wasn't enough
space, the other node will say so and you'll get a message in
@code{Aide>} to this effect.  You will have to re-enter the send command
once the remote system has corrected its space problems.

@item [V]iew net list
This prints out a nicely formatted list of all the nodes
in your net-list.  The format is as follows:

@example
@group
* sysname              CA 403 432 1098      CRMF  2400 0,1
^       ^               ^                    ^      ^   ^
|        \              |                    |      |   |
"need     the name of   the nodeId      various   baud  |
to call"  the node     (phone number)    flags    rate  |
 flag                                                   |
                                                        |
                            nets to which the node belongs
@end group
@end example

The ``various flags'' may consist of one or more of the
following:
@table @samp
@item C
The system is a Citadel-86
@item R
The system is receive-only (i.e., your system will
never call it)
@item M
There is mail pending
@item F
There are file sends/requests pending
@end table
The ``need to call'' flag (the leading asterisk) appears if
there is any work pending for the node; it doesn't mean that your
system will call the node, because the node may be set to receive-only.
(@xref{Editing Nodes}.)

@item e[X]it to sysop functions
This should be blatantly obvious.
@end table

@node Editing Nodes, Roomsharing, The Net Menu, Networking
@section Editing Nodes
@cindex Editing network nodes
@cindex Nodes, network, editing
@cindex Network nodes, editing

There is a sub-menu under the Net menu (which is itself a sub-menu
under the Sysop menu; @pxref{The Net Menu}) which allows you to edit
various things pertaining to nodes in your net-list.  Nodes must obviously
be added to the list before they can be edited, using the @code{[A]dd node}
command; again, @pxref{The Net Menu}.
The commands on the node edit menu are as follows:
@cindex Network node edit menu
@cindex Node edit menu
@example
[A]ccess setting
[B]aud setting
[C]- set receive-only status
L[D] role reversal
[E]xternal dialer setup
[F]- set polling days
[I]D change
[K]ill node from list
[L]ocal setting
[N]ame change
[P]assword settings
[R]ooms shared
[T]oggle Cit-86 status
[U]se nets
[V]iew node configuration
e[X]it net editing
[Z]- set l-d poll count
@end example

@table @code
@item [A]ccess setting
An access string is an alternate way of dialing a system.
Normally, the dial command for the modem is formed by taking the
last seven digits of the node ID (for local systems), or the full
ten digits, i.e., including the area code, prefixed by a @samp{1} (for
long-distance systems), and sandwiching this between the dial
prefix and the dial suffix.  (This all assumes that you've got
@vindex usa
@code{#usa} defined in @file{ctdlcnfg.sys}; see @ref{Dialing out},
for more on this stuff.)

But if you specify an access string, Fnordadel forgets
all of the above, and simply spits the access string at the modem
(still sandwiched between the dial prefix and suffix.)  You'd use
this if you're dialing a country other than Canada or the USA, for
instance, or if you're dialing a system which is long-distance but
within your area-code. (Some telephone systems don't like it if you
dial 1-@var{areacode}-@var{number} within the @var{areacode}.)  Because the
string is used as-is, you can embed any special dialing commands
that your modem supports, like @samp{,} to pause the dial or whatever.

The access string is also used as a command line to pass
to an external dialer that you may have set up for this node; see below.

@item [B]aud setting
This allows you to change the node's baud rate.  The
acceptable values here are the same as elsewhere in Fnordadel:
@samp{0} is 300 baud; @samp{1} is 1200 baud; @samp{2} is 2400 baud;
@samp{3} is 9600 baud;
and @samp{4} is 19200 baud.  Note that Fnordadel will never attempt
to call out at a baud rate higher than the highest rate supported
on your system; so it's perfectly safe to list a system at 19200
baud if you're only running on a 2400 baud modem; one day, you
too may have a 19200 baud modem, and when you do, your @sc{bbs} will
be ready for it!

@item [C]- set receive-only status
A node can be set to
@cindex Receive-only (net node status)
@dfn{receive-only}, which means that
Fnordadel will never dial out to it, even if there is work
pending for that system---you'll have to wait until the other
system calls yours.

If you're entering nodes into your net-list for the sole
purpose of dialing out to them manually using the @code{[T]elephone} command,
(i.e., they aren't Citadels), then set receive-only status to prevent an
accidental network callout.

@item L[D] role reversal
This is somewhat of an outdated command; it allows you
to specify whether role-reversal will be performed with this
(presumably long-distance) system.  It defaults to Yes, so you
should never have to muck with it.

@item [E]xternal dialer setup
Fnordadel allows you to define an external dialer for
each net node; that is, a program which will do the work of
dialing and connecting with the system.  The main use for this
is if you're using some sort of service like PC-Pursuit, or a
packet-switched network, or whatever.  When using this command,
specify the external dialer number; Fnordadel expects to find
the external dialer programs in your
@vindex netdir
@code{#netdir}, named
@file{dial_@var{n}.prg},
where @var{n} is the dialer number.  If you have an external dialer
set for a node, it will use the access string as
the command tail to pass to the dialer.

So, say you're using PC-Pursuit.  You've taken the
PC-Pursuit dialer program and put it in
@vindex netdir
@code{#netdir} as @file{dial_1.prg}.
You've set the external dialer (using the [E] command) to "1".
You've set the @code{[A]ccess} string to @samp{-x foobar}.  When Fnordadel
dials this node, it will run the program so:
@samp{#netdir\dial_1.prg -x foobar}.
When the dialer program finishes, there should be a
carrier present and the baud rate should be set up correctly,
assuming the call connected.  Fnordadel will then proceed
with networking as normal.

@item [F]- set polling days
Despite the fact that this command has the word ``polling''
in it, it in fact has nothing to do with
@vindex polling
@code{#polling} (the ability
to make net calls at any time.)  Rather, this command lets you
specify the days on which the net node will be called @emph{whether
there is work pending or not}.  The calls will still happen only during
applicable network events.  This allows you to, say, regularly
call a long-distance network feed to pick up stuff,
even when there is no outgoing work pending.

The format of the days specification is any of @samp{Mon},
@samp{Tue}, @samp{Wed}, @samp{Thu}, @samp{Fri}, @samp{Sat} and @samp{Sun},
separated by commas.
So @samp{Mon,Wed,Sat} is a valid specification.  (This format is the
same as that used in the
@vindex event
@code{#event} and
@vindex polling
@code{#polling} definitions;
see @ref{Networking Configuration}.)

@item [I]D change
When a system with which you network changes its phone
number, you'll have to make the change in your net-list, and this
is how.  Just enter the standard node ID format:
@example
<@var{country}> <@var{area code}> <@var{number}>
@end example
@noindent
as in @samp{CA 403 425 1779}.

Note that if you change the node ID of
a system, the loop-zapper records for that node will be
invalidated.  The loop-zapper will pick up the change as a matter
of course (it will look like a new system, as far as the loop
zapper is concerned), so this isn't a problem or anything.

@item [K]ill node from list
This command will remove a node from your net-list.
Simply type its name; Fnordadel will ask you for confirmation
before it kills the node.

Currently Fnordadel does not unshare all the rooms
that this system was sharing; you must do so manually before using
this command, or things may screw up later on.  (Edit the room and
type @samp{U}; see @ref{Sysop room-editing commands}, and
@ref{How to share a room}.)
The confirmation prompt will remind you of this fact, in case you forgot.

@item [L]ocal setting
This command is for telling Fnordadel whether this
system is long-distance (i.e., out of your local calling area) or local.
You do want to be accurate with this; don't fib.

@item [N]ame change
If the node has changed its nodename, you'll want to
make the corresponding change in your net-list to keep everything
working smoothly.  Just type in the new name.

@item [P]assword settings
If you suspect security problems when networking with this
node, then set the passwords.  They must be agreed upon by you and
the other Sysop beforehand.  You'll define the password that your
system uses when calling the other one, and the password that your
system should expect from the other when it calls you.  They may be
the same, though for optimum security you'd want them different.

Please note that Citadel-86 systems use a different form of
net passwords, and therefore you must tell Fnordadel that this node is a
Cit-86, or passwords will not work.  See @code{[T]oggle Cit-86 status}, below.

@item [R]ooms shared
This command prints out a list of the rooms that your
system is sharing with this node.  Rooms with messages that need
to be sent to the node are flagged with an asterisk.

@item [T]oggle Cit-86 status
Actually, it's not a toggle, but @code{[C]} was taken.  Anyway,
if the node is a Citadel-86 system, you should tell Fnordadel
so by using this command.  The value of this flag is checked for
things like file requests, network protocol changes, and net
passwords, so it is
essential to turn the flag on for Citadel-86es.  Note that direct
Cit-86 derivatives like Citadel-68k for the Amiga are functionally
identical to Cit-86 (as far as networking goes) so you must turn
this flag on for them as well.

@item [U]se nets
Fnordadel uses the concept of
@cindex Network groups
@dfn{net numbers} to form logical groups of
systems.
When you first enter a net node into your net-list, it
defaults to being a member of net number 0.  But you can set it
up so that it's a part of a different net, or several nets at
once---valid net numbers are from 0 to 31.  These net numbers are
referred to in network event definitions (a node must be part of
the net to which the net event applies for Fnordadel to call the
node during the event) and in polling (which applies to specific
net numbers).  You may also remove a node from all nets; this
has the effect of removing it from the standard list of valid net
nodes printed out when a user hits @samp{?} when asked for the target
system of a piece of net-mail; and also removes it from
consideration when the system is trying to route net-mail
(@pxref{Path aliasing}).

The format of the @code{[U]se nets} specification is as follows:
To add a node to some nets while preserving the current settings,
use @samp{+@var{netlist}}.  To remove a node from some nets, use
@samp{-@var{netlist}}.
To specify a totally new set of nets, just use @var{netlist}.  What's
a @var{netlist}, you ask?  It's just a series of net numbers delimited
by commas or spaces.  For example, if the node is currently in
net 0 and 2, and you wish to add it to net 5, type @samp{+5} when asked
for the nets you want to use.  To remove a node from net 0 (the
default net), type @samp{-0}.

@item [V]iew node configuration
This command prints a quick summary of the settings for
this node.

@item e[X]it net editing
This exits back to the Net menu.

@item [Z]- set l-d poll count
You can tell Fnordadel how many times you'd like it
to attempt to call an l-d system during an event before giving
up, hence this command.  Normally the system will be called
until Fnordadel obtains a carrier, and then will not be
called again during that session, whether the call was a
complete success or not.  This command overrides that; just
specify the number of calls.
@end table

@node Roomsharing, Mail Routing, Editing Nodes, Networking
@section Roomsharing
@cindex Sharing rooms
@cindex Room sharing

For most systems, the primary purpose of networking is to share
rooms.  Rooms designated as shared (or ``networked'') by the Sysop will
have all messages entered in them sent to the systems with which he has
shared the room; the other systems have, presumably, set up the same
thing, and so you end up with a sort of super-room spanning several
@sc{bbs}es.  (There are zillions of little exceptions and modifications to the
above description, which we'll let you discover for yourself.)

@node How to share a room, Topography and backboning, Roomsharing, Roomsharing
@subsection How to share a room

To make a room shared, you need to edit the room.  This
is accomplished by @code{.A(ide) E(dit)} while in the room in question;
you must have Aide status (and be logged in, naturally) to use this.  In
this menu you'll find a few useful commands, detailed here.
(For more on the room edit menu, see @ref{The .A(ide) command}, and
@ref{Sysop room-editing commands}.  These are the commands we're
interested in here:
@cindex Aide room edit menu
@cindex Room edit menu
@example
[S]hared
[U]nshare
[Y]- toggle backbone status
[N]et readable
[Z]- autonetted room
[P]ermanent
@end example

@table @code
@item [S]hared
Use this command to make a room shared to start
with, and also to add new systems to the shared list for
this room.  When you hit @samp{S} you'll be asked if you want
to make the room shared; answering ``no'' will make the room
not shared and return to the menu.  (If the room was shared
before, it will still be made unshared, but no nodes will be
removed from the shared list for the room.  This may cause
strange behavior, so be careful.)

If you answer ``yes'', Fnordadel will ask for a
list of net nodes with which to share the room.  Typing
a @samp{?} will list the choices available to you; systems
must be in your net-list, obviously, before you can share
a room with them.  Simply enter the name(s) of the nodes, one at a time,
with which to share the room, and enter a @samp{<CR>}
with no node name at the prompt to finish.

@item [U]nshare
Use this command to remove one or more systems
from the sharing list for this room.  Simply type their
name(s), one at a time, and finish with a @samp{<CR>} at the prompt.  If you
want to make the room completely unshared, i.e., not a
network room any more, use this command to disable each
node currently connected to the room.  Then use @code{[S]hare}, and answer
``no'' to make the room non-networked.

@item [Y]- toggle backbone status
This command lets you turn backboning on
or off for one or more nodes with which the room is being shared.
@xref{Topography and backboning}, for more on backboning.

@item [N]et readable
This command tells Fnordadel whether files can
be requested from this room over the network.  It has no
effect if the room is not a directory room, obviously.
If you set the room to be not network readable, then any
and all file requests for this room will be refused.

@item [Z]- autonetted room
In a normal shared room, messages are only saved as
Networked messages if the authors have net privileges; this
can, however, be overridden using the
@cindex Auto-net (room type)
@dfn{autonet} feature.
If a room is autonet, all messages entered in it are saved
as net messages, regardless.

Use this with caution.  Especially if the room is a
long-distance networked room, you could be in for a rude
shock if a ruggie phones and dumps a load of rubbish into
it---you'll pay to send it all out over the net, and all
the other systems sharing the room will likely be very
peeved.

@item [P]ermanent
This is not strictly a networking option, per se,
but it rates a mention.  If a room is shared, you'll likely
want to make it permanent to stop Fnordadel from
automatically expiring it if it empties of messages.  (Say, 
if you haven't managed to call the feed for a while, or
whatever.)  Other systems tend to get peeved if shared
rooms start dropping off your system without any advance
warning, since their @code{Aide>} rooms will fill up with warnings
when they attempt to resume sending messages.
@end table

@node Topography and backboning, The loop-zapper, How to share a room, Roomsharing
@subsection Topography and backboning
@cindex Network topography
@cindex Backboning
@cindex Network backboning
@cindex Topography, network

The standard room sharing method, used for most
local connections, is for every system carrying a given room to
share the room with all other systems carrying it.  This kind of
arrangement would look like this:
@example
@group
        ---NodeA---          Every system is sharing the room
       /     |     \         with every other system.
  NodeB------)-----NodeD        
       \     |     /    
        ---NodeC---     
@end group
@end example
The main advantage in this setup is that it's quite
robust.  If a system suddenly drops off the net, it won't disrupt
anything (topography-wise, that is; people will probably notice, but it
won't necessitate any change in the room sharing method.)

However, it's not very efficient in terms of aggregate
time spent doing networking.  Whenever there are new messages in
the shared room, each system has to call all the others.  In
addition, this method is totally insane if the systems are not
local to each other, or if there is a large number of
systems sharing the room.  So, backboning was invented.

Backboning allows network messages to be passed on to another
node even if they weren't entered on your system.  More
specifically, if you turn backboning on for a given system, say @var{foobar},
in a given room, all messages received by your system (except
from @var{foobar} itself, of course) in that room will be sent
out to @var{foobar}, in addition to all messages entered locally
on your system.

What this does to the net map is allow much greater
flexibility in connections.  First, here is an example which employs a
central hub system with lots of little ``spokes'':
@example
@group
      NodeI  NodeB  NodeC          NodeA shares the room with
          \    |    /              all systems, while all the
           \   |   /               other systems share the
  NodeH----NodeA(Hub)----NodeD     room only with NodeA.  NodeA
           /   |   \               turns backboning on for all
          /    |    \              systems; the other systems
      NodeG  NodeF  NodeE          do not use backboning.
@end group
@end example
This arrangement will basically shift the bulk of the net load
to NodeA.  The other nodes will not know that any backboning is
going on; they will simply share the room in the standard manner
with NodeA.  NodeA is responsible for passing all of the other
systems' messages on to all the other systems by turning on
backboning.

This works pretty well in local situations, and in long-distance
situations where the cost of calling NodeA is not much
different than calling any one of the other nodes.  No node is ever
more than two hops away from any other, and so propagation times
are good.

In local situations you might want to use this arrangement
to reduce the aggregate time spent in net mode by concentrating it
on NodeA; the other systems will only have to make one net call
every time new messages are entered, instead of many calls.
However, you've probably noticed a drawback---if NodeA ever
disappears, the sharing scheme has to be redone, possibly by
promoting one of the other systems to be the hub.

In long-distance situations, there are often more cost-effective
ways of arranging things.  Here's another example:
@example
@group
  NodeC                NodeH          Nodes B, C, F, G and H
    \                   /             share as normal;
     \                 /              Nodes A, D, and E flag
    NodeA---NodeD---NodeE---NodeG     all other systems as
     /        |                       backboned.
    /         |                       
  NodeB     NodeF                    
@end group
@end example
This arrangement allows NodeG, for example, to net with
NodeE instead of a (possibly more distant) hub like NodeD.  It
allows Nodes A, B and C to rely on NodeD for their feed (we assume
in this example that A, B, C and D are all local to each other.)
(In this case, it would be nice if the Sysops of A, B and C helped
with NodeD's phone bill.)

There are many variations on the above examples; the
guiding rule is that if you wish to pass messages on to another
system, turn backboning on for that system.  But be @emph{very very}
careful that loops are not introduced in the net topography, or
you'll have a ``vortex''.
@example
@group
        NodeC         NodeH          Nodes B, C, F, G and H
         /\            /             share as normal;
        /  \          /              Nodes A, D, and E flag
    NodeA--NodeD---NodeE---NodeG     all other systems as
     /       |                       backboned.
    /        |                       
  NodeB    NodeF                    
@end group
@end example
This modification of the previous example illustrates how a vortex can
happen.  NodeA and NodeD are each backboning a room to all their net
connections.  NodeC incorrectly decides to share the room with both
NodeA and NodeD.  Thus, every message entered on NodeC is sent to both
NodeA and NodeD.  But because NodeA and NodeD backbone the room to
each other, they also send all of NodeC's messages to each other.  NodeD
will also send the duplicates out to NodeE, which will propagate them to
its local connections.  This obviously causes a lot of duplication (and
expense, if there are any long-distance connections).  To automatically
detect and eliminate this vortex problem, a loop zapper was developed.

@node The loop-zapper, Shared room aliasing, Topography and backboning, Roomsharing
@subsection The loop-zapper
@cindex Loop-zapper
@cindex Network loop-zapper

With the advent of backboning came sloppy net management.
(Well, we suspect that the sloppy net management was around before,
but it never had such a good opportunity to manifest itself.)
Anyway, if your room sharing arrangement has a loop in it,
you have what we in Edmonton dubbed a
@cindex Vortex
@dfn{vortex}.  (The term appears
to have gained national popularity.)  The loop-zapper is a brute-force
method of stopping vortexes.

The way it works is pretty simple.  Each incoming networked
message has in it the node ID of the originating system, the
date and time on which the message was created, and possibly a message ID
number from the system that originated the message.  Fnordadel keeps a
database in which it stores the node IDs of all systems from which
it has ever---directly or indirectly through backboning---received
a message.

For each node ID, Fnordadel then records the date of the latest message to be
received, and what its message ID number was (if any; STadel does not pass
along such information, but Cit-86 and its clones for other machines
do, as does Fnordadel).  Moreover, this is done in each room
in which messages have been received.  So
when new messages come in, the node IDs, dates, message ID numbers
and rooms of the
messages are checked against the loop-zapper database.  If a
message
@itemize @bullet
@item
is dated earlier than the latest one received in that room
from that node, and
@item
has a lower message ID number than is recorded in the database
@end itemize
@noindent
it is assumed to be an old message coming back again, and will be rejected.
A message to that
effect will be printed on the screen (and in the net-log, if you're
keeping one.)

To enable the loop-zapper, either define the @file{ctdlcnfg.sys}
@pindex +zap (citadel)
variable @code{zaploops} to @samp{1}, or invoke @code{citadel} with the command
line argument @samp{+zap}.  The loop-zapper database is kept in your
@vindex netdir
@code{#netdir} as @file{ctdlloop.zap}.  If you happen to delete this file,
you'll have to reconfigure and start the loop-zapper again.  The
loop-zapper will be built as the messages come in; you can also
build a loop-zapper which reflects your current message base by
running the utility @code{makezt}.  The contents of your loop-zapper
@pindex makezt
@pindex scanzt
database may be viewed by using the utility @code{scanzt}.  See the
respective man pages for directions on using these programs.

Fnordadel tries to be smart about detecting truly looped
messages, versus ones that are abnormal but not duplicates.  This is
why it checks both the date/time stamp @emph{and} message ID number of each
message, and only rejects those where both values are older than
the database shows.  For example, it's possible for a glitch or system crash on
another system to cause it to start sending you messages with
message ID numbers that look old; but if
the dates are new, the messages will be accepted, not rejected, on the
assumption that the other system's message ID counter got reset to a value
lower than before.

Likewise, the clock may have been screwed up on some other system (e.g., its
clock got set to some point in the future, some messages were sent out, and
its clock is now back at the correct
value, or else it got set to some point in the past and hasn't been
corrected yet).  Your loop-zapper database will thus show a date/time
that is greater than the one on the incoming messages, but as long as
the messages have new message ID numbers, they will be accepted, not rejected.
Note that no version of STadel ever sends the message ID number, so
the loop-zapper only has the date/time stamp to work with.  Thus it's
easier for Fnordadel to mistakenly start zapping messages from an
STadel, if that node's clock got messed up.

The Fnordadel loop-zapper database is also self-correcting
to some degree.  When any message is accepted in a room, both its
date/time stamp and message ID number are recorded as being the newest ones
seen, even if they are lower than what was there before.  In this way,
your database will weed out incorrect date/time values, or message ID numbers.
It can't weed out both if they occur simultaneously, though; if a new
message comes in and has the bad luck of having an old date/time and
an old message ID number, the loop-zapper will reject it.

If you ever have
a node get screwed up and the database doesn't seem to correct itself,
the only way to stop Fnordadel from zapping all the node's messages
is to delete your @file{ctdlloop.zap} file and start from scratch.  Run the
@pindex makezt
@code{makezt} utility to build a new database from your current message
base, or just let Fnordadel run and accumulate new information over
time.

From time to time, your system may incorrectly zap a small
number of messages from one or more nodes, and then return to normal.
Zapped messages can be saved off-line if you so desire
(see @code{keepdiscards} in @ref{Optional parameters}.)
You may then read through them and optionally delete them
permanently or tell Fnordadel to integrate them into your message
base (if they look like they were zapped in error).  @xref{The Net Menu},
for instructions on these commands.

Although the loop zapper is quite smart, there's currently one glitch in it.
You may notice that if two identical messages come in during the same network
call, the zapper will let both of them all through.  Hey, so it's only close
to perfect@dots{}

@node Shared room aliasing, A few hopefully wise words, The loop-zapper, Roomsharing
@subsection Shared room aliasing
@cindex Network room alias
@cindex Room alias
@cindex Aliasing shared rooms
@cindex Shared room aliasing

If you don't like the standard name by which a shared
room is known on the network and would like to have that room
differently named on your system, you can accomplish this using
shared room aliasing.

Simply put a file called @file{alias.sys} in your
@vindex netdir
@code{#netdir}.
It should consist of @samp{<TAB>}-separated fields as follows:
@example
<@var{system}> <@var{roomname}> <@var{alias}>
@end example
@table @var
@item <system>
is the name of the system to which the alias
will apply; the special name @samp{%all} makes the alias apply to
any and all systems with which you share the room.
@item <roomname>
is the name of the room on your system.
@item <alias>
is the name of the room on the other system(s).
@end table

We actually recommend against using the aliasing feature
unless there's a really good reason for doing so.  The standard
room names are usually fine, and more importantly, it's possible
to alias a room to another name and then share the room with
another system; the Sysop of the other system may not realise that
the room he's getting from you is the same as the standard net
room and may decide to share it with yet another system in such a
way as to create a vortex.  So if you use this feature, be very
careful.

Also note that if you are sharing aliased rooms with a system, and
change the name of that system in your net list, you must exit
Fnordadel and edit @file{alias.sys} to update it with the system's
new name.  If you don't, Bad Things will happen.

@node A few hopefully wise words,  , Shared room aliasing, Roomsharing
@subsection A few hopefully wise words

@itemize @bullet
@item
Be considerate when sharing or unsharing rooms with a
system.  If you tell another Sysop to share a room with
you, make sure you've shared it with him, or his @code{Aide>}
room will be flooded with messages reporting that your
system isn't sharing the room with his.
@item
We've already mentioned this, but it bears repeating
any number of times:  Be careful when using backboning,
and when sharing rooms in general.  Make sure you
understand the topography of the room in question before
messing about; you don't want to cause a vortex, do you?
<PROD>  No, you don't.
@item
Please try to police the net rooms.  This applies
especially to the national networked rooms, which cost
people money to transport.  If you have a twit or two
who are entering stupid messages (or, worse, ``vandalism''
type of stuff like 10K of profanities and so on), it is up
to you to stomp on it as soon as possible.  Moreover,
you must also be on the lookout for what Citadelians
refer to as @dfn{room drift}; if users on your system start
talking about Pascal programming in a networked Religion
room, you must put a stop to it.  Please be considerate
for your fellow Sysops downstream.
@item
You should be aware that there are some incompatibilities between
systems descended from STadel and those directly descended
from Citadel-86.  We are working on eliminating them all in
Fnordadel, and hope eventually to make Fnordadel a
seamless connection between the STadel network and the Cit-86
network.  For the time being, not everything works perfectly.
@xref{Networking with Citadel-86}.  As for normal room sharing, you
should have only one real problem any more:  Cit-86 messages
can only be 7500 characters long, while STadel and
Fnordadel messages can be 10000 characters long.  Thus
long-winded people posting on your system will get cut short
if the messages migrate over to a Cit-86.  This could cause
some confusion.
@end itemize

@node Mail Routing, Networking with Citadel-86, Roomsharing, Networking
@section Mail Routing
@cindex Routing network mail
@cindex Network mail routing
@cindex Mail routing, network

Another popular use for the Citadel network is for private mail.
In the simplest case, that of sending mail to another user on the same
system, mail delivery is an understandably easy job.  When you want to
send mail to a user on a system which connects directly with yours, it's
also a pretty easy thing.  However, when you want to route mail through
one or more intermediate nodes before it reaches its destination, things
get a little tricky.  This section details a few helpful features
designed to make mail routing simpler and more effective.

@node Net addresses, Path aliasing, Mail Routing, Mail Routing
@subsection Net addresses
@cindex Network addresses
@cindex Addresses, network

When you go to the @code{Mail>} room and hit @code{[E]nter}, the
system asks you to tell it to whom you want to send the mail.
If the mail is going to be a networked message, you have two
ways in which the address can be specified.  One is using @samp{@@}
notation, and the other is using explicit
@cindex Bangpaths
@cindex Network addresses
@dfn{bangpaths}, which
have as their distinguishing feature the @samp{!} character as a
separator.  The two forms produce identical results; it's just a
matter of taste, really.

The @samp{@@} form is as follows:
@example
@var{user}@@@var{system}
@end example
@noindent
which means that you wish to send the mail to the user
named @var{user} on the node called @var{system}.

The bangpath form is like this:
@example
@var{system}!@var{user}
@end example
@noindent
which means the same thing as the previous example.

If you want to send mail through several nodes, you'll
have to provide a `To:' address something like this:
@example
node_a!node_b!node_c!user ,
@end example
@noindent
or perhaps
@example
node_b!node_c!user@@node_a
@end example
@noindent
As you'll notice, the @samp{@@} and @samp{!} forms can be mixed.
The two examples above both address the mail to a user on
@samp{node_c}, which (we happen to know) is reachable by a direct
path from our system to @samp{node_a} to @samp{node_b} to @samp{node_c}.

Your system may also receive routed mail from other
systems with which it networks.  If the mail is destined for a
user on your system, then it is delivered to that user and the
message stops.  But the message may be addressed to someone on a
system further on.  If you want your system to be able to pass
such mail on, you'll have to make sure that the @file{ctdlcnfg.sys}
variable
@vindex forward-mail
@code{#forward-mail} is defined as @samp{1}.  If it's @samp{0}, your
node will simply reject all routed mail.

@node Path aliasing, Hubbing, Net addresses, Mail Routing
@subsection Path aliasing
@cindex Path aliases
@cindex Network path aliasing

So, forming net addresses is easy, right?  But it's a
pain to have to remember explicit addresses through half a dozen
other systems to reach the one you want.  So Fnordadel allows
you to define, once and for all (or until you change the
definition), the paths to systems.  Then when someone wants to
send mail to someone on such a system, they need only type a `To:'
field of @samp{user@@system}, and let Fnordadel figure out where
@samp{system} is.  You can also use the path aliasing feature in
strictly local situations; if you have, say, a Citadel-86 system
with a really weird nodename, you can alias it to something short
and essentially pretend that its name (for the purposes of net
mail) has changed.

The way it works:  First of all, if you want to enable
the path aliasing feature, you should define the @file{ctdlcnfg.sys}
variable
@vindex pathalias
@code{#pathalias} to be @samp{1}.  If it's @samp{0}, Fnordadel won't
even bother.  The path alias data is stored in a file called
@file{ctdlpath.sys} in your
@vindex netdir
@code{#netdir}.  When someone enters a message
addressed to an unknown node, Fnordadel looks in this file for
an alias to the unknown system.  (Note that ``unknown'', in this
context, means any system which is not in your net-list, or which
is in your net-list and is not a member of any nets.
See the @code{[U]se nets} command in @ref{Editing Nodes}.
Also note that incoming mail from other nodes is
subjected to the same treatment; Fnordadel doesn't care
whether the mail is local.)  If it finds an address, it will
substitute this into the `To:' field of the message and mail the
message off to its target.  If the message was local, there may
be special charges (in terms of ld-credits) which apply to the
message; @pxref{Optional parameters}, on the @file{ctdlcnfg.sys} variable
@vindex ld-cost
@code{#ld-cost} for one such cost.

The @file{ctdlpath.sys} file consists of @samp{<TAB>}-separated lines of the form:
@example
@var{alias} @var{path} [@var{surcharge}]
@end example
@noindent
where @var{alias} is the nodename being aliased;
@var{path} is a string defining the path to the node; and
@var{surcharge} is an optional number of ld-credits
which will be charged to the user for using the
aliasing feature.

Here is a sample @file{ctdlpath.sys}:
@example
devnull @samp{<TAB>} poopsie!%s @samp{<TAB>} 1
alberta @samp{<TAB>} dragos!myrias!%s @samp{<TAB>} 2
Backfence @samp{<TAB>} Backfence [MN] @samp{<TAB>} 0
Silly @samp{<TAB>} Silly_Cit-86_Name[MN] @samp{<TAB>} 10
@end example
@noindent
The special sequence @samp{%s} means ``the destination node''.
In this example, let's say we wanted to mail to @samp{Holly} at the
system @samp{devnull}.  We enter a `To:' field of @samp{Holly@@devnull}.
Fnordadel discovers that @samp{devnull} is not in our net-list, so
it reverts to Plan B---path aliasing.  Searching @file{ctdlpath.sys}
for an entry for @samp{devnull}, it finds that the route to @samp{devnull} is
through @samp{poopsie}; so it massages the path into @samp{poopsie!devnull}
(since the alias specified @samp{poopsie!%s}, and @samp{devnull}, the
destination system, is substituted for the @samp{%s}).  After
appending the user name to the whole thing, the `To:' field is
@samp{poopsie!devnull!Holly}; Fnordadel now spools the mail for
delivery to @samp{poopsie}.  The user who entered the mail is charged
two ld-credits---one for the fact that it's long-distance mail,
and one for the surcharge listed in @samp{ctdlpath.sys}.

Or, in the above example, if we wanted to send mail to
a user on @samp{Silly_Cit-86_Name[MN]} and didn't want to make our users
or ourselves type that, we'd simply be able to give a `To:' field
of @samp{user@@silly} and let Fnordadel worry about it; it would
check the alias file and use the entry therein to massage the `To:'
field to @samp{Silly_Cit-86_Name[MN]!user}.

@node Hubbing, Domains, Path aliasing, Mail Routing
@subsection Hubbing
@cindex Network hub
@cindex Hubbing, network

What happens if your system gets mail addressed to an
unknown node, and it doesn't have an alias defined for that node?
If you have defined the @file{ctdlcnfg.sys} variable
@vindex hub
@code{#hub}, then your
system will have a last resort.  All mail which cannot be dealt
with either by direct connection with the target system, or by
an explicit path in the message in which the first node in the
path is directly connected, or by path aliasing, will be
forwarded to the system defined as your
@vindex hub
@code{#hub}.  This system
(hopefully) will be better able to deal with the mail than yours
was, either because it is connected to more systems directly, or
because it has a more extensive path alias file than you have.

Mail which is entered locally and is forwarded to the
@vindex hub
@code{#hub} for delivery can be charged extra ld-credits based on the
setting of the @file{ctdlcnfg.sys} variable
@vindex hub-cost
@code{#hub-cost}---see
@ref{Optional parameters}.

@node Domains,  , Hubbing, Mail Routing
@subsection Domains
@cindex Domains
@cindex Network domains

Domains are supported in this version of Fnordadel, but in
a somewhat superficial manner.  Primarily for Citadel-86 compatibility,
you can set the value of a @file{ctdlcnfg.sys} parameter called
@vindex domain
@code{#domain}, to tell Fnordadel what Citadel-86-style domain you are in.
@xref{Optional parameters}.  Citadel-86 uses this field for domain mail,
a feature Fnordadel does not yet support.

We also have some additional domain support.  By placing lines beginning
with a period (@samp{.}) character into @file{ctdlpath.sys}, we can tell
Fnordadel information about what other domains we are a part of and
about how to reach other domains.  For example, consider the
following lines in @file{ctdlpath.sys}:
@example
.uucp @samp{<TAB>} foobar!%s @samp{<TAB>} 1
.citadel
.uucp
@end example
@noindent
These lines define us to be members of the @samp{.citadel} and
@samp{.uucp} domains; in addition, they specify that any mail bound for
the @samp{.uucp} domain is to be routed through @samp{foobar} (and to be
charged, in the local case, an additional ld-credit.)

Look for better domain support in later versions.

@node Networking with Citadel-86, Other Networks, Mail Routing, Networking
@section Networking with Citadel-86
@cindex Citadel-86, networking with

Originally developed by Hue, Jr., back in the early days of
Citadel-86, the Citadel networker is a fairly flexible beast.  Indeed, it
has proved so flexible that numerous Citadel developers have mutated it in
a variety of interesting ways.  A major mutator, so to speak, was David
Parsons (orc), who did STadel, from which Fnordadel is descended.  Some
of the improvements and changes resulted in incompatibilities with Cit-86
networking.

It is our intention to eliminate or work around all of these
things at some point, hopefully in the near future.  In order to make your
Fnordadel work as smoothly as possible with a Cit-86, you should set the
Cit-86 status flag for it in your net list, and ask its Sysop to set the
STadel status flag for your system in his net list.   As of this
writing, the following are the areas in which Cit-86 and Fnordadel
networking differ:

@itemize @bullet
@item
Mail routing has been done in remarkably different ways.  Cit-86
supports STadel-style mail routing as a sort of after-hack, but
don't rely on it too much.  (Similarly, don't tell your local
Cit-86 friends to rely on you too much for mail routing, either.)
@item
Fnordadel currently has minimal support for Cit-86 domains, although
it will set the domain field on locally-originating messages, and pass
through the domain field on net messages from other systems.
@xref{Optional parameters}, and @ref{Domains}.
@item
Cit-86 supports a networking option to compress network information on
the fly.  Fnordadel does not yet support this facility.  This will
probably cause you to see messages something like ``Reply BAD: <10> unknown''
during networking sessions.  This is nothing to worry about.
@item
Cit-86 doesn't use the
@vindex organization
@code{#organization} field, or pass it on to other
systems that it nets with, so in backboned shared rooms, messages
from your system will lose the
@vindex organization
@code{#organization} field the first time
they pass through a Cit-86.
@item
Cit-86 also doesn't support the STadel message subject field.
@item
Cit-86 messages are limited to 7500 characters in size, while STadel
(and its descendants) support messages up to 10000 characters long.
Thus when your messages pass through a Cit-86, they may get chopped
short.
@end itemize

The following are incompatibilities which we inherited from STadel,
but which we have fixed:

@itemize @bullet
@item
The network sendfile/file request methods used to be different;
sending files to a Cit-86 would work (and sendfiles from the Cit-86 to
you would also work), but file requesting (in either direction)
wouldn't.  This is now fixed---everything should work.
@item
Fnordadel and Citadel-86 couldn't use the Ymodem protocol
during netting; they should be able to now.
@item
The network passwords should work fine now.
@end itemize

The following things are bits of funny business between Cit-86 and
Fnordadel, but are harmless:

@itemize @bullet
@item
If a Cit-86 is backboning any rooms to your system, you may notice
that each time it nets with your system, it will attempt to send
each backboned room, whether or not there are any new messages to be
transferred.  (It will send 0 messages, basically.)  We can't imagine why
it does this, but it seems to be normal and will not cause a problem.
@item
There are net commands that Cit-86 supports but Fnordadel doesn't,
and possibly vice versa.  In particular, Cit-86 has two commands
that Fnordadel doesn't yet know about: 8 (a different form of
room-sharing) and 10 (for data compression during networking).  They
will cause messages during
networking, such as ``Reply BAD: <10> unknown'', when a Cit-86 asks your
system to carry out such a command.  These are nothing to worry about.
@end itemize

@node Other Networks, Country Codes, Networking with Citadel-86, Networking
@section Interfacing to Other Networks
@cindex Networks, other, interfacing to
@cindex Interfacing to other networks
@cindex Connecting to other networks

Using the
@vindex event
@code{#event} mechanism, custom networking software and (often)
lots of system resources, it is theoretically possible to make your
Fnordadel talk to just about any other network in existence.  Of course,
most of the custom software has never been written, so it's largely
theoretical.

STadel had a program called @code{uucall}, which was for talking to
Unix machines using the @sc{uucp} protocol, and allowed incoming and outgoing
mail and News (the Usenet analogue to rooms).  @code{uucall} is not currently
supported by Fnordadel (and thus, is not included with it); it needs
some hacking.  If anyone is strongly interested in seeing it running, let
us know---we occasionally need a bit of encouragement.  Our plans
are, tentatively, to redo the @sc{uucp} support using a different approach,
but the @code{uucall} code is there, and with a little effort could be made to
work---it worked with Fnordadel for a long time, and then broke when we
changed something or other, and we've just never gone back and fixed it.

STadel also had a program called @code{bixcall}, which was for talking
to the Byte Information eXchange (BIX).  We've never seen BIX in our
lives, so we've no way of testing it at all.  We can send a copy to anyone
running Fnordadel and you can see if it works; there isn't much we can
do to support it, though.

@node Country Codes,  , Other Networks, Networking
@section Country Codes
@cindex Country codes

Country codes are used in your
@vindex nodeid
@code{#nodeid} (@pxref{Required parameters};
they consist of one to three letters which uniquely identify your country.
The following list is considered standard; it is purloined directly from
@file{COUNTRY3.MAN}, in the Citadel-86 documentation.
@example
Abu Dhabi               AH      Afghanistan             AF
Ajman (U.A.E.)          JM      Albania                 AB
Algeria                 DZ      Andorra                 AND
Angola                  AN      Anguila                 LA 
Antigua                 AK      Argentina               AR
Australia               AA      Austria                 A
Bahamas                 BS      Bahrain                 BN 
Bangladesh              BJ      Barbados                WB 
Belgium                 B       Belize                  BH
Bolivia                 BV      Botswana                BD 
Brazil                  BR      Brunei                  BU
Bulgaria                BG      Burma (Union of)        BM
Burmuda                 BA      Burundi                 UU
Cameroon Republic       KN      Canada                  CA
Cayman Islands          CP      Central African Empire  EC
Central African Rep.    RC      Chad Republic           KD
Chile                   CF      China (People's Rep)    CN
Colombia                CO      Congo Republic          KG
Cook Islands (Rarotonga)RG      Costa Rica              CR
Cuba                    CU      Cyprus                  CY
Czechoslovakia          C       Denmark                 DK
Djibouti, Rep of        FS      Dominica                DO
Dominican Republic      DR      Dubai (U.A.E.)          DB
Ecuador                 ED      Egypt, Arab Rep. of     N
El Salvador             SAL     Ethiopia                ET
Falkland Islands        FK      Faroe Islands           FA
Fiji Islands            FJ      Finland                 SF
France                  F       French Guiana           FG
French Polynesia        FP      Fujairah (U.A.E.)       FU
Gabon Republic          GO      Gambia                  GV
Germany (Dem. Rep)      DD      Germany (Federal Rep)   D
Ghana                   GH      Gibralter               GK
Greece                  GR      Greenland               GD
Grenada                 GA      Guadeloupe (Fr. Ant.)   GL
Guam                    GM      Guatemala               GU
Guinea                  GE      Guyana                  GY
Haiti                   HC      Honduras                HT
Hong Kong               HX      Hungary                 H
Iceland                 IS      India                   IN
Indonesia               IA      Iran                    IR
Iraq                    IK      Ireland, Rep of         EI 
Israel                  IL      Italy                   I
Jamaica                 JA      Japan                   J
Jordan                  JO      Korea (South)           K
Korea, Dem People's Rep KZ      Kuwait (Persian Gulf)   KT
Laos                    LS      Lebanon                 LE
Lesotho                 BB      Liberia                 LIB
Libya                   LY      Liechtenstein           FL
Luxembourg              LU      Macao                   OM
Madagascar              MG      Malawi                  MI
Malaysia                MA      Maldives                MF
Mali                    MJ      Malta                   MT
Mariana Islands(Saipan) SA      Martinique (Fr. Ant.)   MR
Mauritania, Islam Rep   MTN     Mauritius               IW
Mexico                  ME      Monaco                  MC
Mongolia                MH      Monterrat               MK 
Morocco                 M       Mozambique              MO 
Nauru Islands           ZV      Nepal                   NP
Nethelands Antilles     NA      Netherlands             NL
New Caledonia           NM      New Hebrides            NH
New Zealand             NZ      Nicaragua               NK
Nigeria                 NI      Norway                  N
Oman (Persian Gulf)     MB      Pakistan                PK
Panama                  PA      Papua New Guinea        NE
Paraguay                PY      Peru                    PE 
Philippines             PH      Poland                  PL
Portugal/Madeira/Azores P       Qatar (Persian Gulf)    DH
Ras Al Khaimah (UAE)    RK      Reunion Islands         RE
Rumania                 R       Rwanda                  RW
Saint Kitts (WI)        KC      Saint Lucia             LC
Saint Pierre + Miquelon QN      Saint Vincent           VQ
San Marino              RSM     Saudi Arabia            SJ
Senegal                 SG      Seychelles Islands      SZ
Sharjah (UAE)           SH      Sierra Leone            SL
Singapore               RS      Solomon Islands         HQ
Somalia Republic        SM      South Africa            SA
South West Africa       WK      Spain / Canary Islands  E
Sri Lanka               CE      St Helena               HI
Sudan                   SD      Surinam                 SN
Swaziland               WD      Sweden                  S
Syrian Arab Republic    SY      Taiwan                  TW
Tanzania                TA      Thailand                TH
Togo                    TO      Tonga                   TS
Transkei                TT      Trinidad and Tobago     WG
Tunisia                 TN      Turkey                  TR
Turks + Caicos Islands  TQ      USSR (Russia)           SU 
Uganda                  UG      Umm Al Qaiwan (UAE)     QA
United Arab Emirates    EM      United Kingdom / N Ire. G
United States of Amer.  US      Upper Volta, Rep of     UV 
Uruguay                 UY      Venezuela               VE
Viet Nam                VT      Virgin Islands (Brit)   VB
Western Samoa           SX      Yemen Arab Rep. (San'a) YE
Yemen, People's Dem Rep AD      Yugoslavia              YU
Zaire                   ZR      Zimbabwe                RH
@end example

