.\".AU
.\"Douglas P. Kingston III
.\".AI
.\"Ballistic Research Laboratory
.\"USA AMCCOM
.\"Aberdeen Proving Ground, Maryland.  21005
.\"(301) 278-6651
.NH 1
Building the \*M System
.NH 2
Organization of Source
.PP
The \*M sources are arranged in a hierarchical directory
structure under a directory such as /usr/src/local/mmdf.
The major directories at the top level are:
.IP \fBconf\fR 10
The \fBconf\fR directory contains subdirectories for each of several sample
sites, for example, csnet-relay or okstate.  Each of these subdirectories
contains most of the files necessary for compile-time
configuration of the \*M system.
.IP \fBdoc\fR 10
The \fBdoc\fR directory contains the NROFF/TROFF source for all \*M documents
except manual pages.
.IP \fBh\fR 10
Include files used by MMDFII.
.IP \fBlib\fR 10
The \fBlib\fR directory contains the source to the \*M library
(libmmdf.a) which is used in compiling all the other \*M programs.
There are five subdirectories in the \fBlib\fR directory: \fBaddr\fR,
\fBdial\fR, \fBmmdf\fR, \fBtable\fR, and \fButil\fR.
.IP \fBlib/addr\fR 15
contains the address parser.
.IP \fBlib/dial\fR 15
contains the PhoneNet dial in/out package.
.IP \fBlib/mmdf\fR 15
contains \*M specific shared routines.
.IP \fBlib/table\fR 15
contains the table lookup functions.
.IP \fBlib/util\fR 15
contains a variety of utility and system interface routines.
.IP \fBlibndir\fR 10
The ``new'' directory access routines for non-Berkeley Unix systems.
This directory may not be included on some distributions (e.g. 4.3BSD
where it is standard).
.IP \fBlibz\fP 10
The ``new'' timezone routines from 4.3BSD-tahoe.
This gives a more rational way of describing strange timezones
and also gives a ``better'' programmer interface.
.IP \fBman\fR 10
The \fBman\fR directory contains the source for all the \*M manual pages.
.IP \fBmh\fR 10
The sources for the MH system. (Not discussed here; see the online
documentation.  May not be included in all distributions.)
.IP \fBsamples\fR 10
The \fRsamples\fR directory contains subdirectories for each of several 
sample sites.  Each site typically contains the runtime-tailoring file
(mmdftailor) and other files such as tables, dialling scripts and 
helpful shell scripts.  Large tables will have been truncated
to a representative set of entries.
.IP \fBsrc\fR 10
The \fBsrc\fR directory contains the source to all \*M programs
except for the mail posting and mail reading user agent programs
(e.g. \fImsg\fR, \fIsend\fR, and \fIv6mail\fR).  Within this directory is 
a subdirectory
for each major program or program set, and one directory called
\fBtools\fR for
miscellaneous programs.
.IP \fBtestmmdf\fR 10
The \fBtestmmdf\fR directory is a complete \*M operational subtree that
can be used to install a test version of \*M in parallel with
another mail system (even another \*M) on the same system.
It also serves as a model of what
the \*M subtree should look like.
.IP \fBuip\fR 10
The \fBuip\fR directory contains user interface routines, primarily \fImsg\fR
and \fIsend\fR.  The subdirectory \fBother\fR contains a number of other user
programs for dealing with mail.
The subdirectory \fBucbmail\fR contains a recent version of Berkeley's
Mail program.  It has been modified to interface well to \*M.
.PP
The source directories are set up to use a hierarchical set of Makefiles.
The directories \fBlib, src\fR, and \fBuip\fR contain master Makefiles.
In each subdirectory is a file called Makefile.real and a program
(shellfile) called
.I gen.
The                                            
.I gen
program calls
.I make
with two parts, Makefile.real and a ``common makefile'' called
Makefile.com that is contained in a parent directory.
Makefile.com contains configuration specific information such
as compiler flags, installation directory names, #ifdef flags,
and the dependency generation code (for ``make depend'').
.PP
There is a strict convention for the format of #include lines
in \*M source files.  If you fail to follow the convention,
you will break ``make depend'' and thereby your makefile
dependencies.
The format is as follows:
.sp
.ne 10
#include <file.h>
.br
.ti 10
For standard include files in /usr/include
.br
#include <subdir/file.h>
.br
.ti 10
For files in subdirectories of /usr/include.
.br
#include ``file.h''
.br
.ti 10
For files in the \*M header file directory (typically ../../h).
.br
#include ``/fullpath/file.h''
.br
.ti 10
For specifying a particular header file by full path name.
.br
#include ``./file.h''
.br
.ti 10
For a file in the current directory.
.PP
There is a problem with the current ``make depend'' methodology
on systems that do not have compiler support for it.
Currently at least 4.3BSD, Ultrix v3, and System V r3.2 have this support. 
As a result, there are two version of the ``depend'' actions
in Makefile.com.
On systems that do not have compiler support,
due to the way the dependencies are generated, there is no
preliminary processing of the conditional compile lines.  Files
that conditionally include either one or another file appear
to the ``make depend'' code as though they included both files.
This problem does not show up until you are running the
.I make 
program for the first time.
.I Make
will complain about not being able to make
some header file that does not exist on your system.
The remedy is simply to edit the makefile that broke and 
delete the reference to the file that doesn't exist.
You can then run 
.I make
again.  
.PP
We regret that this process is necessary, but at least
it only has to be done once per site.
Luckily there are only a few files (maybe 5) that are affected.
Look out for the following problem files:  termio.h, ioctl.h,
and fcntl.h.
.NH 2
Getting Ready
.PP
\*M requires a significant amount of space for the
sources, documentation, and binaries
(about 8 to 10 megabytes for a full distribution).
The 4.3BSD distribution will take about 3 megabytes for the basic
sources, and documentation.
The running system will consume much less, about 2 megabytes of
installed binaries and tables, and you can remove your old mail programs.
You will need superuser privileges.
The distribution you receive may inadvertently contain old binaries
or libraries despite the best efforts of those preparing the distribution.
It is recommended that you do a ``make clean'' in the
directories
.B lib,
.B src,
and
.B uip
before starting.
You can accomplish this by running ``make clean'' from the top directory of
the MMDF source tree (the parent of \fBlib\fR, \fBsrc\fR, and \fBuip\fR).
This will give
you a clean slate upon which to base your compile.
.XX
Do a ``make clean'' in the MMDF root directory.
.NH 2
System Compile-Time Configuration and Generation
.PP
The configuration directory, 
.B conf,
contains one directory for
each site being supported that has compiled-in differences.
Many sites may share one compile-time configuration by using
the run-time tailoring facility to specify site-specific information.
There is also a shell program called
.I sitesetup
that is used to install a specified configuration.
The test configuration is set up to run out of the \fBtestmmdf\fR
subdirectory and should only be used for testing.
You will base your running configuration 
on an existing
system with possibly extensive changes.
The following site configurations are available for copying:
.sp
.IP bbn 12
A 4.3BSD Vax Internet host using domain servers for table lookup.
.IP 4.3vax 12
A 4.3BSD Vax running a minimal set of tables and using the
badusers and badhosts channels to pass off unknown addresses
to MCVAX.UUCP (haring.uucp).
.IP csnet-relay 12
A very large PhoneNet relay host with Internet access.
.IP okstate 12
A V7 Perkin-Elmer host on CSNET PhoneNet, UUCP and a local network.
.IP uclvax2 12
An Internet host with links to various UK networks; illustrates
authorization on a per-user basis.
.IP vgr 12
A 4.2BSD Internet host.
.IP vu44 12
A System V Release 0 based 68000 workstation connected by UUCP to a smart
mail gateway.
.PP
These configurations are supplied as examples and templates for building
your own configuration.
Do not modify the contents of any of these configurations.
You will make your own site's directory in the \fBconf\fR directory.
.XX
Make a directory named after your site in the \fBconf\fR directory.
.XX
Copy the contents of some other system's directory into your directory.
.NH 2
Compile-Time Tailoring conf/\fIsite\fB/conf.h
.XX
Edit the file conf.h
.PP
The constants at the top of this file should not need tailoring.
Possible exceptions might be NUMCHANS, NUMTABLES, and NUMDOMAINS.
These limit the number of domains, channels, and
tables (channel, domain, alias, and others),
The numbers supplied should only
need to be increased on a site acting as a major relay site
with a large number of channels.
The system will complain in the logfiles if the limits are reached.
The ``DL_'' definitions control certain basic
properties of the dial package used by phone and slave programs
for PhoneNet.
They should probably not be modified.
If the dial package is not used, they are ignored.
.PP
The section in conf.h entitled ``JNTMAIL Tailoring'' contains #defines
that are useful
primarily in the United Kingdom and gateways to it, like UCL-CS.
The JNTMAIL definition is used to enable code that is used on the JNT
mail channel.  The BOTHEND definition enables \*M to parse domain
names in either ``little-endian'' or ``big-endian''
format.  ``Little-endian'' is the
standard format in the DARPA Internet and is the format defined in
RFC-822.  ``Big-endian'' is used in the UK community, and perhaps elsewhere.
VIATRACE causes the relaying timestamp to conform to
UK standards by starting with ``Via:'' instead
of the Internet standard ``Received:''.
Despite the best efforts of some British, this remnant remains
from the days of RFC733.
Non-JNT systems will leave JNTMAIL, BOTHEND
and VIATRACE undefined.
.PP
The next section of conf.h contains the #include lines necessary to include
the file time.h and dir.h (as is used with the libndir package).
The former is typically /usr/include/time.h or /usr/include/sys/time.h
(a.k.a. <time.h> or <sys/time.h>).
The latter
may be called ndir.h on some systems.  This is typically
/usr/include/dir.h, /usr/include/dirent.h or /usr/include/ndir.h
(a.k.a. <dir.h>, <dirent.h> or <ndir.h>).
There are two #define lines here, define one.
One is for systems which use the ``struct dirent'' style espoused by the
standards organizations and currently in use in SysVr3,
this is S5DIRENT.
The other is for systems using the ``struct direct'' style espoused
by the BSD distribution,
this is BSDDIRECT.
These #defines select for differences in both name and meaning
of the two styles.
To tell the difference, 
S5DIRECT uses ``(struct dirent *)->d_reclen''
as the length of the directory entry,
and BSDDIRECT uses ``(struct direct *)->d_namlen''
as the length of the name-string.
.XX
Check where your time.h and dir.h are and fix the #includes, if necessary.
.PP
The final section of conf.h is used to define a macro that will identify
privileged UIDs that are likely to be submitting mail on behalf of other.
We have defined it as a parameterized
macro in the distribution, but you could undefine the macro
and write a real function called PRIV_USER() if necessary.
When used as a macro, it is assumed that the global variable
.I effecid
will contain the UID of submit.  Currently only submit uses
this macro/function.
The uid for \*M (effecid) is determined at runtime.
.XX
Check that the #define has reasonable UID values (root, daemon?, and effecid).
.NH 2
Compile-Time Tailoring conf/\fIsite\fB/conf.c
.XX
Edit the file conf.c
.NH 3
Public Names
.PP
The first section is PUBLIC NAMES.  The string
.I mmtailor
is the location of your runtime tailoring file.  This is typically
.I /usr/mmdf/mmdftailor.
.PP
The
.I locname
string should be set to your host name without the domain portion.
For example if your host is SPOOK.BRL.MIL, then your locname
should be ``SPOOK'', and your
.I locdomain
should be ``BRL.MIL''.
Case is not important, but it will be preserved in some cases, so
enter case as you would like to see it.  We prefer to use all caps.
Also note there are two external variables,
locfullname and locfullmachine,
which are the concatenations of
\fIlocname.locdomain\fP and \fIlocmachine.locname.locdomain\fP
respectively (\fIlocmachine\fP is documented below).
Neither of these variables are configurable.
.I Sitesignature
should not be altered as it is an indication of which mail system you
are running.
.I Mmdflogin
is the login id that you have chosen to give to the \*M mail system.
This is usually ``mmdf''.
The
.I supportaddr
string gives the address that the mailsystem will send problem
notifications to, and this is also the address that will be placed in
the from field of messages generated by the mail system.  This address
should reach the person or persons maintaining the mail system.
Normally, it is defined as ``Postmaster@\fIlocname.locdomain\fR'', which is, in 
turn, an alias for the appropriate systems people.
.XX
Configure \fIlocname, locdomain, mmdflogin\fR, and \fIsupportaddr\fR.
.NH 3
\*M Directories Locations
.PP
The next section, DEFAULT BASE DIRECTORIES, defines the location of 
certain \*M directories.
The comments are fairly clear about the use of most of them.
The locking directory will only be used if the link based locking
mechanism is used.  If it is, you should make sure this directory
is cleared at each reboot.  If you use MH, be sure to set "lockstyle: 2" and
set "lockldir: LOCKDIR" in MH's mtstailor file where LOCKDIR is the same
directory you choose for the MMDF locking directory (below).
.I Tbldbm
is not actually a directory but is instead the basename of the
DBM style database used by \*M to store tables for fast lookup.
See the manual section \fIdbm(3)\fR for more information.  Systems using
System III or System V will have to obtain this code from another
Unix site, preferably a 4.2BSD site.
The original V7 version of the DBM library only provides
for the files to be opened read/write.
If you have this version you will need
to modify it to try opening the files readonly if read/write
access fails.
The typical values are as follows:
.sp
.in +1i
.KS
.TS
l l .
\fIcmddfldir\fR	/usr/mmdf
\fIlogdfldir\fR	/usr/mmdf/log
\fIphsdfldir\fR	/usr/mmdf/log/phase
\fItbldfldir\fR	/usr/mmdf/table
\fItbldbm\fR	/usr/mmdf/table/mmdfdbm
\fIquedfldir\fR	/usr/mmdf/lock/home
\fIchndfldir\fR	/usr/mmdf/chans
\fIlckdfldir\fR	/tmp/mmdf
.TE
.KE
.sp
.in -1i
.XX
Configure directories, if necessary (unlikely).
.NH 3
Default Logging Parameters
.PP
The next section, DEFAULT LOG LOCATIONS & SETTINGS, controls the main
logging facilities of the \*M system.
There should not be any tailoring necessary here.
The
.I mlogloc
and
.I chlogloc
variables are somewhat magic, in that if they are simple file names,
then they are opened in the default logging directory (\fBlogdfldir\fR
above).  If they are full pathnames, then they will be opened as
specified.
They must exist for any logging to take place.  If they do not exist,
then no logging will take place.
Another possible tailorable item is the default logging level, which
is the third element of the ll_struct structure.  See the explanation
of the ll_struct structure in llog(3)
before altering.  This is normally tailored from
the runtime configuration file.
.XX
Adjust \fImlogloc\fR and \fIchlogloc\fR, if necessary.
.NH 3
Message Queue Parameters
.PP
The section MESSAGE QUEUE SUBSTRUCTURE
has only two tailorable entries,
.I warntime
and
.I failtime.
.I Warntime
is the minimum number of hours before \*M will send a
warning letter indicating that a message has not yet been delivered.
After
.I failtime
hours since submission, a message is eligible to be
returned as undeliverable.  Actual timing of warnings and returns will 
depend on how frequently the 
.I cleanque
program is run.
Neither of these actions will occur unless the program is run.
It is suggested that
.I warntime
be at least 1/2 day and more like 2 or
3 if you are connected to a large network (e.g. the Internet) where
there is a significant chance that a host will be down for a couple
of days on occasion.
.I Failtime
should be at least 3 days, especially on
large networks.  You should be able to take a machine being down over
a long weekend without returning mail.
.XX
Choose the \fIwarntime\fR and \fIfailtime\fR values (in hours).
.NH 3
Command Names and Locations 
.PP
The section COMMAND NAMES & LOCATIONS should only need tailoring if
you do change the names of the programs mentioned
(something you do at your own risk).
.NH 3
Submit Parameters
.PP
The value
.I maxhops
in the section SUBMIT TAILORING is the maximum number of times a message
may be relayed as indicated by the number of Received: lines before
the message is considered dead due to looping.  It is possible that
this value may have to be made significantly larger in the future
to handle mail that has passed to us through numerous RFC-822 UUCP hosts.
For now, we have used the value 20.
.PP
The \fIlnk_listsize\fR value
specifies the maximum number of addresses in a message
before it is considered to have a ``big'' list.
If there are more than the maximum number of addresses, then \*M
will not send a warning message for waiting mail and will only
return a ``citation'' for failed mail.  A ``citation'' consists
of the entire header plus the first few lines of the message
body.
.PP
The \fImgt_addid\fR will cause \fIsubmit\fR to guarantee the existence
of a Message-ID: line on every message entering the \*M system.
A Message-ID will only be added if it is missing.
.XX
Set the value of \fImaxhops\fR, \fIlnk_listsize\fR, and \fImgt_addid\fR.
.NH 3
Deliver Parameters
.PP
The section DELIVER TAILORING controls the deliver program.
.I Maxqueue
is the maximum number of messages that will be tolerated before deliver
stops sorting the mail queue before delivering.  If there are more than
.I maxqueue
messages in the channel's queue,
deliver will process the queue in the order it
is read which will probably not be the order in which messages
were queued.
A suggested value is 300.  This value can be larger if you do not
have any dial-in sites that might time out waiting for you to find a
message in pickup mode.
.I Mailsleep
is the number of seconds that the daemon sleeps between sweeps on the
mail queues looking for messages to deliver.  The value is typically
600 (10 minutes).
.XX
Set the values of \fImaxqueue\fR and \fImailsleep\fR.
.NH 3
Address Transformation
.PP
The section ADDRESS TRANSFORMATION should not be altered.  This section
was used to override the default header munging behavior.
It has been superceded by a more general mechanism, but this
table is kept in case the capability is needed again in some
special situation.  It cannot be runtime tailored.
.NH 3
Local Delivery Options
.PP
The next section, LOCAL DELIVERY TAILORING,
has several variables that can be tuned to local requirements.
The
.I dlvfile
variable is the name of the maildelivery control file (see the manual
section \fImaildelivery(5)\fR).  This should be ``.maildelivery''
to be standard and avoid confusion with the documentation.
.I Sysdlvfile
is the full path of the name of a maildelivery file
to be used if the user does not specify one.
If this is set to `(char *)0', then there will not be a default
maildelivery file.  This file must be owned by root and generally
unwritable.
.I Mldfldir
is used to control the location of default mailboxes.
If the variable is set to 0, the mailbox will be created in the user's
home directory.  If it is non-zero, it will be treated as the name
of a directory in which the mailbox name will be the same as the
username (old V7 style mail boxes).
.I Mldflfil
is the name to call the mailbox if the mailbox is going to be in the
user's home directory.
.I Mldfldir
and
.I mldflfil
have an inverse relationship.  Only one should be defined at a time,
the other should be zero.  We recommended that
.I mldfldir
be zero and that
.I mldflfil
be ``mailbox''.
Another common value for
.I mldflfil
is ``.mail''.
The strings
.I delim1
and
.I delim2
define the message prefix and message suffix respectively for mailbox
files.  These should probably not be altered as some user programs
may still have these values hardcoded to ``\\001\\001\\001\\001''.
If you are introducing MMDF for the first time at your site you will
not have this problem, but it is still unwise to change the delimiter
unless you have a very good reason.
.XX
Set the values of \fImldflfil\fR and \fImldfldir\fR.
.NH 3
UUCP Channel Parameters
.PP
The section UUCP CHANNEL TAILORING controls the behavior of the
.I rmail
and
UUCP channel
programs, the input side of the UUCP channel.
The things to tailor here are the strings
.I Uchan,
.I Uuxstr,
and
.I Uuname.
.I Uchan
defines the default channel that rmail will indicate as
the source channel for incoming UUCP mail.
This should probably be ``uucp''.
The string
.I Uuxstr
controls UUX
invocation.
One or both of the strings in this part may be removed
in the future as the UUCP channel is modified to use more of the
basic channel configuring facilities.
The string
.I Uuname
determines the name that appears in the blank:
.nf
From blah <date stuff> remote from ________
.fi
.br
.XX
Adjust the strings \fIUchan\fR, \fIUuxstr\fR, and \fIUuname\fR.
.NH 3
NIFTP Channel Parameters
.PP
The section headed NIFTP CHANNEL TAILORING is only for UK sites
running the JNTmail code.  Tailoring is self explanatory
(JNTmail spool location).
.NH 3
Multiple Host Feature Parameters
.PP
The variable
.I locmachine
in the section MULTIPLE HOST TAILORING must be changed to contain
your machine name.  This is the simple identifier that distinguishs
your host from others at your site.  This is used by code that
makes a collection of hosts look like one site.  This string
can also be set in the runtime configuration file for sites that
want to run common binaries.  This is normally the name of the host
minus the domain suffix (e.g. VGR for VGR.BRL.MIL, or
BRL-ORANGE for BRL-ORANGE.ARPA).
.XX
Set \fBlocmachine\fR to a string appropriate for your machine.
.NH 3
Authorization Parameters
.PP
The last section, AUTHORIZATION TAILORING, is tailoring for the
authorization code (`authorisation' for you folks in the UK).
The
.I authrequest
string is the address of someone who should get notices of
requests for authorization.
The
.I authfile
string is the file which should contain a politely worded warning
about usage of a restricted path.  The paper on authorization
in the \fIdoc\fR directory,
\fIConfiguring MMDF Authorization\fR by Steve Kille,
describes this facility in greater detail.  Typically
the address used for
.I authrequest
is simply the same as
.I supportaddr
in Section 2.5.1 of this paper.
.XX
Choose appropriate strings for \fIauthrequest\fR and \fIauthfile\fR.
.NH 2
Compile-Time Tailoring conf/\fIsite\fB/chan.c
.PP
The file chan.c is used to tailor certain channel and table
specific structures of \*M.
If you plan on using runtime configuration you can simply skip this
section since this need only be tailored by systems that plan
to hardcode in all channel and table information for speed or
size considerations.
.XX
Edit the file chan.c (if you are not using runtime configuration).
.PP
The variable
.I ch_dflnam
defined the name of the default channel to which mail is submitted.
In any normal system, this should be ``local''.
The definition for the head of the list of alias sources
follows ( Alias *al_list = (Alias *)0 ).
This should not be altered.
The following section defines two more tables (\fItb_mailids\fR and
\fItb_users\fR).  These are only used if the flag variable \fImid_enable\fR
is non-zero indicating that you wish to use the Mail-IDs feature
of \*M.  The Mail-IDs feature disassociates mail addresses from login names.
If Mail-IDs are disabled, you should still leave the table
definitions installed as they are referenced in other modules even
when not used.
.XX
Set \fImid_enable\fR to either 0 or 1 (1 enables Mail-IDs).
.PP
In the next section you should define and initialize channel, table, and
domain structures for all your channels if you are using a hardcoded
configuration.  This is not common and requires a reasonable
knowledge of C and structure initialization.  See the file h/ch.h
for a definition of the channel structures, h/tb* for table
structures,
and h/dm* for domain table
structures. Once these are defined and initialized,
proceed to add all your tables to the arrays
.I chsrch,
.I exsrch,
and
.I tblist.
You will also have to make sure you do not exceed the maximum
array sizes (NUMTABLES, NUMCHANS, and NUMDOMAINS).  (If necessary,
increase these values).  Finally count up the number of pointers
in each array and update the variables
.I tb_numtables,
.I ch_numchans,
and
.I dm_numtables.
.XX
Add pointers to your structures to the appropriate arrays.
.XX
Adjust the xx_numwhatits variables to indicate number in use.
.NH 2
Compile-Time Tailoring conf/\fIsite\fB/conf_dial.c
.XX
Edit the file conf_dial.c
.PP
This file is used to hardcode information for the dial-out package used 
by the PhoneNet channel (phone/slave).
You can ignore this file if you do not intend to use the PhoneNet code.
Although you can hardcode the information for ports (dial-out lines)
and lines (directly connected lines, no separate dialer),
the common practice
is to use runtime configuration.  If you want or need to hardcode,
see the d_*.h files for definitions of the contents of these structures.
As you add entries to the structures, be sure to update
the
.I d_num{prts,lines}
variables and don't exceed the definitions for
NUMPRTS and NUMLINES.  These maximums must be set even if you do
runtime configuration.
If you expect to need more ports or lines
than those #defines allow, even if doing runtime configuration, then
increase the size of these definitions appropriately.
.I D_calllog
is the file in which the dialing software will record call attempts
for billing or statistics purposes.  Choose an appropriate place.
Finally, the
.I d_dialprog
variable is the name of a program that will do dialing for your dial
out ports if you have such a program.  This variable is obsolete and
will likely be removed in the near future.
.XX
Check NUMPRTS and NUMLINES; adjust \fId_calllog\fR if necessary.
.PP
The section PHONE RELAYING TAILORING is for controlling the
behavior protocol layer of the dial package.
The arrays d_lrill and d_lxill have a bit for each of the 128 ASCII characters.
If the bit is set, then that character will never be sent
directly, but will be sent using a two character encoding in printable
ASCII.
These should not need altering unless your system is quite non-standard
and use of a certain character not already disabled causes your terminal
driver to not pass the character directly to the user.
.PP
The section PHONE LOGGING is similar to the logging section in conf.c
You may wish to adjust the path of \fIph_log\fR.  The same
is true of the string \fIdef_trn\fR.
.I def_trn
is a transcript file which is not size limited, but is recreated
at the beginning of each call.
.NH 2
Compile-Time Tailoring conf/\fIsite\fB/d_lock.h
.PP
This file is used to set the style of locking that the PhoneNet channel
will use on the dial-out lines.
You may ignore this file if you do not intend to run the PhoneNet channel.
.XX
Edit the file d_lock.h
.PP
In this file you determine where locks are to be placed,
the format of the lockfiles, and the method used to verify if
a lock is active.
.PP
UUCPLOCK determines if UUCP-style locking will be used and where
those locks will go.
If you intend for the PhoneNet channel and any of UUCP, tip, cu,
or uugetty to share dial-out lines, you must turn this on and set its
value to your UUCP locking directory, usually /usr/spool/uucp
or /usr/spool/locks.
If PhoneNet will have its own dial-out lines,
you may #undefine UUCPLOCK.
.PP
ASCIILOCKS determines the format of PhoneNet's lockfiles.
If you have UUCPLOCK defined, PhoneNet's lockfiles must be in the
same format as UUCP's.
It is easy to determine which format you should use.
Cd to UUCP's lock directory and examine one of the lockfiles.
If the file contains a human-readable string of digits,
then you should #define ASCIILOCKS.
If the lockfile contains only a few bytes of gibberish,
you have binary lockfiles and you should #undefine ASCIILOCKS.
(If you have binary lockfiles, you can read their contents with ``od -d''.)
.PP
SIZEOFPID controls the size of the lockfiles and is only
important if you have ASCIILOCKS defined.
To determine what value to use, cd to UUCP's lock
directory and do an ``ls -l'' on one of the lockfiles.
Subtract 1 from the size of the lockfile and set SIZEOFPID to that value.
.PP
ATTSVKILL determines how locks are to be verified.
Define this if your system can do kill(pid, 0) to check the
existence of a process.
.XX
Adjust UUCPLOCK. ASCIILOCKS, SIZEOFPID and ATTSVKILL as necessary.
.NH 2
Compile-Time Tailoring conf/\fIsite\fB/Makefile.com
.XX
Set HOST to match your configuration directory name
.PP
The SYSTEM definition is used to select the appropriate
versions of several files that are system type dependent.
Currently, we support SYSTEM types of `2.9', `4.1', `4.2', `v7', and `5.2',
corresponding to 2.9BSD, 4.1BSD, 4.2BSD, Version 7, and System V Release 2
respectively.
For 4.3BSD or SUNS, use `4.2' (you will need to compile the inetd
version of smtpd--smtpd.4.3.c or smtpd.sun.c--manually if you don't want
the standalone daemon).
Most (if not all) of the systems in current use can be
fit into one of these four types.
.XX
Set SYSTEM to the type for your system.
.PP
MMPREF is simply the string to be appended to the front of every
command when installed.  This is a seldom-used kludge retained for
system testing.  It should be blank.
The definitions of LIBDIR, CHANDIR, and TBLDIR must coincide with
the variables \fIcmddfldir\fR, \fIchndfldir\fR, and \fItbldfldir\fR
in conf.c (tailored above).
Typically these are /usr/mmdf, /usr/mmdf/chans, and /usr/mmdf/table
respectively.
BINDIR is the directory into which you wish to install the user interface
programs.  Typically, this is /usr/bin or /usr/local/bin.
On BRL Unix systems
this is /usr/brl/bin.
RCVDIR is the directory into which
you wish to install the various ``rcvmail''
programs.  These are automatic mail receiving programs that
are activated by the user's installation of a .maildelivery file to control
the delivery of mail to files and pipes.
The directory should be generally accessible but write protected
for security.  A typical value is /usr/mmdf/rcvmail.
.XX
Set the definitions for MMDF directories.
.PP
The next section relates to access control.
INSTALL should be set to the pathname of the
.I install
program on your system.
The arguments for INSTALL are set up to use with the BSD version
of install(1),
the SysV version has the arguments reversed which will no doubt
cause quite a bit of confusion if one it used on the wrong system.
For non-BSD derived systems a freely re-distributable version
of install is provided called 
.I installit .
The value of INSTALL will normally be either
\fIinstall,\fP or \fIsh ../../installit,\fP but sometimes 
\fIksh ../../installit\fP is necessary.
CHOWN should be set to the full pathname of the
.I chown
program on your system.
Normally this is either /bin/chown or /etc/chown.
MMDFLOGIN is the name of the account created for use by
the mail system, and must agree with the variable \fImmdflogin\fR
in the file conf.c (in Section 2.5.1 of this paper).
ROOTLOGIN is the name of the superuser account on your system
(first line in /etc/passwd), typically `root'.
PGMPROT controls the default mode for executables.  It should be
no less restrictive than 511 and no more permissive than 775
if you have a systems group for maintenance activities.  We recommend 755.
.XX
Tailor CHOWN, MMDFLOGIN, ROOTLOGIN, and PGMPROT if necessary.
.PP
The CONFIGDEFS line contains a wealth of tailoring, some of which
may be peculiar to your system and not known to me.
The line is used to define C preprocessor
variables.  To define a C preprocessor variable, prepend "-D" to the variable
and list it on the CONFIGDEFS line.  For example, to define DEBUG level one,
you would add
-DDEBUG=1 to CONFIGDEFS.
CONFIGDEFS is used to build both the CFLAGS and LFLAGS option lines
(these lines should end with $(CONFIGDEFS)).
The available preprocessor variables are:
.IP DOASSIGN 15
Enables the d_assign code in the dial package.  This code calls the program
/bin/assign to gain exclusive access to a file.  It does not appear that 
the d_assign code is ever used so don't bother defining DOASSIGN.
.IP SECURETTY 15
Many sites are running their systems with TTYs in more secure mode
than generally writable.  Usually these systems use the execute bit
to indicate write permission and have a privileged program make the
access.  If you are such a site, you will want to investigate
the effect of SECURETTY and modify it if necessary.  Vanilla sites
should not define SECURETTY.  BRL VAX UNIX sites must define SECURETTY.
.IP DEBUG 15
Most sites should enable DEBUG=1 unless there is a serious
crunch for space.  This will give you fairly detailed debugging of
the system if you need it.
Setting DEBUG=2 will include even more debugging for address parser
and reformatting code.
If you do not enable DEBUG=1, you will seriously
affect your ability to trace problems later.
Once you have your system up an running reliably you can recompile it
without DEBUG of either kind if you want the space and the very minor
performance increase.
.IP D_LOG 15
The same caution applies for D_LOG as for DEBUG.  This variable controls
logging in the dial package.
If you are tight on space or
if you don't use the dial package (no phone or
pobox channels) you may safely omit D_LOG.
.IP D_DBGLOG 15
This controls more debug logging for the dial package.
Again, if you have the
space and if you use the dial package (PhoneNet),
define it to allow extensive tracing if
problems arise later.
.IP RUNALONE 15
This makes the channel programs operate independently from \fIdeliver\fR.  It
hasn't been used for years and requires reading the code to understand its
effect.  Do NOT define RUNALONE! (it is used for debugging)
.IP V4_2BSD 15
Enables code that is specific for 4.2 BSD .  All 4.2 BSD sites must define this
variable.  This should be used by 4.3 BSD sites as well.
4.3 BSD sites will also want the new src/smtp/smtpd.4.3.c for use with INETD.
They will have to compile this manually for now (or copy it to smtpd.4.2.c).
.IP V4_3BSD 15
Enables code specific for 4.3BSD.  
Right now this is limited to the NAMESERVER support.
.IP NODIAL 15
Prevents the dial package (PhoneNet protocol) from being compiled.
This saves a fair amount of space and compile time.
Define NODIAL if you do not intend
to use the phone or pobox channels.
(You will also need to take `dial' out of Makefile.lib, see below.)
.IP SYS5 15
Enables code that does Bell System V tricks (probably also useful for System
III installations).  Note: if you are running System V, you must also append
-Drindex=strrchr and -Dindex=strchr to CFLAGS.
.IP SYS5r3 15
Enables code specific to System Vr3.
Note: if you have the WIN/TCP code 
you may need to add -I/usr/netinclude to CFLAGS and -lnet to NETLIBS.
.IP NODUP2 15
Define this variable if you don't have a dup2() system call or subroutine.
.IP NOFCNTL 15
If you defined NODUP2, then you should also define NOFCNTL if you don't have
the fcntl(x, F_DUPFD) system call either.
.IP NAMESERVER 15
Enables the nameserver lookup code for accessing domain servers.  The
NAMESERVER support is new.  You will be required to include either
tb_ns.fake.c or tb_ns.<sys>.c.  Currently there is only support for
4.2BSD networking.  See TB_NS below.
.IP NODOMLIT 15
Prevents Domain Literals (such as [10.0.0.59]) from appearing in addresses.
Since \*M doesn't currently handle Domain Literals properly, use of this option
is strongly advised.
.IP LEFTDOTS 15
Enables intpretation of dots as delimiters on the LHS of an @ in addresses.
For example, "user.host@yourdomain".  Since % or 822-routing is preferred here,
only enable LEFTDOTS if you have historical need to.
.IP -Dvoid=int 15
Define this translation if your C compiler doesn't understand voids (e.g. V7).
.IP NO_VARARGS 15
Define this variable if your machine doesn't allow variable numbers of
arguments to be passed to routines the way Vaxes (and some others) do.
.IP CITATION 15
Define CITATION=n to limit (to n) the number of lines of text included in error
returns by \fIrmail\fR and \fIniftp\fR.  n should be at least
six, if CITATION is defined at all.  If not defined, \fIrmail\fR will return
the entire message and \fIniftp\fR will return the first 500 lines.
.IP DBMCACHE 15
Define DBMCACHE if your version of dbm(3) builds databases in core and then
dumps them to disk with dbmcachedump().
.IP STATSORT 15
Define STATSORT if you want \fIdeliver\fR to sort the mail queue based on
a stat(2) of the message text file instead of reading the timestamp that is
stored in the message address file.  Using stat() is much more efficient but
it assumes the modified date of the text file hasn't been changed since the
message was queued.  This is usually a safe assumption so defining STATSORT is
recommended.
.IP DOTFORWARD 15
Enable code which looks for a file \fI~user/.forward\fP which specifies
an address to which to forward the mail.
This is implemented in submit similarly to an alias expansion,
and is different from using resend(1) in \fI~user/.maildelivery\fP in that 
the headers are not changed.
The file must either be owned by the user or one of the user id's
listed in the macro PRIV_USER,
and also must be readable by \fIsubmit\fP 
(which usually means \fImmdf\fP).
.XX
Tailor the CONFIGDEFS line to your site's requirements and system type.
.PP
The CFLAGS line is the combination of the CONFIGDEFS given above
and any C compiler dependent options.
The basic boilerplate content is ``-O -I../../h''
which asks for the object code optimizer and specifies the path to
the header file directory.  If you do not have an optimizer or
it does not work properly, remove the ``-O''.
.XX
Tailor the CFLAGS line to your system's C compiler.
.PP
LINT is the pathname of your lint program, if you have one.  If not,
define LINT to be something innocuous like `echo'.
LFLAGS are the flags to LINT; tailor as you like.
This line should end with $(CONFIGDEFS) just like CFLAGS.
LDFLAGS are the flags you want to give to the loader (ld).
These may be site dependent; for example, a PDP-11 will require use
of split instruction and data space by using `-i'.
Do not include libraries in the LDFLAGS definition.
Do not tailor MMDFLIBS.
SYSLIBS is a list of libraries required from the system given
either explicitly or using the -l\fIlibname\fR notation.
Typically you will require at least -ldbm for the hashed database
library if you are using it.
SYS5 systems using the WIN/TCP will need to use -lnet.
Systems without the new Berkeley directory access routines will also need
to include -lndir or ../../libndir/libndir.a.
The ndir library is normally supplied in the sub-directory libndir in
the \*M distribution.
The AR definition is simply the path or name of the library archiver,
typically just `ar'.
.XX
Tailor LDFLAGS and SYSLIBS (and perhaps LINT, LFLAGS, and AR).
.PP
CH_TB selects one of two types of table lookup.  The two choices: use
linear search tables (slow) or the hashed database mechanism (fast).
In an independent survey,
99 out of 100
sites recommended fast over slow (the 100th was a masochist).
If you don't have the dbm library, get it from some other site.
It was distributed with V7 and all BSD systems.  It is FAST.
Set CH_TB to `ch_tbdbm' if you want to use a dbm hashed
database (recommended) or `ch_tbseq' if you want to use linear
searched tables.
.PP
The TB_NS variable indicates which nameserver module to use.
There are currently only
two choices, `fake' and `4.2'.  `fake' is appropriate
if you didn't specify -DNAMESERVER in CFLAGS above
or if your system is a non-BSD4.2 Unix.
.XX
Tailor TB_NS.
.PP
LOCALUTIL is for listing special modules needed based on
different configurations.
.IP \(bu
If you do not want runtime tailoring, include tai_fake.o.
Otherwise you should include tai_file.o.  The latter is highly
recommended (tai_file.o).
.IP \(bu
You must include the name of one of the several locking code
modules.
There are many systems with home grown locking mechanisms that
are much better than those provided with vanilla UNIX.
4.2BSD comes with a very good discretionary locking mechanism.
Examine the various lk_lock.*.c files in lib/util and choose
one that is appropriate for your system and include the name
of its object module here (substitute .o for .c).
If you have a type of locking available for which we do not have
a module, choose one that is close to what you need and modify
it accordingly.
If you have no locking mechanism, you should specify lk_lock.o.
This will include a locking package that uses links to lock files.
If you use this version and you also use MH, then you can coordinate
mailbox locking between MMDF and MH by setting "lockstyle: 2" and
"lockldir: LOCKDIR" in MH's mtstailor file where LOCKDIR is the same
directory you choose for the MMDF locking directory
(see section 2.5.2).
.PP
The last item to tailor here is which dependency generation
script to use.  The first one is for systems that do NOT
have the proper support in \fIcc\fP.
It uses
.I grep
and
.I sed
to generate
the dependencies.  
The second entry for ``depend:'' comes in two parts and uses the options to
.I cc
to generate dependencies more accurately, 
by way of the C preprocessor.
The exact form this takes varies from system to system.
On ``pure'' 4.3BSD systems, you use \-M and cc will generate the dependencies.
On Ultrix v3 systems, the ``\-M'' flag was already being used for something else
and instead you use ``\-Em''.
On System V release 3.2 the preprocessor will only generate a list of
files which are included,
but with of proper masaging this list can be turned into proper dependencies.
These options are specified with a macro called ``THE_M_FLAG''.
Then there are two seperate sections of the entry,
one which handles the Ultrix/BSD system and the other for SysV.
The comments in the sample Makefile.com files should make this much clearer.
.XX
Make sure the proper version for your
system is uncommented and comment out
the other version, that that THE_M_FLAG has an appropriate value.
.NH 2
Compile-Time Tailoring conf/\fIsite\fB/Makefile.lib
.PP
There are only four things to be modified here: all defines at the top
of the file.
.PP
First, tailor MAKE.  If you need to use a special path for the make program,
then define MAKE to be that path, otherwise MAKE should just be `make'.
.PP
Second, tailor RANLIB.  Some systems (primarily System III and System V
sites) do not have the \fIranlib\fR archive table of contents program
and so must always create a library in the proper order for searching.
This is done with the
.I lorder
and
.I tsort
programs.  If you do not have
.I ranlib,
define RANLIB to be `libfix'.  Libfix is a shellfile
in the directory 
.B lib
that will do the proper things to build
a sorted \*M library.  If you are a site that has
.I ranlib,
then
simply define RANLIB to be `ranlib'.
.PP
Third, if you do not plan to use the dial package (no PhoneNet)
then remove dial from the list of SUBDIRS (in this case
you should also have defined NODIAL in Makefile.com).
Normally SUBDIRS will be ``addr dial mmdf table util''.
.PP
Fourth, if you need to use libz.a then 
uncomment the lines which "cd ../libz" and run make.
Also in the ``install:'' tag you may wish to copy libmmdf.a to
/lib, /usr/lib or some other place with something like:
.DS L
        $(INSTALL) libmmdf.a /usr/lib/libmmdf.a
        $(RANLIB) /usr/lib/libmmdf.a
.DE
.XX
Set MAKE, RANLIB, and SUBDIRS to appropriate strings.
.NH 2 
Compile-Time Tailoring conf/\fIsite\fB/Makefile.src
.PP
There are a couple of experimental or new channels that you may
want to use that are not on the line defining
SUBDIR, or it may be commented out (preceded by a #).
The standard entries are tools, submit, deliver, local,
list, delay, smtp, phone, pobox, uucp, and prog.
If you include the nameserver code you will need `delay', otherwise
it can be left out.
You may also want to remove references to
directories you know you are not going
to use.
This will save compile time, since you will not build things
you do not intend to use.  If you have specified -DNODIAL, you can safely
comment-out the phone and pobox directories.
.XX
Check the contents of SUBDIR and adjust if necessary.
.NH 2
Compile-Time Tailoring conf/\fIsite\fB/msgtailor.c
.PP
There are a quite a few things to tailor for the
.I msg
program.
The first is the number of messages supported in one mailbox.  This
is basically limited only by the host machine's address space.
The
.I msgtailor.c
file already has some typical values for 16 bit and 32 bit systems.
NMSGS is the maximum number of messages to be supported.  For 16 bit
systems, the maximum should be no more than 500, on 32 bit systems,
the upper limit is somewhat arbitrary, but does affect storage space.
We suggest 2000.
.I Savmsgfn
is the name of the place to save mail from the main mailbox (as
tailored in Section 2.5.7).  This is usually ``mbox''.
The string
.I resendprog
is a string that is fed to a subroutine of 
.I msg
to cause the resending
program (supplied as uip/other/resend.c) to be invoked.
It must begin with a `|' (pipe symbol) and
the remainder of the string must be the path to the resending program,
which normally gets installed in BINDIR (see Section 2.8).
It is possible to omit the full path but it is not recommended.
Note that a space character is required at the end of
.I resendprog.
The stand-alone section should be ignored.
.XX
Set up \fIsavemsgfn\fR and \fIresendprog\fR, and NMSGS if necessary.
.PP
The strings
.I dflshell
and
.I dfleditor
define the default shell for subprocesses and default editor
for two window answer mode (respectively).  Both can be
overridden by the normal shell variables (``SHELL'' and ``EDITOR'').
The default editor should be able to edit multiple files simultaneously
if invoked with more than one file name.
If you have no editors with this feature, set
.I dlfeditor
to your favorite editor and see the ``twowinfil'' capability
of .msgrc files.
.XX
Set up the \fIdflshell\fR and \fIdfleditor\fR.
.PP
The following variables are basically self explanatory and control
the default behavior of such features as command completion, paging,
and informative messages.
If in doubt, leave the settings alone.
The normal BRL settings are given below:
.sp
.TS
l l l .
int	pagesize = 22;		/* default line count */
int	linelength = 80;	/* default line size */

int	paging = OFF;		/* Internal paging of long messages */
int	verbose = ON;		/* Command completion (raw mode) */
int	keystrip = ON;		/* Strip header lines on display */
int	bdots = ON;		/* Binary box dots */
int	mdots = ON;		/* Mailbox dots */
int	bprint = ON;		/* Reading... messages */
int	quicknflag = OFF;	/* Turn off NEW before message prints */
int	filoutflag = ON;	/* Filter text (display controls as ^X) */
int	binsavflag = ON;	/* Save binary box on exec's & pauses */
.TE
.NH 2
Compile-Time Tailoring conf/\fIsite\fB/s_tailor.h
.PP
This file defines some of the operating characteristics of the 
\fIsend\fR and \fIsnd\fR programs.
There are three #defines you can tailor in this file.
Your choices are to either #define or #undef two of the following,
and change the value of the third.
SENTFILE causes a copy of each message sent to be placed in a file
called .sent in the user's home directory.
This option is obsoleted by the new version of \fIsend\fR; the user can
now tailor this feature by editing the .sendrc file in his home directory.
Formerly, FNCYPRNT was used to enable paginated printing of the message
by the review command.
Now, the user can tailor this feature by editing the .sendrc
file in his home directory.
PWNAME, when defined, enables the code that will try to get the
user's real name from the gecos field of /etc/passwd if no .signature
file exists.
The code stops at the first comma and knows about the '&'
notation for abbreviating the login name.
If your site has gecos fields which contain other
information or the format is not compatible, do not #define PWNAME.
SENDRC sets the name of the user's run-configuration file.
You probably shouldn't change this.
.XX
Check the settings of SENTFILE, PWNAME, and SENDRC.
.NH 2
Compile-Time Tailoring conf/\fIsite\fB/s_tailor.c
.PP
This is the main tailoring file for the \fIsend\fR and \fIsnd\fR program.
There are three things to tailor here.
Set the initialization of the strings for the default
line and screen editors, and the default spelling checker.
.I Dfleditor
should be set to the local default line editor.
.I Dflveditor
should be set to the local default visual (screen) editor.  This will be used
as the default editor in the \fIsnd\fR program.
.I Dflchecker
should be set to the local default spelling checker.
If the names are simple names (e.g. "ed") your users will be able
to find versions in their search paths; if the names are full paths,
\fIsend\fR and \fIsnd\fR will always run the versions you specify unless 
overridden by the user.
Users can always override these settings in their .sendrc files.
.XX
Set the strings \fIdfleditor\fR, \fIdflveditor\fR and \fIdflchecker\fR
for your site.
.NH 2
Other Compile Time Problems
.PP
If you are a 4.3BSD or SUN site or have access to the
Berkeley Inetd or another Internet super-server,
you may want the version of smtpd designed to
run under these super-servers.
For the time being, you will need to
move smtpd.4.2.c to smtpd.4.2.old
and install smtpd.4.3.c or smtpd.sun.c as smtpd.4.2.c in the
directory src/smtp so the makefiles can generate
the module you need.
In the future this difference will be more cleanly handled
in the configuration procedure.
.XX
If you really want to use a super-server, install smtpd.4.3.c or smtpd.sun.c.
.NH 2
Compiling Your \*M System
.PP
You are now ready to generate your version of \*M.
You must first go to the conf directory and install your
site specific files by running the `sitesetup' shell program
located there.  Yoursitname is the name of the directory
you chose and should also match the HOST variable in the Makefile.com
you edited earlier.
Please do not try to run this shellscript with C-shell or
some other non-standard shell.
.XX
In conf, run `sh sitesetup yoursitename'.
.PP
If you have not run a ``make clean'' yet, you should do so now.
.PP
Next you should go to the top directory and run ``make depend''.
This will go recursively through \fBlib\fR, \fBsrc\fR and \fBuip\fR
generating the dependencies for your system.  Remember the comments
about this mechanism made at the beginning of this document.
.XX
In the top directory, run `make depend'.
.PP
The master makefile in the top of the \*M source tree
will attempt to recompile everything in the subdirectories
\fBlib\fR, \fBsrc\fR, and \fBuip\fR (in that order).  You can also run
make in each of these directories alone, although
\fImake\fR must be run in \fBlib\fR first.
.PP
If you want to run each of the make's separately,
change directory to the \fBlib\fR directory and run \fImake\fR.
This should result in the file lib/libmmdf.a several minutes
later (15-30 minutes, depending on machine speed).
Assuming libmmdf.a was generated
successfully, change directory to the \fBsrc\fR directory
and run \fImake\fR to build the core \*M programs (burn another 15-30
minutes).
Finally, go to the \fBuip\fR directory and run \fImake\fR there.
In all cases, libmmdf.a must be built before any other directories
are made or the objects will not load successfully (they need
the library!).
.PP
Remember that make depend will insert some bogus dependencies if
you do not have
.I cc
\-M, so make will stop a few times.  When it does
remove the offending bogus dependency and continue.  You will only
have to do this once.  Make depend should not have to be run again
unless significant source changes are made.
.XX
If you didn't run the make's separately
above, run `make' at the top of the \*M source tree
.PP
Note that to use the Sun 3.4 \fImake\fR with the \*M makefiles,
you need to do specify MFLAGS=-r on the `make' command line (or -r
on the `gen' command line).  You must also include the .c.o: and .SUFFIXES: 
rules in your Makefile.com (see the sample \fBconf\fR directories).
.NH 2
Handling Problems While Compiling
.PP
If you run into problems you can always interrupt the process,
correct the problem, and continue by calling \fImake\fR again
from the directories \fBlib\fR, \fBsrc\fR, or \fBuip\fR (or just running the
master makefile again from the top directory).
Remember that if you try to build any of the subdirectories of \fBlib\fR, 
\fBsrc\fR, or \fBuip\fR (e.g. \fBsrc/deliver\fR)
while in that directory, you must invoke \fImake\fR via the shellfile
\fIgen\fR in the subdirectory.  \fIGen\fR takes all the same arguments
as \fImake\fR but includes the file ../../Makefile.com along
with ./Makefile.real by using the \-f option of \fImake\fR.
.NH 2
Additional Makefile Features
.PP
The makefiles in \fBsrc\fR and \fBuip\fR also support
the command ``make dist''
which makes a tar-format file with all the executable binaries
and a shellfile called ``install.sh'' which, if run, will install all
the binaries and chown/chmod them appropriately.  A ``make dist'' should 
only be run after the system has been successfully built and (preferably)
tested on the current system.  This facility makes it much easier to
maintain multiple systems from a master source machine and greatly
simplifies distributing and installing new versions.
(This facility is a bit flakey.)
.PP
As mentioned before, all the Makefiles support ``make clean''
and ``make depend'' (or ``gen clean'' and ``gen depend'' as
appropriate to your current directory).
