191560e75dfb3291bfcabafc6617322fbfa0d8cd
** CONF.C -- Sendmail Configuration Tables.
** Defines the configuration of this installation.
** NETV6MAIL -- set if you want to use "v6mail" that
** comes with the Berkeley network. Normally
** /bin/mail will work fine, but around Berkeley
** we use v6mail because it is a "fixed target".
** Also, only v6mail has the "/dev/mail" stuff
** V6 -- running on a version 6 system. This determines
** whether to define certain routines between
** the two systems. If you are running a funny
** system, e.g., V6 with long tty names, this
** should be checked carefully.
** Configuration Variables:
** Mailer -- a table of mailers known to the system.
** This should be fairly static. The fields are:
** - the pathname of the mailer.
** - a list of flags describing the properties
** M_FOPT -- if set, the mailer has a picky "-f"
** option. In this mode, the mailer will
** only accept the "-f" option if the
** sender is actually "root", "network",
** and possibly (but not necessarily) if
** the -f argument matches the real sender.
** The effect is that if the "-f" option
** is given to sendmail then it will be
** passed through (as arguments 1 & 2) to
** M_ROPT -- identical to M_FOPT, except uses
** M_QUIET -- if set, don't print a message if
** the mailer returns bad status.
** M_RESTR -- if set, this mailer is restricted
** to use by "daemon"; otherwise, we do a
** setuid(getuid()) before calling the
** M_NHDR -- if set, the mailer doesn't want us
** to insert a UNIX "From" line before
** M_NOHOST -- if set, this mailer doesn't care
** about the host part (e.g., the local
** M_STRIPQ -- if set, strip quote (`"')
** characters out of parameters as you
** transliterate them into the argument
** vector. For example, the local mailer
** is called directly, so these should be
** stripped, but the program-mailer (i.e.,
** csh) should leave them in.
** M_NEEDDATE -- this mailer requires a Date:
** M_NEEDFROM -- this mailer requires a From:
** M_MSGID -- this mailer requires a Message-Id
** M_ARPAFMT == M_NEEDDATE|M_NEEDFROM|M_MSGID.
** - an exit status to use as the code for the
** error message print if the mailer returns
** something we don't understand.
** - A list of names that are to be considered
** "local" (and hence are stripped off) for
** - An argument vector to be passed to the
** mailer; this is macro substituted.
** >>>>>>>>>> Entry zero must be for the local
** >> NOTE >> mailer and entry one must be for
** HdrInfo -- a table describing well-known header fields.
** Each entry has the field name and some flags,
** - H_EOH -- this field is equivalent to a blank
** line; i.e., it signifies end of header.
** - H_DELETE -- delete this field.
** There is also a field pointing to a pointer
** that should be set to point to this header.
static char SccsId
[] = "@(#)conf.c 3.14 %G%";
# include <whoami.h> /* definitions of machine id's at berkeley */
# define NETV6MAIL /* use /usr/net/bin/v6mail for local delivery */
/* local mail -- must be #0 */
static char *LocalArgv
[] =
static struct mailer LocalMailer
=
"local", "/usr/net/bin/v6mail",
M_ROPT
|M_NOHOST
|M_STRIPQ
|M_ARPAFMT
|M_MUSER
|M_NHDR
,
EX_NOUSER
, "$f", LocalArgv
, NULL
,
/* pipes through programs -- must be #1 -- also used for files */
static char *ProgArgv
[] =
static struct mailer ProgMailer
=
EX_UNAVAILABLE
, "$f", ProgArgv
, NULL
,
/* user-private mailers -- must be #2 */
static char *PrivArgv
[] =
static struct mailer PrivMailer
=
M_ROPT
|M_NOHOST
|M_STRIPQ
|M_ARPAFMT
,
EX_UNAVAILABLE
, "$f", PrivArgv
, NULL
,
/* local berkeley mail */
static char *BerkArgv
[] =
static struct mailer BerkMailer
=
"berk", "/usr/net/bin/sendberkmail",
M_FOPT
|M_NEEDDATE
|M_FULLNAME
|M_STRIPQ
,
EX_UNAVAILABLE
, "$B:$f", BerkArgv
, NULL
,
static char *ArpaArgv
[] =
static struct mailer ArpaMailer
=
"arpa", "/usr/lib/mailers/arpa",
M_STRIPQ
|M_ARPAFMT
|M_USR_UPPER
,
0, "$f@$A", ArpaArgv
, NULL
,
/* uucp mail (cheat & use Bell's v7 mail) */
static char *UucpArgv
[] =
static struct mailer UucpMailer
=
M_ROPT
|M_STRIPQ
|M_NEEDDATE
|M_FULLNAME
|M_MUSER
,
EX_NOUSER
, "$U!$f", UucpArgv
, NULL
,
struct mailer
*Mailer
[] =
&LocalMailer
, /* 0 -- must be 0 */
&ProgMailer
, /* 1 -- must be 1 */
&PrivMailer
, /* 2 -- must be 2 */
/* offsets for arbitrary mailers */
# define M_BERK 2 /* berknet */
# define M_ARPA 3 /* arpanet */
# define M_UUCP 4 /* UUCPnet */
** Final (null) entry contains the flags used for any other field.
struct hdrinfo HdrInfo
[] =
"date", H_CHECK
, M_NEEDDATE
,
"from", H_CHECK
, M_NEEDFROM
,
"full-name", H_ACHECK
, M_FULLNAME
,
"message-id", H_CHECK
, M_MSGID
,
** TTYPATH -- Get the path of the user's tty -- Version 6 version.
** Returns the pathname of the user's tty. Returns NULL if
** the user is not logged in or if s/he has write permission
** pathname of the user's tty.
** NULL if not logged in or write permission denied.
** Return value is in a local buffer.
static char pathn
[] = "/dev/ttyx";
/* compute the pathname of the controlling tty */
if ((i
= ttyn(2)) == 'x' && (i
= ttyn(1)) == 'x' && (i
= ttyn(0)) == 'x')
/* see if we have write permission */
if (stat(pathn
, &stbuf
) < 0 || !bitset(02, stbuf
.st_mode
))
/* see if the user is logged in */
** FDOPEN -- Open a stdio file given an open file descriptor.
** This is included here because it is standard in v7, but we
** Open /dev/null to create a descriptor.
** Close that descriptor.
** Copy the existing fd into the descriptor.
** fd -- the open file descriptor.
** type -- "r", "w", or whatever.
** The file descriptor it creates.
** The mode of fd must match "type".
f
= fopen("/dev/null", type
);
** INDEX -- Return pointer to character in string
** s -- a string to scan.
** c -- a character to look for.
** If c is in s, returns the address of the first
** NULL if c is not in s.
** TTYPATH -- Get the path of the user's tty -- Version 7 version.
** Returns the pathname of the user's tty. Returns NULL if
** the user is not logged in or if s/he has write permission
** pathname of the user's tty.
** NULL if not logged in or write permission denied.
** Return value is in a local buffer.
/* compute the pathname of the controlling tty */
if ((pathn
= ttyname(2)) == NULL
&& (pathn
= ttyname(1)) == NULL
&& (pathn
= ttyname(0)) == NULL
)
/* see if we have write permission */
if (stat(pathn
, &stbuf
) < 0 || !bitset(02, stbuf
.st_mode
))
/* see if the user is logged in */
** CHECKCOMPAT -- check for From and To person compatible.
** This routine can be supplied on a per-installation basis
** to determine whether a person is allowed to send a message.
** This allows restriction of certain types of internet
** forwarding or registration of users.
** If the hosts are found to be incompatible, an error
** message should be given using "usrerr" and FALSE should
** to -- the person being sent to.
** none (unless you include the usrerr stuff)