diff options
author | Andreas Beckmann <debian@abeckmann.de> | 2012-10-01 19:58:42 +0200 |
---|---|---|
committer | Andreas Beckmann <debian@abeckmann.de> | 2012-10-01 19:58:42 +0200 |
commit | dd994db23cb7f88732be927fad3a7039bd6301db (patch) | |
tree | 129f709c96e5b1fb46cf9d09fa2a73bdb5aa9d7a | |
parent | b8f791c58c310a0a41181d66122d80dc9c2e11bc (diff) | |
parent | 809d17c01e6e9d15289bf36b8609fa7f9b97671e (diff) | |
download | sendmail-dd994db23cb7f88732be927fad3a7039bd6301db.tar.gz |
Merged Upstream version 8.12.3
374 files changed, 0 insertions, 114760 deletions
diff --git a/BuildTools/M4/depend/BSD.m4 b/BuildTools/M4/depend/BSD.m4 deleted file mode 100644 index 83827a7..0000000 --- a/BuildTools/M4/depend/BSD.m4 +++ /dev/null @@ -1,8 +0,0 @@ -# @(#)BSD.m4 8.3 (Berkeley) 2/9/1998 -depend: ${BEFORE} - @mv Makefile Makefile.old - @sed -e '/^# Do not edit or remove this line or anything below it.$$/,$$d' < Makefile.old > Makefile - @echo "# Do not edit or remove this line or anything below it." >> Makefile - mkdep -a -f Makefile ${COPTS} *.c - -# End of BSD.m4 diff --git a/BuildTools/M4/depend/CC-M.m4 b/BuildTools/M4/depend/CC-M.m4 deleted file mode 100644 index 10d61b8..0000000 --- a/BuildTools/M4/depend/CC-M.m4 +++ /dev/null @@ -1,8 +0,0 @@ -# @(#)CC-M.m4 8.2 (Berkeley) 2/19/1998 -depend: ${BEFORE} - @mv Makefile Makefile.old - @sed -e '/^# Do not edit or remove this line or anything below it.$$/,$$d' < Makefile.old > Makefile - @echo "# Do not edit or remove this line or anything below it." >> Makefile - ${CC} -M ${COPTS} *.c >> Makefile - -# End of CC-M.m4 diff --git a/BuildTools/M4/depend/NCR.m4 b/BuildTools/M4/depend/NCR.m4 deleted file mode 100644 index 22af77d..0000000 --- a/BuildTools/M4/depend/NCR.m4 +++ /dev/null @@ -1,8 +0,0 @@ -# @(#)NCR.m4 8.3 (Berkeley) 2/19/1998 -depend: ${BEFORE} - @mv Makefile Makefile.old - @sed -e '/^# Do not edit or remove this line or anything below it.$$/,$$d' < Makefile.old > Makefile - @echo "# Do not edit or remove this line or anything below it." >> Makefile - ${CC} -w0 -Hmake ${COPTS} *.c >> Makefile - -# End of NCR.m4 diff --git a/BuildTools/M4/depend/Solaris.m4 b/BuildTools/M4/depend/Solaris.m4 deleted file mode 100644 index bf245f6..0000000 --- a/BuildTools/M4/depend/Solaris.m4 +++ /dev/null @@ -1,8 +0,0 @@ -# @(#)Solaris.m4 8.1 (Berkeley) 3/5/1998 -depend: ${BEFORE} - @mv Makefile Makefile.old - @sed -e '/^# Do not edit or remove this line or anything below it.$$/,$$d' < Makefile.old > Makefile - @echo "# Do not edit or remove this line or anything below it." >> Makefile - ${CC} -xM ${COPTS} *.c >> Makefile - -# End of Solaris.m4 diff --git a/BuildTools/M4/depend/X11.m4 b/BuildTools/M4/depend/X11.m4 deleted file mode 100644 index 3afbfe9..0000000 --- a/BuildTools/M4/depend/X11.m4 +++ /dev/null @@ -1,5 +0,0 @@ -# @(#)X11.m4 8.1 (Berkeley) 4/8/1998 -depend: ${BEFORE} - makedepend -- ${COPTS} -- *.c - -# End of X11.m4 diff --git a/BuildTools/M4/depend/generic.m4 b/BuildTools/M4/depend/generic.m4 deleted file mode 100644 index 330d4cf..0000000 --- a/BuildTools/M4/depend/generic.m4 +++ /dev/null @@ -1,8 +0,0 @@ -# @(#)generic.m4 8.2 (Berkeley) 2/9/1998 -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: ${SRCDIR}/sendmail.h ${SRCDIR}/conf.h - -# give a null "depend" list so that the startup script will work -depend: -# End of generic.m4 diff --git a/BuildTools/M4/header.m4 b/BuildTools/M4/header.m4 deleted file mode 100644 index 087cf0e..0000000 --- a/BuildTools/M4/header.m4 +++ /dev/null @@ -1,32 +0,0 @@ -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# Definitions for Makefile construction for sendmail -# -# @(#)header.m4 8.14 (Berkeley) 5/19/1998 -# -changecom(^A) -undefine(`format') -undefine(`hpux') -ifdef(`pushdef', `', - `errprint(`You need a newer version of M4, at least as new as -System V or GNU') - include(NoSuchFile)') -define(`confABI', `') -define(`confCC', `cc') -define(`confSHELL', `/bin/sh') -define(`confBEFORE', `') -define(`confLIBDIRS', `') -define(`confINCDIRS', `') -define(`confLIBSEARCH', `db bind resolv 44bsd') -define(`confSITECONFIG', `site.config') -define(`confBUILDBIN', `../../BuildTools/bin') -define(`PUSHDIVERT', `pushdef(`__D__', divnum)divert($1)') -define(`POPDIVERT', `divert(__D__)popdef(`__D__')') -define(`APPENDDEF', `define(`$1', ifdef(`$1', `$1 $2', `$2'))') -define(`PREPENDDEF', `define(`$1', ifdef(`$1', `$2 $1', `$2'))') diff --git a/BuildTools/OS/386BSD b/BuildTools/OS/386BSD deleted file mode 100644 index cb6ea87..0000000 --- a/BuildTools/OS/386BSD +++ /dev/null @@ -1,7 +0,0 @@ -# @(#)386BSD 8.1 (Berkeley) 1/30/1998 -define(`confENVDEF', ` -DMIME') -define(`confLIBS', `-lutil') -define(`confLINKS', `/usr/sbin/sendmail /usr/bin/newaliases \ - /usr/sbin/sendmail /usr/bin/mailq \ - /usr/sbin/sendmail /usr/bin/hoststat \ - /usr/sbin/sendmail /usr/bin/purgestat') diff --git a/BuildTools/OS/A-UX b/BuildTools/OS/A-UX deleted file mode 100644 index 3a23f36..0000000 --- a/BuildTools/OS/A-UX +++ /dev/null @@ -1,11 +0,0 @@ -# @(#)A-UX 8.4 (Berkeley) 3/12/1998 -define(`confMAPDEF', `-DNDBM') -define(`confENVDEF', `-D_POSIX_SOURCE ') -define(`confLIBS', `-ldbm -lposix -lUTIL') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') diff --git a/BuildTools/OS/AIX b/BuildTools/OS/AIX deleted file mode 100644 index 03d8407..0000000 --- a/BuildTools/OS/AIX +++ /dev/null @@ -1,10 +0,0 @@ -# @(#)AIX 8.6 (Berkeley) 3/12/1998 -define(`confMAPDEF', `-DNDBM -DNIS') -define(`confENVDEF', `-D_AIX3 ') -define(`confOPTIMIZE', `-g') -define(`confLIBS', `-ldbm') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `system') -define(`confSTDIR', `/etc') -define(`confHFDIR', `/usr/lib') -define(`confINSTALL', `/usr/ucb/install') diff --git a/BuildTools/OS/AIX.2 b/BuildTools/OS/AIX.2 deleted file mode 100644 index 8cec811..0000000 --- a/BuildTools/OS/AIX.2 +++ /dev/null @@ -1,18 +0,0 @@ -# @(#)AIX.2 8.8 (Berkeley) 3/12/1998 -PUSHDIVERT(1) -SMROOT= /usr/local/newmail -POPDIVERT -define(`confMAPDEF', `-DNIS') -define(`confENVDEF', `-DBSD -DBSD_INCLUDES -DBSD_REMAP_SIGNAL_TO_SIGVEC \ - -D_PATH_SENDMAILCF=\"${SMROOT}/sendmail.cf\"\ - -D_PATH_SENDMAILPID=\"${SMROOT}/sendmail.pid\"') -define(`confOPTIMIZE', `-g') -define(`confINCDIRS', `-I/u/markw/src/db.1.85/PORT/aixrt/include -I/u/markw/src/db.1.85/PORT/aixrt -I/fs/work/src/bind/include') -define(`confLIBS', `-lbsd /u/markw/src/db.1.85/PORT/aixrt/libdb.a /usr/local/lib/libgldavg.a /fs/work/src/bind/res/libresolv.a') -define(`confMBINDIR', `${SMROOT}/bin') -define(`confSBINDIR', `/usr/etc') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `system') -define(`confSTDIR', `${SMROOT}') -define(`confHFDIR', `${SMROOT}') -define(`confINSTALL', `/usr/ucb/install') diff --git a/BuildTools/OS/AIX.4.2 b/BuildTools/OS/AIX.4.2 deleted file mode 100644 index 76916bb..0000000 --- a/BuildTools/OS/AIX.4.2 +++ /dev/null @@ -1,12 +0,0 @@ -# @(#)AIX.4.2 8.7 (Berkeley) 1/22/1999 -define(`confMAPDEF', `-DNDBM -DNIS -DMAP_REGEX') -define(`confENVDEF', `-D_AIX4=40200 ') -define(`confOPTIMIZE', `-O3 -qstrict') -define(`confLIBS', `-ldbm') -define(`confLIBSEARCH', `db resolv 44bsd') -define(`confSTDIR', `/etc') -define(`confHFDIR', `/usr/lib') -define(`confINSTALL', `/usr/ucb/install') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `system') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/AIX.4.3 b/BuildTools/OS/AIX.4.3 deleted file mode 100644 index 00688c6..0000000 --- a/BuildTools/OS/AIX.4.3 +++ /dev/null @@ -1,12 +0,0 @@ -# @(#)AIX.4.3 8.5 (Berkeley) 8/6/1998 -define(`confMAPDEF', `-DNDBM -DNIS -DMAP_REGEX') -define(`confENVDEF', `-D_AIX4=40300 ') -define(`confOPTIMIZE', `-O3 -qstrict') -define(`confCC', `/usr/bin/xlc') -define(`confLIBS', `-ldbm') -define(`confSTDIR', `/etc') -define(`confHFDIR', `/usr/lib') -define(`confINSTALL', `/usr/ucb/install') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `system') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/AIX.4.x b/BuildTools/OS/AIX.4.x deleted file mode 100644 index a427d07..0000000 --- a/BuildTools/OS/AIX.4.x +++ /dev/null @@ -1,10 +0,0 @@ -# @(#)AIX.4.x 8.8 (Berkeley) 8/6/1998 -define(`confMAPDEF', `-DNDBM -DNIS -DMAP_REGEX') -define(`confENVDEF', `-D_AIX4 ') -define(`confOPTIMIZE', `-O3 -qstrict') -define(`confLIBS', `-ldbm') -define(`confSTDIR', `/etc') -define(`confHFDIR', `/usr/lib') -define(`confINSTALL', `/usr/ucb/install') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `system') diff --git a/BuildTools/OS/Altos b/BuildTools/OS/Altos deleted file mode 100644 index 9865f9a..0000000 --- a/BuildTools/OS/Altos +++ /dev/null @@ -1,12 +0,0 @@ -# @(#)Altos 8.6 (Berkeley) 2/19/1998 -define(`confCC', `gcc') -define(`confENVDEF', `-DALTOS_SYSTEM_V ') -define(`confLIBS', `-lsocket -lrpc') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') -define(`confINSTALL', `${BUILDBIN}/install.sh') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/BSD-OS b/BuildTools/OS/BSD-OS deleted file mode 100644 index 67a6243..0000000 --- a/BuildTools/OS/BSD-OS +++ /dev/null @@ -1,8 +0,0 @@ -# @(#)BSD-OS 8.8 (Berkeley) 6/3/1998 -define(`confMAPDEF', `-DNEWDB -DMAP_REGEX') -define(`confENVDEF', `-DNETISO') -define(`confLIBS', `-lutil -lkvm') -define(`confOPTIMIZE', `-O2') -define(`confMAN1EXT', `0') -define(`confMAN5EXT', `0') -define(`confMAN8EXT', `0') diff --git a/BuildTools/OS/BSD43 b/BuildTools/OS/BSD43 deleted file mode 100644 index 6a04bef..0000000 --- a/BuildTools/OS/BSD43 +++ /dev/null @@ -1,21 +0,0 @@ -# @(#)BSD43 8.5 (Berkeley) 3/12/1998 -define(`confBEFORE', `unistd.h stddef.h stdlib.h dirent.h sys/time.h') -define(`confMAPDEF', `-DNDBM') -define(`confENVDEF', `-DoldBSD43 ') -define(`confLIBS', `-ldbm -ll') -define(`confUBINDIR', `/usr/ucb') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') -PUSHDIVERT(3) -unistd.h stddef.h stdlib.h sys/time.h: - cp /dev/null $@ - -sys/time.h: sys - -sys: - mkdir sys - -dirent.h: - echo "#include <sys/dir.h>" > dirent.h - echo "#define dirent direct" >> dirent.h -POPDIVERT diff --git a/BuildTools/OS/CLIX b/BuildTools/OS/CLIX deleted file mode 100644 index 35b67a6..0000000 --- a/BuildTools/OS/CLIX +++ /dev/null @@ -1,14 +0,0 @@ -# @(#)CLIX 8.8 (Berkeley) 3/12/1998 -define(`confCC', `gcc') -define(`confMAPDEF', `-DNDBM') -define(`confENVDEF', `-DCLIX ') -define(`confINCDIRS', `-I/usr/include') -define(`confLIBS', `-lnsl -lbsd') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `mail') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') -define(`confINSTALL', `cp') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/CRAYT3E.2.0.x b/BuildTools/OS/CRAYT3E.2.0.x deleted file mode 100644 index 4455e51..0000000 --- a/BuildTools/OS/CRAYT3E.2.0.x +++ /dev/null @@ -1,11 +0,0 @@ -# @(#)CRAYT3E.2.0.x 8.1 (Berkeley) 4/21/1998 -define(`confMAPDEF', `-DNDBM') -define(`confENVDEF', `-DUNICOS ') -define(`confOPTIMIZE', `-O') -define(`confINSTALL', `cpset') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/bin') -define(`confEBINDIR', `/usr/lib') -define(`confSTDIR', ` //usr/spool/mqueue') -define(`confHFDIR', ` /usr/lib') diff --git a/BuildTools/OS/CRAYTS.10.0.x b/BuildTools/OS/CRAYTS.10.0.x deleted file mode 100644 index 66e9ce1..0000000 --- a/BuildTools/OS/CRAYTS.10.0.x +++ /dev/null @@ -1,11 +0,0 @@ -# @(#)CRAYTS.10.0.x 8.1 (Berkeley) 1/22/1999 -define(`confMAPDEF', `-DNDBM') -define(`confENVDEF', `-DUNICOS ') -define(`confOPTIMIZE', `-O') -define(`confINSTALL', `cpset') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/bin') -define(`confEBINDIR', `/usr/lib') -define(`confSTDIR', ` //usr/spool/mqueue') -define(`confHFDIR', ` /usr/lib') diff --git a/BuildTools/OS/CSOS b/BuildTools/OS/CSOS deleted file mode 100644 index e39218e..0000000 --- a/BuildTools/OS/CSOS +++ /dev/null @@ -1,9 +0,0 @@ -# @(#)CSOS 8.5 (Berkeley) 2/8/1998 -define(`confLIBS', `-lnet') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confEBINDIR', `/usr/lib') -define(`confUBINDIR', `/usr/ucb') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') -define(`confINSTALL', `${BUILDBIN}/install.sh') diff --git a/BuildTools/OS/ConvexOS b/BuildTools/OS/ConvexOS deleted file mode 100644 index cdb81eb..0000000 --- a/BuildTools/OS/ConvexOS +++ /dev/null @@ -1,11 +0,0 @@ -# @(#)ConvexOS 8.6 (Berkeley) 3/12/1998 -define(`confMAPDEF', `-DNDBM -DYPCOMPAT -DNIS') -define(`confENVDEF', `-D__STDC__ -d non_int_bit_field') -define(`confOPTIMIZE', `-g') -define(`confLIBS', `-lshare') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') diff --git a/BuildTools/OS/Dell b/BuildTools/OS/Dell deleted file mode 100644 index 55fc051..0000000 --- a/BuildTools/OS/Dell +++ /dev/null @@ -1,15 +0,0 @@ -# @(#)Dell 8.8 (Berkeley) 3/12/1998 -define(`confCC', `gcc') -define(`confMAPDEF', `-DNDBM') -define(`confENVDEF', `-D__svr4__ ') -define(`confOPTIMIZE', `-O2') -define(`confLIBS', `-ldbm -lsocket -lnsl -lelf') -define(`confMBINDIR', `/usr/ucblib') -define(`confSBINDIR', `/usr/ucblib') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/ucblib') -define(`confSBINGRP', `mail') -define(`confSTDIR', `/usr/ucblib') -define(`confHFDIR', `/usr/ucblib') -define(`confINSTALL', `/usr/ucb/install') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/DomainOS b/BuildTools/OS/DomainOS deleted file mode 100644 index 06b1e38..0000000 --- a/BuildTools/OS/DomainOS +++ /dev/null @@ -1,18 +0,0 @@ -# @(#)DomainOS 8.6 (Berkeley) 6/24/1998 -define(`confCC', `cc -A nansi -A,systype,any -A,runtype,bsd4.3') -define(`confBEFORE', `unistd.h dirent.h') -define(`confMAPDEF', `-DNDBM') -define(`confSBINDIR', `/usr/etc') -define(`confMBINDIR', `/usr/lib') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') -PUSHDIVERT(3) -unistd.h: - cp /dev/null unistd.h - -dirent.h: - echo "#include <sys/dir.h>" > dirent.h - echo "#define dirent direct" >> dirent.h -POPDIVERT diff --git a/BuildTools/OS/DomainOS.10.4 b/BuildTools/OS/DomainOS.10.4 deleted file mode 100644 index c8a4acf..0000000 --- a/BuildTools/OS/DomainOS.10.4 +++ /dev/null @@ -1,15 +0,0 @@ -# @(#)DomainOS.10.4 8.1 (Berkeley) 6/24/1998 -define(`confCC', `cc -A nansi -A,systype,any -A,runtype,bsd4.3') -define(`confBEFORE', `dirent.h') -define(`confMAPDEF', `-DNDBM') -define(`confSBINDIR', `/usr/etc') -define(`confMBINDIR', `/usr/lib') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') -PUSHDIVERT(3) -dirent.h: - echo "#include <sys/dir.h>" > dirent.h - echo "#define dirent direct" >> dirent.h -POPDIVERT diff --git a/BuildTools/OS/Dynix b/BuildTools/OS/Dynix deleted file mode 100644 index 0da6fb5..0000000 --- a/BuildTools/OS/Dynix +++ /dev/null @@ -1,13 +0,0 @@ -# @(#)Dynix 8.7 (Berkeley) 2/26/1998 -define(`confCC', `gcc') -define(`confOPTIMIZE', `-O -g') -define(`confLIBS', `-lseq') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `staff # no kmem group,') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') -define(`confOBJADD', `strtol.o') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/EWS-UX_V b/BuildTools/OS/EWS-UX_V deleted file mode 100644 index 7875fdc..0000000 --- a/BuildTools/OS/EWS-UX_V +++ /dev/null @@ -1,29 +0,0 @@ -# @(#)EWS-UX_V 8.6 (Berkeley) 3/12/1998 -define(`confCC', `/usr/abiccs/bin/cc -KOlimit=900') -define(`confBEFORE', `sysexits.h ndbm.h ndbm.o') -define(`confMAPDEF', `-DNDBM -DNIS') -define(`confENVDEF', `-Dnec_ews_svr4 ') -define(`confLIBS', `ndbm.o -lsocket -lnsl -lelf # # with NDBM') -define(`confMBINDIR', `/usr/ucblib') -define(`confSBINDIR', `/usr/ucbetc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/ucblib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/var/ucblib') -define(`confHFDIR', `/var/ucblib') -define(`confINSTALL', `/usr/ucb/install') -PUSHDIVERT(3) -sysexits.h: - echo '#ifndef _LOCAL_SYSEXITS_H_' > sysexits.h; - echo '#define _LOCAL_SYSEXITS_H_' >> sysexits.h; - cat /usr/abiccs/ucbinclude/sysexits.h >> sysexits.h; - echo '#endif /* _LOCAL_SYSEXITS_H_ */' >> sysexits.h; -# ln -s /usr/abiccs/ucbinclude/sysexits.h . - -ndbm.h: - ln -s /usr/abiccs/ucbinclude/ndbm.h . - -ndbm.o: - ar x /usr/abiccs/ucblib/libucb.a ndbm.o -# ar x /usr/ucblib/libucb.a ndbm.o -POPDIVERT diff --git a/BuildTools/OS/FreeBSD b/BuildTools/OS/FreeBSD deleted file mode 100644 index baede69..0000000 --- a/BuildTools/OS/FreeBSD +++ /dev/null @@ -1,3 +0,0 @@ -# @(#)FreeBSD 8.5 (Berkeley) 3/12/1998 -define(`confMAPDEF', `-DNEWDB -DNIS -DMAP_REGEX') -define(`confLIBS', `-lutil') diff --git a/BuildTools/OS/HP-UX b/BuildTools/OS/HP-UX deleted file mode 100644 index 2ba83c9..0000000 --- a/BuildTools/OS/HP-UX +++ /dev/null @@ -1,12 +0,0 @@ -# @(#)HP-UX 8.9 (Berkeley) 3/14/1998 -define(`confCC', `cc -Aa -D_HPUX_SOURCE') -define(`confMAPDEF', `-DNDBM -DNIS -DMAP_REGEX') -define(`confOPTIMIZE', `+O1') -define(`confLIBS', `-lndbm') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `mail') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') -define(`confINSTALL', `${BUILDBIN}/install.sh') diff --git a/BuildTools/OS/HP-UX.10.x b/BuildTools/OS/HP-UX.10.x deleted file mode 100644 index 5deacd0..0000000 --- a/BuildTools/OS/HP-UX.10.x +++ /dev/null @@ -1,11 +0,0 @@ -# @(#)HP-UX.10.x 8.10 (Berkeley) 3/21/1998 -define(`confCC', `cc -Aa -D_HPUX_SOURCE') -define(`confMAPDEF', `-DNDBM -DNIS -DMAP_REGEX') -define(`confENVDEF', `-DV4FS ') -define(`confOPTIMIZE', `+O3') -define(`confLIBS', `-lndbm') -define(`confSHELL', `/usr/bin/sh') -define(`confSTDIR', `/etc/mail') -define(`confHFDIR', `/usr/share/lib') -define(`confINSTALL', `${BUILDBIN}/install.sh') -define(`confSBINGRP', `mail') diff --git a/BuildTools/OS/HP-UX.11.x b/BuildTools/OS/HP-UX.11.x deleted file mode 100644 index 1717430..0000000 --- a/BuildTools/OS/HP-UX.11.x +++ /dev/null @@ -1,11 +0,0 @@ -# @(#)HP-UX.11.x 8.7 (Berkeley) 3/30/1998 -define(`confCC', `cc -Ae') -define(`confMAPDEF', `-DNDBM -DNIS -DMAP_REGEX') -define(`confENVDEF', `-DV4FS -DHPUX11 ') -define(`confOPTIMIZE', `+O3') -define(`confLIBS', `-ldbm -lnsl') -define(`confSHELL', `/usr/bin/sh') -define(`confSTDIR', `/etc/mail') -define(`confHFDIR', `/usr/share/lib') -define(`confINSTALL', `${BUILDBIN}/install.sh') -define(`confSBINGRP', `mail') diff --git a/BuildTools/OS/IRIX b/BuildTools/OS/IRIX deleted file mode 100644 index ed5e3e2..0000000 --- a/BuildTools/OS/IRIX +++ /dev/null @@ -1,13 +0,0 @@ -# @(#)IRIX 8.7 (Berkeley) 3/12/1998 -define(`confMAPDEF', `-DNDBM -DNIS') -define(`confENVDEF', `-DIRIX ') -define(`confLIBS', `-lmld -lmalloc -lsun') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/bsd') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') -define(`confINSTALL', `${BUILDBIN}/install.sh') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/IRIX.5.x b/BuildTools/OS/IRIX.5.x deleted file mode 100644 index 6d492a2..0000000 --- a/BuildTools/OS/IRIX.5.x +++ /dev/null @@ -1,13 +0,0 @@ -# @(#)IRIX.5.x 8.7 (Berkeley) 3/12/1998 -define(`confMAPDEF', `-DNDBM -DNIS') -define(`confENVDEF', `-DIRIX5 ') -define(`confLIBS', `-lmld -lmalloc') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/bsd') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/var') -define(`confHFDIR', `/etc') -define(`confINSTALL', `${BUILDBIN}/install.sh') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/IRIX.6.5 b/BuildTools/OS/IRIX.6.5 deleted file mode 100644 index 1b34f2e..0000000 --- a/BuildTools/OS/IRIX.6.5 +++ /dev/null @@ -1,35 +0,0 @@ -# @(#)IRIX.6.5 8.2 (Berkeley) 4/24/1998 -PUSHDIVERT(1) -# Select what ABI we are using -- see abi(5) for details -# -32 ~ IRIX 5.3 (default: -mips2) -# - long and pointer are 32 bit -# -n32 New to IRIX 6.2 (default: -mips3) -# - long and pointer are 32 bit -# -64 ~ IRIX 6.1 (default: -mips4) -# - long and pointer are 64 bit -# We force ABI here, so then it does not depend on CPU -# -# With IDO 6.2 (IRIX 6.2) you need subsystem compiler_dev.sw32.lib -# for compilation with ABI=-n32 -- alternatively you can set ABI=-32 -# ABI=-64 requires subsystem compiler_dev.sw64.lib, but this runs -# only with IRIX64 (ie. 64 bit kernels) -# -# NOTE: Do not set `confABI' in a site configuration file! The ABI MUST -# be given on the Build command line using the -E parameter, e.g.: -# -# Build -E ABI=-n32 -# -ABI= confABI -POPDIVERT -define(`confMAPDEF', `-DNDBM -DNIS -DMAP_REGEX') -define(`confENVDEF', `-DIRIX6 -DHASSNPRINTF=1 ${ABI} ') -define(`confLDOPTS', `${ABI}') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/bsd') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/var') -define(`confHFDIR', `/etc') -define(`confINSTALL', `${BUILDBIN}/install.sh') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/IRIX.6.x b/BuildTools/OS/IRIX.6.x deleted file mode 100644 index 0424933..0000000 --- a/BuildTools/OS/IRIX.6.x +++ /dev/null @@ -1,35 +0,0 @@ -# @(#)IRIX.6.x 8.11 (Berkeley) 4/24/1998 -PUSHDIVERT(1) -# Select what ABI we are using -- see abi(5) for details -# -32 ~ IRIX 5.3 (default: -mips2) -# - long and pointer are 32 bit -# -n32 New to IRIX 6.2 (default: -mips3) -# - long and pointer are 32 bit -# -64 ~ IRIX 6.1 (default: -mips4) -# - long and pointer are 64 bit -# We force ABI here, so then it does not depend on CPU -# -# With IDO 6.2 (IRIX 6.2) you need subsystem compiler_dev.sw32.lib -# for compilation with ABI=-n32 -- alternatively you can set ABI=-32 -# ABI=-64 requires subsystem compiler_dev.sw64.lib, but this runs -# only with IRIX64 (ie. 64 bit kernels) -# -# NOTE: Do not set `confABI' in a site configuration file! The ABI MUST -# be given on the Build command line using the -E parameter, e.g.: -# -# Build -E ABI=-n32 -# -ABI= confABI -POPDIVERT -define(`confMAPDEF', `-DNDBM -DNIS -DMAP_REGEX') -define(`confENVDEF', `-DIRIX6 ${ABI} ') -define(`confLDOPTS', `${ABI}') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/bsd') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/var') -define(`confHFDIR', `/etc') -define(`confINSTALL', `${BUILDBIN}/install.sh') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/IRIX64.6.0 b/BuildTools/OS/IRIX64.6.0 deleted file mode 100644 index e8b2e3a..0000000 --- a/BuildTools/OS/IRIX64.6.0 +++ /dev/null @@ -1,34 +0,0 @@ -# @(#)IRIX64.6.0 8.10 (Berkeley) 3/12/1998 -PUSHDIVERT(1) -# Select what ABI we are using -- see abi(5) for details -# -32 ~ IRIX 5.3 (default: -mips2) -# - long and pointer are 32 bit -# -64 ~ IRIX 6.1 (default: -mips4) -# - long and pointer are 64 bit -# We force ABI here, so then it does not depend on CPU -# -# With IDO 6.2 (IRIX 6.2) you need subsystem compiler_dev.sw32.lib -# for compilation with ABI=-n32 -- alternatively you can set ABI=-32 -# ABI=-64 requires subsystem compiler_dev.sw64.lib, but this runs -# only with IRIX64 (ie. 64 bit kernels) -# -# NOTE: Do not set `confABI' in a site configuration file! The ABI MUST -# be given on the Build command line using the -E parameter, e.g.: -# -# Build -E ABI=-32 -# -ABI= confABI -POPDIVERT -define(`confMAPDEF', `-DNDBM') -define(`confENVDEF', `-DIRIX64 ${ABI} ') -define(`confLDOPTS', `${ABI}') -define(`confLIBS', `-lelf -lmalloc') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/bsd') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') -define(`confINSTALL', `${BUILDBIN}/install.sh') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/IRIX64.6.1 b/BuildTools/OS/IRIX64.6.1 deleted file mode 100644 index 1183766..0000000 --- a/BuildTools/OS/IRIX64.6.1 +++ /dev/null @@ -1,34 +0,0 @@ -# @(#)IRIX64.6.1 8.10 (Berkeley) 3/12/1998 -PUSHDIVERT(1) -# Select what ABI we are using -- see abi(5) for details -# -32 ~ IRIX 5.3 (default: -mips2) -# - long and pointer are 32 bit -# -64 ~ IRIX 6.1 (default: -mips4) -# - long and pointer are 64 bit -# We force ABI here, so then it does not depend on CPU -# -# With IDO 6.2 (IRIX 6.2) you need subsystem compiler_dev.sw32.lib -# for compilation with ABI=-n32 -- alternatively you can set ABI=-32 -# ABI=-64 requires subsystem compiler_dev.sw64.lib, but this runs -# only with IRIX64 (ie. 64 bit kernels) -# -# NOTE: Do not set `confABI' in a site configuration file! The ABI MUST -# be given on the Build command line using the -E parameter, e.g.: -# -# Build -E ABI=-32 -# -ABI= confABI -POPDIVERT -define(`confMAPDEF', `-DNDBM') -define(`confENVDEF', `-DIRIX64 ${ABI} ') -define(`confLDOPTS', `${ABI}') -define(`confLIBS', `-lelf -lmalloc') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/bsd') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') -define(`confINSTALL', `${BUILDBIN}/install.sh') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/IRIX64.6.5 b/BuildTools/OS/IRIX64.6.5 deleted file mode 100644 index d0281f5..0000000 --- a/BuildTools/OS/IRIX64.6.5 +++ /dev/null @@ -1,35 +0,0 @@ -# @(#)IRIX64.6.5 8.1 (Berkeley) 11/29/1998 -PUSHDIVERT(1) -# Select what ABI we are using -- see abi(5) for details -# -32 ~ IRIX 5.3 (default: -mips2) -# - long and pointer are 32 bit -# -n32 New to IRIX 6.2 (default: -mips3) -# - long and pointer are 32 bit -# -64 ~ IRIX 6.1 (default: -mips4) -# - long and pointer are 64 bit -# We force ABI here, so then it does not depend on CPU -# -# With IDO 6.2 (IRIX 6.2) you need subsystem compiler_dev.sw32.lib -# for compilation with ABI=-n32 -- alternatively you can set ABI=-32 -# ABI=-64 requires subsystem compiler_dev.sw64.lib, but this runs -# only with IRIX64 (ie. 64 bit kernels) -# -# NOTE: Do not set `confABI' in a site configuration file! The ABI MUST -# be given on the Build command line using the -E parameter, e.g.: -# -# Build -E ABI=-n32 -# -ABI= confABI -POPDIVERT -define(`confMAPDEF', `-DNDBM -DNIS -DMAP_REGEX') -define(`confENVDEF', `-DIRIX6 -DHASSNPRINTF=1 ${ABI} ') -define(`confLDOPTS', `${ABI}') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/bsd') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/var') -define(`confHFDIR', `/etc') -define(`confINSTALL', `${BUILDBIN}/install.sh') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/IRIX64.6.x b/BuildTools/OS/IRIX64.6.x deleted file mode 100644 index f105edf..0000000 --- a/BuildTools/OS/IRIX64.6.x +++ /dev/null @@ -1,35 +0,0 @@ -# @(#)IRIX64.6.x 8.11 (Berkeley) 4/24/1998 -PUSHDIVERT(1) -# Select what ABI we are using -- see abi(5) for details -# -32 ~ IRIX 5.3 (default: -mips2) -# - long and pointer are 32 bit -# -n32 New to IRIX 6.2 (default: -mips3) -# - long and pointer are 32 bit -# -64 ~ IRIX 6.1 (default: -mips4) -# - long and pointer are 64 bit -# We force ABI here, so then it does not depend on CPU -# -# With IDO 6.2 (IRIX 6.2) you need subsystem compiler_dev.sw32.lib -# for compilation with ABI=-n32 -- alternatively you can set ABI=-32 -# ABI=-64 requires subsystem compiler_dev.sw64.lib, but this runs -# only with IRIX64 (ie. 64 bit kernels) -# -# NOTE: Do not set `confABI' in a site configuration file! The ABI MUST -# be given on the Build command line using the -E parameter, e.g.: -# -# Build -E ABI=-n32 -# -ABI= confABI -POPDIVERT -define(`confMAPDEF', `-DNDBM -DNIS -DMAP_REGEX') -define(`confENVDEF', `-DIRIX6 ${ABI} ') -define(`confLDOPTS', `${ABI}') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/bsd') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/var') -define(`confHFDIR', `/etc') -define(`confINSTALL', `${BUILDBIN}/install.sh') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/ISC b/BuildTools/OS/ISC deleted file mode 100644 index 58b8b78..0000000 --- a/BuildTools/OS/ISC +++ /dev/null @@ -1,10 +0,0 @@ -# @(#)ISC 8.5 (Berkeley) 3/12/1998 -define(`confMAPDEF', `-DNDBM -DNIS') -define(`confENVDEF', `-DISC_UNIX -D_POSIX_SOURCE -D_SYSV3 ') -define(`confLIBS', `-lyp -lrpc -lndbm -linet -lcposix') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSTDIR', `/usr/spool/log') -define(`confHFDIR', `/usr/lib') diff --git a/BuildTools/OS/KSR b/BuildTools/OS/KSR deleted file mode 100644 index 9169cba..0000000 --- a/BuildTools/OS/KSR +++ /dev/null @@ -1,7 +0,0 @@ -# @(#)KSR 8.4 (Berkeley) 3/12/1998 -define(`confMAPDEF', `-DNDBM -DNIS') -define(`confLIBDIRS', `-L/usr/shlib -L/usr/lib') -define(`confLIBS', `-ldbm') -define(`confSTDIR', `/var/adm/sendmail') -define(`confHFDIR', `/usr/share/lib') -define(`confINSTALL', `installbsd') diff --git a/BuildTools/OS/LUNA b/BuildTools/OS/LUNA deleted file mode 100644 index e4637c9..0000000 --- a/BuildTools/OS/LUNA +++ /dev/null @@ -1,46 +0,0 @@ -# @(#)LUNA 8.8 (Berkeley) 3/12/1998 -define(`confBEFORE', `dirent.h stddef.h stdlib.h unistd.h limits.h time.h sys/time.h') -define(`confMAPDEF', `-DNDBM') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') -PUSHDIVERT(3) -dirent.h: - echo "#include <sys/dir.h>" > dirent.h - echo "#define dirent direct" >> dirent.h - -stddef.h unistd.h limits.h: - if [ -f /usr/include/$@ ]; then \ - ln -s /usr/include/$@ .; \ - else \ - cp /dev/null $@; \ - fi - -stdlib.h: - if [ -f /usr/include/stdlib.h ]; then \ - ln -s /usr/include/stdlib.h .; \ - else \ - if [ -f /usr/include/libc.h ]; then \ - ln -s /usr/include/libc.h stdlib.h; \ - else \ - cp /dev/null stdlib.h; \ - fi; \ - fi - -# just for UNIOS-B -time.h: - echo "#ifndef _LOCAL_TIME_H_" > time.h - echo "#define _LOCAL_TIME_H_" >> time.h - cat /usr/include/time.h >> time.h - echo "#endif" >> time.h - -sys/time.h: - -mkdir sys - echo "#ifndef _LOCAL_SYS_TIME_H_" > sys/time.h - echo "#define _LOCAL_SYS_TIME_H_" >> sys/time.h - cat /usr/include/sys/time.h >> sys/time.h - echo "#endif" >> sys/time.h -POPDIVERT diff --git a/BuildTools/OS/Linux b/BuildTools/OS/Linux deleted file mode 100644 index 306c9ef..0000000 --- a/BuildTools/OS/Linux +++ /dev/null @@ -1,5 +0,0 @@ -# @(#)Linux 8.4 (Berkeley) 3/22/1998 -define(`confSTDIR', `/etc') -define(`confHFDIR', `/usr/lib') -define(`confDEPEND_TYPE', `CC-M') -define(`confMANROOT', `/usr/man/man') diff --git a/BuildTools/OS/Linux.ppc b/BuildTools/OS/Linux.ppc deleted file mode 100644 index e0712e3..0000000 --- a/BuildTools/OS/Linux.ppc +++ /dev/null @@ -1,3 +0,0 @@ -# @(#)Linux.ppc 8.3 (Berkeley) 2/12/1998 -define(`confHFDIR', `/usr/lib') -define(`confSBINGRP', `mail') diff --git a/BuildTools/OS/Mach386 b/BuildTools/OS/Mach386 deleted file mode 100644 index 7ff806e..0000000 --- a/BuildTools/OS/Mach386 +++ /dev/null @@ -1,11 +0,0 @@ -# @(#)Mach386 8.6 (Berkeley) 3/12/1998 -define(`confCC', `gcc') -define(`confMAPDEF', `-DNDBM') -define(`confLIBS', `-ldbm') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/NCR.MP-RAS.2.x b/BuildTools/OS/NCR.MP-RAS.2.x deleted file mode 100644 index bd76038..0000000 --- a/BuildTools/OS/NCR.MP-RAS.2.x +++ /dev/null @@ -1,15 +0,0 @@ -# @(#)NCR.MP-RAS.2.x 8.9 (Berkeley) 3/12/1998 -define(`confMAPDEF', `-DNDBM') -define(`confENVDEF', `-DNCR_MP_RAS2 ') -define(`confOPTIMIZE', `-O2') -define(`confINCDIRS', `-I/usr/include -I/usr/ucbinclude') -define(`confLIBDIRS', `-L/usr/ucblib') -define(`confLIBS', `-lnsl -lnet -lsocket -lelf -lc -lucb') -define(`confMBINDIR', `/usr/ucblib') -define(`confSBINDIR', `/usr/ucbetc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/ucblib') -define(`confSTDIR', `/var/ucblib') -define(`confHFDIR', `/usr/ucblib') -define(`confINSTALL', `/usr/ucb/install') -define(`confDEPEND_TYPE', `NCR') diff --git a/BuildTools/OS/NCR.MP-RAS.3.x b/BuildTools/OS/NCR.MP-RAS.3.x deleted file mode 100644 index 7af9667..0000000 --- a/BuildTools/OS/NCR.MP-RAS.3.x +++ /dev/null @@ -1,15 +0,0 @@ -# @(#)NCR.MP-RAS.3.x 8.10 (Berkeley) 8/6/1998 -define(`confMAPDEF', `-DNDBM') -define(`confENVDEF', `-DNCR_MP_RAS3 ') -define(`confOPTIMIZE', `-O2') -define(`confINCDIRS', `-I/usr/include -I/usr/ucbinclude') -define(`confLIBDIRS', `-L/usr/ucblib') -define(`confLIBS', `-lresolv -lsocket -lnsl -lelf -lc -lucb') -define(`confMBINDIR', `/usr/ucblib') -define(`confSBINDIR', `/usr/ucbetc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/ucblib') -define(`confSTDIR', `/var/ucblib') -define(`confHFDIR', `/usr/ucblib') -define(`confINSTALL', `/usr/ucb/install') -define(`confDEPEND_TYPE', `NCR') diff --git a/BuildTools/OS/NEWS-OS.4.x b/BuildTools/OS/NEWS-OS.4.x deleted file mode 100644 index 71aa4d4..0000000 --- a/BuildTools/OS/NEWS-OS.4.x +++ /dev/null @@ -1,14 +0,0 @@ -# @(#)NEWS-OS.4.x 8.6 (Berkeley) 3/12/1998 -define(`confBEFORE', `limits.h') -define(`confMAPDEF', `-DNDBM') -define(`confLIBS', `-lmld') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') -PUSHDIVERT(3) -limits.h: - touch limits.h -POPDIVERT diff --git a/BuildTools/OS/NEWS-OS.6.x b/BuildTools/OS/NEWS-OS.6.x deleted file mode 100644 index 4e5c809..0000000 --- a/BuildTools/OS/NEWS-OS.6.x +++ /dev/null @@ -1,28 +0,0 @@ -# @(#)NEWS-OS.6.x 8.8 (Berkeley) 3/12/1998 -define(`confCC', `/bin/cc') -define(`confBEFORE', `sysexits.h ndbm.o') -define(`confMAPDEF', `-DNDBM -DNIS') -define(`confENVDEF', `-DSYSLOG_BUFSIZE=256 # -DSPT_TYPE=SPT_NONE ') -define(`confLIBS', `ndbm.o -lelf -lsocket -lnsl # # with NDBM') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/etc') -define(`confHFDIR', `/usr/lib') -define(`confINSTALL', `/usr/ucb/install') -PUSHDIVERT(3) -sysexits.h: - ln -s /usr/ucbinclude/sysexits.h . - -ndbm.o: - if [ ! -f /usr/include/ndbm.h ]; then \ - ln -s /usr/ucbinclude/ndbm.h .; \ - fi; \ - if [ -f /usr/lib/libndbm.a ]; then \ - ar x /usr/lib/libndbm.a ndbm.o; \ - else \ - ar x /usr/ucblib/libucb.a ndbm.o; \ - fi; -POPDIVERT diff --git a/BuildTools/OS/NEXTSTEP.4.x b/BuildTools/OS/NEXTSTEP.4.x deleted file mode 100644 index b775813..0000000 --- a/BuildTools/OS/NEXTSTEP.4.x +++ /dev/null @@ -1,28 +0,0 @@ -# @(#)NEXTSTEP.4.x 8.1 (Berkeley) 3/21/1998 -PUSHDIVERT(1) -# NEXTSTEP 3.1 and 3.2 only support m68k and i386 -#ARCH= -arch m68k -arch i386 -arch hppa -arch sparc -#ARCH= -arch m68k -arch i386 -#ARCH= ${RC_CFLAGS} -# For new sendmail Makefile structure, this must go in the ENVDEF and LDOPTS -POPDIVERT -define(`confBEFORE', `unistd.h dirent.h') -define(`confMAPDEF', `-DNDBM -DNIS -DNETINFO') -define(`confENVDEF', `-DNeXT -Wno-precomp -pipe ${RC_CFLAGS}') -define(`confLDOPTS', `${RC_CFLAGS}') -define(`confLIBS', `-ldbm') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSTDIR', `/etc/sendmail') -define(`confHFDIR', `/usr/lib') -define(`confINSTALL', `${BUILDBIN}/install.sh') -PUSHDIVERT(3) -unistd.h: - cp /dev/null unistd.h - -dirent.h: - echo "#include <sys/dir.h>" > dirent.h - echo "#define dirent direct" >> dirent.h -POPDIVERT diff --git a/BuildTools/OS/NeXT.2.x b/BuildTools/OS/NeXT.2.x deleted file mode 100644 index 0a9d918..0000000 --- a/BuildTools/OS/NeXT.2.x +++ /dev/null @@ -1,20 +0,0 @@ -# @(#)NeXT.2.x 8.7 (Berkeley) 3/12/1998 -define(`confBEFORE', `unistd.h dirent.h') -define(`confMAPDEF', `-DNDBM -DNIS -DNETINFO') -define(`confENVDEF', `-DNeXT ') -define(`confLIBS', `-ldbm') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSTDIR', `/etc/sendmail') -define(`confHFDIR', `/usr/lib') -define(`confINSTALL', `${BUILDBIN}/install.sh') -PUSHDIVERT(3) -unistd.h: - cp /dev/null unistd.h - -dirent.h: - echo "#include <sys/dir.h>" > dirent.h - echo "#define dirent direct" >> dirent.h -POPDIVERT diff --git a/BuildTools/OS/NeXT.3.x b/BuildTools/OS/NeXT.3.x deleted file mode 100644 index f5e313d..0000000 --- a/BuildTools/OS/NeXT.3.x +++ /dev/null @@ -1,28 +0,0 @@ -# @(#)NeXT.3.x 8.7 (Berkeley) 3/12/1998 -PUSHDIVERT(1) -# NEXTSTEP 3.1 and 3.2 only support m68k and i386 -#ARCH= -arch m68k -arch i386 -arch hppa -arch sparc -#ARCH= -arch m68k -arch i386 -#ARCH= ${RC_CFLAGS} -# For new sendmail Makefile structure, this must go in the ENVDEF and LDOPTS -POPDIVERT -define(`confBEFORE', `unistd.h dirent.h') -define(`confMAPDEF', `-DNDBM -DNIS -DNETINFO') -define(`confENVDEF', `-DNeXT -Wno-precomp -pipe ${RC_CFLAGS}') -define(`confLDOPTS', `${RC_CFLAGS}') -define(`confLIBS', `-ldbm') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSTDIR', `/etc/sendmail') -define(`confHFDIR', `/usr/lib') -define(`confINSTALL', `${BUILDBIN}/install.sh') -PUSHDIVERT(3) -unistd.h: - cp /dev/null unistd.h - -dirent.h: - echo "#include <sys/dir.h>" > dirent.h - echo "#define dirent direct" >> dirent.h -POPDIVERT diff --git a/BuildTools/OS/NeXT.4.x b/BuildTools/OS/NeXT.4.x deleted file mode 100644 index 8736b74..0000000 --- a/BuildTools/OS/NeXT.4.x +++ /dev/null @@ -1,29 +0,0 @@ -# @(#)NeXT.4.x 8.9 (Berkeley) 7/15/1998 -PUSHDIVERT(1) -# NEXTSTEP 3.1 and 3.2 only support m68k and i386 -#ARCH= -arch m68k -arch i386 -arch hppa -arch sparc -#ARCH= -arch m68k -arch i386 -#ARCH= ${RC_CFLAGS} -# For new sendmail Makefile structure, this must go in the ENVDEF and LDOPTS -POPDIVERT -define(`confBEFORE', `unistd.h dirent.h') -define(`confMAPDEF', `-DNDBM -DNIS -DNETINFO') -define(`confENVDEF', `-DNeXT -Wno-precomp -pipe ${RC_CFLAGS}') -define(`confLDOPTS', `${RC_CFLAGS}') -define(`confLIBS', `-ldbm') -define(`confMANROOT', `/usr/man/cat') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSTDIR', `/etc/sendmail') -define(`confHFDIR', `/usr/lib') -define(`confINSTALL', `${BUILDBIN}/install.sh') -PUSHDIVERT(3) -unistd.h: - cp /dev/null unistd.h - -dirent.h: - echo "#include <sys/dir.h>" > dirent.h - echo "#define dirent direct" >> dirent.h -POPDIVERT diff --git a/BuildTools/OS/NetBSD b/BuildTools/OS/NetBSD deleted file mode 100644 index cd800ef..0000000 --- a/BuildTools/OS/NetBSD +++ /dev/null @@ -1,4 +0,0 @@ -# @(#)NetBSD 8.6 (Berkeley) 3/12/1998 -define(`confMAPDEF', `-DNEWDB -DNIS -DMAP_REGEX') -define(`confENVDEF', ` -DNETISO') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/NetBSD.8.3 b/BuildTools/OS/NetBSD.8.3 deleted file mode 100644 index 714de1e..0000000 --- a/BuildTools/OS/NetBSD.8.3 +++ /dev/null @@ -1,3 +0,0 @@ -# @(#)NetBSD.8.3 8.6 (Berkeley) 3/12/1998 -define(`confMAPDEF', `-DNEWDB -DNIS -DMAP_REGEX') -define(`confENVDEF', ` # -DNETISO') diff --git a/BuildTools/OS/NonStop-UX b/BuildTools/OS/NonStop-UX deleted file mode 100644 index 6ccdead..0000000 --- a/BuildTools/OS/NonStop-UX +++ /dev/null @@ -1,16 +0,0 @@ -# @(#)NonStop-UX 8.8 (Berkeley) 3/12/1998 -define(`confCC', `gcc') -define(`confMAPDEF', `-DNDBM') -define(`confENVDEF', `-DNonStop_UX_BXX -D_SVID ') -define(`confINCDIRS', `-I/usr/include -I/usr/ucbinclude') -define(`confLIBDIRS', `-L/usr/ucblib') -define(`confLIBS', `-lsocket -lnsl -lelf -lucb') -define(`confMBINDIR', `/usr/ucblib') -define(`confSBINDIR', `/usr/ucbetc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/ucblib') -define(`confSBINGRP', `mail') -define(`confSTDIR', `/usr/ucblib') -define(`confHFDIR', `/usr/ucblib') -define(`confINSTALL', `/usr/ucb/install') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/OSF1 b/BuildTools/OS/OSF1 deleted file mode 100644 index 75fecfe..0000000 --- a/BuildTools/OS/OSF1 +++ /dev/null @@ -1,9 +0,0 @@ -# @(#)OSF1 8.7 (Berkeley) 3/14/1998 -define(`confCC', `cc -Olimit 1000') -define(`confMAPDEF', `-DNDBM -DNIS -DMAP_REGEX') -define(`confLIBS', `-ldbm') -define(`confSTDIR', `/var/adm/sendmail') -define(`confHFDIR', `/usr/share/lib') -define(`confINSTALL', `installbsd') -define(`confUBINDIR', `${BINDIR}') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/OpenBSD b/BuildTools/OS/OpenBSD deleted file mode 100644 index 423ab2d..0000000 --- a/BuildTools/OS/OpenBSD +++ /dev/null @@ -1,3 +0,0 @@ -# @(#)OpenBSD 8.5 (Berkeley) 3/12/1998 -define(`confMAPDEF', `-DNEWDB -DNIS -DMAP_REGEX') -define(`confENVDEF', ` -DNETISO') diff --git a/BuildTools/OS/PTX b/BuildTools/OS/PTX deleted file mode 100644 index 7dd05ee..0000000 --- a/BuildTools/OS/PTX +++ /dev/null @@ -1,10 +0,0 @@ -# @(#)PTX 8.6 (Berkeley) 3/12/1998 -define(`confMAPDEF', `-DNDBM') -define(`confOPTIMIZE', `-g') -define(`confLIBS', `-lsocket -linet -lelf -lnsl -lseq') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') diff --git a/BuildTools/OS/Paragon b/BuildTools/OS/Paragon deleted file mode 100644 index 868780f..0000000 --- a/BuildTools/OS/Paragon +++ /dev/null @@ -1,8 +0,0 @@ -# @(#)Paragon 8.3 (Berkeley) 3/12/1998 -define(`confMAPDEF', `-DNDBM') -define(`confLIBDIRS', `-L/usr/shlib -L/usr/lib') -define(`confLIBS', `-ldbm') -define(`confSTDIR', `/var/adm/sendmail') -define(`confHFDIR', `/usr/share/lib') -define(`confINSTALL', `installbsd') -define(`confUBINDIR', `${BINDIR}') diff --git a/BuildTools/OS/PowerUX b/BuildTools/OS/PowerUX deleted file mode 100644 index 47ab87c..0000000 --- a/BuildTools/OS/PowerUX +++ /dev/null @@ -1,9 +0,0 @@ -# @(#)PowerUX 8.5 (Berkeley) 2/12/1998 -define(`confENVDEF', `-D__svr4__ ') -define(`confLIBS', `-Bstatic -lsocket -lnsl -lelf -lgen') -define(`confMBINDIR', `/usr/local/etc') -define(`confSBINDIR', `/usr/local/etc') -define(`confUBINDIR', `/usr/local/bin') -define(`confEBINDIR', `/usr/local/lib') -define(`confSBINGRP', `mail') -define(`confINSTALL', `/usr/ucb/install') diff --git a/BuildTools/OS/QNX b/BuildTools/OS/QNX deleted file mode 100644 index a8a67fe..0000000 --- a/BuildTools/OS/QNX +++ /dev/null @@ -1,15 +0,0 @@ -# @(#)QNX 8.4 (Berkeley) 2/19/1998 -PUSHDIVERT(1) -# -# For this Makefile to work you must compile and install the libdb package -# and then change DBMINC and DBMLIB as appropriate. -# -DBMINC= /usr/local/include -DBMLIB= /usr/local/lib -POPDIVERT -define(`confENVDEF', `-Osax -w4 -zc -fr= -D__BIT_TYPES_DEFINED__') -define(`confINCDIRS', `${DBMINC}') -define(`confLIBDIRS', `${DBMLIB}') -define(`confLIBS', `-lsocket') -define(`confLDOPTS', `-M -N256k') -define(`confINSTALL', `${BUILDBIN}/install.sh') diff --git a/BuildTools/OS/RISCos b/BuildTools/OS/RISCos deleted file mode 100644 index 4b2d79e..0000000 --- a/BuildTools/OS/RISCos +++ /dev/null @@ -1,25 +0,0 @@ -# @(#)RISCos 8.5 (Berkeley) 3/12/1998 -define(`confCC', `cc -systype bsd43 -Olimit 900') -define(`confBEFORE', `stdlib.h dirent.h unistd.h stddef.h') -define(`confMAPDEF', `-DNDBM') -define(`confENVDEF', `-DRISCOS ') -define(`confLIBS', `-lmld') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/etc') -define(`confHFDIR', `/usr/lib') -define(`confINSTALL', `/usr/bsd43/bin/install') -PUSHDIVERT(3) -stdlib.h stddef.h: - cp /dev/null $@ - -unistd.h: - echo "typedef unsigned short mode_t;" > unistd.h - -dirent.h: - echo "#include <sys/dir.h>" > dirent.h - echo "#define dirent direct" >> dirent.h -POPDIVERT diff --git a/BuildTools/OS/RISCos.4_0 b/BuildTools/OS/RISCos.4_0 deleted file mode 100644 index 1557b8a..0000000 --- a/BuildTools/OS/RISCos.4_0 +++ /dev/null @@ -1,25 +0,0 @@ -# @(#)RISCos.4_0 8.6 (Berkeley) 3/12/1998 -define(`confCC', `cc -systype bsd43 -Olimit 900') -define(`confBEFORE', `stdlib.h dirent.h unistd.h stddef.h') -define(`confMAPDEF', `-DNDBM') -define(`confENVDEF', `-DRISCOS -DRISCOS_4_0 ') -define(`confLIBS', `-lmld') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') -define(`confINSTALL', `${BUILDBIN}/install.sh') -PUSHDIVERT(3) -stdlib.h stddef.h: - cp /dev/null $@ - -unistd.h: - echo "typedef unsigned short mode_t;" > unistd.h - -dirent.h: - echo "#include <sys/dir.h>" > dirent.h - echo "#define dirent direct" >> dirent.h -POPDIVERT diff --git a/BuildTools/OS/ReliantUNIX b/BuildTools/OS/ReliantUNIX deleted file mode 100644 index 67e3d25..0000000 --- a/BuildTools/OS/ReliantUNIX +++ /dev/null @@ -1,12 +0,0 @@ -# @(#)ReliantUNIX 8.1 (Berkeley) 1/22/1999 -define(`confCC', `/usr/bin/cc') -define(`confENVDEF', `-D__svr4__ ') -define(`confLIBS', `-lsocket -lnsl -lelf') -define(`confMBINDIR', `/usr/ucblib') -define(`confSBINDIR', `/usr/ucbetc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/ucblib') -define(`confSBINGRP', `mail') -define(`confSTDIR', `/usr/ucblib') -define(`confHFDIR', `/usr/ucblib') -define(`confINSTALL', `/usr/ucb/install') diff --git a/BuildTools/OS/Rhapsody b/BuildTools/OS/Rhapsody deleted file mode 100644 index 16cf89d..0000000 --- a/BuildTools/OS/Rhapsody +++ /dev/null @@ -1,16 +0,0 @@ -# @(#)Rhapsody 8.1 (Berkeley) 11/7/1998 -# -# Wilfredo Sanchez <wsanchez@apple.com>: -# We look a lot more like 4.4BSD than NeXTStep or OpenStep. -# -define(`confMAPDEF', `-DNEWDB -DNIS -DMAP_REGEX -DNETINFO -DAUTO_NETINFO_ALIASES -DAUTO_NETINFO_HOSTS') -define(`confENVDEF', `-DNETISO -traditional-cpp -pipe ${Extra_CC_Flags}') -define(`confLDOPTS', `${Extra_LD_Flags}') -define(`confOPTIMIZE', `-O3') -define(`confHFDIR', `/usr/share/sendmail') -define(`confMANOWN', `root') -define(`confMANGRP', `wheel') -define(`confUBINOWN', `root') -define(`confUBINGRP', `wheel') -define(`confSBINOWN', `root') -define(`confSBINGRP', `wheel') diff --git a/BuildTools/OS/SCO b/BuildTools/OS/SCO deleted file mode 100644 index e995052..0000000 --- a/BuildTools/OS/SCO +++ /dev/null @@ -1,9 +0,0 @@ -# @(#)SCO 8.3 (Berkeley) 2/8/1998 -define(`confENVDEF', `-D_SCO_unix_ ') -define(`confLIBS', `-lsocket -lprot_s -lx -lc_s') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') diff --git a/BuildTools/OS/SCO.4.2 b/BuildTools/OS/SCO.4.2 deleted file mode 100644 index 0d458be..0000000 --- a/BuildTools/OS/SCO.4.2 +++ /dev/null @@ -1,11 +0,0 @@ -# @(#)SCO.4.2 8.5 (Berkeley) 6/30/1998 -define(`confENVDEF', `-D_SCO_unix_4_2 ') -define(`confLIBS', `-lsocket -lndbm -lprot_s -lx -lc_s') -define(`confMAPDEF', `-DNDBM') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `bin') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') -define(`confINSTALL', `${BUILDBIN}/install.sh') diff --git a/BuildTools/OS/SCO.5.x b/BuildTools/OS/SCO.5.x deleted file mode 100644 index d7fdc73..0000000 --- a/BuildTools/OS/SCO.5.x +++ /dev/null @@ -1,10 +0,0 @@ -# @(#)SCO.5.x 8.10 (Berkeley) 6/30/1998 -define(`confCC', `cc -b elf') -define(`confLIBS', `-lsocket -lndbm -lprot -lcurses -lm -lx -lgen') -define(`confMAPDEF', `-DMAP_REGEX -DNDBM') -define(`confSBINGRP', `bin') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/bin') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') diff --git a/BuildTools/OS/SINIX b/BuildTools/OS/SINIX deleted file mode 100644 index 3c27937..0000000 --- a/BuildTools/OS/SINIX +++ /dev/null @@ -1,12 +0,0 @@ -# @(#)SINIX 8.5 (Berkeley) 2/12/1998 -define(`confCC', `/usr/bin/cc') -define(`confENVDEF', `-D__svr4__ ') -define(`confLIBS', `-lsocket -lnsl -lelf') -define(`confMBINDIR', `/usr/ucblib') -define(`confSBINDIR', `/usr/ucbetc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/ucblib') -define(`confSBINGRP', `mail') -define(`confSTDIR', `/usr/ucblib') -define(`confHFDIR', `/usr/ucblib') -define(`confINSTALL', `/usr/ucb/install') diff --git a/BuildTools/OS/SVR4 b/BuildTools/OS/SVR4 deleted file mode 100644 index 92cf101..0000000 --- a/BuildTools/OS/SVR4 +++ /dev/null @@ -1,14 +0,0 @@ -# @(#)SVR4 8.6 (Berkeley) 3/12/1998 -define(`confCC', `gcc') -define(`confMAPDEF', `-DNDBM') -define(`confENVDEF', `-D__svr4__ ') -define(`confLIBS', `-ldbm -lsocket -lnsl -lelf') -define(`confMBINDIR', `/usr/ucblib') -define(`confSBINDIR', `/usr/ucbetc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/ucblib') -define(`confSBINGRP', `mail') -define(`confSTDIR', `/usr/ucblib') -define(`confHFDIR', `/usr/ucblib') -define(`confINSTALL', `/usr/ucb/install') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/SunOS b/BuildTools/OS/SunOS deleted file mode 100644 index 9db9569..0000000 --- a/BuildTools/OS/SunOS +++ /dev/null @@ -1,10 +0,0 @@ -# @(#)SunOS 8.6 (Berkeley) 3/12/1998 -define(`confMAPDEF', `-DNDBM -DNIS') -define(`confLDOPTS', `-Bstatic') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSTDIR', `/etc') -define(`confHFDIR', `/usr/lib') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/SunOS.4.0 b/BuildTools/OS/SunOS.4.0 deleted file mode 100644 index 0bcbc5f..0000000 --- a/BuildTools/OS/SunOS.4.0 +++ /dev/null @@ -1,15 +0,0 @@ -# @(#)SunOS.4.0 8.6 (Berkeley) 3/12/1998 -define(`confBEFORE', `stdlib.h stddef.h limits.h') -define(`confMAPDEF', `-DNDBM -DNIS') -define(`confENVDEF', `-DSUNOS403 ') -define(`confLDOPTS', `-Bstatic') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSTDIR', `/etc') -define(`confHFDIR', `/usr/lib') -PUSHDIVERT(3) -stddef.h stdlib.h limits.h: - cp /dev/null $@ -POPDIVERT diff --git a/BuildTools/OS/SunOS.5.1 b/BuildTools/OS/SunOS.5.1 deleted file mode 100644 index fe39bb9..0000000 --- a/BuildTools/OS/SunOS.5.1 +++ /dev/null @@ -1,22 +0,0 @@ -# @(#)SunOS.5.1 8.8 (Berkeley) 3/21/1998 -define(`confCC', `gcc') -define(`confBEFORE', `sysexits.h') -define(`confMAPDEF', `-DNDBM -DNIS') -define(`confENVDEF', `-DSOLARIS=20100 ') -define(`confLIBS', `-lsocket -lnsl -lelf') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/etc/mail') -define(`confHFDIR', `/etc/mail') -define(`confINSTALL', `${BUILDBIN}/install.sh') -define(`confDEPEND_TYPE', `CC-M') -PUSHDIVERT(3) -sysexits.h: - if [ -r /usr/ucbinclude/sysexits.h ]; \ - then \ - ln -s /usr/ucbinclude/sysexits.h; \ - fi -POPDIVERT diff --git a/BuildTools/OS/SunOS.5.2 b/BuildTools/OS/SunOS.5.2 deleted file mode 100644 index 80bc087..0000000 --- a/BuildTools/OS/SunOS.5.2 +++ /dev/null @@ -1,22 +0,0 @@ -# @(#)SunOS.5.2 8.8 (Berkeley) 3/21/1998 -define(`confCC', `gcc') -define(`confBEFORE', `sysexits.h') -define(`confMAPDEF', `-DNDBM -DNIS') -define(`confENVDEF', `-DSOLARIS=20100 ') -define(`confLIBS', `-lsocket -lnsl -lelf') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/etc/mail') -define(`confHFDIR', `/etc/mail') -define(`confINSTALL', `${BUILDBIN}/install.sh') -define(`confDEPEND_TYPE', `CC-M') -PUSHDIVERT(3) -sysexits.h: - if [ -r /usr/ucbinclude/sysexits.h ]; \ - then \ - ln -s /usr/ucbinclude/sysexits.h; \ - fi -POPDIVERT diff --git a/BuildTools/OS/SunOS.5.3 b/BuildTools/OS/SunOS.5.3 deleted file mode 100644 index dcee93e..0000000 --- a/BuildTools/OS/SunOS.5.3 +++ /dev/null @@ -1,20 +0,0 @@ -# @(#)SunOS.5.3 8.8 (Berkeley) 3/21/1998 -define(`confCC', `gcc') -define(`confBEFORE', `sysexits.h') -define(`confMAPDEF', `-DNDBM -DNIS -DNISPLUS') -define(`confENVDEF', `-DSOLARIS=20300 ') -define(`confLIBS', `-lsocket -lnsl -lelf') -define(`confMBINDIR', `/usr/lib') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/etc/mail') -define(`confHFDIR', `/etc/mail') -define(`confINSTALL', `${BUILDBIN}/install.sh') -define(`confDEPEND_TYPE', `CC-M') -PUSHDIVERT(3) -sysexits.h: - if [ -r /usr/ucbinclude/sysexits.h ]; \ - then \ - ln -s /usr/ucbinclude/sysexits.h; \ - fi -POPDIVERT diff --git a/BuildTools/OS/SunOS.5.4 b/BuildTools/OS/SunOS.5.4 deleted file mode 100644 index 4a6b880..0000000 --- a/BuildTools/OS/SunOS.5.4 +++ /dev/null @@ -1,20 +0,0 @@ -# @(#)SunOS.5.4 8.10 (Berkeley) 3/21/1998 -define(`confCC', `gcc') -define(`confBEFORE', `sysexits.h') -define(`confMAPDEF', `-DNDBM -DNIS -DNISPLUS') -define(`confENVDEF', `-DSOLARIS=20400 ') -define(`confLIBS', `-lsocket -lnsl -lelf') -define(`confMBINDIR', `/usr/lib') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/etc/mail') -define(`confHFDIR', `/etc/mail') -define(`confINSTALL', `${BUILDBIN}/install.sh') -define(`confDEPEND_TYPE', `CC-M') -PUSHDIVERT(3) -sysexits.h: - if [ -r /usr/include/sysexits.h ]; \ - then \ - ln -s /usr/include/sysexits.h; \ - fi -POPDIVERT diff --git a/BuildTools/OS/SunOS.5.5 b/BuildTools/OS/SunOS.5.5 deleted file mode 100644 index 64264d7..0000000 --- a/BuildTools/OS/SunOS.5.5 +++ /dev/null @@ -1,20 +0,0 @@ -# @(#)SunOS.5.5 8.11 (Berkeley) 3/21/1998 -define(`confCC', `gcc') -define(`confBEFORE', `sysexits.h') -define(`confMAPDEF', `-DNDBM -DNIS -DNISPLUS -DMAP_REGEX') -define(`confENVDEF', `-DSOLARIS=20500 ') -define(`confLIBS', `-lsocket -lnsl -lkstat') -define(`confMBINDIR', `/usr/lib') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/etc/mail') -define(`confHFDIR', `/etc/mail') -define(`confINSTALL', `${BUILDBIN}/install.sh') -define(`confDEPEND_TYPE', `CC-M') -PUSHDIVERT(3) -sysexits.h: - if [ -r /usr/include/sysexits.h ]; \ - then \ - ln -s /usr/include/sysexits.h; \ - fi -POPDIVERT diff --git a/BuildTools/OS/SunOS.5.6 b/BuildTools/OS/SunOS.5.6 deleted file mode 100644 index da17de8..0000000 --- a/BuildTools/OS/SunOS.5.6 +++ /dev/null @@ -1,20 +0,0 @@ -# @(#)SunOS.5.6 8.10 (Berkeley) 3/21/1998 -define(`confCC', `gcc') -define(`confBEFORE', `sysexits.h') -define(`confMAPDEF', `-DNDBM -DNIS -DNISPLUS -DMAP_REGEX') -define(`confENVDEF', `-DSOLARIS=20600 ') -define(`confLIBS', `-lsocket -lnsl -lkstat') -define(`confMBINDIR', `/usr/lib') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/etc/mail') -define(`confHFDIR', `/etc/mail') -define(`confINSTALL', `${BUILDBIN}/install.sh') -define(`confDEPEND_TYPE', `CC-M') -PUSHDIVERT(3) -sysexits.h: - if [ -r /usr/include/sysexits.h ]; \ - then \ - ln -s /usr/include/sysexits.h; \ - fi -POPDIVERT diff --git a/BuildTools/OS/SunOS.5.7 b/BuildTools/OS/SunOS.5.7 deleted file mode 100644 index 962095d..0000000 --- a/BuildTools/OS/SunOS.5.7 +++ /dev/null @@ -1,20 +0,0 @@ -# @(#)SunOS.5.7 8.11 (Berkeley) 3/21/1998 -define(`confCC', `gcc') -define(`confBEFORE', `sysexits.h') -define(`confMAPDEF', `-DNDBM -DNIS -DNISPLUS -DMAP_REGEX') -define(`confENVDEF', `-DSOLARIS=20700 ') -define(`confLIBS', `-lsocket -lnsl') -define(`confMBINDIR', `/usr/lib') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/etc/mail') -define(`confHFDIR', `/etc/mail') -define(`confINSTALL', `${BUILDBIN}/install.sh') -define(`confDEPEND_TYPE', `CC-M') -PUSHDIVERT(3) -sysexits.h: - if [ -r /usr/include/sysexits.h ]; \ - then \ - ln -s /usr/include/sysexits.h; \ - fi -POPDIVERT diff --git a/BuildTools/OS/SunOS.5.8 b/BuildTools/OS/SunOS.5.8 deleted file mode 100644 index d20c13b..0000000 --- a/BuildTools/OS/SunOS.5.8 +++ /dev/null @@ -1,20 +0,0 @@ -# @(#)SunOS.5.8 8.1 (Berkeley) 1/17/1999 -define(`confCC', `gcc') -define(`confBEFORE', `sysexits.h') -define(`confMAPDEF', `-DNDBM -DNIS -DNISPLUS -DMAP_REGEX') -define(`confENVDEF', `-DSOLARIS=20800 ') -define(`confLIBS', `-lsocket -lnsl') -define(`confMBINDIR', `/usr/lib') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/etc/mail') -define(`confHFDIR', `/etc/mail') -define(`confINSTALL', `${BUILDBIN}/install.sh') -define(`confDEPEND_TYPE', `CC-M') -PUSHDIVERT(3) -sysexits.h: - if [ -r /usr/include/sysexits.h ]; \ - then \ - ln -s /usr/include/sysexits.h; \ - fi -POPDIVERT diff --git a/BuildTools/OS/Titan b/BuildTools/OS/Titan deleted file mode 100644 index 938b46d..0000000 --- a/BuildTools/OS/Titan +++ /dev/null @@ -1,13 +0,0 @@ -# @(#)Titan 8.5 (Berkeley) 3/12/1998 -define(`confCC', `cc -43') -define(`confBEFORE', `stddef.h stdlib.h') -define(`confMAPDEF', `-DNDBM') -define(`confLIBS', `-ldbm') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -PUSHDIVERT(3) -stddef.h stdlib.h: - cp /dev/null $@ -POPDIVERT diff --git a/BuildTools/OS/ULTRIX b/BuildTools/OS/ULTRIX deleted file mode 100644 index e9073f9..0000000 --- a/BuildTools/OS/ULTRIX +++ /dev/null @@ -1,10 +0,0 @@ -# @(#)ULTRIX 8.8 (Berkeley) 12/18/1998 -define(`confCC', `cc -Olimit 970') -define(`confMAPDEF', `-DNDBM -DNIS') -define(`confENVDEF', `-DIDENTPROTO=0 ') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/UMAX b/BuildTools/OS/UMAX deleted file mode 100644 index 078b827..0000000 --- a/BuildTools/OS/UMAX +++ /dev/null @@ -1,15 +0,0 @@ -# @(#)UMAX 8.5 (Berkeley) 3/12/1998 -define(`confBEFORE', `stddef.h') -define(`confMAPDEF', `-DNIS') -define(`confENVDEF', `-DUMAXV ') -define(`confLIBS', `-lyp -lrpc') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') -PUSHDIVERT(3) -stddef.h: - echo "#define _STDDEF_H" > stddef.h - chmod 444 stddef.h -POPDIVERT diff --git a/BuildTools/OS/UNICOS b/BuildTools/OS/UNICOS deleted file mode 100644 index 3b05dc0..0000000 --- a/BuildTools/OS/UNICOS +++ /dev/null @@ -1,9 +0,0 @@ -# @(#)UNICOS 8.7 (Berkeley) 2/26/1998 -define(`confENVDEF', `-DUNICOS ') -define(`confOPTIMIZE', `-O') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSTDIR', ` /etc/mail') -define(`confHFDIR', ` /etc/mail') diff --git a/BuildTools/OS/UNIX_SV.4.x.i386 b/BuildTools/OS/UNIX_SV.4.x.i386 deleted file mode 100644 index b0e2753..0000000 --- a/BuildTools/OS/UNIX_SV.4.x.i386 +++ /dev/null @@ -1,14 +0,0 @@ -# @(#)UNIX_SV.4.x.i386 8.6 (Berkeley) 3/12/1998 -define(`confCC', `gcc') -define(`confMAPDEF', `-DNDBM') -define(`confENVDEF', `-D__svr4__ -DUNIXWARE ') -define(`confLIBS', `-lc -ldbm -lsocket -lnsl -lgen -lelf') -define(`confMBINDIR', `/usr/ucblib') -define(`confSBINDIR', `/usr/ucbetc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/ucblib') -define(`confSBINGRP', `mail') -define(`confSTDIR', `/usr/ucblib') -define(`confHFDIR', `/usr/ucblib') -define(`confINSTALL', `/usr/ucb/install') -define(`confDEPEND_TYPE', `CC-M') diff --git a/BuildTools/OS/UX4800 b/BuildTools/OS/UX4800 deleted file mode 100644 index 7c1822a..0000000 --- a/BuildTools/OS/UX4800 +++ /dev/null @@ -1,24 +0,0 @@ -# @(#)UX4800 8.8 (Berkeley) 3/12/1998 -define(`confCC', `/usr/abiccs/bin/cc -KOlimit=900') -define(`confBEFORE', `sysexits.h ndbm.h') -define(`confMAPDEF', `-DNDBM -DNIS # without NEWDB') -define(`confENVDEF', `-DHASSNPRINTF=1 ') -define(`confLIBS', `-lsocket -lnsl -lelf # # without NEWDB') -define(`confMBINDIR', `/usr/ucblib') -define(`confSBINDIR', `/usr/ucbetc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/ucblib') -define(`confSBINGRP', `sys') -define(`confSTDIR', `/var/ucblib') -define(`confHFDIR', `/var/ucblib') -define(`confINSTALL', `/usr/ucb/install') -PUSHDIVERT(3) -sysexits.h: - echo '#ifndef _LOCAL_SYSEXITS_H_' > sysexits.h; - echo '#define _LOCAL_SYSEXITS_H_' >> sysexits.h; - cat /usr/abiccs/ucbinclude/sysexits.h >> sysexits.h; - echo '#endif /* _LOCAL_SYSEXITS_H_ */' >> sysexits.h; - -ndbm.h: - sed 's/void/char/' /usr/abiccs/include/ndbm.h > ndbm.h -POPDIVERT diff --git a/BuildTools/OS/UXPDS.V10 b/BuildTools/OS/UXPDS.V10 deleted file mode 100644 index 438d88d..0000000 --- a/BuildTools/OS/UXPDS.V10 +++ /dev/null @@ -1,15 +0,0 @@ -# @(#)UXPDS.V10 8.9 (Berkeley) 3/12/1998 -define(`confCC', `/usr/ccs/bin/cc') -define(`confMAPDEF', `-DNDBM -DNIS') -define(`confENVDEF', `-DUXPDS=10 ') -define(`confINCDIRS', `-I/usr/include -I/usr/ucbinclude') -define(`confLIBS', `/usr/ucblib/libdbm.a /usr/ucblib/libucb.a -lsocket -lnsl -lelf') -define(`confMBINDIR', `/usr/ucblib') -define(`confSBINDIR', `/usr/ucbetc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/ucblib') -define(`confSBINGRP', `mail') -define(`confSTDIR', `/usr/ucblib') -define(`confHFDIR', `/usr/ucblib') -define(`confINSTALL', `/usr/ucb/install') -define(`confMANROOT', `/usr/local/man/man') diff --git a/BuildTools/OS/UXPDS.V20 b/BuildTools/OS/UXPDS.V20 deleted file mode 100644 index f2d0b37..0000000 --- a/BuildTools/OS/UXPDS.V20 +++ /dev/null @@ -1,22 +0,0 @@ -# @(#)UXPDS.V20 8.8 (Berkeley) 3/12/1998 -define(`confCC', `/usr/ccs/bin/cc') -define(`confBEFORE', `netinet/ip_var.h') -define(`confMAPDEF', `-DNDBM -DNIS') -define(`confENVDEF', `-DUXPDS=20 ') -define(`confLIBS', `/usr/ucblib/libdbm.a -lsocket -lnsl -lelf') -define(`confMBINDIR', `/usr/ucblib') -define(`confSBINDIR', `/usr/ucbetc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/ucblib') -define(`confSBINGRP', `mail') -define(`confSTDIR', `/usr/ucblib') -define(`confHFDIR', `/usr/ucblib') -define(`confINSTALL', `${BUILDBIN}/install.sh') -define(`confMANROOT', `/usr/local/man/man') -PUSHDIVERT(3) -netinet/ip_var.h: netinet /usr/include/netinet/ip_var.h - sed '/ip_var_f.h/d' /usr/include/netinet/ip_var.h > netinet/ip_var.h - -netinet: - mkdir netinet -POPDIVERT diff --git a/BuildTools/OS/UnixWare.5.i386 b/BuildTools/OS/UnixWare.5.i386 deleted file mode 100644 index 77ca82d..0000000 --- a/BuildTools/OS/UnixWare.5.i386 +++ /dev/null @@ -1,18 +0,0 @@ -# @(#)UnixWare.5.i386 8.2 (Berkeley) 10/15/1998 -# -# System V Rel 5.x (a.k.a Unixware7 w/o BSD-Compatiblity Libs ie. native) -# Contributed by Paul Gampe <paulg@apnic.net> -# -define(`confCC', `/usr/ccs/bin/cc') -define(`confMAPDEF', `-DNDBM -DMAP_REGEX') -define(`confENVDEF', `-D__svr5__') -define(`confLIBS', `-lsocket -lnsl -lelf') -define(`confSHELL', `/usr/bin/sh') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/etc/mail') -define(`confUBINDIR', `/etc/mail') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `mail') -define(`confSTDIR', `/etc/mail') -define(`confHFDIR', `/etc/mail') -define(`confINSTALL', `/usr/ucb/install') diff --git a/BuildTools/OS/dcosx.1.x.NILE b/BuildTools/OS/dcosx.1.x.NILE deleted file mode 100644 index 095de36..0000000 --- a/BuildTools/OS/dcosx.1.x.NILE +++ /dev/null @@ -1,6 +0,0 @@ -# @(#)dcosx.1.x.NILE 8.3 (Berkeley) 2/8/1998 -define(`confENVDEF', `-D__svr4__ -DDCOSx ') -define(`confLIBS', `-lsocket -lnsl -lelf') -define(`confHFDIR', `/usr/share/lib/mail') -define(`confINSTALL', `/usr/ucb/install') -define(`confSBINGRP', `sys') diff --git a/BuildTools/OS/dgux b/BuildTools/OS/dgux deleted file mode 100644 index 66132c0..0000000 --- a/BuildTools/OS/dgux +++ /dev/null @@ -1,10 +0,0 @@ -# @(#)dgux 8.5 (Berkeley) 3/12/1998 -define(`confMAPDEF', `-DNDBM -DNIS') -define(`confLIBS', `-ldbm') -define(`confMBINDIR', `/usr/bin') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `bin') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/etc') diff --git a/BuildTools/OS/maxion b/BuildTools/OS/maxion deleted file mode 100644 index 0177911..0000000 --- a/BuildTools/OS/maxion +++ /dev/null @@ -1,14 +0,0 @@ -# @(#)maxion 8.6 (Berkeley) 3/12/1998 -define(`confCC', `/usr/ucb/cc') -define(`confMAPDEF', `-DNDBM -DNIS') -define(`confLIBDIRS', `-L/usr/ucblib') -define(`confLIBS', `-ldbm -lgen -lucb') -define(`confMBINDIR', `/usr/ucblib') -define(`confSBINDIR', `/usr/ucbetc') -define(`confUBINDIR', `/usr/ucb') -define(`confEBINDIR', `/usr/ucblib') -define(`confSBINOWN', `smtp') -define(`confSBINGRP', `mail') -define(`confSTDIR', `/var/adm/log') -define(`confHFDIR', `/etc/ucbmail') -define(`confINSTALL', `/usr/ucb/install') diff --git a/BuildTools/OS/uts.systemV b/BuildTools/OS/uts.systemV deleted file mode 100644 index acee532..0000000 --- a/BuildTools/OS/uts.systemV +++ /dev/null @@ -1,26 +0,0 @@ -# @(#)uts.systemV 8.10 (Berkeley) 3/12/1998 -PUSHDIVERT(1) -# Sendmail 8 on UTS requires BIND 4.9's include files and lib44bsd and -# libresolv libraries. The BIND version on UTS is much too old. -# -BINDPATH=../../../bind -POPDIVERT -define(`confBEFORE', `stddef.h') -define(`confMAPDEF', `-DNIS -DNDBM') -define(`confENVDEF', `-D_UTS ') -define(`confOPTIMIZE', `-g') -define(`confINCDIRS', `-I${BINDPATH}/include -I${BINDPATH}/compat/include') -define(`confLIBDIRS', `-L${BINDPATH}/res -L${BINDPATH}/compat/lib') -define(`confLIBS', `-lyp -lrpc -lbsd -lsocket -la') -define(`confMBINDIR', `/usr/lib') -define(`confSBINDIR', `/usr/etc') -define(`confUBINDIR', `/usr/lib') -define(`confEBINDIR', `/usr/lib') -define(`confSBINGRP', `mail') -define(`confSTDIR', `/usr/lib') -define(`confHFDIR', `/usr/lib') -define(`confINSTALL', `${BUILDBIN}/install.sh') -PUSHDIVERT(3) -stddef.h: - echo "#include <sys/types.h>" > stddef.h -POPDIVERT diff --git a/BuildTools/README b/BuildTools/README deleted file mode 100644 index 6572616..0000000 --- a/BuildTools/README +++ /dev/null @@ -1,110 +0,0 @@ -This directory contains tools. Do not attempt to actually build -anything in this directory. - -The Build script allows you to specify a site configuration file by using -the -f flag: - - Build -f siteconfig.m4 - -You can put such site configuration files in the Site sub-directory; -see Site/README for details. - -While building a site configuration file, you can add to a definition -using the APPENDDEF() and PREPENDDEF() macros. For example: - - APPENDDEF(`confINCDIRS', `-I/usr/local/bind/include') - -will add -I/usr/local/bind/include to the already existing confINCDIRS. -Note: There must be no trailing spaces after the last quote mark and -before the closing parenthesis. Also you may need to properly quote -m4 reserved words as specified by your vendor's m4 command. - -By default, sendmail will search your system for include and library -directories as well as certain libraries (libdb.* for Berkeley DB and -libbind.a or libresolv.* for name resolution). You can turn off this -configuration step by specifying the -S flag with the Build command. - -The OS subtree contains definitions for variations on a standard -model for system installation. The M4 variables that can be defined -and their defaults before referencing the appropriate OS definitons -are: - -confBEFORE [empty] Files to create before sendmail is - compiled. The methods must be defined - in the Makefile using PUSHDIVERT(3). -confBUILDBIN ../../BuildTools/bin - The location of the build support - binaries, relative to the obj.* - directory. -confCC cc The C compiler to use. -confOPTIMIZE -O Flags passed to CC as ${O}. -confDEPEND_TYPE generic How to build dependencies. This should - be the name of a file in - BuildTools/M4/depend -confEBINDIR /usr/libexec The location for binaries executed - from other binaries, e.g., mail.local - or smrsh. -confENVDEF [empty] -D flags passed to cc. -confHFDIR /usr/share/misc Location of the sendmail help file. -confINCDIRS [empty] -I flags passed to cc. -confINSTALL install The BSD-compatible install program. - Use ${BUILDBIN}/install.sh if none - is available on your system. -confLDOPTS [empty] Linker options passed to ld. -confLIBDIRS [empty] -L flags passed to ld. -confLIBS [varies] -l flags passed to ld. -confLIBSEARCH db bind resolv 44bsd - Search for these libraries for - linking with programs. -confLINKS ${UBINDIR}/newaliases ${UBINDIR}/mailq \ - ${UBINDIR}/hoststat ${UBINDIR}/purgestat - Names of links to sendmail. -confMANROOT /usr/share/man/cat The root of the man subtree. -confMAN1 confMANROOT 1 The location of man1 files. -confMAN1EXT 1 The extension on files in confMAN1. -confMAN1SRC 0 The source for man pages installed - in confMAN1. -confMAN5 confMANROOT 5 The location of man5 files. -confMAN5EXT 5 The extension on files in confMAN5. -confMAN5SRC 0 The source for man pages installed - in confMAN5. -confMAN8 confMANROOT 8 The location of man8 files. -confMAN8EXT 8 The extension on files in confMAN8. -confMAN8SRC 0 The source for man pages installed - in confMAN8. -confMANDOC -mandoc The macros used to format man pages. -confMANOWN bin The owner of installed man pages. -confMANGRP bin The group of installed man pages. -confMANMODE 444 The mode of installed man pages. -confMAPDEF [varies] The map definitions, e.g., - -DNDBM -DNEWDB. -DNEWDB is always - added if a libdb.a can be found. -confNO_MAN_INSTALL [undefined] If defined, don't install the man - pages by default. -confMBINDIR /usr/sbin The location of the MTA (sendmail) - binary. -confNROFF groff -Tascii The command to format man pages. -confOBJADD [empty] Objects that should be included in - when linking sendmail and the - associated utilities. -confSBINDIR /usr/sbin The location of root-oriented - commands, such as makemap. -confSBINOWN root The owner for setuid binaries. -confSBINGRP kmem The group for setuid binaries. -confSBINMODE 4555 The mode for setuid binaries. -confSHELL /bin/sh The shell to use inside make. -confSMOBJADD [empty] Objects that should be included in - when linking sendmail. -confSRCDIR ../../src The sendmail source directory - relative to support program obj.* - directories. -confSTDIR /var/log The directory in which to store the - sendmail status file. -confUBINDIR /usr/bin The directory for user-executable - binaries. -confUBINOWN bin The owner for user-executable binaries. -confUBINGRP bin The group for user-executable binaries. -confUBINMODE 555 The mode for user-executable binaries. - - -@(#)README 8.22 (Berkeley) 6/30/1998 diff --git a/BuildTools/Site/README b/BuildTools/Site/README deleted file mode 100644 index 44e14e8..0000000 --- a/BuildTools/Site/README +++ /dev/null @@ -1,16 +0,0 @@ -The Build script will look for the default site configuration files in -this directory. Build will include the following files if they are -present in this directory: - - site.OS.$SENDMAIL_SUFFIX.m4 - site.OS.m4 - site.config.m4 - -OS is the name of the operating system file selected from the BuildTools/OS -directory. SENDMAIL_SUFFIX is a user environment variable which can be -used to further distinguish between site configuration files in this -directory. - -See the README in the BuildTools directory for more information. - -@(#)README 8.3 (Berkeley) 3/27/1998 diff --git a/BuildTools/bin/Build b/BuildTools/bin/Build deleted file mode 100755 index f666a87..0000000 --- a/BuildTools/bin/Build +++ /dev/null @@ -1,517 +0,0 @@ -#!/bin/sh - -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1993, 1996-1997 Eric P. Allman. All rights reserved. -# Copyright (c) 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# @(#)Build 8.94 (Berkeley) 1/23/1999 -# - -# -# A quick-and-dirty script to compile sendmail and related programs -# in the presence of multiple architectures. To use, just use -# "sh Build". -# - -trap "rm -f $obj/.settings$$; exit" 1 2 3 15 - -cflag="" -mflag="" -sflag="" -makeargs="" -libdirs="" -incdirs="" -libsrch="" -siteconfig="" -EX_USAGE=64 -EX_NOINPUT=66 -EX_UNAVAILABLE=69 - -while [ ! -z "$1" ] -do - case $1 - in - -c) # clean out existing $obj tree - cflag=1 - shift - ;; - - -m) # show Makefile name only - mflag=1 - shift - ;; - - -E*) # environment variables to pass into Build - arg=`echo $1 | sed 's/^-E//'` - if [ -z "$arg" ] - then - shift # move to argument - arg=$1 - fi - if [ -z "$arg" ] - then - echo "Empty -E flag" >&2 - exit $EX_USAGE - else - case $arg - in - *=*) # check format - eval $arg - export `echo $arg | sed 's;=.*;;'` - ;; - *) # bad format - echo "Bad format for -E argument ($arg)" >&2 - exit $EX_USAGE - ;; - esac - shift - fi - ;; - - -L*) # set up LIBDIRS - libdirs="$libdirs $1" - shift - ;; - - -I*) # set up INCDIRS - incdirs="$incdirs $1" - shift - ;; - - -f*) # select site config file - arg=`echo $1 | sed 's/^-f//'` - if [ -z "$arg" ] - then - shift # move to argument - arg=$1 - fi - if [ "$siteconfig" ] - then - echo "Only one -f flag allowed" >&2 - exit $EX_USAGE - else - siteconfig=$arg - if [ -z "$siteconfig" ] - then - echo "Missing argument for -f flag" >&2 - exit $EX_USAGE - elif [ ! -f "$siteconfig" ] - then - echo "${siteconfig}: File not found" - exit $EX_NOINPUT - else - shift # move past argument - fi - fi - ;; - - -S) # skip auto-configure - sflag="-s" - shift - ;; - - *) # pass argument to make - makeargs="$makeargs \"$1\"" - shift - ;; - esac -done - -# -# Do heuristic guesses !ONLY! for machines that do not have uname -# -if [ -d /NextApps -a ! -f /bin/uname -a ! -f /usr/bin/uname ] -then - # probably a NeXT box - arch=`hostinfo | sed -n 's/.*Processor type: \([^ ]*\).*/\1/p'` - os=NeXT - rel=`hostinfo | sed -n 's/.*NeXT Mach \([0-9\.]*\).*/\1/p'` -elif [ -f /usr/sony/bin/machine -a -f /etc/osversion ] -then - # probably a Sony NEWS 4.x - os=NEWS-OS - rel=`awk '{ print $3}' /etc/osversion` - arch=`/usr/sony/bin/machine` -elif [ -d /usr/omron -a -f /bin/luna ] -then - # probably a Omron LUNA - os=LUNA - if [ -f /bin/luna1 ] && /bin/luna1 - then - rel=unios-b - arch=luna1 - elif [ -f /bin/luna2 ] && /bin/luna2 - then - rel=Mach - arch=luna2 - elif [ -f /bin/luna88k ] && /bin/luna88k - then - rel=Mach - arch=luna88k - fi -elif [ -d /usr/apollo -a -d \`node_data ] -then - # probably a Apollo/DOMAIN - os=DomainOS - arch=$ISP - rel=`/usr/apollo/bin/bldt | grep Domain | awk '{ print $4 }' | sed -e 's/,//g'` -fi - -if [ ! "$arch" -a ! "$os" -a ! "$rel" ] -then - arch=`uname -m | sed -e 's/ //g'` - os=`uname -s | sed -e 's/\//-/g' -e 's/ //g'` - rel=`uname -r | sed -e 's/(/-/g' -e 's/)//g'` -fi - -# -# Tweak the values we have already got. PLEASE LIMIT THESE to -# tweaks that are absolutely necessary because your system uname -# routine doesn't return something sufficiently unique. Don't do -# it just because you don't like the name that is returned. You -# can combine the architecture name with the os name to create a -# unique Makefile name. -# - -# tweak machine architecture -case $arch -in - sun4*) arch=sun4;; - - 9000/*) arch=`echo $arch | sed -e 's/9000.//' -e 's/..$/xx/'`;; - - DS/907000) arch=ds90;; - - NILE*) arch=NILE - os=`uname -v`;; - - CRAYT3E|CRAYTS) - os=$arch;; - -esac - -# tweak operating system type and release -node=`uname -n | sed -e 's/\//-/g' -e 's/ //g'` -if [ "$os" = "$node" -a "$arch" = "i386" -a "$rel" = 3.2 -a "`uname -v`" = 2 ] -then - # old versions of SCO UNIX set uname -s the same as uname -n - os=SCO_SV -fi -if [ "$rel" = 4.0 ] -then - case $arch in - 3[34]??|3[34]??,*) - if [ -d /usr/sadm/sysadm/add-ons/WIN-TCP ] - then - os=NCR.MP-RAS.2.x - elif [ -d /usr/sadm/sysadm/add-ons/inet ] - then - os=NCR.MP-RAS.3.x - fi - ;; - esac -fi - -case $os -in - DYNIX-ptx) os=PTX;; - Paragon*) os=Paragon;; - HP-UX) rel=`echo $rel | sed -e 's/^[^.]*\.0*//'`;; - AIX) rela=$rel - rel=`uname -v` - case $rel in - 2) arch="" - ;; - 4) if [ "$rela" = "3" ] - then - arch=$rela - fi - ;; - esac - rel=$rel.$rela - ;; - BSD-386) os=BSD-OS;; - SCO_SV) os=SCO; rel=`uname -X | sed -n 's/Release = 3.2v//p'`;; - UNIX_System_V) if [ "$arch" = "ds90" ] - then - os="UXPDS" - rel=`uname -v | sed -e 's/\(V.*\)L.*/\1/'` - fi;; - SINIX-?) os=SINIX;; - DomainOS) case $rel in - 10.4*) rel=10.4;; - esac - ;; -esac - -# get "base part" of operating system release -rroot=`echo $rel | sed -e 's/\.[^.]*$//'` -rbase=`echo $rel | sed -e 's/\..*//'` -if [ "$rroot" = "$rbase" ] -then - rroot=$rel -fi - -# heuristic tweaks to clean up names -- PLEASE LIMIT THESE! -if [ "$os" = "unix" ] -then - # might be Altos System V - case $rel - in - 5.3*) os=Altos;; - esac -elif [ -r /unix -a -r /usr/lib/libseq.a -a -r /lib/cpp ] -then - # might be a DYNIX/ptx 2.x system, which has a broken uname - if strings /lib/cpp | grep _SEQUENT_ > /dev/null - then - os=PTX - fi -elif [ -d /usr/nec ] -then - # NEC machine -- what is it running? - if [ "$os" = "UNIX_System_V" ] - then - os=EWS-UX_V - elif [ "$os" = "UNIX_SV" ] - then - os=UX4800 - fi -elif [ "$arch" = "mips" ] -then - case $rel - in - 4_*) - if [ `uname -v` = "UMIPS" ] - then - os=RISCos - fi;; - esac -fi - -# see if there is a "user suffix" specified -if [ "${SENDMAIL_SUFFIX-}x" = "x" ] -then - sfx="" -else - sfx=".${SENDMAIL_SUFFIX}" -fi - -echo "Configuration: os=$os, rel=$rel, rbase=$rbase, rroot=$rroot, arch=$arch, sfx=$sfx" - - -SMROOT=${SMROOT-..} -BUILDTOOLS=${BUILDTOOLS-$SMROOT/BuildTools} -export SMROOT BUILDTOOLS - -# see if we are in a Build-able directory -if [ ! -f Makefile.m4 ]; then - echo "Makefile.m4 not found. Build can only be run from a source directory." - exit $EX_UNAVAILABLE -fi - -# now try to find a reasonable object directory -if [ -r obj.$os.$rel.$arch$sfx ]; then - obj=obj.$os.$rel.$arch$sfx -elif [ -r obj.$os.$rroot.$arch$sfx ]; then - obj=obj.$os.$rroot.$arch$sfx -elif [ -r obj.$os.$rbase.x.$arch$sfx ]; then - obj=obj.$os.$rbase.x.$arch$sfx -elif [ -r obj.$os.$rel$sfx ]; then - obj=obj.$os.$rel$sfx -elif [ -r obj.$os.$rbase.x$sfx ]; then - obj=obj.$os.$rbase.x$sfx -elif [ -r obj.$os.$arch$sfx ]; then - obj=obj.$os.$arch$sfx -elif [ -r obj.$rel.$arch$sfx ]; then - obj=obj.$rel.$arch$sfx -elif [ -r obj.$rbase.x.$arch$sfx ]; then - obj=obj.$rbase.x.$arch$sfx -elif [ -r obj.$os$sfx ]; then - obj=obj.$os$sfx -elif [ -r obj.$arch$sfx ]; then - obj=obj.$arch$sfx -elif [ -r obj.$rel$sfx ]; then - obj=obj.$rel$sfx -elif [ -r obj$sfx ]; then - obj=obj$sfx -fi -if [ -z "$obj" -o "$cflag" ] -then - if [ -n "$obj" ] - then - echo "Clearing out existing $obj tree" - rm -rf $obj - else - # no existing obj directory -- try to create one if Makefile found - obj=obj.$os.$rel.$arch$sfx - fi - if [ -r $BUILDTOOLS/OS/$os.$rel.$arch$sfx ]; then - oscf=$os.$rel.$arch$sfx - elif [ -r $BUILDTOOLS/OS/$os.$rel.$arch ]; then - oscf=$os.$rel.$arch - elif [ -r $BUILDTOOLS/OS/$os.$rroot.$arch$sfx ]; then - oscf=$os.$rroot.$arch$sfx - elif [ -r $BUILDTOOLS/OS/$os.$rroot.$arch ]; then - oscf=$os.$rroot.$arch - elif [ -r $BUILDTOOLS/OS/$os.$rbase.x.$arch$sfx ]; then - oscf=$os.$rbase.x.$arch$sfx - elif [ -r $BUILDTOOLS/OS/$os.$rbase.x.$arch ]; then - oscf=$os.$rbase.x.$arch - elif [ -r $BUILDTOOLS/OS/$os.$rel$sfx ]; then - oscf=$os.$rel$sfx - elif [ -r $BUILDTOOLS/OS/$os.$rel ]; then - oscf=$os.$rel - elif [ -r $BUILDTOOLS/OS/$os.$rroot$sfx ]; then - oscf=$os.$rroot$sfx - elif [ -r $BUILDTOOLS/OS/$os.$rroot ]; then - oscf=$os.$rroot - elif [ -r $BUILDTOOLS/OS/$os.$rbase.x$sfx ]; then - oscf=$os.$rbase.x$sfx - elif [ -r $BUILDTOOLS/OS/$os.$rbase.x ]; then - oscf=$os.$rbase.x - elif [ -r $BUILDTOOLS/OS/$os.$arch$sfx ]; then - oscf=$os.$arch$sfx - elif [ -r $BUILDTOOLS/OS/$os.$arch ]; then - oscf=$os.$arch - elif [ -r $BUILDTOOLS/OS/$rel.$arch$sfx ]; then - oscf=$rel.$arch$sfx - elif [ -r $BUILDTOOLS/OS/$rel.$arch ]; then - oscf=$rel.$arch - elif [ -r $BUILDTOOLS/OS/$rroot.$arch$sfx ]; then - oscf=$rroot.$arch$sfx - elif [ -r $BUILDTOOLS/OS/$rroot.$arch ]; then - oscf=$rroot.$arch - elif [ -r $BUILDTOOLS/OS/$rbase.x.$arch$sfx ]; then - oscf=$rbase.x.$arch$sfx - elif [ -r $BUILDTOOLS/OS/$rbase.x.$arch ]; then - oscf=$rbase.x.$arch - elif [ -r $BUILDTOOLS/OS/$os$sfx ]; then - oscf=$os$sfx - elif [ -r $BUILDTOOLS/OS/$os ]; then - oscf=$os - elif [ -r $BUILDTOOLS/OS/$arch$sfx ]; then - oscf=$arch$sfx - elif [ -r $BUILDTOOLS/OS/$arch ]; then - oscf=$arch - elif [ -r $BUILDTOOLS/OS/$rel$sfx ]; then - oscf=$rel$sfx - elif [ -r $BUILDTOOLS/OS/$rel ]; then - oscf=$rel - elif [ -r $BUILDTOOLS/OS/$rel$sfx ]; then - oscf=$rel$sfx - else - echo "Cannot determine how to support $arch.$os.$rel" >&2 - exit $EX_UNAVAILABLE - fi - M4=`sh $BUILDTOOLS/bin/find_m4.sh` - ret=$? - if [ $ret -ne 0 ] - then - exit $ret - fi - echo "Using M4=$M4" - export M4 - if [ "$mflag" ] - then - echo "Will run in virgin $obj using $BUILDTOOLS/OS/$oscf" - exit 0 - fi - if [ "$ABI" ] - then - echo "Using ABI $ABI" - fi - echo "Creating $obj using $BUILDTOOLS/OS/$oscf" - mkdir $obj - (cd $obj; ln -s ../*.[ch158] .) - if [ -f sendmail.hf ] - then - (cd $obj; ln -s ../sendmail.hf .) - fi - - rm -f $obj/.settings$$ - echo 'divert(-1)' > $obj/.settings$$ - cat $BUILDTOOLS/M4/header.m4 >> $obj/.settings$$ - if [ "$ABI" ] - then - echo "define(\`confABI', \`$ABI')" >> $obj/.settings$$ - fi - cat $BUILDTOOLS/OS/$oscf >> $obj/.settings$$ - - if [ -z "$siteconfig" ] - then - # none specified, use defaults - if [ -f $BUILDTOOLS/Site/site.$oscf$sfx.m4 ] - then - siteconfig=$BUILDTOOLS/Site/site.$oscf$sfx.m4 - elif [ -f $BUILDTOOLS/Site/site.$oscf.m4 ] - then - siteconfig=$BUILDTOOLS/Site/site.$oscf.m4 - fi - if [ -f $BUILDTOOLS/Site/site.config.m4 ] - then - siteconfig="$BUILDTOOLS/Site/site.config.m4 $siteconfig" - fi - fi - if [ ! -z "$siteconfig" ] - then - echo "Including $siteconfig" - cat $siteconfig >> $obj/.settings$$ - fi - if [ "$libdirs" ] - then - echo "define(\`confLIBDIRS', confLIBDIRS \`\`$libdirs'')" >> $obj/.settings$$ - fi - if [ "$incdirs" ] - then - echo "define(\`confINCDIRS', confINCDIRS \`\`$incdirs'')" >> $obj/.settings$$ - fi - echo 'divert(0)dnl' >> $obj/.settings$$ - libdirs=`(cat $obj/.settings$$; echo "_SRIDBIL_= confLIBDIRS" ) | \ - sed -e 's/\(.\)include/\1_include_/g' -e 's/#define/#_define_/g' | \ - ${M4} -DconfBUILDTOOLSDIR=$BUILDTOOLS - | \ - grep "^_SRIDBIL_=" | \ - sed -e 's/#_define_/#define/g' -e 's/_include_/include/g' -e "s/^_SRIDBIL_=//"` - libsrch=`(cat $obj/.settings$$; echo "_HCRSBIL_= confLIBSEARCH" ) | \ - sed -e 's/\(.\)include/\1_include_/g' -e 's/#define/#_define_/g' | \ - ${M4} -DconfBUILDTOOLSDIR=$BUILDTOOLS - | \ - grep "^_HCRSBIL_=" | \ - sed -e 's/#_define_/#define/g' -e 's/_include_/include/g' -e "s/^_HCRSBIL_=//"` - echo 'divert(-1)' >> $obj/.settings$$ - LIBDIRS="$libdirs" LIBSRCH="$libsrch" SITECONFIG="$siteconfig" sh $BUILDTOOLS/bin/configure.sh $sflag $oscf >> $obj/.settings$$ - echo 'divert(0)dnl' >> $obj/.settings$$ - sed -e 's/\(.\)include/\1_include_/g' -e 's/#define/#_define_/g' $obj/.settings$$ | \ - ${M4} -DconfBUILDTOOLSDIR=$BUILDTOOLS - Makefile.m4 | \ - sed -e 's/#_define_/#define/g' -e 's/_include_/include/g' > $obj/Makefile - if [ $? -ne 0 -o ! -s $obj/Makefile ] - then - echo "ERROR: ${M4} failed; You may need a newer version of M4, at least as new as System V or GNU" 1>&2 - rm -rf $obj - exit $EX_UNAVAILABLE - fi - rm -f $obj/.settings$$ - echo "Making dependencies in $obj" - (cd $obj; ${MAKE-make} depend) -fi - -if [ "$mflag" ] -then - makefile=`ls -l $obj/Makefile | sed 's/.* //'` - if [ -z "$makefile" ] - then - echo "ERROR: $obj exists but has no Makefile" >&2 - exit $EX_NOINPUT - fi - echo "Will run in existing $obj using $makefile" - exit 0 -fi - -echo "Making in $obj" -cd $obj -eval exec ${MAKE-make} $makeargs diff --git a/BuildTools/bin/configure.sh b/BuildTools/bin/configure.sh deleted file mode 100644 index aff771c..0000000 --- a/BuildTools/bin/configure.sh +++ /dev/null @@ -1,163 +0,0 @@ -#!/bin/sh - -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# @(#)configure.sh 8.27 (Berkeley) 5/19/1998 - -# -# Special script to autoconfigure for M4 generation of Makefile -# - -os="" -resolver="" -sflag="" - -while [ ! -z "$1" ] -do - case $1 - in - -s) # skip auto-configure - sflag=1 - shift - ;; - - *) # OS definition - os=$1 - shift - ;; - esac -done - -usewhoami=0 -usehostname=0 -for p in `echo $PATH | sed 's/:/ /g'` -do - if [ "x$p" = "x" ] - then - p="." - fi - if [ -f $p/whoami ] - then - usewhoami=1 - if [ $usehostname -ne 0 ] - then - break; - fi - fi - if [ -f $p/hostname ] - then - usehostname=1 - if [ $usewhoami -ne 0 ] - then - break; - fi - fi -done -if [ $usewhoami -ne 0 ] -then - user=`whoami` -else - user=$LOGNAME -fi - -if [ $usehostname -ne 0 ] -then - host=`hostname` -else - host=`uname -n` -fi -echo "PUSHDIVERT(0)" -echo "####################################################################" -echo "##### This file is automatically generated -- edit at your own risk" -echo '#####' Built by $user@$host -echo '#####' on `date` using template OS/$os -if [ ! -z "$SITECONFIG" ] -then - echo '#####' including $SITECONFIG -fi -echo '#####' in `pwd` | sed 's/\/tmp_mnt//' -echo "####################################################################" -echo "" -echo "POPDIVERT" -echo "define(\`__HOST__', \`$host')dnl" -echo "ifdef(\`confMAPDEF',, \`define(\`confMAPDEF', \`')')dnl" -echo "ifdef(\`confLIBS',, \`define(\`confLIBS', \`')')dnl" - -# If user did not supply ABI for Build, use SGI_ABI -# so the proper libraries are checked below. -if [ -z "$ABI" ] -then - ABI="$SGI_ABI" -fi - -case $ABI -in - -n32) LIBDIRS="$LIBDIRS /lib32 /usr/lib32" - ;; - -64) LIBDIRS="$LIBDIRS /lib64 /usr/lib64" - ;; - *) LIBDIRS="$LIBDIRS /lib /usr/lib /usr/shlib" - ;; -esac - -libs="" -mapdef="" -for l in $LIBSRCH -do - for p in `echo $LIBDIRS | sed -e 's/:/ /g' -e 's/^-L//g' -e 's/ -L/ /g'` - do - if [ "x$p" = "x" ] - then - p = "." - fi - if [ -f $p/lib$l.a -o -f $p/lib$l.so ] - then - case $l - in - db) - mapdef="$mapdef -DNEWDB" - ;; - bind|resolv) - if [ -n "$resolver" ] - then - continue - else - resolver=$l - fi - ;; - 44bsd) - if [ "x$resolver" != "xresolv" ] - then - continue - fi - ;; - esac - libs="$libs -l$l" - break - fi - done -done - -for p in `echo $PATH | sed 's/:/ /g'` -do - pbase=`echo $p | sed -e 's,/bin,,'` - if [ "x$p" = "x" ] - then - p="." - fi - if [ -f $p/mkdep ] - then - echo "ifdef(\`confDEPEND_TYPE',, \`define(\`confDEPEND_TYPE', \`BSD')')dnl" - fi -done - -if [ -z "$sflag" ] -then - echo "define(\`confMAPDEF', \`$mapdef' confMAPDEF)dnl" - echo "define(\`confLIBS', \`$libs' confLIBS)dnl" -fi diff --git a/BuildTools/bin/find_m4.sh b/BuildTools/bin/find_m4.sh deleted file mode 100755 index 632e86f..0000000 --- a/BuildTools/bin/find_m4.sh +++ /dev/null @@ -1,82 +0,0 @@ -#!/bin/sh - -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# @(#)find_m4.sh 8.4 (Berkeley) 5/19/1998 -# - -# Try to find a working M4 program. -# If $M4 is already set, we use it, otherwise we prefer GNU m4. - -EX_UNAVAILABLE=69 - -test="ifdef(\`pushdef', \`', -\`errprint(\`You need a newer version of M4, at least as new as System V or GNU') -include(NoSuchFile)') -define(\`BadNumber', \`10') -ifdef(\`BadNumber', \`', \`errprint(\`This version of m4 is broken')')" - -if [ "$M4" ] -then - err=`(echo "$test" | $M4) 2>&1 >/dev/null` - code=$? -else - firstfound= - ifs="$IFS"; IFS="${IFS}:" - for m4 in gm4 gnum4 pdm4 m4 - do - for dir in $PATH /usr/5bin /usr/ccs/bin - do - [ -z "$dir" ] && dir=. - if [ -f $dir/$m4 ] - then - err=`(echo "$test" | $dir/$m4) 2>&1 >/dev/null` - ret=$? - if [ $ret -eq 0 -a "X$err" = "X" ] - then - M4=$dir/$m4 - code=0 - break - else - case "$firstfound:$err" in - :*version\ of*) - firstfound=$dir/$m4 - firsterr="$err" - firstcode=$ret - ;; - esac - fi - fi - done - [ "$M4" ] && break - done - IFS="$ifs" - if [ ! "$M4" ] - then - if [ "$firstfound" ] - then - M4=$firstfound - err="$firsterr" - code=$firstcode - else - echo "ERROR: Can not locate an M4 program" >&2 - exit $EX_UNAVAILABLE - fi - fi -fi -if [ $code -ne 0 ] -then - echo "ERROR: Using M4=$M4: $err" | grep -v NoSuchFile >&2 - exit $EX_UNAVAILABLE -elif [ "X$err" != "X" ] -then - echo "WARNING: $err" >&2 -fi -echo $M4 -exit 0 - diff --git a/BuildTools/bin/install.sh b/BuildTools/bin/install.sh deleted file mode 100755 index 840aa33..0000000 --- a/BuildTools/bin/install.sh +++ /dev/null @@ -1,128 +0,0 @@ -#!/bin/sh - -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# @(#)install.sh 8.9 (Berkeley) 5/19/1998 - -# Set default program -program=mv - -# chown program -- ultrix keeps it in /etc/chown and /usr/etc/chown -if [ -f /etc/chown ] -then - chown=/etc/chown -elif [ -f /usr/etc/chown ] -then - chown=/usr/etc/chown -else - chown=chown -fi - -# Check arguments -while [ ! -z "$1" ] -do - case $1 - in - -o) owner=$2 - shift; shift - ;; - - -g) group=$2 - shift; shift - ;; - - -m) mode=$2 - shift; shift - ;; - - -c) program=cp - shift - ;; - - -s) strip="strip" - shift - ;; - - -*) echo $0: Unknown option $1 - exit 1 - ;; - - *) break - ;; - esac -done - -# Check source file -if [ -z "$1" ] -then - echo "Source file required" >&2 - exit 1 -elif [ -f $1 -o $1 = /dev/null ] -then - src=$1 -else - echo "Source file must be a regular file or /dev/null" >&2 - exit 1 -fi - -# Check destination -if [ -z "$2" ] -then - echo "Destination required" >&2 - exit 1 -elif [ -d $2 ] -then - dst=$2/$src -else - dst=$2 -fi - -# Do install operation -$program $src $dst -if [ $? != 0 ] -then - exit 1 -fi - -# Strip if requested -if [ ! -z "$strip" ] -then - $strip $dst -fi - -# Change owner if requested -if [ ! -z "$owner" ] -then - $chown $owner $dst - if [ $? != 0 ] - then - exit 1 - fi -fi - -# Change group if requested -if [ ! -z "$group" ] -then - chgrp $group $dst - if [ $? != 0 ] - then - exit 1 - fi -fi - -# Change mode if requested -if [ ! -z "$mode" ] -then - chmod $mode $dst - if [ $? != 0 ] - then - exit 1 - fi -fi - -exit 0 @@ -1,6 +0,0 @@ -The FAQ is no longer maintained with the sendmail release. It is -available at http://www.sendmail.org/faq/ . - -A plain-text version of the questions only, with URLs referring to -the answers, is posted to comp.mail.sendmail on the 10th and 25th -of each month. diff --git a/KNOWNBUGS b/KNOWNBUGS deleted file mode 100644 index 85409a0..0000000 --- a/KNOWNBUGS +++ /dev/null @@ -1,185 +0,0 @@ - - - K N O W N B U G S I N S E N D M A I L - (for 8.9.0) - - -The following are bugs or deficiencies in sendmail that I am aware of -but which have not been fixed in the current release. You probably -want to get the most up to date version of this from ftp.sendmail.org -in /pub/sendmail/KNOWNBUGS. For descriptions of bugs that have been -fixed, see the file RELEASE_NOTES (in the root directory of the sendmail -distribution). - -This list is not guaranteed to be complete. - - -* Null bytes are not handled properly in headers. - - Sendmail should handle full binary data. As it stands, it handles - all values in the body, but only 0x01-0x80 and 0xA0-0xFF in - the header. Notably missing is 0x00, which would require a major - restructuring of the code -- for example, almost no C library support - could be used to handle strings. - -* Duplicate error messages. - - Sometimes identical, duplicate error messages can be generated. As - near as I can tell, this is rare and relatively innocuous. - -* $c (hop count) macro improperly set. - - The $c macro is supposed to contain the current hop count, for use - when calling a mailer. This macro is initialized too early, and - is always zero (or the value of the -c command line flag, if any). - This macro will probably be removed entirely in a future release; - I don't believe there are any mailers left that require it. - -* If you EXPN a list or user that has a program mailer, the output of - EXPN will include ``@local.host.name''. You can't actually mail to - this address. It's not clear what the right behavior is in this - circumstance. - -* \231 considered harmful. - - Header addresses that have the \231 character (and possibly others - in the range \201 - \237) behave in odd and usually unexpected ways. - -* accept() problem on SVR4. - - Apparently, the sendmail daemon loop (doing accept()s on the network) - can get into a weird state on SVR4; it starts logging ``SYSERR: - getrequests: accept: Protocol Error''. The workaround is to kill - and restart the sendmail daemon. We don't have an SVR4 system at - Berkeley that carries more than token mail load, so I can't validate - this. It is likely to be a glitch in the sockets emulation, since - "Protocol Error" is not possible error code with Berkeley TCP/IP. - - I've also had someone report the message ``sendmail: accept: - SIOCGPGRP failed errno 22'' on an SVR4 system. This message is - not in the sendmail source code, so I assume it is also a bug - in the sockets emulation. (Errno 22 is EINVAL "Invalid Argument" - on all the systems I have available, including Solaris 2.x.) - Apparently, this problem is due to linking -lc before -lsocket; - if you are having this problem, check your Makefile. - -* accept() problem on Linux. - - The accept() in sendmail daemon loop can return ETIMEDOUT. An - error is reported to syslog: - - Jun 9 17:14:12 hostname sendmail[207]: NOQUEUE: SYSERR(root): - getrequests: accept: Connection timed out - - "Connection timed out" is not documented as a valid return from - accept(2) and this was believed to be a bug in the Linux kernel. - Later information from the Linux kernel group states that Linux - 2.0 kernels follow RFC1122 while sendmail follows the original BSD - (now POSIX 1003.1g draft) specification. The 2.1.X and later kernels - will follow the POSIX draft. - -* Excessive mailing list nesting can run out of file descriptors. - - If you have a mailing list that includes lots of other mailing - lists, each of which has a separate owner, you can run out of - file descriptors. Each mailing list with a separate owner uses - one open file descriptor (prior to 8.6.6 it was three open - file descriptors per list). This is particularly egregious if - you have your connection cache set to be large. - -* Connection caching breaks if you pass the port number as an argument. - - If you have a definition such as: - - Mport, P=[IPC], F=kmDFMuX, S=11/31, R=21, - M=2100000, T=DNS/RFC822/SMTP, - A=IPC [127.0.0.1] $h - - (i.e., where $h is the port number instead of the host name) the - connection caching code will break because it won't notice that - two messages addressed to different ports should use different - connections. - -* ESMTP SIZE underestimates the size of a message - - Sendmail makes no allowance for headers that it adds, nor does it - account for the SMTP on-the-wire \r\n expansion. It probably doesn't - allow for 8->7 bit MIME conversions either. - -* Paths to programs being executed and the mode of program files are - not checked. Essentially, the RunProgramInUnsafeDirPath and - RunWritableProgram bits in the DontBlameSendmail option are always - set. This is not a problem if your system is well managed (that is, - if binaries and system directories are mode 755 instead of something - foolish like 777). - -* 8-bit data in GECOS field - - If the GECOS (personal name) information in the passwd file contains - 8-bit characters, those characters can be included in the message - header, which can cause problems when sending SMTP to hosts that - only accept 7-bit characters. - -* 8->7 bit MIME conversion - - When sendmail is doing 8->7 bit MIME conversions, and the message - contains certain MIME body types that cannot be converted to 7-bit, - sendmail will strip the message to 7-bit. - -* 7->8 bit MIME conversion - - If a message that is encoded as 7-bit MIME is converted to 8-bit and - that message when decoded is illegal (e.g., because of long lines or - illegal characters), sendmail can produce an illegal message. - -* MIME encoded full name phrases in the From: header - - If a full name phrase includes characters from MustQuoteChars, sendmail - will quote the entire full name phrase. If MustQuoteChars includes - characters which are not special characters according to STD 11 (RFC - 822), this quotation can interfere with MIME encoded full name phrases. - By default, sendmail includes the single quote character (') in - MustQuoteChars even though it is not listed as a special character in - STD 11. - -* bestmx map with -z flag truncates the list of MX hosts - - A bestmx map configured with the -z flag will truncate the list - of MX hosts. This prevents creation of strings which are too - long for ruleset parsing. This can have an adverse effect on the - relay_based_on_MX feature. - -* Saving to ~sender/dead.letter fails if su'ed to root - - If ErrorMode is set to print and an error in sending mail occurs, - the normal action is to print a message to the screen and append - the message to a dead.letter file in the sender's home directory. - In the case where the sender is using su to act as root, the file - safety checks prevent sendmail from saving the dead.letter file - because the sender's uid and the current real uid do not match. - -* Berkeley DB 2.X race condition with fcntl() locking - - There is a race condition for Berkeley DB 2.X databases on - operating systems which use fcntl() style locking, such as - Solaris. Sendmail locks the map before calling db_open() to - prevent others from modifying the map while it is being opened. - Unfortunately, Berkeley DB opens the map, closes it, and then - reopens it. fcntl() locking drops the lock when any file - descriptor pointing to the file is closed, even if it is a - different file descriptor than the one used to initially lock - the file. As a result there is a possibility that entries in a - map might not be found during a map rebuild. As a workaround, - you can use makemap to build a map with a new name and then - "mv" the new db file to replace the old one. - -* File open timeouts not available on hard mounted NFS file systems - - Since SIGALRM does not interrupt an RPC call for hard mounted - NFS file systems, it is impossible to implement a timeout on a file - open operation. Therefore, while the NFS server is not responding, - attempts to open a file on that server will hang. Systems with - local mail delivery and NFS hard mounted home directories should be - avoided, as attempts to open the forward files could hang. - -(Version 8.36, last updated 2/4/1999) diff --git a/LICENSE b/LICENSE deleted file mode 100644 index d0ff63a..0000000 --- a/LICENSE +++ /dev/null @@ -1,89 +0,0 @@ - SENDMAIL LICENSE - -The following license terms and conditions apply, unless a different -license is obtained from Sendmail, Inc., 1401 Park Avenue, Emeryville, CA -94608, or by electronic mail at license@sendmail.com. - -License Terms: - -Use, Modification and Redistribution (including distribution of any -modified or derived work) in source and binary forms is permitted only if -each of the following conditions is met: - -1. Redistributions qualify as "freeware" or "Open Source Software" under - one of the following terms: - - (a) Redistributions are made at no charge beyond the reasonable cost of - materials and delivery. - - (b) Redistributions are accompanied by a copy of the Source Code or by an - irrevocable offer to provide a copy of the Source Code for up to three - years at the cost of materials and delivery. Such redistributions - must allow further use, modification, and redistribution of the Source - Code under substantially the same terms as this license. For the - purposes of redistribution "Source Code" means the complete source - code of sendmail including all modifications. - - Other forms of redistribution are allowed only under a separate royalty- - free agreement permitting such redistribution subject to standard - commercial terms and conditions. A copy of such agreement may be - obtained from Sendmail, Inc. at the above address. - -2. Redistributions of source code must retain the copyright notices as they - appear in each source code file, these license terms, and the - disclaimer/limitation of liability set forth as paragraph 6 below. - -3. Redistributions in binary form must reproduce the Copyright Notice, - these license terms, and the disclaimer/limitation of liability set - forth as paragraph 6 below, in the documentation and/or other materials - provided with the distribution. For the purposes of binary distribution - the "Copyright Notice" refers to the following language: - "Copyright (c) 1998 Sendmail, Inc. All rights reserved." - -4. Neither the name of Sendmail, Inc. nor the University of California nor - the names of their contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. The name "sendmail" is a trademark of Sendmail, Inc. - -5. All redistributions must comply with the conditions imposed by the - University of California on certain embedded code, whose copyright - notice and conditions for redistribution are as follows: - - (a) Copyright (c) 1988, 1993 The Regents of the University of - California. All rights reserved. - - (b) Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - (i) Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - (ii) Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - (iii) All advertising materials mentioning features or use of this - software must display the following acknowledgement: "This - product includes software developed by the University of - California, Berkeley and its contributors." - - (iv) Neither the name of the University nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -6. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY - SENDMAIL, INC. AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED - WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - NO EVENT SHALL SENDMAIL, INC., THE REGENTS OF THE UNIVERSITY OF - CALIFORNIA OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -(Version 8.6, last updated 6/24/1998) diff --git a/Makefile b/Makefile deleted file mode 100644 index 98ad6e5..0000000 --- a/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -# @(#)Makefile.dist 8.2 (Berkeley) 2/17/1998 - -SHELL= /bin/sh -SUBDIRS= src mail.local mailstats makemap praliases rmail smrsh -BUILD= ./Build -OPTIONS= $(CONFIG) $(FLAGS) - -all clean install:: FRC - @for x in $(SUBDIRS); \ - do \ - (cd $$x; echo Making $@ in:; pwd; \ - $(SHELL) $(BUILD) $(OPTIONS) $@); \ - done - -fresh:: FRC - @for x in $(SUBDIRS); \ - do \ - (cd $$x; echo Making $@ in:; pwd; \ - $(SHELL) $(BUILD) $(OPTIONS) -c); \ - done - -$(SUBDIRS):: FRC - @cd $@; pwd; \ - $(SHELL) $(BUILD) $(OPTIONS) - -FRC: @@ -1,399 +0,0 @@ -/*- - * @(#)README 8.51 (Berkeley) 1/25/1999 - */ - - SENDMAIL RELEASE 8 - -This directory has the latest sendmail(TM) software from Sendmail, Inc. -See doc/changes/changes.me for a summary of changes since 5.67. - -Report any bugs to sendmail-bugs@sendmail.ORG - -There is a web site at http://WWW.Sendmail.ORG -- see that site for -the latest updates. - -****************************************************************** -** A new Build architecture is in place that allows you to ** -** use the "Build" shell script in any of the program ** -** directories. On many environments this will do everything ** -** for you, no fuss, no muss. See src/README for more details ** -** of compilation. See cf/README for details about building ** -** a runtime configuration file. ** -****************************************************************** - -Sendmail is a trademark of Sendmail, Inc. - -+-----------------------+ -| DIRECTORY PERMISSIONS | -+-----------------------+ - -Sendmail often gets blamed for many problems that are actually the -result of other problems, such as overly permissive modes on directories. -For this reason, sendmail checks the modes on system directories and -files to determine if can have been trusted. For sendmail to run -without complaining, you MUST execute the following command: - - chmod go-w / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue - chown root / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue - -You will probably have to tweak this for your environment (for example, -some systems put the spool directory into /usr/spool instead of -/var/spool and use /etc/mail for aliases file instead of /etc). If you -set the RunAsUser option in your sendmail.cf, the /var/spool/mqueue -directory will have to be owned by the RunAsUser user. As a general rule, -after you have compiled sendmail, run the command - - sendmail -v -bi - -to initialize the alias database. If it gives messages such as - - WARNING: writable directory /etc - WARNING: writable directory /usr/spool/mqueue - -then the directories listed have inappropriate write permissions and -should be secured to avoid various possible security attacks. - -Beginning with sendmail 8.9, these checks have become more strict to -prevent users from being able to access files they would normally not -be able to read. In particular, .forward and :include: files in unsafe -directory paths (directory paths which are group or world writable) will -no longer be allowed. This would mean that if user joe's home directory -was writable by group staff, sendmail would not use his .forward file. -This behavior can be altered, at the expense of system security, by -setting the DontBlameSendmail option. For example, to allow .forward -files in group writable directories: - - O DontBlameSendmail=forwardfileingroupwritabledirpath - -Or to allow them in both group and world writable directories: - - O DontBlameSendmail=forwardfileinunsafedirpath - -Items from these unsafe .forward and :include: files will be marked -as unsafe addresses -- the items can not be deliveries to files or -programs. This behavior can also be altered via DontBlameSendmail: - - O DontBlameSendmail=forwardfileinunsafedirpath, - forwardfileinunsafedirpathsafe - -The first flag allows the .forward file to be read, the second allows -the items in the file to be marked as safe for file and program -delivery. - -Other files affected by this strengthened security include class -files (i.e. Fw /etc/sendmail.cw), persistent host status files, and -the files specified by the ErrorHeader and HelpFile options. Similar -DontBlameSendmail flags are available for the class, ErrorHeader, and -HelpFile files. - -If you have an unsafe configuration of .forward and :include: -files, you can make it safe by finding all such files, and doing -a "chmod go-w $FILE" on each. Also, do a "chmod go-w $DIR" for -each directory in the file's path. - - -+--------------+ -| MANUAL PAGES | -+--------------+ - -The sendmail manual pages use contemporary Berkeley troff macros. If -your system does not process these manual pages, you can pick up the -new macros in a BSD Net/2 FTP site (e.g. on FTP.UU.NET, the files -/systems/unix/bsd-sources/share/tmac/*). - -The strip.sed file is only used in installation. - -After installation, edit tmac.doc and tmac.andoc to reflect the -installation path of the tmac files. Those files contain pointers to -/usr/share/tmac/, and those pointers are not changed by the `make -install` process. There's also a bug in those files -- make the -following patch: - -*** tmac.an~ Tue Jul 12 14:29:09 1994 ---- tmac.an Fri Jul 15 13:17:54 1994 -*************** -*** 50,55 **** - .de TH - .rn TH xX - .so /usr/share/lib/tmac/tmac.an.old -! .TH \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 - .rm xX - .. ---- 50,55 ---- - .de TH - .rn TH xX - .so /usr/share/lib/tmac/tmac.an.old -! .TH "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" - .rm xX - .. - -Rename the existing tmac.an to be tmac.an.old, and rename tmac.andoc -to be tmac.an. - -tmac.an will choose between tmac.an.old, your old macros, or tmac.doc, -which are the new macros, so that both the new man pages and the -existing man pages will be translated properly. - -I'm also told that the groff distribution from MIT has a tmac.doc -macro set that is compatible with these macros. - - -+-----------------------+ -| RELATED DOCUMENTATION | -+-----------------------+ - -There are other files you should read. Rooted in this directory are: - - doc/changes/changes.ps - Describes changes between Release 5 and Release 8 of sendmail. - There are some things that may behave somewhat differently. - For example, the rules governing when :include: files will - be read have been tightened up for security reasons. - FAQ - Answers to Frequently Asked Questions. - KNOWNBUGS - Known bugs in the current release. I try to keep this up - to date -- get the latest version from FTP.Sendmail.ORG - in /ucb/sendmail/KNOWNBUGS. - RELEASE_NOTES - A detailed description of the changes in each version. This - is quite long, but informative. - src/README - Details on compiling and installing sendmail. - cf/README - Details on configuring sendmail. - doc/op/op.me - The sendmail Installation & Operations Guide. Be warned: if - you are running this off on SunOS or some other system with an - old version of -me, you need to add the following macro to the - macros: - - .de sm - \s-1\\$1\\s0\\$2 - .. - - This sets a word in a smaller pointsize. - - -+--------------+ -| RELATED RFCS | -+--------------+ - -There are several related RFCs that you may wish to read -- they are -available via anonymous FTP to several sites, including: - - ftp://nic.ddn.mil/rfc/ - ftp://nis.nsf.net/documents/rfc/ - ftp://nisc.jvnc.net/rfc/ - ftp://venera.isi.edu/in-notes/ - ftp://wuarchive.wustl.edu/doc/rfc/ - -For a list of the primary repositories see: - - http://www.isi.edu/in-notes/rfc-retrieval.txt - -They are also online at: - - http://www.ietf.org/ - -They can also be retrieved via electronic mail by sending -email to one of: - - mail-server@nisc.sri.com - Put "send rfcNNN" in message body - nis-info@nis.nsf.net - Put "send RFCnnn.TXT-1" in message body - sendrfc@jvnc.net - Put "RFCnnn" as Subject: line - -For further instructions see: - - http://www.isi.edu/in-notes/rfc-editor/rfc-info - -Important RFCs for electronic mail are: - - RFC821 SMTP protocol - RFC822 Mail header format - RFC974 MX routing - RFC976 UUCP mail format - RFC1123 Host requirements (modifies 821, 822, and 974) - RFC1413 Identification server - RFC1869 SMTP Service Extensions (ESMTP spec) - RFC1652 SMTP Service Extension for 8bit-MIMEtransport - RFC1870 SMTP Service Extension for Message Size Declaration - RFC2045 Multipurpose Internet Mail Extensions (MIME) Part One: - Format of Internet Message Bodies - RFC1344 Implications of MIME for Internet Mail Gateways - RFC1428 Transition of Internet Mail from Just-Send-8 to - 8-bit SMTP/MIME - RFC1891 SMTP Service Extension for Delivery Status Notifications - RFC1892 Multipart/Report Content Type for the Reporting of - Mail System Administrative Messages - RFC1893 Enhanced Mail System Status Codes - RFC1894 An Extensible Message Format for Delivery Status - Notifications - RFC1985 SMTP Service Extension for Remote Message Queue Starting - RFC2033 Local Mail Transfer Protocol - -Other standards that may be of interest (but which are less directly -relevant to sendmail) are: - - RFC987 Mapping between RFC822 and X.400 - RFC1049 Content-Type header field (extension to RFC822) - -Warning to AIX users: this version of sendmail does not implement -MB, MR, or MG DNS resource records, as defined (as experiments) in -RFC1035. - - -+-------------------+ -| DATABASE ROUTINES | -+-------------------+ - -IF YOU WANT TO RUN THE NEW BERKELEY DB SOFTWARE: **** DO NOT **** -use the version that was on the Net2 tape -- it has a number of -nefarious bugs that were bad enough when I got them; you shouldn't have -to go through the same thing. Instead, get a new version via the web at -http://www.sleepycat.com/. This software is highly recommended; it gets -rid of several stupid limits, it's much faster, and the interface is -nicer to animals and plants. If the Berkeley DB include files -are installed in a location other than those which your compiler searches, -you will need to provide that directory when building: - - Build -I/path/to/include/directory - -If you are using Berkeley DB versions 1.85 or 1.86, you are *strongly* -urged to upgrade to DB version 2, available from http://www.sleepycat.com/. -Berkeley DB versions 1.85 and 1.86 are known to be broken in various nasty -ways (see http://www.sleepycat.com/db.185.html), and can cause sendmail -to dump core. In addition, the newest versions of gcc and the Solaris -compilers perform optimizations in those versions that may cause fairly -random core dumps. - -If you have no choice but to use Berkeley DB 1.85 or 1.86, and you are -using both Berkeley DB and files in the UNIX ndbm format, remove ndbm.h -and ndbm.o from the DB library after building it. You should also apply -all of the patches for DB 1.85 and 1.86 found at the Sleepycat web site -(see http://www.sleepycat.com/db.185.html), as they fix some of the known -problems. - -If you are using a version of Berkeley DB 2 previous to 2.3.15, and you -are using both Berkeley DB and files in the UNIX ndbm format, remove dbm.o -from the DB library after building it. No other changes are necessary. - -If you are using Berkeley DB version 2.3.15 or greater, no changes are -necessary. - -The underlying database file formats changed between Berkeley DB versions -1.85 and 1.86, and again between DB 1.86 and version 2.0. If you are -upgrading from one of those versions, you must recreate your database -file(s). Do this by rebuilding all maps with makemap and rebuilding the -alias file with newaliases. - - -+--------------------+ -| HOST NAME SERVICES | -+--------------------+ - -If you are using NIS or /etc/hosts, it is critical that you -list the long (fully qualified) name somewhere (preferably first) in -the /etc/hosts file used to build the NIS database. For example, the -line should read - - 128.32.149.68 mastodon.CS.Berkeley.EDU mastodon - -**** NOT **** - - 128.32.149.68 mastodon - -If you do not include the long name, sendmail will complain loudly -about ``unable to qualify my own domain name (mastodon) -- using -short name'' and conclude that your canonical name is the short -version and use that in messages. The name "mastodon" doesn't mean -much outside of Berkeley, and so this creates incorrect and unreplyable -messages. - - -+-------------+ -| USE WITH MH | -+-------------+ - -This version of sendmail notices and reports certain kinds of SMTP -protocol violations that were ignored by older versions. If you -are running MH you may wish to install the patch in contrib/mh.patch -that will prevent these warning reports. This patch also works -with the old version of sendmail, so it's safe to go ahead and -install it. - - -+----------------+ -| USE WITH IDENT | -+----------------+ - -Sendmail 8 supports the IDENT protocol, as defined by RFC 1413. -No ident server is included with this distribution. I have found -copies available on: - - ftp.lysator.liu.se /pub/ident/servers - romulus.ucs.uoknor.edu /networking/ident/servers - ftp.cyf-kr.edu.pl /agh/uciagh/network/ident - -If you want to run an IDENT server, I suggest getting a copy from -one of those sites. Versions are available for several different -systems, including Apollo, BSD, NeXT, AIX, TOPS20, and VMS. - - -+-------------------------+ -| INTEROPERATION PROBLEMS | -+-------------------------+ - -Microsoft Exchange Server 5.0 - We have had a report that ``about 7% of messages from Sendmail - to Exchange were not being delivered with status messages of - "connection reset" and "I/O error".'' Upgrading Exchange from - Version 5.0 to Version 5.5 Service Pack 2 solved this problem. - - -+---------------------+ -| DIRECTORY STRUCTURE | -+---------------------+ - -The structure of this directory tree is: - -cf Source for sendmail configuration files. These are - different than what you've seen before. They are a - fairly dramatic rewrite, requiring the new sendmail - (since they use new features). -contrib Some contributed tools to help with sendmail. THESE - ARE NOT SUPPORTED by sendmail -- contact the original - authors if you have problems. (This directory is not - on the 4.4BSD tape.) -doc Documentation. If you are getting source, read - op.me -- it's long, but worth it. -mail.local The source for the local delivery agent used for 4.4BSD. - THIS IS NOT PART OF SENDMAIL! and may not compile - everywhere, since it depends on some 4.4-isms. Warning: - it does mailbox locking differently than other systems. -mailstats Statistics printing program. It has the pathname of - sendmail.st compiled in, so if you've changed that, - beware. -makemap A program that creates the keyed maps used by the $( ... $) - construct in sendmail. It is primitive but effective. - It takes a very simple input format, so you will probably - expect to preprocess must human-convenient formats - using sed scripts before this program will like them. - But it should be functionally complete. -praliases A program to print the DBM or NEWDB version of the - aliases file. -rmail Source for rmail(8). This is used as a delivery - agent for for UUCP, and could presumably be used by - other non-socket oriented mailers. Older versions of - rmail are probably deficient. RMAIL IS NOT PART OF - SENDMAIL!!! The 4.4BSD source is included for you to - look at or try to port to your system. I know it doesn't - compile on {SunOS, HP-UX, OSF/1, other} (pick one). -smrsh The "sendmail restricted shell", which can be used as - a replacement for /bin/sh in the prog mailer to provide - increased security control. NOT PART OF SENDMAIL! -src Source for the sendmail program itself. -test Some test scripts (currently only for compilation aids). diff --git a/RELEASE_NOTES b/RELEASE_NOTES deleted file mode 100644 index e50c3b5..0000000 --- a/RELEASE_NOTES +++ /dev/null @@ -1,6587 +0,0 @@ - SENDMAIL RELEASE NOTES - @(#)RELEASE_NOTES 8.9.3.1 (Berkeley) 2/4/1999 - - -This listing shows the version of the sendmail binary, the version -of the sendmail configuration files, the date of release, and a -summary of the changes in that release. - -8.9.3/8.9.3 99/02/04 - SECURITY: Limit message headers to a maximum of 32K bytes (total - of all headers in a single message) to prevent a denial of - service attack. This limit will be configurable in 8.10. - Problem noted by Michal Zalewski of the "Internet for - Schools" project (IdS). - Prevent segmentation fault on an LDAP lookup if the LDAP map - was closed due to an earlier failure. Problem noted by - Jeff Wasilko of smoe.org. Fix from Booker Bense of - Stanford University and Per Hedeland of Ericsson. - Preserve the order of the MIME headers in multipart messages - when performing the MIME header length check. This - will allow PGP signatures to function properly. Problem - noted by Lars Hecking of University College, Cork, Ireland. - If ruleset 5 rewrote the local address to an :include: directive, - the delivery would fail with an "aliasing/forwarding loop - broken" error. Problem noted by Eric C Hagberg of Morgan - Stanley. Fix from Per Hedeland of Ericsson. - Allow -T to work for bestmx maps. Fix from Aaron Schrab of - ExecPC Internet Systems. - During the transfer of a message in an SMTP transaction, if a - TCP timeout occurs, the message would be properly queued - for later retry but the failure would be logged as - "Illegal Seek" instead of a timeout. Problem noted by - Piotr Kucharski of the Warsaw School of Economics (SGH) - and Carles Xavier Munyoz Baldo of CTV Internet. - Prevent multiple deliveries on a self-referencing alias if the - F=w mailer flag is not set. Problem noted by Murray S. - Kucherawy of Concentric Network Corporation and Per - Hedeland of Ericsson. - Do not strip empty headers but if there is no value and a - default is defined in sendmail.cf, use the default. - Problem noted by Philip Guenther of Gustavus Adolphus - College and Christopher McCrory of Netus, Inc. - Don't inherit information about the sender (notably the full name) - in SMTP (-bs) mode, since this might be called from inetd. - Accept any 3xx reply code in response to DATA command instead of - requiring 354. This change will match the wording to be - published in the updated SMTP specification from the DRUMS - group of the IETF. - Portability: - AIX 4.2.0.2 ships with a /usr/lib/libbind.a which should - not be used. It conflicts with the resolver - built into libc.a. "bind" has been removed - from the confLIBSEARCH BuildTools variable. - Users who have installed BIND 8.X will have - to add it back in their site.config.m4 file. - Problem noted by Ole Holm Nielsen of the - Technical University of Denmark. - CRAY TS 10.0.x from Sven Nielsen of San Diego - Supercomputer Center. - Improved LDAP version 3 integration based on input - from Kurt D. Zeilenga of the OpenLDAP Foundation, - John Beck of Sun Microsystems, and Booker Bense - of Stanford University. - Linux doesn't have a standard way to get the timezone - between different releases. Back out the - change in 8.9.2 and don't attempt to derive - a timezone. Problem reported by Igor S. Livshits - of the University of Illinois at Urbana-Champaign - and Michael Dickens of Tetranet Communications. - Reliant UNIX, the new name for SINIX, from Gert-Jan Looy - of Siemens/SNI. - SunOS 5.8 from John Beck of Sun Microsystems. - CONFIG: SCO UnixWare 2.1 and 7.0 need TZ to get the proper - timezone. Problem noted by Petr Lampa of Technical - University of Brno. - CONFIG: Handle <@bestmx-host:user@otherhost> addressing properly - when using FEATURE(bestmx_is_local). Patch from Neil W. - Rickert of Northern Illinois University. - CONFIG: Properly handle source routed and %-hack addresses on - hosts which the mailertable remaps to local:. Patch from - Neil W. Rickert of Northern Illinois University. - CONFIG: Internal fixup of mailertable local: map value. Patch from - Larry Parmelee of Cornell University. - CONFIG: Only add back +detail from host portion of mailer triplet - on local mailer triplets if it was originally +detail. - Patch from Neil W. Rickert of Northern Illinois University. - CONFIG: The bestmx_is_local checking done in check_rcpt would - cause later checks to fail. Patch from Paul J Murphy of - MIDS Europe. - New files: - BuildTools/OS/CRAYTS.10.0.x - BuildTools/OS/ReliantUNIX - BuildTools/OS/SunOS.5.8 - -8.9.2/8.9.2 98/12/30 - SECURITY: Remove five second sleep on accepting daemon connections - due to an accept() failure. This sleep could be used - for a denial of service attack. - Do not silently ignore queue files with names which are too long. - Patch from Bryan Costales of InfoBeat, Inc. - Do not store failures closing an SMTP session in persistent - host status. Reported by Graeme Hewson of Oracle - Corporation UK. - Allow symbolic link forward files if they are in safe directories. - Problem noted by Andreas Schott of the Max Planck Society. - Missing columns in a text map could cause a segmentation fault. - Fix from David Lee of the University of Durham. - Note that for 8.9.X, PrivacyOptions=goaway also includes the - noetrn flag. This is scheduled to change in a future - version of sendmail. Problem noted by Theo Van Dinter of - Chrysalis Symbolic Designa and Alan Brown of Manawatu - Internet Services. - When trying to do host canonification in a Wildcard MX - environment, try an MX lookup of the hostname without the - default domain appended. Problem noted by Olaf Seibert of - Polderland Language & Speech Technology. - Reject SMTP RCPT To: commands with only comments (i.e. - 'RCPT TO: (comment)'. Problem noted by Earle Ake of - Hassler Communication Systems Technology, Inc. - Handle any number of %s in the LDAP filter spec. Patch from - Per Hedeland of Ericsson. - Clear ldapx open timeouts even if the map open failed to prevent - a segmentation fault. Patch from Wayne Knowles of the - National Institute of Water & Atmospheric Research Ltd. - Do not syslog envelope clone messages when using address - verification (-bv). Problem noted by Kari Hurtta of the - Finnish Meteorological Institute. - Continue to perform queue runs while in daemon mode even if the - daemon is rejecting connections due to a disk full - condition. Problem noted by JR Oldroyd of TerraNet - Internet Services. - Include full filename on installation of the sendmail.hf file - in case the $HFDIR directory does not exist. Problem - noted by Josef Svitak of Montana State University. - Close all maps when exiting the process with one exception. - Berkeley DB can use internal shared memory locking for - its memory pool. Closing a map opened by another process - will interfere with the shared memory and locks of the - parent process leaving things in a bad state. For - Berkeley DB, only close the map if the current process - is also the one that opened the map, otherwise only close - the map file descriptor. Thanks to Yoseff Francus of - Collective Technologies for volunteering his system for - extended testing. - Avoid null pointer dereference on XDEBUG output for SMTP reply - failures. Problem noted by Carlos Canau of EUnet Portugal. - On mailq and hoststat listings being piped to another program, such - as more, if the pipe closes (i.e. the user quits more), - stop sending output and exit. Patch from Allan E Johannesen - of Worcester Polytechnic Institute. - In accordance with the documentation, LDAP map lookup failures - are now considered temporary failures instead of permanent - failures unless the -t flag is used in the map definition. - Problem noted by Booker Bense of Stanford University and - Eric C. Hagberg of Morgan Stanley. - Fix by one error reporting on long alias names. Problem noted by - H. Paul Hammann of the Missouri Research and Education - Network. - Fix DontBlameSendmail=IncludeFileInUnsafeDirPath behavior. Problem - noted by Barry S. Finkel of Argonne National Laboratory. - When automatically converting from 8 bit to quoted printable MIME, - be careful not to miss a multi-part boundary if that - boundary is preceded by a boundary-like line. Problem - noted by Andreas Raschle of Ansid Inc. Fix from - Kari Hurtta of the Finnish Meteorological Institute. - Avoid bogus reporting of "LMTP tobuf overflow" when the buffer - has enough space for the additional address. Problem - noted by Steve Cliffe of the University of Wollongong. - Fix DontBlameSendmail=FileDeliveryToSymlink behavior. Problem - noted by Alex Vorobiev of Swarthmore College. - If the check_compat ruleset resolves to the $#discard mailer, - discard the current recipient. Unlike check_relay, - check_mail, and check_rcpt, the entire envelope is not - discarded. Problem noted by RZ D. Rahlfs. Fix from - Claus Assmann of Christian-Albrechts-University of Kiel. - Avoid segmentation fault when reading ServiceSwitchFile files with - bogus formatting. Patch from Kari Hurtta of the Finnish - Meteorological Institute. - Support Berkeley DB 2.6.4 API change. - OP.ME: Pages weren't properly output on duplexed printers. Fix - from Matthew Black of CSU Long Beach. - Portability: - Apple Rhapsody from Wilfredo Sanchez of Apple Computer, Inc. - Avoid a clash with IRIX 6.2 getopt.h and the UserDatabase - option structure. Problem noted by Ashley M. - Kirchner of Photo Craft Laboratories, Inc. - Break out IP address to hostname translation for - reading network interface addresses into - class 'w'. Patch from John Kennedy of - Cal State University, Chico. - AIX 4.x use -qstrict with -O3 to prevent the optimized - from changing the semantics of the compiled - program. From Simon Travaglia of the - University of Waikato, New Zealand. - FreeBSD 2.2.2 and later support setusercontext(). From - Peter Wemm of DIALix. - FreeBSD 3.x fix from Peter Wemm of DIALix. - IRIX 5.x has a syslog buffer size of 512 bytes. From - Nao NINOMIYA of Utsunomiya University. - IRIX 6.5 64-bit Build support. - LDAP Version 3 support from John Beck and Ravi Iyer - of Sun Microsystems. - Linux does not implement seteuid() properly. From - John Kennedy of Cal State University, Chico. - Linux timezone type was set improperly. From Takeshi Itoh - of Bits Co., Ltd. - NCR MP-RAS 3.x needs -lresolv for confLIBS. From - Tom J. Moore of NCR. - NeXT 4.x correction to man page path. From J. P. McCann - of E I A. - System V Rel 5.x (a.k.a UnixWare7 w/o BSD-Compatibility Libs) - from Paul Gampe of the Asia Pacific Network - Information Center. - ULTRIX now requires an optimization limit of 970 from - Allan E Johannesen of Worcester Polytechnic - Institute. - Fix extern declaration for sm_dopr(). Fix from Henk - van Oers of Algemeen Nederlands Persbureau. - CONFIG: Catch @hostname,user@anotherhost.domain as relaying. - Problem noted by Mark Rogov of AirMedia, Inc. Fix from - Claus Assmann of Christian-Albrechts-University of Kiel. - CONFIG: Do not refer to http://maps.vix.com/ on RBL rejections as - there are multiple RBL's available and the MAPS RBL may - not be the one in use. Suggested by Alan Brown of - Manawatu Internet Services. - CONFIG: Properly strip route addresses (i.e. @host1:user@host2) - when stripping down a recipient address to check for - relaying. Patch from Claus Assmann of - Christian-Albrechts-University of Kiel and Neil W Rickert - of Northern Illinois University. - CONFIG: Allow the access database to override RBL lookups. Patch - from Claus Assmann of Christian-Albrechts-University of - Kiel. - CONFIG: UnixWare 7 support from Phillip P. Porch of The Porch - Dot Com. - CONFIG: Fixed check for deferred delivery mode warning. Patch - from Claus Assmann of Christian-Albrechts-University of - Kiel and Per Hedeland of Ericsson. - CONFIG: If a recipient using % addressing is used, e.g. - user%site@othersite, and othersite's MX records are now - checked for local hosts if FEATURE(relay_based_on_MX) is - used. Problem noted by Alexander Litvin of Lucky Net Ltd. - Patch from Alexander Litvin of Lucky Net Ltd and - Claus Assmann of Christian-Albrechts-University of Kiel. - MAIL.LOCAL: Prevent warning messages from appearing in the LMTP - stream. Do not allow more than one response per recipient. - MAIL.LOCAL: Handle routed addresses properly when using LMTP. Fix - from John Beck of Sun Microsystems. - MAIL.LOCAL: Properly check for CRLF when using LMTP. Fix from - John Beck of Sun Microsystems. - MAIL.LOCAL: Substitute MAILER-DAEMON for the LMTP empty sender in - the envelope From header. - MAIL.LOCAL: Accept underscores in hostnames in LMTP mode. - Problem noted by Glenn A. Malling of Syracuse University. - MAILSTATS: Document msgsrej and msgsdis fields in the man page. - Problem noted by Richard Wong of Princeton University. - MAKEMAP: Build group list so group writable files are allowed with - the -s flag. Problem noted by Curt Sampson of Internet - Portal Services, Inc. - PRALIASES: Automatically handle alias files created without the - NULL byte at the end of the key. Patch from John Beck of - Sun Microsystems. - PRALIASES: Support Berkeley DB 2.6.4 API change. - New Files: - BuildTools/OS/IRIX64.6.5 - BuildTools/OS/UnixWare.5.i386 - cf/cf/unixware7.m4 - contrib/smcontrol.pl - src/control.c - -8.9.1/8.9.1 98/07/02 - If both an OS specific site configuration file and a generic - site.config.m4 file existed, only the latter was used - instead of both. Problem noted by Geir Johannessen of - the Norwegian University of Science and Technology. - Fix segmentation fault while converting 8 bit to 7 bit MIME - multipart messages by trying to write to an unopened - file descriptor. Fix from Kari Hurtta of the Finnish - Meteorological Institute. - Do not assume Message: and Text: headers indicate the end of - the header area when parsing MIME headers. Problem noted - by Kari Hurtta of the Finnish Meteorological Institute. - Setting the confMAN#SRC Build variable would only effect the - installation commands. The man pages would still be - built with .0 extensions. Problem noted by Bryan - Costales of InfoBeat, Inc. - Installation of manual pages didn't honor the DESTDIR environment - variable. Problem noted by Bryan Costales of InfoBeat, Inc. - If the check_relay ruleset resolved to the discard mailer, messages - were still delivered. Problem noted by Mirek Luc of NASK. - Mail delivery to files would fail with an Operating System Error - if sendmail was not running as root, i.e. RunAsUser was set. - Problem noted by Leonard N. Zubkoff of Dandelion Digital. - Prevent MinQueueAge from interfering from queued items created - in the future, i.e. if the system clock was set ahead - and then back. Problem noted by Michael Miller of the - University of Natal, Pietermaritzburg. - Do not advertise ETRN support in ESTMP EHLO reply if noetrn is - set in the PrivacyOptions option. Fix from Ted Rule of - Flextech TV. - Log invalid persistent host status file lines instead of - bouncing the message. Problem noted by David Lindes of - DaveLtd Enterprises. - Move creation of empty sendmail.st file from installation to - compilation. Installation may be done from a read-only - mount. Fix from Bryan Costales of InfoBeat, Inc. and Ric - Anderson of the Oasis Research Center, Inc. - Enforce the maximum number of User Database entries limit. Problem - noted by Gary Buchanan of Credence Systems Inc. - Allow dead.letter files in root's home directory. Problem noted - by Anna Ullman of Sun Microsystems. - Program deliveries in forward files could be marked unsafe if - any directory listed in the ForwardPath option did not - exist. Problem noted by Jorg Bielak of Coastal Web Online. - Do not trust the length of the address structure returned by - gethostbyname(). Problem noted by Chris Evans of Oxford - University. - If the SIZE= MAIL From: ESMTP parameter is too large, use the - 5.3.4 DSN status code instead of 5.2.2. Similarly, for - non-local deliveries, if the message is larger than the - mailer maximum message size, use 5.3.4 instead of 5.2.3. - Suggested by Antony Bowesman of - Fujitsu/TeaWARE Mail/MIME System. - Portability: - Fix the check for an IP address reverse lookup for - use in $&{client_name} on 64 bit platforms. - From Gilles Gallot of Institut for Development - and Resources in Intensive Scientific computing. - BSD-OS uses .0 for man page extensions. From Jeff Polk - of BSDI. - DomainOS detection for Build. Also, version 10.4 and later - ship a unistd.h. Fixes from Takanobu Ishimura of - PICT Inc. - NeXT 4.x uses /usr/lib/man/cat for its man pages. From - J. P. McCann of E I A. - SCO 4.X and 5.X include NDBM support. From Vlado Potisk - of TEMPEST, Ltd. - CONFIG: Do not pass spoofed PTR results through resolver for - qualification. Problem noted by Michiel Boland of - Digital Valley Internet Professionals; fix from - Kari Hurtta of the Finnish Meteorological Institute. - CONFIG: Do not try to resolve non-DNS hostnames such as UUCP, - BITNET, and DECNET addresses for resolvable senders. - Problem noted by Alexander Litvin of Lucky Net Ltd. - CONFIG: Work around Sun's broken configuration which sends bounce - messages as coming from @@hostname instead of <>. LMTP - would not accept @@hostname. - OP.ME: Corrections to complex sendmail startup script from Rick - Troxel of the National Institutes of Health. - RMAIL: Do not install rmail by default, require 'make force-install' - as this rmail isn't the same as others. Suggested by - Kari Hurtta of the Finnish Meteorological Institute. - New Files: - BuildTools/OS/DomainOS.10.4 - -8.9.0/8.9.0 98/05/19 - SECURITY: To prevent users from reading files not normally - readable, sendmail will no longer open forward, :include:, - class, ErrorHeader, or HelpFile files located in unsafe - (i.e. group or world writable) directory paths. Sites - which need the ability to override security can use the - DontBlameSendmail option. See the README file for more - information. - SECURITY: Problems can occur on poorly managed systems, specifically, - if maps or alias files are in world writable directories. - This fixes the change added to 8.8.6 to prevent links in these - world writable directories. - SECURITY: Make sure ServiceSwitchFile option file is not a link if - it is in a world writable directory. - SECURITY: Never pass a tty to a mailer -- if a mailer can get at the - tty it may be able to push bytes back to the senders input. - Unfortunately this breaks -v mode. Problem noted by - Wietse Venema of the Global Security Analysis Lab at - IBM T.J. Watson Research. - SECURITY: Empty group list if DontInitGroups is set to true to - prevent program deliveries from picking up extra group - privileges. Problem reported by Wolfgang Ley of DFN-CERT. - SECURITY: The default value for DefaultUser is now set to the uid and - gid of the first existing user mailnull, sendmail, or daemon - that has a non-zero uid. If none of these exist, sendmail - reverts back to the old behavior of using uid 1 and gid 1. - This is a security problem for Linux which has chosen that - uid and gid for user bin instead of daemon. If DefaultUser - is set in the configuration file, that value overrides this - default. - SECURITY: Since 8.8.7, the check for non-setuid binaries - interfered with setting an alternate group id for the - RunAsUser option. Problem noted by Randall Winchester of - the University of Maryland. - Add support for Berkeley DB 2.X. Based on patch from John Kennedy - of Cal State University, Chico. - Remove support for OLD_NEWDB (pre-1.5 version of Berkeley DB). Users - which previously defined OLD_NEWDB=1 must now upgrade to the - current version of Berkeley DB. - Added support for regular expressions using the new map class regex. - From Jan Krueger of Unix-AG of University of Hannover. - Support for BIND 8.1.1's hesiod for hesiod maps and hesiod - UserDatabases from Randall Winchester of the University - of Maryland. - Allow any shell for user shell on program deliveries on V1 - configurations for backwards compatibility on machines which - do not have getusershell(). Fix from John Beck of Sun - Microsystems. - On operating systems which change the process title by reusing the - argument vector memory, sendmail could corrupt memory if the - last argument was either "-q" or "-d". Problem noted by - Frank Langbein of the University of Stuttgart. - Support Local Mail Transfer Protocol (LMTP) between sendmail and - mail.local on the F=z flag. - Macro-expand the contents of the ErrMsgFile. Previously this was - only done if you had magic characters (0x81) to indicate - macro expansion. Now $x will be expanded. This means that - real dollar signs have to be backslash escaped. - TCP Wrappers expects "unknown" in the hostname argument if the - reverse DNS lookup for the incoming connection fails. - Problem noted by Randy Grimshaw of Syracuse University and - Wietse Venema of the Global Security Analysis Lab at - IBM T.J. Watson Research. - DSN success bounces generated from an invocation of sendmail -t - would be sent to both the sender and MAILER-DAEMON. - Problem noted by Claus Assmann of - Christian-Albrechts-University of Kiel. - Avoid "Error 0" messages on delivery mailers which exit with a - valid exit value such as EX_NOPERM. Fix from Andreas Luik - of ISA Informationssysteme GmbH. - Tokenize $&x expansions on right hand side of rules. This eliminates - the need to use tricks like $(dequote "" $&{client_name} $) - to cause the ${client_name} macro to be properly tokenized. - Add the MaxRecipientsPerMessage option: this limits the number of - recipients that will be accepted in a single SMTP - transaction. After this number is reached, sendmail - starts returning "452 Too many recipients" to all RCPT - commands. This can be used to limit the number of recipients - per envelope (in particular, to discourage use of the server - for spamming). Note: a better approach is to restrict - relaying entirely. - Fixed pointer initialization for LDAP lmap struct, fixed -s option - to ldapx map and added timeout for ldap_open call to - avoid hanging sendmail in the event of hung LDAP servers. - Patch from Booker Bense of Stanford University. - Allow multiple -qI, -qR, or -qS queue run limiters. For example, - '-qRfoo -qRbar' would deliver mail to recipients with foo or - bar in their address. Patch from Allan E Johannesen of - Worcester Polytechnic Institute. - The bestmx map will now return a list of the MX servers for a host if - passed a column delimiter via the -z map flag. This can be - used to check if the server is an MX server for the recipient - of a message. This can be used to help prevent relaying. - Patch from Mitchell Blank Jr of Exec-PC. - Mark failures for the *file* mailer and return bounce messages to the - sender for those failures. - Prevent bogus syslog timestamps on errors in sendmail.cf by - preserving the TZ environment variable until TimeZoneSpec - has been determined. Problem noted by Ralf Hildebrandt of - Technical University of Braunschweig. Patch from Per Hedeland - of Ericsson. - Print test input in address test mode when input is not from the tty - when the -v flag is given (i.e. sendmail -bt -v) to make - output easier to decipher. Problem noted by Aidan Nichol - of Procter & Gamble. - The LDAP map -s flag was not properly parsed and the error message - given included the remainder of the arguments instead of - solely the argument in error. Problem noted by Aidan Nichol - of Procter & Gamble. - New DontBlameSendmail option. This option allows administrators to - bypass some of sendmail's file security checks at the expense - of system security. This should only be used if you are - absolutely sure you know the consequences. The available - DontBlameSendmail options are: - Safe - AssumeSafeChown - ClassFileInUnsafeDirPath - ErrorHeaderInUnsafeDirPath - GroupWritableDirPathSafe - GroupWritableForwardFileSafe - GroupWritableIncludeFileSafe - GroupWritableAliasFile - HelpFileinUnsafeDirPath - WorldWritableAliasFile - ForwardFileInGroupWritableDirPath - IncludeFileInGroupWritableDirPath - ForwardFileInUnsafeDirPath - IncludeFileInUnsafeDirPath - ForwardFileInUnsafeDirPathSafe - IncludeFileInUnsafeDirPathSafe - MapInUnsafeDirPath - LinkedAliasFileInWritableDir - LinkedClassFileInWritableDir - LinkedForwardFileInWritableDir - LinkedIncludeFileInWritableDir - LinkedMapInWritableDir - LinkedServiceSwitchFileInWritableDir - FileDeliveryToHardLink - FileDeliveryToSymLink - WriteMapToHardLink - WriteMapToSymLink - WriteStatsToHardLink - WriteStatsToSymLink - RunProgramInUnsafeDirPath - RunWritableProgram - New DontProbeInterfaces option to turn off the inclusion of all the - interface names in $=w on startup. In particular, if you - have lots of virtual interfaces, this option will speed up - startup. However, unless you make other arrangements, mail - sent to those addresses will be bounced. - Automatically create alias databases if they don't exist and - AutoRebuildAliases is set. - Add PrivacyOptions=noetrn flag to disable the SMTP ETRN command. - Suggested by Christophe Wolfhugel of the Institut Pasteur. - Add PrivacyOptions=noverb flag to disable the SMTP VERB command. - When determining the client host name ($&{client_name} macro), do - a forward (A) DNS lookup on the result of the PTR lookup - and compare results. If they differ or if the PTR lookup - fails, &{client_name} will contain the IP address - surrounded by square brackets (e.g. [127.0.0.1]). - New map flag: -Tx appends "x" to lookups that return temporary failure - (i.e, it is like -ax for the temporary failure case, in - contrast to the success case). - New syntax to do limited checking of header syntax. A config line - of the form: - HHeader: $>Ruleset - causes the indicated Ruleset to be invoked on the Header - when read. This ruleset works like the check_* rulesets -- - that is, it can reject mail on the basis of the contents. - Limit the size of the HELO/EHLO parameter to prevent spammers - from hiding their connection information in Received: - headers. - When SingleThreadDelivery is active, deliveries to locked hosts - are skipped. This will cause the delivering process to - try the next MX host or queue the message if no other MX - hosts are available. Suggested by Alexander Litvin. - The [FILE] mailer type now delivers to the file specified in the - A= equate of the mailer definition instead of $u. It also - obeys all of the F= mailer flags such as the MIME - 7/8 bit conversion flags. This is useful for defining - a mailer which delivers to the same file regardless of the - recipient (e.g. 'A=FILE /dev/null' to discard unwanted mail). - Do not assume the identity of a remote connection is root@localhost - if the remote connection closes the socket before the - remote identity can be queried. - Change semantics of the F=S mailer flag back to 8.7.5 behavior. - Some mailers, including procmail, require that the real - uid is left unchanged by sendmail. Problem noted by Per - Hedeland of Ericsson. - No longer is the src/obj*/Makefile selected from a large list -- it - is now generated using the information in BuildTools/OS/ -- - some of the details are determined dynamically via - BuildTools/bin/configure.sh. - The other programs in the sendmail distribution -- mail.local, - mailstats, makemap, praliases, rmail, and smrsh -- now use - the new Build method which creates an operating system - specific Makefile using the information in BuildTools. - Make 4xx reply codes to the SMTP MAIL command be non-sticky (i.e., - a failure on one message won't affect future messages to the - same host). This is necessary if the remote host sends - a 451 error if the domain of the sender does not resolve - as is common in anti-spam configurations. Problem noted - by Mitchell Blank Jr of Exec-PC. - New "discard" mailer for check_* rulesets and header checking - rulesets. If one of the above rulesets resolves to the - $#discard mailer, the commands will be accepted but the - message will be completely discarded after it is accepting. - This means that even if only one of the recipients - resolves to the $#discard mailer, none of the recipients - will receive the mail. Suggested by Brian Kantor. - All but the last cloned envelope of a split envelope were queued - instead of being delivered. Problem noted by John Caruso - of CNET: The Computer Network. - Fix deadlock situation in persistent host status file locking. - Syslog an error if a user forward file could not be read due to - an error. Patch from John Beck of Sun Microsystems. - Use the first name returned on machine lookups when canonifying a - hostname via NetInfo. Patch from Timm Wetzel of GWDG. - Clear the $&{client_addr}, $&{client_name}, and $&{client_port} - macros when delivering a bounce message to prevent - rejection by a check_compat ruleset which uses these macros. - Problem noted by Jens Hamisch of AgiX Internetservices GmbH. - If the check_relay ruleset resolves to the the error mailer, the - error in the $: portion of the resolved triplet is used - in the rejection message given to the remote machine. - Suggested by Scott Gifford of The Internet Ramp. - Set the $&{client_addr}, $&{client_name}, and $&{client_port} macros - before calling the check_relay ruleset. Suggested by Scott - Gifford of The Internet Ramp. - Sendmail would get a segmentation fault if a mailer exited with an - exit code of 79. Problem noted by Aaron Schrab of ExecPC - Internet. Fix from Christophe Wolfhugel of the Pasteur - Institute. - Separate snprintf/vsnprintf routines into separate file for use by - mail.local. - Allow multiple map lookups on right hand side, e.g., - R$* $( host $1 $) $| $( passwd $1 $). Patch from - Christophe Wolfhugel of the Pasteur Institute. - Properly generate success DSN messages if requested for aliases - which have owner- aliases. Problem noted by Kari Hurtta - of the Finnish Meteorological Institute. - Properly display delayed-expansion macros ($&{macroname}) in - address test mode (-bt). Problem noted by Bryan Costales - of InfoBeat, Inc. - -qR could sometimes match names incorrectly. Problem noted by - Lutz Euler of Lavielle EDV Systemberatung GmbH & Co. - Include a magic number and version in the StatusFile for the - mailstats command. - Record the number of rejected and discarded messages in the - StatusFile for display by the mailstats command. Patch - from Randall Winchester of the University of Maryland. - IDENT returns where the OSTYPE field equals "OTHER" now list the - user portion as IDENT:username@site instead of - username@site to differentiate the two. Suggested by - Kari Hurtta of the Finnish Meteorological Institute. - Enforce timeout for LDAP queries. Patch from Per Hedeland of - Ericsson. - Change persistent host status filename substitution so '/' is - replaced by ':' instead of '|' to avoid clashes. Also - avoid clashes with hostnames with leading dots. Fix from - Mitchell Blank Jr. of Exec-PC. - If the system lock table is full, only attempt to create a new - queue entry five times before giving up. Previously, it - was attempted indefinitely which could cause the partition - to run out of inodes. Problem noted by Suzie Weigand of - Stratus Computer, Inc. - In verbose mode, warn if the sendmail.cf version is less than the - currently supported version. - Sorting for QueueSortOrder=host is now case insensitive. Patch - from Randall S. Winchester of the University of Maryland. - Properly quote a full name passed via the -F command line option, - the Full-Name: header, or the NAME environment variable if - it contains characters which must be quoted. Problem noted - by Kari Hurtta of the Finnish Meteorological Institute. - Avoid possible race condition that unlocked a mail job before - releasing the transcript file on systems that use flock(2). - In some cases, this might result in a "Transcript Unavailable" - message in error bounces. - Accept SMTP replies which contain only a reply code and no - accompanying text. Problem noted by Fernando Fraticelli of - Digital Equipment Corporation. - Portability: - AIX 4.1 uses int for SOCKADDR_LEN_T from Motonori Nakamura - of Kyoto University. - AIX 4.2 requires <userpw.h> before <usersec.h>. Patch from - Randall S. Winchester of the University of - Maryland. - AIX 4.3 from Valdis Kletnieks of Virginia Tech CNS. - CRAY T3E from Manu Mahonen of Center for Scientific Computing - in Finland. - Digital UNIX now uses statvfs for determining free - disk space. Patch from Randall S. Winchester of - the University of Maryland. - HP-UX 11.x from Richard Allen of Opin Kerfi HF and - Regis McEwen of Progress Software Corporation. - IRIX 64 bit fixes from Kari Hurtta of the Finnish - Meteorological Institute. - IRIX 6.2 configuration fix for mail.local from Michael Kyle - of CIC/Advanced Computing Laboratory. - IRIX 6.5 from Thomas H Jones II of SGI. - IRIX 6.X load average code from Bob Mende of SGI. - QNX from Glen McCready <glen@qnx.com>. - SCO 4.2 and 5.x use /usr/bin instead of /usr/ucb for links - to sendmail. Install with group bin instead of kmem - as kmem does not exist. From Guillermo Freige of - Gobernacion de la Pcia de Buenos Aires and Paul - Fischer of BTG, Inc. - SunOS 4.X does not include memmove(). Patch from - Per Hedeland of Ericsson. - SunOS 5.7 includes getloadavg() function for determining - load average. Patch from John Beck of Sun - Microsystems. - CONFIG: Increment version number of config file. - CONFIG: add DATABASE_MAP_TYPE to set the default type of database - map for the various maps. The default is hash. Patch from - Robert Harker of Harker Systems. - CONFIG: new confEBINDIR m4 variable for defining the executable - directory for certain programs. - CONFIG: new FEATURE(local_lmtp) to use the new LMTP support for - local mail delivery. By the default, /usr/libexec/mail.local - is used. This is expected to be the mail.local shipped - with 8.9 which is LMTP capable. The path is based on the - new confEBINDIR m4 variable. - CONFIG: Use confEBINDIR in determining path to smrsh for - FEATURE(smrsh). Note that this changes the default from - /usr/local/etc/smrsh to /usr/libexec/smrsh. To obtain the - old path for smrsh, use FEATURE(smrsh, /usr/local/etc/smrsh). - CONFIG: DOMAIN(generic) changes the default confFORWARD_PATH to - include $z/.forward.$w+$h and $z/.forward+$h which allow - the user to setup different .forward files for - user+detail addressing. - CONFIG: add confMAX_RCPTS_PER_MESSAGE, confDONT_PROBE_INTERFACES, - and confDONT_BLAME_SENDMAIL to set MaxRecipientsPerMessage, - DontProbeInterfaces, and DontBlameSendmail options. - CONFIG: by default do not allow relaying (that is, accepting mail - from outside your domain and sending it to another host - outside your domain). - CONFIG: new FEATURE(promiscuous_relay) to allow mail relaying from - any site to any site. - CONFIG: new FEATURE(relay_entire_domain) allows any host in your - domain as defined by the 'm' class ($=m) to relay. - CONFIG: new FEATURE(relay_based_on_MX) to allow relaying based on - the MX records of the host portion of an incoming recipient. - CONFIG: new FEATURE(access_db) which turns on the access database - feature. This database give you the ability to allow - or refuse to accept mail from specified domains for - administrative reasons. By default, names that are listed - as "OK" in the access db are domain names, not host names. - CONFIG: new confCR_FILE m4 variable for defining the name of the file - used for class 'R'. Defaults to /etc/mail/relay-domains. - CONFIG: new command RELAY_DOMAIN(domain) and RELAY_DOMAIN_FILE(file) - to add items to class 'R' ($=R) for hosts allowed to relay. - CONFIG: new FEATURE(relay_hosts_only) to change the behavior - of FEATURE(access_db) and class 'R' to lookup individual - host names only. - CONFIG: new FEATURE(loose_relay_check). Normally, if a recipient - using % addressing is used, e.g. user%site@othersite, - and othersite is in class 'R', the check_rcpt ruleset - will strip @othersite and recheck user@site for relaying. - This feature changes that behavior. It should not be - needed for most installations. - CONFIG: new FEATURE(relay_local_from) to allow relaying if the - domain portion of the mail sender is a local host. This - should only be used if absolutely necessary as it opens - a window for spammers. Patch from Randall S. Winchester of - the University of Maryland. - CONFIG: new FEATURE(blacklist_recipients) turns on the ability to - block incoming mail destined for certain recipient - usernames, hostnames, or addresses. - CONFIG: By default, MAIL FROM: commands in the SMTP session will be - refused if the host part of the argument to MAIL FROM: cannot - be located in the host name service (e.g., DNS). - CONFIG: new FEATURE(accept_unresolvable_domains) accepts - unresolvable hostnames in MAIL FROM: SMTP commands. - CONFIG: new FEATURE(accept_unqualified_senders) accepts - MAIL FROM: senders which do not include a domain. - CONFIG: new FEATURE(rbl) Turns on rejection of hosts found in the - Realtime Blackhole List. You can specify the RBL name - server to contact by specifying it as an optional argument. - The default is rbl.maps.vix.com. For details, see - http://maps.vix.com/rbl/. - CONFIG: Call Local_check_relay, Local_check_mail, and - Local_check_rcpt from check_relay, check_mail, and - check_rcpt. Users with local rulesets should place the - rules using LOCAL_RULESETS. If a Local_check_* ruleset - returns $#OK, the message is accepted. If the ruleset - returns a mailer, the appropriate action is taken, else - the return of the ruleset is ignored. - CONFIG: CYRUS_MAILER_FLAGS now includes the /:| mailer flags by - default to support file, :include:, and program deliveries. - CONFIG: Remove the default for confDEF_USER_ID so the binary can - pick the proper default value. See the SECURITY note - above for more information. - CONFIG: FEATURE(nodns) now warns the user that the feature is a - no-op. Patch from Kari Hurtta of the Finnish - Meteorological Institute. - CONFIG: OSTYPE(osf1) now sets DefaultUserID (confDEF_USER_ID) to - daemon since DEC's /bin/mail will drop the envelope - sender if run as mailnull. See the Digital UNIX section - of src/README for more information. Problem noted by - Kari Hurtta of the Finnish Meteorological Institute. - CONFIG: .cf files are now stored in the same directory with the - .mc files instead of in the obj directory. - CONFIG: New options confSINGLE_LINE_FROM_HEADER, - confALLOW_BOGUS_HELO, and confMUST_QUOTE_CHARS for - setting SingleLineFromHeader, AllowBogusHELO, and - MustQuoteChars respectively. - MAIL.LOCAL: support -l flag to run LMTP on stdin/stdout. This - SMTP-like protocol allows detailed reporting of delivery - status on a per-user basis. Code donated by John Myers of - CMU (now of Netscape). - MAIL.LOCAL: HP-UX support from Randall S. Winchester of the - University of Maryland. NOTE: mail.local is not - compatible with the stock HP-UX mail format. Be sure to - read mail.local/README. - MAIL.LOCAL: Prevent other mail delivery agents from stealing a - mailbox lock. Patch from Randall S. Winchester of the - University of Maryland. - MAIL.LOCAL: glibc portability from John Kennedy of Cal State - University, Chico. - MAIL.LOCAL: IRIX portability from Kari Hurtta of the Finnish - Meteorological Institute. - MAILSTATS: Display the number of rejected and discarded messages - in the StatusFile. Patch from Randall Winchester of the - University of Maryland. - MAKEMAP: New -s flag to ignore safety checks on database map files - such as linked files in world writable directories. - MAKEMAP: Add support for Berkeley DB 2.X. Remove OLD_NEWDB support. - PRALIASES: Add support for Berkeley DB 2.X. - PRALIASES: Do not automatically include NDBM support. Problem - noted by Ralf Hildebrandt of the Technical University of - Braunschweig. - RMAIL: Improve portability for other platforms. Patches from - Randall S. Winchester of the University of Maryland and - Kari Hurtta of the Finnish Meteorological Institute. - Changed Files: - src/Makefiles/Makefile.* files have been modified to use - the new build mechanism and are now BuildTools/OS/*. - src/makesendmail changed to symbolic link to src/Build. - New Files: - BuildTools/M4/header.m4 - BuildTools/M4/depend/BSD.m4 - BuildTools/M4/depend/CC-M.m4 - BuildTools/M4/depend/NCR.m4 - BuildTools/M4/depend/Solaris.m4 - BuildTools/M4/depend/X11.m4 - BuildTools/M4/depend/generic.m4 - BuildTools/OS/AIX.4.2 - BuildTools/OS/AIX.4.x - BuildTools/OS/CRAYT3E.2.0.x - BuildTools/OS/HP-UX.11.x - BuildTools/OS/IRIX.6.5 - BuildTools/OS/NEXTSTEP.4.x - BuildTools/OS/NeXT.4.x - BuildTools/OS/NetBSD.8.3 - BuildTools/OS/QNX - BuildTools/OS/SunOS.5.7 - BuildTools/OS/dcosx.1.x.NILE - BuildTools/README - BuildTools/Site/README - BuildTools/bin/Build - BuildTools/bin/configure.sh - BuildTools/bin/find_m4.sh - BuildTools/bin/install.sh - Makefile - cf/cf/Build - cf/cf/generic-hpux10.cf - cf/feature/accept_unqualified_senders.m4 - cf/feature/accept_unresolvable_domains.m4 - cf/feature/access_db.m4 - cf/feature/blacklist_recipients.m4 - cf/feature/loose_relay_check.m4 - cf/feature/local_lmtp.m4 - cf/feature/promiscuous_relay.m4 - cf/feature/rbl.m4 - cf/feature/relay_based_on_MX.m4 - cf/feature/relay_entire_domain.m4 - cf/feature/relay_hosts_only.m4 - cf/feature/relay_local_from.m4 - cf/ostype/qnx.m4 - contrib/doublebounce.pl - mail.local/Build - mail.local/Makefile.m4 - mail.local/README - mailstats/Build - mailstats/Makefile.m4 - makemap/Build - makemap/Makefile.m4 - praliases/Build - praliases/Makefile.m4 - rmail/Build - rmail/Makefile.m4 - rmail/rmail.0 - smrsh/Build - smrsh/Makefile.m4 - src/Build - src/Makefile.m4 - src/snprintf.c - Deleted Files: - cf/cf/Makefile (replaced by Makefile.dist) - mail.local/Makefile - mail.local/Makefile.dist - mailstats/Makefile - mailstats/Makefile.dist - makemap/Makefile - makemap/Makefile.dist - praliases/Makefile - praliases/Makefile.dist - rmail/Makefile - smrsh/Makefile - smrsh/Makefile.dist - src/Makefile - src/Makefiles/Makefile.AIX.4 (split into AIX.4.x and AIX.4.2) - src/Makefiles/Makefile.SMP_DC.OSx.NILE - (renamed BuildTools/OS/dcosx.1.x.NILE) - src/Makefiles/Makefile.Utah (obsolete platform) - Renamed Files: - READ_ME => README - cf/cf/Makefile.dist => Makefile - cf/cf/obj/* => cf/cf/* - src/READ_ME => src/README - -8.8.8/8.8.8 97/10/24 - If the check_relay ruleset failed, the relay= field was logged - incorrectly. Problem noted by Kari Hurtta of the Finnish - Meteorological Institute. - If /usr/tmp/dead.letter already existed, sendmail could not - add additional bounces to it. Problem noted by Thomas J. - Arseneault of SRI International. - If an SMTP mailer used a non-standard port number for the outgoing - connection, it would be displayed incorrectly in verbose mode. - Problem noted by John Kennedy of Cal State University, Chico. - Log the ETRN parameter specified by the client before altering them - to internal form. Suggested by Bob Kupiec of GES-Verio. - EXPN and VRFY SMTP commands on malformed addresses were logging as - User unknown with bogus delay= values. Change them to log - the same as compliant addresses. Problem noted by Kari E. - Hurtta of the Finnish Meteorological Institute. - Ignore the debug resolver option unless using sendmail debug trace - option for resolver. Problem noted by Greg Nichols of Wind - River Systems. - If SingleThreadDelivery was enabled and the remote server returned a - protocol error on the DATA command, the connection would be - closed but the persistent host status file would not be - unlocked so other sendmail processes could not deliver to - that host. Problem noted by Peter Wemm of DIALix. - If queueing up a message due to an expensive mailer, don't increment - the number of delivery attempts or set the last delivery - attempt time so the message will be delivered on the next - queue run regardless of MinQueueAge. Problem noted by - Brian J. Coan of the Institute for Global Communications. - Authentication warnings of "Processed from queue _directory_" and - "Processed by _username_ with -C _filename_" would be logged - with the incorrect timestamp. Problem noted by Kari E. Hurtta - of the Finnish Meteorological Institute. - Use a better heuristic for detecting GDBM. - Log null connections on dropped connections. Problem noted by - Jon Lewis of Florida Digital Turnpike. - If class dbm maps are rebuilt, sendmail will now detect this and - reopen the map. Previously, they could give stale - results during a single message processing (but would - recover when the next message was received). Fix from - Joe Pruett of Q7 Enterprises. - Do not log failures such as "User unknown" on -bv or SMTP VRFY - requests. Problem noted by Kari E. Hurtta of the - Finnish Meteorological Institute. - Do not send a bounce message back to the sender regarding bad - recipients if the SMTP connection is dropped before the - message is accepted. Problem noted by Kari E. Hurtta of the - Finnish Meteorological Institute. - Use "localhost" instead of "[UNIX: localhost]" when connecting to - sendmail via a UNIX pipe. This will allow rulesets using - $&{client_name} to process without sending the string through - dequote. Problem noted by Alan Barrett of Internet Africa. - A combination of deferred delivery mode, a double bounce situation, - and the inability to save a bounce message to - /var/tmp/dead.letter would cause sendmail to send a bounce - to postmaster but not remove the offending envelope from the - queue causing it to create a new bounce message each time the - queue was run. Problem noted by Brad Doctor of Net Daemons - Associates. - Remove newlines from hostname information returned via DNS. There are - no known security implications of newlines in hostnames as - sendmail filters newlines in all vital areas; however, this - could cause confusing error messages. - Starting with sendmail 8.8.6, mail sent with the '-t' option would be - rejected if any of the specified addresses were bad. This - behavior was modified to only reject the bad addresses and not - the entire message. Problem noted by Jozsef Hollosi of - SuperNet, Inc. - Use Timeout.fileopen when delivering mail to a file. Suggested by - Bryan Costales of InfoBeat, Inc. - Display the proper Final-Recipient on DSN messages for non-SMTP - mailers. Problem noted by Kari E. Hurtta of the - Finnish Meteorological Institute. - An error in calculating the available space in the list of addresses - for logging deliveries could cause an address to be silently - dropped. - Include the initial user environment if sendmail is restarted via - a HUP signal. This will give room for the process title. - Problem noted by Jon Lewis of Florida Digital Turnpike. - Mail could be delivered without a body if the machine does not - support flock locking and runs out of processes during - delivery. Fix from Chuck Lever of the University of Michigan. - Drop recipient address from 251 and 551 SMTP responses per RFC 821. - Problem noted by Kari E. Hurtta of the Finnish Meteorological - Institute. - Make sure non-rebuildable database maps are opened before the - rebuildable maps (i.e. alias files) in case the database maps - are needed for verifying the left hand side of the aliases. - Problem noted by Lloyd Parkes of Victoria University. - Make sure sender RFC822 source route addresses are alias expanded for - bounce messages. Problem noted by Juergen Georgi of - RUS University of Stuttgart. - Minor lint fixes. - Return a temporary error instead of a permanent error if an LDAP map - search returns an error. This will allow sequenced maps which - use other LDAP servers to be checked. Fix from Booker Bense - of Stanford University. - When automatically converting from quoted printable to 8bit text do - not pad bare linefeeds with a space. Problem noted by Theo - Nolte of the University of Technology Aachen, Germany. - Portability: - Non-standard C compilers may have had a problem compiling - conf.c due to a standard C external declaration of - setproctitle(). Problem noted by Ted Roberts of - Electronic Data Systems. - AUX: has a broken O_EXCL implementation. Reported by Jim - Jagielski of jaguNET Access Services. - BSD/OS: didn't compile if HASSETUSERCONTEXT was defined. - Digital UNIX: Digital UNIX (and possibly others) moves - loader environment variables into the loader memory - area. If one of these environment variables (such as - LD_LIBRARY_PATH) was the last environment variable, - an invalid memory address would be used by the process - title routine causing memory corruption. Problem - noted by Sam Hartman of Mesa Internet Systems. - GNU libc: uses an enum for _PC_CHOWN_RESTRICTED which caused - chownsafe() to always return 0 even if the OS does - not permit file giveaways. Problem noted by - Yasutaka Sumi of The University of Tokyo. - IRIX6: Syslog buffer size set to 512 bytes. Reported by - Gerald Rinske of Siemens Business Services VAS. - Linux: Pad process title with NULLs. Problem noted by - Jon Lewis of Florida Digital Turnpike. - SCO OpenServer 5.0: SIOCGIFCONF ioctl call returns an - incorrect value for the number of interfaces. - Problem noted by Chris Loelke of JetStream Internet - Services. - SINIX: Update for Makefile and syslog buffer size from Gerald - Rinske of Siemens Business Services VAS. - Solaris: Make sure HASGETUSERSHELL setting for SunOS is not - used on a Solaris machine. Problem noted by - Stephen Ma of Jtec Pty Limited. - CONFIG: SINIX: Update from Gerald Rinske of Siemens Business - Services VAS. - MAKEMAP: Use a better heuristic for detecting GDBM. - CONTRIB: expn.pl: Updated version from the author, David Muir Sharnoff. - OP.ME: Document the F=i mailer flag. Problem noted by Per Hedeland of - Ericsson. - -8.8.7/8.8.7 97/08/03 - If using Berkeley DB on systems without O_EXLOCK (open a file with - an exclusive lock already set -- i.e., almost all systems - except 4.4-BSD derived systems), the initial attempt at - rebuilding aliases file if the database didn't already - exist would fail. Patch from Raymund Will of LST Software - GmbH. - Bogus incoming SMTP commands would reset the SMTP conversation. - Problem noted by Fredrik Jönsson of the Royal Institute - of Technology, Stockholm. - Since TCP Wrappers includes setenv(), unsetenv(), and putenv(), - some environments could give "multiple definitions" for these - routines during compilation. If using TCP Wrappers, assume - that these routines are included as though they were in the - C library. Patch from Robert La Ferla. - When a NEWDB database map was rebuilt at the same time it was being - used by a queue run, the maps could be left locked for the - duration of the queue run, causing other processes to hang. - Problem noted by Kendall Libby of Shore.NET. - In some cases, NoRecipientAction=add-bcc was being ignored, so the - mail was passed on without any recipient header. This could - cause problems downstream. Problem noted by Xander Jansen - of SURFnet ExpertiseCentrum. - Give error when GDBM is used with sendmail. GDBM's locking and - linking of the .dir and .pag files interferes with sendmail's - locking and security checks. Problems noted by Fyodor - Yarochkin of the Kyrgyz Republic FreeNet. - Don't fsync qf files if SuperSafe option is not set. - Avoid extra calls to gethostbyname for addresses for which a - gethostbyaddr found no value. Also, ignore any returns - from gethostbyaddr that look like a dotted quad. - If PTR lookup fails when looking up an SMTP peer, don't tag it as - "may be forged", since at the network level we pretty much - have to assume that the information is good. - In some cases, errors during an SMTP session could leave files - open or locked. - Better handling of missing file descriptors (0, 1, 2) on startup. - Better handling of non-setuid binaries -- avoids certain obnoxious - errors during testing. - Errors in file locking of NEWDB maps had the incorrect file name - printed in the error message. - If the AllowBogusHELO option were set and an EHLO with a bad or - missing parameter were issued, the EHLO behaved like a HELO. - Load limiting never kicked in for incoming SMTP transactions if the - DeliveryMode=background and any recipient was an alias or - had a .forward file. From Nik Conwell of Boston University. - On some non-Posix systems, the decision of whether chown(2) permits - file giveaway was undefined. From Tetsu Ushijima of the - Tokyo Institute of Technology. - Fix race condition that could cause the body of a message to be - lost (so only the header was delivered). This only occurs - on systems that do not use flock(2), and only when a queue - runner runs during a critical section in another message - delivery. Based on a patch from Steve Schweinhart of - Results Computing. - If a qf file was found in a mail queue directory that had a problem - (wrong ownership, bad format, etc.) and the file name was - exactly MAXQFNAME bytes long, then instead of being tried - once, it would be tried on every queue run. Problem noted - by Bryan Costales of Mercury Mail. - If the system supports an st_gen field in the status structure, - include it when reporting that a file has changed after open. - This adds a new compile flag, HAS_ST_GEN (0/1 option). - This out to be checked as well as reported, since it is - theoretically possible for an attacker to remove a file after - it is opened and replace it with another file that has the - same i-number, but some filesystems (notably AFS) return - garbage in this field, and hence always look like the file - has changed. As a practical matter this is not a security - problem, since the files can be neither hard nor soft links, - and on no filesystem (that I am aware of) is it possible to - have two files on the same filesystem with the same i-number - simultaneously. - Delete the root Makefile from the distribution -- it is only for - use internally, and does not work at customer sites. - Fix botch that caused the second MAIL FROM: command in a single - transaction to clear the entire transaction. Problem - noted by John Kennedy of Cal State University, Chico. - Work properly on machines that have _PATH_VARTMP defined without - a trailing slash. (And a pox on vendors that decide to - ignore the established conventions!) Problem noted by - Gregory Neil Shapiro of WPI. - Internal changes to make it easier to add another protocol family - (intended for IPv6). Patches are from John Kennedy of - CSU Chico. - In certain cases, 7->8 bit MIME decoding of Base64 text could leave - an extra space at the beginning of some lines. Problem - noted by Charles Karney of Princeton University; fix based - on a patch from Christophe Wolfhugel. - Portability: - Allow _PATH_VENDOR_CF to be set in Makefile for consistency - with the _Sendmail_ book, 2nd edition. Note that - the book is actually wrong: _PATH_SENDMAILCF should - be used instead. - AIX 3.x: Include <sys/select.h>. Patch from Gene Rackow - of Argonne National Laboratory. - OpenBSD from from Paul DuBois of the University of Wisconsin. - RISC/os 4.0 from Paul DuBois of the University of Wisconsin. - SunOS: Include <memory.h> to fix warning from util.c. From - James Aldridge of EUnet Ltd. - Solaris: Change STDIR (location of status file) to /etc/mail - in Makefiles. - Linux, Dynix, UNICOS: Remove -DNDBM and -lgdbm from - Makefiles. Use NEWDB on Linux instead. - NCR MP-RAS 3.x with STREAMware TCP/IP: SIOCGIFNUM ioctl - exists but behaves differently than other OSes. - Add SIOCGIFNUM_IS_BROKEN compile flag to get - around the problem. Problem noted by Tom Moore of - NCR Corp. - HP-UX 9.x: fix compile warnings for old select API. Problem - noted by Tom Smith of Digital Equipment Corp. - UnixWare 2.x: compile warnings on offsetof macro. Problem - noted by Tom Good of the Community Access Information - Resource Network - SCO 4.2: compile problems caused by a change in the type of - the "length" parameters passed to accept, getpeername, - getsockname, and getsockopt. Adds new compile flags - SOCKADDR_SIZE_T and SOCKOPT_SIZE_T. Problem reported - by Tom Good of St. Vincent's North Richmond Community - Mental Health Center Residential Services. - AIX 4: Use size_t for SOCKADDR_SIZE_T and SOCKOPT_SIZE_T. - Suggested by Brett Hogden of Rochester Gas & Electric - Corp. - Linux: avoid compile problem for versions of <setjmp.h> that - #define both setjmp and longjmp. Problem pointed out - by J.R. Oldroyd of TerraNet. - CONFIG: SCO UnixWare 2.1: Support for OSTYPE(sco-uw-2.1) - from Christopher Durham of SCO. - CONFIG: NEXTSTEP: define confCW_FILE to - /etc/sendmail/sendmail.cw to match the usual - configuration. Patch from Dennis Glatting of - PlainTalk. - CONFIG: MAILER(fax) called a program that hasn't existed for a long - time. Convert to use the HylaFAX 4.0 conventions. Suggested - by Harry Styron. - CONFIG: Improve sample anti-spam rulesets in cf/cf/knecht.mc. These - are the rulesets in use on sendmail.org. - MAKEMAP: give error on GDBM files. - MAIL.LOCAL: Make error messages a bit more explicit, for example, - telling more details on what actually changed when "file - changed after open". - CONTRIB: etrn.pl: Ignore comments in Fw files. Support multiple Fw - files. - CONTRIB: passwd-to-alias.pl: Handle 8 bit characters and '-'. - NEW FILES: - src/Makefiles/Makefile.OpenBSD - src/Makefiles/Makefile.RISCos.4_0 - test/t_exclopen.c - cf/ostype/sco-uw-2.1.m4 - DELETED FILES: - Makefile - -8.8.6/8.8.6 97/06/14 - ************************************************************* - * The extensive assistance of Gregory Neil Shapiro of WPI * - * in preparing this release is gratefully appreciated. * - * Sun Microsystems has also provided resources toward * - * continued sendmail development. * - ************************************************************* - SECURITY: A few systems allow an open with the O_EXCL|O_CREAT open - mode bits set to create a file that is a symbolic link that - points nowhere. This makes it possible to create a root - owned file in an arbitrary directory by inserting the symlink - into a writable directory after the initial lstat(2) check - determined that the file did not exist. The only verified - example of a system having these odd semantics for O_EXCL - and symbolic links was HP-UX prior to version 9.07. Most - systems do not have the problem, since a exclusive create - of a file disallows symbolic links. Systems that have been - verified to NOT have the problem include AIX 3.x, *BSD, - DEC OSF/1, HP-UX 9.07 and higher, Linux, SunOS, Solaris, - and Ultrix. This is a potential exposure on systems that - have this bug and which do not have a MAILER-DAEMON alias - pointing at a legitimate account, since this will cause old - mail to be dropped in /var/tmp/dead.letter. - SECURITY: Problems can occur on poorly managed systems, specifically, - if maps or alias files are in world writable directories. - If your system has alias maps in writable directories, it - is potentially possible for an attacker to replace the .db - (or .dir and .pag) files by symbolic links pointing at - another database; this can be used either to expose - information (e.g., by pointing an alias file at /etc/spwd.db - and probing for accounts), or as a denial-of-service attack - (by trashing the password database). The fix disallows - symbolic links entirely when rebuilding alias files or on - maps that are in writable directories, and always warns on - writable directories; 8.9 will probably consider writable - directories to be fatal errors. This does not represent an - exposure on systems that have alias files in unwritable - system directories. - SECURITY: disallow .forward or :include: files that are links (hard - or soft) if the parent directory (or any directory in the - path) is writable by anyone other than the owner. This is - similar to the previous case for user files. This change - should not affect most systems, but is necessary to prevent - an attacker who can write the directory from pointing such - files at other files that are readable only by the owner. - SECURITY: Tighten safechown rules: many systems will say that they - have a safe (restricted to root) chown even on files that - are mounted from another system that allows owners to give - away files. The new rules are very strict, trusting file - ownership only in those few cases where the system has - been verified to be at least as paranoid as necessary. - However, it is possible to relax the rules to partially - trust the ownership if the directory path is not world or - group writable. This might allow someone who has a legitimate - :include: file (referenced directly from /etc/aliases) to - become another non-root user if the :include: file is in a - non-writable directory on an NFS-mounted filesystem where - the local system says that giveaway is denied but it is - actually permitted. I believe this to be a very small set - of cases. If in doubt, do not point :include: aliases at - NFS-mounted filesystems. - SECURITY: When setting a numeric group id using the RunAsUser option - (e.g., "O RunAsUser=10:20", the group id would not be set. - Implicit group ids (e.g., "O RunAsUser=mailnull") or alpha - group ids (e.g., "O RunAsUser=mailuser:mailgrp") worked fine. - The user id was still set properly. Problem noted by Uli - Pralle of the Technical University of Berlin. - Save the initial gid set for use when checking for if the - PrivacyOptions=restrictmailq option is set. Problem reported - by Wolfgang Ley of DFN-CERT. - Make 55x reply codes to the SMTP DATA-"." be non-sticky (i.e., a - failure on one message won't affect future messages to the - same host). - IP source route printing had an "off by one" error that would - affect any options that came after the route option. Patch - from Theo de Raadt. - The "Message is too large" error didn't successfully bounce the error - back to the sender. Problem reported by Stephen More of - PSI; patch from Gregory Neil Shapiro of WPI. - Change SMTP status code 553 to map into Extended code 5.1.0 (instead - of 5.1.3); it apparently gets used in multiple ways. - Suggested by John Myers of Portola Communications. - Fix possible extra null byte generated during collection if errors - occur at the beginning of the stream. Patch contributed by - Andrey A. Chernov and Gregory Neil Shapiro. - Code changes to avoid possible reentrant call of malloc/free within - a signal handler. Problem noted by John Beck of Sun - Microsystems. - Move map initialization to be earlier so that check_relay ruleset - will have the latest version of the map data. Problem noted - by Paul Forgey of Metainfo; patch from Gregory Neil Shapiro. - If there are fatal errors during the collection phase (e.g., message - too large) don't send the bogus message. - Avoid "cannot open xfAAA00000" messages when sending to aliases that - have errors and have owner- aliases. Problem noted by Michael - Barber of MTU; fix from Gregory Neil Shapiro of WPI. - Avoid null pointer dereference on illegal Boundary= parameters in - multipart/mixed Content-Type: header. Problem noted by - Richard Muirden of RMIT University. - Always print error messages during newaliases (-bi) even if the - ErrorMode is not set to "print". Fix from Gregory Neil - Shapiro. - Test mode could core dump if you did a /map lookup in an optional map - that could not be opened. Based on a fix from John Beck of - Sun Microsystems. - If DNS is misconfigured so that the last MX record tried points to - a host that does not have an A record, but other MX records - pointed to something reasonable, don't bounce the message - with a "host unknown" error. Note that this should really - be fixed in the zone file for the domain. Problem noted by - Joe Rhett of Navigist, Inc. - If a map fails (e.g., DNS times out) on all recipient addresses, mark - the message as having been tried; otherwise the next queue - run will not realize that this is a second attempt and will - retry immediately. Problem noted by Bryan Costales of - Mercury Mail. - If the clock is set backwards, and a MinQueueAge is set, no jobs - will be run until the later setting of the clock is reached. - "Problem" (I use the term loosely) noted by Eric Hagberg of - Morgan Stanley. - If the load average rises above the cutoff threshold (above which - sendmail will not process the queue at all) during a queue - run, abort the queue run immediately. Problem noted by - Bryan Costales of Mercury Mail. - The variable queue processing algorithm (based on the message size, - number of recipients, message precedence, and job age) was - non-functional -- either the entire queue was processed or - none of the queue was processed. The updated algorithm - does no queue run if a single recipient zero size job will - not be run. - If there is a fatal ("panic") message that will cause sendmail to - die immediately, never hold the error message for future - printing. - Force ErrorMode=print in -bt mode so that all errors are printed - regardless of the setting of the ErrorMode option in the - configuration file. Patch from Gregory Neil Shapiro. - New compile flag HASSTRERROR says that this OS has the strerror(3) - routine available in one of the libraries. Use it in conf.h. - The -m (match only) flag now works on host class maps. - If class hash or btree maps are rebuilt, sendmail will now detect - this and reopen the map. Previously, they could give - erroneous results during a single message processing - (but would recover when the next message was received). - Don't delete zero length queue files when doing queue runs until the - files are at least ten minutes old. This avoids a potential - race condition: the creator creates the qf file, getting back - a file descriptor. The queue runner locks it and deletes it - because it is zero length. The creator then writes the - descriptor that is now for a disconnected file, and the - job goes away. Based on a suggestion by Bryan Costales. - When determining the "validated" host name ($_ macro), do a forward - (A) DNS lookup on the result of the PTR lookup and compare - results. If they differ or if the PTR lookup fails, tag the - address as "may be forged". - Log null connections (i.e., hosts that connect but do not do any - substantive activity on the connection before disconnecting; - "substantive" is defined to be MAIL, EXPN, VRFY, or ETRN. - Always permit "writes" to /dev/null regardless of the link count. - This is safe because /dev/null is special cased, and no open - or write is ever actually attempted. Patch from Villy Kruse - of TwinCom. - If a message cannot be sent because of a 552 (exceeded storage - allocation) response to the MAIL FROM:<>, and a SIZE= parameter - was given, don't return the body in the bounce, since there - is a very good chance that the message will double-bounce. - Fix possible line truncation if a quoted-printable had an =00 escape - in the body. Problem noted by Charles Karney of the Princeton - Plasma Physics Laboratory. - Notify flags (e.g., -NSUCCESS) were lost on user+detail addresses. - Problem noted by Kari Hurtta of the Finnish Meteorological - Institute. - The MaxDaemonChildren option wasn't applying to queue runs as - documented. Note that this increases the potential denial - of service problems with this option: an attacker can - connect many times, and thereby lock out queue runs as well - as incoming connections. If you use this option, you should - run the "sendmail -bd" and "sendmail -q30m" jobs separately - to avoid this attack. Failure to limit noted by Matthew - Dillon of BEST Internet Communications. - Always give a message in newaliases if alias files cannot be - opened instead of failing silently. Suggested by Gregory - Neil Shapiro. This change makes the code match the O'Reilly - book (2nd edition). - Some older versions of the resolver could return with h_errno == -1 - if no name server could be reached, causing mail to bounce - instead of queueing. Treat this like TRY_AGAIN. Fix from - John Beck of SunSoft. - If a :include: file is owned by a user that does not have an entry - in the passwd file, sendmail could dereference a null pointer. - Problem noted by Satish Mynam of Sun Microsystems. - Take precautions to make sure that the SMTP protocol cannot get out - of sync if (for example) an alias file cannot be opened. - Fix a possible race condition that can cause a SIGALRM to come in - immediately after a SIGHUP, causing the new sendmail to die. - Avoid possible hang on SVr3 systems when doing child reaping. Patch - from Villy Kruse of TwinCom. - Ignore improperly formatted SMTP reply codes. Previously these were - partially processed, which could cause confusing error - returns. - Fix possible bogus pointer dereference when doing ldapx map lookups - on some architectures. - Portability: - A/UX: from Jim Jagielski of NASA/GSFC. - glibc: SOCK_STREAM was changed from a #define to an enum, - thus breaking #ifdef SOCK_STREAM. Only option seems - to be to assume SOCK_STREAM if __GNU_LIBRARY__ is - defined. Problem reported by A Sun of the University - of Washington. - Solaris: use SIOCGIFNUM to get the number of interfaces on - the system rather than guessing at compile time. - Patch contributed by John Beck of Sun Microsystems. - Intel Paragon: from Wendy Lin of Purdue University. - GNU Hurd: from Miles Bader of the GNU project. - RISC/os 4.50 from Harlan Stenn of PFCS Corporation. - ISC Unix: wait never returns if SIGCLD signals are blocked. - Unfortunately releasing them opens a race condition, - but there appears to be no fix for this. Patch from - Gregory Neil Shapiro. - BIND 8.1 for IPv6 compatibility from John Kennedy. - Solaris: a bug in strcasecmp caused characters with the - high order bit set to apparently randomly match - letters -- for example, $| (0233) matches "i" and "I". - Problem noted by John Gregson of the University of - Cambridge. - IRIX 6.x: make Makefile.IRIX.6.2 apply to all 6.x. From - Kari Hurtta. - IRIX 6.x: Create Makefiles for systems that claim to be - IRIX64 but are 6.2 or higher (so use the regular - IRIX Makefile). - IRIX 6.x: Fix load average computation on 64 bit kernels. - Problem noted by Eric Hagberg of Morgan Stanley. - CONFIG: Some canonification was still done for UUCP-like addresses - even if FEATURE(nocanonify) was set. Problem pointed out by - Brian Candler. - CONFIG: In some cases UUCP mailers wouldn't properly recognize all - local names as local. Problem noted by Jeff Polk of BSDI; - fix provided by Gregory Neil Shapiro. - CONFIG: The "local:user" syntax entries in mailertables and other - "mailer:user" syntax locations returned an incorrect value - for the $h macro. Problem noted by Gregory Neil Shapiro. - CONFIG: Retain "+detail" information when forwarding mail to a - MAIL_HUB, LUSER_RELAY, or LOCAL_RELAY. Patch from Philip - Guenther of Gustavus Adolphus College. - CONFIG: Make sure user+detail works for FEATURE(virtusertable); - rules are the same as for aliasing. Based on a patch from - Gregory Neil Shapiro. - CONFIG: Break up parsing rules into several pieces; this should - have no functional change in this release, but makes it - possible to have better anti-spam rulesets in the future. - CONFIG: Disallow double dots in host names to avoid having the - HostStatusDirectory store status under the wrong name. - In some cases this can be used as a denial-of-service attack. - Problem noted by Ron Jarrell of Virginia Tech, patch from - Gregory Neil Shapiro. - CONFIG: Don't use F=m (multiple recipients per invocation) for - MAILER(procmail), but do pass F=Pn9 (include Return-Path:, - don't include From_, and convert to 8-bit). Suggestions - from Kimmo Suominen and Roderick Schertler. - CONFIG: Domains under $=M (specified with MASQUERADE_DOMAIN) where - being masqueraded as though FEATURE(masquerade_entire_domain) - was specified, even when it wasn't. - MAIL.LOCAL: Solaris 2.6 has snprintf. From John Beck of SunSoft. - MAIL.LOCAL: SECURITY: check to make sure that an attacker doesn't - "slip in" a symbolic link between the lstat(2) call and the - exclusive open. This is only a problem on System V derived - systems that allow an exclusive create on files that are - symbolic links pointing nowhere. - MAIL.LOCAL: If the final mailbox close() failed, the user id was - not reset back to root, which on some systems would cause - later mailboxes to fail. Also, any partial message would - not be truncated, which could result in repeated deliveries. - Problem noted by Bruce Evans via Peter Wemm (FreeBSD - developers). - MAKEMAP: Handle cases where O_EXLOCK is #defined to be 0. A similar - change to the sendmail map code was made in 8.8.3. Problem - noted by Gregory Neil Shapiro. - MAKEMAP: Give warnings on file problems such as map files that are - symbolic links; although makemap is not setuid root, it is - often run as root and hence has the potential for the same - sorts of problems as alias rebuilds. - MAKEMAP: Change compilation so that it will link properly on - NEXTSTEP. - CONTRIB: etrn.pl: search for Cw as well as Fw lines in sendmail.cf. - Accept an optional list of arguments following the server - name for the ETRN arguments to use (instead of $=w). Other - miscellaneous bug fixes. From Christian von Roques via - John Beck of Sun Microsystems. - CONTRIB: Add passwd-to-alias.pl, contributed by Kari Hurtta. This - Perl script converts GECOS information in the /etc/passwd - file into aliases, allowing for faster access to full name - lookups; it is also clever about adding aliases (to root) - for system accounts. - NEW FILES: - src/safefile.c - cf/ostype/gnuhurd.m4 - cf/ostype/irix6.m4 - contrib/passwd-to-alias.pl - src/Makefiles/Makefile.IRIX64.6.1 - src/Makefiles/Makefile.IRIX64.6.x - RENAMED FILES: - src/Makefiles/Makefile.IRIX.6.2 => Makefile.IRIX.6.x - src/Makefiles/Makefile.IRIX64 => Makefile.IRIX64.6.0 - -8.8.5/8.8.5 97/01/21 - SECURITY: Clear out group list during startup. Without this, sendmail - will continue to run with the group permissions of the caller, - even if RunAsUser is specified. - SECURITY: Make purgestat (-bH) be root-only. This is not in response - to any known attack, but it's best to be conservative. - Suggested by Peter Wemm of DIALix. - SECURITY: Fix buffer overrun problem in MIME code that has possible - security implications. Patch from Alex Garthwaite of the - University of Pennsylvania. - Use of a -f flag with a phrase attached (e.g., "-f 'Full Name <addr>'") - would truncate the address after "Full". Although the -f - syntax is incorrect (since it is in the envelope, it - shouldn't have comments and full names), the failure mode - was unnecessarily awful. - Fix a possible null pointer dereference when converting 8-bit data - to a 7-bit format. Problem noted by Jim Hutchins of - Sandia National Labs and David James of British Telecom. - Clear out stale state that affected F=9 on SMTP mailers in queue - runs. Although this really shouldn't be used (F=9 is for - final delivery only, and using it on an SMTP mailer makes - it possible for a message to be converted from 8->7->8->7 - bits several times), it shouldn't have failed with a syserr. - Problem noted by Eric Hagberg of Morgan Stanley. - _Really_ fix the multiple :maildrop code in the user database - module. Patch from Roy Mongiovi of Georgia Tech. - Let F lines in the configuration file actually read root-only - files if the configuration file is safe. Based on a - patch from Keith Reynolds of SCO. - ETRN followed by QUIT would hold the connection open until the queue - run completed. Problem noted by Truck Lewis of TDK - Semiconductor Corp. - It turns out that despite the documentation, the TCP wrappers library - does _not_ log rejected connections. Do the logging ourselves. - Problem noted by Fletcher Mattox of the University of Texas - at Austin. - If sendmail finds a qf file in its queue directory that is an unknown - version (e.g., when backing out to an old version), the - error is reported on every queue run. Change it to only - give the error once (and rename the qf => Qf). Patch from - William A. Gianopoulos of Raytheon Company. - Start a new session when doing background delivery; currently it - ignored signals but didn't start a new signal, that caused - some problems if a background process tried to send mail - under certain circumstances. Problem noted by Eric Hagberg - of Morgan Stanley; fix from Kari Hurtta. - Simplify test for skipping a queue run to just check if the current - load average is >= the queueing load average. Previously - the check factored in some other parameters that caused it - to essentially never skip the queue run. Patch from Bryan - Costales. - If the SMTP server is running in "nullserver" mode (that is, it is - rejecting all commands), start sleeping after MAXBADCOMMAND - (25) commands; this helps prevent a bad guy from putting - you into a tight loop as a denial-of-service attack. Based - on an e-mail conversation with Brad Knowles of AOL. - Slow down when too many "light weight" commands have been issued; - this helps prevent a class of denial-of-service attacks. - The current values and defaults are: - MAXNOOPCOMMANDS 20 NOOP, VERB, ONEX, XUSR - MAXHELOCOMMANDS 3 HELO, EHLO - MAXVRFYCOMMANDS 6 VRFY, EXPN - MAXETRNCOMMANDS 8 ETRN - These will probably be configurable in a future release. - On systems that have uid_t typedefed to be an unsigned short, programs - that had the F=S flag and no U= equate would be invoked with - the real uid set to 65535 rather than being left unchanged. - In some cases, NOTIFY=NEVER was not being honored. Problem noted - by Steve Hubert of the University of Washington, Seattle. - Mail that was Quoted-Printable encoded and had a soft line break on - the last line (i.e., an incomplete continuation) had the last - line dropped. Since this appears to be illegal it isn't - clear what to do with it, but flushing the last line seems - to be a better "fail soft" approach. Based on a patch from - Eric Hagberg. - If AllowBogusHELO and PrivacyOptions=needmailhelo are both set, a - bogus HELO command still causes the "Polite people say HELO - first" error message. Problem pointed out by Chris Thomas - of UCLA; patch from John Beck of SunSoft. - Handle "sendmail -bp -qSfoobar" properly if restrictqrun is set - in PrivacyOptions. The -q shouldn't turn this command off. - Problem noted by Murray Kucherawy of Pacific Bell Internet; - based on a patch from Gregory Neil Shapiro of WPI. - Don't consider SMTP reply codes 452 or 552 (exceeded storage allocation) - in a DATA transaction to be sticky; these can occur because - a message is too large, and smaller messages should still go - through. Problem noted by Matt Dillon of Best Internet - Communications. - In some cases bounces were saved in /var/tmp/dead.letter even if they - had been successfully delivered to the envelope sender. - Problem noted Eric Hagberg of Morgan Stanley; solution from - Gregory Neil Shapiro of WPI. - Give better diagnostics on long alias lines. Based on code contributed - by Patrick Gosling of the University of Cambridge. - Increase the number of virtual interfaces that will be probed for - alternate names. Problem noted by Amy Rich of Shore.Net. - PORTABILITY: - UXP/DS V20L10 for Fujitsu DS/90: Makefile patches from - Toshiaki Nomura of Fujitsu Limited. - SunOS with LDAP support: compile problems with struct timeval. - Patch from Nick Cuccia of TCSI Corporation. - SCO: from Keith Reynolds of SCO. - Solaris: kstat load average computation wasn't being used. - Fixes from Michael Ju. Tokarev of Telecom Service, JSC - (Moscow). - OpenBSD: from Jason Downs of teeny.org. - Altos System V: from Tim Rice. - Solaris 2.5: from Alan Perry of SunSoft. - Solaris 2.6: from John Beck of SunSoft. - Harris Nighthawk PowerUX (mh6000 box): from Bob Miorelli - of Pratt & Whitney <miorelli@pweh.com>. - CONFIG: It seems that I hadn't gotten the Received: line syntax - _just_right_ yet. Tweak it again. I'll omit the names - of the "contributors" (quantity two) in this one case. - As of now, NO MORE DISCUSSION about the syntax of the - Received: line. - CONFIG: Although FEATURE(nullclient) uses EXPOSED_USER (class $=E), - it never inserts that class into the output file. Fix it - so it will honor EXPOSED_USER but will _not_ include root - automatically in this class. Problem noted by Ronan KERYELL - of Centre de Recherche en Informatique de l'École Nationale - Supérieure des Mines de Paris (CRI-ENSMP). - CONFIG: Clean up handling of "local:" syntax in relay specifications - such as LUSER_RELAY. This change permits the following - syntaxes: ``local:'' will send to the same user on the - local machine (e.g., in a mailertable entry for "host", - ``local:'' will cause an address addressed to user@host to - go to user on the local machone). ``local:user'' will send - to the named user on the local machine. ``local:user@host'' - is equivalent to ``local:user'' (the host is ignored). In - all cases, the original user@host is passed in $@ (i.e., the - detail information). Inspired by a report from Michael Fuhr. - CONFIG: Strip quotes from the first word of an "error:" host - indication. This lets you set (for example) the LUSER_RELAY - to be ``error:\"5.1.1\" Your Message Here''. Note the use - of the \" so that the resulting string is properly quoted. - Problem noted by Gregory Neil Shapiro of WPI. - OP.ME: documentation was inconsistent about whether sendmail did a - NOOP or a RSET to probe the connection (it does a RSET). - Inconsistency noted by Deeran Peethamparam. - OP.ME: insert additional blank pages so it will print properly on - a duplex printer. From Matthew Black of Cal State University, - Long Beach. - -8.8.4/8.8.4 96/12/02 - SECURITY: under some circumstances, an attacker could get additional - permissions by hard linking to files that were group - writable by the attacker. The solution is to disallow any - files that have hard links -- this will affect .forward, - :include:, and output files. Problem noted by Terry - Kyriacopoulos of Interlog Internet Services. As a - workaround, set UnsafeGroupWrites -- always a good idea. - SECURITY: the TryNullMXList (w) option should not be safe -- if it - is, it is possible to do a denial-of-service attack on - MX hosts that rely on the use of the null MX list. There - is no danger if you have this option turned off (the default). - Problem noted by Dan Bernstein. Also, make the DontInitGroups - unsafe. I know of no specific attack against this, although - a denial-of-service attack is probably possible, but in theory - you should not be able to safely tweak anything that affects - the permissions that are used when mail is delivered. - Purgestat could go into an infinite loop if one of the host status - directories somehow became empty. Problem noted by Roy - Mongiovi of Georgia Tech. - Processes got "lost" when counting children due to a race condition. - This caused "proc_list_probe: lost pid" messages to be logged. - Problem noted by several people. - On systems with System V SIGCLD child signal semantics (notably AIX - and HP-UX), mail transactions would print the message "451 - SMTP-MAIL: lost child: No child processes". Problem noted - by several people. - Miscellaneous compiler warnings on picky compilers (or when setting - gcc to high warning levels). From Tom Moore of NCR Corp. - SMTP protocol errors, and most errors on MAIL FROM: lines should - not be persistent between runs, since they are based on the - message rather than the host. Problem noted by Matt Dillon - of Best Internet Communications. - The F=7 flag was ignored on SMTP mailers. Problem noted by Tom Moore - of NCR (a.k.a., AT&T Global Information Solutions). - Avoid the possibility of having a child daemon run to completion - (including closing the SMTP socket) before the parent has - had a chance to close the socket; this can cause the parent - to hang for a long time waiting for the socket to drain. - Patch from Don Lewis of TDK Semiconductor. - If the fork() failed in a queue run, the queue runners would not be - rescheduled (so queue runs would stop). Patch from Don Lewis. - Some error conditions in ETRN could cause output without an SMTP - status code. Problem noted by Don Lewis. - Multiple :maildrop addresses in the user database didn't work properly. - Patch from Roy Mongiovi of Georgia Tech. - Add ".db" automatically onto any user database spec that does not - already have it; this is for consistency with makemap, the - K line, and the documentation. Inconsistency pointed out - by Roy Mongiovi. - Allow sendmail to be properly called in nohup mode. Patch from - Kyle Jones of UUNET. - Change ETRN to ignore but still update host status files; previously - it would ignore them and not save the updated status, which - caused stale information to be maintained. Based on a patch - from Christopher Davis of Kapor Enterprises Inc. Also, have - ETRN ignore the MinQueueAge option. - Patch long term host status to recover more gracefully from an empty - host status file condition. Patch from NAKAMURA Motonori - of Kyoto University. - Several patches to signal handling code to fix potential race - conditions from Don Lewis. - Make it possible to compile with -DDAEMON=0 (previously it had some - compile errors). This turns DAEMON, QUEUE, and SMTP into - 0/1 compilation flags. Note that DAEMON is an obsolete - compile flag; use NETINET instead. Solution based on a - patch from Bryan Costales. - PORTABILITY FIXES: - AIX4: getpwnam() and getpwuid() do a sequential scan of the - /etc/security/passwd file when called as root. This - is very slow on some systems. To speed it up, use the - (undocumented) _getpw{nam,uid}_shadow() routines. - Patch from Chris Thomas of UCLA/OAC Systems Group. - SCO 5.x: include -lprot in the Makefile. Patch from Bill - Glicker of Burrelle's Information Service. - NEWS-OS 4.x: need a definition for MODE_T to compile. Patch - from Makoto MATSUSHITA of Osaka University. - SunOS 4.0.3: compile problems. Patches from Andrew Cole of - Leeds University and SASABE Tetsuro of the University - of Tokyo. - DG/UX 5.4.4.11 from Brian J. Murrell of InterLinx Support - Services, Inc. - Domain/OS from Don (Truck) Lewis of TDK Semiconductor Corp. - I believe this to have only been a problem if you - compiled with -DUSE_VENDOR_CF_PATH -- another reason - to stick with /etc/sendmail.cf as your One True Path. - Digital UNIX (OSF/1 on Alpha) load average computation from - Martin Laubach of the Technischen Universität Wien. - CONFIG: change default Received: line to be multiple lines rather - than one long one. By popular demand. - MAIL.LOCAL: warnings weren't being logged on some systems. Patch - from Jerome Berkman of U.C. Berkeley. - MAKEMAP: be sure to zero hinfo to avoid cruft that can cause runs - to take a very long time. Problem noted by Yoshiro YONEYA - of NTT Software Corporation. - CONTRIB: add etrn.pl, contributed by John Beck. - NEW FILES: - contrib/etrn.pl - -8.8.3/8.8.3 96/11/17 - SECURITY: it was possible to get a root shell by lying to sendmail - about argv[0] and then sending it a signal. Problem noted - by Leshka Zakharoff <leshka@leshka.chuvashia.su> on the - best-of-security list. - Log sendmail binary version number in "Warning: .cf version level - (%d) exceeds program functionality (%d) message" -- this - should make it clearer to people that they are running - the wrong binary. - Fix a problem that occurs when you open an SMTP connection and then - do one or more ETRN commands followed by a MAIL command; at - the end of the DATA phase sendmail would incorrectly report - "451 SMTP-MAIL: lost child: No child processes". Problem - noted by Eric Bishop of Virginia Tech. - When doing text-based host canonification (typically /etc/hosts - lookup), a null host name would match any /etc/hosts entry - with space at the end of the line. Problem noted by Steve - Hubert of the University of Washington, Seattle. - 7 to 8 bit BASE64 MIME conversions could duplicate bits of text. - Problem reported by Tom Smith of Digital Equipment Corp. - Increase the size of the DNS answer buffer -- the standard UDP packet - size PACKETSZ (512) is not sufficient for some nameserver - answers containing very many resource records. The resolver - may also switch to TCP and retry if it detects UDP packet - overflow. Also, allow for the fact that the resolver - routines res_query and res_search return the size of the - *un*truncated answer in case the supplied answer buffer it - not big enough to accommodate the entire answer. Patch from - Eric Wassenaar. - Improvements to MaxDaemonChildren code. If you think you have too - many children, probe the ones you have to verify that they - are still around. Suggested by Jared Mauch of CICnet, Inc. - Also, do this probe before growing the vector of children - pids; this previously caused the vector to grow indefinitely - due to a race condition. Problem reported by Kyle Jones of - UUNET. - On some architectures, <db.h> (from the Berkeley DB library) defines - O_EXLOCK to zero; this fools the map compilation code into - thinking that it can avoid race conditions by locking on open. - Change it to check for O_EXLOCK non-zero. Problem noted by - Leif Erlingsson of Data Lege. - Always call res_init() on startup (if compiled in, of course) to - allow the sendmail.cf file to tweak resolver flags; without - it, flag tweaks in ResolverOptions are ignored. Patch from - Andrew Sun of Merrill Lynch. - Improvements to host status printing code. Suggested by Steve Hubert - of the University of Washington, Seattle. - Change MinQueueAge option processing to do the check for the job age - when reading the queue file, rather than at the end; this - avoids parsing the addresses, which can do DNS lookups. - Problem noted by John Beck of InReference, Inc. - When MIME was being 7->8 bit decoded, "From " lines weren't being - properly escaped. Problem noted by Peter Nilsson of the - University of Linkoping. - In some cases, sendmail would retain root permissions during queue - runs even if RunAsUser was set. Problem noted by Mark - Thomas of Mark G. Thomas Consulting. - If the F=l flag was set on an SMTP mailer to indicate that it is - actually local delivery, and NOTIFY=SUCCESS is specified in - the envelope, and the receiving SMTP server speaks DSN, then - the DSN would be both generated locally and propagated to the - other end. - The U= mailer field didn't correctly extract the group id if the - user id was numeric. Problem noted by Kenneth Herron of - MCI Telecommunications Communications. - If a message exceeded the fixed maximum size on input, the body of - the message was included in the bounce. Note that this did - not occur if it exceeded the maximum _output_ size. Problem - reported by Kyle Jones of UUNET. - PORTABILITY FIXES: - AIX4: 4.1 doesn't have a working setreuid(2); change the - AIX4 defines to use seteuid(2) instead, which - works on 4.1 as well as 4.2. Problem noted by - Håkan Lindholm of interAF, Sweden. - AIX4: use tzname[] vector to determine time zone name. - Patch from NAKAMURA Motonori of Kyoto University. - MkLinux: add Makefile.Linux.ppc and OSTYPE(mklinux) support. - Contributed by Paul DuBois <dubois@primate.wisc.edu>. - Solaris: kstat(3k) support for retrieving the load average. - This adds the LA_KSTAT definition for LA_TYPE. - The outline of the implementation was contributed - by Michael Tokarev of Telecom Service, JSC, Moscow. - HP-UX 10.0 gripes about the (perfectly legal!) forward - declaration of struct rusage at the top of conf.h; - change it to only be included if you are using gcc, - which is apparently the only compiler that requires - it in the first place. Problem noted by Jeff - Earickson of Colby College. - IRIX: don't default to using gcc. IRIX is a civilized - operating system that comes with a decent compiler - by default. Problem noted by Barry Bouwsma and - Kari Hurtta. - CONFIG: specify F=9 as default in FEATURE(local_procmail) for - consistency with other local mailers. Inconsistency - pointed out by Teddy Hogeborn <teddy@fukt.hk-r.se>. - CONFIG: if the "limited best mx" feature is used (to reduce DNS - overhead) as part of the bestmx_is_local feature, the - domain part was dropped from the name. Patch from Steve - Hubert of the University of Washington, Seattle. - CONFIG: catch addresses of the form "user@.dom.ain"; these could - end up being translated to the null host name, which would - return any entry in /etc/hosts that had a space at the end - of the line. Problem noted by Steve Hubert of the - University of Washington, Seattle. - CONFIG: add OSTYPE(aix4). From Michael Sofka of Rensselaer - Polytechnic Institute. - MAKEMAP: tweak hash and btree parameters for better performance. - Patch from Matt Dillon of Best Internet Communications. - NEW FILES: - src/Makefiles/Makefile.Linux.ppc - cf/ostype/aix4.m4 - cf/ostype/mklinux.m4 - -8.8.2/8.8.2 96/10/18 - SECURITY: fix a botch in the 7-bit MIME patch; the previous patch - changed the code but didn't fix the problem. - PORTABILITY FIXES: - Solaris: Don't use the system getusershell(3); it can - apparently corrupt the heap in some circumstances. - Problem found by Ken Pizzini of Spry, Inc. - OP.ME: document several mailer flags that were accidentally omitted - from this document. These flags were F=d, F=j, F=R, and F=9. - CONFIG: no changes. - -8.8.1/8.8.1 96/10/17 - SECURITY: unset all environment variables that the resolver will - examine during queue runs and daemon mode. Problem noted - by Dan Bernstein of the University of Illinois at Chicago. - SECURITY: in some cases an illegal 7-bit MIME-encoded text/plain - message could overflow a buffer if it was converted back - to 8 bits. This caused core dumps and has the potential - for a remote attack. Problem first noted by Gregory Shapiro - of WPI. - Avoid duplicate deliveries of error messages on systems that don't - have flock(2) support. Patch from Motonori Nakamura of - Kyoto University. - Ignore null FallBackMX (V) options. If this option is null (as - opposed to undefined) it can cause "null signature" syserrs - on illegal host names. - If a Base64 encoded text/plain message has no trailing newline in - the encoded text, conversion back to 8 bits will drop the - final line. Problem noted by Pierre David. - If running with a RunAsUser, sendmail would give bogus "cannot - setuid" (or seteuid, or setreuid) messages on some systems. - Problem pointed out by Jordan Mendelson of Web Services, Inc. - Always print error messages in -bv mode -- previously, -bv would - be absolutely silent on errors if the error mode was sent - to (say) mail-back. Problem noted by Kyle Jones of UUNET. - If -qI/R/S is set (or the ETRN command is used), ignore all long - term host status. This is necessary because it is common - to do this when you know a host has just come back up. - Disallow duplicate HELO/EHLO commands as required by RFC 1651 section - 4.2. Excessive permissiveness noted by Lee Flight of the - University of Leicester. - If a service (such as NIS) is specified as the last entry in the - service switch, but that service is not compiled in, sendmail - would return a temporary failure when an entry was not found - in the map. This caused the message to be queued instead of - bouncing immediately. Problem noted by Harry Edmon of the - University of Washington. - PORTABILITY FIXES: - Solaris 2.3 had compilation problems in conf.c. Several - people pointed this out. - NetBSD from Charles Hannum of MIT. - AIX4 improvements based on info from Steve Bauer of South - Dakota School of Mines & Technology. - CONFIG: ``error:code message'' syntax was broken in virtusertable. - Patch from Gil Kloepfer Jr. - CONFIG: if FEATURE(nocanonify) was specified, hosts in $=M (set - using MASQUERADE_DOMAIN) were not masqueraded unless they - were also in $=w. Problem noted by Zoltan Basti of - Softec. - MAIL.LOCAL: patches to compile and link cleanly on AIX. Based - on a patch from Eric Hagberg of Morgan Stanley. - MAIL.LOCAL: patches to compile on NEXTSTEP. From Patrick Nolan - of Stanford via Robert La Ferla. - -8.8.0/8.8.0 96/09/26 - Under some circumstances, Bcc: headers would not be properly - deleted. Pointed out by Jonathan Kamens of OpenVision. - Log a warning if the sendmail daemon is invoked without a full - pathname, which prevents "kill -1" from working. I was - urged to put this in by Andrey A. Chernov of DEMOS (Russia). - Fix small buffer overflow. Since the data in this buffer was not - read externally, there was no security problem (and in fact - probably wouldn't really overflow on most compilers). Pointed - out by KIZU takashi of Osaka University. - Fix problem causing domain literals such as [1.2.3.4] to be ignored - if a FallbackMXHost was specified in the configuration file - -- all mail would be sent to the fallback even if the original - host was accessible. Pointed out by Munenari Hirayama of - NSC (Japan). - A message that didn't terminate with a newline would (sometimes) not - have the trailing "." added properly in the SMTP dialogue, - causing SMTP to hang. Patch from Per Hedeland of Ericsson. - The DaemonPortOptions suboption to bind to a particular address was - incorrect and nonfunctional due to a misunderstanding of the - semantics of binding on a passive socket. Patch from - NIIBE Yutaka of Mitsubishi Research Institute. - Increase the number of MX hosts for a single name to 100 to better - handle the truly huge service providers such as AOL, which - has 13 at the moment (and climbing). In order to avoid - trashing memory, the buffer for all names has only been - slightly increased in size, to 12.8K from 10.2K -- this means - that if a single name had 100 MX records, the average size - of those records could not exceed 128 bytes. Requested by - Brad Knowles of America On Line. - Restore use of IDENT returns where the OSTYPE field equals "OTHER". - Urged by Dan Bernstein of U.C. Berkeley. - Print q_statdate and q_specificity in address structure debugging - printout. - Expand MCI structure flag bits for debugging output. - Support IPv6-style domain literals, which can have colons between - square braces. - Log open file descriptors for the "cannot dup" messages in deliver(); - this is an attempt to track down a bug that one person seems - to be having (it may be a Solaris bug!). - DSN NOTIFY parameters were not properly propagated across queue runs; - this caused the NOTIFY info to sometimes be lost. Problem - pointed out by Claus Assmann of the - Christian-Albrechts-University of Kiel. - The statistics gathered in the sendmail.st file were too high; in - some cases failures (e.g., user unknown or temporary failure) - would count as a delivery as far as the statistics were - concerned. Problem noted by Tom Moore of AT&T GIS. - Systems that don't have flock() would not send split envelopes in - the initial run. Problem pointed out by Leonard Zubkoff of - Dandelion Digital. - Move buffer overflow checking -- these primarily involve distrusting - results that may come from NIS and DNS. - 4.4-BSD-derived systems, including FreeBSD, NetBSD, and BSD/OS didn't - include <paths.h> and hence had the wrong pathnames for a few - things like /var/tmp. Reported by Matthew Green. - Conditions were reversed for the Priority: header, resulting in all - values being interpreted as non-urgent except for non-urgent, - which was interpreted as normal. Patch from Bryan Costales. - The -o (optional) flag was being ignored on hash and btree maps - since 8.7.2. Fix from Bryan Costales. - Content-Types listed in class "q" will always be encoded as - Quoted-Printable (or more accurately, will never be encoded - as base64). The class can have primary types (e.g., "text") - or full types (e.g., "text/plain"). Based on a suggestion by - Marius Olafsson of the University of Iceland. - Define ${envid} to be the original envelope id (from the ESMTP DSN - dialogue) so it can be passed to programs in mailers. - Define ${bodytype} to be the body type (from the -B flag or the - BODY= ESMTP parameter) so it can be passed to programs in - mailers. - Cause the VRFY command to return 252 instead of 250 unless the F=q - flag is set in the mailer descriptor. Suggested by John - Myers of CMU. - Implement ESMTP ETRN command to flush the queue for a specific host. - The command takes a host name; data for that host is - immediately (and asynchronously) flushed. Because this shares - the -qR implementation, other hosts may be attempted, but - there should be no security implications. Implementation - from John Beck of InReference, Inc. See RFC 1985 for details. - Add three new command line flags to pass in DSN parameters: -V envid - (equivalent to ENVID=envid on the MAIL command), -R ret - (equivalent to RET=ret on the MAIL command), and -Nnotify - (equivalent to NOTIFY=notify on the RCPT command). Note - that the -N flag applies to all recipients; there is no way - to specify per-address notifications on the command line, - nor is there an equivalent for the ORCPT= per-address - parameter. - Restore LogLevel option to be safe (it can only be increased); - apparently I went into paranoid mode between 8.6 and 8.7 - and made it unsafe. Pointed out by Dabe Murphy of the - University of Maryland. - New logging on log level 15: all SMTP traffic. Patches from - Andrew Gross of San Diego Supercomputer Center. - NetInfo property value searching code wasn't stopping when it found - a match. This was causing the wrong values to be found (and - had a memory leak). Found by Bastian Schleuter of TU-Berlin. - Add new F=0 (zero) mailer flag to turn off MX lookups. It was pointed - out by Bill Wisner of Electronics for Imaging that you can't - use the bracket address form for the MAIL_HUB macro, since - that causes the brackets to remain in the envelope recipient - address used for delivery. The simple fix (stripping off the - brackets in the config file) breaks the use of IP literal - addresses. This flag will solve that problem. - Add MustQuoteChars option. This is a list of characters that must - be quoted if they are found in the phrase part of an address - (that is, the full name part). The characters @,;:\()[] are - always in this list and cannot be removed. The default is - this list plus . and ' to match RFC 822. - Add AllowBogusHELO option; if set, sendmail will allow HELO commands - that do not include a host name for back compatibility with - some stupid SMTP clients. Setting this violates RFC 1123 - section 5.2.5. - Add MaxDaemonChildren option; if this is set, sendmail will start - rejecting connections if it has more than this many - outstanding children accepting mail. Note that you may - see more processes than this because of outgoing mail; this - is for incoming connections only. - Add ConnectionRateThrottle option. If set to a positive value, the - number of incoming SMTP connections that will be permitted - in a single second is limited to this number. Connections are - not refused during this time, just deferred. The intent is to - flatten out demand so that load average limiting can kick in. - It is less radical than MaxDaemonChildren, which will stop - accepting connections even if all the connections are idle - (e.g., due to connection caching). - Add Timeout.hoststatus option. This interval (defaulting to 30m) - specifies how long cached information about the state of a - host will be kept before they are considered stale and the - host is retried. If you are using persistent host status - (i.e., the HostStatusDirectory option is set) this will apply - between runs; otherwise, it applies only within a single queue - run and hence is useful only for hosts that have large queues - that take a very long time to run. - Add SingleLineFromHeader option. If set, From: headers are coerced - into being a single line even if they had newlines in them - when read. This is to get around a botch in Lotus Notes. - Text class maps were totally broken -- if you ever retrieved the last - item in a table it would be truncated. Problem noted by - Gregory Neil Shapiro of WPI. - Extend the lines printed by the mailq command (== the -bp flag) when - -v is given to 120 characters; this allows more information - to be displayed. Suggested by Gregory Neil Shapiro of WPI. - Allow macro definitions (`D' lines) with unquoted commas; previously - this was treated as end-of-input. Problem noted by Bryan - Costales. - The RET= envelope parameter (used for DSNs) wasn't properly written - to the queue file. Fix from John Hughes of Atlantic - Technologies, Inc. - Close /var/tmp/dead.letter after a successful write -- otherwise - if this happens in a queue run it can cause nasty delays. - Problem noted by Mark Horton of AT&T. - If userdb entries pointed to userdb entries, and there were multiple - values for a given key, the database cursor would get - trashed by the recursive call. Problem noted by Roy Mongiovi - of Georgia Tech. Fixed by reading all the values and creating - a comma-separated list; thus, the -v output will be somewhat - different for this case. - Fix buffer allocation problem with Hesiod-based userdb maps when - HES_GETMAILHOST is defined. Based on a patch by Betty Lee - of Stanford University. - When envelopes were split due to aliases with owner- aliases, and - there was some error on one of the lists, more than one of - the owners would get the message. Problem pointed out by - Roy Mongiovi of Georgia Tech. - Detect excessive recursion in macro expansions, e.g., $X defined - in terms of $Y which is defined in terms of $X. Problem - noted by Bryan Costales; patch from Eric Wassenaar. - When using F=U to get "ugly UUCP" From_ lines, a buffer could in - some cases get trashed causing bogus From_ lines. Fix from - Kyle Jones of UUNET. - When doing load average initialization, if the nlist call for avenrun - failed, the second and subsequent lookups wouldn't notice - that fact causing bogus load averages to be returned. Noted - by Casper Dik of Sun Holland. - Fix problem with incompatibility with some versions of inet_aton that - have changed the return value to unsigned, so a check for an - error return of -1 doesn't work. Use INADDR_NONE instead. - This could cause mail to addresses such as [foo.com] to bounce - or get dropped. Problem noted by Christophe Wolfhugel of the - Pasteur Institute. - DSNs were inconsistent if a failure occurred during the DATA phase - rather than the RCPT phase: the Action: would be correct, but - the detailed status information would be wrong. Problem noted - by Bob Snyder of General Electric Company. - Add -U command line flag and the XUSR ESMTP extension, both indicating - that this is the initial MUA->MTA submission. The flag current - does nothing, but in future releases (when MUAs start using - these flags) it will probably turn on things like DNS - canonification. - Default end-of-line string (E= specification on mailer [M] lines) - to \r\n on SMTP mailers. Default remains \n on non-SMTP - mailers. - Change the internal definition for the *file* and *include* mailers - to have $u in the argument vectors so that they aren't - misinterpreted as SMTP mailers and thus use \r\n line - termination. This will affect anyone who has redefined - either of these in their configuration file. - Don't assume that IDENT servers close the connection after a query; - responses can be newline terminated. From Terry Kennedy of - St. Peter's College. - Avoid core dumps on erroneous configuration files that have - $#mailer with nothing following. From Bryan Costales. - Avoid null pointer dereference with high debug values in unlockqueue. - Fix from Randy Martin of Clemson University. - Fix possible buffer overrun when expanding very large macros. Fix - from Kyle Jones of UUNET. - After 25 EXPN or VRFY commands, start pausing for a second before - processing each one. This avoids a certain form of denial - of service attack. Potential attack pointed out by Bryan - Costales. - Allow new named (not numbered!) config file rules to do validity - checking on SMTP arguments: check_mail for MAIL commands and - check_rcpt for RCPT commands. These rulesets can do anything - they want; their result is ignored unless they resolve to the - $#error mailer, in which case the indicated message is printed - and the command is rejected. Similarly, the check_compat - ruleset is called before delivery with "from_addr $| to_addr" - (the $| is a meta-symbol used to separate the two addresses); - it can give a "this sender can't send to this recipient" - notification. Note that this patch allows $| to stand alone - in rulesets. - Define new macros ${client_name}, ${client_addr}, and ${client_port} - that have the name, IP address, and port number (respectively) - of the SMTP client (that is, the entity at the other end of - the connection. These can be used in (e.g.) check_rcpt to - verify that someone isn't trying to relay mail through your - host inappropriately. Be sure to use the deferred evaluation - form, for example $&{client_name}, to avoid having these bound - when sendmail reads the configuration file. - Add new config file rule check_relay to check the incoming connection - information. Like check_compat, it is passed the host name - and host address separated by $| and can reject connections - on that basis. - Allow IDA-style recursive function calls. Code contributed by Mark - Lovell and Paul Vixie. - Eliminate the "No ! in UUCP From address!" message" -- instead, create - a virtual UUCP address using either a domain address or the $k - macro. Based on code contributed by Mark Lovell and Paul - Vixie. - Add Stanford LDAP map. Requires special libraries that are not - included with sendmail. Contributed by Booker C. Bense - <bbense@networking.stanford.edu>; contact him for support. - See also the src/READ_ME file. - Allow -dANSI to turn on ANSI escape sequences in debug output; this - puts metasymbols (e.g., $+) in reverse video. Really useful - only for debugging deep bits of code where it is important to - distinguish between the single-character metasymbol $+ and the - two characters $, +. - Changed ruleset 89 (executed in dumpstate()) to a named ruleset, - debug_dumpstate. - Add new UnsafeGroupWrites option; if set, .forward and :include: - files that are group writable are considered "unsafe" -- that - is, programs and files referenced from such files are not - valid recipients. - Delete bogosity test for FallBackMX host; this prevented it to be a - name that was not in DNS or was a domain-literal. Problem - noted by Tom May. - Change the introduction to error messages to more clearly delineate - permanent from temporary failures; if both existed in a - single message it could be confusing. Suggested by John - Beck of InReference, Inc. - The IngoreDot (i) option didn't work for lines that were terminated - with CRLF. Problem noted by Ted Stockwell of Secure - Computing Corporation. - Add a heuristic to improve the handling of unbalanced `<' signs in - message headers. Problem reported by Matt Dillon of Best - Internet Communications. - Check for bogus characters in the 0200-0237 range; since these are - used internally, very strange errors can occur if those - characters appear in headers. Problem noted by Anders Gertz - of Lysator. - Implement 7 -> 8 bit MIME conversions. This only takes place if the - recipient mailer has the F=9 flag set, and only works on - text/plain body types. Code contributed by Marius Olafsson - of the University of Iceland. - Special case "postmaster" name so that it is always treated as lower - case in alias files regardless of configuration settings; - this prevents some potential problems where "Postmaster" or - "POSTMASTER" might not match "postmaster". In most cases - this change is a no-op. - The -o map flag was ignored for text maps. Problem noted by Bryan - Costales. - The -a map flag was ignored for dequote maps. Problem noted by - Bryan Costales. - Fix core dump when a lookup of a class "prog" map returns no - response. Patch from Bryan Costales. - Log instances where sendmail is deferring or rejecting connections - on LogLevel 14. Suggested by Kyle Jones of UUNET. - Include port number in process title for network daemons. Suggested - by Kyle Jones of UUNET. - Send ``double bounces'' (errors that occur when sending an error - message) to the address indicated in the DoubleBounceAddress - option (default: postmaster). Previously they were always - sent to postmaster. Suggested by Kyle Jones of UUNET. - Add new mode, -bD, that acts like -bd in all respects except that - it runs in foreground. This is useful for using with a - wrapper that "watches" system services. Suggested by Kyle - Jones of UUNET. - Fix botch in spacing around (parenthesized) comments in addresses - when the comment comes before the address. Patch from - Motonori Nakamura of Kyoto University. - Use the prefix "Postmaster notify" on the Subject: lines of messages - that are being bounced to postmaster, rather than "Returned - mail". This permits the person who is postmaster more - easily determine what messages are to their role as - postmaster versus bounces to mail they actually sent. Based - on a suggestion by Motonori Nakamura. - Add new value "time" for QueueSortOrder option; this causes the queue - to be sorted strictly by the time of submission. Note that - this can cause very bad behavior over slow lines (because - large jobs will tend to delay small jobs) and on nodes with - heavy traffic (because old things in the queue for hosts that - are down delay processing of new jobs). Also, this does not - guarantee that jobs will be delivered in submission order - unless you also set DeliveryMode=queue. In general, it should - probably only be used on the command line, and only in - conjunction with -qRhost.domain. In fact, there are very few - cases where it should be used at all. Based on an - implementation by Motonori Nakamura. - If a map lookup in ruleset 5 returns tempfail, queue the message in - the same manner as other rulesets. Previously a temporary - failure in ruleset 5 was ignored. Patch from Booker Bense - of Stanford University. - Don't proceed to the next MX host if an SMTP MAIL command returns a - 5yz (permanent failure) code. The next MX host will still be - tried if the connection cannot be opened in the first place - or if the MAIL command returns a 4yz (temporary failure) code. - (It's hard to know what to do here, since neither RFC 974 nor - RFC 1123 specify when to proceed to the next MX host.) - Suggested by Jonathan Kamens of OpenVision, Inc. - Add new "-t" flag for map definitions (the "K" line in the .cf file). - This causes map lookups that get a temporary failure (e.g., - name server failure) to _not_ defer the delivery of the - message. This should only be used if your configuration file - is prepared to do something sensible in this case. Based on - an idea by Gregory Shapiro of WPI. - Fix problem finding network interface addresses. Patch from - Motonori Nakamura. - Don't reject qf entries that are not owned by your effective uid if - you are not running setuid; this makes management of certain - kinds of firewall setups difficult. Patch suggested by - Eamonn Coleman of Qualcomm. - Add persistent host status. This keeps the information normally - maintained within a single queue run in disk files that are - shared between sendmail instances. The HostStatusDirectory - is the directory in which the information is maintained. If - not set, persistent host status is turned off. If not a full - pathname, it is relative to the queue directory. A common - value is ".hoststat". - There are also two new operation modes: - * -bh prints the status of hosts that have had recent - connections. - * -bH purges the host statuses. No attempt is made to save - recent status information. - This feature was originally written by Paul Vixie of Vixie - Enterprises for KJS and adapted for V8 by Mark Lovell of - Bigrock Consulting. Paul's funding of Mark and Mark's patience - with my insistence that things fit cleanly into the V8 - framework is gratefully appreciated. - New SingleThreadDelivery option (requires HostStatusDirectory to - operate). Avoids letting two sendmails on the local machine - open connections to the same remote host at the same time. - This reduces load on the other machine, but can cause mail to - be delayed (for example, if one sendmail is delivering a huge - message, other sendmails won't be able to send even small - messages). Also, it requires another file descriptor (for the - lock file) per connection, so you may have to reduce - ConnectionCacheSize to avoid running out of per-process - file descriptors. Based on the persistent host status code - contributed by Paul Vixie and Mark Lovell. - Allow sending to non-simple files (e.g., /dev/null) even if the - SafeFileEnvironment option is set. Problem noted by Bryan - Costales. - The -qR flag mistakenly matched flags in the "R" line of the queue - file. Problem noted by Bryan Costales. - If a job was aborted using the interrupt signal (e.g., control-C from - the keyboard), on some occasions an empty df file would be - left around; these would collect in the queue directory. - Problem noted by Bryan Costales. - Change the makesendmail script to enhance the search for Makefiles - based on release number. For example, on SunOS 5.5.1, it will - search for Makefile.SunOS.5.5.1, Makefile.SunOS.5.5, and then - Makefile.SunOS.5.x (in addition to the other rules, e.g., - adding $arch). Problem noted by Jason Mastaler of Atlanta - Webmasters. - When creating maps using "newaliases", always map the keys to lower - case when creating the map unless the -f flag is specified on - the map itself. Previously this was done based on the F=u - flag in the local mailer, which meant you could create aliases - that you could never access. Problem noted by Bob Wu of DEC. - When a job was read from the queue, the bits causing notification on - failure or delay were always set. This caused those - notifications to be sent even if NOTIFY=NEVER had been - specified. Problem noted by Steve Hubert of the University - of Washington, Seattle. - Add new configurable routine validate_connection (in conf.c). This - lets you decide if you are willing to accept traffic from - this host. If it returns FALSE, all SMTP commands will return - "550 Access denied". -DTCPWRAPPERS will include support for - TCP wrappers; you will need to add -lwrap to the link line. - (See src/READ_ME for details.) - Don't include the "THIS IS A WARNING MESSAGE ONLY" banner on postmaster - bounces. Some people seemed to think that this could be - confusing (even though it is true). Suggested by Motonori - Nakamura. - Add new RunAsUser option; this causes sendmail to do a setuid to that - user early in processing to avoid potential security problems. - However, this means that all .forward and :include: files must - be readable by that user, and all files to be written must be - writable by that user and all programs will be executed by that - user. It is also incompatible with the SafeFileEnvironment - option. In other words, it may not actually add much to - security. However, it should be useful on firewalls and other - places where users don't have accounts and the aliases file is - well constrained. - Add Timeout.iconnect. This is like Timeout.connect except it is used - only on the first attempt to delivery to an address. It could - be set to be lower than Timeout.connect on the principle that - the mail should go through quickly to responsive hosts; less - responsive hosts get to wait for the next queue run. - Fix a problem on Solaris that occasionally causes programs - (such as vacation) to hang with their standard input connected - to a UDP port. It also created some signal handling problems. - The problems turned out to be an interaction between vfork(2) - and some of the libraries, particularly NIS/NIS+. I am - indebted to Tor Egge <tegge@idt.ntnu.no> for this fix. - Change user class map to do the same matching that actual delivery - will do instead of just a /etc/passwd lookup. This adds - fuzzy matching to the user map. Patch from Dan Oscarsson. - The Timeout.* options are not safe -- they can be used to create a - denial-of-service attack. Problem noted by Christophe - Wolfhugel. - Don't send PostmasterCopy messages in the event of a "delayed" - notification. Suggested by Barry Bouwsma. - Don't advertise "VERB" ESMTP extension if the "noexpn" privacy - option is set, since this disables VERB mode. Suggested - by John Hawkinson of MIT. - Complain if the QueueDirectory (Q) option is not set. Problem noted - by Motonori Nakamura of Kyoto University. - Only queue messages on transient .forward open failures if there - were no successful opens. The previous behavior caused it - to queue even if a "fall back" .forward was found. Problem - noted by Ann-Kian Yeo of the Dept. of Information Systems - and Computer Science (DISCS), NUS, Singapore. - Don't do 8->7 bit conversions when bouncing a MIME message that - is bouncing because of a MIME error during 8->7 bit conversion; - the encapsulated message will bounce again, causing a loop. - Problem noted by Steve Hubert of the University of Washington. - Create xf (transcript) files using the TempFileMode option value - instead of 0644. Suggested by Ann-Kian Yeo of the - National University of Singapore. - Print errors if setgid/setuid/etc. fail during delivery. This helps - detect cases where DefaultUid is set to something that the - system can't cope with. - PORTABILITY FIXES: - Support for AIX/RS 2.2.1 from Mark Whetzel of Western - Atlas International. - Patches for Intel Paragon OSF/1 1.3 from Leo Bicknell - <bicknell@ufp.org>. - On DEC OSF/1 3.2 and earlier, the MatchGECOS code would only - work on the first recipient of a message due to a - bug in the getpwent family. If this is something you - use, you can define DEC_OSF_BROKEN_GETPWENT=1 for a - workaround. From Maximum Entropy of Sanford C. - Bernstein and Associates. - FreeBSD 1.1.5.1 uname -r returns a string containing - parentheses, which breaks makesendmail. Reported - by Piero Serini <piero@strider.ibenet.it>. - Sequent DYNIX/ptx 4.0.2 patches from Jack Woolley of - Systems and Computer Technology Corporation. - Solaris 2.x: omit the UUCP grade parameter (-g flag) because - it is system-dependent. Problem noted by J.J. Bailey - of Bailey Computer Consulting. - Pyramid NILE running DC/OSx support from Earle F. Ake of - Hassler Communication Systems Technology, Inc. - HP-UX 10.x compile glitches, reported by Anne Brink of the - U.S. Army and James Byrne of Harte & Lyne Limited. - NetBSD from Matthew Green of the NetBSD crew. - SCO 5.x from Keith Reynolds of SCO. - IRIX 6.2 from Robert Tarrall of the University of - Colorado and Kari Hurtta of the Finnish Meteorological - Institute. - UXP/DS (Fujitsu/ICL DS/90 series) support from Diego R. - Lopez, CICA (Seville). - NCR SVR4 MP-RAS 3.x support from Tom Moore of NCR. - PTX 3.2.0 from Kenneth Stailey of the US Department of Labor - Employment Standards Administration. - Altos System V (5.3.1) from Tim Rice of Multitalents. - Concurrent Systems Corporation Maxion from Donald R. Laster - Jr. - NetInfo maps (improved debugging and multi-valued aliases) - from Adrian Steinmann of Steinmann Consulting. - ConvexOS 11.5 (including SecureWare C2 and the Share Scheduler) - from Eric Schnoebelen of Convex. - Linux 2.0 mail.local patches from Horst von Brand. - NEXTSTEP 3.x compilation from Robert La Ferla. - NEXTSTEP 3.x code changes from Allan J. Nathanson of NeXT. - Solaris 2.5 configuration fixes for mail.local by Jim Davis - of the University of Arizona. - Solaris 2.5 has a working setreuid. Noted by David Linn of - Vanderbilt University. - Solaris changes for praliases, makemap, mailstats, and smrsh. - Previously you had to add -DSOLARIS in Makefile.dist; - this auto-detects. Based on a patch from Randall - Winchester of the University of Maryland. - CONFIG: add generic-nextstep3.3.mc file. Contributed by - Robert La Ferla of Hot Software. - CONFIG: allow mailertables to resolve to ``error:code message'' - (where "code" is an exit status) on domains (previously - worked only on hosts). Patch from Cor Bosman of Xs4all - Foundation. - CONFIG: hooks for IPv6-style domain literals. - CONFIG: predefine ALIAS_FILE and change the prototype file so that - if it is undefined the AliasFile option is never set; this - should be transparent for most everyone. Suggested by John - Myers of CMU. - CONFIG: add FEATURE(limited_masquerade). Without this feature, any - domain listed in $=w is masqueraded. With it, only those - domains listed in a MASQUERADE_DOMAIN macro are masqueraded. - CONFIG: add FEATURE(masquerade_entire_domain). This causes - masquerading specified by MASQUERADE_DOMAIN to apply to all - hosts under those domains as well as the domain headers - themselves. For example, if a configuration had - MASQUERADE_DOMAIN(foo.com), then without this feature only - foo.com would be masqueraded; with it, *.foo.com would be - masqueraded as well. Based on an implementation by Richard - (Pug) Bainter of U. Texas. - CONFIG: add FEATURE(genericstable) to do a more general rewriting of - outgoing addresses. Defaults to ``hash -o /etc/genericstable''. - Keys are user names; values are outgoing mail addresses. Yes, - this does overlap with the user database, and figuring out - just when to use which one may be tricky. Based on code - contributed by Richard (Pug) Bainter of U. Texas with updates - from Per Hedeland of Ericsson. - CONFIG: add FEATURE(virtusertable) to do generalized rewriting of - incoming addresses. Defaults to ``hash -o /etc/virtusertable''. - Keys are either fully qualified addresses or just the host - part (with the @ sign). For example, a table containing: - info@foo.com foo-info - info@bar.com bar-info - @baz.org jane@elsewhere.net - would send all mail destined for info@foo.com to foo-info - (which is presumably an alias), mail addressed to info@bar.com - to bar-info, and anything addressed to anyone at baz.org will - be sent to jane@elsewhere.net. The names foo.com, bar.com, - and baz.org must all be in $=w. Based on discussions with - a great many people. - CONFIG: add nullclient configurations to define SMTP_MAILER_FLAGS. - Suggested by Richard Bainter. - CONFIG: add FAX_MAILER_ARGS to tweak the arguments passed to the - "fax" mailer. - CONFIG: allow mailertable entries to resolve to local:user; this - passes the original user@host in to procmail-style local - mailers as the "detail" information to allow them to do - additional clever processing. From Joe Pruett of - Teleport Corporation. Delivery to the original user can - be done by specifying "local:" (with nothing after the colon). - CONFIG: allow any context that takes "mailer:domain" to also take - "mailer:user@domain" to force mailing to the given user; - "local:user" can also be used to do local delivery. This - applies on *_RELAY and in the mailertable entries. Based - on a suggestion by Ribert Kiessling of Easynet. - CONFIG: Allow FEATURE(bestmx_is_local) to take an argument that - limits the possible domains; this reduces the number of DNS - lookups required to support this feature. For example, - FEATURE(bestmx_is_local, my.site.com) limits the lookups - to domains under my.site.com. Code contributed by Anthony - Thyssen <anthony@cit.gu.edu.au>. - CONFIG: LOCAL_RULESETS introduces any locally defined rulesets, - such as the check_rcpt ruleset. Suggested by Gregory Shapiro - of WPI. - CONFIG: MAILER_DEFINITIONS introduces any mailer definitions, in the - event you have to define local mailers. Suggested by - Gregory Shapiro of WPI. - CONFIG: fix cases where a three- (or more-) stage route-addr could - be misinterpreted as a list:...; syntax. Based on a patch by - Vlado Potisk <Vlado_Potisk@tempest.sk>. - CONFIG: Fix masquerading of UUCP addresses when the UUCP relay is - remotely connected. The address host!user was being - converted to host!user@thishost instead of host!user@uurelay. - Problem noted by William Gianopoulos of Raytheon Company. - CONFIG: add confTO_ICONNECT to set Timeout.iconnect. - CONFIG: change FEATURE(redirect) message from "User not local" to - "User has moved"; the former wording was confusing if the - new address is still on the local host. Based on a suggestion - by Andreas Luik. - CONFIG: add support in FEATURE(nullclient) for $=E (exposed users). - However, the class is not pre-initialized to contain root. - Suggested by Gregory Neil Shapiro. - CONTRIB: Remove XLA code at the request of the author, Christophe - Wolfhugel. - CONTRIB: Add re-mqueue.pl, contributed by Paul Pomes of Qualcomm. - MAIL.LOCAL: make it possible to compile mail.local on Solaris. Note - well: this produces a slightly different mailbox format (no - Content-Length: headers), file ownerships and modes are - different (not owned by group mail; mode 600 instead of 660), - and the local mailer flags will have to be tweaked (make them - match bsd4.4) in order to use this mailer. Patches from Paul - Hammann of the Missouri Research and Education Network. - MAIL.LOCAL: in some cases it could return EX_OK even though there - was a delivery error, such as if the ownership on the file - was wrong or the mode changed between the initial stat and - the open. Problem reported by William Colburn of the New - Mexico Institute of Mining and Technology. - MAILSTATS: handle zero length files more reliably. Patch from Bryan - Costales. - MAILSTATS: add man page contributed by Keith Bostic of BSDI. - MAKEMAP: The -d flag (to allow duplicate keys) to a btree map wasn't - honored. Fix from Michael Scott Shappe. - PRALIASES: add man page contributed by Keith Bostic of BSDI. - NEW FILES: - src/Makefiles/Makefile.AIX.2 - src/Makefiles/Makefile.IRIX.6.2 - src/Makefiles/Makefile.maxion - src/Makefiles/Makefile.NCR.MP-RAS.3.x - src/Makefiles/Makefile.SCO.5.x - src/Makefiles/Makefile.UXPDSV20 - mailstats/mailstats.8 - praliases/praliases.8 - cf/cf/generic-nextstep3.3.mc - cf/feature/genericstable.m4 - cf/feature/limited_masquerade.m4 - cf/feature/masquerade_entire_domain.m4 - cf/feature/virtusertable.m4 - cf/ostype/aix2.m4 - cf/ostype/altos.m4 - cf/ostype/maxion.m4 - cf/ostype/solaris2.ml.m4 - cf/ostype/uxpds.m4 - contrib/re-mqueue.pl - DELETED FILES: - src/Makefiles/Makefile.Solaris - contrib/xla/README - contrib/xla/xla.c - RENAMED FILES: - src/Makefiles/Makefile.NCR3000 => Makefile.NCR.MP-RAS.2.x - src/Makefiles/Makefile.SCO.3.2v4.2 => Makefile.SCO.4.2 - src/Makefiles/Makefile.UXPDS => Makefile.UXPDSV10 - src/Makefiles/Makefile.NeXT => Makefile.NeXT.2.x - src/Makefiles/Makefile.NEXTSTEP => Makefile.NeXT.3.x - -8.7.6/8.7.3 96/09/17 - SECURITY: It is possible to force getpwuid to fail when writing the - queue file, causing sendmail to fall back to running programs - as the default user. This is not exploitable from off-site. - Workarounds include using a unique user for the DefaultUser - (old u & g options) and using smrsh as the local shell. - SECURITY: fix some buffer overruns; in at least one case this allows - a local user to get root. This is not known to be exploitable - from off-site. The workaround is to disable chfn(1) commands. - -8.7.5/8.7.3 96/03/04 - Fix glitch in 8.7.4 when putting certain internal lines; this can - in some case cause connections to hang or messages to have - extra spaces in odd places. Patch from Eric Wassenaar; - reports from Eric Hall of Chiron Corporation, Stephen - Hansen of Stanford University, Dean Gaudet of HotWired, - and others. - -8.7.4/8.7.3 96/02/18 - SECURITY: In some cases it was still possible for an attacker to - insert newlines into a queue file, thus allowing access to - any user (except root). - CONFIG: no changes -- it is not a bug that the configuration - version number is unchanged. - -8.7.3/8.7.3 95/12/03 - Fix botch in name server timeout in RCPT code; this problem caused - two responses in SMTP, which breaks things horribly. Fix - from Gregory Neil Shapiro of WPI. - Verify that L= value on M lines cannot be negative, which could cause - negative array subscripting. Not a security problem since - this has to be in the config file, but it could have caused - core dumps. Pointed out by Bryan Costales. - Fix -d21 debug output for long macro names. Pointed out by Bryan - Costales. - PORTABILITY FIXES: - SCO doesn't have ftruncate. From Bill Aten of Computerizers. - IBM's version of arpa/nameser.h defaults to the wrong byte - order. Tweak it to work properly. Based on fixes - from Fletcher Mattox of UTexas and Betty Lee of - Stanford University. - CONFIG: add confHOSTS_FILE m4 variable to set HostsFile option. - Deficiency pointed out by Bryan Costales of ICSI. - -8.7.2/8.7.2 95/11/19 - REALLY fix the backslash escapes in SmtpGreetingMessage, - OperatorChars, and UnixFromLine options. They were not - properly repaired in 8.7.1. - Completely delete the Bcc: header if and only if there are other - valid recipient headers (To:, Cc: or Apparently-To:, the - last being a historic botch, of course). If Bcc: is the - only recipient header in the message, its value is tossed, - but the header name is kept. The old behavior (always keep - the header name and toss the value) allowed primary recipients - to see that a Bcc: went to _someone_. - Include queue id on ``Authentication-Warning: <host>: <user> set - sender to <address> using -f'' syslog messages. Suggested - by Kari Hurtta. - If a sequence or switch map lookup entry gets a tempfail but then - continues on to another map type, but the name is not found, - return a temporary failure from the sequence or switch map. - For example, if hosts search ``dns files'' and DNS fails - with a tempfail, the hosts map will go on and search files, - but if it fails the whole thing should be a tempfail, not - a permanent (host unknown) failure, even though that is the - failure in the hosts.files map. This error caused hard - bounces when it should have requeued. - Aliases to files such as /users/bar/foo/inbox, with /users/bar/foo - owned by bar mode 700 and inbox being setuid bar stopped - working properly due to excessive paranoia. Pointed out by - John Hawkinson of Panix. - An SMTP RCPT command referencing a host that gave a nameserver - timeout would return a 451 command (8.6 accepted it and - queued it locally). Revert to the 8.6 behavior in order - to simplify queue management for clustered systems. Suggested - by Gregory Neil Shapiro of WPI. The same problem could break - MH, which assumes that the SMTP session will succeed (tsk, tsk - -- mail gets lost!); this was pointed out by Stuart Pook of - Infobiogen. - Fix possible buffer overflow in munchstring(). This was not a security - problem because you couldn't specify any argument to this - without first giving up root privileges, but it is still a - good idea to avoid future problems. Problem noted by John - Hawkinson and Sam Hartman of MIT. - ``452 Out of disk space for temp file'' messages weren't being - printed. Fix from David Perlin of Nanosoft. - Don't advertise the ESMTP DSN extension if the SendMimeErrors option - is not set, since this is required to get the actual DSNs - created. Problem pointed out by John Gardiner Myers of CMU. - Log permission problems that cause .forward and :include: files to - be untrusted or ignored on log level 12 and higher. Suggested - by Randy Martin of Clemson University. - Allow user ids in U= clauses of M lines to have hyphens and - underscores. - Fix overcounting of recipients -- only happened when sending to an - alias. Pointed out by Mark Andrews of SGI and Jack Woolley - of Systems and Computer Technology Corporation. - If a message is sent to an address that fails, the error message that - is returned could show some extraneous "success" information - included even if the user did not request success notification, - which was confusing. Pointed out by Allan Johannesen of WPI. - Config files that had no AliasFile definition were defaulting to - using /etc/aliases; this caused problems with nullclient - configurations. Change it back to the 8.6 semantics of - having no local alias file unless it is declared. Problem - noted by Charles Karney of Princeton University. - Fix compile problem if NOTUNIX is defined. Pointed out by Bryan - Costales of ICSI. - Map lookups of class "userdb" maps were always case sensitive; they - should be controlled by the -f flag like other maps. Pointed - out by Bjart Kvarme <bjart.kvarme@usit.uio.no>. - Fix problem that caused some addresses to be passed through ruleset 5 - even when they were tagged as "sticky" by prefixing the - address with an "@". Patch from Thomas Dwyer III of Michigan - Technological University. - When converting a message to Quoted-Printable, prevent any lines with - dots alone on a line by themselves. This is because of the - preponderance of broken mailers that still get this wrong. - Code contributed by Per Hedeland of Ericsson. - Fix F{macro}/file construct -- it previously did nothing. Pointed - out by Bjart Kvarme of USIT/UiO (Norway). - Announce whether a cached connection is SMTP or ESMTP (in -v mode). - Requested by Allan Johannesen. - Delete check for text format of alias files -- it should be legal - to have the database format of the alias files without the - text version. Problem pointed out by Joe Rhett of Navigist, - Inc. - If "Ot" was specified with no value, the TZ variable was not properly - imported from the environment. Pointed out by Frank Crawford - <frank@ansto.gov.au>. - Some architectures core dumped on "program" maps that didn't have - extra arguments. Patch from Booker C. Bense of Stanford - University. - Queue run processes would re-spawn daemons when given a SIGHUP; only - the parent should do this. Fix from Brian Coan of the - Association for Progressive Communications. - If MinQueueAge was set and a message was considered but not run - during a queue run and the Timeout.queuereturn interval was - reached, a "timed out" error message would be returned that - didn't include the failed address (and claimed to be a warning - even though it was fatal). The fix is to not return such - messages until they are actually tried, i.e., in the next - MinQueueAge interval. Problem noted by Rein Tollevik of - SINTEF RUNIT, Oslo. - Add HES_GETMAILHOST compile flag to support MIT Hesiod distributions - that have the hes_getmailhost() routine. DEC Hesiod - distributions do not have this routine. Based on a patch - from Betty Lee of Stanford University. - Extensive cleanups to map open code to handle a locking race condition - in ndbm, hash, and btree format database files on some (most - non-4.4-BSD based) OS architectures. This should solve the - occasional "user unknown" problem during alias rebuilds that - has plagued me for quite some time. Based on a patch from - Thomas Dwyer III of Michigan Technological University. - PORTABILITY FIXES: - Solaris: Change location of newaliases and mailq from - /usr/ucb to /usr/bin to match Sun settings. From - James B. Davis of TCI. - DomainOS: Makefile.DomainOS doesn't require -ldbm. From - Don Lewis of Silicon Systems. - HP-UX 10: rename Makefile.HP-UX.10 => Makefile.HP-UX.10.x - so that the makesendmail script will find it. Pointed - out by Richard Allen of the University of Iceland. - Also, use -Aa -D_HPUX_SOURCE instead of -Ae, which - isn't supported on all compilers. - UXPDS: compilation fixes from Diego R. Lopez. - CONFIG: FAX mailer wasn't setting .FAX as a pseudo-domain unless - you also had a FAX_RELAY. From Thomas.Tornblom@Hax.SE. - CONFIG: Minor glitch in S21 -- attachment of local domain name - didn't have trailing dot. From Jim Hickstein of Teradyne. - CONFIG: Fix best_mx_is_local feature to allow nested addresses such as - user%host@thishost. From Claude Scarpelli of Infobiogen - (France). - CONFIG: OSTYPE(hpux10) failed to define the location of the help file. - Pointed out by Hannu Martikka of Nokia Telecommunications. - CONFIG: Diagnose some inappropriate ordering in configuration files, - such as FEATURE(smrsh) listed after MAILER(local). Based on - a bug report submitted by Paul Hoffman of Proper Publishing. - CONFIG: Make OSTYPE files consistently not override settings that - have already been set. Previously it worked differently - for different files. - CONFIG: Change relay mailer to do masquerading like 8.6 did. My take - is that this is wrong, but the change was causing problems - for some people. From Per Hedeland of Ericsson. - CONTRIB: bitdomain.c patch from John Gardiner Myers <jgm+@CMU.EDU>; - portability changes for Posix environments (no functional - changes). - -8.7.1/8.7.1 95/10/01 - Old macros that have become options (SmtpGreetingMessage, - OperatorChars, and UnixFromLine) didn't allow backslash - escapes in the options, where they previously had. Bug - pointed out by John Hawkinson of MIT. - Fix strange case of an executable called by a program map that - returns a value but also a non-zero exit status; this - would give contradictory results in the higher level; in - particular, the default clause in the map lookup would be - ignored. Change to ignore the value if the program returns - non-zero exit status. From Tom Moore of AT&T GIS. - Shorten parameters passed to syslog() in some contexts to avoid a - bug in many vendors' implementations of that routine. Although - this isn't really a bug in sendmail per se, and my solution - has to assume that syslog() has at least a 1K buffer size - internally (I know some vendors have shortened this - dramatically -- they're on their own), sendmail is a popular - target. Also, limit the size of %s arguments in sprintf. - These both have possible security implications. Solutions - suggested by Casper Dik of Sun's Network Security Group - (Holland), Mark Seiden, and others. - Fix a problem that might cause a non-standard -B (body type) - parameter to be passed to the next server with undefined - results. This could have security implications. - If a filesystem was at > 100% utilization, the freediskspace() - routine incorrectly returned an error rather than zero. - Problem noted by G. Paul Ziemba of Alantec. - Change MX sort order so that local hostnames (those in $=w) always - sort first within a given preference. This forces the bestmx - map to always return the local host first, if it is included - in the list of highest priority MX records. From K. Robert - Elz. - Avoid some possible null pointer dereferences. Fixes from Randy - Martin <WOLF@CLEMSON.EDU> - When sendmail starts up on systems that have no fully qualified - domain name (FQDN) anywhere in the first matching host map - (e.g., /etc/hosts if the hosts service searches "files dns"), - sendmail would sleep to try to find a FQDN, which it really - really needs. This has been changed to fall through to the - next map type if it can't find a FQDN -- i.e., if the hosts - file doesn't have a FQDN, it will try dns even though the - short name was found in /etc/hosts. This is probably a crock, - but many people have hosts files without FQDNs. Remember: - domain names are your friends. - Log a high-priority message if you can't find your FQDN during startup. - Suggested by Simon Barnes of Schlumberger Limited. - When using Hesiod, initialize it early to improve error reporting. - Patch from Don Lewis of Silicon Systems, Inc. - Apparently at least some versions of Linux have a 90 !minute! TCP - connection timeout in the kernel. Add a new "connect" timeout - to limit this time. Defaults to zero (use whatever the - kernel provides). Based on code contributed by J.R. Oldroyd - of TerraNet. - Under some circumstances, a failed message would not be properly - removed from the queue, causing tons of bogus error messages. - (This fix eliminates the problematic EF_KEEPQUEUE flag.) - Problem noted by Allan E Johannesen and Gregory Neil Shapiro - of WPI. - PORTABILITY FIXES: - On IRIX 5.x, there was an inconsistency in the setting - of sendmail.st location. Change the Makefile to - install it in /var/sendmail.st to match the OSTYPE - file and SGI standards. From Andre - <andre@curry.zfe.siemens.de>. - Support for Fujitsu/ICL UXP/DS (For the DS/90 Series) - from Diego R. Lopez <drlopez@cica.es>. - Linux compilation patches from J.R. Oldroyd of TerraNet, Inc. - LUNA 2 Mach patches from Motonori Nakamura. - SunOS Makefile was including -ldbm, which is for the old - dbm library. The ndbm library is part of libc. - CONFIG: avoid bouncing ``user@host.'' (note trailing dot) with - ``local configuration error'' in nullclient configuration. - Patch from Gregory Neil Shapiro of WPI. - CONFIG: don't allow an alias file in nullclient configurations -- - since all addresses are relayed, they give errors during - rebuild. Suggested by Per Hedeland of Ericsson. - CONFIG: local mailer on Solaris 2 should always get a -f flag because - otherwise the F=S causes the From_ line to imply that root is - the sender. Problem pointed out by Claude Scarpelli of - Infobiogen (France). - NEW FILES: - cf/feature/use_ct_file.m4 (omitted from 8.7 by mistake) - src/Makefiles/Makefile.KSR (omitted from 8.7 by mistake) - src/Makefiles/Makefile.UXPDS - -8.7/8.7 95/09/16 - Fix a problem that could cause sendmail to run out of file - descriptors due to a trashed data structure after a - vfork. Fix from Brian Coan of the Institute for - Global Communications. - Change the VRFY response if you have disabled VRFY -- some - people seemed to think that it was too rude. - Avoid reference to uninitialized file descriptor if HASFLOCK - was not defined. This was used "safely" in the sense - that it only did a stat, but it would have set the - map modification time improperly. Problem pointed out - by Roy Mongiovi of Georgia Tech. - Clean up the Subject: line on warning messages and return - receipts so that they don't say "Returned mail:"; this - can be confusing. - Move ruleset entry/exit debugging from 21.2 to 21.1 -- this is - useful enough to make it worthwhile printing on "-d". - Avoid logging alias statistics every time you read the alias - file on systems with no database method compiled in. - If you have a name with a trailing dot, and you try looking it - up using gethostbyname without the dot (for /etc/hosts - compatibility), be sure to turn off RES_DEFNAMES and - RES_DNSRCH to avoid finding the wrong name accidentally. - Problem noted by Charles Amos of the University of - Maryland. - Don't do timeouts in collect if you are not running SMTP. - There is nothing that says you can't have a long - running program piped into sendmail (possibly via - /bin/mail, which just execs sendmail). Problem reported - by Don "Truck" Lewis of Silicon Systems. - Try gethostbyname() even if the DNS lookup fails iff option I - is not set. This allows you to have hosts listed in - NIS or /etc/hosts that are not known to DNS. It's normally - a bad idea, but can be useful on firewall machines. This - should really be broken out on a separate flag, I suppose. - Avoid compile warnings against BIND 4.9.3, which uses function - prototypes. From Don Lewis of Silicon Systems. - Avoid possible incorrect diagnosis of DNS-related errors caused - by things like attempts to resolve uucp names using - $[ ... $] -- the fix is to clear h_errno at appropriate - times. From Kyle Jones of UUNET. - SECURITY: avoid denial-of-service attacks possible by destroying - the alias database file by setting resource limits low. - This involves adding two new compile-time options: - HASSETRLIMIT (indicating that setrlimit(2) support is - available) and HASULIMIT (indicating that ulimit(2) support - is available -- the Release 3 form is used). The former - is assumed on BSD-based systems, the latter on System - V-based systems. Attack noted by Phil Brandenberger of - Swarthmore University. - New syntaxes in test (-bt) mode: - ``.Dmvalue'' will define macro "m" to "value". - ``.Ccvalue'' will add "value" to class "c". - ``=Sruleset'' will dump the contents of the indicated - ruleset. - ``=M'' will display the known mailers. - ``-ddebug-spec'' is equivalent to the command-line - -d debug flag. - ``$m'' will print the value of macro $m. - ``$=c'' will print the contents of class $=c. - ``/mx host'' returns the MX records for ``host''. - ``/parse address'' will parse address, returning the value of - crackaddr (essentially, the comment information) - and the parsed address. - ``/try mailer address'' will rewrite address into the form - it will have when presented to the indicated mailer. - ``/tryflags flags'' will set flags used by parsing. The - flags can be `H' for header or `E' for envelope, - and `S' for sender or `R' for recipient. These - can be combined, so `HR' sets flags for header - recipients. - ``/canon hostname'' will try to canonify hostname and - return the result. - ``/map mapname key'' will look up `key' in the indicated - `mapname' and return the result. - Somewhat better handling of UNIX-domain socket addresses -- it - should show the pathname rather than hex bytes. - Restore ``-ba'' mode -- this reads a file from stdin and parses - the header for envelope sender information and uses - CR-LF as message terminators. It was thought to be - obsolete (used only for Arpanet NCP protocols), but it - turns out that the UK ``Grey Book'' protocols require - that functionality. - Fix a fix in previous release -- if gethostname and gethostbyname - return a name without dots, and if an attempt to canonify - that name fails, wait one minute and try again. This can - result in an extra 60 second delay on startup if your system - hostname (as returned by hostname(1)) has no dot and no names - listed in /etc/hosts or your NIS map have a dot. - Check for proper domain name on HELO and EHLO commands per - RFC 1123 section 5.2.5. Problem noted by Thomas Dwyer III - of Michigan Technological University. - Relax chownsafe rules slightly -- old version said that if you - can't tell if _POSIX_CHOWN_RESTRICTED is set (that is, - if fpathconf returned EINVAL or ENOSYS), assume that - chown is not safe. The new version falls back to whether - you are on a BSD system or not. This is important for - SunOS, which apparently always returns one of those - error codes. This impacts whether you can mail to files - or not. - Syntax errors such as unbalanced parentheses in the configuration - file could be omitted if you had "Oem" prior to the - syntax error in the config file. Change to always print - the error message. It was especially weird because it - would cause a "warning" message to be sent to the Postmaster - for every message sent (but with no transcript). Problem - noted by Gregory Paris of Motorola. - Rewrite collect and putbody to handle full 8-bit data, including - zero bytes. These changes are internally extensive, but - should have minimal impact on external function. - Allow full words for option names -- if the option letter is - (apparently) a space, then take the word following -- e.g., - O MatchGECOS=TRUE - The full list of old and new names is as follows: - 7 SevenBitInput - 8 EightBitMode - A AliasFile - a AliasWait - B BlankSub - b MinFreeBlocks/MaxMessageSize - C CheckpointInterval - c HoldExpensive - D AutoRebuildAliases - d DeliveryMode - E ErrorHeader - e ErrorMode - f SaveFromLine - F TempFileMode - G MatchGECOS - H HelpFile - h MaxHopCount - i IgnoreDots - I ResolverOptions - J ForwardPath - j SendMimeErrors - k ConnectionCacheSize - K ConnectionCacheTimeout - L LogLevel - l UseErrorsTo - m MeToo - n CheckAliases - O DaemonPortOptions - o OldStyleHeaders - P PostmasterCopy - p PrivacyOptions - Q QueueDirectory - q QueueFactor - R DontPruneRoutes - r, T Timeout - S StatusFile - s SuperSafe - t TimeZoneSpec - u DefaultUser - U UserDatabaseSpec - V FallbackMXHost - v Verbose - w TryNullMXList - x QueueLA - X RefuseLA - Y ForkEachJob - y RecipientFactor - z ClassFactor - Z RetryFactor - The old macros that passed information into sendmail have - been changed to options; those correspondences are: - $e SmtpGreetingMessage - $l UnixFromLine - $o OperatorChars - $q (deleted -- not necessary) - To avoid possible problems with an older sendmail, - configuration level 6 is accepted by this version of - sendmail; any config file using the new names should - specify "V6" in the configuration. - Change address parsing to properly note that a phrase before a - colon and a trailing semicolon are essentially the same - as text outside of angle brackets (i.e., sendmail should - treat them as comments). This is to handle the - ``group name: addr1, addr2, ..., addrN;'' syntax (it will - assume that ``group name:'' is a comment on the first - address and the ``;'' is a comment on the last address). - This requires config file support to get right. It does - understand that :: is NOT this syntax, and can be turned - off completely by setting the ColonOkInAddresses option. - Level 6 config files added with new mailer flags: - A Addresses are aliasable. - i Do udb rewriting on envelope as well as header - sender lines. Applies to the from address mailer - flags rather than the recipient mailer flags. - j Do udb rewriting on header recipient addresses. - Applies to the sender mailer flags rather than the - recipient mailer flags. - k Disable check for loops when doing HELO command. - o Always run as the mail recipient, even on local - delivery. - w Check for an /etc/passwd entry for this user. - 5 Pass addresses through ruleset 5. - : Check for :include: on this address. - | Check for |program on this address. - / Check for /file on this address. - @ Look up sender header addresses in the user - database. Applies to the mailer flags for the - mailer corresponding to the envelope sender - address, rather than to recipient mailer flags. - Pre-level 6 configuration files set A, w, 5, :, |, /, and @ - on the "local" mailer, the o flag on the "prog" and "*file*" - mailers, and the ColonOkInAddresses option. - Eight-to-seven bit MIME conversions. This borrows ideas from - John Beck of Hewlett-Packard, who generously contributed - their implementation to me, which I then didn't use (see - mime.c for an explanation of why). This adds the - EightBitMode option (a.k.a. `8') and an F=8 mailer flag - to control handling of 8-bit data. These have to cope with - two types of 8-bit data: unlabelled 8-bit data (that is, - 8-bit data that is entered without declaring it as 8-bit - MIME -- technically this is illegal according to the - specs) and labelled 8-bit data (that is, it was declared - as 8BITMIME in the ESMTP session or by using the - -B8BITMIME command line flag). If the F=8 mailer flag is - set then 8-bit data is sent to non-8BITMIME machines - instead of converting to 7 bit (essentially using - just-send-8 semantics). The values for EightBitMode are: - m convert unlabelled 8-bit input to 8BITMIME, and do - any necessary conversion of 8BITMIME to 7BIT - (essentially, the full MIME option). - p pass unlabelled 8-bit input, but convert labelled - 8BITMIME input to 7BIT as required (default). - s strict adherence: reject unlabelled 8-bit input, - convert 8BITMIME to 7BIT as required. The F=8 - flag is ignored. - Unlabelled 8-bit data is rejected in mode `s' regardless of - the setting of F=8. - Add new internal class 'n', which is the set of MIME Content-Types - which can not be 8 to 7 bit encoded because of other - considerations. Types "multipart/*" and "message/*" are - never directly encoded (although their components can be). - Add new internal class 's', which is the set of subtypes of the - MIME message/* content type that can be treated as though - they are an RFC822 message. It is predefined to have - "rfc822". Suggested By Kari Hurtta. - Add new internal class 'e'. This is the set of MIME - Content-Transfer-Encodings that can be converted to - a seven bit format (Quoted-Printable or Base64). It is - preinitialized to contain "7bit", "8bit", and "binary". - Add C=charset mailer parameter and the the DefaultCharSet option (no - short name) to set the default character set to use in the - Content-Type: header when doing encoding of an 8-bit message - which isn't marked as MIME into MIME format. If the C= - parameter is set on the Envelope From address, use that as - the default encoding; else use the DefaultCharSet option. - If neither is set, it defaults to "unknown-8bit" as - suggested by RFC 1428 section 3. - Allow ``U=user:group'' field in mailer definition to set a default - user and group that a mailer will be executed as. This - overrides the 'u' and 'g' options, and if the `F=S' flag is - also set, it is the uid/gid that will always be used (that - is, the controlling address is ignored). The values may be - numeric or symbolic; if only a symbolic user is given (no - group) that user's default group in the passwd file is used - as the group. Based on code donated by Chip Rosenthal of - Unicom. - Allow `u' option to also accept user:group as a value, in the same - fashion as the U= mailer option. - Add the symbolic time zone name in the Arpanet format dates (as - a comment). This adds a new compile-time configuration - flag: TZ_TYPE can be set to TZ_TM_NAME (use the value - of (struct tm *)->tm_name), TZ_TM_ZONE (use the value - of (struct tm *)->tm_zone), TZ_TZNAME (use extern char - *tzname[(struct tm *)->tm_isdst]), TZ_TIMEZONE (use - timezone()), or TZ_NONE (don't include the comment). Code - from Chip Rosenthal. - The "Timeout" option (formerly "r") is extended to allow suboptions. - For example, - O Timeout.helo = 2m - There are also two new suboptions "queuereturn" and - "queuewarn"; these subsume the old T option. Thus, to - set them both the preferred new syntax is - O Timeout.queuereturn = 5d - O Timeout.queuewarn = 4h - Sort queue by host name instead of by message priority if the - QueueSortOrder option (no short name) is set is set to - ``host''. This makes better use of the connection cache, - but may delay more ``interactive'' messages behind large - backlogs under some circumstances. This is probably a - good option if you have high speed links or don't do lots - of ``batch'' messages, but less good if you are using - something like PPP on a 14.4 modem. Based on code - contributed by Roy Mongiovi of Georgia Tech (my main - contribution was to make it configurable). - Save i-number of df file in qf file to simplify rebuilding of queue - after disastrous disk crash. Suggested by Kyle Jones of - UUNET; closely based on code from KJS DECWRL code written - by Paul Vixie. NOTA BENE: The qf files produced by 8.7 - are NOT back compatible with 8.6 -- that is, you can convert - from 8.6 to 8.7, but not the other direction. - Add ``F=d'' mailer flag to disable all use of angle brackets in - route-addrs in envelopes; this is because in some cases - they can be sent to the shell, which interprets them as - I/O redirection. - Don't include error file (option E) with return-receipts; this - can be confusing. - Don't send "Warning: cannot send" messages to owner-* or - *-request addresses. Suggested by Christophe Wolfhugel - of the Institut Pasteur, Paris. - Allow -O command line flag to set long form options. - Add "MinQueueAge" option to set the minimum time between attempts - to run the queue. For example, if the queue interval - (-q value) is five minutes, but the minimum queue age - is fifteen minutes, jobs won't be tried more often than - once every fifteen minutes. This can be used to give - you more responsiveness if your delivery mode is set to - queue-only. - Allow "fileopen" timeout (default: 60 seconds) for opening - :include: and .forward files. - Add "-k", "-v", and "-z" flags to map definitions; these set the - key field name, the value field name, and the field - delimiter. The field delimiter can be a single character - or the sequence "\t" or "\n" for tab or newline. - These are for use by NIS+ and similar access methods. - Change maps to always strip quotes before lookups; the -q flag - turns off this behavior. Suggested by Motonori Nakamura. - Add "nisplus" map class. Takes -k and -v flags to choose the - key and value field names respectively. Code donated by - Sun Microsystems. - Add "hesiod" map class. The "file name" is used as the - "HesiodNameType" parameter to hes_resolve(3). Returns the - first value found for the match. Code donated by Scott - Hutton of Indiana University. - Add "netinfo" (NeXT NetInfo) map class. Maps can have a -k flag to - specify the name of the property that is searched as the - key and a -v flag to specify the name of the property that - is returned as the value (defaults to "members"). The - default map is "/aliases". Some code based on code - contributed by Robert La Ferla of Hot Software. - Add "text" map class. This does slow, linear searches through - text files. The -z flag specifies a column delimiter - (defaults to any sequence of white space), the -k flag - sets the key column number, and the -v flag sets the - value column number. Lines beginning with `#' are treated - as comments. - Add "program" map class to execute arbitrary programs. The search - key is presented as the last argument; the output is one - line read from the programs standard output. Exit statuses - are from sysexits.h. - Add "sequence" map class -- searches maps in sequence until it - finds a match. For example, the declarations: - Kmap1 ... - Kmap2 ... - Kmapseq sequence map1 map2 - defines a map "mapseq" that first searches map1; if the - value is found it is returned immediately, otherwise - map2 is searched and the value returned. - Add "switch" map class. This is much like "sequence" except that - the ordering is fetched from an external file, usually - the system service switch. The parameter is the name of - the service to switch on, and the maps that it will use - are the name of the switch map followed by ".service_type". - For example, if the declaration of the map is - Ksample switch hosts - and the system service switch specifies that hosts are - looked up using dns and nis in that order, then this is - equivalent to - Ksample sequence sample.dns sample.nis - The subordinate maps (sample.*) must already be defined. - Add "user" map class -- looks up users using getpwnam. Takes a - "-v field" flag on the definition that tells what passwd - entry to return -- legal values are name, passwd, uid, gid, - gecos, dir, and shell. Generally expected to be used with - the -m (matchonly) flag. - Add "bestmx" map class -- returns the best MX value for the host - listed as the value. If there are several "best" MX records - for this host, one will be chosen at random. - Add "userdb" map class -- looks up entries in the user database. - The "file name" is actually the tag that will be used, - typically "mailname". If there are multiple entries - matching the name, the one chosen is undefined. - Add multiple queue timeouts (both return and warning). These are - set by the Precedence: or Priority: header fields to one of - three values. If a Priority: is set and has value "normal", - "urgent", or "non-urgent" the corresponding timeouts are - used. If no priority is set, the Precedence: is consulted; - if negative, non-urgent timeouts are used; if greater than - zero, urgent timeouts are used. Otherwise, normal timeouts - are used. The timeouts are set by setting the six timeouts - queue{warn,return}.{urgent,normal,non-urgent}. - Fix problem when a mail address is resolved to a $#error mailer - with a temporary failure indication; it works in SMTP, - but when delivering locally the mail is silently discarded. - This patch, from Kyle Jones of UUNET, bounces it instead - of queueing it (queueing is very hard). - When using /etc/hosts or NIS-style lookups, don't assume that - the first name in the list is the best one -- instead, - search for the first one with a dot. For example, if - an /etc/hosts entry reads - 128.32.149.68 mammoth mammoth.CS.Berkeley.EDU - this change will use the second name as the canonical - machine name instead of the initial, unqualified name. - Change dequote map to replace spaces in quoted text with a value - indicated by the -s flag on the dequote map definition. - For example, ``Mdequote dequote -s_'' will change - "Foo Bar" into an unquoted Foo_Bar instead of leaving it - quoted (because of the space character). Suggested by Dan - Oscarsson for use in X.400 addresses. - Implement long macro names as ${name}; long class names can - be similarly referenced as $={name} and $~{name}. - Definitions are (e.g.) ``D{name}value''. Names that have - a leading lower case letter or punctuation characters are - reserved for internal use by sendmail; i.e., config files - should use names that begin with a capital letter. Based - on code contributed by Dan Oscarsson. - Fix core dump if getgrgid returns a null group list (as opposed - to an empty group list, that is, a pointer to a list - with no members). Fix from Andrew Chang of Sun Microsystems. - Fix possible core dump if malloc fails -- if the malloc in xalloc - failed, it called syserr which called newstr which called - xalloc.... The newstr is now avoided for "panic" messages. - Reported by Stuart Kemp of James Cook University. - Improve connection cache timeouts; previously, they were not even - checked if you were delivering to anything other than an - IPC-connected host, so a series of (say) local mail - deliveries could cause cached connections to be open - much longer than the specified timeout. - If an incoming message exceeds the maximum message size, stop - writing the incoming bytes to the queue data file, since - this can fill your mqueue partition -- this is a possible - denial-of-service attack. - Don't reject all numeric local user names unless HESIOD is - defined. It turns out that Posix allows all-numeric - user names. Fix from Tony Sanders of BSDI. - Add service switch support. If the local OS has a service - switch (e.g., /etc/nsswitch.conf on Solaris or /etc/svc.conf - on DEC systems) that will be used; otherwise, it falls back - to using a local mechanism based on the ServiceSwitchFile - option (default: /etc/service.switch). For example, if the - service switch lists "files" and "nis" for the aliases - service, that will be the default lookup order. the "files" - ("local" on DEC) service type expands to any alias files - you listed in the configuration file, even if they aren't - actually file lookups. - Option I (NameServerOptions) no longer sets the "UseNameServer" - variable which tells whether or not DNS should be considered - canonical. This is now determined based on whether or not - "dns" is in the service list for "hosts". - Add preliminary support for the ESMTP "DSN" extension (Delivery - Status Notifications). DSN notifications override - Return-Receipt-To: headers, which are bogus anyhow -- - support for them has been removed. - Add T=mts-name-type/address-type/diagnostic-type keyletter to mailer - definitions to define the types used in DSN returns for - MTA names, addresses, and diagnostics respectively. - Extend heuristic to force running in ESMTP mode to look for the - five-character string "ESMTP" anywhere in the 220 greeting - message (not just the second line). This is to provide - better compatibility with other ESMTP servers. - Print sequence number of job when running the queue so you can - easily see how much progress you have made. Suggested - by Peter Wemm of DIALix. - Map newlines to spaces in logged message-ids; some versions of - syslog truncate the rest of the line after newlines. - Suggested by Fletcher Mattox of U. Texas. - Move up forking for job runs so that if a message is split into - multiple envelopes you don't get "fork storms" -- this - also improves the connection cache utilization. - Accept "<<>>", "<<<>>>", and so forth as equivalent to "<>" for - the purposes of refusing to send error returns. Suggested - by Motonori Nakamura of Ritsumeikan University. - Relax rules on when a file can be written when referenced from - the aliases file: use the default uid/gid instead of the - real uid/gid. This allows you to create a file owned by - and writable only by the default uid/gid that will work - all the time (without having the setuid bit set). Change - suggested by Shau-Ping Lo and Andrew Cheng of Sun - Microsystems. - Add "DialDelay" option (no short name) to provide an "extra" - delay for dial on demand systems. If this is non-zero - and a connect fails, sendmail will wait this long and - then try again. If it takes longer than the kernel - timeout interval to establish the connection, this - option can give the network software time to establish - the link. The default units are seconds. - Move logging of sender information to be as early as possible; - previously, it could be delayed a while for SMTP mail - sent to aliases. Suggested by Brad Knowles of the - Defense Information Systems Agency. - Call res_init() before setting RES_DEBUG; this is required by - BIND 4.9.3, or so I'm told. From Douglas Anderson of - the National Computer Security Center. - Add xdelay= field in logs -- this is a transaction delay, telling - you how long it took to deliver to this address on the - last try. It is intended to be used for sorting mailing - lists to favor "quick" addresses. Provided for use by - the mailprio scripts (see below). - If a map cannot be opened, and that map is non-optional, and - an address requires that map for resolution, queue the - map instead of bouncing it. This involves creating a - pseudo-class of maps called "bogus-map" -- if a required - map cannot be opened, the class is changed to bogus-map; - all queries against bogus-map return "tempfail". The - bogus-map class is not directly accessible. A sample - implementation was donated by Jem Taylor of Glasgow - University Computing Service. - Fix a possible core dump when mailing to a program that talks - SMTP on its standard input. Fix from Keith Moore of - the University of Kentucky. - Make it possible to resolve filenames to $#local $: @ /filename; - previously, the "@" would cause it to not be recognized - as a file. Problem noted by Brian Hill of U.C. Davis. - Accept a -1 signal to re-exec the daemon. This only works if - argv[0] is a full path to sendmail. - Fix bug in "addr=..." field in O option on little-endian machines - -- the network number wasn't being converted to network - byte order. Patch from Kurt Lidl of Pix Technologies - Corporation. - Pre-initialize the resolver early on; this is to avoid a bug with - BIND 4.9.3 that can cause the _res.retry field to get - reset to zero, causing all name server lookups to time - out. Fix from Matt Day of Artisoft. - Restore T line (trusted users) in config file -- but instead of - locking out the -f flag, they just tell whether or not - an X-Authentication-Warning: will be added. This really - just creates new entries in class 't', so "Ft/file/name" - can be used to read trusted user names from a file. - Trusted users are also allowed to execute programs even - if they have a shell that isn't in /etc/shells. - Improve NEWDB alias file rebuilding so it will create them - properly if they do not already exist. This had been - a MAYBENEXTRELEASE feature in 8.6.9. - Check for @:@ entry in NIS maps before starting up to avoid - (but not prevent, sigh) race conditions. This ought to - be handled properly in ypserv, but isn't. Suggested by - Michael Beirne of Motorola. - Refuse connections if there isn't enough space on the filesystem - holding the queue. Contributed by Robert Dana of Wolf - Communications. - Skip checking for directory permissions in the path to a file - when checking for file permissions iff setreuid() - succeeded -- it is unnecessary in that case. This avoids - significant performance problems when looking for .forward - files. Based on a suggestion by Win Bent of USC. - Allow symbolic ruleset names. Syntax can be "Sname" to get an - arbitrary ruleset number assigned or "Sname = integer" - to assign a specific ruleset number. Reference is - $>name_or_number. Names can be composed of alphas, digits, - underscore, or hyphen (first character must be non-numeric). - Allow -o flag on AliasFile lines to make the alias file optional. - From Bryan Costales of ICSI. - Add NoRecipientAction option to handle the case where there is - no legal recipient header in the message. It can take - on values: - None Leave the message as is. The - message will be passed on even - though it is in technically - illegal syntax. - Add-To Add a To: header with any - recipients that it can find from - the envelope. This risks exposing - Bcc: recipients. - Add-Apparently-To Add an Apparently-To: header. This - has almost no redeeming social value, - and is provided only for back - compatibility. - Add-To-Undisclosed Add a header reading - To: undisclosed-recipients:; - which will have the effect of - making the message legal without - exposing Bcc: recipients. - Add-Bcc To add an empty Bcc: header. - There is a chance that mailers down - the line will delete this header, - which could cause exposure of Bcc: - recipients. - The default is NoRecipientAction=None. - Truncate (rather than delete) Bcc: lines in the header. This - should prevent later sendmails (at least, those that don't - themselves delete Bcc:) from considering this message to - be non-conforming -- although it does imply that non-blind - recipients can see that a Bcc: was sent, albeit not to whom. - Add SafeFileEnvironment option. If declared, files named as delivery - targets must be regular files in addition to the regular - checks. Also, if the option is non-null then it is used as - the name of a directory that is used as a chroot(2) - environment for the delivery; the file names listed in an - alias or forward should include the name of this root. - For example, if you run with - O SafeFileEnvironment=/arch - then aliases should reference "/arch/rest/of/path". If a - value is given, sendmail also won't try to save to - /usr/tmp/dead.letter (instead it just leaves the job in the - queue as Qfxxxxxx). Inspired by *Hobbit*'s sendmail patch kit. - Support -A flag for alias files; this will comma concatenate like - entries. For example, given the aliases: - list: member1 - list: member2 - and an alias file declared as: - OAhash:-A /etc/aliases - the final alias inserted will be "list: member1,member2"; - without -A you will get an error on the second and subsequent - alias for "list". Contributed by Bryan Costales of ICSI. - Line-buffer transcript file. Suggested by Liudvikas Bukys. - Fix a problem that could cause very long addresses to core dump in - some special circumstances. Problem pointed out by Allan - Johannesen. - (Internal change.) Change interface to expand() (macro expansion) - to be simpler and more consistent. - Delete check for funny qf file names. This didn't really give - any extra security and caused some people some problems. - (If you -really- want this, define PICKY_QF_NAME_CHECK - at compile time.) Suggested by Kyle Jones of UUNET. - (Internal change.) Change EF_NORETURN to EF_NO_BODY_RETN and - merge with DSN code; this is simpler and more consistent. - This may affect some people who have written their own - checkcompat() routine. - (Internal change.) Eliminate `D' line in qf file. The df file - is now assumed to be the same name as the qf file (with - the `q' changed to a `d', of course). - Avoid forking for delivery if all recipient mailers are marked as - "expensive" -- this can be a major cost on some systems. - Essentially, this forces sendmail into "queue only" mode - if all it is going to do is queue anyway. - Avoid sending a null message in some rather unusual circumstances - (specifically, the RCPT command returns a temporary - failure but the connection is lost before the DATA - command). Fix from Scott Hammond of Secure Computing - Corporation. - Change makesendmail to use a somewhat more rational naming scheme: - Makefiles and obj directories are named $os.$rel.$arch, - where $os is the operating system (e.g., SunOS), $rel is - the release number (e.g., 5.3), and $arch is the machine - architecture (e.g., sun4). Any of these can be omitted, - and anything after the first dot in a release number can - be replaced with "x" (e.g., SunOS.4.x.sun4). The previous - version used $os.$arch.$rel and was rather less general. - Change makesendmail to do a "make depend" in the target directory - when it is being created. This involves adding an empty - "depend:" entry in most Makefiles. - Ignore IDENT return value if the OSTYPE field returns "OTHER", - as indicated by RFC 1413. Pointed out by Kari Hurtta - of the Finnish Meteorological Institute. - Fix problem that could cause multiple responses to DATA command - on header syntax errors (e.g., lines beginning with colons). - Problem noted by Jens Thomassen of the University of Oslo. - Don't let null bytes in headers cause truncation of the rest of - the header. - Log Authentication-Warning:s. Suggested by Motonori Nakamura. - Increase timeouts on message data puts to allow time for receivers - to canonify addresses in headers on the fly. This is still - a rather ugly heuristic. From Motonori Nakamura. - Add "HasWildcardMX" suboption to ResolverOptions; if set, MX - records are not used when canonifying names, and when MX - lookups are done for addressing they must be fully - qualified. This is useful if you have a wildcard MX record, - although it may cause other problems. In general, don't use - wildcard MX records. Patch from Motonori Nakamura. - Eliminate default two-line SMTP greeting message. Instead of - adding an extra "ESMTP spoken here" line, the word "ESMTP" - is added between the first and second word of the first - line of the greeting message (i.e., immediately after the - host name). This eliminates the need for the BROKEN_SMTP_PEERS - compile flag. Old sendmails won't see the ESMTP, but that's - acceptable because SIZE was the only useful extension that - old sendmails understand. - Avoid gethostbyname calls on UNIX domain sockets during SIGUSR1 - invoked state dumps. From Masaharu Onishi. - Allow on-line comments in .forward and :include: files; they are - introduced by the string "<LWSP>#@#<LWSP>", where <LWSP> - is a space or a tab. This is intended for native - representation of non-ASCII sets such as Japanese, where - existing encodings would be unreadable or would lose - data -- for example, - <motonori@cs.ritsumei.ac.jp> NAKAMURA Motonori - (romanized/less information) - <motonori@cs.ritsumei.ac.jp> =?ISO-2022-JP?B?GyRCQ2ZCPBsoQg==?= - =?ISO-2022-JP?B?GyRCQUdFNRsoQg==?= - (with MIME encoding, not human readable) - <motonori@cs.ritsumei.ac.jp> #@# ^[$BCfB<^[(B ^[$BAGE5^[(B - (native encoding with ISO-2022-JP) - The last form is human readable in the Japanese environment. - Based on a fix from (surprise!) Motonori Nakamura. - Don't make SMTP error returns on MAIL FROM: line be "sticky" for all - messages to that host; these are most frequently associated - with addresses rather than the host, with the exception of - 421 (service shutting down). The effect was to cause queues - to sometimes take an excessive time to flush. Reported by - Robert Sargent of Southern Geographics Technologies and - Eric Prestemon of American University. - Add Nice=N mailer option to set the niceness at which a mailer will - run. This is actually a relative niceness (that is, an - increment on the background value). - Log queue runs that are skipped due to high loads. They are logged - at LOG_INFO priority iff the log level is > 8. Contributed - by Bruce Nagel of Data General. - Allow the error mailer to accept a DSN-style error status code - instead of an sysexits status code in the host part. - Anything with a dot will be interpreted as a DSN-style code. - Add new mailer flag: F=3 will tell translations to Quoted-Printable - to encode characters that might be munged by an EBCDIC system - in addition to the set required by RFC 1521. The additional - characters are !, ", #, $, @, [, \, ], ^, `, {, |, }, and ~. - (Think of "IBM 360" as the mnemonic for this flag.) - Change check for mailing to files to look for a pathname of [FILE] - rather than looking for the mailer named *file*. The mapping - of leading slashes still goes to the *file* mailer. This - allows you to implement the *file* mailer as a separate - program, for example, to insert a Content-Length: header - or do special security policy. However, note that the usual - initial checking for the file permissions is still done, and - the program in question needs to be very careful about how - it does the file write to avoid security problems. - Be able to read ~root/.forward even if the path isn't accessible to - regular users. This is disrecommended because sendmail - sometimes does not run as root (e.g., when an unsafe option - is specified on the command line), but should otherwise be - safe because .forward files must be owned by the user for - whom mail is being forwarded, and cannot be a symbolic link. - Suggested by Forrest Aldrich of Wang Laboratories. - Add new "HostsFile" option that is the pathname to the /etc/hosts - file. This is used for canonifying hostnames when the - service type is "files". - Implement programs on F (read class from file) line. The syntax is - Fc|/path/to/program to read the output from the program - into class "c". - Probe the network interfaces to find alternate names for this - host. Requires the SIOCGIFCONF ioctl call. Code - contributed by SunSoft. - Add "E" configuration line to set or propagate environment - variables into children. "E<envar>" will propagate - the named variable from the environment when sendmail - was invoked into any children it calls; "E<envar>=<value>" - sets the named variable to the indicated value. Any - variables not explicitly named will not be in the child - environment. However, sendmail still forces an - "AGENT=sendmail" environment variable, in part to enforce - at least one environment variable, since many programs and - libraries die horribly if this is not guaranteed. - Change heuristic for rebuilding both NEWDB and NDBM versions of - alias databases -- new algorithm looks for the substring - "/yp/" in the file name. This is more portable and involves - less overhead. Suggested by Motonori Nakamura. - Dynamically allocate the queue work list so that you don't lose - jobs in large queue runs. The old QUEUESIZE compile parameter - is replaced by QUEUESEGSIZE (the unit of allocation, which - should not need to be changed) and the MaxQueueRunSize option, - which is the absolute maximum number of jobs that will ever - be handled in a single queue run. Based on code contributed - by Brian Coan of the Institute for Global Communications. - Log message when a message is dropped because it exceeds the maximum - message size. Suggested by Leo Bicknell of Virginia Tech. - Allow trusted users (those on a T line or in $=t) to use -bs without - an X-Authentication-Warning: added. Suggested by Mark Thomas - of Mark G. Thomas Consulting. - Announce state of compile flags on -d0.1 (-d0.10 throws in the - OS-dependent defines). The old semantic of -d0.1 to not - run the daemon in background has been moved to -d99.100, - and the old 52.5 flag (to avoid disconnect() from closing - all output files) has been moved to 52.100. This makes - things more consistent (flags below .100 don't change - semantics) and separates out the backgrounding so that - it doesn't happen automatically on other unrelated debugging - flags. - If -t is used but no addresses are found in the header, give an - error message rather than just doing nothing. Fix from - Motonori Nakamura. - On systems (like SunOS) where the effective gid is not necessarily - included in the group list returned by getgroups(), the - `restrictmailq' option could sometimes cause an authorized - user to not be able to use `mailq'. Fix from Charles Hannum - of MIT. - Allow symbolic service names for [IPC] mailers. Suggested by - Gerry Magennis of Logica International. - Add DontExpandCnames option to prevent $[ ... $] from expanding CNAMEs - when running DNS. For example, if the name FTP.Foo.ORG is - a CNAME for Cruft.Foo.ORG, then when sitting on a machine in - the Foo.ORG domain a lookup of "FTP" returns "Cruft.Foo.ORG" - if this option is not set, or "FTP.Foo.ORG" if it is set. - This is technically illegal under RFC 822 and 1123, but the - IETF is moving toward legalizing it. Note that turning on - this option is not sufficient to guarantee that a downstream - neighbor won't rewrite the address for you. - Add "-m" flag to makesendmail script -- this tells you what object - directory and Makefile it will use, but doesn't actually do - the make. - Do some additional checking on the contents of the qf file to try - to detect attacks against the qf file. In particular, - abort on any line beginning "From ", and add an "end of - file" line -- any data after that line is prohibited. - Always use /etc/sendmail.cf, regardless of the arbitrary vendor - choices. This can be overridden in the Makefile by using - either -DUSE_VENDOR_CF_PATH to get the vendor location - (to the extent that we know it) or by defining - _PATH_SENDMAILCF (which is a "hard override"). This allows - sendmail 8 to have more consistent installation instructions. - Allow macros on `K' line in config file. Suggested by Andrew Chang - of Sun Microsystems. - Improved symbol table hash function from Eric Wassenaar. This one - is at least 50% faster. - Fix problem that didn't notice that timeout on file open was a - transient error. Fix from Larry Parmelee of Cornell - University. - Allow comments (lines beginning with a `#') in files read for - classes. Suggested by Motonori Nakamura. - Make SIGINT (usually ^C) in test mode return to the prompt instead - of dropping out entirely. This makes testing some of the - name server lookups easier to deal with when there are - hung servers. From Motonori Nakamura. - Add new ${opMode} macro that is set to the current operation mode - (e.g., `s' for -bs, `t' for -bt, etc.). Suggested by - Claude Marinier <MARINIER@emp.ewd.dreo.dnd.ca>. - Add new delivery mode (Odd) that defers all map lookups to queue runs. - Kind of like queue-only mode (Odq) except it tries to avoid - any external service requests; for dial-on-demand hosts that - want to minimize DNS lookups when mail is being queued. For - this to work you will also have to make sure that gethostbyname - of your local host name does not do a DNS lookup. - Improved handling of "out of space" conditions from John Myers of - Carnegie Mellon. - Improved security for mailing to files on systems that have fchmod(2) - support. - Improve "cannot send message for N days" message -- now says "could - not send for past N days". Suggested by Tom Moore of AT&T - Global Information Solutions. - Less misleading Subject: line on messages sent to postmaster only. - From Motonori Nakamura. - Avoid duplicate error messages on bad command line flags. From - Motonori Nakamura. - Better error message for case where ruleset 0 falls off the end - or otherwise does not resolve to a canonical triple. - Fix a problem that could cause multiple bounce messages if a bad - address was sent along with a good address to an SMTP - site where that SMTP site returned a 4yz code in response - to the final dot of the data. Problem reported by David - James of British Telecom. - Add "volatile" declarations so that gcc -O2 will work. Patches - from Alexander Dupuy of System Management ARTS. - Delete duplicates in MX lists -- believe it or not, there are sites - that list the same host twice in an MX list. This deletion - only works on adjacent preferences, so an MX list that - had A=5, B=10, A=15 would leave both As, but one that had - A=5, A=10, B=15 would reduce to A, B. This is intentional, - just in case there is something weird I haven't thought of. - Suggested by Barry Shein of Software Tool & Die. - SECURITY: .forward files cannot be symbolic links. If they are, - a bad guy can read your private files. - PORTABILITY FIXES: - Solaris 2 from Rob McMahon <cudcv@csv.warwick.ac.uk>. - System V Release 4 from Motonori Nakamura of Ritsumeikan - University. This expands the disk size - checking to include all (?) SVR4 configurations. - System V Release 4 from Kimmo Suominen -- initgroups(3) - and setrlimit(2) are both available. - System V Release 4 from sob@sculley.ffg.com -- some versions - apparently "have EX_OK defined in other headerfiles." - Linux Makefile typo. - Linux getusershell(3) is broken in Slackware 2.0 -- - from Andrew Pam of Xanadu Australia. - More Linux tweaking from John Kennedy of California State - University, Chico. - Cray changes from Eric Wassenaar: ``On Cray, shorts, - ints, and longs are all 64 bits, and all structs - are multiples of 64 bits. This means that the - sizeof operator returns only multiples of 8. - This requires adaptation of code that really - deals with 32 bit or 16 bit fields, such as IP - addresses or nameserver fields.'' - DG/UX 5.4.3 from Mark T. Robinson <mtr@ornl.gov>. To - get the old behavior, use -DDGUX_5_4_2. - DG/UX hack: add _FORCE_MAIL_LOCAL_=yes environment - variable to fix bogus /bin/mail behavior. - Tandem NonStop-UX from Rick McCarty <mccarty@mpd.tandem.com>. - This also cleans up some System V Release 4 compile - problems. - Solaris 2: sendmail.cw file should be in /etc/mail to - match all the other configuration files. Fix - from Glenn Barry of Emory University. - Solaris 2.3: compile problem in conf.c. Fix from Alain - Nissen of the University of Liege, Belgium. - Ultrix: freespace calculation was incorrect. Fix from - Takashi Kizu of Osaka University. - SVR4: running in background gets a SIGTTOU because the - emulation code doesn't realize that "getpeername" - doesn't require reading the file. Fix from Peter - Wemm of DIALix. - Solaris 2.3: due to an apparent bug in the socket emulation - library, sockets can get into a "wedged" state where - they just return EPROTO; closing and re-opening the - socket clears the problem. Fix from Bob Manson - of Ohio State University. - Hitachi 3050R & 3050RX running HI-UX/WE2: portability - fixes from Akihiro Hashimoto ("Hash") of Chiba - University. - AIX changes to allow setproctitle to work from Rainer Schöpf - of Zentrum für Datenverarbeitung der Universität - Mainz. - AIX changes for load average from Ed Ravin of NASA/Goddard. - SCO Unix from Chip Rosenthal of Unicom (code was using the - wrong statfs call). - ANSI C fixes from Adam Glass (NetBSD project). - Stardent Titan/ANSI C fixes from Kate Hedstrom of Rutgers - University. - DG-UX fixes from Bruce Nagel of Data General. - IRIX64 updates from Mark Levinson of the University of - Rochester Medical Center. - Altos System V (``the first UNIX/XENIX merge the Altos - did for their Series 1000 & Series 2000 line; - their merged code was licensed back to AT&T and - Microsoft and became System V release 3.2'') from - Tim Rice <timr@crl.com>. - OSF/1 running on Intel Paragon from Jeff A. Earickson - <jeff@ssd.intel.com> of Intel Scalable Systems - Division. - Amdahl UTS System V 2.1.5 (SVr3-based) from Janet Jackson - <janet@dialix.oz.au>. - System V Release 4 (statvfs semantic fix) from Alain - Durand of I.M.A.G. - HP-UX 10.x multiprocessor load average changes from - Scott Hutton and Jeff Sumler of Indiana University. - Cray CSOS from Scott Bolte of Cray Computer Corporation. - Unicos 8.0 from Douglas K. Rand of the University of North - Dakota, Scientific Computing Center. - Solaris 2.4 fixes from Sanjay Dani of Dani Communications. - ConvexOS 11.0 from Christophe Wolfhugel. - IRIX 4.0.5 from David Ashton-Reader of CADcentre. - ISC UNIX from J. J. Bailey. - HP-UX 9.xx on the 8xx series machines from Remy Giraud - of Meteo France. - HP-UX configuration from Tom Lane <tgl@sss.pgh.pa.us>. - IRIX 5.2 and 5.3 from Kari E. Hurtta. - FreeBSD 2.0 from Mike Hickey of Federal Data Corporation. - Sony NEWS-OS 4.2.1R and 6.0.3 from Motonori Nakamura. - Omron LUNA unios-b, mach from Motonori Nakamura. - NEC EWS-UX/V 4.2 from Motonori Nakamura. - NeXT 2.1 from Bryan Costales. - AUX patch thanks to Mike Erwin of Apple Computer. - HP-UX 10.0 from John Beck of Hewlett-Packard. - Ultrix: allow -DBROKEN_RES_SEARCH=0 if you are using a - non-DEC resolver. Suggested by Allan Johannesen. - UnixWare 2.0 fixes from Petr Lampa of the Technical - University of Brno (Czech Republic). - KSR OS 1.2.2 support from Todd Miller of the University - of Colorado. - UX4800 support from Kazuhisa Shimizu of NEC. - MAKEMAP: allow -d flag to allow insertion of duplicate aliases - in type ``btree'' maps. The semantics of this are undefined - for regular maps, but it can be useful for the user database. - MAKEMAP: lock database file while rebuilding to avoid sendmail - lookups while the rebuild is going on. There is a race - condition between the open(... O_TRUNC ...) and the lock - on the file, but it should be quite small. - SMRSH: sendmail restricted shell added to the release. This can - be used as an alternative to /bin/sh for the "prog" mailer, - giving the local administrator more control over what - programs can be run from sendmail. - MAIL.LOCAL: add this local mailer to the tape. It is not really - part of the release proper, and isn't fully supported; in - particular, it does not run on System V based systems and - never will. - CONTRIB: a patch to rmail.c from Bill Gianopoulos of Raytheon - to allow rmail to compile on systems that don't have - function prototypes and systems that don't have snprintf. - CONTRIB: add the "mailprio" scripts that will help you sort mailing - lists by transaction delay times so that addresses that - respond quickly get sent first. This is to prevent very - sluggish servers from delaying other peoples' mail. - Contributed by Tony Sanders of BSDI. - CONTRIB: add the "bsdi.mc" file as contributed by Tony Sanders - of BSDI. This has a lot of comments to help people out. - CONFIG: Don't have .mc files include(../m4/cf.m4) -- instead, - put this on the m4 command line. On GNU m4 (which - supports the __file__ primitive) you can run m4 in an - arbitrary directory -- use either: - m4 ${CFDIR}/m4/cf.m4 config.mc > config.cf - or - m4 -I${CFDIR} m4/cf.m4 config.mc > config.cf - On other versions of m4 that don't support __file__, you - can use: - m4 -D_CF_DIR_=${CFDIR}/ ${CFDIR}/m4/cf.m4 ... - (Note the trailing slash on the _CF_DIR_ definition.) - Old versions of m4 will default to _CF_DIR_=.. for back - compatibility. - CONFIG: fix mail from <> so it will properly convert to - MAILER-DAEMON on local addresses. - CONFIG: fix code that was supposed to catch colons in host - names. Problem noted by John Gardiner Myers of CMU. - CONFIG: allow use of SMTP_MAILER_MAX in nullclient configuration. - From Paul Riddle of the University of Maryland, Baltimore - County. - CONFIG: Catch and reject "." as a host address. - CONFIG: Generalize domaintable to look up all domains, not - just unqualified ones. - CONFIG: Delete OLD_SENDMAIL support -- as near as I can tell, it - was never used and didn't work anyway. - CONFIG: Set flags A, w, 5, :, /, |, and @ on the "local" mailer - and d on all mailers in the UUCP class. - CONFIG: Allow "user+detail" to be aliased specially: it will first - look for an alias for "user+detail", then for "user+*", and - finally for "user". This is intended for forwarding mail - for system aliases such as root and postmaster to a - centralized hub. - CONFIG: add confEIGHT_BIT_HANDLING to set option 8 (see above). - CONFIG: add smtp8 mailer; this has the F=8 (just-send-8) flag set. - The F=8 flag is also set on the "relay" mailer, since - this is expected to be another sendmail. - CONFIG: avoid qualifying all UUCP addresses sent via SMTP with - the name of the UUCP_RELAY -- in some cases, this is the - wrong value (e.g., when we have local UUCP connections), - and this can create unreplyable addresses. From Chip - Rosenthal of Unicom. - CONFIG: add confRECEIVED_HEADER to change the format of the - Received: header inserted into all messages. Suggested by - Gary Mills of the University of Manitoba. - CONFIG: Make "notsticky" the default; use FEATURE(stickyhost) - to get the old behavior. I did this upon observing - that almost everyone needed this feature, and that the - concept I was trying to make happen didn't work with - some user agents anyway. FEATURE(notsticky) still works, - but it is a no-op. - CONFIG: Add LUSER_RELAY -- the host to which unrecognized user - names are sent, rather than immediately diagnosing them - as User Unknown. - CONFIG: Add SMTP_MAILER_ARGS, ESMTP_MAILER_ARGS, SMTP8_MAILER_ARGS, - and RELAY_MAILER_ARGS to set the arguments for the - indicated mailers. All default to "IPC $h". Patch from - Larry Parmelee of Cornell University. - CONFIG: pop mailer needs F=n flag to avoid "annoying side effects - on the client side" and F=P to get an appropriate - return-path. From Kimmo Suominen. - CONFIG: add FEATURE(local_procmail) to use the procmail program - as the local mailer. For addresses of the form "user+detail" - the "detail" part is passed to procmail via the -a flag. - Contributed by Kimmo Suominen. - CONFIG: add MAILER(procmail) to add an interface to procmail for - use from mailertables. This lets you execute arbitrary - procmail scripts. Contributed by Kimmo Suominen. - CONFIG: add T= fields (MTS type) to local, smtp, and uucp mailers. - CONFIG: add OSTYPE(ptx2) for DYNIX/ptx 2.x from Sequent. From - Paul Southworth of CICNet Systems Support. - CONFIG: use -a$g as default to UUCP mailers, instead of -a$f. - This causes the null return path to be rewritten as - MAILER-DAEMON; otherwise UUCP gets horribly confused. - From Michael Hohmuth of Technische Universitat Dresden. - CONFIG: Add FEATURE(bestmx_is_local) to cause any hosts that - list us as the best possible MX record to be treated as - though they were local (essentially, assume that they - are included in $=w). This can cause additional DNS - traffic, but is easier to administer if this fits your - local model. It does not work reliably if there are - multiple hosts that share the best MX preference. - Code contributed by John Oleynick of Rutgers. - CONFIG: Add FEATURE(smrsh) to use smrsh (the SendMail Restricted - SHell) instead of /bin/sh as the program used for delivery - to programs. If an argument is included, it is used as - the path to smrsh; otherwise, /usr/local/etc/smrsh is - assumed. - CONFIG: Add LOCAL_MAILER_MAX and PROCMAILER_MAILER_MAX to limit the - size of messages to the local and procmail mailers - respectively. Contributed by Brad Knowles of the Defense - Information Systems Agency. - CONFIG: Handle leading ``phrase:'' and trailing ``;'' as comments - (just like text outside of angle brackets) in order to - properly deal with ``group: addr1, ... addrN;'' syntax. - CONFIG: Require OSTYPE macro (the defaults really don't apply to - any real systems any more) and tweak the DOMAIN macro - so that it is less likely that users will accidentally use - the Berkeley defaults. Also, create some generic files - that really can be used in the real world. - CONFIG: Add new configuration macros to set character sets for - messages _arriving from_ various mailers: LOCAL_MAILER_CHARSET, - SMTP_MAILER_CHARSET, and UUCP_MAILER_CHARSET. - CONFIG: Change UUCP_MAX_SIZE to UUCP_MAILER_MAX for consistency. - The old name will still be accepted for a while at least. - CONFIG: Implement DECNET_RELAY as spec for host to which DECNET - mail (.DECNET pseudo-domain or node::user) will be sent. - As with all relays, it can be ``mailer:hostname''. Suggested - by Scott Hutton. - CONFIG: Add MAILER(mail11) to get DECnet support. Code contributed - by Barb Dijker of Labyrinth Computer Services. - CONFIG: change confCHECK_ALIASES to default to False -- it has poor - performance for large alias files, and this confused many - people. - CONFIG: Add confCF_VERSION to append local information to the - configuration version number displayed during SMTP startup. - CONFIG: fix some.newsgroup.usenet@local.host syntax (previously it - would only work when locally addressed. Fix from - Edvard Tuinder of Cistron Internet Services. - CONFIG: use ${opMode} to avoid error on .REDIRECT addresses if option - "n" (CheckAliases) is set when rebuilding alias database. - Based on code contributed by Claude Marinier. - CONFIG: Allow mailertable to have values of the form - ``error:code message''. The ``code'' is a status code - derived from the sysexits codes -- e.g., NOHOST or UNAVAILABLE. - Contributed by David James <dwj@agw.bt.co.uk>. - CONFIG: add MASQUERADE_DOMAIN(domain list) to extend the list of - sender domains that will be replaced with the masquerade name. - These domains will not be treated as local, but if mail passes - through with sender addresses in those domains they will be - replaced by the masquerade name. These can also be specified - in a file using MASQUERADE_DOMAIN_FILE(filename). - CONFIG: add FEATURE(masquerade_envelope) to masquerade the envelope - as well as the header. Substantial improvements to this - code were contributed by Per Hedeland. - CONFIG: add MAILER(phquery) to define a new "ph" mailer; this can be - accessed from a mailertable to do CCSO ph lookups. Contributed - by Kimmo Suominen. - CONFIG: add MAILER(cyrus) to define a new Cyrus mailer; this can be - used to define cyrus and cyrusbb mailers (for IMAP support). - Contributed by John Gardiner Myers of Carnegie Mellon. - CONFIG: add confUUCP_MAILER to select default mailer to use for - UUCP addressing. Suggested by Tom Moore of AT&T GIS. - NEW FILES: - cf/cf/cs-hpux10.mc - cf/cf/cs-solaris2.mc - cf/cf/cyrusproto.mc - cf/cf/generic-bsd4.4.mc - cf/cf/generic-hpux10.mc - cf/cf/generic-hpux9.mc - cf/cf/generic-osf1.mc - cf/cf/generic-solaris2.mc - cf/cf/generic-sunos4.1.mc - cf/cf/generic-ultrix4.mc - cf/cf/huginn.cs.mc - cf/domain/berkeley-only.m4 - cf/domain/generic.m4 - cf/feature/bestmx_is_local.m4 - cf/feature/local_procmail.m4 - cf/feature/masquerade_envelope.m4 - cf/feature/smrsh.m4 - cf/feature/stickyhost.m4 - cf/feature/use_ct_file.m4 - cf/m4/cfhead.m4 - cf/mailer/cyrus.m4 - cf/mailer/mail11.m4 - cf/mailer/phquery.m4 - cf/mailer/procmail.m4 - cf/ostype/amdahl-uts.m4 - cf/ostype/bsdi2.0.m4 - cf/ostype/hpux10.m4 - cf/ostype/irix5.m4 - cf/ostype/isc4.1.m4 - cf/ostype/ptx2.m4 - cf/ostype/unknown.m4 - contrib/bsdi.mc - contrib/mailprio - contrib/rmail.oldsys.patch - mail.local/mail.local.0 - makemap/makemap.0 - smrsh/README - smrsh/smrsh.0 - smrsh/smrsh.8 - smrsh/smrsh.c - src/Makefiles/Makefile.CSOS - src/Makefiles/Makefile.EWS-UX_V - src/Makefiles/Makefile.HP-UX.10 - src/Makefiles/Makefile.IRIX.5.x - src/Makefiles/Makefile.IRIX64 - src/Makefiles/Makefile.ISC - src/Makefiles/Makefile.KSR - src/Makefiles/Makefile.NEWS-OS.4.x - src/Makefiles/Makefile.NEWS-OS.6.x - src/Makefiles/Makefile.NEXTSTEP - src/Makefiles/Makefile.NonStop-UX - src/Makefiles/Makefile.Paragon - src/Makefiles/Makefile.SCO.3.2v4.2 - src/Makefiles/Makefile.SunOS.5.3 - src/Makefiles/Makefile.SunOS.5.4 - src/Makefiles/Makefile.SunOS.5.5 - src/Makefiles/Makefile.UNIX_SV.4.x.i386 - src/Makefiles/Makefile.uts.systemV - src/Makefiles/Makefile.UX4800 - src/aliases.0 - src/mailq.0 - src/mime.c - src/newaliases.0 - src/sendmail.0 - test/t_seteuid.c - RENAMED FILES: - cf/cf/alpha.mc => cf/cf/s2k-osf1.mc - cf/cf/chez.mc => cf/cf/chez.cs.mc - cf/cf/hpux-cs-exposed.mc => cf/cf/cs-hpux9.mc - cf/cf/osf1-cs-exposed.mc => cf/cf/cs-osf1.mc - cf/cf/s2k.mc => cf/cf/s2k-ultrix4.mc - cf/cf/sunos4.1-cs-exposed.mc => cf/cf/cs-sunos4.1.mc - cf/cf/ultrix4.1-cs-exposed.mc => cf/cf/cs-ultrix4.mc - cf/cf/vangogh.mc => cf/cf/vangogh.cs.mc - cf/domain/Berkeley.m4 => cf/domain/Berkeley.EDU.m4 - cf/domain/cs-exposed.m4 => cf/domain/CS.Berkeley.EDU.m4 - cf/domain/eecs-hidden.m4 => cf/domain/EECS.Berkeley.EDU.m4 - cf/domain/s2k.m4 => cf/domain/S2K.Berkeley.EDU.m4 - cf/ostype/hpux.m4 => cf/ostype/hpux9.m4 - cf/ostype/irix.m4 => cf/ostype/irix4.m4 - cf/ostype/ultrix4.1.m4 => cf/ostype/ultrix4.m4 - src/Makefile.* => src/Makefiles/Makefile.* - src/Makefile.AUX => src/Makefiles/Makefile.A-UX - src/Makefile.BSDI => src/Makefiles/Makefile.BSD-OS - src/Makefile.DGUX => src/Makefiles/Makefile.dgux - src/Makefile.RISCos => src/Makefiles/Makefile.UMIPS - src/Makefile.SunOS.4.0.3 => src/Makefiles/Makefile.SunOS.4.0 - OBSOLETED FILES: - cf/cf/cogsci.mc - cf/cf/cs-exposed.mc - cf/cf/cs-hidden.mc - cf/cf/hpux-cs-hidden.mc - cf/cf/knecht.mc - cf/cf/osf1-cs-hidden.mc - cf/cf/sunos3.5-cs-exposed.mc - cf/cf/sunos3.5-cs-hidden.mc - cf/cf/sunos4.1-cs-hidden.mc - cf/cf/ultrix4.1-cs-hidden.mc - cf/domain/cs-hidden.m4 - contrib/rcpt-streaming - src/Makefiles/Makefile.SunOS.5.x - -8.6.13/8.6.12 96/01/25 - SECURITY: In some cases it was still possible for an attacker to - insert newlines into a queue file, thus allowing access to - any user (except root). - CONFIG: no changes -- it is not a bug that the configuration - version number is unchanged. - -8.6.12/8.6.12 95/03/28 - Fix to IDENT code (it was getting the size of the reply buffer - too small, so nothing was ever accepted). Fix from several - people, including Allan Johannesen, Shane Castle of the - Boulder County Information Services, and Jeff Smith of - Warwick University (all arrived within a few hours of - each other!). - Fix a problem that could cause large jobs to run out of - file descriptors on systems that use vfork() rather - than fork(). - -8.6.11/8.6.11 95/03/08 - The ``possible attack'' message would be logged more often - than necessary if you are using Pine as a user agent. - The wrong host would be reported in the ``possible attack'' - message when attempted from IDENT. - In some cases the syslog buffer could be overflowed when - reporting the ``possible attack'' message. This can - cause denial of service attacks. Truncate the message - to 80 characters to prevent this problem. - When reading the IDENT response a loop is needed around the - read from the network to ensure that you don't get - partial lines. - Password entries without any shell listed (that is, a null - shell) wouldn't match as "ok". Problem noted by - Rob McMahon. - When running BIND 4.9.x a problem could occur because the - _res.options field is initialized differently than it - was historically -- this requires that sendmail call - res_init before it tweaks any bits. - Fix an incompatibility in openxscript() between the file open mode - and the stdio mode passed to fdopen. This caused UnixWare - 2.0 to have conniptions. Fix from Martin Sohnius of - Novell Labs Europe. - Fix problem with static linking of local getopt routine when - using GNU's ld command. Fix from John Kennedy of - Cal State Chico. - It was possible to turn off privacy flags. Problem noted by - *Hobbit*. - Be more paranoid about writing files. Suggestions by *Hobbit* - and Liudvikas Bukys. - MAKEMAP: fixes for 64 bit machines (DEC Alphas in particular) - from Spider Boardman. - CONFIG: No changes (version number only, to keep it in sync - with the binaries). - -8.6.10/8.6.10 95/02/10 - SECURITY: Diagnose bogus values to some command line flags that - could allow trash to get into headers and qf files. - Validate the name of the user returned by the IDENT protocol. - Some systems that really dislike IDENT send intentionally - bogus information. Problem pointed out by Michael Bushnell - of the Free Software Foundation. Has some security - implications. - Fix a problem causing error messages about DNS problems when - the host name contained a percent sign to act oddly - because it was passed as a printf-style format string. - In some cases this could cause core dumps. - Avoid possible buffer overrun in returntosender() if error - message is quite long. From Fletcher Mattox of the - University of Texas. - Fix a problem that would silently drop "too many hops" error - messages if and only if you were sending to an alias. - From Jon Giltner of the University of Colorado and - Dan Harton of Oak Ridge National Laboratory. - Fix a bug that caused core dumps on some systems if -d11.2 was - set and e->e_message was null. Fix from Bruce Nagel of - Data General. - Fix problem that can still cause df files to be left around - after "hop count exceeded" messages. Fix from Andrew - Chang and Shau-Ping Lo of SunSoft. - Fix a problem that can cause buffer overflows on very long - user names (as might occur if you piped to a program - with a lot of arguments). - Avoid returning an error and re-queueing if the host signature - is null; this can occur on addresses like ``user@.''. - Problem noted by Wesley Craig and the University of - Michigan. - Avoid possible calls to malloc(0) if MCI caching is turned - off. Bug fix from Pierre David of the Laboratoire - Parallelisme, Reseaux, Systemes et Modelisation (PRiSM), - Universite de Versailles - St Quentin, and Jacky - Thibault. - Make a local copy of the line being sent via senttolist() -- in - some cases, buffers could get trashed by map lookups - causing it to do unexpected things. This also simplifies - some of the map code. - CONFIG: No changes (version number only, to keep it in sync - with the binaries). - -8.6.9/8.6.9 94/04/19 - Do all mail delivery completely disconnected from any terminal. - This provides consistency with daemon delivery and - may have some security implications. - Make sure that malloc doesn't get called with zero size, - since that fails on some systems. Reported by Ed - Hill of the University of Iowa. - Fix multi-line values for $e (SMTP greeting message). Reported - by Mike O'Connor of Ford Motor Company. - Avoid syserr if no NIS domain name is defined, but the map it - is trying to open is optional. From Win Bent of USC. - Changes for picky compilers from Ed Gould of Digital Equipment. - Hesiod support for UDB from Todd Miller of the University of - Colorado. Use "hesiod" as the service name in the U - option. - Fix a problem that failed to set the "authentic" host name (that - is, the one derived from the socket info) if you called - sendmail -bs from inetd. Based on code contributed by - Todd Miller (this problem was also reported by Guy Helmer - of Dakota State University). This also fixes a related - problem reported by Liudvikas Bukys of the University of - Rochester. - Parameterize "nroff -h" in all the Makefiles so people with - variant versions can use them easily. Suggested by - Peter Collinson of Hillside Systems. - SMTP "MAIL" commands with multiple ESMTP parameters required two - spaces between parameters instead of one. Reported by - Valdis Kletnieks of Virginia Tech. - Reduce the number of system calls during message collection by - using global timeouts around the collect() loop. This - code was contributed by Eric Wassenaar. - If the initial hostname name gathering results in a name - without a dot (usually caused by NIS misconfiguration) - and BIND is compiled in, directly access DNS to get - the canonical name. This should make life easier for - Solaris systems. If it still can't be resolved, and - if the name server is listed as "required", try again - in 30 seconds. If that also fails, exit immediately to - avoid bogus "config error: mail loops back to myself" - messages. - Improve the "MAIL DELETED BECAUSE OF LACK OF DISK SPACE" error - message to explain how much space was available and - sound a bit less threatening. Suggested by Stan Janet - of the National Institute of Standards and Technology. - If mail is delivered to an alias that has an owner, deliver any - requested return-receipt immediately, and strip the - Return-Receipt-To: header from the subsequent message. - This prevents a certain class of denial of service - attack, arguably gives more reasonable semantics, and - moves things more towards what will probably become a - network standard. Suggested by Christopher Davis of - Kapor Enterprises. - Add a "noreceipts" privacy flag to turn off all return receipts - without recompiling. - Avoid printing ESMTP parameters as part of the error message - if there are errors during parsing. This change is - purely cosmetic. - Avoid sending out error messages during the collect phase of - SMTP; there is an MVS mailer from UCLA that gets - confused by this. Of course, I think it's their bug.... - Check for the $j macro getting undefined, losing a dot, or getting - lost from $=w in the daemon before accepting a connection; - if it is, it dumps state, prints a LOG_ALERT message, - and drops core for debugging. This is an attempt to - track down a bug that I thought was long since gone. - If you see this, please forward the log fragment to - sendmail@sendmail.ORG. - Change OLD_NEWDB from a #ifdef to a #if so it can be turned off - with -DOLD_NEWDB=0 on the command line. From Christophe - Wolfhugel. - Instead of trying to truncate the listen queue for the server - SMTP port when the load average is too high, just close - the port completely and reopen it later as needed. - This ensures that the other end gets a quick "connection - refused" response, and that the connection can be - recovered later. In particular, some socket emulations - seem to get confused if you tweak the listen queue - size around and can never start listening to connections - again. The down side is that someone could start up - another daemon process in the interim, so you could - have multiple daemons all not listening to connections; - this could in turn cause the sendmail.pid file to be - incorrect. A better approach might be to accept the - connection and give a 421 code, but that could break - other mailers in mysterious ways and have paging behavior - implications. - Fix a glitch in TCP-level debugging that caused flag 16.101 to - set debugging on the wrong socket. From Eric Wassenaar. - When creating a df* temporary file, be sure you truncate any - existing data in the file -- otherwise system crashes - and the like could result in extra data being sent. - DOC: Replace the CHANGES-R5-R8 readme file with a paper in the - doc directory. This includes some additional - information. - CONFIG: change UUCP rules to never add $U! or $k! on the front - of recipient envelope addresses. This should have been - handled by the $&h trick, but broke if people were - mixing domainized and UUCP addresses. They should - probably have converted all the way over to uucp-uudom - instead of uucp-{new,old}, but the failure mode was to - loop the mail, which was bad news. - Portability fixes: - Newer BSDI systems (several people). - Older BSDI systems from Christophe Wolfhugel. - Intergraph CLIX, from Paul Southworth of CICNet. - UnixWare, from Evan Champion. - NetBSD from Adam Glass. - Solaris from Quentin Campbell of the University of - Newcastle upon Tyne. - IRIX from Dean Cookson and Bill Driscoll of Mitre - Corporation. - NCR 3000 from Kevin Darcy of Chrysler Financial Corporation. - SunOS (it has setsid() and setvbuf() calls) from - Jonathan Kamens of OpenVision Technologies. - HP-UX from Tor Lillqvist. - New Files: - src/Makefile.CLIX - src/Makefile.NCR3000 - doc/changes/Makefile - doc/changes/changes.me - doc/changes/changes.ps - -8.6.8/8.6.6 94/03/21 - SECURITY: it was possible to read any file as root using the - E (error message) option. Reported by Richard Jones; - fixed by Michael Corrigan and Christophe Wolfhugel. - -8.6.7/8.6.6 94/03/14 - SECURITY: it was possible to get root access by using weird - values to the -d flag. Thanks to Alain Durand of - INRIA for forwarding me the notice from the bugtraq - list. - -8.6.6/8.6.6 94/03/13 - SECURITY: the ability to give files away on System V-based - systems proved dangerous -- don't run as the owner - of a :include: file on a system that allows giveaways. - Unfortunately, this also applies to determining a - valid shell. - IMPORTANT: Previous versions weren't expiring old connections - in the connection cache for a long time under some - circumstances. This could result in resource exhaustion, - both at your end and at the other end. This checks the - connections for timeouts much more frequently. From - Doug Anderson of NCSC. - Fix a glitch that snuck in that caused programs to be run as - the sender instead of the recipient if the mail was - from a local user to another local user. From - Motonori Nakamura of Kyoto University. - Fix "wildcard" on /etc/shells matching -- instead of looking - for "*", look for "/SENDMAIL/ANY/SHELL/". From - Bryan Costales of ICSI. - Change the method used to declare the "statfs" availability; - instead of HASSTATFS and/or HASUSTAT with a ton of - tweaking in conf.c, there is a single #define called - SFS_TYPE which takes on one of six values (SFS_NONE - for no statfs availability, SFS_USTAT for the ustat(2) - syscall, SFS_4ARGS for a four argument statfs(2) call, - and SFS_VFS, SFS_MOUNT, or SFS_STATFS for a two argument - statfs(2) call with the declarations in <sys/vfs.h>, - <sys/mount.h>, or <sys/statfs.h> respectively). - Fix glitch in NetInfo support that could return garbage if - there was no "/locations/sendmail" property. From - David Meyer of the University of Virginia. - Change HASFLOCK from defined/not-defined to a 0/1 definition - to allow Linux to turn it off even though it is a - BSD-like system. - Allow setting of "ident" timeout to zero to turn off the ident - protocol entirely. - Make 7-bit stripping local to a connection (instead of to a - mailer); this allows you to specify that SMTP is a - 7-bit channel, but revert to 8-bit should it advertise - that it supports 8BITMIME. You still have to specify - mailer flag 7 to get this stripping at all. - Improve makesendmail script so it handles more cases automatically. - Tighten up restrictions on taking ownership of :include: files - to avoid problems on systems that allow you to give away - files. - Fix a problem that made it impossible to rebuild the alias - file if it was on a read-only file system. From - Harry Edmon of the University of Washington. - Improve MX randomization function. From John Gardiner Myers - of CMU. - Fix a minor glitch causing a bogus message to be printed (used - %s instead of %d in a printf string for the line number) - when a bad queue file was read. From Harry Edmon. - Allow $s to remain NULL on locally generated mail. I'm not - sure this is necessary, but a lot of people have complained - about it, and there is a legitimate question as to whether - "localhost" is legal as an 822-style domain. - Fix a problem with very short line lengths (mailer L= flag) in - headers. This causes a leading space to be added onto - continuation lines (including in the body!), and also - tries to wrap headers containing addresses (From:, To:, - etc) intelligently at the shorter line lengths. Problem - Reported by Lars-Johan Liman of SUNET Operations Center. - Log the real user name when logging syserrs, since these can have - security implications. Suggested by several people. - Fix address logging of cached connections -- it used to always - log the numeric address as zero. This is a somewhat - bogus implementation in that it does an extra system - call, but it should be an inexpensive one. Fix from - Motonori Nakamura. - Tighten up handling of short syslog buffers even more -- there - were cases where the outgoing relay= name was too long - to share a line with delay= and mailer= logging. - Limit the overhead on split envelopes to one open file descriptor - per envelope -- previously the overhead was three - descriptors. This was in response to a problem reported - by P{r (Pell) Emanuelsson. - Fixes to better handle the case of unexpected connection closes; - this redirects the output to the transcript so the info - is not lost. From Eric Wassenaar. - Fix potential string overrun if you macro evaluate a string that - has a naked $ at the end. Problem noted by James Matheson - <jmrm@eng.cam.ac.uk>. - Make default error number on $#error messages 553 (``Requested - action not taken: mailbox name not allowed'') instead of - 501 (``Syntax error in parameters or arguments'') to - avoid bogus "protocol error" messages. - Strip off any existing trailing dot on names during $[ ... $] - lookup. This prevents it from ending up with two dots - on the end of dot terminated names. From Wesley Craig - of the University of Michigan and Bryan Costales of ICSI. - Clean up file class reading so that the debugging information is - more informative. It hadn't been using setclass, so you - didn't see the class items being added. - Avoid core dump if you are running a version of sendmail where - NIS is compiled in, and you specify an NIS map, but - NIS is not running. Fix from John Oleynick of - Rutgers. - Diagnose bizarre case where res_search returns a failure value, - but sets h_errno to a success value. - Make sure that "too many hops" messages are considered important - enough to send an error to the Postmaster (that is, the - address specified in the P option). This fix should - help problems that cause the df file to be left around - sometimes -- unfortunately, I can't seem to reproduce - the problem myself. - Avoid core dump (null pointer reference) on EXPN command; this - only occurred if your log level was set to 10 or higher - and the target account was an alias or had a .forward file. - Problem noted by Janne Himanka. - Avoid "denial of service" attacks by someone who is flooding your - SMTP port with bad commands by shutting the connection - after 25 bad commands are issued. From Kyle Jones of - UUNET. - Fix core dump on error messages with very long "to" buffers; - fmtmsg overflows the message buffer. Fixed by trimming - the to address to 203 characters. Problem reported by - John Oleynick. - Fix configuration for HASFLOCK -- there were some spots where - a #ifndef was incorrectly #ifdef. Pointed out by - George Baltz of the University of Maryland. - Fix a typo in savemail() that could cause the error message To: - lists to be incorrect in some places. From Motonori - Nakamura. - Fix a glitch that can cause duplicate error messages on split - envelopes where an address on one of the lists has a - name server failure. Fix from Voradesh Yenbut of the - University of Washington. - Fix possible bogus pointer reference on ESMTP parameters that - don't have an ``=value'' part. - CNAME loops caused an error message to be generated, but also - re-queued the message. Changed to just re-queue the - message (it's really hard to just bounce it because - of the weird way the name server works in the presence - of CNAME loops). Problem noted by James M.R.Matheson - of Cambridge University. - Avoid giving ``warning: foo owned process doing -bs'' messages - if they use ``MAIL FROM:<foo>'' where foo is their true - user name. Suggested by Andreas Stolcke of ICSI. - Change the NAMED_BIND compile flag to be a 0/1 flag so you can - override it easily in the Makefile -- that is, you can - turn it off using -DNAMED_BIND=0. - If a gethostbyname(...) of an address with a trailing dot fails, - try it without the trailing dot. This is because if - you have a version of gethostbyname() that falls back - to NIS or the /etc/hosts file it will fail to find - perfectly reasonable names that just don't happen to - be dot terminated in the hosts file. You don't want to - strip the dot first though because we're trying to ensure - that country names that match one of your subdomains get - a chance. - PRALIASES: fix bogus output on non-null-terminated strings. - From Bill Gianopoulos of Raytheon. - CONFIG: Avoid rewriting anything that matches $w to be $j. - This was in code intended to only catch the self-literal - address (that is, [1.2.3.4], where 1.2.3.4 is your - IP address), but the code was broken. However, it will - still do this if $M is defined; this is necessary to - get client configurations to work (sigh). Note that this - means that $M overrides :mailname entries in the user - database! Problem noted by Paul Southworth. - CONFIG: Fix definition of Solaris help file location. From - Steve Cliffe <steve@gorgon.cs.uow.edu.au>. - CONFIG: Fix bug that broke news.group.USENET mappings. - CONFIG: Allow declaration of SMTP_MAILER_MAX, FAX_MAILER_MAX, - and USENET_MAILER_MAX to tweak the maximum message - size for various mailers. - CONFIG: Change definition of USENET_MAILER_ARGS to include argv[0] - instead of assuming that it is "inews" for consistency - with other mailers. From Michael Corrigan of UC San Diego. - CONFIG: When mail is forwarded to a LOCAL_RELAY or a MAIL_HUB, - qualify the address in the SMTP envelope as user@{relay|hub} - instead of user@$j. From Bill Wisner of The Well. - CONFIG: Fix route-addr syntax in nullrelay configuration set. - CONFIG: Don't turn off case mapping of user names in the local - mailer for IRIX. This was different than most every other - system. - CONFIG: Avoid infinite loops on certainly list:; syntaxes in - envelope. Noted by Thierry Besancon - <besancon@excalibur.ens.fr>. - CONFIG: Don't include -z by default on uux line -- most systems - don't want it set by default. Pointed out by Philippe - Michel of Thomson CSF. - CONFIG: Fix some bugs with mailertables -- for example, if your - host name was foo.bar.ray.com and you matched against - ".ray.com", the old implementation bound %1 to "bar" - instead of "foo.bar". Also, allow "." in the mailertable - to match anything -- essentially, take over SMART_HOST. - This also moves matching of explicit local host names - before the mailertable so they don't have to be special - cased in the mailertable data. Reported by Bill - Gianopoulos of Raytheon; the fix for the %1 binding - problem was contributed by Nicholas Comanos of the - University of Sydney. - CONFIG: Don't include "root" in class $=L (users to deliver - locally, even if a hub or relay exists) by default. - This is because of the known bug where definition of - both a LOCAL_RELAY and a MAIL_HUB causes $=L to ignore - both and deliver into the local mailbox. - CONFIG: Move up bitdomain and uudomain handling so that they - are done before .UUCP class matching; uudomain was - reported as ineffective before. This also frees up - diversion 8 for future use. Problem reported by Kimmo - Suominen. - CONFIG: Don't try to convert dotted IP address (e.g., [1.2.3.4]) - into host names. As pointed out by Jonathan Kamens, - these are often used because either the forward or reverse - mapping is broken; this translation makes it broken again. - DOC: Clarify $@ and $: in the Install & Op Guide. From Kimmo - Suominen. - Portability fixes: - Unicos from David L. Kensiski of Sterling Software. - DomainOS from Don Lewis of Silicon Systems. - GNU m4 1.0.3 from Karst Koymans of Utrecht University. - Convex from Kimmo Suominen <kim@tac.nyc.ny.us>. - NetBSD from Adam Glass <glass@sun-lamp.cs.berkeley.edu>. - BSD/386 from Tony Sanders of BSDI. - Apollo from Eric Wassenaar. - DGUX from Doug Anderson. - Sequent DYNIX/ptx 2.0 from Tim Wright of Sequent. - NEW FILES: - src/Makefile.DomainOS - src/Makefile.PTX - src/Makefile.SunOS.5.1 - src/Makefile.SunOS.5.2 - src/Makefile.SunOS.5.x - src/mailq.1 - cf/ostype/domainos.m4 - doc/op/Makefile - doc/intro/Makefile - doc/usenix/Makefile - -8.6.5/8.6.5 94/01/13 - Security fix: /.forward could be owned by anyone (the test - to allow root to own any file was backwards). From - Bob Campbell at U.C. Berkeley. - Security fix: group ids were not completely set when programs - were invoked. This caused programs to have group - permissions they should not have had (usually group - daemon instead of their own group). In particular, - Perl scripts would refuse to run. - Security: check to make sure files that are written are not - symbolic links (at least under some circumstances). - Although this does not respond to a specific known - attack, it's just a good idea. Suggested by - Christian Wettergren. - Security fix: if a user had an NFS mounted home directory on - a system with a restricted shell listed in their - /etc/passwd entry, they could still execute any - program by putting that in their .forward file. - This fix prevents that by insisting that their shell - appear in /etc/shells before allowing a .forward to - execute a program or write a file. You can disable - this by putting "*" in /etc/shells. It also won't - permit world-writable :include: files to reference - programs or files (there's no way to disable this). - These behaviors are only one level deep -- for - example, it is legal for a world-writable :include: - file to reference an alias that writes a file, on - the assumption that the alias file is well controlled. - Security fix: root was not treated suspiciously enough when - looking into subdirectories. This would potentially - allow a cracker to examine files that were publicly - readable but in a non-publicly searchable directory. - Fix a problem that causes an error on QUIT on a cached - connection to create problems on the current job. - These are typically unrelated, so errors occur in - the wrong place. - Reset CurrentLA in sendall() -- this makes sendmail queue - runs more responsive to load average, and fixes a - problem that ignored the load average in locally - generated mail. From Eric Wassenaar. - Fix possible core dump on aliases with null LHS. From - John Orthoefer of BB&N. - Revert to using flock() whenever possible -- there are just - too many bugs in fcntl() locking, particularly over - NFS, that cause sendmail to fail in perverse ways. - Fix a bug that causes the connection cache to get confused - when sending error messages. This resulted in - "unexpected close" messages. It should fix itself - on the following queue run. Problem noted by - Liudvikas Bukys of the University of Rochester. - Include $k in $=k as documented in the Install & Op Guide. - This seems odd, but it was documented.... From - Michael Corrigan of UCSD. - Fix problem that caused :include:s from alias files to be - forced to be owned by root instead of daemon - (actually DefUid). From Tim Irvin. - Diagnose unrecognized I option values -- from Mortin Forssen - of the Chalmers University of Technology. - Make "error" mailer work consistently when there is no error - code associated with it -- previously it returned OK - even though there was a real problem. Now it assumes - EX_UNAVAILABLE. - Fix bug that caused the last header line of messages that had - no body and which were terminated with EOF instead of - "." to be discarded. Problem noted by Liudvikas Bukys. - Fix core dump on SMTP mail to programs that failed -- it tried - to go to a "next MX host" when none existed, causing - a core dump. From der Mouse at McGill University. - Change IDENTPROTO from a defined/not defined to a 0/1 switch; - this makes it easier to turn it off (using - -DIDENTPROTO=0 in the Makefile). From der Mouse. - Fix YP_MASTER_NAME store to use the unupdated result of - gethostname() (instead of myhostname(), which tries - to fully qualify the name) to be consistent with - SunOS. If your hostname is unqualified, this fixes - transfers to slave servers. Bug noted by Keith - McMillan of Ameritech Services, Inc. - Fix Ultrix problem: gethostbyname() can return a very large - (> 500) h_length field, which causes the sockaddr - to be trashed. Use the size of the sockaddr instead. - Fix from Bob Manson of Ohio State. - Don't assume "-a." on host lookups if NAMED_BIND is not - defined -- this confuses gethostbyname on hosts - file lookups, which doesn't understand the trailing - dot convention. - Log SMTP server subprocesses that die with a signal instead - of from a clean exit. - If you don't have option "I" set, don't assume that a DNS - "host unknown" message is authoritative -- it - might still be found in /etc/hosts. - Fix a problem that would cause Deferred: messages to be sent - as the subject of an error message, even though the - actual cause of a message was more severe than that. - Problem noted by Chris Seabrook of OSSI. - Fix race condition in DBM alias file locking. From Kyle - Jones of UUNET. - Limit delivery syslog line length to avoid bugs in some - versions of syslog(3). This adds a new compile time - variable SYSLOG_BUFSIZE. From Jay Plett of Princeton - University, which is in turn derived from IDA. - Fix quotes inside of comments in addresses -- previously - it insisted that they be balanced, but the 822 spec - says that they should be ignored. - Dump open file state to syslog upon receiving SIGUSR1 (for - debugging). This also evaluates ruleset 89, if set - (with the null input), and logs the result. This - should be used sparingly, since the rewrite process - is not reentrant. - Change -qI, -qR, and -qS flags to be case-insensitive as - documented in the Bat Book. - If the mailer returned EX_IOERR or EX_OSERR, sendmail did not - return an error message and did not requeue the message. - Fix based on code from Roland Dirlewanger of - Reseau Regional Aquarel, Bordeaux, France. - Fix a problem that caused a seg fault if you got a 421 error - code during some parts of connection initialization. - I've only seen this when talking to buggy mailers on - the other end, but it shouldn't give a seg fault in - any case. From Amir Plivatsky. - Fix core dump caused by a ruleset call that returns null. - Fix from Bryan Costales of ICSI. - Full-Name: field was being ignored. Fix from Motonori Nakamura - of Kyoto University. - Fix a possible problem with very long input lines in setproctitle. - From P{r Emanuelsson. - Avoid putting "This is a warning message" out on return receipts. - Suggested by Douglas Anderson. - Detect loops caused by recursive ruleset calls. Suggested by - Bryan Costales. - Initialize non-alias maps during alias rebuilds -- they may be - needed for parsing. Problem noted by Douglas Anderson. - Log sender address even if no message was collected in SMTP - (e.g., if all RCPTs failed). Suggested by Motonori - Nakamura. - Don't reflect the owner-list contents into the envelope sender - address if the value contains ", :, /, or | (to avoid - illegal addresses appearing there). - Efficiency hack for toktype macro -- from Craig Partridge of - BB&N. - Clean up DNS error printing so that a host name is always - included. - Remember to set $i during queue runs. Reported by Stephen - Campbell of Dartmouth University. - If the environment variable HOSTALIASES is set, use it during - canonification as the name of a file with per-user host - translations so that headers are properly mapped. Reported - by Anne Bennett of Concordia University. - Avoid printing misleading error message if SMTP mailer (not - using [IPC]) should die on a core dump. - Avoid incorrect diagnosis of "file 1 closed" when it is caused - by the other end closing the connection. From - Dave Morrison of Oracle. - Improve several of the error messages printed by "mailq" - to include a host name or other useful information. - Add NetInfo preliminary support for NeXT systems. From Vince - DeMarco. - Fix a glitch that sometimes caused :include:s that pointed to - NFS filesystems that were down to give an "aliasing/ - forwarding loop broken" message instead of queueing - the message for retry. Noted by William C Fenner of - the NRL Connection Machine Facility. - Fix a problem that could cause a core dump if the input sequence - had (or somehow acquired) a \231 character. - Make sure that route-addrs always have <angle brackets> around - them in non-SMTP envelopes (SMTP envelopes already do - this properly). - Avoid weird headers on unbalanced punctuation of the form: - ``Joe User <user)'' -- this caused reference to the - null macro. Fix from Rick McCarty of IO.COM. - Fix a problem that caused an alias "user: user@local.host" to - not have the QNOTREMOTE bit set; this caused configs - to act as if FEATURE(notsticky) was defined even when - it was not. The effect of the problem was to make it - very hard to to set up satellite sites that had a few - local accounts, with everything else forwarded to a - corporate hub. Reported by Detlef Drewanz of the - University of Rostock and Mark Frost of NCD. - Change queuing to not call rulesets 3, {1 or 2}, 4 on header - addresses. This is more efficient (fewer name server - calls) and fixes certain unusual configurations, such - as those that have ruleset 4 do something that is - non-idempotent unless a mailer-specific ruleset did - something else. Problem reported by Brian J. Coan - of the Institute for Global Communications. - Fix the "obsolete argument" routine in main to better understand - new arguments. For example, if you used ``sendmail - -C config -v -q'' it would choke on the -q because - the -C would stop looking for old-format arguments. - Fix the code that was intended to allow two users to forward their - mail to the same program and have them appear unique. - Portability fixes for: - SCO UNIX from Murray Kucherawy. - SCO Open Server 3.2v4 from Philippe Brand. - System V Release 4 from Rick Ellis and others. - OSF/1 from Steve Campbell. - DG/UX from Ben Mesander of the USGS and Bryan Curnutt - of Stoner Associates. - Motorola SysV88 from Kevin Johnson of Motorola. - Solaris 2.3 from Casper H.S. Dik of the University - of Amsterdam and John Caruso of University - of Maryland. - FreeBSD from Ollivier Robert. - NetBSD from Adam Glass. - TitanOS from Kate Hedstrom of Rutgers University. - Irix from Bryan Curnutt. - Dynix from Jim Davis of the University of Arizona. - RISC/os. - Linux from John Kennedy of California State University - at Chico. - Solaris 2.x from Tony Boner of the U.S. Air Force. - NEXTSTEP 3.x from Vince DeMarco. - HP-UX from various people. NOTA BENE: the location - of the config file has moved to /usr/lib - to match the HP-UX version of sendmail. - CONFIG: Don't do any recipient rewriting on relay mailer; - since this is intended only for internal use, the - usual RFC 821/822/1123 rules can be relaxed. The - main point of this is to avoid munging (ugh) UUCP - addresses when relaying internally. - CONFIG: fix typo in mailer/uucp.m4 that mutilates list:; - syntax addresses delivered via UUCP. Solution - provided by Peter Wemm. - CONFIG: fix thumb-fumble in default UUCP relaying in ruleset - zero; it caused double @ signs in addresses. From - Irving Reid of the University of Toronto. - CONFIG: Portability fixes for SCO Unix 3.2 with TCP/IP 1.2.1 - from Markku Toijala of ICL Personal Systems Oy. - CONFIG: Add trailing "." on pseudo-domains for consistency; - this fixes a problem (noted by Al Whaley of Sunnyside) - that made it hard to recognize your own pseudodomain - names. - CONFIG: catch "@host" syntax errors (i.e., null local-parts) - rather than letting them get "local configuration - error"s. Problem noted by John Gardiner Myers. - CONFIG: add uucp-uudom mailer variant, based on code posted - by Spider Boardman <spider@Orb.Nashua.NH.US>; this - has uucp-dom semantics but old UUCP syntax. This - also permits "uucp-old" as an alias for "uucp" and - "uucp-new" as a synonym for "suucp" for consistency. - CONFIG: add POP mailer support (from Kimmo Suominen - <kim@grendel.lut.fi>). - CONFIG: drop CSNET_RELAY support -- CSNET is long gone. - CONFIG: fix bug caused with domain literal addresses (e.g., - ``[128.32.131.12]'') when FEATURE(allmasquerade) - was set; it would get an additional @masquerade.host - added to the address. Problem noted by Peter Wan - of Georgia Tech. - CONFIG: make sure that the local UUCP name is in $=w. From - Jim Murray of Stratus. - CONFIG: changes to UUCP rewriting to simulate IDA-style "V" - mailer flag. Briefly, if you are sending to host - "foo", then it rewrites "foo!...!baz" to "...!baz", - "foo!baz" remains "foo!baz", and anything else has - the local name prepended. - CONFIG: portability fixes for HP-UX. - DOC: several minor problems fixed in the Install & Op Guide. - MAKEMAP: fix core dump problem on lines that are too long or - which lack newline. From Mark Delany. - MAILSTATS: print sums of columns (total messages & kbytes - in and out of the system). From Tom Ferrin of UC - San Francisco Computer Graphics Lab. - SIGNIFICANT USER- OR SYSAD-VISIBLE CHANGES: - On HP-UX, /etc/sendmail.cf has been moved to - /usr/lib/sendmail.cf to match HP sendmail. - Permissions have been tightened up on world-writable - :include: files and accounts that have shells - that are not listed in /etc/shells. This may - cause some .forward files that have worked - before to start failing. - SIGUSR1 dumps some state to the log. - NEW FILES: - src/Makefile.DGUX - src/Makefile.Dynix - src/Makefile.FreeBSD - src/Makefile.Mach386 - src/Makefile.NetBSD - src/Makefile.RISCos - src/Makefile.SCO - src/Makefile.SVR4 - src/Makefile.Titan - cf/mailer/pop.m4 - cf/ostype/bsdi1.0.m4 - cf/ostype/dgux.m4 - cf/ostype/dynix3.2.m4 - cf/ostype/sco3.2.m4 - makemap/Makefile.dist - praliases/Makefile.dist - -8.6.4/8.6.4 93/10/31 - Repair core-dump problem (write to read-only memory segment) - if you fall back to the return-to-Postmaster case in - savemail. Problem reported by Richard Liu. - Immediately diagnose bogus sender addresses in SMTP. This - makes quite certain that crackers can't use this - class of attack. - Reliability Fix: check return value from fclose() and fsync() - in a few critical places. - Minor problem in initsys() that reversed a condition for - redirecting the output channel on queue runs. It's - not clear this code even does anything. From Eric - Wassenaar of the Dutch National Institute for Nuclear - and High-Energy Physics. - Fix some problems that caused queue runs to do "too much work", - such as double-reading the Errors-To: header. From - Eric Wassenaar. - Error messages on writing the temporary file (including the - data file) were getting suppressed in SMTP -- this - fix causes them to be properly reported. From Eric - Wassenaar. - Some changes to support AF_UNIX sockets -- this will only - really become relevant in the next release, but some - people need it for local patches. From Michael - Corrigan of UC San Diego. - Use dynamically allocated memory (instead of static buffers) - for macros defined in initsys() and settime(); since - these can have different values depending on which - envelope they are in. From Eric Wassenaar. - Improve logging to show ctladdr on to= logging; this tells you - what uid/gid processes ran as. - Fix a problem that caused error messages to be discarded if - the sender address was unparseable for some reason; - this was supposed to fall back to the "return to - postmaster" case. - Improve aliaswait backoff algorithm. - Portability patches for Linux (8.6.3 required another header - file) (from Karl London) and SCO UNIX. - CONFIG: patch prog mailer to not strip host name off of envelope - addresses (so that it matches local again). From - Christopher Davis. - CONFIG: change uucp-dom mailer so that "<>" translates to $n; - this prevents uux from seeing lines with null names like - ``From Sat Oct 30 14:55:31 1993''. From Motonori - Nakamura of Kyoto University. - CONFIG: handle <list:;> syntax correctly. This isn't legal, but - it shouldn't fail miserably. From Motonori Nakamura. - -8.6.2/8.6.2 93/10/15 - Put a "successful delivery" message in the transcript for - addresses that get return-receipts. - Put a prominent "this is only a warning" message in warning - messages -- some people don't read carefully enough - and end up sending the message several times. - Include reason for temporary failure in the "warning" return - message. Currently, it just says "cannot send for - four hours". - Fix the "Original message received" time generated for - returntosender messages. It was previously listed as - the current time. Bug reported by Eric Hagberg of - Cornell University Medical College. - If there is an error when writing the body of a message, - don't send the trailing dot and wait for a response - in sender SMTP, as this could cause the connection to - hang up under some bizarre circumstances. From Eric - Wassenaar. - Fix some server SMTP synchronization problems caused when - connections fail during message collection. From - Eric Wassenaar. - Fix a problem that can cause srvrsmtp to reject mail if the - name server is down -- it accepts the RCPT but rejects - the DATA command. Problem reported by Jim Murray of - Stratus. - Fix a problem that can cause core dumps if the config file - incorrectly resolves to a null hostname. Reported by - Allan Johannesen of WPI. - Non-root use of -C flag, dangerous -f flags, and use of -oQ - by non-root users were not put into - X-Authentication-Warning:s as intended because the - config file hadn't set the PrivacyOptions yet. Fix - from Sven-Ove Westberg of the University of Lulea. - Under very odd circumstances, the alias file rebuild code - could get confused as to whether a database was - open or not. - Check "vendor code" on the end of V lines -- this is - intended to provide a hook for vendor-specific - configuration syntax. (This is a "new feature", - but I've made an exception to my rule in a belief - that this is a highly exceptional case.) - Portability fixes for DG/UX (from Douglas Anderson of NCSC), - SCO Unix (from Murray Kucherawy), A/UX, and OSF/1 - (from Jon Forrest of UC Berkeley) - CONFIG: fix ``mailer:host'' form of UUCP relay naming. - -8.6.1/8.6 93/10/08 - Portability fixes for A/UX and Encore UMAX V. - Fix error message handling -- if you had a name server down - causing an error during parsing, that message was never - propagated to the queue file. - -8.6/8.6 93/10/05 - Configuration cleanup: make it easier to undo IDENTPROTO in - conf.h (other systems have the same bug). - If HASGETDTABLESIZE and _SC_OPEN_MAX are both defined, assume - getdtablesize() instead of sysconf(); a disturbingly - large number of systems defined _SC_OPEN_MAX in the - header files but don't have the syscall. - Another patch to really truly ignore MX records in getcanonname - if trymx == FALSE. - Fix problem that caused the "250 IAA25499 Message accepted for - delivery" message to be omitted if there was an error - in the header of the message (e.g., a bad Errors-To: - line). Pointed out by Michael Corrigan of UCSD. - Announce name of host we are chatting when we get errors; this - is an IDA-ism suggested by Christophe Wolfhugel. - Portability fixes for Alpha OSF/1 (from Anthony Baxter of the - Australian Artificial Intelligence Institute), SCO Unix - (from Murray Kucherawy of Hookup Communication Corp.), - NeXT (from Vince DeMarco and myself), Linux (from - Karl London <karl@borg.demon.co.uk>), BSDI (from - Christophe Wolfhugel, and SVR4 on Dell (from Kimmo - Suominen), AUX 3.0 on Macintosh, and ANSI C compilers. - Some changes to get around gcc optimizer bugs. From Takahiro - Kanbe. - Fix error recovery in queueup if another tf file of the same - name already exists. Problem stumbled over by Bill - Wisner of The Well. - Output YP_MASTER_NAME and YP_LAST_MODIFIED without null bytes. - Problem noted by Keith McMillan of Ameritech Services. - Deal with group permissions properly when opening .forward and - :include: files. This relaxes the 8.1C restrictions - slightly more. This includes proper setting of groups - when reading :include: files, allowing you to read some - files that you should be able to read but have previously - been denied unless you owned them or they had "other" - read permission. - Make certain that $j is in $=w (after the .cf is read) so that - if the user is forced to override some silly system, - MX suppression will still work. - Fix a couple of efficiency problems where newstr was double- - calling expensive routines. In at least one case, it - wasn't guaranteed that they would always return the - same result. Problem noted by Christophe Wolfhugel. - Fix null pointer dereference in putoutmsg -- only on an error - condition from a non-SMTP mailer. From Motonori - Nakamura. - Macro expand "C" line class definitions before scanning so that - "CX $Z" works. - Fix problem that caused error message to be sent while still - trying to send the original message if the connection - is closed during a DATA command after getting an error - on an RCPT command (pretty obscure). Problem reported - by John Myers of CMU. - Fix reply to NOOP to be 250 instead of 200 -- this is a long - term bug. - Fix a nasty bug causing core dumps when returning the "warning: - cannot deliver for N hours -- will keep trying" message; - it only occurred if you had PostmasterCopy set and - only on some architectures. Although sendmail would - keep trying, it would send error messages on each - queue interval. This is an important fix. - Allow u and g options to take user and group names respectively. - Don't do a chdir into the queue directory in -bt mode to make - ruleset testing a bit easier. - Don't allow users to turn off logging (using -oL) on the command - line -- command line can only raise, not lower, logging - level. - Set $u to the original recipient on the SMTP transaction or on - the command line. This is only done if there is exactly - one recipient. Technically, this does not meet the - specs, because it does not guarantee a domain on the - address. - Fix a problem that dumped error messages on bad addresses if - you used the -t flag. Problem noted by Josh Smith of - Harvey Mudd College. - Given an address such as ``<foo> <bar>'', auto-quote the first - ``<foo>'' part, giving ``"<foo>" <bar>''. This is to - avoid the problem of people who use angle brackets in - their full name information. - Fix a null pointer dereference if you set option "l", have - an Errors-To: header in the message, and have Errors-To: - defined in the config file H lines. From J.R. Oldroyd. - Put YPCOMPAT on #ifdef NIS instead -- it's one less thing to get - wrong when compiling. Suggested by Rick McCarty of TI. - Fix a problem that could pass negative SIZE parameter if the - df file got lost; this would cause servers to always - give a temporary failure, making the problem even worse. - Problem noted by Allan Johannesen of WPI. - Add "ident" timeout (one of the "r" option selectors) for IDENT - protocol timeouts (30s default). Requested by Murray - Kucherawy of HookUp Communication Corp. to handle bogus - PC TCP/IP implementations. - Change $w default definition to be just the first component of - the domain name on config level 5. The $j macro defaults - to the FQDN; $m remains as before. This lets well-behaved - config files use any of the short, long, or subdomain - names. - Add makesendmail script in src to try to automate multi-architecture - builds. I know, this is sub-optimal, but it is still - helpful. - Fix very obscure race condition that can cause a queue run to - get a queue file for an already completed job. This - problem has existed for years. Problem noted by the - long suffering Allan Johannesen of WPI. - Fix a problem that caused the raw sender name to be passed to - udbsender instead of the canonified name -- this caused - it to sometimes miss records that it should have found. - Relax check of name on HELO packet so that a program using -bs - that claims to be itself works properly. - Restore rewriting of $: part of address through 2, R, 4 in - buildaddr -- this requires passing a lot of flags to get - it right. Unlike old versions, this ONLY rewrites - recipient addresses, not sender addresses. - Fix a bug that caused core dumps in config files that cannot - resolve /file/name style addresses. Fix from Jonathan - Kamens of OpenVision Technologies. - Fix problem with fcntl locking that can cause error returns to - be lost if the lock is lost; this required fully - queueing everything, dropping the envelope (so errors - would get returned), and then re-reading the queue from - scratch. - Fix a problem that caused aliases that redefine an otherwise - true address to still send to the original address - if and only if the alias failed in certain bizarre - ways (e.g, if they pointed at a list:; syntax address). - Problem pointed out by Jonathan Kamens. - Remove support for frozen configuration files. They caused - more trouble than it was worth. - Fix problem that can cause error messages to get ignored when - using both -odb and -t flags. Problem noted by Rob - McNicholas at U.C. Berkeley. - Include all "normal" variations on hostname in $=w. For example, - if the host name is vangogh.cs.berkeley.edu, $=w will - contain vangogh, vangogh.cs, and vangogh.cs.berkeley.edu. - Add "restrictqrun" privacy flag -- without this, anyone can run - the queue. - Reset SmtpPhase global on initial connection creation so that - messages don't come out with stale information. - Pass an "ext" argument to lockfile so that error/log messages - will properly reflect the true filename being locked. - Put all [...] address forms into $=w -- this eliminates the need - for MAXIPADDR in conf.h. Suggested by John Gardiner - Myers of CMU. - Fix a bug that can cause qf files to be left around even after - an SMTP RSET command. Problem and fix from Michael - Corrigan. - Don't send a PostmasterCopy to errors when the Precedence: is - negative. Error reports still go to the envelope - sender address. - Add LA_SHORT for load averages. - Lock sendmail.st file when posting statistics. - Add "SendBufSize" and "RcvBufSize" suboptions to "O" option to - set the size of the TCP send and receive buffers; if you - run over a slow slip line you may need to set these down - (although it would be better to fix the SLIP implementation - so that it's not necessary to recompile every program - that does bulk data transfer). - Allow null defaults on $( ... $) lookups. Problem reported by - Amir Plivatsky. - Diagnose crufty S and V config lines. This resulted from an - observation that some people were using the SITE macro - without the SITECONFIG macro first, which was causing - bogus config files that were not caught. - Fix makemap -f flag to turn off case folding (it was turning it - on instead). THIS IS A USER VISIBLE CHANGE!!! - Fix a problem that caused multiple error messages to be sent if - you used "sendmail -t -oem -odb", your system uses fcntl - locking, and one of the recipient addresses is unknown. - Reset uid earlier in include() so that recursive .forwards or - :include:s don't use the wrong uid. - If file descriptor 0, 1, or 2 was closed when sendmail was - called, the code to recover the descriptor was broken. - This sometimes (only sometimes) caused problems with the - alias file. Fix from Motonori Nakamura. - Fix a problem that caused aliaswait to go into infinite recursion - if the @:@ metasymbol wasn't found in the alias file. - Improve error message on newaliases if database files cannot be - opened or if running with no database format defined. - Do a better estimation of the size of error messages when NoReturn - is set. Problem noted by P{r (Pell) Emanuelsson. - Fix a problem causing the "c" option (don't connect to expensive - mailers) to be ignored in SMTP. Problem noted and the - solution suggested by Robert Elz of The University of - Melbourne. - Improve connection caching algorithm by passing "[host]" to - hostsignature, which strips the square brackets and - returns the real name. This allows mailertable entries - to match regular entries. - Re-enable Return-Receipt-To: -- people seem to want this stupid - feature, even if it doesn't work right. - Catch and log attempts to try the "wiz" command in server SMTP. - This also ups the log level from LOG_NOTICE to LOG_CRIT. - Be more generous at assigning $z to the home directory -- do this - for programs that are specified through a .forward file. - Fix from Andrew Chang of Sun Microsystems. - Always save a fatal error message in preference to a non-fatal - error message so that the "subject" line of return - messages is the best possible. - CONFIG: reduce the number of quotes needed to quote configuration - parameters with commas: two quotes should work now, e.g., - define(ALIAS_FILE, ``/etc/aliases,/etc/aliases.local''). - CONFIG: class $=Z is a set of UUCP hosts that use uucp-dom - connections (domain-ized UUCP). - CONFIG: fix bug in default maps (-o must be before database file - name). Pointed out by Christophe Wolfhugel. - CONFIG: add FEATURE(nodns) to state that we are not relying on - DNS. This would presumably be used in UUCP islands. - CONFIG: add OSTYPE(nextstep) and OSTYPE(linux). - CONFIG: log $u in Received: line. This is in technical violation - of the standards, since it doesn't guarantee a domain - on the address. - CONFIG: don't assume "m" in local mailer flags -- this means that - if you redefine LOCAL_MAILER_FLAGS you will have to include - the "m" flag should you want it. Apparently some Solaris 2.2 - installations can't handle multiple local recipients. - Problem noted by Josh Smith. - CONFIG: add confDOMAIN_NAME to set $j (if undefined, $j defaults). - CONFIG: change default version level from 4 to 5. - CONFIG: add FEATURE(nullclient) to create a config file that - forwards all mail to a hub without ever looking at the - addresses in any detail. - CONFIG: properly strip mailer: information off of relays when - used to change .BITNET form into %-hack form. - CONFIG: fix a problem that caused infinite loops if presented - with an address such as "!foo". - CONFIG: check for self literal (e.g., [128.32.131.12]) even if - the reverse "PTR" mapping is broken. There's a better - way to do this, but the change is fairly major and I - want to hold it for another release. Problem noted by - Bret Marquis. - -8.5/8.5 93/07/23 - Serious bug: if you used a command line recipient that was unknown - sendmail would not send a return message (it was treating - everything as though it had an SMTP-style client that - would do the return itself). Problem noted by Josh Smith. - Change "trymx" option in getcanonname() to ignore all MX data, - even during a T_ANY query. This actually didn't break - anything, because the only time you called getcanonname - with !trymx was if you already knew there were no MX - records, but it is somewhat cleaner. From Motonori - Nakamura. - Don't call getcanonname from getmxrr if you already know there - are no DNS records matching the name. - Fix a problem causing error messages to always include "The - original message was received ... from localhost". - The correct original host information is now included. - Previous change to cf/sh/makeinfo.sh doesn't port to Ultrix (their - version of "test" doesn't have the -x flag). Change it - to use -f instead. From John Myers. - CONFIG: 8.4 mistakenly set the default SMTP-style mailer to - esmtp -- it should be smtp. - CONFIG: send all relayed mail using confRELAY_MAILER (defaults - to "relay" (a variant of "smtp") if MAILER(smtp) is used, - else "suucp" if MAILER(uucp) is used, else "unknown"); - this cleans up the configs somewhat. This fixes a serious - problem that caused route-addrs to get mistaken as relays, - pointed out by John Myers. WARNING: this also causes - the default on SMART_HOST to change from "suucp" to - "relay" if you have MAILER(smtp) specified. - -8.4/8.4 93/07/22 - Add option `w'. If you receive a message that comes to you because - you are the best (lowest preference) target of an MX, and - you haven't explicitly recognized the source MX host in - your .cf file, this option will cause you to try the target - host directly (as if there were no MX for it at all). If - `w' is not set, this case is a configuration error. - Beware: if `w' is set, senders may get bogus errors like - "message timed out" or "host unknown" for problems that - are really configuration errors. This option is - disrecommended, provided only for compatibility with - UIUC sendmail. - Fix a problem that caused the incoming socket to be left open - when sendmail forks after the DATA command. This caused - calling systems to wait in FIN_WAIT_2 state until the - entire list was processed and the child closed -- a - potentially prodigious amount of time. Problem noted - by Neil Rickert. - Fix problem (created in 6.64) that caused mail sent to multiple - addresses, one of which was a bad address, to completely - suppress the sending of the message. This changes - handling of EF_FATALERRS somewhat, and adds an - EF_GLOBALERRS flag. This also fixes a potential problem - with duplicate error messages if there is a syntax error - in the header of a message that isn't noticed until late - in processing. Original problem pointed out by Josh Smith - of Harvey Mudd College. This release includes quite a bit - of dickering with error handling (see below). - Back out SMTP transaction if MAIL gets nested 501 error. This - will only hurt already-broken software and should help - humans. - Fix a problem that broke aliases when neither NDBM nor NEWDB were - compiled in. It would never read the alias file. - Repair unbalanced `)' and `>' (the "open" versions are already - repaired). - Logging of "done" in dropenvelope() was incorrect: it would - log this even when the queue file still existed. Change - this to only log "done" (at log level 11) when the - queue file is actually removed. From John Myers. - Log "lost connection" in server SMTP at log level 20 if there - is no pending transaction. Some senders just close the - connection rather than sending QUIT. - Fix a bug causing getmxrr to add a dot to the end of unqualified - domains that do not have MX records -- this would cause - the subsequent host name lookup to fail. The problem - only occurred if you had FEATURE(nocanonify) set. - Problem noted by Rick McCarty of Texas Instruments. - Fix invocation of setvbuf when passed a -X flag -- I had - unwittingly used an ANSI C extension, and this caused - core dumps on some machines. - Diagnose self-destructive alias loops on RCPT as well as EXPN. - Previously it just gave an empty send queue, which - then gave either "Need RCPT (recipient)" at the DATA - (confusing, since you had given an RCPT command which - returned 250) or just dropped the email, depending on - whether you were running VERBose mode. Now it usually - diagnoses this case as "aliasing/forwarding loop broken". - Unfortunately, it still doesn't adequately diagnose - some true error conditions. - Add internal concept of "warning messages" using 6xx codes. - These are not reported only to Postmaster. Unbalanced - parens, brackets, and quotes are printed as 653 codes. - They are always mapped to 5xx codes before use in SMTP. - Clean up error messages to tell both the actual address that - failed and the alias they arose from. This makes it - somewhat easier to diagnose problems. Difficulty noted - by Motonori Nakamura. - Fix a problem that inappropriately added a ctladdr to addresses - that shouldn't have had one during a queue run. This - caused error messages to be handled differently during - a queue run than a direct run. - Don't print the qf name and line number if you get errors during - the direct run of the queue from srvrsmtp -- this was - just extra stuff for users to crawl through. - Put command line flags on second line of pid file so you can - auto-restart the daemon with all appropriate arguments. - Use "kill `head -1 /etc/sendmail.pid`" to stop the - daemon, and "eval `tail -1 /etc/sendmail.pid`" to - restart it. - Remove the ``setuid(getuid())'' in main -- this caused the - IDENT daemon to screw up. This required that I change - HASSETEUID to HASSETREUID and complicate the mode - changing somewhat because both Ultrix and SunOS seem - to have a bug causing seteuid() to set the saved uid - as well as the effective. The program test/t_setreuid.c - will test to see if your implementation of setreuid(2) - is appropriately functional. - The FallBackMX (option V) handling failed to properly identify - fallback to yourself -- most of the code was there, - but it wasn't being enabled. Problem noted by Murray - Kucherawy of the University of Waterloo. - Change :include: open timeout from ETIMEDOUT to an internal - code EOPENTIMEOUT; this avoids adding "during SmtpPhase - with CurHostName" in error messages, which can be - confusing. Reported by Jonathan Kamens of OpenVision - Technologies. - Back out setpgrp (setpgid on POSIX systems) call to reset the - process group id. The original fix was to get around - some problems with recalcitrant MUAs, but it breaks - any call from a shell that creates a process group id - different from the process id. I could try to fix - this by diddling the tty owner (using tcsetpgrp or - equivalent) but this is too likely to break other - things. - Portability changes: - Support -M as equivalent to -oM on Ultrix -- apparently - DECnet calls sendmail with -MrDECnet -Ms<HOST> -bs - instead of using standard flags. Oh joy. This - behavior reported by Jon Giltner of University - of Colorado. - SGI IRIX -- this includes several changes that should - help other strict ANSI compilers. - SCO Unix -- from Murray Kucherawy of HookUp Communication - Corporation. - Solaris running the Sun C compiler (which despite the - documentation apparently doesn't define - __STDC__ by default). - ConvexOS from Eric Schnoebelen of Convex. - Sony NEWS workstations and Omron LUNA workstations from - Motonori Nakamura. - CONFIG: add confTRY_NULL_MX_LIST to set option `w'. - CONFIG: delete `C' and `e' from default SMTP mailers flags; - several people have made a good argument that this - creates more problems than it solves (although this - may prove painful in the short run). - CONFIG: generalize all the relays to accept a "mailer:host" - format. - CONFIG: move local processing in ruleset 0 into a new ruleset - 98 (8 on old sendmail). Domain literal [a.b.c.d] - addresses are also passed through this ruleset. - CONFIG: if neither SMART_HOST nor MAILER(smtp) were defined, - internet-style addresses would "fall off the end" of - ruleset zero and be interpreted as local -- however, - the angle brackets confused the recursive call. - These are now diagnosed as "Unrecognized host name". - CONFIG: USENET rules weren't included in S0 because of a mistaken - ifdef(`_MAILER_USENET_') instead of - ifdef(`_MAILER_usenet_'). Problem found by Rein Tollevik - of SINTEF RUNIT, Oslo. - CONFIG: move up LOCAL_RULE_0 processing so that it happens very - early in ruleset 0; this allows .mc authors to bypass - things like the "short circuit" code for local addresses. - Prompted by a comment by Bill Wisner of The Well. - CONFIG: add confSMTP_MAILER to define the mailer used (smtp or - esmtp) to send SMTP mail. This allows you to default - to esmtp but use a mailertable or other override to - deal with broken servers. This logic was pointed out - to me by Bill Wisner. Ditto for confLOCAL_MAILER. - Changes to cf/sh/makeinfo.sh to make it portable to SVR4 - environments. Ugly as sin. - -8.3/8.3 93/07/13 - Fix setuid problems introduced in 8.2 that caused messages - like "Cannot create qfXXXXXX: Invalid argument" - or "Cannot reopen dfXXXXXX: Permission denied". This - involved a new compile flag "HASSETEUID" that takes - the place of the old _POSIX_SAVED_IDS -- it turns out - that the POSIX interface is broken enough to break - some systems badly. This includes some fixes for - HP-UX. Also fixes problems where the real uid is - not reset properly on startup (from Neil Rickert). - Fix a problem that caused timed out messages to not report the - addresses that timed out. Error messages are also more - "user friendly". - Drop required bandwidth on connections from 64 bytes/sec to - 16 bytes/sec. - Further Solaris portability changes -- doesn't require the BSD - compatibility library. This also adds a new - "HASGETDTABLESIZE" compile flag which can be used if - you want to use getdtablesize(2) instead of sysconf(2). - These are loosely based on changes from David Meyer at - University of Oregon. This now seems to work, at least - for quick test cases. - Fix a problem that can cause duplicate error messages to be - sent if you are in SMTP, you send to multiple addresses, - and at least one of those addresses is good and points - to an account that has a .forward file (whew!). - Fix a problem causing messages to be discarded if checkcompat() - returned EX_TEMPFAIL (because it didn't properly mark - the "to" address). Problem noted by John Myers. - Fix dfopen to return NULL if the open failed; I was depending - on fdopen(-1) returning NULL, which isn't the case. This - isn't serious, but does result in weird error diagnoses. - From Michael Corrigan. - CONFIG: add UUCP_MAX_SIZE M4 macro to set the maximum size of - messages sent through UUCP-family mailers. Suggested - by Bill Wisner of The Well. - CONFIG: if both MAILER(uucp) and MAILER(smtp) are specified, - include a "uucp-dom" mailer that uses domain-style - addressing. Suggested by Bill Wisner. - CONFIG: Add LOCAL_SHELL_FLAGS and LOCAL_SHELL_ARGS to match - LOCAL_MAILER_FLAGS and LOCAL_MAILER_ARGS. Suggested by - Christophe Wolfhugel. - CONFIG: Add OSTYPE(aix3). From Christophe Wolfhugel. - -8.2/8.2 93/07/11 - Don't drop out on config file parse errors in -bt mode. - On older configuration files, assume option "l" (use Errors-To - header) for back compatibility. NOTE: this DOES NOT - imply an endorsement of the Errors-To: header in any way. - Accept -x flag on AIX-3 as well as OSF/1. Why, why, why??? - Don't log errors on EHLO -- it isn't a "real" error for an old - SMTP server to give an error on this command, and - logging it in the transcript can be confusing. Fix - from Bill Wisner. - IRIX compatibility changes provided by Dan Rich - <drich@sandman.lerc.nasa.gov>. - Solaris 2 compatibility changes. Provided by Bob Cunningham - <bob@kahala.soest.hawaii.edu>, John Oleynick - <juo@klinzhai.rutgers.edu> - Debugging: -d17 was overloaded (hostsignature and usersmtp.c); - move usersmtp (smtpinit and smtpmailfrom) to -d18 to - match the other flags in that file. - Flush transcript before fork in mailfile(). From Eric Wassenaar. - Save h_errno in mci struct and improve error message display. - Changes from Eric Wassenaar. - Open /dev/null for the transcript if the create of the xf file - failed; this avoids at least one possible null pointer - reference in very weird cases. From Eric Wassenaar. - Clean up statistics gathering; it was over-reporting because of - forks. From Eric Wassenaar. - Fix problem that causes old Return-Path: line to override new - Return-Path: line (conf.c needs H_FORCE to avoid - re-using old value). From Motonori Nakamura. - Fix broken -m flag in K definition -- even if -m (match only) - was specified, it would still replace the key with the - value. Noted by Rick McCarty of Texas Instruments. - If the name server timed out over several days, no "timed out" - message would ever be sent back. The timeout code - has been moved from markfailure() to dropenvelope() - so that all such failures should be diagnosed. Pointed - out by Christophe Wolfhugel and others. - Relax safefile() constraints: directories in an include or - forward path must be readable by self if the controlling - user owns the entry, readable by all otherwise (e.g., - when reading your .forward file, you have to own and - have X permission in it; everyone needs X permission in - the root and directories leading up to your home); - include files must be readable by anyone, but need not - be owned by you. - If _POSIX_SAVED_IDS is defined, setuid to the owner before - reading a .forward file; this gets around some problems - on NFS mounts if root permission is not exported and - the user's home directory isn't x'able. - Additional NeXT portability enhancements from Axel Zinser. - Additional HP-UX portability enhancements from Brian Bullen. - Add a timeout around SMTP message writes; this assumes you can - get throughput of at least 64 bytes/second. Note that - this does not impact the "datafinal" default, which - is separate; this is just intended to work around - network clogs that will occur before the final dot - is sent. From Eric Wassenaar. - Change map code to set the "include null" flag adaptively -- - it initially tries both, but if it finds anything - matching without a null it never tries again with a - null and vice versa. If -N is specified, it never - tries without the null and creates new maps with a - null byte. If -O is specified, it never tries with - the null (for efficiency). If -N and -O are specified, - you get -NO (get it?) lookup at all, so this would - be a bad idea. If you don't specify either -N or -O, - it adapts. - Fix recognition of "same from address" so that MH submissions - will insert the appropriate full name information; - this used to work and got broken somewhere along the - way. - Some changes to eliminate some unnecessary SYSERRs in the - log. For example, if you lost a connection, don't - bother reporting that fact on the connection you lost. - Add some "extended debugging" flags to try to track down - why we get occasional problems with file descriptor - one being closed when execing a mailer; it seems to - only happen when there has been another error in the - same transaction. This requires XDEBUG, defined - by default in conf.h. - Add "-X filename" command line flag, which logs both sides of - all SMTP transactions. This is intended ONLY for - debugging bad implementations of other mailers; start - it up, send a message from a mailer that is failing, - and then kill it off and examine the indicated log. - This output is not intended to be particularly human - readable. This also adds the HASSETVBUF compile - flag, defaulted on if your compiler defines __STDC__. - CONFIG: change SMART_HOST to override an SMTP mailer. If you - have a local net that should get direct connects, you - will need to use LOCAL_NET_CONFIG to catch these hosts. - See cf/README for an example. - CONFIG: add LOCAL_MAILER_ARGS (default: `mail -d $u') to handle - sites that don't use the -d flag. - CONFIG: hide recipient addresses as well as sender addresses - behind $M if FEATURE(allmasquerade) is specified; this - has been requested by several people, but can break - local aliases. For example, if you mail to "localalias" - this will be rewritten as "localalias@masqueradehost"; - although initial delivery will work, replies will be - broken. Use it sparingly. - CONFIG: add FEATURE(domaintable). This maps unqualified domains - to qualified domains in headers. I believe this is - largely equivalent to the IDA feature of the same name. - CONFIG: use $U as UUCP name instead of $k. This permits you - to override the "system name" as your UUCP name -- - in particular, to use domain-ized UUCP names. From - Bill Wisner of The Well. - CONFIG: create new mailer "esmtp" that always tries EHLO - first. This is currently unused in the config files, - but could be used in a mailertable entry. - -8.1C/8.1B 93/06/27 - Serious security bug fix: it was possible to read any file on - the system, regardless of ownership and permissions. - If a subroutine returns a fully qualified address, return it - immediately instead of feeding it back into rewriting. - This fixes a problem with mailertable lookups. - CONFIG: fix some M4 frotz (concat => CONCAT) - -8.1B/8.1A 93/06/12 - Serious bug fix: pattern matching backup algorithm stepped by - two tokens in classes instead of one. Found by Claus - Assmann at University of Kiel, Germany. - -8.1A/8.1A 93/06/08 - Another mailertable fix.... - -8.1/8.1 93/06/07 - 4.4BSD freeze. No semantic changes. - -6.65/6.34 93/06/06 - Fix some lintish problems. - Fix some cases where server SMTP behaved poorly when handed bogus - input, pointed out by Eric Wassenaar. - CONFIG: fix some more (sigh) mailertable bugs -- thanks to - Motonori Nakamura of Kyoto University (again). - -6.64/6.33 93/06/05 - Don't send 050 (-v) information after the 250 response to a QUIT - command in srvrsmtp -- clients usually close the connection - at this point, and it causes bogus error messages. - Don't send messages that have errors on input (such as unbalanced - parentheses) during SMTP transactions, since a return - message has (probably) already been sent. - Give better diagnostics on timeouts during network reads, including - information similar to the SMTP phase. - Fix bug that caused SMTP messages to deliver synchronously; this - happened after the DATA 250, and hence caused reading the - next command to be delayed. - Ignore Errors-To: header unless 'l' (lower case el) header is - specified. The Errors-To: header violates RFC 1123. - Errors-To: was only needed to take the place of the - envelope sender in the days when most Unix mailers - didn't understand about the two kinds of senders. - Don't send warning messages in response to automatically generated - messages (that is, those From:<>). - CONFIG: fix some rather stupid typos in the mailertable code - pointed out by Motonori Nakamura of Kyoto University. - CONFIG: add confUSE_ERRORS_TO configuration option. - CONFIG: if ALWAYS_ADD_DOMAIN is selected, try to use $M - (masquerade name) instead of $j. - CONFIG: don't add dots to relay names (added in 6.29); it breaks - several things, and can be simulated by dot terminating - the names of relays. For example, use: - DBbit.net.relay. - (note the trailing dot). - -6.63/6.32 93/06/01 - Fix prototypes to eliminate chars in argument lists -- some - compilers are pissy about this. - Log protocol ($r) and body type if set so we can determine if - the adaptive algorithms are working. - Pessimize on locking of database files (particularly for NEWDB - databases) during opens. There were problems with - processes opening the file while it was rebuilt; since - NEWDB caches heavily, the reader opened an empty file, - which is an error. If your system has the ability to - lock atomically on open, this works properly; otherwise, - there are race conditions. - Check mod time on .pag file instead of .dir in NDBM aliases - because the .dir file doesn't get updated for small - alias files. From John Gardiner Myers of CMU. - More Solaris portability -- it now compiles on Solaris, but - hangs up in gethostbyname(). - Move setting of RES_DEBUG flag before first myhostname() call - so we can see name server traffic on that call. - Fsync() queue files. - Fix a problem that causes -bi to try to rebuild maps other than - the alias file(s). - Fix a problem that caused udb to reject entries from any but - the first database listed. - Rearrange doc subdirectory for 4.4BSD release tape. - CONFIG: put $r into the Received line. This was an oversight. - CONFIG: fix typo (call to ruleset 99 should have been ruleset 90). - CONFIG: move "auxiliary" subroutines to be in ruleset 90-99 - range -- in the long run, single digit rulesets may - become reserved for builtin use by sendmail. - CONFIG: fix major problem that causes host aliases (that is, - anything in $=w != $j) to not be recognized. This has - been around since 6.30. - -6.62/6.31 93/05/28 - BETA RELEASE - Fix recursive syserr (if there is an error printing a syserr - message). This makes the code much less eager to consider - a write error as serious. This also includes some - heuristics to be clever about closed connections. - Lock NEWDB files during gets. This requires version 1.5 or later - of the db library. If you have an older version, you - can use -DOLD_NEWDB. This will go away in a few weeks. - Fix problem causing aliases that use host maps to get overwritten. - Do appropriate byte swapping on port numbers in ident protocol - code. Fix from Allan Johannesen of WPI. - Defer opening of map files to the same time as alias files so that - the daemon will tend to pick up new versions more promptly. - Prototype a bunch more functions. - Some Solaris 2.1 changes (still doesn't link though). - Try to simplify Makefiles by including more subordinate #defines - in conf.h (based on OS type). - CONFIG: check for domains if FEATURE(mailertable) is defined. - For example, if the host name is "knecht.cs.berkeley.edu" - it will search the following mailertable keys: - knecht.cs.berkeley.edu - .cs.berkeley.edu - .berkeley.edu - .edu - This could be used to replace the special relays for bitnet - and similar nets. - -6.61/6.30 93/05/24 - Fix problem that prevented appending dots on canonified host - names. This breaks tons of config files -- very - important fix. - Fix improper pointer dereference in response to HELO command. - Fix core dump if debugging set in map_rewrite. - CONFIG: add FEATURE(always_add_domain) to always attach the - local domain (only impacts local mail). - CONFIG: try to avoid turning names into $j -- although - technically a host can only have one "canonical name", - it seems to be common practice to have several. - -6.60/6.29 93/05/22 - Major change: merge alias databases with maps. This expands and - changes the map class interface but fixes a bunch of bugs. - The important user-visible change is that the file name - in a K line now does not include the ".db" extension; this - is added automatically. Also, the -d (NIS domain) flag is - missing from the K config line; use @domain instead. - When compiling, the *_MAP names are gone -- just compile - in NDBM, NEWDB, and/or NIS support. - Announce mailer/host/user triple on -bv flag -- from Brian - Bullen of Stirling University. - Don't send more than one line in response to HELO -- it confuses - Pony Express, which then behaves very badly. However, - this change does send two line 220 greetings, with the - second line reading "ESMTP spoken here". The usersmtp - module recognizes this and goes into ESMTP mode regardless - of the setting of the "a" mailer flag. Thus, "a" means - "always try EHLO". - AIX portability changes (thanks to Christophe Wolfhugel of - Herve Schauer Consultants (Paris) for providing me with - an INSA account for this purpose). Lightly tested. Use - -D_AIX3. This probably breaks compatibility with some - older systems (e.g., 4.2bsd) but still works on SunOS - 4.1.2, Ultrix 4.2A, HP-UX 8.07, OSF/1 T1.3, and AIX 3.2.3. - Fix a problem causing an error message loop if the output channel - is hosed. - Add the Makefiles that I use for various environments -- some are - Berkeley make versions and some are old make versions. - My makefile for the NeXT box has gotten lost, alas! - PRALIASES: support for printing NEWDB databases. From - Michael J. Corrigan of U.C. San Diego. - CONFIG: don't pass pseudo-domains to $[ ... $] (if you have - a wildcard MX it can have weird results). From - Christophe Wolfhugel. - CONFIG: dot terminate relay hostnames in S0. From Christophe - Wolfhugel. - -6.59/6.28 93/05/13 - Log version with SMTP daemon startup message. - Adjust setproctitle to work on NetBSD and BSD/386. - Fix null pointer reference in MX fallback code. - A bunch of minor fixes from Eric Wassenaar: - If deliver cannot execv the mailer, return EX_OSERR - instead of EX_TEMPFAIL (to give better - error messages). - Consistently malloc e_message. - Catch degenerate case of calling returntosender() - with an empty returnq. - MIME reformatting. - -6.58/6.28 93/05/13 - Fix bug that can cause incorrect verbose display of user smtp - messages. - Disable SMTP VERB command if PRIV_NOEXPN is set (since this - could reveal the same information. - Allow failure when reading SMTP greeting message to go on to - next MX host. - Add "MIME-Version: 1.0" header if using MIME (this was NOT - included in RFC 1344, but Bill King of Allan-Bradley - Company forwarded me email from Nathaniel Borenstein - claiming that it was an inadvertent omission). - Don't use Content-Type: X-message-header. According to John - Myers of CMU, many MIME readers will completely ignore - the data if they don't recognize it. Instead, just - add a blank line to make it a legal (empty) message. - Fix problem causing dots to keep getting appended to cached - hostnames. This can cause buffer overrun conditions. - The problem was found by Erik Forsberg of Retix, - although I used a different bug fix than he provided. - Fix parsing of split header/envelope rewriting specs -- from - Eric Forsberg. - Fix from Eric Wassenaar to correct To: lists in error messages. - -6.57/6.28 93/05/11 - Fix minor glitch causing extra ctladdrs to be output to queue - file. Just an annoyance. - Cache results of name server canonification lookups to avoid - backed up queue runs. - Major rewrite of alias.c: considerable cleanup, plus sample - (untested) support for NIS aliases. The "A" option - can now be a comma separated list (or be repeated) -- - that is, you can have multiple alias databases. Each - database can have the syntax ``class:file''; if no class - is specified, the "implicit" class is assumed. Implicit - searches through a list of compiled in types -- hash, - dbm, nis, and stab. Alias files are searched in the - order they are listed. For example: - OAhash:/etc/aliases.local,/etc/aliases - OAnis:mail.aliases@my.nis.domain - first searches the hash database /etc/aliases.local, - then the regular /etc/aliases database, then the NIS - map "mail.aliases" in the NIS domain "my.nis.domain". - If in Verbose mode (probably from VERB command) run SMTP job - in foreground and don't do RCPT optimizations. - Add udb :mailsender as equivalent to owner- for regular aliases. - Delete option 8; add option 7 that means the opposite. That is, - default to 8-bit mode; a special option is needed to - force sendmail into 7 bit mode. - Send error messages in encapsulated MIME format. - New compile flag "NIS" that turns on NIS alias and NIS map - support. - Add "j" option to send error messages in MIME (RFC 1341) - encapsulated message format per RFC 1344. The - syntax is pretty ugly if you don't have MIME-aware - user agents. - Clean up message handling (for display in mailq output). - New setproctitle implementation for 4.4bsd. - Create files (such as ~/dead.letter) using mode FileMode (the - F option value) instead of 0666. - Fix bug causing output of EXPN command to not be fully qualified. - This may cause some problems with UUCP addresses that - will require some config file assistance -- specifically, - the $: part has to include the host name for this output - to make sense. - Fix a problem that sometimes diagnosed errors and still sent the - message if the header syntax was bad. - Fix a bug that caused an error message to be emailed when sendmail - was operating in -bv mode. - Add "ListenQueueSize" keyword to daemon options option (OO) to - set the queue size parameter passed to listen(). You - will normally have to tweak your kernel to up this. - Strip spaces off of beginning of message-id before logging (in - case it was folded across lines). - Tweak compile flags in daemon.c -- there were some cases where - it wouldn't work without NETINET. - Change *file* mailer to output all the usual default headers - (From, Date, Message-Id). It gets used when sending - back error messages. - CONFIG: explicitly catch and diagnose list:; syntax in ruleset - zero -- this is not a valid recipient syntax according - to RFC 821. - CONFIG: add confMIME_FORMAT_ERRORS to send error messages in - MIME format. Defaults to on. - CONFIG: add SMTP_MAILER_FLAGS and UUCP_MAILER_FLAGS to augment - the flags for those mailers. - -6.56/6.27 93/05/01 - Fix problem that causes the fallback mail to postmaster - (case ESM_POSTMASTER in savemail()) to not look at - aliases (ugh). - Some more HPUX tweaking (compile flag hpux => __hpux so it - still works in ANSI mode). - Don't try to flock non-regular files when mailing to a file. - In particular, this was a problem if you tried to - send to /dev/null. - Fix a weird bug that can cause senders to be queued as - recipients if the name server is down when the mail - is initially sent. This hack just ignores sender - deletion (essentially, it sets the MeToo flag) if there - is a TEMPFAIL during processing of the sender address. - Obscure. - Fix a dangling else problem -- from Brian Bullen from University - of Stirling, UK. - Add the "b" mailer flag to force a blank line on the end of - messages. Some brilliant versions of /bin/mail insist - on this but do not add it themselves. - Add the "g" mailer flag to prevent user SMTP from sending - "MAIL From:<>". This is only intended to be a - transitional gesture, and should not be used if at - all possible. It appears that Berkeley and IDA - config files have always handled this properly; the - UK config kit apparently does not. - Don't lowercase and then capitalize header field names -- leave - them with original capitalization. Fixes from Bill - King of Allen-Bradley Company. - Further cleanup and improved reporting of error messages, - particularly conditions that cause messages to be - requeued for future delivery. - Tweak syslog priorities in some cases. - CONFIG: clean up route-addr on UUCP addresses. - -6.55/6.25 93/04/27 - HPUX 8.07 compatibility changes in getla() -- I had to make - these changes to get it to work at Berkeley, although - others seem to have been working before (???). - Various patches to XLA code. - Fix problem that causes setuid bit on files to be ignored from - SMTP or in queue runs. Problem noted by Jason Ornstein - of Under The Wire, Inc. - Fix problem that can cause CNAMEs to be ignored. - Generalize getmxrr to match local host in $=w instead of a - single name passed in. - Some cleanup from Eric Wassenaar: - Use FileMailer instead of ProgMailer in two places. - Eliminate duplicate 8th-bit stripping in commaize. - Fix a problem with mis-parsing of backslash escapes - under some circumstances. - NIS map fix (was always including trailing null character) - from Mike Glendinning of Ingres UK. - Add "a" mailer flag to try using ESMTP. It tries the EHLO - command and if that fails falls back to regular SMTP. - Also parses EHLO option keywords. If host supports - SIZE extension, this is added to the MAIL FROM: - command. - Extend "b" option to include a second value which is the - maximum message size this server is willing to accept. - For example, a value of "10/1000000" says that there - must be ten blocks free, and sendmail will reject - any message larger than one megabyte. - Some portability hooks for NeXT (this could be applicable - to Mach in general). You have to create an empty - file called "unistd.h" to get it to compile. - Adjust config values (MAXLINE, MAXATOM, and PSBUFSIZE) to - be more generous. - Add X400-Received: to the list of headers tagged with H_TRACE - in conf.c. From Bill King, Allen-Bradley Co. - -6.54/6.25 93/04/19 - Fix problem that caused redefinition of SMTP and QUEUE compile - flags. Pointed out by Jon Forrest of the Sequoia 2000 - project at Berkeley. - Properly handle \! hack -- it was treating host\!user as one - token (host!user) instead of three (host, !, user). - Fix from Eric Wassenaar of NIKHEF-H. - Fix compilation problem in getauthinfo() if IDENTPROTO is off. - Turn off DEFNAMES and DNSRCH when getting the hostsignature - (i.e., MX records) in level 1 configuration files; this - matches the old behavior. From Motonori Nakamura of - Kyoto University. - Improve error message printing -- if sent through an alias, - error messages include the name of the alias in the - message. Unfortunately, in order to make this work - properly in queue runs, this changes the format of the - C line in the qf file. The relatively uselessness of - the previous information was pointed out to me by - Allan E Johannesen of WPI. - Add XLA compile flag to add hooks to Christophe Wolfhugel's - extended load average code. This is still in very early - form. For information regarding the guts of the xla - code, contact Christophe.Wolfhugel@grasp.insa-lyon.fr. - Additional hooks for detecting tempfails in rewriting rules - (that is, in map lookups). - -6.53/6.25 93/04/15 - Properly diagnose ruleset zero returning null (instead of a mailer - triple). From Motonori Nakamura of Kyoto University. - More generalization of socket code for other protocols. - Shorten timeouts on reverse name lookups -- since they are done - during connection establishment, long timeouts here can - cause higher level timeouts. This mainly serves to accept - mail from hosts that do not have proper reverse (PTR) DNS - records set up. - Reset e_statmsg before each mailer invocation to avoid bogus - messages in the log. - Redefine $r, $s, and $_ in error envelopes so you don't get - incorrect cruft in the error message. Problem noted by - Motonori Nakamura of Kyoto University. - Fix a problem that can cause failure to return errors to Postmaster - in certain cases. From Motonori Nakamura. - Fix a problem that can cause some systems to give duplicate error - messages when a bad syntax address such as "<a" is presented - to an SMTP server. It doesn't seem to occur on all - machines. From Motonori Nakamura. - Default IDENTPROTO off for Ultrix and HPUX, which apparently have - the interesting "feature" that when they receive a "Host - unreachable" message they closes all open connections to - that host. However, some firewall gateways send this message - if you try to connect to an unauthorized port, such as the - IDENT port (113). Thus, no email can be received from such - hosts. There is some evidence that versions of Ultrix before - 4.3 do not have this problem. Thanks to Tom Ivar Helbekkmo - for pointing out this behavior to me and to Michael Corrigan - of U.C. San Diego for informing me about the HPUX problem. - Allow IPC mailers to return a colon-separated list of hosts in the - $@ clause; these are searched in order as though they were - MX records. - When sending an error report, print the list of addresses tagged - as bad. Requested by Allan E Johannesen of WPI. - Change map function calls to return a status code. This gets - passed back as the result of rewrite. Parseaddr marks - the address as a QUEUEUP address if the return code is - EX_TEMPFAIL. All this to queue properly if the name - server is down. This code is not well tested. This code - changes the interface to map lookup functions (a fifth - parameter, int *statp, is added). Feature requested by - Dan Oscarsson. - Don't delete quotes (in the dequote map) if there are spaces in - the string, since this would cause them to be replaced by - the SpaceSub character. - Accept BODY=8BITMIME on SMTP MAIL command. This isn't advertised - because the 8BIT to 7BIT translation doesn't exist yet. - This does add a "bodytype" field to both envelope and - queue file and a -B command line flag to pass the type in - during direct invocations. - Discard return error messages only on responses to responses to - responses, not on responses to responses. That is, the - algorithm is to try return to sender, then return to - postmaster, then discard. Previously it discarded - immediately if the return to sender pass failed. - CONFIG: back out change to hide unqualified hostnames behind %-hack. - This screws up local aliases and .forward files. - CONFIG: add FEATURE(nocanonify) to turn off calls to $[ ... $]; - some sites only handle completely canonified names. - Requested by John Gardiner Myers of CMU. - CONFIG: some UUCP code was still included even if FEATURE(nouucp) - was specified. - -6.52/6.24 93/04/10 - Clean up some minor glitches on error return messages pointed out - by Motonori Nakamura of Kyoto University. - Fix reply() to not reset SmtpReplyBuffer on fatal errors; this - was supposed to reset SmtpMsg Buffer. This makes the - client side code virtually useless. Reported by Allan - E Johannesen of WPI and Phil Brandenberger of Swarthmore. - Better debug messages if fuzzy is disabled, suggested by Allan - E Johannesen of WPI. - Offset SmtpReplyBuffer by four in usersmtp when checking for - loopback. From Eric Wassenaar. - Don't set $s until after runinchild in srvrsmtp -- otherwise - it gets cleared. From Eric Wassenaar. - Implement IDA-style $&x for deferred macro expansion. - More POSIX compatibility. - CONFIG: Hide unqualified hostnames behind %-hack using $s as the - actual sender. This is only done if $r is non-null, that - is, if this is not locally submitted mail. - CONFIG: Add FEATURE(bitdomain) allowing mapping of BITNET host - names to internet domains. A program contributed by - John Gardiner Myers of CMU to create the maps is included - in the contrib directory (in the "misc" tar file). - CONFIG: Add FEATURE(uucpdomain) for a similar mapping for UUCP - hosts. There is currently no tool to create this map. - -6.51/6.23 93/04/04 - Add D= mailer flag to specify a path of possible working directories - in which to execute the mailer. This is intended for the - prog mailer; some shells can get upset if they don't have - access to the current directory. - Add RFC 1413 (IDENT) protocol support. This is only very loosely - tested. This adds a $_ macro to be the authenticated - info (in ``user@domain [address]'' form) and debug flag - 9 to trace the protocol. - Check for loopbacks in usersmtp instead of srvrsmtp -- there is no - reason for a local agent to not be talking to the localhost - (although the inverse is not true). - Add a few hooks for automated map rebuilding. This is certainly - not done yet. - CONFIG: Have prog mailer specify a path of ``D=$z:/'' -- that is, - user's home directory then the root. - CONFIG: Log RFC 1413 identification in Received: line. - -6.50/6.22 93/04/01 - Fixes to requeueing code to make it compute priority, nrcpts, - and the like properly. - -6.49/6.22 93/04/01 - Diagnose incorrect privacy flags. Suggested by Bryan Costales - of ICSI. - Some ANSI C fixes. - Arrange to quote backslashes as well as other special characters - in the phrase part of a route-addr. - Some fixes to FallBackMX code suggested by Motonori Nakamura of - Kyoto University. - More vigorous zeroing of CurHostAddr to avoid logging of bogus - host addresses when you are actually just printing - information from the MCI structure; problem noted by - Michael Corrigan of U.C. San Diego. - Don't ignore rest of queue if any job is not runnable. This can - also cause an incorrect job to be lost. Fix from - Eric Wassenaar. - Always respond "quickly" to RCPT command; do alias expansion and - the like later. This also means that mail for lists that - have errors will be accepted, and an error sent back - later. This is done by instantiating the queue file - and then immediately running and requeueing it. - -6.48/6.22 93/03/30 - Fix incorrect diagnosis of infinite loop in ruleset. Problem noted - by several people. - Improve information printed when infinite loops are discovered. - Zero CurHostAddr to fix erroneous internet addresses in log when no - addresses can be bound. Pointed out by Motonori Nakamura - of Kyoto University. - "Probe" SMTP connections using RSET instead of NOOP "just in case". - Suggested by John Gardiner Myers of CMU. - Don't warn about -f if you are setting sender to yourself. - -6.47/6.22 93/03/29 - Fix incompatible call to endmailer in smtpquit which causes core - dumps. Noted by Allan E Johannesen of WPI. - HPUX portability changes from Michael J. Corrigan of UC San Diego. - Require MAIL before RCPT command in srvrsmtp.c. This had been - intentional from the 821 draft days when the order wasn't - clear, but is silly now. - Fix bug in nis_magic routine that was initializing parameters - incorrectly. Fix from Takahiro Kanbe of Fuji Xerox - Information Systems Co., Ltd. - Change default for PrivacyFlags in conf.c to 0 -- since it always - "or"s in new values, there was no way to turn off the - AuthWarning stuff. - Add O option to set SMTP daemon options. - Add V option to set fallback MX host. This always sorts at lower - priority than anything it gets from the name server. It - should only be used for environments with very bad network - connectivity. Requested by several people. - Log sending info. It's not clear this is a good idea. - CONFIG: fix typo in mailertable code. Noted by Phil Brandenberger - of Swarthmore. - CONFIG: add confDAEMON_OPTIONS and confFALLBACK_MX to set options - O and V, respectively. - -6.46/6.21 93/03/26 - Fix botch in server SMTP that broke transactions that did not - use HELO first (like MH). Fix from Michael Corrigan - of U.C. San Diego. - Fall back to other MX records if there is an error anywhere - in delivery (actually on MAIL or DATA -- RCPT is harder). - Suggested by John Gardiner Myers and Motonori Nakamura. - Revert to non-prototypes -- it turns out that our ANSI C - compiler is more forgiving than most others about - mixing prototyped extern declarations with non-prototyped - function definitions. - Fix a problem with multi-word class matching pointed out by - Neil Rickert. Given: - CX b a.b.c - R$+ $=X $+ $: $1 < $2 > $3 - the input "user@a.b.c" failed instead of being properly - rewritten as "user@a.<b>.c". - Neil also convinced me that it was correct that $~ should match - only one token -- the problem is that it's always possible - to add another token, so $~ matches far too eagerly. - -6.45/6.21 93/03/25 - Implement multi-word classes (properly!). - -6.44/6.21 93/03/25 - Add X-Authentication-Warning: headers to clue users into possible - attempts to forge mail. This is on the authwarnings - privacy flag, but is the default. Suggested by Bryan - Costales of ICSI. - Pass default units for convtime in so they can be more reasonable. - Allow config files to always add a new Comments: header (i.e., - they will be added even if an old one already exists). - Suggested by Bryan Costales of ICSI. - Allow config files to delete an existing Return-Path: header. - These should only be added at final delivery. Suggested - by Bryan Costales of ICSI. - Some debugging additions. Suggested by Bryan Costales of ICSI. - Clean up logging of Family 0 addresses. Noted by David Muir - Sharnoff and others. - Add a "dequote" map class. This allows config files to strip - quotes off of addresses. Note that this is not a builtin - map, just a class -- so you have to define the map - using the K line. - Fix a bug in the queueup() loop getting a locked tf where in - very odd cases it can fall off the bottom and core dump. - Of course, it was P{r Emanuelsson who found it.... - Open a new transcript when splitting an envelope. Problem found - by Allan E Johannesen of WPI. - Improved error output in endmailer if the mailer core dumps. - CONFIG: Fix typo in UUCP mailer definition. - CONFIG: Default several of the new options on: eight bit input, - privacy flags set to "authwarnings", and message warning - set to 4h. - CONFIG: Use dequote map. - -6.43/6.20 93/03/23 - Fix problem with assumption of an sa_len field in a generic - sockaddr -- it turns out that most vendors haven't - picked up this (very important) fix. - Change compilation flags for daemon code -- select one or both - of NETINET or NETISO, but don't ever set DAEMON manually. - CONFIG: add FEATURE(mailertable) to do IDA-style mailertables. - -6.42/6.19 93/03/19 - Use Postmaster as default fallback return address, not root. - POSIX changes for file descriptor handling. - Diagnose errors writing new queue file. - If you change the owner using an owner- alias, also change the - error mode to EM_MAIL so that errors don't get dropped - into an inappropriate directory. Problem noted by - Allan E Johannesen of WPI. - If you are su'ed to root, send email as who you really are, not - as root. From Brian Kantor of U.C. San Diego. - Allow warning messages to be sent after a configurable interval - has passed without delivery. The message is sent only - once per envelope. This changes the format of the qf - file to have an F line, and the format of the T option - to accept take the format "return/warn" (both intervals). - Don't force all local names to lower case -- this was left over - from the weird handling of case mapping on aliases. It - is now driven (as expected) by the "u" mailer flag. - Problem noted by P{r Emanuelsson. - Fix problem that caused headers on returned email to be trashed; - they were getting freed, but are still accessible via - BlankEnvelope. - Fix problem that caused bogus ids to be created on returned - mail. - Add support for ISO and other non-INET networking. This is by - no means finished yet. This does assume a lot of other - system support, like a version of gethostbyname that - returns non-AF_INET addresses. - CONFIG: change default on prog mailer to keep upper case in - user names (i.e., in the program command line). - CONFIG: strip trailing dots off of hosts in uucp mailer before - convert to bang format. - CONFIG: create new "relay" mailer for $R (LOCAL_RELAY) and $H - (MAIL_HUB) delivery that doesn't add local domain. Note - that this violates 821, but is probably "more correct" - for what we are trying to do. Problem pointed out by - Michael Graff of Iowa State. - -6.41/6.18 93/03/18 - Clean up unnecessary creates of queue ids (i.e., empty qf files) - when not needed, such as when starting up an SMTP - connection. - Fix problem where split envelopes aren't instantiated in the queue. - This is quite a serious bug. - Owner- aliases had problems with leading spaces causing a - premature delimitation. - -6.40/6.18 93/03/18 - Have ending 250 (after DATA) include the id; suggested by - Brian Kantor of UC San Diego. - Add logging on envelope splitting. - Change queue ids to have one more letter encoding the hour of - the day so that during a single day there is a greater - likelihood of uniqueness; requested by Brian Kantor. - -6.39/6.18 93/03/18 - Fix minor compile problem if LOCKF is defined. - Define size of tobuf in conf.h. Observed by Toshinari Takahashi - of Toshiba. - Restore e_sender -- this is equivalent to e_from.q_paddr without - decorations such as angle brackets and comments. - OSF/1 on Alpha changes from Allan E Johannesen of WPI. - CONFIG: fix typo in S3 for list syntax (;: => :;). Thanks to - Christopher Hoover for noting the problem. - -6.38/6.17 93/03/17 - Pass envelope to disconnect to avoid another use of CurEnv, which - can apparently end up being null at inopportune times. - Log "received from" as "relay=" for consistency (suggested by - John Gardiner Myers). - Fix major bug in header handling: if no From: line existed in - the header (so sendmail inserts one), and the sender is - an alias that has an owner, the From: line shows the - owner (as well as the envelope). Fixed by early binding - the headers (which will change debugging output). - HPUX portability patches from Michael J. Corrigan of UC San Diego. - Some attempts to adapt better to out of open file conditions. - Some changes to ctladdr handling in queue files. - -6.37/6.17 93/03/16 - MAJOR CHANGE: delete e_sender and e_returnpath (why are these - different from e_from?) and $< macro. - Log correct IP address in relay= field even if the connection - times out. - Log "received from [RESPONSE]" on EF_RESPONSE messages (from - John Gardiner Myers). - Fixes to SysExMsg logging (sometimes just got "message: %s" - instead of "message: error message"), noted by Eric - Wassenaar. Also reported by Motonori Nakamura. - Improvements to MX piggybacking code, from Motonori Nakamura. - Fix case where CurHostName points to an auto variable that has - been deallocated (from Motonori Nakamura). - Fix bug causing newlines to be included in aliases if option - "n" (check alias RHS) is set; bug noted by David Muir - Sharnoff. - Fix problem causing user names that should be mapped to lower - case to not be mapped if they are sent during a queue - run. This greatly simplifies the case mapping code. - Problem noted by Allan E Johannesen of WPI. - Don't do recipient address rewriting in buildaddr. This - improperly did recipient rewriting on sender addresses, - and just seems bogus in general -- but the change could - break some .cf files. - Pass TZ envariable to child processes for System V. - CONFIG: allow LOCAL_RULE_1 and LOCAL_RULE_2 if you want to - define those rulesets. - KNOWN PROBLEM: I have seen some problems on SunOS that causes - the User Data Base to give errors on some addresses. I - have tracked the problem back at least as far as 93.02.15 - (version 6.22). Running with debugging on makes it - go away, so I conclude that it is referencing uninitialized - stack data. I haven't been able to track this down yet. - -6.36/6.16 93/03/08 - Allow local mailer to specify $@host -- this lets you assign the - "foo" part of jgm+foo to $h for passing in to the local - mailer. - Additional debug printing in getcanonname (show query type). - Don't add the e_fromdomain on sender addresses -- this interacts - weirdly with the owner- code. - Improve delivery logging to not log obvious or meaningless stuff. - Include numeric IP address in Received: lines per RFC 1123 section - 5.2.8. - Fixed a bug in checking stat() return value if restrictmailq is - set. Also, check the entire group set instead of just the - primary group. Both from John Gardiner Myers. - Don't have usrerr automatically print errno, since this is often - misleading. - Use transienterror() in makeconnection after connect() fails and - in openmailer after execve() fails (from Eric Wassenaar). - Also moved transienterror() from util.c to conf.c. - Clean up from= logging on response messages. - Undo patch allowing prescan to return a null vector -- it breaks - too many things. - Config: FEATURE(notsticky) lets you use UDB for everything coming - in to the machine, even if it is specifically targetted - to this machine. Without it, UDB is bypassed if the user - name is fully qualified. - Config: fix another minor botch with <> (local mailer wasn't - mapping them properly). - -6.35/6.15 93/03/05 - Fix getrealhostname to return null if sinlen <= 0 -- this can - occur if stdin is a pipe. - Avoid infinite loop in getcanonname if name server return - NO_DATA (for example). - Config: avoid having C flag qualify list syntax and error syntax. - -6.34/6.14 93/03/05 - Fix logging in deliver to not pass too many parameters to Ultrix - versions of syslog. - Don't write the pid file until after the daemon has actually - opened and conditioned the connection. - Consider addresses "different" if their q_uids differ (so that - two users forwarding to the same program will be seen - as different, rather than the same). - Fix problem with bad parameters in main() -- they set ExitStat - but don't exit. - Fix null pointer references through RealHostName -- painfully - discovered by Allan E Johannesen of WPI. - Fix bug causing user@@localhost to core dump (yuch). - Config: don't put two @host.dom.ain on users in $=E in SMTP - mailer. Also, catch user@ (no host) in ruleset 0. - -6.33/6.13 93/03/03 - Config: add confCW_FILE as the name of the cw configuration file - (defaults to /etc/sendmail.cw). From P{r Emanuelsson. - Allow prescan to return a pointer to an empty list -- this is - not an error. Also, clean up error reporting to avoid - double errors (prescan reports once, then the caller - reports again). - Changes to avoid trusting T_ANY queries -- run them, but if you - don't get the info you expected, do T_A and T_MX queries - anyhow. This also fixes an oversight where _res.options - bits were being ignored. - If PRIV_NOVRFY is set, use 252 response code instead of 502 per - RFC 1123 section 5.2.3. It's not 100% clear that this - is correct, but it probably works better with stupid - mailers that do a VRFY and only check the first digit. - -6.32/6.12 93/03/02 - Fix uninitialized variable "protocol" in smtp code. - Include <unistd.h> in sendmail.h -- move towards POSIX/ANSI. - Additional hooks for RFC 1427 (ESMTP SIZE extension). This - includes requiring that enoughspace() know the system - block size, which will undoubtedly break most ports. - Trace flag 19 in use for srvrsmtp.c. - Additional logging -- notably the sending mailer name. This - also changes the delivery logging to strict field=value - syntax. - Fix some problems with messages getting sent even to addresses - that had been marked bad -- from Eric Wassenaar. - More WIDE changes: accept host name inside [...] as non-MXed - host. This is intended ONLY for use inside firewalled - environments, where the MX points at the gateway. - Change .cf file conventions so that mapping for <> addresses - don't have an @ in them (to avoid confusing the C mailer - flag). Pointed out by Neil Rickert. - Config extensions for Sam Leffler's FlexFAX software. - -6.31/6.10 93/02/28 - Fix some more bugs in alias owner code -- there were some weird - cases where an error in a non-aliased name would override - the return info in an aliased name with an owner. - Changes from WIDE Project, forwarded to me by Motonori Nakamura: - Log actual delivery host (after MX et al); from - yasuhiro@dcl.co.jp. - Log daemon startup. - Deliver Postmaster copies without a body. - Better logging of SMTP senders. - Send all program email as daemon even when local. - As requested in various forms from many people, accept -qIstring - to limit queue runs to jobs with queue-id matching string. - Similarly for -qRstring for recipients, -qSstring for - senders. - Initial hooks for ESMTP support (see RFC 1425). - Fixed a syntax error in the UUCP mailer specification that caused - core dumps on startup. - Check for missing A= or P= arguments in mailer definitions. - -6.30/6.10 93/02/27 - Require FROZENCONFIG compilation flag to include frozen - configuration code. Frozen configuration is really - not a very good idea any more, particularly in shared - library environments. - Do better checking of errno after opens of :include: and .forward - files to defer delivery on network and other transient - errors. Suggestion from Craig Everhart. - Fix minor botch in read timeout macro processing. - Add FEATURE(nouucp) to config files for sites that know absolutely - nothing about UUCP. - Add built cf files to distribution tape and clarify how to build - them if you don't have the Berkeley make. - Some sizeof(long) portability changes for the Alpha, from Allan - E Johannesen. - Add "restrictmailq" privacy flag -- if set, only people in the same - group as your queue directory can print the queue. If you - set this, be sure you also restrict access to log files.... - Fix another bug in owner-list stuff that can cause data files to - be "lost". - Fix a bug with queue runs that cause forwards to yourself to go - into alias/forwarding loops. I'm still iffy about this - fix. - Fix from Eric Wassenaar for suppression of return message code. - -6.29/6.9 93/02/24 - Fix yet another problem in alias owner code -- put the wrong return - address on the enclosed return-to-sender letter. - -6.28/6.9 93/02/24 - Fix botch in alias owner code that caused it to not operate if the - error was detected locally. - -6.27/6.9 93/02/24 - M_LOCAL => M_LOCALMAILER to avoid conflict with Ultrix include - file <sys/mount.h>. - Miscellaneous bug fixes from Eric Wassenaar: - sendmail -bv -t logs the from line even though in verify - mode only. - sendmail -v can go into queue mode if shouldqueue returns - TRUE. - Add route-addr pruning per RFC 1123 section 5.3.3. This can be - disabled using the "R" option. - Delete (always undocumented) -R flag (save original recipients); - there are ways to syslog(3) these now. - Clean up SMTP reply codes -- specify them as needed in the code, - instead of in conf.c -- this was needed during the NCP to - TCP transition, but seems silly now. This also changes - parameters to message and nmessage. - Have mailstats read the .cf file to find the sendmail.st file and - get text versions of mailer names. An initial version of - this code was provided by Tuominen Keijo (although the - comments indicate the good bits were written by "E.V."). - Add yet more System V compatibility hacks. - Fix bug in VRFY code (assumes everything must be a local user). - Allow specification of any of the hard-wired pathnames in the - Makefile. - Delete concept of "trusted users" -- this really didn't provide - any security anyway, and caused some problems. - Delete last vestige of support for the word "at" as an equivalent - to the character "@". - Propagate owner-foo alias information into the envelope sender. - Based on code from John Gardiner Myers. This is a major - semantic change -- beware! - Allow $@ on LHS to indicate "match zero" -- this is used to match - the null expression. - -6.26/6.8 93/02/21 - Don't "lose" queue runs. Very important fix from (who else?) - Eric Wassenaar. - Completely reset state on RSET command -- from Eric Wassenaar. - Send error messages and return receipts using an envelope sender - of <> regardless of the setting of $n. Rewriting rules - can undo this if they feel the necessity, as might be - needed for networks that don't understand the syntax. - This is permitted by RFC 821 section 3.6 and required by - RFC 1123 section 5.3.3. THIS REQUIRES VERSION 4 CONFIG - FILES because the rulesets must be able to parse <> - properly. - Don't ever send error messages to "<>" -- they will get sent to - the local postmaster or dumped in /usr/tmp/dead.letter - instead. Per RFC 1123 section 5.3.3. - Explicitly check for email to yourself as a dotted quad. You - have to call $[ [ ... ] $] to get this. - Up the message timeout to five days per RFC 1123 section 5.3.1.1. - Make all read timeouts individually configurable, as strongly - recommended by RFC 1123 section 5.3.2. - Use f_bavail (blocks available to regular users) instead of f_bfree - (blocks available to superuser) in free block checks. - Change $d macro to be the current time, not the origination time, - since this is consistent with how it is used now. - Generalization of enoughspace from Eric Wassenaar covering - SGI, Apollo, HPUX, Ultrix, and SunOS. - Ignore process group signals -- some front ends can do this if - you kill a window too quickly. From Eric Wassenaar. - Change umask to 022. - -6.25/6.8 93/02/20 - Close all cached connections before calling mailers and after - forking for delivery (caused double closes which resulted - in false errors). - Add FEATURE(redirect) in config files -- this allows you to alias - old addresses to a pointer to the new address that will - give a 551 error message, but not deliver the mail. - Some code changes to make the 551 errors look pretty. - Names of M4 program paths in config files have changed -- they - are all XXX_MAILER_PATH now, to match XXX_MAILER_FLAGS. - Fix a bug in the QSELFREF code having to do with empty .forward - files, reported by Eric Wassenaar. - Add option "p" (privacy flags); this allows you to tune how - picky the SMTP server will be. This also adds the - confPRIVACY_FLAGS M4 macro in the config files. - Add option "b" (minimum blocks free). If there are fewer than - this number of blocks free on the filesystem containing - the queue directory, the SMTP MAIL command will return - a 452 response and ask you to try again later. This - also adds the confMIN_FREE_BLOCKS M4 macro in the config - files. - Made VRFY just verify (doesn't expand aliases and .forward files); - EXPN does full expansion. RCPT in queue-only mode also - doesn't chase aliases and .forward. - -6.24/6.7 93/02/19 - Increase the number of domain search entries in domain.c to allow - for the extra "" entry indicating the root domain. - Reported by Motonori Nakamura of Kyoto U. - Add a "SMART_HOST" in the configs for UUCP-connected sites that - want to forward all mail with extra "@"s to that site. - Also allows SMART_HOST, LOCAL_RELAY, and MAIL_HUB to - be specified as ``mailer:hostname'' to use an alternate - mailer. - Clarified and updated some wording in the Operations Guide. - Add the "c" mailer flag -- this suppresses all comment parts of - addresses (requested by John Curran of NEARnet). - Have -v print prompts in -bt mode even if stdin is not a terminal - (default behavior is to be silent if not reading from - a terminal). Suggested by Bryan Costales, ICSI. - Move the metacharacters from C0 space (\001-\037) into C1 space - (\201-\237). This also fixes a bunch of potential bugs - with G1 characters (\240-\276) in headers relating to - negative numbers passed to isspace() et al. - Add YP_LAST_MODIFIED and YP_MASTER_NAME to DBM version of alias - database if YPCOMPAT is #defined. Enhancement from - Takahiro Kanbe of Fuji Xerox Information Systems Co., Ltd. - Add "list" Precedence (-30); this can be used with old sendmails - which will map to precedence 0 (which will return error - messages). Suggested by Stephen R. van den Berg. - Many bug fixes from Eric Wassenaar of the National Institute for - Nuclear and High-Energy Physics, Amsterdam: - Clear timeouts properly on open failures in include(). - Don't dereference through NULL if no home directory found. - Re-establish SIGCHLD signal on System 5 in reapchild(). - Avoid NULL pointer reference on -pFOO flag. - Properly handle backslash escapes in comments. - Correctly check reply status on SMTP NOOP command. - Properly save SMTP error message if peer gives - "Service Shutting Down" message. - Avoid writing to the transcript if it couldn't be opened. - Signal errors in SMTP children to parent properly. - Handle self references in a list more globally (include a - QSELFREF bit in the address flags). This enhancement - was suggested by Eric Wassenaar. - Use initgroups() in hpux, even though it's System-V based. The - HASINITGROUPS compile flag can set this on other systems. - This HPUX behavior was pointed out by Eric Wassenaar. - -6.23/6.6 93/02/16 - Clean up handling of LogLevel to make it easier to figure out - what's on what level. - Change log levels to have some consistency: - 1 serious system failures, security problems - 2 lost communications, protocol failures - 3 other serious failures - 4 minor errors - 5 message collection - 6 vrfy logging, creation of return-to-sender - 7 delivery failures - 8 delivery successes - 9 delivery tempfails (queue ups) - 10 database expansion - >64 debugging - Allow IDA-style separated processing on S= and R= in Mailer - definition lines. Note that rulesets 1 and 2 are - still used for both addresses as before. Bruce Lilly - gave a convincing argument that RFC976 insists on - this behavior. - Added some time zones to arpatounix -- they may not be in the - standards, but they are in use. However, I may delete - arpatounix entirely -- there appears to be no reason - for it to exist. - Change to UUCP mailer (in cf directory) to try to do a saner job. - I'm still not certain about this mailer in general. - -6.22/6.5 93/02/15 - Fix bug that prevents saving letters in ~/dead.letter. - Don't add angle brackets in VRFY command if angle brackets already - exist in the address. - Fix bogus error message in udbexpand. - Null terminate host buffers in buildaddr (broken in 6.21) -- - IMPORTANT FIX!! - -6.21/6.5 93/02/15 - Fix another incorrect error message in alias.c, found by Azuma - Okamoto. - Fix a couple of problems in the more-configurable config files, - found by Tom Ivar Helbekkmo. - Fix problem with quoted :include: entries. - Don't duplicate the filename on verbose printing of .forward and - :include: contents. - Extend size of prescan buffer (to allow bigger addresses). Also, - detect some buffer overflows. - Log user SMTP protocol errors (log level 4). - -6.20/6.4 93/02/14 - Fix another problem in the MCI state machine caused when there - were errors generated from the other end to commands - other than RCPT. - -6.19/6.4 93/02/14 - Include load average support for DEC Alpha running OSF/1. - Fix multiple-response problem with errors in MAIL From: line. - Fix SMTP reply codes for invalid address syntaxes (give 501; - never give multiple error messages for a single message). - Fix problem where a cached connection timeout rejects all - later connects to that host. - Fix incorrect error message if alias.c is compiled with DBM only. - Additional changes to fix nested conditionals (from Bruce Lilly). - Recover more gracefully from operating system failures, particularly - NULL returns from openmailer (from Noritoshi Demizu, - OMRON Corporation). - Log forward, alias, and userdb expand operations on log level 10; - concept suggested by P{r (Pell) Emanuelsson. - Changes for HPUX 8.07 compatibility. - -6.18/6.4 93/02/12 - Allow any config option to be set using an M4 define. - Change UNAME compile flag to HASUNAME for IDA compatibility - (besides, it's a better name). - Note in README that on SunOS it must be linked -Bstatic. - Fairly major change in domain.c to handle wildcard MX records - more rationally. NOTE: the "w" option (no wildcard MX - records match local domain) has been eliminated. - Fix some unset variable references pointed out by Bruce Lilly. - Fix host name in process titles when using cached connection. - -6.17/6.3 93/01/28 - Fix System 5 compatibility changes to be compatible with the rest - of the world. - -6.16/6.3 93/01/28 - Experimental fix for problem handling errors in the SMTP - protocol in conjunction with connection caching. - System 5 compatibility changes. - -6.15/6.3 93/01/26 - Fix a bug that causes local mail delivered using -odq to be - eliminated as a duplicate (because it matched the - ctladdr, now passed in as a C line). These changes - are pretty tricky...... - -6.14/6.3 93/01/25 - Add debugging for some MCI errors. - -6.13/6.3 93/01/22 - Fix -e compatibility flag to take a value. - Fix a couple of minor compilation warnings on Sun cc. - Improve error messages in a few cases to be more self-explanatory. - -6.12/6.3 93/01/21 - Fix yet-another problem with environment handling, pointed out - by Yoshitaka Tokugawa and Tom Ivar Helbekkmo. - Some heuristics to try to limit resource exhaustion problems - if a downstream host has been down for a long time. - Fix problem with incorrect host name being logged in "Connection - timed out" messages (from Tom Ivar Helbekkmo). - Fix some ANSI C problems (from Takahiro Kanbe). - Properly log message sender on returned mail during queue run. - Count number of recipients properly. - Fix a problem in yp map code. - Diagnose "message timed out" (from Motonori Nakamura). - -6.11/6.3 93/01/20 - Fix problem with address delimitor inside quotes. - Define $k and $=k to be the UUCP name (from the uname call) - based on code from Bruce Lilly. - -6.10/6.2 93/01/18 - Implement arpatounix (largely code from Bruce Lilly). - Log more info (suggested by John Myers). - Allow nested $?...$|...$. (inspired by code from Bruce Lilly of - Sony US). - POSIX compatibility (noted by Keith Bostic). - Handle SMTP MAIL command errors properly (urged by several people, - notably John Myers of CMU). - Do early diagnosis of .cf errors (notably referencing a RHS - substitution that isn't on the LHS). - Adjust checkpointing to better handle batched recipients, suggested - by John Myers. - Fix miscellaneous bugs. - (config files:) Implement MAIL_HUB for all local mail (to handle - NFS-mounted directories) as urged by Tom Ivar Helbekkmo - of the Norwegian School of Economics. - -6.9/6.1 93/01/13 - Environment handling simplification/bug fix -- child processes - get a minimal, fixed environment. This avoids different - behavior in queue runs. - Handle commas inside comments properly. - Properly limit large messages submitted in -obq mode. - -6.8/6.1 93/01/10 - Check mtime of thaw file against .cf and sendmail binary, based on - code from John Myers. - -6.7/6.1 93/01/10 - MX piggybacking, based on code from John Myers@CMU. - Allow checkcompat to return -1 to mean tempfail. - Bug fix in m_mno computation. - -6.6/6.1 93/01/09 - Tuning of queueing functions as recommended by John Gardiner Myers. - Return mail headers (no body) on messages with negative precedence. - Minor other bug fixes. - -6.5/6.1 93/01/03 - Fix botch causing queued headers to have ?XX? prefixes. - -6.4/6.1 93/01/02 - Changes to recognize special mailer types (e.g., file) early. - -6.3/6.1 93/01/01 - Pass timeouts to sfgets. - Check for control characters in addresses. - Fixed deferred error reporting. - Report duplicate aliases. - Handle mixed case recursive aliases. - Misc bug fixes. - -6.2/6.1 92/12/30 - Put return-receipt-to on a conf.c flag (but don't set it). - Fix minor syslog problem. diff --git a/cf/README b/cf/README deleted file mode 100644 index 392c36d..0000000 --- a/cf/README +++ /dev/null @@ -1,2274 +0,0 @@ - - - NEW SENDMAIL CONFIGURATION FILES - - Eric Allman <eric@Sendmail.ORG> - - @(#)README 8.186 (Berkeley) 2/3/1999 - - -This document describes the sendmail configuration files being used -at Berkeley. These use features in the new (R8) sendmail; they will -not work on other versions. - -These configuration files are probably not as general as previous -versions, and don't handle as many of the weird cases automagically. -I was able to simplify them for two reasons. First, the network -has become more consistent -- for example, at this point, everyone -on the internet is supposed to be running a name server, so hacks to -handle NIC-registered hosts can go away. Second, I assumed that a -subdomain would be running SMTP internally -- UUCP is presumed to be -a long-haul protocol. I realize that this is not universal, but it -does describe the vast majority of sites with which I am familiar, -including those outside the US. - -Of course, the downside of this is that if you do live in a weird -world, things are going to get weirder for you. I'm sorry about that, -but at the time we at Berkeley had a problem, and it seemed like the -right thing to do. - -This package requires a post-V7 version of m4; if you are running the -4.2bsd, SysV.2, or 7th Edition version, I suggest finding a friend with -a newer version. You can m4-expand on their system, then run locally. -SunOS's /usr/5bin/m4 or BSD-Net/2's m4 both work. GNU m4 version 1.1 -or later also works. Unfortunately, I'm told that the M4 on BSDI 1.0 -doesn't work -- you'll have to use a Net/2 or GNU version. GNU m4 is -available from ftp://ftp.gnu.org/pub/gnu/m4-1.4.tar.gz (check for -the latest version). EXCEPTIONS: DEC's m4 on Digital UNIX 4.x is broken -(3.x is fine). Use GNU m4 on this platform. - -IF YOU DON'T HAVE A BERKELEY MAKE, don't despair! Just run -"m4 ../m4/cf.m4 foo.mc > foo.cf" -- that should be all you need. -There is also a fairly crude (but functional) Makefile.dist that works -on the old version of make. - -To get started, you may want to look at tcpproto.mc (for TCP-only -sites), uucpproto.mc (for UUCP-only sites), and clientproto.mc (for -clusters of clients using a single mail host). Others are versions -that we use at Berkeley, although not all are in current use. For -example, ucbvax has gone away, but I've left ucbvax.mc in because -it demonstrates some interesting techniques. - -I'm not pretending that this README describes everything that these -configuration files can do; clever people can probably tweak them -to great effect. But it should get you started. - -******************************************************************* -*** BE SURE YOU CUSTOMIZE THESE FILES! They have some *** -*** Berkeley-specific assumptions built in, such as the name *** -*** of our UUCP-relay. You'll want to create your own domain *** -*** description, and use that in place of *** -*** domain/Berkeley.EDU.m4. *** -******************************************************************* - - -+--------------------------+ -| INTRODUCTION AND EXAMPLE | -+--------------------------+ - -Configuration files are contained in the subdirectory "cf", with a -suffix ".mc". They must be run through "m4" to produce a ".cf" file. -You must pre-load "cf.m4": - - m4 ${CFDIR}/m4/cf.m4 config.mc > config.cf - -where ${CFDIR} is the root of the cf directory and config.mc is the -name of your configuration file. If you are running a version of M4 -that understands the __file__ builtin (versions of GNU m4 >= 0.75 do -this, but the versions distributed with 4.4BSD and derivatives do not) -or the -I flag (ditto), then ${CFDIR} can be in an arbitrary directory. -For "traditional" versions, ${CFDIR} ***MUST*** be "..", or you MUST -use -D_CF_DIR_=/path/to/cf/dir/ -- note the trailing slash! For example: - - m4 -D_CF_DIR_=${CFDIR}/ ${CFDIR}/m4/cf.m4 config.mc > config.cf - -Let's examine a typical .mc file: - - divert(-1) - # - # Copyright (c) 1998 Sendmail, Inc. All rights reserved. - # Copyright (c) 1983 Eric P. Allman. All rights reserved. - # Copyright (c) 1988, 1993 - # The Regents of the University of California. All rights reserved. - # - # By using this file, you agree to the terms and conditions set - # forth in the LICENSE file which can be found at the top level of - # the sendmail distribution. - # - - # - # This is a Berkeley-specific configuration file for HP-UX 9.x. - # It applies only to the Computer Science Division at Berkeley, - # and should not be used elsewhere. It is provided on the sendmail - # distribution as a sample only. To create your own configuration - # file, create an appropriate domain file in ../domain, change the - # `DOMAIN' macro below to reference that file, and copy the result - # to a name of your own choosing. - # - divert(0) - -The divert(-1) will delete the crud in the resulting output file. -The copyright notice can be replaced by whatever your lawyers require; -our lawyers require the one that I've included in my files. A copyleft -is a copyright by another name. The divert(0) restores regular output. - - VERSIONID(`<SCCS or RCS version id>') - -VERSIONID is a macro that stuffs the version information into the -resulting file. We use SCCS; you could use RCS, something else, or -omit it completely. This is not the same as the version id included -in SMTP greeting messages -- this is defined in m4/version.m4. - - OSTYPE(hpux9)dnl - -You must specify an OSTYPE to properly configure things such as the -pathname of the help and status files, the flags needed for the local -mailer, and other important things. If you omit it, you will get an -error when you try to build the configuration. Look at the ostype -directory for the list of known operating system types. - - DOMAIN(CS.Berkeley.EDU)dnl - -This example is specific to the Computer Science Division at Berkeley. -You can use "DOMAIN(generic)" to get a sufficiently bland definition -that may well work for you, or you can create a customized domain -definition appropriate for your environment. - - MAILER(local) - MAILER(smtp) - -These describe the mailers used at the default CS site site. The -local mailer is always included automatically. Beware: MAILER -declarations should always be at the end of the configuration file, -and MAILER(smtp) should always precede MAILER(uucp). The general -rules are that the order should be: - - VERSIONID - OSTYPE - DOMAIN - FEATURE - local macro definitions - MAILER - LOCAL_RULESET_* - - -+----------------------------+ -| A BRIEF INTRODUCTION TO M4 | -+----------------------------+ - -Sendmail uses the M4 macro processor to ``compile'' the configuration -files. The most important thing to know is that M4 is stream-based, -that is, it doesn't understand about lines. For this reason, in some -places you may see the word ``dnl'', which stands for ``delete -through newline''; essentially, it deletes all characters starting -at the ``dnl'' up to and including the next newline character. In -most cases sendmail uses this only to avoid lots of unnecessary -blank lines in the output. - -Other important directives are define(A, B) which defines the macro -``A'' to have value ``B''. Macros are expanded as they are read, so -one normally quotes both values to prevent expansion. For example, - - define(`SMART_HOST', `smart.foo.com') - -One word of warning: M4 macros are expanded even in lines that appear -to be comments. For example, if you have - - # See FEATURE(foo) above - -it will not do what you expect, because the FEATURE(foo) will be -expanded. This also applies to - - # And then define the $X macro to be the return address - -because ``define'' is an M4 keyword. If you want to use them, surround -them with directed quotes, `like this'. - -+----------------+ -| FILE LOCATIONS | -+----------------+ - -sendmail 8.9 has introduced a new configuration directory for sendmail -related files, /etc/mail. The new files available for sendmail 8.9 -- -the class 'R' /etc/mail/relay-domains and the access database -/etc/mail/access -- take advantage of this new directory. 8.9 will -serve as a transition release. Beginning with 8.10, all of the files -will use this directory by default. - -+--------+ -| OSTYPE | -+--------+ - -You MUST define an operating system environment, or the configuration -file build will puke. There are several environments available; look -at the "ostype" directory for the current list. This macro changes -things like the location of the alias file and queue directory. Some -of these files are identical to one another. - -It is IMPERATIVE that the OSTYPE occur before any MAILER definitions. -In general, the OSTYPE macro should go immediately after any version -information, and MAILER definitions should always go last. - -Operating system definitions are usually easy to write. They may define -the following variables (everything defaults, so an ostype file may be -empty). Unfortunately, the list of configuration-supported systems is -not as broad as the list of source-supported systems, since many of -the source contributors do not include corresponding ostype files. - -ALIAS_FILE [/etc/aliases] The location of the text version - of the alias file(s). It can be a comma-separated - list of names (but be sure you quote values with - commas in them -- for example, use - define(`ALIAS_FILE', `a,b') - to get "a" and "b" both listed as alias files; - otherwise the define() primitive only sees "a"). -HELP_FILE [/usr/lib/sendmail.hf] The name of the file - containing information printed in response to - the SMTP HELP command. -QUEUE_DIR [/var/spool/mqueue] The directory containing - queue files. -STATUS_FILE [/etc/sendmail.st] The file containing status - information. -LOCAL_MAILER_PATH [/bin/mail] The program used to deliver local mail. -LOCAL_MAILER_FLAGS [rmn9] The flags used by the local mailer. The - flags lsDFM are always included. -LOCAL_MAILER_ARGS [mail -d $u] The arguments passed to deliver local - mail. -LOCAL_MAILER_MAX [undefined] If defined, the maximum size of local - mail that you are willing to accept. -LOCAL_MAILER_CHARSET [undefined] If defined, messages containing 8-bit data - that ARRIVE from an address that resolves to the - local mailer and which are converted to MIME will be - labeled with this character set. -LOCAL_SHELL_PATH [/bin/sh] The shell used to deliver piped email. -LOCAL_SHELL_FLAGS [eu9] The flags used by the shell mailer. The - flags lsDFM are always included. -LOCAL_SHELL_ARGS [sh -c $u] The arguments passed to deliver "prog" - mail. -LOCAL_SHELL_DIR [$z:/] The directory search path in which the - shell should run. -USENET_MAILER_PATH [/usr/lib/news/inews] The name of the program - used to submit news. -USENET_MAILER_FLAGS [rlsDFMmn] The mailer flags for the usenet mailer. -USENET_MAILER_ARGS [-m -h -n] The command line arguments for the - usenet mailer. -USENET_MAILER_MAX [100000] The maximum size of messages that will - be accepted by the usenet mailer. -SMTP_MAILER_FLAGS [undefined] Flags added to SMTP mailer. Default - flags are `mDFMUX' for all SMTP-based mailers; the - "esmtp" mailer adds `a' and "smtp8" adds `8'. -SMTP_MAILER_MAX [undefined] The maximum size of messages that will - be transported using the smtp, smtp8, or esmtp - mailers. -SMTP_MAILER_ARGS [IPC $h] The arguments passed to the smtp mailer. - About the only reason you would want to change this - would be to change the default port. -ESMTP_MAILER_ARGS [IPC $h] The arguments passed to the esmtp mailer. -SMTP8_MAILER_ARGS [IPC $h] The arguments passed to the smtp8 mailer. -RELAY_MAILER_ARGS [IPC $h] The arguments passed to the relay mailer. -SMTP_MAILER_CHARSET [undefined] If defined, messages containing 8-bit data - that ARRIVE from an address that resolves to one of - the SMTP mailers and which are converted to MIME will - be labeled with this character set. -UUCP_MAILER_PATH [/usr/bin/uux] The program used to send UUCP mail. -UUCP_MAILER_FLAGS [undefined] Flags added to UUCP mailer. Default - flags are `DFMhuU' (and `m' for uucp-new mailer, - minus `U' for uucp-dom mailer). -UUCP_MAILER_ARGS [uux - -r -z -a$g -gC $h!rmail ($u)] The arguments - passed to the UUCP mailer. -UUCP_MAILER_MAX [100000] The maximum size message accepted for - transmission by the UUCP mailers. -UUCP_MAILER_CHARSET [undefined] If defined, messages containing 8-bit data - that ARRIVE from an address that resolves to one of - the UUCP mailers and which are converted to MIME will - be labeled with this character set. -FAX_MAILER_PATH [/usr/local/lib/fax/mailfax] The program used to - submit FAX messages. -FAX_MAILER_ARGS [mailfax $u $h $f] The arguments passed to the FAX - mailer. -FAX_MAILER_MAX [100000] The maximum size message accepted for - transmission by FAX. -POP_MAILER_PATH [/usr/lib/mh/spop] The pathname of the POP mailer. -POP_MAILER_FLAGS [Penu] Flags added to POP mailer. Flags "lsDFM" - are always added. -POP_MAILER_ARGS [pop $u] The arguments passed to the POP mailer. -PROCMAIL_MAILER_PATH [/usr/local/bin/procmail] The path to the procmail - program. This is also used by - FEATURE(`local_procmail'). -PROCMAIL_MAILER_FLAGS [SPhnu9] Flags added to Procmail mailer. Flags - ``DFM'' are always set. This is NOT used by - FEATURE(`local_procmail'); tweak LOCAL_MAILER_FLAGS - instead. -PROCMAIL_MAILER_ARGS [procmail -Y -m $h $f $u] The arguments passed to - the Procmail mailer. This is NOT used by - FEATURE(`local_procmail'); tweak LOCAL_MAILER_ARGS - instead. -PROCMAIL_MAILER_MAX [undefined] If set, the maximum size message that - will be accepted by the procmail mailer. -MAIL11_MAILER_PATH [/usr/etc/mail11] The path to the mail11 mailer. -MAIL11_MAILER_FLAGS [nsFx] Flags for the mail11 mailer. -MAIL11_MAILER_ARGS [mail11 $g $x $h $u] Arguments passed to the mail11 - mailer. -PH_MAILER_PATH [/usr/local/etc/phquery] The path to the phquery - program. -PH_MAILER_FLAGS [ehmu] Flags for the phquery mailer. -PH_MAILER_ARGS [phquery -- $u] -- arguments to the phquery mailer. -CYRUS_MAILER_FLAGS [A5@/:|] The flags used by the cyrus mailer. The - flags lsDFMnPq are always included. -CYRUS_MAILER_PATH [/usr/cyrus/bin/deliver] The program used to deliver - cyrus mail. -CYRUS_MAILER_ARGS [deliver -e -m $h -- $u] The arguments passed - to deliver cyrus mail. -CYRUS_MAILER_MAX [undefined] If set, the maximum size message that - will be accepted by the cyrus mailer. -CYRUS_MAILER_USER [cyrus:mail] The user and group to become when - running the cyrus mailer. -CYRUS_BB_MAILER_FLAGS [undefined] The flags used by the cyrusbb - mailer. The flags lsDFMnP are always included. -CYRUS_BB_MAILER_ARGS [deliver -e -m $u] The arguments passed - to deliver cyrusbb mail. -confEBINDIR [/usr/libexec] The directory for executables. - Currently used for FEATURE(`local_lmtp') and - FEATURE(`smrsh'). - - - -+---------+ -| DOMAINS | -+---------+ - -You will probably want to collect domain-dependent defines into one -file, referenced by the DOMAIN macro. For example, our Berkeley -domain file includes definitions for several internal distinguished -hosts: - -UUCP_RELAY The host that will accept UUCP-addressed email. - If not defined, all UUCP sites must be directly - connected. -BITNET_RELAY The host that will accept BITNET-addressed email. - If not defined, the .BITNET pseudo-domain won't work. -DECNET_RELAY The host that will accept DECNET-addressed email. - If not defined, the .DECNET pseudo-domain and addresses - of the form node::user will not work. -FAX_RELAY The host that will accept mail to the .FAX pseudo-domain. - The "fax" mailer overrides this value. -LOCAL_RELAY DEPRECATED. The site that will handle unqualified - names -- that is, names with out an @domain extension. - If not set, they are assumed to belong on this machine. - This allows you to have a central site to store a - company- or department-wide alias database. This - only works at small sites, and only with some user - agents. -LUSER_RELAY The site that will handle lusers -- that is, apparently - local names that aren't local accounts or aliases. - -Any of these can be either ``mailer:hostname'' (in which case the -mailer is the internal mailer name, such as ``uucp-new'' and the hostname -is the name of the host as appropriate for that mailer) or just a -``hostname'', in which case a default mailer type (usually ``relay'', -a variant on SMTP) is used. WARNING: if you have a wildcard MX -record matching your domain, you probably want to define these to -have a trailing dot so that you won't get the mail diverted back -to yourself. - -The domain file can also be used to define a domain name, if needed -(using "DD<domain>") and set certain site-wide features. If all hosts -at your site masquerade behind one email name, you could also use -MASQUERADE_AS here. - -You do not have to define a domain -- in particular, if you are a -single machine sitting off somewhere, it is probably more work than -it's worth. This is just a mechanism for combining "domain dependent -knowledge" into one place. - -+---------+ -| MAILERS | -+---------+ - -There are fewer mailers supported in this version than the previous -version, owing mostly to a simpler world. As a general rule, put the -MAILER definitions last in your .mc file, and always put MAILER(smtp) -before MAILER(uucp) -- several features and definitions will modify -the definition of mailers, and the smtp mailer modifies the UUCP -mailer. - -local The local and prog mailers. You will almost always - need these; the only exception is if you relay ALL - your mail to another site. This mailer is included - automatically. - -smtp The Simple Mail Transport Protocol mailer. This does - not hide hosts behind a gateway or another other - such hack; it assumes a world where everyone is - running the name server. This file actually defines - four mailers: "smtp" for regular (old-style) SMTP to - other servers, "esmtp" for extended SMTP to other - servers, "smtp8" to do SMTP to other servers without - converting 8-bit data to MIME (essentially, this is - your statement that you know the other end is 8-bit - clean even if it doesn't say so), and "relay" for - transmission to our RELAY_HOST, LUSER_RELAY, or - MAILER_HUB. - -uucp The Unix-to-Unix Copy Program mailer. Actually, this - defines two mailers, "uucp-old" (a.k.a. "uucp") and - "uucp-new" (a.k.a. "suucp"). The latter is for when you - know that the UUCP mailer at the other end can handle - multiple recipients in one transfer. If the smtp mailer - is also included in your configuration, two other mailers - ("uucp-dom" and "uucp-uudom") are also defined [warning: - you MUST specify MAILER(smtp) before MAILER(uucp)]. When you - include the uucp mailer, sendmail looks for all names in - the $=U class and sends them to the uucp-old mailer; all - names in the $=Y class are sent to uucp-new; and all - names in the $=Z class are sent to uucp-uudom. Note that - this is a function of what version of rmail runs on - the receiving end, and hence may be out of your control. - See the section below describing UUCP mailers in more - detail. - -usenet Usenet (network news) delivery. If this is specified, - an extra rule is added to ruleset 0 that forwards all - local email for users named ``group.usenet'' to the - ``inews'' program. Note that this works for all groups, - and may be considered a security problem. - -fax Facsimile transmission. This is experimental and based - on Sam Leffler's HylaFAX software. For more information, - see http://www.vix.com/hylafax/. - -pop Post Office Protocol. - -procmail An interface to procmail (does not come with sendmail). - This is designed to be used in mailertables. For example, - a common question is "how do I forward all mail for a given - domain to a single person?". If you have this mailer - defined, you could set up a mailertable reading: - - host.com procmail:/etc/procmailrcs/host.com - - with the file /etc/procmailrcs/host.com reading: - - :0 # forward mail for host.com - ! -oi -f $1 person@other.host - - This would arrange for (anything)@host.com to be sent - to person@other.host. Within the procmail script, $1 is - the name of the sender and $2 is the name of the recipient. - If you use this with FEATURE(`local_procmail'), the FEATURE - should be listed first. - -mail11 The DECnet mail11 mailer, useful only if you have the mail11 - program from gatekeeper.dec.com:/pub/DEC/gwtools (and - DECnet, of course). This is for Phase IV DECnet support; - if you have Phase V at your site you may have additional - problems. - -phquery The phquery program. This is somewhat counterintuitively - referenced as the "ph" mailer internally. It can be used - to do CCSO name server lookups. The phquery program, which - this mailer uses, is distributed with the ph client. - -cyrus The cyrus and cyrusbb mailers. The cyrus mailer delivers to - a local cyrus user. this mailer can make use of the - "user+detail@local.host" syntax; it will deliver the mail to - the user's "detail" mailbox if the mailbox's ACL permits. - The cyrusbb mailer delivers to a system-wide cyrus mailbox - if the mailbox's ACL permits. - - -The local mailer accepts addresses of the form "user+detail", where -the "+detail" is not used for mailbox matching but is available -to certain local mail programs (in particular, see -FEATURE(`local_procmail')). For example, "eric", "eric+sendmail", and -"eric+sww" all indicate the same user, but additional arguments <null>, -"sendmail", and "sww" may be provided for use in sorting mail. - - -+----------+ -| FEATURES | -+----------+ - -Special features can be requested using the "FEATURE" macro. For -example, the .mc line: - - FEATURE(`use_cw_file') - -tells sendmail that you want to have it read an /etc/sendmail.cw -file to get values for class $=w. The FEATURE may contain a single -optional parameter -- for example: - - FEATURE(`mailertable', `dbm /usr/lib/mailertable') - -The default database map type for the table features can be set with - - define(`DATABASE_MAP_TYPE', `dbm') - -which would set it to use ndbm databases. The default is the Berkeley DB -hash database format. Note that you must still declare a database map type -if you specify an argument to a FEATURE. DATABASE_MAP_TYPE is only used -if no argument is given for the FEATURE. - -Available features are: - -use_cw_file Read the file /etc/sendmail.cw file to get alternate - names for this host. This might be used if you were - on a host that MXed for a dynamic set of other - hosts. If the set is static, just including the line - "Cw<name1> <name2> ..." (where the names are fully - qualified domain names) is probably superior. - The actual filename can be overridden by redefining - confCW_FILE. - -use_ct_file Read the file /etc/sendmail.ct file to get the names - of users that will be ``trusted'', that is, able to - set their envelope from address using -f without - generating a warning message. - The actual filename can be overridden by redefining - confCT_FILE. - -redirect Reject all mail addressed to "address.REDIRECT" with - a ``551 User not local; please try <address>'' message. - If this is set, you can alias people who have left - to their new address with ".REDIRECT" appended. - -nouucp Don't do anything special with UUCP addresses at all. - -nocanonify Don't pass addresses to $[ ... $] for canonification. - This would generally only be used by sites that only - act as mail gateways or which have user agents that do - full canonification themselves. You may also want to - use "define(`confBIND_OPTS',`-DNSRCH -DEFNAMES')" to - turn off the usual resolver options that do a similar - thing. - -stickyhost If set, email sent to "user@local.host" are marked - as "sticky" -- that is, the local addresses aren't - matched against UDB and don't go through ruleset 5. - This is used if you want a set up where "user" is - not necessarily the same as "user@local.host", e.g., - to make a distinct domain-wide namespace. Prior to - 8.7 this was the default, and notsticky was used to - turn this off. - -mailertable Include a "mailer table" which can be used to override - routing for particular domains. The argument of the - FEATURE may be the key definition. If none is specified, - the definition used is: - - hash -o /etc/mailertable - - Keys in this database are fully qualified domain names - or partial domains preceded by a dot -- for example, - "vangogh.CS.Berkeley.EDU" or ".CS.Berkeley.EDU". - Values must be of the form: - mailer:domain - where "mailer" is the internal mailer name, and "domain" - is where to send the message. These maps are not - reflected into the message header. As a special case, - the forms: - local:user - will forward to the indicated user using the local mailer, - local: - will forward to the original user in the e-mail address - using the local mailer, and - error:code message - will give an error message with the indicated code and - message. - -domaintable Include a "domain table" which can be used to provide - domain name mapping. Use of this should really be - limited to your own domains. It may be useful if you - change names (e.g., your company changes names from - oldname.com to newname.com). The argument of the - FEATURE may be the key definition. If none is specified, - the definition used is: - - hash -o /etc/domaintable - - The key in this table is the domain name; the value is - the new (fully qualified) domain. Anything in the - domaintable is reflected into headers; that is, this - is done in ruleset 3. - -bitdomain Look up bitnet hosts in a table to try to turn them into - internet addresses. The table can be built using the - bitdomain program contributed by John Gardiner Myers. - The argument of the FEATURE may be the key definition; if - none is specified, the definition used is: - - hash -o /etc/bitdomain.db - - Keys are the bitnet hostname; values are the corresponding - internet hostname. - -uucpdomain Similar feature for UUCP hosts. The default map definition - is: - - hash -o /etc/uudomain.db - - At the moment there is no automagic tool to build this - database. - -always_add_domain - Include the local host domain even on locally delivered - mail. Normally it is not added on unqualified names. - However, if you use a shared message store but do not use - the same user name space everywhere, you may need the host - name on local names. - -allmasquerade If masquerading is enabled (using MASQUERADE_AS), this - feature will cause recipient addresses to also masquerade - as being from the masquerade host. Normally they get - the local hostname. Although this may be right for - ordinary users, it can break local aliases. For example, - if you send to "localalias", the originating sendmail will - find that alias and send to all members, but send the - message with "To: localalias@masqueradehost". Since that - alias likely does not exist, replies will fail. Use this - feature ONLY if you can guarantee that the ENTIRE - namespace on your masquerade host supersets all the - local entries. - -limited_masquerade - Normally, any hosts listed in $=w are masqueraded. If this - feature is given, only the hosts listed in $=M are masqueraded. - This is useful if you have several domains with disjoint - namespaces hosted on the same machine. - -masquerade_entire_domain - If masquerading is enabled (using MASQUERADE_AS) and - MASQUERADE_DOMAIN (see below) is set, this feature will - cause addresses to be rewritten such that the masquerading - domains are actually entire domains to be hidden. All - hosts within the masquerading domains will be rewritten - to the masquerade name (used in MASQUERADE_AS). For example, - if you have: - - MASQUERADE_AS(masq.com) - MASQUERADE_DOMAIN(foo.org) - MASQUERADE_DOMAIN(bar.com) - - then *foo.org and *bar.com are converted to masq.com. Without - this feature, only foo.org and bar.com are masqueraded. - - NOTE: only domains within your jurisdiction and - current hierarchy should be masqueraded using this. - -genericstable This feature will cause certain addresses originating locally - (i.e. that are unqualified) or a domain listed in $=G to be - looked up in a map and turned into another ("generic") form, - which can change both the domain name and the user name. This - is similar to the userdb functionality. The same types of - addresses as for masquerading are looked up, i.e. only header - sender addresses unless the allmasquerade and/or - masquerade_envelope features are given. Qualified addresses - must have the domain part in the list of names given by the - by the macros GENERICS_DOMAIN or GENERICS_DOMAIN_FILE - (analogously to MASQUERADE_DOMAIN and MASQUERADE_DOMAIN_FILE, - see below). - - The argument of FEATURE(`genericstable') may be the map - definition; the default map definition is: - - hash -o /etc/genericstable - - The key for this table is either the full address or the - unqualified username (the former is tried first); the - value is the new user address. If the new user address does - not include a domain, it will be qualified in the standard - manner, i.e. using $j or the masquerade name. Note that the - address being looked up must be fully qualified. For local - mail, it is necessary to use FEATURE(`always_add_domain') - for the addresses to be qualified. - -virtusertable A domain-specific form of aliasing, allowing multiple - virtual domains to be hosted on one machine. For example, - if the virtuser table contained: - - info@foo.com foo-info - info@bar.com bar-info - @baz.org jane@elsewhere.net - - then mail addressed to info@foo.com will be sent to the - address foo-info, mail addressed to info@bar.com will be - delivered to bar-info, and mail addressed to anyone at - baz.org will be sent to jane@elsewhere.net. The username - from the original address is passed as %1 allowing: - - @foo.org %1@elsewhere.com - - meaning someone@foo.org will be sent to someone@elsewhere.com. - - All the host names on the left hand side (foo.com, bar.com, - and baz.org) must be in $=w. The default map definition is: - - hash -o /etc/virtusertable - - A new definition can be specified as the second argument of - the FEATURE macro, such as - - FEATURE(`virtusertable', `dbm -o /etc/mail/virtusers') - -nodns We aren't running DNS at our site (for example, - we are UUCP-only connected). It's hard to consider - this a "feature", but hey, it had to go somewhere. - Actually, as of 8.7 this is a no-op -- remove "dns" from - the hosts service switch entry instead. - -nullclient This is a special case -- it creates a stripped down - configuration file containing nothing but support for - forwarding all mail to a central hub via a local - SMTP-based network. The argument is the name of that - hub. - - The only other feature that should be used in conjunction - with this one is "nocanonify" (this causes addresses to - be sent unqualified via the SMTP connection; normally - they are qualified with the masquerade name, which - defaults to the name of the hub machine). No mailers - should be defined. No aliasing or forwarding is done. - Also, note that absolutely no anti-spam or anti-relaying - is done in a null client configuration. More information - can be found in the ANTI-SPAM CONFIGURATION CONTROL section. - -local_lmtp Use an LMTP capable local mailer. The argument to this - feature is the pathname of an LMTP capable mailer. By - default, mail.local is used. This is expected to be the - mail.local which came with the 8.9 distribution which is - LMTP capable. The path to mail.local is set by the - confEBINDIR m4 variable -- making the default - LOCAL_MAILER_PATH /usr/libexec/mail.local. - -local_procmail Use procmail as the local mailer. This mailer can - make use of the "user+indicator@local.host" syntax; - normally the +indicator is just tossed, but by default - it is passed as the -a argument to procmail. The - argument to this feature is the pathname of procmail, - which defaults to PROCMAIL_MAILER_PATH. Note that this - does NOT use PROCMAIL_MAILER_FLAGS or PROCMAIL_MAILER_ARGS - for the local mailer; tweak LOCAL_MAILER_FLAGS and - LOCAL_MAILER_ARGS instead. - -bestmx_is_local Accept mail as though locally addressed for any host that - lists us as the best possible MX record. This generates - additional DNS traffic, but should be OK for low to - medium traffic hosts. The argument may be a set of - domains, which will limit the feature to only apply to - these domains -- this will reduce unnecessary DNS - traffic. THIS FEATURE IS FUNDAMENTALLY INCOMPATIBLE WITH - WILDCARD MX RECORDS!!! If you have a wildcard MX record - that matches your domain, you cannot use this feature. - -smrsh Use the SendMail Restricted SHell (smrsh) provided - with the distribution instead of /bin/sh for mailing - to programs. This improves the ability of the local - system administrator to control what gets run via - e-mail. If an argument is provided it is used as the - pathname to smrsh; otherwise, the path defined by - confEBINDIR is used for the smrsh binary -- by default, - /usr/libexec/smrsh is assumed. - -promiscuous_relay - By default, the sendmail configuration files do not permit - mail relaying (that is, accepting mail from outside your - domain and sending it to another host outside your domain). - This option sets your site to allow mail relaying from any - site to any site. In general, it is better to control the - relaying more carefully with the access db and the 'R' - class ($=R). Domains can be added to class 'R' by the - macros RELAY_DOMAIN or RELAY_DOMAIN_FILE (analogously to - MASQUERADE_DOMAIN and MASQUERADE_DOMAIN_FILE, see below). - -relay_entire_domain - By default, only hosts listed as RELAY in the access db - will be allowed to relay. This option also allows any - host in your domain as defined by the 'm' class ($=m). - -relay_hosts_only - By default, names that are listed as RELAY in the access - db and class 'R' ($=R) are domain names, not host names. - For example, if you specify ``foo.com'', then mail to or - from foo.com, abc.foo.com, or a.very.deep.domain.foo.com - will all be accepted for relaying. This feature changes - the behaviour to lookup individual host names only. - -relay_based_on_MX - Turns on the ability to allow relaying based on the MX - records of the host portion of an incoming recipient; that - is, if an MX record for host foo.com points to your site, - you will accept and relay mail addressed to foo.com. See - description below for more information before using this - feature. Also, see the KNOWNBUGS entry regarding bestmx - map lookups. - - FEATURE(`relay_based_on_MX') does not necessarily allow - routing of these messages which you expect to be allowed, - if route address syntax (or %-hack syntax) is used. If - this is a problem, add entries to the access-table or use - FEATURE(`loose_relay_check'). - -relay_local_from - Allows relaying if the domain portion of the mail sender - is a local host. This should only be used if absolutely - necessary as it opens a window for spammers. Specifically, - they can send mail to your mail server that claims to be - from your domain (either directly or via a routed address), - and you will go ahead and relay it out to arbitrary hosts - on the Internet. - -accept_unqualified_senders - Normally, MAIL FROM: commands in the SMTP session will be - refused if the connection is a network connection and the - sender address does not include a domain name. If your - setup sends local mail unqualified (i.e. MAIL FROM: <joe>), - you will need to use this feature to accept unqualified - sender addresses. - -accept_unresolvable_domains - Normally, MAIL FROM: commands in the SMTP session will be - refused if the host part of the argument to MAIL FROM: cannot - be located in the host name service (e.g., DNS). If you are - inside a firewall that has only a limited view of the - Internet host name space, this could cause problems. In this - case you probably want to use this feature to accept all - domains on input, even if they are unresolvable. - -access_db Turns on the access database feature. The access db gives - you the ability to allow or refuse to accept mail from - specified domains for administrative reasons. By default, - the access database specification is: - - hash -o /etc/mail/access - - The format of the database is described below. - -blacklist_recipients - Turns on the ability to block incoming mail for certain - recipient usernames, hostnames, or addresses. For - example, you can block incoming mail to user nobody, - host foo.mydomain.com, or guest@bar.mydomain.com. - These specifications are put in the access db as - described below. - -rbl Turns on rejection of hosts found in the Realtime Blackhole - List. If an argument is provided it is used as the - name sever to contact; otherwise, the main RBL server at - rbl.maps.vix.com is used. For details, see - http://maps.vix.com/rbl/. - -loose_relay_check - Normally, if a recipient using % addressing is used, e.g. - user%site@othersite, and othersite is in class 'R', the - check_rcpt ruleset will strip @othersite and recheck - user@site for relaying. This feature changes that - behavior. It should not be needed for most installations. - - -+-------+ -| HACKS | -+-------+ - -Some things just can't be called features. To make this clear, -they go in the hack subdirectory and are referenced using the HACK -macro. These will tend to be site-dependent. The release -includes the Berkeley-dependent "cssubdomain" hack (that makes -sendmail accept local names in either Berkeley.EDU or CS.Berkeley.EDU; -this is intended as a short-term aid while we move hosts into -subdomains. - - -+--------------------+ -| SITE CONFIGURATION | -+--------------------+ - - ***************************************************** - * This section is really obsolete, and is preserved * - * only for back compatibility. You should plan on * - * using mailertables for new installations. In * - * particular, it doesn't work for the newer forms * - * of UUCP mailers, such as uucp-uudom. * - ***************************************************** - -Complex sites will need more local configuration information, such as -lists of UUCP hosts they speak with directly. This can get a bit more -tricky. For an example of a "complex" site, see cf/ucbvax.mc. - -If your host is known by several different names, you need to augment -the $=w class. This is a list of names by which you are known, and -anything sent to an address using a host name in this list will be -treated as local mail. You can do this in two ways: either create -the file /etc/sendmail.cw containing a list of your aliases (one per -line), and use ``FEATURE(`use_cw_file')'' in the .mc file, or add the -line: - - Cw alias.host.name - -at the end of that file. See the ``vangogh.mc'' file for an example. -Be sure you use the fully-qualified name of the host, rather than a -short name. - -The SITECONFIG macro allows you to indirectly reference site-dependent -configuration information stored in the siteconfig subdirectory. For -example, the line - - SITECONFIG(uucp.ucbvax, ucbvax, U) - -reads the file uucp.ucbvax for local connection information. The -second parameter is the local name (in this case just "ucbvax" since -it is locally connected, and hence a UUCP hostname). The third -parameter is the name of both a macro to store the local name (in -this case, $U) and the name of the class (e.g., $=U) in which to store -the host information read from the file. Another SITECONFIG line reads - - SITECONFIG(uucp.ucbarpa, ucbarpa.Berkeley.EDU, W) - -This says that the file uucp.ucbarpa contains the list of UUCP sites -connected to ucbarpa.Berkeley.EDU. The $=W class will be used to -store this list, and $W is defined to be ucbarpa.Berkeley.EDU, that -is, the name of the relay to which the hosts listed in uucp.ucbarpa -are connected. [The machine ucbarpa is gone now, but I've left -this out-of-date configuration file around to demonstrate how you -might do this.] - -Note that the case of SITECONFIG with a third parameter of ``U'' is -special; the second parameter is assumed to be the UUCP name of the -local site, rather than the name of a remote site, and the UUCP name -is entered into $=w (the list of local hostnames) as $U.UUCP. - -The siteconfig file (e.g., siteconfig/uucp.ucbvax.m4) contains nothing -more than a sequence of SITE macros describing connectivity. For -example: - - SITE(cnmat) - SITE(sgi olympus) - -The second example demonstrates that you can use two names on the -same line; these are usually aliases for the same host (or are at -least in the same company). - - -+--------------------+ -| USING UUCP MAILERS | -+--------------------+ - -It's hard to get UUCP mailers right because of the extremely ad hoc -nature of UUCP addressing. These config files are really designed -for domain-based addressing, even for UUCP sites. - -There are four UUCP mailers available. The choice of which one to -use is partly a matter of local preferences and what is running at -the other end of your UUCP connection. Unlike good protocols that -define what will go over the wire, UUCP uses the policy that you -should do what is right for the other end; if they change, you have -to change. This makes it hard to do the right thing, and discourages -people from updating their software. In general, if you can avoid -UUCP, please do. - -The major choice is whether to go for a domainized scheme or a -non-domainized scheme. This depends entirely on what the other -end will recognize. If at all possible, you should encourage the -other end to go to a domain-based system -- non-domainized addresses -don't work entirely properly. - -The four mailers are: - - uucp-old (obsolete name: "uucp") - This is the oldest, the worst (but the closest to UUCP) way of - sending messages accros UUCP connections. It does bangify - everything and prepends $U (your UUCP name) to the sender's - address (which can already be a bang path itself). It can - only send to one address at a time, so it spends a lot of - time copying duplicates of messages. Avoid this if at all - possible. - - uucp-new (obsolete name: "suucp") - The same as above, except that it assumes that in one rmail - command you can specify several recipients. It still has a - lot of other problems. - - uucp-dom - This UUCP mailer keeps everything as domain addresses. - Basically, it uses the SMTP mailer rewriting rules. This mailer - is only included if MAILER(smtp) is also specified. - - Unfortunately, a lot of UUCP mailer transport agents require - bangified addresses in the envelope, although you can use - domain-based addresses in the message header. (The envelope - shows up as the From_ line on UNIX mail.) So.... - - uucp-uudom - This is a cross between uucp-new (for the envelope addresses) - and uucp-dom (for the header addresses). It bangifies the - envelope sender (From_ line in messages) without adding the - local hostname, unless there is no host name on the address - at all (e.g., "wolf") or the host component is a UUCP host name - instead of a domain name ("somehost!wolf" instead of - "some.dom.ain!wolf"). This is also included only if MAILER(smtp) - is also specified. - -Examples: - -We are on host grasp.insa-lyon.fr (UUCP host name "grasp"). The -following summarizes the sender rewriting for various mailers. - -Mailer sender rewriting in the envelope ------- ------ ------------------------- -uucp-{old,new} wolf grasp!wolf -uucp-dom wolf wolf@grasp.insa-lyon.fr -uucp-uudom wolf grasp.insa-lyon.fr!wolf - -uucp-{old,new} wolf@fr.net grasp!fr.net!wolf -uucp-dom wolf@fr.net wolf@fr.net -uucp-uudom wolf@fr.net fr.net!wolf - -uucp-{old,new} somehost!wolf grasp!somehost!wolf -uucp-dom somehost!wolf somehost!wolf@grasp.insa-lyon.fr -uucp-uudom somehost!wolf grasp.insa-lyon.fr!somehost!wolf - -If you are using one of the domainized UUCP mailers, you really want -to convert all UUCP addresses to domain format -- otherwise, it will -do it for you (and probably not the way you expected). For example, -if you have the address foo!bar!baz (and you are not sending to foo), -the heuristics will add the @uucp.relay.name or @local.host.name to -this address. However, if you map foo to foo.host.name first, it -will not add the local hostname. You can do this using the uucpdomain -feature. - - -+-------------------+ -| TWEAKING RULESETS | -+-------------------+ - -For more complex configurations, you can define special rules. -The macro LOCAL_RULE_3 introduces rules that are used in canonicalizing -the names. Any modifications made here are reflected in the header. - -A common use is to convert old UUCP addresses to SMTP addresses using -the UUCPSMTP macro. For example: - - LOCAL_RULE_3 - UUCPSMTP(decvax, decvax.dec.com) - UUCPSMTP(research, research.att.com) - -will cause addresses of the form "decvax!user" and "research!user" -to be converted to "user@decvax.dec.com" and "user@research.att.com" -respectively. - -This could also be used to look up hosts in a database map: - - LOCAL_RULE_3 - R$* < @ $+ > $* $: $1 < @ $(hostmap $2 $) > $3 - -This map would be defined in the LOCAL_CONFIG portion, as shown below. - -Similarly, LOCAL_RULE_0 can be used to introduce new parsing rules. -For example, new rules are needed to parse hostnames that you accept -via MX records. For example, you might have: - - LOCAL_RULE_0 - R$+ <@ host.dom.ain.> $#uucp $@ cnmat $: $1 < @ host.dom.ain.> - -You would use this if you had installed an MX record for cnmat.Berkeley.EDU -pointing at this host; this rule catches the message and forwards it on -using UUCP. - -You can also tweak rulesets 1 and 2 using LOCAL_RULE_1 and LOCAL_RULE_2. -These rulesets are normally empty. - -A similar macro is LOCAL_CONFIG. This introduces lines added after the -boilerplate option setting but before rulesets, and can be used to -declare local database maps or whatever. For example: - - LOCAL_CONFIG - Khostmap hash /etc/hostmap.db - Kyplocal nis -m hosts.byname - - -+---------------------------+ -| MASQUERADING AND RELAYING | -+---------------------------+ - -You can have your host masquerade as another using - - MASQUERADE_AS(host.domain) - -This causes mail being sent to be labeled as coming from the -indicated host.domain, rather than $j. One normally masquerades as -one of one's own subdomains (for example, it's unlikely that I would -choose to masquerade as an MIT site). This behaviour is modified by -a plethora of FEATUREs; in particular, see masquerade_envelope, -allmasquerade, limited_masquerade, and masquerade_entire_domain. - -The masquerade name is not normally canonified, so it is important -that it be your One True Name, that is, fully qualified and not a -CNAME. However, if you use a CNAME, the receiving side may canonify -it for you, so don't think you can cheat CNAME mapping this way. - -Normally the only addresses that are masqueraded are those that come -from this host (that is, are either unqualified or in $=w, the list -of local domain names). You can augment this list using - - MASQUERADE_DOMAIN(otherhost.domain) - -The effect of this is that although mail to user@otherhost.domain -will not be delivered locally, any mail including any user@otherhost.domain -will, when relayed, be rewritten to have the MASQUERADE_AS address. -This can be a space-separated list of names. - -If these names are in a file, you can use - - MASQUERADE_DOMAIN_FILE(filename) - -to read the list of names from the indicated file. - -Normally only header addresses are masqueraded. If you want to -masquerade the envelope as well, use - - FEATURE(`masquerade_envelope') - -There are always users that need to be "exposed" -- that is, their -internal site name should be displayed instead of the masquerade name. -Root is an example. You can add users to this list using - - EXPOSED_USER(usernames) - -This adds users to class E; you could also use something like - - FE/etc/sendmail.cE - -You can also arrange to relay all unqualified names (that is, names -without @host) to a relay host. For example, if you have a central -email server, you might relay to that host so that users don't have -to have .forward files or aliases. You can do this using - - define(`LOCAL_RELAY', `mailer:hostname') - -The ``mailer:'' can be omitted, in which case the mailer defaults to -"relay". There are some user names that you don't want relayed, perhaps -because of local aliases. A common example is root, which may be -locally aliased. You can add entries to this list using - - LOCAL_USER(usernames) - -This adds users to class L; you could also use something like - - FL/etc/sendmail.cL - -If you want all incoming mail sent to a centralized hub, as for a -shared /var/spool/mail scheme, use - - define(`MAIL_HUB', `mailer:hostname') - -Again, ``mailer:'' defaults to "relay". If you define both LOCAL_RELAY -and MAIL_HUB _AND_ you have FEATURE(`stickyhost'), unqualified names will -be sent to the LOCAL_RELAY and other local names will be sent to MAIL_HUB. -Names in $=L will be delivered locally, so you MUST have aliases or -.forward files for them. - -For example, if you are on machine mastodon.CS.Berkeley.EDU and you have -FEATURE(`stickyhost'), the following combinations of settings will have the -indicated effects: - -email sent to.... eric eric@mastodon.CS.Berkeley.EDU - -LOCAL_RELAY set to mail.CS.Berkeley.EDU (delivered locally) -mail.CS.Berkeley.EDU (no local aliasing) (aliasing done) - -MAIL_HUB set to mammoth.CS.Berkeley.EDU mammoth.CS.Berkeley.EDU -mammoth.CS.Berkeley.EDU (aliasing done) (aliasing done) - -Both LOCAL_RELAY and mail.CS.Berkeley.EDU mammoth.CS.Berkeley.EDU -MAIL_HUB set as above (no local aliasing) (aliasing done) - -If you do not have FEATURE(`stickyhost') set, then LOCAL_RELAY and -MAIL_HUB act identically, with MAIL_HUB taking precedence. - -If you want all outgoing mail to go to a central relay site, define -SMART_HOST as well. Briefly: - - LOCAL_RELAY applies to unqualified names (e.g., "eric"). - MAIL_HUB applies to names qualified with the name of the - local host (e.g., "eric@mastodon.CS.Berkeley.EDU"). - SMART_HOST applies to names qualified with other hosts. - -However, beware that other relays (e.g., UUCP_RELAY, BITNET_RELAY, -DECNET_RELAY, and FAX_RELAY) take precedence over SMART_HOST, so if you -really want absolutely everything to go to a single central site you will -need to unset all the other relays -- or better yet, find or build a -minimal config file that does this. - -For duplicate suppression to work properly, the host name is best -specified with a terminal dot: - - define(`MAIL_HUB', `host.domain.') - note the trailing dot ---^ - - -+---------------------------------+ -| ANTI-SPAM CONFIGURATION CONTROL | -+---------------------------------+ - -The primary anti-spam features available in sendmail are: - -* Relaying is denied by default. -* Better checking on sender information. -* Access database. -* Header checks. - -Relaying (transmission of messages from a site outside your domain to -another site outside your domain) is denied by default. Note that -this changed in sendmail 8.9; previous versions allowed relaying by -default. If you want to revert to the old behaviour, you will need -to use FEATURE(`promiscuous_relay'). You can allow certain domains to -relay through your server by adding their domain name or IP address to -class 'R' ($=R) using RELAY_DOMAIN() and RELAY_DOMAIN_FILE() or via the -access database (described below). - -If you use - - FEATURE(`relay_entire_domain') - -then any host in any of your local domains (that is, the $=m class) -will be relayed (that is, you will accept mail either to or from any -host in your domain). - -You can also allow relaying based on the MX records of the host -portion of an incoming recipient address by using - - FEATURE(`relay_based_on_MX') - -For example, if your server receives a recipient of user@domain.com -and domain.com lists your server in its MX records, the mail will be -accepted for relay to domain.com. Note that this will stop spammers -from using your host to relay spam but it will not stop outsiders from -using your server as a relay for their site (that is, they set up an -MX record pointing to your mail server, and you will relay mail addressed -to them without any prior arrangement). Along the same lines, - - FEATURE(`relay_local_from') - -will allow relaying if the sender specifies a return path (i.e. -MAIL FROM: <user@domain>) domain which is a local domain. This a -dangerous feature as it will allow spammers to spam using your mail -server by simply specifying a return address of user@your.domain.com. -It should not be used unless absolutely necessary. - -If source routing is used in the recipient address (i.e. -RCPT TO: <user%site.com@othersite.com>), sendmail will check -user@site.com for relaying if othersite.com is an allowed relay host -in either class 'R', class 'm' if FEATURE(`relay_entire_domain') is used, -or the access database if FEATURE(`access_db') is used. To prevent -the address from being stripped down, use: - - FEATURE(`loose_relay_check') - -If you think you need to use this feature, you probably do not. This -should only be used for sites which have no control over the addresses -that they provide a gateway for. Use this FEATURE with caution as it -can allow spammers to relay through your server if not setup properly. - -As of 8.9, sendmail will refuse mail if the MAIL FROM: parameter has -an unresolvable domain (i.e., one that DNS, your local name service, -or special case rules in ruleset 3 cannot locate). If you want to -continue to accept such domains, e.g. because you are inside a -firewall that has only a limited view of the Internet host name space -(note that you will not be able to return mail to them unless you have -some "smart host" forwarder), use - - FEATURE(`accept_unresolvable_domains') - -sendmail will also refuse mail if the MAIL FROM: parameter is not -fully qualified (i.e., contains a domain as well as a user). If you -want to continue to accept such senders, use - - FEATURE(`accept_unqualified_senders') - -An ``access'' database can be created to accept or reject mail from -selected domains. For example, you may choose to reject all mail -originating from known spammers. To enable such a database, use - - FEATURE(`access_db') - -The FEATURE macro can accept a second parameter giving the key file -definition for the database; for example - - FEATURE(`access_db', `hash -o /etc/mail/access') - -Remember, since /etc/mail/access is a database, after creating the text -file as described below, you must use makemap to create the database -map. For example: - - makemap hash /etc/mail/access < /etc/mail/access - -The table itself uses e-mail addresses, domain names, and network -numbers as keys. For example, - - spammer@aol.com REJECT - cyberspammer.com REJECT - 192.168.212 REJECT - -would refuse mail from spammer@aol.com, any user from cyberspammer.com -(or any host within the cyberspammer.com domain), and any host on the -192.168.212.* network. - -The value part of the map can contain: - - OK Accept mail even if other rules in the - running ruleset would reject it, for example, - if the domain name is unresolvable. - RELAY Accept mail addressed to the indicated domain or - received from the indicated domain for relaying - through your SMTP server. RELAY also serves as - an implicit OK for the other checks. - REJECT Reject the sender or recipient with a general - purpose message. - DISCARD Discard the message completely using the - $#discard mailer. This only works for sender - addresses (i.e., it indicates that you should - discard anything received from the indicated - domain). - ### any text where ### is an RFC 821 compliant error code - and "any text" is a message to return for - the command. - -For example: - - cyberspammer.com 550 We don't accept mail from spammers - okay.cyberspammer.com OK - sendmail.org OK - 128.32 RELAY - -would accept mail from okay.cyberspammer.com, but would reject mail -from all other hosts at cyberspammer.com with the indicated message. -It would allow accept mail from any hosts in the sendmail.org domain, -and allow relaying for the 128.32.*.* network. Note, UUCP users may -need to add hostname.UUCP to the access database or class 'R' ($=R). -If you also use: - - FEATURE(`relay_hosts_only') - -then the above example will allow relaying for sendmail.org, but not -hosts within the sendmail.org domain. Note that this will also require -hosts listed in class 'R' ($=R) to be fully qualified host names. - -You can also use the access database to block sender addresses based on -the username portion of the address. For example: - - FREE.STEALTH.MAILER@ 550 Spam not accepted - -Note that you must include the @ after the username to signify that -this database entry is for checking only the username portion of the -sender address. - -If you use: - - FEATURE(`blacklist_recipients') - -then you can add entries to the map for local users, hosts in your -domains, or addresses in your domain which should not receive mail: - - badlocaluser 550 Mailbox disabled for this username - host.mydomain.com 550 That host does not accept mail - user@otherhost.mydomain.com 550 Mailbox disabled for this recipient - -This would prevent a recipient of badlocaluser@mydomain.com, any -user at host.mydomain.com, and the single address -user@otherhost.mydomain.com from receiving mail. Enabling this -feature will keep you from sending mails to all addresses that -have an error message or REJECT as value part in the access map. -Taking the example from above: - - spammer@aol.com REJECT - cyberspammer.com REJECT - -Mail can't be sent to spammer@aol.com or anyone at cyberspammer.com. - -There is also a ``Realtime Blackhole List'' run by the MAPS project -at http://maps.vix.com/. This is a database maintained in DNS of -spammers. To use this database, use - - FEATURE(`rbl') - -This will cause sendmail to reject mail from any site in the -Realtime Blackhole List database. You can specify an alternative -RBL name server to contact by specifying an argument to the FEATURE. - -The features described above make use of the check_relay, check_mail, -and check_rcpt rulesets. If you wish to include your own checks, -you can put your checks in the rulesets Local_check_relay, -Local_check_mail, and Local_check_rcpt. For example if you wanted to -block senders with all numeric usernames (i.e. 2312343@bigisp.com), -you would use Local_check_mail and the new regex map: - - LOCAL_CONFIG - Kallnumbers regex -a@MATCH ^[0-9]+$ - - LOCAL_RULESETS - SLocal_check_mail - # check address against various regex checks - R$* $: $>Parse0 $>3 $1 - R$+ < @ bigisp.com. > $* $: $(allnumbers $1 $) - R@MATCH $#error $: 553 Header Error - -These rules are called with the original arguments of the corresponding -check_* ruleset. If the local ruleset returns $#OK, no further checking -is done by the features described above and the mail is accepted. If the -local ruleset resolves to a mailer (such as $#error or $#discard), the -appropriate action is taken. Otherwise, the results of the local -rewriting are ignored. - - -You can also reject mail on the basis of the contents of headers. -This is done by adding a ruleset call to the 'H' header definition command -in sendmail.cf. For example, this can be used to check the validity of -a Message-ID: header: - - LOCAL_RULESETS - HMessage-Id: $>CheckMessageId - - SCheckMessageId - R< $+ @ $+ > $@ OK - R$* $#error $: 553 Header Error - -Users of FEATURE(`nullclient') who desire to use the anti-spam and -anti-relaying capabilities should replace FEATURE(`nullclient', `mailhub') -with: - - undefine(`ALIAS_FILE') - define(`MAIL_HUB', `mailhub') - define(`SMART_HOST', `mailhub') - define(`confFORWARD_PATH', `') - -where mailhub is the fully qualified hostname for their mail server. -The above rules will provide the relaying to the mailhub without local -alias and forward file expansion. To match the other behavior of -FEATURE(`nullclient'), you should also add these lines along with those -listed above: - - MASQUERADE_AS(`mailhub') - FEATURE(`allmasquerade') - FEATURE(`masquerade_envelope') - - -+--------------------------------+ -| ADDING NEW MAILERS OR RULESETS | -+--------------------------------+ - -Sometimes you may need to add entirely new mailers or rulesets. They -should be introduced with the constructs MAILER_DEFINITIONS and -LOCAL_RULESETS respectively. For example: - - MAILER_DEFINITIONS - Mmymailer, ... - ... - - LOCAL_RULESETS - Smyruleset - ... - - -+-------------------------------+ -| NON-SMTP BASED CONFIGURATIONS | -+-------------------------------+ - -These configuration files are designed primarily for use by SMTP-based -sites. I don't pretend that they are well tuned for UUCP-only or -UUCP-primarily nodes (the latter is defined as a small local net -connected to the rest of the world via UUCP). However, there is one -hook to handle some special cases. - -You can define a ``smart host'' that understands a richer address syntax -using: - - define(`SMART_HOST', `mailer:hostname') - -In this case, the ``mailer:'' defaults to "relay". Any messages that -can't be handled using the usual UUCP rules are passed to this host. - -If you are on a local SMTP-based net that connects to the outside -world via UUCP, you can use LOCAL_NET_CONFIG to add appropriate rules. -For example: - - define(`SMART_HOST', `suucp:uunet') - LOCAL_NET_CONFIG - R$* < @ $* .$m. > $* $#smtp $@ $2.$m. $: $1 < @ $2.$m. > $3 - -This will cause all names that end in your domain name ($m) via -SMTP; anything else will be sent via suucp (smart UUCP) to uunet. -If you have FEATURE(`nocanonify'), you may need to omit the dots after -the $m. If you are running a local DNS inside your domain which is -not otherwise connected to the outside world, you probably want to -use: - - define(`SMART_HOST', `smtp:fire.wall.com') - LOCAL_NET_CONFIG - R$* < @ $* . > $* $#smtp $@ $2. $: $1 < @ $2. > $3 - -That is, send directly only to things you found in your DNS lookup; -anything else goes through SMART_HOST. - -You may need to turn off the anti-spam rules in order to accept -UUCP mail with FEATURE(`promiscuous_relay') and -FEATURE(`accept_unresolvable_domains'). - - -+-----------+ -| WHO AM I? | -+-----------+ - -Normally, the $j macro is automatically defined to be your fully -qualified domain name (FQDN). Sendmail does this by getting your -host name using gethostname and then calling gethostbyname on the -result. For example, in some environments gethostname returns -only the root of the host name (such as "foo"); gethostbyname is -supposed to return the FQDN ("foo.bar.com"). In some (fairly rare) -cases, gethostbyname may fail to return the FQDN. In this case -you MUST define confDOMAIN_NAME to be your fully qualified domain -name. This is usually done using: - - Dmbar.com - define(`confDOMAIN_NAME', `$w.$m')dnl - - -+--------------------+ -| USING MAILERTABLES | -+--------------------+ - -To use FEATURE(`mailertable'), you will have to create an external -database containing the routing information for various domains. -For example, a mailertable file in text format might be: - - .my.domain xnet:%1.my.domain - uuhost1.my.domain suucp:uuhost1 - .bitnet smtp:relay.bit.net - -This should normally be stored in /etc/mailertable. The actual -database version of the mailertable is built using: - - makemap hash /etc/mailertable.db < /etc/mailertable - -The semantics are simple. Any LHS entry that does not begin with -a dot matches the full host name indicated. LHS entries beginning -with a dot match anything ending with that domain name -- that is, -they can be thought of as having a leading "*" wildcard. Matching -is done in order of most-to-least qualified -- for example, even -though ".my.domain" is listed first in the above example, an entry -of "uuhost1.my.domain" will match the second entry since it is -more explicit. - -The RHS should always be a "mailer:host" pair. The mailer is the -configuration name of a mailer (that is, an `M' line in the -sendmail.cf file). The "host" will be the hostname passed to -that mailer. In domain-based matches (that is, those with leading -dots) the "%1" may be used to interpolate the wildcarded part of -the host name. For example, the first line above sends everything -addressed to "anything.my.domain" to that same host name, but using -the (presumably experimental) xnet mailer. - -In some cases you may want to temporarily turn off MX records, -particularly on gateways. For example, you may want to MX -everything in a domain to one machine that then forwards it -directly. To do this, you might use the DNS configuration: - - *.domain. IN MX 0 relay.machine - -and on relay.machine use the mailertable: - - .domain smtp:[gateway.domain] - -The [square brackets] turn off MX records for this host only. -If you didn't do this, the mailertable would use the MX record -again, which would give you an MX loop. - - -+--------------------------------+ -| USING USERDB TO MAP FULL NAMES | -+--------------------------------+ - -The user database was not originally intended for mapping full names -to login names (e.g., Eric.Allman => eric), but some people are using -it that way. (I would recommend that you set up aliases for this -purpose instead -- since you can specify multiple alias files, this -is fairly easy.) The intent was to locate the default maildrop at -a site, but allow you to override this by sending to a specific host. - -If you decide to set up the user database in this fashion, it is -imperative that you not use FEATURE(`stickyhost') -- otherwise, -e-mail sent to Full.Name@local.host.name will be rejected. - -To build the internal form of the user database, use: - - makemap btree /usr/data/base.db < /usr/data/base.txt - -As a general rule, I am adamantly opposed to using full names as -e-mail addresses, since they are not in any sense unique. For example, -the Unix software-development community has two Andy Tannenbaums, -at least two well-known Peter Deutsches, and at one time Bell Labs -had two Stephen R. Bournes with offices along the same hallway. -Which one will be forced to suffer the indignity of being -Stephen_R_Bourne_2? The less famous of the two, or the one that -was hired later? - -Finger should handle full names (and be fuzzy). Mail should use -handles, and not be fuzzy. [Not that I expect anyone to pay any -attention to my opinions.] - - -+--------------------------------+ -| MISCELLANEOUS SPECIAL FEATURES | -+--------------------------------+ - -Plussed users - Sometimes it is convenient to merge configuration on a - centralized mail machine, for example, to forward all - root mail to a mail server. In this case it might be - useful to be able to treat the root addresses as a class - of addresses with subtle differences. You can do this - using plussed users. For example, a client might include - the alias: - - root: root+client1@server - - On the server, this will match an alias for "root+client1". - If that is not found, the alias "root+*" will be tried, - then "root". - -LDAP - For notes on use LDAP in sendmail, see - http://www.stanford.edu/~bbense/Inst.html - - - -+----------------+ -| SECURITY NOTES | -+----------------+ - -A lot of sendmail security comes down to you. Sendmail 8 is much -more careful about checking for security problems than previous -versions, but there are some things that you still need to watch -for. In particular: - -* Make sure the aliases file isn't writable except by trusted - system personnel. This includes both the text and database - version. - -* Make sure that other files that sendmail reads, such as the - mailertable, are only writable by trusted system personnel. - -* The queue directory should not be world writable PARTICULARLY - if your system allows "file giveaways" (that is, if a non-root - user can chown any file they own to any other user). - -* If your system allows file giveaways, DO NOT create a publically - writable directory for forward files. This will allow anyone - to steal anyone else's e-mail. Instead, create a script that - copies the .forward file from users' home directories once a - night (if you want the non-NFS-mounted forward directory). - -* If your system allows file giveaways, you'll find that - sendmail is much less trusting of :include: files -- in - particular, you'll have to have /SENDMAIL/ANY/SHELL/ in - /etc/shells before they will be trusted (that is, before - files and programs listed in them will be honored). - -In general, file giveaways are a mistake -- if you can turn them -off I recommend you do so. - - -+--------------------------------+ -| TWEAKING CONFIGURATION OPTIONS | -+--------------------------------+ - -There are a large number of configuration options that don't normally -need to be changed. However, if you feel you need to tweak them, you -can define the following M4 variables. This list is shown in four -columns: the name you define, the default value for that definition, -the option or macro that is affected (either Ox for an option or Dx -for a macro), and a brief description. Greater detail of the semantics -can be found in the Installation and Operations Guide. - -Some options are likely to be deprecated in future versions -- that is, -the option is only included to provide back-compatibility. These are -marked with "*". - -Remember that these options are M4 variables, and hence may need to -be quoted. In particular, arguments with commas will usually have to -be ``double quoted, like this phrase'' to avoid having the comma -confuse things. This is common for alias file definitions and for -the read timeout. - -M4 Variable Name Configuration Description & [Default] -================ ============= ======================= -confMAILER_NAME $n macro [MAILER-DAEMON] The sender name used - for internally generated outgoing - messages. -confDOMAIN_NAME $j macro If defined, sets $j. This should - only be done if your system cannot - determine your local domain name, - and then it should be set to - $w.Foo.COM, where Foo.COM is your - domain name. -confCF_VERSION $Z macro If defined, this is appended to the - configuration version name. -confFROM_HEADER From: [$?x$x <$g>$|$g$.] The format of an - internally generated From: address. -confRECEIVED_HEADER Received: - [$?sfrom $s $.$?_($?s$|from $.$_) - $.by $j ($v/$Z)$?r with $r$. id $i$?u - for $u; $|; - $.$b] - The format of the Received: header - in messages passed through this host. - It is unwise to try to change this. -confCW_FILE Fw class [/etc/sendmail.cw] Name of file used - to get the local additions to the $=w - (local host names) class. -confCT_FILE Ft class [/etc/sendmail.ct] Name of file used - to get the local additions to the $=t - (trusted users) class. -confCR_FILE FR class [/etc/mail/relay-domains] Name of - file used to get the local additions - to the $=R (hosts allowed to relay) - class. -confTRUSTED_USERS Ct class [no default] Names of users to add to - the list of trusted users. This list - always includes root, uucp, and daemon. - See also FEATURE(`use_ct_file'). -confSMTP_MAILER - [esmtp] The mailer name used when - SMTP connectivity is required. - One of "smtp", "smtp8", or "esmtp". -confUUCP_MAILER - [uucp-old] The mailer to be used by - default for bang-format recipient - addresses. See also discussion of - $=U, $=Y, and $=Z in the MAILER(uucp) - section. -confLOCAL_MAILER - [local] The mailer name used when - local connectivity is required. - Almost always "local". -confRELAY_MAILER - [relay] The default mailer name used - for relaying any mail (e.g., to a - BITNET_RELAY, a SMART_HOST, or - whatever). This can reasonably be - "uucp-new" if you are on a - UUCP-connected site. -confSEVEN_BIT_INPUT SevenBitInput [False] Force input to seven bits? -confEIGHT_BIT_HANDLING EightBitMode [pass8] 8-bit data handling -confALIAS_WAIT AliasWait [10m] Time to wait for alias file - rebuild until you get bored and - decide that the apparently pending - rebuild failed. -confMIN_FREE_BLOCKS MinFreeBlocks [100] Minimum number of free blocks on - queue filesystem to accept SMTP mail. - (Prior to 8.7 this was minfree/maxsize, - where minfree was the number of free - blocks and maxsize was the maximum - message size. Use confMAX_MESSAGE_SIZE - for the second value now.) -confMAX_MESSAGE_SIZE MaxMessageSize [infinite] The maximum size of messages - that will be accepted (in bytes). -confBLANK_SUB BlankSub [.] Blank (space) substitution - character. -confCON_EXPENSIVE HoldExpensive [False] Avoid connecting immediately - to mailers marked expensive? -confCHECKPOINT_INTERVAL CheckpointInterval - [10] Checkpoint queue files every N - recipients. -confDELIVERY_MODE DeliveryMode [background] Default delivery mode. -confAUTO_REBUILD AutoRebuildAliases - [False] Automatically rebuild alias - file if needed. -confERROR_MODE ErrorMode [print] Error message mode. -confERROR_MESSAGE ErrorHeader [undefined] Error message header/file. -confSAVE_FROM_LINES SaveFromLine Save extra leading From_ lines. -confTEMP_FILE_MODE TempFileMode [0600] Temporary file mode. -confMATCH_GECOS MatchGECOS [False] Match GECOS field. -confMAX_HOP MaxHopCount [25] Maximum hop count. -confIGNORE_DOTS* IgnoreDots [False; always False in -bs or -bd mode] - Ignore dot as terminator for incoming - messages? -confBIND_OPTS ResolverOptions [undefined] Default options for DNS - resolver. -confMIME_FORMAT_ERRORS* SendMimeErrors [True] Send error messages as MIME- - encapsulated messages per RFC 1344. -confFORWARD_PATH ForwardPath [$z/.forward.$w:$z/.forward] - The colon-separated list of places to - search for .forward files. N.B.: see - the Security Notes section. -confMCI_CACHE_SIZE ConnectionCacheSize - [2] Size of open connection cache. -confMCI_CACHE_TIMEOUT ConnectionCacheTimeout - [5m] Open connection cache timeout. -confHOST_STATUS_DIRECTORY HostStatusDirectory - [undefined] If set, host status is kept - on disk between sendmail runs in the - named directory tree. This need not be - a full pathname, in which case it is - interpreted relative to the queue - directory. -confSINGLE_THREAD_DELIVERY SingleThreadDelivery - [False] If this option and the - HostStatusDirectory option are both - set, single thread deliveries to other - hosts. That is, don't allow any two - sendmails on this host to connect - simultaneously to any other single - host. This can slow down delivery in - some cases, in particular since a - cached but otherwise idle connection - to a host will prevent other sendmails - from connecting to the other host. -confUSE_ERRORS_TO* UserErrorsTo [False] Use the Errors-To: header to - deliver error messages. This should - not be necessary because of general - acceptance of the envelope/header - distinction. -confLOG_LEVEL LogLevel [9] Log level. -confME_TOO MeToo [False] Include sender in group - expansions. -confCHECK_ALIASES CheckAliases [False] Check RHS of aliases when - running newaliases. Since this does - DNS lookups on every address, it can - slow down the alias rebuild process - considerably on large alias files. -confOLD_STYLE_HEADERS* OldStyleHeaders [True] Assume that headers without - special chars are old style. -confDAEMON_OPTIONS DaemonPortOptions - [none] SMTP daemon options. -confPRIVACY_FLAGS PrivacyOptions [authwarnings] Privacy flags. -confCOPY_ERRORS_TO PostmasterCopy [undefined] Address for additional - copies of all error messages. -confQUEUE_FACTOR QueueFactor [600000] Slope of queue-only function. -confDONT_PRUNE_ROUTES DontPruneRoutes [False] Don't prune down route-addr - syntax addresses to the minimum - possible. -confSAFE_QUEUE* SuperSafe [True] Commit all messages to disk - before forking. -confTO_INITIAL Timeout.initial [5m] The timeout waiting for a response - on the initial connect. -confTO_CONNECT Timeout.connect [0] The timeout waiting for an initial - connect() to complete. This can only - shorten connection timeouts; the kernel - silently enforces an absolute maximum - (which varies depending on the system). -confTO_ICONNECT Timeout.iconnect - [undefined] Like Timeout.connect, but - applies only to the very first attempt - to connect to a host in a message. - This allows a single very fast pass - followed by more careful delivery - attempts in the future. -confTO_HELO Timeout.helo [5m] The timeout waiting for a response - to a HELO or EHLO command. -confTO_MAIL Timeout.mail [10m] The timeout waiting for a - response to the MAIL command. -confTO_RCPT Timeout.rcpt [1h] The timeout waiting for a response - to the RCPT command. -confTO_DATAINIT Timeout.datainit - [5m] The timeout waiting for a 354 - response from the DATA command. -confTO_DATABLOCK Timeout.datablock - [1h] The timeout waiting for a block - during DATA phase. -confTO_DATAFINAL Timeout.datafinal - [1h] The timeout waiting for a response - to the final "." that terminates a - message. -confTO_RSET Timeout.rset [5m] The timeout waiting for a response - to the RSET command. -confTO_QUIT Timeout.quit [2m] The timeout waiting for a response - to the QUIT command. -confTO_MISC Timeout.misc [2m] The timeout waiting for a response - to other SMTP commands. -confTO_COMMAND Timeout.command [1h] In server SMTP, the timeout waiting - for a command to be issued. -confTO_IDENT Timeout.ident [30s] The timeout waiting for a response - to an IDENT query. -confTO_FILEOPEN Timeout.fileopen - [60s] The timeout waiting for a file - (e.g., :include: file) to be opened. -confTO_QUEUERETURN Timeout.queuereturn - [5d] The timeout before a message is - returned as undeliverable. -confTO_QUEUERETURN_NORMAL - Timeout.queuereturn.normal - [undefined] As above, for normal - priority messages. -confTO_QUEUERETURN_URGENT - Timeout.queuereturn.urgent - [undefined] As above, for urgent - priority messages. -confTO_QUEUERETURN_NONURGENT - Timeout.queuereturn.non-urgent - [undefined] As above, for non-urgent - (low) priority messages. -confTO_QUEUEWARN Timeout.queuewarn - [4h] The timeout before a warning - message is sent to the sender telling - them that the message has been deferred. -confTO_QUEUEWARN_NORMAL Timeout.queuewarn.normal - [undefined] As above, for normal - priority messages. -confTO_QUEUEWARN_URGENT Timeout.queuewarn.urgent - [undefined] As above, for urgent - priority messages. -confTO_QUEUEWARN_NONURGENT - Timeout.queuewarn.non-urgent - [undefined] As above, for non-urgent - (low) priority messages. -confTO_HOSTSTATUS Timeout.hoststatus - [30m] How long information about host - statuses will be maintained before it - is considered stale and the host should - be retried. This applies both within - a single queue run and to persistent - information (see below). -confTIME_ZONE TimeZoneSpec [USE_SYSTEM] Time zone info -- can be - USE_SYSTEM to use the system's idea, - USE_TZ to use the user's TZ envariable, - or something else to force that value. -confDEF_USER_ID DefaultUser [1:1] Default user id. -confUSERDB_SPEC UserDatabaseSpec - [undefined] User database specification. -confFALLBACK_MX FallbackMXhost [undefined] Fallback MX host. -confTRY_NULL_MX_LIST TryNullMXList [False] If we are the best MX for a - host and haven't made other - arrangements, try connecting to the - host directly; normally this would be - a config error. -confQUEUE_LA QueueLA [8] Load average at which queue-only - function kicks in. -confREFUSE_LA RefuseLA [12] Load average at which incoming - SMTP connections are refused. -confMAX_DAEMON_CHILDREN MaxDaemonChildren - [undefined] The maximum number of - children the daemon will permit. After - this number, connections will be - rejected. If not set or <= 0, there is - no limit. -confCONNECTION_RATE_THROTTLE ConnectionRateThrottle - [undefined] The maximum number of - connections permitted per second. - After this many connections are - accepted, further connections will be - delayed. If not set or <= 0, there is - no limit. -confWORK_RECIPIENT_FACTOR - RecipientFactor [30000] Cost of each recipient. -confSEPARATE_PROC ForkEachJob [False] Run all deliveries in a separate - process. -confWORK_CLASS_FACTOR ClassFactor [1800] Priority multiplier for class. -confWORK_TIME_FACTOR RetryFactor [90000] Cost of each delivery attempt. -confQUEUE_SORT_ORDER QueueSortOrder [Priority] Queue sort algorithm: - Priority, Host, or Time. -confMIN_QUEUE_AGE MinQueueAge [0] The minimum amount of time a job - must sit in the queue between queue - runs. This allows you to set the - queue run interval low for better - responsiveness without trying all - jobs in each run. -confDEF_CHAR_SET DefaultCharSet [unknown-8bit] When converting - unlabeled 8 bit input to MIME, the - character set to use by default. -confSERVICE_SWITCH_FILE ServiceSwitchFile - [/etc/service.switch] The file to use - for the service switch on systems that - do not have a system-defined switch. -confHOSTS_FILE HostsFile [/etc/hosts] The file to use when doing - "file" type access of hosts names. -confDIAL_DELAY DialDelay [0s] If a connection fails, wait this - long and try again. Zero means "don't - retry". This is to allow "dial on - demand" connections to have enough time - to complete a connection. -confNO_RCPT_ACTION NoRecipientAction - [none] What to do if there are no legal - recipient fields (To:, Cc: or Bcc:) - in the message. Legal values can - be "none" to just leave the - nonconforming message as is, "add-to" - to add a To: header with all the - known recipients (which may expose - blind recipients), "add-apparently-to" - to do the same but use Apparently-To: - instead of To:, "add-bcc" to add an - empty Bcc: header, or - "add-to-undisclosed" to add the header - ``To: undisclosed-recipients:;''. -confSAFE_FILE_ENV SafeFileEnvironment - [undefined] If set, sendmail will do a - chroot() into this directory before - writing files. -confCOLON_OK_IN_ADDR ColonOkInAddr [True unless Configuration Level > 6] - If set, colons are treated as a regular - character in addresses. If not set, - they are treated as the introducer to - the RFC 822 "group" syntax. Colons are - handled properly in route-addrs. This - option defaults on for V5 and lower - configuration files. -confMAX_QUEUE_RUN_SIZE MaxQueueRunSize [0] If set, limit the maximum size of - any given queue run to this number of - entries. Essentially, this will stop - reading the queue directory after this - number of entries are reached; it does - _not_ pick the highest priority jobs, - so this should be as large as your - system can tolerate. If not set, there - is no limit. -confDONT_EXPAND_CNAMES DontExpandCnames - [False] If set, $[ ... $] lookups that - do DNS based lookups do not expand - CNAME records. This currently violates - the published standards, but the IETF - seems to be moving toward legalizing - this. For example, if "FTP.Foo.ORG" - is a CNAME for "Cruft.Foo.ORG", then - with this option set a lookup of - "FTP" will return "FTP.Foo.ORG"; if - clear it returns "Cruft.FOO.ORG". N.B. - you may not see any effect until your - downstream neighbors stop doing CNAME - lookups as well. -confFROM_LINE UnixFromLine [From $g $d] The From_ line used - when sending to files or programs. -confSINGLE_LINE_FROM_HEADER SingleLineFromHeader - [False] From: lines that have - embedded newlines are unwrapped - onto one line. -confALLOW_BOGUS_HELO AllowBogusHELO [False] Allow HELO SMTP command that - does not include a host name. -confMUST_QUOTE_CHARS MustQuoteChars [.'] Characters to be quoted in a full - name phrase (@,;:\()[] are automatic). -confOPERATORS OperatorChars [.:%@!^/[]+] Address operator - characters. -confSMTP_LOGIN_MSG SmtpGreetingMessage - [$j Sendmail $v/$Z; $b] - The initial (spontaneous) SMTP - greeting message. The word "ESMTP" - will be inserted between the first and - second words to convince other - sendmails to try to speak ESMTP. -confDONT_INIT_GROUPS DontInitGroups [False] If set, the initgroups(3) - routine will never be invoked. You - might want to do this if you are - running NIS and you have a large group - map, since this call does a sequential - scan of the map; in a large site this - can cause your ypserv to run - essentially full time. If you set - this, agents run on behalf of users - will only have their primary - (/etc/passwd) group permissions. -confUNSAFE_GROUP_WRITES UnsafeGroupWrites - [False] If set, group-writable - :include: and .forward files are - considered "unsafe", that is, programs - and files cannot be directly referenced - from such files. World-writable files - are always considered unsafe. -confDOUBLE_BOUNCE_ADDRESS DoubleBounceAddress - [postmaster] If an error occurs when - sending an error message, send that - "double bounce" error message to this - address. -confRUN_AS_USER RunAsUser [undefined] If set, become this user - when reading and delivering mail. - Causes all file reads (e.g., .forward - and :include: files) to be done as - this user. Also, all programs will - be run as this user, and all output - files will be written as this user. - Intended for use only on firewalls - where users do not have accounts. -confMAX_RCPTS_PER_MESSAGE MaxRecipientsPerMessage - [infinite] If set, allow no more than - the specified number of recipients in - an SMTP envelope. Further recipients - receive a 452 error code (i.e., they - are deferred for the next delivery - attempt). -confDONT_PROBE_INTERFACES DontProbeInterfaces - [False] If set, sendmail will _not_ - insert the names and addresses of any - local interfaces into the $=w class - (list of known "equivalent" addresses). - If you set this, you must also include - some support for these addresses (e.g., - in a mailertable entry) -- otherwise, - mail to addresses in this list will - bounce with a configuration error. -confDONT_BLAME_SENDMAIL DontBlameSendmail - [safe] Override sendmail's file - safety checks. This will definitely - compromise system security and should - not be used unless absolutely - necessary. -confREJECT_MSG - [550 Access denied] The message - given if the access database contains - REJECT in the value portion. - -See also the description of OSTYPE for some parameters that can be -tweaked (generally pathnames to mailers). - - -+-----------+ -| HIERARCHY | -+-----------+ - -Within this directory are several subdirectories, to wit: - -m4 General support routines. These are typically - very important and should not be changed without - very careful consideration. - -cf The configuration files themselves. They have - ".mc" suffixes, and must be run through m4 to - become complete. The resulting output should - have a ".cf" suffix. - -ostype Definitions describing a particular operating - system type. These should always be referenced - using the OSTYPE macro in the .mc file. Examples - include "bsd4.3", "bsd4.4", "sunos3.5", and - "sunos4.1". - -domain Definitions describing a particular domain, referenced - using the DOMAIN macro in the .mc file. These are - site dependent; for example, "CS.Berkeley.EDU.m4" - describes hosts in the CS.Berkeley.EDU subdomain. - -mailer Descriptions of mailers. These are referenced using - the MAILER macro in the .mc file. - -sh Shell files used when building the .cf file from the - .mc file in the cf subdirectory. - -feature These hold special orthogonal features that you might - want to include. They should be referenced using - the FEATURE macro. - -hack Local hacks. These can be referenced using the HACK - macro. They shouldn't be of more than voyeuristic - interest outside the .Berkeley.EDU domain, but who knows? - We've all got our own peccadillos. - -siteconfig Site configuration -- e.g., tables of locally connected - UUCP sites. - - -+------------------------+ -| ADMINISTRATIVE DETAILS | -+------------------------+ - -The following sections detail usage of certain internal parts of the -sendmail.cf file. Read them carefully if you are trying to modify -the current model. If you find the above descriptions adequate, these -should be {boring, confusing, tedious, ridiculous} (pick one or more). - -RULESETS (* means built in to sendmail) - - 0 * Parsing - 1 * Sender rewriting - 2 * Recipient rewriting - 3 * Canonicalization - 4 * Post cleanup - 5 * Local address rewrite (after aliasing) - 1x mailer rules (sender qualification) - 2x mailer rules (recipient qualification) - 3x mailer rules (sender header qualification) - 4x mailer rules (recipient header qualification) - 5x mailer subroutines (general) - 6x mailer subroutines (general) - 7x mailer subroutines (general) - 8x reserved - 90 Mailertable host stripping - 96 Bottom half of Ruleset 3 (ruleset 6 in old sendmail) - 97 Hook for recursive ruleset 0 call (ruleset 7 in old sendmail) - 98 Local part of ruleset 0 (ruleset 8 in old sendmail) - 99 Guaranteed null (for debugging) - - -MAILERS - - 0 local, prog local and program mailers - 1 [e]smtp, relay SMTP channel - 2 uucp-* UNIX-to-UNIX Copy Program - 3 netnews Network News delivery - 4 fax Sam Leffler's HylaFAX software - 5 mail11 DECnet mailer - - -MACROS - - A - B Bitnet Relay - C DECnet Relay - D The local domain -- usually not needed - E reserved for X.400 Relay - F FAX Relay - G - H mail Hub (for mail clusters) - I - J - K - L Luser Relay - M Masquerade (who I claim to be) - N - O - P - Q - R Relay (for unqualified names) - S Smart Host - T - U my UUCP name (if I have a UUCP connection) - V UUCP Relay (class V hosts) - W UUCP Relay (class W hosts) - X UUCP Relay (class X hosts) - Y UUCP Relay (all other hosts) - Z Version number - - -CLASSES - - A - B domains that are candidates for bestmx lookup - C - D - E addresses that should not seem to come from $M - F hosts we forward for - G domains that should be looked up in genericstable - H - I - J - K - L addresses that should not be forwarded to $R - M domains that should be mapped to $M - N - O operators that indicate network operations (cannot be in local names) - P top level pseudo-domains: BITNET, DECNET, FAX, UUCP, etc. - Q - R domains we are willing to relay (pass anti-spam filters) - S - T - U locally connected UUCP hosts - V UUCP hosts connected to relay $V - W UUCP hosts connected to relay $W - X UUCP hosts connected to relay $X - Y locally connected smart UUCP hosts - Z locally connected domain-ized UUCP hosts - . the class containing only a dot - [ the class containing only a left bracket - - -M4 DIVERSIONS - - 1 Local host detection and resolution - 2 Local Ruleset 3 additions - 3 Local Ruleset 0 additions - 4 UUCP Ruleset 0 additions - 5 locally interpreted names (overrides $R) - 6 local configuration (at top of file) - 7 mailer definitions - 8 - 9 special local rulesets (1 and 2) diff --git a/cf/cf/Build b/cf/cf/Build deleted file mode 100755 index 3a91477..0000000 --- a/cf/cf/Build +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh - -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# @(#)Build 8.3 (Berkeley) 5/19/1998 -# - -# -# A quick-and-dirty script to create cf files. -# - -SMROOT=${SMROOT-../..} -BUILDTOOLS=${BUILDTOOLS-$SMROOT/BuildTools} - -M4=`sh $BUILDTOOLS/bin/find_m4.sh` -ret=$? -if [ $ret -ne 0 ] -then - exit $ret -fi -echo "Using M4=$M4" - -eval exec ${MAKE-make} M4=$M4 $* diff --git a/cf/cf/Makefile b/cf/cf/Makefile deleted file mode 100644 index 7d0f373..0000000 --- a/cf/cf/Makefile +++ /dev/null @@ -1,143 +0,0 @@ -# -# Makefile for configuration files. -# -# @(#)Makefile 8.17 (Berkeley) 4/2/1998 -# - -# -# Create configuration files using "m4 ../m4/cf.m4 file.mc > file.cf"; -# this may be easier than tweaking the Makefile. You do need to -# have a fairly modern M4 available (GNU m4 works). On SunOS, use -# /usr/5bin/m4. -# - -M4= m4 -CFDIR= .. -CHMOD= chmod -ROMODE= 444 -RM= rm -f - -.SUFFIXES: .mc .cf - -.mc.cf: - $(RM) $@ - $(M4) ${CFDIR}/m4/cf.m4 $*.mc > $@ || ( $(RM) $@ && exit 1 ) - $(CHMOD) $(ROMODE) $@ - -ALL= generic-bsd4.4.cf generic-hpux9.cf generic-hpux10.cf \ - generic-osf1.cf generic-solaris2.cf \ - generic-sunos4.1.cf generic-ultrix4.cf \ - cs-hpux9.cf cs-osf1.cf cs-solaris2.cf \ - cs-sunos4.1.cf cs-ultrix4.cf \ - s2k-osf1.cf s2k-ultrix4.cf \ - chez.cs.cf huginn.cs.cf mail.cs.cf mail.eecs.cf mailspool.cs.cf \ - python.cs.cf ucbarpa.cf ucbvax.cf vangogh.cs.cf knecht.cf - -all: $(ALL) - -clean cleandir: - $(RM) $(ALL) core - -depend install: - -# this is overkill, but.... -M4FILES=\ - ${CFDIR}/domain/Berkeley.EDU.m4 \ - ${CFDIR}/domain/CS.Berkeley.EDU.m4 \ - ${CFDIR}/domain/EECS.Berkeley.EDU.m4 \ - ${CFDIR}/domain/S2K.Berkeley.EDU.m4 \ - ${CFDIR}/domain/berkeley-only.m4 \ - ${CFDIR}/domain/generic.m4 \ - ${CFDIR}/feature/accept_unqualified_senders.m4 \ - ${CFDIR}/feature/accept_unresolvable_domains.m4 \ - ${CFDIR}/feature/access_db.m4 \ - ${CFDIR}/feature/allmasquerade.m4 \ - ${CFDIR}/feature/always_add_domain.m4 \ - ${CFDIR}/feature/bestmx_is_local.m4 \ - ${CFDIR}/feature/bitdomain.m4 \ - ${CFDIR}/feature/blacklist_recipients.m4 \ - ${CFDIR}/feature/loose_relay_check.m4 \ - ${CFDIR}/feature/domaintable.m4 \ - ${CFDIR}/feature/genericstable.m4 \ - ${CFDIR}/feature/limited_masquerade.m4 \ - ${CFDIR}/feature/local_lmtp.m4 \ - ${CFDIR}/feature/local_procmail.m4 \ - ${CFDIR}/feature/mailertable.m4 \ - ${CFDIR}/feature/masquerade_entire_domain.m4 \ - ${CFDIR}/feature/masquerade_envelope.m4 \ - ${CFDIR}/feature/nocanonify.m4 \ - ${CFDIR}/feature/nodns.m4 \ - ${CFDIR}/feature/notsticky.m4 \ - ${CFDIR}/feature/nouucp.m4 \ - ${CFDIR}/feature/nullclient.m4 \ - ${CFDIR}/feature/promiscuous_relay.m4 \ - ${CFDIR}/feature/rbl.m4 \ - ${CFDIR}/feature/redirect.m4 \ - ${CFDIR}/feature/relay_based_on_MX.m4 \ - ${CFDIR}/feature/relay_entire_domain.m4 \ - ${CFDIR}/feature/relay_hosts_only.m4 \ - ${CFDIR}/feature/relay_local_from.m4 \ - ${CFDIR}/feature/smrsh.m4 \ - ${CFDIR}/feature/stickyhost.m4 \ - ${CFDIR}/feature/use_ct_file.m4 \ - ${CFDIR}/feature/use_cw_file.m4 \ - ${CFDIR}/feature/uucpdomain.m4 \ - ${CFDIR}/feature/virtusertable.m4 \ - ${CFDIR}/hack/cssubdomain.m4 \ - ${CFDIR}/m4/cf.m4 \ - ${CFDIR}/m4/cfhead.m4 \ - ${CFDIR}/m4/nullrelay.m4 \ - ${CFDIR}/m4/proto.m4 \ - ${CFDIR}/m4/version.m4 \ - ${CFDIR}/mailer/cyrus.m4 \ - ${CFDIR}/mailer/fax.m4 \ - ${CFDIR}/mailer/local.m4 \ - ${CFDIR}/mailer/mail11.m4 \ - ${CFDIR}/mailer/pop.m4 \ - ${CFDIR}/mailer/procmail.m4 \ - ${CFDIR}/mailer/smtp.m4 \ - ${CFDIR}/mailer/usenet.m4 \ - ${CFDIR}/mailer/uucp.m4 \ - ${CFDIR}/ostype/aix2.m4 \ - ${CFDIR}/ostype/aix3.m4 \ - ${CFDIR}/ostype/altos.m4 \ - ${CFDIR}/ostype/amdahl-uts.m4 \ - ${CFDIR}/ostype/aux.m4 \ - ${CFDIR}/ostype/bsd4.3.m4 \ - ${CFDIR}/ostype/bsd4.4.m4 \ - ${CFDIR}/ostype/bsdi1.0.m4 \ - ${CFDIR}/ostype/bsdi2.0.m4 \ - ${CFDIR}/ostype/dgux.m4 \ - ${CFDIR}/ostype/domainos.m4 \ - ${CFDIR}/ostype/dynix3.2.m4 \ - ${CFDIR}/ostype/gnuhurd.m4 \ - ${CFDIR}/ostype/hpux10.m4 \ - ${CFDIR}/ostype/hpux9.m4 \ - ${CFDIR}/ostype/irix4.m4 \ - ${CFDIR}/ostype/irix5.m4 \ - ${CFDIR}/ostype/irix6.m4 \ - ${CFDIR}/ostype/linux.m4 \ - ${CFDIR}/ostype/maxion.m4 \ - ${CFDIR}/ostype/mklinux.m4 \ - ${CFDIR}/ostype/nextstep.m4 \ - ${CFDIR}/ostype/osf1.m4 \ - ${CFDIR}/ostype/powerux.m4 \ - ${CFDIR}/ostype/ptx2.m4 \ - ${CFDIR}/ostype/qnx.m4 \ - ${CFDIR}/ostype/riscos4.5.m4 \ - ${CFDIR}/ostype/sco-uw-2.1.m4 \ - ${CFDIR}/ostype/sco3.2.m4 \ - ${CFDIR}/ostype/solaris2.m4 \ - ${CFDIR}/ostype/solaris2.ml.m4 \ - ${CFDIR}/ostype/sunos3.5.m4 \ - ${CFDIR}/ostype/sunos4.1.m4 \ - ${CFDIR}/ostype/svr4.m4 \ - ${CFDIR}/ostype/ultrix4.m4 \ - ${CFDIR}/ostype/unknown.m4 \ - ${CFDIR}/ostype/uxpds.m4 \ - ${CFDIR}/siteconfig/uucp.cogsci.m4 \ - ${CFDIR}/siteconfig/uucp.old.arpa.m4 \ - ${CFDIR}/siteconfig/uucp.ucbarpa.m4 \ - ${CFDIR}/siteconfig/uucp.ucbvax.m4 \ - -$(ALL): $(M4FILES) diff --git a/cf/cf/chez.cs.mc b/cf/cf/chez.cs.mc deleted file mode 100644 index a5334b5..0000000 --- a/cf/cf/chez.cs.mc +++ /dev/null @@ -1,33 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a Berkeley-specific configuration file for a specific -# machine in the Computer Science Division at Berkeley, and should -# not be used elsewhere. It is provided on the sendmail distribution -# as a sample only. -# -# This file is for a home machine that wants to masquerade as an -# on-campus machine. Additionally, all addresses without a hostname -# will be forwarded to that machine. -# - -divert(0)dnl -VERSIONID(`@(#)chez.cs.mc 8.11 (Berkeley) 5/19/1998') -OSTYPE(bsd4.4)dnl -DOMAIN(CS.Berkeley.EDU)dnl -define(`LOCAL_RELAY', vangogh.CS.Berkeley.EDU)dnl -MASQUERADE_AS(vangogh.CS.Berkeley.EDU)dnl -FEATURE(use_cw_file)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/cf/cf/clientproto.mc b/cf/cf/clientproto.mc deleted file mode 100644 index b0fd9bd..0000000 --- a/cf/cf/clientproto.mc +++ /dev/null @@ -1,33 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This the prototype for a "null client" -- that is, a client that -# does nothing except forward all mail to a mail hub. IT IS NOT -# USABLE AS IS!!! -# -# To use this, you MUST use the nullclient feature with the name of -# the mail hub as its argument. You MUST also define an `OSTYPE' to -# define the location of the queue directories and the like. -# In addition, you MAY select the nocanonify feature. This causes -# addresses to be sent unqualified via the SMTP connection; normally -# they are qualifed with the masquerade name, which defaults to the -# name of the hub machine. -# Other than these, it should never contain any other lines. -# - -divert(0)dnl -VERSIONID(`@(#)clientproto.mc 8.12 (Berkeley) 5/19/1998') - -OSTYPE(unknown) -FEATURE(nullclient, mailhost.$m) diff --git a/cf/cf/cs-hpux10.mc b/cf/cf/cs-hpux10.mc deleted file mode 100644 index 0be009c..0000000 --- a/cf/cf/cs-hpux10.mc +++ /dev/null @@ -1,30 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a Berkeley-specific configuration file for HP-UX 9.x. -# It applies only to the Computer Science Division at Berkeley, -# and should not be used elsewhere. It is provided on the sendmail -# distribution as a sample only. To create your own configuration -# file, create an appropriate domain file in ../domain, change the -# `DOMAIN' macro below to reference that file, and copy the result -# to a name of your own choosing. -# - -divert(0)dnl -VERSIONID(`@(#)cs-hpux10.mc 8.10 (Berkeley) 5/19/1998') -OSTYPE(hpux10)dnl -DOMAIN(CS.Berkeley.EDU)dnl -define(`MAIL_HUB', mailspool.CS.Berkeley.EDU)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/cf/cf/cs-hpux9.mc b/cf/cf/cs-hpux9.mc deleted file mode 100644 index 9b5edfe..0000000 --- a/cf/cf/cs-hpux9.mc +++ /dev/null @@ -1,30 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a Berkeley-specific configuration file for HP-UX 9.x. -# It applies only to the Computer Science Division at Berkeley, -# and should not be used elsewhere. It is provided on the sendmail -# distribution as a sample only. To create your own configuration -# file, create an appropriate domain file in ../domain, change the -# `DOMAIN' macro below to reference that file, and copy the result -# to a name of your own choosing. -# - -divert(0)dnl -VERSIONID(`@(#)cs-hpux9.mc 8.11 (Berkeley) 5/19/1998') -OSTYPE(hpux9)dnl -DOMAIN(CS.Berkeley.EDU)dnl -define(`MAIL_HUB', mailspool.CS.Berkeley.EDU)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/cf/cf/cs-osf1.mc b/cf/cf/cs-osf1.mc deleted file mode 100644 index 230023c..0000000 --- a/cf/cf/cs-osf1.mc +++ /dev/null @@ -1,29 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a Berkeley-specific configuration file for OSF/1. -# It applies only to the Computer Science Division at Berkeley, -# and should not be used elsewhere. It is provided on the sendmail -# distribution as a sample only. To create your own configuration -# file, create an appropriate domain file in ../domain, change the -# `DOMAIN' macro below to reference that file, and copy the result -# to a name of your own choosing. -# - -divert(0)dnl -VERSIONID(`@(#)cs-osf1.mc 8.10 (Berkeley) 5/19/1998') -OSTYPE(osf1)dnl -DOMAIN(CS.Berkeley.EDU)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/cf/cf/cs-solaris2.mc b/cf/cf/cs-solaris2.mc deleted file mode 100644 index 03fd5e2..0000000 --- a/cf/cf/cs-solaris2.mc +++ /dev/null @@ -1,29 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a Berkeley-specific configuration file for Solaris 2.x. -# It applies only to the Computer Science Division at Berkeley, -# and should not be used elsewhere. It is provided on the sendmail -# distribution as a sample only. To create your own configuration -# file, create an appropriate domain file in ../domain, change the -# `DOMAIN' macro below to reference that file, and copy the result -# to a name of your own choosing. -# - -divert(0)dnl -VERSIONID(`@(#)cs-solaris2.mc 8.9 (Berkeley) 5/19/1998') -OSTYPE(solaris2)dnl -DOMAIN(CS.Berkeley.EDU)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/cf/cf/cs-sunos4.1.mc b/cf/cf/cs-sunos4.1.mc deleted file mode 100644 index 3913639..0000000 --- a/cf/cf/cs-sunos4.1.mc +++ /dev/null @@ -1,29 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a Berkeley-specific configuration file for SunOS 4.1.x. -# It applies only to the Computer Science Division at Berkeley, -# and should not be used elsewhere. It is provided on the sendmail -# distribution as a sample only. To create your own configuration -# file, create an appropriate domain file in ../domain, change the -# `DOMAIN' macro below to reference that file, and copy the result -# to a name of your own choosing. -# - -divert(0)dnl -VERSIONID(`@(#)cs-sunos4.1.mc 8.10 (Berkeley) 5/19/1998') -OSTYPE(sunos4.1)dnl -DOMAIN(CS.Berkeley.EDU)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/cf/cf/cs-ultrix4.mc b/cf/cf/cs-ultrix4.mc deleted file mode 100644 index a12b989..0000000 --- a/cf/cf/cs-ultrix4.mc +++ /dev/null @@ -1,29 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a Berkeley-specific configuration file for Ultrix 4.x. -# It applies only to the Computer Science Division at Berkeley, -# and should not be used elsewhere. It is provided on the sendmail -# distribution as a sample only. To create your own configuration -# file, create an appropriate domain file in ../domain, change the -# `DOMAIN' macro below to reference that file, and copy the result -# to a name of your own choosing. -# - -divert(0)dnl -VERSIONID(`@(#)cs-ultrix4.mc 8.10 (Berkeley) 5/19/1998') -OSTYPE(ultrix4)dnl -DOMAIN(CS.Berkeley.EDU)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/cf/cf/cyrusproto.mc b/cf/cf/cyrusproto.mc deleted file mode 100644 index c660898..0000000 --- a/cf/cf/cyrusproto.mc +++ /dev/null @@ -1,41 +0,0 @@ -divert(-1) -# -# (C) Copyright 1995 by Carnegie Mellon University -# -# All Rights Reserved -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose and without fee is hereby granted, -# provided that the above copyright notice appear in all copies and that -# both that copyright notice and this permission notice appear in -# supporting documentation, and that the name of CMU not be -# used in advertising or publicity pertaining to distribution of the -# software without specific, written prior permission. -# -# CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL -# CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -# SOFTWARE. -# -# Contributed to Berkeley by John Gardiner Myers <jgm+@CMU.EDU>. -# -# This sample mc file is for a site that uses the Cyrus IMAP server -# exclusively for local mail. -# - -divert(0)dnl -VERSIONID(`@(#)cyrusproto.mc 8.3 (Carnegie Mellon) @(#)cyrusproto.mc 8.3') -define(`confBIND_OPTS',`-DNSRCH -DEFNAMES') -FEATURE(nouucp) -FEATURE(nocanonify) -FEATURE(always_add_domain) -MAILER(smtp) -MAILER(cyrus) - -define(`confLOCAL_MAILER',`cyrus') - -LOCAL_RULE_0 -Rbb + $+ < @ $=w . > $#cyrusbb $: $1 diff --git a/cf/cf/generic-bsd4.4.cf b/cf/cf/generic-bsd4.4.cf deleted file mode 100644 index 6d47493..0000000 --- a/cf/cf/generic-bsd4.4.cf +++ /dev/null @@ -1,1061 +0,0 @@ -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -###################################################################### -###################################################################### -##### -##### SENDMAIL CONFIGURATION FILE -##### -##### built by gshapiro@knecht.sendmail.org on Thu Feb 4 16:39:22 PST 1999 -##### in /home/eric/src/sendmail/cf/cf -##### using ../ as configuration include directory -##### -###################################################################### -###################################################################### - -##### @(#)cfhead.m4 8.23 (Berkeley) 10/6/1998 ##### -##### @(#)cf.m4 8.29 (Berkeley) 5/19/1998 ##### -##### @(#)generic-bsd4.4.mc 8.7 (Berkeley) 5/19/1998 ##### - -##### @(#)bsd4.4.m4 8.10 (Berkeley) 10/6/1998 ##### - -##### @(#)generic.m4 8.9 (Berkeley) 5/19/1998 ##### - -##### @(#)redirect.m4 8.10 (Berkeley) 5/19/1998 ##### - - - - -##### @(#)use_cw_file.m4 8.6 (Berkeley) 5/19/1998 ##### - - - -##### @(#)proto.m4 8.243 (Berkeley) 2/2/1999 ##### - - -# level 8 config file format -V8/Berkeley - -# override file safeties - setting this option compromises system security -# need to set this now for the sake of class files -#O DontBlameSendmail=safe - -################## -# local info # -################## - -Cwlocalhost -# file containing names of hosts for which we receive email -Fw/etc/sendmail.cw - -# my official domain name -# ... define this only if sendmail cannot automatically determine your domain -#Dj$w.Foo.COM - - -CP. - -# "Smart" relay host (may be null) -DS - - -# operators that cannot be in local usernames (i.e., network indicators) -CO @ % ! - -# a class with just dot (for identifying canonical names) -C.. - -# a class with just a left bracket (for identifying domain literals) -C[[ - - - - - - - - - -# Resolve map (to check if a host exists in check_mail) -Kresolve host -a<OK> -T<TEMP> - -# Hosts that will permit relaying ($=R) -FR-o /etc/mail/relay-domains - -# who I send unqualified names to (null means deliver locally) -DR - -# who gets all local email traffic ($R has precedence for unqualified names) -DH - -# dequoting map -Kdequote dequote - -# class E: names that should be exposed as from this host, even if we masquerade -# class L: names that should be delivered locally, even if we have a relay -# class M: domains that should be converted to $M -#CL root -CE root - -# who I masquerade as (null for no masquerading) (see also $=M) -DM - -# my name for error messages -DnMAILER-DAEMON - - -CPREDIRECT - -# Configuration version number -DZ8.9.3 - - -############### -# Options # -############### - -# strip message body to 7 bits on input? -O SevenBitInput=False - -# 8-bit data handling -O EightBitMode=pass8 - - -# wait for alias file rebuild (default units: minutes) -O AliasWait=10 - -# location of alias file -O AliasFile=/etc/aliases - -# minimum number of free blocks on filesystem -O MinFreeBlocks=100 - -# maximum message size -#O MaxMessageSize=1000000 - -# substitution for space (blank) characters -O BlankSub=. - -# avoid connecting to "expensive" mailers on initial submission? -O HoldExpensive=False - -# checkpoint queue runs after every N successful deliveries -#O CheckpointInterval=10 - -# default delivery mode -O DeliveryMode=background - -# automatically rebuild the alias database? -#O AutoRebuildAliases - -# error message header/file -#O ErrorHeader=/etc/sendmail.oE - -# error mode -#O ErrorMode=print - -# save Unix-style "From_" lines at top of header? -#O SaveFromLine - -# temporary file mode -O TempFileMode=0600 - -# match recipients against GECOS field? -#O MatchGECOS - -# maximum hop count -#O MaxHopCount=17 - -# location of help file -O HelpFile=/usr/share/misc/sendmail.hf - -# ignore dots as terminators in incoming messages? -#O IgnoreDots - -# name resolver options -#O ResolverOptions=+AAONLY - -# deliver MIME-encapsulated error messages? -O SendMimeErrors=True - -# Forward file search path -O ForwardPath=$z/.forward.$w+$h:$z/.forward+$h:$z/.forward.$w:$z/.forward - -# open connection cache size -O ConnectionCacheSize=2 - -# open connection cache timeout -O ConnectionCacheTimeout=5m - -# persistent host status directory -#O HostStatusDirectory=.hoststat - -# single thread deliveries (requires HostStatusDirectory)? -#O SingleThreadDelivery - -# use Errors-To: header? -O UseErrorsTo=False - -# log level -O LogLevel=9 - -# send to me too, even in an alias expansion? -#O MeToo - -# verify RHS in newaliases? -O CheckAliases=False - -# default messages to old style headers if no special punctuation? -O OldStyleHeaders=True - -# SMTP daemon options -#O DaemonPortOptions=Port=esmtp - -# privacy flags -O PrivacyOptions=authwarnings - -# who (if anyone) should get extra copies of error messages -#O PostMasterCopy=Postmaster - -# slope of queue-only function -#O QueueFactor=600000 - -# queue directory -O QueueDirectory=/var/spool/mqueue - -# timeouts (many of these) -#O Timeout.initial=5m -#O Timeout.connect=5m -#O Timeout.iconnect=5m -#O Timeout.helo=5m -#O Timeout.mail=10m -#O Timeout.rcpt=1h -#O Timeout.datainit=5m -#O Timeout.datablock=1h -#O Timeout.datafinal=1h -#O Timeout.rset=5m -#O Timeout.quit=2m -#O Timeout.misc=2m -#O Timeout.command=1h -#O Timeout.ident=30s -#O Timeout.fileopen=60s -O Timeout.queuereturn=5d -#O Timeout.queuereturn.normal=5d -#O Timeout.queuereturn.urgent=2d -#O Timeout.queuereturn.non-urgent=7d -O Timeout.queuewarn=4h -#O Timeout.queuewarn.normal=4h -#O Timeout.queuewarn.urgent=1h -#O Timeout.queuewarn.non-urgent=12h -#O Timeout.hoststatus=30m - -# should we not prune routes in route-addr syntax addresses? -#O DontPruneRoutes - -# queue up everything before forking? -O SuperSafe=True - -# status file -O StatusFile=/var/log/sendmail.st - -# time zone handling: -# if undefined, use system default -# if defined but null, use TZ envariable passed in -# if defined and non-null, use that info -#O TimeZoneSpec= - -# default UID (can be username or userid:groupid) -#O DefaultUser=mailnull - -# list of locations of user database file (null means no lookup) -#O UserDatabaseSpec=/etc/userdb - -# fallback MX host -#O FallbackMXhost=fall.back.host.net - -# if we are the best MX host for a site, try it directly instead of config err -#O TryNullMXList - -# load average at which we just queue messages -#O QueueLA=8 - -# load average at which we refuse connections -#O RefuseLA=12 - -# maximum number of children we allow at one time -#O MaxDaemonChildren=12 - -# maximum number of new connections per second -#O ConnectionRateThrottle=3 - -# work recipient factor -#O RecipientFactor=30000 - -# deliver each queued job in a separate process? -#O ForkEachJob - -# work class factor -#O ClassFactor=1800 - -# work time factor -#O RetryFactor=90000 - -# shall we sort the queue by hostname first? -#O QueueSortOrder=priority - -# minimum time in queue before retry -#O MinQueueAge=30m - -# default character set -#O DefaultCharSet=iso-8859-1 - -# service switch file (ignored on Solaris, Ultrix, OSF/1, others) -#O ServiceSwitchFile=/etc/service.switch - -# hosts file (normally /etc/hosts) -#O HostsFile=/etc/hosts - -# dialup line delay on connection failure -#O DialDelay=10s - -# action to take if there are no recipients in the message -#O NoRecipientAction=add-to-undisclosed - -# chrooted environment for writing to files -#O SafeFileEnvironment=/arch - -# are colons OK in addresses? -#O ColonOkInAddr - -# how many jobs can you process in the queue? -#O MaxQueueRunSize=10000 - -# shall I avoid expanding CNAMEs (violates protocols)? -#O DontExpandCnames - -# SMTP initial login message (old $e macro) -O SmtpGreetingMessage=$j Sendmail $v/$Z; $b - -# UNIX initial From header format (old $l macro) -O UnixFromLine=From $g $d - -# From: lines that have embedded newlines are unwrapped onto one line -#O SingleLineFromHeader=False - -# Allow HELO SMTP command that does not include a host name -#O AllowBogusHELO=False - -# Characters to be quoted in a full name phrase (@,;:\()[] are automatic) -#O MustQuoteChars=. - -# delimiter (operator) characters (old $o macro) -O OperatorChars=.:%@!^/[]+ - -# shall I avoid calling initgroups(3) because of high NIS costs? -#O DontInitGroups - -# are group-writable :include: and .forward files (un)trustworthy? -#O UnsafeGroupWrites - -# where do errors that occur when sending errors get sent? -#O DoubleBounceAddress=postmaster - -# what user id do we assume for the majority of the processing? -#O RunAsUser=sendmail - -# maximum number of recipients per SMTP envelope -#O MaxRecipientsPerMessage=100 - -# shall we get local names from our installed interfaces? -#O DontProbeInterfaces - - - - - - -########################### -# Message precedences # -########################### - -Pfirst-class=0 -Pspecial-delivery=100 -Plist=-30 -Pbulk=-60 -Pjunk=-100 - -##################### -# Trusted users # -##################### - -# this is equivalent to setting class "t" -#Ft/etc/sendmail.ct -Troot -Tdaemon -Tuucp - -######################### -# Format of headers # -######################### - -H?P?Return-Path: <$g> -HReceived: $?sfrom $s $.$?_($?s$|from $.$_) - $.by $j ($v/$Z)$?r with $r$. id $i$?u - for $u; $|; - $.$b -H?D?Resent-Date: $a -H?D?Date: $a -H?F?Resent-From: $?x$x <$g>$|$g$. -H?F?From: $?x$x <$g>$|$g$. -H?x?Full-Name: $x -# HPosted-Date: $a -# H?l?Received-Date: $b -H?M?Resent-Message-Id: <$t.$i@$j> -H?M?Message-Id: <$t.$i@$j> -# -###################################################################### -###################################################################### -##### -##### REWRITING RULES -##### -###################################################################### -###################################################################### - -############################################ -### Ruleset 3 -- Name Canonicalization ### -############################################ -S3 - -# handle null input (translate to <@> special case) -R$@ $@ <@> - -# strip group: syntax (not inside angle brackets!) and trailing semicolon -R$* $: $1 <@> mark addresses -R$* < $* > $* <@> $: $1 < $2 > $3 unmark <addr> -R@ $* <@> $: @ $1 unmark @host:... -R$* :: $* <@> $: $1 :: $2 unmark node::addr -R:include: $* <@> $: :include: $1 unmark :include:... -R$* [ $* : $* ] <@> $: $1 [ $2 : $3 ] unmark IPv6 addrs -R$* : $* [ $* ] $: $1 : $2 [ $3 ] <@> remark if leading colon -R$* : $* <@> $: $2 strip colon if marked -R$* <@> $: $1 unmark -R$* ; $1 strip trailing semi -R$* < $* ; > $1 < $2 > bogus bracketed semi - -# null input now results from list:; syntax -R$@ $@ :; <@> - -# strip angle brackets -- note RFC733 heuristic to get innermost item -R$* $: < $1 > housekeeping <> -R$+ < $* > < $2 > strip excess on left -R< $* > $+ < $1 > strip excess on right -R<> $@ < @ > MAIL FROM:<> case -R< $+ > $: $1 remove housekeeping <> - -# make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later -R@ $+ , $+ @ $1 : $2 change all "," to ":" - -# localize and dispose of route-based addresses -R@ $+ : $+ $@ $>96 < @$1 > : $2 handle <route-addr> - -# find focus for list syntax -R $+ : $* ; @ $+ $@ $>96 $1 : $2 ; < @ $3 > list syntax -R $+ : $* ; $@ $1 : $2; list syntax - -# find focus for @ syntax addresses -R$+ @ $+ $: $1 < @ $2 > focus on domain -R$+ < $+ @ $+ > $1 $2 < @ $3 > move gaze right -R$+ < @ $+ > $@ $>96 $1 < @ $2 > already canonical - -# do some sanity checking -R$* < @ $* : $* > $* $1 < @ $2 $3 > $4 nix colons in addrs - -# convert old-style addresses to a domain-based address -R$- ! $+ $@ $>96 $2 < @ $1 .UUCP > resolve uucp names -R$+ . $- ! $+ $@ $>96 $3 < @ $1 . $2 > domain uucps -R$+ ! $+ $@ $>96 $2 < @ $1 .UUCP > uucp subdomains - -# if we have % signs, take the rightmost one -R$* % $* $1 @ $2 First make them all @s. -R$* @ $* @ $* $1 % $2 @ $3 Undo all but the last. -R$* @ $* $@ $>96 $1 < @ $2 > Insert < > and finish - -# else we must be a local name -R$* $@ $>96 $1 - - -################################################ -### Ruleset 96 -- bottom half of ruleset 3 ### -################################################ - -S96 - -# handle special cases for local names -R$* < @ localhost > $* $: $1 < @ $j . > $2 no domain at all -R$* < @ localhost . $m > $* $: $1 < @ $j . > $2 local domain -R$* < @ localhost . UUCP > $* $: $1 < @ $j . > $2 .UUCP domain -R$* < @ [ $+ ] > $* $: $1 < @@ [ $2 ] > $3 mark [a.b.c.d] -R$* < @@ $=w > $* $: $1 < @ $j . > $3 self-literal -R$* < @@ $+ > $* $@ $1 < @ $2 > $3 canon IP addr - - - - - -# if really UUCP, handle it immediately - -# try UUCP traffic as a local address -R$* < @ $+ . UUCP > $* $: $1 < @ $[ $2 $] . UUCP . > $3 -R$* < @ $+ . . UUCP . > $* $@ $1 < @ $2 . > $3 - -# pass to name server to make hostname canonical -R$* < @ $* $~P > $* $: $1 < @ $[ $2 $3 $] > $4 - -# local host aliases and pseudo-domains are always canonical -R$* < @ $=w > $* $: $1 < @ $2 . > $3 -R$* < @ $j > $* $: $1 < @ $j . > $2 -R$* < @ $=M > $* $: $1 < @ $2 . > $3 -R$* < @ $* $=P > $* $: $1 < @ $2 $3 . > $4 -R$* < @ $* . . > $* $1 < @ $2 . > $3 - - -################################################## -### Ruleset 4 -- Final Output Post-rewriting ### -################################################## -S4 - -R$* <@> $@ handle <> and list:; - -# strip trailing dot off possibly canonical name -R$* < @ $+ . > $* $1 < @ $2 > $3 - -# eliminate internal code -- should never get this far! -R$* < @ *LOCAL* > $* $1 < @ $j > $2 - -# externalize local domain info -R$* < $+ > $* $1 $2 $3 defocus -R@ $+ : @ $+ : $+ @ $1 , @ $2 : $3 <route-addr> canonical -R@ $* $@ @ $1 ... and exit - -# UUCP must always be presented in old form -R$+ @ $- . UUCP $2!$1 u@h.UUCP => h!u - -# delete duplicate local names -R$+ % $=w @ $=w $1 @ $2 u%host@host => u@host - - - -############################################################## -### Ruleset 97 -- recanonicalize and call ruleset zero ### -### (used for recursive calls) ### -############################################################## - -S97 -R$* $: $>3 $1 -R$* $@ $>0 $1 - - -###################################### -### Ruleset 0 -- Parse Address ### -###################################### - -S0 - -R$* $: $>Parse0 $1 initial parsing -R<@> $#local $: <@> special case error msgs -R$* $: $>98 $1 handle local hacks -R$* $: $>Parse1 $1 final parsing - -# -# Parse0 -- do initial syntax checking and eliminate local addresses. -# This should either return with the (possibly modified) input -# or return with a #error mailer. It should not return with a -# #mailer other than the #error mailer. -# - -SParse0 -R<@> $@ <@> special case error msgs -R$* : $* ; <@> $#error $@ 5.1.3 $: "List:; syntax illegal for recipient addresses" -#R@ <@ $* > < @ $1 > catch "@@host" bogosity -R<@ $+> $#error $@ 5.1.3 $: "User address required" -R$* $: <> $1 -R<> $* < @ [ $+ ] > $* $1 < @ [ $2 ] > $3 -R<> $* <$* : $* > $* $#error $@ 5.1.3 $: "Colon illegal in host name part" -R<> $* $1 -R$* < @ . $* > $* $#error $@ 5.1.2 $: "Invalid host name" -R$* < @ $* .. $* > $* $#error $@ 5.1.2 $: "Invalid host name" - -# now delete the local info -- note $=O to find characters that cause forwarding -R$* < @ > $* $@ $>Parse0 $>3 $1 user@ => user -R< @ $=w . > : $* $@ $>Parse0 $>3 $2 @here:... -> ... -R$- < @ $=w . > $: $(dequote $1 $) < @ $2 . > dequote "foo"@here -R< @ $+ > $#error $@ 5.1.3 $: "User address required" -R$* $=O $* < @ $=w . > $@ $>Parse0 $>3 $1 $2 $3 ...@here -> ... -R$- $: $(dequote $1 $) < @ *LOCAL* > dequote "foo" -R< @ *LOCAL* > $#error $@ 5.1.3 $: "User address required" -R$* $=O $* < @ *LOCAL* > - $@ $>Parse0 $>3 $1 $2 $3 ...@*LOCAL* -> ... -R$* < @ *LOCAL* > $: $1 - -# -# Parse1 -- the bottom half of ruleset 0. -# - -SParse1 -# handle numeric address spec -R$* < @ [ $+ ] > $* $: $>98 $1 < @ [ $2 ] > $3 numeric internet spec -R$* < @ [ $+ ] > $* $#esmtp $@ [$2] $: $1 < @ [$2] > $3 still numeric: send - - -# short circuit local delivery so forwarded email works -R$=L < @ $=w . > $#local $: @ $1 special local names -R$+ < @ $=w . > $#local $: $1 regular local name - - -# resolve remotely connected UUCP links (if any) - -# resolve fake top level domains by forwarding to other hosts - - - -# pass names that still have a host to a smarthost (if defined) -R$* < @ $* > $* $: $>95 < $S > $1 < @ $2 > $3 glue on smarthost name - -# deal with other remote names -R$* < @$* > $* $#esmtp $@ $2 $: $1 < @ $2 > $3 user@host.domain - -# handle locally delivered names -R$=L $#local $: @ $1 special local names -R$+ $#local $: $1 regular local names - -########################################################################### -### Ruleset 5 -- special rewriting after aliases have been expanded ### -########################################################################### - -S5 - -# deal with plussed users so aliases work nicely -R$+ + * $#local $@ $&h $: $1 -R$+ + $* $#local $@ + $2 $: $1 + * - -# prepend an empty "forward host" on the front -R$+ $: <> $1 - - -# see if we have a relay or a hub -R< > $+ $: < $H > $1 try hub -R< > $+ $: < $R > $1 try relay -R< > $+ $: < > < $1 $&h > nope, restore +detail -R< > < $+ + $* > $* < > < $1 > + $2 $3 find the user part -R< > < $+ > + $* $#local $@ $2 $: @ $1 strip the extra + -R< > < $+ > $@ $1 no +detail -R$+ $: $1 <> $&h add +detail back in -R$+ <> + $* $: $1 + $2 check whether +detail -R$+ <> $* $: $1 else discard -R< local : $* > $* $: $>95 < local : $1 > $2 no host extension -R< error : $* > $* $: $>95 < error : $1 > $2 no host extension -R< $- : $+ > $+ $: $>95 < $1 : $2 > $3 < @ $2 > -R< $+ > $+ $@ $>95 < $1 > $2 < @ $1 > - - -################################################################### -### Ruleset 95 -- canonify mailer:[user@]host syntax to triple ### -################################################################### - -S95 -R< > $* $@ $1 strip off null relay -R< error : $- $+ > $* $#error $@ $(dequote $1 $) $: $2 -R< local : $* > $* $>CanonLocal < $1 > $2 -R< $- : $+ @ $+ > $*<$*>$* $# $1 $@ $3 $: $2<@$3> use literal user -R< $- : $+ > $* $# $1 $@ $2 $: $3 try qualified mailer -R< $=w > $* $@ $2 delete local host -R< $+ > $* $#relay $@ $1 $: $2 use unqualified mailer - -################################################################### -### Ruleset CanonLocal -- canonify local: syntax ### -################################################################### - -SCanonLocal -# strip local host from routed addresses -R< $* > < @ $+ > : $+ $@ $>97 $3 -R< $* > $+ $=O $+ < @ $+ > $@ $>97 $2 $3 $4 - -# strip trailing dot from any host name that may appear -R< $* > $* < @ $* . > $: < $1 > $2 < @ $3 > - -# handle local: syntax -- use old user, either with or without host -R< > $* < @ $* > $* $#local $@ $1@$2 $: $1 -R< > $+ $#local $@ $1 $: $1 - -# handle local:user@host syntax -- ignore host part -R< $+ @ $+ > $* < @ $* > $: < $1 > $3 < @ $4 > - -# handle local:user syntax -R< $+ > $* <@ $* > $* $#local $@ $2@$3 $: $1 -R< $+ > $* $#local $@ $2 $: $1 - -################################################################### -### Ruleset 93 -- convert header names to masqueraded form ### -################################################################### - -S93 - - -# special case the users that should be exposed -R$=E < @ *LOCAL* > $@ $1 < @ $j . > leave exposed -R$=E < @ $=M . > $@ $1 < @ $2 . > -R$=E < @ $=w . > $@ $1 < @ $2 . > - -# handle domain-specific masquerading -R$* < @ $=M . > $* $: $1 < @ $2 . @ $M > $3 convert masqueraded doms -R$* < @ $=w . > $* $: $1 < @ $2 . @ $M > $3 -R$* < @ *LOCAL* > $* $: $1 < @ $j . @ $M > $2 -R$* < @ $+ @ > $* $: $1 < @ $2 > $3 $M is null -R$* < @ $+ @ $+ > $* $: $1 < @ $3 . > $4 $M is not null - -################################################################### -### Ruleset 94 -- convert envelope names to masqueraded form ### -################################################################### - -S94 -R$* < @ *LOCAL* > $* $: $1 < @ $j . > $2 - -################################################################### -### Ruleset 98 -- local part of ruleset zero (can be null) ### -################################################################### - -S98 - -# addresses sent to foo@host.REDIRECT will give a 551 error code -R$* < @ $+ .REDIRECT. > $: $1 < @ $2 . REDIRECT . > < ${opMode} > -R$* < @ $+ .REDIRECT. > <i> $: $1 < @ $2 . REDIRECT. > -R$* < @ $+ .REDIRECT. > < $- > $# error $@ 5.1.1 $: "551 User has moved; please try " <$1@$2> - - - -###################################################################### -### CanonAddr -- Convert an address into a standard form for -### relay checking. Route address syntax is -### crudely converted into a %-hack address. -### -### Parameters: -### $1 -- full recipient address -### -### Returns: -### parsed address, not in source route form -###################################################################### - -SCanonAddr -R$* $: $>Parse0 $>3 $1 make domain canonical -R< @ $+ > : $* @ $* < @ $1 > : $2 % $3 change @ to % in src route -R$* < @ $+ > : $* : $* $3 $1 < @ $2 > : $4 change to % hack. -R$* < @ $+ > : $* $3 $1 < @ $2 > - -###################################################################### -### ParseRecipient -- Strip off hosts in $=R as well as possibly -### $* $=m or the access database. -### Check user portion for host separators. -### -### Parameters: -### $1 -- full recipient address -### -### Returns: -### parsed, non-local-relaying address -###################################################################### - -SParseRecipient -R$* $: <?> $>CanonAddr $1 -R<?> $* < @ $* . > <?> $1 < @ $2 > strip trailing dots -R<?> $- < @ $* > $: <?> $(dequote $1 $) < @ $2 > dequote local part - -# if no $=O character, no host in the user portion, we are done -R<?> $* $=O $* < @ $* > $: <NO> $1 $2 $3 < @ $4> -R<?> $* $@ $1 - - - -R<NO> $* < @ $* $=R > $: <RELAY> $1 < @ $2 $3 > - -R<RELAY> $* < @ $* > $@ $>ParseRecipient $1 -R<$-> $* $@ $2 - -###################################################################### -### check_relay -- check hostname/address on SMTP startup -###################################################################### - -SLocal_check_relay -Scheck_relay -R$* $: $1 $| $>"Local_check_relay" $1 -R$* $| $* $| $#$* $#$3 -R$* $| $* $| $* $@ $>"Basic_check_relay" $1 $| $2 - -SBasic_check_relay -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - - - -###################################################################### -### check_mail -- check SMTP `MAIL FROM:' command argument -###################################################################### - -SLocal_check_mail -Scheck_mail -R$* $: $1 $| $>"Local_check_mail" $1 -R$* $| $#$* $#$2 -R$* $| $* $@ $>"Basic_check_mail" $1 - -SBasic_check_mail -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - -R<> $@ <OK> -R$* $: <?> $>CanonAddr $1 -R<?> $* < @ $+ . > <?> $1 < @ $2 > strip trailing dots -# handle non-DNS hostnames (*.bitnet, *.decnet, *.uucp, etc) -R<?> $* < $* $=P > $* $: <OK> $1 < @ $2 $3 > $4 -R<?> $* < @ $+ > $* $: <? $(resolve $2 $: $2 <PERM> $) > $1 < @ $2 > $3 -R<? $* <$->> $* < @ $+ > $* - $: <$2> $3 < @ $4 > $5 - -# handle case of @localhost on address -R<$+> $* < @localhost > $: < ? $&{client_name} > <$1> $2 < @localhost > -R<$+> $* < @localhost.$m > - $: < ? $&{client_name} > <$1> $2 < @localhost.$m > -R<$+> $* < @localhost.UUCP > - $: < ? $&{client_name} > <$1> $2 < @localhost.UUCP > -R<? $=w> <$+> $* <?> <$2> $3 -R<? $+> <$+> $* $#error $@ 5.5.4 $: "553 Real domain name required" -R<?> <$+> $* $: <$1> $2 - - -# handle case of no @domain on address -R<?> $* $: < ? $&{client_name} > $1 -R<?> $* $@ <OK> ...local unqualed ok -R<? $+> $* $#error $@ 5.5.4 $: "553 Domain name required" - ...remote is not -# check results -R<?> $* $@ <OK> -R<OK> $* $@ <OK> -R<TEMP> $* $#error $@ 4.1.8 $: "451 Sender domain must resolve" -R<PERM> $* $#error $@ 5.1.8 $: "501 Sender domain must exist" - -###################################################################### -### check_rcpt -- check SMTP `RCPT TO:' command argument -###################################################################### - -SLocal_check_rcpt -Scheck_rcpt -R$* $: $1 $| $>"Local_check_rcpt" $1 -R$* $| $#$* $#$2 -R$* $| $* $@ $>"Basic_check_rcpt" $1 - -SBasic_check_rcpt -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - -R$* $: $>ParseRecipient $1 strip relayable hosts - - - - -# anything terminating locally is ok -R$+ < @ $=w > $@ OK -R$+ < @ $* $=R > $@ OK - - -# check for local user (i.e. unqualified address) -R$* $: <?> $1 -R<?> $* < @ $+ > $: <REMOTE> $1 < @ $2 > -# local user is ok -R<?> $+ $@ OK -R<$+> $* $: $2 - -# anything originating locally is ok -R$* $: <?> $&{client_name} -# check if bracketed IP address (forward lookup != reverse lookup) -R<?> [$+] $: <BAD> [$1] -# pass to name server to make hostname canonical -R<?> $* $~P $: <?> $[ $1 $2 $] -R<$-> $* $: $2 -R$* . $1 strip trailing dots -R$@ $@ OK -R$=w $@ OK -R$* $=R $@ OK - -# check IP address -R$* $: $&{client_addr} -R$@ $@ OK originated locally -R0 $@ OK originated locally -R$=R $* $@ OK relayable IP address -R$* $: [ $1 ] put brackets around it... -R$=w $@ OK ... and see if it is local - - -# anything else is bogus -R$* $#error $@ 5.7.1 $: "550 Relaying denied" - -# -###################################################################### -###################################################################### -##### -##### MAILER DEFINITIONS -##### -###################################################################### -###################################################################### - - -################################################## -### Local and Program Mailer specification ### -################################################## - -##### @(#)local.m4 8.30 (Berkeley) 6/30/1998 ##### - -Mlocal, P=/usr/libexec/mail.local, F=lsDFMAw5:/|@qrmn9, S=10/30, R=20/40, - T=DNS/RFC822/X-Unix, - A=mail -d $u -Mprog, P=/bin/sh, F=lsDFMoqeu9, S=10/30, R=20/40, D=$z:/, - T=X-Unix, - A=sh -c $u - -# -# Envelope sender rewriting -# -S10 -R<@> $n errors to mailer-daemon -R@ <@ $*> $n temporarily bypass Sun bogosity -R$+ $: $>50 $1 add local domain if needed -R$* $: $>94 $1 do masquerading - -# -# Envelope recipient rewriting -# -S20 -R$+ < @ $* > $: $1 strip host part - -# -# Header sender rewriting -# -S30 -R<@> $n errors to mailer-daemon -R@ <@ $*> $n temporarily bypass Sun bogosity -R$+ $: $>50 $1 add local domain if needed -R$* $: $>93 $1 do masquerading - -# -# Header recipient rewriting -# -S40 -R$+ $: $>50 $1 add local domain if needed - -# -# Common code to add local domain name (only if always-add-domain) -# -S50 - -##################################### -### SMTP Mailer specification ### -##################################### - -##### @(#)smtp.m4 8.38 (Berkeley) 5/19/1998 ##### - -Msmtp, P=[IPC], F=mDFMuX, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Mesmtp, P=[IPC], F=mDFMuXa, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Msmtp8, P=[IPC], F=mDFMuX8, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Mrelay, P=[IPC], F=mDFMuXa8, S=11/31, R=61, E=\r\n, L=2040, - T=DNS/RFC822/SMTP, - A=IPC $h - -# -# envelope sender rewriting -# -S11 -R$+ $: $>51 $1 sender/recipient common -R$* :; <@> $@ list:; special case -R$* $: $>61 $1 qualify unqual'ed names -R$+ $: $>94 $1 do masquerading - - -# -# envelope recipient rewriting -- -# also header recipient if not masquerading recipients -# -S21 -R$+ $: $>51 $1 sender/recipient common -R$+ $: $>61 $1 qualify unqual'ed names - - -# -# header sender and masquerading header recipient rewriting -# -S31 -R$+ $: $>51 $1 sender/recipient common -R:; <@> $@ list:; special case - -# do special header rewriting -R$* <@> $* $@ $1 <@> $2 pass null host through -R< @ $* > $* $@ < @ $1 > $2 pass route-addr through -R$* $: $>61 $1 qualify unqual'ed names -R$+ $: $>93 $1 do masquerading - - -# -# convert pseudo-domain addresses to real domain addresses -# -S51 - -# pass <route-addr>s through -R< @ $+ > $* $@ < @ $1 > $2 resolve <route-addr> - -# output fake domains as user%fake@relay - -# do UUCP heuristics; note that these are shared with UUCP mailers -R$+ < @ $+ .UUCP. > $: < $2 ! > $1 convert to UUCP form -R$+ < @ $* > $* $@ $1 < @ $2 > $3 not UUCP form - -# leave these in .UUCP form to avoid further tampering -R< $&h ! > $- ! $+ $@ $2 < @ $1 .UUCP. > -R< $&h ! > $-.$+ ! $+ $@ $3 < @ $1.$2 > -R< $&h ! > $+ $@ $1 < @ $&h .UUCP. > -R< $+ ! > $+ $: $1 ! $2 < @ $Y > use UUCP_RELAY -R$+ < @ $+ : $+ > $@ $1 < @ $3 > strip mailer: part -R$+ < @ > $: $1 < @ *LOCAL* > if no UUCP_RELAY - - -# -# common sender and masquerading recipient rewriting -# -S61 - -R$* < @ $* > $* $@ $1 < @ $2 > $3 already fully qualified -R$+ $@ $1 < @ *LOCAL* > add local qualification - - -# -# relay mailer header masquerading recipient rewriting -# -S71 - -R$+ $: $>61 $1 -R$+ $: $>93 $1 diff --git a/cf/cf/generic-bsd4.4.mc b/cf/cf/generic-bsd4.4.mc deleted file mode 100644 index b097605..0000000 --- a/cf/cf/generic-bsd4.4.mc +++ /dev/null @@ -1,27 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a generic configuration file for 4.4 BSD-based systems, -# including 4.4-Lite, BSDi, NetBSD, and FreeBSD. -# It has support for local and SMTP mail only. If you want to -# customize it, copy it to a name appropriate for your environment -# and do the modifications there. -# - -divert(0)dnl -VERSIONID(`@(#)generic-bsd4.4.mc 8.7 (Berkeley) 5/19/1998') -OSTYPE(bsd4.4)dnl -DOMAIN(generic)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/cf/cf/generic-hpux10.cf b/cf/cf/generic-hpux10.cf deleted file mode 100644 index e1c4192..0000000 --- a/cf/cf/generic-hpux10.cf +++ /dev/null @@ -1,1062 +0,0 @@ -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -###################################################################### -###################################################################### -##### -##### SENDMAIL CONFIGURATION FILE -##### -##### built by gshapiro@knecht.sendmail.org on Thu Feb 4 16:39:22 PST 1999 -##### in /home/eric/src/sendmail/cf/cf -##### using ../ as configuration include directory -##### -###################################################################### -###################################################################### - -##### @(#)cfhead.m4 8.23 (Berkeley) 10/6/1998 ##### -##### @(#)cf.m4 8.29 (Berkeley) 5/19/1998 ##### -##### @(#)generic-hpux10.mc 8.8 (Berkeley) 5/19/1998 ##### - -##### @(#)hpux10.m4 8.14 (Berkeley) 10/6/1998 ##### - - -##### @(#)generic.m4 8.9 (Berkeley) 5/19/1998 ##### - -##### @(#)redirect.m4 8.10 (Berkeley) 5/19/1998 ##### - - - - -##### @(#)use_cw_file.m4 8.6 (Berkeley) 5/19/1998 ##### - - - -##### @(#)proto.m4 8.243 (Berkeley) 2/2/1999 ##### - - -# level 8 config file format -V8/Berkeley - -# override file safeties - setting this option compromises system security -# need to set this now for the sake of class files -#O DontBlameSendmail=safe - -################## -# local info # -################## - -Cwlocalhost -# file containing names of hosts for which we receive email -Fw/etc/sendmail.cw - -# my official domain name -# ... define this only if sendmail cannot automatically determine your domain -#Dj$w.Foo.COM - - -CP. - -# "Smart" relay host (may be null) -DS - - -# operators that cannot be in local usernames (i.e., network indicators) -CO @ % ! - -# a class with just dot (for identifying canonical names) -C.. - -# a class with just a left bracket (for identifying domain literals) -C[[ - - - - - - - - - -# Resolve map (to check if a host exists in check_mail) -Kresolve host -a<OK> -T<TEMP> - -# Hosts that will permit relaying ($=R) -FR-o /etc/mail/relay-domains - -# who I send unqualified names to (null means deliver locally) -DR - -# who gets all local email traffic ($R has precedence for unqualified names) -DH - -# dequoting map -Kdequote dequote - -# class E: names that should be exposed as from this host, even if we masquerade -# class L: names that should be delivered locally, even if we have a relay -# class M: domains that should be converted to $M -#CL root -CE root - -# who I masquerade as (null for no masquerading) (see also $=M) -DM - -# my name for error messages -DnMAILER-DAEMON - - -CPREDIRECT - -# Configuration version number -DZ8.9.3 - - -############### -# Options # -############### - -# strip message body to 7 bits on input? -O SevenBitInput=False - -# 8-bit data handling -O EightBitMode=pass8 - - -# wait for alias file rebuild (default units: minutes) -O AliasWait=10 - -# location of alias file -O AliasFile=/etc/mail/aliases - -# minimum number of free blocks on filesystem -O MinFreeBlocks=100 - -# maximum message size -#O MaxMessageSize=1000000 - -# substitution for space (blank) characters -O BlankSub=. - -# avoid connecting to "expensive" mailers on initial submission? -O HoldExpensive=False - -# checkpoint queue runs after every N successful deliveries -#O CheckpointInterval=10 - -# default delivery mode -O DeliveryMode=background - -# automatically rebuild the alias database? -#O AutoRebuildAliases - -# error message header/file -#O ErrorHeader=/etc/sendmail.oE - -# error mode -#O ErrorMode=print - -# save Unix-style "From_" lines at top of header? -#O SaveFromLine - -# temporary file mode -O TempFileMode=0600 - -# match recipients against GECOS field? -#O MatchGECOS - -# maximum hop count -#O MaxHopCount=17 - -# location of help file -O HelpFile=/usr/share/lib/sendmail.hf - -# ignore dots as terminators in incoming messages? -#O IgnoreDots - -# name resolver options -#O ResolverOptions=+AAONLY - -# deliver MIME-encapsulated error messages? -O SendMimeErrors=True - -# Forward file search path -O ForwardPath=$z/.forward.$w+$h:$z/.forward+$h:$z/.forward.$w:$z/.forward - -# open connection cache size -O ConnectionCacheSize=2 - -# open connection cache timeout -O ConnectionCacheTimeout=5m - -# persistent host status directory -#O HostStatusDirectory=.hoststat - -# single thread deliveries (requires HostStatusDirectory)? -#O SingleThreadDelivery - -# use Errors-To: header? -O UseErrorsTo=False - -# log level -O LogLevel=9 - -# send to me too, even in an alias expansion? -#O MeToo - -# verify RHS in newaliases? -O CheckAliases=False - -# default messages to old style headers if no special punctuation? -O OldStyleHeaders=True - -# SMTP daemon options -#O DaemonPortOptions=Port=esmtp - -# privacy flags -O PrivacyOptions=authwarnings - -# who (if anyone) should get extra copies of error messages -#O PostMasterCopy=Postmaster - -# slope of queue-only function -#O QueueFactor=600000 - -# queue directory -O QueueDirectory=/var/spool/mqueue - -# timeouts (many of these) -#O Timeout.initial=5m -#O Timeout.connect=5m -#O Timeout.iconnect=5m -#O Timeout.helo=5m -#O Timeout.mail=10m -#O Timeout.rcpt=1h -#O Timeout.datainit=5m -#O Timeout.datablock=1h -#O Timeout.datafinal=1h -#O Timeout.rset=5m -#O Timeout.quit=2m -#O Timeout.misc=2m -#O Timeout.command=1h -#O Timeout.ident=30s -#O Timeout.fileopen=60s -O Timeout.queuereturn=5d -#O Timeout.queuereturn.normal=5d -#O Timeout.queuereturn.urgent=2d -#O Timeout.queuereturn.non-urgent=7d -O Timeout.queuewarn=4h -#O Timeout.queuewarn.normal=4h -#O Timeout.queuewarn.urgent=1h -#O Timeout.queuewarn.non-urgent=12h -#O Timeout.hoststatus=30m - -# should we not prune routes in route-addr syntax addresses? -#O DontPruneRoutes - -# queue up everything before forking? -O SuperSafe=True - -# status file -O StatusFile=/etc/mail/sendmail.st - -# time zone handling: -# if undefined, use system default -# if defined but null, use TZ envariable passed in -# if defined and non-null, use that info -O TimeZoneSpec= - -# default UID (can be username or userid:groupid) -#O DefaultUser=mailnull - -# list of locations of user database file (null means no lookup) -#O UserDatabaseSpec=/etc/userdb - -# fallback MX host -#O FallbackMXhost=fall.back.host.net - -# if we are the best MX host for a site, try it directly instead of config err -#O TryNullMXList - -# load average at which we just queue messages -#O QueueLA=8 - -# load average at which we refuse connections -#O RefuseLA=12 - -# maximum number of children we allow at one time -#O MaxDaemonChildren=12 - -# maximum number of new connections per second -#O ConnectionRateThrottle=3 - -# work recipient factor -#O RecipientFactor=30000 - -# deliver each queued job in a separate process? -#O ForkEachJob - -# work class factor -#O ClassFactor=1800 - -# work time factor -#O RetryFactor=90000 - -# shall we sort the queue by hostname first? -#O QueueSortOrder=priority - -# minimum time in queue before retry -#O MinQueueAge=30m - -# default character set -#O DefaultCharSet=iso-8859-1 - -# service switch file (ignored on Solaris, Ultrix, OSF/1, others) -#O ServiceSwitchFile=/etc/service.switch - -# hosts file (normally /etc/hosts) -#O HostsFile=/etc/hosts - -# dialup line delay on connection failure -#O DialDelay=10s - -# action to take if there are no recipients in the message -#O NoRecipientAction=add-to-undisclosed - -# chrooted environment for writing to files -#O SafeFileEnvironment=/arch - -# are colons OK in addresses? -#O ColonOkInAddr - -# how many jobs can you process in the queue? -#O MaxQueueRunSize=10000 - -# shall I avoid expanding CNAMEs (violates protocols)? -#O DontExpandCnames - -# SMTP initial login message (old $e macro) -O SmtpGreetingMessage=$j Sendmail $v/$Z; $b - -# UNIX initial From header format (old $l macro) -O UnixFromLine=From $g $d - -# From: lines that have embedded newlines are unwrapped onto one line -#O SingleLineFromHeader=False - -# Allow HELO SMTP command that does not include a host name -#O AllowBogusHELO=False - -# Characters to be quoted in a full name phrase (@,;:\()[] are automatic) -#O MustQuoteChars=. - -# delimiter (operator) characters (old $o macro) -O OperatorChars=.:%@!^/[]+ - -# shall I avoid calling initgroups(3) because of high NIS costs? -#O DontInitGroups - -# are group-writable :include: and .forward files (un)trustworthy? -#O UnsafeGroupWrites - -# where do errors that occur when sending errors get sent? -#O DoubleBounceAddress=postmaster - -# what user id do we assume for the majority of the processing? -#O RunAsUser=sendmail - -# maximum number of recipients per SMTP envelope -#O MaxRecipientsPerMessage=100 - -# shall we get local names from our installed interfaces? -#O DontProbeInterfaces - - - - - - -########################### -# Message precedences # -########################### - -Pfirst-class=0 -Pspecial-delivery=100 -Plist=-30 -Pbulk=-60 -Pjunk=-100 - -##################### -# Trusted users # -##################### - -# this is equivalent to setting class "t" -#Ft/etc/sendmail.ct -Troot -Tdaemon -Tuucp - -######################### -# Format of headers # -######################### - -H?P?Return-Path: <$g> -HReceived: $?sfrom $s $.$?_($?s$|from $.$_) - $.by $j ($v/$Z)$?r with $r$. id $i$?u - for $u; $|; - $.$b -H?D?Resent-Date: $a -H?D?Date: $a -H?F?Resent-From: $?x$x <$g>$|$g$. -H?F?From: $?x$x <$g>$|$g$. -H?x?Full-Name: $x -# HPosted-Date: $a -# H?l?Received-Date: $b -H?M?Resent-Message-Id: <$t.$i@$j> -H?M?Message-Id: <$t.$i@$j> -# -###################################################################### -###################################################################### -##### -##### REWRITING RULES -##### -###################################################################### -###################################################################### - -############################################ -### Ruleset 3 -- Name Canonicalization ### -############################################ -S3 - -# handle null input (translate to <@> special case) -R$@ $@ <@> - -# strip group: syntax (not inside angle brackets!) and trailing semicolon -R$* $: $1 <@> mark addresses -R$* < $* > $* <@> $: $1 < $2 > $3 unmark <addr> -R@ $* <@> $: @ $1 unmark @host:... -R$* :: $* <@> $: $1 :: $2 unmark node::addr -R:include: $* <@> $: :include: $1 unmark :include:... -R$* [ $* : $* ] <@> $: $1 [ $2 : $3 ] unmark IPv6 addrs -R$* : $* [ $* ] $: $1 : $2 [ $3 ] <@> remark if leading colon -R$* : $* <@> $: $2 strip colon if marked -R$* <@> $: $1 unmark -R$* ; $1 strip trailing semi -R$* < $* ; > $1 < $2 > bogus bracketed semi - -# null input now results from list:; syntax -R$@ $@ :; <@> - -# strip angle brackets -- note RFC733 heuristic to get innermost item -R$* $: < $1 > housekeeping <> -R$+ < $* > < $2 > strip excess on left -R< $* > $+ < $1 > strip excess on right -R<> $@ < @ > MAIL FROM:<> case -R< $+ > $: $1 remove housekeeping <> - -# make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later -R@ $+ , $+ @ $1 : $2 change all "," to ":" - -# localize and dispose of route-based addresses -R@ $+ : $+ $@ $>96 < @$1 > : $2 handle <route-addr> - -# find focus for list syntax -R $+ : $* ; @ $+ $@ $>96 $1 : $2 ; < @ $3 > list syntax -R $+ : $* ; $@ $1 : $2; list syntax - -# find focus for @ syntax addresses -R$+ @ $+ $: $1 < @ $2 > focus on domain -R$+ < $+ @ $+ > $1 $2 < @ $3 > move gaze right -R$+ < @ $+ > $@ $>96 $1 < @ $2 > already canonical - -# do some sanity checking -R$* < @ $* : $* > $* $1 < @ $2 $3 > $4 nix colons in addrs - -# convert old-style addresses to a domain-based address -R$- ! $+ $@ $>96 $2 < @ $1 .UUCP > resolve uucp names -R$+ . $- ! $+ $@ $>96 $3 < @ $1 . $2 > domain uucps -R$+ ! $+ $@ $>96 $2 < @ $1 .UUCP > uucp subdomains - -# if we have % signs, take the rightmost one -R$* % $* $1 @ $2 First make them all @s. -R$* @ $* @ $* $1 % $2 @ $3 Undo all but the last. -R$* @ $* $@ $>96 $1 < @ $2 > Insert < > and finish - -# else we must be a local name -R$* $@ $>96 $1 - - -################################################ -### Ruleset 96 -- bottom half of ruleset 3 ### -################################################ - -S96 - -# handle special cases for local names -R$* < @ localhost > $* $: $1 < @ $j . > $2 no domain at all -R$* < @ localhost . $m > $* $: $1 < @ $j . > $2 local domain -R$* < @ localhost . UUCP > $* $: $1 < @ $j . > $2 .UUCP domain -R$* < @ [ $+ ] > $* $: $1 < @@ [ $2 ] > $3 mark [a.b.c.d] -R$* < @@ $=w > $* $: $1 < @ $j . > $3 self-literal -R$* < @@ $+ > $* $@ $1 < @ $2 > $3 canon IP addr - - - - - -# if really UUCP, handle it immediately - -# try UUCP traffic as a local address -R$* < @ $+ . UUCP > $* $: $1 < @ $[ $2 $] . UUCP . > $3 -R$* < @ $+ . . UUCP . > $* $@ $1 < @ $2 . > $3 - -# pass to name server to make hostname canonical -R$* < @ $* $~P > $* $: $1 < @ $[ $2 $3 $] > $4 - -# local host aliases and pseudo-domains are always canonical -R$* < @ $=w > $* $: $1 < @ $2 . > $3 -R$* < @ $j > $* $: $1 < @ $j . > $2 -R$* < @ $=M > $* $: $1 < @ $2 . > $3 -R$* < @ $* $=P > $* $: $1 < @ $2 $3 . > $4 -R$* < @ $* . . > $* $1 < @ $2 . > $3 - - -################################################## -### Ruleset 4 -- Final Output Post-rewriting ### -################################################## -S4 - -R$* <@> $@ handle <> and list:; - -# strip trailing dot off possibly canonical name -R$* < @ $+ . > $* $1 < @ $2 > $3 - -# eliminate internal code -- should never get this far! -R$* < @ *LOCAL* > $* $1 < @ $j > $2 - -# externalize local domain info -R$* < $+ > $* $1 $2 $3 defocus -R@ $+ : @ $+ : $+ @ $1 , @ $2 : $3 <route-addr> canonical -R@ $* $@ @ $1 ... and exit - -# UUCP must always be presented in old form -R$+ @ $- . UUCP $2!$1 u@h.UUCP => h!u - -# delete duplicate local names -R$+ % $=w @ $=w $1 @ $2 u%host@host => u@host - - - -############################################################## -### Ruleset 97 -- recanonicalize and call ruleset zero ### -### (used for recursive calls) ### -############################################################## - -S97 -R$* $: $>3 $1 -R$* $@ $>0 $1 - - -###################################### -### Ruleset 0 -- Parse Address ### -###################################### - -S0 - -R$* $: $>Parse0 $1 initial parsing -R<@> $#local $: <@> special case error msgs -R$* $: $>98 $1 handle local hacks -R$* $: $>Parse1 $1 final parsing - -# -# Parse0 -- do initial syntax checking and eliminate local addresses. -# This should either return with the (possibly modified) input -# or return with a #error mailer. It should not return with a -# #mailer other than the #error mailer. -# - -SParse0 -R<@> $@ <@> special case error msgs -R$* : $* ; <@> $#error $@ 5.1.3 $: "List:; syntax illegal for recipient addresses" -#R@ <@ $* > < @ $1 > catch "@@host" bogosity -R<@ $+> $#error $@ 5.1.3 $: "User address required" -R$* $: <> $1 -R<> $* < @ [ $+ ] > $* $1 < @ [ $2 ] > $3 -R<> $* <$* : $* > $* $#error $@ 5.1.3 $: "Colon illegal in host name part" -R<> $* $1 -R$* < @ . $* > $* $#error $@ 5.1.2 $: "Invalid host name" -R$* < @ $* .. $* > $* $#error $@ 5.1.2 $: "Invalid host name" - -# now delete the local info -- note $=O to find characters that cause forwarding -R$* < @ > $* $@ $>Parse0 $>3 $1 user@ => user -R< @ $=w . > : $* $@ $>Parse0 $>3 $2 @here:... -> ... -R$- < @ $=w . > $: $(dequote $1 $) < @ $2 . > dequote "foo"@here -R< @ $+ > $#error $@ 5.1.3 $: "User address required" -R$* $=O $* < @ $=w . > $@ $>Parse0 $>3 $1 $2 $3 ...@here -> ... -R$- $: $(dequote $1 $) < @ *LOCAL* > dequote "foo" -R< @ *LOCAL* > $#error $@ 5.1.3 $: "User address required" -R$* $=O $* < @ *LOCAL* > - $@ $>Parse0 $>3 $1 $2 $3 ...@*LOCAL* -> ... -R$* < @ *LOCAL* > $: $1 - -# -# Parse1 -- the bottom half of ruleset 0. -# - -SParse1 -# handle numeric address spec -R$* < @ [ $+ ] > $* $: $>98 $1 < @ [ $2 ] > $3 numeric internet spec -R$* < @ [ $+ ] > $* $#esmtp $@ [$2] $: $1 < @ [$2] > $3 still numeric: send - - -# short circuit local delivery so forwarded email works -R$=L < @ $=w . > $#local $: @ $1 special local names -R$+ < @ $=w . > $#local $: $1 regular local name - - -# resolve remotely connected UUCP links (if any) - -# resolve fake top level domains by forwarding to other hosts - - - -# pass names that still have a host to a smarthost (if defined) -R$* < @ $* > $* $: $>95 < $S > $1 < @ $2 > $3 glue on smarthost name - -# deal with other remote names -R$* < @$* > $* $#esmtp $@ $2 $: $1 < @ $2 > $3 user@host.domain - -# handle locally delivered names -R$=L $#local $: @ $1 special local names -R$+ $#local $: $1 regular local names - -########################################################################### -### Ruleset 5 -- special rewriting after aliases have been expanded ### -########################################################################### - -S5 - -# deal with plussed users so aliases work nicely -R$+ + * $#local $@ $&h $: $1 -R$+ + $* $#local $@ + $2 $: $1 + * - -# prepend an empty "forward host" on the front -R$+ $: <> $1 - - -# see if we have a relay or a hub -R< > $+ $: < $H > $1 try hub -R< > $+ $: < $R > $1 try relay -R< > $+ $: < > < $1 $&h > nope, restore +detail -R< > < $+ + $* > $* < > < $1 > + $2 $3 find the user part -R< > < $+ > + $* $#local $@ $2 $: @ $1 strip the extra + -R< > < $+ > $@ $1 no +detail -R$+ $: $1 <> $&h add +detail back in -R$+ <> + $* $: $1 + $2 check whether +detail -R$+ <> $* $: $1 else discard -R< local : $* > $* $: $>95 < local : $1 > $2 no host extension -R< error : $* > $* $: $>95 < error : $1 > $2 no host extension -R< $- : $+ > $+ $: $>95 < $1 : $2 > $3 < @ $2 > -R< $+ > $+ $@ $>95 < $1 > $2 < @ $1 > - - -################################################################### -### Ruleset 95 -- canonify mailer:[user@]host syntax to triple ### -################################################################### - -S95 -R< > $* $@ $1 strip off null relay -R< error : $- $+ > $* $#error $@ $(dequote $1 $) $: $2 -R< local : $* > $* $>CanonLocal < $1 > $2 -R< $- : $+ @ $+ > $*<$*>$* $# $1 $@ $3 $: $2<@$3> use literal user -R< $- : $+ > $* $# $1 $@ $2 $: $3 try qualified mailer -R< $=w > $* $@ $2 delete local host -R< $+ > $* $#relay $@ $1 $: $2 use unqualified mailer - -################################################################### -### Ruleset CanonLocal -- canonify local: syntax ### -################################################################### - -SCanonLocal -# strip local host from routed addresses -R< $* > < @ $+ > : $+ $@ $>97 $3 -R< $* > $+ $=O $+ < @ $+ > $@ $>97 $2 $3 $4 - -# strip trailing dot from any host name that may appear -R< $* > $* < @ $* . > $: < $1 > $2 < @ $3 > - -# handle local: syntax -- use old user, either with or without host -R< > $* < @ $* > $* $#local $@ $1@$2 $: $1 -R< > $+ $#local $@ $1 $: $1 - -# handle local:user@host syntax -- ignore host part -R< $+ @ $+ > $* < @ $* > $: < $1 > $3 < @ $4 > - -# handle local:user syntax -R< $+ > $* <@ $* > $* $#local $@ $2@$3 $: $1 -R< $+ > $* $#local $@ $2 $: $1 - -################################################################### -### Ruleset 93 -- convert header names to masqueraded form ### -################################################################### - -S93 - - -# special case the users that should be exposed -R$=E < @ *LOCAL* > $@ $1 < @ $j . > leave exposed -R$=E < @ $=M . > $@ $1 < @ $2 . > -R$=E < @ $=w . > $@ $1 < @ $2 . > - -# handle domain-specific masquerading -R$* < @ $=M . > $* $: $1 < @ $2 . @ $M > $3 convert masqueraded doms -R$* < @ $=w . > $* $: $1 < @ $2 . @ $M > $3 -R$* < @ *LOCAL* > $* $: $1 < @ $j . @ $M > $2 -R$* < @ $+ @ > $* $: $1 < @ $2 > $3 $M is null -R$* < @ $+ @ $+ > $* $: $1 < @ $3 . > $4 $M is not null - -################################################################### -### Ruleset 94 -- convert envelope names to masqueraded form ### -################################################################### - -S94 -R$* < @ *LOCAL* > $* $: $1 < @ $j . > $2 - -################################################################### -### Ruleset 98 -- local part of ruleset zero (can be null) ### -################################################################### - -S98 - -# addresses sent to foo@host.REDIRECT will give a 551 error code -R$* < @ $+ .REDIRECT. > $: $1 < @ $2 . REDIRECT . > < ${opMode} > -R$* < @ $+ .REDIRECT. > <i> $: $1 < @ $2 . REDIRECT. > -R$* < @ $+ .REDIRECT. > < $- > $# error $@ 5.1.1 $: "551 User has moved; please try " <$1@$2> - - - -###################################################################### -### CanonAddr -- Convert an address into a standard form for -### relay checking. Route address syntax is -### crudely converted into a %-hack address. -### -### Parameters: -### $1 -- full recipient address -### -### Returns: -### parsed address, not in source route form -###################################################################### - -SCanonAddr -R$* $: $>Parse0 $>3 $1 make domain canonical -R< @ $+ > : $* @ $* < @ $1 > : $2 % $3 change @ to % in src route -R$* < @ $+ > : $* : $* $3 $1 < @ $2 > : $4 change to % hack. -R$* < @ $+ > : $* $3 $1 < @ $2 > - -###################################################################### -### ParseRecipient -- Strip off hosts in $=R as well as possibly -### $* $=m or the access database. -### Check user portion for host separators. -### -### Parameters: -### $1 -- full recipient address -### -### Returns: -### parsed, non-local-relaying address -###################################################################### - -SParseRecipient -R$* $: <?> $>CanonAddr $1 -R<?> $* < @ $* . > <?> $1 < @ $2 > strip trailing dots -R<?> $- < @ $* > $: <?> $(dequote $1 $) < @ $2 > dequote local part - -# if no $=O character, no host in the user portion, we are done -R<?> $* $=O $* < @ $* > $: <NO> $1 $2 $3 < @ $4> -R<?> $* $@ $1 - - - -R<NO> $* < @ $* $=R > $: <RELAY> $1 < @ $2 $3 > - -R<RELAY> $* < @ $* > $@ $>ParseRecipient $1 -R<$-> $* $@ $2 - -###################################################################### -### check_relay -- check hostname/address on SMTP startup -###################################################################### - -SLocal_check_relay -Scheck_relay -R$* $: $1 $| $>"Local_check_relay" $1 -R$* $| $* $| $#$* $#$3 -R$* $| $* $| $* $@ $>"Basic_check_relay" $1 $| $2 - -SBasic_check_relay -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - - - -###################################################################### -### check_mail -- check SMTP `MAIL FROM:' command argument -###################################################################### - -SLocal_check_mail -Scheck_mail -R$* $: $1 $| $>"Local_check_mail" $1 -R$* $| $#$* $#$2 -R$* $| $* $@ $>"Basic_check_mail" $1 - -SBasic_check_mail -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - -R<> $@ <OK> -R$* $: <?> $>CanonAddr $1 -R<?> $* < @ $+ . > <?> $1 < @ $2 > strip trailing dots -# handle non-DNS hostnames (*.bitnet, *.decnet, *.uucp, etc) -R<?> $* < $* $=P > $* $: <OK> $1 < @ $2 $3 > $4 -R<?> $* < @ $+ > $* $: <? $(resolve $2 $: $2 <PERM> $) > $1 < @ $2 > $3 -R<? $* <$->> $* < @ $+ > $* - $: <$2> $3 < @ $4 > $5 - -# handle case of @localhost on address -R<$+> $* < @localhost > $: < ? $&{client_name} > <$1> $2 < @localhost > -R<$+> $* < @localhost.$m > - $: < ? $&{client_name} > <$1> $2 < @localhost.$m > -R<$+> $* < @localhost.UUCP > - $: < ? $&{client_name} > <$1> $2 < @localhost.UUCP > -R<? $=w> <$+> $* <?> <$2> $3 -R<? $+> <$+> $* $#error $@ 5.5.4 $: "553 Real domain name required" -R<?> <$+> $* $: <$1> $2 - - -# handle case of no @domain on address -R<?> $* $: < ? $&{client_name} > $1 -R<?> $* $@ <OK> ...local unqualed ok -R<? $+> $* $#error $@ 5.5.4 $: "553 Domain name required" - ...remote is not -# check results -R<?> $* $@ <OK> -R<OK> $* $@ <OK> -R<TEMP> $* $#error $@ 4.1.8 $: "451 Sender domain must resolve" -R<PERM> $* $#error $@ 5.1.8 $: "501 Sender domain must exist" - -###################################################################### -### check_rcpt -- check SMTP `RCPT TO:' command argument -###################################################################### - -SLocal_check_rcpt -Scheck_rcpt -R$* $: $1 $| $>"Local_check_rcpt" $1 -R$* $| $#$* $#$2 -R$* $| $* $@ $>"Basic_check_rcpt" $1 - -SBasic_check_rcpt -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - -R$* $: $>ParseRecipient $1 strip relayable hosts - - - - -# anything terminating locally is ok -R$+ < @ $=w > $@ OK -R$+ < @ $* $=R > $@ OK - - -# check for local user (i.e. unqualified address) -R$* $: <?> $1 -R<?> $* < @ $+ > $: <REMOTE> $1 < @ $2 > -# local user is ok -R<?> $+ $@ OK -R<$+> $* $: $2 - -# anything originating locally is ok -R$* $: <?> $&{client_name} -# check if bracketed IP address (forward lookup != reverse lookup) -R<?> [$+] $: <BAD> [$1] -# pass to name server to make hostname canonical -R<?> $* $~P $: <?> $[ $1 $2 $] -R<$-> $* $: $2 -R$* . $1 strip trailing dots -R$@ $@ OK -R$=w $@ OK -R$* $=R $@ OK - -# check IP address -R$* $: $&{client_addr} -R$@ $@ OK originated locally -R0 $@ OK originated locally -R$=R $* $@ OK relayable IP address -R$* $: [ $1 ] put brackets around it... -R$=w $@ OK ... and see if it is local - - -# anything else is bogus -R$* $#error $@ 5.7.1 $: "550 Relaying denied" - -# -###################################################################### -###################################################################### -##### -##### MAILER DEFINITIONS -##### -###################################################################### -###################################################################### - - -################################################## -### Local and Program Mailer specification ### -################################################## - -##### @(#)local.m4 8.30 (Berkeley) 6/30/1998 ##### - -Mlocal, P=/usr/bin/rmail, F=lsDFMAw5:/|@qm9, S=10/30, R=20/40, - T=DNS/RFC822/X-Unix, - A=rmail -d $u -Mprog, P=/usr/bin/sh, F=lsDFMoqeu9, S=10/30, R=20/40, D=$z:/, - T=X-Unix, - A=sh -c $u - -# -# Envelope sender rewriting -# -S10 -R<@> $n errors to mailer-daemon -R@ <@ $*> $n temporarily bypass Sun bogosity -R$+ $: $>50 $1 add local domain if needed -R$* $: $>94 $1 do masquerading - -# -# Envelope recipient rewriting -# -S20 -R$+ < @ $* > $: $1 strip host part - -# -# Header sender rewriting -# -S30 -R<@> $n errors to mailer-daemon -R@ <@ $*> $n temporarily bypass Sun bogosity -R$+ $: $>50 $1 add local domain if needed -R$* $: $>93 $1 do masquerading - -# -# Header recipient rewriting -# -S40 -R$+ $: $>50 $1 add local domain if needed - -# -# Common code to add local domain name (only if always-add-domain) -# -S50 - -##################################### -### SMTP Mailer specification ### -##################################### - -##### @(#)smtp.m4 8.38 (Berkeley) 5/19/1998 ##### - -Msmtp, P=[IPC], F=mDFMuX, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Mesmtp, P=[IPC], F=mDFMuXa, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Msmtp8, P=[IPC], F=mDFMuX8, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Mrelay, P=[IPC], F=mDFMuXa8, S=11/31, R=61, E=\r\n, L=2040, - T=DNS/RFC822/SMTP, - A=IPC $h - -# -# envelope sender rewriting -# -S11 -R$+ $: $>51 $1 sender/recipient common -R$* :; <@> $@ list:; special case -R$* $: $>61 $1 qualify unqual'ed names -R$+ $: $>94 $1 do masquerading - - -# -# envelope recipient rewriting -- -# also header recipient if not masquerading recipients -# -S21 -R$+ $: $>51 $1 sender/recipient common -R$+ $: $>61 $1 qualify unqual'ed names - - -# -# header sender and masquerading header recipient rewriting -# -S31 -R$+ $: $>51 $1 sender/recipient common -R:; <@> $@ list:; special case - -# do special header rewriting -R$* <@> $* $@ $1 <@> $2 pass null host through -R< @ $* > $* $@ < @ $1 > $2 pass route-addr through -R$* $: $>61 $1 qualify unqual'ed names -R$+ $: $>93 $1 do masquerading - - -# -# convert pseudo-domain addresses to real domain addresses -# -S51 - -# pass <route-addr>s through -R< @ $+ > $* $@ < @ $1 > $2 resolve <route-addr> - -# output fake domains as user%fake@relay - -# do UUCP heuristics; note that these are shared with UUCP mailers -R$+ < @ $+ .UUCP. > $: < $2 ! > $1 convert to UUCP form -R$+ < @ $* > $* $@ $1 < @ $2 > $3 not UUCP form - -# leave these in .UUCP form to avoid further tampering -R< $&h ! > $- ! $+ $@ $2 < @ $1 .UUCP. > -R< $&h ! > $-.$+ ! $+ $@ $3 < @ $1.$2 > -R< $&h ! > $+ $@ $1 < @ $&h .UUCP. > -R< $+ ! > $+ $: $1 ! $2 < @ $Y > use UUCP_RELAY -R$+ < @ $+ : $+ > $@ $1 < @ $3 > strip mailer: part -R$+ < @ > $: $1 < @ *LOCAL* > if no UUCP_RELAY - - -# -# common sender and masquerading recipient rewriting -# -S61 - -R$* < @ $* > $* $@ $1 < @ $2 > $3 already fully qualified -R$+ $@ $1 < @ *LOCAL* > add local qualification - - -# -# relay mailer header masquerading recipient rewriting -# -S71 - -R$+ $: $>61 $1 -R$+ $: $>93 $1 diff --git a/cf/cf/generic-hpux10.mc b/cf/cf/generic-hpux10.mc deleted file mode 100644 index 2000505..0000000 --- a/cf/cf/generic-hpux10.mc +++ /dev/null @@ -1,26 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a generic configuration file for HP-UX 9.x. -# It has support for local and SMTP mail only. If you want to -# customize it, copy it to a name appropriate for your environment -# and do the modifications there. -# - -divert(0)dnl -VERSIONID(`@(#)generic-hpux10.mc 8.8 (Berkeley) 5/19/1998') -OSTYPE(hpux10)dnl -DOMAIN(generic)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/cf/cf/generic-hpux9.cf b/cf/cf/generic-hpux9.cf deleted file mode 100644 index 7b1736c..0000000 --- a/cf/cf/generic-hpux9.cf +++ /dev/null @@ -1,1062 +0,0 @@ -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -###################################################################### -###################################################################### -##### -##### SENDMAIL CONFIGURATION FILE -##### -##### built by gshapiro@knecht.sendmail.org on Thu Feb 4 16:39:22 PST 1999 -##### in /home/eric/src/sendmail/cf/cf -##### using ../ as configuration include directory -##### -###################################################################### -###################################################################### - -##### @(#)cfhead.m4 8.23 (Berkeley) 10/6/1998 ##### -##### @(#)cf.m4 8.29 (Berkeley) 5/19/1998 ##### -##### @(#)generic-hpux9.mc 8.8 (Berkeley) 5/19/1998 ##### - -##### @(#)hpux9.m4 8.19 (Berkeley) 10/6/1998 ##### - - -##### @(#)generic.m4 8.9 (Berkeley) 5/19/1998 ##### - -##### @(#)redirect.m4 8.10 (Berkeley) 5/19/1998 ##### - - - - -##### @(#)use_cw_file.m4 8.6 (Berkeley) 5/19/1998 ##### - - - -##### @(#)proto.m4 8.243 (Berkeley) 2/2/1999 ##### - - -# level 8 config file format -V8/Berkeley - -# override file safeties - setting this option compromises system security -# need to set this now for the sake of class files -#O DontBlameSendmail=safe - -################## -# local info # -################## - -Cwlocalhost -# file containing names of hosts for which we receive email -Fw/etc/sendmail.cw - -# my official domain name -# ... define this only if sendmail cannot automatically determine your domain -#Dj$w.Foo.COM - - -CP. - -# "Smart" relay host (may be null) -DS - - -# operators that cannot be in local usernames (i.e., network indicators) -CO @ % ! - -# a class with just dot (for identifying canonical names) -C.. - -# a class with just a left bracket (for identifying domain literals) -C[[ - - - - - - - - - -# Resolve map (to check if a host exists in check_mail) -Kresolve host -a<OK> -T<TEMP> - -# Hosts that will permit relaying ($=R) -FR-o /etc/mail/relay-domains - -# who I send unqualified names to (null means deliver locally) -DR - -# who gets all local email traffic ($R has precedence for unqualified names) -DH - -# dequoting map -Kdequote dequote - -# class E: names that should be exposed as from this host, even if we masquerade -# class L: names that should be delivered locally, even if we have a relay -# class M: domains that should be converted to $M -#CL root -CE root - -# who I masquerade as (null for no masquerading) (see also $=M) -DM - -# my name for error messages -DnMAILER-DAEMON - - -CPREDIRECT - -# Configuration version number -DZ8.9.3 - - -############### -# Options # -############### - -# strip message body to 7 bits on input? -O SevenBitInput=False - -# 8-bit data handling -O EightBitMode=pass8 - - -# wait for alias file rebuild (default units: minutes) -O AliasWait=10 - -# location of alias file -O AliasFile=/usr/lib/aliases - -# minimum number of free blocks on filesystem -O MinFreeBlocks=100 - -# maximum message size -#O MaxMessageSize=1000000 - -# substitution for space (blank) characters -O BlankSub=. - -# avoid connecting to "expensive" mailers on initial submission? -O HoldExpensive=False - -# checkpoint queue runs after every N successful deliveries -#O CheckpointInterval=10 - -# default delivery mode -O DeliveryMode=background - -# automatically rebuild the alias database? -#O AutoRebuildAliases - -# error message header/file -#O ErrorHeader=/etc/sendmail.oE - -# error mode -#O ErrorMode=print - -# save Unix-style "From_" lines at top of header? -#O SaveFromLine - -# temporary file mode -O TempFileMode=0600 - -# match recipients against GECOS field? -#O MatchGECOS - -# maximum hop count -#O MaxHopCount=17 - -# location of help file -O HelpFile=/usr/lib/sendmail.hf - -# ignore dots as terminators in incoming messages? -#O IgnoreDots - -# name resolver options -#O ResolverOptions=+AAONLY - -# deliver MIME-encapsulated error messages? -O SendMimeErrors=True - -# Forward file search path -O ForwardPath=$z/.forward.$w+$h:$z/.forward+$h:$z/.forward.$w:$z/.forward - -# open connection cache size -O ConnectionCacheSize=2 - -# open connection cache timeout -O ConnectionCacheTimeout=5m - -# persistent host status directory -#O HostStatusDirectory=.hoststat - -# single thread deliveries (requires HostStatusDirectory)? -#O SingleThreadDelivery - -# use Errors-To: header? -O UseErrorsTo=False - -# log level -O LogLevel=9 - -# send to me too, even in an alias expansion? -#O MeToo - -# verify RHS in newaliases? -O CheckAliases=False - -# default messages to old style headers if no special punctuation? -O OldStyleHeaders=True - -# SMTP daemon options -#O DaemonPortOptions=Port=esmtp - -# privacy flags -O PrivacyOptions=authwarnings - -# who (if anyone) should get extra copies of error messages -#O PostMasterCopy=Postmaster - -# slope of queue-only function -#O QueueFactor=600000 - -# queue directory -O QueueDirectory=/usr/spool/mqueue - -# timeouts (many of these) -#O Timeout.initial=5m -#O Timeout.connect=5m -#O Timeout.iconnect=5m -#O Timeout.helo=5m -#O Timeout.mail=10m -#O Timeout.rcpt=1h -#O Timeout.datainit=5m -#O Timeout.datablock=1h -#O Timeout.datafinal=1h -#O Timeout.rset=5m -#O Timeout.quit=2m -#O Timeout.misc=2m -#O Timeout.command=1h -#O Timeout.ident=30s -#O Timeout.fileopen=60s -O Timeout.queuereturn=5d -#O Timeout.queuereturn.normal=5d -#O Timeout.queuereturn.urgent=2d -#O Timeout.queuereturn.non-urgent=7d -O Timeout.queuewarn=4h -#O Timeout.queuewarn.normal=4h -#O Timeout.queuewarn.urgent=1h -#O Timeout.queuewarn.non-urgent=12h -#O Timeout.hoststatus=30m - -# should we not prune routes in route-addr syntax addresses? -#O DontPruneRoutes - -# queue up everything before forking? -O SuperSafe=True - -# status file -O StatusFile=/usr/lib/sendmail.st - -# time zone handling: -# if undefined, use system default -# if defined but null, use TZ envariable passed in -# if defined and non-null, use that info -O TimeZoneSpec= - -# default UID (can be username or userid:groupid) -#O DefaultUser=mailnull - -# list of locations of user database file (null means no lookup) -#O UserDatabaseSpec=/etc/userdb - -# fallback MX host -#O FallbackMXhost=fall.back.host.net - -# if we are the best MX host for a site, try it directly instead of config err -#O TryNullMXList - -# load average at which we just queue messages -#O QueueLA=8 - -# load average at which we refuse connections -#O RefuseLA=12 - -# maximum number of children we allow at one time -#O MaxDaemonChildren=12 - -# maximum number of new connections per second -#O ConnectionRateThrottle=3 - -# work recipient factor -#O RecipientFactor=30000 - -# deliver each queued job in a separate process? -#O ForkEachJob - -# work class factor -#O ClassFactor=1800 - -# work time factor -#O RetryFactor=90000 - -# shall we sort the queue by hostname first? -#O QueueSortOrder=priority - -# minimum time in queue before retry -#O MinQueueAge=30m - -# default character set -#O DefaultCharSet=iso-8859-1 - -# service switch file (ignored on Solaris, Ultrix, OSF/1, others) -#O ServiceSwitchFile=/etc/service.switch - -# hosts file (normally /etc/hosts) -#O HostsFile=/etc/hosts - -# dialup line delay on connection failure -#O DialDelay=10s - -# action to take if there are no recipients in the message -#O NoRecipientAction=add-to-undisclosed - -# chrooted environment for writing to files -#O SafeFileEnvironment=/arch - -# are colons OK in addresses? -#O ColonOkInAddr - -# how many jobs can you process in the queue? -#O MaxQueueRunSize=10000 - -# shall I avoid expanding CNAMEs (violates protocols)? -#O DontExpandCnames - -# SMTP initial login message (old $e macro) -O SmtpGreetingMessage=$j Sendmail $v/$Z; $b - -# UNIX initial From header format (old $l macro) -O UnixFromLine=From $g $d - -# From: lines that have embedded newlines are unwrapped onto one line -#O SingleLineFromHeader=False - -# Allow HELO SMTP command that does not include a host name -#O AllowBogusHELO=False - -# Characters to be quoted in a full name phrase (@,;:\()[] are automatic) -#O MustQuoteChars=. - -# delimiter (operator) characters (old $o macro) -O OperatorChars=.:%@!^/[]+ - -# shall I avoid calling initgroups(3) because of high NIS costs? -#O DontInitGroups - -# are group-writable :include: and .forward files (un)trustworthy? -#O UnsafeGroupWrites - -# where do errors that occur when sending errors get sent? -#O DoubleBounceAddress=postmaster - -# what user id do we assume for the majority of the processing? -#O RunAsUser=sendmail - -# maximum number of recipients per SMTP envelope -#O MaxRecipientsPerMessage=100 - -# shall we get local names from our installed interfaces? -#O DontProbeInterfaces - - - - - - -########################### -# Message precedences # -########################### - -Pfirst-class=0 -Pspecial-delivery=100 -Plist=-30 -Pbulk=-60 -Pjunk=-100 - -##################### -# Trusted users # -##################### - -# this is equivalent to setting class "t" -#Ft/etc/sendmail.ct -Troot -Tdaemon -Tuucp - -######################### -# Format of headers # -######################### - -H?P?Return-Path: <$g> -HReceived: $?sfrom $s $.$?_($?s$|from $.$_) - $.by $j ($v/$Z)$?r with $r$. id $i$?u - for $u; $|; - $.$b -H?D?Resent-Date: $a -H?D?Date: $a -H?F?Resent-From: $?x$x <$g>$|$g$. -H?F?From: $?x$x <$g>$|$g$. -H?x?Full-Name: $x -# HPosted-Date: $a -# H?l?Received-Date: $b -H?M?Resent-Message-Id: <$t.$i@$j> -H?M?Message-Id: <$t.$i@$j> -# -###################################################################### -###################################################################### -##### -##### REWRITING RULES -##### -###################################################################### -###################################################################### - -############################################ -### Ruleset 3 -- Name Canonicalization ### -############################################ -S3 - -# handle null input (translate to <@> special case) -R$@ $@ <@> - -# strip group: syntax (not inside angle brackets!) and trailing semicolon -R$* $: $1 <@> mark addresses -R$* < $* > $* <@> $: $1 < $2 > $3 unmark <addr> -R@ $* <@> $: @ $1 unmark @host:... -R$* :: $* <@> $: $1 :: $2 unmark node::addr -R:include: $* <@> $: :include: $1 unmark :include:... -R$* [ $* : $* ] <@> $: $1 [ $2 : $3 ] unmark IPv6 addrs -R$* : $* [ $* ] $: $1 : $2 [ $3 ] <@> remark if leading colon -R$* : $* <@> $: $2 strip colon if marked -R$* <@> $: $1 unmark -R$* ; $1 strip trailing semi -R$* < $* ; > $1 < $2 > bogus bracketed semi - -# null input now results from list:; syntax -R$@ $@ :; <@> - -# strip angle brackets -- note RFC733 heuristic to get innermost item -R$* $: < $1 > housekeeping <> -R$+ < $* > < $2 > strip excess on left -R< $* > $+ < $1 > strip excess on right -R<> $@ < @ > MAIL FROM:<> case -R< $+ > $: $1 remove housekeeping <> - -# make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later -R@ $+ , $+ @ $1 : $2 change all "," to ":" - -# localize and dispose of route-based addresses -R@ $+ : $+ $@ $>96 < @$1 > : $2 handle <route-addr> - -# find focus for list syntax -R $+ : $* ; @ $+ $@ $>96 $1 : $2 ; < @ $3 > list syntax -R $+ : $* ; $@ $1 : $2; list syntax - -# find focus for @ syntax addresses -R$+ @ $+ $: $1 < @ $2 > focus on domain -R$+ < $+ @ $+ > $1 $2 < @ $3 > move gaze right -R$+ < @ $+ > $@ $>96 $1 < @ $2 > already canonical - -# do some sanity checking -R$* < @ $* : $* > $* $1 < @ $2 $3 > $4 nix colons in addrs - -# convert old-style addresses to a domain-based address -R$- ! $+ $@ $>96 $2 < @ $1 .UUCP > resolve uucp names -R$+ . $- ! $+ $@ $>96 $3 < @ $1 . $2 > domain uucps -R$+ ! $+ $@ $>96 $2 < @ $1 .UUCP > uucp subdomains - -# if we have % signs, take the rightmost one -R$* % $* $1 @ $2 First make them all @s. -R$* @ $* @ $* $1 % $2 @ $3 Undo all but the last. -R$* @ $* $@ $>96 $1 < @ $2 > Insert < > and finish - -# else we must be a local name -R$* $@ $>96 $1 - - -################################################ -### Ruleset 96 -- bottom half of ruleset 3 ### -################################################ - -S96 - -# handle special cases for local names -R$* < @ localhost > $* $: $1 < @ $j . > $2 no domain at all -R$* < @ localhost . $m > $* $: $1 < @ $j . > $2 local domain -R$* < @ localhost . UUCP > $* $: $1 < @ $j . > $2 .UUCP domain -R$* < @ [ $+ ] > $* $: $1 < @@ [ $2 ] > $3 mark [a.b.c.d] -R$* < @@ $=w > $* $: $1 < @ $j . > $3 self-literal -R$* < @@ $+ > $* $@ $1 < @ $2 > $3 canon IP addr - - - - - -# if really UUCP, handle it immediately - -# try UUCP traffic as a local address -R$* < @ $+ . UUCP > $* $: $1 < @ $[ $2 $] . UUCP . > $3 -R$* < @ $+ . . UUCP . > $* $@ $1 < @ $2 . > $3 - -# pass to name server to make hostname canonical -R$* < @ $* $~P > $* $: $1 < @ $[ $2 $3 $] > $4 - -# local host aliases and pseudo-domains are always canonical -R$* < @ $=w > $* $: $1 < @ $2 . > $3 -R$* < @ $j > $* $: $1 < @ $j . > $2 -R$* < @ $=M > $* $: $1 < @ $2 . > $3 -R$* < @ $* $=P > $* $: $1 < @ $2 $3 . > $4 -R$* < @ $* . . > $* $1 < @ $2 . > $3 - - -################################################## -### Ruleset 4 -- Final Output Post-rewriting ### -################################################## -S4 - -R$* <@> $@ handle <> and list:; - -# strip trailing dot off possibly canonical name -R$* < @ $+ . > $* $1 < @ $2 > $3 - -# eliminate internal code -- should never get this far! -R$* < @ *LOCAL* > $* $1 < @ $j > $2 - -# externalize local domain info -R$* < $+ > $* $1 $2 $3 defocus -R@ $+ : @ $+ : $+ @ $1 , @ $2 : $3 <route-addr> canonical -R@ $* $@ @ $1 ... and exit - -# UUCP must always be presented in old form -R$+ @ $- . UUCP $2!$1 u@h.UUCP => h!u - -# delete duplicate local names -R$+ % $=w @ $=w $1 @ $2 u%host@host => u@host - - - -############################################################## -### Ruleset 97 -- recanonicalize and call ruleset zero ### -### (used for recursive calls) ### -############################################################## - -S97 -R$* $: $>3 $1 -R$* $@ $>0 $1 - - -###################################### -### Ruleset 0 -- Parse Address ### -###################################### - -S0 - -R$* $: $>Parse0 $1 initial parsing -R<@> $#local $: <@> special case error msgs -R$* $: $>98 $1 handle local hacks -R$* $: $>Parse1 $1 final parsing - -# -# Parse0 -- do initial syntax checking and eliminate local addresses. -# This should either return with the (possibly modified) input -# or return with a #error mailer. It should not return with a -# #mailer other than the #error mailer. -# - -SParse0 -R<@> $@ <@> special case error msgs -R$* : $* ; <@> $#error $@ 5.1.3 $: "List:; syntax illegal for recipient addresses" -#R@ <@ $* > < @ $1 > catch "@@host" bogosity -R<@ $+> $#error $@ 5.1.3 $: "User address required" -R$* $: <> $1 -R<> $* < @ [ $+ ] > $* $1 < @ [ $2 ] > $3 -R<> $* <$* : $* > $* $#error $@ 5.1.3 $: "Colon illegal in host name part" -R<> $* $1 -R$* < @ . $* > $* $#error $@ 5.1.2 $: "Invalid host name" -R$* < @ $* .. $* > $* $#error $@ 5.1.2 $: "Invalid host name" - -# now delete the local info -- note $=O to find characters that cause forwarding -R$* < @ > $* $@ $>Parse0 $>3 $1 user@ => user -R< @ $=w . > : $* $@ $>Parse0 $>3 $2 @here:... -> ... -R$- < @ $=w . > $: $(dequote $1 $) < @ $2 . > dequote "foo"@here -R< @ $+ > $#error $@ 5.1.3 $: "User address required" -R$* $=O $* < @ $=w . > $@ $>Parse0 $>3 $1 $2 $3 ...@here -> ... -R$- $: $(dequote $1 $) < @ *LOCAL* > dequote "foo" -R< @ *LOCAL* > $#error $@ 5.1.3 $: "User address required" -R$* $=O $* < @ *LOCAL* > - $@ $>Parse0 $>3 $1 $2 $3 ...@*LOCAL* -> ... -R$* < @ *LOCAL* > $: $1 - -# -# Parse1 -- the bottom half of ruleset 0. -# - -SParse1 -# handle numeric address spec -R$* < @ [ $+ ] > $* $: $>98 $1 < @ [ $2 ] > $3 numeric internet spec -R$* < @ [ $+ ] > $* $#esmtp $@ [$2] $: $1 < @ [$2] > $3 still numeric: send - - -# short circuit local delivery so forwarded email works -R$=L < @ $=w . > $#local $: @ $1 special local names -R$+ < @ $=w . > $#local $: $1 regular local name - - -# resolve remotely connected UUCP links (if any) - -# resolve fake top level domains by forwarding to other hosts - - - -# pass names that still have a host to a smarthost (if defined) -R$* < @ $* > $* $: $>95 < $S > $1 < @ $2 > $3 glue on smarthost name - -# deal with other remote names -R$* < @$* > $* $#esmtp $@ $2 $: $1 < @ $2 > $3 user@host.domain - -# handle locally delivered names -R$=L $#local $: @ $1 special local names -R$+ $#local $: $1 regular local names - -########################################################################### -### Ruleset 5 -- special rewriting after aliases have been expanded ### -########################################################################### - -S5 - -# deal with plussed users so aliases work nicely -R$+ + * $#local $@ $&h $: $1 -R$+ + $* $#local $@ + $2 $: $1 + * - -# prepend an empty "forward host" on the front -R$+ $: <> $1 - - -# see if we have a relay or a hub -R< > $+ $: < $H > $1 try hub -R< > $+ $: < $R > $1 try relay -R< > $+ $: < > < $1 $&h > nope, restore +detail -R< > < $+ + $* > $* < > < $1 > + $2 $3 find the user part -R< > < $+ > + $* $#local $@ $2 $: @ $1 strip the extra + -R< > < $+ > $@ $1 no +detail -R$+ $: $1 <> $&h add +detail back in -R$+ <> + $* $: $1 + $2 check whether +detail -R$+ <> $* $: $1 else discard -R< local : $* > $* $: $>95 < local : $1 > $2 no host extension -R< error : $* > $* $: $>95 < error : $1 > $2 no host extension -R< $- : $+ > $+ $: $>95 < $1 : $2 > $3 < @ $2 > -R< $+ > $+ $@ $>95 < $1 > $2 < @ $1 > - - -################################################################### -### Ruleset 95 -- canonify mailer:[user@]host syntax to triple ### -################################################################### - -S95 -R< > $* $@ $1 strip off null relay -R< error : $- $+ > $* $#error $@ $(dequote $1 $) $: $2 -R< local : $* > $* $>CanonLocal < $1 > $2 -R< $- : $+ @ $+ > $*<$*>$* $# $1 $@ $3 $: $2<@$3> use literal user -R< $- : $+ > $* $# $1 $@ $2 $: $3 try qualified mailer -R< $=w > $* $@ $2 delete local host -R< $+ > $* $#relay $@ $1 $: $2 use unqualified mailer - -################################################################### -### Ruleset CanonLocal -- canonify local: syntax ### -################################################################### - -SCanonLocal -# strip local host from routed addresses -R< $* > < @ $+ > : $+ $@ $>97 $3 -R< $* > $+ $=O $+ < @ $+ > $@ $>97 $2 $3 $4 - -# strip trailing dot from any host name that may appear -R< $* > $* < @ $* . > $: < $1 > $2 < @ $3 > - -# handle local: syntax -- use old user, either with or without host -R< > $* < @ $* > $* $#local $@ $1@$2 $: $1 -R< > $+ $#local $@ $1 $: $1 - -# handle local:user@host syntax -- ignore host part -R< $+ @ $+ > $* < @ $* > $: < $1 > $3 < @ $4 > - -# handle local:user syntax -R< $+ > $* <@ $* > $* $#local $@ $2@$3 $: $1 -R< $+ > $* $#local $@ $2 $: $1 - -################################################################### -### Ruleset 93 -- convert header names to masqueraded form ### -################################################################### - -S93 - - -# special case the users that should be exposed -R$=E < @ *LOCAL* > $@ $1 < @ $j . > leave exposed -R$=E < @ $=M . > $@ $1 < @ $2 . > -R$=E < @ $=w . > $@ $1 < @ $2 . > - -# handle domain-specific masquerading -R$* < @ $=M . > $* $: $1 < @ $2 . @ $M > $3 convert masqueraded doms -R$* < @ $=w . > $* $: $1 < @ $2 . @ $M > $3 -R$* < @ *LOCAL* > $* $: $1 < @ $j . @ $M > $2 -R$* < @ $+ @ > $* $: $1 < @ $2 > $3 $M is null -R$* < @ $+ @ $+ > $* $: $1 < @ $3 . > $4 $M is not null - -################################################################### -### Ruleset 94 -- convert envelope names to masqueraded form ### -################################################################### - -S94 -R$* < @ *LOCAL* > $* $: $1 < @ $j . > $2 - -################################################################### -### Ruleset 98 -- local part of ruleset zero (can be null) ### -################################################################### - -S98 - -# addresses sent to foo@host.REDIRECT will give a 551 error code -R$* < @ $+ .REDIRECT. > $: $1 < @ $2 . REDIRECT . > < ${opMode} > -R$* < @ $+ .REDIRECT. > <i> $: $1 < @ $2 . REDIRECT. > -R$* < @ $+ .REDIRECT. > < $- > $# error $@ 5.1.1 $: "551 User has moved; please try " <$1@$2> - - - -###################################################################### -### CanonAddr -- Convert an address into a standard form for -### relay checking. Route address syntax is -### crudely converted into a %-hack address. -### -### Parameters: -### $1 -- full recipient address -### -### Returns: -### parsed address, not in source route form -###################################################################### - -SCanonAddr -R$* $: $>Parse0 $>3 $1 make domain canonical -R< @ $+ > : $* @ $* < @ $1 > : $2 % $3 change @ to % in src route -R$* < @ $+ > : $* : $* $3 $1 < @ $2 > : $4 change to % hack. -R$* < @ $+ > : $* $3 $1 < @ $2 > - -###################################################################### -### ParseRecipient -- Strip off hosts in $=R as well as possibly -### $* $=m or the access database. -### Check user portion for host separators. -### -### Parameters: -### $1 -- full recipient address -### -### Returns: -### parsed, non-local-relaying address -###################################################################### - -SParseRecipient -R$* $: <?> $>CanonAddr $1 -R<?> $* < @ $* . > <?> $1 < @ $2 > strip trailing dots -R<?> $- < @ $* > $: <?> $(dequote $1 $) < @ $2 > dequote local part - -# if no $=O character, no host in the user portion, we are done -R<?> $* $=O $* < @ $* > $: <NO> $1 $2 $3 < @ $4> -R<?> $* $@ $1 - - - -R<NO> $* < @ $* $=R > $: <RELAY> $1 < @ $2 $3 > - -R<RELAY> $* < @ $* > $@ $>ParseRecipient $1 -R<$-> $* $@ $2 - -###################################################################### -### check_relay -- check hostname/address on SMTP startup -###################################################################### - -SLocal_check_relay -Scheck_relay -R$* $: $1 $| $>"Local_check_relay" $1 -R$* $| $* $| $#$* $#$3 -R$* $| $* $| $* $@ $>"Basic_check_relay" $1 $| $2 - -SBasic_check_relay -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - - - -###################################################################### -### check_mail -- check SMTP `MAIL FROM:' command argument -###################################################################### - -SLocal_check_mail -Scheck_mail -R$* $: $1 $| $>"Local_check_mail" $1 -R$* $| $#$* $#$2 -R$* $| $* $@ $>"Basic_check_mail" $1 - -SBasic_check_mail -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - -R<> $@ <OK> -R$* $: <?> $>CanonAddr $1 -R<?> $* < @ $+ . > <?> $1 < @ $2 > strip trailing dots -# handle non-DNS hostnames (*.bitnet, *.decnet, *.uucp, etc) -R<?> $* < $* $=P > $* $: <OK> $1 < @ $2 $3 > $4 -R<?> $* < @ $+ > $* $: <? $(resolve $2 $: $2 <PERM> $) > $1 < @ $2 > $3 -R<? $* <$->> $* < @ $+ > $* - $: <$2> $3 < @ $4 > $5 - -# handle case of @localhost on address -R<$+> $* < @localhost > $: < ? $&{client_name} > <$1> $2 < @localhost > -R<$+> $* < @localhost.$m > - $: < ? $&{client_name} > <$1> $2 < @localhost.$m > -R<$+> $* < @localhost.UUCP > - $: < ? $&{client_name} > <$1> $2 < @localhost.UUCP > -R<? $=w> <$+> $* <?> <$2> $3 -R<? $+> <$+> $* $#error $@ 5.5.4 $: "553 Real domain name required" -R<?> <$+> $* $: <$1> $2 - - -# handle case of no @domain on address -R<?> $* $: < ? $&{client_name} > $1 -R<?> $* $@ <OK> ...local unqualed ok -R<? $+> $* $#error $@ 5.5.4 $: "553 Domain name required" - ...remote is not -# check results -R<?> $* $@ <OK> -R<OK> $* $@ <OK> -R<TEMP> $* $#error $@ 4.1.8 $: "451 Sender domain must resolve" -R<PERM> $* $#error $@ 5.1.8 $: "501 Sender domain must exist" - -###################################################################### -### check_rcpt -- check SMTP `RCPT TO:' command argument -###################################################################### - -SLocal_check_rcpt -Scheck_rcpt -R$* $: $1 $| $>"Local_check_rcpt" $1 -R$* $| $#$* $#$2 -R$* $| $* $@ $>"Basic_check_rcpt" $1 - -SBasic_check_rcpt -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - -R$* $: $>ParseRecipient $1 strip relayable hosts - - - - -# anything terminating locally is ok -R$+ < @ $=w > $@ OK -R$+ < @ $* $=R > $@ OK - - -# check for local user (i.e. unqualified address) -R$* $: <?> $1 -R<?> $* < @ $+ > $: <REMOTE> $1 < @ $2 > -# local user is ok -R<?> $+ $@ OK -R<$+> $* $: $2 - -# anything originating locally is ok -R$* $: <?> $&{client_name} -# check if bracketed IP address (forward lookup != reverse lookup) -R<?> [$+] $: <BAD> [$1] -# pass to name server to make hostname canonical -R<?> $* $~P $: <?> $[ $1 $2 $] -R<$-> $* $: $2 -R$* . $1 strip trailing dots -R$@ $@ OK -R$=w $@ OK -R$* $=R $@ OK - -# check IP address -R$* $: $&{client_addr} -R$@ $@ OK originated locally -R0 $@ OK originated locally -R$=R $* $@ OK relayable IP address -R$* $: [ $1 ] put brackets around it... -R$=w $@ OK ... and see if it is local - - -# anything else is bogus -R$* $#error $@ 5.7.1 $: "550 Relaying denied" - -# -###################################################################### -###################################################################### -##### -##### MAILER DEFINITIONS -##### -###################################################################### -###################################################################### - - -################################################## -### Local and Program Mailer specification ### -################################################## - -##### @(#)local.m4 8.30 (Berkeley) 6/30/1998 ##### - -Mlocal, P=/bin/rmail, F=lsDFMAw5:/|@qm9, S=10/30, R=20/40, - T=DNS/RFC822/X-Unix, - A=rmail -d $u -Mprog, P=/bin/sh, F=lsDFMoqeu9, S=10/30, R=20/40, D=$z:/, - T=X-Unix, - A=sh -c $u - -# -# Envelope sender rewriting -# -S10 -R<@> $n errors to mailer-daemon -R@ <@ $*> $n temporarily bypass Sun bogosity -R$+ $: $>50 $1 add local domain if needed -R$* $: $>94 $1 do masquerading - -# -# Envelope recipient rewriting -# -S20 -R$+ < @ $* > $: $1 strip host part - -# -# Header sender rewriting -# -S30 -R<@> $n errors to mailer-daemon -R@ <@ $*> $n temporarily bypass Sun bogosity -R$+ $: $>50 $1 add local domain if needed -R$* $: $>93 $1 do masquerading - -# -# Header recipient rewriting -# -S40 -R$+ $: $>50 $1 add local domain if needed - -# -# Common code to add local domain name (only if always-add-domain) -# -S50 - -##################################### -### SMTP Mailer specification ### -##################################### - -##### @(#)smtp.m4 8.38 (Berkeley) 5/19/1998 ##### - -Msmtp, P=[IPC], F=mDFMuX, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Mesmtp, P=[IPC], F=mDFMuXa, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Msmtp8, P=[IPC], F=mDFMuX8, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Mrelay, P=[IPC], F=mDFMuXa8, S=11/31, R=61, E=\r\n, L=2040, - T=DNS/RFC822/SMTP, - A=IPC $h - -# -# envelope sender rewriting -# -S11 -R$+ $: $>51 $1 sender/recipient common -R$* :; <@> $@ list:; special case -R$* $: $>61 $1 qualify unqual'ed names -R$+ $: $>94 $1 do masquerading - - -# -# envelope recipient rewriting -- -# also header recipient if not masquerading recipients -# -S21 -R$+ $: $>51 $1 sender/recipient common -R$+ $: $>61 $1 qualify unqual'ed names - - -# -# header sender and masquerading header recipient rewriting -# -S31 -R$+ $: $>51 $1 sender/recipient common -R:; <@> $@ list:; special case - -# do special header rewriting -R$* <@> $* $@ $1 <@> $2 pass null host through -R< @ $* > $* $@ < @ $1 > $2 pass route-addr through -R$* $: $>61 $1 qualify unqual'ed names -R$+ $: $>93 $1 do masquerading - - -# -# convert pseudo-domain addresses to real domain addresses -# -S51 - -# pass <route-addr>s through -R< @ $+ > $* $@ < @ $1 > $2 resolve <route-addr> - -# output fake domains as user%fake@relay - -# do UUCP heuristics; note that these are shared with UUCP mailers -R$+ < @ $+ .UUCP. > $: < $2 ! > $1 convert to UUCP form -R$+ < @ $* > $* $@ $1 < @ $2 > $3 not UUCP form - -# leave these in .UUCP form to avoid further tampering -R< $&h ! > $- ! $+ $@ $2 < @ $1 .UUCP. > -R< $&h ! > $-.$+ ! $+ $@ $3 < @ $1.$2 > -R< $&h ! > $+ $@ $1 < @ $&h .UUCP. > -R< $+ ! > $+ $: $1 ! $2 < @ $Y > use UUCP_RELAY -R$+ < @ $+ : $+ > $@ $1 < @ $3 > strip mailer: part -R$+ < @ > $: $1 < @ *LOCAL* > if no UUCP_RELAY - - -# -# common sender and masquerading recipient rewriting -# -S61 - -R$* < @ $* > $* $@ $1 < @ $2 > $3 already fully qualified -R$+ $@ $1 < @ *LOCAL* > add local qualification - - -# -# relay mailer header masquerading recipient rewriting -# -S71 - -R$+ $: $>61 $1 -R$+ $: $>93 $1 diff --git a/cf/cf/generic-hpux9.mc b/cf/cf/generic-hpux9.mc deleted file mode 100644 index 531b4ee..0000000 --- a/cf/cf/generic-hpux9.mc +++ /dev/null @@ -1,26 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a generic configuration file for HP-UX 9.x. -# It has support for local and SMTP mail only. If you want to -# customize it, copy it to a name appropriate for your environment -# and do the modifications there. -# - -divert(0)dnl -VERSIONID(`@(#)generic-hpux9.mc 8.8 (Berkeley) 5/19/1998') -OSTYPE(hpux9)dnl -DOMAIN(generic)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/cf/cf/generic-nextstep3.3.mc b/cf/cf/generic-nextstep3.3.mc deleted file mode 100644 index 1511ce7..0000000 --- a/cf/cf/generic-nextstep3.3.mc +++ /dev/null @@ -1,26 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a generic configuration file for NEXTSTEP 3.3 systems. -# It has support for local and SMTP mail only. If you want to -# customize it, copy it to a name appropriate for your environment -# and do the modifications there. -# - -divert(0)dnl -VERSIONID(`@(#)generic-nextstep3.3.mc 8.7 (Berkeley) 5/19/1998') -OSTYPE(nextstep)dnl -DOMAIN(generic)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/cf/cf/generic-osf1.cf b/cf/cf/generic-osf1.cf deleted file mode 100644 index 6cf9317..0000000 --- a/cf/cf/generic-osf1.cf +++ /dev/null @@ -1,1062 +0,0 @@ -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -###################################################################### -###################################################################### -##### -##### SENDMAIL CONFIGURATION FILE -##### -##### built by gshapiro@knecht.sendmail.org on Thu Feb 4 16:39:23 PST 1999 -##### in /home/eric/src/sendmail/cf/cf -##### using ../ as configuration include directory -##### -###################################################################### -###################################################################### - -##### @(#)cfhead.m4 8.23 (Berkeley) 10/6/1998 ##### -##### @(#)cf.m4 8.29 (Berkeley) 5/19/1998 ##### -##### @(#)generic-osf1.mc 8.8 (Berkeley) 5/19/1998 ##### - -##### @(#)osf1.m4 8.11 (Berkeley) 10/6/1998 ##### - - -##### @(#)generic.m4 8.9 (Berkeley) 5/19/1998 ##### - -##### @(#)redirect.m4 8.10 (Berkeley) 5/19/1998 ##### - - - - -##### @(#)use_cw_file.m4 8.6 (Berkeley) 5/19/1998 ##### - - - -##### @(#)proto.m4 8.243 (Berkeley) 2/2/1999 ##### - - -# level 8 config file format -V8/Berkeley - -# override file safeties - setting this option compromises system security -# need to set this now for the sake of class files -#O DontBlameSendmail=safe - -################## -# local info # -################## - -Cwlocalhost -# file containing names of hosts for which we receive email -Fw/etc/sendmail.cw - -# my official domain name -# ... define this only if sendmail cannot automatically determine your domain -#Dj$w.Foo.COM - - -CP. - -# "Smart" relay host (may be null) -DS - - -# operators that cannot be in local usernames (i.e., network indicators) -CO @ % ! - -# a class with just dot (for identifying canonical names) -C.. - -# a class with just a left bracket (for identifying domain literals) -C[[ - - - - - - - - - -# Resolve map (to check if a host exists in check_mail) -Kresolve host -a<OK> -T<TEMP> - -# Hosts that will permit relaying ($=R) -FR-o /etc/mail/relay-domains - -# who I send unqualified names to (null means deliver locally) -DR - -# who gets all local email traffic ($R has precedence for unqualified names) -DH - -# dequoting map -Kdequote dequote - -# class E: names that should be exposed as from this host, even if we masquerade -# class L: names that should be delivered locally, even if we have a relay -# class M: domains that should be converted to $M -#CL root -CE root - -# who I masquerade as (null for no masquerading) (see also $=M) -DM - -# my name for error messages -DnMAILER-DAEMON - - -CPREDIRECT - -# Configuration version number -DZ8.9.3 - - -############### -# Options # -############### - -# strip message body to 7 bits on input? -O SevenBitInput=False - -# 8-bit data handling -O EightBitMode=pass8 - - -# wait for alias file rebuild (default units: minutes) -O AliasWait=10 - -# location of alias file -O AliasFile=/usr/adm/sendmail/aliases - -# minimum number of free blocks on filesystem -O MinFreeBlocks=100 - -# maximum message size -#O MaxMessageSize=1000000 - -# substitution for space (blank) characters -O BlankSub=. - -# avoid connecting to "expensive" mailers on initial submission? -O HoldExpensive=False - -# checkpoint queue runs after every N successful deliveries -#O CheckpointInterval=10 - -# default delivery mode -O DeliveryMode=background - -# automatically rebuild the alias database? -#O AutoRebuildAliases - -# error message header/file -#O ErrorHeader=/etc/sendmail.oE - -# error mode -#O ErrorMode=print - -# save Unix-style "From_" lines at top of header? -#O SaveFromLine - -# temporary file mode -O TempFileMode=0600 - -# match recipients against GECOS field? -#O MatchGECOS - -# maximum hop count -#O MaxHopCount=17 - -# location of help file -O HelpFile=/usr/share/lib/sendmail.hf - -# ignore dots as terminators in incoming messages? -#O IgnoreDots - -# name resolver options -#O ResolverOptions=+AAONLY - -# deliver MIME-encapsulated error messages? -O SendMimeErrors=True - -# Forward file search path -O ForwardPath=$z/.forward.$w+$h:$z/.forward+$h:$z/.forward.$w:$z/.forward - -# open connection cache size -O ConnectionCacheSize=2 - -# open connection cache timeout -O ConnectionCacheTimeout=5m - -# persistent host status directory -#O HostStatusDirectory=.hoststat - -# single thread deliveries (requires HostStatusDirectory)? -#O SingleThreadDelivery - -# use Errors-To: header? -O UseErrorsTo=False - -# log level -O LogLevel=9 - -# send to me too, even in an alias expansion? -#O MeToo - -# verify RHS in newaliases? -O CheckAliases=False - -# default messages to old style headers if no special punctuation? -O OldStyleHeaders=True - -# SMTP daemon options -#O DaemonPortOptions=Port=esmtp - -# privacy flags -O PrivacyOptions=authwarnings - -# who (if anyone) should get extra copies of error messages -#O PostMasterCopy=Postmaster - -# slope of queue-only function -#O QueueFactor=600000 - -# queue directory -O QueueDirectory=/var/spool/mqueue - -# timeouts (many of these) -#O Timeout.initial=5m -#O Timeout.connect=5m -#O Timeout.iconnect=5m -#O Timeout.helo=5m -#O Timeout.mail=10m -#O Timeout.rcpt=1h -#O Timeout.datainit=5m -#O Timeout.datablock=1h -#O Timeout.datafinal=1h -#O Timeout.rset=5m -#O Timeout.quit=2m -#O Timeout.misc=2m -#O Timeout.command=1h -#O Timeout.ident=30s -#O Timeout.fileopen=60s -O Timeout.queuereturn=5d -#O Timeout.queuereturn.normal=5d -#O Timeout.queuereturn.urgent=2d -#O Timeout.queuereturn.non-urgent=7d -O Timeout.queuewarn=4h -#O Timeout.queuewarn.normal=4h -#O Timeout.queuewarn.urgent=1h -#O Timeout.queuewarn.non-urgent=12h -#O Timeout.hoststatus=30m - -# should we not prune routes in route-addr syntax addresses? -#O DontPruneRoutes - -# queue up everything before forking? -O SuperSafe=True - -# status file -O StatusFile=/usr/adm/sendmail/sendmail.st - -# time zone handling: -# if undefined, use system default -# if defined but null, use TZ envariable passed in -# if defined and non-null, use that info -#O TimeZoneSpec= - -# default UID (can be username or userid:groupid) -O DefaultUser=daemon - -# list of locations of user database file (null means no lookup) -#O UserDatabaseSpec=/etc/userdb - -# fallback MX host -#O FallbackMXhost=fall.back.host.net - -# if we are the best MX host for a site, try it directly instead of config err -#O TryNullMXList - -# load average at which we just queue messages -#O QueueLA=8 - -# load average at which we refuse connections -#O RefuseLA=12 - -# maximum number of children we allow at one time -#O MaxDaemonChildren=12 - -# maximum number of new connections per second -#O ConnectionRateThrottle=3 - -# work recipient factor -#O RecipientFactor=30000 - -# deliver each queued job in a separate process? -#O ForkEachJob - -# work class factor -#O ClassFactor=1800 - -# work time factor -#O RetryFactor=90000 - -# shall we sort the queue by hostname first? -#O QueueSortOrder=priority - -# minimum time in queue before retry -#O MinQueueAge=30m - -# default character set -#O DefaultCharSet=iso-8859-1 - -# service switch file (ignored on Solaris, Ultrix, OSF/1, others) -#O ServiceSwitchFile=/etc/service.switch - -# hosts file (normally /etc/hosts) -#O HostsFile=/etc/hosts - -# dialup line delay on connection failure -#O DialDelay=10s - -# action to take if there are no recipients in the message -#O NoRecipientAction=add-to-undisclosed - -# chrooted environment for writing to files -#O SafeFileEnvironment=/arch - -# are colons OK in addresses? -#O ColonOkInAddr - -# how many jobs can you process in the queue? -#O MaxQueueRunSize=10000 - -# shall I avoid expanding CNAMEs (violates protocols)? -#O DontExpandCnames - -# SMTP initial login message (old $e macro) -O SmtpGreetingMessage=$j Sendmail $v/$Z; $b - -# UNIX initial From header format (old $l macro) -O UnixFromLine=From $g $d - -# From: lines that have embedded newlines are unwrapped onto one line -#O SingleLineFromHeader=False - -# Allow HELO SMTP command that does not include a host name -#O AllowBogusHELO=False - -# Characters to be quoted in a full name phrase (@,;:\()[] are automatic) -#O MustQuoteChars=. - -# delimiter (operator) characters (old $o macro) -O OperatorChars=.:%@!^/[]+ - -# shall I avoid calling initgroups(3) because of high NIS costs? -#O DontInitGroups - -# are group-writable :include: and .forward files (un)trustworthy? -#O UnsafeGroupWrites - -# where do errors that occur when sending errors get sent? -#O DoubleBounceAddress=postmaster - -# what user id do we assume for the majority of the processing? -#O RunAsUser=sendmail - -# maximum number of recipients per SMTP envelope -#O MaxRecipientsPerMessage=100 - -# shall we get local names from our installed interfaces? -#O DontProbeInterfaces - - - - - - -########################### -# Message precedences # -########################### - -Pfirst-class=0 -Pspecial-delivery=100 -Plist=-30 -Pbulk=-60 -Pjunk=-100 - -##################### -# Trusted users # -##################### - -# this is equivalent to setting class "t" -#Ft/etc/sendmail.ct -Troot -Tdaemon -Tuucp - -######################### -# Format of headers # -######################### - -H?P?Return-Path: <$g> -HReceived: $?sfrom $s $.$?_($?s$|from $.$_) - $.by $j ($v/$Z)$?r with $r$. id $i$?u - for $u; $|; - $.$b -H?D?Resent-Date: $a -H?D?Date: $a -H?F?Resent-From: $?x$x <$g>$|$g$. -H?F?From: $?x$x <$g>$|$g$. -H?x?Full-Name: $x -# HPosted-Date: $a -# H?l?Received-Date: $b -H?M?Resent-Message-Id: <$t.$i@$j> -H?M?Message-Id: <$t.$i@$j> -# -###################################################################### -###################################################################### -##### -##### REWRITING RULES -##### -###################################################################### -###################################################################### - -############################################ -### Ruleset 3 -- Name Canonicalization ### -############################################ -S3 - -# handle null input (translate to <@> special case) -R$@ $@ <@> - -# strip group: syntax (not inside angle brackets!) and trailing semicolon -R$* $: $1 <@> mark addresses -R$* < $* > $* <@> $: $1 < $2 > $3 unmark <addr> -R@ $* <@> $: @ $1 unmark @host:... -R$* :: $* <@> $: $1 :: $2 unmark node::addr -R:include: $* <@> $: :include: $1 unmark :include:... -R$* [ $* : $* ] <@> $: $1 [ $2 : $3 ] unmark IPv6 addrs -R$* : $* [ $* ] $: $1 : $2 [ $3 ] <@> remark if leading colon -R$* : $* <@> $: $2 strip colon if marked -R$* <@> $: $1 unmark -R$* ; $1 strip trailing semi -R$* < $* ; > $1 < $2 > bogus bracketed semi - -# null input now results from list:; syntax -R$@ $@ :; <@> - -# strip angle brackets -- note RFC733 heuristic to get innermost item -R$* $: < $1 > housekeeping <> -R$+ < $* > < $2 > strip excess on left -R< $* > $+ < $1 > strip excess on right -R<> $@ < @ > MAIL FROM:<> case -R< $+ > $: $1 remove housekeeping <> - -# make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later -R@ $+ , $+ @ $1 : $2 change all "," to ":" - -# localize and dispose of route-based addresses -R@ $+ : $+ $@ $>96 < @$1 > : $2 handle <route-addr> - -# find focus for list syntax -R $+ : $* ; @ $+ $@ $>96 $1 : $2 ; < @ $3 > list syntax -R $+ : $* ; $@ $1 : $2; list syntax - -# find focus for @ syntax addresses -R$+ @ $+ $: $1 < @ $2 > focus on domain -R$+ < $+ @ $+ > $1 $2 < @ $3 > move gaze right -R$+ < @ $+ > $@ $>96 $1 < @ $2 > already canonical - -# do some sanity checking -R$* < @ $* : $* > $* $1 < @ $2 $3 > $4 nix colons in addrs - -# convert old-style addresses to a domain-based address -R$- ! $+ $@ $>96 $2 < @ $1 .UUCP > resolve uucp names -R$+ . $- ! $+ $@ $>96 $3 < @ $1 . $2 > domain uucps -R$+ ! $+ $@ $>96 $2 < @ $1 .UUCP > uucp subdomains - -# if we have % signs, take the rightmost one -R$* % $* $1 @ $2 First make them all @s. -R$* @ $* @ $* $1 % $2 @ $3 Undo all but the last. -R$* @ $* $@ $>96 $1 < @ $2 > Insert < > and finish - -# else we must be a local name -R$* $@ $>96 $1 - - -################################################ -### Ruleset 96 -- bottom half of ruleset 3 ### -################################################ - -S96 - -# handle special cases for local names -R$* < @ localhost > $* $: $1 < @ $j . > $2 no domain at all -R$* < @ localhost . $m > $* $: $1 < @ $j . > $2 local domain -R$* < @ localhost . UUCP > $* $: $1 < @ $j . > $2 .UUCP domain -R$* < @ [ $+ ] > $* $: $1 < @@ [ $2 ] > $3 mark [a.b.c.d] -R$* < @@ $=w > $* $: $1 < @ $j . > $3 self-literal -R$* < @@ $+ > $* $@ $1 < @ $2 > $3 canon IP addr - - - - - -# if really UUCP, handle it immediately - -# try UUCP traffic as a local address -R$* < @ $+ . UUCP > $* $: $1 < @ $[ $2 $] . UUCP . > $3 -R$* < @ $+ . . UUCP . > $* $@ $1 < @ $2 . > $3 - -# pass to name server to make hostname canonical -R$* < @ $* $~P > $* $: $1 < @ $[ $2 $3 $] > $4 - -# local host aliases and pseudo-domains are always canonical -R$* < @ $=w > $* $: $1 < @ $2 . > $3 -R$* < @ $j > $* $: $1 < @ $j . > $2 -R$* < @ $=M > $* $: $1 < @ $2 . > $3 -R$* < @ $* $=P > $* $: $1 < @ $2 $3 . > $4 -R$* < @ $* . . > $* $1 < @ $2 . > $3 - - -################################################## -### Ruleset 4 -- Final Output Post-rewriting ### -################################################## -S4 - -R$* <@> $@ handle <> and list:; - -# strip trailing dot off possibly canonical name -R$* < @ $+ . > $* $1 < @ $2 > $3 - -# eliminate internal code -- should never get this far! -R$* < @ *LOCAL* > $* $1 < @ $j > $2 - -# externalize local domain info -R$* < $+ > $* $1 $2 $3 defocus -R@ $+ : @ $+ : $+ @ $1 , @ $2 : $3 <route-addr> canonical -R@ $* $@ @ $1 ... and exit - -# UUCP must always be presented in old form -R$+ @ $- . UUCP $2!$1 u@h.UUCP => h!u - -# delete duplicate local names -R$+ % $=w @ $=w $1 @ $2 u%host@host => u@host - - - -############################################################## -### Ruleset 97 -- recanonicalize and call ruleset zero ### -### (used for recursive calls) ### -############################################################## - -S97 -R$* $: $>3 $1 -R$* $@ $>0 $1 - - -###################################### -### Ruleset 0 -- Parse Address ### -###################################### - -S0 - -R$* $: $>Parse0 $1 initial parsing -R<@> $#local $: <@> special case error msgs -R$* $: $>98 $1 handle local hacks -R$* $: $>Parse1 $1 final parsing - -# -# Parse0 -- do initial syntax checking and eliminate local addresses. -# This should either return with the (possibly modified) input -# or return with a #error mailer. It should not return with a -# #mailer other than the #error mailer. -# - -SParse0 -R<@> $@ <@> special case error msgs -R$* : $* ; <@> $#error $@ 5.1.3 $: "List:; syntax illegal for recipient addresses" -#R@ <@ $* > < @ $1 > catch "@@host" bogosity -R<@ $+> $#error $@ 5.1.3 $: "User address required" -R$* $: <> $1 -R<> $* < @ [ $+ ] > $* $1 < @ [ $2 ] > $3 -R<> $* <$* : $* > $* $#error $@ 5.1.3 $: "Colon illegal in host name part" -R<> $* $1 -R$* < @ . $* > $* $#error $@ 5.1.2 $: "Invalid host name" -R$* < @ $* .. $* > $* $#error $@ 5.1.2 $: "Invalid host name" - -# now delete the local info -- note $=O to find characters that cause forwarding -R$* < @ > $* $@ $>Parse0 $>3 $1 user@ => user -R< @ $=w . > : $* $@ $>Parse0 $>3 $2 @here:... -> ... -R$- < @ $=w . > $: $(dequote $1 $) < @ $2 . > dequote "foo"@here -R< @ $+ > $#error $@ 5.1.3 $: "User address required" -R$* $=O $* < @ $=w . > $@ $>Parse0 $>3 $1 $2 $3 ...@here -> ... -R$- $: $(dequote $1 $) < @ *LOCAL* > dequote "foo" -R< @ *LOCAL* > $#error $@ 5.1.3 $: "User address required" -R$* $=O $* < @ *LOCAL* > - $@ $>Parse0 $>3 $1 $2 $3 ...@*LOCAL* -> ... -R$* < @ *LOCAL* > $: $1 - -# -# Parse1 -- the bottom half of ruleset 0. -# - -SParse1 -# handle numeric address spec -R$* < @ [ $+ ] > $* $: $>98 $1 < @ [ $2 ] > $3 numeric internet spec -R$* < @ [ $+ ] > $* $#esmtp $@ [$2] $: $1 < @ [$2] > $3 still numeric: send - - -# short circuit local delivery so forwarded email works -R$=L < @ $=w . > $#local $: @ $1 special local names -R$+ < @ $=w . > $#local $: $1 regular local name - - -# resolve remotely connected UUCP links (if any) - -# resolve fake top level domains by forwarding to other hosts - - - -# pass names that still have a host to a smarthost (if defined) -R$* < @ $* > $* $: $>95 < $S > $1 < @ $2 > $3 glue on smarthost name - -# deal with other remote names -R$* < @$* > $* $#esmtp $@ $2 $: $1 < @ $2 > $3 user@host.domain - -# handle locally delivered names -R$=L $#local $: @ $1 special local names -R$+ $#local $: $1 regular local names - -########################################################################### -### Ruleset 5 -- special rewriting after aliases have been expanded ### -########################################################################### - -S5 - -# deal with plussed users so aliases work nicely -R$+ + * $#local $@ $&h $: $1 -R$+ + $* $#local $@ + $2 $: $1 + * - -# prepend an empty "forward host" on the front -R$+ $: <> $1 - - -# see if we have a relay or a hub -R< > $+ $: < $H > $1 try hub -R< > $+ $: < $R > $1 try relay -R< > $+ $: < > < $1 $&h > nope, restore +detail -R< > < $+ + $* > $* < > < $1 > + $2 $3 find the user part -R< > < $+ > + $* $#local $@ $2 $: @ $1 strip the extra + -R< > < $+ > $@ $1 no +detail -R$+ $: $1 <> $&h add +detail back in -R$+ <> + $* $: $1 + $2 check whether +detail -R$+ <> $* $: $1 else discard -R< local : $* > $* $: $>95 < local : $1 > $2 no host extension -R< error : $* > $* $: $>95 < error : $1 > $2 no host extension -R< $- : $+ > $+ $: $>95 < $1 : $2 > $3 < @ $2 > -R< $+ > $+ $@ $>95 < $1 > $2 < @ $1 > - - -################################################################### -### Ruleset 95 -- canonify mailer:[user@]host syntax to triple ### -################################################################### - -S95 -R< > $* $@ $1 strip off null relay -R< error : $- $+ > $* $#error $@ $(dequote $1 $) $: $2 -R< local : $* > $* $>CanonLocal < $1 > $2 -R< $- : $+ @ $+ > $*<$*>$* $# $1 $@ $3 $: $2<@$3> use literal user -R< $- : $+ > $* $# $1 $@ $2 $: $3 try qualified mailer -R< $=w > $* $@ $2 delete local host -R< $+ > $* $#relay $@ $1 $: $2 use unqualified mailer - -################################################################### -### Ruleset CanonLocal -- canonify local: syntax ### -################################################################### - -SCanonLocal -# strip local host from routed addresses -R< $* > < @ $+ > : $+ $@ $>97 $3 -R< $* > $+ $=O $+ < @ $+ > $@ $>97 $2 $3 $4 - -# strip trailing dot from any host name that may appear -R< $* > $* < @ $* . > $: < $1 > $2 < @ $3 > - -# handle local: syntax -- use old user, either with or without host -R< > $* < @ $* > $* $#local $@ $1@$2 $: $1 -R< > $+ $#local $@ $1 $: $1 - -# handle local:user@host syntax -- ignore host part -R< $+ @ $+ > $* < @ $* > $: < $1 > $3 < @ $4 > - -# handle local:user syntax -R< $+ > $* <@ $* > $* $#local $@ $2@$3 $: $1 -R< $+ > $* $#local $@ $2 $: $1 - -################################################################### -### Ruleset 93 -- convert header names to masqueraded form ### -################################################################### - -S93 - - -# special case the users that should be exposed -R$=E < @ *LOCAL* > $@ $1 < @ $j . > leave exposed -R$=E < @ $=M . > $@ $1 < @ $2 . > -R$=E < @ $=w . > $@ $1 < @ $2 . > - -# handle domain-specific masquerading -R$* < @ $=M . > $* $: $1 < @ $2 . @ $M > $3 convert masqueraded doms -R$* < @ $=w . > $* $: $1 < @ $2 . @ $M > $3 -R$* < @ *LOCAL* > $* $: $1 < @ $j . @ $M > $2 -R$* < @ $+ @ > $* $: $1 < @ $2 > $3 $M is null -R$* < @ $+ @ $+ > $* $: $1 < @ $3 . > $4 $M is not null - -################################################################### -### Ruleset 94 -- convert envelope names to masqueraded form ### -################################################################### - -S94 -R$* < @ *LOCAL* > $* $: $1 < @ $j . > $2 - -################################################################### -### Ruleset 98 -- local part of ruleset zero (can be null) ### -################################################################### - -S98 - -# addresses sent to foo@host.REDIRECT will give a 551 error code -R$* < @ $+ .REDIRECT. > $: $1 < @ $2 . REDIRECT . > < ${opMode} > -R$* < @ $+ .REDIRECT. > <i> $: $1 < @ $2 . REDIRECT. > -R$* < @ $+ .REDIRECT. > < $- > $# error $@ 5.1.1 $: "551 User has moved; please try " <$1@$2> - - - -###################################################################### -### CanonAddr -- Convert an address into a standard form for -### relay checking. Route address syntax is -### crudely converted into a %-hack address. -### -### Parameters: -### $1 -- full recipient address -### -### Returns: -### parsed address, not in source route form -###################################################################### - -SCanonAddr -R$* $: $>Parse0 $>3 $1 make domain canonical -R< @ $+ > : $* @ $* < @ $1 > : $2 % $3 change @ to % in src route -R$* < @ $+ > : $* : $* $3 $1 < @ $2 > : $4 change to % hack. -R$* < @ $+ > : $* $3 $1 < @ $2 > - -###################################################################### -### ParseRecipient -- Strip off hosts in $=R as well as possibly -### $* $=m or the access database. -### Check user portion for host separators. -### -### Parameters: -### $1 -- full recipient address -### -### Returns: -### parsed, non-local-relaying address -###################################################################### - -SParseRecipient -R$* $: <?> $>CanonAddr $1 -R<?> $* < @ $* . > <?> $1 < @ $2 > strip trailing dots -R<?> $- < @ $* > $: <?> $(dequote $1 $) < @ $2 > dequote local part - -# if no $=O character, no host in the user portion, we are done -R<?> $* $=O $* < @ $* > $: <NO> $1 $2 $3 < @ $4> -R<?> $* $@ $1 - - - -R<NO> $* < @ $* $=R > $: <RELAY> $1 < @ $2 $3 > - -R<RELAY> $* < @ $* > $@ $>ParseRecipient $1 -R<$-> $* $@ $2 - -###################################################################### -### check_relay -- check hostname/address on SMTP startup -###################################################################### - -SLocal_check_relay -Scheck_relay -R$* $: $1 $| $>"Local_check_relay" $1 -R$* $| $* $| $#$* $#$3 -R$* $| $* $| $* $@ $>"Basic_check_relay" $1 $| $2 - -SBasic_check_relay -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - - - -###################################################################### -### check_mail -- check SMTP `MAIL FROM:' command argument -###################################################################### - -SLocal_check_mail -Scheck_mail -R$* $: $1 $| $>"Local_check_mail" $1 -R$* $| $#$* $#$2 -R$* $| $* $@ $>"Basic_check_mail" $1 - -SBasic_check_mail -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - -R<> $@ <OK> -R$* $: <?> $>CanonAddr $1 -R<?> $* < @ $+ . > <?> $1 < @ $2 > strip trailing dots -# handle non-DNS hostnames (*.bitnet, *.decnet, *.uucp, etc) -R<?> $* < $* $=P > $* $: <OK> $1 < @ $2 $3 > $4 -R<?> $* < @ $+ > $* $: <? $(resolve $2 $: $2 <PERM> $) > $1 < @ $2 > $3 -R<? $* <$->> $* < @ $+ > $* - $: <$2> $3 < @ $4 > $5 - -# handle case of @localhost on address -R<$+> $* < @localhost > $: < ? $&{client_name} > <$1> $2 < @localhost > -R<$+> $* < @localhost.$m > - $: < ? $&{client_name} > <$1> $2 < @localhost.$m > -R<$+> $* < @localhost.UUCP > - $: < ? $&{client_name} > <$1> $2 < @localhost.UUCP > -R<? $=w> <$+> $* <?> <$2> $3 -R<? $+> <$+> $* $#error $@ 5.5.4 $: "553 Real domain name required" -R<?> <$+> $* $: <$1> $2 - - -# handle case of no @domain on address -R<?> $* $: < ? $&{client_name} > $1 -R<?> $* $@ <OK> ...local unqualed ok -R<? $+> $* $#error $@ 5.5.4 $: "553 Domain name required" - ...remote is not -# check results -R<?> $* $@ <OK> -R<OK> $* $@ <OK> -R<TEMP> $* $#error $@ 4.1.8 $: "451 Sender domain must resolve" -R<PERM> $* $#error $@ 5.1.8 $: "501 Sender domain must exist" - -###################################################################### -### check_rcpt -- check SMTP `RCPT TO:' command argument -###################################################################### - -SLocal_check_rcpt -Scheck_rcpt -R$* $: $1 $| $>"Local_check_rcpt" $1 -R$* $| $#$* $#$2 -R$* $| $* $@ $>"Basic_check_rcpt" $1 - -SBasic_check_rcpt -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - -R$* $: $>ParseRecipient $1 strip relayable hosts - - - - -# anything terminating locally is ok -R$+ < @ $=w > $@ OK -R$+ < @ $* $=R > $@ OK - - -# check for local user (i.e. unqualified address) -R$* $: <?> $1 -R<?> $* < @ $+ > $: <REMOTE> $1 < @ $2 > -# local user is ok -R<?> $+ $@ OK -R<$+> $* $: $2 - -# anything originating locally is ok -R$* $: <?> $&{client_name} -# check if bracketed IP address (forward lookup != reverse lookup) -R<?> [$+] $: <BAD> [$1] -# pass to name server to make hostname canonical -R<?> $* $~P $: <?> $[ $1 $2 $] -R<$-> $* $: $2 -R$* . $1 strip trailing dots -R$@ $@ OK -R$=w $@ OK -R$* $=R $@ OK - -# check IP address -R$* $: $&{client_addr} -R$@ $@ OK originated locally -R0 $@ OK originated locally -R$=R $* $@ OK relayable IP address -R$* $: [ $1 ] put brackets around it... -R$=w $@ OK ... and see if it is local - - -# anything else is bogus -R$* $#error $@ 5.7.1 $: "550 Relaying denied" - -# -###################################################################### -###################################################################### -##### -##### MAILER DEFINITIONS -##### -###################################################################### -###################################################################### - - -################################################## -### Local and Program Mailer specification ### -################################################## - -##### @(#)local.m4 8.30 (Berkeley) 6/30/1998 ##### - -Mlocal, P=/bin/mail, F=lsDFMAw5:/|@qrmn9, S=10/30, R=20/40, - T=DNS/RFC822/X-Unix, - A=mail -d $u -Mprog, P=/bin/sh, F=lsDFMoqeu9, S=10/30, R=20/40, D=$z:/, - T=X-Unix, - A=sh -c $u - -# -# Envelope sender rewriting -# -S10 -R<@> $n errors to mailer-daemon -R@ <@ $*> $n temporarily bypass Sun bogosity -R$+ $: $>50 $1 add local domain if needed -R$* $: $>94 $1 do masquerading - -# -# Envelope recipient rewriting -# -S20 -R$+ < @ $* > $: $1 strip host part - -# -# Header sender rewriting -# -S30 -R<@> $n errors to mailer-daemon -R@ <@ $*> $n temporarily bypass Sun bogosity -R$+ $: $>50 $1 add local domain if needed -R$* $: $>93 $1 do masquerading - -# -# Header recipient rewriting -# -S40 -R$+ $: $>50 $1 add local domain if needed - -# -# Common code to add local domain name (only if always-add-domain) -# -S50 - -##################################### -### SMTP Mailer specification ### -##################################### - -##### @(#)smtp.m4 8.38 (Berkeley) 5/19/1998 ##### - -Msmtp, P=[IPC], F=mDFMuX, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Mesmtp, P=[IPC], F=mDFMuXa, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Msmtp8, P=[IPC], F=mDFMuX8, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Mrelay, P=[IPC], F=mDFMuXa8, S=11/31, R=61, E=\r\n, L=2040, - T=DNS/RFC822/SMTP, - A=IPC $h - -# -# envelope sender rewriting -# -S11 -R$+ $: $>51 $1 sender/recipient common -R$* :; <@> $@ list:; special case -R$* $: $>61 $1 qualify unqual'ed names -R$+ $: $>94 $1 do masquerading - - -# -# envelope recipient rewriting -- -# also header recipient if not masquerading recipients -# -S21 -R$+ $: $>51 $1 sender/recipient common -R$+ $: $>61 $1 qualify unqual'ed names - - -# -# header sender and masquerading header recipient rewriting -# -S31 -R$+ $: $>51 $1 sender/recipient common -R:; <@> $@ list:; special case - -# do special header rewriting -R$* <@> $* $@ $1 <@> $2 pass null host through -R< @ $* > $* $@ < @ $1 > $2 pass route-addr through -R$* $: $>61 $1 qualify unqual'ed names -R$+ $: $>93 $1 do masquerading - - -# -# convert pseudo-domain addresses to real domain addresses -# -S51 - -# pass <route-addr>s through -R< @ $+ > $* $@ < @ $1 > $2 resolve <route-addr> - -# output fake domains as user%fake@relay - -# do UUCP heuristics; note that these are shared with UUCP mailers -R$+ < @ $+ .UUCP. > $: < $2 ! > $1 convert to UUCP form -R$+ < @ $* > $* $@ $1 < @ $2 > $3 not UUCP form - -# leave these in .UUCP form to avoid further tampering -R< $&h ! > $- ! $+ $@ $2 < @ $1 .UUCP. > -R< $&h ! > $-.$+ ! $+ $@ $3 < @ $1.$2 > -R< $&h ! > $+ $@ $1 < @ $&h .UUCP. > -R< $+ ! > $+ $: $1 ! $2 < @ $Y > use UUCP_RELAY -R$+ < @ $+ : $+ > $@ $1 < @ $3 > strip mailer: part -R$+ < @ > $: $1 < @ *LOCAL* > if no UUCP_RELAY - - -# -# common sender and masquerading recipient rewriting -# -S61 - -R$* < @ $* > $* $@ $1 < @ $2 > $3 already fully qualified -R$+ $@ $1 < @ *LOCAL* > add local qualification - - -# -# relay mailer header masquerading recipient rewriting -# -S71 - -R$+ $: $>61 $1 -R$+ $: $>93 $1 diff --git a/cf/cf/generic-osf1.mc b/cf/cf/generic-osf1.mc deleted file mode 100644 index 83858d1..0000000 --- a/cf/cf/generic-osf1.mc +++ /dev/null @@ -1,26 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a generic configuration file for OSF/1. -# It has support for local and SMTP mail only. If you want to -# customize it, copy it to a name appropriate for your environment -# and do the modifications there. -# - -divert(0)dnl -VERSIONID(`@(#)generic-osf1.mc 8.8 (Berkeley) 5/19/1998') -OSTYPE(osf1)dnl -DOMAIN(generic)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/cf/cf/generic-solaris2.cf b/cf/cf/generic-solaris2.cf deleted file mode 100644 index a4becb0..0000000 --- a/cf/cf/generic-solaris2.cf +++ /dev/null @@ -1,1061 +0,0 @@ -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -###################################################################### -###################################################################### -##### -##### SENDMAIL CONFIGURATION FILE -##### -##### built by gshapiro@knecht.sendmail.org on Thu Feb 4 16:39:23 PST 1999 -##### in /home/eric/src/sendmail/cf/cf -##### using ../ as configuration include directory -##### -###################################################################### -###################################################################### - -##### @(#)cfhead.m4 8.23 (Berkeley) 10/6/1998 ##### -##### @(#)cf.m4 8.29 (Berkeley) 5/19/1998 ##### -##### @(#)generic-solaris2.mc 8.8 (Berkeley) 5/19/1998 ##### - -##### @(#)solaris2.m4 8.16 (Berkeley) 10/6/1998 ##### - -##### @(#)generic.m4 8.9 (Berkeley) 5/19/1998 ##### - -##### @(#)redirect.m4 8.10 (Berkeley) 5/19/1998 ##### - - - - -##### @(#)use_cw_file.m4 8.6 (Berkeley) 5/19/1998 ##### - - - -##### @(#)proto.m4 8.243 (Berkeley) 2/2/1999 ##### - - -# level 8 config file format -V8/Berkeley - -# override file safeties - setting this option compromises system security -# need to set this now for the sake of class files -#O DontBlameSendmail=safe - -################## -# local info # -################## - -Cwlocalhost -# file containing names of hosts for which we receive email -Fw/etc/mail/sendmail.cw - -# my official domain name -# ... define this only if sendmail cannot automatically determine your domain -#Dj$w.Foo.COM - - -CP. - -# "Smart" relay host (may be null) -DS - - -# operators that cannot be in local usernames (i.e., network indicators) -CO @ % ! - -# a class with just dot (for identifying canonical names) -C.. - -# a class with just a left bracket (for identifying domain literals) -C[[ - - - - - - - - - -# Resolve map (to check if a host exists in check_mail) -Kresolve host -a<OK> -T<TEMP> - -# Hosts that will permit relaying ($=R) -FR-o /etc/mail/relay-domains - -# who I send unqualified names to (null means deliver locally) -DR - -# who gets all local email traffic ($R has precedence for unqualified names) -DH - -# dequoting map -Kdequote dequote - -# class E: names that should be exposed as from this host, even if we masquerade -# class L: names that should be delivered locally, even if we have a relay -# class M: domains that should be converted to $M -#CL root -CE root - -# who I masquerade as (null for no masquerading) (see also $=M) -DM - -# my name for error messages -DnMAILER-DAEMON - - -CPREDIRECT - -# Configuration version number -DZ8.9.3 - - -############### -# Options # -############### - -# strip message body to 7 bits on input? -O SevenBitInput=False - -# 8-bit data handling -O EightBitMode=pass8 - - -# wait for alias file rebuild (default units: minutes) -O AliasWait=10 - -# location of alias file -O AliasFile=/etc/mail/aliases - -# minimum number of free blocks on filesystem -O MinFreeBlocks=100 - -# maximum message size -#O MaxMessageSize=1000000 - -# substitution for space (blank) characters -O BlankSub=. - -# avoid connecting to "expensive" mailers on initial submission? -O HoldExpensive=False - -# checkpoint queue runs after every N successful deliveries -#O CheckpointInterval=10 - -# default delivery mode -O DeliveryMode=background - -# automatically rebuild the alias database? -#O AutoRebuildAliases - -# error message header/file -#O ErrorHeader=/etc/sendmail.oE - -# error mode -#O ErrorMode=print - -# save Unix-style "From_" lines at top of header? -#O SaveFromLine - -# temporary file mode -O TempFileMode=0600 - -# match recipients against GECOS field? -#O MatchGECOS - -# maximum hop count -#O MaxHopCount=17 - -# location of help file -O HelpFile=/etc/mail/sendmail.hf - -# ignore dots as terminators in incoming messages? -#O IgnoreDots - -# name resolver options -#O ResolverOptions=+AAONLY - -# deliver MIME-encapsulated error messages? -O SendMimeErrors=True - -# Forward file search path -O ForwardPath=$z/.forward.$w+$h:$z/.forward+$h:$z/.forward.$w:$z/.forward - -# open connection cache size -O ConnectionCacheSize=2 - -# open connection cache timeout -O ConnectionCacheTimeout=5m - -# persistent host status directory -#O HostStatusDirectory=.hoststat - -# single thread deliveries (requires HostStatusDirectory)? -#O SingleThreadDelivery - -# use Errors-To: header? -O UseErrorsTo=False - -# log level -O LogLevel=9 - -# send to me too, even in an alias expansion? -#O MeToo - -# verify RHS in newaliases? -O CheckAliases=False - -# default messages to old style headers if no special punctuation? -O OldStyleHeaders=True - -# SMTP daemon options -#O DaemonPortOptions=Port=esmtp - -# privacy flags -O PrivacyOptions=authwarnings - -# who (if anyone) should get extra copies of error messages -#O PostMasterCopy=Postmaster - -# slope of queue-only function -#O QueueFactor=600000 - -# queue directory -O QueueDirectory=/var/spool/mqueue - -# timeouts (many of these) -#O Timeout.initial=5m -#O Timeout.connect=5m -#O Timeout.iconnect=5m -#O Timeout.helo=5m -#O Timeout.mail=10m -#O Timeout.rcpt=1h -#O Timeout.datainit=5m -#O Timeout.datablock=1h -#O Timeout.datafinal=1h -#O Timeout.rset=5m -#O Timeout.quit=2m -#O Timeout.misc=2m -#O Timeout.command=1h -#O Timeout.ident=30s -#O Timeout.fileopen=60s -O Timeout.queuereturn=5d -#O Timeout.queuereturn.normal=5d -#O Timeout.queuereturn.urgent=2d -#O Timeout.queuereturn.non-urgent=7d -O Timeout.queuewarn=4h -#O Timeout.queuewarn.normal=4h -#O Timeout.queuewarn.urgent=1h -#O Timeout.queuewarn.non-urgent=12h -#O Timeout.hoststatus=30m - -# should we not prune routes in route-addr syntax addresses? -#O DontPruneRoutes - -# queue up everything before forking? -O SuperSafe=True - -# status file -O StatusFile=/etc/mail/sendmail.st - -# time zone handling: -# if undefined, use system default -# if defined but null, use TZ envariable passed in -# if defined and non-null, use that info -#O TimeZoneSpec= - -# default UID (can be username or userid:groupid) -#O DefaultUser=mailnull - -# list of locations of user database file (null means no lookup) -#O UserDatabaseSpec=/etc/userdb - -# fallback MX host -#O FallbackMXhost=fall.back.host.net - -# if we are the best MX host for a site, try it directly instead of config err -#O TryNullMXList - -# load average at which we just queue messages -#O QueueLA=8 - -# load average at which we refuse connections -#O RefuseLA=12 - -# maximum number of children we allow at one time -#O MaxDaemonChildren=12 - -# maximum number of new connections per second -#O ConnectionRateThrottle=3 - -# work recipient factor -#O RecipientFactor=30000 - -# deliver each queued job in a separate process? -#O ForkEachJob - -# work class factor -#O ClassFactor=1800 - -# work time factor -#O RetryFactor=90000 - -# shall we sort the queue by hostname first? -#O QueueSortOrder=priority - -# minimum time in queue before retry -#O MinQueueAge=30m - -# default character set -#O DefaultCharSet=iso-8859-1 - -# service switch file (ignored on Solaris, Ultrix, OSF/1, others) -#O ServiceSwitchFile=/etc/service.switch - -# hosts file (normally /etc/hosts) -#O HostsFile=/etc/hosts - -# dialup line delay on connection failure -#O DialDelay=10s - -# action to take if there are no recipients in the message -#O NoRecipientAction=add-to-undisclosed - -# chrooted environment for writing to files -#O SafeFileEnvironment=/arch - -# are colons OK in addresses? -#O ColonOkInAddr - -# how many jobs can you process in the queue? -#O MaxQueueRunSize=10000 - -# shall I avoid expanding CNAMEs (violates protocols)? -#O DontExpandCnames - -# SMTP initial login message (old $e macro) -O SmtpGreetingMessage=$j Sendmail $v/$Z; $b - -# UNIX initial From header format (old $l macro) -O UnixFromLine=From $g $d - -# From: lines that have embedded newlines are unwrapped onto one line -#O SingleLineFromHeader=False - -# Allow HELO SMTP command that does not include a host name -#O AllowBogusHELO=False - -# Characters to be quoted in a full name phrase (@,;:\()[] are automatic) -#O MustQuoteChars=. - -# delimiter (operator) characters (old $o macro) -O OperatorChars=.:%@!^/[]+ - -# shall I avoid calling initgroups(3) because of high NIS costs? -#O DontInitGroups - -# are group-writable :include: and .forward files (un)trustworthy? -#O UnsafeGroupWrites - -# where do errors that occur when sending errors get sent? -#O DoubleBounceAddress=postmaster - -# what user id do we assume for the majority of the processing? -#O RunAsUser=sendmail - -# maximum number of recipients per SMTP envelope -#O MaxRecipientsPerMessage=100 - -# shall we get local names from our installed interfaces? -#O DontProbeInterfaces - - - - - - -########################### -# Message precedences # -########################### - -Pfirst-class=0 -Pspecial-delivery=100 -Plist=-30 -Pbulk=-60 -Pjunk=-100 - -##################### -# Trusted users # -##################### - -# this is equivalent to setting class "t" -#Ft/etc/sendmail.ct -Troot -Tdaemon -Tuucp - -######################### -# Format of headers # -######################### - -H?P?Return-Path: <$g> -HReceived: $?sfrom $s $.$?_($?s$|from $.$_) - $.by $j ($v/$Z)$?r with $r$. id $i$?u - for $u; $|; - $.$b -H?D?Resent-Date: $a -H?D?Date: $a -H?F?Resent-From: $?x$x <$g>$|$g$. -H?F?From: $?x$x <$g>$|$g$. -H?x?Full-Name: $x -# HPosted-Date: $a -# H?l?Received-Date: $b -H?M?Resent-Message-Id: <$t.$i@$j> -H?M?Message-Id: <$t.$i@$j> -# -###################################################################### -###################################################################### -##### -##### REWRITING RULES -##### -###################################################################### -###################################################################### - -############################################ -### Ruleset 3 -- Name Canonicalization ### -############################################ -S3 - -# handle null input (translate to <@> special case) -R$@ $@ <@> - -# strip group: syntax (not inside angle brackets!) and trailing semicolon -R$* $: $1 <@> mark addresses -R$* < $* > $* <@> $: $1 < $2 > $3 unmark <addr> -R@ $* <@> $: @ $1 unmark @host:... -R$* :: $* <@> $: $1 :: $2 unmark node::addr -R:include: $* <@> $: :include: $1 unmark :include:... -R$* [ $* : $* ] <@> $: $1 [ $2 : $3 ] unmark IPv6 addrs -R$* : $* [ $* ] $: $1 : $2 [ $3 ] <@> remark if leading colon -R$* : $* <@> $: $2 strip colon if marked -R$* <@> $: $1 unmark -R$* ; $1 strip trailing semi -R$* < $* ; > $1 < $2 > bogus bracketed semi - -# null input now results from list:; syntax -R$@ $@ :; <@> - -# strip angle brackets -- note RFC733 heuristic to get innermost item -R$* $: < $1 > housekeeping <> -R$+ < $* > < $2 > strip excess on left -R< $* > $+ < $1 > strip excess on right -R<> $@ < @ > MAIL FROM:<> case -R< $+ > $: $1 remove housekeeping <> - -# make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later -R@ $+ , $+ @ $1 : $2 change all "," to ":" - -# localize and dispose of route-based addresses -R@ $+ : $+ $@ $>96 < @$1 > : $2 handle <route-addr> - -# find focus for list syntax -R $+ : $* ; @ $+ $@ $>96 $1 : $2 ; < @ $3 > list syntax -R $+ : $* ; $@ $1 : $2; list syntax - -# find focus for @ syntax addresses -R$+ @ $+ $: $1 < @ $2 > focus on domain -R$+ < $+ @ $+ > $1 $2 < @ $3 > move gaze right -R$+ < @ $+ > $@ $>96 $1 < @ $2 > already canonical - -# do some sanity checking -R$* < @ $* : $* > $* $1 < @ $2 $3 > $4 nix colons in addrs - -# convert old-style addresses to a domain-based address -R$- ! $+ $@ $>96 $2 < @ $1 .UUCP > resolve uucp names -R$+ . $- ! $+ $@ $>96 $3 < @ $1 . $2 > domain uucps -R$+ ! $+ $@ $>96 $2 < @ $1 .UUCP > uucp subdomains - -# if we have % signs, take the rightmost one -R$* % $* $1 @ $2 First make them all @s. -R$* @ $* @ $* $1 % $2 @ $3 Undo all but the last. -R$* @ $* $@ $>96 $1 < @ $2 > Insert < > and finish - -# else we must be a local name -R$* $@ $>96 $1 - - -################################################ -### Ruleset 96 -- bottom half of ruleset 3 ### -################################################ - -S96 - -# handle special cases for local names -R$* < @ localhost > $* $: $1 < @ $j . > $2 no domain at all -R$* < @ localhost . $m > $* $: $1 < @ $j . > $2 local domain -R$* < @ localhost . UUCP > $* $: $1 < @ $j . > $2 .UUCP domain -R$* < @ [ $+ ] > $* $: $1 < @@ [ $2 ] > $3 mark [a.b.c.d] -R$* < @@ $=w > $* $: $1 < @ $j . > $3 self-literal -R$* < @@ $+ > $* $@ $1 < @ $2 > $3 canon IP addr - - - - - -# if really UUCP, handle it immediately - -# try UUCP traffic as a local address -R$* < @ $+ . UUCP > $* $: $1 < @ $[ $2 $] . UUCP . > $3 -R$* < @ $+ . . UUCP . > $* $@ $1 < @ $2 . > $3 - -# pass to name server to make hostname canonical -R$* < @ $* $~P > $* $: $1 < @ $[ $2 $3 $] > $4 - -# local host aliases and pseudo-domains are always canonical -R$* < @ $=w > $* $: $1 < @ $2 . > $3 -R$* < @ $j > $* $: $1 < @ $j . > $2 -R$* < @ $=M > $* $: $1 < @ $2 . > $3 -R$* < @ $* $=P > $* $: $1 < @ $2 $3 . > $4 -R$* < @ $* . . > $* $1 < @ $2 . > $3 - - -################################################## -### Ruleset 4 -- Final Output Post-rewriting ### -################################################## -S4 - -R$* <@> $@ handle <> and list:; - -# strip trailing dot off possibly canonical name -R$* < @ $+ . > $* $1 < @ $2 > $3 - -# eliminate internal code -- should never get this far! -R$* < @ *LOCAL* > $* $1 < @ $j > $2 - -# externalize local domain info -R$* < $+ > $* $1 $2 $3 defocus -R@ $+ : @ $+ : $+ @ $1 , @ $2 : $3 <route-addr> canonical -R@ $* $@ @ $1 ... and exit - -# UUCP must always be presented in old form -R$+ @ $- . UUCP $2!$1 u@h.UUCP => h!u - -# delete duplicate local names -R$+ % $=w @ $=w $1 @ $2 u%host@host => u@host - - - -############################################################## -### Ruleset 97 -- recanonicalize and call ruleset zero ### -### (used for recursive calls) ### -############################################################## - -S97 -R$* $: $>3 $1 -R$* $@ $>0 $1 - - -###################################### -### Ruleset 0 -- Parse Address ### -###################################### - -S0 - -R$* $: $>Parse0 $1 initial parsing -R<@> $#local $: <@> special case error msgs -R$* $: $>98 $1 handle local hacks -R$* $: $>Parse1 $1 final parsing - -# -# Parse0 -- do initial syntax checking and eliminate local addresses. -# This should either return with the (possibly modified) input -# or return with a #error mailer. It should not return with a -# #mailer other than the #error mailer. -# - -SParse0 -R<@> $@ <@> special case error msgs -R$* : $* ; <@> $#error $@ 5.1.3 $: "List:; syntax illegal for recipient addresses" -#R@ <@ $* > < @ $1 > catch "@@host" bogosity -R<@ $+> $#error $@ 5.1.3 $: "User address required" -R$* $: <> $1 -R<> $* < @ [ $+ ] > $* $1 < @ [ $2 ] > $3 -R<> $* <$* : $* > $* $#error $@ 5.1.3 $: "Colon illegal in host name part" -R<> $* $1 -R$* < @ . $* > $* $#error $@ 5.1.2 $: "Invalid host name" -R$* < @ $* .. $* > $* $#error $@ 5.1.2 $: "Invalid host name" - -# now delete the local info -- note $=O to find characters that cause forwarding -R$* < @ > $* $@ $>Parse0 $>3 $1 user@ => user -R< @ $=w . > : $* $@ $>Parse0 $>3 $2 @here:... -> ... -R$- < @ $=w . > $: $(dequote $1 $) < @ $2 . > dequote "foo"@here -R< @ $+ > $#error $@ 5.1.3 $: "User address required" -R$* $=O $* < @ $=w . > $@ $>Parse0 $>3 $1 $2 $3 ...@here -> ... -R$- $: $(dequote $1 $) < @ *LOCAL* > dequote "foo" -R< @ *LOCAL* > $#error $@ 5.1.3 $: "User address required" -R$* $=O $* < @ *LOCAL* > - $@ $>Parse0 $>3 $1 $2 $3 ...@*LOCAL* -> ... -R$* < @ *LOCAL* > $: $1 - -# -# Parse1 -- the bottom half of ruleset 0. -# - -SParse1 -# handle numeric address spec -R$* < @ [ $+ ] > $* $: $>98 $1 < @ [ $2 ] > $3 numeric internet spec -R$* < @ [ $+ ] > $* $#esmtp $@ [$2] $: $1 < @ [$2] > $3 still numeric: send - - -# short circuit local delivery so forwarded email works -R$=L < @ $=w . > $#local $: @ $1 special local names -R$+ < @ $=w . > $#local $: $1 regular local name - - -# resolve remotely connected UUCP links (if any) - -# resolve fake top level domains by forwarding to other hosts - - - -# pass names that still have a host to a smarthost (if defined) -R$* < @ $* > $* $: $>95 < $S > $1 < @ $2 > $3 glue on smarthost name - -# deal with other remote names -R$* < @$* > $* $#esmtp $@ $2 $: $1 < @ $2 > $3 user@host.domain - -# handle locally delivered names -R$=L $#local $: @ $1 special local names -R$+ $#local $: $1 regular local names - -########################################################################### -### Ruleset 5 -- special rewriting after aliases have been expanded ### -########################################################################### - -S5 - -# deal with plussed users so aliases work nicely -R$+ + * $#local $@ $&h $: $1 -R$+ + $* $#local $@ + $2 $: $1 + * - -# prepend an empty "forward host" on the front -R$+ $: <> $1 - - -# see if we have a relay or a hub -R< > $+ $: < $H > $1 try hub -R< > $+ $: < $R > $1 try relay -R< > $+ $: < > < $1 $&h > nope, restore +detail -R< > < $+ + $* > $* < > < $1 > + $2 $3 find the user part -R< > < $+ > + $* $#local $@ $2 $: @ $1 strip the extra + -R< > < $+ > $@ $1 no +detail -R$+ $: $1 <> $&h add +detail back in -R$+ <> + $* $: $1 + $2 check whether +detail -R$+ <> $* $: $1 else discard -R< local : $* > $* $: $>95 < local : $1 > $2 no host extension -R< error : $* > $* $: $>95 < error : $1 > $2 no host extension -R< $- : $+ > $+ $: $>95 < $1 : $2 > $3 < @ $2 > -R< $+ > $+ $@ $>95 < $1 > $2 < @ $1 > - - -################################################################### -### Ruleset 95 -- canonify mailer:[user@]host syntax to triple ### -################################################################### - -S95 -R< > $* $@ $1 strip off null relay -R< error : $- $+ > $* $#error $@ $(dequote $1 $) $: $2 -R< local : $* > $* $>CanonLocal < $1 > $2 -R< $- : $+ @ $+ > $*<$*>$* $# $1 $@ $3 $: $2<@$3> use literal user -R< $- : $+ > $* $# $1 $@ $2 $: $3 try qualified mailer -R< $=w > $* $@ $2 delete local host -R< $+ > $* $#relay $@ $1 $: $2 use unqualified mailer - -################################################################### -### Ruleset CanonLocal -- canonify local: syntax ### -################################################################### - -SCanonLocal -# strip local host from routed addresses -R< $* > < @ $+ > : $+ $@ $>97 $3 -R< $* > $+ $=O $+ < @ $+ > $@ $>97 $2 $3 $4 - -# strip trailing dot from any host name that may appear -R< $* > $* < @ $* . > $: < $1 > $2 < @ $3 > - -# handle local: syntax -- use old user, either with or without host -R< > $* < @ $* > $* $#local $@ $1@$2 $: $1 -R< > $+ $#local $@ $1 $: $1 - -# handle local:user@host syntax -- ignore host part -R< $+ @ $+ > $* < @ $* > $: < $1 > $3 < @ $4 > - -# handle local:user syntax -R< $+ > $* <@ $* > $* $#local $@ $2@$3 $: $1 -R< $+ > $* $#local $@ $2 $: $1 - -################################################################### -### Ruleset 93 -- convert header names to masqueraded form ### -################################################################### - -S93 - - -# special case the users that should be exposed -R$=E < @ *LOCAL* > $@ $1 < @ $j . > leave exposed -R$=E < @ $=M . > $@ $1 < @ $2 . > -R$=E < @ $=w . > $@ $1 < @ $2 . > - -# handle domain-specific masquerading -R$* < @ $=M . > $* $: $1 < @ $2 . @ $M > $3 convert masqueraded doms -R$* < @ $=w . > $* $: $1 < @ $2 . @ $M > $3 -R$* < @ *LOCAL* > $* $: $1 < @ $j . @ $M > $2 -R$* < @ $+ @ > $* $: $1 < @ $2 > $3 $M is null -R$* < @ $+ @ $+ > $* $: $1 < @ $3 . > $4 $M is not null - -################################################################### -### Ruleset 94 -- convert envelope names to masqueraded form ### -################################################################### - -S94 -R$* < @ *LOCAL* > $* $: $1 < @ $j . > $2 - -################################################################### -### Ruleset 98 -- local part of ruleset zero (can be null) ### -################################################################### - -S98 - -# addresses sent to foo@host.REDIRECT will give a 551 error code -R$* < @ $+ .REDIRECT. > $: $1 < @ $2 . REDIRECT . > < ${opMode} > -R$* < @ $+ .REDIRECT. > <i> $: $1 < @ $2 . REDIRECT. > -R$* < @ $+ .REDIRECT. > < $- > $# error $@ 5.1.1 $: "551 User has moved; please try " <$1@$2> - - - -###################################################################### -### CanonAddr -- Convert an address into a standard form for -### relay checking. Route address syntax is -### crudely converted into a %-hack address. -### -### Parameters: -### $1 -- full recipient address -### -### Returns: -### parsed address, not in source route form -###################################################################### - -SCanonAddr -R$* $: $>Parse0 $>3 $1 make domain canonical -R< @ $+ > : $* @ $* < @ $1 > : $2 % $3 change @ to % in src route -R$* < @ $+ > : $* : $* $3 $1 < @ $2 > : $4 change to % hack. -R$* < @ $+ > : $* $3 $1 < @ $2 > - -###################################################################### -### ParseRecipient -- Strip off hosts in $=R as well as possibly -### $* $=m or the access database. -### Check user portion for host separators. -### -### Parameters: -### $1 -- full recipient address -### -### Returns: -### parsed, non-local-relaying address -###################################################################### - -SParseRecipient -R$* $: <?> $>CanonAddr $1 -R<?> $* < @ $* . > <?> $1 < @ $2 > strip trailing dots -R<?> $- < @ $* > $: <?> $(dequote $1 $) < @ $2 > dequote local part - -# if no $=O character, no host in the user portion, we are done -R<?> $* $=O $* < @ $* > $: <NO> $1 $2 $3 < @ $4> -R<?> $* $@ $1 - - - -R<NO> $* < @ $* $=R > $: <RELAY> $1 < @ $2 $3 > - -R<RELAY> $* < @ $* > $@ $>ParseRecipient $1 -R<$-> $* $@ $2 - -###################################################################### -### check_relay -- check hostname/address on SMTP startup -###################################################################### - -SLocal_check_relay -Scheck_relay -R$* $: $1 $| $>"Local_check_relay" $1 -R$* $| $* $| $#$* $#$3 -R$* $| $* $| $* $@ $>"Basic_check_relay" $1 $| $2 - -SBasic_check_relay -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - - - -###################################################################### -### check_mail -- check SMTP `MAIL FROM:' command argument -###################################################################### - -SLocal_check_mail -Scheck_mail -R$* $: $1 $| $>"Local_check_mail" $1 -R$* $| $#$* $#$2 -R$* $| $* $@ $>"Basic_check_mail" $1 - -SBasic_check_mail -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - -R<> $@ <OK> -R$* $: <?> $>CanonAddr $1 -R<?> $* < @ $+ . > <?> $1 < @ $2 > strip trailing dots -# handle non-DNS hostnames (*.bitnet, *.decnet, *.uucp, etc) -R<?> $* < $* $=P > $* $: <OK> $1 < @ $2 $3 > $4 -R<?> $* < @ $+ > $* $: <? $(resolve $2 $: $2 <PERM> $) > $1 < @ $2 > $3 -R<? $* <$->> $* < @ $+ > $* - $: <$2> $3 < @ $4 > $5 - -# handle case of @localhost on address -R<$+> $* < @localhost > $: < ? $&{client_name} > <$1> $2 < @localhost > -R<$+> $* < @localhost.$m > - $: < ? $&{client_name} > <$1> $2 < @localhost.$m > -R<$+> $* < @localhost.UUCP > - $: < ? $&{client_name} > <$1> $2 < @localhost.UUCP > -R<? $=w> <$+> $* <?> <$2> $3 -R<? $+> <$+> $* $#error $@ 5.5.4 $: "553 Real domain name required" -R<?> <$+> $* $: <$1> $2 - - -# handle case of no @domain on address -R<?> $* $: < ? $&{client_name} > $1 -R<?> $* $@ <OK> ...local unqualed ok -R<? $+> $* $#error $@ 5.5.4 $: "553 Domain name required" - ...remote is not -# check results -R<?> $* $@ <OK> -R<OK> $* $@ <OK> -R<TEMP> $* $#error $@ 4.1.8 $: "451 Sender domain must resolve" -R<PERM> $* $#error $@ 5.1.8 $: "501 Sender domain must exist" - -###################################################################### -### check_rcpt -- check SMTP `RCPT TO:' command argument -###################################################################### - -SLocal_check_rcpt -Scheck_rcpt -R$* $: $1 $| $>"Local_check_rcpt" $1 -R$* $| $#$* $#$2 -R$* $| $* $@ $>"Basic_check_rcpt" $1 - -SBasic_check_rcpt -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - -R$* $: $>ParseRecipient $1 strip relayable hosts - - - - -# anything terminating locally is ok -R$+ < @ $=w > $@ OK -R$+ < @ $* $=R > $@ OK - - -# check for local user (i.e. unqualified address) -R$* $: <?> $1 -R<?> $* < @ $+ > $: <REMOTE> $1 < @ $2 > -# local user is ok -R<?> $+ $@ OK -R<$+> $* $: $2 - -# anything originating locally is ok -R$* $: <?> $&{client_name} -# check if bracketed IP address (forward lookup != reverse lookup) -R<?> [$+] $: <BAD> [$1] -# pass to name server to make hostname canonical -R<?> $* $~P $: <?> $[ $1 $2 $] -R<$-> $* $: $2 -R$* . $1 strip trailing dots -R$@ $@ OK -R$=w $@ OK -R$* $=R $@ OK - -# check IP address -R$* $: $&{client_addr} -R$@ $@ OK originated locally -R0 $@ OK originated locally -R$=R $* $@ OK relayable IP address -R$* $: [ $1 ] put brackets around it... -R$=w $@ OK ... and see if it is local - - -# anything else is bogus -R$* $#error $@ 5.7.1 $: "550 Relaying denied" - -# -###################################################################### -###################################################################### -##### -##### MAILER DEFINITIONS -##### -###################################################################### -###################################################################### - - -################################################## -### Local and Program Mailer specification ### -################################################## - -##### @(#)local.m4 8.30 (Berkeley) 6/30/1998 ##### - -Mlocal, P=/bin/mail, F=lsDFMAw5:/|@qSnE9, S=10/30, R=20/40, - T=DNS/RFC822/X-Unix, - A=mail -f $g -d $u -Mprog, P=/bin/sh, F=lsDFMoqeu9, S=10/30, R=20/40, D=$z:/, - T=X-Unix, - A=sh -c $u - -# -# Envelope sender rewriting -# -S10 -R<@> $n errors to mailer-daemon -R@ <@ $*> $n temporarily bypass Sun bogosity -R$+ $: $>50 $1 add local domain if needed -R$* $: $>94 $1 do masquerading - -# -# Envelope recipient rewriting -# -S20 -R$+ < @ $* > $: $1 strip host part - -# -# Header sender rewriting -# -S30 -R<@> $n errors to mailer-daemon -R@ <@ $*> $n temporarily bypass Sun bogosity -R$+ $: $>50 $1 add local domain if needed -R$* $: $>93 $1 do masquerading - -# -# Header recipient rewriting -# -S40 -R$+ $: $>50 $1 add local domain if needed - -# -# Common code to add local domain name (only if always-add-domain) -# -S50 - -##################################### -### SMTP Mailer specification ### -##################################### - -##### @(#)smtp.m4 8.38 (Berkeley) 5/19/1998 ##### - -Msmtp, P=[IPC], F=mDFMuX, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Mesmtp, P=[IPC], F=mDFMuXa, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Msmtp8, P=[IPC], F=mDFMuX8, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Mrelay, P=[IPC], F=mDFMuXa8, S=11/31, R=61, E=\r\n, L=2040, - T=DNS/RFC822/SMTP, - A=IPC $h - -# -# envelope sender rewriting -# -S11 -R$+ $: $>51 $1 sender/recipient common -R$* :; <@> $@ list:; special case -R$* $: $>61 $1 qualify unqual'ed names -R$+ $: $>94 $1 do masquerading - - -# -# envelope recipient rewriting -- -# also header recipient if not masquerading recipients -# -S21 -R$+ $: $>51 $1 sender/recipient common -R$+ $: $>61 $1 qualify unqual'ed names - - -# -# header sender and masquerading header recipient rewriting -# -S31 -R$+ $: $>51 $1 sender/recipient common -R:; <@> $@ list:; special case - -# do special header rewriting -R$* <@> $* $@ $1 <@> $2 pass null host through -R< @ $* > $* $@ < @ $1 > $2 pass route-addr through -R$* $: $>61 $1 qualify unqual'ed names -R$+ $: $>93 $1 do masquerading - - -# -# convert pseudo-domain addresses to real domain addresses -# -S51 - -# pass <route-addr>s through -R< @ $+ > $* $@ < @ $1 > $2 resolve <route-addr> - -# output fake domains as user%fake@relay - -# do UUCP heuristics; note that these are shared with UUCP mailers -R$+ < @ $+ .UUCP. > $: < $2 ! > $1 convert to UUCP form -R$+ < @ $* > $* $@ $1 < @ $2 > $3 not UUCP form - -# leave these in .UUCP form to avoid further tampering -R< $&h ! > $- ! $+ $@ $2 < @ $1 .UUCP. > -R< $&h ! > $-.$+ ! $+ $@ $3 < @ $1.$2 > -R< $&h ! > $+ $@ $1 < @ $&h .UUCP. > -R< $+ ! > $+ $: $1 ! $2 < @ $Y > use UUCP_RELAY -R$+ < @ $+ : $+ > $@ $1 < @ $3 > strip mailer: part -R$+ < @ > $: $1 < @ *LOCAL* > if no UUCP_RELAY - - -# -# common sender and masquerading recipient rewriting -# -S61 - -R$* < @ $* > $* $@ $1 < @ $2 > $3 already fully qualified -R$+ $@ $1 < @ *LOCAL* > add local qualification - - -# -# relay mailer header masquerading recipient rewriting -# -S71 - -R$+ $: $>61 $1 -R$+ $: $>93 $1 diff --git a/cf/cf/generic-solaris2.mc b/cf/cf/generic-solaris2.mc deleted file mode 100644 index a696e01..0000000 --- a/cf/cf/generic-solaris2.mc +++ /dev/null @@ -1,26 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a generic configuration file for SunOS 5.x (a.k.a. Solaris 2.x) -# It has support for local and SMTP mail only. If you want to -# customize it, copy it to a name appropriate for your environment -# and do the modifications there. -# - -divert(0)dnl -VERSIONID(`@(#)generic-solaris2.mc 8.8 (Berkeley) 5/19/1998') -OSTYPE(solaris2)dnl -DOMAIN(generic)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/cf/cf/generic-sunos4.1.cf b/cf/cf/generic-sunos4.1.cf deleted file mode 100644 index cd1443f..0000000 --- a/cf/cf/generic-sunos4.1.cf +++ /dev/null @@ -1,1062 +0,0 @@ -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -###################################################################### -###################################################################### -##### -##### SENDMAIL CONFIGURATION FILE -##### -##### built by gshapiro@knecht.sendmail.org on Thu Feb 4 16:39:23 PST 1999 -##### in /home/eric/src/sendmail/cf/cf -##### using ../ as configuration include directory -##### -###################################################################### -###################################################################### - -##### @(#)cfhead.m4 8.23 (Berkeley) 10/6/1998 ##### -##### @(#)cf.m4 8.29 (Berkeley) 5/19/1998 ##### -##### @(#)generic-sunos4.1.mc 8.8 (Berkeley) 5/19/1998 ##### - -##### @(#)sunos4.1.m4 8.7 (Berkeley) 5/19/1998 ##### - - -##### @(#)generic.m4 8.9 (Berkeley) 5/19/1998 ##### - -##### @(#)redirect.m4 8.10 (Berkeley) 5/19/1998 ##### - - - - -##### @(#)use_cw_file.m4 8.6 (Berkeley) 5/19/1998 ##### - - - -##### @(#)proto.m4 8.243 (Berkeley) 2/2/1999 ##### - - -# level 8 config file format -V8/Berkeley - -# override file safeties - setting this option compromises system security -# need to set this now for the sake of class files -#O DontBlameSendmail=safe - -################## -# local info # -################## - -Cwlocalhost -# file containing names of hosts for which we receive email -Fw/etc/sendmail.cw - -# my official domain name -# ... define this only if sendmail cannot automatically determine your domain -#Dj$w.Foo.COM - - -CP. - -# "Smart" relay host (may be null) -DS - - -# operators that cannot be in local usernames (i.e., network indicators) -CO @ % ! - -# a class with just dot (for identifying canonical names) -C.. - -# a class with just a left bracket (for identifying domain literals) -C[[ - - - - - - - - - -# Resolve map (to check if a host exists in check_mail) -Kresolve host -a<OK> -T<TEMP> - -# Hosts that will permit relaying ($=R) -FR-o /etc/mail/relay-domains - -# who I send unqualified names to (null means deliver locally) -DR - -# who gets all local email traffic ($R has precedence for unqualified names) -DH - -# dequoting map -Kdequote dequote - -# class E: names that should be exposed as from this host, even if we masquerade -# class L: names that should be delivered locally, even if we have a relay -# class M: domains that should be converted to $M -#CL root -CE root - -# who I masquerade as (null for no masquerading) (see also $=M) -DM - -# my name for error messages -DnMAILER-DAEMON - - -CPREDIRECT - -# Configuration version number -DZ8.9.3 - - -############### -# Options # -############### - -# strip message body to 7 bits on input? -O SevenBitInput=False - -# 8-bit data handling -O EightBitMode=pass8 - - -# wait for alias file rebuild (default units: minutes) -O AliasWait=10 - -# location of alias file -O AliasFile=/etc/aliases - -# minimum number of free blocks on filesystem -O MinFreeBlocks=100 - -# maximum message size -#O MaxMessageSize=1000000 - -# substitution for space (blank) characters -O BlankSub=. - -# avoid connecting to "expensive" mailers on initial submission? -O HoldExpensive=False - -# checkpoint queue runs after every N successful deliveries -#O CheckpointInterval=10 - -# default delivery mode -O DeliveryMode=background - -# automatically rebuild the alias database? -#O AutoRebuildAliases - -# error message header/file -#O ErrorHeader=/etc/sendmail.oE - -# error mode -#O ErrorMode=print - -# save Unix-style "From_" lines at top of header? -#O SaveFromLine - -# temporary file mode -O TempFileMode=0600 - -# match recipients against GECOS field? -#O MatchGECOS - -# maximum hop count -#O MaxHopCount=17 - -# location of help file -O HelpFile=/usr/lib/sendmail.hf - -# ignore dots as terminators in incoming messages? -#O IgnoreDots - -# name resolver options -#O ResolverOptions=+AAONLY - -# deliver MIME-encapsulated error messages? -O SendMimeErrors=True - -# Forward file search path -O ForwardPath=$z/.forward.$w+$h:$z/.forward+$h:$z/.forward.$w:$z/.forward - -# open connection cache size -O ConnectionCacheSize=2 - -# open connection cache timeout -O ConnectionCacheTimeout=5m - -# persistent host status directory -#O HostStatusDirectory=.hoststat - -# single thread deliveries (requires HostStatusDirectory)? -#O SingleThreadDelivery - -# use Errors-To: header? -O UseErrorsTo=False - -# log level -O LogLevel=9 - -# send to me too, even in an alias expansion? -#O MeToo - -# verify RHS in newaliases? -O CheckAliases=False - -# default messages to old style headers if no special punctuation? -O OldStyleHeaders=True - -# SMTP daemon options -#O DaemonPortOptions=Port=esmtp - -# privacy flags -O PrivacyOptions=authwarnings - -# who (if anyone) should get extra copies of error messages -#O PostMasterCopy=Postmaster - -# slope of queue-only function -#O QueueFactor=600000 - -# queue directory -O QueueDirectory=/var/spool/mqueue - -# timeouts (many of these) -#O Timeout.initial=5m -#O Timeout.connect=5m -#O Timeout.iconnect=5m -#O Timeout.helo=5m -#O Timeout.mail=10m -#O Timeout.rcpt=1h -#O Timeout.datainit=5m -#O Timeout.datablock=1h -#O Timeout.datafinal=1h -#O Timeout.rset=5m -#O Timeout.quit=2m -#O Timeout.misc=2m -#O Timeout.command=1h -#O Timeout.ident=30s -#O Timeout.fileopen=60s -O Timeout.queuereturn=5d -#O Timeout.queuereturn.normal=5d -#O Timeout.queuereturn.urgent=2d -#O Timeout.queuereturn.non-urgent=7d -O Timeout.queuewarn=4h -#O Timeout.queuewarn.normal=4h -#O Timeout.queuewarn.urgent=1h -#O Timeout.queuewarn.non-urgent=12h -#O Timeout.hoststatus=30m - -# should we not prune routes in route-addr syntax addresses? -#O DontPruneRoutes - -# queue up everything before forking? -O SuperSafe=True - -# status file -O StatusFile=/etc/sendmail.st - -# time zone handling: -# if undefined, use system default -# if defined but null, use TZ envariable passed in -# if defined and non-null, use that info -#O TimeZoneSpec= - -# default UID (can be username or userid:groupid) -#O DefaultUser=mailnull - -# list of locations of user database file (null means no lookup) -#O UserDatabaseSpec=/etc/userdb - -# fallback MX host -#O FallbackMXhost=fall.back.host.net - -# if we are the best MX host for a site, try it directly instead of config err -#O TryNullMXList - -# load average at which we just queue messages -#O QueueLA=8 - -# load average at which we refuse connections -#O RefuseLA=12 - -# maximum number of children we allow at one time -#O MaxDaemonChildren=12 - -# maximum number of new connections per second -#O ConnectionRateThrottle=3 - -# work recipient factor -#O RecipientFactor=30000 - -# deliver each queued job in a separate process? -#O ForkEachJob - -# work class factor -#O ClassFactor=1800 - -# work time factor -#O RetryFactor=90000 - -# shall we sort the queue by hostname first? -#O QueueSortOrder=priority - -# minimum time in queue before retry -#O MinQueueAge=30m - -# default character set -#O DefaultCharSet=iso-8859-1 - -# service switch file (ignored on Solaris, Ultrix, OSF/1, others) -#O ServiceSwitchFile=/etc/service.switch - -# hosts file (normally /etc/hosts) -#O HostsFile=/etc/hosts - -# dialup line delay on connection failure -#O DialDelay=10s - -# action to take if there are no recipients in the message -#O NoRecipientAction=add-to-undisclosed - -# chrooted environment for writing to files -#O SafeFileEnvironment=/arch - -# are colons OK in addresses? -#O ColonOkInAddr - -# how many jobs can you process in the queue? -#O MaxQueueRunSize=10000 - -# shall I avoid expanding CNAMEs (violates protocols)? -#O DontExpandCnames - -# SMTP initial login message (old $e macro) -O SmtpGreetingMessage=$j Sendmail $v/$Z; $b - -# UNIX initial From header format (old $l macro) -O UnixFromLine=From $g $d - -# From: lines that have embedded newlines are unwrapped onto one line -#O SingleLineFromHeader=False - -# Allow HELO SMTP command that does not include a host name -#O AllowBogusHELO=False - -# Characters to be quoted in a full name phrase (@,;:\()[] are automatic) -#O MustQuoteChars=. - -# delimiter (operator) characters (old $o macro) -O OperatorChars=.:%@!^/[]+ - -# shall I avoid calling initgroups(3) because of high NIS costs? -#O DontInitGroups - -# are group-writable :include: and .forward files (un)trustworthy? -#O UnsafeGroupWrites - -# where do errors that occur when sending errors get sent? -#O DoubleBounceAddress=postmaster - -# what user id do we assume for the majority of the processing? -#O RunAsUser=sendmail - -# maximum number of recipients per SMTP envelope -#O MaxRecipientsPerMessage=100 - -# shall we get local names from our installed interfaces? -#O DontProbeInterfaces - - - - - - -########################### -# Message precedences # -########################### - -Pfirst-class=0 -Pspecial-delivery=100 -Plist=-30 -Pbulk=-60 -Pjunk=-100 - -##################### -# Trusted users # -##################### - -# this is equivalent to setting class "t" -#Ft/etc/sendmail.ct -Troot -Tdaemon -Tuucp - -######################### -# Format of headers # -######################### - -H?P?Return-Path: <$g> -HReceived: $?sfrom $s $.$?_($?s$|from $.$_) - $.by $j ($v/$Z)$?r with $r$. id $i$?u - for $u; $|; - $.$b -H?D?Resent-Date: $a -H?D?Date: $a -H?F?Resent-From: $?x$x <$g>$|$g$. -H?F?From: $?x$x <$g>$|$g$. -H?x?Full-Name: $x -# HPosted-Date: $a -# H?l?Received-Date: $b -H?M?Resent-Message-Id: <$t.$i@$j> -H?M?Message-Id: <$t.$i@$j> -# -###################################################################### -###################################################################### -##### -##### REWRITING RULES -##### -###################################################################### -###################################################################### - -############################################ -### Ruleset 3 -- Name Canonicalization ### -############################################ -S3 - -# handle null input (translate to <@> special case) -R$@ $@ <@> - -# strip group: syntax (not inside angle brackets!) and trailing semicolon -R$* $: $1 <@> mark addresses -R$* < $* > $* <@> $: $1 < $2 > $3 unmark <addr> -R@ $* <@> $: @ $1 unmark @host:... -R$* :: $* <@> $: $1 :: $2 unmark node::addr -R:include: $* <@> $: :include: $1 unmark :include:... -R$* [ $* : $* ] <@> $: $1 [ $2 : $3 ] unmark IPv6 addrs -R$* : $* [ $* ] $: $1 : $2 [ $3 ] <@> remark if leading colon -R$* : $* <@> $: $2 strip colon if marked -R$* <@> $: $1 unmark -R$* ; $1 strip trailing semi -R$* < $* ; > $1 < $2 > bogus bracketed semi - -# null input now results from list:; syntax -R$@ $@ :; <@> - -# strip angle brackets -- note RFC733 heuristic to get innermost item -R$* $: < $1 > housekeeping <> -R$+ < $* > < $2 > strip excess on left -R< $* > $+ < $1 > strip excess on right -R<> $@ < @ > MAIL FROM:<> case -R< $+ > $: $1 remove housekeeping <> - -# make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later -R@ $+ , $+ @ $1 : $2 change all "," to ":" - -# localize and dispose of route-based addresses -R@ $+ : $+ $@ $>96 < @$1 > : $2 handle <route-addr> - -# find focus for list syntax -R $+ : $* ; @ $+ $@ $>96 $1 : $2 ; < @ $3 > list syntax -R $+ : $* ; $@ $1 : $2; list syntax - -# find focus for @ syntax addresses -R$+ @ $+ $: $1 < @ $2 > focus on domain -R$+ < $+ @ $+ > $1 $2 < @ $3 > move gaze right -R$+ < @ $+ > $@ $>96 $1 < @ $2 > already canonical - -# do some sanity checking -R$* < @ $* : $* > $* $1 < @ $2 $3 > $4 nix colons in addrs - -# convert old-style addresses to a domain-based address -R$- ! $+ $@ $>96 $2 < @ $1 .UUCP > resolve uucp names -R$+ . $- ! $+ $@ $>96 $3 < @ $1 . $2 > domain uucps -R$+ ! $+ $@ $>96 $2 < @ $1 .UUCP > uucp subdomains - -# if we have % signs, take the rightmost one -R$* % $* $1 @ $2 First make them all @s. -R$* @ $* @ $* $1 % $2 @ $3 Undo all but the last. -R$* @ $* $@ $>96 $1 < @ $2 > Insert < > and finish - -# else we must be a local name -R$* $@ $>96 $1 - - -################################################ -### Ruleset 96 -- bottom half of ruleset 3 ### -################################################ - -S96 - -# handle special cases for local names -R$* < @ localhost > $* $: $1 < @ $j . > $2 no domain at all -R$* < @ localhost . $m > $* $: $1 < @ $j . > $2 local domain -R$* < @ localhost . UUCP > $* $: $1 < @ $j . > $2 .UUCP domain -R$* < @ [ $+ ] > $* $: $1 < @@ [ $2 ] > $3 mark [a.b.c.d] -R$* < @@ $=w > $* $: $1 < @ $j . > $3 self-literal -R$* < @@ $+ > $* $@ $1 < @ $2 > $3 canon IP addr - - - - - -# if really UUCP, handle it immediately - -# try UUCP traffic as a local address -R$* < @ $+ . UUCP > $* $: $1 < @ $[ $2 $] . UUCP . > $3 -R$* < @ $+ . . UUCP . > $* $@ $1 < @ $2 . > $3 - -# pass to name server to make hostname canonical -R$* < @ $* $~P > $* $: $1 < @ $[ $2 $3 $] > $4 - -# local host aliases and pseudo-domains are always canonical -R$* < @ $=w > $* $: $1 < @ $2 . > $3 -R$* < @ $j > $* $: $1 < @ $j . > $2 -R$* < @ $=M > $* $: $1 < @ $2 . > $3 -R$* < @ $* $=P > $* $: $1 < @ $2 $3 . > $4 -R$* < @ $* . . > $* $1 < @ $2 . > $3 - - -################################################## -### Ruleset 4 -- Final Output Post-rewriting ### -################################################## -S4 - -R$* <@> $@ handle <> and list:; - -# strip trailing dot off possibly canonical name -R$* < @ $+ . > $* $1 < @ $2 > $3 - -# eliminate internal code -- should never get this far! -R$* < @ *LOCAL* > $* $1 < @ $j > $2 - -# externalize local domain info -R$* < $+ > $* $1 $2 $3 defocus -R@ $+ : @ $+ : $+ @ $1 , @ $2 : $3 <route-addr> canonical -R@ $* $@ @ $1 ... and exit - -# UUCP must always be presented in old form -R$+ @ $- . UUCP $2!$1 u@h.UUCP => h!u - -# delete duplicate local names -R$+ % $=w @ $=w $1 @ $2 u%host@host => u@host - - - -############################################################## -### Ruleset 97 -- recanonicalize and call ruleset zero ### -### (used for recursive calls) ### -############################################################## - -S97 -R$* $: $>3 $1 -R$* $@ $>0 $1 - - -###################################### -### Ruleset 0 -- Parse Address ### -###################################### - -S0 - -R$* $: $>Parse0 $1 initial parsing -R<@> $#local $: <@> special case error msgs -R$* $: $>98 $1 handle local hacks -R$* $: $>Parse1 $1 final parsing - -# -# Parse0 -- do initial syntax checking and eliminate local addresses. -# This should either return with the (possibly modified) input -# or return with a #error mailer. It should not return with a -# #mailer other than the #error mailer. -# - -SParse0 -R<@> $@ <@> special case error msgs -R$* : $* ; <@> $#error $@ 5.1.3 $: "List:; syntax illegal for recipient addresses" -#R@ <@ $* > < @ $1 > catch "@@host" bogosity -R<@ $+> $#error $@ 5.1.3 $: "User address required" -R$* $: <> $1 -R<> $* < @ [ $+ ] > $* $1 < @ [ $2 ] > $3 -R<> $* <$* : $* > $* $#error $@ 5.1.3 $: "Colon illegal in host name part" -R<> $* $1 -R$* < @ . $* > $* $#error $@ 5.1.2 $: "Invalid host name" -R$* < @ $* .. $* > $* $#error $@ 5.1.2 $: "Invalid host name" - -# now delete the local info -- note $=O to find characters that cause forwarding -R$* < @ > $* $@ $>Parse0 $>3 $1 user@ => user -R< @ $=w . > : $* $@ $>Parse0 $>3 $2 @here:... -> ... -R$- < @ $=w . > $: $(dequote $1 $) < @ $2 . > dequote "foo"@here -R< @ $+ > $#error $@ 5.1.3 $: "User address required" -R$* $=O $* < @ $=w . > $@ $>Parse0 $>3 $1 $2 $3 ...@here -> ... -R$- $: $(dequote $1 $) < @ *LOCAL* > dequote "foo" -R< @ *LOCAL* > $#error $@ 5.1.3 $: "User address required" -R$* $=O $* < @ *LOCAL* > - $@ $>Parse0 $>3 $1 $2 $3 ...@*LOCAL* -> ... -R$* < @ *LOCAL* > $: $1 - -# -# Parse1 -- the bottom half of ruleset 0. -# - -SParse1 -# handle numeric address spec -R$* < @ [ $+ ] > $* $: $>98 $1 < @ [ $2 ] > $3 numeric internet spec -R$* < @ [ $+ ] > $* $#esmtp $@ [$2] $: $1 < @ [$2] > $3 still numeric: send - - -# short circuit local delivery so forwarded email works -R$=L < @ $=w . > $#local $: @ $1 special local names -R$+ < @ $=w . > $#local $: $1 regular local name - - -# resolve remotely connected UUCP links (if any) - -# resolve fake top level domains by forwarding to other hosts - - - -# pass names that still have a host to a smarthost (if defined) -R$* < @ $* > $* $: $>95 < $S > $1 < @ $2 > $3 glue on smarthost name - -# deal with other remote names -R$* < @$* > $* $#esmtp $@ $2 $: $1 < @ $2 > $3 user@host.domain - -# handle locally delivered names -R$=L $#local $: @ $1 special local names -R$+ $#local $: $1 regular local names - -########################################################################### -### Ruleset 5 -- special rewriting after aliases have been expanded ### -########################################################################### - -S5 - -# deal with plussed users so aliases work nicely -R$+ + * $#local $@ $&h $: $1 -R$+ + $* $#local $@ + $2 $: $1 + * - -# prepend an empty "forward host" on the front -R$+ $: <> $1 - - -# see if we have a relay or a hub -R< > $+ $: < $H > $1 try hub -R< > $+ $: < $R > $1 try relay -R< > $+ $: < > < $1 $&h > nope, restore +detail -R< > < $+ + $* > $* < > < $1 > + $2 $3 find the user part -R< > < $+ > + $* $#local $@ $2 $: @ $1 strip the extra + -R< > < $+ > $@ $1 no +detail -R$+ $: $1 <> $&h add +detail back in -R$+ <> + $* $: $1 + $2 check whether +detail -R$+ <> $* $: $1 else discard -R< local : $* > $* $: $>95 < local : $1 > $2 no host extension -R< error : $* > $* $: $>95 < error : $1 > $2 no host extension -R< $- : $+ > $+ $: $>95 < $1 : $2 > $3 < @ $2 > -R< $+ > $+ $@ $>95 < $1 > $2 < @ $1 > - - -################################################################### -### Ruleset 95 -- canonify mailer:[user@]host syntax to triple ### -################################################################### - -S95 -R< > $* $@ $1 strip off null relay -R< error : $- $+ > $* $#error $@ $(dequote $1 $) $: $2 -R< local : $* > $* $>CanonLocal < $1 > $2 -R< $- : $+ @ $+ > $*<$*>$* $# $1 $@ $3 $: $2<@$3> use literal user -R< $- : $+ > $* $# $1 $@ $2 $: $3 try qualified mailer -R< $=w > $* $@ $2 delete local host -R< $+ > $* $#relay $@ $1 $: $2 use unqualified mailer - -################################################################### -### Ruleset CanonLocal -- canonify local: syntax ### -################################################################### - -SCanonLocal -# strip local host from routed addresses -R< $* > < @ $+ > : $+ $@ $>97 $3 -R< $* > $+ $=O $+ < @ $+ > $@ $>97 $2 $3 $4 - -# strip trailing dot from any host name that may appear -R< $* > $* < @ $* . > $: < $1 > $2 < @ $3 > - -# handle local: syntax -- use old user, either with or without host -R< > $* < @ $* > $* $#local $@ $1@$2 $: $1 -R< > $+ $#local $@ $1 $: $1 - -# handle local:user@host syntax -- ignore host part -R< $+ @ $+ > $* < @ $* > $: < $1 > $3 < @ $4 > - -# handle local:user syntax -R< $+ > $* <@ $* > $* $#local $@ $2@$3 $: $1 -R< $+ > $* $#local $@ $2 $: $1 - -################################################################### -### Ruleset 93 -- convert header names to masqueraded form ### -################################################################### - -S93 - - -# special case the users that should be exposed -R$=E < @ *LOCAL* > $@ $1 < @ $j . > leave exposed -R$=E < @ $=M . > $@ $1 < @ $2 . > -R$=E < @ $=w . > $@ $1 < @ $2 . > - -# handle domain-specific masquerading -R$* < @ $=M . > $* $: $1 < @ $2 . @ $M > $3 convert masqueraded doms -R$* < @ $=w . > $* $: $1 < @ $2 . @ $M > $3 -R$* < @ *LOCAL* > $* $: $1 < @ $j . @ $M > $2 -R$* < @ $+ @ > $* $: $1 < @ $2 > $3 $M is null -R$* < @ $+ @ $+ > $* $: $1 < @ $3 . > $4 $M is not null - -################################################################### -### Ruleset 94 -- convert envelope names to masqueraded form ### -################################################################### - -S94 -R$* < @ *LOCAL* > $* $: $1 < @ $j . > $2 - -################################################################### -### Ruleset 98 -- local part of ruleset zero (can be null) ### -################################################################### - -S98 - -# addresses sent to foo@host.REDIRECT will give a 551 error code -R$* < @ $+ .REDIRECT. > $: $1 < @ $2 . REDIRECT . > < ${opMode} > -R$* < @ $+ .REDIRECT. > <i> $: $1 < @ $2 . REDIRECT. > -R$* < @ $+ .REDIRECT. > < $- > $# error $@ 5.1.1 $: "551 User has moved; please try " <$1@$2> - - - -###################################################################### -### CanonAddr -- Convert an address into a standard form for -### relay checking. Route address syntax is -### crudely converted into a %-hack address. -### -### Parameters: -### $1 -- full recipient address -### -### Returns: -### parsed address, not in source route form -###################################################################### - -SCanonAddr -R$* $: $>Parse0 $>3 $1 make domain canonical -R< @ $+ > : $* @ $* < @ $1 > : $2 % $3 change @ to % in src route -R$* < @ $+ > : $* : $* $3 $1 < @ $2 > : $4 change to % hack. -R$* < @ $+ > : $* $3 $1 < @ $2 > - -###################################################################### -### ParseRecipient -- Strip off hosts in $=R as well as possibly -### $* $=m or the access database. -### Check user portion for host separators. -### -### Parameters: -### $1 -- full recipient address -### -### Returns: -### parsed, non-local-relaying address -###################################################################### - -SParseRecipient -R$* $: <?> $>CanonAddr $1 -R<?> $* < @ $* . > <?> $1 < @ $2 > strip trailing dots -R<?> $- < @ $* > $: <?> $(dequote $1 $) < @ $2 > dequote local part - -# if no $=O character, no host in the user portion, we are done -R<?> $* $=O $* < @ $* > $: <NO> $1 $2 $3 < @ $4> -R<?> $* $@ $1 - - - -R<NO> $* < @ $* $=R > $: <RELAY> $1 < @ $2 $3 > - -R<RELAY> $* < @ $* > $@ $>ParseRecipient $1 -R<$-> $* $@ $2 - -###################################################################### -### check_relay -- check hostname/address on SMTP startup -###################################################################### - -SLocal_check_relay -Scheck_relay -R$* $: $1 $| $>"Local_check_relay" $1 -R$* $| $* $| $#$* $#$3 -R$* $| $* $| $* $@ $>"Basic_check_relay" $1 $| $2 - -SBasic_check_relay -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - - - -###################################################################### -### check_mail -- check SMTP `MAIL FROM:' command argument -###################################################################### - -SLocal_check_mail -Scheck_mail -R$* $: $1 $| $>"Local_check_mail" $1 -R$* $| $#$* $#$2 -R$* $| $* $@ $>"Basic_check_mail" $1 - -SBasic_check_mail -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - -R<> $@ <OK> -R$* $: <?> $>CanonAddr $1 -R<?> $* < @ $+ . > <?> $1 < @ $2 > strip trailing dots -# handle non-DNS hostnames (*.bitnet, *.decnet, *.uucp, etc) -R<?> $* < $* $=P > $* $: <OK> $1 < @ $2 $3 > $4 -R<?> $* < @ $+ > $* $: <? $(resolve $2 $: $2 <PERM> $) > $1 < @ $2 > $3 -R<? $* <$->> $* < @ $+ > $* - $: <$2> $3 < @ $4 > $5 - -# handle case of @localhost on address -R<$+> $* < @localhost > $: < ? $&{client_name} > <$1> $2 < @localhost > -R<$+> $* < @localhost.$m > - $: < ? $&{client_name} > <$1> $2 < @localhost.$m > -R<$+> $* < @localhost.UUCP > - $: < ? $&{client_name} > <$1> $2 < @localhost.UUCP > -R<? $=w> <$+> $* <?> <$2> $3 -R<? $+> <$+> $* $#error $@ 5.5.4 $: "553 Real domain name required" -R<?> <$+> $* $: <$1> $2 - - -# handle case of no @domain on address -R<?> $* $: < ? $&{client_name} > $1 -R<?> $* $@ <OK> ...local unqualed ok -R<? $+> $* $#error $@ 5.5.4 $: "553 Domain name required" - ...remote is not -# check results -R<?> $* $@ <OK> -R<OK> $* $@ <OK> -R<TEMP> $* $#error $@ 4.1.8 $: "451 Sender domain must resolve" -R<PERM> $* $#error $@ 5.1.8 $: "501 Sender domain must exist" - -###################################################################### -### check_rcpt -- check SMTP `RCPT TO:' command argument -###################################################################### - -SLocal_check_rcpt -Scheck_rcpt -R$* $: $1 $| $>"Local_check_rcpt" $1 -R$* $| $#$* $#$2 -R$* $| $* $@ $>"Basic_check_rcpt" $1 - -SBasic_check_rcpt -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - -R$* $: $>ParseRecipient $1 strip relayable hosts - - - - -# anything terminating locally is ok -R$+ < @ $=w > $@ OK -R$+ < @ $* $=R > $@ OK - - -# check for local user (i.e. unqualified address) -R$* $: <?> $1 -R<?> $* < @ $+ > $: <REMOTE> $1 < @ $2 > -# local user is ok -R<?> $+ $@ OK -R<$+> $* $: $2 - -# anything originating locally is ok -R$* $: <?> $&{client_name} -# check if bracketed IP address (forward lookup != reverse lookup) -R<?> [$+] $: <BAD> [$1] -# pass to name server to make hostname canonical -R<?> $* $~P $: <?> $[ $1 $2 $] -R<$-> $* $: $2 -R$* . $1 strip trailing dots -R$@ $@ OK -R$=w $@ OK -R$* $=R $@ OK - -# check IP address -R$* $: $&{client_addr} -R$@ $@ OK originated locally -R0 $@ OK originated locally -R$=R $* $@ OK relayable IP address -R$* $: [ $1 ] put brackets around it... -R$=w $@ OK ... and see if it is local - - -# anything else is bogus -R$* $#error $@ 5.7.1 $: "550 Relaying denied" - -# -###################################################################### -###################################################################### -##### -##### MAILER DEFINITIONS -##### -###################################################################### -###################################################################### - - -################################################## -### Local and Program Mailer specification ### -################################################## - -##### @(#)local.m4 8.30 (Berkeley) 6/30/1998 ##### - -Mlocal, P=/bin/mail, F=lsDFMAw5:/|@qrmn9, S=10/30, R=20/40, - T=DNS/RFC822/X-Unix, - A=mail -d $u -Mprog, P=/bin/sh, F=lsDFMoqeu9, S=10/30, R=20/40, D=$z:/, - T=X-Unix, - A=sh -c $u - -# -# Envelope sender rewriting -# -S10 -R<@> $n errors to mailer-daemon -R@ <@ $*> $n temporarily bypass Sun bogosity -R$+ $: $>50 $1 add local domain if needed -R$* $: $>94 $1 do masquerading - -# -# Envelope recipient rewriting -# -S20 -R$+ < @ $* > $: $1 strip host part - -# -# Header sender rewriting -# -S30 -R<@> $n errors to mailer-daemon -R@ <@ $*> $n temporarily bypass Sun bogosity -R$+ $: $>50 $1 add local domain if needed -R$* $: $>93 $1 do masquerading - -# -# Header recipient rewriting -# -S40 -R$+ $: $>50 $1 add local domain if needed - -# -# Common code to add local domain name (only if always-add-domain) -# -S50 - -##################################### -### SMTP Mailer specification ### -##################################### - -##### @(#)smtp.m4 8.38 (Berkeley) 5/19/1998 ##### - -Msmtp, P=[IPC], F=mDFMuX, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Mesmtp, P=[IPC], F=mDFMuXa, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Msmtp8, P=[IPC], F=mDFMuX8, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Mrelay, P=[IPC], F=mDFMuXa8, S=11/31, R=61, E=\r\n, L=2040, - T=DNS/RFC822/SMTP, - A=IPC $h - -# -# envelope sender rewriting -# -S11 -R$+ $: $>51 $1 sender/recipient common -R$* :; <@> $@ list:; special case -R$* $: $>61 $1 qualify unqual'ed names -R$+ $: $>94 $1 do masquerading - - -# -# envelope recipient rewriting -- -# also header recipient if not masquerading recipients -# -S21 -R$+ $: $>51 $1 sender/recipient common -R$+ $: $>61 $1 qualify unqual'ed names - - -# -# header sender and masquerading header recipient rewriting -# -S31 -R$+ $: $>51 $1 sender/recipient common -R:; <@> $@ list:; special case - -# do special header rewriting -R$* <@> $* $@ $1 <@> $2 pass null host through -R< @ $* > $* $@ < @ $1 > $2 pass route-addr through -R$* $: $>61 $1 qualify unqual'ed names -R$+ $: $>93 $1 do masquerading - - -# -# convert pseudo-domain addresses to real domain addresses -# -S51 - -# pass <route-addr>s through -R< @ $+ > $* $@ < @ $1 > $2 resolve <route-addr> - -# output fake domains as user%fake@relay - -# do UUCP heuristics; note that these are shared with UUCP mailers -R$+ < @ $+ .UUCP. > $: < $2 ! > $1 convert to UUCP form -R$+ < @ $* > $* $@ $1 < @ $2 > $3 not UUCP form - -# leave these in .UUCP form to avoid further tampering -R< $&h ! > $- ! $+ $@ $2 < @ $1 .UUCP. > -R< $&h ! > $-.$+ ! $+ $@ $3 < @ $1.$2 > -R< $&h ! > $+ $@ $1 < @ $&h .UUCP. > -R< $+ ! > $+ $: $1 ! $2 < @ $Y > use UUCP_RELAY -R$+ < @ $+ : $+ > $@ $1 < @ $3 > strip mailer: part -R$+ < @ > $: $1 < @ *LOCAL* > if no UUCP_RELAY - - -# -# common sender and masquerading recipient rewriting -# -S61 - -R$* < @ $* > $* $@ $1 < @ $2 > $3 already fully qualified -R$+ $@ $1 < @ *LOCAL* > add local qualification - - -# -# relay mailer header masquerading recipient rewriting -# -S71 - -R$+ $: $>61 $1 -R$+ $: $>93 $1 diff --git a/cf/cf/generic-sunos4.1.mc b/cf/cf/generic-sunos4.1.mc deleted file mode 100644 index fc0de35..0000000 --- a/cf/cf/generic-sunos4.1.mc +++ /dev/null @@ -1,26 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a generic configuration file for SunOS 4.1.x. -# It has support for local and SMTP mail only. If you want to -# customize it, copy it to a name appropriate for your environment -# and do the modifications there. -# - -divert(0)dnl -VERSIONID(`@(#)generic-sunos4.1.mc 8.8 (Berkeley) 5/19/1998') -OSTYPE(sunos4.1)dnl -DOMAIN(generic)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/cf/cf/generic-ultrix4.cf b/cf/cf/generic-ultrix4.cf deleted file mode 100644 index ea07878..0000000 --- a/cf/cf/generic-ultrix4.cf +++ /dev/null @@ -1,1062 +0,0 @@ -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -###################################################################### -###################################################################### -##### -##### SENDMAIL CONFIGURATION FILE -##### -##### built by gshapiro@knecht.sendmail.org on Thu Feb 4 16:39:23 PST 1999 -##### in /home/eric/src/sendmail/cf/cf -##### using ../ as configuration include directory -##### -###################################################################### -###################################################################### - -##### @(#)cfhead.m4 8.23 (Berkeley) 10/6/1998 ##### -##### @(#)cf.m4 8.29 (Berkeley) 5/19/1998 ##### -##### @(#)generic-ultrix4.mc 8.8 (Berkeley) 5/19/1998 ##### - -##### @(#)ultrix4.m4 8.8 (Berkeley) 5/19/1998 ##### - - -##### @(#)generic.m4 8.9 (Berkeley) 5/19/1998 ##### - -##### @(#)redirect.m4 8.10 (Berkeley) 5/19/1998 ##### - - - - -##### @(#)use_cw_file.m4 8.6 (Berkeley) 5/19/1998 ##### - - - -##### @(#)proto.m4 8.243 (Berkeley) 2/2/1999 ##### - - -# level 8 config file format -V8/Berkeley - -# override file safeties - setting this option compromises system security -# need to set this now for the sake of class files -#O DontBlameSendmail=safe - -################## -# local info # -################## - -Cwlocalhost -# file containing names of hosts for which we receive email -Fw/etc/sendmail.cw - -# my official domain name -# ... define this only if sendmail cannot automatically determine your domain -#Dj$w.Foo.COM - - -CP. - -# "Smart" relay host (may be null) -DS - - -# operators that cannot be in local usernames (i.e., network indicators) -CO @ % ! - -# a class with just dot (for identifying canonical names) -C.. - -# a class with just a left bracket (for identifying domain literals) -C[[ - - - - - - - - - -# Resolve map (to check if a host exists in check_mail) -Kresolve host -a<OK> -T<TEMP> - -# Hosts that will permit relaying ($=R) -FR-o /etc/mail/relay-domains - -# who I send unqualified names to (null means deliver locally) -DR - -# who gets all local email traffic ($R has precedence for unqualified names) -DH - -# dequoting map -Kdequote dequote - -# class E: names that should be exposed as from this host, even if we masquerade -# class L: names that should be delivered locally, even if we have a relay -# class M: domains that should be converted to $M -#CL root -CE root - -# who I masquerade as (null for no masquerading) (see also $=M) -DM - -# my name for error messages -DnMAILER-DAEMON - - -CPREDIRECT - -# Configuration version number -DZ8.9.3 - - -############### -# Options # -############### - -# strip message body to 7 bits on input? -O SevenBitInput=False - -# 8-bit data handling -O EightBitMode=pass8 - - -# wait for alias file rebuild (default units: minutes) -O AliasWait=10 - -# location of alias file -O AliasFile=/etc/aliases - -# minimum number of free blocks on filesystem -O MinFreeBlocks=100 - -# maximum message size -#O MaxMessageSize=1000000 - -# substitution for space (blank) characters -O BlankSub=. - -# avoid connecting to "expensive" mailers on initial submission? -O HoldExpensive=False - -# checkpoint queue runs after every N successful deliveries -#O CheckpointInterval=10 - -# default delivery mode -O DeliveryMode=background - -# automatically rebuild the alias database? -#O AutoRebuildAliases - -# error message header/file -#O ErrorHeader=/etc/sendmail.oE - -# error mode -#O ErrorMode=print - -# save Unix-style "From_" lines at top of header? -#O SaveFromLine - -# temporary file mode -O TempFileMode=0600 - -# match recipients against GECOS field? -#O MatchGECOS - -# maximum hop count -#O MaxHopCount=17 - -# location of help file -O HelpFile=/usr/lib/sendmail.hf - -# ignore dots as terminators in incoming messages? -#O IgnoreDots - -# name resolver options -#O ResolverOptions=+AAONLY - -# deliver MIME-encapsulated error messages? -O SendMimeErrors=True - -# Forward file search path -O ForwardPath=$z/.forward.$w+$h:$z/.forward+$h:$z/.forward.$w:$z/.forward - -# open connection cache size -O ConnectionCacheSize=2 - -# open connection cache timeout -O ConnectionCacheTimeout=5m - -# persistent host status directory -#O HostStatusDirectory=.hoststat - -# single thread deliveries (requires HostStatusDirectory)? -#O SingleThreadDelivery - -# use Errors-To: header? -O UseErrorsTo=False - -# log level -O LogLevel=9 - -# send to me too, even in an alias expansion? -#O MeToo - -# verify RHS in newaliases? -O CheckAliases=False - -# default messages to old style headers if no special punctuation? -O OldStyleHeaders=True - -# SMTP daemon options -#O DaemonPortOptions=Port=esmtp - -# privacy flags -O PrivacyOptions=authwarnings - -# who (if anyone) should get extra copies of error messages -#O PostMasterCopy=Postmaster - -# slope of queue-only function -#O QueueFactor=600000 - -# queue directory -O QueueDirectory=/var/spool/mqueue - -# timeouts (many of these) -#O Timeout.initial=5m -#O Timeout.connect=5m -#O Timeout.iconnect=5m -#O Timeout.helo=5m -#O Timeout.mail=10m -#O Timeout.rcpt=1h -#O Timeout.datainit=5m -#O Timeout.datablock=1h -#O Timeout.datafinal=1h -#O Timeout.rset=5m -#O Timeout.quit=2m -#O Timeout.misc=2m -#O Timeout.command=1h -#O Timeout.ident=30s -#O Timeout.fileopen=60s -O Timeout.queuereturn=5d -#O Timeout.queuereturn.normal=5d -#O Timeout.queuereturn.urgent=2d -#O Timeout.queuereturn.non-urgent=7d -O Timeout.queuewarn=4h -#O Timeout.queuewarn.normal=4h -#O Timeout.queuewarn.urgent=1h -#O Timeout.queuewarn.non-urgent=12h -#O Timeout.hoststatus=30m - -# should we not prune routes in route-addr syntax addresses? -#O DontPruneRoutes - -# queue up everything before forking? -O SuperSafe=True - -# status file -O StatusFile=/etc/sendmail.st - -# time zone handling: -# if undefined, use system default -# if defined but null, use TZ envariable passed in -# if defined and non-null, use that info -#O TimeZoneSpec= - -# default UID (can be username or userid:groupid) -#O DefaultUser=mailnull - -# list of locations of user database file (null means no lookup) -#O UserDatabaseSpec=/etc/userdb - -# fallback MX host -#O FallbackMXhost=fall.back.host.net - -# if we are the best MX host for a site, try it directly instead of config err -#O TryNullMXList - -# load average at which we just queue messages -#O QueueLA=8 - -# load average at which we refuse connections -#O RefuseLA=12 - -# maximum number of children we allow at one time -#O MaxDaemonChildren=12 - -# maximum number of new connections per second -#O ConnectionRateThrottle=3 - -# work recipient factor -#O RecipientFactor=30000 - -# deliver each queued job in a separate process? -#O ForkEachJob - -# work class factor -#O ClassFactor=1800 - -# work time factor -#O RetryFactor=90000 - -# shall we sort the queue by hostname first? -#O QueueSortOrder=priority - -# minimum time in queue before retry -#O MinQueueAge=30m - -# default character set -#O DefaultCharSet=iso-8859-1 - -# service switch file (ignored on Solaris, Ultrix, OSF/1, others) -#O ServiceSwitchFile=/etc/service.switch - -# hosts file (normally /etc/hosts) -#O HostsFile=/etc/hosts - -# dialup line delay on connection failure -#O DialDelay=10s - -# action to take if there are no recipients in the message -#O NoRecipientAction=add-to-undisclosed - -# chrooted environment for writing to files -#O SafeFileEnvironment=/arch - -# are colons OK in addresses? -#O ColonOkInAddr - -# how many jobs can you process in the queue? -#O MaxQueueRunSize=10000 - -# shall I avoid expanding CNAMEs (violates protocols)? -#O DontExpandCnames - -# SMTP initial login message (old $e macro) -O SmtpGreetingMessage=$j Sendmail $v/$Z; $b - -# UNIX initial From header format (old $l macro) -O UnixFromLine=From $g $d - -# From: lines that have embedded newlines are unwrapped onto one line -#O SingleLineFromHeader=False - -# Allow HELO SMTP command that does not include a host name -#O AllowBogusHELO=False - -# Characters to be quoted in a full name phrase (@,;:\()[] are automatic) -#O MustQuoteChars=. - -# delimiter (operator) characters (old $o macro) -O OperatorChars=.:%@!^/[]+ - -# shall I avoid calling initgroups(3) because of high NIS costs? -#O DontInitGroups - -# are group-writable :include: and .forward files (un)trustworthy? -#O UnsafeGroupWrites - -# where do errors that occur when sending errors get sent? -#O DoubleBounceAddress=postmaster - -# what user id do we assume for the majority of the processing? -#O RunAsUser=sendmail - -# maximum number of recipients per SMTP envelope -#O MaxRecipientsPerMessage=100 - -# shall we get local names from our installed interfaces? -#O DontProbeInterfaces - - - - - - -########################### -# Message precedences # -########################### - -Pfirst-class=0 -Pspecial-delivery=100 -Plist=-30 -Pbulk=-60 -Pjunk=-100 - -##################### -# Trusted users # -##################### - -# this is equivalent to setting class "t" -#Ft/etc/sendmail.ct -Troot -Tdaemon -Tuucp - -######################### -# Format of headers # -######################### - -H?P?Return-Path: <$g> -HReceived: $?sfrom $s $.$?_($?s$|from $.$_) - $.by $j ($v/$Z)$?r with $r$. id $i$?u - for $u; $|; - $.$b -H?D?Resent-Date: $a -H?D?Date: $a -H?F?Resent-From: $?x$x <$g>$|$g$. -H?F?From: $?x$x <$g>$|$g$. -H?x?Full-Name: $x -# HPosted-Date: $a -# H?l?Received-Date: $b -H?M?Resent-Message-Id: <$t.$i@$j> -H?M?Message-Id: <$t.$i@$j> -# -###################################################################### -###################################################################### -##### -##### REWRITING RULES -##### -###################################################################### -###################################################################### - -############################################ -### Ruleset 3 -- Name Canonicalization ### -############################################ -S3 - -# handle null input (translate to <@> special case) -R$@ $@ <@> - -# strip group: syntax (not inside angle brackets!) and trailing semicolon -R$* $: $1 <@> mark addresses -R$* < $* > $* <@> $: $1 < $2 > $3 unmark <addr> -R@ $* <@> $: @ $1 unmark @host:... -R$* :: $* <@> $: $1 :: $2 unmark node::addr -R:include: $* <@> $: :include: $1 unmark :include:... -R$* [ $* : $* ] <@> $: $1 [ $2 : $3 ] unmark IPv6 addrs -R$* : $* [ $* ] $: $1 : $2 [ $3 ] <@> remark if leading colon -R$* : $* <@> $: $2 strip colon if marked -R$* <@> $: $1 unmark -R$* ; $1 strip trailing semi -R$* < $* ; > $1 < $2 > bogus bracketed semi - -# null input now results from list:; syntax -R$@ $@ :; <@> - -# strip angle brackets -- note RFC733 heuristic to get innermost item -R$* $: < $1 > housekeeping <> -R$+ < $* > < $2 > strip excess on left -R< $* > $+ < $1 > strip excess on right -R<> $@ < @ > MAIL FROM:<> case -R< $+ > $: $1 remove housekeeping <> - -# make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later -R@ $+ , $+ @ $1 : $2 change all "," to ":" - -# localize and dispose of route-based addresses -R@ $+ : $+ $@ $>96 < @$1 > : $2 handle <route-addr> - -# find focus for list syntax -R $+ : $* ; @ $+ $@ $>96 $1 : $2 ; < @ $3 > list syntax -R $+ : $* ; $@ $1 : $2; list syntax - -# find focus for @ syntax addresses -R$+ @ $+ $: $1 < @ $2 > focus on domain -R$+ < $+ @ $+ > $1 $2 < @ $3 > move gaze right -R$+ < @ $+ > $@ $>96 $1 < @ $2 > already canonical - -# do some sanity checking -R$* < @ $* : $* > $* $1 < @ $2 $3 > $4 nix colons in addrs - -# convert old-style addresses to a domain-based address -R$- ! $+ $@ $>96 $2 < @ $1 .UUCP > resolve uucp names -R$+ . $- ! $+ $@ $>96 $3 < @ $1 . $2 > domain uucps -R$+ ! $+ $@ $>96 $2 < @ $1 .UUCP > uucp subdomains - -# if we have % signs, take the rightmost one -R$* % $* $1 @ $2 First make them all @s. -R$* @ $* @ $* $1 % $2 @ $3 Undo all but the last. -R$* @ $* $@ $>96 $1 < @ $2 > Insert < > and finish - -# else we must be a local name -R$* $@ $>96 $1 - - -################################################ -### Ruleset 96 -- bottom half of ruleset 3 ### -################################################ - -S96 - -# handle special cases for local names -R$* < @ localhost > $* $: $1 < @ $j . > $2 no domain at all -R$* < @ localhost . $m > $* $: $1 < @ $j . > $2 local domain -R$* < @ localhost . UUCP > $* $: $1 < @ $j . > $2 .UUCP domain -R$* < @ [ $+ ] > $* $: $1 < @@ [ $2 ] > $3 mark [a.b.c.d] -R$* < @@ $=w > $* $: $1 < @ $j . > $3 self-literal -R$* < @@ $+ > $* $@ $1 < @ $2 > $3 canon IP addr - - - - - -# if really UUCP, handle it immediately - -# try UUCP traffic as a local address -R$* < @ $+ . UUCP > $* $: $1 < @ $[ $2 $] . UUCP . > $3 -R$* < @ $+ . . UUCP . > $* $@ $1 < @ $2 . > $3 - -# pass to name server to make hostname canonical -R$* < @ $* $~P > $* $: $1 < @ $[ $2 $3 $] > $4 - -# local host aliases and pseudo-domains are always canonical -R$* < @ $=w > $* $: $1 < @ $2 . > $3 -R$* < @ $j > $* $: $1 < @ $j . > $2 -R$* < @ $=M > $* $: $1 < @ $2 . > $3 -R$* < @ $* $=P > $* $: $1 < @ $2 $3 . > $4 -R$* < @ $* . . > $* $1 < @ $2 . > $3 - - -################################################## -### Ruleset 4 -- Final Output Post-rewriting ### -################################################## -S4 - -R$* <@> $@ handle <> and list:; - -# strip trailing dot off possibly canonical name -R$* < @ $+ . > $* $1 < @ $2 > $3 - -# eliminate internal code -- should never get this far! -R$* < @ *LOCAL* > $* $1 < @ $j > $2 - -# externalize local domain info -R$* < $+ > $* $1 $2 $3 defocus -R@ $+ : @ $+ : $+ @ $1 , @ $2 : $3 <route-addr> canonical -R@ $* $@ @ $1 ... and exit - -# UUCP must always be presented in old form -R$+ @ $- . UUCP $2!$1 u@h.UUCP => h!u - -# delete duplicate local names -R$+ % $=w @ $=w $1 @ $2 u%host@host => u@host - - - -############################################################## -### Ruleset 97 -- recanonicalize and call ruleset zero ### -### (used for recursive calls) ### -############################################################## - -S97 -R$* $: $>3 $1 -R$* $@ $>0 $1 - - -###################################### -### Ruleset 0 -- Parse Address ### -###################################### - -S0 - -R$* $: $>Parse0 $1 initial parsing -R<@> $#local $: <@> special case error msgs -R$* $: $>98 $1 handle local hacks -R$* $: $>Parse1 $1 final parsing - -# -# Parse0 -- do initial syntax checking and eliminate local addresses. -# This should either return with the (possibly modified) input -# or return with a #error mailer. It should not return with a -# #mailer other than the #error mailer. -# - -SParse0 -R<@> $@ <@> special case error msgs -R$* : $* ; <@> $#error $@ 5.1.3 $: "List:; syntax illegal for recipient addresses" -#R@ <@ $* > < @ $1 > catch "@@host" bogosity -R<@ $+> $#error $@ 5.1.3 $: "User address required" -R$* $: <> $1 -R<> $* < @ [ $+ ] > $* $1 < @ [ $2 ] > $3 -R<> $* <$* : $* > $* $#error $@ 5.1.3 $: "Colon illegal in host name part" -R<> $* $1 -R$* < @ . $* > $* $#error $@ 5.1.2 $: "Invalid host name" -R$* < @ $* .. $* > $* $#error $@ 5.1.2 $: "Invalid host name" - -# now delete the local info -- note $=O to find characters that cause forwarding -R$* < @ > $* $@ $>Parse0 $>3 $1 user@ => user -R< @ $=w . > : $* $@ $>Parse0 $>3 $2 @here:... -> ... -R$- < @ $=w . > $: $(dequote $1 $) < @ $2 . > dequote "foo"@here -R< @ $+ > $#error $@ 5.1.3 $: "User address required" -R$* $=O $* < @ $=w . > $@ $>Parse0 $>3 $1 $2 $3 ...@here -> ... -R$- $: $(dequote $1 $) < @ *LOCAL* > dequote "foo" -R< @ *LOCAL* > $#error $@ 5.1.3 $: "User address required" -R$* $=O $* < @ *LOCAL* > - $@ $>Parse0 $>3 $1 $2 $3 ...@*LOCAL* -> ... -R$* < @ *LOCAL* > $: $1 - -# -# Parse1 -- the bottom half of ruleset 0. -# - -SParse1 -# handle numeric address spec -R$* < @ [ $+ ] > $* $: $>98 $1 < @ [ $2 ] > $3 numeric internet spec -R$* < @ [ $+ ] > $* $#esmtp $@ [$2] $: $1 < @ [$2] > $3 still numeric: send - - -# short circuit local delivery so forwarded email works -R$=L < @ $=w . > $#local $: @ $1 special local names -R$+ < @ $=w . > $#local $: $1 regular local name - - -# resolve remotely connected UUCP links (if any) - -# resolve fake top level domains by forwarding to other hosts - - - -# pass names that still have a host to a smarthost (if defined) -R$* < @ $* > $* $: $>95 < $S > $1 < @ $2 > $3 glue on smarthost name - -# deal with other remote names -R$* < @$* > $* $#esmtp $@ $2 $: $1 < @ $2 > $3 user@host.domain - -# handle locally delivered names -R$=L $#local $: @ $1 special local names -R$+ $#local $: $1 regular local names - -########################################################################### -### Ruleset 5 -- special rewriting after aliases have been expanded ### -########################################################################### - -S5 - -# deal with plussed users so aliases work nicely -R$+ + * $#local $@ $&h $: $1 -R$+ + $* $#local $@ + $2 $: $1 + * - -# prepend an empty "forward host" on the front -R$+ $: <> $1 - - -# see if we have a relay or a hub -R< > $+ $: < $H > $1 try hub -R< > $+ $: < $R > $1 try relay -R< > $+ $: < > < $1 $&h > nope, restore +detail -R< > < $+ + $* > $* < > < $1 > + $2 $3 find the user part -R< > < $+ > + $* $#local $@ $2 $: @ $1 strip the extra + -R< > < $+ > $@ $1 no +detail -R$+ $: $1 <> $&h add +detail back in -R$+ <> + $* $: $1 + $2 check whether +detail -R$+ <> $* $: $1 else discard -R< local : $* > $* $: $>95 < local : $1 > $2 no host extension -R< error : $* > $* $: $>95 < error : $1 > $2 no host extension -R< $- : $+ > $+ $: $>95 < $1 : $2 > $3 < @ $2 > -R< $+ > $+ $@ $>95 < $1 > $2 < @ $1 > - - -################################################################### -### Ruleset 95 -- canonify mailer:[user@]host syntax to triple ### -################################################################### - -S95 -R< > $* $@ $1 strip off null relay -R< error : $- $+ > $* $#error $@ $(dequote $1 $) $: $2 -R< local : $* > $* $>CanonLocal < $1 > $2 -R< $- : $+ @ $+ > $*<$*>$* $# $1 $@ $3 $: $2<@$3> use literal user -R< $- : $+ > $* $# $1 $@ $2 $: $3 try qualified mailer -R< $=w > $* $@ $2 delete local host -R< $+ > $* $#relay $@ $1 $: $2 use unqualified mailer - -################################################################### -### Ruleset CanonLocal -- canonify local: syntax ### -################################################################### - -SCanonLocal -# strip local host from routed addresses -R< $* > < @ $+ > : $+ $@ $>97 $3 -R< $* > $+ $=O $+ < @ $+ > $@ $>97 $2 $3 $4 - -# strip trailing dot from any host name that may appear -R< $* > $* < @ $* . > $: < $1 > $2 < @ $3 > - -# handle local: syntax -- use old user, either with or without host -R< > $* < @ $* > $* $#local $@ $1@$2 $: $1 -R< > $+ $#local $@ $1 $: $1 - -# handle local:user@host syntax -- ignore host part -R< $+ @ $+ > $* < @ $* > $: < $1 > $3 < @ $4 > - -# handle local:user syntax -R< $+ > $* <@ $* > $* $#local $@ $2@$3 $: $1 -R< $+ > $* $#local $@ $2 $: $1 - -################################################################### -### Ruleset 93 -- convert header names to masqueraded form ### -################################################################### - -S93 - - -# special case the users that should be exposed -R$=E < @ *LOCAL* > $@ $1 < @ $j . > leave exposed -R$=E < @ $=M . > $@ $1 < @ $2 . > -R$=E < @ $=w . > $@ $1 < @ $2 . > - -# handle domain-specific masquerading -R$* < @ $=M . > $* $: $1 < @ $2 . @ $M > $3 convert masqueraded doms -R$* < @ $=w . > $* $: $1 < @ $2 . @ $M > $3 -R$* < @ *LOCAL* > $* $: $1 < @ $j . @ $M > $2 -R$* < @ $+ @ > $* $: $1 < @ $2 > $3 $M is null -R$* < @ $+ @ $+ > $* $: $1 < @ $3 . > $4 $M is not null - -################################################################### -### Ruleset 94 -- convert envelope names to masqueraded form ### -################################################################### - -S94 -R$* < @ *LOCAL* > $* $: $1 < @ $j . > $2 - -################################################################### -### Ruleset 98 -- local part of ruleset zero (can be null) ### -################################################################### - -S98 - -# addresses sent to foo@host.REDIRECT will give a 551 error code -R$* < @ $+ .REDIRECT. > $: $1 < @ $2 . REDIRECT . > < ${opMode} > -R$* < @ $+ .REDIRECT. > <i> $: $1 < @ $2 . REDIRECT. > -R$* < @ $+ .REDIRECT. > < $- > $# error $@ 5.1.1 $: "551 User has moved; please try " <$1@$2> - - - -###################################################################### -### CanonAddr -- Convert an address into a standard form for -### relay checking. Route address syntax is -### crudely converted into a %-hack address. -### -### Parameters: -### $1 -- full recipient address -### -### Returns: -### parsed address, not in source route form -###################################################################### - -SCanonAddr -R$* $: $>Parse0 $>3 $1 make domain canonical -R< @ $+ > : $* @ $* < @ $1 > : $2 % $3 change @ to % in src route -R$* < @ $+ > : $* : $* $3 $1 < @ $2 > : $4 change to % hack. -R$* < @ $+ > : $* $3 $1 < @ $2 > - -###################################################################### -### ParseRecipient -- Strip off hosts in $=R as well as possibly -### $* $=m or the access database. -### Check user portion for host separators. -### -### Parameters: -### $1 -- full recipient address -### -### Returns: -### parsed, non-local-relaying address -###################################################################### - -SParseRecipient -R$* $: <?> $>CanonAddr $1 -R<?> $* < @ $* . > <?> $1 < @ $2 > strip trailing dots -R<?> $- < @ $* > $: <?> $(dequote $1 $) < @ $2 > dequote local part - -# if no $=O character, no host in the user portion, we are done -R<?> $* $=O $* < @ $* > $: <NO> $1 $2 $3 < @ $4> -R<?> $* $@ $1 - - - -R<NO> $* < @ $* $=R > $: <RELAY> $1 < @ $2 $3 > - -R<RELAY> $* < @ $* > $@ $>ParseRecipient $1 -R<$-> $* $@ $2 - -###################################################################### -### check_relay -- check hostname/address on SMTP startup -###################################################################### - -SLocal_check_relay -Scheck_relay -R$* $: $1 $| $>"Local_check_relay" $1 -R$* $| $* $| $#$* $#$3 -R$* $| $* $| $* $@ $>"Basic_check_relay" $1 $| $2 - -SBasic_check_relay -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - - - -###################################################################### -### check_mail -- check SMTP `MAIL FROM:' command argument -###################################################################### - -SLocal_check_mail -Scheck_mail -R$* $: $1 $| $>"Local_check_mail" $1 -R$* $| $#$* $#$2 -R$* $| $* $@ $>"Basic_check_mail" $1 - -SBasic_check_mail -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - -R<> $@ <OK> -R$* $: <?> $>CanonAddr $1 -R<?> $* < @ $+ . > <?> $1 < @ $2 > strip trailing dots -# handle non-DNS hostnames (*.bitnet, *.decnet, *.uucp, etc) -R<?> $* < $* $=P > $* $: <OK> $1 < @ $2 $3 > $4 -R<?> $* < @ $+ > $* $: <? $(resolve $2 $: $2 <PERM> $) > $1 < @ $2 > $3 -R<? $* <$->> $* < @ $+ > $* - $: <$2> $3 < @ $4 > $5 - -# handle case of @localhost on address -R<$+> $* < @localhost > $: < ? $&{client_name} > <$1> $2 < @localhost > -R<$+> $* < @localhost.$m > - $: < ? $&{client_name} > <$1> $2 < @localhost.$m > -R<$+> $* < @localhost.UUCP > - $: < ? $&{client_name} > <$1> $2 < @localhost.UUCP > -R<? $=w> <$+> $* <?> <$2> $3 -R<? $+> <$+> $* $#error $@ 5.5.4 $: "553 Real domain name required" -R<?> <$+> $* $: <$1> $2 - - -# handle case of no @domain on address -R<?> $* $: < ? $&{client_name} > $1 -R<?> $* $@ <OK> ...local unqualed ok -R<? $+> $* $#error $@ 5.5.4 $: "553 Domain name required" - ...remote is not -# check results -R<?> $* $@ <OK> -R<OK> $* $@ <OK> -R<TEMP> $* $#error $@ 4.1.8 $: "451 Sender domain must resolve" -R<PERM> $* $#error $@ 5.1.8 $: "501 Sender domain must exist" - -###################################################################### -### check_rcpt -- check SMTP `RCPT TO:' command argument -###################################################################### - -SLocal_check_rcpt -Scheck_rcpt -R$* $: $1 $| $>"Local_check_rcpt" $1 -R$* $| $#$* $#$2 -R$* $| $* $@ $>"Basic_check_rcpt" $1 - -SBasic_check_rcpt -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - -R$* $: $>ParseRecipient $1 strip relayable hosts - - - - -# anything terminating locally is ok -R$+ < @ $=w > $@ OK -R$+ < @ $* $=R > $@ OK - - -# check for local user (i.e. unqualified address) -R$* $: <?> $1 -R<?> $* < @ $+ > $: <REMOTE> $1 < @ $2 > -# local user is ok -R<?> $+ $@ OK -R<$+> $* $: $2 - -# anything originating locally is ok -R$* $: <?> $&{client_name} -# check if bracketed IP address (forward lookup != reverse lookup) -R<?> [$+] $: <BAD> [$1] -# pass to name server to make hostname canonical -R<?> $* $~P $: <?> $[ $1 $2 $] -R<$-> $* $: $2 -R$* . $1 strip trailing dots -R$@ $@ OK -R$=w $@ OK -R$* $=R $@ OK - -# check IP address -R$* $: $&{client_addr} -R$@ $@ OK originated locally -R0 $@ OK originated locally -R$=R $* $@ OK relayable IP address -R$* $: [ $1 ] put brackets around it... -R$=w $@ OK ... and see if it is local - - -# anything else is bogus -R$* $#error $@ 5.7.1 $: "550 Relaying denied" - -# -###################################################################### -###################################################################### -##### -##### MAILER DEFINITIONS -##### -###################################################################### -###################################################################### - - -################################################## -### Local and Program Mailer specification ### -################################################## - -##### @(#)local.m4 8.30 (Berkeley) 6/30/1998 ##### - -Mlocal, P=/bin/mail, F=lsDFMAw5:/|@qrmn9, S=10/30, R=20/40, - T=DNS/RFC822/X-Unix, - A=mail -d $u -Mprog, P=/bin/sh, F=lsDFMoqeu9, S=10/30, R=20/40, D=$z:/, - T=X-Unix, - A=sh -c $u - -# -# Envelope sender rewriting -# -S10 -R<@> $n errors to mailer-daemon -R@ <@ $*> $n temporarily bypass Sun bogosity -R$+ $: $>50 $1 add local domain if needed -R$* $: $>94 $1 do masquerading - -# -# Envelope recipient rewriting -# -S20 -R$+ < @ $* > $: $1 strip host part - -# -# Header sender rewriting -# -S30 -R<@> $n errors to mailer-daemon -R@ <@ $*> $n temporarily bypass Sun bogosity -R$+ $: $>50 $1 add local domain if needed -R$* $: $>93 $1 do masquerading - -# -# Header recipient rewriting -# -S40 -R$+ $: $>50 $1 add local domain if needed - -# -# Common code to add local domain name (only if always-add-domain) -# -S50 - -##################################### -### SMTP Mailer specification ### -##################################### - -##### @(#)smtp.m4 8.38 (Berkeley) 5/19/1998 ##### - -Msmtp, P=[IPC], F=mDFMuX, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Mesmtp, P=[IPC], F=mDFMuXa, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Msmtp8, P=[IPC], F=mDFMuX8, S=11/31, R=21, E=\r\n, L=990, - T=DNS/RFC822/SMTP, - A=IPC $h -Mrelay, P=[IPC], F=mDFMuXa8, S=11/31, R=61, E=\r\n, L=2040, - T=DNS/RFC822/SMTP, - A=IPC $h - -# -# envelope sender rewriting -# -S11 -R$+ $: $>51 $1 sender/recipient common -R$* :; <@> $@ list:; special case -R$* $: $>61 $1 qualify unqual'ed names -R$+ $: $>94 $1 do masquerading - - -# -# envelope recipient rewriting -- -# also header recipient if not masquerading recipients -# -S21 -R$+ $: $>51 $1 sender/recipient common -R$+ $: $>61 $1 qualify unqual'ed names - - -# -# header sender and masquerading header recipient rewriting -# -S31 -R$+ $: $>51 $1 sender/recipient common -R:; <@> $@ list:; special case - -# do special header rewriting -R$* <@> $* $@ $1 <@> $2 pass null host through -R< @ $* > $* $@ < @ $1 > $2 pass route-addr through -R$* $: $>61 $1 qualify unqual'ed names -R$+ $: $>93 $1 do masquerading - - -# -# convert pseudo-domain addresses to real domain addresses -# -S51 - -# pass <route-addr>s through -R< @ $+ > $* $@ < @ $1 > $2 resolve <route-addr> - -# output fake domains as user%fake@relay - -# do UUCP heuristics; note that these are shared with UUCP mailers -R$+ < @ $+ .UUCP. > $: < $2 ! > $1 convert to UUCP form -R$+ < @ $* > $* $@ $1 < @ $2 > $3 not UUCP form - -# leave these in .UUCP form to avoid further tampering -R< $&h ! > $- ! $+ $@ $2 < @ $1 .UUCP. > -R< $&h ! > $-.$+ ! $+ $@ $3 < @ $1.$2 > -R< $&h ! > $+ $@ $1 < @ $&h .UUCP. > -R< $+ ! > $+ $: $1 ! $2 < @ $Y > use UUCP_RELAY -R$+ < @ $+ : $+ > $@ $1 < @ $3 > strip mailer: part -R$+ < @ > $: $1 < @ *LOCAL* > if no UUCP_RELAY - - -# -# common sender and masquerading recipient rewriting -# -S61 - -R$* < @ $* > $* $@ $1 < @ $2 > $3 already fully qualified -R$+ $@ $1 < @ *LOCAL* > add local qualification - - -# -# relay mailer header masquerading recipient rewriting -# -S71 - -R$+ $: $>61 $1 -R$+ $: $>93 $1 diff --git a/cf/cf/generic-ultrix4.mc b/cf/cf/generic-ultrix4.mc deleted file mode 100644 index 6fed36e..0000000 --- a/cf/cf/generic-ultrix4.mc +++ /dev/null @@ -1,26 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a generic configuration file for Ultrix 4.x. -# It has support for local and SMTP mail only. If you want to -# customize it, copy it to a name appropriate for your environment -# and do the modifications there. -# - -divert(0)dnl -VERSIONID(`@(#)generic-ultrix4.mc 8.8 (Berkeley) 5/19/1998') -OSTYPE(ultrix4)dnl -DOMAIN(generic)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/cf/cf/huginn.cs.mc b/cf/cf/huginn.cs.mc deleted file mode 100644 index a58d121..0000000 --- a/cf/cf/huginn.cs.mc +++ /dev/null @@ -1,42 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a Berkeley-specific configuration file for a specific -# machine in the Computer Science Division at Berkeley, and should -# not be used elsewhere. It is provided on the sendmail distribution -# as a sample only. -# -# This file is for the backup CS Division mail server. -# - -divert(0)dnl -VERSIONID(`@(#)huginn.cs.mc 8.12 (Berkeley) 5/19/1998') -OSTYPE(hpux9)dnl -DOMAIN(CS.Berkeley.EDU)dnl -MASQUERADE_AS(CS.Berkeley.EDU)dnl -MAILER(local)dnl -MAILER(smtp)dnl - -LOCAL_CONFIG -DDBerkeley.EDU - -# hosts for which we accept and forward mail (must be in .Berkeley.EDU) -CF CS -FF/etc/sendmail.cw - -LOCAL_RULE_0 -R< @ $=F . $D . > : $* $@ $>7 $2 @here:... -> ... -R$* $=O $* < @ $=F . $D . > $@ $>7 $1 $2 $3 ...@here -> ... - -R$* < @ $=F . $D . > $#local $: $1 use UDB diff --git a/cf/cf/knecht.mc b/cf/cf/knecht.mc deleted file mode 100644 index 4ba1471..0000000 --- a/cf/cf/knecht.mc +++ /dev/null @@ -1,71 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is specific to Eric's home machine. -# - -divert(0)dnl -VERSIONID(`@(#)knecht.mc 8.31 (Berkeley) 1/30/1999') -OSTYPE(bsd4.4)dnl -DOMAIN(generic)dnl -define(`confFORWARD_PATH', `$z/.forward.$w:$z/.forward+$h:$z/.forward')dnl -define(`confDEF_USER_ID', `mailnull')dnl -define(`confHOST_STATUS_DIRECTORY', `.hoststat')dnl -define(`confTO_ICONNECT', `10s')dnl -define(`confCOPY_ERRORS_TO', `Postmaster')dnl -define(`confTO_QUEUEWARN', `8h')dnl -define(`confTRUSTED_USERS', `www')dnl -define(`confPRIVACY_FLAGS', ``authwarnings,noexpn,novrfy'')dnl -FEATURE(virtusertable, `hash /etc/mail/virtusertable')dnl -FEATURE(access_db)dnl -FEATURE(local_lmtp)dnl -define(`LOCAL_MAILER_FLAGS', CONCAT(LOCAL_MAILER_FLAGS,P))dnl -MAILER(local)dnl -MAILER(smtp)dnl - -LOCAL_CONFIG -# -# Regular expression to reject: -# * numeric-only localparts from aol.com and msn.com -# * localparts starting with a digit from juno.com -# * localparts longer than 10 characters from aol.com -# -Kcheckaddress regex -a@MATCH - ^([0-9]+<@(aol|msn)\.com|[0-9][^<]*<@juno\.com|.{10}[^<]+<@aol\.com)\.?> - -# -# Names that won't be allowed in a To: line (local-part and domains) -# -C{RejectToLocalparts} friend you -C{RejectToDomains} public.com - -LOCAL_RULESETS -HTo: $>CheckTo - -SCheckTo -R$={RejectToLocalparts}@$* $#error $: "553 Header error" -R$*@$={RejectToDomains} $#error $: "553 Header error" - -HMessage-Id: $>CheckMessageId - -SCheckMessageId -R< $+ @ $+ > $@ OK -R$* $#error $: "553 Header error" - -LOCAL_RULESETS -SLocal_check_mail -# check address against various regex checks -R$* $: $>Parse0 $>3 $1 -R$+ $: $(checkaddress $1 $) -R@MATCH $#error $: "553 Header error" diff --git a/cf/cf/mail.cs.mc b/cf/cf/mail.cs.mc deleted file mode 100644 index 8abd945..0000000 --- a/cf/cf/mail.cs.mc +++ /dev/null @@ -1,43 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a Berkeley-specific configuration file for a specific -# machine in the Computer Science Division at Berkeley, and should -# not be used elsewhere. It is provided on the sendmail distribution -# as a sample only. -# -# This file is for the primary CS Division mail server. -# - -divert(0)dnl -VERSIONID(`@(#)mail.cs.mc 8.15 (Berkeley) 5/19/1998') -OSTYPE(ultrix4)dnl -DOMAIN(Berkeley.EDU)dnl -MASQUERADE_AS(CS.Berkeley.EDU)dnl -MAILER(local)dnl -MAILER(smtp)dnl -define(`confUSERDB_SPEC', ``/usr/local/lib/users.cs.db,/usr/local/lib/users.eecs.db'')dnl - -LOCAL_CONFIG -DDBerkeley.EDU - -# hosts for which we accept and forward mail (must be in .Berkeley.EDU) -CF CS -FF/etc/sendmail.cw - -LOCAL_RULE_0 -R< @ $=F . $D . > : $* $@ $>7 $2 @here:... -> ... -R$* $=O $* < @ $=F . $D . > $@ $>7 $1 $2 $3 ...@here -> ... - -R$* < @ $=F . $D . > $#local $: $1 use UDB diff --git a/cf/cf/mail.eecs.mc b/cf/cf/mail.eecs.mc deleted file mode 100644 index 6522141..0000000 --- a/cf/cf/mail.eecs.mc +++ /dev/null @@ -1,43 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a Berkeley-specific configuration file for a specific -# machine in Electrical Engineering and Computer Sciences at Berkeley, -# and should not be used elsewhere. It is provided on the sendmail -# distribution as a sample only. -# -# This file is for the primary EECS mail server. -# - -divert(0)dnl -VERSIONID(`@(#)mail.eecs.mc 8.15 (Berkeley) 5/19/1998') -OSTYPE(ultrix4)dnl -DOMAIN(EECS.Berkeley.EDU)dnl -MASQUERADE_AS(EECS.Berkeley.EDU)dnl -MAILER(local)dnl -MAILER(smtp)dnl -define(`confUSERDB_SPEC', `/usr/local/lib/users.eecs.db,/usr/local/lib/users.cs.db,/usr/local/lib/users.coe.db')dnl - -LOCAL_CONFIG -DDBerkeley.EDU - -# hosts for which we accept and forward mail (must be in .Berkeley.EDU) -CF EECS -FF/etc/sendmail.cw - -LOCAL_RULE_0 -R< @ $=F . $D . > : $* $@ $>7 $2 @here:... -> ... -R$* $=O $* < @ $=F . $D . > $@ $>7 $1 $2 $3 ...@here -> ... - -R$* < @ $=F . $D . > $#local $: $1 use UDB diff --git a/cf/cf/mailspool.cs.mc b/cf/cf/mailspool.cs.mc deleted file mode 100644 index 08dcce6..0000000 --- a/cf/cf/mailspool.cs.mc +++ /dev/null @@ -1,36 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a Berkeley-specific configuration file for a specific -# machine in the Computer Science Division at Berkeley, and should -# not be used elsewhere. It is provided on the sendmail distribution -# as a sample only. -# -# This file is for our mail spool machine. For a while we were using -# "root.machinename" instead of "root+machinename", so this is included -# for back compatibility. -# - -divert(0)dnl -VERSIONID(`@(#)mailspool.cs.mc 8.9 (Berkeley) 5/19/1998') -OSTYPE(sunos4.1)dnl -DOMAIN(CS.Berkeley.EDU)dnl -MAILER(local)dnl -MAILER(smtp)dnl - -LOCAL_CONFIG -CDroot sys-custodian - -LOCAL_RULE_3 -R$=D . $+ $1 + $2 diff --git a/cf/cf/python.cs.mc b/cf/cf/python.cs.mc deleted file mode 100644 index ddf4fc3..0000000 --- a/cf/cf/python.cs.mc +++ /dev/null @@ -1,41 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a Berkeley-specific configuration file for a specific -# machine in the Computer Science Division at Berkeley, and should -# not be used elsewhere. It is provided on the sendmail distribution -# as a sample only. -# -# This file is for a home machine that wants to masquerade as an -# on-campus machine. Additionally, all addresses without a hostname -# will be forwarded to that machine. -# - -divert(0)dnl -VERSIONID(`@(#)python.cs.mc 8.9 (Berkeley) 5/19/1998') -OSTYPE(bsd4.4)dnl -DOMAIN(CS.Berkeley.EDU)dnl -define(`LOCAL_RELAY', vangogh.CS.Berkeley.EDU)dnl -MASQUERADE_AS(vangogh.CS.Berkeley.EDU)dnl -MAILER(local)dnl -MAILER(smtp)dnl - -# accept mail sent to the domain head -DDBostic.COM - -LOCAL_RULE_0 -# accept mail sent to the domain head -R< @ $D . > : $* $@ $>7 $1 @here:... -> ... -R$* $=O $* < @ $D . > $@ $>7 $1 $2 $3 ...@here -> ... -R$* < @ $D . > $#local $: $1 user@here -> user diff --git a/cf/cf/s2k-osf1.mc b/cf/cf/s2k-osf1.mc deleted file mode 100644 index 6f1099a..0000000 --- a/cf/cf/s2k-osf1.mc +++ /dev/null @@ -1,29 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a Berkeley-specific configuration file for OSF/1. -# It applies only to the Sequoia 2000 Project at Berkeley, -# and should not be used elsewhere. It is provided on the sendmail -# distribution as a sample only. To create your own configuration -# file, create an appropriate domain file in ../domain, change the -# `DOMAIN' macro below to reference that file, and copy the result -# to a name of your own choosing. -# - -divert(0)dnl -VERSIONID(`@(#)s2k-osf1.mc 8.10 (Berkeley) 5/19/1998') -OSTYPE(osf1)dnl -DOMAIN(S2K.Berkeley.EDU)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/cf/cf/s2k-ultrix4.mc b/cf/cf/s2k-ultrix4.mc deleted file mode 100644 index db8e455..0000000 --- a/cf/cf/s2k-ultrix4.mc +++ /dev/null @@ -1,29 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a Berkeley-specific configuration file for Ultrix 4.x. -# It applies only to the Sequoia 2000 Project at Berkeley, -# and should not be used elsewhere. It is provided on the sendmail -# distribution as a sample only. To create your own configuration -# file, create an appropriate domain file in ../domain, change the -# `DOMAIN' macro below to reference that file, and copy the result -# to a name of your own choosing. -# - -divert(0)dnl -VERSIONID(`@(#)s2k-ultrix4.mc 8.10 (Berkeley) 5/19/1998') -OSTYPE(ultrix4)dnl -DOMAIN(S2K.Berkeley.EDU)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/cf/cf/tcpproto.mc b/cf/cf/tcpproto.mc deleted file mode 100644 index 692a08f..0000000 --- a/cf/cf/tcpproto.mc +++ /dev/null @@ -1,32 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is the prototype file for a configuration that supports nothing -# but basic SMTP connections via TCP. -# -# You MUST change the `OSTYPE' macro to specify the operating system -# on which this will run; this will set the location of various -# support files for your operating system environment. You MAY -# create a domain file in ../domain and reference it by adding a -# `DOMAIN' macro after the `OSTYPE' macro. I recommend that you -# first copy this to another file name so that new sendmail releases -# will not trash your changes. -# - -divert(0)dnl -VERSIONID(`@(#)tcpproto.mc 8.10 (Berkeley) 5/19/1998') -OSTYPE(unknown) -FEATURE(nouucp) -MAILER(local) -MAILER(smtp) diff --git a/cf/cf/ucbarpa.mc b/cf/cf/ucbarpa.mc deleted file mode 100644 index 40bb6c2..0000000 --- a/cf/cf/ucbarpa.mc +++ /dev/null @@ -1,29 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This machine has been decommissioned at Berkeley, and hence should -# not be considered to be tested. This file is provided as an example -# only, of how you might set up a joint SMTP/UUCP configuration. At -# this point I recommend using `FEATURE(mailertable)' instead of -# `SITECONFIG'. See also ucbvax.mc. -# - -divert(0)dnl -VERSIONID(`@(#)ucbarpa.mc 8.9 (Berkeley) 5/19/1998') -DOMAIN(CS.Berkeley.EDU)dnl -OSTYPE(bsd4.4)dnl -MAILER(local)dnl -MAILER(smtp)dnl -MAILER(uucp)dnl -SITECONFIG(uucp.ucbarpa, ucbarpa, U) diff --git a/cf/cf/ucbvax.mc b/cf/cf/ucbvax.mc deleted file mode 100644 index 2395f82..0000000 --- a/cf/cf/ucbvax.mc +++ /dev/null @@ -1,90 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This machine has been decommissioned at Berkeley, and hence should -# not be considered to be tested. This file is provided as an example -# only, of how you might set up a fairly complex configuration. -# Ucbvax was our main relay (both SMTP and UUCP) for many years. -# At this point I recommend using `FEATURE(mailertable)' instead of -# `SITECONFIG' for routing of UUCP within your domain. -# - -divert(0)dnl -VERSIONID(`@(#)ucbvax.mc 8.11 (Berkeley) 5/19/1998') -OSTYPE(bsd4.3) -DOMAIN(CS.Berkeley.EDU) -MASQUERADE_AS(CS.Berkeley.EDU) -MAILER(local) -MAILER(smtp) -MAILER(uucp) -undefine(`UUCP_RELAY')dnl - -LOCAL_CONFIG -DDBerkeley.EDU - -# names for which we act as a local forwarding agent -CF CS -FF/etc/sendmail.cw - -# local UUCP connections, and our local uucp name -SITECONFIG(uucp.ucbvax, ucbvax, U) - -# remote UUCP connections, and the machine they are on -SITECONFIG(uucp.ucbarpa, ucbarpa.Berkeley.EDU, W) - -SITECONFIG(uucp.cogsci, cogsci.Berkeley.EDU, X) - -LOCAL_RULE_3 -# map old UUCP names into Internet names -UUCPSMTP(bellcore, bellcore.com) -UUCPSMTP(decvax, decvax.dec.com) -UUCPSMTP(decwrl, decwrl.dec.com) -UUCPSMTP(hplabs, hplabs.hp.com) -UUCPSMTP(lbl-csam, lbl-csam.arpa) -UUCPSMTP(pur-ee, ecn.purdue.edu) -UUCPSMTP(purdue, purdue.edu) -UUCPSMTP(research, research.att.com) -UUCPSMTP(sdcarl, sdcarl.ucsd.edu) -UUCPSMTP(sdcsvax, sdcsvax.ucsd.edu) -UUCPSMTP(ssyx, ssyx.ucsc.edu) -UUCPSMTP(sun, sun.com) -UUCPSMTP(ucdavis, ucdavis.ucdavis.edu) -UUCPSMTP(ucivax, ics.uci.edu) -UUCPSMTP(ucla-cs, cs.ucla.edu) -UUCPSMTP(ucla-se, seas.ucla.edu) -UUCPSMTP(ucsbcsl, ucsbcsl.ucsb.edu) -UUCPSMTP(ucscc, c.ucsc.edu) -UUCPSMTP(ucsd, ucsd.edu) -UUCPSMTP(ucsfcgl, cgl.ucsf.edu) -UUCPSMTP(unmvax, unmvax.cs.unm.edu) -UUCPSMTP(uwvax, spool.cs.wisc.edu) - -LOCAL_RULE_0 - -# make sure we handle the local domain as absolute -R$* < @ $* $D > $* $: $1 < @ $2 $D . > $3 - -# handle names we forward for as though they were local, so we will use UDB -R< @ $=F . $D . > : $* $@ $>7 $2 @here:... -> ... -R< @ $D . > : $* $@ $>7 $1 @here:... -> ... -R$* $=O $* < @ $=F . $D . > $@ $>7 $1 $2 $3 ...@here -> ... -R$* $=O $* < @ $D . > $@ $>7 $1 $2 $3 ...@here -> ... - -R$* < @ $=F . $D . > $#local $: $1 use UDB - -# handle local UUCP connections in the Berkeley.EDU domain -R$+<@cnmat.$D . > $#uucp$@cnmat$:$1 -R$+<@cnmat.CS.$D . > $#uucp$@cnmat$:$1 -R$+<@craig.$D . > $#uucp$@craig$:$1 -R$+<@craig.CS.$D . > $#uucp$@craig$:$1 diff --git a/cf/cf/uucpproto.mc b/cf/cf/uucpproto.mc deleted file mode 100644 index a547d10..0000000 --- a/cf/cf/uucpproto.mc +++ /dev/null @@ -1,33 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is the prototype for a configuration that only supports UUCP -# and does not have DNS support at all. -# -# You MUST change the `OSTYPE' macro to specify the operating system -# on which this will run; this will set the location of various -# support files for your operating system environment. You MAY -# create a domain file in ../domain and reference it by adding a -# `DOMAIN' macro after the `OSTYPE' macro. I recommend that you -# first copy this to another file name so that new sendmail releases -# will not trash your changes. -# - -divert(0)dnl -VERSIONID(`@(#)uucpproto.mc 8.12 (Berkeley) 5/19/1998') -OSTYPE(unknown) -FEATURE(promiscuous_relay)dnl -FEATURE(accept_unresolvable_domains)dnl -MAILER(local)dnl -MAILER(uucp)dnl diff --git a/cf/cf/vangogh.cs.mc b/cf/cf/vangogh.cs.mc deleted file mode 100644 index f60dca7..0000000 --- a/cf/cf/vangogh.cs.mc +++ /dev/null @@ -1,32 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This is a Berkeley-specific configuration file for a specific -# machine in the Computer Science Division at Berkeley, and should -# not be used elsewhere. It is provided on the sendmail distribution -# as a sample only. -# -# This file is for the BSD development machine; it has some parameters -# set up (to stress sendmail) and accepts mail for some other machines. -# - -divert(0)dnl -VERSIONID(`@(#)vangogh.cs.mc 8.10 (Berkeley) 5/19/1998') -DOMAIN(CS.Berkeley.EDU)dnl -OSTYPE(bsd4.4)dnl -MAILER(local)dnl -MAILER(smtp)dnl -define(`MCI_CACHE_SIZE', 5) -Cw okeeffe.CS.Berkeley.EDU -Cw python.CS.Berkeley.EDU diff --git a/cf/domain/Berkeley.EDU.m4 b/cf/domain/Berkeley.EDU.m4 deleted file mode 100644 index 85d5e5b..0000000 --- a/cf/domain/Berkeley.EDU.m4 +++ /dev/null @@ -1,23 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -divert(0) -VERSIONID(`@(#)Berkeley.EDU.m4 8.14 (Berkeley) 5/19/1998') -DOMAIN(berkeley-only)dnl -define(`BITNET_RELAY', `bitnet-relay.Berkeley.EDU')dnl -define(`UUCP_RELAY', `uucp-relay.Berkeley.EDU')dnl -define(`confFORWARD_PATH', `$z/.forward.$w:$z/.forward')dnl -define(`confCW_FILE', `-o /etc/sendmail.cw')dnl -define(`confDONT_INIT_GROUPS', True)dnl -FEATURE(redirect)dnl -FEATURE(use_cw_file)dnl -FEATURE(stickyhost)dnl diff --git a/cf/domain/CS.Berkeley.EDU.m4 b/cf/domain/CS.Berkeley.EDU.m4 deleted file mode 100644 index 5609ce8..0000000 --- a/cf/domain/CS.Berkeley.EDU.m4 +++ /dev/null @@ -1,18 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -divert(0) -VERSIONID(`@(#)CS.Berkeley.EDU.m4 8.7 (Berkeley) 5/19/1998') -DOMAIN(Berkeley.EDU)dnl -HACK(cssubdomain)dnl -define(`confUSERDB_SPEC', - `/usr/sww/share/lib/users.cs.db,/usr/sww/share/lib/users.eecs.db')dnl diff --git a/cf/domain/EECS.Berkeley.EDU.m4 b/cf/domain/EECS.Berkeley.EDU.m4 deleted file mode 100644 index 095fbc8..0000000 --- a/cf/domain/EECS.Berkeley.EDU.m4 +++ /dev/null @@ -1,16 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -divert(0) -VERSIONID(`@(#)EECS.Berkeley.EDU.m4 8.7 (Berkeley) 5/19/1998') -DOMAIN(Berkeley.EDU)dnl -MASQUERADE_AS(EECS.Berkeley.EDU)dnl diff --git a/cf/domain/S2K.Berkeley.EDU.m4 b/cf/domain/S2K.Berkeley.EDU.m4 deleted file mode 100644 index a951f8b..0000000 --- a/cf/domain/S2K.Berkeley.EDU.m4 +++ /dev/null @@ -1,16 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -divert(0) -VERSIONID(`@(#)S2K.Berkeley.EDU.m4 8.7 (Berkeley) 5/19/1998') -DOMAIN(CS.Berkeley.EDU)dnl -MASQUERADE_AS(postgres.Berkeley.EDU)dnl diff --git a/cf/domain/berkeley-only.m4 b/cf/domain/berkeley-only.m4 deleted file mode 100644 index 805bab6..0000000 --- a/cf/domain/berkeley-only.m4 +++ /dev/null @@ -1,18 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -divert(0) -VERSIONID(`@(#)unspecified-domain.m4 8.7 (Berkeley) 5/19/1998') -errprint(`*** ERROR: You are trying to use the Berkeley sample configuration') -errprint(` files outside of the Computer Science Division at Berkeley.') -errprint(` The configuration (.mc) files must be customized to reference') -errprint(` domain files appropriate for your environment.') diff --git a/cf/domain/generic.m4 b/cf/domain/generic.m4 deleted file mode 100644 index 93057d0..0000000 --- a/cf/domain/generic.m4 +++ /dev/null @@ -1,25 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# The following is a generic domain file. You should be able to -# use it anywhere. If you want to customize it, copy it to a file -# named with your domain and make the edits; then, copy the appropriate -# .mc files and change `DOMAIN(generic)' to reference your updated domain -# files. -# -divert(0) -VERSIONID(`@(#)generic.m4 8.9 (Berkeley) 5/19/1998') -define(`confFORWARD_PATH', `$z/.forward.$w+$h:$z/.forward+$h:$z/.forward.$w:$z/.forward')dnl -FEATURE(redirect)dnl -FEATURE(use_cw_file)dnl diff --git a/cf/feature/accept_unqualified_senders.m4 b/cf/feature/accept_unqualified_senders.m4 deleted file mode 100644 index bf1b1e7..0000000 --- a/cf/feature/accept_unqualified_senders.m4 +++ /dev/null @@ -1,15 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)accept_unqualified_senders.m4 8.3 (Berkeley) 5/19/1998') -divert(-1) - -define(`_ACCEPT_UNQUALIFIED_SENDERS_', 1) diff --git a/cf/feature/accept_unresolvable_domains.m4 b/cf/feature/accept_unresolvable_domains.m4 deleted file mode 100644 index cbc4747..0000000 --- a/cf/feature/accept_unresolvable_domains.m4 +++ /dev/null @@ -1,15 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)accept_unresolvable_domains.m4 8.7 (Berkeley) 5/19/1998') -divert(-1) - -define(`_ACCEPT_UNRESOLVABLE_DOMAINS_', 1) diff --git a/cf/feature/access_db.m4 b/cf/feature/access_db.m4 deleted file mode 100644 index 75b5551..0000000 --- a/cf/feature/access_db.m4 +++ /dev/null @@ -1,18 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)access_db.m4 8.8 (Berkeley) 5/19/1998') -divert(-1) - -define(`ACCESS_TABLE', - ifelse(_ARG_, `', - DATABASE_MAP_TYPE` -o /etc/mail/access', - `_ARG_'))dnl diff --git a/cf/feature/allmasquerade.m4 b/cf/feature/allmasquerade.m4 deleted file mode 100644 index ed622dc..0000000 --- a/cf/feature/allmasquerade.m4 +++ /dev/null @@ -1,19 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)allmasquerade.m4 8.7 (Berkeley) 5/19/1998') -divert(-1) - - -define(`_ALL_MASQUERADE_', 1) diff --git a/cf/feature/always_add_domain.m4 b/cf/feature/always_add_domain.m4 deleted file mode 100644 index 69092e3..0000000 --- a/cf/feature/always_add_domain.m4 +++ /dev/null @@ -1,18 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)always_add_domain.m4 8.6 (Berkeley) 5/19/1998') -divert(-1) - -define(`_ALWAYS_ADD_DOMAIN_', 1) diff --git a/cf/feature/bestmx_is_local.m4 b/cf/feature/bestmx_is_local.m4 deleted file mode 100644 index ec4c81c..0000000 --- a/cf/feature/bestmx_is_local.m4 +++ /dev/null @@ -1,49 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)bestmx_is_local.m4 8.14 (Berkeley) 1/25/1999') -divert(-1) - -define(_BESTMX_IS_LOCAL_, _ARG_) - -LOCAL_CONFIG -# turn on bestMX lookup table -Kbestmx bestmx -ifelse(_ARG_, `', `dnl',` -# limit bestmx to these domains -CB`'_ARG_') - -LOCAL_NET_CONFIG - -# If we are the best MX for a site, then we want to accept -# its mail as local. We assume we've already weeded out mail to -# UUCP sites which are connected to us, which should also have -# listed us as their best MX. -# -# Warning: this may generate a lot of extra DNS traffic -- a -# lower cost method is to list all the expected best MX hosts -# in $=w. This should be fine (and easier to administer) for -# low to medium traffic hosts. If you use the limited bestmx -# by passing in a set of possible domains it will improve things. - -ifelse(_ARG_, `', `dnl -# unlimited bestmx -R$* < @ $* > $* $: $1 < @ $2 @@ $(bestmx $2 $) > $3', -`dnl -# limit bestmx to $=B -R$* < @ $* $=B . > $* $: $1 < @ $2 $3 . @@ $(bestmx $2 $3 . $) > $4') -R$* $=O $* < @ $* @@ $=w . > $* $@ $>97 $1 $2 $3 -R< @ $* @@ $=w . > : $* $@ $>97 $3 -R$* < @ $* @@ $=w . > $* $#local $: $1 -R$* < @ $* @@ $* > $* $: $1 < @ $2 > $4 diff --git a/cf/feature/bitdomain.m4 b/cf/feature/bitdomain.m4 deleted file mode 100644 index 7f9a181..0000000 --- a/cf/feature/bitdomain.m4 +++ /dev/null @@ -1,22 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)bitdomain.m4 8.14 (Berkeley) 10/6/1998') -divert(-1) - -define(`BITDOMAIN_TABLE', ifelse(_ARG_, `', - ifdef(`_USE_ETC_MAIL_', - DATABASE_MAP_TYPE` -o /etc/mail/bitdomain', - DATABASE_MAP_TYPE` -o /etc/bitdomain'), - `_ARG_'))dnl diff --git a/cf/feature/blacklist_recipients.m4 b/cf/feature/blacklist_recipients.m4 deleted file mode 100644 index e3478d3..0000000 --- a/cf/feature/blacklist_recipients.m4 +++ /dev/null @@ -1,18 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)blacklist_recipients.m4 8.9 (Berkeley) 5/19/1998') -divert(-1) - -ifdef(`ACCESS_TABLE', - `define(`_BLACKLIST_RCPT_', 1)', - `errprint(`*** ERROR: FEATURE(blacklist_recipients) requires FEATURE(access_db) -')') diff --git a/cf/feature/domaintable.m4 b/cf/feature/domaintable.m4 deleted file mode 100644 index e7303dc..0000000 --- a/cf/feature/domaintable.m4 +++ /dev/null @@ -1,23 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)domaintable.m4 8.9 (Berkeley) 10/6/1998') -divert(-1) - -define(`DOMAIN_TABLE', ifelse(_ARG_, `', - ifdef(`_USE_ETC_MAIL_', - DATABASE_MAP_TYPE` -o /etc/mail/domaintable', - DATABASE_MAP_TYPE` -o /etc/domaintable'), - `_ARG_'))dnl - diff --git a/cf/feature/genericstable.m4 b/cf/feature/genericstable.m4 deleted file mode 100644 index 654db5d..0000000 --- a/cf/feature/genericstable.m4 +++ /dev/null @@ -1,22 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)genericstable.m4 8.8 (Berkeley) 10/6/1998') -divert(-1) - -define(`GENERICS_TABLE', ifelse(_ARG_, `', - ifdef(`_USE_ETC_MAIL_', - DATABASE_MAP_TYPE` -o /etc/mail/genericstable', - DATABASE_MAP_TYPE` -o /etc/genericstable'), - `_ARG_'))dnl diff --git a/cf/feature/limited_masquerade.m4 b/cf/feature/limited_masquerade.m4 deleted file mode 100644 index b036ae1..0000000 --- a/cf/feature/limited_masquerade.m4 +++ /dev/null @@ -1,18 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)limited_masquerade.m4 8.6 (Berkeley) 5/19/1998') -divert(-1) - -define(`_LIMITED_MASQUERADE_', 1) diff --git a/cf/feature/local_lmtp.m4 b/cf/feature/local_lmtp.m4 deleted file mode 100644 index f328ce5..0000000 --- a/cf/feature/local_lmtp.m4 +++ /dev/null @@ -1,20 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)local_lmtp.m4 8.5 (Berkeley) 5/19/1998') -divert(-1) - -define(`LOCAL_MAILER_PATH', - ifelse(_ARG_, `', - ifdef(`confEBINDIR', confEBINDIR, `/usr/libexec')`/mail.local', - _ARG_)) -define(`LOCAL_MAILER_FLAGS', `SXfmnz9') -define(`LOCAL_MAILER_ARGS', `mail.local -l') diff --git a/cf/feature/local_procmail.m4 b/cf/feature/local_procmail.m4 deleted file mode 100644 index 20618dd..0000000 --- a/cf/feature/local_procmail.m4 +++ /dev/null @@ -1,25 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1994 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)local_procmail.m4 8.11 (Berkeley) 5/19/1998') -divert(-1) - -define(`LOCAL_MAILER_PATH', - ifelse(_ARG_, `', - ifdef(`PROCMAIL_MAILER_PATH', - PROCMAIL_MAILER_PATH, - `/usr/local/bin/procmail'), - _ARG_)) -define(`LOCAL_MAILER_FLAGS', `SPfhn9') -define(`LOCAL_MAILER_ARGS', `procmail -Y -a $h -d $u') diff --git a/cf/feature/loose_relay_check.m4 b/cf/feature/loose_relay_check.m4 deleted file mode 100644 index 988e441..0000000 --- a/cf/feature/loose_relay_check.m4 +++ /dev/null @@ -1,15 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)loose_relay_check.m4 8.3 (Berkeley) 5/19/1998') -divert(-1) - -define(`_LOOSE_RELAY_CHECK_', 1) diff --git a/cf/feature/mailertable.m4 b/cf/feature/mailertable.m4 deleted file mode 100644 index 71a41ad..0000000 --- a/cf/feature/mailertable.m4 +++ /dev/null @@ -1,22 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)mailertable.m4 8.10 (Berkeley) 10/6/1998') -divert(-1) - -define(`MAILER_TABLE', ifelse(_ARG_, `', - ifdef(`_USE_ETC_MAIL_', - DATABASE_MAP_TYPE` -o /etc/mail/mailertable', - DATABASE_MAP_TYPE` -o /etc/mailertable'), - `_ARG_'))dnl diff --git a/cf/feature/masquerade_entire_domain.m4 b/cf/feature/masquerade_entire_domain.m4 deleted file mode 100644 index 4455b9a..0000000 --- a/cf/feature/masquerade_entire_domain.m4 +++ /dev/null @@ -1,18 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)masquerade_entire_domain.m4 8.6 (Berkeley) 5/19/1998') -divert(-1) - -define(`_MASQUERADE_ENTIRE_DOMAIN_', 1) diff --git a/cf/feature/masquerade_envelope.m4 b/cf/feature/masquerade_envelope.m4 deleted file mode 100644 index 276c7f4..0000000 --- a/cf/feature/masquerade_envelope.m4 +++ /dev/null @@ -1,18 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)masquerade_envelope.m4 8.6 (Berkeley) 5/19/1998') -divert(-1) - -define(`_MASQUERADE_ENVELOPE_', 1) diff --git a/cf/feature/nocanonify.m4 b/cf/feature/nocanonify.m4 deleted file mode 100644 index 279a8ea..0000000 --- a/cf/feature/nocanonify.m4 +++ /dev/null @@ -1,18 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)nocanonify.m4 8.6 (Berkeley) 5/19/1998') -divert(-1) - -define(`_NO_CANONIFY_', 1) diff --git a/cf/feature/nodns.m4 b/cf/feature/nodns.m4 deleted file mode 100644 index 5d383d5..0000000 --- a/cf/feature/nodns.m4 +++ /dev/null @@ -1,21 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)nodns.m4 8.9 (Berkeley) 10/6/1998') -divert(-1) - -undefine(`confBIND_OPTS')dnl -errprint(`FEATURE(nodns) is no-op. -Use ServiceSwitchFile ('ifdef(`confSERVICE_SWITCH_FILE',confSERVICE_SWITCH_FILE,ifdef(`_USE_ETC_MAIL_',`/etc/mail/service.switch',`/etc/service.switch'))`) if your OS does not provide its own instead. -') diff --git a/cf/feature/notsticky.m4 b/cf/feature/notsticky.m4 deleted file mode 100644 index 5ba6b2f..0000000 --- a/cf/feature/notsticky.m4 +++ /dev/null @@ -1,20 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)notsticky.m4 8.8 (Berkeley) 5/19/1998') -# -# This is now the default. Use ``FEATURE(stickyhost)'' if you want -# the old default behaviour. -# -divert(-1) diff --git a/cf/feature/nouucp.m4 b/cf/feature/nouucp.m4 deleted file mode 100644 index 7cf241f..0000000 --- a/cf/feature/nouucp.m4 +++ /dev/null @@ -1,18 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)nouucp.m4 8.6 (Berkeley) 5/19/1998') -divert(-1) - -define(`_NO_UUCP_', 1) diff --git a/cf/feature/nullclient.m4 b/cf/feature/nullclient.m4 deleted file mode 100644 index 99346ae..0000000 --- a/cf/feature/nullclient.m4 +++ /dev/null @@ -1,50 +0,0 @@ -PUSHDIVERT(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -ifdef(`SMTP_MAILER_FLAGS',, `define(`SMTP_MAILER_FLAGS', `')') -define(_NULL_CLIENT_ONLY_, `1') -ifelse(_ARG_, `', `errprint(`Feature "nullclient" requires argument')', - `define(`MAIL_HUB', _ARG_)') -POPDIVERT - -# -# This is used only for relaying mail from a client to a hub when -# that client does absolutely nothing else -- i.e., it is a "null -# mailer". In this sense, it acts like the "R" option in Sun -# sendmail. -# - -VERSIONID(`@(#)nullclient.m4 8.12 (Berkeley) 5/19/1998') - -PUSHDIVERT(6) -# hub host (to which all mail is sent) -DH`'ifdef(`MAIL_HUB', MAIL_HUB, - `errprint(`MAIL_HUB not defined for nullclient feature')') -ifdef(`MASQUERADE_NAME',, `define(`MASQUERADE_NAME', MAIL_HUB)')dnl - -# route-addr separators -C: : , -POPDIVERT -PUSHDIVERT(7) -############################################ -### Null Client Mailer specification ### -############################################ - -ifdef(`confRELAY_MAILER',, - `define(`confRELAY_MAILER', `nullclient')')dnl -ifdef(`confFROM_HEADER',, - `define(`confFROM_HEADER', <$g>)')dnl -ifdef(`SMTP_MAILER_ARGS',, `define(`SMTP_MAILER_ARGS', `IPC $h')')dnl - -Mnullclient, P=[IPC], F=CONCAT(mDFMuXa, SMTP_MAILER_FLAGS),ifdef(`SMTP_MAILER_MAX', ` M=SMTP_MAILER_MAX,') - A=SMTP_MAILER_ARGS -POPDIVERT diff --git a/cf/feature/promiscuous_relay.m4 b/cf/feature/promiscuous_relay.m4 deleted file mode 100644 index cc3dae6..0000000 --- a/cf/feature/promiscuous_relay.m4 +++ /dev/null @@ -1,15 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)promiscuous_relay.m4 8.7 (Berkeley) 5/19/1998') -divert(-1) - -define(`_PROMISCUOUS_RELAY_', 1) diff --git a/cf/feature/rbl.m4 b/cf/feature/rbl.m4 deleted file mode 100644 index 0284aa3..0000000 --- a/cf/feature/rbl.m4 +++ /dev/null @@ -1,15 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)rbl.m4 8.8 (Berkeley) 5/19/1998') -divert(-1) - -define(`_RBL_', ifelse(_ARG_, `', `rbl.maps.vix.com', `_ARG_'))dnl diff --git a/cf/feature/redirect.m4 b/cf/feature/redirect.m4 deleted file mode 100644 index a9b333f..0000000 --- a/cf/feature/redirect.m4 +++ /dev/null @@ -1,28 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)redirect.m4 8.10 (Berkeley) 5/19/1998') -divert(-1) - - -PUSHDIVERT(3) -# addresses sent to foo@host.REDIRECT will give a 551 error code -R$* < @ $+ .REDIRECT. > $: $1 < @ $2 . REDIRECT . > < ${opMode} > -R$* < @ $+ .REDIRECT. > <i> $: $1 < @ $2 . REDIRECT. > -R$* < @ $+ .REDIRECT. > < $- > $# error $@ 5.1.1 $: "551 User has moved; please try " <$1@$2> -POPDIVERT - -PUSHDIVERT(6) -CPREDIRECT -POPDIVERT diff --git a/cf/feature/relay_based_on_MX.m4 b/cf/feature/relay_based_on_MX.m4 deleted file mode 100644 index f19e89b..0000000 --- a/cf/feature/relay_based_on_MX.m4 +++ /dev/null @@ -1,15 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)relay_based_on_MX.m4 8.7 (Berkeley) 5/19/1998') -divert(-1) - -define(`_RELAY_MX_SERVED_', 1) diff --git a/cf/feature/relay_entire_domain.m4 b/cf/feature/relay_entire_domain.m4 deleted file mode 100644 index c932a70..0000000 --- a/cf/feature/relay_entire_domain.m4 +++ /dev/null @@ -1,15 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)relay_entire_domain.m4 8.7 (Berkeley) 5/19/1998') -divert(-1) - -define(`_RELAY_ENTIRE_DOMAIN_', 1) diff --git a/cf/feature/relay_hosts_only.m4 b/cf/feature/relay_hosts_only.m4 deleted file mode 100644 index 35f7ab5..0000000 --- a/cf/feature/relay_hosts_only.m4 +++ /dev/null @@ -1,15 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)relay_hosts_only.m4 8.7 (Berkeley) 5/19/1998') -divert(-1) - -define(`_RELAY_HOSTS_ONLY_', 1) diff --git a/cf/feature/relay_local_from.m4 b/cf/feature/relay_local_from.m4 deleted file mode 100644 index ab040f6..0000000 --- a/cf/feature/relay_local_from.m4 +++ /dev/null @@ -1,15 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)relay_local_from.m4 8.2 (Berkeley) 5/19/1998') -divert(-1) - -define(`_RELAY_LOCAL_FROM_', 1) diff --git a/cf/feature/smrsh.m4 b/cf/feature/smrsh.m4 deleted file mode 100644 index 3b44fa8..0000000 --- a/cf/feature/smrsh.m4 +++ /dev/null @@ -1,23 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)smrsh.m4 8.8 (Berkeley) 5/19/1998') -divert(-1) - -ifdef(`_MAILER_local_', - `errprint(`*** FEATURE(smrsh) must occur before MAILER(local)')')dnl -define(`LOCAL_SHELL_PATH', - ifelse(_ARG_, `', - ifdef(`confEBINDIR', confEBINDIR, `/usr/libexec')`/smrsh', - _ARG_)) diff --git a/cf/feature/stickyhost.m4 b/cf/feature/stickyhost.m4 deleted file mode 100644 index 1d0d1cd..0000000 --- a/cf/feature/stickyhost.m4 +++ /dev/null @@ -1,18 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)stickyhost.m4 8.6 (Berkeley) 5/19/1998') -divert(-1) - -define(`_STICKY_LOCAL_DOMAIN_', 1) diff --git a/cf/feature/use_ct_file.m4 b/cf/feature/use_ct_file.m4 deleted file mode 100644 index 924dd06..0000000 --- a/cf/feature/use_ct_file.m4 +++ /dev/null @@ -1,24 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)use_ct_file.m4 8.6 (Berkeley) 5/19/1998') -divert(-1) - -# if defined, the sendmail.cf will read the /etc/sendmail.ct file -# to find the names of trusted users. There should only be a few -# of these, and normally this is done directly in the .cf file. - -define(`_USE_CT_FILE_', `') - -divert(0) diff --git a/cf/feature/use_cw_file.m4 b/cf/feature/use_cw_file.m4 deleted file mode 100644 index 5bbbf7b..0000000 --- a/cf/feature/use_cw_file.m4 +++ /dev/null @@ -1,24 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)use_cw_file.m4 8.6 (Berkeley) 5/19/1998') -divert(-1) - -# if defined, the sendmail.cf will read the /etc/sendmail.cw file -# to find alternate names for this host. Typically only used when -# several hosts have been squashed into one another at high speed. - -define(`USE_CW_FILE', `') - -divert(0) diff --git a/cf/feature/uucpdomain.m4 b/cf/feature/uucpdomain.m4 deleted file mode 100644 index 0c584aa..0000000 --- a/cf/feature/uucpdomain.m4 +++ /dev/null @@ -1,22 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)uucpdomain.m4 8.14 (Berkeley) 10/6/1998') -divert(-1) - -define(`UUDOMAIN_TABLE', ifelse(_ARG_, `', - ifdef(`_USE_ETC_MAIL_', - DATABASE_MAP_TYPE` -o /etc/mail/uudomain', - DATABASE_MAP_TYPE` -o /etc/uudomain'), - `_ARG_'))dnl diff --git a/cf/feature/virtusertable.m4 b/cf/feature/virtusertable.m4 deleted file mode 100644 index 316f7ea..0000000 --- a/cf/feature/virtusertable.m4 +++ /dev/null @@ -1,22 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)virtusertable.m4 8.8 (Berkeley) 10/6/1998') -divert(-1) - -define(`VIRTUSER_TABLE', ifelse(_ARG_, `', - ifdef(`_USE_ETC_MAIL_', - DATABASE_MAP_TYPE` -o /etc/mail/virtusertable', - DATABASE_MAP_TYPE` -o /etc/virtusertable'), - `_ARG_'))dnl diff --git a/cf/hack/cssubdomain.m4 b/cf/hack/cssubdomain.m4 deleted file mode 100644 index 6297d64..0000000 --- a/cf/hack/cssubdomain.m4 +++ /dev/null @@ -1,22 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -divert(0) -VERSIONID(`@(#)cssubdomain.m4 8.6 (Berkeley) 5/19/1998') - -divert(2) -# find possible (old & new) versions of our name via short circuit hack -# (this code should exist ONLY during the transition from .Berkeley.EDU -# names to .CS.Berkeley.EDU names -- probably not more than a few months) -R$* < @ $=w .CS.Berkeley.EDU > $* $: $1 < @ $j > $3 -R$* < @ $=w .Berkeley.EDU> $* $: $1 < @ $j > $3 -divert(0) diff --git a/cf/m4/cf.m4 b/cf/m4/cf.m4 deleted file mode 100644 index 0b05809..0000000 --- a/cf/m4/cf.m4 +++ /dev/null @@ -1,28 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# -# This file is included so that multiple includes of cf.m4 will work -# - -# figure out where the CF files live -ifdef(`_CF_DIR_', `', - `ifelse(__file__, `__file__', - `define(`_CF_DIR_', `../')', - `define(`_CF_DIR_', - substr(__file__, 0, eval(len(__file__) - 8)))')') - -divert(0)dnl -ifdef(`OSTYPE', `dnl', -`include(_CF_DIR_`'m4/cfhead.m4)dnl -VERSIONID(`@(#)cf.m4 8.29 (Berkeley) 5/19/1998')') diff --git a/cf/m4/cfhead.m4 b/cf/m4/cfhead.m4 deleted file mode 100644 index 9a5ccd2..0000000 --- a/cf/m4/cfhead.m4 +++ /dev/null @@ -1,142 +0,0 @@ -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -###################################################################### -###################################################################### -##### -##### SENDMAIL CONFIGURATION FILE -##### -define(`TEMPFILE', maketemp(/tmp/cfXXXXXX))dnl -syscmd(sh _CF_DIR_`'sh/makeinfo.sh _CF_DIR_ > TEMPFILE)dnl -include(TEMPFILE)dnl -syscmd(rm -f TEMPFILE)dnl -##### -###################################################################### -###################################################################### - -divert(-1) - -changecom() -undefine(`format') -undefine(`hpux') -ifdef(`pushdef', `', - `errprint(`You need a newer version of M4, at least as new as -System V or GNU') - include(NoSuchFile)') -define(`PUSHDIVERT', `pushdef(`__D__', divnum)divert($1)') -define(`POPDIVERT', `divert(__D__)popdef(`__D__')') -define(`OSTYPE', - `PUSHDIVERT(-1) - ifdef(`__OSTYPE__', `errprint(`duplicate OSTYPE'($1))') - define(`__OSTYPE__', $1) - define(`_ARG_', $2) - include(_CF_DIR_`'ostype/$1.m4)POPDIVERT`'') -define(`MAILER', -`ifdef(`_MAILER_$1_', `dnl`'', -`define(`_MAILER_$1_', `')PUSHDIVERT(7)include(_CF_DIR_`'mailer/$1.m4)POPDIVERT`'')') -define(`DOMAIN', `PUSHDIVERT(-1)define(`_ARG_', $2)include(_CF_DIR_`'domain/$1.m4)POPDIVERT`'') -define(`FEATURE', `PUSHDIVERT(-1)define(`_ARG_', $2)include(_CF_DIR_`'feature/$1.m4)POPDIVERT`'') -define(`HACK', `PUSHDIVERT(-1)define(`_ARG_', $2)include(_CF_DIR_`'hack/$1.m4)POPDIVERT`'') -define(`VERSIONID', ``##### $1 #####'') -define(`LOCAL_RULE_0', `divert(3)') -define(`LOCAL_RULE_1', -`divert(9)dnl -####################################### -### Ruleset 1 -- Sender Rewriting ### -####################################### - -S1 -') -define(`LOCAL_RULE_2', -`divert(9)dnl -########################################## -### Ruleset 2 -- Recipient Rewriting ### -########################################## - -S2 -') -define(`LOCAL_RULESETS', -`divert(9) - -') -define(`LOCAL_RULE_3', `divert(2)') -define(`LOCAL_CONFIG', `divert(6)') -define(`MAILER_DEFINITIONS', `divert(7)') -define(`LOCAL_NET_CONFIG', `define(`_LOCAL_RULES_', 1)divert(1)') -define(`UUCPSMTP', `R DOL(*) < @ $1 .UUCP > DOL(*) DOL(1) < @ $2 > DOL(2)') -define(`CONCAT', `$1$2$3$4$5$6$7') -define(`DOL', ``$'$1') -define(`SITECONFIG', -`CONCAT(D, $3, $2) -define(`_CLASS_$3_', `')dnl -ifelse($3, U, Cw$2 $2.UUCP, `dnl') -define(`SITE', `ifelse(CONCAT($'2`, $3), SU, - CONCAT(CY, $'1`), - CONCAT(C, $3, $'1`))') -sinclude(_CF_DIR_`'siteconfig/$1.m4)') -define(`EXPOSED_USER', `PUSHDIVERT(5)CE$1 -POPDIVERT`'dnl`'') -define(`LOCAL_USER', `PUSHDIVERT(5)CL$1 -POPDIVERT`'dnl`'') -define(`MASQUERADE_AS', `define(`MASQUERADE_NAME', $1)') -define(`MASQUERADE_DOMAIN', `PUSHDIVERT(5)CM$1 -POPDIVERT`'dnl`'') -define(`MASQUERADE_DOMAIN_FILE', `PUSHDIVERT(5)FM$1 -POPDIVERT`'dnl`'') -define(`GENERICS_DOMAIN', `PUSHDIVERT(5)CG$1 -POPDIVERT`'dnl`'') -define(`GENERICS_DOMAIN_FILE', `PUSHDIVERT(5)FG$1 -POPDIVERT`'dnl`'') -define(`RELAY_DOMAIN', `PUSHDIVERT(5)CR$1 -POPDIVERT`'dnl`'') -define(`RELAY_DOMAIN_FILE', `PUSHDIVERT(5)FR$1 -POPDIVERT`'dnl`'') -define(`_OPTINS', `ifdef(`$1', `$2$1$3')') - -m4wrap(`include(_CF_DIR_`m4/proto.m4')') - -# set up default values for options -define(`ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/aliases', `/etc/aliases')) -define(`confMAILER_NAME', ``MAILER-DAEMON'') -define(`confFROM_LINE', `From $g $d') -define(`confOPERATORS', `.:%@!^/[]+') -define(`confSMTP_LOGIN_MSG', `$j Sendmail $v/$Z; $b') -define(`confRECEIVED_HEADER', `$?sfrom $s $.$?_($?s$|from $.$_) - $.by $j ($v/$Z)$?r with $r$. id $i$?u - for $u; $|; - $.$b') -define(`confSEVEN_BIT_INPUT', `False') -define(`confEIGHT_BIT_HANDLING', `pass8') -define(`confALIAS_WAIT', `10') -define(`confMIN_FREE_BLOCKS', `100') -define(`confBLANK_SUB', `.') -define(`confCON_EXPENSIVE', `False') -define(`confDELIVERY_MODE', `background') -define(`confTEMP_FILE_MODE', `0600') -define(`confMCI_CACHE_SIZE', `2') -define(`confMCI_CACHE_TIMEOUT', `5m') -define(`confUSE_ERRORS_TO', `False') -define(`confLOG_LEVEL', `9') -define(`confCHECK_ALIASES', `False') -define(`confOLD_STYLE_HEADERS', `True') -define(`confPRIVACY_FLAGS', `authwarnings') -define(`confSAFE_QUEUE', `True') -define(`confTO_QUEUERETURN', `5d') -define(`confTO_QUEUEWARN', `4h') -define(`confTIME_ZONE', `USE_SYSTEM') -define(`confCW_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/local-host-names', `/etc/sendmail.cw')) -define(`confMIME_FORMAT_ERRORS', `True') -define(`confFORWARD_PATH', `$z/.forward.$w:$z/.forward') -define(`confCR_FILE', `-o /etc/mail/relay-domains') - -divert(0)dnl -VERSIONID(`@(#)cfhead.m4 8.23 (Berkeley) 10/6/1998') diff --git a/cf/m4/nullrelay.m4 b/cf/m4/nullrelay.m4 deleted file mode 100644 index b71fd57..0000000 --- a/cf/m4/nullrelay.m4 +++ /dev/null @@ -1,113 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -divert(0) - -VERSIONID(`@(#)nullrelay.m4 8.19 (Berkeley) 5/19/1998') - -# -# This configuration applies only to relay-only hosts. They send -# all mail to a hub without consideration of the address syntax -# or semantics, except for adding the hub qualification to the -# addresses. -# -# This is based on a prototype done by Bryan Costales of ICSI. -# - -###################################################################### -###################################################################### -##### -##### REWRITING RULES -##### -###################################################################### -###################################################################### - -########################################### -### Rulset 3 -- Name Canonicalization ### -########################################### -S3 - -# handle null input -R$@ $@ <@> - -# strip group: syntax (not inside angle brackets!) and trailing semicolon -R$* $: $1 <@> mark addresses -R$* < $* > $* <@> $: $1 < $2 > $3 unmark <addr> -R$* :: $* <@> $: $1 :: $2 unmark node::addr -R:`include': $* <@> $: :`include': $1 unmark :`include':... -R$* : $* <@> $: $2 strip colon if marked -R$* <@> $: $1 unmark -R$* ; $1 strip trailing semi -R$* < $* ; > $1 < $2 > bogus bracketed semi - -# null input now results from list:; syntax -R$@ $@ :; <@> - -# basic textual canonicalization -- note RFC733 heuristic here -R$* $: < $1 > housekeeping <> -R$+ < $* > < $2 > strip excess on left -R< $* > $+ < $1 > strip excess on right -R<> $@ < @ > MAIL FROM:<> case -R< $+ > $: $1 remove housekeeping <> - -ifdef(`_NO_CANONIFY_', `dnl', -`# eliminate local host if present -R@ $=w $=: $+ $@ @ $M $2 $3 @thishost ... -R@ $+ $@ @ $1 @somewhere ... - -R$=E @ $=w $@ $1 @ $2 leave exposed -R$+ @ $=w $@ $1 @ $M ...@thishost -R$+ @ $+ $@ $1 @ $2 ...@somewhere - -R$=w ! $=E $@ $2 @ $1 leave exposed -R$=w ! $+ $@ $2 @ $M thishost!... -R$+ ! $+ $@ $1 ! $2 @ $M somewhere ! ... - -R$=E % $=w $@ $1 @ $2 leave exposed -R$+ % $=w $@ $1 @ $M ...%thishost -R$+ % $+ $@ $1 @ $2 ...%somewhere - -R$=E $@ $1 @ $j leave exposed -R$+ $@ $1 @ $M unadorned user') - - -###################################### -### Ruleset 0 -- Parse Address ### -###################################### - -S0 - -R$*:;<@> $#error $@ USAGE $: "List:; syntax illegal for recipient addresses" - -# pass everything else to a relay host -R$* $#_RELAY_ $@ $H $: $1 - - -################################################## -### Ruleset 4 -- Final Output Post-rewriting ### -################################################## -S4 - -R$* <@> $@ handle <> and list:; - -# strip trailing dot off before passing to nullclient relay -R$* @ $+ . $1 @ $2 - -# -###################################################################### -###################################################################### -##### -`##### MAILER DEFINITIONS' -##### -###################################################################### -###################################################################### -undivert(7)dnl diff --git a/cf/m4/proto.m4 b/cf/m4/proto.m4 deleted file mode 100644 index 863b42c..0000000 --- a/cf/m4/proto.m4 +++ /dev/null @@ -1,1329 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -divert(0) - -VERSIONID(`@(#)proto.m4 8.243 (Berkeley) 2/2/1999') - -MAILER(local)dnl - -# level 8 config file format -V8/ifdef(`VENDOR_NAME', `VENDOR_NAME', `Berkeley') -divert(-1) - -# do some sanity checking -ifdef(`__OSTYPE__',, - `errprint(`*** ERROR: No system type defined (use OSTYPE macro)')') - -# pick our default mailers -ifdef(`confSMTP_MAILER',, `define(`confSMTP_MAILER', `esmtp')') -ifdef(`confLOCAL_MAILER',, `define(`confLOCAL_MAILER', `local')') -ifdef(`confRELAY_MAILER',, - `define(`confRELAY_MAILER', - `ifdef(`_MAILER_smtp_', `relay', - `ifdef(`_MAILER_uucp', `uucp-new', `unknown')')')') -ifdef(`confUUCP_MAILER',, `define(`confUUCP_MAILER', `uucp-old')') -define(`_SMTP_', `confSMTP_MAILER')dnl for readability only -define(`_LOCAL_', `confLOCAL_MAILER')dnl for readability only -define(`_RELAY_', `confRELAY_MAILER')dnl for readability only -define(`_UUCP_', `confUUCP_MAILER')dnl for readability only - -# set our default hashed database type -ifdef(`DATABASE_MAP_TYPE',, `define(`DATABASE_MAP_TYPE', `hash')') - -# back compatibility with old config files -ifdef(`confDEF_GROUP_ID', - `errprint(`*** confDEF_GROUP_ID is obsolete.') - errprint(` Use confDEF_USER_ID with a colon in the value instead.')') -ifdef(`confREAD_TIMEOUT', - `errprint(`*** confREAD_TIMEOUT is obsolete.') - errprint(` Use individual confTO_<timeout> parameters instead.')') -ifdef(`confMESSAGE_TIMEOUT', - `define(`_ARG_', index(confMESSAGE_TIMEOUT, /)) - ifelse(_ARG_, -1, - `define(`confTO_QUEUERETURN', confMESSAGE_TIMEOUT)', - `define(`confTO_QUEUERETURN', - substr(confMESSAGE_TIMEOUT, 0, _ARG_)) - define(`confTO_QUEUEWARN', - substr(confMESSAGE_TIMEOUT, eval(_ARG_+1)))')') -ifdef(`confMIN_FREE_BLOCKS', `ifelse(index(confMIN_FREE_BLOCKS, /), -1,, - `errprint(`*** compound confMIN_FREE_BLOCKS is obsolete.') - errprint(` Use confMAX_MESSAGE_SIZE for the second part of the value.')')') - -# clean option definitions below.... -define(`_OPTION', `ifdef(`$2', `O $1=$2', `#O $1`'ifelse($3, `',, `=$3')')')dnl - -divert(0)dnl - -# override file safeties - setting this option compromises system security -# need to set this now for the sake of class files -_OPTION(DontBlameSendmail, `confDONT_BLAME_SENDMAIL', safe) - -################## -# local info # -################## - -Cwlocalhost -ifdef(`USE_CW_FILE', -`# file containing names of hosts for which we receive email -Fw`'confCW_FILE', - `dnl') - -# my official domain name -# ... `define' this only if sendmail cannot automatically determine your domain -ifdef(`confDOMAIN_NAME', `Dj`'confDOMAIN_NAME', `#Dj$w.Foo.COM') - -ifdef(`_NULL_CLIENT_ONLY_', `divert(-1)')dnl - -CP. - -ifdef(`UUCP_RELAY', -`# UUCP relay host -DY`'UUCP_RELAY -CPUUCP - -')dnl -ifdef(`BITNET_RELAY', -`# BITNET relay host -DB`'BITNET_RELAY -CPBITNET - -')dnl -ifdef(`DECNET_RELAY', -`define(`_USE_DECNET_SYNTAX_', 1)dnl -# DECnet relay host -DC`'DECNET_RELAY -CPDECNET - -')dnl -ifdef(`FAX_RELAY', -`# FAX relay host -DF`'FAX_RELAY -CPFAX - -')dnl -# "Smart" relay host (may be null) -DS`'ifdef(`SMART_HOST', SMART_HOST) - -ifdef(`LUSER_RELAY', `dnl -# place to which unknown users should be forwarded -Kuser user -m -a<> -DL`'LUSER_RELAY', -`dnl') - -# operators that cannot be in local usernames (i.e., network indicators) -CO @ % ifdef(`_NO_UUCP_', `', `!') - -# a class with just dot (for identifying canonical names) -C.. - -# a class with just a left bracket (for identifying domain literals) -C[[ - -ifdef(`MAILER_TABLE', `dnl -# Mailer table (overriding domains) -Kmailertable MAILER_TABLE', -`dnl') - -ifdef(`DOMAIN_TABLE', `dnl -# Domain table (adding domains) -Kdomaintable DOMAIN_TABLE', -`dnl') - -ifdef(`GENERICS_TABLE', `dnl -# Generics table (mapping outgoing addresses) -Kgenerics GENERICS_TABLE', -`dnl') - -ifdef(`UUDOMAIN_TABLE', `dnl -# UUCP domain table -Kuudomain UUDOMAIN_TABLE', -`dnl') - -ifdef(`BITDOMAIN_TABLE', `dnl -# BITNET mapping table -Kbitdomain BITDOMAIN_TABLE', -`dnl') - -ifdef(`VIRTUSER_TABLE', `dnl -# Virtual user table (maps incoming users) -Kvirtuser VIRTUSER_TABLE', -`dnl') - -ifdef(`ACCESS_TABLE', `dnl -# Access list database (for spam stomping) -Kaccess ACCESS_TABLE', -`dnl') - -ifdef(`_RELAY_MX_SERVED_', `dnl -# MX map (to allow relaying to hosts that we MX for) -Kmxserved bestmx -z: -T<TEMP>', -`dnl') - -ifdef(`_ACCEPT_UNRESOLVABLE_DOMAINS_',`dnl',`dnl -# Resolve map (to check if a host exists in check_mail) -Kresolve host -a<OK> -T<TEMP>') - -ifdef(`confCR_FILE', `dnl -# Hosts that will permit relaying ($=R) -FR`'confCR_FILE', -`dnl') - -# who I send unqualified names to (null means deliver locally) -DR`'ifdef(`LOCAL_RELAY', LOCAL_RELAY) - -# who gets all local email traffic ($R has precedence for unqualified names) -DH`'ifdef(`MAIL_HUB', MAIL_HUB) - -# dequoting map -Kdequote dequote - -divert(0)dnl # end of nullclient diversion -# class E: names that should be exposed as from this host, even if we masquerade -ifdef(`_NULL_CLIENT_ONLY_', `#', -`# class L: names that should be delivered locally, even if we have a relay -# class M: domains that should be converted to $M -#CL root -')CE root -undivert(5)dnl - -# who I masquerade as (null for no masquerading) (see also $=M) -DM`'ifdef(`MASQUERADE_NAME', MASQUERADE_NAME) - -# my name for error messages -ifdef(`confMAILER_NAME', `Dn`'confMAILER_NAME', `#DnMAILER-DAEMON') - -undivert(6)dnl -include(_CF_DIR_`m4/version.m4') - -############### -# Options # -############### - -# strip message body to 7 bits on input? -_OPTION(SevenBitInput, `confSEVEN_BIT_INPUT') - -# 8-bit data handling -_OPTION(EightBitMode, `confEIGHT_BIT_HANDLING', adaptive) - -ifdef(`_NULL_CLIENT_ONLY_', `dnl', ` -# wait for alias file rebuild (default units: minutes) -_OPTION(AliasWait, `confALIAS_WAIT', 5m) - -# location of alias file -_OPTION(AliasFile, `ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', /etc/mail/aliases, /etc/aliases)) -') -# minimum number of free blocks on filesystem -_OPTION(MinFreeBlocks, `confMIN_FREE_BLOCKS', 100) - -# maximum message size -_OPTION(MaxMessageSize, `confMAX_MESSAGE_SIZE', 1000000) - -# substitution for space (blank) characters -_OPTION(BlankSub, `confBLANK_SUB', _) - -# avoid connecting to "expensive" mailers on initial submission? -_OPTION(HoldExpensive, `confCON_EXPENSIVE') - -# checkpoint queue runs after every N successful deliveries -_OPTION(CheckpointInterval, `confCHECKPOINT_INTERVAL', 10) - -# default delivery mode -_OPTION(DeliveryMode, `confDELIVERY_MODE', background) - -# automatically rebuild the alias database? -_OPTION(AutoRebuildAliases, `confAUTO_REBUILD') - -# error message header/file -_OPTION(ErrorHeader, `confERROR_MESSAGE', ifdef(`_USE_ETC_MAIL_', /etc/mail/error-header, /etc/sendmail.oE)) - -# error mode -_OPTION(ErrorMode, `confERROR_MODE', print) - -# save Unix-style "From_" lines at top of header? -_OPTION(SaveFromLine, `confSAVE_FROM_LINES') - -# temporary file mode -_OPTION(TempFileMode, `confTEMP_FILE_MODE', 0600) - -# match recipients against GECOS field? -_OPTION(MatchGECOS, `confMATCH_GECOS') - -# maximum hop count -_OPTION(MaxHopCount, `confMAX_HOP', 17) - -# location of help file -O HelpFile=ifdef(`HELP_FILE', HELP_FILE, ifdef(`_USE_ETC_MAIL_', /etc/mail/helpfile, /usr/lib/sendmail.hf)) - -# ignore dots as terminators in incoming messages? -_OPTION(IgnoreDots, `confIGNORE_DOTS') - -# name resolver options -_OPTION(ResolverOptions, `confBIND_OPTS', +AAONLY) - -# deliver MIME-encapsulated error messages? -_OPTION(SendMimeErrors, `confMIME_FORMAT_ERRORS') - -# Forward file search path -_OPTION(ForwardPath, `confFORWARD_PATH', /var/forward/$u:$z/.forward.$w:$z/.forward) - -# open connection cache size -_OPTION(ConnectionCacheSize, `confMCI_CACHE_SIZE', 2) - -# open connection cache timeout -_OPTION(ConnectionCacheTimeout, `confMCI_CACHE_TIMEOUT', 5m) - -# persistent host status directory -_OPTION(HostStatusDirectory, `confHOST_STATUS_DIRECTORY', .hoststat) - -# single thread deliveries (requires HostStatusDirectory)? -_OPTION(SingleThreadDelivery, `confSINGLE_THREAD_DELIVERY') - -# use Errors-To: header? -_OPTION(UseErrorsTo, `confUSE_ERRORS_TO') - -# log level -_OPTION(LogLevel, `confLOG_LEVEL', 10) - -# send to me too, even in an alias expansion? -_OPTION(MeToo, `confME_TOO') - -# verify RHS in newaliases? -_OPTION(CheckAliases, `confCHECK_ALIASES') - -# default messages to old style headers if no special punctuation? -_OPTION(OldStyleHeaders, `confOLD_STYLE_HEADERS') - -# SMTP daemon options -_OPTION(DaemonPortOptions, `confDAEMON_OPTIONS', Port=esmtp) - -# privacy flags -_OPTION(PrivacyOptions, `confPRIVACY_FLAGS', authwarnings) - -# who (if anyone) should get extra copies of error messages -_OPTION(PostMasterCopy, `confCOPY_ERRORS_TO', Postmaster) - -# slope of queue-only function -_OPTION(QueueFactor, `confQUEUE_FACTOR', 600000) - -# queue directory -O QueueDirectory=ifdef(`QUEUE_DIR', QUEUE_DIR, /var/spool/mqueue) - -# timeouts (many of these) -_OPTION(Timeout.initial, `confTO_INITIAL', 5m) -_OPTION(Timeout.connect, `confTO_CONNECT', 5m) -_OPTION(Timeout.iconnect, `confTO_ICONNECT', 5m) -_OPTION(Timeout.helo, `confTO_HELO', 5m) -_OPTION(Timeout.mail, `confTO_MAIL', 10m) -_OPTION(Timeout.rcpt, `confTO_RCPT', 1h) -_OPTION(Timeout.datainit, `confTO_DATAINIT', 5m) -_OPTION(Timeout.datablock, `confTO_DATABLOCK', 1h) -_OPTION(Timeout.datafinal, `confTO_DATAFINAL', 1h) -_OPTION(Timeout.rset, `confTO_RSET', 5m) -_OPTION(Timeout.quit, `confTO_QUIT', 2m) -_OPTION(Timeout.misc, `confTO_MISC', 2m) -_OPTION(Timeout.command, `confTO_COMMAND', 1h) -_OPTION(Timeout.ident, `confTO_IDENT', 30s) -_OPTION(Timeout.fileopen, `confTO_FILEOPEN', 60s) -_OPTION(Timeout.queuereturn, `confTO_QUEUERETURN', 5d) -_OPTION(Timeout.queuereturn.normal, `confTO_QUEUERETURN_NORMAL', 5d) -_OPTION(Timeout.queuereturn.urgent, `confTO_QUEUERETURN_URGENT', 2d) -_OPTION(Timeout.queuereturn.non-urgent, `confTO_QUEUERETURN_NONURGENT', 7d) -_OPTION(Timeout.queuewarn, `confTO_QUEUEWARN', 4h) -_OPTION(Timeout.queuewarn.normal, `confTO_QUEUEWARN_NORMAL', 4h) -_OPTION(Timeout.queuewarn.urgent, `confTO_QUEUEWARN_URGENT', 1h) -_OPTION(Timeout.queuewarn.non-urgent, `confTO_QUEUEWARN_NONURGENT', 12h) -_OPTION(Timeout.hoststatus, `confTO_HOSTSTATUS', 30m) - -# should we not prune routes in route-addr syntax addresses? -_OPTION(DontPruneRoutes, `confDONT_PRUNE_ROUTES') - -# queue up everything before forking? -_OPTION(SuperSafe, `confSAFE_QUEUE') - -# status file -O StatusFile=ifdef(`STATUS_FILE', `STATUS_FILE', ifdef(`_USE_ETC_MAIL_', /etc/mail/statistics, /etc/sendmail.st)) - -# time zone handling: -# if undefined, use system default -# if defined but null, use TZ envariable passed in -# if defined and non-null, use that info -ifelse(confTIME_ZONE, `USE_SYSTEM', `#O TimeZoneSpec=', - confTIME_ZONE, `USE_TZ', `O TimeZoneSpec=', - `O TimeZoneSpec=confTIME_ZONE') - -# default UID (can be username or userid:groupid) -_OPTION(DefaultUser, `confDEF_USER_ID', mailnull) - -# list of locations of user database file (null means no lookup) -_OPTION(UserDatabaseSpec, `confUSERDB_SPEC', ifdef(`_USE_ETC_MAIL_', /etc/mail/userdb, /etc/userdb)) - -# fallback MX host -_OPTION(FallbackMXhost, `confFALLBACK_MX', fall.back.host.net) - -# if we are the best MX host for a site, try it directly instead of config err -_OPTION(TryNullMXList, `confTRY_NULL_MX_LIST') - -# load average at which we just queue messages -_OPTION(QueueLA, `confQUEUE_LA', 8) - -# load average at which we refuse connections -_OPTION(RefuseLA, `confREFUSE_LA', 12) - -# maximum number of children we allow at one time -_OPTION(MaxDaemonChildren, `confMAX_DAEMON_CHILDREN', 12) - -# maximum number of new connections per second -_OPTION(ConnectionRateThrottle, `confCONNECTION_RATE_THROTTLE', 3) - -# work recipient factor -_OPTION(RecipientFactor, `confWORK_RECIPIENT_FACTOR', 30000) - -# deliver each queued job in a separate process? -_OPTION(ForkEachJob, `confSEPARATE_PROC') - -# work class factor -_OPTION(ClassFactor, `confWORK_CLASS_FACTOR', 1800) - -# work time factor -_OPTION(RetryFactor, `confWORK_TIME_FACTOR', 90000) - -# shall we sort the queue by hostname first? -_OPTION(QueueSortOrder, `confQUEUE_SORT_ORDER', priority) - -# minimum time in queue before retry -_OPTION(MinQueueAge, `confMIN_QUEUE_AGE', 30m) - -# default character set -_OPTION(DefaultCharSet, `confDEF_CHAR_SET', iso-8859-1) - -# service switch file (ignored on Solaris, Ultrix, OSF/1, others) -_OPTION(ServiceSwitchFile, `confSERVICE_SWITCH_FILE', ifdef(`_USE_ETC_MAIL_', /etc/mail/service.switch, /etc/service.switch)) - -# hosts file (normally /etc/hosts) -_OPTION(HostsFile, `confHOSTS_FILE', /etc/hosts) - -# dialup line delay on connection failure -_OPTION(DialDelay, `confDIAL_DELAY', 10s) - -# action to take if there are no recipients in the message -_OPTION(NoRecipientAction, `confNO_RCPT_ACTION', add-to-undisclosed) - -# chrooted environment for writing to files -_OPTION(SafeFileEnvironment, `confSAFE_FILE_ENV', /arch) - -# are colons OK in addresses? -_OPTION(ColonOkInAddr, `confCOLON_OK_IN_ADDR') - -# how many jobs can you process in the queue? -_OPTION(MaxQueueRunSize, `confMAX_QUEUE_RUN_SIZE', 10000) - -# shall I avoid expanding CNAMEs (violates protocols)? -_OPTION(DontExpandCnames, `confDONT_EXPAND_CNAMES') - -# SMTP initial login message (old $e macro) -_OPTION(SmtpGreetingMessage, `confSMTP_LOGIN_MSG') - -# UNIX initial From header format (old $l macro) -_OPTION(UnixFromLine, `confFROM_LINE') - -# From: lines that have embedded newlines are unwrapped onto one line -_OPTION(SingleLineFromHeader, `confSINGLE_LINE_FROM_HEADER', False) - -# Allow HELO SMTP command that does not `include' a host name -_OPTION(AllowBogusHELO, `confALLOW_BOGUS_HELO', False) - -# Characters to be quoted in a full name phrase (@,;:\()[] are automatic) -_OPTION(MustQuoteChars, `confMUST_QUOTE_CHARS', .) - -# delimiter (operator) characters (old $o macro) -_OPTION(OperatorChars, `confOPERATORS') - -# shall I avoid calling initgroups(3) because of high NIS costs? -_OPTION(DontInitGroups, `confDONT_INIT_GROUPS') - -# are group-writable `:include:' and .forward files (un)trustworthy? -_OPTION(UnsafeGroupWrites, `confUNSAFE_GROUP_WRITES') - -# where do errors that occur when sending errors get sent? -_OPTION(DoubleBounceAddress, `confDOUBLE_BOUNCE_ADDRESS', postmaster) - -# what user id do we assume for the majority of the processing? -_OPTION(RunAsUser, `confRUN_AS_USER', sendmail) - -# maximum number of recipients per SMTP envelope -_OPTION(MaxRecipientsPerMessage, `confMAX_RCPTS_PER_MESSAGE', 100) - -# shall we get local names from our installed interfaces? -_OPTION(DontProbeInterfaces, `confDONT_PROBE_INTERFACES') - -ifdef(`confTRUSTED_USER', -`# Trusted user for file ownership and starting the daemon -O TrustedUser=confTRUSTED_USER -') -ifdef(`confCONTROL_SOCKET_NAME', -`# Control socket for daemon management -O ControlSocketName=confCONTROL_SOCKET_NAME -') -ifdef(`confMAX_MIME_HEADER_LENGTH', -`# Maximum MIME header length to protect MUAs -O MaxMimeHeaderLength=confMAX_MIME_HEADER_LENGTH -') -ifdef(`confMAX_HEADERS_LENGTH', -`# Maximum length of the sum of all headers -O MaxHeadersLength=confMAX_HEADERS_LENGTH -') - -########################### -# Message precedences # -########################### - -Pfirst-class=0 -Pspecial-delivery=100 -Plist=-30 -Pbulk=-60 -Pjunk=-100 - -##################### -# Trusted users # -##################### - -# this is equivalent to setting class "t" -ifdef(`_USE_CT_FILE_', `', `#')Ft`'ifdef(`confCT_FILE', confCT_FILE, ifdef(`_USE_ETC_MAIL_', `/etc/mail/trusted-users', `/etc/sendmail.ct')) -Troot -Tdaemon -ifdef(`_NO_UUCP_', `dnl', `Tuucp') -ifdef(`confTRUSTED_USERS', `T`'confTRUSTED_USERS', `dnl') - -######################### -# Format of headers # -######################### - -ifdef(`confFROM_HEADER',, `define(`confFROM_HEADER', `$?x$x <$g>$|$g$.')')dnl -H?P?Return-Path: <$g> -HReceived: confRECEIVED_HEADER -H?D?Resent-Date: $a -H?D?Date: $a -H?F?Resent-From: confFROM_HEADER -H?F?From: confFROM_HEADER -H?x?Full-Name: $x -# HPosted-Date: $a -# H?l?Received-Date: $b -H?M?Resent-Message-Id: <$t.$i@$j> -H?M?Message-Id: <$t.$i@$j> -ifdef(`_NULL_CLIENT_ONLY_', - `include(_CF_DIR_`'m4/nullrelay.m4)m4exit', - `dnl') -# -###################################################################### -###################################################################### -##### -##### REWRITING RULES -##### -###################################################################### -###################################################################### - -############################################ -### Ruleset 3 -- Name Canonicalization ### -############################################ -S3 - -# handle null input (translate to <@> special case) -R$@ $@ <@> - -# strip group: syntax (not inside angle brackets!) and trailing semicolon -R$* $: $1 <@> mark addresses -R$* < $* > $* <@> $: $1 < $2 > $3 unmark <addr> -R@ $* <@> $: @ $1 unmark @host:... -R$* :: $* <@> $: $1 :: $2 unmark node::addr -R:`include': $* <@> $: :`include': $1 unmark :`include':... -R$* [ $* : $* ] <@> $: $1 [ $2 : $3 ] unmark IPv6 addrs -R$* : $* [ $* ] $: $1 : $2 [ $3 ] <@> remark if leading colon -R$* : $* <@> $: $2 strip colon if marked -R$* <@> $: $1 unmark -R$* ; $1 strip trailing semi -R$* < $* ; > $1 < $2 > bogus bracketed semi - -# null input now results from list:; syntax -R$@ $@ :; <@> - -# strip angle brackets -- note RFC733 heuristic to get innermost item -R$* $: < $1 > housekeeping <> -R$+ < $* > < $2 > strip excess on left -R< $* > $+ < $1 > strip excess on right -R<> $@ < @ > MAIL FROM:<> case -R< $+ > $: $1 remove housekeeping <> - -# make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later -R@ $+ , $+ @ $1 : $2 change all "," to ":" - -# localize and dispose of route-based addresses -R@ $+ : $+ $@ $>96 < @$1 > : $2 handle <route-addr> - -# find focus for list syntax -R $+ : $* ; @ $+ $@ $>96 $1 : $2 ; < @ $3 > list syntax -R $+ : $* ; $@ $1 : $2; list syntax - -# find focus for @ syntax addresses -R$+ @ $+ $: $1 < @ $2 > focus on domain -R$+ < $+ @ $+ > $1 $2 < @ $3 > move gaze right -R$+ < @ $+ > $@ $>96 $1 < @ $2 > already canonical - -# do some sanity checking -R$* < @ $* : $* > $* $1 < @ $2 $3 > $4 nix colons in addrs - -ifdef(`_NO_UUCP_', `dnl', -`# convert old-style addresses to a domain-based address -R$- ! $+ $@ $>96 $2 < @ $1 .UUCP > resolve uucp names -R$+ . $- ! $+ $@ $>96 $3 < @ $1 . $2 > domain uucps -R$+ ! $+ $@ $>96 $2 < @ $1 .UUCP > uucp subdomains -') -ifdef(`_USE_DECNET_SYNTAX_', -`# convert node::user addresses into a domain-based address -R$- :: $+ $@ $>96 $2 < @ $1 .DECNET > resolve DECnet names -R$- . $- :: $+ $@ $>96 $3 < @ $1.$2 .DECNET > numeric DECnet addr -', - `dnl') -# if we have % signs, take the rightmost one -R$* % $* $1 @ $2 First make them all @s. -R$* @ $* @ $* $1 % $2 @ $3 Undo all but the last. -R$* @ $* $@ $>96 $1 < @ $2 > Insert < > and finish - -# else we must be a local name -R$* $@ $>96 $1 - - -################################################ -### Ruleset 96 -- bottom half of ruleset 3 ### -################################################ - -S96 - -# handle special cases for local names -R$* < @ localhost > $* $: $1 < @ $j . > $2 no domain at all -R$* < @ localhost . $m > $* $: $1 < @ $j . > $2 local domain -ifdef(`_NO_UUCP_', `dnl', -`R$* < @ localhost . UUCP > $* $: $1 < @ $j . > $2 .UUCP domain') -R$* < @ [ $+ ] > $* $: $1 < @@ [ $2 ] > $3 mark [a.b.c.d] -R$* < @@ $=w > $* $: $1 < @ $j . > $3 self-literal -R$* < @@ $+ > $* $@ $1 < @ $2 > $3 canon IP addr - -ifdef(`DOMAIN_TABLE', `dnl -# look up domains in the domain table -R$* < @ $+ > $* $: $1 < @ $(domaintable $2 $) > $3', `dnl') - -undivert(2)dnl - -ifdef(`BITDOMAIN_TABLE', `dnl -# handle BITNET mapping -R$* < @ $+ .BITNET > $* $: $1 < @ $(bitdomain $2 $: $2.BITNET $) > $3', `dnl') - -ifdef(`UUDOMAIN_TABLE', `dnl -# handle UUCP mapping -R$* < @ $+ .UUCP > $* $: $1 < @ $(uudomain $2 $: $2.UUCP $) > $3', `dnl') - -ifdef(`_NO_UUCP_', `dnl', -`ifdef(`UUCP_RELAY', -`# pass UUCP addresses straight through -R$* < @ $+ . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', -`# if really UUCP, handle it immediately -ifdef(`_CLASS_U_', -`R$* < @ $=U . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') -ifdef(`_CLASS_V_', -`R$* < @ $=V . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') -ifdef(`_CLASS_W_', -`R$* < @ $=W . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') -ifdef(`_CLASS_X_', -`R$* < @ $=X . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') -ifdef(`_CLASS_Y_', -`R$* < @ $=Y . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') - -ifdef(`_NO_CANONIFY_', `dnl', `dnl -# try UUCP traffic as a local address -R$* < @ $+ . UUCP > $* $: $1 < @ $[ $2 $] . UUCP . > $3 -R$* < @ $+ . . UUCP . > $* $@ $1 < @ $2 . > $3') -')') -ifdef(`_NO_CANONIFY_', `dnl', `dnl -# pass to name server to make hostname canonical -R$* < @ $* $~P > $* $: $1 < @ $[ $2 $3 $] > $4') - -# local host aliases and pseudo-domains are always canonical -R$* < @ $=w > $* $: $1 < @ $2 . > $3 -R$* < @ $j > $* $: $1 < @ $j . > $2 -ifdef(`_MASQUERADE_ENTIRE_DOMAIN_', -`R$* < @ $* $=M > $* $: $1 < @ $2 $3 . > $4', -`R$* < @ $=M > $* $: $1 < @ $2 . > $3') -R$* < @ $* $=P > $* $: $1 < @ $2 $3 . > $4 -R$* < @ $* . . > $* $1 < @ $2 . > $3 - - -################################################## -### Ruleset 4 -- Final Output Post-rewriting ### -################################################## -S4 - -R$* <@> $@ handle <> and list:; - -# strip trailing dot off possibly canonical name -R$* < @ $+ . > $* $1 < @ $2 > $3 - -# eliminate internal code -- should never get this far! -R$* < @ *LOCAL* > $* $1 < @ $j > $2 - -# externalize local domain info -R$* < $+ > $* $1 $2 $3 defocus -R@ $+ : @ $+ : $+ @ $1 , @ $2 : $3 <route-addr> canonical -R@ $* $@ @ $1 ... and exit - -ifdef(`_NO_UUCP_', `dnl', -`# UUCP must always be presented in old form -R$+ @ $- . UUCP $2!$1 u@h.UUCP => h!u') - -ifdef(`_USE_DECNET_SYNTAX_', -`# put DECnet back in :: form -R$+ @ $+ . DECNET $2 :: $1 u@h.DECNET => h::u', - `dnl') -# delete duplicate local names -R$+ % $=w @ $=w $1 @ $2 u%host@host => u@host - - - -############################################################## -### Ruleset 97 -- recanonicalize and call ruleset zero ### -### (used for recursive calls) ### -############################################################## - -S`'97 -R$* $: $>3 $1 -R$* $@ $>0 $1 - - -###################################### -### Ruleset 0 -- Parse Address ### -###################################### - -S0 - -R$* $: $>Parse0 $1 initial parsing -R<@> $#_LOCAL_ $: <@> special case error msgs -R$* $: $>98 $1 handle local hacks -R$* $: $>Parse1 $1 final parsing - -# -# Parse0 -- do initial syntax checking and eliminate local addresses. -# This should either return with the (possibly modified) input -# or return with a #error mailer. It should not return with a -# #mailer other than the #error mailer. -# - -SParse0 -R<@> $@ <@> special case error msgs -R$* : $* ; <@> $#error $@ 5.1.3 $: "List:; syntax illegal for recipient addresses" -#R@ <@ $* > < @ $1 > catch "@@host" bogosity -R<@ $+> $#error $@ 5.1.3 $: "User address required" -R$* $: <> $1 -R<> $* < @ [ $+ ] > $* $1 < @ [ $2 ] > $3 -R<> $* <$* : $* > $* $#error $@ 5.1.3 $: "Colon illegal in host name part" -R<> $* $1 -R$* < @ . $* > $* $#error $@ 5.1.2 $: "Invalid host name" -R$* < @ $* .. $* > $* $#error $@ 5.1.2 $: "Invalid host name" - -# now delete the local info -- note $=O to find characters that cause forwarding -R$* < @ > $* $@ $>Parse0 $>3 $1 user@ => user -R< @ $=w . > : $* $@ $>Parse0 $>3 $2 @here:... -> ... -R$- < @ $=w . > $: $(dequote $1 $) < @ $2 . > dequote "foo"@here -R< @ $+ > $#error $@ 5.1.3 $: "User address required" -R$* $=O $* < @ $=w . > $@ $>Parse0 $>3 $1 $2 $3 ...@here -> ... -R$- $: $(dequote $1 $) < @ *LOCAL* > dequote "foo" -R< @ *LOCAL* > $#error $@ 5.1.3 $: "User address required" -R$* $=O $* < @ *LOCAL* > - $@ $>Parse0 $>3 $1 $2 $3 ...@*LOCAL* -> ... -R$* < @ *LOCAL* > $: $1 - -# -# Parse1 -- the bottom half of ruleset 0. -# - -SParse1 -ifdef(`_MAILER_smtp_', -`# handle numeric address spec -R$* < @ [ $+ ] > $* $: $>98 $1 < @ [ $2 ] > $3 numeric internet spec -R$* < @ [ $+ ] > $* $#_SMTP_ $@ [$2] $: $1 < @ [$2] > $3 still numeric: send', - `dnl') - -ifdef(`VIRTUSER_TABLE', `dnl -# handle virtual users -R$+ < @ $=w . > $: < $(virtuser $1 @ $2 $@ $1 $: @ $) > $1 < @ $2 . > -R<@> $+ + $* < @ $* . > - $: < $(virtuser $1 + * @ $3 $@ $1 $: @ $) > $1 + $2 < @ $3 . > -R<@> $+ + $* < @ $* . > - $: < $(virtuser $1 @ $3 $@ $1 $: @ $) > $1 + $2 < @ $3 . > -R<@> $+ < @ $+ . > $: < $(virtuser @ $2 $@ $1 $: @ $) > $1 < @ $2 . > -R<@> $+ $: $1 -R< error : $- $+ > $* $#error $@ $(dequote $1 $) $: $2 -R< $+ > $+ < @ $+ > $: $>97 $1', -`dnl') - -# short circuit local delivery so forwarded email works -ifdef(`_MAILER_usenet_', `dnl -R$+ . USENET < @ $=w . > $#usenet $: $1 handle usenet specially', `dnl') -ifdef(`_STICKY_LOCAL_DOMAIN_', -`R$+ < @ $=w . > $: < $H > $1 < @ $2 . > first try hub -R< $+ > $+ < $+ > $>95 < $1 > $2 < $3 > yep .... -R< > $+ + $* < $+ > $#_LOCAL_ $: $1 + $2 plussed name? -R< > $+ < $+ > $#_LOCAL_ $: @ $1 nope, local address', -`R$=L < @ $=w . > $#_LOCAL_ $: @ $1 special local names -R$+ < @ $=w . > $#_LOCAL_ $: $1 regular local name') - -ifdef(`MAILER_TABLE', `dnl -# not local -- try mailer table lookup -R$* <@ $+ > $* $: < $2 > $1 < @ $2 > $3 extract host name -R< $+ . > $* $: < $1 > $2 strip trailing dot -R< $+ > $* $: < $(mailertable $1 $) > $2 lookup -R< $~[ : $* > $* $>95 < $1 : $2 > $3 check -- resolved? -R< $+ > $* $: $>90 <$1> $2 try domain', -`dnl') -undivert(4)dnl - -ifdef(`_NO_UUCP_', `dnl', -`# resolve remotely connected UUCP links (if any) -ifdef(`_CLASS_V_', -`R$* < @ $=V . UUCP . > $* $: $>95 < $V > $1 <@$2.UUCP.> $3', - `dnl') -ifdef(`_CLASS_W_', -`R$* < @ $=W . UUCP . > $* $: $>95 < $W > $1 <@$2.UUCP.> $3', - `dnl') -ifdef(`_CLASS_X_', -`R$* < @ $=X . UUCP . > $* $: $>95 < $X > $1 <@$2.UUCP.> $3', - `dnl')') - -# resolve fake top level domains by forwarding to other hosts -ifdef(`BITNET_RELAY', -`R$*<@$+.BITNET.>$* $: $>95 < $B > $1 <@$2.BITNET.> $3 user@host.BITNET', - `dnl') -ifdef(`DECNET_RELAY', -`R$*<@$+.DECNET.>$* $: $>95 < $C > $1 <@$2.DECNET.> $3 user@host.DECNET', - `dnl') -ifdef(`_MAILER_pop_', -`R$+ < @ POP. > $#pop $: $1 user@POP', - `dnl') -ifdef(`_MAILER_fax_', -`R$+ < @ $+ .FAX. > $#fax $@ $2 $: $1 user@host.FAX', -`ifdef(`FAX_RELAY', -`R$*<@$+.FAX.>$* $: $>95 < $F > $1 <@$2.FAX.> $3 user@host.FAX', - `dnl')') - -ifdef(`UUCP_RELAY', -`# forward non-local UUCP traffic to our UUCP relay -R$*<@$*.UUCP.>$* $: $>95 < $Y > $1 <@$2.UUCP.> $3 uucp mail', -`ifdef(`_MAILER_uucp_', -`# forward other UUCP traffic straight to UUCP -R$* < @ $+ .UUCP. > $* $#_UUCP_ $@ $2 $: $1 < @ $2 .UUCP. > $3 user@host.UUCP', - `dnl')') -ifdef(`_MAILER_usenet_', ` -# addresses sent to net.group.USENET will get forwarded to a newsgroup -R$+ . USENET $#usenet $: $1', - `dnl') - -ifdef(`_LOCAL_RULES_', -`# figure out what should stay in our local mail system -undivert(1)', `dnl') - -# pass names that still have a host to a smarthost (if defined) -R$* < @ $* > $* $: $>95 < $S > $1 < @ $2 > $3 glue on smarthost name - -# deal with other remote names -ifdef(`_MAILER_smtp_', -`R$* < @$* > $* $#_SMTP_ $@ $2 $: $1 < @ $2 > $3 user@host.domain', -`R$* < @$* > $* $#error $@ 5.1.2 $: "Unrecognized host name " $2') - -# handle locally delivered names -R$=L $#_LOCAL_ $: @ $1 special local names -R$+ $#_LOCAL_ $: $1 regular local names - -########################################################################### -### Ruleset 5 -- special rewriting after aliases have been expanded ### -########################################################################### - -S5 - -# deal with plussed users so aliases work nicely -R$+ + * $#_LOCAL_ $@ $&h $: $1 -R$+ + $* $#_LOCAL_ $@ + $2 $: $1 + * - -# prepend an empty "forward host" on the front -R$+ $: <> $1 - -ifdef(`LUSER_RELAY', `dnl -# send unrecognized local users to a relay host -R< > $+ $: < $L . > $(user $1 $) look up user -R< $* > $+ <> $* $: < > $2 $3 found; strip $L -R< $* . > $+ $: < $1 > $2 strip extra dot', -`dnl') - -# see if we have a relay or a hub -R< > $+ $: < $H > $1 try hub -R< > $+ $: < $R > $1 try relay -R< > $+ $: < > < $1 $&h > nope, restore +detail -R< > < $+ + $* > $* < > < $1 > + $2 $3 find the user part -R< > < $+ > + $* $#_LOCAL_ $@ $2 $: @ $1 strip the extra + -R< > < $+ > $@ $1 no +detail -R$+ $: $1 <> $&h add +detail back in -R$+ <> + $* $: $1 + $2 check whether +detail -R$+ <> $* $: $1 else discard -R< local : $* > $* $: $>95 < local : $1 > $2 no host extension -R< error : $* > $* $: $>95 < error : $1 > $2 no host extension -R< $- : $+ > $+ $: $>95 < $1 : $2 > $3 < @ $2 > -R< $+ > $+ $@ $>95 < $1 > $2 < @ $1 > - -ifdef(`MAILER_TABLE', `dnl -################################################################### -### Ruleset 90 -- try domain part of mailertable entry ### -################################################################### - -S90 -R$* <$- . $+ > $* $: $1$2 < $(mailertable .$3 $@ $1$2 $@ $2 $) > $4 -R$* <$~[ : $* > $* $>95 < $2 : $3 > $4 check -- resolved? -R$* < . $+ > $* $@ $>90 $1 . <$2> $3 no -- strip & try again -R$* < $* > $* $: < $(mailertable . $@ $1$2 $) > $3 try "." -R< $~[ : $* > $* $>95 < $1 : $2 > $3 "." found? -R< $* > $* $@ $2 no mailertable match', -`dnl') - -################################################################### -### Ruleset 95 -- canonify mailer:[user@]host syntax to triple ### -################################################################### - -S95 -R< > $* $@ $1 strip off null relay -R< error : $- $+ > $* $#error $@ $(dequote $1 $) $: $2 -R< local : $* > $* $>CanonLocal < $1 > $2 -R< $- : $+ @ $+ > $*<$*>$* $# $1 $@ $3 $: $2<@$3> use literal user -R< $- : $+ > $* $# $1 $@ $2 $: $3 try qualified mailer -R< $=w > $* $@ $2 delete local host -R< $+ > $* $#_RELAY_ $@ $1 $: $2 use unqualified mailer - -################################################################### -### Ruleset CanonLocal -- canonify local: syntax ### -################################################################### - -SCanonLocal -# strip local host from routed addresses -R< $* > < @ $+ > : $+ $@ $>97 $3 -R< $* > $+ $=O $+ < @ $+ > $@ $>97 $2 $3 $4 - -# strip trailing dot from any host name that may appear -R< $* > $* < @ $* . > $: < $1 > $2 < @ $3 > - -# handle local: syntax -- use old user, either with or without host -R< > $* < @ $* > $* $#_LOCAL_ $@ $1@$2 $: $1 -R< > $+ $#_LOCAL_ $@ $1 $: $1 - -# handle local:user@host syntax -- ignore host part -R< $+ @ $+ > $* < @ $* > $: < $1 > $3 < @ $4 > - -# handle local:user syntax -R< $+ > $* <@ $* > $* $#_LOCAL_ $@ $2@$3 $: $1 -R< $+ > $* $#_LOCAL_ $@ $2 $: $1 - -################################################################### -### Ruleset 93 -- convert header names to masqueraded form ### -################################################################### - -S93 - -ifdef(`GENERICS_TABLE', `dnl -# handle generics database -ifdef(`_GENERICS_ENTIRE_DOMAIN_', -`R$+ < @ $* $=G . > $: < $1@$2$3 > $1 < @ $2$3 . > @ mark', -`R$+ < @ $=G . > $: < $1@$2 > $1 < @ $2 . > @ mark') -R$+ < @ *LOCAL* > $: < $1@$j > $1 < @ *LOCAL* > @ mark -R< $+ > $+ < $* > @ $: < $(generics $1 $: $) > $2 < $3 > -R< > $+ < @ $+ > $: < $(generics $1 $: $) > $1 < @ $2 > -R< $* @ $* > $* < $* > $@ $>3 $1 @ $2 found qualified -R< $+ > $* < $* > $: $>3 $1 @ *LOCAL* found unqualified -R< > $* $: $1 not found', -`dnl') - -# special case the users that should be exposed -R$=E < @ *LOCAL* > $@ $1 < @ $j . > leave exposed -ifdef(`_MASQUERADE_ENTIRE_DOMAIN_', -`R$=E < @ $* $=M . > $@ $1 < @ $2 $3 . >', -`R$=E < @ $=M . > $@ $1 < @ $2 . >') -ifdef(`_LIMITED_MASQUERADE_', `dnl', -`R$=E < @ $=w . > $@ $1 < @ $2 . >') - -# handle domain-specific masquerading -ifdef(`_MASQUERADE_ENTIRE_DOMAIN_', -`R$* < @ $* $=M . > $* $: $1 < @ $2 $3 . @ $M > $4 convert masqueraded doms', -`R$* < @ $=M . > $* $: $1 < @ $2 . @ $M > $3 convert masqueraded doms') -ifdef(`_LIMITED_MASQUERADE_', `dnl', -`R$* < @ $=w . > $* $: $1 < @ $2 . @ $M > $3') -R$* < @ *LOCAL* > $* $: $1 < @ $j . @ $M > $2 -R$* < @ $+ @ > $* $: $1 < @ $2 > $3 $M is null -R$* < @ $+ @ $+ > $* $: $1 < @ $3 . > $4 $M is not null - -################################################################### -### Ruleset 94 -- convert envelope names to masqueraded form ### -################################################################### - -S94 -ifdef(`_MASQUERADE_ENVELOPE_', -`R$+ $@ $>93 $1', -`R$* < @ *LOCAL* > $* $: $1 < @ $j . > $2') - -################################################################### -### Ruleset 98 -- local part of ruleset zero (can be null) ### -################################################################### - -S98 -undivert(3)dnl - -ifelse(substr(confDELIVERY_MODE,0,1), `d', `errprint(`WARNING: Antispam rules not available in deferred delivery mode.')') -ifdef(`ACCESS_TABLE', `dnl -###################################################################### -### LookUpDomain -- search for domain in access database -### -### Parameters: -### <$1> -- key (domain name) -### <$2> -- default (what to return if not found in db) -### <$3> -- passthru (additional data passed unchanged through) -###################################################################### - -SLookUpDomain -R<$+> <$+> <$*> $: < $(access $1 $: ? $) > <$1> <$2> <$3> -R<?> <$+.$+> <$+> <$*> $@ $>LookUpDomain <$2> <$3> <$4> -R<?> <$+> <$+> <$*> $@ <$2> <$3> -R<$*> <$+> <$+> <$*> $@ <$1> <$4> - -###################################################################### -### LookUpAddress -- search for host address in access database -### -### Parameters: -### <$1> -- key (dot quadded host address) -### <$2> -- default (what to return if not found in db) -### <$3> -- passthru (additional data passed through) -###################################################################### - -SLookUpAddress -R<$+> <$+> <$*> $: < $(access $1 $: ? $) > <$1> <$2> <$3> -R<?> <$+.$-> <$+> <$*> $@ $>LookUpAddress <$1> <$3> <$4> -R<?> <$+> <$+> <$*> $@ <$2> <$3> -R<$*> <$+> <$+> <$*> $@ <$1> <$4>', -`dnl') - -###################################################################### -### CanonAddr -- Convert an address into a standard form for -### relay checking. Route address syntax is -### crudely converted into a %-hack address. -### -### Parameters: -### $1 -- full recipient address -### -### Returns: -### parsed address, not in source route form -###################################################################### - -SCanonAddr -R$* $: $>Parse0 $>3 $1 make domain canonical -R< @ $+ > : $* @ $* < @ $1 > : $2 % $3 change @ to % in src route -R$* < @ $+ > : $* : $* $3 $1 < @ $2 > : $4 change to % hack. -R$* < @ $+ > : $* $3 $1 < @ $2 > - -###################################################################### -### ParseRecipient -- Strip off hosts in $=R as well as possibly -### $* $=m or the access database. -### Check user portion for host separators. -### -### Parameters: -### $1 -- full recipient address -### -### Returns: -### parsed, non-local-relaying address -###################################################################### - -SParseRecipient -R$* $: <?> $>CanonAddr $1 -R<?> $* < @ $* . > <?> $1 < @ $2 > strip trailing dots -R<?> $- < @ $* > $: <?> $(dequote $1 $) < @ $2 > dequote local part - -# if no $=O character, no host in the user portion, we are done -R<?> $* $=O $* < @ $* > $: <NO> $1 $2 $3 < @ $4> -R<?> $* $@ $1 - -ifdef(`_RELAY_ENTIRE_DOMAIN_', `dnl -# if we relay, check username portion for user%host so host can be checked also -R<NO> $* < @ $* $=m > $: <RELAY> $1 < @ $2 $3 >', `dnl') - -ifdef(`_RELAY_MX_SERVED_', `dnl -R<NO> $* < @ $+ > $: <MX> < : $(mxserved $2 $) : > < $1 < @$2 > > -R<MX> < : $* <TEMP> : > $* $#error $@ 4.7.1 $: "450 Can not check MX records for recipient host " $1 -R<MX> < $* : $=w. : $* > < $+ > $: <RELAY> $4 -R<MX> < : $* : > < $+ > $: <NO> $2', `dnl') - -ifdef(`_RELAY_HOSTS_ONLY_', -`R<NO> $* < @ $=R > $: <RELAY> $1 < @ $2 > -ifdef(`ACCESS_TABLE', `dnl -R<NO> $* < @ $+ > $: <$(access $2 $: NO $)> $1 < @ $2 >',`dnl')', -`R<NO> $* < @ $* $=R > $: <RELAY> $1 < @ $2 $3 > -ifdef(`ACCESS_TABLE', `dnl -R<NO> $* < @ $+ > $: $>LookUpDomain <$2> <NO> <$1 < @ $2 >> -R<$+> <$+> $: <$1> $2',`dnl')') - -R<RELAY> $* < @ $* > $@ $>ParseRecipient $1 -R<$-> $* $@ $2 - -###################################################################### -### check_relay -- check hostname/address on SMTP startup -###################################################################### - -SLocal_check_relay -Scheck_relay -R$* $: $1 $| $>"Local_check_relay" $1 -R$* $| $* $| $#$* $#$3 -R$* $| $* $| $* $@ $>"Basic_check_relay" $1 $| $2 - -SBasic_check_relay -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - -ifdef(`ACCESS_TABLE', `dnl -R$+ $| $+ $: $>LookUpDomain < $1 > <?> < $2 > -R<?> < $+ > $: $>LookUpAddress < $1 > <?> < $1 > -R<?> < $+ > $: $1 -R<OK> < $* > $@ OK -R<RELAY> < $* > $@ RELAY -R<REJECT> $* $#error $@ 5.7.1 $: "ifdef(`confREJECT_MSG', `confREJECT_MSG', `550 Access denied')" -R<DISCARD> $* $#discard $: discard -R<$+> $* $#error $@ 5.7.1 $: $1', `dnl') - -ifdef(`_RBL_', `dnl -# DNS based IP address spam lists -R$* $: $&{client_addr} -R$-.$-.$-.$- $: $(host $4.$3.$2.$1._RBL_. $: OK $) -ROK $@ OK -R$+ $#error $@ 5.7.1 $: "Mail from " $&{client_addr} " refused by blackhole site _RBL_"', -`dnl') - -###################################################################### -### check_mail -- check SMTP ``MAIL FROM:'' command argument -###################################################################### - -SLocal_check_mail -Scheck_mail -R$* $: $1 $| $>"Local_check_mail" $1 -R$* $| $#$* $#$2 -R$* $| $* $@ $>"Basic_check_mail" $1 - -SBasic_check_mail -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - -R<> $@ <OK> -R$* $: <?> $>CanonAddr $1 -R<?> $* < @ $+ . > <?> $1 < @ $2 > strip trailing dots -# handle non-DNS hostnames (*.bitnet, *.decnet, *.uucp, etc) -R<?> $* < $* $=P > $* $: <OK> $1 < @ $2 $3 > $4 -ifdef(`_ACCEPT_UNRESOLVABLE_DOMAINS_', -`R<?> $* < @ $+ > $* $: <OK> $1 < @ $2 > $3 ... unresolvable OK', -`R<?> $* < @ $+ > $* $: <? $(resolve $2 $: $2 <PERM> $) > $1 < @ $2 > $3 -R<? $* <$->> $* < @ $+ > $* - $: <$2> $3 < @ $4 > $5') - -ifdef(`_ACCEPT_UNQUALIFIED_SENDERS_',`dnl',`dnl -# handle case of @localhost on address -R<$+> $* < @localhost > $: < ? $&{client_name} > <$1> $2 < @localhost > -R<$+> $* < @localhost.$m > - $: < ? $&{client_name} > <$1> $2 < @localhost.$m > -ifdef(`_NO_UUCP_', `dnl', -`R<$+> $* < @localhost.UUCP > - $: < ? $&{client_name} > <$1> $2 < @localhost.UUCP >') -R<? $=w> <$+> $* <?> <$2> $3 -R<? $+> <$+> $* $#error $@ 5.5.4 $: "553 Real domain name required" -R<?> <$+> $* $: <$1> $2') - -ifdef(`ACCESS_TABLE', `dnl -# lookup localpart (user@) -R<$+> $* < @ $+ > $* $: <USER $(access $2@ $: ? $) > <$1> $2 < @ $3 > $4 -# no match, try full address (user@domain rest) -R<USER ?> <$+> $* < @ $* > $* - $: <USER $(access $2@$3$4 $: ? $) > <$1> $2 < @ $3 > $4 -# no match, try address (user@domain) -R<USER ?> <$+> $+ < @ $+ > $* - $: <USER $(access $2@$3 $: ? $) > <$1> $2 < @ $3 > $4 -# no match, try (sub)domain (domain) -R<USER ?> <$+> $* < @ $+ > $* - $: $>LookUpDomain <$3> <$1> <> -# check unqualified user in access database -R<?> $* $: <USER $(access $1@ $: ? $) > <?> $1 -# retransform for further use -R<USER $+> <$+> $* $: <$1> $3', -`dnl') - -ifdef(`_ACCEPT_UNQUALIFIED_SENDERS_',`dnl',`dnl -# handle case of no @domain on address -R<?> $* $: < ? $&{client_name} > $1 -R<?> $* $@ <OK> ...local unqualed ok -R<? $+> $* $#error $@ 5.5.4 $: "553 Domain name required" - ...remote is not') -# check results -R<?> $* $@ <OK> -R<OK> $* $@ <OK> -R<TEMP> $* $#error $@ 4.1.8 $: "451 Sender domain must resolve" -R<PERM> $* $#error $@ 5.1.8 $: "501 Sender domain must exist" -ifdef(`ACCESS_TABLE', `dnl -R<RELAY> $* $@ <RELAY> -R<DISCARD> $* $#discard $: discard -R<REJECT> $* $#error $@ 5.7.1 $: "ifdef(`confREJECT_MSG', `confREJECT_MSG', `550 Access denied')" -R<$+> $* $#error $@ 5.7.1 $: $1 error from access db', -`dnl') - -###################################################################### -### check_rcpt -- check SMTP ``RCPT TO:'' command argument -###################################################################### - -SLocal_check_rcpt -Scheck_rcpt -R$* $: $1 $| $>"Local_check_rcpt" $1 -R$* $| $#$* $#$2 -R$* $| $* $@ $>"Basic_check_rcpt" $1 - -SBasic_check_rcpt -# check for deferred delivery mode -R$* $: < ${deliveryMode} > $1 -R< d > $* $@ deferred -R< $* > $* $: $2 - -ifdef(`_LOOSE_RELAY_CHECK_',`dnl -R$* $: $>CanonAddr $1 -R$* < @ $* . > $1 < @ $2 > strip trailing dots', -`R$* $: $>ParseRecipient $1 strip relayable hosts') - -ifdef(`_BESTMX_IS_LOCAL_',`dnl -ifelse(_BESTMX_IS_LOCAL_, `', `dnl -# unlimited bestmx -R$* < @ $* > $* $: $1 < @ $2 @@ $(bestmx $2 $) > $3', -`dnl -# limit bestmx to $=B -R$* < @ $* $=B > $* $: $1 < @ $2 $3 @@ $(bestmx $2 $3 $) > $4') -R$* $=O $* < @ $* @@ $=w . > $* $@ $>Basic_check_rcpt $1 $2 $3 -R$* < @ $* @@ $=w . > $* $: $1 < @ $3 > $4 -R$* < @ $* @@ $* > $* $: $1 < @ $2 > $4') - -ifdef(`_BLACKLIST_RCPT_',`dnl -ifdef(`ACCESS_TABLE', `dnl -# blacklist local users or any host from receiving mail -R$* $: <?> $1 -R<?> $+ < @ $=w > $: <> <USER $1> <FULL $1@$2> <HOST $2> <$1 < @ $2 >> -R<?> $+ < @ $* > $: <> <FULL $1@$2> <HOST $2> <$1 < @ $2 >> -R<?> $+ $: <> <USER $1> <$1> -R<> <USER $+> $* $: <$(access $1 $: $)> $2 -R<> <FULL $+> $* $: <$(access $1 $: $)> $2 -R<OK> <FULL $+> $* $: <$(access $1 $: $)> $2 -R<> <HOST $+> $* $: <$(access $1 $: $)> $2 -R<OK> <HOST $+> $* $: <$(access $1 $: $)> $2 -R<> <$*> $: $1 -R<OK> <$*> $: $1 -R<RELAY> <$*> $: $1 -R<REJECT> $* $#error $@ 5.2.1 $: "550 Mailbox disabled for this recipient" -R<$+> $* $#error $@ 5.2.1 $: $1 error from access db', `dnl')', `dnl') - -ifdef(`_PROMISCUOUS_RELAY_', `dnl', `dnl -# anything terminating locally is ok -ifdef(`_RELAY_ENTIRE_DOMAIN_', `dnl -R$+ < @ $* $=m > $@ OK', `dnl') -R$+ < @ $=w > $@ OK -ifdef(`_RELAY_HOSTS_ONLY_', -`R$+ < @ $=R > $@ OK -ifdef(`ACCESS_TABLE', `dnl -R$+ < @ $* > $: <$(access $2 $: ? $)> <$1 < @ $2 >>',`dnl')', -`R$+ < @ $* $=R > $@ OK -ifdef(`ACCESS_TABLE', `dnl -R$+ < @ $* > $: $>LookUpDomain <$2> <?> <$1 < @ $2 >>',`dnl')') -ifdef(`ACCESS_TABLE', `dnl -R<RELAY> $* $@ RELAY -R<$*> <$*> $: $2',`dnl') - -ifdef(`_RELAY_MX_SERVED_', `dnl -# allow relaying for hosts which we MX serve -R$+ < @ $* > $: < : $(mxserved $2 $) : > $1 < @ $2 > -R< : $* <TEMP> : > $* $#error $@ 4.7.1 $: "450 Can not check MX records for recipient host " $1 -R<$* : $=w . : $*> $* $@ OK -R< : $* : > $* $: $2', -`dnl') - -# check for local user (i.e. unqualified address) -R$* $: <?> $1 -R<?> $* < @ $+ > $: <REMOTE> $1 < @ $2 > -# local user is ok -R<?> $+ $@ OK -R<$+> $* $: $2 - -# anything originating locally is ok -R$* $: <?> $&{client_name} -# check if bracketed IP address (forward lookup != reverse lookup) -R<?> [$+] $: <BAD> [$1] -# pass to name server to make hostname canonical -R<?> $* $~P $: <?> $[ $1 $2 $] -R<$-> $* $: $2 -R$* . $1 strip trailing dots -R$@ $@ OK -ifdef(`_RELAY_ENTIRE_DOMAIN_', `dnl -R$* $=m $@ OK', `dnl') -R$=w $@ OK -ifdef(`_RELAY_HOSTS_ONLY_', -`R$=R $@ OK -ifdef(`ACCESS_TABLE', `dnl -R$* $: <$(access $1 $: ? $)> <$1>',`dnl')', -`R$* $=R $@ OK -ifdef(`ACCESS_TABLE', `dnl -R$* $: $>LookUpDomain <$1> <?> <$1>',`dnl')') -ifdef(`ACCESS_TABLE', `dnl -R<RELAY> $* $@ RELAY -R<$*> <$*> $: $2',`dnl') - -# check IP address -R$* $: $&{client_addr} -R$@ $@ OK originated locally -R0 $@ OK originated locally -R$=R $* $@ OK relayable IP address -ifdef(`ACCESS_TABLE', `dnl -R$* $: $>LookUpAddress <$1> <?> <$1> -R<RELAY> $* $@ RELAY relayable IP address -R<$*> <$*> $: $2', `dnl') -R$* $: [ $1 ] put brackets around it... -R$=w $@ OK ... and see if it is local - -ifdef(`_RELAY_LOCAL_FROM_', `dnl -# anything with a local FROM is ok -R$* $: $1 $| $>CanonAddr $&f -R$* $| $+ < @ $=w . > $@ OK FROM local -R$* $| $* $: $1 -', `dnl') - -# anything else is bogus -R$* $#error $@ 5.7.1 $: "550 Relaying denied"') - -undivert(9)dnl -# -###################################################################### -###################################################################### -##### -`##### MAILER DEFINITIONS' -##### -###################################################################### -###################################################################### -undivert(7)dnl diff --git a/cf/m4/version.m4 b/cf/m4/version.m4 deleted file mode 100644 index 416488c..0000000 --- a/cf/m4/version.m4 +++ /dev/null @@ -1,17 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -VERSIONID(`@(#)version.m4 8.9.3.1 (Berkeley) 2/4/1999') -# -divert(0) -# Configuration version number -DZ8.9.3`'ifdef(`confCF_VERSION', `/confCF_VERSION') diff --git a/cf/mailer/cyrus.m4 b/cf/mailer/cyrus.m4 deleted file mode 100644 index 567025f..0000000 --- a/cf/mailer/cyrus.m4 +++ /dev/null @@ -1,58 +0,0 @@ -PUSHDIVERT(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# This code incorporates code from Carnegie Mellon University, whose -# copyright notice and conditions of redistribution are as follows: -# -#*************************************************************************** -# (C) Copyright 1995 by Carnegie Mellon University -# -# All Rights Reserved -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose and without fee is hereby granted, -# provided that the above copyright notice appear in all copies and that -# both that copyright notice and this permission notice appear in -# supporting documentation, and that the name of CMU not be -# used in advertising or publicity pertaining to distribution of the -# software without specific, written prior permission. -# -# CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL -# CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -# SOFTWARE. -# -# Contributed to Berkeley by John Gardiner Myers <jgm+@CMU.EDU>. -# - -ifdef(`CYRUS_MAILER_FLAGS',, `define(`CYRUS_MAILER_FLAGS', `A5@/:|')') -ifdef(`CYRUS_MAILER_PATH',, `define(`CYRUS_MAILER_PATH', /usr/cyrus/bin/deliver)') -ifdef(`CYRUS_MAILER_ARGS',, `define(`CYRUS_MAILER_ARGS', `deliver -e -m $h -- $u')') -ifdef(`CYRUS_MAILER_USER',, `define(`CYRUS_MAILER_USER', `cyrus:mail')') -ifdef(`CYRUS_BB_MAILER_FLAGS',, `define(`CYRUS_BB_MAILER_FLAGS', `')') -ifdef(`CYRUS_BB_MAILER_ARGS',, `define(`CYRUS_BB_MAILER_ARGS', `deliver -e -m $u')') - -POPDIVERT - -################################################## -### Cyrus Mailer specification ### -################################################## - -VERSIONID(`@(#)cyrus.m4 8.9 (Carnegie Mellon) 5/19/1998') - -Mcyrus, P=CYRUS_MAILER_PATH, F=CONCAT(`lsDFMnPq', CYRUS_MAILER_FLAGS), S=10, R=20/40, T=X-Unix, - ifdef(`CYRUS_MAILER_MAX', `M=CYRUS_MAILER_MAX, ')U=CYRUS_MAILER_USER, - A=CYRUS_MAILER_ARGS - -Mcyrusbb, P=CYRUS_MAILER_PATH, F=CONCAT(`lsDFMnP', CYRUS_BB_MAILER_FLAGS), S=10, R=20/40, T=X-Unix, - ifdef(`CYRUS_MAILER_MAX', `M=CYRUS_MAILER_MAX, ')U=CYRUS_MAILER_USER, - A=CYRUS_BB_MAILER_ARGS diff --git a/cf/mailer/fax.m4 b/cf/mailer/fax.m4 deleted file mode 100644 index 3ee94bd..0000000 --- a/cf/mailer/fax.m4 +++ /dev/null @@ -1,35 +0,0 @@ -PUSHDIVERT(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# This assumes you already have Sam Leffler's HylaFAX software. -# -# Tested with HylaFAX 4.0pl1 -# - -ifdef(`FAX_MAILER_ARGS',, - `define(`FAX_MAILER_ARGS', faxmail -d $u@$h $f)') -ifdef(`FAX_MAILER_PATH',, - `define(`FAX_MAILER_PATH', /usr/local/bin/faxmail)') -ifdef(`FAX_MAILER_MAX',, - `define(`FAX_MAILER_MAX', 100000)') -POPDIVERT -#################################### -### FAX Mailer specification ### -#################################### - -VERSIONID(`@(#)fax.m4 8.11 (Berkeley) 5/19/1998') - -Mfax, P=FAX_MAILER_PATH, F=DFMhu, S=14, R=24, M=FAX_MAILER_MAX, T=X-Phone/X-FAX/X-Unix, - A=FAX_MAILER_ARGS - -LOCAL_CONFIG -CPFAX diff --git a/cf/mailer/local.m4 b/cf/mailer/local.m4 deleted file mode 100644 index 6b4b679..0000000 --- a/cf/mailer/local.m4 +++ /dev/null @@ -1,74 +0,0 @@ -PUSHDIVERT(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', `rmn9')') -ifdef(`LOCAL_MAILER_PATH',, `define(`LOCAL_MAILER_PATH', /bin/mail)') -ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', `mail -d $u')') -ifdef(`LOCAL_SHELL_FLAGS',, `define(`LOCAL_SHELL_FLAGS', `eu9')') -ifdef(`LOCAL_SHELL_PATH',, `define(`LOCAL_SHELL_PATH', /bin/sh)') -ifdef(`LOCAL_SHELL_ARGS',, `define(`LOCAL_SHELL_ARGS', `sh -c $u')') -ifdef(`LOCAL_SHELL_DIR',, `define(`LOCAL_SHELL_DIR', `$z:/')') -POPDIVERT - -################################################## -### Local and Program Mailer specification ### -################################################## - -VERSIONID(`@(#)local.m4 8.30 (Berkeley) 6/30/1998') - -Mlocal, P=LOCAL_MAILER_PATH, F=CONCAT(`lsDFMAw5:/|@q', LOCAL_MAILER_FLAGS), S=10/30, R=20/40, - _OPTINS(`LOCAL_MAILER_MAX', `M=', `, ')_OPTINS(`LOCAL_MAILER_CHARSET', `C=', `, ')T=DNS/RFC822/X-Unix, - A=LOCAL_MAILER_ARGS -Mprog, P=LOCAL_SHELL_PATH, F=CONCAT(`lsDFMoq', LOCAL_SHELL_FLAGS), S=10/30, R=20/40, D=LOCAL_SHELL_DIR, - _OPTINS(`LOCAL_MAILER_MAX', `M=', `, ')T=X-Unix, - A=LOCAL_SHELL_ARGS - -# -# Envelope sender rewriting -# -S10 -R<@> $n errors to mailer-daemon -R@ <@ $*> $n temporarily bypass Sun bogosity -R$+ $: $>50 $1 add local domain if needed -R$* $: $>94 $1 do masquerading - -# -# Envelope recipient rewriting -# -S20 -R$+ < @ $* > $: $1 strip host part - -# -# Header sender rewriting -# -S30 -R<@> $n errors to mailer-daemon -R@ <@ $*> $n temporarily bypass Sun bogosity -R$+ $: $>50 $1 add local domain if needed -R$* $: $>93 $1 do masquerading - -# -# Header recipient rewriting -# -S40 -R$+ $: $>50 $1 add local domain if needed -ifdef(`_ALL_MASQUERADE_', `dnl -R$* $: $>93 $1 do all-masquerading', `dnl') - -# -# Common code to add local domain name (only if always-add-domain) -# -S50 -ifdef(`_ALWAYS_ADD_DOMAIN_', `dnl -R$* < @ $* > $* $@ $1 < @ $2 > $3 already fully qualified -R$+ $@ $1 < @ *LOCAL* > add local qualification', -`dnl') diff --git a/cf/mailer/mail11.m4 b/cf/mailer/mail11.m4 deleted file mode 100644 index 222b53f..0000000 --- a/cf/mailer/mail11.m4 +++ /dev/null @@ -1,58 +0,0 @@ -PUSHDIVERT(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# Not exciting enough to bother with copyrights and most of the -# rulesets are based from those provided by DEC. -# Barb Dijker, Labyrinth Computer Services, barb@labyrinth.com -# -# This mailer is only useful if you have DECNET and the -# mail11 program - gatekeeper.dec.com:/pub/DEC/gwtools. -# -# For local delivery of DECNET style addresses to the local -# DECNET node, you will need feature(use_cw_file) and put -# your DECNET nodename in in the cw file. -# -ifdef(`MAIL11_MAILER_PATH',, `define(`MAIL11_MAILER_PATH', /usr/etc/mail11)') -ifdef(`MAIL11_MAILER_FLAGS',, `define(`MAIL11_MAILER_FLAGS', nsFx)') -ifdef(`MAIL11_MAILER_ARGS',, `define(`MAIL11_MAILER_ARGS', mail11 $g $x $h $u)') -define(`_USE_DECNET_SYNTAX_') -define(`_LOCAL_', ifdef(`confLOCAL_MAILER', confLOCAL_MAILER, `local')) - -POPDIVERT - -PUSHDIVERT(3) -# DECNET delivery -R$* < @ $=w .DECNET. > $#_LOCAL_ $: $1 local DECnet -R$+ < @ $+ .DECNET. > $#mail11 $@ $2 $: $1 DECnet user -POPDIVERT - -PUSHDIVERT(6) -CPDECNET -POPDIVERT - -########################################### -### UTK-MAIL11 Mailer specification ### -########################################### - -VERSIONID(`@(#)mail11.m4 8.8 (Berkeley) 5/19/1998') - -Mmail11, P=MAIL11_MAILER_PATH, F=MAIL11_MAILER_FLAGS, S=15, R=25, - A=MAIL11_MAILER_ARGS - -S15 -R$+ $: $>25 $1 preprocess -R$w :: $+ $@ $w :: $1 ready to go - -S25 -R$+ < @ $- .UUCP > $: $2 ! $1 back to old style -R$+ < @ $- .DECNET > $: $2 :: $1 convert to DECnet style -R$+ < @ $- .LOCAL > $: $2 :: $1 convert to DECnet style -R$+ < @ $=w. > $: $2 :: $1 convert to DECnet style -R$=w :: $+ $2 strip local names -R$+ :: $+ $@ $1 :: $2 already qualified diff --git a/cf/mailer/phquery.m4 b/cf/mailer/phquery.m4 deleted file mode 100644 index 3e0891a..0000000 --- a/cf/mailer/phquery.m4 +++ /dev/null @@ -1,29 +0,0 @@ -PUSHDIVERT(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# Contributed by Kimmo Suominen <kim@tac.nyc.ny.us>. -# - -ifdef(`PH_MAILER_PATH',, `define(`PH_MAILER_PATH', /usr/local/etc/phquery)') -ifdef(`PH_MAILER_FLAGS',, `define(`PH_MAILER_FLAGS', `ehmu')') -ifdef(`PH_MAILER_ARGS',, `define(`PH_MAILER_ARGS', `phquery -- $u')') - -POPDIVERT - -#################################### -### PH Mailer specification ### -#################################### - -VERSIONID(`@(#)phquery.m4 8.6 (Berkeley) 5/19/1998') - -Mph, P=PH_MAILER_PATH, F=CONCAT(`nrDFM', PH_MAILER_FLAGS), S=10, R=20/40, - A=PH_MAILER_ARGS diff --git a/cf/mailer/pop.m4 b/cf/mailer/pop.m4 deleted file mode 100644 index 0acea7d..0000000 --- a/cf/mailer/pop.m4 +++ /dev/null @@ -1,31 +0,0 @@ -PUSHDIVERT(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -ifdef(`POP_MAILER_PATH',, `define(`POP_MAILER_PATH', /usr/lib/mh/spop)') -ifdef(`POP_MAILER_FLAGS',, `define(`POP_MAILER_FLAGS', `Penu')') -ifdef(`POP_MAILER_ARGS',, `define(`POP_MAILER_ARGS', `pop $u')') - -POPDIVERT - -#################################### -### POP Mailer specification ### -#################################### - -VERSIONID(`@(#)pop.m4 8.11 (Berkeley) 5/19/1998') - -Mpop, P=POP_MAILER_PATH, F=CONCAT(`lsDFMq', POP_MAILER_FLAGS), S=10, R=20/40, T=DNS/RFC822/X-Unix, - A=POP_MAILER_ARGS - -LOCAL_CONFIG -# POP mailer is a pseudo-domain -CPPOP diff --git a/cf/mailer/procmail.m4 b/cf/mailer/procmail.m4 deleted file mode 100644 index 38b6d20..0000000 --- a/cf/mailer/procmail.m4 +++ /dev/null @@ -1,32 +0,0 @@ -PUSHDIVERT(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -ifdef(`PROCMAIL_MAILER_PATH',, - `ifdef(`PROCMAIL_PATH', - `define(`PROCMAIL_MAILER_PATH', PROCMAIL_PATH)', - `define(`PROCMAIL_MAILER_PATH', /usr/local/bin/procmail)')') -ifdef(`PROCMAIL_MAILER_FLAGS',, - `define(`PROCMAIL_MAILER_FLAGS', `SPhnu9')') -ifdef(`PROCMAIL_MAILER_ARGS',, - `define(`PROCMAIL_MAILER_ARGS', `procmail -Y -m $h $f $u')') - -POPDIVERT - -######################*****############## -### PROCMAIL Mailer specification ### -##################*****################## - -VERSIONID(`@(#)procmail.m4 8.11 (Berkeley) 5/19/1998') - -Mprocmail, P=PROCMAIL_MAILER_PATH, F=CONCAT(`DFM', PROCMAIL_MAILER_FLAGS), S=11/31, R=21/31, T=DNS/RFC822/X-Unix, - ifdef(`PROCMAIL_MAILER_MAX', `M=PROCMAIL_MAILER_MAX, ')A=PROCMAIL_MAILER_ARGS diff --git a/cf/mailer/smtp.m4 b/cf/mailer/smtp.m4 deleted file mode 100644 index 7545597..0000000 --- a/cf/mailer/smtp.m4 +++ /dev/null @@ -1,115 +0,0 @@ -PUSHDIVERT(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -ifdef(`SMTP_MAILER_FLAGS',, `define(`SMTP_MAILER_FLAGS', `')') -ifdef(`SMTP_MAILER_ARGS',, `define(`SMTP_MAILER_ARGS', `IPC $h')') -ifdef(`ESMTP_MAILER_ARGS',, `define(`ESMTP_MAILER_ARGS', `IPC $h')') -ifdef(`SMTP8_MAILER_ARGS',, `define(`SMTP8_MAILER_ARGS', `IPC $h')') -ifdef(`RELAY_MAILER_ARGS',, `define(`RELAY_MAILER_ARGS', `IPC $h')') -ifdef(`_MAILER_uucp_', - `errprint(`*** MAILER(smtp) must appear before MAILER(uucp)')')dnl -POPDIVERT -##################################### -### SMTP Mailer specification ### -##################################### - -VERSIONID(`@(#)smtp.m4 8.38 (Berkeley) 5/19/1998') - -Msmtp, P=[IPC], F=CONCAT(mDFMuX, SMTP_MAILER_FLAGS), S=11/31, R=ifdef(`_ALL_MASQUERADE_', `21/31', `21'), E=\r\n, L=990, - _OPTINS(`SMTP_MAILER_MAX', `M=', `, ')_OPTINS(`SMTP_MAILER_CHARSET', `C=', `, ')T=DNS/RFC822/SMTP, - A=SMTP_MAILER_ARGS -Mesmtp, P=[IPC], F=CONCAT(mDFMuXa, SMTP_MAILER_FLAGS), S=11/31, R=ifdef(`_ALL_MASQUERADE_', `21/31', `21'), E=\r\n, L=990, - _OPTINS(`SMTP_MAILER_MAX', `M=', `, ')_OPTINS(`SMTP_MAILER_CHARSET', `C=', `, ')T=DNS/RFC822/SMTP, - A=ESMTP_MAILER_ARGS -Msmtp8, P=[IPC], F=CONCAT(mDFMuX8, SMTP_MAILER_FLAGS), S=11/31, R=ifdef(`_ALL_MASQUERADE_', `21/31', `21'), E=\r\n, L=990, - _OPTINS(`SMTP_MAILER_MAX', `M=', `, ')_OPTINS(`SMTP_MAILER_CHARSET', `C=', `, ')T=DNS/RFC822/SMTP, - A=SMTP8_MAILER_ARGS -Mrelay, P=[IPC], F=CONCAT(mDFMuXa8, SMTP_MAILER_FLAGS), S=11/31, R=ifdef(`_ALL_MASQUERADE_', `61/71', `61'), E=\r\n, L=2040, - _OPTINS(`RELAY_MAILER_CHARSET', `C=', `, ')T=DNS/RFC822/SMTP, - A=RELAY_MAILER_ARGS - -# -# envelope sender rewriting -# -S11 -R$+ $: $>51 $1 sender/recipient common -R$* :; <@> $@ list:; special case -R$* $: $>61 $1 qualify unqual'ed names -R$+ $: $>94 $1 do masquerading - - -# -# envelope recipient rewriting -- -# also header recipient if not masquerading recipients -# -S21 -R$+ $: $>51 $1 sender/recipient common -R$+ $: $>61 $1 qualify unqual'ed names - - -# -# header sender and masquerading header recipient rewriting -# -S31 -R$+ $: $>51 $1 sender/recipient common -R:; <@> $@ list:; special case - -# do special header rewriting -R$* <@> $* $@ $1 <@> $2 pass null host through -R< @ $* > $* $@ < @ $1 > $2 pass route-addr through -R$* $: $>61 $1 qualify unqual'ed names -R$+ $: $>93 $1 do masquerading - - -# -# convert pseudo-domain addresses to real domain addresses -# -S51 - -# pass <route-addr>s through -R< @ $+ > $* $@ < @ $1 > $2 resolve <route-addr> - -# output fake domains as user%fake@relay -ifdef(`BITNET_RELAY', -`R$+ <@ $+ .BITNET. > $: $1 % $2 .BITNET < @ $B > user@host.BITNET -R$+.BITNET <@ $+:$+ > $: $1 .BITNET < @ $3 > strip mailer: part', - `dnl') -ifdef(`_NO_UUCP_', `dnl', ` -# do UUCP heuristics; note that these are shared with UUCP mailers -R$+ < @ $+ .UUCP. > $: < $2 ! > $1 convert to UUCP form -R$+ < @ $* > $* $@ $1 < @ $2 > $3 not UUCP form - -# leave these in .UUCP form to avoid further tampering -R< $&h ! > $- ! $+ $@ $2 < @ $1 .UUCP. > -R< $&h ! > $-.$+ ! $+ $@ $3 < @ $1.$2 > -R< $&h ! > $+ $@ $1 < @ $&h .UUCP. > -R< $+ ! > $+ $: $1 ! $2 < @ $Y > use UUCP_RELAY -R$+ < @ $+ : $+ > $@ $1 < @ $3 > strip mailer: part -R$+ < @ > $: $1 < @ *LOCAL* > if no UUCP_RELAY') - - -# -# common sender and masquerading recipient rewriting -# -S61 - -R$* < @ $* > $* $@ $1 < @ $2 > $3 already fully qualified -R$+ $@ $1 < @ *LOCAL* > add local qualification - - -# -# relay mailer header masquerading recipient rewriting -# -S71 - -R$+ $: $>61 $1 -R$+ $: $>93 $1 diff --git a/cf/mailer/usenet.m4 b/cf/mailer/usenet.m4 deleted file mode 100644 index 1535751..0000000 --- a/cf/mailer/usenet.m4 +++ /dev/null @@ -1,26 +0,0 @@ -PUSHDIVERT(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -ifdef(`USENET_MAILER_PATH',, `define(`USENET_MAILER_PATH', /usr/lib/news/inews)') -ifdef(`USENET_MAILER_FLAGS',, `define(`USENET_MAILER_FLAGS', `rlsDFMmn')') -ifdef(`USENET_MAILER_ARGS',, `define(`USENET_MAILER_ARGS', `inews -m -h -n')') -POPDIVERT -#################################### -### USENET Mailer specification ### -#################################### - -VERSIONID(`@(#)usenet.m4 8.10 (Berkeley) 5/19/1998') - -Musenet, P=USENET_MAILER_PATH, F=USENET_MAILER_FLAGS, S=10, R=20, - _OPTINS(`USENET_MAILER_MAX', `M=', `, ')T=X-Usenet/X-Usenet/X-Unix, - A=USENET_MAILER_ARGS $u diff --git a/cf/mailer/uucp.m4 b/cf/mailer/uucp.m4 deleted file mode 100644 index badd307..0000000 --- a/cf/mailer/uucp.m4 +++ /dev/null @@ -1,152 +0,0 @@ -PUSHDIVERT(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -ifdef(`UUCP_MAILER_PATH',, `define(`UUCP_MAILER_PATH', /usr/bin/uux)') -ifdef(`UUCP_MAILER_ARGS',, `define(`UUCP_MAILER_ARGS', `uux - -r -a$g -gC $h!rmail ($u)')') -ifdef(`UUCP_MAILER_FLAGS',, `define(`UUCP_MAILER_FLAGS', `')') -ifdef(`UUCP_MAILER_MAX',, - `define(`UUCP_MAILER_MAX', - `ifdef(`UUCP_MAX_SIZE', `UUCP_MAX_SIZE', 100000)')') -POPDIVERT -##################################### -### UUCP Mailer specification ### -##################################### - -VERSIONID(`@(#)uucp.m4 8.30 (Berkeley) 5/19/1998') - -# -# There are innumerable variations on the UUCP mailer. It really -# is rather absurd. -# - -# old UUCP mailer (two names) -Muucp, P=UUCP_MAILER_PATH, F=CONCAT(DFMhuUd, UUCP_MAILER_FLAGS), S=12, R=22/42, M=UUCP_MAILER_MAX, - _OPTINS(`UUCP_MAILER_CHARSET', `C=', `, ')T=X-UUCP/X-UUCP/X-Unix, - A=UUCP_MAILER_ARGS -Muucp-old, P=UUCP_MAILER_PATH, F=CONCAT(DFMhuUd, UUCP_MAILER_FLAGS), S=12, R=22/42, M=UUCP_MAILER_MAX, - _OPTINS(`UUCP_MAILER_CHARSET', `C=', `, ')T=X-UUCP/X-UUCP/X-Unix, - A=UUCP_MAILER_ARGS - -# smart UUCP mailer (handles multiple addresses) (two names) -Msuucp, P=UUCP_MAILER_PATH, F=CONCAT(mDFMhuUd, UUCP_MAILER_FLAGS), S=12, R=22/42, M=UUCP_MAILER_MAX, - _OPTINS(`UUCP_MAILER_CHARSET', `C=', `, ')T=X-UUCP/X-UUCP/X-Unix, - A=UUCP_MAILER_ARGS -Muucp-new, P=UUCP_MAILER_PATH, F=CONCAT(mDFMhuUd, UUCP_MAILER_FLAGS), S=12, R=22/42, M=UUCP_MAILER_MAX, - _OPTINS(`UUCP_MAILER_CHARSET', `C=', `, ')T=X-UUCP/X-UUCP/X-Unix, - A=UUCP_MAILER_ARGS - -ifdef(`_MAILER_smtp_', -`# domain-ized UUCP mailer -Muucp-dom, P=UUCP_MAILER_PATH, F=CONCAT(mDFMhud, UUCP_MAILER_FLAGS), S=52/31, R=ifdef(`_ALL_MASQUERADE_', `21/31', `21'), M=UUCP_MAILER_MAX, - _OPTINS(`UUCP_MAILER_CHARSET', `C=', `, ')T=X-UUCP/X-UUCP/X-Unix, - A=UUCP_MAILER_ARGS - -# domain-ized UUCP mailer with UUCP-style sender envelope -Muucp-uudom, P=UUCP_MAILER_PATH, F=CONCAT(mDFMhud, UUCP_MAILER_FLAGS), S=72/31, R=ifdef(`_ALL_MASQUERADE_', `21/31', `21'), M=UUCP_MAILER_MAX, - _OPTINS(`UUCP_MAILER_CHARSET', `C=', `, ')T=X-UUCP/X-UUCP/X-Unix, - A=UUCP_MAILER_ARGS') - - -# -# envelope and header sender rewriting -# -S12 - -# handle error address as a special case -R<@> $n errors to mailer-daemon - -# list:; syntax should disappear -R:; <@> $@ - -R$* < @ $* . > $* $1 < @ $2 > $3 strip trailing dots -R$* < @ $=w > $1 strip local name -R<@ $- . UUCP > : $+ $1 ! $2 convert to UUCP format -R<@ $+ > : $+ $1 ! $2 convert to UUCP format -R$* < @ $- . UUCP > $2 ! $1 convert to UUCP format -R$* < @ $+ > $2 ! $1 convert to UUCP format -R$&h ! $+ ! $+ $@ $1 ! $2 $h!...!user => ...!user -R$&h ! $+ $@ $&h ! $1 $h!user => $h!user -R$+ $: $U ! $1 prepend our name -R! $+ $: $k ! $1 in case $U undefined - -# -# envelope recipient rewriting -# -S22 - -# list:; should disappear -R:; <@> $@ - -R$* < @ $* . > $* $1 < @ $2 > $3 strip trailing dots -R$* < @ $=w > $1 strip local name -R<@ $- . UUCP > : $+ $1 ! $2 convert to UUCP format -R<@ $+ > : $+ $1 ! $2 convert to UUCP format -R$* < @ $- . UUCP > $2 ! $1 convert to UUCP format -R$* < @ $+ > $2 ! $1 convert to UUCP format - -# -# header recipient rewriting -# -S42 - -# list:; syntax should disappear -R:; <@> $@ - -R$* < @ $* . > $* $1 < @ $2 > $3 strip trailing dots -R$* < @ $=w > $1 strip local name -R<@ $- . UUCP > : $+ $1 ! $2 convert to UUCP format -R<@ $+ > : $+ $1 ! $2 convert to UUCP format -R$* < @ $- . UUCP > $2 ! $1 convert to UUCP format -R$* < @ $+ > $2 ! $1 convert to UUCP format -R$&h ! $+ ! $+ $@ $1 ! $2 $h!...!user => ...!user -R$&h ! $+ $@ $&h ! $1 $h!user => $h!user -R$+ $: $U ! $1 prepend our name -R! $+ $: $k ! $1 in case $U undefined - - -ifdef(`_MAILER_smtp_', -`# -# envelope sender rewriting for uucp-dom mailer -# -S52 - -# handle error address as a special case -R<@> $n errors to mailer-daemon - -# pass everything to standard SMTP mailer rewriting -R$* $@ $>11 $1 - -# -# envelope sender rewriting for uucp-uudom mailer -# -S72 - -# handle error address as a special case -R<@> $n errors to mailer-daemon - -# do standard SMTP mailer rewriting -R$* $: $>11 $1 - -R$* < @ $* . > $* $1 < @ $2 > $3 strip trailing dots -R<@ $- . UUCP > : $+ $@ $1 ! $2 convert to UUCP format -R<@ $+ > : $+ $@ $1 ! $2 convert to UUCP format -R$* < @ $- . UUCP > $@ $2 ! $1 convert to UUCP format -R$* < @ $+ > $@ $2 ! $1 convert to UUCP format') - - -PUSHDIVERT(4) -# resolve locally connected UUCP links -R$* < @ $=Z . UUCP. > $* $#uucp-uudom $@ $2 $: $1 < @ $2 .UUCP. > $3 -R$* < @ $=Y . UUCP. > $* $#uucp-new $@ $2 $: $1 < @ $2 .UUCP. > $3 -R$* < @ $=U . UUCP. > $* $#uucp-old $@ $2 $: $1 < @ $2 .UUCP. > $3 -POPDIVERT diff --git a/cf/ostype/aix2.m4 b/cf/ostype/aix2.m4 deleted file mode 100644 index 2bda79c..0000000 --- a/cf/ostype/aix2.m4 +++ /dev/null @@ -1,20 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1995 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)aix2.m4 8.8 (Berkeley) 5/19/1998') -define(`LOCAL_MAILER_PATH', /bin/bellmail)dnl -define(`LOCAL_MAILER_ARGS', mail $u)dnl -define(`LOCAL_MAILER_FLAGS', `mn9')dnl -define(`confEBINDIR', `/usr/lib')dnl -define(`confTIME_ZONE', `USE_TZ')dnl diff --git a/cf/ostype/aix3.m4 b/cf/ostype/aix3.m4 deleted file mode 100644 index fb74d9e..0000000 --- a/cf/ostype/aix3.m4 +++ /dev/null @@ -1,20 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)aix3.m4 8.12 (Berkeley) 5/19/1998') -ifdef(`LOCAL_MAILER_PATH',, `define(`LOCAL_MAILER_PATH', /bin/bellmail)')dnl -ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', mail $u)')dnl -ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', `mn9')')dnl -define(`confEBINDIR', `/usr/lib')dnl -define(`confTIME_ZONE', `USE_TZ')dnl diff --git a/cf/ostype/aix4.m4 b/cf/ostype/aix4.m4 deleted file mode 100644 index 24ff001..0000000 --- a/cf/ostype/aix4.m4 +++ /dev/null @@ -1,20 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1996 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)aix4.m4 8.7 (Berkeley) 5/19/1998') -ifdef(`LOCAL_MAILER_PATH',, `define(`LOCAL_MAILER_PATH', /bin/bellmail)')dnl -ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', mail -F $g $u)')dnl -ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', `mn9')')dnl -define(`confEBINDIR', `/usr/lib')dnl -define(`confTIME_ZONE', `USE_TZ')dnl diff --git a/cf/ostype/altos.m4 b/cf/ostype/altos.m4 deleted file mode 100644 index 4dcefa9..0000000 --- a/cf/ostype/altos.m4 +++ /dev/null @@ -1,28 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1996 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# Contributed by Tim Rice <tim@trr.metro.NET>. -# - -divert(0) -VERSIONID(`@(#)altos.m4 8.10 (Berkeley) 10/6/1998') - -define(`ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/aliases', `/usr/lib/mail/aliases'))dnl -ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /usr/spool/mqueue)')dnl -ifdef(`STATUS_FILE',, `define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/usr/lib/sendmail.st'))')dnl -ifdef(`UUCP_MAILER_PATH',, `define(`UUCP_MAILER_PATH', /usr/bin/uux)')dnl -ifdef(`LOCAL_MAILER_PATH',, `define(`LOCAL_MAILER_PATH', /usr/bin/lmail)')dnl -ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', mPuhCE9)')dnl -ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', `lmail $u')')dnl -ifdef(`LOCAL_SHELL_FLAGS',, `define(`LOCAL_SHELL_FLAGS', Peu)')dnl -ifdef(`UUCP_MAILER_ARGS',, `define(`UUCP_MAILER_ARGS', `uux - -r -a$g $h!rmail ($u)')')dnl -define(`confEBINDIR', `/usr/lib')dnl diff --git a/cf/ostype/amdahl-uts.m4 b/cf/ostype/amdahl-uts.m4 deleted file mode 100644 index 84d47cd..0000000 --- a/cf/ostype/amdahl-uts.m4 +++ /dev/null @@ -1,23 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)amdahl-uts.m4 8.11 (Berkeley) 10/6/1998') -divert(-1) - -define(`ALIAS_FILE', /etc/mail/aliases) -ifdef(`HELP_FILE',, `define(`HELP_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/helpfile', `/etc/mail/sendmail.hf'))') -ifdef(`STATUS_FILE',, `define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/usr/lib/sendmail.st'))') -ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', `fSn9')') -define(`confCW_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/local-host-names', `/etc/mail/sendmail.cw')) -define(`confEBINDIR', `/usr/lib')dnl diff --git a/cf/ostype/aux.m4 b/cf/ostype/aux.m4 deleted file mode 100644 index 8038cb5..0000000 --- a/cf/ostype/aux.m4 +++ /dev/null @@ -1,22 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)aux.m4 8.11 (Berkeley) 10/6/1998') -define(`ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/aliases', `/usr/lib/aliases'))dnl -ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /usr/spool/mqueue)')dnl -ifdef(`STATUS_FILE',, `define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/usr/lib/sendmail.st'))')dnl -ifdef(`UUCP_MAILER_PATH',, `define(`UUCP_MAILER_PATH', /usr/bin/uux)')dnl -ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', mn9)')dnl -ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', `mail -d -r $f $u')')dnl -define(`confEBINDIR', `/usr/lib')dnl diff --git a/cf/ostype/bsd4.3.m4 b/cf/ostype/bsd4.3.m4 deleted file mode 100644 index d0f3f8a..0000000 --- a/cf/ostype/bsd4.3.m4 +++ /dev/null @@ -1,17 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)bsd4.3.m4 8.9 (Berkeley) 5/19/1998') -ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /usr/spool/mqueue)')dnl -ifdef(`UUCP_MAILER_ARGS',, `define(`UUCP_MAILER_ARGS', `uux - -r -z -a$g $h!rmail ($u)')')dnl diff --git a/cf/ostype/bsd4.4.m4 b/cf/ostype/bsd4.4.m4 deleted file mode 100644 index 514bce8..0000000 --- a/cf/ostype/bsd4.4.m4 +++ /dev/null @@ -1,20 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# - -divert(0) -VERSIONID(`@(#)bsd4.4.m4 8.10 (Berkeley) 10/6/1998') -ifdef(`HELP_FILE',, `define(`HELP_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/helpfile', `/usr/share/misc/sendmail.hf'))')dnl -ifdef(`STATUS_FILE',, `define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/var/log/sendmail.st'))')dnl -ifdef(`LOCAL_MAILER_PATH',, `define(`LOCAL_MAILER_PATH', /usr/libexec/mail.local)')dnl -ifdef(`UUCP_MAILER_ARGS',, `define(`UUCP_MAILER_ARGS', `uux - -r -z -a$g $h!rmail ($u)')')dnl diff --git a/cf/ostype/bsdi1.0.m4 b/cf/ostype/bsdi1.0.m4 deleted file mode 100644 index 08bd2a5..0000000 --- a/cf/ostype/bsdi1.0.m4 +++ /dev/null @@ -1,16 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)bsdi1.0.m4 8.7 (Berkeley) 5/19/1998')dnl -include(_CF_DIR_`'ostype/bsd4.4.m4)dnl diff --git a/cf/ostype/bsdi2.0.m4 b/cf/ostype/bsdi2.0.m4 deleted file mode 100644 index 6883eb0..0000000 --- a/cf/ostype/bsdi2.0.m4 +++ /dev/null @@ -1,16 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)bsdi2.0.m4 8.6 (Berkeley) 5/19/1998')dnl -include(_CF_DIR_`'ostype/bsd4.4.m4)dnl diff --git a/cf/ostype/dgux.m4 b/cf/ostype/dgux.m4 deleted file mode 100644 index 2f25cd8..0000000 --- a/cf/ostype/dgux.m4 +++ /dev/null @@ -1,20 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)dgux.m4 8.10 (Berkeley) 5/19/1998') -ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', m9)')dnl -define(`confTIME_ZONE', `USE_TZ')dnl -define(`confEBINDIR', `/usr/lib')dnl -LOCAL_CONFIG -E_FORCE_MAIL_LOCAL_=yes diff --git a/cf/ostype/domainos.m4 b/cf/ostype/domainos.m4 deleted file mode 100644 index 9f4ea92..0000000 --- a/cf/ostype/domainos.m4 +++ /dev/null @@ -1,21 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)domainos.m4 8.10 (Berkeley) 10/6/1998') -divert(-1) - -define(`ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/aliases', `/usr/lib/aliases')) -ifdef(`STATUS_FILE',, `define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/usr/lib/sendmail.st'))') -ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /usr/spool/mqueue)') -define(`confEBINDIR', `/usr/lib')dnl diff --git a/cf/ostype/dynix3.2.m4 b/cf/ostype/dynix3.2.m4 deleted file mode 100644 index 3836446..0000000 --- a/cf/ostype/dynix3.2.m4 +++ /dev/null @@ -1,18 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)dynix3.2.m4 8.10 (Berkeley) 10/6/1998') -define(`ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/aliases', `/usr/lib/aliases'))dnl -ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /usr/spool/mqueue)')dnl -define(`confEBINDIR', `/usr/lib')dnl diff --git a/cf/ostype/gnuhurd.m4 b/cf/ostype/gnuhurd.m4 deleted file mode 100644 index a8ed667..0000000 --- a/cf/ostype/gnuhurd.m4 +++ /dev/null @@ -1,20 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1997 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# - -divert(0) -VERSIONID(`@(#)gnuhurd.m4 8.8 (Berkeley) 10/6/1998') -ifdef(`HELP_FILE',, `define(`HELP_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/helpfile', `/share/misc/sendmail.hf'))')dnl -ifdef(`STATUS_FILE',, `define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/var/log/sendmail.st'))')dnl -ifdef(`LOCAL_MAILER_PATH',, `define(`LOCAL_MAILER_PATH', /libexec/mail.local)')dnl -define(`confEBINDIR', `/libexec')dnl diff --git a/cf/ostype/hpux10.m4 b/cf/ostype/hpux10.m4 deleted file mode 100644 index d349b54..0000000 --- a/cf/ostype/hpux10.m4 +++ /dev/null @@ -1,29 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)hpux10.m4 8.14 (Berkeley) 10/6/1998') - -ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /var/spool/mqueue)')dnl -define(`ALIAS_FILE', /etc/mail/aliases)dnl -ifdef(`STATUS_FILE',, `define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/etc/mail/sendmail.st'))')dnl -ifdef(`HELP_FILE',, `define(`HELP_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/helpfile', `/usr/share/lib/sendmail.hf'))')dnl -ifdef(`LOCAL_MAILER_PATH',, `define(`LOCAL_MAILER_PATH', /usr/bin/rmail)')dnl -ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', `m9')')dnl -ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', `rmail -d $u')')dnl -ifdef(`LOCAL_SHELL_PATH',, `define(`LOCAL_SHELL_PATH', /usr/bin/sh)')dnl -ifdef(`UUCP_MAILER_ARGS',, `define(`UUCP_MAILER_ARGS', `uux - -r -a$g -gC $h!rmail ($u)')')dnl -define(`confTIME_ZONE', `USE_TZ')dnl -dnl -dnl For maximum compability with HP-UX, use: -dnl define(`confME_TOO', True)dnl diff --git a/cf/ostype/hpux9.m4 b/cf/ostype/hpux9.m4 deleted file mode 100644 index 55f1b97..0000000 --- a/cf/ostype/hpux9.m4 +++ /dev/null @@ -1,28 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)hpux9.m4 8.19 (Berkeley) 10/6/1998') - -ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /usr/spool/mqueue)')dnl -define(`ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/aliases', `/usr/lib/aliases'))dnl -ifdef(`STATUS_FILE',, `define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/usr/lib/sendmail.st'))')dnl -ifdef(`LOCAL_MAILER_PATH',, `define(`LOCAL_MAILER_PATH', `/bin/rmail')')dnl -ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', `m9')')dnl -ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', `rmail -d $u')')dnl -ifdef(`UUCP_MAILER_ARGS',, `define(`UUCP_MAILER_ARGS', `uux - -r -a$g -gC $h!rmail ($u)')')dnl -define(`confTIME_ZONE', `USE_TZ')dnl -define(`confEBINDIR', `/usr/lib')dnl -dnl -dnl For maximum compability with HP-UX, use: -dnl define(`confME_TOO', True)dnl diff --git a/cf/ostype/irix4.m4 b/cf/ostype/irix4.m4 deleted file mode 100644 index aea6e9e..0000000 --- a/cf/ostype/irix4.m4 +++ /dev/null @@ -1,20 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)irix4.m4 8.14 (Berkeley) 10/6/1998') -ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', Ehm9)')dnl -ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /usr/spool/mqueue)')dnl -define(`ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/aliases', `/usr/lib/aliases'))dnl -ifdef(`STATUS_FILE',, `define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/usr/lib/sendmail.st'))')dnl -define(`confEBINDIR', `/usr/lib')dnl diff --git a/cf/ostype/irix5.m4 b/cf/ostype/irix5.m4 deleted file mode 100644 index 426f002..0000000 --- a/cf/ostype/irix5.m4 +++ /dev/null @@ -1,40 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1995 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# Contributed by Kari E. Hurtta <Kari.Hurtta@dionysos.fmi.fi> -# - -# -# Notes: -# - SGI's /etc/sendmail.cf defines also 'u' for local mailer flags -- you -# perhaps don't want it. -# - Perhaps is should also add define(`LOCAL_MAILER_CHARSET', iso-8859-1) -# put some Asian sites may prefer otherwise -- or perhaps not. -# - SGI's /etc/sendmail.cf seems use: A=mail -s -d $u -# It seems work without that -s however. -# - SGI's /etc/sendmail.cf set's default uid and gid to 998 (guest) -# - In SGI seems that TZ variable is needed that correct time is marked to -# syslog -# - helpfile is in /etc/sendmail.hf in SGI's /etc/sendmail.cf -# - -divert(0) -VERSIONID(`@(#)irix5.m4 8.11 (Berkeley) 10/6/1998') -ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', Ehmu9)')dnl -ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', `mail -s -d $u')')dnl -ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /var/spool/mqueue)')dnl -define(`ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/aliases', `/etc/aliases'))dnl -ifdef(`STATUS_FILE',, `define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/var/sendmail.st'))')dnl -ifdef(`HELP_FILE',, `define(`HELP_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/helpfile', `/etc/sendmail.hf'))')dnl -define(`confDEF_USER_ID', `998:998')dnl -define(`confTIME_ZONE', USE_TZ)dnl -define(`confEBINDIR', `/usr/lib')dnl diff --git a/cf/ostype/irix6.m4 b/cf/ostype/irix6.m4 deleted file mode 100644 index d419202..0000000 --- a/cf/ostype/irix6.m4 +++ /dev/null @@ -1,40 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1995 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# Contributed by Kari E. Hurtta <Kari.Hurtta@dionysos.fmi.fi> -# - -# -# Notes: -# - SGI's /etc/sendmail.cf defines also 'u' for local mailer flags -- you -# perhaps don't want it. -# - Perhaps is should also add define(`LOCAL_MAILER_CHARSET', iso-8859-1) -# put some Asian sites may prefer otherwise -- or perhaps not. -# - SGI's /etc/sendmail.cf seems use: A=mail -s -d $u -# It seems work without that -s however. -# - SGI's /etc/sendmail.cf set's default uid and gid to 998 (guest) -# - In SGI seems that TZ variable is needed that correct time is marked to -# syslog -# - helpfile is in /etc/sendmail.hf in SGI's /etc/sendmail.cf -# - -divert(0) -VERSIONID(`@(#)irix6.m4 8.8 (Berkeley) 10/6/1998') -ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', Ehmu9)')dnl -ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', `mail -s -d $u')')dnl -ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /var/spool/mqueue)')dnl -define(`ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/aliases', `/etc/aliases'))dnl -ifdef(`STATUS_FILE',, `define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/var/sendmail.st'))')dnl -ifdef(`HELP_FILE',, `define(`HELP_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/helpfile', `/etc/sendmail.hf'))')dnl -define(`confDEF_USER_ID', `998:998')dnl -define(`confTIME_ZONE', USE_TZ)dnl -define(`confEBINDIR', `/usr/lib')dnl diff --git a/cf/ostype/isc4.1.m4 b/cf/ostype/isc4.1.m4 deleted file mode 100644 index 629835b..0000000 --- a/cf/ostype/isc4.1.m4 +++ /dev/null @@ -1,27 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# - -divert(0) -VERSIONID(`@(#)isc4.1.m4 8.11 (Berkeley) 10/6/1998') -define(`ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/aliases', `/usr/lib/aliases'))dnl -ifdef(`HELP_FILE',, `define(`HELP_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/helpfile', `/usr/lib/sendmail.hf'))')dnl -ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', `lmail -s $u')')dnl -ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', `humS9')')dnl -ifdef(`LOCAL_MAILER_PATH',, `define(`LOCAL_MAILER_PATH', /bin/lmail)')dnl -ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /usr/spool/mqueue)')dnl -ifdef(`STATUS_FILE',, `define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/usr/lib/sendmail.st'))')dnl -ifdef(`UUCP_MAILER_ARGS',, `define(`UUCP_MAILER_ARGS', `uux - -r -gC $h!rmail ($u)')')dnl -ifdef(`UUCP_MAILER_PATH',, `define(`UUCP_MAILER_PATH', /usr/bin/uux)')dnl -define(`confTIME_ZONE', `USE_TZ')dnl -define(`confEBINDIR', `/usr/lib')dnl diff --git a/cf/ostype/linux.m4 b/cf/ostype/linux.m4 deleted file mode 100644 index e1f7a92..0000000 --- a/cf/ostype/linux.m4 +++ /dev/null @@ -1,16 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)linux.m4 8.7 (Berkeley) 5/19/1998') -define(`LOCAL_MAILER_PATH', /bin/mail.local)dnl diff --git a/cf/ostype/maxion.m4 b/cf/ostype/maxion.m4 deleted file mode 100644 index a8ecfd0..0000000 --- a/cf/ostype/maxion.m4 +++ /dev/null @@ -1,30 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1996 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# Concurrent Computer Corporation Maxion system support contributed -# by Donald R. Laster Jr. <Laster@access.digex.com>. -# - -divert(0) -VERSIONID(`@(#)maxion.m4 8.11 (Berkeley) 10/6/1998') - -define(`ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/aliases', `/etc/ucbmail/aliases'))dnl -define(`HELP_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/helpfile', `/etc/ucbmail/sendmail.hf'))dnl -define(`QUEUE_DIR', `/var/spool/mqueue')dnl -define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/var/adm/log/sendmail.st'))dnl -define(`LOCAL_MAILER_PATH', `/usr/bin/mail')dnl -define(`LOCAL_MAILER_FLAGS',`rmn9')dnl -define(`LOCAL_SHELL_FLAGS', `ehuP')dnl -define(`LOCAL_MAILER_ARGS', `mail $u')dnl -define(`UUCP_MAILER_ARGS', `uux - -r -a$g -gmedium $h!rmail ($u)')dnl -define(`confEBINDIR', `/usr/ucblib')dnl -divert(-1) diff --git a/cf/ostype/mklinux.m4 b/cf/ostype/mklinux.m4 deleted file mode 100644 index abcdbae..0000000 --- a/cf/ostype/mklinux.m4 +++ /dev/null @@ -1,22 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# MkLinux support contributed by Paul DuBois <dubois@primate.wisc.edu> -# - -divert(0) -VERSIONID(`@(#)mklinux.m4 8.8 (Berkeley) 10/6/1998') -ifdef(`STATUS_FILE',, - `define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/var/log/sendmail.st'))') -ifdef(`PROCMAIL_MAILER_PATH',, - define(`PROCMAIL_MAILER_PATH', `/usr/bin/procmail')) -FEATURE(local_procmail) diff --git a/cf/ostype/nextstep.m4 b/cf/ostype/nextstep.m4 deleted file mode 100644 index ebe6957..0000000 --- a/cf/ostype/nextstep.m4 +++ /dev/null @@ -1,24 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)nextstep.m4 8.15 (Berkeley) 10/6/1998') -define(`ALIAS_FILE', /etc/sendmail/aliases)dnl -define(`confCW_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/local-host-names', `/etc/sendmail/sendmail.cw'))dnl -ifdef(`HELP_FILE',, `define(`HELP_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/helpfile', `/usr/lib/sendmail.hf'))')dnl -ifdef(`STATUS_FILE',, `define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/etc/sendmail/sendmail.st'))')dnl -ifdef(`UUCP_MAILER_PATH',, `define(`UUCP_MAILER_PATH', /usr/bin/uux)')dnl -ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /usr/spool/mqueue)')dnl -ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', `rmnP9')')dnl -ifdef(`LOCAL_SHELL_FLAGS',, `define(`LOCAL_SHELL_FLAGS', `euP')')dnl -define(`confEBINDIR', `/usr/lib')dnl diff --git a/cf/ostype/osf1.m4 b/cf/ostype/osf1.m4 deleted file mode 100644 index 7fcf1cf..0000000 --- a/cf/ostype/osf1.m4 +++ /dev/null @@ -1,19 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)osf1.m4 8.11 (Berkeley) 10/6/1998') -define(`ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/aliases', `/usr/adm/sendmail/aliases'))dnl -ifdef(`STATUS_FILE',, `define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/usr/adm/sendmail/sendmail.st'))')dnl -ifdef(`HELP_FILE',, `define(`HELP_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/helpfile', `/usr/share/lib/sendmail.hf'))')dnl -define(`confDEF_USER_ID', `daemon') diff --git a/cf/ostype/powerux.m4 b/cf/ostype/powerux.m4 deleted file mode 100644 index 068bd8e..0000000 --- a/cf/ostype/powerux.m4 +++ /dev/null @@ -1,25 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)powerux.m4 8.8 (Berkeley) 10/6/1998') - -define(`ALIAS_FILE', /etc/mail/aliases)dnl -ifdef(`HELP_FILE',,`define(`HELP_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/helpfile', `/etc/mail/sendmail.hf'))')dnl -ifdef(`STATUS_FILE',,`define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/etc/mail/sendmail.st'))')dnl -define(`LOCAL_MAILER_PATH', `/usr/bin/rmail')dnl -define(`LOCAL_MAILER_FLAGS', `mn9')dnl -define(`LOCAL_MAILER_ARGS', `rmail $u')dnl -define(`LOCAL_SHELL_FLAGS', `ehuP')dnl -define(`UUCP_MAILER_ARGS', `uux - -r -a$g -gmedium $h!rmail ($u)')dnl -define(`confEBINDIR', `/usr/local/lib')dnl diff --git a/cf/ostype/ptx2.m4 b/cf/ostype/ptx2.m4 deleted file mode 100644 index d564ead..0000000 --- a/cf/ostype/ptx2.m4 +++ /dev/null @@ -1,25 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1994 Eric P. Allman. All rights reserved. -# Copyright (c) 1994 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -# Support for DYNIX/ptx 2.x. - -divert(0) -VERSIONID(`@(#)ptx2.m4 8.12 (Berkeley) 10/6/1998') -ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /usr/spool/mqueue)')dnl -define(`ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/aliases', `/usr/lib/aliases'))dnl -ifdef(`HELP_FILE',,`define(`HELP_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/helpfile', `/usr/lib/sendmail.hf'))')dnl -ifdef(`STATUS_FILE',,`define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/usr/lib/sendmail.st'))')dnl -define(`LOCAL_MAILER_PATH', `/bin/mail')dnl -define(`LOCAL_MAILER_FLAGS', `fmn9')dnl -define(`LOCAL_SHELL_FLAGS', `eu')dnl -define(`confEBINDIR', `/usr/lib')dnl diff --git a/cf/ostype/qnx.m4 b/cf/ostype/qnx.m4 deleted file mode 100644 index 91ed669..0000000 --- a/cf/ostype/qnx.m4 +++ /dev/null @@ -1,21 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1997 Eric P. Allman. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# Contributed by Glen McCready <glen@qnx.com> -# - -divert(0) -VERSIONID(`@(#)qnx.m4 8.8 (Berkeley) 10/6/1998') -define(`QUEUE_DIR', /usr/spool/mqueue)dnl -define(`HELP_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/helpfile', `/etc/sendmail.hf'))dnl -define(`LOCAL_MAILER_ARGS', `mail $u')dnl -define(`LOCAL_MAILER_FLAGS', `Sh')dnl -define(`LOCAL_MAILER_PATH', /usr/bin/mailx)dnl -define(`UUCP_MAILER_ARGS', `uux - -r -z -a$f $h!rmail ($u)')dnl diff --git a/cf/ostype/riscos4.5.m4 b/cf/ostype/riscos4.5.m4 deleted file mode 100644 index c44a180..0000000 --- a/cf/ostype/riscos4.5.m4 +++ /dev/null @@ -1,21 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)riscos4.5.m4 8.11 (Berkeley) 10/6/1998') - -ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', `rmail -d $u')')dnl -define(`ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/aliases', `/usr/lib/aliases'))dnl -ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', `/usr/spool/mqueue')')dnl -ifdef(`HELP_FILE',, `define(`HELP_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/helpfile', `/usr/lib/sendmail.hf'))')dnl -define(`confEBINDIR', `/usr/lib')dnl diff --git a/cf/ostype/sco-uw-2.1.m4 b/cf/ostype/sco-uw-2.1.m4 deleted file mode 100644 index 0de9bae..0000000 --- a/cf/ostype/sco-uw-2.1.m4 +++ /dev/null @@ -1,26 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# SCO UnixWare 2.1.2 ostype file -# -# Contributed by Christopher Durham <chrisdu@SCO.COM> of SCO. -# -divert(0) -VERSIONID(`@(#)sco-uw-2.1.m4 8.8 (Berkeley) 1/25/1999') - -define(`ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/aliases', `/usr/lib/mail/aliases'))dnl -ifdef(`HELP_FILE',,`define(`HELP_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/helpfile', `/usr/ucblib/sendmail.hf'))')dnl -ifdef(`STATUS_FILE',,`define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/usr/ucblib/sendmail.st'))')dnl -define(`LOCAL_MAILER_PATH', `/usr/bin/rmail')dnl -define(`LOCAL_MAILER_FLAGS', `fhCEn9')dnl -define(`LOCAL_SHELL_FLAGS', `ehuP')dnl -define(`UUCP_MAILER_ARGS', `uux - -r -a$g -gmedium $h!rmail ($u)')dnl -define(`LOCAL_MAILER_ARGS',`rmail $u')dnl -define(`confEBINDIR', `/usr/lib')dnl -define(`confTIME_ZONE', `USE_TZ')dnl diff --git a/cf/ostype/sco3.2.m4 b/cf/ostype/sco3.2.m4 deleted file mode 100644 index 135fefa..0000000 --- a/cf/ostype/sco3.2.m4 +++ /dev/null @@ -1,24 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)sco3.2.m4 8.11 (Berkeley) 10/6/1998') -define(`ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/aliases', `/usr/lib/mail/aliases'))dnl -ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /usr/spool/mqueue)')dnl -ifdef(`STATUS_FILE',, `define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/usr/lib/sendmail.st'))')dnl -ifdef(`UUCP_MAILER_PATH',, `define(`UUCP_MAILER_PATH', /usr/bin/uux)')dnl -ifdef(`LOCAL_MAILER_PATH',, `define(`LOCAL_MAILER_PATH', /usr/bin/lmail)')dnl -ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', PuhCE9)')dnl -ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', `lmail $u')')dnl -ifdef(`LOCAL_SHELL_FLAGS',, `define(`LOCAL_SHELL_FLAGS', Peu)')dnl -define(`confEBINDIR', `/usr/lib')dnl diff --git a/cf/ostype/sinix.m4 b/cf/ostype/sinix.m4 deleted file mode 100644 index 37d12d4..0000000 --- a/cf/ostype/sinix.m4 +++ /dev/null @@ -1,21 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1996 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)sinix.m4 8.9 (Berkeley) 10/6/1998') -ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /var/spool/mqueue)')dnl -define(`ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/aliases', `/etc/aliases'))dnl -define(`LOCAL_MAILER_PATH', `/bin/mail.local')dnl -ifdef(`STATUS_FILE',, `define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/var/sendmail.st'))')dnl -ifdef(`HELP_FILE',, `define(`HELP_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/helpfile', `/etc/sendmail.hf'))')dnl -define(`confEBINDIR', `/usr/ucblib')dnl diff --git a/cf/ostype/solaris2.m4 b/cf/ostype/solaris2.m4 deleted file mode 100644 index 5a0e2a9..0000000 --- a/cf/ostype/solaris2.m4 +++ /dev/null @@ -1,25 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)solaris2.m4 8.16 (Berkeley) 10/6/1998') -divert(-1) - -define(`ALIAS_FILE', /etc/mail/aliases) -ifdef(`HELP_FILE',, `define(`HELP_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/helpfile', `/etc/mail/sendmail.hf'))') -ifdef(`STATUS_FILE',, `define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/etc/mail/sendmail.st'))') -ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', `SnE9')') -ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', `mail -f $g -d $u')') -ifdef(`UUCP_MAILER_ARGS',, `define(`UUCP_MAILER_ARGS', `uux - -r -a$g $h!rmail ($u)')') -define(`confCW_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/local-host-names', `/etc/mail/sendmail.cw')) -define(`confEBINDIR', `/usr/lib')dnl diff --git a/cf/ostype/solaris2.ml.m4 b/cf/ostype/solaris2.ml.m4 deleted file mode 100644 index f99cebb..0000000 --- a/cf/ostype/solaris2.ml.m4 +++ /dev/null @@ -1,30 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# This ostype file is suitable for use on Solaris 2.x systems that -# have mail.local installed. It is my understanding that this is -# standard as of Solaris 2.5. -# - -divert(0) -VERSIONID(`@(#)solaris2.ml.m4 8.9 (Berkeley) 10/6/1998') -divert(-1) - -define(`ALIAS_FILE', /etc/mail/aliases) -ifdef(`HELP_FILE',, `define(`HELP_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/helpfile', `/etc/mail/sendmail.hf'))') -ifdef(`STATUS_FILE',, `define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/etc/mail/sendmail.st'))') -ifdef(`LOCAL_MAILER_PATH',, `define(`LOCAL_MAILER_PATH', `/usr/lib/mail.local')') -ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', `fSmn9')') -ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', `mail.local -d $u')') -ifdef(`UUCP_MAILER_ARGS',, `define(`UUCP_MAILER_ARGS', `uux - -r -a$g $h!rmail ($u)')') -define(`confCW_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/local-host-names', `/etc/mail/sendmail.cw')) -define(`confEBINDIR', `/usr/lib')dnl diff --git a/cf/ostype/sunos3.5.m4 b/cf/ostype/sunos3.5.m4 deleted file mode 100644 index aeda272..0000000 --- a/cf/ostype/sunos3.5.m4 +++ /dev/null @@ -1,17 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)sunos3.5.m4 8.7 (Berkeley) 5/19/1998') - -define(`confEBINDIR', `/usr/lib')dnl diff --git a/cf/ostype/sunos4.1.m4 b/cf/ostype/sunos4.1.m4 deleted file mode 100644 index 78648da..0000000 --- a/cf/ostype/sunos4.1.m4 +++ /dev/null @@ -1,17 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)sunos4.1.m4 8.7 (Berkeley) 5/19/1998') - -define(`confEBINDIR', `/usr/lib')dnl diff --git a/cf/ostype/svr4.m4 b/cf/ostype/svr4.m4 deleted file mode 100644 index d0de278..0000000 --- a/cf/ostype/svr4.m4 +++ /dev/null @@ -1,24 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)svr4.m4 8.11 (Berkeley) 10/6/1998') - -define(`ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/aliases', `/usr/ucblib/aliases'))dnl -ifdef(`HELP_FILE',,`define(`HELP_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/helpfile', `/usr/ucblib/sendmail.hf'))')dnl -ifdef(`STATUS_FILE',,`define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/usr/ucblib/sendmail.st'))')dnl -define(`LOCAL_MAILER_PATH', `/usr/ucblib/binmail')dnl -define(`LOCAL_MAILER_FLAGS', `rmn9')dnl -define(`LOCAL_SHELL_FLAGS', `ehuP')dnl -define(`UUCP_MAILER_ARGS', `uux - -r -a$g -gmedium $h!rmail ($u)')dnl -define(`confEBINDIR', `/usr/ucblib')dnl diff --git a/cf/ostype/ultrix4.m4 b/cf/ostype/ultrix4.m4 deleted file mode 100644 index d10518a..0000000 --- a/cf/ostype/ultrix4.m4 +++ /dev/null @@ -1,17 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)ultrix4.m4 8.8 (Berkeley) 5/19/1998') - -define(`confEBINDIR', `/usr/lib')dnl diff --git a/cf/ostype/unixware7.m4 b/cf/ostype/unixware7.m4 deleted file mode 100644 index a787307..0000000 --- a/cf/ostype/unixware7.m4 +++ /dev/null @@ -1,17 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)unixware7.m4 8.2 (Berkeley) 1/25/1999') -define(`ALIAS_FILE', `/etc/mail/aliases')dnl -ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /usr/spool/mqueue)')dnl -ifdef(`STATUS_FILE',, `define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/etc/mailer/sendmail.st'))')dnl -define(`confEBINDIR', `/usr/lib')dnl -define(`confTIME_ZONE', `USE_TZ')dnl diff --git a/cf/ostype/unknown.m4 b/cf/ostype/unknown.m4 deleted file mode 100644 index 629c31b..0000000 --- a/cf/ostype/unknown.m4 +++ /dev/null @@ -1,19 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`@(#)unknown.m4 8.6 (Berkeley) 5/19/1998') -errprint(`*** ERROR: You have not specified a valid operating system type.') -errprint(` Use the OSTYPE macro to select a valid system type. This') -errprint(` is necessary in order to get the proper pathnames and flags') -errprint(` appropriate for your environment.') diff --git a/cf/ostype/uxpds.m4 b/cf/ostype/uxpds.m4 deleted file mode 100644 index 0f1d908..0000000 --- a/cf/ostype/uxpds.m4 +++ /dev/null @@ -1,28 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# Definitions for UXP/DS (Fujitsu/ICL DS/90 series) -# Diego R. Lopez, CICA (Seville). 1995 -# - -divert(0) -VERSIONID(`@(#)uxpds.m4 8.10 (Berkeley) 10/6/1998') - -define(`confDEF_GROUP_ID', `6') -define(`ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/aliases', `/usr/ucblib/aliases'))dnl -ifdef(`HELP_FILE',,`define(`HELP_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/helpfile', `/usr/ucblib/sendmail.hf'))')dnl -ifdef(`STATUS_FILE',,`define(`STATUS_FILE', ifdef(`_USE_ETC_MAIL_', `/etc/mail/statistics', `/usr/ucblib/sendmail.st'))')dnl -define(`LOCAL_MAILER_PATH', `/usr/ucblib/binmail')dnl -define(`LOCAL_MAILER_FLAGS', `rmn9')dnl -define(`LOCAL_SHELL_FLAGS', `ehuP')dnl -define(`UUCP_MAILER_ARGS', `uux - -r -a$f -gmedium $h!rmail ($u)')dnl -define(`confEBINDIR', `/usr/ucblib')dnl diff --git a/cf/sh/makeinfo.sh b/cf/sh/makeinfo.sh deleted file mode 100644 index c8621f4..0000000 --- a/cf/sh/makeinfo.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# @(#)makeinfo.sh 8.11 (Berkeley) 5/19/1998 -# - -usewhoami=0 -usehostname=0 -for p in `echo $PATH | sed 's/:/ /g'` -do - if [ "x$p" = "x" ] - then - p="." - fi - if [ -f $p/whoami ] - then - usewhoami=1 - if [ $usehostname -ne 0 ] - then - break; - fi - fi - if [ -f $p/hostname ] - then - usehostname=1 - if [ $usewhoami -ne 0 ] - then - break; - fi - fi -done -if [ $usewhoami -ne 0 ] -then - user=`whoami` -else - user=$LOGNAME -fi - -if [ $usehostname -ne 0 ] -then - host=`hostname` -else - host=`uname -n` -fi -echo '#####' built by $user@$host on `date` -echo '#####' in `pwd` | sed 's/\/tmp_mnt//' -echo '#####' using $1 as configuration include directory | sed 's/\/tmp_mnt//' -echo "define(\`__HOST__', $host)dnl" diff --git a/cf/siteconfig/uucp.cogsci.m4 b/cf/siteconfig/uucp.cogsci.m4 deleted file mode 100644 index 33c7151..0000000 --- a/cf/siteconfig/uucp.cogsci.m4 +++ /dev/null @@ -1,6 +0,0 @@ -SITE(contessa) -SITE(emind) -SITE(hoptoad) -SITE(nkainc) -SITE(well) -SITE(ferdy) diff --git a/cf/siteconfig/uucp.old.arpa.m4 b/cf/siteconfig/uucp.old.arpa.m4 deleted file mode 100644 index 81d5e94..0000000 --- a/cf/siteconfig/uucp.old.arpa.m4 +++ /dev/null @@ -1,4 +0,0 @@ -SITE(endotsew) -SITE(fateman) -SITE(interlan) -SITE(metron) diff --git a/cf/siteconfig/uucp.ucbarpa.m4 b/cf/siteconfig/uucp.ucbarpa.m4 deleted file mode 100644 index 8b13789..0000000 --- a/cf/siteconfig/uucp.ucbarpa.m4 +++ /dev/null @@ -1 +0,0 @@ - diff --git a/cf/siteconfig/uucp.ucbvax.m4 b/cf/siteconfig/uucp.ucbvax.m4 deleted file mode 100644 index ee2c34f..0000000 --- a/cf/siteconfig/uucp.ucbvax.m4 +++ /dev/null @@ -1,73 +0,0 @@ -SITE(Padova) -SITE(Shasta) -SITE(alice) -SITE(allegra) -SITE(amdcad) -SITE(att) -SITE(attunix) -SITE(avsd) -SITE(bellcore bellcor) -SITE(calma) -SITE(cithep) -SITE(cnmat) -SITE(craig) -SITE(craylab) -SITE(decusj) -SITE(decvax, S) -SITE(decwrl) -SITE(dssovax) -SITE(eagle) -SITE(ecovax) -SITE(floyd) -SITE(franz) -SITE(geoff) -SITE(harpo) -SITE(ho3e2) -SITE(hpda) -SITE(hplabs) -SITE(ibmsupt ibmuupa ibmpa) -SITE(iiasa70) -SITE(imagen) -SITE(isunix menlo70) -SITE(kentmth) -SITE(lbl-csam lbl-csa) -SITE(lime) -SITE(mothra) -SITE(mseonyx) -SITE(mtxinu) -SITE(pixar) -SITE(pur-ee) -SITE(purdue) -SITE(pwbd) -SITE(sdcarl) -SITE(sftig) -SITE(sgi olympus) -SITE(sii) -SITE(srivisi) -SITE(ssyx) -SITE(sun) -SITE(trwrb) -SITE(twg) -SITE(ucivax) -SITE(ucla-se) -SITE(ucla-cs) -SITE(ucsbcsl ucsbhub) -SITE(ucscc) -SITE(ucsd) -SITE(ucsfcgl) -SITE(ucsfmis) -SITE(ulysses) -SITE(unisoft) -SITE(unmvax) -SITE(usenix) -SITE(uw) -SITE(uwvax) -SITE(vax135) -SITE(voder) -SITE(wheps) -SITE(whuxle) -SITE(whuxlj) -SITE(xicomp) -SITE(xprin) -SITE(zehntel) -SITE(zilog) diff --git a/contrib/README b/contrib/README deleted file mode 100644 index dcf5c8f..0000000 --- a/contrib/README +++ /dev/null @@ -1,10 +0,0 @@ -Everything in this directory (except this file) has been contributed. -We will not fix bugs in these programs. Contact the original author -for assistance. - -Some of these are patches to sendmail itself. You may need to take -care -- some of the patches may be out of date with the latest release -of sendmail. Also, the previous comment applies -- patches belong to -the original author, not to me. - -Eric Allman, 26 May 1993 diff --git a/contrib/bitdomain.c b/contrib/bitdomain.c deleted file mode 100644 index 52d6d21..0000000 --- a/contrib/bitdomain.c +++ /dev/null @@ -1,409 +0,0 @@ -/* - * By John G. Myers, jgm+@cmu.edu - * Version 1.2 - * - * Process a BITNET "internet.listing" file, producing output - * suitable for input to makemap. - * - * The input file can be obtained via anonymous FTP to bitnic.educom.edu. - * Change directory to "netinfo" and get the file internet.listing - * The file is updated monthly. - * - * Feed the output of this program to "makemap hash /etc/bitdomain.db" - * to create the table used by the "FEATURE(bitdomain)" config file macro. - * If your sendmail does not have the db library compiled in, you can instead - * use "makemap dbm /etc/bitdomain" and - * "FEATURE(bitdomain,`dbm -o /etc/bitdomain')" - * - * The bitdomain table should be rebuilt monthly. - */ - -#include <stdio.h> -#include <errno.h> -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> -#include <netdb.h> -#include <ctype.h> -#include <string.h> - -/* don't use sizeof because sizeof(long) is different on 64-bit machines */ -#define SHORTSIZE 2 /* size of a short (really, must be 2) */ -#define LONGSIZE 4 /* size of a long (really, must be 4) */ - -typedef union -{ - HEADER qb1; - char qb2[PACKETSZ]; -} querybuf; - -extern int h_errno; -extern char *malloc(); -extern char *optarg; -extern int optind; - -char *lookup(); - -main(argc, argv) -int argc; -char **argv; -{ - int opt; - - while ((opt = getopt(argc, argv, "o:")) != EOF) { - switch (opt) { - case 'o': - if (!freopen(optarg, "w", stdout)) { - perror(optarg); - exit(1); - } - break; - - default: - fprintf(stderr, "usage: %s [-o outfile] [internet.listing]\n", - argv[0]); - exit(1); - } - } - - if (optind < argc) { - if (!freopen(argv[optind], "r", stdin)) { - perror(argv[optind]); - exit(1); - } - } - readfile(stdin); - finish(); - exit(0); -} - -/* - * Parse and process an input file - */ -readfile(infile) -FILE *infile; -{ - int skippingheader = 1; - char buf[1024], *node, *hostname, *p; - - while (fgets(buf, sizeof(buf), infile)) { - for (p = buf; *p && isspace(*p); p++); - if (!*p) { - skippingheader = 0; - continue; - } - if (skippingheader) continue; - - node = p; - for (; *p && !isspace(*p); p++) { - if (isupper(*p)) *p = tolower(*p); - } - if (!*p) { - fprintf(stderr, "%-8s: no domain name in input file\n", node); - continue; - } - *p++ = '\0'; - - for (; *p && isspace(*p); p++) ; - if (!*p) { - fprintf(stderr, "%-8s no domain name in input file\n", node); - continue; - } - - hostname = p; - for (; *p && !isspace(*p); p++) { - if (isupper(*p)) *p = tolower(*p); - } - *p = '\0'; - - /* Chop off any trailing .bitnet */ - if (strlen(hostname) > 7 && - !strcmp(hostname+strlen(hostname)-7, ".bitnet")) { - hostname[strlen(hostname)-7] = '\0'; - } - entry(node, hostname, sizeof(buf)-(hostname - buf)); - } -} - -/* - * Process a single entry in the input file. - * The entry tells us that "node" expands to "domain". - * "domain" can either be a domain name or a bitnet node name - * The buffer pointed to by "domain" may be overwritten--it - * is of size "domainlen". - */ -entry(node, domain, domainlen) -char *node; -char *domain; -char *domainlen; -{ - char *otherdomain, *p, *err; - - /* See if we have any remembered information about this node */ - otherdomain = lookup(node); - - if (otherdomain && strchr(otherdomain, '.')) { - /* We already have a domain for this node */ - if (!strchr(domain, '.')) { - /* - * This entry is an Eric Thomas FOO.BITNET kludge. - * He doesn't want LISTSERV to do transitive closures, so we - * do them instead. Give the the domain expansion for "node" - * (which is in "otherdomian") to FOO (which is in "domain") - * if "domain" doesn't have a domain expansion already. - */ - p = lookup(domain); - if (!p || !strchr(p, '.')) remember(domain, otherdomain); - } - } - else { - if (!strchr(domain, '.') || valhost(domain, domainlen)) { - remember(node, domain); - if (otherdomain) { - /* - * We previously mapped the node "node" to the node - * "otherdomain". If "otherdomain" doesn't already - * have a domain expansion, give it the expansion "domain". - */ - p = lookup(otherdomain); - if (!p || !strchr(p, '.')) remember(otherdomain, domain); - } - } - else { - switch (h_errno) { - case HOST_NOT_FOUND: - err = "not registered in DNS"; - break; - - case TRY_AGAIN: - err = "temporary DNS lookup failure"; - break; - - case NO_RECOVERY: - err = "non-recoverable nameserver error"; - break; - - case NO_DATA: - err = "registered in DNS, but not mailable"; - break; - - default: - err = "unknown nameserver error"; - break; - } - - fprintf(stderr, "%-8s %s %s\n", node, domain, err); - } - } -} - -/* - * Validate whether the mail domain "host" is registered in the DNS. - * If "host" is a CNAME, it is expanded in-place if the expansion fits - * into the buffer of size "hbsize". Returns nonzero if it is, zero - * if it is not. A BIND error code is left in h_errno. - */ -int -valhost(host, hbsize) - char *host; - int hbsize; -{ - register u_char *eom, *ap; - register int n; - HEADER *hp; - querybuf answer; - int ancount, qdcount; - int ret; - int type; - int qtype; - char nbuf[1024]; - - if ((_res.options & RES_INIT) == 0 && res_init() == -1) - return (0); - - _res.options &= ~(RES_DNSRCH|RES_DEFNAMES); - _res.retrans = 30; - _res.retry = 10; - - qtype = T_ANY; - - for (;;) { - h_errno = NO_DATA; - ret = res_querydomain(host, "", C_IN, qtype, - &answer, sizeof(answer)); - if (ret <= 0) - { - if (errno == ECONNREFUSED || h_errno == TRY_AGAIN) - { - /* the name server seems to be down */ - h_errno = TRY_AGAIN; - return 0; - } - - if (h_errno != HOST_NOT_FOUND) - { - /* might have another type of interest */ - if (qtype == T_ANY) - { - qtype = T_A; - continue; - } - else if (qtype == T_A) - { - qtype = T_MX; - continue; - } - } - - /* otherwise, no record */ - return 0; - } - - /* - ** This might be a bogus match. Search for A, MX, or - ** CNAME records. - */ - - hp = (HEADER *) &answer; - ap = (u_char *) &answer + sizeof(HEADER); - eom = (u_char *) &answer + ret; - - /* skip question part of response -- we know what we asked */ - for (qdcount = ntohs(hp->qdcount); qdcount--; ap += ret + QFIXEDSZ) - { - if ((ret = dn_skipname(ap, eom)) < 0) - { - return 0; /* ???XXX??? */ - } - } - - for (ancount = ntohs(hp->ancount); --ancount >= 0 && ap < eom; ap += n) - { - n = dn_expand((u_char *) &answer, eom, ap, - (u_char *) nbuf, sizeof nbuf); - if (n < 0) - break; - ap += n; - GETSHORT(type, ap); - ap += SHORTSIZE + LONGSIZE; - GETSHORT(n, ap); - switch (type) - { - case T_MX: - case T_A: - return 1; - - case T_CNAME: - /* value points at name */ - if ((ret = dn_expand((u_char *)&answer, - eom, ap, (u_char *)nbuf, sizeof(nbuf))) < 0) - break; - if (strlen(nbuf) < hbsize) { - (void)strcpy(host, nbuf); - } - return 1; - - default: - /* not a record of interest */ - continue; - } - } - - /* - ** If this was a T_ANY query, we may have the info but - ** need an explicit query. Try T_A, then T_MX. - */ - - if (qtype == T_ANY) - qtype = T_A; - else if (qtype == T_A) - qtype = T_MX; - else - return 0; - } -} - -struct entry { - struct entry *next; - char *node; - char *domain; -}; -struct entry *firstentry; - -/* - * Find any remembered information about "node" - */ -char *lookup(node) -char *node; -{ - struct entry *p; - - for (p = firstentry; p; p = p->next) { - if (!strcmp(node, p->node)) { - return p->domain; - } - } - return 0; -} - -/* - * Mark the node "node" as equivalent to "domain". "domain" can either - * be a bitnet node or a domain name--if it is the latter, the mapping - * will be written to stdout. - */ -remember(node, domain) -char *node; -char *domain; -{ - struct entry *p; - - if (strchr(domain, '.')) { - fprintf(stdout, "%-8s %s\n", node, domain); - } - - for (p = firstentry; p; p = p->next) { - if (!strcmp(node, p->node)) { - p->domain = malloc(strlen(domain)+1); - if (!p->domain) { - goto outofmemory; - } - strcpy(p->domain, domain); - return; - } - } - - p = (struct entry *)malloc(sizeof(struct entry)); - if (!p) goto outofmemory; - - p->next = firstentry; - firstentry = p; - p->node = malloc(strlen(node)+1); - p->domain = malloc(strlen(domain)+1); - if (!p->node || !p->domain) goto outofmemory; - strcpy(p->node, node); - strcpy(p->domain, domain); - return; - - outofmemory: - fprintf(stderr, "Out of memory\n"); - exit(1); -} - -/* - * Walk through the database, looking for any cases where we know - * node FOO is equivalent to node BAR and node BAR has a domain name. - * For those cases, give FOO the same domain name as BAR. - */ -finish() -{ - struct entry *p; - char *domain; - - for (p = firstentry; p; p = p->next) { - if (!strchr(p->domain, '.') && (domain = lookup(p->domain))) { - remember(p->node, domain); - } - } -} - diff --git a/contrib/bsdi.mc b/contrib/bsdi.mc deleted file mode 100644 index 231a7bc..0000000 --- a/contrib/bsdi.mc +++ /dev/null @@ -1,191 +0,0 @@ -Return-Path: sanders@austin.BSDI.COM -Received: from hofmann.CS.Berkeley.EDU (hofmann.CS.Berkeley.EDU [128.32.34.35]) by orodruin.CS.Berkeley.EDU (8.6.9/8.7.0.Beta0) with ESMTP id KAA28278 for <eric@orodruin.CS.Berkeley.EDU>; Sat, 10 Dec 1994 10:49:08 -0800 -Received: from austin.BSDI.COM (austin.BSDI.COM [137.39.95.2]) by hofmann.CS.Berkeley.EDU (8.6.9/8.6.6.Beta11) with ESMTP id KAA09482 for <eric@cs.berkeley.edu>; Sat, 10 Dec 1994 10:49:03 -0800 -Received: from austin.BSDI.COM (sanders@localhost [127.0.0.1]) by austin.BSDI.COM (8.6.9/8.6.9) with ESMTP id MAA14919 for <eric@cs.berkeley.edu>; Sat, 10 Dec 1994 12:49:01 -0600 -Message-Id: <199412101849.MAA14919@austin.BSDI.COM> -To: Eric Allman <eric@cs.berkeley.edu> -Subject: Re: sorting mailings lists with fastest delivery users first -In-reply-to: Your message of Sat, 10 Dec 1994 08:25:30 PST. -References: <199412101625.IAA15407@mastodon.CS.Berkeley.EDU> -From: Tony Sanders <sanders@bsdi.com> -Organization: Berkeley Software Design, Inc. -Date: Sat, 10 Dec 1994 12:49:00 -0600 -Sender: sanders@austin.BSDI.COM - -(some random text deleted) - -I'll send you something else I've hacked up. You are free to use this -or do with it as you like (I hereby make all my parts public domain). -It's a sample .mc file that has comments (mostly taken from the README) -and examples describing most of the common things people need to setup. - -# -# /usr/share/sendmail/cf/sample.mc -# -# Do not edit /etc/sendmail.cf directly unless you cannot do what you -# want in the master config file (/usr/share/sendmail/cf/sample.mc). -# To create /etc/sendmail.cf from the master: -# cd /usr/share/sendmail/cf -# mv /etc/sendmail.cf /etc/sendmail.cf.save -# m4 < sample.mc > /etc/sendmail.cf -# -# Then kill and restart sendmail: -# sh -c 'set `cat /var/run/sendmail.pid`; kill $1; shift; eval "$@"' -# -# See /usr/share/sendmail/README for help in building a configuration file. -# -include(`../m4/cf.m4') -VERSIONID(`@(#)$Id$') - -dnl # Specify your OS type below -OSTYPE(`bsd4.4') - -dnl # NOTE: `dnl' is the m4 command for delete-to-newline; these are -dnl # used to prevent those lines from appearing in the sendmail.cf. -dnl # -dnl # UUCP-only sites should configure FEATURE(`nodns') and SMART_HOST. -dnl # The uucp-dom mailer requires MAILER(smtp). For more info, see -dnl # `UUCP Config' at the end of this file. - -dnl # If you are not running DNS at all, it is important to use -dnl # FEATURE(nodns) to avoid having sendmail queue everything -dnl # waiting for the name server to come up. -dnl # Example: -dnl FEATURE(`nodns') - -dnl # Use FEATURE(`nocanonify') to skip address canonification via $[ ... $]. -dnl # This would generally only be used by sites that only act as mail gateways -dnl # or which have user agents that do full canonification themselves. -dnl # You may also want to use: -dnl # define(`confBIND_OPTS',`-DNSRCH -DEFNAMES') -dnl # to turn off the usual resolver options that do a similar thing. -dnl # Examples: -dnl FEATURE(`nocanonify') -dnl define(`confBIND_OPTS',`-DNSRCH -DEFNAMES') - -dnl # If /bin/hostname is not set to the FQDN (Full Qualified Domain Name; -dnl # for example, foo.bar.com) *and* you are not running a nameserver -dnl # (that is, you do not have an /etc/resolv.conf and are not running -dnl # named) *and* the canonical name for your machine in /etc/hosts -dnl # (the canonical name is the first name listed for a given IP Address) -dnl # is not the FQDN version then define NEED_DOMAIN and specify your -dnl # domain using `DD' (for example, if your hostname is `foo.bar.com' -dnl # then use DDbar.com). If in doubt, just define it anyway; doesn't hurt. -dnl # Examples: -dnl define(`NEED_DOMAIN', `1') -dnl DDyour.site.domain - -dnl # Define SMART_HOST if you want all outgoing mail to go to a central -dnl # site. SMART_HOST applies to names qualified with non-local names. -dnl # Example: -dnl define(`SMART_HOST', `smtp:firewall.bar.com') - -dnl # Define MAIL_HUB if you want all incoming mail sent to a -dnl # centralized hub, as for a shared /var/spool/mail scheme. -dnl # MAIL_HUB applies to names qualified with the name of the -dnl # local host (e.g., "eric@foo.bar.com"). -dnl # Example: -dnl define(`MAIL_HUB', `smtp:mailhub.bar.com') - -dnl # LOCAL_RELAY is a site that will handle unqualified names, this is -dnl # basically for site/company/department wide alias forwarding. By -dnl # default mail is delivered on the local host. -dnl # Example: -dnl define(`LOCAL_RELAY', `smtp:mailgate.bar.com') - -dnl # Relay hosts for fake domains: .UUCP .BITNET .CSNET -dnl # Examples: -dnl define(`UUCP_RELAY', `mailer:your_relay_host') -dnl define(`BITNET_RELAY', `mailer:your_relay_host') -dnl define(`CSNET_RELAY', `mailer:your_relay_host') - -dnl # Define `MASQUERADE_AS' is used to hide behind a gateway. -dnl # add any accounts you wish to be exposed (i.e., not hidden) to the -dnl # `EXPOSED_USER' list. -dnl # Example: -dnl MASQUERADE_AS(`some.other.host') - -dnl # If masquerading, EXPOSED_USER defines the list of accounts -dnl # that retain the local hostname in their address. -dnl # Example: -dnl EXPOSED_USER(`postmaster hostmaster webmaster') - -dnl # If masquerading is enabled (using MASQUERADE_AS above) then -dnl # FEATURE(allmasquerade) will cause recipient addresses to -dnl # masquerade as being from the masquerade host instead of -dnl # getting the local hostname. Although this may be right for -dnl # ordinary users, it breaks local aliases that aren't exposed -dnl # using EXPOSED_USER. -dnl # Example: -dnl FEATURE(allmasquerade) - -dnl # Include any required mailers -MAILER(local) -MAILER(smtp) -MAILER(uucp) - -LOCAL_CONFIG -# If this machine should be accepting mail as local for other hostnames -# that are MXed to this hostname then add those hostnames below using -# a line like: -# Cw bar.com -# The most common case where you need this is if this machine is supposed -# to be accepting mail for the domain. That is, if this machine is -# foo.bar.com and you have an MX record in the DNS that looks like: -# bar.com. IN MX 0 foo.bar.com. -# Then you will need to add `Cw bar.com' to the config file for foo.bar.com. -# DO NOT add Cw entries for hosts whom you simply store and forward mail -# for or else it will attempt local delivery. So just because bubba.bar.com -# is MXed to your machine you should not add a `Cw bubba.bar.com' entry -# unless you want local delivery and your machine is the highest-priority -# MX entry (that is is has the lowest preference value in the DNS. - -LOCAL_RULE_0 -# `LOCAL_RULE_0' can be used to introduce alternate delivery rules. -# For example, let's say you accept mail via an MX record for widgets.com -# (don't forget to add widgets.com to your Cw list, as above). -# -# If wigets.com only has an AOL address (widgetsinc) then you could use: -# R$+ <@ widgets.com.> $#smtp $@aol.com. $:widgetsinc<@aol.com.> -# -# Or, if widgets.com was connected to you via UUCP as the UUCP host -# widgets you might have: -# R$+ <@ widgets.com.> $#uucp $@widgets $:$1<@widgets.com.> - -dnl ### -dnl ### UUCP Config -dnl ### - -dnl # `SITECONFIG(site_config_file, name_of_site, connection)' -dnl # site_config_file the name of a file in the cf/siteconfig -dnl # directory (less the `.m4') -dnl # name_of_site the actual name of your UUCP site -dnl # connection one of U, W, X, or Y; where U means the sites listed -dnl # in the config file are connected locally; W, X, and Y -dnl # build remote UUCP hub classes ($=W, etc). -dnl # You will need to create the specific site_config_file in -dnl # /usr/share/sendmail/siteconfig/site_config_file.m4 -dnl # The site_config_file contains a list of directly connected UUCP hosts, -dnl # e.g., if you only connect to UUCP site gargoyle then you could just: -dnl # echo 'SITE(gargoyle)' > /usr/share/sendmail/siteconfig/uucp.foobar.m4 -dnl # Example: -dnl SITECONFIG(`uucp.foobar', `foobar', U) - -dnl # If you are on a local SMTP-based net that connects to the outside -dnl # world via UUCP, you can use LOCAL_NET_CONFIG to add appropriate rules. -dnl # For example: -dnl # define(`SMART_HOST', suucp:uunet) -dnl # LOCAL_NET_CONFIG -dnl # R$* < @ $* .$m. > $* $#smtp $@ $2.$m. $: $1 < @ $2.$m. > $3 -dnl # This will cause all names that end in your domain name ($m) to be sent -dnl # via SMTP; anything else will be sent via suucp (smart UUCP) to uunet. -dnl # If you have FEATURE(nocanonify), you may need to omit the dots after -dnl # the $m. -dnl # -dnl # If you are running a local DNS inside your domain which is not -dnl # otherwise connected to the outside world, you probably want to use: -dnl # define(`SMART_HOST', smtp:fire.wall.com) -dnl # LOCAL_NET_CONFIG -dnl # R$* < @ $* . > $* $#smtp $@ $2. $: $1 < @ $2. > $3 -dnl # That is, send directly only to things you found in your DNS lookup; -dnl # anything else goes through SMART_HOST. diff --git a/contrib/converting.sun.configs b/contrib/converting.sun.configs deleted file mode 100644 index e6a3a9e..0000000 --- a/contrib/converting.sun.configs +++ /dev/null @@ -1,446 +0,0 @@ - - Converting Standard Sun Config - Files to Sendmail Version 8 - - Rick McCarty - Texas Instruments Inc. - Latest Update: 08/25/93 - RJMc - -This document details the changes necessary to continue using your -current SunOS sendmail.cf with sendmail version 8. In the longer term, -it is recommended that one move to using an m4 based configuration such -as those shipped with sendmail, but if you're like me and have made -enough modifications to your .cf file that you'd rather put that task -off until later, here's the sum total of my experience to get you to -version 8 with minimal pain. I'll cover .cf as well as build issues. - -Some background - as many are surely aware, Sun has some "special" -features in the sendmail they ship ($%x, %y LHS lookup, NIS alias DB -search, etc.). (Some of those features can be had in alternative forms -in IDA sendmail, but v8 has picked up some IDA capabilities as well as -new ones, making it IMHO a most desirable version to go to.) What I -will explain below includes v8 functional "equivalences" to these Sun -sendmail features. - -So with that out of the way, let's begin. - -First, some assumptions: - - 1) I'm going to assume you've got sendmail version 8.6 or - later in hand - if not, grab it from ftp.cs.berkeley.edu - in the ucb/sendmail directory. There are bugs in earlier - versions which affect some of the needed functionality. - - 2) Second, I'm going to detail this based upon the - "sendmail.main.cf" configuration. (BTW, if you attempt - to move to using an m4 generated config in the future, - MAIL_HUB is the feature which should provide similar - functionality). - - In general, the changes will be similar for a subsidiary - file, but since we (my TI group) funnel all non-local mail - through our mailhost, we're not as interested in getting v8 - to run on such systems and I haven't tried it. - - 3) You're using DNS and sendmail.mx. If you're not, you ought - to be, even if you're also running it along with NIS (which - we do - except for gethostbyxxx() lookups, which I'll be - talking about later). I would imagine you could get things - running OK without DNS support, but I haven't tried it myself. - - 4) You're not mounting /var/spool/mail from other systems. - I haven't found a v8 feature to guarantee this will work - correctly. Anyway, in the past, we've tried doing that - here and found it to be a rather "ugly" feature, though - Sun ostensibly supports it ("R" option). Perhaps v8 - will one day have a similar feature, but for now, bottom - line, I would recommend against it. - - 5) You're not on Solaris or using NIS+. I'm on 4.1.3. I've - looked at Solaris briefly and have noted that things are - pretty much similar there except that they've moved some - things into the /etc/mail directory. I'd guess the - executables aren't functionally all that different from - what they had before - the configs are roughly the same. - So I'd bet most of what I say in here will apply to - Solaris. - -OK, let's configure our sendmail.cf! I'll just go from the top down... - - VARIOUS DECLARATIONS - -1) For v8, you need to define your .cf as AT LEAST a version level 4 - configuration. Add the following line: - - V4 - - There are some issues regarding certain predefined macros - $w, $j, and - $m. With a V4 configuration: - - $w is defined to be the hostname, which will usually be fully - qualified (i.e. "firefly.add.itg.ti.com"). - - $j should have the same value as $w. - - $m will be predefined as the domain portion of $w - (ex. "add.itg.ti.com"). - - One note about this - if your configuration relies on the "w" macro to - be the "simple" hostname (as mine does)... - - If the configuration version is 5 or larger: - - $w is supposed to be the "simple" name (ex. "firefly") - - $j should be the fully qualified name (i.e. "firefly.add.itg.ti.com") - - $m will be predefined as the domain portion of $j - (ex. "add.itg.ti.com"). - - I have not experimented with the various combinations, so I cannot - guarantee you that the above definitions will always come out as - expected. Bottom line: if your sendmail.cf depends on $w being the - simple hostname, test it carefully or define the name explicitly, - for example: - - Dwfirefly - -2) To replace the Sun's "%y" feature, we must use a hostname mapping - feature in v8. If you want to do similar lookups with v8, you need - to define the following map (we'll go over the rules that use this - map later): - - Khostlookup host -f -m -a. - - This will define a "lookup only" map that is otherwise the same as - sendmail version 8's built-in "host" map (see the "Sendmail - Installation and Operation Guide" for details on this map.). - - An important note: Whether or not these lookups will be done via - NIS is a function of what gethostbyxxx() functions you link into - your sendmail. DO NOT redefine your host mapping to use NIS - explicitly within sendmail - there can be unexpected behaviour if - you do so (if you do any canonicalization in your .cf, you can get - incorrect results, for one thing). - - For example, DO NOT TRY: - - Khost nis -f -a. hosts.byname - -3) If you're doing reverse alias mapping as done in ruleset 22, instead of: - - DZmail.byaddr - - you'll need to declare the following: - - Kaliasrev nis -f -N mail.byaddr - -4) If you are doing any other NIS map lookups, you'll need to define the - map as done in the below example. I have a "mailhosts" map, which I - use to distinguish between local and non-local hosts. Look at the - sendmail doc for details on this stuff. - - Kmailhosts nis -f -m -a. mailhosts - -5) You might wish to add the following line to support Errors-To: headers. - I don't. - - Ol - -6) Comment out/remove the following line: - - OR - - The R option means something different under v8 - check the documentation - if you're interested in using it. - -7) If you're running NIS and have a separate alias map, BELOW the - following line where the alias file is declared: - - OA/etc/aliases - - ADD the following: - - OAnis:mail.aliases - - This will set things up so v8 will look at the local alias DB first, - then the NIS map, just as Sun sendmail does. - -8) Though you don't have to, I'd suggest changing: - - OT3d - - to use v8's warning feature, which allows a warning message to be - sent if a message cannot be delivered within a specified period. - I use: - - OT5d/4h - - which says - bounce after 5 days, warn after 4 hours. - -9) I set the following option to be explicit about how I want DNS - handled: - - OI +DNSRCH +DEFNAMES - -10) The following line: - - T root daemon uucp - - may be deleted, though it will be ignored if you leave it around. - -11) It would probably be good to change the version macro value (which - shows up in "Received:" headers) so no one debugging mail problems - gets the wrong idea about what config you're running under. Look - for something like: - - DVSMI-4.1 - - Mine, for example is: - - DVADD-HUB-2.1 - - RULESETS - -1) In ruleset 3, BELOW this rule: - - # basic textual canonicalization - R$*<$+>$* $2 basic RFC822 parsing - - -I add the following rule to remove a trailing dot in the domain spec so -it won't interfere with v8 mapping features, etc. (Having a trailing dot is -not RFC-compliant anyway.): - - R$+. $1 - -2) Because ruleset 5 is special in v8, I rename it to S95 and also change - all RHS expressions containing ">5" to use ">95" instead. In v8, - 5 is executed against addresses which resolve to the local mailer and - are not an alias. If you don't change S5 to something else, you might - get a surprise! - -3) If you're doing any lookups via the generalized NIS "$%x/$!x" - mechanisms (such as with the mailhost map I referred to earlier) it's - done differently under v8. For example: - - DMmailhosts - ... - R$*<@$%M.uucp>$* $#ether $@$2 $:$1<@$2>$3 - - takes a different map definition and two rules under version 8: - - Kmailhosts nis -f -m -a. mailhosts - ... - R$*<@$+.uucp>$* $: $1<@$(mailhosts $2 $).uucp>$3 - R$*<@$+..uucp>$* $#ether $@$2 $:$1<@$2>$3 - -4) Sun has a special case of the "$%x" feature for host lookups - "%y" is - automagically defined to do an NIS "hosts.byname" search with no other - definition, as done in the below example: - - R$*<@$%y.LOCAL>$* $#ether $@$2 $:$1<@$2>$3 - - (Sun does this in more than one place. But the above syntax is almost - identical in each - mostly a case of changing names to protect the - innocent.) - - In version 8, the predefined "host" map can be used to do essentially - the same thing. (However, whether or not it does an NIS lookup is - a function of what gethostbyxxx() functions are linked in.) - - Recall the map definition I mentioned earlier in the DECLARATIONS - section: - - Khostlookup host -f -m -a. - - Here's where we will use it. It will take two rules: - - R$*<@$+.LOCAL>$* $: $1<@$(hostlookup $2 $).LOCAL>$3 - R$*<@$+..LOCAL>$* $#ether $@$2 $:$1<@$2>$3 - - Note that this is almost verbatim the same change as was used in the - previous "mailhosts" example. - -5) Although Sun's default configs don't do this, because I mentioned - canonicalization earlier, it deserves an example, as it's illustrative - of the functional difference in the map definitions I discussed before. - This stuff is also convered in the "Sendmail Installation and Operation - Guide". - - Remember the built-in "host" map definition? As you'll recall, unlike - the "hostlookup" map we defined, "host" will actually CHANGE the - hostname in addition to appending a dot. "hostlookup" only appends a - dot if the name is found and doesn't change it otherwise. Anyway, - here's the example: - - R$*<@$+>$* $: $1<@$(host $2 $)>$3 canonicalize - R$*<@$+.>$* $1<@$2>$3 remove trailing dot - - Using the above, say you had input of: - - joe<@tilde> - - OR - - joe<@[128.247.160.56]> - - Assuming "tilde" or the IP address is found, it might be - canonicalized as: - - joe<@tilde.csc.ti.com> - -6) As another instance of the NIS lookup feature, with a slightly - different twist, Sun implements reverse alias mapping in ruleset 22 - with the below: - - DZmail.byaddr - ... - R$-<@$-> $:$>3${Z$1@$2$} invert aliases - - To use this feature under v8, change the above rule a (remember to - define the alias map as I showed earlier): - - R$-<@$-> $:$>3$(aliasrev $1@$2 $) invert aliases - - - MAILER DEFINITIONS - -1) Where "TCP" is defined in the "P=" and "A=" parameters of mailers, I - changed it to "IPC". Version 8 will accept "TCP", but "IPC" is - preferred. - -2) On all IPC mailers, I also defined "E=\r\n" and added an "L=1000" as - in the below example: - - Mether, P=[IPC], F=mDFMuCX, S=11, R=21, L=1000, E=\r\n, A=IPC $h - - The "E=\r\n" will save you headaches interoperating with such things as - VMS TCP products. - - The "L=1000" is for RFC821 compatibility. Not strictly necessary. - - I also removed the "s" (strip quotes) mailer flag Sun puts in for - these mailers. Stripping quotes violates protocols, which say - clearly that you can't touch the local-part (left hand side of - the @) until you are on the delivering host. - -NOW. If I haven't left anything out, you should be able to run through -your Sun sendmail.cf file and convert it to run under v8. - - BUILD ISSUES - -Some important notes on building v8 on SunOS: - -Makefile - -The default makefile in the version 8 source (src) directory assumes the -new Berkeley make. Unless you want to go to the trouble of building it, -you can use your regular make, but you need to use a different makefile. -You can use "Makefile.dist" or "Makefile.SunOS" in the src directory. I -made changes to get it to build so it is as compatible as possible with -the file/directory locations Sun uses. Here are some relevant sections -out of my makefile: - - CC=gcc - - # use O=-O (usual) or O=-g (debugging) - O= -O - - # define the database mechanisms available for map & alias lookups: - # -DNDBM -- use new DBM - # -DNEWDB -- use new Berkeley DB - # -DNDBM -DNEWDB -DYPCOMPAT -- use both plus YP compatility - # -DNIS -- include client NIS support - # The really old (V7) DBM library is no longer supported. - # See README for a description of how these flags interact. - #DBMDEF= -DNDBM -DNEWDB - DBMDEF= -DNDBM -DNIS - - # environment definitions (e.g., -D_AIX3) - ENVDEF= - - # see also conf.h for additional compilation flags - - # library directories - LIBDIRS=-L/usr/local/lib - - # libraries required on your system - #LIBS= -ldb -ldbm - LIBS= -ldbm -lresolv - - # location of sendmail binary (usually /usr/sbin or /usr/lib) - BINDIR= ${DESTDIR}/usr/lib - - # location of sendmail.st file (usually /var/log or /usr/lib) - STDIR= ${DESTDIR}/etc - - # location of sendmail.hf file (usually /usr/share/misc or /usr/lib) - HFDIR= ${DESTDIR}/usr/lib - -For the resolver library, you can use the one shipped with Sun if you -want. But I'd recommend using another version of the resolver library -(such as the one with Bind 4.8.3 or 4.9). Sun's resolver stuff (at -least with 4.1.x) is quite old - I believe it is of 4.3.1 vintage. (Do -you get the impression I don't TRUST what Sun ships with their systems?) - -If you want NIS host lookup while maintaining DNS capability, you might -take a look at resolv+, which has NIS capable gethostbyxxx() functions -in it. My recommendation, however, is to avoid doing NIS host lookups -in sendmail altogether, and to use a "pure" version of the resolver -library. - -There are probably no situations (at least I think so) where it makes -any sense to link in Sun's NIS gethostbyxxx() functions from libc. -You could, I guess do it (I haven't tried it) and wind up with a -sendmail equivalent to the non-mx version Sun ships. You'd need to -insure that NAMED_BIND is not defined in the build. (If you do -this and have the "-b" DNS passthru option set in NIS, remember that -while you have some DNS functionality you'll not have any MX support. -(This, IMO, is what makes this a non-optimal choice.) - - INSTALLATION/TESTING ISSUES - -The sendmail.hf file in the src directory should replace the one currently -in /usr/lib. You also might choose to edit it a bit to "localize" what it -says. - -The sendmail executable goes, of course, in /usr/lib in place of the current -one. What I did was create a subdirectory in /usr/lib and put all of the -Sun sendmail stuff in there. I named the v8 sendmail executable to be -sendmail.v8.mx and then symbolically linked it to sendmail. - -One other thing. If you use address test mode, keep in mind that -Version 8 is like IDA in that it does not automatically execute ruleset -3 first. So say you're playing around with things testing addresses and -you're used to things like: - - 0 jimbob@good.old.boy.com - -under v8 you need to say instead: - - 3,0 jimbob@good.old.boy.com - - INTEROPERABILITY ISSUES YOU MIGHT ENCOUNTER - -Be aware that sendmail v8 issues a multi-line SMTP welcome (220) -response upon a client connection. Most systems in your network should -handle it OK, but there are some that choke on it, because whoever wrote -the clients assumed only a single line. THIS IS NOT SENDMAIL's FAULT. -A multi-line 220 response is perfectly valid. A likely place you'll -encounter this problem is with non-Un*x SMTP clients. If you do run -into it, you should report it to the vendor. - -A final note about version 8 - if you follow the above configuration -scenario, you'll notice it doesn't like to get envelope sender -addresses it doesn't know how to get back to. Sun sendmail would take -anything, even though it might not be able to bounce the message back -should something happen downstream. So if another sendmail on a host -that's not locally known is trying to pump mail through your v8 host, -the ENVELOPE sender it gives had better be fully qualified. This is -a GREAT thing, because it helps clear up problems we've had with not -being able to get things back to the sender, resulting in an -overburdened postmaster. - -I hope this helps those running Sun sendmail feel more at ease with moving -on to v8. It's really worth going to. diff --git a/contrib/doublebounce.pl b/contrib/doublebounce.pl deleted file mode 100644 index 2a7934e..0000000 --- a/contrib/doublebounce.pl +++ /dev/null @@ -1,233 +0,0 @@ -#!/usr/bin/perl -# doublebounce.pl -# attempt to return a doubly-bounced email to a postmaster -# jr@terra.net, 12/4/97 -# -# invoke by creating an mail alias such as: -# doublebounce: "|/usr/local/sbin/doublebounce" -# then adding this line to your sendmail.cf: -# O DoubleBounceAddress=doublebounce -# -# optionally, add a "-d" flag in the aliases file, to send a -# debug trace to your own postmaster showing what is going on -# -# this allows the "postmaster" address to still go to a human being, -# while bounce messages can go to this script, which will bounce them -# back to the postmaster at the sending site. -# -# the algorithm is to scan the double-bounce error report generated -# by sendmail on stdin, for the original message (it starts after the -# second "Orignal message follows" marker), look for From, Sender, and -# Received headers from the point closest to the sender back to the point -# closest to us, and try to deliver a double-bounce report back to a -# postmaster at one of these sites in the hope that they can -# return the message to the original sender, or do something about -# the fact that that sender's return address is not valid. - - -use Socket; -use Fcntl; - -# look for debug flag -# -$dflag = 0; -$dflag = 1 if ($ARGV[0] eq "-d"); - -# get local host name -# you may need to edit these two lines for however your system does this -# -$host = `hostname`; chop($host); -$domain = `dnsdomainname`; chop($domain); - -# get temp file name -$tmp = "/tmp/doubb$$"; - -# save message from STDIN to a file -# I thought about reading it into a buffer here, but some messages -# are 10+Mb so a buffer may not be a good idea -# -if (! sysopen(MSG, "$tmp", O_RDWR|O_CREAT|O_EXCL, 0600)) { - # can't open temp file -- send message to local postmaster - # open(MAIL, "| /usr/sbin/sendmail -oeq postmaster"); - print MAIL <STDIN>; - close(MAIL); - exit(1); -} -print MSG <STDIN>; - -# scan message for list of possible sender sites -# note that original message appears after the second -# "Original message follows" marker -# look for From, Sender, and Reply-To and try them, too -# -$inhdr = 0; -$hdrs = 0; -$skip = 0; -seek(MSG, 0, 0); -while (<MSG>) { - chop; - if (/^ ----- Original message follows -----$/ - || /^ ----Unsent message follows----$/) { - $i = 0; - $inhdr = 1; - $hdrs++; - $skip = 1; - next; - } - if ($skip) { - $skip--; - next; - } - if (/^$/) { - last if ($hdrs >= 2); - $inhdr = 0; - next; - } - if (! $inhdr) { - next; - } - if (! /^[ \t]/) { $hdr[$i++] = $_ } - else { - $i--; - $hdr[$i++] .= $_; - } -} -$rcvd = 0; -for ($j = 0; $j < $i; $j++) { - print STDERR "DEBUG hdr[$j] = $hdr[$j]\n"; - if ($hdr[$j] =~ /^received:/i) { - ($addr[$rcvd++]) = $hdr[$j] =~ m/.*\sby\s([^\s]+)\s.*/; - } - if ($hdr[$j] =~ /^reply-to:/i) { - ($addr1{"reply-to"} = $hdr[$j]) =~ s/^reply-to: *//i; - } - if ($hdr[$j] =~ /^sender:/i) { - ($addr1{"sender"} = $hdr[$j]) =~ s/^sender: *//i; - } - if ($hdr[$j] =~ /^from:/i) { - ($addr1{"from"} = $hdr[$j]) =~ s/^from: *//i; - } -} - -# %addr and %addr1 arrays now contain lists of possible sites (or From headers). -# Go through them parsing for the site name, and attempting to send -# to the named person or postmaster@ each site in turn until successful -# -if ($dflag) { - open(DEBUG, "|/usr/sbin/sendmail postmaster"); - print DEBUG "Subject: double bounce dialog\n"; -} -$sent = 0; -# foreach $x ("from", "sender", "reply-to") { -foreach $x ("from", "sender") { - $y = &parseaddr($addr1{$x}); - if ($y) { - print DEBUG "Trying $y\n" if ($dflag); - if (&sendbounce("$y")) { - $sent++; - last; - } - $y =~ s/.*@//; - print DEBUG "Trying postmaster\@$y\n" if ($dflag); - if (&sendbounce("postmaster\@$y")) { - $sent++; - last; - } - } -} -if (! $sent) { - $rcvd--; - for ($i = $rcvd; $i >= 0; $i--) { - $y = &parseaddr($addr[$i]); - $y =~ s/.*@//; - if ($y) { - print DEBUG "Trying postmaster\@$y\n" if ($dflag); - if (&sendbounce("postmaster\@$y")) { - $sent++; - last; - } - } - } -} -if (! $sent) { - # queer things are happening to me - # $addr[0] should be own domain, so we should have just - # tried postmaster@our.domain. theoretically, we should - # not get here... - if ($dflag) { - print DEBUG "queer things are happening to me\n"; - print DEBUG "Trying postmaster\n"; - } - &sendbounce("postmaster"); -} - -# clean up and get out -# -if ($dflag) { - seek(MSG, 0, 0); - print DEBUG "\n---\n"; print DEBUG <MSG>; - close(DEBUG); -} -close(MSG); -unlink("$tmp"); -exit(0); - - - - - -# parseaddr() -# parse hostname from From: header -# -sub parseaddr { - local($hdr) = @_; - local($addr); - - if ($hdr =~ /<.*>/) { - ($addr) = $hdr =~ m/<(.*)>/; - return $addr; - } - if ($addr =~ /\s*\(/) { - ($addr) = $hdr =~ m/\s*(.*)\s*\(/; - return $addr; - } - ($addr) = $hdr =~ m/\s*(.*)\s*/; - return $addr; -} - - -# sendbounce() -# send bounce to postmaster -# -# this re-invokes sendmail in immediate and quiet mode to try -# to deliver to a postmaster. sendmail's exit status tells us -# wether the delivery attempt really was successful. -# -sub sendbounce { - local($dest) = @_; - local($st); - - open(MAIL, "| /usr/sbin/sendmail -ocn -odi -oeq $dest"); - print MAIL <<EOT; -From: Mail Delivery Subsystem <mail-router\@$domain> -Subject: Postmaster notify: double bounce -Reply-To: nobody\@$domain -Errors-To: nobody\@$domain -Precedence: junk -Auto-Submitted: auto-generated (postmaster notification) - -The following message was received at $host.$domain for an invalid -recipient. The sender's address was also invalid. Since the message -originated at or transited through your mailer, this notification is being -sent to you in the hope that you will determine the real originator and -have them correct their From or Sender address. - -The invalid sender address was: $addr1{"from"}. - - ----- The following is a double bounce at $host.$domain ----- - -EOT - seek(MSG, 0, 0); - print MAIL <MSG>; - return close(MAIL); -} diff --git a/contrib/etrn.pl b/contrib/etrn.pl deleted file mode 100755 index 1e2cba9..0000000 --- a/contrib/etrn.pl +++ /dev/null @@ -1,324 +0,0 @@ -#!/usr/local/bin/perl -'di '; -'ds 00 \\"'; -'ig 00 '; -# -# THIS PROGRAM IS ITS OWN MANUAL PAGE. INSTALL IN man & bin. -# - -# hardcoded constants, should work fine for BSD-based systems -use Socket; -use Getopt::Std; -$sockaddr = 'S n a4 x8'; - -# system requirements: -# must have 'hostname' program. - -############################################################################# -# Copyright (c) 1996 John T. Beck <john@beck.org> -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. All advertising materials mentioning features or use of this software -# must display the following acknowledgement: -# This product includes software developed by John T. Beck. -# 4. The name of John Beck may not be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY JOHN T. BECK ``AS IS'' AND ANY EXPRESS OR -# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL JOHN T. BECK BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# This copyright notice derived from material copyrighted by the Regents -# of the University of California. -# -# Contributions accepted. -############################################################################# -# Further disclaimer: the etrn.pl script was highly leveraged from the -# expn.pl script which is (C) 1993 David Muir Sharnoff. -############################################################################# - -$port = 'smtp'; -$av0 = $0; -select(STDERR); - -$0 = "$av0 - running hostname"; -chop($name = `hostname || uname -n`); - -$0 = "$av0 - lookup host FQDN and IP addr"; -($hostname,$aliases,$type,$len,$thisaddr) = gethostbyname($name); - -$0 = "$av0 - parsing args"; -$usage = "Usage: $av0 [-wd] host [args]"; -getopts('dw'); -$watch = $opt_w; -$debug = $opt_d; -$server = shift(@ARGV); -@hosts = @ARGV; -die $usage unless $server; -@cwfiles = (); - -if (!@hosts) { - push(@hosts,$hostname); - - $0 = "$av0 - parsing sendmail.cf"; - open(CF, "</etc/sendmail.cf") || die "open /etc/sendmail.cf: $!"; - while (<CF>){ - if (/^Fw.*$/){ # look for a line starting with "Fw" - $cwfile = $_; - chop($cwfile); - $optional = /^Fw-o/; - $cwfile =~ s,^Fw[^/]*,,; # extract the file name - - if (-r $cwfile) { - push (@cwfiles, $cwfile); - } else { - die "$cwfile is not readable" unless $optional; - } - } - if (/^Cw(.*)$/){ # look for a line starting with "Cw" - @cws = split (' ', $1); - while (@cws) { - $thishost = shift(@cws); - push(@hosts, $thishost) unless $thishost =~ "$hostname|localhost"; - } - } - } - close(CF); - - for $cwfile (@cwfiles) { - $0 = "$av0 - reading $cwfile"; - if (open(CW, "<$cwfile")){ - while (<CW>){ - next if /^\#/; - $thishost = $_; - chop($thishost); - push(@hosts, $thishost) unless $thishost =~ $hostname; - } - close(CW); - } else { - die "open $cwfile: $!"; - } - } -} - -$0 = "$av0 - building local socket"; -($name,$aliases,$proto) = getprotobyname('tcp'); -($name,$aliases,$port) = getservbyname($port,'tcp') - unless $port =~ /^\d+/; - -# look it up -$0 = "$av0 - gethostbyname($server)"; - -($name,$aliases,$type,$len,$thataddr) = gethostbyname($server); - -# get a connection -$0 = "$av0 - socket to $server"; -$that = pack($sockaddr, &AF_INET, $port, $thataddr); -socket(S, &AF_INET, &SOCK_STREAM, $proto) - || die "socket: $!"; -$0 = "$av0 - connect to $server"; -print "debug = $debug server = $server\n" if $debug > 8; -if (! connect(S, $that)) { - $0 = "$av0 - $server: could not connect: $!\n"; -} -select((select(S),$| = 1)[0]); # don't buffer output to S - -# read the greeting -$0 = "$av0 - talking to $server"; -&alarm("greeting with $server",''); -while(<S>) { - alarm(0); - print if $watch; - if (/^(\d+)([- ])/) { - if ($1 != 220) { - $0 = "$av0 - bad numeric response from $server"; - &alarm("giving up after bad response from $server",''); - &read_response($2,$watch); - alarm(0); - print STDERR "$server: NOT 220 greeting: $_" - if ($debug || $watch); - } - last if ($2 eq " "); - } else { - $0 = "$av0 - bad response from $server"; - print STDERR "$server: NOT 220 greeting: $_" - if ($debug || $watch); - close(S); - } - &alarm("greeting with $server",''); -} -alarm(0); - -# if this causes problems, remove it -$0 = "$av0 - sending helo to $server"; -&alarm("sending ehlo to $server",""); -&ps("ehlo $hostname"); -$etrn_support = 0; -while(<S>) { - if (/^250([- ])ETRN(.+)$/){ - $etrn_support = 1; - } - print if $watch; - last if /^\d+ /; -} -alarm(0); - -if ($etrn_support){ - print "ETRN supported\n" if ($debug); - &alarm("sending etrn to $server",''); - while (@hosts) { - $server = shift(@hosts); - &ps("etrn $server"); - while(<S>) { - print if $watch; - last if /^\d+ /; - } - sleep(1); - } -} else { - print "\nETRN not supported\n\n" -} - -&alarm("sending 'quit' to $server",''); -$0 = "$av0 - sending 'quit' to $server"; -&ps("quit"); -while(<S>) { - print if $watch; - last if /^\d+ /; -} -close(S); -alarm(0); - -select(STDOUT); -exit(0); - -# print to the server (also to stdout, if -w) -sub ps -{ - local($p) = @_; - print ">>> $p\n" if $watch; - print S "$p\n"; -} - -sub alarm -{ - local($alarm_action,$alarm_redirect,$alarm_user) = @_; - alarm(3600); - $SIG{ALRM} = 'handle_alarm'; -} - -sub handle_alarm -{ - &giveup($alarm_redirect,"Timed out during $alarm_action",$alarm_user); -} - -# read the rest of the current smtp daemon's response (and toss it away) -sub read_response -{ - local($done,$watch) = @_; - local(@resp); - print $s if $watch; - while(($done eq "-") && ($s = <S>) && ($s =~ /^\d+([- ])/)) { - print $s if $watch; - $done = $1; - push(@resp,$s); - } - return @resp; -} -# to pass perl -w: -@tp; -$flag_a; -$flag_d; -&handle_alarm; -################### BEGIN PERL/TROFF TRANSITION -.00 ; - -'di -.nr nl 0-1 -.nr % 0 -.\\"'; __END__ -.\" ############## END PERL/TROFF TRANSITION -.TH ETRN 1 "January 25, 1997" -.AT 3 -.SH NAME -etrn \- start mail queue run -.SH SYNOPSIS -.B etrn -.RI [ -w ] -.RI [ -d ] -.IR hostname -.RI [ args ] -.SH DESCRIPTION -.B etrn -will use the SMTP -.B etrn -command to start mail delivery from the host given on the command line. -.B etrn -usually sends an -.B etrn -for each host the local sendmail accepts e-mail for, but if -.IR args -are specified, -.B etrn -uses these as arguments for the SMTP -.B etrn -commands passed to the host given on the command line. -.SH OPTIONS -.LP -The normal mode of operation for -.B etrn -is to do all of its work silently. -The following options make it more verbose. -It is not necessary to make it verbose to see what it is -doing because as it works, it changes its -.BR argv [0] -variable to reflect its current activity. -The -.IR -w , -watch, flag will cause -.B etrn -to show you its conversations with the mail daemons. -The -.IR -d , -debug, flag will expose many of the inner workings so that -it is possible to eliminate bugs. -.SH ENVIRONMENT -No enviroment variables are used. -.SH FILES -.B /etc/sendmail.cf -.SH SEE ALSO -.BR sendmail (8), -RFC 1985. -.SH BUGS -Not all mail daemons will implement -.B etrn . -.LP -It is assumed that you are running domain names. -.SH CREDITS -Leveraged from David Muir Sharnoff's expn.pl script. -Christian von Roques added support for -.IR args -and fixed a couple of bugs. -.SH AVAILABILITY -The latest version of -.B etrn -is available in the contrib directory of the sendmail -distribution through anonymous ftp at -.IR ftp://ftp.sendmail.org/ucb/src/sendmail/ . -.SH AUTHOR -.I John T. Beck\ \ \ \ <john@beck.org> diff --git a/contrib/expn.pl b/contrib/expn.pl deleted file mode 100755 index 7e2f730..0000000 --- a/contrib/expn.pl +++ /dev/null @@ -1,1360 +0,0 @@ -#!/usr/bin/perl -'di '; -'ds 00 \\"'; -'ig 00 '; -# -# THIS PROGRAM IS ITS OWN MANUAL PAGE. INSTALL IN man & bin. -# - -use 5.001; -use IO::Socket; -use Fcntl; - -# system requirements: -# must have 'nslookup' and 'hostname' programs. - -# $Header: /home/muir/bin/RCS/expn,v 3.11 1997/09/10 08:14:02 muir Exp muir $ - -# TODO: -# less magic should apply to command-line addresses -# less magic should apply to local addresses -# add magic to deal with cross-domain cnames -# disconnect & reconnect after 25 commands to the same sendmail 8.8.* host - -# Checklist: (hard addresses) -# 250 Kimmo Suominen <"|/usr/local/mh/lib/slocal -user kim"@grendel.tac.nyc.ny.us> -# harry@hofmann.cs.Berkeley.EDU -> harry@tenet (.berkeley.edu) [dead] -# bks@cs.berkeley.edu -> shiva.CS (.berkeley.edu) [dead] -# dan@tc.cornell.edu -> brown@tiberius (.tc.cornell.edu) - -############################################################################# -# -# Copyright (c) 1993 David Muir Sharnoff -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. All advertising materials mentioning features or use of this software -# must display the following acknowledgement: -# This product includes software developed by the David Muir Sharnoff. -# 4. The name of David Sharnoff may not be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE DAVID MUIR SHARNOFF ``AS IS'' AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL DAVID MUIR SHARNOFF BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -# SUCH DAMAGE. -# -# This copyright notice derrived from material copyrighted by the Regents -# of the University of California. -# -# Contributions accepted. -# -############################################################################# - -# overall structure: -# in an effort to not trace each address individually, but rather -# ask each server in turn a whole bunch of questions, addresses to -# be expanded are queued up. -# -# This means that all accounting w.r.t. an address must be stored in -# various arrays. Generally these arrays are indexed by the -# string "$addr *** $server" where $addr is the address to be -# expanded "foo" or maybe "foo@bar" and $server is the hostname -# of the SMTP server to contact. -# - -# important global variables: -# -# @hosts : list of servers still to be contacted -# $server : name of the current we are currently looking at -# @users = $users{@hosts[0]} : addresses to expand at this server -# $u = $users[0] : the current address being expanded -# $names{"$users[0] *** $server"} : the 'name' associated with the address -# $mxbacktrace{"$users[0] *** $server"} : record of mx expansion -# $mx_secondary{$server} : other mx relays at the same priority -# $domainify_fallback{"$users[0] *** $server"} : alternative names to try -# instead of $server if $server doesn't work -# $temporary_redirect{"$users[0] *** $server"} : when trying alternates, -# temporarily channel all tries along current path -# $giveup{$server} : do not bother expanding addresses at $server -# $verbose : -v -# $watch : -w -# $vw : -v or -w -# $debug : -d -# $valid : -a -# $levels : -1 -# $S : the socket connection to $server - -$have_nslookup = 1; # we have the nslookup program -$port = 'smtp'; -$av0 = $0; -$ENV{'PATH'} .= ":/usr/etc" unless $ENV{'PATH'} =~ m,/usr/etc,; -$ENV{'PATH'} .= ":/usr/ucb" unless $ENV{'PATH'} =~ m,/usr/ucb,; -select(STDERR); - -$0 = "$av0 - running hostname"; -chop($name = `hostname || uname -n`); - -$0 = "$av0 - lookup host FQDN and IP addr"; -($hostname,$aliases,$type,$len,$thisaddr) = gethostbyname($name); - -$0 = "$av0 - parsing args"; -$usage = "Usage: $av0 [-1avwd] user[\@host] [user2[host2] ...]"; -for $a (@ARGV) { - die $usage if $a eq "-"; - while ($a =~ s/^(-.*)([1avwd])/$1/) { - eval '$'."flag_$2 += 1"; - } - next if $a eq "-"; - die $usage if $a =~ /^-/; - &expn(&parse($a,$hostname,undef,1)); -} -$verbose = $flag_v; -$watch = $flag_w; -$vw = $flag_v + $flag_w; -$debug = $flag_d; -$valid = $flag_a; -$levels = $flag_1; - -die $usage unless @hosts; -if ($valid) { - if ($valid == 1) { - $validRequirement = 0.8; - } elsif ($valid == 2) { - $validRequirement = 1.0; - } elsif ($valid == 3) { - $validRequirement = 0.9; - } else { - $validRequirement = (1 - (1/($valid-3))); - print "validRequirement = $validRequirement\n" if $debug; - } -} - -HOST: -while (@hosts) { - $server = shift(@hosts); - @users = split(' ',$users{$server}); - delete $users{$server}; - - # is this server already known to be bad? - $0 = "$av0 - looking up $server"; - if ($giveup{$server}) { - &giveup('mx domainify',$giveup{$server}); - next; - } - - # do we already have an mx record for this host? - next HOST if &mxredirect($server,*users); - - # look it up, or try for an mx. - $0 = "$av0 - gethostbyname($server)"; - - ($name,$aliases,$type,$len,$thataddr) = gethostbyname($server); - # if we can't get an A record, try for an MX record. - unless($thataddr) { - &mxlookup(1,$server,"$server: could not resolve name",*users); - next HOST; - } - - # get a connection, or look for an mx - $0 = "$av0 - socket to $server"; - - $S = new IO::Socket::INET ( - 'PeerAddr' => $server, - 'PeerPort' => $port, - 'Proto' => 'tcp'); - - if (! $S || ($debug == 10 && $server =~ /relay\d.UU.NET$/i)) { - $0 = "$av0 - $server: could not connect: $!\n"; - $emsg = $!; - unless (&mxlookup(0,$server,"$server: could not connect: $!",*users)) { - &giveup('mx',"$server: Could not connect: $emsg"); - } - next HOST; - } - $S->autoflush(1); - - # read the greeting - $0 = "$av0 - talking to $server"; - &alarm("greeting with $server",''); - while(<$S>) { - alarm(0); - print if $watch; - if (/^(\d+)([- ])/) { - if ($1 != 220) { - $0 = "$av0 - bad numeric response from $server"; - &alarm("giving up after bad response from $server",''); - &read_response($2,$watch); - alarm(0); - print STDERR "$server: NOT 220 greeting: $_" - if ($debug || $vw); - if (&mxlookup(0,$server,"$server: did not respond with a 220 greeting",*users)) { - close($S); - next HOST; - } - } - last if ($2 eq " "); - } else { - $0 = "$av0 - bad response from $server"; - print STDERR "$server: NOT 220 greeting: $_" - if ($debug || $vw); - unless (&mxlookup(0,$server,"$server: did not respond with SMTP codes",*users)) { - &giveup('',"$server: did not talk SMTP"); - } - close($S); - next HOST; - } - &alarm("greeting with $server",''); - } - alarm(0); - - # if this causes problems, remove it - $0 = "$av0 - sending helo to $server"; - &alarm("sending helo to $server",""); - &ps("helo $hostname"); - while(<$S>) { - print if $watch; - last if /^\d+ /; - } - alarm(0); - - # try the users, one by one - USER: - while(@users) { - $u = shift(@users); - $0 = "$av0 - expanding $u [\@$server]"; - - # do we already have a name for this user? - $oldname = $names{"$u *** $server"}; - - print &compact($u,$server)." ->\n" if ($verbose && ! $valid); - if ($valid) { - # - # when running with -a, we delay taking any action - # on the results of our query until we have looked - # at the complete output. @toFinal stores expansions - # that will be final if we take them. @toExpn stores - # expnansions that are not final. @isValid keeps - # track of our ability to send mail to each of the - # expansions. - # - @isValid = (); - @toFinal = (); - @toExpn = (); - } - -# ($ecode,@expansion) = &expn_vrfy($u,$server); - (@foo) = &expn_vrfy($u,$server); - ($ecode,@expansion) = @foo; - if ($ecode) { - &giveup('',$ecode,$u); - last USER; - } - - for $s (@expansion) { - $s =~ s/[\n\r]//g; - $0 = "$av0 - parsing $server: $s"; - - $skipwatch = $watch; - - if ($s =~ /^[25]51([- ]).*<(.+)>/) { - print "$s" if $watch; - print "(pretending 250$1<$2>)" if ($debug && $watch); - print "\n" if $watch; - $s = "250$1<$2>"; - $skipwatch = 0; - } - - if ($s =~ /^250([- ])(.+)/) { - print "$s\n" if $skipwatch; - ($done,$addr) = ($1,$2); - ($newhost, $newaddr, $newname) = &parse($addr,$server,$oldname, $#expansion == 0); - print "($newhost, $newaddr, $newname) = &parse($addr, $server, $oldname)\n" if $debug; - if (! $newhost) { - # no expansion is possible w/o a new server to call - if ($valid) { - push(@isValid, &validAddr($newaddr)); - push(@toFinal,$newaddr,$server,$newname); - } else { - &verbose(&final($newaddr,$server,$newname)); - } - } else { - $newmxhost = &mx($newhost,$newaddr); - print "$newmxhost = &mx($newhost)\n" - if ($debug && $newhost ne $newmxhost); - $0 = "$av0 - parsing $newaddr [@$newmxhost]"; - print "levels = $levels, level{$u *** $server} = ".$level{"$u *** $server"}."\n" if ($debug > 1); - # If the new server is the current one, - # it would have expanded things for us - # if it could have. Mx records must be - # followed to compare server names. - # We are also done if the recursion - # count has been exceeded. - if (&trhost($newmxhost) eq &trhost($server) || ($levels && $level{"$u *** $server"} >= $levels)) { - if ($valid) { - push(@isValid, &validAddr($newaddr)); - push(@toFinal,$newaddr,$newmxhost,$newname); - } else { - &verbose(&final($newaddr,$newmxhost,$newname)); - } - } else { - # more work to do... - if ($valid) { - push(@isValid, &validAddr($newaddr)); - push(@toExpn,$newmxhost,$newaddr,$newname,$level{"$u *** $server"}); - } else { - &verbose(&expn($newmxhost,$newaddr,$newname,$level{"$u *** $server"})); - } - } - } - last if ($done eq " "); - next; - } - # 550 is a known code... Should the be - # included in -a output? Might be a bug - # here. Does it matter? Can assume that - # there won't be UNKNOWN USER responses - # mixed with valid users? - if ($s =~ /^(550)([- ])/) { - if ($valid) { - print STDERR "\@$server:$u ($oldname) USER UNKNOWN\n"; - } else { - &verbose(&final($u,$server,$oldname,"USER UNKNOWN")); - } - last if ($2 eq " "); - next; - } - # 553 is a known code... - if ($s =~ /^(553)([- ])/) { - if ($valid) { - print STDERR "\@$server:$u ($oldname) USER AMBIGUOUS\n"; - } else { - &verbose(&final($u,$server,$oldname,"USER AMBIGUOUS")); - } - last if ($2 eq " "); - next; - } - # 252 is a known code... - if ($s =~ /^(252)([- ])/) { - if ($valid) { - print STDERR "\@$server:$u ($oldname) REFUSED TO VRFY\n"; - } else { - &verbose(&final($u,$server,$oldname,"REFUSED TO VRFY")); - } - last if ($2 eq " "); - next; - } - &giveup('',"$server: did not grok '$s'",$u); - last USER; - } - - if ($valid) { - # - # now we decide if we are going to take these - # expansions or roll them back. - # - $avgValid = &average(@isValid); - print "avgValid = $avgValid\n" if $debug; - if ($avgValid >= $validRequirement) { - print &compact($u,$server)." ->\n" if $verbose; - while (@toExpn) { - &verbose(&expn(splice(@toExpn,0,4))); - } - while (@toFinal) { - &verbose(&final(splice(@toFinal,0,3))); - } - } else { - print "Tossing some valid to avoid invalid ".&compact($u,$server)."\n" if ($avgValid > 0.0 && ($vw || $debug)); - print &compact($u,$server)." ->\n" if $verbose; - &verbose(&final($u,$server,$newname)); - } - } - } - - &alarm("sending 'quit' to $server",''); - $0 = "$av0 - sending 'quit' to $server"; - &ps("quit"); - while(<$S>) { - print if $watch; - last if /^\d+ /; - } - close($S); - alarm(0); -} - -$0 = "$av0 - printing final results"; -print "----------\n" if $vw; -select(STDOUT); -for $f (sort @final) { - print "$f\n"; -} -unlink("/tmp/expn$$"); -exit(0); - - -# abandon all attempts deliver to $server -# register the current addresses as the final ones -sub giveup -{ - local($redirect_okay,$reason,$user) = @_; - local($us,@so,$nh,@remaining_users); - local($pk,$file,$line); - ($pk, $file, $line) = caller; - - $0 = "$av0 - giving up on $server: $reason"; - # - # add back a user if we gave up in the middle - # - push(@users,$user) if $user; - # - # don't bother with this system anymore - # - unless ($giveup{$server}) { - $giveup{$server} = $reason; - print STDERR "$reason\n"; - } - print "Giveup at $file:$line!!! redirect okay = $redirect_okay; $reason\n" if $debug; - # - # Wait! - # Before giving up, see if there is a chance that - # there is another host to redirect to! - # (Kids, don't do this at home! Hacking is a dangerous - # crime and you could end up behind bars.) - # - for $u (@users) { - if ($redirect_okay =~ /\bmx\b/) { - next if &try_fallback('mx',$u,*server, - *mx_secondary, - *already_mx_fellback); - } - if ($redirect_okay =~ /\bdomainify\b/) { - next if &try_fallback('domainify',$u,*server, - *domainify_fallback, - *already_domainify_fellback); - } - push(@remaining_users,$u); - } - @users = @remaining_users; - for $u (@users) { - print &compact($u,$server)." ->\n" if ($verbose && $valid && $u); - &verbose(&final($u,$server,$names{"$u *** $server"},$reason)); - } -} -# -# This routine is used only within &giveup. It checks to -# see if we really have to giveup or if there is a second -# chance because we did something before that can be -# backtracked. -# -# %fallback{"$user *** $host"} tracks what is able to fallback -# %fellback{"$user *** $host"} tracks what has fallen back -# -# If there is a valid backtrack, then queue up the new possibility -# -sub try_fallback -{ - local($method,$user,*host,*fall_table,*fellback) = @_; - local($us,$fallhost,$oldhost,$ft,$i); - - if ($debug > 8) { - print "Fallback table $method:\n"; - for $i (sort keys %fall_table) { - print "\t'$i'\t\t'$fall_table{$i}'\n"; - } - print "Fellback table $method:\n"; - for $i (sort keys %fellback) { - print "\t'$i'\t\t'$fellback{$i}'\n"; - } - print "U: $user H: $host\n"; - } - - $us = "$user *** $host"; - if (defined $fellback{$us}) { - # - # Undo a previous fallback so that we can try again - # Nested fallbacks are avoided because they could - # lead to infinite loops - # - $fallhost = $fellback{$us}; - print "Already $method fell back from $us -> \n" if $debug; - $us = "$user *** $fallhost"; - $oldhost = $fallhost; - } elsif (($method eq 'mx') && (defined $mxbacktrace{$us}) && (defined $mx_secondary{$mxbacktrace{$us}})) { - print "Fallback an MX expansion $us -> \n" if $debug; - $oldhost = $mxbacktrace{$us}; - } else { - print "Oldhost($host, $us) = " if $debug; - $oldhost = $host; - } - print "$oldhost\n" if $debug; - if (((defined $fall_table{$us}) && ($ft = $us)) || ((defined $fall_table{$oldhost}) && ($ft = $oldhost))) { - print "$method Fallback = ".$fall_table{$ft}."\n" if $debug; - local(@so,$newhost); - @so = split(' ',$fall_table{$ft}); - $newhost = shift(@so); - print "Falling back ($method) $us -> $newhost (from $oldhost)\n" if $debug; - if ($method eq 'mx') { - if (! defined ($mxbacktrace{"$user *** $newhost"})) { - if (defined $mxbacktrace{"$user *** $oldhost"}) { - print "resetting oldhost $oldhost to the original: " if $debug; - $oldhost = $mxbacktrace{"$user *** $oldhost"}; - print "$oldhost\n" if $debug; - } - $mxbacktrace{"$user *** $newhost"} = $oldhost; - print "mxbacktrace $user *** $newhost -> $oldhost\n" if $debug; - } - $mx{&trhost($oldhost)} = $newhost; - } else { - $temporary_redirect{$us} = $newhost; - } - if (@so) { - print "Can still $method $us: @so\n" if $debug; - $fall_table{$ft} = join(' ',@so); - } else { - print "No more fallbacks for $us\n" if $debug; - delete $fall_table{$ft}; - } - if (defined $create_host_backtrack{$us}) { - $create_host_backtrack{"$user *** $newhost"} - = $create_host_backtrack{$us}; - } - $fellback{"$user *** $newhost"} = $oldhost; - &expn($newhost,$user,$names{$us},$level{$us}); - return 1; - } - delete $temporary_redirect{$us}; - $host = $oldhost; - return 0; -} -# return 1 if you could send mail to the address as is. -sub validAddr -{ - local($addr) = @_; - $res = &do_validAddr($addr); - print "validAddr($addr) = $res\n" if $debug; - $res; -} -sub do_validAddr -{ - local($addr) = @_; - local($urx) = "[-A-Za-z_.0-9+]+"; - - # \u - return 0 if ($addr =~ /^\\/); - # ?@h - return 1 if ($addr =~ /.\@$urx$/); - # @h:? - return 1 if ($addr =~ /^\@$urx\:./); - # h!u - return 1 if ($addr =~ /^$urx!./); - # u - return 1 if ($addr =~ /^$urx$/); - # ? - print "validAddr($addr) = ???\n" if $debug; - return 0; -} -# Some systems use expn and vrfy interchangeably. Some only -# implement one or the other. Some check expn against mailing -# lists and vrfy against users. It doesn't appear to be -# consistent. -# -# So, what do we do? We try everything! -# -# -# Ranking of result codes: good: 250, 251/551, 252, 550, anything else -# -# Ranking of inputs: best: user@host.domain, okay: user -# -# Return value: $error_string, @responses_from_server -sub expn_vrfy -{ - local($u,$server) = @_; - local(@c) = ('expn', 'vrfy'); - local(@try_u) = $u; - local(@ret,$code); - - if (($u =~ /(.+)@(.+)/) && (&trhost($2) eq &trhost($server))) { - push(@try_u,$1); - } - - TRY: - for $c (@c) { - for $try_u (@try_u) { - &alarm("${c}'ing $try_u on $server",'',$u); - &ps("$c $try_u"); - alarm(0); - $s = <$S>; - if ($s eq '') { - return "$server: lost connection"; - } - if ($s !~ /^(\d+)([- ])/) { - return "$server: garbled reply to '$c $try_u'"; - } - if ($1 == 250) { - $code = 250; - @ret = ("",$s); - push(@ret,&read_response($2,$debug)); - return (@ret); - } - if ($1 == 551 || $1 == 251) { - $code = $1; - @ret = ("",$s); - push(@ret,&read_response($2,$debug)); - next; - } - if ($1 == 252 && ($code == 0 || $code == 550)) { - $code = 252; - @ret = ("",$s); - push(@ret,&read_response($2,$watch)); - next; - } - if ($1 == 550 && $code == 0) { - $code = 550; - @ret = ("",$s); - push(@ret,&read_response($2,$watch)); - next; - } - &read_response($2,$watch); - } - } - return "$server: expn/vrfy not implemented" unless @ret; - return @ret; -} -# sometimes the old parse routine (now parse2) didn't -# reject funky addresses. -sub parse -{ - local($oldaddr,$server,$oldname,$one_to_one) = @_; - local($newhost, $newaddr, $newname, $um) = &parse2($oldaddr,$server,$oldname,$one_to_one); - if ($newaddr =~ m,^["/],) { - return (undef, $oldaddr, $newname) if $valid; - return (undef, $um, $newname); - } - return ($newhost, $newaddr, $newname); -} - -# returns ($new_smtp_server,$new_address,$new_name) -# given a response from a SMTP server ($newaddr), the -# current host ($server), the old "name" and a flag that -# indicates if it is being called during the initial -# command line parsing ($parsing_args) -sub parse2 -{ - local($newaddr,$context_host,$old_name,$parsing_args) = @_; - local(@names) = $old_name; - local($urx) = "[-A-Za-z_.0-9+]+"; - local($unmangle); - - # - # first, separate out the address part. - # - - # - # [NAME] <ADDR [(NAME)]> - # [NAME] <[(NAME)] ADDR - # ADDR [(NAME)] - # (NAME) ADDR - # [(NAME)] <ADDR> - # - if ($newaddr =~ /^\<(.*)\>$/) { - print "<A:$1>\n" if $debug; - ($newaddr) = &trim($1); - print "na = $newaddr\n" if $debug; - } - if ($newaddr =~ /^([^\<\>]*)\<([^\<\>]*)\>([^\<\>]*)$/) { - # address has a < > pair in it. - print "N:$1 <A:$2> N:$3\n" if $debug; - ($newaddr) = &trim($2); - unshift(@names, &trim($3,$1)); - print "na = $newaddr\n" if $debug; - } - if ($newaddr =~ /^([^\(\)]*)\(([^\(\)]*)\)([^\(\)]*)$/) { - # address has a ( ) pair in it. - print "A:$1 (N:$2) A:$3\n" if $debug; - unshift(@names,&trim($2)); - local($f,$l) = (&trim($1),&trim($3)); - if (($f && $l) || !($f || $l)) { - # address looks like: - # foo (bar) baz or (bar) - # not allowed! - print STDERR "Could not parse $newaddr\n" if $vw; - return(undef,$newaddr,&firstname(@names)); - } - $newaddr = $f if $f; - $newaddr = $l if $l; - print "newaddr now = $newaddr\n" if $debug; - } - # - # @foo:bar - # j%k@l - # a@b - # b!a - # a - # - $unmangle = $newaddr; - if ($newaddr =~ /^\@($urx)\:(.+)$/) { - print "(\@:)" if $debug; - # this is a bit of a cheat, but it seems necessary - return (&domainify($1,$context_host,$2),$2,&firstname(@names),$unmangle); - } - if ($newaddr =~ /^(.+)\@($urx)$/) { - print "(\@)" if $debug; - return (&domainify($2,$context_host,$newaddr),$newaddr,&firstname(@names),$unmangle); - } - if ($parsing_args) { - if ($newaddr =~ /^($urx)\!(.+)$/) { - return (&domainify($1,$context_host,$newaddr),$newaddr,&firstname(@names),$unmangle); - } - if ($newaddr =~ /^($urx)$/) { - return ($context_host,$newaddr,&firstname(@names),$unmangle); - } - print STDERR "Could not parse $newaddr\n"; - } - print "(?)" if $debug; - return(undef,$newaddr,&firstname(@names),$unmangle); -} -# return $u (@$server) unless $u includes reference to $server -sub compact -{ - local($u, $server) = @_; - local($se) = $server; - local($sp); - $se =~ s/(\W)/\\$1/g; - $sp = " (\@$server)"; - if ($u !~ /$se/i) { - return "$u$sp"; - } - return $u; -} -# remove empty (spaces don't count) members from an array -sub trim -{ - local(@v) = @_; - local($v,@r); - for $v (@v) { - $v =~ s/^\s+//; - $v =~ s/\s+$//; - push(@r,$v) if ($v =~ /\S/); - } - return(@r); -} -# using the host part of an address, and the server name, add the -# servers' domain to the address if it doesn't already have a -# domain. Since this sometimes fails, save a back reference so -# it can be unrolled. -sub domainify -{ - local($host,$domain_host,$u) = @_; - local($domain,$newhost); - - # cut of trailing dots - $host =~ s/\.$//; - $domain_host =~ s/\.$//; - - if ($domain_host !~ /\./) { - # - # domain host isn't, keep $host whatever it is - # - print "domainify($host,$domain_host) = $host\n" if $debug; - return $host; - } - - # - # There are several weird situtations that need to be - # accounted for. They have to do with domain relay hosts. - # - # Examples: - # host server "right answer" - # - # shiva.cs cs.berkeley.edu shiva.cs.berkeley.edu - # shiva cs.berkeley.edu shiva.cs.berekley.edu - # cumulus reed.edu @reed.edu:cumulus.uucp - # tiberius tc.cornell.edu tiberius.tc.cornell.edu - # - # The first try must always be to cut the domain part out of - # the server and tack it onto the host. - # - # A reasonable second try is to tack the whole server part onto - # the host and for each possible repeated element, eliminate - # just that part. - # - # These extra "guesses" get put into the %domainify_fallback - # array. They will be used to give addresses a second chance - # in the &giveup routine - # - - local(%fallback); - - local($long); - $long = "$host $domain_host"; - $long =~ tr/A-Z/a-z/; - print "long = $long\n" if $debug; - if ($long =~ s/^([^ ]+\.)([^ ]+) \2(\.[^ ]+\.[^ ]+)/$1$2$3/) { - # matches shiva.cs cs.berkeley.edu and returns shiva.cs.berkeley.edu - print "condensed fallback $host $domain_host -> $long\n" if $debug; - $fallback{$long} = 9; - } - - local($fh); - $fh = $domain_host; - while ($fh =~ /\./) { - print "FALLBACK $host.$fh = 1\n" if $debug > 7; - $fallback{"$host.$fh"} = 1; - $fh =~ s/^[^\.]+\.//; - } - - $fallback{"$host.$domain_host"} = 2; - - ($domain = $domain_host) =~ s/^[^\.]+//; - $fallback{"$host$domain"} = 6 - if ($domain =~ /\./); - - if ($host =~ /\./) { - # - # Host is already okay, but let's look for multiple - # interpretations - # - print "domainify($host,$domain_host) = $host\n" if $debug; - delete $fallback{$host}; - $domainify_fallback{"$u *** $host"} = join(' ',sort {$fallback{$b} <=> $fallback{$a};} keys %fallback) if %fallback; - return $host; - } - - $domain = ".$domain_host" - if ($domain !~ /\..*\./); - $newhost = "$host$domain"; - - $create_host_backtrack{"$u *** $newhost"} = $domain_host; - print "domainify($host,$domain_host) = $newhost\n" if $debug; - delete $fallback{$newhost}; - $domainify_fallback{"$u *** $newhost"} = join(' ',sort {$fallback{$b} <=> $fallback{$a};} keys %fallback) if %fallback; - if ($debug) { - print "fallback = "; - print $domainify_fallback{"$u *** $newhost"} - if defined($domainify_fallback{"$u *** $newhost"}); - print "\n"; - } - return $newhost; -} -# return the first non-empty element of an array -sub firstname -{ - local(@names) = @_; - local($n); - while(@names) { - $n = shift(@names); - return $n if $n =~ /\S/; - } - return undef; -} -# queue up more addresses to expand -sub expn -{ - local($host,$addr,$name,$level) = @_; - if ($host) { - $host = &trhost($host); - - if (($debug > 3) || (defined $giveup{$host})) { - unshift(@hosts,$host) unless $users{$host}; - } else { - push(@hosts,$host) unless $users{$host}; - } - $users{$host} .= " $addr"; - $names{"$addr *** $host"} = $name; - $level{"$addr *** $host"} = $level + 1; - print "expn($host,$addr,$name)\n" if $debug; - return "\t$addr\n"; - } else { - return &final($addr,'NONE',$name); - } -} -# compute the numerical average value of an array -sub average -{ - local(@e) = @_; - return 0 unless @e; - local($e,$sum); - for $e (@e) { - $sum += $e; - } - $sum / @e; -} -# print to the server (also to stdout, if -w) -sub ps -{ - local($p) = @_; - print ">>> $p\n" if $watch; - print $S "$p\n"; -} -# return case-adjusted name for a host (for comparison purposes) -sub trhost -{ - # treat foo.bar as an alias for Foo.BAR - local($host) = @_; - local($trhost) = $host; - $trhost =~ tr/A-Z/a-z/; - if ($trhost{$trhost}) { - $host = $trhost{$trhost}; - } else { - $trhost{$trhost} = $host; - } - $trhost{$trhost}; -} -# re-queue users if an mx record dictates a redirect -# don't allow a user to be redirected more than once -sub mxredirect -{ - local($server,*users) = @_; - local($u,$nserver,@still_there); - - $nserver = &mx($server); - - if (&trhost($nserver) ne &trhost($server)) { - $0 = "$av0 - mx redirect $server -> $nserver\n"; - for $u (@users) { - if (defined $mxbacktrace{"$u *** $nserver"}) { - push(@still_there,$u); - } else { - $mxbacktrace{"$u *** $nserver"} = $server; - print "mxbacktrace{$u *** $nserver} = $server\n" - if ($debug > 1); - &expn($nserver,$u,$names{"$u *** $server"}); - } - } - @users = @still_there; - if (! @users) { - return $nserver; - } else { - return undef; - } - } - return undef; -} -# follow mx records, return a hostname -# also follow temporary redirections comming from &domainify and -# &mxlookup -sub mx -{ - local($h,$u) = @_; - - for (;;) { - if (defined $mx{&trhost($h)} && $h ne $mx{&trhost($h)}) { - $0 = "$av0 - mx expand $h"; - $h = $mx{&trhost($h)}; - return $h; - } - if ($u) { - if (defined $temporary_redirect{"$u *** $h"}) { - $0 = "$av0 - internal redirect $h"; - print "Temporary redirect taken $u *** $h -> " if $debug; - $h = $temporary_redirect{"$u *** $h"}; - print "$h\n" if $debug; - next; - } - $htr = &trhost($h); - if (defined $temporary_redirect{"$u *** $htr"}) { - $0 = "$av0 - internal redirect $h"; - print "temporary redirect taken $u *** $h -> " if $debug; - $h = $temporary_redirect{"$u *** $htr"}; - print "$h\n" if $debug; - next; - } - } - return $h; - } -} -# look up mx records with the name server. -# re-queue expansion requests if possible -# optionally give up on this host. -sub mxlookup -{ - local($lastchance,$server,$giveup,*users) = @_; - local(*T); - local(*NSLOOKUP); - local($nh, $pref,$cpref); - local($o0) = $0; - local($nserver); - local($name,$aliases,$type,$len,$thataddr); - local(%fallback); - - return 1 if &mxredirect($server,*users); - - if ((defined $mx{$server}) || (! $have_nslookup)) { - return 0 unless $lastchance; - &giveup('mx domainify',$giveup); - return 0; - } - - $0 = "$av0 - nslookup of $server"; - sysopen(T,"/tmp/expn$$",O_RDWR|O_CREAT|O_EXCL,0600) || die "open > /tmp/expn$$: $!\n"; - print T "set querytype=MX\n"; - print T "$server\n"; - close(T); - $cpref = 1.0E12; - undef $nserver; - open(NSLOOKUP,"nslookup < /tmp/expn$$ 2>&1 |") || die "open nslookup: $!"; - while(<NSLOOKUP>) { - print if ($debug > 2); - if (/mail exchanger = ([-A-Za-z_.0-9+]+)/) { - $nh = $1; - if (/preference = (\d+)/) { - $pref = $1; - if ($pref < $cpref) { - $nserver = $nh; - $cpref = $pref; - } elsif ($pref) { - $fallback{$pref} .= " $nh"; - } - } - } - if (/Non-existent domain/) { - # - # These addresss are hosed. Kaput! Dead! - # However, if we created the address in the - # first place then there is a chance of - # salvation. - # - 1 while(<NSLOOKUP>); - close(NSLOOKUP); - return 0 unless $lastchance; - &giveup('domainify',"$server: Non-existent domain",undef,1); - return 0; - } - - } - close(NSLOOKUP); - unlink("/tmp/expn$$"); - unless ($nserver) { - $0 = "$o0 - finished mxlookup"; - return 0 unless $lastchance; - &giveup('mx domainify',"$server: Could not resolve address"); - return 0; - } - - # provide fallbacks in case $nserver doesn't work out - if (defined $fallback{$cpref}) { - $mx_secondary{$server} = $fallback{$cpref}; - } - - $0 = "$av0 - gethostbyname($nserver)"; - ($name,$aliases,$type,$len,$thataddr) = gethostbyname($nserver); - - unless ($thataddr) { - $0 = $o0; - return 0 unless $lastchance; - &giveup('mx domainify',"$nserver: could not resolve address"); - return 0; - } - print "MX($server) = $nserver\n" if $debug; - print "$server -> $nserver\n" if $vw && !$debug; - $mx{&trhost($server)} = $nserver; - # redeploy the users - unless (&mxredirect($server,*users)) { - return 0 unless $lastchance; - &giveup('mx domainify',"$nserver: only one level of mx redirect allowed"); - return 0; - } - $0 = "$o0 - finished mxlookup"; - return 1; -} -# if mx expansion did not help to resolve an address -# (ie: foo@bar became @baz:foo@bar, then undo the -# expansion). -# this is only used by &final -sub mxunroll -{ - local(*host,*addr) = @_; - local($r) = 0; - print "looking for mxbacktrace{$addr *** $host}\n" - if ($debug > 1); - while (defined $mxbacktrace{"$addr *** $host"}) { - print "Unrolling MX expnasion: \@$host:$addr -> " - if ($debug || $verbose); - $host = $mxbacktrace{"$addr *** $host"}; - print "\@$host:$addr\n" - if ($debug || $verbose); - $r = 1; - } - return 1 if $r; - $addr = "\@$host:$addr" - if ($host =~ /\./); - return 0; -} -# register a completed expnasion. Make the final address as -# simple as possible. -sub final -{ - local($addr,$host,$name,$error) = @_; - local($he); - local($hb,$hr); - local($au,$ah); - - if ($error =~ /Non-existent domain/) { - # - # If we created the domain, then let's undo the - # damage... - # - if (defined $create_host_backtrack{"$addr *** $host"}) { - while (defined $create_host_backtrack{"$addr *** $host"}) { - print "Un&domainifying($host) = " if $debug; - $host = $create_host_backtrack{"$addr *** $host"}; - print "$host\n" if $debug; - } - $error = "$host: could not locate"; - } else { - # - # If we only want valid addresses, toss out - # bad host names. - # - if ($valid) { - print STDERR "\@$host:$addr ($name) Non-existent domain\n"; - return ""; - } - } - } - - MXUNWIND: { - $0 = "$av0 - final parsing of \@$host:$addr"; - ($he = $host) =~ s/(\W)/\\$1/g; - if ($addr !~ /@/) { - # addr does not contain any host - $addr = "$addr@$host"; - } elsif ($addr !~ /$he/i) { - # if host part really something else, use the something - # else. - if ($addr =~ m/(.*)\@([^\@]+)$/) { - ($au,$ah) = ($1,$2); - print "au = $au ah = $ah\n" if $debug; - if (defined $temporary_redirect{"$addr *** $ah"}) { - $addr = "$au\@".$temporary_redirect{"$addr *** $ah"}; - print "Rewrite! to $addr\n" if $debug; - next MXUNWIND; - } - } - # addr does not contain full host - if ($valid) { - if ($host =~ /^([^\.]+)(\..+)$/) { - # host part has a . in it - foo.bar - ($hb, $hr) = ($1, $2); - if ($addr =~ /\@([^\.\@]+)$/ && ($1 eq $hb)) { - # addr part has not . - # and matches beginning of - # host part -- tack on a - # domain name. - $addr .= $hr; - } else { - &mxunroll(*host,*addr) - && redo MXUNWIND; - } - } else { - &mxunroll(*host,*addr) - && redo MXUNWIND; - } - } else { - $addr = "${addr}[\@$host]" - if ($host =~ /\./); - } - } - } - $name = "$name " if $name; - $error = " $error" if $error; - if ($valid) { - push(@final,"$name<$addr>"); - } else { - push(@final,"$name<$addr>$error"); - } - "\t$name<$addr>$error\n"; -} - -sub alarm -{ - local($alarm_action,$alarm_redirect,$alarm_user) = @_; - alarm(3600); - $SIG{ALRM} = 'handle_alarm'; -} -# this involves one great big ugly hack. -# the "next HOST" unwinds the stack! -sub handle_alarm -{ - &giveup($alarm_redirect,"Timed out during $alarm_action",$alarm_user); - next HOST; -} - -# read the rest of the current smtp daemon's response (and toss it away) -sub read_response -{ - local($done,$watch) = @_; - local(@resp); - print $s if $watch; - while(($done eq "-") && ($s = <$S>) && ($s =~ /^\d+([- ])/)) { - print $s if $watch; - $done = $1; - push(@resp,$s); - } - return @resp; -} -# print args if verbose. Return them in any case -sub verbose -{ - local(@tp) = @_; - print "@tp" if $verbose; -} -# to pass perl -w: -@tp; -$flag_a; -$flag_d; -$flag_1; -%already_domainify_fellback; -%already_mx_fellback; -&handle_alarm; -################### BEGIN PERL/TROFF TRANSITION -.00 ; - -'di -.nr nl 0-1 -.nr % 0 -.\\"'; __END__ -.\" ############## END PERL/TROFF TRANSITION -.TH EXPN 1 "March 11, 1993" -.AT 3 -.SH NAME -expn \- recursively expand mail aliases -.SH SYNOPSIS -.B expn -.RI [ -a ] -.RI [ -v ] -.RI [ -w ] -.RI [ -d ] -.RI [ -1 ] -.IR user [@ hostname ] -.RI [ user [@ hostname ]]... -.SH DESCRIPTION -.B expn -will use the SMTP -.B expn -and -.B vrfy -commands to expand mail aliases. -It will first look up the addresses you provide on the command line. -If those expand into addresses on other systems, it will -connect to the other systems and expand again. It will keep -doing this until no further expansion is possible. -.SH OPTIONS -The default output of -.B expn -can contain many lines which are not valid -email addresses. With the -.I -aa -flag, only expansions that result in legal addresses -are used. Since many mailing lists have an illegal -address or two, the single -.IR -a , -address, flag specifies that a few illegal addresses can -be mixed into the results. More -.I -a -flags vary the ratio. Read the source to track down -the formula. With the -.I -a -option, you should be able to construct a new mailing -list out of an existing one. -.LP -If you wish to limit the number of levels deep that -.B expn -will recurse as it traces addresses, use the -.I -1 -option. For each -.I -1 -another level will be traversed. So, -.I -111 -will traverse no more than three levels deep. -.LP -The normal mode of operation for -.B expn -is to do all of its work silently. -The following options make it more verbose. -It is not necessary to make it verbose to see what it is -doing because as it works, it changes its -.BR argv [0] -variable to reflect its current activity. -To see how it is expanding things, the -.IR -v , -verbose, flag will cause -.B expn -to show each address before -and after translation as it works. -The -.IR -w , -watch, flag will cause -.B expn -to show you its conversations with the mail daemons. -Finally, the -.IR -d , -debug, flag will expose many of the inner workings so that -it is possible to eliminate bugs. -.SH ENVIRONMENT -No enviroment variables are used. -.SH FILES -.PD 0 -.B /tmp/expn$$ -.B temporary file used as input to -.BR nslookup . -.SH SEE ALSO -.BR aliases (5), -.BR sendmail (8), -.BR nslookup (8), -RFC 823, and RFC 1123. -.SH BUGS -Not all mail daemons will implement -.B expn -or -.BR vrfy . -It is not possible to verify addresses that are served -by such daemons. -.LP -When attempting to connect to a system to verify an address, -.B expn -only tries one IP address. Most mail daemons -will try harder. -.LP -It is assumed that you are running domain names and that -the -.BR nslookup (8) -program is available. If not, -.B expn -will not be able to verify many addresses. It will also pause -for a long time unless you change the code where it says -.I $have_nslookup = 1 -to read -.I $have_nslookup = -.IR 0 . -.LP -Lastly, -.B expn -does not handle every valid address. If you have an example, -please submit a bug report. -.SH CREDITS -In 1986 or so, Jon Broome wrote a program of the same name -that did about the same thing. It has since suffered bit rot -and Jon Broome has dropped off the face of the earth! -(Jon, if you are out there, drop me a line) -.SH AVAILABILITY -The latest version of -.B expn -is available through anonymous ftp at -.IR ftp://ftp.idiom.com/pub/muir-programs/expn . -.SH AUTHOR -.I David Muir Sharnoff\ \ \ \ <muir@idiom.com> diff --git a/contrib/mail.local.linux b/contrib/mail.local.linux deleted file mode 100644 index 42d2c3c..0000000 --- a/contrib/mail.local.linux +++ /dev/null @@ -1,205 +0,0 @@ -From: Karl London <karl@borg.demon.co.uk> -Message-Id: <199308111712.SAA05454@borg.demon.co.uk> -Subject: Final port of mail.local to Linux -To: eric@cs.berkeley.edu -Date: Wed, 11 Aug 1993 18:12:27 +0100 (BST) -X-Mailer: ELM [version 2.4 PL21] -MIME-Version: 1.0 -Content-Type: text/plain; charset=US-ASCII -Content-Transfer-Encoding: 7bit -Content-Length: 11415 - -Hi, - Sorry about this.. This is a final version of mail.local for -linux.. - -This is what I would like to see distributed with 8.6 if poss... - -Karl - --------------- - -begin 600 mail.local.linux.tar.Z -M'YV0;<*D8>."S9LQ8=B\`,"PH<.'$"-*G$BQHL6*(&C`N`$#!@@`($#$N%'# -M(TB1)$V&7,D2A$<0-6C,D$%3QHT8+V/HI$$#9(V+0(,*'4HT8ITY=,+("0E@ -MC5(V12<ZE0,UJM6K6+-JW<KU:L"!!0\F?`$G#!TT;L*T*3/'!9JN<*WBA*%1 -M)<J2'T..Q'NRY0P;,6:$+`DC!@V:,VK(T#MCQDV0,.)*GFP4J5*F4ZMNS4RY -ML^?/H#^_4-%"`0@5((:\@9-'3IHS:.B`0#$FA<@<.3Q205,&A)0R9\JXH3,' -MQ!LS(,[VKN(FC9TR<N:DH9/'./(A"=.8>2.G>1@7IE$'8<,&A&O8Q,VSA?Z< -M#/C3X7V7(9,&J6LQ=>BD>>,&1!@W9(!P5&]I]#?'&W7(,49O_P4H1H%*5;>= -M'&W,P0((=TR'AG%+97@6@G3$U\8;])F1!D+Z\7>A4KW!`5T;T]$Q'PAPR/&& -M'6F0,>-99B7'&PC;D?=&AFZ<`<(8_-&7HAMSQ,<B"&O1H4-\,;@@'WWVI8'? -MDL4=!\*!"2YX)(F]M7&4;'*4D52!/C(HQHV](<G:>;'%MY(;;^BWX(5GU0<" -M&_7)YB62`$ZW'Y/^`=@FD&\(2:216([!AD!KR?$>:C)8^1N6=-R7WZ'%L?E@ -M6G)(R%T;4)ZI7HTDUB&F<OZ]^=R8<[Y6YVDLX:EG&7RBX2>@2%DW9J%<)AH@ -MK$$:]"@(D4Z:1J4@L*F<G2&1<5`=:PUGUJ'&OL"=<<HM%9",KB54'*LXZAB@ -MAQO"RJFG2UX*P@Q6CE=>&&0\)X=^TA4)I5G0I6$NE,(M6:"19I1A5H)L<2C@ -M'+UYV6=Q!YI!QQTL4IMJL%C",6EUR#:J[,'^C;$&GG>P,5]PV4H97@*[^<DJ -M&:[*5J"D=>A(\7$7/ZGC<P:YZ"#(/S+G''3246?=R]@!.J%W%PH!W1IEJ%Q= -M@]&F1VBG6N;'75OQT6"E$V5H"-VB::TE+*Q&ZYMT=7@N!6O:#7LY77%;P_NU -MQ@%5)T9O`Q[[!@C"61M=Q$NQ.J*,--I(\QCIZ>A:>T#:B.K$7_*,<9H:LPOB -MERZ.H=V)C>_7H6MTR-B?BQ36)QU_E\9'!1))3`'"%$\80<4504A1!`BU@P"% -M%$]8D00111`!@A!9@##[[[X?48035-@>A!/*#_$$]5(D(4055#PAA>U@@!&$ -M[;6?<`((UQ,1W_7-%X'%\$5,8;OXP#<!!1-))`\"[U*0PO6HT+\I7"@)3A@" -M$ZI`!`0>(6K@`X$3GD`%$/"O"4F@@O_"=Z'GQ2<)^N.?_P`H0.H5$`2Y`T$3 -MBB"%(2!A@$$00A+X1X7FM0\$1LB@$^IG.R/@+PC"ZQT!AU`%)O1.>%60`A2> -M,(4BO,]W(&C@%!08!!`FSTK`<X($GP""(EAA>A6<P@N9P`3G(0%Z19`>]>XG -MA=1LCPK=^U[XQK>\W_$OADQP(JY\V$;X13$)OAL"%0Z(/4`609"$',+QP!@$ -M)EQH"E`X9!(:>2'Y%2&$O<O"A?"G/2<T,0I5`.,DF1`?(@2A"4&0GNU0@$`% -M,M"!$*S@!"MXP0QN\`D7&MX3B.B[%5(/A4:X716$,`4"4@%\OSO"$YY`A"G$ -M!W]-E(+QAE"_'5B0B?<+9A6:>"%34B$(FVRC+G-8/6OB[WM30"`/LZC!`%8! -M"@3<7@KB@X0G7,&++$Q-$+;IOQMNCWU.:-[SQ->\%-Y1AC34Y/_.^+PV(M"- -MW`L"(F\'QR0(,CX'G6$&%8J_.5:0E0E<8`.=<`0)II%_:J0F"MM(P3-*X0JU -M*X)M>E<[!V81H,WC71:>&<$4/@\$_`2F&8.'.]T!L`B5_*(6DQ#,(!#!>$U4 -MGD_/*#QL>D^C-01F?*90!1=&\92I+$+L3I,`(*!@!"DHRUGHUA8T)*`&+A`, -M"J0F!ZI9S38Q>,%(7I"#&(3G!0H8P<W8D+/>\$"M:&BK#Q006!V9R`V]^0(4 -M@C"[+S!AEU307P)$\`(ZM`$.+S`(0@B"A=*:5@0*"(UJ5_L5@HAV+*T-RVA= -M,(;5@F8N=<G+7>RR%[NP9"0PJ$$-!B.3FMBD(XSAR0T@8]OF#N5,E_D(9[@R -M7>=:][K8E<QH2H,KU=0*/;.IS6URX[P?_28XP^D2<MC6'+=-ISI>:IIVN.,= -M>=G+/+9*3YH@)H?VC!4UFPH4O+B%M0%%RT`(4A"#%#6J"#&*0A;"D(8<YKG\ -MB(A$HT/1H5:4)AJ]*$8S0E>.=H2&'H7,420CE))`Y:0.1VE*N*K2E03<M6)Y -M"4P*'I..-H8F-0FD/[`*@ZSBM)K6Y%=CNCH1KWSTJT`)2\6&XD]QL';BD?FK -M692"CKPR->,L;0E4!P9!@TOU8%29*5AIFIFK>A/D(=/*R.A!<IZ4W*LF!VM0 -M28HRHJC\HV0-B618?M;9I,4;C5EK#-@JV+;XTZUOY8DWX@)8N=AP+ANE:T;L -M6M2[:GPH>=&+?>3Q3[Z@PR^2C2M@`VO9H4B6L(7MUV$&EIBO=F:QS96!;ZKJ -MV,<6Y>=EA<%D*%,9&5A6,!BK`&:S;ERK('=@G.DL<[7V61F`MIH9B8%HRVDO -MTMZ[-++*]VD"B]K4JE:&JRGJ;L/BVI:^)B^Q2;!LX4*;6B*VWJ)I.SK<CIN\ -MUZ+>K.&-/^KV6G3X%@:_`0YB@B,<@+Z&.&4OKD6.JUEQ)'>T`)G!<DRF=<\X -MAZN55%@V<PA=ADOWK3N@3G4>;MT<7N>&_P[5=D7=7>]^%SQ=&@]YRF.>&=&H -MQNH!-'MOC"/XQ$<^\Z%O"NK[^?L"VL7Y^<Y^*\W?_OJG/!(.L(")%"DLEQ?! -M65H0A+94'@=W_L$04OU_O2LA`>LGU!6V\(74BR%6;8@]'.IPG7QD7Q"E,,0B -M'A$*25QB$Y_X.RE2T8I$P.)#)]A%I89QC&7\:?3`R$:(5E2.1*_CU_&H1]3D -MW8\-#.0@LQCZ0XZ^E8N,NR-O%TE%4K+IE]Q?)L,)T4^&TH2-+"5853F;5FJ= -MI+'<(BW!KD&QXU)XQ./E)<$H5*X2TYC(!($RF>E,7$&3A=.LYC6AGD)^=I.R -MX(SZ.#,X!7.V$9WJA#H"VRF%=\;3"?/$53WO^<4V#F&?4?TY"K7HQX%*H:#! -ME%$)=2%7P%`N=5.=!$<2-7K%U#T7A2L"N%&TYU&]%U*O1%(F=00H-3TJA3\M -MQ4(PU40SU3WIA($/Y4<ZQ5,5-%6_$U13152Y(W.^DU33`SQ-]50Q)57!]%." -METX(M5%:A2M<Y56FA$K2<RF`%5C:`2!E@!R`,AP*,`8EMA1R`F>QL05=``(] -MH``B8%9HE1I%1B>R01MXA1NZ85[`43#]QEY'@V]*$U_9`6[?P05NP`6F<5]B -M6!S[Q1[SX0)T*`([$%B%HQT@,!H@H"M_4B"RH0))*%AFP(1.J(@*8!EZ<B13 -M^"5C,`;20098J(4@T(5GE0*Q]5H$,09OY0(V,!MT95?E9ALVH%<YP%<Q`(B" -M6"C(88B(^(2+V(B#55@@P`-SD`=S0!9*H19NL5B"Y0;.9EC!.(R4>(Q*J(R$ -MM6/`*(PO<"`FHR;0F(S+^(O-^`(FHC+;V(O4"%GZ88XO4"#C*(V^6(US8!!G -ML([=R`-F,`;#01!H@(SD:%CF2`9B((_3:%AP<`?ND8_1.(_ZL18`V8YUT!Q( -M49#ZR([4"!W=\08+28T/N1\7R8QT0`:`\H\&R8T!Z8U<4R0;^8F(Q59N@5J- -MU80%4@8)8`3@QP0)D`!^-0*.]9(),$LR^4TT"0.,I8@)H".`HB\@\`62A0(H -MH(@7(H67H0(ID`*!:`=OD",)0)%'F91+.1Q-*66RX91+H0(7X@)D&953695D -MD`!)9@9Y\"!F@!Q("05*"9:G898*()1(P1V1I95T"952J0!4:95'$0;!D95R -MB0*!209VJ0!?X08HH!1G,`8<=@9V,$\)H(C^(0>1&8@)T)<J`)EV$(A[H`!7 -MB0?DTA^8N1KG2`:<60:F"1W]T9>J"9F<:1\U0R-AL'($>1H#R9F8*8478@9D -M<"'3EA"<60<Y\@6R@9RL29I]>7%OT`:!2)K5Y@;PB`(B,(IBP08B<"&7=022 -MQ4+$(P7>^03@B4HS])>D"9VHT@,25$1,P)EWX"LJ,QNTL2'N&1QTH)J/J9F2 -MF9F4>2$B0`9FH`-RH`,B$)4@$`+N602Y8YD),`<>(H7W:1NC69,(`3$@<`)D -M<`(Z4).&*`:_M@:;$R!(\EG;(@;UR8BD69-BD"9AL`:<V9FYV1LG8`8>VJ(9 -M:J-RX*$@BAHB:C(E.B8HJA\JVALL6I.7B1PHP)X0F@`L09$HT).OEYUUP`;Z -MX3&]T0+(H9J@DJ`SF@#LZ8FSJ9EA^J(*(Z,Z6J,;^@,Y6I..%097ZC)*.IC! -M@0)_69-]0)J0.08@T`+NZ:4`PIF@"0(K$*APL)K3N:2S$0*?J9F5V:)V6@9X -MNJBC09JXD@3(,::(&')E(#HF,A\78F!S,V^5$YT@H)_P6"!X&BWU=FM0BAK, -M^2]T((5L<2&/!AT9`C&CJJ&EJC9C"BMEH9O<87$#`:NX@B1RL%]PD&?^LI^+ -MPIS@$:N`E0"SFI]JPIR52IJ$B`(A,*8F8`*-VJ08AZUTL*J.J:!\P`>8NA(A -M@`(#Z8GZ.9!I0Z[1J:Y\0"-WT`(^,)!?,*L,*B`Y$I4M.J;N":]W(*]J,I#: -MRIP*^@/ZRJ_^2C<@H`.?^`,82XOK&2#NF9=I8J]MD*<3,AO%61[N"0/6]*B4 -M:4TKL`*@":$E"P)\X)Y$V89-.IRG\;*MB0?3@0(E^Y=[.HG[^;%.ZIR7J`+L -M*9JDF4-Y=!IF``><F9!EH)S)80?&R:W#`20X6S4OR9E]20=N<"%/6`9;(`-T -M@0-=L*A@ZXGV03-P@`*215E(8%F8I3]YVJTWZXEML`9(40:?A0)@JZ`]X)XM -M$`,RFZ_O^K2>*)S5>;,">@<KD*`$6Y-22J6K)P(-*63U":W5F1Q^VZQRX&#A -M6`9@2IJ(B98IT)!/N`:`ZP8BFR:4&KB+>KH#*[4H8`)T8+5LD*>TJYA/ZQK# -M809-"@<":@085P+%@;S=>:IMT)2VB[NZNY@),+9;``-9Z)XGP`4P<`*<.;(^ -M.[:>&`/69`;Z.0<H,+87(AUZ4`;'<;XOF0+IVY$%(I46VJ+=2KW6JX782X<G -M\*1<"UGA.Z-5HZ$76I/=^K^]$:Z)"%G5>[W8:P3KH\`A(`9C\+?H^XG&BZK+ -M6P.3JZ2]FU;Y,08H<`(^<`+!"0=Y2KG@>[(SNJ<U^<&_JXC"^[0"JKQB^[XS -MVJT)LZS<,;P=G`!H&J.<&;0)8(B:2C`K1YB]@8B0E3(OZ;FMDQ8R@K.0-2/_ -M03BF&;I6DJ3=&@(%HB-XX+Z0=2'9ZP;]"Z$?#`<A/,+\>\)Y:HA/D!]J+!MA -M<(AEX,2094VZLF2?JS3\-@=*/&4=EA#*TH>G4:UIO,9E;,)`@L*SFY@I\):$ -M-0=HX,.^R:0[;"-RX,,PNZQ3.I,"*B.?Q1VB>ZP8@CJ]09'<4;H)D"9TD"". -M*9Q`RU@UJR^.>XCS9IF8*9Q>>[1TH[01VBFW28E?(@:U*<S,-JP2&B`JT)M8 -M^Y4P.L47T@9B()P7X@9R<,UW@*MO>2']=;6=>8EN:085<@9;,!==<"'X809; -M@`,J@!,R0`/IC)MGL06H-#]RFT=.D+;4^994BV@VTLU_`C%EP+KJ6<0J@*FH -M003U0<A#PBQ<JR\@,S@->3)#TA]L]:<M`#J?*C#ET5IO@@<-@Q#]\3<*#0(E -M!B#"%F:P`C$`TEK^`2@U6ARC.ZV'S*U,^J[Q:J[TJA8H0#=16;^4Z\D\"<J? -M6-$H@]'S9K$VC,MKD<*N#,LH$`-Y2L0?''+`2P?"BU@U/(Q-';>5A9Y,$'K7 -MG,N+VL6T$<TSXIZ4EA1T`*]F@0878@)S(`8*&J[M&A(H4-<N@!1?8)T%L@8+ -MZIZ&NZZW\P6UPP1.L`1[_8]^/2(Z$M0@4,!26M0^V=46N[HS,KK+BUA0G:W= -M,=55S5@(?=*[`1UE<`)39AZ_UAN0MJ4;?3&#PRH+LG(-TR=N(-C*X3>/=B1J -M308GC2S'BD4Q4QQK\1_%(=SU2=*(^#<"`MBYW8<*7:UX2\W"J85Y;1PNXIA< -MC4)?$`10$$G8PP=/\`5#X#N41=Y?<`7$XP1,H%!3@-CM-P52P`?QG017L$U2 -MH*`\X!)"?95$34&6B]D@T-3=;1^JO,D4B2=V69-1'=I4/<2D_<TFZQ*<:8BF -M9;%/L-U?@@8(P@8!XM`):P:BM08G0#+*70;61-`9X0(T0$R)=].,VJ0EC@+6 -MC;.7-01+\`7RHZ"4'>!4,."?B+Q,/0>='=?QFR8\K.#+RN!0K;L!W*)GD"># -M(Z+-F0!$#-#'@1QL3="L>^,7`@.KUT1%L./30P2\"\E8+<,H,,[EW-5`4`(@ -M_H=EO19-F2!;?K=,2FEE4-"W+.:/5`1E_@5-1`6V,;BSL>7*F0*%^]^5:]0B -M(,J@6\HJ4^3+B^!+[K--_@8-WLI03M@S.N70:N423IKS:<I*B<V>"*-D<,OK -MG+YIL+[MN\Z2[0/^7;#?@@);[HDH:QW(T=_8K,=+`:B'N,V^;JCNZ09W\*1X -MJ^R>:'+30:E@+F9U@!PKX.O7+`?\[=^3W:)#O<F67:5$7N!&?B$'WBD)KND5 -MV>DU*>J#(\S*&*8NW*VJWM\PX.B>+.21_KFD3&:C:^E)GNX+SNE_">]C\*$) -M`,,&#S`V7LTXJ^5O^>0)$>583MJ7&JNWHR:+<M%G@S5G8"-U``=8A`2!PATG -M0LAYH,X%`M-IIC!3G''^$2(8KS!2^"\#`=%%"1UY@$57L,2#8Q!%<C;6DG$K -MLG+8@N(E9C.O>M(<'QV^`@<.PSHPLG)@=@>H;8G_$1S'\MH8DIO^H1ZYR6@C -M:RT'<]('8M,L:N4?VJUC\-NVT:(P+(47W?#6'+']>@?_FB/FOJ]W_P5G,+"/ -MC+IF$(S*2/>*N0,_&D7\<0*R@3'3\6`"`@=D`#!;C,B0+"EO`#&&+Y6)GP2? -M!2BBLYS6>1!K4/FDW<44#J%KV9;:(;QN/@=GD*</[IBI'XA!FY@*L/KC;..P -M;YE]6<[`3(FD8YO,AHU.009D(`=?P";XDOS'O"U^NLN>6+C'+`>WZ>%]F[4J -M@`902YK$#W)\J/TAYYM9JS)N<-8YW?R6TB]?8`9J,1!Y\-^&*#5?<JQ92XCC -M_"7LH62'F"?^8;4#07.5`=-GP'+:7H-ZYHJ_V(%K0S>PTSA;7IB+#,`!R?6D -M9E\.,X#<3V%]"*3``.<-=B)%V(\.4,!NIZ0JFX"#="`P\TD)<G?IT%VF&WCL -MS@*V*!>6`-1?7RL0[>_]L8'JX)ZX'[]"`U]`_5$'%S&C*%B100$^T`<`0?4W -MUVP@^V."*`T._,`O8/[.P%E(84X0!X(NV="QI*`/F`-?8`M*N!GWZUP""%!@ -M38IMD3XU@0*"@!%`;#N$`>V2'4<$CH``:0)A3G`1+JI&`@$<N#N!E^T3&3\U -M`?"^A`O49.K.R<TH&5CQII=P8%N=POSQOMAGJ$3")9L-+HT,[*<F-<U@G]@2 -M#F'N0NPU9`9R2)_ZJTLF``JJ+_8EO-3?Y&()`<O\=;(_&.0@728<=:VO$&(Z -M1`@#9QE@0DL*8%+A*05PH1Y=(,1<@"PX6"SM-%I`P!;@4LPK"PV(I4"67$#I -M"EJ.*"L5$R(P!)#201I)P*@C0:9M-,!NC4AJ1U8K=&DFQ5*+2@1CP7W9$"EM -MPV[X!12`E,),]<'])04VT)68Q%<Z6N2,#HRELB2(^)P]]&3YT"PDA.#4!NB` -M+KM_<T`?@K/GU!`YD]7Z`F1`4K1#[4`,2=-%!!9TK/O%0T)'!;BA-TP`%]$R -M[(O'1+R`1$/\2R.@''K$,/`%5.);"P..;".:`8_8C*[3=^)Q`80A"D3_D!-1 -M(DTL'"Q1S\V&A+@/81;/>FL13@'LJ>Q"%:NB5;R*6#$K:L6M*!&8X5AH`C'* -M):D,KJ@5<`MR.0F]1;>DQ;[0$F2`3B`N,Z$F<(2<(`-L@&)@+F2QN4"7I2!= -MGD)7J"YY,3`*1LDP`LI**`*+5&-TG2*YLHK(3?P3"7KE!L@BQJ)+CD`/2`!> -MD0TH`%3B!'#`9<R,+@`HR9`)<@6<P&6T$7E"`8S&)L!,BD`/H`'"I0:H1@02 -M>GK`"Q@5C,4%[*-?)`;F@'M@%?%H;RV6P4@<BZ-Q/(Z",3.^`-"(`Y!C13"+ -MO"4EJ$7IR!97@@VP`3>`!@R&CF`#8*,,4`RI2"0TAL?@$IPC9=B+F,$O4A?U -M:![;HWMD"'Y(!("A[Q(;PDL9(B^G33Z@E_0@:[)-&WH;PN+;T!>!`1[B(Z@I -M#WE(/2A`Z18?%8"!##!>YE,PF@*CH=@$CA$36&/,F`H(<R$R3<G1$"#"07(! -M^0C9,LRB"5N9J45\F-018BS-B-EZ)J;/B(P_XR^@#)<0D?+Q2;P8'"D2-,5\ -MH#%?1LH(BPM)9';,F>DQ:P+(_`@A`R?>C!CBD7=BSNP)F`<2GTR>*19\IC?T -M&D!3'R1%EK$4/)++0,B`4RQ$!83P=Z>"QZR*B/,JEJ2;J4)/TD!&R5U19XI# -ME<0SQ`+,9$E&@6*N3)=T%M""T-P:.5DMKD7+.)&-9BGDJDA#+CQ:I;D1+U+" -MG`5-`R0E9,OAD9_FON`+?5%J_,6IF33&K6"L&G_1:E[9J_D6L:;>^(F*L7$& -MY8AD"4>26=0'CU%P>,V,]#7`9D@(&V(S'*9$?$0V,H--V@R)U#!8I:V!:-1& -M:(@9;`-4[@V`/`XX,@$(R.X0;I;'N+$:QL+?I!N]$1T*Y*MT-V3#;,B-'T&Q -M^F.S_(_YYEO\JKJ!'-!-WJ@Q>X-0_@N#\S!VQ.`H'`PGZEF./`%QEDWD"!B4 -M(U@E&V.9,>3EQ^%HH(ITU`C3<<I`S.KX,%0/=N!('CD[8)!1F3G`PW;8G$62 -M<P0*59D\:T3_)""A,T>*SOG(F$FG??!(/R(_Z`?W<2AF9X2DG:M3/[+.!7H@ -M7$>64)"O@T&*C_,X/A[$0(*0J2,S`PC-S"8JA(6X$!CR@[+*#2$G.P3J?)Z] -MTW>,B#@)/$S$B1A(C&EXC`CB43Q:A/'@DU\B1AI)Y/F8:83R1)V1Z3V&#AT1 -M`G9DD@B!/,(C/P_3*3T3A38:DKR90%)/((0DDN3U6!),\G]H3R>Q/:(D]QC( -M(A165HGON9G!Q^O4$I\Y=G2)\O$E*RB8.)]BDD&BS_1I)CSR^D@3BZ)]+@OW -MT2;<Y*M\$]HS?LI)U$$_41-]4`_QY'Z2@#SAD?,'G]@?_--/ZLX_Z3]GA*`( -ME0A40PB0`<HG#V5D+J!'4E$NBH$DGAREC5`@D.)*1DI)V2$:*`FDE-_A@1I* -M")(I[(,$V903Q'12D(%\`CUE!U$5%Z0^+:8,0BJ-IP8Q%?:!@_(/"ZHJ]N.J -M)!2M8B"'$!+X*D9(K$S,7^F%1)%`<"W;R07@@`1@`Q2H*KJ6K2@CO`";,!D; -MI`L@`@$B""S,\F`3+D0,P`U^Y8+*!K'F`G)<(P$!.,!!/H$FX0*FP(9P`J=$ -M:SH!,W-`94M"<)!.($!XK#)Q0,-,'0-I;P`/.$@7>CNRP`2!`NG$F;B`&6KS -M$.AH4:%0SPB4!^00!)8">W*05;1>4D.R-$0W!/*8(MT#GMA.)X!#4058!`ND -M2`&PNN3V(RP#@%`*`:)`S+'(EQP&QQ4K'"W@.'`I4X8U<.)V(P.A0C9`*YJ' -M!K#H4IB&&XJ%0H$?>D`50$U3`*?-D&I1QJ0JG%L=TUTY0HLZM0'H(*$`'("D -M/\)+"<DGX?5ZS1SPE4*@/+2`I&`D6D"&T(0;`@_(TBOJ`I*`;)"B0()]6%'+ -MH0"F@,AA2XLB$T('U;9)"V01T(PNP),J@"10*-)%'9AX,.V/!3*6]B.`*!Y( -MD3CO642[H9$H",=GH0X*`'SU&FMS-198;_@;?\\--`=_D6E:6DDR$N4C@Z$* -M]0$>@`CXVAH_!NGUABSA+^(IQE$?O6*?%HYA6APH5A]-#H+&$*J%3QHLR\`? -MM9>$X]=LB%J&V@)$-&4+R9"3`A$5]1\$&_CR$WYTH"8<0HK$,FH]355J30ZL -MTI2&]4(7Y#@;**!\E+#^%2TJC4,5J74T452'CZHDRP1&56(*X-35/"1QI1Q$ -MF0@48;$_C*PZYD]15=*I63""7)C3`JE,\R-,&UV"+)7A`9PA'8#&3EV#ZV+" -M.$@L8$5+'`B0`4&5/O'0FP=2X<!#=0^=]),>,5A1/L99TE&`_,]/S#YR.E:7 -M0OEB#QU0;0@&%J``8$7^6Y!+P4^LI30P([P$14T3%K6&QE50.BB9:&8,AOH! -M4"@-UX1N/`*CF0.NHK9%&*SA`SP"(;JC2\XX9*($`39:Z(:8'L:CO6%.!YE* -M_Q0K_5.O=%)^L8+A(&UI%[$#SD,+*(`J@'!R*L00I$O2K=J(A0DP$*K:T`/\ -M(6+T5.?*%I+"9S&FR)2(,JWZ05M5Z6UUI3EB4G:6SQ):$JAI,2U_ZD25!<C1 -M6V7#(BU$G@6TD"(7<%Y+2V'E=^I00APK%NI;W^L+2(?+\8"^@&D8#/D+,;6F -MLC)-0`[ND`<<Y#'MHK=#T+$/)H`[^FH3%0D@@+#2UZ6`!S(AAM6P9!5(F-7% -M`&+]JII0@(&U-PQ6"WNB`)ELP`$9UL)F0IB60ETK"*`=Q82@*``@`EI9QW%= -M&DN4AJ+1[:0`D&"#>$)&`L&R.I+A]:Q>J/%Z,.VQQC\%$%)91!QU`UA4-MB! -M&P`"P(/7$U8VXN.IA3)Z8<'#>SRS:#;-JMDURV;;K)M]LW`VSLK9.4MGZZR= -HO;-X-L_JV3W+9_NLG_VS@#;0"MI!2V@+K:$]M(@VT2K:1<MH&^UD`$MG -` -end diff --git a/contrib/mailprio b/contrib/mailprio deleted file mode 100644 index 58feba7..0000000 --- a/contrib/mailprio +++ /dev/null @@ -1,557 +0,0 @@ -Received: from austin.bsdi.com (root{9l9gVDC7v8t3dlv0OtXTlby6X1zBWd56}@austin.BSDI.COM [205.230.224.49]) by knecht.Sendmail.ORG (8.8.2/8.8.2) with ESMTP id JAA05023 for <eric@sendmail.org>; Thu, 31 Oct 1996 09:29:47 -0800 (PST) -Received: from austin.bsdi.com (localhost [127.0.0.1]) by austin.bsdi.com (8.7.4/8.7.3) with ESMTP id KAA19250; Thu, 31 Oct 1996 10:28:18 -0700 (MST) -Message-Id: <199610311728.KAA19250@austin.bsdi.com> -To: Eric Allman <eric@sendmail.org> -cc: marc@xfree86.org -Subject: Updated mailprio_0_93.shar -From: Tony Sanders <sanders@earth.com> -Organization: Berkeley Software Design, Inc. -Date: Thu, 31 Oct 1996 10:28:14 -0700 -Sender: sanders@austin.bsdi.com - -Eric, please update contrib/mailprio in the sendmail distribution -to this version at your convenience. Thanks. - -I've also made this available in: - ftp://ftp.earth.com/pub/postmaster/ - -mailprio_0_93.shar follows... - -#!/bin/sh -# This is a shell archive (produced by GNU sharutils 4.1). -# To extract the files from this archive, save it to some FILE, remove -# everything before the `!/bin/sh' line above, then type `sh FILE'. -# -# Made on 1996-10-31 10:07 MST by <sanders@earth.com>. -# -# Existing files will *not* be overwritten unless `-c' is specified. -# -# This shar contains: -# length mode name -# ------ ---------- ------------------------------------------ -# 8260 -rwxr-xr-x mailprio -# 3402 -rw-r--r-- mailprio.README -# 4182 -rwxr-xr-x mailprio_mkdb -# -touch -am 1231235999 $$.touch >/dev/null 2>&1 -if test ! -f 1231235999 && test -f $$.touch; then - shar_touch=touch -else - shar_touch=: - echo - echo 'WARNING: not restoring timestamps. Consider getting and' - echo "installing GNU \`touch', distributed in GNU File Utilities..." - echo -fi -rm -f 1231235999 $$.touch -# -# ============= mailprio ============== -if test -f 'mailprio' && test X"$1" != X"-c"; then - echo 'x - skipping mailprio (file already exists)' -else - echo 'x - extracting mailprio (text)' - sed 's/^X//' << 'SHAR_EOF' > 'mailprio' && -#!/usr/bin/perl -# -# mailprio,v 1.4 1996/10/31 17:03:52 sanders Exp -# Version 0.93 -- Thu Oct 31 09:42:25 MST 1996 -# -# mailprio -- setup mail priorities for a mailing list -# -# Copyright 1994, 1996, Tony Sanders <sanders@earth.com> -# Rights are hereby granted to download, use, modify, sell, copy, and -# redistribute this software so long as the original copyright notice -# and this list of conditions remain intact and modified versions are -# noted as such. -# -# I would also very much appreciate it if you could send me a copy of -# any changes you make so I can possibly integrate them into my version. -# -# Options: -# -p priority_database -- Specify database to use if not default -# -q -- Process sendmail V8.8.X queue format files -# -# Sort mailing lists or sendmail queue files by mailprio database. -# Files listed on the command line are locked and then sorted in place, in -# the absence of any file arguments it will read STDIN and write STDOUT. -# -# Examples: -# mailprio < mailing-list > sorted_list -# mailprio mailing-list1 mailing-list2 mailing-list3 ... -# mailprio -q /var/spool/mqueue/qf* -# To double check results: -# sort sorted_list > checkit; sort orig-mailing-list | diff - checkit -# -# To get the maximum value from a transaction delay based priority -# function you need to reorder the distribution list (and the mail -# queue files for that matter) fairly often; you could even have -# your mailing list software reorder the list before each outgoing -# message. -# -$usage = "Usage: mailprio [-p priodb] [-q] [mailinglists ...]\n"; -$home = "/home/sanders/lists"; -$priodb = "$home/mailprio"; -$locking = "flock"; # "flock" or "fcntl" -X -# In shell, it would go more or less like this: -# old_mailprio > /tmp/a -# fgrep -f lists/inet-access /tmp/a | sed -e 's/^.......//' > /tmp/b -# ; /tmp/b contains list of known users, faster delivery first -# fgrep -v -f /tmp/b lists/inet-access > /tmp/c -# ; put all unknown stuff at the top of new list for now -# echo '# -----' >> /tmp/c -# cat /tmp/b >> /tmp/c -X -$qflag = 0; -while ($main'ARGV[0] =~ /^-/) { -X $args = shift; -X if ($args =~ m/\?/) { print $usage; exit 0; } -X if ($args =~ m/q/) { $qflag = 1; } -X if ($args =~ m/p/) { -X $priodb = shift || die $usage, "-p requires argument\n"; } -} -X -push(@main'ARGV, '-') if ($#ARGV < 0); -while ($file = shift @ARGV) { -X if ($file eq "-") { -X $source = "main'STDIN"; -X $sink = "main'STDOUT"; -X } else { -X $sink = $source = "FH"; -X open($source, "+< $file") || do { warn "$file: $!\n"; next; }; -X if (!defined &seize($source, &LOCK_EX | &LOCK_NB)) { -X # couldn't get lock, just skip it -X close($source); -X next; -X } -X } -X -X local(*list); -X &process($source, *list); -X -X # setup to write output -X if ($file ne "-") { -X # zero the file (FH is hardcoded because truncate requires it, sigh) -X seek(FH, 0, 0) || die "$file: seek: $!\n"; -X truncate(FH, 0) || die "$file: truncate: $!\n"; -X } -X -X # do the dirty work -X &output($sink, *list); -X -X close($sink) || warn "$file: $!\n"; # close clears the lock -X close($source); -} -X -sub process { -X # Setup %list and @list -X local($source, *list) = @_; -X local($addr, $canon); -X while ($addr = <$source>) { -X chop $addr; -X next if $addr =~ /^# ----- /; # that's our line -X push(@list, $addr), next if $addr =~ /^\s*#/; # save comments -X if ($qflag) { -X next if $addr =~ m/^\./; -X push(@list, $addr), next if !($addr =~ s/^(R[^:]*:)//); -X $Rflags = $1; -X } -X $canon = &canonicalize((&simplify_address($addr))[0]); -X unless (defined $canon) { -X warn "$file: no address found: $addr\n"; -X push(@list, ($qflag?$Rflags:'') . $addr); # save it as is -X next; -X } -X if (defined $list{$canon}) { -X warn "$file: duplicate: ``$addr -> $canon''\n"; -X push(@list, ($qflag?$Rflags:'') . $addr); # save it as is -X next; -X } -X $list{$canon} = $addr; -X } -} -X -sub output { -X local($sink, *list) = @_; -X -X local($to, *prio, *userprio, *useracct); -X dbmopen(%prio, $priodb, 0644) || die "$priodb: $!\n"; -X foreach $to (keys %list) { -X if (defined $prio{$to}) { -X # add to list of found users (%userprio) and remove from %list -X # so that we know what users were not yet prioritized -X $userprio{$to} = $prio{$to}; # priority -X $useracct{$to} = $list{$to}; # string -X delete $list{$to}; -X } -X } -X dbmclose(%prio); -X -X # Put all the junk we found at the very top -X # (this might not always be a feature) -X print $sink join("\n", @list), "\n" if int(@list); -X -X # prioritized list of users -X if (int(keys %userprio)) { -X print $sink '# ----- prioritized users', "\n" unless $qflag; -X foreach $to (sort by_userprio keys %userprio) { -X die "Opps! Something is seriously wrong with useracct: $to\n" -X unless defined $useracct{$to}; -X print $sink 'RFD:' if $qflag; -X print $sink $useracct{$to}, "\n"; -X } -X } -X -X # unprioritized users go last, fast accounts will get moved up eventually -X # XXX: should go before the "really slow" prioritized users? -X if (int(keys %list)) { -X print $sink '# ----- unprioritized users', "\n" unless $qflag; -X foreach $to (keys %list) { -X print $sink 'RFD:' if $qflag; -X print $sink $list{$to}, "\n"; -X } -X } -X -X print $sink ".\n" if $qflag; -} -X -sub by_userprio { -X # sort first by priority, then by key. -X $userprio{$a} <=> $userprio{$b} || $a cmp $b; -} -X -# REPL-LIB --------------------------------------------------------------- -X -sub canonicalize { -X local($addr) = @_; -X # lowercase, strip leading/trailing whitespace -X $addr =~ y/A-Z/a-z/; $addr =~ s/^\s+//; $addr =~ s/\s+$//; $addr; -} -X -# @addrs = simplify_address($addr); -sub simplify_address { -X local($_) = shift; -X 1 while s/\([^\(\)]*\)//g; # strip comments -X 1 while s/"[^"]*"//g; # strip comments -X split(/,/); # split into parts -X foreach (@_) { -X 1 while s/.*<(.*)>.*/\1/; -X s/^\s+//; -X s/\s+$//; -X } -X @_; -} -X -### ---- ### -# -# Error codes -# -do 'errno.ph'; -eval 'sub ENOENT {2;}' unless defined &ENOENT; -eval 'sub EINTR {4;}' unless defined &EINTR; -eval 'sub EINVAL {22;}' unless defined &EINVAL; -X -# -# File locking -# -do 'sys/unistd.ph'; -eval 'sub SEEK_SET {0;}' unless defined &SEEK_SET; -X -do 'sys/file.ph'; -eval 'sub LOCK_SH {0x01;}' unless defined &LOCK_SH; -eval 'sub LOCK_EX {0x02;}' unless defined &LOCK_EX; -eval 'sub LOCK_NB {0x04;}' unless defined &LOCK_NB; -eval 'sub LOCK_UN {0x08;}' unless defined &LOCK_UN; -X -do 'fcntl.ph'; -eval 'sub F_GETFD {1;}' unless defined &F_GETFD; -eval 'sub F_SETFD {2;}' unless defined &F_SETFD; -eval 'sub F_GETFL {3;}' unless defined &F_GETFL; -eval 'sub F_SETFL {4;}' unless defined &F_SETFL; -eval 'sub O_NONBLOCK {0x0004;}' unless defined &O_NONBLOCK; -eval 'sub F_SETLK {8;}' unless defined &F_SETLK; # nonblocking -eval 'sub F_SETLKW {9;}' unless defined &F_SETLKW; # lockwait -eval 'sub F_RDLCK {1;}' unless defined &F_RDLCK; -eval 'sub F_UNLCK {2;}' unless defined &F_UNLCK; -eval 'sub F_WRLCK {3;}' unless defined &F_WRLCK; -$s_flock = "sslll"; # struct flock {type, whence, start, len, pid} -X -# return undef on failure -sub seize { -X local ($FH, $lock) = @_; -X local ($ret); -X if ($locking eq "flock") { -X $ret = flock($FH, $lock); -X return ($ret == 0 ? undef : 1); -X } else { -X local ($flock, $type) = 0; -X if ($lock & &LOCK_SH) { $type = &F_RDLCK; } -X elsif ($lock & &LOCK_EX) { $type = &F_WRLCK; } -X elsif ($lock & &LOCK_UN) { $type = &F_UNLCK; } -X else { $! = &EINVAL; return undef; } -X $flock = pack($s_flock, $type, &SEEK_SET, 0, 0, 0); -X $ret = fcntl($FH, ($lock & &LOCK_NB) ? &F_SETLK : &F_SETLKW, $flock); -X return ($ret == -1 ? undef : 1); -X } -} -SHAR_EOF - $shar_touch -am 1031100396 'mailprio' && - chmod 0755 'mailprio' || - echo 'restore of mailprio failed' - shar_count="`wc -c < 'mailprio'`" - test 8260 -eq "$shar_count" || - echo "mailprio: original size 8260, current size $shar_count" -fi -# ============= mailprio.README ============== -if test -f 'mailprio.README' && test X"$1" != X"-c"; then - echo 'x - skipping mailprio.README (file already exists)' -else - echo 'x - extracting mailprio.README (text)' - sed 's/^X//' << 'SHAR_EOF' > 'mailprio.README' && -mailprio README -X -mailprio.README,v 1.2 1996/10/31 17:03:54 sanders Exp -Version 0.93 -- Thu Oct 31 09:42:25 MST 1996 -X -Copyright 1994, 1996, Tony Sanders <sanders@earth.com> -Rights are hereby granted to download, use, modify, sell, copy, and -redistribute this software so long as the original copyright notice -and this list of conditions remain intact and modified versions are -noted as such. -X -I would also very much appreciate it if you could send me a copy of -any changes you make so I can possibly integrate them into my version. -X -The current version of this and other related mail tools are available in: -X ftp://ftp.earth.com/pub/postmaster/ -X -Even with the new persistent host status in sendmail V8.8.X this -function can still reduce the lag time distributing mail to a large -group of people. It also makes it a little more likely that everyone -will get mailing list mail in the order sent which can help reduce -duplicate postings. Basically, the goal is to put slow hosts at -the bottom of the list so that as many fast hosts are delivered -as quickly as possible. -X -CONTENTS -======== -X -X mailprio.README -- simple docs -X mailprio -- the address sorter -X mailprio_mkdb -- builds the database for the sorter -X -X -CHANGES -======= -X Version 0.92 -X Initial public release. -X -X Version 0.93 -X Updated to make use of the (somewhat) new xdelay statistic. -X Changed -q flag to support new sendmail queue file format (RFD:<addr>). -X Fixed argument parsing bug. -X Fixed bug with database getting "garbage" in it. -X -X -CONFIGURATION -============= -X -X You need to edit each script and ensure proper configuration. -X -X In mailprio check: #!perl path, $home, $priodb, $locking -X -X In mailprio_mkdb check: #!perl path, $home, $priodb, $maillog -X -X -USAGE: mailprio -=============== -X -X Usage: mailprio [-p priodb] [-q] [mailinglists ...] -X -p priority_database -- Specify database to use if not default -X -q -- Process sendmail queue format files -X [USE WITH CAUTION] -X -X Sort mailing lists or sendmail V8 queue files by mailprio database. -X Files listed on the command line are locked and then sorted in place, in -X the absence of any file arguments it will read STDIN and write STDOUT. -X -X Examples: -X mailprio < mailing-list > sorted_list -X mailprio mailing-list1 mailing-list2 mailing-list3 ... -X mailprio -q /var/spool/mqueue/qf* [not recommended] -X To double check results: -X sort sorted_list > checkit; sort orig-mailing-list | diff - checkit -X -X NOTE: -X To get the maximum value from a transaction delay based priority -X function you need to reorder the distribution list (and the mail -X queue files for that matter) fairly often; you could even have -X your mailing list software reorder the list before each outgoing -X message. -X -X -USAGE: mailprio_mkdb -==================== -X -X Usage: mailprio_mkdb [-l maillog] [-p priodb] -X -l maillog -- Specify maillog to process if not default -X -p priority_database -- Specify database to use if not default -X -X Builds the mail priority database using information from the maillog. -X -X Run at least nightly before you rotate the maillog. If you are -X going to run mailprio more often than that then you will need to -X load the current maillog information before that will do any good -X (and to keep from reloading the same information you will need -X some kind of incremental maillog information to load from). -SHAR_EOF - $shar_touch -am 1031100396 'mailprio.README' && - chmod 0644 'mailprio.README' || - echo 'restore of mailprio.README failed' - shar_count="`wc -c < 'mailprio.README'`" - test 3402 -eq "$shar_count" || - echo "mailprio.README: original size 3402, current size $shar_count" -fi -# ============= mailprio_mkdb ============== -if test -f 'mailprio_mkdb' && test X"$1" != X"-c"; then - echo 'x - skipping mailprio_mkdb (file already exists)' -else - echo 'x - extracting mailprio_mkdb (text)' - sed 's/^X//' << 'SHAR_EOF' > 'mailprio_mkdb' && -#!/usr/bin/perl -# -# mailprio_mkdb,v 1.5 1996/10/31 17:03:53 sanders Exp -# Version 0.93 -- Thu Oct 31 09:42:25 MST 1996 -# -# mailprio_mkdb -- make mail priority database based on delay times -# -# Copyright 1994, 1996, Tony Sanders <sanders@earth.com> -# Rights are hereby granted to download, use, modify, sell, copy, and -# redistribute this software so long as the original copyright notice -# and this list of conditions remain intact and modified versions are -# noted as such. -# -# I would also very much appreciate it if you could send me a copy of -# any changes you make so I can possibly integrate them into my version. -# -# The average function moves the value around quite rapidly (half-steps) -# which may or may not be a feature. This version uses the new xdelay -# statistic (new as of sendmail V8) which is per transaction. We also -# weight the result based on the overall delay. -# -# Something that might be worth doing for systems that don't support -# xdelay would be to compute an approximation of the transaction delay -# by sorting by messages-id and delay then computing the difference -# between adjacent delay values. -# -# To get the maximum value from a transaction delay based priority -# function you need to reorder the distribution list (and the mail -# queue files for that matter) fairly often; you could even have -# your mailing list software reorder the list before each outgoing -# message. -X -$usage = "Usage: mailprio_mkdb [-l maillog] [-p priodb]\n"; -$home = "/home/sanders/lists"; -$maillog = "/var/log/maillog"; -$priodb = "$home/mailprio"; -X -while ($ARGV[0] =~ /^-/) { -X $args = shift; -X if ($args =~ m/\?/) { print $usage; exit 0; } -X if ($args =~ m/l/) { -X $maillog = shift || die $usage, "-l requires argument\n"; } -X if ($args =~ m/p/) { -X $priodb = shift || die $usage, "-p requires argument\n"; } -} -X -$SIG{'PIPE'} = 'handle_pipe'; -X -# will merge with existing information -dbmopen(%prio, $priodb, 0644) || die "$priodb: $!\n"; -&getlog_stats($maillog, *prio); -dbmclose(%prio); -exit(0); -X -sub handle_pipe { -X dbmclose(%prio); -} -X -sub getlog_stats { -X local($maillog, *stats) = @_; -X local($to, $delay); -X local($h, $m, $s); -X open(MAILLOG, "< $maillog") || die "$maillog: $!\n"; -X while (<MAILLOG>) { -X next unless / to=/ && / stat=/; -X next if / stat=queued/; -X if (/ stat=sent/i) { -X # read delay and xdelay and convert to seconds -X ($delay) = (m/ delay=([^,]*),/); -X next unless $delay; -X ($h, $m, $s) = split(/:/, $delay); -X $delay = ($h * 60 * 60) + ($m * 60) + $s; -X -X ($xdelay) = (m/ xdelay=([^,]*),/); -X next unless $xdelay; -X ($h, $m, $s) = split(/:/, $xdelay); -X $xdelay = ($h * 60 * 60) + ($m * 60) + $s; -X -X # Now weight the delay factor by the transaction delay (xdelay). -X $xdelay /= 300; # [0 - 1(@5 min)] -X $xdelay += 0.5; # [0.5 - 1.5] -X $xdelay = 1.5 if $xdelay > 1.5; # clamp -X $delay *= $xdelay; # weight delay by xdelay -X } -X elsif (/, stat=/) { -X # delivery failure of some sort (i.e. bad) -X $delay = 432000; # force 5 days -X } -X $delay = 1000000 if $delay > 1000000; -X -X # filter the address(es); isn't perfect but is "good enough" -X $to = $_; $to =~ s/^.* to=//; -X 1 while $to =~ s/\([^\(\)]*\)//g; # strip comments -X 1 while $to =~ s/"[^"]*"//g; # strip comments -X $to =~ s/, .*//; # remove other stat info -X foreach $addr (&simplify_address($to)) { -X next unless $addr; -X $addr = &canonicalize($addr); -X $stats{$addr} = $delay unless defined $stats{$addr}; # init -X # pseudo-average in the new delay (half-steps) -X # simple, moving average -X $stats{$addr} = int(($stats{$addr} + $delay) / 2); -X } -X } -X close(MAILLOG); -} -X -# REPL-LIB --------------------------------------------------------------- -X -sub canonicalize { -X local($addr) = @_; -X # lowercase, strip leading/trailing whitespace -X $addr =~ y/A-Z/a-z/; $addr =~ s/^\s+//; $addr =~ s/\s+$//; $addr; -} -X -# @addrs = simplify_address($addr); -sub simplify_address { -X local($_) = shift; -X 1 while s/\([^\(\)]*\)//g; # strip comments -X 1 while s/"[^"]*"//g; # strip comments -X split(/,/); # split into parts -X foreach (@_) { -X 1 while s/.*<(.*)>.*/\1/; -X s/^\s+//; -X s/\s+$//; -X } -X @_; -} -SHAR_EOF - $shar_touch -am 1031100396 'mailprio_mkdb' && - chmod 0755 'mailprio_mkdb' || - echo 'restore of mailprio_mkdb failed' - shar_count="`wc -c < 'mailprio_mkdb'`" - test 4182 -eq "$shar_count" || - echo "mailprio_mkdb: original size 4182, current size $shar_count" -fi -exit 0 diff --git a/contrib/mh.patch b/contrib/mh.patch deleted file mode 100644 index 7b23a5b..0000000 --- a/contrib/mh.patch +++ /dev/null @@ -1,193 +0,0 @@ -Message-Id: <199309031900.OAA19417@ignatz.acs.depaul.edu> -To: bug-mh@ics.uci.edu -cc: mh-users@ics.uci.edu, eric@cs.berkeley.edu -Subject: MH-6.8.1/Sendmail 8.X (MH patch) updated -Date: Fri, 03 Sep 1993 14:00:46 -0500 -From: Dave Nelson <dcn@ignatz.acs.depaul.edu> - - - This patch will fix the "X-auth..." warnings from the newer -Sendmails (8.X) while continuing to work with the old sendmails. - - I think the following patch will make everyone happy. - - 1) Anybody with MH-6.8.1 can install this. It doesn't matter - what version of sendmail you're running. It doesn't matter - if you're not running sendmail (but it won't fix anything - for you). - - 2) No configuration file hacks. If the -client switch is - absent (the default), the new sendmails will get an EHLO - using what LocalName() returns as the hostname. On my systems, - this returns the FQDN. If the EHLO fails with a result between - 500 and 599 and the -client switch is not set, we give up on - sending EHLO/HELO and just go deliver the mail. - - 3) No new configuration options. - - 4) Retains the undocumented -client switch. One warning: it - is possible using the -client switch to cause the old sendmails - to return "I refuse to talk to myself". You could do this under - the old code as well. This will happen if you claim to be the - same system as the sendmail you're sending to is running on. - That's pointless, but possible. If you do this, just like under - the old code, you will get an error. - - 5) If you're running a site with both old and new sendmails, you only - have to build MH once. The code's the same; works with them - both. - - If you decide to install this, make sure that you look the patch -over and that you agree with what it is doing. It works for me, but I -can't test it on every possible combination. Make sure that it works -before you really install it for your users, if any. No promises. - - To install this, save this to a file in the mts/sendmail directory. -Feed it to patch. Patch will ignore the non-patch stuff. You should have -"mts sendmail/smtp" in your configuration file. This works with old and -new sendmails. Using "mts sendmail" will cause the new sendmails to -print an "X-auth..." warning about who owns the process piping the mail -message. I don't know of anyway of getting rid of these. - - mh-config (if necessary), make, make inst-all. - - -I hope this helps people. - -/dcn - -Dave Nelson -Academic Computer Services -DePaul University, Chicago - -*** smail.c Fri Sep 3 11:58:05 1993 ---- smail.c Fri Sep 3 11:57:27 1993 -*************** -*** 239,261 **** - return RP_RPLY; - } - -! if (client && *client) { -! doingEHLO = 1; -! result = smtalk (SM_HELO, "EHLO %s", client); -! doingEHLO = 0; - -! if (500 <= result && result <= 599) - result = smtalk (SM_HELO, "HELO %s", client); -! -! switch (result) { - case 250: -! break; - - default: - (void) sm_end (NOTOK); - return RP_RPLY; - } - } - - #ifndef ZMAILER - if (onex) ---- 239,276 ---- - return RP_RPLY; - } - -! doingEHLO = 1; -! result = smtalk (SM_HELO, "EHLO %s", -! (client && *client) ? client : LocalName()); -! doingEHLO = 0; -! -! switch (result) -! { -! case 250: -! break; - -! default: -! if (!(500 <= result && result <= 599)) -! { -! (void) sm_end (NOTOK); -! return RP_RPLY; -! } -! -! if (client && *client) -! { - result = smtalk (SM_HELO, "HELO %s", client); -! switch (result) -! { - case 250: -! break; - - default: - (void) sm_end (NOTOK); - return RP_RPLY; -+ } - } - } -+ - - #ifndef ZMAILER - if (onex) -*************** -*** 357,380 **** - return RP_RPLY; - } - -! if (client && *client) { -! doingEHLO = 1; -! result = smtalk (SM_HELO, "EHLO %s", client); -! doingEHLO = 0; - -! if (500 <= result && result <= 599) - result = smtalk (SM_HELO, "HELO %s", client); -! -! switch (result) { -! case 250: - break; - -! default: - (void) sm_end (NOTOK); - return RP_RPLY; - } - } -! - send_options: ; - if (watch && EHLOset ("XVRB")) - (void) smtalk (SM_HELO, "VERB on"); ---- 372,409 ---- - return RP_RPLY; - } - -! doingEHLO = 1; -! result = smtalk (SM_HELO, "EHLO %s", -! (client && *client) ? client : LocalName()); -! doingEHLO = 0; -! -! switch (result) -! { -! case 250: -! break; -! -! default: -! if (!(500 <= result && result <= 599)) -! { -! (void) sm_end (NOTOK); -! return RP_RPLY; -! } - -! if (client && *client) -! { - result = smtalk (SM_HELO, "HELO %s", client); -! switch (result) -! { -! case 250: - break; - -! default: - (void) sm_end (NOTOK); - return RP_RPLY; -+ } - } - } -! - send_options: ; - if (watch && EHLOset ("XVRB")) - (void) smtalk (SM_HELO, "VERB on"); diff --git a/contrib/mmuegel b/contrib/mmuegel deleted file mode 100644 index 6db4a45..0000000 --- a/contrib/mmuegel +++ /dev/null @@ -1,2079 +0,0 @@ -From: "Michael S. Muegel" <mmuegel@cssun6.corp.mot.com> -Message-Id: <199307280818.AA08111@cssun6.corp.mot.com> -Subject: Re: contributed software -To: eric@cs.berkeley.edu (Eric Allman) -Date: Wed, 28 Jul 1993 03:18:02 -0500 (CDT) -In-Reply-To: <199307221853.LAA04266@mastodon.CS.Berkeley.EDU> from "Eric Allman" at Jul 22, 93 11:53:47 am -X-Mailer: ELM [version 2.4 PL22] -Mime-Version: 1.0 -Content-Type: text/plain; charset=US-ASCII -Content-Transfer-Encoding: 7bit -Content-Length: 69132 - -OK. Here is a new shell archive. - -Cheers, --Mike - ----- Cut Here and feed the following to sh ---- -#!/bin/sh -# This is a shell archive (produced by shar 3.49) -# To extract the files from this archive, save it to a file, remove -# everything above the "!/bin/sh" line above, and type "sh file_name". -# -# made 07/28/1993 08:13 UTC by mmuegel@mot.com (Michael S. Muegel) -# Source directory /home/ustart/NeXT/src/mail-tools/dist/foo -# -# existing files will NOT be overwritten unless -c is specified -# -# This shar contains: -# length mode name -# ------ ---------- ------------------------------------------ -# 4308 -r--r--r-- README -# 12339 -r--r--r-- libs/date.pl -# 3198 -r--r--r-- libs/elapsed.pl -# 4356 -r--r--r-- libs/mail.pl -# 6908 -r--r--r-- libs/mqueue.pl -# 7024 -r--r--r-- libs/newgetopts.pl -# 4687 -r--r--r-- libs/strings1.pl -# 1609 -r--r--r-- libs/timespec.pl -# 5212 -r--r--r-- man/cqueue.1 -# 2078 -r--r--r-- man/postclip.1 -# 6647 -r-xr-xr-x src/cqueue -# 1836 -r-xr-xr-x src/postclip -# -# ============= README ============== -if test -f 'README' -a X"$1" != X"-c"; then - echo 'x - skipping README (File already exists)' -else -echo 'x - extracting README (Text)' -sed 's/^X//' << 'SHAR_EOF' > 'README' && -------------------------------------------------------------------------------- -Document Revision Control Information: -X mmuegel -X /usr/local/ustart/src/mail-tools/dist/foo/README,v -X 1.1 of 1993/07/28 08:12:53 -------------------------------------------------------------------------------- -X -1. Introduction ---------------- -X -These tools may be of use to those sites using sendmail. Both are written in -Perl. Our site, Mot.COM, receives a ton of mail being a top-level domain -gateway. We have over 24 domains under us. Needless to say, we must have -a robust mail system or my head, and others, would be on the chopping block. -X -2. Description --------------- -X -The first tool, cqueue, checks the sendmail queue for problems. We use -it to flag problems with subdomain mail servers (and even our own servers -once in a while ;-). We run it via a cron job every hour during the day. -You may find this too frequent, however. -X -The other program, postclip, is used to "filter" non-deliverable NDNs that -get sent to our Postmaster account now and then. This ensures privacy of -e-mail and helps avoid disk problems from huge NDNs. It is different than -a brute force "just keep the header" approach because it tries hard to keep -other parts of the message that look like non-delivery information. -X -Both have been used for some time at our site with no problems. Everything -you need should be in this distribution: source, manual pages, and support -libs. See the manual pages for a complete description of each tool. -X -3. Installation ---------------- -X -No fancy Makefile simply because these tools are all under a large -hierarchy at my site. Installation should be a snap, however. Install -the nroff(1) man(5) manual pages from the man subdirectory to the -appropriate directory on your system. This might be something like -/usr/local/man/man1. -X -Next, install all of the Perl libraries located in the lib subdirectory -to your Perl library area. /usr/local/lib/perl is a good bet. The person -who installed Perl at your site will be able to tell you for sure. -X -Finally, you need to install the programs. Note that cqueue wants to -run setuid root by default. This is because the sendmail queue is normally -only readable by root or some special group. In order to let any user -run this suidperl is used. suidperl allows a Perl program to run with the -privileges of another user. -X -You will have to edit both the cqueue and postclip programs to change -the #! line at the top of each. Just change the pathname to whatever is -appropriate on your system. Note that Larry Wall's fixin program from -the Camel book can also be used to do this. It is very handy. It changes -#! lines by looking at your PATH. -X -If you do not have suidperl on your system change the #! line in cqueue -to reference perl instead of suidperl. -X -You may also wish to change some constants in cqueue. $DEF_QUEUE should be -changed to your queue directory if it is not /usr/spool/mqueue. $DEF_TIME -could be changed easy enough also. It is the time spec for the time duration -after which a mail message will be reported on if the -a option has not been -specified. See the manual page for more information and the format of this -constant (same as the -t argument). Then again, neither of these has to -be changed. Command line options are there to override their default -values. -X -After you have edited the programs as necessary, all that remains is to -install them to some executable directory. Install postclip mode 555 -and cqueue mode 4555 with owner root (if using suidperl) or mode 555 -(if not using suidperl). -X -4. Gripes, Comments, Etc ------------------------- -X -If you start using either of these let me know. I have other mail tools I -will likely post in the future if these prove useful. Also, if you think -something is just plain dumb/wrong/stupid let me know! -X -Cheers, --Mike -X --- -+----------------------------------------------------------------------------+ -| Michael S. Muegel | Internet E-Mail: mmuegel@mot.com | -| UNIX Applications Startup Group | Moto Dist E-Mail: X10090 | -| Corporate Information Office | Voice: (708) 576-0507 | -| Motorola | Fax: (708) 576-4153 | -+----------------------------------------------------------------------------+ -SHAR_EOF -chmod 0444 README || -echo 'restore of README failed' -Wc_c="`wc -c < 'README'`" -test 4308 -eq "$Wc_c" || - echo 'README: original size 4308, current size' "$Wc_c" -fi -# ============= libs/date.pl ============== -if test ! -d 'libs'; then - echo 'x - creating directory libs' - mkdir 'libs' -fi -if test -f 'libs/date.pl' -a X"$1" != X"-c"; then - echo 'x - skipping libs/date.pl (File already exists)' -else -echo 'x - extracting libs/date.pl (Text)' -sed 's/^X//' << 'SHAR_EOF' > 'libs/date.pl' && -;# -;# Name -;# date.pl - Perl emulation of (the output side of) date(1) -;# -;# Synopsis -;# require "date.pl"; -;# $Date = &date(time); -;# $Date = &date(time, $format); -;# -;# Description -;# This package implements the output formatting functions of date(1) in -;# Perl. The format options are based on those supported by Ultrix 4.0 -;# plus a couple of additions from SunOS 4.1.1 and elsewhere: -;# -;# %a abbreviated weekday name - Sun to Sat -;# %A full weekday name - Sunday to Saturday -;# %b abbreviated month name - Jan to Dec -;# %B full month name - January to December -;# %c date and time in local format [+] -;# %C date and time in long local format [+] -;# %d day of month - 01 to 31 -;# %D date as mm/dd/yy -;# %e day of month (space padded) - ` 1' to `31' -;# %E day of month (with suffix: 1st, 2nd, 3rd...) -;# %f month of year (space padded) - ` 1' to `12' -;# %h abbreviated month name - Jan to Dec -;# %H hour - 00 to 23 -;# %i hour (space padded) - ` 1' to `12' -;# %I hour - 01 to 12 -;# %j day of the year (Julian date) - 001 to 366 -;# %k hour (space padded) - ` 0' to `23' -;# %l date in ls(1) format -;# %m month of year - 01 to 12 -;# %M minute - 00 to 59 -;# %n insert a newline character -;# %p ante-meridiem or post-meridiem indicator (AM or PM) -;# %r time in AM/PM notation -;# %R time as HH:MM -;# %S second - 00 to 59 -;# %t insert a tab character -;# %T time as HH:MM:SS -;# %u date/time in date(1) required format -;# %U week number, Sunday as first day of week - 00 to 53 -;# %V date-time in SysV touch format (mmddHHMMyy) -;# %w day of week - 0 (Sunday) to 6 -;# %W week number, Monday as first day of week - 00 to 53 -;# %x date in local format [+] -;# %X time in local format [+] -;# %y last 2 digits of year - 00 to 99 -;# %Y all 4 digits of year ~ 1700 to 2000 odd ? -;# %z time zone from TZ environment variable w/ a trailing space -;# %Z time zone from TZ environment variable -;# %% insert a `%' character -;# %+ insert a `+' character -;# -;# [+]: These may need adjustment to fit local conventions, see below. -;# -;# For the sake of compatibility, a leading `+' in the format -;# specificaiton is removed if present. -;# -;# Remarks -;# This is version 3.4 of date.pl -;# -;# An extension of `ctime.pl' by Waldemar Kebsch (kebsch.pad@nixpbe.UUCP), -;# as modified by Marion Hakanson (hakanson@ogicse.ogi.edu). -;# -;# Unlike date(1), unknown format tags are silently replaced by "". -;# -;# defaultTZ is a blatant hack, but I wanted to be able to get date(1) -;# like behaviour by default and there does'nt seem to be an easy (read -;# portable) way to get the local TZ name back... -;# -;# For a cheap date, try... -;# -;# #!/usr/local/bin/perl -;# require "date.pl"; -;# exit print (&date(time, shift @ARGV) . "\n") ? 0 : 1; -;# -;# This package is redistributable under the same terms as apply to -;# the Perl 4.0 release. See the COPYING file in your Perl kit for -;# more information. -;# -;# Please send any bug reports or comments to tmcgonigal@gallium.com -;# -;# Modification History -;# Nmemonic Version Date Who -;# -;# NONE 1.0 02feb91 Terry McGonigal (tmcgonigal@gallium.com) -;# Created from ctime.pl -;# -;# NONE 2.0 07feb91 tmcgonigal -;# Added some of Marion Hakanson (hakanson@ogicse.ogi.edu)'s ctime.pl -;# TZ handling changes. -;# -;# NONE 2.1 09feb91 tmcgonigal -;# Corrected week number calculations. -;# -;# NONE 2.2 21oct91 tmcgonigal -;# Added ls(1) date format, `%l'. -;# -;# NONE 2.3 06nov91 tmcgonigal -;# Added SysV touch(1) date-time format, `%V' (pretty thin as -;# mnemonics go, I know, but `t' and `T' were both gone already!) -;# -;# NONE 2.4 05jan92 tmcgonigal -;# Corrected slight (cosmetic) problem with %V replacment string -;# -;# NONE 3.0 09jul92 tmcgonigal -;# Fixed a couple of problems with &ls as pointed out by -;# Thomas Richter (richter@ki1.chemie.fu-berlin.de), thanks Thomas! -;# Also added a couple of SunOS 4.1.1 strftime-ish formats, %i and %k -;# for space padded hours (` 1' to `12' and ` 0' to `23' respectivly), -;# and %C for locale long date/time format. Changed &mH to take a -;# pad char parameter to make to evaled code for %i and %k simpler. -;# Added %E for suffixed day-of-month (ie 1st, 3rd, 4th etc). -;# -;# NONE 3.1 16jul92 tmcgonigal -;# Added `%u' format to generate date/time in date(1) required -;# format (ie '%y%m%d%H%M.%S'). -;# -;# NONE 3.2 23jan93 tmcgonigal -;# Added `%f' format to generate space padded month numbers, added -;# `%E' to the header comments, it seems to have been left out (and -;# I'm sure I wanted to use it at some point in the past...). -;# -;# NONE 3.3 03feb93 tmcgonigal -;# Corrected some problems with AM/PM handling pointed out by -;# Michael S. Muegel (mmuegel@mot.com). Thanks Michael, I hope -;# this is the behaviour you were looking for, it seems more -;# correct to me... -;# -;# NONE 3.4 26jul93 tmcgonigal -;# Incorporated some fixes provided by DaviD W. Sanderson -;# (dws@ssec.wisc.edu): February was spelled incorrectly and -;# &wkno() was always using the current year while calculating -;# week numbers, regardless of year implied by the time value -;# passed to &date(). DaviD also contributed an improved &date() -;# test script, thanks DaviD, I appreciate the effort. Finally, -;# changed my mailling address from @gvc.com to @gallium.com -;# to reflect, well, my new address! -;# -;# SccsId = "%W% %E%" -;# -require 'timelocal.pl'; -package date; -X -# Months of the year -@MoY = ('January', 'February', 'March', 'April', 'May', 'June', -X 'July', 'August', 'September','October', 'November', 'December'); -X -# days of the week -@DoW = ('Sunday', 'Monday', 'Tuesday', 'Wednesday', -X 'Thursday', 'Friday', 'Saturday'); -X -# CUSTOMIZE - defaults -$defaultTZ = 'CST'; # time zone (hack!) -$defaultFMT = '%a %h %e %T %z%Y'; # format (ala date(1)) -X -# CUSTOMIZE - `local' formats -$locTF = '%T'; # time (as HH:MM:SS) -$locDF = '%D'; # date (as mm/dd/yy) -$locDTF = '%a %b %d %T %Y'; # date/time (as dow mon dd HH:MM:SS yyyy) -$locLDTF = '%i:%M:%S %p %A %B %E %Y'; # long date/time (as HH:MM:SS a/p day month dom yyyy) -X -# Time zone info -$TZ; # wkno needs this info too -X -# define the known format tags as associative keys with their associated -# replacement strings as values. Each replacement string should be -# an eval-able expresion assigning a value to $rep. These expressions are -# eval-ed, then the value of $rep is substituted into the supplied -# format (if any). -%Tags = ( '%a', q|($rep = $DoW[$wday])=~ s/^(...).*/\1/|, # abbr. weekday name - Sun to Sat -X '%A', q|$rep = $DoW[$wday]|, # full weekday name - Sunday to Saturday -X '%b', q|($rep = $MoY[$mon]) =~ s/^(...).*/\1/|, # abbr. month name - Jan to Dec -X '%B', q|$rep = $MoY[$mon]|, # full month name - January to December -X '%c', q|$rep = $locDTF; 1|, # date/time in local format -X '%C', q|$rep = $locLDTF; 1|, # date/time in local long format -X '%d', q|$rep = &date'pad($mday, 2, "0")|, # day of month - 01 to 31 -X '%D', q|$rep = '%m/%d/%y'|, # date as mm/dd/yy -X '%e', q|$rep = &date'pad($mday, 2, " ")|, # day of month (space padded) ` 1' to `31' -X '%E', q|$rep = &date'dsuf($mday)|, # day of month (w/suffix) `1st' to `31st' -X '%f', q|$rep = &date'pad($mon+1, 2, " ")|, # month of year (space padded) ` 1' to `12' -X '%h', q|$rep = '%b'|, # abbr. month name (same as %b) -X '%H', q|$rep = &date'pad($hour, 2, "0")|, # hour - 00 to 23 -X '%i', q|$rep = &date'ampmH($hour, " ")|, # hour (space padded ` 1' to `12' -X '%I', q|$rep = &date'ampmH($hour, "0")|, # hour - 01 to 12 -X '%j', q|$rep = &date'pad($yday+1, 3, "0")|, # Julian date 001 - 366 -X '%k', q|$rep = &date'pad($hour, 2, " ")|, # hour (space padded) ` 0' to `23' -X '%l', q|$rep = '%b %d ' . &date'ls($year)|, # ls(1) style date -X '%m', q|$rep = &date'pad($mon+1, 2, "0")|, # month of year - 01 to 12 -X '%M', q|$rep = &date'pad($min, 2, "0")|, # minute - 00 to 59 -X '%n', q|$rep = "\n"|, # insert a newline -X '%p', q|$rep = &date'ampmD($hour)|, # insert `AM' or `PM' -X '%r', q|$rep = '%I:%M:%S %p'|, # time in AM/PM notation -X '%R', q|$rep = '%H:%M'|, # time as HH:MM -X '%S', q|$rep = &date'pad($sec, 2, "0")|, # second - 00 to 59 -X '%t', q|$rep = "\t"|, # insert a tab -X '%T', q|$rep = '%H:%M:%S'|, # time as HH:MM:SS -X '%u', q|$rep = '%y%m%d%H%M.%S'|, # daaate/time in date(1) required format -X '%U', q|$rep = &date'wkno($year, $yday, 0)|, # week number (weeks start on Sun) - 00 to 53 -X '%V', q|$rep = '%m%d%H%M%y'|, # SysV touch(1) date-time format (mmddHHMMyy) -X '%w', q|$rep = $wday; 1|, # day of week - Sunday = 0 -X '%W', q|$rep = &date'wkno($year, $yday, 1)|, # week number (weeks start on Mon) - 00 to 53 -X '%x', q|$rep = $locDF; 1|, # date in local format -X '%X', q|$rep = $locTF; 1|, # time in local format -X '%y', q|($rep = $year) =~ s/..(..)/\1/|, # last 2 digits of year - 00 to 99 -X '%Y', q|$rep = "$year"; 1|, # full year ~ 1700 to 2000 odd -X '%z', q|$rep = $TZ eq "" ? "" : "$TZ "|, # time zone from TZ env var (w/trail. space) -X '%Z', q|$rep = $TZ; 1|, # time zone from TZ env. var. -X '%%', q|$rep = '%'; $adv=1|, # insert a `%' -X '%+', q|$rep = '+'| # insert a `+' -); -X -sub main'date { -X local($time, $format) = @_; -X local($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst); -X local($pos, $tag, $rep, $adv) = (0, "", "", 0); -X -X # default to date/ctime format or strip leading `+'... -X if ($format eq "") { -X $format = $defaultFMT; -X } elsif ($format =~ /^\+/) { -X $format = $'; -X } -X -X # Use local time if can't find a TZ in the environment -X $TZ = defined($ENV{'TZ'}) ? $ENV{'TZ'} : $defaultTZ; -X ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = -X &gettime ($TZ, $time); -X -X # Hack to deal with 'PST8PDT' format of TZ -X # Note that this can't deal with all the esoteric forms, but it -X # does recognize the most common: [:]STDoff[DST[off][,rule]] -X if ($TZ =~ /^([^:\d+\-,]{3,})([+-]?\d{1,2}(:\d{1,2}){0,2})([^\d+\-,]{3,})?/) { -X $TZ = $isdst ? $4 : $1; -X } -X -X # watch out in 2070... -X $year += ($year < 70) ? 2000 : 1900; -X -X # now loop throught the supplied format looking for tags... -X while (($pos = index ($format, '%')) != -1) { -X -X # grab the format tag -X $tag = substr($format, $pos, 2); -X $adv = 0; # for `%%' processing -X -X # do we have a replacement string? -X if (defined $Tags{$tag}) { -X -X # trap dead evals... -X if (! eval $Tags{$tag}) { -X print STDERR "date.pl: internal error: eval for $tag failed: $@\n"; -X return ""; -X } -X } else { -X $rep = ""; -X } -X -X # do the substitution -X substr ($format, $pos, 2) =~ s/$tag/$rep/; -X $pos++ if ($adv); -X } -X -X $format; -} -X -# dsuf - add `st', `nd', `rd', `th' to a date (ie 1st, 22nd, 29th) -sub dsuf { -X local ($mday) = @_; -X -X return $mday . 'st' if ($mday =~ m/.*1$/); -X return $mday . 'nd' if ($mday =~ m/.*2$/); -X return $mday . 'rd' if ($mday =~ m/.*3$/); -X return $mday . 'th'; -} -X -# weekno - figure out week number -sub wkno { -X local ($year, $yday, $firstweekday) = @_; -X local ($jan1, @jan1, $wks); -X -X # figure out the `time' value for January 1 of the given year -X $jan1 = &maketime ($TZ, 0, 0, 0, 1, 0, $year-1900); -X -X # figure out what day of the week January 1 was -X @jan1= &gettime ($TZ, $jan1); -X -X # and calculate the week number -X $wks = (($yday + ($jan1[6] - $firstweekday)) + 1)/ 7; -X $wks += (($wks - int($wks) > 0.0) ? 1 : 0); -X -X # supply zero padding -X &pad (int($wks), 2, "0"); -} -X -# ampmH - figure out am/pm (1 - 12) mode hour value, padded with $p (0 or ' ') -sub ampmH { local ($h, $p) = @_; &pad($h>12 ? $h-12 : ($h ? $h : 12), 2, $p); } -X -# ampmD - figure out am/pm designator -sub ampmD { shift @_ >= 12 ? "PM" : "AM"; } -X -# gettime - get the time via {local,gmt}time -sub gettime { ((shift @_) eq 'GMT') ? gmtime(shift @_) : localtime(shift @_); } -X -# maketime - make a time via time{local,gmt} -sub maketime { ((shift @_) eq 'GMT') ? &main'timegm(@_) : &main'timelocal(@_); } -X -# ls - generate the time/year portion of an ls(1) style date -sub ls { -X return ((&gettime ($TZ, time))[5] == @_[0]) ? "%R" : " %Y"; -} -X -# pad - pad $in with leading $pad until lenght $len -sub pad { -X local ($in, $len, $pad) = @_; -X local ($out) = "$in"; -X -X $out = $pad . $out until (length ($out) == $len); -X return $out; -} -X -1; -SHAR_EOF -chmod 0444 libs/date.pl || -echo 'restore of libs/date.pl failed' -Wc_c="`wc -c < 'libs/date.pl'`" -test 12339 -eq "$Wc_c" || - echo 'libs/date.pl: original size 12339, current size' "$Wc_c" -fi -# ============= libs/elapsed.pl ============== -if test -f 'libs/elapsed.pl' -a X"$1" != X"-c"; then - echo 'x - skipping libs/elapsed.pl (File already exists)' -else -echo 'x - extracting libs/elapsed.pl (Text)' -sed 's/^X//' << 'SHAR_EOF' > 'libs/elapsed.pl' && -;# NAME -;# elapsed.pl - convert seconds to elapsed time format -;# -;# AUTHOR -;# Michael S. Muegel <mmuegel@mot.com> -;# -;# RCS INFORMATION -;# mmuegel -;# /usr/local/ustart/src/mail-tools/dist/foo/libs/elapsed.pl,v -;# 1.1 of 1993/07/28 08:07:19 -X -package elapsed; -X -# Time field types -$DAYS = 1; -$HOURS = 2; -$MINUTES = 3; -$SECONDS = 4; -X -# The array contains four records each with four fields. The fields are, -# in order: -# -# Type Specifies what kind of time field this is. Once of -# $DAYS, $HOURS, $MINUTES, or $SECONDS. -# -# Multiplier Specifies what time field this is via the minimum -# number of seconds this time field may specify. For -# example, the minutes field would be non-zero -# when there are 60 or more seconds. -# -# Separator How to separate this time field from the next -# *greater* field. -# -# Format sprintf() format specifier on how to print this -# time field. -@MULT_AND_SEPS = ($DAYS, 60 * 60 * 24, "+", "%d", -X $HOURS, 60 * 60, ":", "%d", -X $MINUTES, 60, ":", "%02d", -X $SECONDS, 1, "", "%02d" -X ); -X -;############################################################################### -;# Seconds_To_Elapsed -;# -;# Coverts a seconds count to form [d+]h:mm:ss. If $Collapse -;# is true then the result is compacted somewhat. The string returned -;# will be of the form [d+][[h:]mm]:ss. -;# -;# Arguments: -;# $Seconds, $Collapse -;# -;# Examples: -;# &Seconds_To_Elapsed (0, 0) -> 0:00:00 -;# &Seconds_To_Elapsed (0, 1) -> :00 -;# -;# &Seconds_To_Elapsed (119, 0) -> 0:01:59 -;# &Seconds_To_Elapsed (119, 1) -> 01:59 -;# -;# &Seconds_To_Elapsed (3601, 0) -> 1:00:01 -;# &Seconds_To_Elapsed (3601, 1) -> 1:00:01 -;# -;# &Seconds_To_Elapsed (86401, 0) -> 1+0:00:01 -;# &Seconds_To_Elapsed (86401, 1) -> 1+:01 -;# -;# Returns: -;# $Elapsed -;############################################################################### -sub main'Seconds_To_Elapsed -{ -X local ($Seconds, $Collapse) = @_; -X local ($Type, $Multiplier, @Multipliers, $Separator, $DHMS_Used, -X $Elapsed, @Mult_And_Seps, $Print_Field); -X -X $Multiplier = 1; -X @Mult_And_Seps = @MULT_AND_SEPS; -X -X # Keep subtracting the number of seconds corresponding to a time field -X # from the number of seconds passed to the function. -X while (1) -X { -X ($Type, $Multiplier, $Separator, $Format) = splice (@Mult_And_Seps, 0, 4); -X last if (! $Multiplier); -X $Seconds -= $DHMS_Used * $Multiplier -X if ($DHMS_Used = int ($Seconds / $Multiplier)); -X -X # Figure out if we should print this field -X if ($Type == $DAYS) -X { -X $Print_Field = $DHMS_Used; -X } -X -X elsif ($Collapse) -X { -X if ($Type == $HOURS) -X { -X $Print_Field = $DHMS_Used; -X } -X elsif ($Type == $MINUTES) -X { -X $Print_Field = $DHMS_Used || $Printed_Field {$HOURS}; -X } -X else -X { -X $Format = ":%02d" -X if (! $Printed_Field {$MINUTES}); -X $Print_Field = 1; -X }; -X } -X -X else -X { -X $Print_Field = 1; -X }; -X -X $Printed_Field {$Type} = $Print_Field; -X $Elapsed .= sprintf ("$Format%s", $DHMS_Used, $Separator) -X if ($Print_Field); -X }; -X -X return ($Elapsed); -}; -X -1; -SHAR_EOF -chmod 0444 libs/elapsed.pl || -echo 'restore of libs/elapsed.pl failed' -Wc_c="`wc -c < 'libs/elapsed.pl'`" -test 3198 -eq "$Wc_c" || - echo 'libs/elapsed.pl: original size 3198, current size' "$Wc_c" -fi -# ============= libs/mail.pl ============== -if test -f 'libs/mail.pl' -a X"$1" != X"-c"; then - echo 'x - skipping libs/mail.pl (File already exists)' -else -echo 'x - extracting libs/mail.pl (Text)' -sed 's/^X//' << 'SHAR_EOF' > 'libs/mail.pl' && -;# NAME -;# mail.pl - perl function(s) to handle mail processing -;# -;# AUTHOR -;# Michael S. Muegel (mmuegel@mot.com) -;# -;# RCS INFORMATION -;# mmuegel -;# /usr/local/ustart/src/mail-tools/dist/foo/libs/mail.pl,v 1.1 1993/07/28 08:07:19 mmuegel Exp -X -package mail; -X -# Mailer statement to eval. $Users, $Subject, and $Verbose are substituted -# via eval -$BIN_MAILER = "/usr/ucb/mail \$Verbose -s '\$Subject' \$Users"; -X -# Sendmail command to use when $Use_Sendmail is true. -$SENDMAIL = '/usr/lib/sendmail $Verbose $Users'; -X -;############################################################################### -;# Send_Mail -;# -;# Sends $Message to $Users with a subject of $Subject. If $Message_Is_File -;# is true then $Message is assumed to be a filename pointing to the mail -;# message. This is a new option and thus the backwards-compatible hack. -;# $Users should be a space separated list of mail-ids. -;# -;# If everything went OK $Status will be 1 and $Error_Msg can be ignored; -;# otherwise, $Status will be 0 and $Error_Msg will contain an error message. -;# -;# If $Use_Sendmail is 1 then sendmail is used to send the message. Normally -;# a mailer such as Mail is used. By specifiying this you can include -;# headers in addition to text in either $Message or $Message_Is_File. -;# If either $Message or $Message_Is_File contain a Subject: header then -;# $Subject is ignored; otherwise, a Subject: header is automatically created. -;# Similar to the Subject: header, if a To: header does not exist one -;# is automatically created from the $Users argument. The mail is still -;# sent, however, to the recipients listed in $Users. This is keeping with -;# normal sendmail usage (header vs. envelope). -;# -;# In both bin mailer and sendmail modes $Verbose will turn on verbose mode -;# (normally just sendmail verbose mode output). -;# -;# Arguments: -;# $Users, $Subject, $Message, $Message_Is_File, $Verbose, $Use_Sendmail -;# -;# Returns: -;# $Status, $Error_Msg -;############################################################################### -sub main'Send_Mail -{ -X local ($Users, $Subject, $Message, $Message_Is_File, $Verbose, -X $Use_Sendmail) = @_; -X local ($BIN_MAILER_HANDLE, $Mailer_Command, $Header_Found, %Header_Map, -X $Header_Extra, $Mailer); -X -X # If the message is contained in a file read it in so we can have one -X # consistent interface -X if ($Message_Is_File) -X { -X undef $/; -X $Message_Is_File = 0; -X open (Message) || return (0, "error reading $Message: $!"); -X $Message = <Message>; -X close (Message); -X }; -X -X # If sendmail mode see if we need to add some headers -X if ($Use_Sendmail) -X { -X # Determine if a header block is included in the message and what headers -X # are there -X foreach (split (/\n/, $Message)) -X { -X last if ($_ eq ""); -X $Header_Found = $Header_Map {$1} = 1 if (/^([A-Z]\S*): /); -X }; -X -X # Add some headers? -X if (! $Header_Map {"To"}) -X { -X $Header_Extra .= "To: " . join (", ", $Users) . "\n"; -X }; -X if (($Subject ne "") && (! $Header_Map {"Subject"})) -X { -X $Header_Extra .= "Subject: $Subject\n"; -X }; -X -X # Add the required blank line between header/body if there where no -X # headers to begin with -X if ($Header_Found) -X { -X $Message = "$Header_Extra$Message"; -X } -X else -X { -X $Message = "$Header_Extra\n$Message"; -X }; -X }; -X -X # Get a string that is the mail command -X $Verbose = ($Verbose) ? "-v" : ""; -X $Mailer = ($Use_Sendmail) ? $SENDMAIL : $BIN_MAILER; -X eval "\$Mailer = \"$Mailer\""; -X return (0, "error setting \$Mailer: $@") if ($@); -X -X # need to catch SIGPIPE in case the $Mailer call fails -X $SIG {'PIPE'} = "mail'Cleanup"; -X -X # Open mailer -X return (0, "can not open mail program: $Mailer") if (! open (MAILER, "| $Mailer")); -X -X # Send off the mail! -X print MAILER $Message; -X close (MAILER); -X return (0, "error running mail program: $Mailer") if ($?); -X -X # Everything must have went AOK -X return (1); -}; -X -;############################################################################### -;# Cleanup -;# -;# Simply here so we can catch SIGPIPE and not exit. -;# -;# Globals: -;# None -;# -;# Arguments: -;# None -;# -;# Returns: -;# Nothing exciting -;############################################################################### -sub Cleanup -{ -}; -X -1; -SHAR_EOF -chmod 0444 libs/mail.pl || -echo 'restore of libs/mail.pl failed' -Wc_c="`wc -c < 'libs/mail.pl'`" -test 4356 -eq "$Wc_c" || - echo 'libs/mail.pl: original size 4356, current size' "$Wc_c" -fi -# ============= libs/mqueue.pl ============== -if test -f 'libs/mqueue.pl' -a X"$1" != X"-c"; then - echo 'x - skipping libs/mqueue.pl (File already exists)' -else -echo 'x - extracting libs/mqueue.pl (Text)' -sed 's/^X//' << 'SHAR_EOF' > 'libs/mqueue.pl' && -;# NAME -;# mqueue.pl - functions to work with the sendmail queue -;# -;# DESCRIPTION -;# Both Get_Queue_IDs and Parse_Control_File are available to get -;# information about the sendmail queue. The cqueue program is a good -;# example of how these functions work. -;# -;# AUTHOR -;# Michael S. Muegel (mmuegel@mot.com) -;# -;# RCS INFORMATION -;# mmuegel -;# /usr/local/ustart/src/mail-tools/dist/foo/libs/mqueue.pl,v -;# 1.1 of 1993/07/28 08:07:19 -X -package mqueue; -X -;############################################################################### -;# Get_Queue_IDs -;# -;# Will figure out the queue IDs in $Queue that have both control and data -;# files. They are returned in @Valid_IDs. Those IDs that have a -;# control file and no data file are saved to the array globbed by -;# *Missing_Control_IDs. Likewise, those IDs that have a data file and no -;# control file are saved to the array globbed by *Missing_Data_IDs. -;# -;# If $Skip_Locked is true they a message that has a lock file is skipped -;# and will not show up in any of the arrays. -;# -;# If everything went AOK then $Status is 1; otherwise, $Status is 0 and -;# $Msg tells what went wrong. -;# -;# Globals: -;# None -;# -;# Arguments: -;# $Queue, $Skip_Locked, *Missing_Control_IDs, *Missing_Data_IDs -;# -;# Returns: -;# $Status, $Msg, @Valid_IDs -;############################################################################### -sub main'Get_Queue_IDs -{ -X local ($Queue, $Skip_Locked, *Missing_Control_IDs, -X *Missing_Data_IDs) = @_; -X local (*QUEUE, @Files, %Lock_IDs, %Data_IDs, %Control_IDs, $_); -X -X # Make sure that the * argument @arrays ar empty -X @Missing_Control_IDs = @Missing_Data_IDs = (); -X -X # Save each data, lock, and queue file in @Files -X opendir (QUEUE, $Queue) || return (0, "error getting directory listing of $Queue"); -X @Files = grep (/^(df|lf|qf)/, readdir (QUEUE)); -X closedir (QUEUE); -X -X # Create indexed list of data and control files. IF $Skip_Locked is true -X # then skip either if there is a lock file present. -X if ($Skip_Locked) -X { -X grep ((s/^lf//) && ($Lock_IDs {$_} = 1), @Files); -X grep ((s/^df//) && (! $Lock_IDs {$_}) && ($Data_IDs {$_} = 1), @Files); -X grep ((s/^qf//) && (! $Lock_IDs {$_}) && ($Control_IDs {$_} = 1), @Files); -X } -X else -X { -X grep ((s/^df//) && ($Data_IDs {$_} = 1), @Files); -X grep ((s/^qf//) && ($Control_IDs {$_} = 1), @Files); -X }; -X -X # Find missing control and data files and remove them from the lists of each -X @Missing_Control_IDs = sort (grep ((! $Control_IDs {$_}) && (delete $Data_IDs {$_}), keys (%Data_IDs))); -X @Missing_Data_IDs = sort (grep ((! $Data_IDs {$_} && (delete $Control_IDs {$_})), keys (%Control_IDs))); -X -X -X # Return the IDs in an appartently random order -X return (1, "", keys (%Control_IDs)); -}; -X -X -;############################################################################### -;# Parse_Control_File -;# -;# Will pase a sendmail queue control file for useful information. See the -;# Sendmail Installtion and Operation Guide (SMM:07) for a complete -;# explanation of each field. -;# -;# The following globbed variables are set (or cleared) by this function: -;# -;# $Sender The sender's address. -;# -;# @Recipients One or more addresses for the recipient of the mail. -;# -;# @Errors_To One or more addresses for addresses to which mail -;# delivery errors should be sent. -;# -;# $Creation_Time The job creation time in time(3) format. That is, -;# seconds since 00:00:00 GMT 1/1/70. -;# -;# $Priority An integer representing the current message priority. -;# This is used to order the queue. Higher numbers mean -;# lower priorities. -;# -;# $Status_Message The status of the mail message. It can contain any -;# text. -;# -;# @Headers Message headers unparsed but in their original order. -;# Headers that span multiple lines are not mucked with, -;# embedded \ns will be evident. -;# -;# In all e-mail addresses bounding <> pairs are stripped. -;# -;# If everything went AOK then $Status is 1. If the message with queue ID -;# $Queue_ID just does not exist anymore -1 is returned. This is very -;# possible and should be allowed for. Otherwise, $Status is 0 and $Msg -;# tells what went wrong. -;# -;# Globals: -;# None -;# -;# Arguments: -;# $Queue, $Queue_ID, *Sender, *Recipients, *Errors_To, *Creation_Time, -;# *Priority, *Status_Message, *Headers -;# -;# Returns: -;# $Status, $Msg -;############################################################################### -sub main'Parse_Control_File -{ -X local ($Queue, $Queue_ID, *Sender, *Recipients, *Errors_To, *Creation_Time, -X *Priority, *Status_Message, *Headers) = @_; -X local (*Control, $_, $Not_Empty); -X -X # Required variables and the associated control. If empty at the end of -X # parsing we return a bad status. -X @REQUIRED_INFO = ('$Creation_Time', 'T', '$Sender', 'S', '@Recipients', 'R', -X '$Priority', 'P'); -X -X # Open up the control file for read -X $Control = "$Queue/qf$Queue_ID"; -X if (! open (Control)) -X { -X return (-1) if ((-x $Queue) && (! -f "$Queue/qf$Queue_ID") && -X (! -f "$Queue/df$Queue_ID")); -X return (0, "error opening $Control for read: $!"); -X }; -X -X # Reset the globbed variables just in case -X $Sender = $Creation_Time = $Priority = $Status_Message = ""; -X @Recipients = @Errors_To = @Headers = (); -X -X # Look for a few things in the control file -X READ: while (<Control>) -X { -X $Not_Empty = 1; -X chop; -X -X PARSE: -X { -X if (/^T(\d+)$/) -X { -X $Creation_Time = $1; -X } -X elsif (/^S(<)?([^>]+)/) -X { -X $Sender = $2; -X } -X elsif (/^R(<)?([^>]+)/) -X { -X push (@Recipients, $2); -X } -X elsif (/^E(<)?([^>]+)/) -X { -X push (@Errors_To, $2); -X } -X elsif (/^M(.*)/) -X { -X $Status_Message = $1; -X } -X elsif (/^P(\d+)$/) -X { -X $Priority = $1; -X } -X elsif (/^H(.*)/) -X { -X $Header = $1; -X while (<Control>) -X { -X chop; -X last if (/^[A-Z]/); -X $Header .= "\n$_"; -X }; -X push (@Headers, $Header); -X redo PARSE if ($_); -X last if (eof); -X }; -X }; -X }; -X -X # If the file was empty scream bloody murder -X return (0, "empty control file") if (! $Not_Empty); -X -X # Yell if we could not find a required field -X while (($Var, $Control) = splice (@REQUIRED_INFO, 0, 2)) -X { -X eval "return (0, 'required control field $Control not found') -X if (! $Var)"; -X return (0, "error checking \$Var: $@") if ($@); -X }; -X -X # Everything went AOK -X return (1); -}; -X -1; -SHAR_EOF -chmod 0444 libs/mqueue.pl || -echo 'restore of libs/mqueue.pl failed' -Wc_c="`wc -c < 'libs/mqueue.pl'`" -test 6908 -eq "$Wc_c" || - echo 'libs/mqueue.pl: original size 6908, current size' "$Wc_c" -fi -# ============= libs/newgetopts.pl ============== -if test -f 'libs/newgetopts.pl' -a X"$1" != X"-c"; then - echo 'x - skipping libs/newgetopts.pl (File already exists)' -else -echo 'x - extracting libs/newgetopts.pl (Text)' -sed 's/^X//' << 'SHAR_EOF' > 'libs/newgetopts.pl' && -;# NAME -;# newgetopts.pl - a better newgetopt (which is a better getopts which is -;# a better getopt ;-) -;# -;# AUTHOR -;# Mike Muegel (mmuegel@mot.com) -;# -;# mmuegel -;# /usr/local/ustart/src/mail-tools/dist/foo/libs/newgetopts.pl,v 1.1 1993/07/28 08:07:19 mmuegel Exp -X -;############################################################################### -;# New_Getopts -;# -;# Does not care about order of switches, options, and arguments like -;# getopts.pl. Thus all non-switches/options will be kept in ARGV even if they -;# are not at the end. If $Pass_Invalid is set all unkown options will be -;# passed back to the caller by keeping them in @ARGV. This is useful when -;# parsing a command line for your script while ignoring options that you -;# may pass to another script. If this is set New_Getopts tries to maintain -;# the switch clustering on the unkown switches. -;# -;# Accepts the special argument -usage to print the Usage string. Also accepts -;# the special option -version which prints the contents of the string -;# $VERSION. $VERSION may or may not have an embeded \n in it. If -usage -;# or -version are specified a status of -1 is returned. Note that the usage -;# option is only accepted if the usage string is not null. -;# -;# $Switches is just like the formal arguemnt of getopts.pl. $Usage is a usage -;# string with or without a trailing \n. *Switch_To_Order is an optional -;# pointer to the name of an associative array which will contain a mapping of -;# switch names to the order in which (if at all) the argument was entered. -;# -;# For example, if @ARGV contains -v, -x, test: -;# -;# $Switch_To_Order {"v"} = 1; -;# $Switch_To_Order {"x"} = 2; -;# -;# Note that in the case of multiple occurances of an option $Switch_To_Order -;# will store each occurance of the argument via a string that emulates -;# an array. This is done by using join ($;, ...). You can retrieve the -;# array by using split (/$;/, ...). -;# -;# *Split_ARGV is an optional pointer to an array which will conatin the -;# original switches along with their values. For the example used above -;# Split_ARGV would contain: -;# -;# @Split_ARGV = ("v", "", "x", "test"); -;# -;# Another exciting ;-) feature that newgetopts has. Along with creating the -;# normal $opt_ scalars for the last value of an argument the list @opt_ is -;# created. It is an array which contains all the values of arguments to the -;# basename of the variable. They are stored in the order which they occured -;# on the command line starting with $[. Note that blank arguments are stored -;# as "". Along with providing support for multiple options on the command -;# line this also provides a method of counting the number of times an option -;# was specified via $#opt_. -;# -;# Automatically resets all $opt_, @opt_, %Switch_To_Order, and @Split_ARGV -;# variables so that New_Getopts may be called more than once from within -;# the same program. Thus, if $opt_v is set upon entry to New_Getopts and -;# -v is not in @ARGV $opt_v will not be set upon exit. -;# -;# Arguments: -;# $Switches, $Usage, $Pass_Invalid, *Switch_To_Order, *Split_ARGV -;# -;# Returns: -;# -1, 0, or 1 depending on status (printed Usage/Version, OK, not OK) -;############################################################################### -sub New_Getopts -{ -X local($taint_argumentative, $Usage, $Pass_Invalid, *Switch_To_Order, -X *Split_ARGV) = @_; -X local(@args,$_,$first,$rest,$errs, @leftovers, @current_leftovers, -X %Switch_Found); -X local($[, $*, $Script_Name, $argumentative); -X -X # Untaint the argument cluster so that we can use this with taintperl -X $taint_argumentative =~ /^(.*)$/; -X $argumentative = $1; -X -X # Clear anything that might still be set from a previous New_Getopts -X # call. -X @Split_ARGV = (); -X -X # Get the basename of the calling script -X ($Script_Name = $0) =~ s/.*\///; -X -X # Make Usage have a trailing \n -X $Usage .= "\n" if ($Usage !~ /\n$/); -X -X @args = split( / */, $argumentative ); -X -X # Clear anything that might still be set from a previous New_Getopts call. -X foreach $first (@args) -X { -X next if ($first eq ":"); -X delete $Switch_Found {$first}; -X delete $Switch_To_Order {$first}; -X eval "undef \@opt_$first; undef \$opt_$first;"; -X }; -X -X while (@ARGV) -X { -X # Let usage through -X if (($ARGV[0] eq "-usage") && ($Usage ne "\n")) -X { -X print $Usage; -X exit (-1); -X } -X -X elsif ($ARGV[0] eq "-version") -X { -X if ($VERSION) -X { -X print $VERSION; -X print "\n" if ($VERSION !~ /\n$/); -X } -X else -X { -X warn "${Script_Name}: no version information available, sorry\n"; -X } -X exit (-1); -X } -X -X elsif (($_ = $ARGV[0]) =~ /^-(.)(.*)/) -X { -X ($first,$rest) = ($1,$2); -X $pos = index($argumentative,$first); -X -X $Switch_To_Order {$first} = join ($;, split (/$;/, $Switch_To_Order {$first}), ++$Order); -X -X if($pos >= $[) -X { -X if($args[$pos+1] eq ':') -X { -X shift(@ARGV); -X if($rest eq '') -X { -X $rest = shift(@ARGV); -X } -X -X eval "\$opt_$first = \$rest;"; -X eval "push (\@opt_$first, \$rest);"; -X push (@Split_ARGV, $first, $rest); -X } -X else -X { -X eval "\$opt_$first = 1"; -X eval "push (\@opt_$first, '');"; -X push (@Split_ARGV, $first, ""); -X -X if($rest eq '') -X { -X shift(@ARGV); -X } -X else -X { -X $ARGV[0] = "-$rest"; -X } -X } -X } -X -X else -X { -X # Save any other switches if $Pass_Valid -X if ($Pass_Invalid) -X { -X push (@current_leftovers, $first); -X } -X else -X { -X warn "${Script_Name}: unknown option: $first\n"; -X ++$errs; -X }; -X if($rest ne '') -X { -X $ARGV[0] = "-$rest"; -X } -X else -X { -X shift(@ARGV); -X } -X } -X } -X -X else -X { -X push (@leftovers, shift (@ARGV)); -X }; -X -X # Save any other switches if $Pass_Valid -X if ((@current_leftovers) && ($rest eq '')) -X { -X push (@leftovers, "-" . join ("", @current_leftovers)); -X @current_leftovers = (); -X }; -X }; -X -X # Automatically print Usage if a warning was given -X @ARGV = @leftovers; -X if ($errs != 0) -X { -X warn $Usage; -X return (0); -X } -X else -X { -X return (1); -X } -X -} -X -1; -SHAR_EOF -chmod 0444 libs/newgetopts.pl || -echo 'restore of libs/newgetopts.pl failed' -Wc_c="`wc -c < 'libs/newgetopts.pl'`" -test 7024 -eq "$Wc_c" || - echo 'libs/newgetopts.pl: original size 7024, current size' "$Wc_c" -fi -# ============= libs/strings1.pl ============== -if test -f 'libs/strings1.pl' -a X"$1" != X"-c"; then - echo 'x - skipping libs/strings1.pl (File already exists)' -else -echo 'x - extracting libs/strings1.pl (Text)' -sed 's/^X//' << 'SHAR_EOF' > 'libs/strings1.pl' && -;# NAME -;# strings1.pl - FUN with strings #1 -;# -;# NOTES -;# I wrote Format_Text_Block when I just started programming Perl so -;# it is probably not very Perlish code. Center is more like it :-). -;# -;# AUTHOR -;# Michael S. Muegel (mmuegel@mot.com) -;# -;# RCS INFORMATION -;# mmuegel -;# /usr/local/ustart/src/mail-tools/dist/foo/libs/strings1.pl,v 1.1 1993/07/28 08:07:19 mmuegel Exp -X -package strings1; -X -;###############################################################################;# Center -;# -;# Center $Text assuming the output should be $Columns wide. $Text can span -;# multiple lines, of course :-). Lines within $Text that contain only -;# whitespace are not centered and are instead collapsed. This may save time -;# when printing them later. -;# -;# Arguments: -;# $Text, $Columns -;# -;# Returns: -;# $Centered_Text -;############################################################################### -sub main'Center -{ -X local ($_, $Columns) = @_; -X local ($*) = 1; -X -X s@^(.*)$@" " x (($Columns - length ($1)) / 2) . $1@eg; -X s/^[\t ]*$//g; -X return ($_); -}; -X -;############################################################################### -;# Format_Text_Block -;# -;# Formats a text string to be printed to the display or other similar device. -;# Text in $String will be fomratted such that the following hold: -;# -;# + $String contains the (possibly) multi-line text to print. It is -;# automatically word-wrapped to fit in $Columns. -;# -;# + \n'd are maintained and are not folded. -;# -;# + $Offset is pre-pended before each separate line of text. -;# -;# + If $Offset_Once is $TRUE $Offset will only appear on the first line. -;# All other lines will be indented to match the amount of whitespace of -;# $Offset. -;# -;# + If $Bullet_Indent is $TRUE $Offset will only be applied to the begining -;# of lines as they occured in the original $String. Lines that are created -;# by this routine will always be indented by blank spaces. -;# -;# + If $Columns is 0 no word-wrap is done. This might be useful to still -;# to offset each line in a buffer. -;# -;# + If $Split_Expr is supplied the string is split on it. If not supplied -;# the string is split on " \t\/\-\,\." by default. -;# -;# + If $Offset_Blank is $TRUE then empty lines will have $Offset pre-pended -;# to them. Otherwise, they will still empty. -;# -;# This is a realy workhorse routine that I use in many places because of its -;# veratility. -;# -;# Arguments: -;# $String, $Offset, $Offset_Once, $Bullet_Indent, $Columns, $Split_Expr, -;# $Offset_Blank -;# -;# Returns: -;# $Buffer -;############################################################################### -sub main'Format_Text_Block -{ -X local ($String, $Real_Offset, $Offset_Once, $Bullet_Indent, $Columns, -X $Split_Expr, $Offset_Blank) = @_; -X -X local ($New_Line, $Line, $Chars_Per_Line, $Space_Offset, $Buffer, -X $Next_New_Line, $Num_Lines, $Num_Offsets, $Offset); -X local ($*) = 0; -X local ($BLANK_TAG) = "__FORMAT_BLANK__"; -X local ($Blank_Offset) = $Real_Offset if ($Offset_Blank); -X -X # What should we split on? -X $Split_Expr = " \\t\\/\\-\\,\\." if (! $Split_Expr); -X -X # Pre-process the string - convert blank lines to __FORMAT_BLANK__ sequence -X $String =~ s/\n\n/\n$BLANK_TAG\n/g; -X $String =~ s/^\n/$BLANK_TAG\n/g; -X $String =~ s/\n$/\n$BLANK_TAG/g; -X -X # If bad $Columns/$Offset combo or no $Columns make a VERRRYYY wide $Column -X $Offset = $Real_Offset; -X $Chars_Per_Line = 16000 if (($Chars_Per_Line = $Columns - length ($Offset)) <= 0); -X $Space_Offset = " " x length ($Offset); -X -X # Get a buffer -X foreach $Line (split ("\n", $String)) -X { -X $Offset = $Real_Offset if ($Bullet_Indent); -X -X # Find where to split the line -X if ($Line ne $BLANK_TAG) -X { -X $New_Line = ""; -X while ($Line =~ /^([$Split_Expr]*)([^$Split_Expr]+)/) -X { -X if (length ("$New_Line$&") >= $Chars_Per_Line) -X { -X $Next_New_Line = $+; -X $New_Line = "$Offset$New_Line$1"; -X $Buffer .= "\n" if ($Num_Lines++); -X $Buffer .= $New_Line; -X $Offset = $Space_Offset if (($Offset) && ($Offset_Once)); -X $New_Line = $Next_New_Line; -X ++$Num_Lines; -X } -X else -X { -X $New_Line .= $&; -X }; -X $Line = $'; -X }; -X -X $Buffer .= "\n" if ($Num_Lines++); -X $Buffer .= "$Offset$New_Line$Line"; -X $Offset = $Space_Offset if (($Offset) && ($Offset_Once)); -X } -X -X else -X { -X $Buffer .= "\n$Blank_Offset"; -X }; -X }; -X -X return ($Buffer); -X -}; -X -1; -SHAR_EOF -chmod 0444 libs/strings1.pl || -echo 'restore of libs/strings1.pl failed' -Wc_c="`wc -c < 'libs/strings1.pl'`" -test 4687 -eq "$Wc_c" || - echo 'libs/strings1.pl: original size 4687, current size' "$Wc_c" -fi -# ============= libs/timespec.pl ============== -if test -f 'libs/timespec.pl' -a X"$1" != X"-c"; then - echo 'x - skipping libs/timespec.pl (File already exists)' -else -echo 'x - extracting libs/timespec.pl (Text)' -sed 's/^X//' << 'SHAR_EOF' > 'libs/timespec.pl' && -;# NAME -;# timespec.pl - convert a pre-defined time specifyer to seconds -;# -;# AUTHOR -;# Michael S. Muegel (mmuegel@mot.com) -;# -;# RCS INFORMATION -;# mmuegel -;# /usr/local/ustart/src/mail-tools/dist/foo/libs/timespec.pl,v 1.1 1993/07/28 08:07:19 mmuegel Exp -X -package timespec; -X -%TIME_SPEC_TO_SECONDS = ("s", 1, -X "m", 60, -X "h", 60 * 60, -X "d", 60 * 60 * 24 -X ); -X -$VALID_TIME_SPEC_EXPR = "[" . join ("", keys (%TIME_SPEC_TO_SECONDS)) . "]"; -X -;############################################################################### -;# Time_Spec_To_Seconds -;# -;# Converts a string of the form: -;# -;# (<number>(s|m|h|d))+ -;# -;# to seconds. The second part of the time spec specifies seconds, minutes, -;# hours, or days, respectfully. The first part is the number of those untis. -;# There can be any number of such specifiers. As an example, 1h30m means 1 -;# hour and 30 minutes. -;# -;# If the parsing went OK then $Status is 1, $Msg is undefined, and $Seconds -;# is $Time_Spec converted to seconds. If something went wrong then $Status -;# is 0 and $Msg explains what went wrong. -;# -;# Arguments: -;# $Time_Spec -;# -;# Returns: -;# $Status, $Msg, $Seconds -;############################################################################### -sub main'Time_Spec_To_Seconds -{ -X $Time_Spec = $_[0]; -X -X $Seconds = 0; -X while ($Time_Spec =~ /^(\d+)($VALID_TIME_SPEC_EXPR)/) -X { -X $Seconds += $1 * $TIME_SPEC_TO_SECONDS {$2}; -X $Time_Spec = $'; -X }; -X -X return (0, "error parsing time spec: $Time_Spec") if ($Time_Spec ne ""); -X return (1, "", $Seconds); -X -}; -X -X -1; -SHAR_EOF -chmod 0444 libs/timespec.pl || -echo 'restore of libs/timespec.pl failed' -Wc_c="`wc -c < 'libs/timespec.pl'`" -test 1609 -eq "$Wc_c" || - echo 'libs/timespec.pl: original size 1609, current size' "$Wc_c" -fi -# ============= man/cqueue.1 ============== -if test ! -d 'man'; then - echo 'x - creating directory man' - mkdir 'man' -fi -if test -f 'man/cqueue.1' -a X"$1" != X"-c"; then - echo 'x - skipping man/cqueue.1 (File already exists)' -else -echo 'x - extracting man/cqueue.1 (Text)' -sed 's/^X//' << 'SHAR_EOF' > 'man/cqueue.1' && -.TH CQUEUE 1L -\" -\" mmuegel -\" /usr/local/ustart/src/mail-tools/dist/foo/man/cqueue.1,v 1.1 1993/07/28 08:08:25 mmuegel Exp -\" -.ds mp \fBcqueue\fR -.de IB -.IP \(bu 2 -.. -.SH NAME -\*(mp - check sendmail queue for problems -.SH SYNOPSIS -.IP \*(mp 7 -[ \fB-abdms\fR ] [ \fB-q\fR \fIqueue-dir\fI ] [ \fB-t\fR \fItime\fR ] -[ \fB-u\fR \fIusers\fR ] [ \fB-w\fR \fIwidth\fR ] -.SH DESCRIPTION -Reports on problems in the sendmail queue. With no options this simply -means listing messages that have been in the queue longer than a default -period along with a summary of queue mail by host and status message. -.SH OPTIONS -.IP \fB-a\fR 14 -Report on all messages in the queue. This is equivalent to saying \fB-t\fR 0s. -You may like this command so much that you use it as a replacement for -\fBmqueue\fR. For example: -.sp 1 -.RS -.RS -\fBalias mqueue cqueue -a\fR -.RE -.RE -.IP \fB-b\fR 14 -Also report on bogus queue files. Those are files that -have data files and no control files or vice versa. -.IP \fB-d\fR -Print a detailed report of mail messages that have been queued longer than -the specified or default time. Information that is presented includes: -.RS -.RS -.IB -Sendmail queue identifier. -.IB -Date the message was first queued. -.IB -Sender of the message. -.IB -One or more recipients of the message. -.IB -An optional status of the message. This usually indicates why the message -has not been delivered. -.RE -.RE -.IP \fB-m\fR 14 -Mail off the results if any problems were found. -Normaly results are printed to stdout. If this option -is specified they are mailed to one or more users. Results -are not printed to stdout in this case. Results are \fBonly\fR -mailed if \*(mp found something wrong. -.IP "\fB-q\fR \fIqueue-dir\fI" -The sendmail mail queue directory. Default is \fB/usr/spool/mqueue\fR or -some other site configured value. -.IP "\fB-t\fR \fItime\fR" -List messages that have been in the queue longer than -\fItime\fR. Time should of the form: -.sp 1 -.RS -.RS -(<number>(s|m|h|d))+ -.sp 1 -.RE -.RE -.RS 14 -The second portion of the above definition -specifies seconds, minutes, hours, or -days, respectfully. The first portion is the number of -those units. There can be any number of such specifiers. -As an example, 1h30m means 1 hour and 30 minutes. -.sp 1 -The default is 2 hours. -.RE -.IP \fB-s\fR 14 -Print a summary of messages that have been queued longer than -the specified or default time. Two separate types of summaries are printed. -The first summarizes the queue messages by destination host. The host name -is gleaned from the recipient addresses for each message. -Thus the actual host names for this summary should be taken with a grain -of salt since ruleset 0 has not been applied to the address the host was -taken from nor were MX records consulted. It would be possible to add -this; however, the execution time of the script would increase -dramatically. The second summary is by status message. -.IP "\fB-u\fR \fIusers\fR" -Specify list of users to send a mail report to other than -the invoker. This option is only valid when \fB-m\fR has been -specified. Multiple recipients may be separated by spaces. -.IP "\fB-w\fR \fIwidth\fR" -Specify the page width to which the output should tailored. \fIwidth\fR -should be an integer representing some character position. The default is -80 or some other site configured value. Output is folded neatly to match -\fIwidth\fR. -.SH EXAMPLES -.nf -% \fBdate\fR -Tue Jan 19 12:07:20 CST 1993 -X -% \fBcqueue -t 21h45m -w 70\fR -X -Summary of messages in queue longer than 21:45:00 by destination -host: -X -X Number of -X Messages Destination Host -X --------- ---------------- -X 2 cigseg.rtsg.mot.com -X 1 mnesouth.corp.mot.com -X --------- -X 3 -X -Summary of messages in queue longer than 21:45:00 by status message: -X -X Number of -X Messages Status Message -X --------- -------------- -X 1 Deferred: Connection refused by mnesouth.corp.mot.com -X 2 Deferred: Host Name Lookup Failure -X --------- -X 3 -X -Detail of messages in queue longer than 21:45:00 sorted by creation -date: -X -X ID: AA20573 -X Date: 02:09:27 PM 01/18/93 -X Sender: melrose-place-owner@ferkel.ucsb.edu -X Recipient: pbaker@cigseg.rtsg.mot.com -X Status: Deferred: Host Name Lookup Failure -X -X ID: AA20757 -X Date: 02:11:30 PM 01/18/93 -X Sender: 90210-owner@ferkel.ucsb.edu -X Recipient: pbaker@cigseg.rtsg.mot.com -X Status: Deferred: Host Name Lookup Failure -X -X ID: AA21110 -X Date: 02:17:01 PM 01/18/93 -X Sender: rd_lap_wg@mdd.comm.mot.com -X Recipient: jim_mathis@mnesouth.corp.mot.com -X Status: Deferred: Connection refused by mnesouth.corp.mot.com -.fi -.SH AUTHOR -.nf -Michael S. Muegel (mmuegel@mot.com) -UNIX Applications Startup Group -Corporate Information Office, Schaumburg, IL -Motorola, Inc. -.fi -.SH COPYRIGHT NOTICE -Copyright 1993, Motorola, Inc. -.sp 1 -Permission to use, copy, modify and distribute without charge this -software, documentation, etc. is granted, provided that this -comment and the author's name is retained. The author nor Motorola assume any -responsibility for problems resulting from the use of this software. -.SH SEE ALSO -.nf -\fBsendmail(8)\fR -\fISendmail Installation and Operation Guide\fR. -.fi -SHAR_EOF -chmod 0444 man/cqueue.1 || -echo 'restore of man/cqueue.1 failed' -Wc_c="`wc -c < 'man/cqueue.1'`" -test 5212 -eq "$Wc_c" || - echo 'man/cqueue.1: original size 5212, current size' "$Wc_c" -fi -# ============= man/postclip.1 ============== -if test -f 'man/postclip.1' -a X"$1" != X"-c"; then - echo 'x - skipping man/postclip.1 (File already exists)' -else -echo 'x - extracting man/postclip.1 (Text)' -sed 's/^X//' << 'SHAR_EOF' > 'man/postclip.1' && -.TH POSTCLIP 1L -\" -\" mmuegel -\" /usr/local/ustart/src/mail-tools/dist/foo/man/postclip.1,v 1.1 1993/07/28 08:08:25 mmuegel Exp -\" -.ds mp \fBpostclip\fR -.SH NAME -\*(mp - send only the headers to Postmaster -.SH SYNOPSIS -\*(mp [ \fB-v\fR ] [ \fIto\fR ... ] -.SH DESCRIPTION -\*(mp will forward non-delivery reports to a postmaster after deleting the body -of the message. This keeps bounced mail private and helps to avoid disk space problems. \*(mp tries its best to keep as much of the header trail as possible. -Hopefully only the original body of the message will be filtered. Only messages -that have a subject that begins with 'Returned mail:' are filtered. This -ensures that other mail is not accidently mucked with. Finally, note that -\fBsendmail\fR is used to deliver the message after it has been (possibly) -filtered. All of the original headers will remain intact. -.sp 1 -You can use this with any \fBsendmail\fR by modifying the Postmaster alias. -If you use IDA \fBsendmail\fR you could add the following to <machine>.m4: -.sp 1 -.RS -define(POSTMASTERBOUNCE, mailer-errors) -.RE -.sp 1 -In the aliases file, add a line similar to the following: -.sp 1 -.RS -mailer-errors: "|/usr/local/bin/postclip postmaster" -.RE -.SH OPTIONS -.IP \fB-v\fR -Be verbose about delivery. Probably only useful when debugging \*(mp. -.IP \fIto\fR -A list of one or more e-mail ids to send the modified -Postmaster messages to. If none are specified postmaster -is used. -.SH AUTHOR -.nf -Michael S. Muegel (mmuegel@mot.com) -UNIX Applications Startup Group -Corporate Information Office, Schaumburg, IL -Motorola, Inc. -.fi -.SH CREDITS -The original idea to filter Postmaster mail was taken from a script by -Christopher Davis <ckd@eff.org>. -.SH COPYRIGHT NOTICE -Copyright 1992, Motorola, Inc. -.sp 1 -Permission to use, copy, modify and distribute without charge this -software, documentation, etc. is granted, provided that this -comment and the author's name is retained. The author nor Motorola assume any -responsibility for problems resulting from the use of this software. -.SH SEE ALSO -.nf -\fBsendmail(8)\fR -.fi -SHAR_EOF -chmod 0444 man/postclip.1 || -echo 'restore of man/postclip.1 failed' -Wc_c="`wc -c < 'man/postclip.1'`" -test 2078 -eq "$Wc_c" || - echo 'man/postclip.1: original size 2078, current size' "$Wc_c" -fi -# ============= src/cqueue ============== -if test ! -d 'src'; then - echo 'x - creating directory src' - mkdir 'src' -fi -if test -f 'src/cqueue' -a X"$1" != X"-c"; then - echo 'x - skipping src/cqueue (File already exists)' -else -echo 'x - extracting src/cqueue (Text)' -sed 's/^X//' << 'SHAR_EOF' > 'src/cqueue' && -#!/usr/local/ustart/bin/suidperl -X -# NAME -# cqueue - check sendmail queue for problems -# -# SYNOPSIS -# Type cqueue -usage -# -# AUTHOR -# Michael S. Muegel <mmuegel@mot.com> -# -# RCS INFORMATION -# mmuegel -# /usr/local/ustart/src/mail-tools/dist/foo/src/cqueue,v 1.1 1993/07/28 08:09:02 mmuegel Exp -X -# So that date.pl does not yell (Domain/OS version does a ``) -$ENV{'PATH'} = ""; -X -# A better getopts routine -require "newgetopts.pl"; -require "timespec.pl"; -require "mail.pl"; -require "date.pl"; -require "mqueue.pl"; -require "strings1.pl"; -require "elapsed.pl"; -X -($Script_Name = $0) =~ s/.*\///; -X -# Some defaults you may want to change -$DEF_TIME = "2h"; -$DEF_QUEUE = "/usr/spool/mqueue"; -$DEF_COLUMNS = 80; -$DATE_FORMAT = "%r %D"; -X -# Constants that probably should not be changed -$USAGE = "Usage: $Script_Name [ -abdms ] [ -q queue-dir ] [ -t time ] [ -u user ] [ -w width ]\n"; -$VERSION = "${Script_Name} by mmuegel; 1.1 of 1993/07/28 08:09:02"; -$SWITCHES = "abdmst:u:q:w:"; -$SPLIT_EXPR = '\s,\.@!%:'; -$ADDR_PART_EXPR = '[^!@%]+'; -X -# Let getopts parse for switches -$Status = &New_Getopts ($SWITCHES, $USAGE); -exit (0) if ($Status == -1); -exit (1) if (! $Status); -X -# Check args -die "${Script_Name}: -u only valid with -m\n" if (($opt_u) && (! $opt_m)); -die "${Script_Name}: -a not valid with -t option\n" if ($opt_a && $opt_t); -$opt_u = getlogin || (getpwuid ($<))[0] || $ENV{"USER"} || die "${Script_Name}: can not determine who you are!\n" if (! $opt_u); -X -# Set defaults -$opt_t = "0s" if ($opt_a); -$opt_t = $DEF_TIME if ($opt_t eq ""); -$opt_w = $DEF_COLUMNS if ($opt_w eq ""); -$opt_q = $DEF_QUEUE if ($opt_q eq ""); -$opt_s = $opt_d = 1 if (! ($opt_s || $opt_d)); -X -# Untaint the users to mail to -$opt_u =~ /^(.*)$/; -$Users = $1; -X -# Convert time option to seconds and seconds to elapsed form -die "${Script_Name}: $Msg\n" if (! (($Status, $Msg, $Seconds) = &Time_Spec_To_Seconds ($opt_t))[0]); -$Elapsed = &Seconds_To_Elapsed ($Seconds, 1); -$Time_Info = " longer than $Elapsed" if ($Seconds); -X -# Get the current time -$Current_Time = time; -$Current_Date = &date ($Current_Time, $DATE_FORMAT); -X -($Status, $Msg, @Queue_IDs) = &Get_Queue_IDs ($opt_q, 1, @Missing_Control_IDs, -X @Missing_Data_IDs); -die "$Script_Name: $Msg\n" if (! $Status); -X -# Yell about missing data/control files? -if ($opt_b) -{ -X -X $Report = "\nMessages missing control files:\n\n " . -X join ("\n ", @Missing_Control_IDs) . -X "\n" -X if (@Missing_Control_IDs); -X -X $Report .= "\nMessages missing data files:\n\n " . -X join ("\n ", @Missing_Data_IDs) . -X "\n" -X if (@Missing_Data_IDs); -}; -X -# See if any mail messages are older than $Seconds -foreach $Queue_ID (@Queue_IDs) -{ -X # Get lots of info about this sendmail message via the control file -X ($Status, $Msg) = &Parse_Control_File ($opt_q, $Queue_ID, *Sender, -X *Recipients, *Errors_To, *Creation_Time, *Priority, *Status_Message, -X *Headers); -X next if ($Status == -1); -X if (! $Status) -X { -X warn "$Script_Name: $Queue_ID: $Msg\n"; -X next; -X }; -X -X # Report on message if it is older than $Seconds -X if ($Current_Time - $Creation_Time >= $Seconds) -X { -X # Build summary by host information. Keep track of each host destination -X # encountered. -X if ($opt_s) -X { -X %Host_Map = (); -X foreach (@Recipients) -X { -X if ((/@($ADDR_PART_EXPR)$/) || (/($ADDR_PART_EXPR)!$ADDR_PART_EXPR$/)) -X { -X ($Host = $1) =~ tr/A-Z/a-z/; -X $Host_Map {$Host} = 1; -X } -X else -X { -X warn "$Script_Name: could not find host part from $_; contact author\n"; -X }; -X }; -X -X # For each unique target host add to its stats -X grep ($Host_Queued {$_}++, keys (%Host_Map)); -X -X # Build summary by message information. -X $Message_Queued {$Status_Message}++ if ($Status_Message); -X }; -X -X # Build long report information for this creation time (there may be -X # more than one message created at the same time) -X if ($opt_d) -X { -X $Creation_Date = &date ($Creation_Time, $DATE_FORMAT); -X $Recipient_Info = &Format_Text_Block (join (", ", @Recipients), -X " Recipient: ", 1, 0, $opt_w, $SPLIT_EXPR); -X $Time_To_Report {$Creation_Time} .= <<"EOS"; -X -X ID: $Queue_ID -X Date: $Creation_Date -X Sender: $Sender -$Recipient_Info -EOS -X -X # Add the status message if available to long report -X if ($Status_Message) -X { -X $Time_To_Report {$Creation_Time} .= &Format_Text_Block ($Status_Message, -X " Status: ", 1, 0, $opt_w, $SPLIT_EXPR) . "\n"; -X }; -X }; -X }; -X -}; -X -# Add the summary report by target host? -if ($opt_s) -{ -X foreach $Host (sort (keys (%Host_Queued))) -X { -X $Host_Report .= &Format_Text_Block ($Host, -X sprintf (" %-9d ", $Host_Queued{$Host}), 1, 0, $opt_w, -X $SPLIT_EXPR) . "\n"; -X $Num_Hosts += $Host_Queued{$Host}; -X }; -X if ($Host_Report) -X { -X chop ($Host_Report); -X $Report .= &Format_Text_Block("\nSummary of messages in queue$Time_Info by destination host:\n", "", 0, 0, $opt_w); -X -X $Report .= <<"EOS"; -X -X Number of -X Messages Destination Host -X --------- ---------------- -$Host_Report -X --------- -X $Num_Hosts -EOS -X }; -}; -X -# Add the summary by message report? -if ($opt_s) -{ -X foreach $Message (sort (keys (%Message_Queued))) -X { -X $Message_Report .= &Format_Text_Block ($Message, -X sprintf (" %-9d ", $Message_Queued{$Message}), 1, 0, $opt_w, -X $SPLIT_EXPR) . "\n"; -X $Num_Messages += $Message_Queued{$Message}; -X }; -X if ($Message_Report) -X { -X chop ($Message_Report); -X $Report .= &Format_Text_Block ("\nSummary of messages in queue$Time_Info by status message:\n", "", 0, 0, $opt_w); -X -X $Report .= <<"EOS"; -X -X Number of -X Messages Status Message -X --------- -------------- -$Message_Report -X --------- -X $Num_Messages -EOS -X }; -}; -X -# Add the detailed message reports? -if ($opt_d) -{ -X foreach $Time (sort { $a <=> $b} (keys (%Time_To_Report))) -X { -X $Report .= &Format_Text_Block ("\nDetail of messages in queue$Time_Info sorted by creation date:\n","", 0, 0, $opt_w) if (! $Detailed_Header++); -X $Report .= $Time_To_Report {$Time}; -X }; -}; -X -# Now mail or print the report -if ($Report) -{ -X $Report .= "\n"; -X if ($opt_m) -X { -X ($Status, $Msg) = &Send_Mail ($Users, "sendmail queue report for $Current_Date", $Report, 0); -X die "${Script_Name}: $Msg" if (! $Status); -X } -X -X else -X { -X print $Report; -X }; -X -}; -X -# I am outta here... -exit (0); -SHAR_EOF -chmod 0555 src/cqueue || -echo 'restore of src/cqueue failed' -Wc_c="`wc -c < 'src/cqueue'`" -test 6647 -eq "$Wc_c" || - echo 'src/cqueue: original size 6647, current size' "$Wc_c" -fi -# ============= src/postclip ============== -if test -f 'src/postclip' -a X"$1" != X"-c"; then - echo 'x - skipping src/postclip (File already exists)' -else -echo 'x - extracting src/postclip (Text)' -sed 's/^X//' << 'SHAR_EOF' > 'src/postclip' && -#!/usr/local/bin/perl -X -# NAME -# postclip - send only the headers to Postmaster -# -# SYNOPSIS -# postclip [ -v ] [ to ... ] -# -# AUTHOR -# Michael S. Muegel <mmuegel@mot.com> -# -# RCS INFORMATION -# /usr/local/ustart/src/mail-tools/dist/foo/src/postclip,v -# 1.1 of 1993/07/28 08:09:02 -X -# We use this to send off the mail -require "newgetopts.pl"; -require "mail.pl"; -X -# Get the basename of the script -($Script_Name = $0) =~ s/.*\///; -X -# Some famous constants -$USAGE = "Usage: $Script_Name [ -v ] [ to ... ]\n"; -$VERSION = "${Script_Name} by mmuegel; 1.1 of 1993/07/28 08:09:02"; -$SWITCHES = "v"; -X -# Let getopts parse for switches -$Status = &New_Getopts ($SWITCHES, $USAGE); -exit (0) if ($Status == -1); -exit (1) if (! $Status); -X -# Who should we send the modified mail to? -@ARGV = ("postmaster") if (! @ARGV); -$Users = join (" ", @ARGV); -@ARGV = (); -X -# Suck in the original header and save a few interesting lines -while (<>) -{ -X $Buffer .= $_ if (! /^From /); -X $Subject = $1 if (/^Subject:\s+(.*)$/); -X $From = $1 if (/^From:\s+(.*)$/); -X last if (/^$/); -}; -X -# Do not filter the message unless it has a subject and the subject indicates -# it is an NDN -if ($Subject && ($Subject =~ /^returned mail/i)) -{ -X # Slurp input by paragraph. Keep track of the last time we saw what -X # appeared to be NDN text. We keep this. -X $/ = "\n\n"; -X $* = 1; -X while (<>) -X { -X push (@Paragraphs, $_); -X $Last_Error_Para = $#Paragraphs -X if (/unsent message follows/i || /was not delivered because/); -X }; -X -X # Now save the NDN text into $Buffer -X $Buffer .= join ("", @Paragraphs [0..$Last_Error_Para]); -} -X -else -{ -X undef $/; -X $Buffer .= <>; -}; -X -# Send off the (possibly) modified mail -($Status, $Msg) = &Send_Mail ($Users, "", $Buffer, 0, $opt_v, 1); -die "$Script_Name: $Msg\n" if (! $Status); -SHAR_EOF -chmod 0555 src/postclip || -echo 'restore of src/postclip failed' -Wc_c="`wc -c < 'src/postclip'`" -test 1836 -eq "$Wc_c" || - echo 'src/postclip: original size 1836, current size' "$Wc_c" -fi -exit 0 - --- -+----------------------------------------------------------------------------+ -| Michael S. Muegel | Internet E-Mail: mmuegel@mot.com | -| UNIX Applications Startup Group | Moto Dist E-Mail: X10090 | -| Corporate Information Office | Voice: (708) 576-0507 | -| Motorola | Fax: (708) 576-4153 | -+----------------------------------------------------------------------------+ - - "I'm disturbed, I'm depressed, I'm inadequate -- I've got it all!" - -- George from _Seinfeld_ diff --git a/contrib/oldbind.compat.c b/contrib/oldbind.compat.c deleted file mode 100644 index 1621a7b..0000000 --- a/contrib/oldbind.compat.c +++ /dev/null @@ -1,79 +0,0 @@ -/* -** OLDBIND.COMPAT.C -** -** Very old systems do not have res_query(), res_querydomain() or -** res_search(), so emulate them here. -** -** You really ought to be upgrading to a newer version of BIND -** (4.8.2 or later) rather than be using this. -** -** J.R. Oldroyd <jr@inset.com> -*/ - -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> - -typedef union -{ - HEADER qb1; - char qb2[PACKETSZ]; -} querybuf; - -res_query(dname, class, type, data, datalen) - char * dname; - int class; - int type; - char * data; - int datalen; -{ - int n; - querybuf buf; - - n = res_mkquery(QUERY, dname, class, type, (char *) NULL, 0, - NULL, (char *) &buf, sizeof buf); - n = res_send((char *)&buf, n, data, datalen); - - return n; -} - -res_querydomain(host, dname, class, type, data, datalen) - char * host; - char * dname; - int class; - int type; - char * data; - int datalen; -{ - int n; - querybuf buf; - char dbuf[256]; - - strcpy(dbuf, host); - if (dbuf[strlen(dbuf)-1] != '.') - strcat(dbuf, "."); - strcat(dbuf, dname); - n = res_mkquery(QUERY, dbuf, class, type, (char *) NULL, 0, - NULL, (char *)&buf, sizeof buf); - n = res_send((char *) &buf, n, data, datalen); - - return n; -} - -res_search(dname, class, type, data, datalen) - char * dname; - int class; - int type; - char * data; - int datalen; -{ - int n; - querybuf buf; - - n = res_mkquery(QUERY, dname, class, type, (char *)NULL, 0, - NULL, (char *) &buf, sizeof buf); - n = res_send((char *) &buf, n, data, datalen); - - return n; -} diff --git a/contrib/passwd-to-alias.pl b/contrib/passwd-to-alias.pl deleted file mode 100755 index 05a51b9..0000000 --- a/contrib/passwd-to-alias.pl +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/perl - -# -# Convert GECOS information in password files to alias syntax. -# -# Contributed by Kari E. Hurtta <Kari.Hurtta@ozone.fmi.fi> -# - -print "# Generated from passwd by $0\n"; - -while (@a = getpwent) { - ($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,$shell) = @a; - - ($fullname = $gcos) =~ s/,.*$//; - - if (!-d $dir || !-x $shell) { - print "$name: root\n"; - } - - $fullname =~ s/\.*[ _]+\.*/./g; - $fullname =~ tr [åäöÅÄÖé] [aaoAAOe]; # <hakan@af.lu.se> 1997-06-15 - if ($fullname =~ /^[a-zA-Z][a-zA-Z-]+(\.[a-zA-Z][a-zA-Z-]+)+$/) { -# if ($fullname =~ /^[a-zA-Z]+(\.[a-zA-Z]+)+$/) { # Kari E. Hurtta - print "$fullname: $name\n"; - } else { - print "# $fullname: $name\n"; - } -}; - -endpwent; diff --git a/contrib/re-mqueue.pl b/contrib/re-mqueue.pl deleted file mode 100644 index 61aef43..0000000 --- a/contrib/re-mqueue.pl +++ /dev/null @@ -1,203 +0,0 @@ -#!/usr/bin/perl -# -# re-mqueue -- requeue messages from queueA to queueB based on age. -# -# Contributed by Paul Pomes <ppomes@Qualcomm.COM>. -# http://www.qualcomm.com/~ppomes/ -# -# Usage: re-mqueue [-d] queueA queueB seconds -# -# -d enable debugging -# queueA source directory -# queueB destination directory -# seconds select files older than this number of seconds -# -# Example: re-mqueue /var/spool/mqueue /var/spool/mqueue2 2700 -# -# Moves the qf* and df* files for a message from /var/spool/mqueue to -# /var/spool/mqueue2 if the df* file is over 2700 seconds old. -# -# The qf* file can't be used for age checking as it's partially re-written -# with the results of the last queue run. -# -# Rationale: With a limited number of sendmail processes allowed to run, -# messages that can't be delivered immediately slow down the ones that can. -# This becomes especially important when messages are being queued instead -# of delivered right away, or when the queue becomes excessively deep. -# By putting messages that have already failed one or more delivery attempts -# into another queue, the primary queue can be kept small and fast. -# -# On postoffice.cso.uiuc.edu, the primary sendmail daemon runs the queue -# every thirty minutes. Messages over 45 minutues old are moved to -# /var/spool/mqueue2 where sendmail runs every hour. Messages more than -# 3.25 hours old are moved to /var/spool/mqueue3 where sendmail runs every -# four hours. Messages more than a day old are moved to /var/spool/mqueue4 -# where sendmail runs three times a day. The idea is that a message is -# tried at least twice in the first three queues before being moved to the -# old-age ghetto. -# -# (Each must be re-formed into a single line before using in crontab) -# -# 08 * * * * /usr/local/libexec/re-mqueue /var/spool/mqueue ## /var/spool/mqueue2 2700 -# 11 * * * * /usr/lib/sendmail -oQ/var/spool/mqueue2 -q > ## > /var/log/mqueue2 2>&1 -# 38 * * * * /usr/local/libexec/re-mqueue /var/spool/mqueue2 -# /var/spool/mqueue3 11700 -# 41 1,5,9,13,17,21 * * * /usr/lib/sendmail -oQ/var/spool/mqueue3 -q ## > /var/log/mqueue3 2>&1 -# 48 * * * * /usr/local/libexec/re-mqueue /var/spool/mqueue3 -# /var/spool/mqueue4 100000 -#53 3,11,19 * * * /usr/lib/sendmail -oQ/var/spool/mqueue4 -q > ## > /var/log/mqueue4 2>&1 -# -# -# N.B., the moves are done with link(). This has two effects: 1) the mqueue* -# directories must all be on the same filesystem, and 2) the file modification -# times are not changed. All times must be cumulative from when the df* -# file was created. -# -# Copyright (c) 1995 University of Illinois Board of Trustees and Paul Pomes -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. All advertising materials mentioning features or use of this software -# must display the following acknowledgement: -# This product includes software developed by the University of -# Illinois at Urbana and their contributors. -# 4. Neither the name of the University nor the names of their contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE TRUSTEES AND CONTRIBUTORS ``AS IS'' AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE TRUSTEES OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -# SUCH DAMAGE. -# -# @(#)$Id: re-mqueue,v 1.3 1995/05/25 18:14:53 p-pomes Exp $ - -require "syslog.pl"; - -$LOCK_EX = 2; -$LOCK_NB = 4; -$LOCK_UN = 8; - -# Count arguments, exit if wrong in any way. -die "Usage: $0 [-d] queueA queueB seconds\n" if ($#ARGV < 2); - -while ($_ = $ARGV[0], /^-/) { - shift; - last if /^--$/; - /^-d/ && $debug++; -} - -$queueA = shift; -$queueB = shift; -$age = shift; - -die "$0: $queueA not a directory\n" if (! -d $queueA); -die "$0: $queueB not a directory\n" if (! -d $queueB); -die "$0: $age isn't a valid number of seconds for age\n" if ($age =~ /\D/); - -# chdir to $queueA and read the directory. When a df* file is found, stat it. -# If it's older than $age, lock the corresponding qf* file. If the lock -# fails, give up and move on. Once the lock is obtained, verify that files -# of the same name *don't* already exist in $queueB and move on if they do. -# Otherwise re-link the qf* and df* files into $queueB then release the lock. - -chdir "$queueA" || die "$0: can't cd to $queueA: $!\n"; -opendir (QA, ".") || die "$0: can't open directory $queueA for reading: $!\n"; -@dfiles = grep(/^df/, readdir(QA)); -$now = time(); -($program = $0) =~ s,.*/,,; -&openlog($program, 'pid', 'mail'); - -# Loop through the dfiles -while ($dfile = pop(@dfiles)) { - print "Checking $dfile\n" if ($debug); - ($qfile = $dfile) =~ s/^d/q/; - ($mfile = $dfile) =~ s/^df//; - if (! -e $dfile || -z $dfile) { - print "$dfile is gone or zero bytes - skipping\n" if ($debug); - next; - } - if (! -e $qfile || -z $qfile) { - print "$qfile is gone or zero bytes - skipping\n" if ($debug); - next; - } - - $mtime = $now; - ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, - $atime,$mtime,$ctime,$blksize,$blocks) = stat($dfile); - - # Compare timestamps - if (($mtime + $age) > $now) { - printf ("%s is %d seconds old - skipping\n", $dfile, $now-$mtime) if ($debug); - next; - } - - # See if files of the same name already exist in $queueB - if (-e "$queueB/$dfile") { - print "$queueb/$dfile already exists - skipping\n" if ($debug); - next; - } - if (-e "$queueB/$qfile") { - print "$queueb/$qfile already exists - skipping\n" if ($debug); - next; - } - - # Try and lock qf* file - unless (open(QF, ">>$qfile")) { - print "$qfile: $!\n" if ($debug); - next; - } - $retval = flock(QF, $LOCK_EX|$LOCK_NB) || ($retval = -1); - if ($retval == -1) { - print "$qfile already flock()ed - skipping\n" if ($debug); - close(QF); - next; - } - print "$qfile now flock()ed\n" if ($debug); - - # Show time! Do the link()s - if (link("$dfile", "$queueB/$dfile") == 0) { - &syslog('err', 'link(%s, %s/%s): %m', $dfile, $queueB, $dfile); - print STDERR "$0: link($dfile, $queueB/$dfile): $!\n"; - exit (1); - } - if (link("$qfile", "$queueB/$qfile") == 0) { - &syslog('err', 'link(%s, %s/%s): %m', $qfile, $queueB, $qfile); - print STDERR "$0: link($qfile, $queueB/$qfile): $!\n"; - unlink("$queueB/$dfile"); - exit (1); - } - - # Links created successfully. Unlink the original files, release the - # lock, and close the file. - print "links ok\n" if ($debug); - if (unlink($qfile) == 0) { - &syslog('err', 'unlink(%s): %m', $qfile); - print STDERR "$0: unlink($qfile): $!\n"; - exit (1); - } - if (unlink($dfile) == 0) { - &syslog('err', 'unlink(%s): %m', $dfile); - print STDERR "$0: unlink($dfile): $!\n"; - exit (1); - } - flock(QF, $LOCK_UN); - close(QF); - &syslog('info', '%s moved to %s', $mfile, $queueB); - print "Done with $dfile $qfile\n\n" if ($debug); -} -exit 0; diff --git a/contrib/rmail.oldsys.patch b/contrib/rmail.oldsys.patch deleted file mode 100644 index 856fcf1..0000000 --- a/contrib/rmail.oldsys.patch +++ /dev/null @@ -1,108 +0,0 @@ -From: Bill Gianopoulos <wag@sccux1.msd.ray.com> -Message-Id: <199405191527.LAA03463@sccux1.msd.ray.com> -Subject: Patch to rmail to elliminate need for snprintf -To: sendmail@CS.Berkeley.EDU -Date: Thu, 19 May 1994 11:27:16 -0400 (EDT) - -I have written the following patch to rmail which removes the requirement -for snprintf while maintaining the protection from buffer overruns. It also -fixes it to compile with compilers which don't understand ANSI function -prototypes. Perhaps this should be included in the next version? - -*** rmail/rmail.c.orig Mon May 31 18:10:44 1993 ---- rmail/rmail.c Thu May 19 11:04:50 1994 -*************** -*** 78,86 **** ---- 78,109 ---- - #include <sysexits.h> - #include <unistd.h> - -+ #ifdef __STDC__ - void err __P((int, const char *, ...)); - void usage __P((void)); -+ #else -+ void err (); -+ void usage (); -+ #endif - -+ #define strdup(s) strcpy(xalloc(strlen(s) + 1), s) -+ -+ char * -+ xalloc(sz) -+ register int sz; -+ { -+ register char *p; -+ -+ /* some systems can't handle size zero mallocs */ -+ if (sz <= 0) -+ sz = 1; -+ -+ p = malloc((unsigned) sz); -+ if (p == NULL) -+ err(EX_UNAVAILABLE, "Out of memory!!"); -+ return (p); -+ } -+ - int - main(argc, argv) - int argc; -*************** -*** 230,250 **** - args[i++] = "-oi"; /* Ignore '.' on a line by itself. */ - - if (from_sys != NULL) { /* Set sender's host name. */ -! if (strchr(from_sys, '.') == NULL) -! (void)snprintf(buf, sizeof(buf), - "-oMs%s.%s", from_sys, domain); -! else -! (void)snprintf(buf, sizeof(buf), "-oMs%s", from_sys); - if ((args[i++] = strdup(buf)) == NULL) - err(EX_TEMPFAIL, NULL); - } - /* Set protocol used. */ -! (void)snprintf(buf, sizeof(buf), "-oMr%s", domain); - if ((args[i++] = strdup(buf)) == NULL) - err(EX_TEMPFAIL, NULL); - - /* Set name of ``from'' person. */ -! (void)snprintf(buf, sizeof(buf), "-f%s%s", - from_path ? from_path : "", from_user); - if ((args[i++] = strdup(buf)) == NULL) - err(EX_TEMPFAIL, NULL); ---- 253,285 ---- - args[i++] = "-oi"; /* Ignore '.' on a line by itself. */ - - if (from_sys != NULL) { /* Set sender's host name. */ -! if (strchr(from_sys, '.') == NULL) { -! if ((strlen(from_sys) + strlen(domain) + 6) -! > sizeof(buf)) -! err(EX_DATAERR, "sender hostname too long"); -! (void)sprintf(buf, - "-oMs%s.%s", from_sys, domain); -! } -! else { -! if ((strlen(from_sys) + 5) > sizeof(buf)) -! err(EX_DATAERR ,"sender hostname too long"); -! (void)sprintf(buf, "-oMs%s", from_sys); -! } - if ((args[i++] = strdup(buf)) == NULL) - err(EX_TEMPFAIL, NULL); - } - /* Set protocol used. */ -! if ((strlen(domain) + 5) > sizeof(buf)) -! err(EX_DATAERR, "protocol name too long"); -! (void)sprintf(buf, "-oMr%s", domain); - if ((args[i++] = strdup(buf)) == NULL) - err(EX_TEMPFAIL, NULL); - - /* Set name of ``from'' person. */ -! if (((from_path ? strlen(from_path) : 0) + strlen(from_user) + 3) -! > sizeof(buf)) -! err(EX_DATAERR, "from address too long"); -! (void)sprintf(buf, "-f%s%s", - from_path ? from_path : "", from_user); - if ((args[i++] = strdup(buf)) == NULL) - err(EX_TEMPFAIL, NULL); --- -William A. Gianopoulos; Raytheon Missile Systems Division -wag@sccux1.msd.ray.com diff --git a/contrib/smcontrol.pl b/contrib/smcontrol.pl deleted file mode 100755 index b5ef1f8..0000000 --- a/contrib/smcontrol.pl +++ /dev/null @@ -1,361 +0,0 @@ -#!/usr/local/bin/perl -w - -use FileHandle; -use Socket; - -$sendmailDaemon = "/usr/sbin/sendmail -q30m -bd"; - -########################################################################## -# -# &get_controlname -- read ControlSocketName option from sendmail.cf -# -# Parameters: -# none. -# -# Returns: -# control socket filename, undef if not found -# - -sub get_controlname -{ - my $cn = undef; - my $qd = undef; - - open(CF, "</etc/sendmail.cf") or return $cn; - while (<CF>) - { - chomp; - if (/^O ControlSocketName\s*=\s*([^#]+)$/o) - { - $cn = $1; - } - if (/^O QueueDirectory\s*=\s*([^#]+)$/o) - { - $qd = $1; - } - if (/^OQ([^#]+)$/o) - { - $qd = $1; - } - } - close(CF); - if (not defined $cn) - { - return undef; - } - if ($cn !~ /^\//o) - { - return undef if (not defined $qd); - - $cn = $qd . "/" . $cn; - } - return $cn; -} - -########################################################################## -# -# &do_command -- send command to sendmail daemon view control socket -# -# Parameters: -# controlsocket -- filename for socket -# command -- command to send -# -# Returns: -# reply from sendmail daemon -# - -sub do_command -{ - my $controlsocket = shift; - my $command = shift; - my $proto = getprotobyname('ip'); - my @reply; - - socket(SOCK, PF_UNIX, SOCK_STREAM, $proto) or return undef; - - for ($i = 0; $i < 4; $i++) - { - if (!connect(SOCK, sockaddr_un($controlsocket))) - { - if ($i == 3) - { - close(SOCK); - return undef; - } - sleep 1; - next; - } - last; - } - autoflush SOCK 1; - print SOCK "$command\n"; - @reply = <SOCK>; - close(SOCK); - return join '', @reply; -} - -########################################################################## -# -# &sendmail_running -- check if sendmail is running via SMTP -# -# Parameters: -# none -# -# Returns: -# 1 if running, undef otherwise -# - -sub sendmail_running -{ - my $port = getservbyname("smtp", "tcp") || 25; - my $proto = getprotobyname("tcp"); - my $iaddr = inet_aton("localhost"); - my $paddr = sockaddr_in($port, $iaddr); - - socket(SOCK, PF_INET, SOCK_STREAM, $proto) or return undef; - if (!connect(SOCK, $paddr)) - { - close(SOCK); - return undef; - } - autoflush SOCK 1; - while (<SOCK>) - { - if (/^(\d{3})([ -])/) - { - if ($1 != 220) - { - close(SOCK); - return undef; - } - } - else - { - close(SOCK); - return undef; - } - last if ($2 eq " "); - } - print SOCK "QUIT\n"; - while (<SOCK>) - { - last if (/^\d{3} /); - } - close(SOCK); - return 1; -} - -########################################################################## -# -# &munge_status -- turn machine readable status into human readable text -# -# Parameters: -# raw -- raw results from sendmail daemon STATUS query -# -# Returns: -# human readable text -# - -sub munge_status -{ - my $raw = shift; - my $cooked = ""; - my $daemonStatus = ""; - - if ($raw =~ /^(\d+)\/(\d+)$/mg) - { - $cooked .= "Current number of children: $1"; - if ($2 > 0) - { - $cooked .= " (maximum $2)"; - } - $cooked .= "\n"; - } - while ($raw =~ /^(\d+) (.*)$/mg) - { - if (not $daemonStatus) - { - $daemonStatus = "(process $1) " . ucfirst($2) . "\n"; - } - else - { - $cooked .= "Child Process $1 Status: $2\n"; - } - } - return ($daemonStatus, $cooked); -} - -########################################################################## -# -# &start_daemon -- fork off a sendmail daemon -# -# Parameters: -# control -- control socket name -# -# Returns: -# Error message or "OK" if successful -# - -sub start_daemon -{ - my $control = shift; - my $pid; - - if ($pid = fork) - { - my $exitstat; - - waitpid $pid, 0 or return "Could not get status of created process: $!\n"; - $exitstat = $? / 256; - if ($exitstat != 0) - { - return "sendmail daemon startup exited with exit value $exitstat"; - } - } - elsif (defined $pid) - { - exec($main::sendmailDaemon); - die "Unable to start sendmail daemon: $!.\n"; - } - else - { - return "Could not create new process: $!\n"; - } - return "OK\n"; -} - -########################################################################## -# -# &stop_daemon -- stop the sendmail daemon using control socket -# -# Parameters: -# control -- control socket name -# -# Returns: -# Error message or status message -# - -sub stop_daemon -{ - my $control = shift; - my $status; - - if (not defined $control) - { - return "The control socket is not configured so the daemon can not be stopped.\n"; - } - return &do_command($control, "SHUTDOWN"); -} - -########################################################################## -# -# &restart_daemon -- restart the sendmail daemon using control socket -# -# Parameters: -# control -- control socket name -# -# Returns: -# Error message or status message -# - -sub restart_daemon -{ - my $control = shift; - my $status; - - if (not defined $control) - { - return "The control socket is not configured so the daemon can not be restarted."; - } - return &do_command($control, "RESTART"); -} - -########################################################################## -# -# &help -- get help from the daemon using the control socket -# -# Parameters: -# control -- control socket name -# -# Returns: -# Error message or status message -# - -sub help -{ - my $control = shift; - my $status; - - if (not defined $control) - { - return "The control socket is not configured so the daemon can not be queried for help."; - } - return &do_command($control, "HELP"); -} - -my $command = shift; -my $control = &get_controlname; -my $status = undef; -my $daemonStatus = undef; - -if (not defined $control) -{ - die "No control socket available.\n"; -} -if (not defined $command) -{ - die "Usage: $0 command\n"; -} -if ($command eq "status") -{ - $status = &do_command($control, "STATUS"); - if (not defined $status) - { - # Not responding on control channel, query via SMTP - if (&sendmail_running) - { - $daemonStatus = "Sendmail is running but not answering status queries."; - } - else - { - $daemonStatus = "Sendmail does not appear to be running."; - } - } - else - { - # Munge control channel output - ($daemonStatus, $status) = &munge_status($status); - } -} -elsif (lc($command) eq "shutdown") -{ - $status = &stop_daemon($control); -} -elsif (lc($command) eq "restart") -{ - $status = &restart_daemon($control); -} -elsif (lc($command) eq "start") -{ - $status = &start_daemon($control); -} -elsif (lc($command) eq "help") -{ - $status = &help($control); -} -else -{ - die "Unrecognized command $command\n"; -} -if (defined $daemonStatus) -{ - print "Daemon Status: $daemonStatus\n"; -} -if (defined $status) -{ - print "$status\n"; -} -else -{ - die "No response\n"; -} diff --git a/doc/changes/Makefile b/doc/changes/Makefile deleted file mode 100644 index 76eaa39..0000000 --- a/doc/changes/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -# @(#)Makefile 8.1 (Berkeley) 4/13/1994 - -DIR= smm/09.sendmail -SRCS= changes.me -MACROS= -me - -all: changes.ps - -changes.ps: ${SRCS} - rm -f ${.TARGET} - ${PIC} ${SRCS} | ${ROFF} > ${.TARGET} - -.include <bsd.doc.mk> diff --git a/doc/changes/changes.me b/doc/changes/changes.me deleted file mode 100644 index b963396..0000000 --- a/doc/changes/changes.me +++ /dev/null @@ -1,975 +0,0 @@ -.\" Copyright (c) 1998 Sendmail, Inc. All rights reserved. -.\" Copyright (c) 1994 Eric P. Allman. All rights reserved. -.\" Copyright (c) 1988, 1994 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" By using this file, you agree to the terms and conditions set -.\" forth in the LICENSE file which can be found at the top level of -.\" the sendmail distribution. -.\" -.\" -.\" @(#)changes.me 8.7 (Berkeley) 5/19/1998 -.\" -.\" ditroff -me -Pxx changes.me -.eh '%''Changes in Sendmail Version 8' -.oh 'Changes in Sendmail Version 8''%' -.nr si 3n -.if n .ls 2 -.+c -.(l C -.sz 14 -Changes in Sendmail Version 8* -.sz -.sp -Eric Allman -.sp 0.5 -.i -University of California, Berkeley -Mammoth Project -.)l -.(f -*An earlier version of this paper was printed in the -Proceedings of the 1994 AUUG Queensland Summer Technical Conference, -Gateway Hotel, Brisbane, March 1994. -.)f -.sp -.(l F -.ce -ABSTRACT -.sp \n(psu -Version 8 of -.i sendmail -includes a number of major changes from previous versions. -This paper gives a very short history of -.i sendmail , -a summary of the major differences between version 5 -(the last publically available version) -and version 8, -and some discussion of future directions. -.)l -.sp 2 -.pp -In 1987, the author stopped major work on -.i sendmail -due to other time committments, -only to return to active work in 1991. -This paper explores why work resumed -and what changes have been made. -.pp -Section 1 gives a short history of -.i sendmail -through version 5 and the motivation behind working on version 8. -Section 2 has -a rather detailed description of what has changed -between version 5 and version 8. -The paper finishes off with some thoughts -about what still needs to be done. -.sh 1 "HISTORY" -.pp -As discussed elsewhere, -[Allman83a, Allman83b, Allman&Amos85] -sendmail has existed in various forms since 1980. -It was released under the name -.i delivermail -in 4BSD and 4.1BSD, and as -.i sendmail -in 4.2BSD. -.\"4.0BSD delivermail 1.10 -.\"4.1BSD delivermail 1.10 -.\"4.2BSD sendmail 4.12 -.\"4.3BSD sendmail 5.52 -It quickly became the dominant mail system for networked UNIX systems. -.pp -Prior the release of 4.3BSD in November 1986, -the author had left the University for private industry, -but continued to do some work on -.i sendmail -with activity slowly trailing off -until effectively stopping after February 1987. -There was minimal support done by many people for several years, -until July of 1991 when the original author, -who had returned the University, -started active work on it again. -.pp -There were several reasons for renewed work on -.i sendmail . -There was a desire at Berkeley to convert to a subdomained structure -so that individuals were identified by their subdomain -rather than by their individual workstation; -although possible in the old code, there were some problems, -and the author was the obvious person to address them. -The Computer Systems Research Group (CSRG), -the group that produced the Berkeley Software Distributions, -was working on 4.4BSD, -and wanted an update to the mail system. -Bryan Costales was working on a book on -.i sendmail -that was being reviewed by the author, -which encouraged him to make some revisions. -And the author wanted to try to unify some of the disparate versions of -.i sendmail -that had been permitted to proliferate. -.pp -During the 1987\-91 fallow period, -many vendors and outside volunteers -had produced variants of -.i sendmail . -Perhaps the best known is the IDA version -[IDA87]. -Originally intended to be a new set of configuration files, -IDA expanded into a fairly large set of patches for the code. -Originally produced in Sweden, -IDA development passed to the University of Illinois, -and was widely used by the fairly large set of people -who prefer to get and compile their own source code -rather than use vendor-supplied binaries. -.pp -In about the same time frame, -attempts were made to clean up and extend the Simple Mail Transport Protocol -(SMTP) -[RFC821]. -This involved clarifications of some ambiguities in the protocol, -and correction of some problem areas -[RFC1123], -as well as extensions for additional functionality -(dubbed Extended Simple Mail Transport Protocol, or ESMTP) -[RFC1425, RFC1426, RFC1427] -and a richer set of semantics in the body of messages -(the Multipurpose Internet Mail Extensions, a.k.a. MIME) -[RFC1521, RFC1344]. -Neither the IDA group nor most vendors -were modifying -.i sendmail -to conform to these new standards. -It seemed clear that these were ``good things'' -that should be encouraged. -However, since no one was working on a publically available version of -.i sendmail -with these updates, -they were unlikely to be widely deployed any time in the near future. -.pp -There are, of course, other mail transport agents available, -such as -.i MMDF -.\"[ref], -.i zmailer -.\"[ref], -.i smail -.\"[ref], -and -.i PP -.\"[ref]. -However, none of these seemed to be gaining the prominence of -.i sendmail ; -it appeared that most companies would not convert to another -mail transport agent any time in the forseeable future. -However, they might be persuaded to convert to a newer version of -.i sendmail . -.pp -All of these convinced the author -to work on a updated version of -.i sendmail -for public distribution. -.pp -The new version of -.i sendmail -is referred to as version eight (V8). -Versions six and seven were skipped -because of an agreement -that all files in 4.4BSD would be numbered as -.q 8.1 . -Rather than have an external version number -that differed from the file version numbers, -.i sendmail -just jumped directly to V8. -.sh 1 "CHANGES IN VERSION EIGHT" -.pp -The following is a summary of the changes between the last commonly -available version of sendmail from Berkeley (5.67) and the latest -version (8.6.6). -.pp -Many of these are ideas that had been tried in IDA, -but many of them were generalized in V8. -.sh 2 "Performance Enhancements" -.pp -Instead of closing SMTP connections immediately, open connections are -cached for possible future use. There is a limit to the number of -simultaneous open connections and the idle time of any individual -connection. -.pp -This is of best help during queue processing (since there is the -potential of many different messages going to one site), although -it can also help when processing MX records which aren't handled -by MX Piggybacking. -.pp -If two hosts with different names in a single message happen to -have the same set of MX hosts, they can be sent in the same -transaction. Version 8 notices this and tries to batch the messages. -.pp -For example, if two sites ``foo.com'' and ``bar.com'' are both -served by UUNET, they will have the same set of MX hosts and will -be sent in one transaction. UUNET will then split the message -and send it to the two individual hosts. -.sh 2 "RFC 1123 Changes" -.pp -A number of changes have been made to make sendmail ``conditionally -compliant'' (that is, it satisfies all of the MUST clauses and most -but not all of the SHOULD clauses in RFC 1123). -.pp -The major areas of change are (numbers are RFC 1123 section numbers): -.nr ii 0.75i -.ip \(sc5.2.7 -Response to RCPT command is fast. Previously, sendmail -expanded all aliases as far as it could \*- this could -take a very long time, particularly if there were -name server delays. Version 8 only checks for the -existence of an alias and does the expansion later. -It does still do a DNS lookup if there is an explicit host name -in the RCPT command, -but this time is bounded. -.ip \(sc5.2.8 -Numeric IP addresses are logged in Received: lines. -This helps tracing spoofed messages. -.ip \(sc5.2.17 -Self domain literal is properly handled. Previously, -if someone sent to user@[1.2.3.4], where 1.2.3.4 is -your IP address, the mail would probably be rejected -with a ``configuration error''. -Version 8 can handle these addresses. -.ip \(sc5.3.2 -Better control over individual timeouts. RFC 821 specified -no timeouts. Older versions of sendmail had a single -timeout, typically set to two hours. Version 8 allows -the configuration file to set timeouts for various -SMTP commands individually. -.ip \(sc5.3.3 -Error messages are sent as From:<>. This was urged by -RFC 821 and reiterated by RFC 1123, but older versions -of sendmail never really did it properly. Version 8 -does. However, some systems cannot handle this -perfectly legal address; if necessary, you can create -a special mailer that uses the `g' flag to disable this. -.ip \(sc5.3.3 -Error messages are never sent to <>. Previously, -sendmail was happy to send responses-to-responses which -sometimes resulted in responses-to-responses-to-responses -which resulted in .... you get the idea. -.ip \(sc5.3.3 -Route-addrs (the ugly ``<@hosta,@hostb:user@hostc>'' -syntax) are pruned. RFC 821 urged the use of this -bletcherous syntax. RFC 1123 has seen the light and -officially deprecates them, further urging that you -eliminate all but ``user@hostc'' should you receive -one of these things. Version 8 is slightly more generous -than the standards suggest; instead of stripping off all -the route addressees, it only strips hosts off up to -the one before the last one known to DNS, thus allowing -you to have pseudo-hosts such as foo.BITNET. The `R' -option will turn this off. -.lp -The areas in which sendmail is not ``unconditionally compliant'' are: -.ip \(sc5.2.6 -Sendmail does do header munging. -.ip \(sc5.2.10 -Sendmail doesn't always use the exact SMTP message -text from RFC 821. This is a rather silly requirement. -.ip \(sc5.3.1.1 -Sendmail doesn't guarantee only one connect for each -host on queue runs. Connection caching gives you most -of this, but it does not provide a guarantee. -.ip \(sc5.3.1.1 -Sendmail doesn't always provide an adequate limit -on concurrency. That is, there can be several -independent sendmails running at once. My feeling -is that doing an absolute limit would be a mistake -(it might result in lost mail). However, if you use -the XLA contributed software, most of this will be -guaranteed (but I don't guarantee the guarantee). -.sh 2 "Extended SMTP Support -.pp -Version 8 includes both sending and receiving support for Extended -SMTP support as defined by RFC 1425 (basic) and RFC 1427 (SIZE); -and limited support for RFC 1426 (BODY). -The body support is minimal because the -.q 8BITMIME -body type is not currently advertised. -Although such a body type will be accepted, -it will not be correctly converted to 7 bits -if speaking to a non-8-bit-MIME aware SMTP server. -.pp -.i Sendmail -tries to speak ESMTP if you have the `a' flag set -in the flags for the mailer descriptor, -or if the other end advertises the fact that it speaks ESMTP. -This is a non-standard advertisement: -.i sendmail -announces -.q "ESMTP spoken here" -during the initial connection message, -and client sendmails search for this message. -This creates some problems for some PC-based mailers, -which do not understand two-line greeting messages -as required by RFC 821. -.sh 2 "Eight-Bit Clean -.pp -Previous versions of sendmail used the 0200 bit for quoting. This -version avoids that use. -However, you can set option `7' to get seven bit stripping -for compatibility with RFC 821, -which is a 7-bit protocol. -This option says ``strip to 7 bits on input''. -.pp -Individual mailers can still produce seven bit out put using the -`7' mailer flag. -This flag says ``strip to 7 bits on output''. -.sh 2 "User Database" -.pp -The User Database (UDB) is an as-yet experimental attempt to provide -unified large-site name support. -We are installing it at Berkeley; -future versions may show significant modifications. -Briefly, UDB contains a database that is intended to contain -all the per-user information for your workgroup, -such as people's full names, their .plan information, -their outgoing mail name, and their mail drop. -.pp -The user database allows you to map both incoming and outgoing -addresses, much like IDA. However, the interface is still -better with IDA; -in particular, the alias file with incoming/outgoing marks -provides better locality of information. -.sh 2 "Improved BIND Support" -.pp -The BIND support, particularly for MX records, had a number of -annoying ``features'' which have been removed in this release. In -particular, these more tightly bind (pun intended) the name server -to sendmail, so that the name server resolution rules are incorporated -directly into sendmail. -.pp -The major change has been that the $[ ... $] operator didn't fully -qualify names that were in DNS as A or MX records. Version 8 does -this qualification. -.pp -This has proven to be an annoyance in Sun shops, -who often still run without BIND support. -However, it is really critical that this be supported, -since MX records are mandatory. -In SunOS you can choose either MX support or NIS support, -but not both. -This is fixed in Solaris, -and some -.i sendmail -support to allow this in SunOS should be forthcoming in a future release. -.sh 2 "Keyed Files" -.pp -Generalized keyed files is an idea taken directly from IDA sendmail -(albeit with a completely different implementation). -They can be useful on large sites. -.pp -Version 8 includes the following built-in map classes: -.ip dbm -Support for the ndbm(3) library. -.ip hash -Support for the ``Hash'' type from the new Berkeley db(3) library. -this library provides substantially better database support -than ndbm(3), -including in-memory caching, -arbitrarily long keys and values, -and better disk utilization. -.ip btree -Support for the ``B-Tree'' type from the new Berkeley db(3) library. -B-Trees provide better clustering than Hashed files -if you are fetching lots of records that have similar keys, -such as searching a dictionary for words beginning with ``detr''. -.ip nis -Support for NIS (a.k.a. YP) maps. -NIS+ is not supported in this version. -.ip host -Support for DNS lookups. -.ip dequote -A ``pseudo-map'' (that is, once that does not have any external data) -that allows a configuration file to break apart a quoted string -in the address. -This is necessary primarily for DECnet addresses, -which often have quoted addresses that need to be unwrapped on gateways. -.sh 2 "Multi-Word Classes & Macros in Classes" -.pp -Classes can now be multiple words. For example, -.(b -CShofmann.CS.Berkeley.EDU -.)b -allows you to match the entire string ``hofmann.CS.Berkeley.EDU'' -using the single construct ``$=S''. -.pp -Class definitions are now allowed to include macros \*- for example: -.(b -Cw$k -.)b -is legal. -.sh 2 "IDENT Protocol Support" -.pp -The IDENT protocol as defined in RFC 1413 [RFC1413] is supported. -However, many systems have a TCP/IP bug that renders this useless, -and the feature must be turned off. -Roughly, if one of these system receives a -.q "No route to host" -message (ICMP message ICMP_UNREACH_HOST) on -.i any -connection, all connections to that host are closed. -Some firewalls return this error if you try to connect -to the IDENT port, -so you can't receive email from these hosts on these systems. -It's possible that if the firewall used a more specific message -(such as ICMP_UNREACH_PROTOCOL, ICMP_UNREACH_PORT or ICMP_UNREACH_NET_PROHIB) -it would work, but this hasn't been verified. -.pp -IDENT protocol support cannot be used on -4.3BSD, -Apollo DomainOS, -Apple A/UX, -ConvexOS, -Data General DG/UX, -HP-UX, -Sequent Dynix, -or -Ultrix 4.x, x \(<= 3. -It seems to work on -4.4BSD, -IBM AIX 3.x, -OSF/1, -SGI IRIX, -Solaris, -SunOS, -and Ultrix 4.4. -.sh 2 "Separate Envelope/Header Processing -.pp -Since the From: line is passed in separately from the envelope -sender, these have both been made visible; the $g macro is set to -the envelope sender during processing of mailer argument vectors -and the header sender during processing of headers. -.pp -It is also possible to specify separate per-mailer envelope and -header processing. The SenderRWSet and RecipientRWset arguments -for mailers can be specified as ``envelope/header'' to give different -rewritings for envelope versus header addresses. -.sh 2 "Owner-List Propagates to Envelope -.pp -When an alias has an associated owner-list name, that alias is used -to change the envelope sender address. This will cause downstream -errors to be returned to that owner. -.pp -Some people find this confusing -because the envelope sender is what appears in the first -``From_'' line in UNIX messages -(that is, the line beginning ``From<space>'' -instead of ``From:''; -the latter is the header from, which -.i does -indicate the sender of the message). -In previous versions, -.i sendmail -has tried to avoid changing the envelope sender -for back compatibility with UNIX convention; -at this point that back compatibility is creating too many problems, -and it is necessary to move forward into the 1980s. -.sh 2 "Command Line Flags" -.pp -The -.b \-B -flag has been added to pass in body type information. -.pp -The -.b \-p -flag has been added to pass in protocol information -that was previously passed in by defining the -.b $r -and -.b $s -macros. -.pp -The -.b \-X -flag has been added to allow logging of all protocol in and -out of sendmail for debugging. -You can set -.q "\-X filename" -and a complete transcript will be logged in that file. -This gets big fast: the option is only for debugging. -.pp -The -.b \-q -flag can limit limit a queue run to specific recipients, -senders, or queue ids using \-qRsubstring, \-qSsubstring, or -\-qIsubstring respectively. -.sh 2 "New Configuration Line Types -.pp -The `T' (Trusted users) configuration line has been deleted. It -will still be accepted but will be ignored. -.pp -The `K' line has been added to declare database maps. -.pp -The `V' line has been added to declare the configuration version -level. -.pp -The `M' (mailer) line takes a D= field to specify execution -directory. -.sh 2 "New and Extended Options" -.pp -Several new options have been added, many to support new features, -others to allow tuning that was previously available only by -recompiling. Briefly: -.nr ii 0.5i -.ip A -The alias file specification can now be a list of alias files. -Also, the configuration can specify a class of file. -For example, to search the NIS aliases, use -.q OAnis:mail.aliases . -.ip b -Insist on a minimum number of disk blocks. -.ip C -Delivery checkpoint interval. Checkpoint the queue (to avoid -duplicate deliveries) every C addresses. -.ip E -Default error message. This message (or the contents of the -indicated file) are prepended to error messages. -.ip G -Enable GECOS matching. If you can't find a local user name -and this option is enabled, do a sequential scan of the passwd -file to match against full names. Previously a compile option. -.ip h -Maximum hop count. Previously this was compiled in. -.ip I -This option has been extended to allow setting of resolver parameters. -.ip j -Send errors in MIME-encapsulated format. -.ip J -Forward file path. Where to search for .forward files \*- defaults -to $HOME/.forward. -.ip k -Connection cache size. The total number of connections that will -be kept open at any time. -.ip K -Connection cache lifetime. The amount of time any connection -will be permitted to sit idle. -.ip l -Enable Errors-To: header. These headers violate RFC 1123; -this option is included to provide back compatibility with -old versions of sendmail. -.ip O -Incoming daemon options (e.g., use alternate SMTP port). -.ip p -Privacy options. These can be used to make your SMTP server -less friendly. -.ip r -This option has been extended to allow finer grained control -over timeouts. -For example, you can set the timeout for SMTP commands individually. -.ip R -Don't prune route-addrs. Normally, if version 8 sees an address -like "<@hostA,@hostB:user@hostC>, sendmail will try to strip off -as much as it can (up to user@hostC) as suggested by RFC 1123. -This option disables that behaviour. -.ip T -The -.q "Return To Sender" -timeout has been extended -to allow specification of a warning message interval, -typically something on the order of four hours. -If a message cannot be delivered in that interval, -a warning message is sent back to the sender -but the message continues to be tried. -.ip U -User database spec. This is still experimental. -.ip V -Fallback ``MX'' host. This can be thought of as an MX host -that applies to all addresses that has a very high preference -value (that is, use it only if everything else fails). -.ip w -If set, assume that if you are the best MX host for a host, -you should send directly to that host. This is intended -for compatibility with UIUC sendmail, and may have some -use on firewalls. -.ip 7 -Do not run eight bit clean. Technically, you have to assert -this option to be RFC 821 compatible. -.sh 2 "New Mailer Definitions" -.ip L= -Set the allowable line length. In V5, the L mailer flag implied -a line length limit of 990 characters; this is now settable to -an arbitrary value. -.ip F=a -Try to use ESMTP. It will fall back to SMTP if the initial -EHLO packet is rejected. -.ip F=b -Ensure a blank line at the end of messages. Useful on the -*file* mailer. -.ip F=c -Strip all comments from addresses; this should only be used as -a last resort when dealing with cranky mailers. -.ip F=g -Never use the null sender as the envelope sender, even when -running SMTP. This violates RFC 1123. -.ip F=7 -Strip all output to this mailer to 7 bits. -.ip F=L -Used to set the line limit to 990 bytes for SMTP compatibility. -It now does that only if the L= keyletter is not specified. -This flag is obsolete and should not be used. -.sh 2 "New or Changed Pre-Defined Macros" -.ip $k -UUCP node name from uname(2). -.ip $m -Domain part of our full hostname. -.ip $_ -RFC 1413-provided sender address. -.ip $w -Previously was sometimes the full domain name, sometimes -just the first word. Now guaranteed to be the first word -of the domain name (i.e., the host name). -.ip $j -Previously had to be defined \*- it is now predefined to be -the full domain name, if that can be determined. That is, -it is equivalent to $w.$m. -.sh 2 "New and Changed Classes" -.ip $=k -Initialized to contain $k. -.ip $=w -Now includes -.q [1.2.3.4] -(where 1.2.3.4 is your IP address) -to allow the configuration file to recognize your own IP address. -.sh 2 "New Rewriting Tokens" -.pp -The -.b $& -construct has been adopted from IDA to defer macro evaluation. -Normally, macros in rulesets are bound when the rule is first parsed -during startup. -Some macros change during processing and are uninteresting during startup. -However, that macro can be referenced using -.q $&x -to defer the evaulation of -$x -until the rule is processed. -.pp -The tokens -.b $( -and -.b $) -have been added to allow specification of map rewriting. -.pp -Version 8 allows -.b $@ -on the Left Hand Side of an `R' line to match -zero tokens. -This is intended to be used to match the null input. -.sh 2 "Bigger Defaults -.pp -Version 8 allows up to 100 rulesets instead of 30. It is recommended -that rulesets 0\-9 be reserved for sendmail's dedicated use in future -releases. -.pp -The total number of MX records that can be used has been raised to -20. -.pp -The number of queued messages that can be handled at one time has -been raised from 600 to 1000. -.sh 2 "Different Default Tuning Parameters -.pp -Version 8 has changed the default parameters for tuning queue costs -to make the number of recipients more important than the size of -the message (for small messages). This is reasonable if you are -connected with reasonably fast links. -.sh 2 "Auto-Quoting in Addresses -.pp -Previously, the ``Full Name <email address>'' syntax would generate -incorrect protocol output if ``Full Name'' had special characters -such as dot. This version puts quotes around such names. -.sh 2 "Symbolic Names On Error Mailer -.pp -Several names have been built in to the $@ portion of the $#error -mailer. For example: -.(b -$#error $@NOHOST $: Host unknown -.)b -Prints the indicated message -and sets the exit status of -.i sendmail -to -.sm EX_NOHOST . -.sh 2 "New Built-In Mailers" -.pp -Two new mailers, *file* and *include*, are included to define options -when mailing to a file or a :include: file respectively. Previously -these were overloaded on the local mailer. -.sh 2 "SMTP VRFY Doesn't Expand -.pp -Previous versions of sendmail treated VRFY and EXPN the same. In -this version, VRFY doesn't expand aliases or follow .forward files. -.pp -As an optimization, if you run with your default delivery mode -being queue-only, the RCPT command will also not chase aliases and -\&.forward files. -It will chase them when it processes the queue. -This speeds up RCPT processing. -.sh 2 "[IPC] Mailers Allow Multiple Hosts -.pp -When an address resolves to a mailer that has ``[IPC]'' as its -``Path'', the $@ part (host name) can be a colon-separated list of -hosts instead of a single hostname. This asks sendmail to search -the list for the first entry that is available exactly as though -it were an MX record. The intent is to route internal traffic -through internal networks without publishing an MX record to the -net. MX expansion is still done on the individual items. -.sh 2 "Aliases Extended" -.pp -The implementation has been merged with maps. Among other things, -this supports multiple alias files and NIS-based aliases. For -example: -.(b -OA/etc/aliases,nis:mail.aliases -.)b -will search first the local database -.q /etc/aliases -followed by the NIS map - -.sh 2 "Portability and Security Enhancements -.pp -A number of internal changes have been made to enhance portability. -.pp -Several fixes have been made to increase the paranoia factor. -.pp -In particular, the permissions required for .forward and :include: -files have been tightened up considerably. V5 would pretty much -read any file it could get to as root, which exposed some security -holes. V8 insists that all directories leading up to the .forward -or :include: file be searchable ("x" permission) by the controlling -user" (defined below), that the file itself be readable by the -controlling user, and that .forward files be owned by the user -who is being forwarded to or root. -.pp -The "controlling user" is the user on whose behalf the mail is -being delivered. For example, if you mail to "user1" then the -controlling user for ~user1/.forward and any mailers invoked -by that .forward file, including :include: files. -.pp -Previously, anyone who had a home directory could create a .forward -could forward to a program. Now, sendmail checks to make sure -that they have an "approved shell", that is, a shell listed in -the /etc/shells file. -.sh 2 "Miscellaneous Fixes and Enhancements" -.pp -A number of small bugs having to do with things like backslash-escaped -quotes inside of comments have been fixed. -.pp -The fixed size limit on header lines -(such as -.q To: -and -.q Cc: ) -has been eliminated; -those buffers are dynamically allocated now. -.pp -Sendmail writes a /etc/sendmail.pid file with the current process id -and the current invocation flags. -.pp -Two people using the same program (e.g., submit) are considered -"different" so that duplicate elimination doesn't delete one of -them. For example, two people forwarding their email to -|submit will be treated as two recipients. -.pp -The mailstats program prints mailer names and gets the location of -the sendmail.st file from /etc/sendmail.cf. -.pp -Many minor bugs have been fixed, such as handling of backslashes -inside of quotes. -.pp -A hook has been added to allow rewriting of local addresses after -aliasing. -.sh 1 "FUTURE WORK" -.pp -The previous section describes -.i sendmail -as of version 8.6.6. -There is still much to be done. -Some high points are described below. -This list is by no means exhaustive. -.sh 2 "Full MIME Support" -.pp -Currently -.i sendmail -only supports seven bit MIME messages. -Although it can pass eight bit MIME messages, -it cannot advertise that fact because the standards say -that the mail agent must be able to do 8- to 7-bit conversion -to have full 8-bit support. -This requires far more extensive modification of the message body -than is currently supported. -.pp -The best way to do this would be to support the general concept -of an external -``message filter'' -that could do arbitrary modifications of the message. -This would allow MIME conversion as well as such things as -automatic encryption of messages sent over external links. -This is probably an extremely non-trivial change. -.sh 2 "Service Switch Abstraction" -.pp -Most modern systems include some concept of a -.q "service switch" -\*- for example, to look up host names you can try -DNS, NIS, NIS+, text tables, NetInfo, -or other services in some arbitrary order. -This is currently very clumsy in -.i sendmail , -with only limited control of the services provided. -.sh 2 "More Control of Local Addresses" -.pp -Currently some addresses are declared as -.q local -and are handled specially \*- -for example, they may have .forward files, -may be translated into program calls or file deliveries, -and so forth. -These should be broken out into separate flags -to allow the local system administrator -to have more fine-grained control over operations. -.sh 2 "More Run-Time Configuration Options" -.pp -There are many options that are configured at compile time, -such as the method of file locking -and the use of the IDENT protocol -[RFC1413]. -These should be transfered to run time -by adding new options. -.pp -Similarly, some options are currently overloaded, -that is, a single option controls more than one thing. -These should probably be broken out into separate options. -.pp -This implies that options will change from single characters -to words. -.sh 2 "More Configuration Control Over Errors" -.pp -Currently, -the configuration file can generate an error message during parsing. -However, -it cannot tweak other operations, -such as issuing a warning message to the system postmaster. -Similarly, -some errors should not be triggered if they are in aliases -during an alias file rebuild, -but should be triggered if that alias is actually used. -.sh 2 "Long Term Host State" -.pp -Currently, -.i sendmail -only remembers host status during a single queue run. -This should be converted to long term status -stored on disk -so it can be shared between instantiations of -.i sendmail . -Entries will have to be timestamped -so they can time out. -This will allow -.i sendmail -to implement exponential backoff on queue runs -on a per-host basis. -.sh 2 "Connection Control" -.pp -Modern networks have different types of connectivity -than the past. -In particular, the rising prominence of dialup IP -has created certain challenges for automated servers. -It is not uncommon to try to make a connection to a host -and have it fail, even though if you tried again it would succeed. -The connection management could be a bit cleverer -to try to adapt to such situations. -.sh 2 "Other Caching" -.pp -When you do an MX record lookup, -the name server automatically returns the IP addresses -of the associated MX servers. -This information is currently ignored, -and another query is done to get this information. -It should be cached to avoid excess name server traffic. -.sh 1 "REFERENCES" -.ip [Allman83a] -.q "Sendmail \*- An Internetwork Mail Router." -E. Allman. -In -.ul -Unix Programmers's Manual, -4.2 Berkeley Software Distribution, -volume 2C. -August 1983. -.ip [Allman83b] -.q "Mail Systems and Addressing in 4.2BSD." -E. Allman -In -.ul -UNICOM Conference Proceedings. -San Diego, California. -January 1983. -.ip [Allman&Amos85] -``Sendmail Revisited.'' -E. Allman and M. Amos. -In -.ul -Usenix Summer 1985 Conference Proceedings. -Portland, Oregon. -June 1985. -.ip [IDA87] -.ul 3 -Electronic Mail Addressing in Theory and Practice -with the IDA Sendmail Enhancement Kit -(or The Postmaster's Last Will and Testament). -Lennart Lo\*:vstrand. -Department of Computer and Information Science, -University of Linko\*:ping, -Sweden, -Report no. LiTH-IDA-Ex-8715. -May 1987. -.ip [RFC821] -.ul -Simple Mail Transport Protocol. -J. Postel. -August 1982. -.ip [RFC1123] -.ul -Requirements for Internet Hosts \*- Application and Support. -Internet Engineering Task Force, -R. Braden, Editor. -October 1989. -.ip [RFC1344] -.ul -Implications of MIME for Internet Mail Gateways. -N. Borenstein. -June 1992. -.ip [RFC1413] -.ul -Identification Protocol. -M. St. Johns. -February 1993. -.ip [RFC1425] -.ul -SMTP Service Extensions. -J. Klensin, N. Freed, M. Rose, E. Stefferud, and D. Crocker. -February 1993. -.ip [RFC1426] -.ul -SMTP Service Extension for 8bit-MIMEtransport. -J. Klensin, N. Freed, M. Rose, E. Stefferud, and D. Crocker. -February 1993. -.ip [RFC1427] -.ul -SMTP Service Extension for Message Size Declaration. -J. Klensin, N. Freed, and K. Moore. -February 1993. -.ip [RFC1521] -.ul 3 -MIME (Multipurpose Internet Mail Extensions) Part One: -Mechanisms for Specifying and Describing -the Format of Internet Message Bodies. -N. Borenstein and N. Freed. -September 1993. diff --git a/doc/changes/changes.ps b/doc/changes/changes.ps deleted file mode 100644 index 9f12530..0000000 --- a/doc/changes/changes.ps +++ /dev/null @@ -1,1129 +0,0 @@ -%!PS-Adobe-3.0 -%%Creator: groff version 1.10 -%%CreationDate: Tue Dec 29 09:59:23 1998 -%%DocumentNeededResources: font Times-Roman -%%+ font Times-Italic -%%+ font Times-Bold -%%+ font Symbol -%%DocumentSuppliedResources: procset grops 1.10 0 -%%Pages: 11 -%%PageOrder: Ascend -%%Orientation: Portrait -%%EndComments -%%BeginProlog -%%BeginResource: procset grops 1.10 0 -/setpacking where{ -pop -currentpacking -true setpacking -}if -/grops 120 dict dup begin -/SC 32 def -/A/show load def -/B{0 SC 3 -1 roll widthshow}bind def -/C{0 exch ashow}bind def -/D{0 exch 0 SC 5 2 roll awidthshow}bind def -/E{0 rmoveto show}bind def -/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def -/G{0 rmoveto 0 exch ashow}bind def -/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/I{0 exch rmoveto show}bind def -/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def -/K{0 exch rmoveto 0 exch ashow}bind def -/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/M{rmoveto show}bind def -/N{rmoveto 0 SC 3 -1 roll widthshow}bind def -/O{rmoveto 0 exch ashow}bind def -/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/Q{moveto show}bind def -/R{moveto 0 SC 3 -1 roll widthshow}bind def -/S{moveto 0 exch ashow}bind def -/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/SF{ -findfont exch -[exch dup 0 exch 0 exch neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/MF{ -findfont -[5 2 roll -0 3 1 roll -neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/level0 0 def -/RES 0 def -/PL 0 def -/LS 0 def -/MANUAL{ -statusdict begin/manualfeed true store end -}bind def -/PLG{ -gsave newpath clippath pathbbox grestore -exch pop add exch pop -}bind def -/BP{ -/level0 save def -1 setlinecap -1 setlinejoin -72 RES div dup scale -LS{ -90 rotate -}{ -0 PL translate -}ifelse -1 -1 scale -}bind def -/EP{ -level0 restore -showpage -}bind def -/DA{ -newpath arcn stroke -}bind def -/SN{ -transform -.25 sub exch .25 sub exch -round .25 add exch round .25 add exch -itransform -}bind def -/DL{ -SN -moveto -SN -lineto stroke -}bind def -/DC{ -newpath 0 360 arc closepath -}bind def -/TM matrix def -/DE{ -TM currentmatrix pop -translate scale newpath 0 0 .5 0 360 arc closepath -TM setmatrix -}bind def -/RC/rcurveto load def -/RL/rlineto load def -/ST/stroke load def -/MT/moveto load def -/CL/closepath load def -/FL{ -currentgray exch setgray fill setgray -}bind def -/BL/fill load def -/LW/setlinewidth load def -/RE{ -findfont -dup maxlength 1 index/FontName known not{1 add}if dict begin -{ -1 index/FID ne{def}{pop pop}ifelse -}forall -/Encoding exch def -dup/FontName exch def -currentdict end definefont pop -}bind def -/DEFS 0 def -/EBEGIN{ -moveto -DEFS begin -}bind def -/EEND/end load def -/CNT 0 def -/level1 0 def -/PBEGIN{ -/level1 save def -translate -div 3 1 roll div exch scale -neg exch neg exch translate -0 setgray -0 setlinecap -1 setlinewidth -0 setlinejoin -10 setmiterlimit -[]0 setdash -/setstrokeadjust where{ -pop -false setstrokeadjust -}if -/setoverprint where{ -pop -false setoverprint -}if -newpath -/CNT countdictstack def -userdict begin -/showpage{}def -}bind def -/PEND{ -clear -countdictstack CNT sub{end}repeat -level1 restore -}bind def -end def -/setpacking where{ -pop -setpacking -}if -%%EndResource -%%IncludeResource: font Times-Roman -%%IncludeResource: font Times-Italic -%%IncludeResource: font Times-Bold -%%IncludeResource: font Symbol -grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 -def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron -/scaron/zcaron/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent -/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen -/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon -/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O -/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex -/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y -/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft -/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl -/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut -/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash -/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen -/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft -/logicalnot/minus/registered/macron/degree/plusminus/twosuperior -/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior -/ordmasculine/guilsinglright/onequarter/onehalf/threequarters -/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE -/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex -/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis -/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn -/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla -/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis -/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash -/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def -/Times-Bold@0 ENC0/Times-Bold RE/Times-Italic@0 ENC0/Times-Italic RE -/Times-Roman@0 ENC0/Times-Roman RE -%%EndProlog -%%Page: 1 1 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 14/Times-Roman@0 SF(Changes in Sendmail V)196.615 141 Q(ersion 8*) --1.554 E/F1 10/Times-Roman@0 SF(Eric Allman)263.42 165 Q/F2 10 -/Times-Italic@0 SF(Univer)220.2 183 Q(sity of California, Berk)-.1 E -(ele)-.1 E(y)-.3 E(Mammoth Pr)251.98 195 Q(oject)-.45 E F1(ABSTRA) -262.085 227.4 Q(CT)-.4 E -1.11(Ve)112 243.6 S 1.709(rsion 8 of)1.11 F F2 -(sendmail)4.209 E F1 1.709(includes a number of major changes from pre) -4.209 F 1.71(vious v)-.25 F(ersions.)-.15 E .701(This paper gi)112 255.6 -R -.15(ve)-.25 G 3.201(sav).15 G .701(ery short history of)-3.351 F F2 -(sendmail)3.201 E F1 3.201(,as)C .7(ummary of the major dif)-3.201 F -(ferences)-.25 E .953(between v)112 267.6 R .954 -(ersion 5 \(the last publically a)-.15 F -.25(va)-.2 G .954(ilable v).25 -F .954(ersion\) and v)-.15 F .954(ersion 8, and some dis-)-.15 F -(cussion of future directions.)112 279.6 Q .48 -(In 1987, the author stopped major w)97 324 R .48(ork on)-.1 F F2 -(sendmail)2.98 E F1 .48(due to other time committments, only to return) -2.98 F(to acti)72 336 Q .3 -.15(ve w)-.25 H(ork in 1991.).05 E -(This paper e)5 E(xplores wh)-.15 E 2.5(yw)-.05 G -(ork resumed and what changes ha)-2.6 E .3 -.15(ve b)-.2 H(een made.).15 -E .58(Section 1 gi)97 352.2 R -.15(ve)-.25 G 3.08(sas).15 G .58 -(hort history of)-3.08 F F2(sendmail)3.08 E F1 .58(through v)3.08 F .58 -(ersion 5 and the moti)-.15 F -.25(va)-.25 G .58(tion behind w).25 F .58 -(orking on)-.1 F -.15(ve)72 364.2 S .126(rsion 8.).15 F .126(Section 2 has a rather detailed description of what has changed between v) -5.126 F .125(ersion 5 and v)-.15 F .125(ersion 8.)-.15 F -(The paper \214nishes of)72 376.2 Q 2.5(fw)-.25 G -(ith some thoughts about what still needs to be done.)-2.5 E/F3 10 -/Times-Bold@0 SF 2.5(1. HIST)72 400.2 R(OR)-.18 E(Y)-.35 E F1 .151 -(As discussed else)112 416.4 R .151 -(where, [Allman83a, Allman83b, Allman&Amos85] sendmail has e)-.25 F .151 -(xisted in v)-.15 F(ar)-.25 E(-)-.2 E .405(ious forms since 1980.)87 -428.4 R .405(It w)5.405 F .405(as released under the name)-.1 F F2 -(delivermail)2.905 E F1 .404(in 4BSD and 4.1BSD, and as)2.905 F F2 -(send-)2.904 E(mail)87 440.4 Q F1(in 4.2BSD.)2.5 E -(It quickly became the dominant mail system for netw)5 E(ork)-.1 E -(ed UNIX systems.)-.1 E 1.569(Prior the release of 4.3BSD in No)112 -456.6 R -.15(ve)-.15 G 1.569(mber 1986, the author had left the Uni).15 -F -.15(ve)-.25 G 1.57(rsity for pri).15 F -.25(va)-.25 G(te).25 E -(industry)87 468.6 Q 3.347(,b)-.65 G .847(ut continued to do some w) --3.547 F .847(ork on)-.1 F F2(sendmail)3.347 E F1 .847(with acti)3.347 F -.846(vity slo)-.25 F .846(wly trailing of)-.25 F 3.346(fu)-.25 G .846 -(ntil ef)-3.346 F(fecti)-.25 E -.15(ve)-.25 G(ly).15 E .255 -(stopping after February 1987.)87 480.6 R .255(There w)5.255 F .255 -(as minimal support done by man)-.1 F 2.756(yp)-.15 G .256(eople for se) --2.756 F -.15(ve)-.25 G .256(ral years, until).15 F -(July of 1991 when the original author)87 492.6 Q 2.5(,w)-.4 G -(ho had returned the Uni)-2.5 E -.15(ve)-.25 G(rsity).15 E 2.5(,s)-.65 G -(tarted acti)-2.5 E .3 -.15(ve w)-.25 H(ork on it ag).05 E(ain.)-.05 E -1.271(There were se)112 508.8 R -.15(ve)-.25 G 1.271 -(ral reasons for rene).15 F 1.271(wed w)-.25 F 1.271(ork on)-.1 F F2 -(sendmail)3.771 E F1 6.271(.T)C 1.271(here w)-6.271 F 1.27 -(as a desire at Berk)-.1 F(ele)-.1 E 3.77(yt)-.15 G(o)-3.77 E(con)87 -520.8 Q -.15(ve)-.4 G .097(rt to a subdomained structure so that indi) -.15 F .098(viduals were identi\214ed by their subdomain rather than by) --.25 F 1.758(their indi)87 532.8 R 1.758(vidual w)-.25 F 1.758(orkstation; although possible in the old code, there were some problems, and the) --.1 F .66(author w)87 544.8 R .66(as the ob)-.1 F .66 -(vious person to address them.)-.15 F .66 -(The Computer Systems Research Group \(CSRG\), the)5.66 F 1.89 -(group that produced the Berk)87 556.8 R(ele)-.1 E 4.39(yS)-.15 G(oftw) --4.39 E 1.89(are Distrib)-.1 F 1.89(utions, w)-.2 F 1.89(as w)-.1 F 1.89 -(orking on 4.4BSD, and w)-.1 F 1.89(anted an)-.1 F .053 -(update to the mail system.)87 568.8 R .053(Bryan Costales w)5.053 F -.053(as w)-.1 F .053(orking on a book on)-.1 F F2(sendmail)2.553 E F1 -.053(that w)2.553 F .053(as being re)-.1 F(vie)-.25 E(wed)-.25 E .923 -(by the author)87 580.8 R 3.423(,w)-.4 G .923 -(hich encouraged him to mak)-3.423 F 3.422(es)-.1 G .922(ome re)-3.422 F -3.422(visions. And)-.25 F .922(the author w)3.422 F .922 -(anted to try to unify)-.1 F(some of the disparate v)87 592.8 Q -(ersions of)-.15 E F2(sendmail)2.5 E F1 -(that had been permitted to proliferate.)2.5 E .023 -(During the 1987\25591 f)112 609 R(allo)-.1 E 2.523(wp)-.25 G .023 -(eriod, man)-2.523 F 2.523(yv)-.15 G .023(endors and outside v)-2.673 F -.023(olunteers had produced v)-.2 F .024(ariants of)-.25 F F2(sendmail) -87 621 Q F1 5.518(.P)C .517(erhaps the best kno)-5.518 F .517 -(wn is the ID)-.25 F 3.017(Av)-.4 G .517(ersion [ID)-3.167 F 3.017 -(A87]. Originally)-.4 F .517(intended to be a ne)3.017 F 3.017(ws)-.25 G -.517(et of)-3.017 F .268(con\214guration \214les, ID)87 633 R 2.768(Ae) --.4 G .269(xpanded into a f)-2.918 F .269(airly lar)-.1 F .269 -(ge set of patches for the code.)-.18 F .269(Originally produced in) -5.269 F .471(Sweden, ID)87 645 R 2.971(Ad)-.4 G -2.15 -.25(ev e)-2.971 H -.471(lopment passed to the Uni).25 F -.15(ve)-.25 G .471 -(rsity of Illinois, and w).15 F .47(as widely used by the f)-.1 F .47 -(airly lar)-.1 F(ge)-.18 E .077 -(set of people who prefer to get and compile their o)87 657 R .077 -(wn source code rather than use v)-.25 F(endor)-.15 E .078 -(-supplied bina-)-.2 F(ries.)87 669 Q .32 LW 76 678.6 72 678.6 DL 80 -678.6 76 678.6 DL 84 678.6 80 678.6 DL 88 678.6 84 678.6 DL 92 678.6 88 -678.6 DL 96 678.6 92 678.6 DL 100 678.6 96 678.6 DL 104 678.6 100 678.6 -DL 108 678.6 104 678.6 DL 112 678.6 108 678.6 DL 116 678.6 112 678.6 DL -120 678.6 116 678.6 DL 124 678.6 120 678.6 DL 128 678.6 124 678.6 DL 132 -678.6 128 678.6 DL 136 678.6 132 678.6 DL 140 678.6 136 678.6 DL 144 -678.6 140 678.6 DL 148 678.6 144 678.6 DL 152 678.6 148 678.6 DL 156 -678.6 152 678.6 DL 160 678.6 156 678.6 DL 164 678.6 160 678.6 DL 168 -678.6 164 678.6 DL 172 678.6 168 678.6 DL 176 678.6 172 678.6 DL 180 -678.6 176 678.6 DL 184 678.6 180 678.6 DL 188 678.6 184 678.6 DL 192 -678.6 188 678.6 DL 196 678.6 192 678.6 DL 200 678.6 196 678.6 DL 204 -678.6 200 678.6 DL 208 678.6 204 678.6 DL 212 678.6 208 678.6 DL 216 -678.6 212 678.6 DL/F4 8/Times-Roman@0 SF .045(*An earlier v)93.6 690.6 R -.045(ersion of this paper w)-.12 F .044 -(as printed in the Proceedings of the 1994 A)-.08 F .044 -(UUG Queensland Summer T)-.44 F .044(echnical Conference,)-.56 F(Gate)72 -700.2 Q -.08(wa)-.2 G 2(yH).08 G(otel, Brisbane, March 1994.)-2 E F3 -(Changes in Sendmail V)72 756 Q(ersion 8)-1 E(1)294.65 E EP -%%Page: 2 2 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 294.65(2C)72 60 S(hanges in Sendmail V)-294.65 E -(ersion 8)-1 E/F1 10/Times-Roman@0 SF .151 -(In about the same time frame, attempts were made to clean up and e)112 -96 R .151(xtend the Simple Mail T)-.15 F(rans-)-.35 E .468 -(port Protocol \(SMTP\) [RFC821].)87 108 R .468(This in)5.468 F -.2(vo) --.4 G(lv).2 E .469 -(ed clari\214cations of some ambiguities in the protocol, and)-.15 F -.085(correction of some problem areas [RFC1123], as well as e)87 120 R -.084(xtensions for additional functionality \(dubbed)-.15 F 1.052 -(Extended Simple Mail T)87 132 R 1.053 -(ransport Protocol, or ESMTP\) [RFC1425, RFC1426, RFC1427] and a richer) --.35 F 1.376(set of semantics in the body of messages \(the Multipurpose Internet Mail Extensions, a.k.a. MIME\)) -87 144 R .497([RFC1521, RFC1344].)87 156 R .497(Neither the ID)5.497 F -2.998(Ag)-.4 G .498(roup nor most v)-2.998 F .498(endors were modifying) --.15 F/F2 10/Times-Italic@0 SF(sendmail)2.998 E F1 .498(to conform)2.998 -F 1.7(to these ne)87 168 R 4.2(ws)-.25 G 4.2(tandards. It)-4.2 F 1.699 -(seemed clear that these were `)4.2 F 1.699(`good things')-.74 F 4.199 -('t)-.74 G 1.699(hat should be encouraged.)-4.199 F(Ho)87 180 Q(we)-.25 -E -.15(ve)-.25 G 1.635 -.4(r, s).15 H .835(ince no one w).4 F .835(as w) --.1 F .835(orking on a publically a)-.1 F -.25(va)-.2 G .835(ilable v) -.25 F .836(ersion of)-.15 F F2(sendmail)3.336 E F1 .836 -(with these updates,)3.336 F(the)87 192 Q 2.5(yw)-.15 G(ere unlik)-2.5 E -(ely to be widely deplo)-.1 E(yed an)-.1 E 2.5(yt)-.15 G -(ime in the near future.)-2.5 E .466 -(There are, of course, other mail transport agents a)112 208.2 R -.25 -(va)-.2 G .465(ilable, such as).25 F F2 .465(MMDF zmailer smail)2.965 F -F1(and)2.965 E F2(PP)2.965 E F1(Ho)87 220.2 Q(we)-.25 E -.15(ve)-.25 G -.842 -.4(r, n).15 H .042(one of these seemed to be g).4 F .043 -(aining the prominence of)-.05 F F2(sendmail)2.543 E F1 2.543(;i)C 2.543 -(ta)-2.543 G .043(ppeared that most compa-)-2.543 F .238(nies w)87 232.2 -R .238(ould not con)-.1 F -.15(ve)-.4 G .238 -(rt to another mail transport agent an).15 F 2.737(yt)-.15 G .237 -(ime in the forseeable future.)-2.737 F(Ho)5.237 E(we)-.25 E -.15(ve) --.25 G 1.037 -.4(r, t).15 H(he).4 E(y)-.15 E(might be persuaded to con) -87 244.2 Q -.15(ve)-.4 G(rt to a ne).15 E(wer v)-.25 E(ersion of)-.15 E -F2(sendmail)2.5 E F1(.)A .841(All of these con)112 260.4 R .841 -(vinced the author to w)-.4 F .841(ork on a updated v)-.1 F .841 -(ersion of)-.15 F F2(sendmail)3.342 E F1 .842(for public distrib)3.342 F -(u-)-.2 E(tion.)87 272.4 Q 1.024(The ne)112 288.6 R 3.524(wv)-.25 G -1.023(ersion of)-3.674 F F2(sendmail)3.523 E F1 1.023 -(is referred to as v)3.523 F 1.023(ersion eight \(V8\).)-.15 F -1.11(Ve) -6.023 G 1.023(rsions six and se)1.11 F -.15(ve)-.25 G 3.523(nw).15 G -(ere)-3.523 E 1.281 -(skipped because of an agreement that all \214les in 4.4BSD w)87 300.6 R -1.281(ould be numbered as \2318.1\232.)-.1 F 1.282(Rather than)6.282 F -(ha)87 312.6 Q 2.05 -.15(ve a)-.2 H 4.25(ne).15 G 1.75(xternal v)-4.4 F -1.75(ersion number that dif)-.15 F 1.75(fered from the \214le v)-.25 F -1.75(ersion numbers,)-.15 F F2(sendmail)4.25 E F1 1.75(just jumped)4.25 -F(directly to V8.)87 324.6 Q F0 2.5(2. CHANGES)72 348.6 R -(IN VERSION EIGHT)2.5 E F1 .138(The follo)112 364.8 R .139 -(wing is a summary of the changes between the last commonly a)-.25 F --.25(va)-.2 G .139(ilable v).25 F .139(ersion of send-)-.15 F -(mail from Berk)87 376.8 Q(ele)-.1 E 2.5(y\()-.15 G -(5.67\) and the latest v)-2.5 E(ersion \(8.6.6\).)-.15 E(Man)112 393 Q -2.5(yo)-.15 G 2.5(ft)-2.5 G(hese are ideas that had been tried in ID) --2.5 E(A, b)-.4 E(ut man)-.2 E 2.5(yo)-.15 G 2.5(ft)-2.5 G -(hem were generalized in V8.)-2.5 E F0 2.5(2.1. P)87 417 R(erf)-.2 E -(ormance Enhancements)-.25 E F1 .549 -(Instead of closing SMTP connections immediately)127 433.2 R 3.049(,o) --.65 G .549(pen connections are cached for possible)-3.049 F .029 -(future use.)102 445.2 R .029(There is a limit to the number of simultaneous open connections and the idle time of an) -5.029 F(y)-.15 E(indi)102 457.2 Q(vidual connection.)-.25 E 1.219(This is of best help during queue processing \(since there is the potential of man) -127 473.4 R 3.719(yd)-.15 G(if)-3.719 E(ferent)-.25 E 1.113(messages going to one site\), although it can also help when processing MX records which aren') -102 485.4 R(t)-.18 E(handled by MX Piggybacking.)102 497.4 Q 1.258 -(If tw)127 513.6 R 3.757(oh)-.1 G 1.257(osts with dif)-3.757 F 1.257 -(ferent names in a single message happen to ha)-.25 F 1.557 -.15(ve t) --.2 H 1.257(he same set of MX).15 F .94(hosts, the)102 525.6 R 3.44(yc) --.15 G .94(an be sent in the same transaction.)-3.44 F -1.11(Ve)5.94 G -.94(rsion 8 notices this and tries to batch the mes-)1.11 F(sages.)102 -537.6 Q -.15(Fo)127 553.8 S 3.638(re).15 G 1.138(xample, if tw)-3.788 F -3.637(os)-.1 G 1.137(ites `)-3.637 F(`foo.com')-.74 E 3.637('a)-.74 G -1.137(nd `)-3.637 F(`bar)-.74 E(.com')-.55 E 3.637('a)-.74 G 1.137 -(re both serv)-3.637 F 1.137(ed by UUNET)-.15 F 3.637(,t)-.74 G(he) --3.637 E 3.637(yw)-.15 G(ill)-3.637 E(ha)102 565.8 Q .557 -.15(ve t)-.2 -H .257(he same set of MX hosts and will be sent in one transaction.).15 -F .258(UUNET will then split the mes-)5.258 F -(sage and send it to the tw)102 577.8 Q 2.5(oi)-.1 G(ndi)-2.5 E -(vidual hosts.)-.25 E F0 2.5(2.2. RFC)87 601.8 R(1123 Changes)2.5 E F1 -2.607(An)127 618 S .107(umber of changes ha)-2.607 F .407 -.15(ve b)-.2 -H .106(een made to mak).15 F 2.606(es)-.1 G .106(endmail `)-2.606 F .106 -(`conditionally compliant')-.74 F 2.606('\()-.74 G .106(that is, it) --2.606 F(satis\214es all of the MUST clauses and most b)102 630 Q -(ut not all of the SHOULD clauses in RFC 1123\).)-.2 E(The major areas of change are \(numbers are RFC 1123 section numbers\):) -127 646.2 Q 26.5(\2475.2.7 Response)102 662.4 R .565 -(to RCPT command is f)3.065 F 3.065(ast. Pre)-.1 F(viously)-.25 E 3.065 -(,s)-.65 G .565(endmail e)-3.065 F .565(xpanded all aliases as f)-.15 F -(ar)-.1 E .686(as it could \212 this could tak)156 674.4 R 3.186(eav)-.1 -G .685(ery long time, particularly if there were name serv)-3.336 F(er) --.15 E 3.891(delays. V)156 686.4 R 1.391(ersion 8 only checks for the e) --1.11 F 1.392(xistence of an alias and does the e)-.15 F(xpansion)-.15 E -(later)156 698.4 Q 5.176(.I)-.55 G 2.676(td)-5.176 G .176 -(oes still do a DNS lookup if there is an e)-2.676 F .175 -(xplicit host name in the RCPT com-)-.15 F(mand, b)156 710.4 Q -(ut this time is bounded.)-.2 E EP -%%Page: 3 3 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Changes in Sendmail V)72 60 Q(ersion 8)-1 E(3) -294.65 E/F1 10/Times-Roman@0 SF 26.5(\2475.2.8 Numeric)102 96 R .612 -(IP addresses are logged in Recei)3.112 F -.15(ve)-.25 G .613(d: lines.) -.15 F .613(This helps tracing spoofed mes-)5.613 F(sages.)156 108 Q 21.5 -(\2475.2.17 Self)102 124.2 R .127(domain literal is properly handled.) -2.627 F(Pre)5.126 E(viously)-.25 E 2.626(,i)-.65 G 2.626(fs)-2.626 G -.126(omeone sent to user@[1.2.3.4],)-2.626 F .12 -(where 1.2.3.4 is your IP address, the mail w)156 136.2 R .12 -(ould probably be rejected with a `)-.1 F(`con\214gu-)-.74 E -(ration error')156 148.2 Q 2.5('. V)-.74 F -(ersion 8 can handle these addresses.)-1.11 E 26.5(\2475.3.2 Better)102 -164.4 R 1.189(control o)3.69 F -.15(ve)-.15 G 3.689(ri).15 G(ndi)-3.689 -E 1.189(vidual timeouts.)-.25 F 1.189(RFC 821 speci\214ed no timeouts.) -6.189 F 1.189(Older v)6.189 F(er)-.15 E(-)-.2 E .002 -(sions of sendmail had a single timeout, typically set to tw)156 176.4 R -2.502(oh)-.1 G 2.502(ours. V)-2.502 F .002(ersion 8 allo)-1.11 F .002 -(ws the)-.25 F(con\214guration \214le to set timeouts for v)156 188.4 Q -(arious SMTP commands indi)-.25 E(vidually)-.25 E(.)-.65 E 26.5 -(\2475.3.3 Error)102 204.6 R 1.06(messages are sent as From:<>.)3.56 F -1.059(This w)6.059 F 1.059(as ur)-.1 F 1.059 -(ged by RFC 821 and reiterated by)-.18 F .237(RFC 1123, b)156 216.6 R -.237(ut older v)-.2 F .237(ersions of sendmail ne)-.15 F -.15(ve)-.25 G -2.737(rr).15 G .237(eally did it properly)-2.737 F 5.237(.V)-.65 G .238 -(ersion 8 does.)-6.347 F(Ho)156 228.6 Q(we)-.25 E -.15(ve)-.25 G 1.934 --.4(r, s).15 H 1.134(ome systems cannot handle this perfectly le).4 F --.05(ga)-.15 G 3.633(la).05 G 1.133(ddress; if necessary)-3.633 F 3.633 -(,y)-.65 G(ou)-3.633 E -(can create a special mailer that uses the `g' \215ag to disable this.) -156 240.6 Q 26.5(\2475.3.3 Error)102 256.8 R 3.212(messages are ne)5.712 -F -.15(ve)-.25 G 5.712(rs).15 G 3.212(ent to <>.)-5.712 F(Pre)8.213 E -(viously)-.25 E 5.713(,s)-.65 G 3.213(endmail w)-5.713 F 3.213(as happ) --.1 F 5.713(yt)-.1 G 5.713(os)-5.713 G(end)-5.713 E 6(responses-to-responses which sometimes resulted in responses-to-responses-to-) -156 268.8 R(responses which resulted in ....)156 280.8 Q -(you get the idea.)5 E 26.5(\2475.3.3 Route-addrs)102 297 R .111 -(\(the ugly `)2.611 F(`<@hosta,@hostb:user@hostc>')-.74 E 2.611('s)-.74 -G .111(yntax\) are pruned.)-2.611 F .112(RFC 821)5.112 F(ur)156 309 Q -1.001(ged the use of this bletcherous syntax.)-.18 F 1 -(RFC 1123 has seen the light and of)6.001 F(\214cially)-.25 E 1.124 -(deprecates them, further ur)156 321 R 1.125 -(ging that you eliminate all b)-.18 F 1.125(ut `)-.2 F(`user@hostc')-.74 -E 3.625('s)-.74 G 1.125(hould you)-3.625 F(recei)156 333 Q 1.698 -.15 -(ve o)-.25 H 1.398(ne of these things.).15 F -1.11(Ve)6.398 G 1.398 -(rsion 8 is slightly more generous than the standards)1.11 F .753 -(suggest; instead of stripping of)156 345 R 3.253(fa)-.25 G .753 -(ll the route addressees, it only strips hosts of)-3.253 F 3.254(fu)-.25 -G 3.254(pt)-3.254 G(o)-3.254 E 1.29(the one before the last one kno)156 -357 R 1.289(wn to DNS, thus allo)-.25 F 1.289(wing you to ha)-.25 F -1.589 -.15(ve p)-.2 H(seudo-hosts).15 E(such as foo.BITNET)156 369 Q 5 -(.T)-.74 G(he `R' option will turn this of)-5 E(f.)-.25 E -(The areas in which sendmail is not `)102 385.2 Q -(`unconditionally compliant')-.74 E 2.5('a)-.74 G(re:)-2.5 E 26.5 -(\2475.2.6 Sendmail)102 401.4 R(does do header munging.)2.5 E 21.5 -(\2475.2.10 Sendmail)102 417.6 R(doesn')3.2 E 3.2(ta)-.18 G -.1(lwa)-3.2 -G .7(ys use the e).1 F .701(xact SMTP message te)-.15 F .701 -(xt from RFC 821.)-.15 F .701(This is a)5.701 F -(rather silly requirement.)156 429.6 Q 19(\2475.3.1.1 Sendmail)102 445.8 -R(doesn')3.512 E 3.512(tg)-.18 G 1.012 -(uarantee only one connect for each host on queue runs.)-3.512 F -(Connec-)6.011 E(tion caching gi)156 457.8 Q -.15(ve)-.25 G 2.5(sy).15 G -(ou most of this, b)-2.5 E(ut it does not pro)-.2 E(vide a guarantee.) --.15 E 19(\2475.3.1.1 Sendmail)102 474 R(doesn')2.843 E 2.843(ta)-.18 G --.1(lwa)-2.843 G .343(ys pro).1 F .343 -(vide an adequate limit on concurrenc)-.15 F 4.144 -.65(y. T)-.15 H .344 -(hat is, there can).65 F .757(be se)156 486 R -.15(ve)-.25 G .757 -(ral independent sendmails running at once.).15 F .757 -(My feeling is that doing an abso-)5.757 F 1.047(lute limit w)156 498 R -1.047(ould be a mistak)-.1 F 3.547(e\()-.1 G 1.048 -(it might result in lost mail\).)-3.547 F(Ho)6.048 E(we)-.25 E -.15(ve) --.25 G 1.848 -.4(r, i).15 H 3.548(fy).4 G 1.048(ou use the)-3.548 F .801 -(XLA contrib)156 510 R .801(uted softw)-.2 F .801 -(are, most of this will be guaranteed \(b)-.1 F .801(ut I don')-.2 F 3.3 -(tg)-.18 G .8(uarantee the)-3.3 F(guarantee\).)156 522 Q F0 2.5 -(2.3. Extended)87 546 R(SMTP Support)2.5 E F1 -1.11(Ve)127 562.2 S .154 -(rsion 8 includes both sending and recei)1.11 F .155 -(ving support for Extended SMTP support as de\214ned)-.25 F .229(by RFC 1425 \(basic\) and RFC 1427 \(SIZE\); and limited support for RFC 1426 \(BOD) -102 574.2 R 2.729(Y\). The)-.55 F(body)2.729 E .275(support is minimal because the \2318BITMIME\232 body type is not currently adv) -102 586.2 R 2.776(ertised. Although)-.15 F(such)2.776 E 3.076(ab)102 -598.2 S .576(ody type will be accepted, it will not be correctly con) --3.076 F -.15(ve)-.4 G .576(rted to 7 bits if speaking to a non-8-bit-) -.15 F(MIME a)102 610.2 Q -.1(wa)-.15 G(re SMTP serv).1 E(er)-.15 E(.) --.55 E/F2 10/Times-Italic@0 SF(Sendmail)127 626.4 Q F1 .287 -(tries to speak ESMTP if you ha)2.787 F .588 -.15(ve t)-.2 H .288 -(he `a' \215ag set in the \215ags for the mailer descrip-).15 F(tor)102 -638.4 Q 3.322(,o)-.4 G 3.322(ri)-3.322 G 3.322(ft)-3.322 G .822 -(he other end adv)-3.322 F .822(ertises the f)-.15 F .822 -(act that it speaks ESMTP)-.1 F 5.822(.T)-1.11 G .821 -(his is a non-standard adv)-5.822 F(ertise-)-.15 E(ment:)102 650.4 Q F2 -(sendmail)2.98 E F1 .48(announces \231ESMTP spok)2.98 F .48 -(en here\232 during the initial connection message, and client)-.1 F -.587(sendmails search for this message.)102 662.4 R .586 -(This creates some problems for some PC-based mailers, which)5.586 F -(do not understand tw)102 674.4 Q -(o-line greeting messages as required by RFC 821.)-.1 E EP -%%Page: 4 4 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 294.65(4C)72 60 S(hanges in Sendmail V)-294.65 E -(ersion 8)-1 E 2.5(2.4. Eight-Bit)87 96 R(Clean)2.5 E/F1 10 -/Times-Roman@0 SF(Pre)127 112.2 Q 1.263(vious v)-.25 F 1.263 -(ersions of sendmail used the 0200 bit for quoting.)-.15 F 1.264(This v) -6.264 F 1.264(ersion a)-.15 F -.2(vo)-.2 G 1.264(ids that use.).2 F(Ho) -102 124.2 Q(we)-.25 E -.15(ve)-.25 G 1.119 -.4(r, y).15 H .318 -(ou can set option `7' to get se).4 F -.15(ve)-.25 G 2.818(nb).15 G .318 -(it stripping for compatibility with RFC 821, which is)-2.818 F 2.5(a7) -102 136.2 S(-bit protocol.)-2.5 E(This option says `)5 E -(`strip to 7 bits on input')-.74 E('.)-.74 E(Indi)127 152.4 Q .375 -(vidual mailers can still produce se)-.25 F -.15(ve)-.25 G 2.875(nb).15 -G .376(it out put using the `7' mailer \215ag.)-2.875 F .376 -(This \215ag says)5.376 F -.74(``)102 164.4 S -(strip to 7 bits on output').74 E('.)-.74 E F0 2.5(2.5. User)87 188.4 R -(Database)2.5 E F1 1.926(The User Database \(UDB\) is an as-yet e)127 -204.6 R 1.926(xperimental attempt to pro)-.15 F 1.925 -(vide uni\214ed lar)-.15 F(ge-site)-.18 E .396(name support.)102 216.6 R -1.996 -.8(We a)5.396 H .396(re installing it at Berk).8 F(ele)-.1 E .396 -(y; future v)-.15 F .396(ersions may sho)-.15 F 2.897(ws)-.25 G .397 -(igni\214cant modi\214cations.)-2.897 F(Brie\215y)102 228.6 Q 3.583(,U) --.65 G 1.083 -(DB contains a database that is intended to contain all the per)-3.583 F -1.082(-user information for your)-.2 F -.1(wo)102 240.6 S .172 -(rkgroup, such as people').1 F 2.673(sf)-.55 G .173(ull names, their .plan information, their outgoing mail name, and their) --2.673 F(mail drop.)102 252.6 Q .438(The user database allo)127 268.8 R -.438(ws you to map both incoming and outgoing addresses, much lik)-.25 F -2.937(eI)-.1 G -.4(DA)-2.937 G(.).4 E(Ho)102 280.8 Q(we)-.25 E -.15(ve) --.25 G 1.799 -.4(r, t).15 H .999(he interf).4 F .999 -(ace is still better with ID)-.1 F .999(A; in particular)-.4 F 3.499(,t) --.4 G 1(he alias \214le with incoming/outgoing)-3.499 F(marks pro)102 -292.8 Q(vides better locality of information.)-.15 E F0 2.5(2.6. Impr)87 -316.8 R -.1(ove)-.18 G 2.5(dB).1 G(IND Support)-2.5 E F1 .262 -(The BIND support, particularly for MX records, had a number of anno)127 -333 R .261(ying `)-.1 F(`features')-.74 E 2.761('w)-.74 G(hich)-2.761 E -(ha)102 345 Q 1.212 -.15(ve b)-.2 H .912(een remo).15 F -.15(ve)-.15 G -3.412(di).15 G 3.412(nt)-3.412 G .912(his release.)-3.412 F .912 -(In particular)5.912 F 3.412(,t)-.4 G .912 -(hese more tightly bind \(pun intended\) the name)-3.412 F(serv)102 357 -Q(er to sendmail, so that the name serv)-.15 E -(er resolution rules are incorporated directly into sendmail.)-.15 E -.688(The major change has been that the $[ ... $] operator didn')127 -373.2 R 3.188(tf)-.18 G .688(ully qualify names that were in)-3.188 F -(DNS as A or MX records.)102 385.2 Q -1.11(Ve)5 G -(rsion 8 does this quali\214cation.)1.11 E .429(This has pro)127 401.4 R --.15(ve)-.15 G 2.929(nt).15 G 2.929(ob)-2.929 G 2.929(ea)-2.929 G 2.929 -(na)-2.929 G(nno)-2.929 E .43 -(yance in Sun shops, who often still run without BIND support.)-.1 F(Ho) -102 413.4 Q(we)-.25 E -.15(ve)-.25 G 1.001 -.4(r, i).15 H 2.701(ti).4 G -2.701(sr)-2.701 G .201 -(eally critical that this be supported, since MX records are mandatory) --2.701 F 5.2(.I)-.65 G 2.7(nS)-5.2 G .2(unOS you)-2.7 F .101 -(can choose either MX support or NIS support, b)102 425.4 R .101 -(ut not both.)-.2 F .101(This is \214x)5.101 F .101 -(ed in Solaris, and some)-.15 F/F2 10/Times-Italic@0 SF(send-)2.602 E -(mail)102 437.4 Q F1(support to allo)2.5 E 2.5(wt)-.25 G -(his in SunOS should be forthcoming in a future release.)-2.5 E F0 2.5 -(2.7. K)87 461.4 R(ey)-.25 E(ed Files)-.1 E F1 .242(Generalized k)127 -477.6 R -.15(ey)-.1 G .242(ed \214les is an idea tak).15 F .241 -(en directly from ID)-.1 F 2.741(As)-.4 G .241 -(endmail \(albeit with a completely)-2.741 F(dif)102 489.6 Q -(ferent implementation\).)-.25 E(The)5 E 2.5(yc)-.15 G -(an be useful on lar)-2.5 E(ge sites.)-.18 E -1.11(Ve)127 505.8 S -(rsion 8 includes the follo)1.11 E(wing b)-.25 E(uilt-in map classes:) --.2 E 33.72(dbm Support)102 522 R(for the ndbm\(3\) library)2.5 E(.)-.65 -E 33.17(hash Support)102 538.2 R 1.229(for the `)3.729 F(`Hash')-.74 E -3.729('t)-.74 G 1.229(ype from the ne)-3.729 F 3.729(wB)-.25 G(erk) --3.729 E(ele)-.1 E 3.729(yd)-.15 G 1.229(b\(3\) library)-3.729 F 6.23 -(.t)-.65 G 1.23(his library pro-)-6.23 F 4.094(vides substantially better database support than ndbm\(3\), including in-memory) -156 550.2 R(caching, arbitrarily long k)156 562.2 Q -.15(ey)-.1 G 2.5 -(sa).15 G(nd v)-2.5 E(alues, and better disk utilization.)-.25 E 31.51 -(btree Support)102 578.4 R .547(for the `)3.047 F(`B-T)-.74 E(ree')-.35 -E 3.047('t)-.74 G .547(ype from the ne)-3.047 F 3.048(wB)-.25 G(erk) --3.048 E(ele)-.1 E 3.048(yd)-.15 G .548(b\(3\) library)-3.048 F 5.548 -(.B)-.65 G(-T)-5.548 E .548(rees pro)-.35 F(vide)-.15 E .521(better clustering than Hashed \214les if you are fetching lots of records that ha) -156 590.4 R .821 -.15(ve s)-.2 H(imilar).15 E -.1(ke)156 602.4 S -(ys, such as searching a dictionary for w)-.05 E(ords be)-.1 E -(ginning with `)-.15 E(`detr')-.74 E('.)-.74 E 39.83(nis Support)102 -618.6 R(for NIS \(a.k.a. YP\) maps.)2.5 E -(NIS+ is not supported in this v)5 E(ersion.)-.15 E 34.83(host Support) -102 634.8 R(for DNS lookups.)2.5 E 19.84(dequote A)102 651 R -.74(``) -2.642 G(pseudo-map').74 E 2.642('\()-.74 G .142 -(that is, once that does not ha)-2.642 F .442 -.15(ve a)-.2 H .442 -.15 -(ny ex).15 H .142(ternal data\) that allo).15 F .142(ws a con-)-.25 F -.099(\214guration \214le to break apart a quoted string in the address.) -156 663 R .098(This is necessary primarily)5.098 F .726 -(for DECnet addresses, which often ha)156 675 R 1.026 -.15(ve q)-.2 H -.726(uoted addresses that need to be unwrapped).15 F(on g)156 687 Q(ate) --.05 E -.1(wa)-.25 G(ys.).1 E EP -%%Page: 5 5 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Changes in Sendmail V)72 60 Q(ersion 8)-1 E(5) -294.65 E 2.5(2.8. Multi-W)87 96 R(ord Classes & Macr)-.75 E -(os in Classes)-.18 E/F1 10/Times-Roman@0 SF(Classes can no)127 112.2 Q -2.5(wb)-.25 G 2.5(em)-2.5 G(ultiple w)-2.5 E 2.5(ords. F)-.1 F(or e)-.15 -E(xample,)-.15 E(CShofmann.CS.Berk)142 128.4 Q(ele)-.1 E -.65(y.)-.15 G -(EDU).65 E(allo)102 144.6 Q 2.395(ws you to match the entire string `) --.25 F(`hofmann.CS.Berk)-.74 E(ele)-.1 E -.65(y.)-.15 G(EDU').65 E 4.894 -('u)-.74 G 2.394(sing the single construct)-4.894 F -.74(``)102 156.6 S -($=S').74 E('.)-.74 E(Class de\214nitions are no)127 172.8 Q 2.5(wa)-.25 -G(llo)-2.5 E(wed to include macros \212 for e)-.25 E(xample:)-.15 E -(Cw$k)142 189 Q(is le)102 205.2 Q -.05(ga)-.15 G(l.).05 E F0 2.5 -(2.9. IDENT)87 229.2 R(Pr)2.5 E(otocol Support)-.18 E F1 .633 -(The IDENT protocol as de\214ned in RFC 1413 [RFC1413] is supported.)127 -245.4 R(Ho)5.633 E(we)-.25 E -.15(ve)-.25 G 1.433 -.4(r, m).15 H(an).4 E -3.134(ys)-.15 G(ys-)-3.134 E .909(tems ha)102 257.4 R 1.209 -.15(ve a T) --.2 H .909(CP/IP b).15 F .908 -(ug that renders this useless, and the feature must be turned of)-.2 F -3.408(f. Roughly)-.25 F 3.408(,i)-.65 G(f)-3.408 E 8.538 -(one of these system recei)102 269.4 R -.15(ve)-.25 G 11.038(sa\231).15 -G 8.539(No route to host\232 message \(ICMP message)-11.038 F -(ICMP_UNREA)102 281.4 Q .829(CH_HOST\) on)-.4 F/F2 10/Times-Italic@0 SF -(any)3.329 E F1 .828 -(connection, all connections to that host are closed.)3.329 F .828 -(Some \214re-)5.828 F -.1(wa)102 293.4 S .087(lls return this error if you try to connect to the IDENT port, so you can') -.1 F 2.587(tr)-.18 G(ecei)-2.587 E .387 -.15(ve e)-.25 H .087 -(mail from these).15 F 1.712(hosts on these systems.)102 305.4 R(It') -6.712 E 4.212(sp)-.55 G 1.712(ossible that if the \214re)-4.212 F -.1 -(wa)-.25 G 1.712(ll used a more speci\214c message \(such as).1 F -(ICMP_UNREA)102 317.4 Q(CH_PR)-.4 E -1.88 -.4(OT O)-.4 H 4.316 -(COL, ICMP_UNREA).4 F(CH_POR)-.4 E 6.817(To)-.6 G 6.817(rI)-6.817 G -(CMP_UNREA)-6.817 E(CH_NET_PR)-.4 E(O-)-.4 E(HIB\) it w)102 329.4 Q -(ould w)-.1 E(ork, b)-.1 E(ut this hasn')-.2 E 2.5(tb)-.18 G(een v)-2.5 -E(eri\214ed.)-.15 E .678(IDENT protocol support cannot be used on 4.3BSD, Apollo DomainOS, Apple A/UX, Con-) -127 345.6 R -.15(vex)102 357.6 S .949 -(OS, Data General DG/UX, HP-UX, Sequent Dynix, or Ultrix 4.x, x).15 F/F3 -10/Symbol SF<a3>3.449 E F1 3.449(3. It)3.449 F .949(seems to w)3.449 F -.949(ork on)-.1 F -(4.4BSD, IBM AIX 3.x, OSF/1, SGI IRIX, Solaris, SunOS, and Ultrix 4.4.) -102 369.6 Q F0 2.5(2.10. Separate)87 393.6 R(En)2.5 E -.1(ve)-.4 G -(lope/Header Pr).1 E(ocessing)-.18 E F1 .854 -(Since the From: line is passed in separately from the en)127 409.8 R --.15(ve)-.4 G .854(lope sender).15 F 3.354(,t)-.4 G .854(hese ha)-3.354 -F 1.154 -.15(ve b)-.2 H .854(oth been).15 F .427 -(made visible; the $g macro is set to the en)102 421.8 R -.15(ve)-.4 G -.428(lope sender during processing of mailer ar).15 F .428(gument v)-.18 -F(ec-)-.15 E(tors and the header sender during processing of headers.) -102 433.8 Q .085(It is also possible to specify separate per)127 450 R -.085(-mailer en)-.2 F -.15(ve)-.4 G .084(lope and header processing.).15 -F .084(The Sender)5.084 F(-)-.2 E -.55(RW)102 462 S 1.085 -(Set and RecipientR).55 F 1.085(Wset ar)-.55 F 1.085 -(guments for mailers can be speci\214ed as `)-.18 F(`en)-.74 E -.15(ve) --.4 G(lope/header').15 E 3.585('t)-.74 G 3.585(og)-3.585 G -2.15 -.25 -(iv e)-3.585 H(dif)102 474 Q(ferent re)-.25 E(writings for en)-.25 E --.15(ve)-.4 G(lope v).15 E(ersus header addresses.)-.15 E F0 2.5 -(2.11. Owner)87 498 R(-List Pr)-.37 E(opagates to En)-.18 E -.1(ve)-.4 G -(lope).1 E F1 1.168(When an alias has an associated o)127 514.2 R(wner) --.25 E 1.168(-list name, that alias is used to change the en)-.2 F -.15 -(ve)-.4 G(lope).15 E(sender address.)102 526.2 Q(This will cause do)5 E -(wnstream errors to be returned to that o)-.25 E(wner)-.25 E(.)-.55 E -1.813(Some people \214nd this confusing because the en)127 542.4 R -.15 -(ve)-.4 G 1.813(lope sender is what appears in the \214rst).15 F -.74 -(``)102 554.4 S(From_').74 E 3.127('l)-.74 G .627 -(ine in UNIX messages \(that is, the line be)-3.127 F .627(ginning `) --.15 F(`From<space>')-.74 E 3.127('i)-.74 G .627(nstead of `)-3.127 F -(`From:')-.74 E(';)-.74 E .502(the latter is the header from, which)102 -566.4 R F2(does)3.002 E F1 .503(indicate the sender of the message\).) -3.002 F .503(In pre)5.503 F .503(vious v)-.25 F(ersions,)-.15 E F2 -(sendmail)102 578.4 Q F1 .057(has tried to a)2.557 F -.2(vo)-.2 G .057 -(id changing the en).2 F -.15(ve)-.4 G .056 -(lope sender for back compatibility with UNIX con).15 F -.15(ve)-.4 G -(n-).15 E .177 -(tion; at this point that back compatibility is creating too man)102 -590.4 R 2.678(yp)-.15 G .178(roblems, and it is necessary to mo)-2.678 F --.15(ve)-.15 G(forw)102 602.4 Q(ard into the 1980s.)-.1 E F0 2.5 -(2.12. Command)87 626.4 R(Line Flags)2.5 E F1(The)127 642.6 Q F0<ad42> -2.5 E F1(\215ag has been added to pass in body type information.)2.5 E -(The)127 658.8 Q F0<ad70>3.057 E F1 .557 -(\215ag has been added to pass in protocol information that w)3.057 F -.557(as pre)-.1 F .556(viously passed in by)-.25 F(de\214ning the)102 -670.8 Q F0($r)2.5 E F1(and)2.5 E F0($s)2.5 E F1(macros.)2.5 E(The)127 -687 Q F0<ad58>2.6 E F1 .1(\215ag has been added to allo)2.6 F 2.6(wl) --.25 G .1(ogging of all protocol in and out of sendmail for deb)-2.6 F -(ug-)-.2 E 2.732(ging. Y)102 699 R .232(ou can set \231\255X \214lename\232 and a complete transcript will be logged in that \214le.) --1.1 F .231(This gets big)5.231 F -.1(fa)102 711 S -(st: the option is only for deb).1 E(ugging.)-.2 E EP -%%Page: 6 6 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 294.65(6C)72 60 S(hanges in Sendmail V)-294.65 E -(ersion 8)-1 E/F1 10/Times-Roman@0 SF(The)127 96 Q F0<ad71>4.006 E F1 -1.507(\215ag can limit limit a queue run to speci\214c recipients, senders, or queue ids using) -4.006 F(\255qRsubstring, \255qSsubstring, or \255qIsubstring respecti) -102 108 Q -.15(ve)-.25 G(ly).15 E(.)-.65 E F0 2.5(2.13. New)87 132 R -(Con\214guration Line T)2.5 E(ypes)-.74 E F1 .674(The `T' \(T)127 148.2 -R .674(rusted users\) con\214guration line has been deleted.)-.35 F .674 -(It will still be accepted b)5.674 F .674(ut will)-.2 F(be ignored.)102 -160.2 Q(The `K' line has been added to declare database maps.)127 176.4 -Q(The `V' line has been added to declare the con\214guration v)127 192.6 -Q(ersion le)-.15 E -.15(ve)-.25 G(l.).15 E(The `M' \(mailer\) line tak) -127 208.8 Q(es a D= \214eld to specify e)-.1 E -.15(xe)-.15 G -(cution directory).15 E(.)-.65 E F0 2.5(2.14. New)87 232.8 R -(and Extended Options)2.5 E F1(Se)127 249 Q -.15(ve)-.25 G .9(ral ne).15 -F 3.4(wo)-.25 G .9(ptions ha)-3.4 F 1.2 -.15(ve b)-.2 H .9 -(een added, man).15 F 3.4(yt)-.15 G 3.4(os)-3.4 G .9(upport ne)-3.4 F -3.4(wf)-.25 G .9(eatures, others to allo)-3.4 F 3.4(wt)-.25 G(uning)-3.4 -E(that w)102 261 Q(as pre)-.1 E(viously a)-.25 E -.25(va)-.2 G -(ilable only by recompiling.).25 E(Brie\215y:)5 E 28.78(AT)102 277.2 S -.099(he alias \214le speci\214cation can no)-28.78 F 2.599(wb)-.25 G -2.599(eal)-2.599 G .099(ist of alias \214les.)-2.599 F .098 -(Also, the con\214guration can spec-)5.099 F(ify a class of \214le.)138 -289.2 Q -.15(Fo)5 G 2.5(re).15 G -(xample, to search the NIS aliases, use \231O)-2.65 E -(Anis:mail.aliases\232.)-.35 E 31(bI)102 305.4 S -(nsist on a minimum number of disk blocks.)-31 E 29.33(CD)102 321.6 S -(eli)-29.33 E -.15(ve)-.25 G .24(ry checkpoint interv).15 F 2.74 -(al. Checkpoint)-.25 F .24(the queue \(to a)2.74 F -.2(vo)-.2 G .24 -(id duplicate deli).2 F -.15(ve)-.25 G .24(ries\) e).15 F -.15(ve)-.25 G -.24(ry C).15 F(addresses.)138 333.6 Q 29.89(ED)102 349.8 S(ef)-29.89 E -.712(ault error message.)-.1 F .711 -(This message \(or the contents of the indicated \214le\) are prepended) -5.712 F(to error messages.)138 361.8 Q 28.78(GE)102 378 S .785 -(nable GECOS matching.)-28.78 F .785(If you can')5.785 F 3.285<748c>-.18 -G .786(nd a local user name and this option is enabled,)-3.285 F .59 -(do a sequential scan of the passwd \214le to match ag)138 390 R .589 -(ainst full names.)-.05 F(Pre)5.589 E .589(viously a compile)-.25 F -(option.)138 402 Q 31(hM)102 418.2 S(aximum hop count.)-31 E(Pre)5 E -(viously this w)-.25 E(as compiled in.)-.1 E 32.67(IT)102 434.4 S -(his option has been e)-32.67 E(xtended to allo)-.15 E 2.5(ws)-.25 G -(etting of resolv)-2.5 E(er parameters.)-.15 E 33.22(jS)102 450.6 S -(end errors in MIME-encapsulated format.)-33.22 E 32.11(JF)102 466.8 S -(orw)-32.26 E(ard \214le path.)-.1 E(Where to search for .forw)5 E -(ard \214les \212 def)-.1 E(aults to $HOME/.forw)-.1 E(ard.)-.1 E 31(kC) -102 483 S .05(onnection cache size.)-31 F .05 -(The total number of connections that will be k)5.05 F .05 -(ept open at an)-.1 F 2.55(yt)-.15 G(ime.)-2.55 E 28.78(KC)102 499.2 S -1.395(onnection cache lifetime.)-28.78 F 1.395(The amount of time an) -6.395 F 3.895(yc)-.15 G 1.394(onnection will be permitted to sit)-3.895 -F(idle.)138 511.2 Q 33.22(lE)102 527.4 S .333(nable Errors-T)-33.22 F -.333(o: header)-.8 F 5.334(.T)-.55 G .334 -(hese headers violate RFC 1123; this option is included to pro-)-5.334 F -(vide back compatibility with old v)138 539.4 Q(ersions of sendmail.) --.15 E 28.78(OI)102 555.6 S -(ncoming daemon options \(e.g., use alternate SMTP port\).)-28.78 E 31 -(pP)102 571.8 S(ri)-31 E -.25(va)-.25 G .3 -.15(cy o).25 H 2.5 -(ptions. These).15 F(can be used to mak)2.5 E 2.5(ey)-.1 G -(our SMTP serv)-2.5 E(er less friendly)-.15 E(.)-.65 E 32.67(rT)102 588 -S .67(his option has been e)-32.67 F .67(xtended to allo)-.15 F 3.17 -<778c>-.25 G .67(ner grained control o)-3.17 F -.15(ve)-.15 G 3.17(rt) -.15 G 3.17(imeouts. F)-3.17 F .67(or e)-.15 F(xample,)-.15 E -(you can set the timeout for SMTP commands indi)138 600 Q(vidually)-.25 -E(.)-.65 E 29.33(RD)102 616.2 S(on')-29.33 E 11.797(tp)-.18 G 9.297 -(rune route-addrs.)-11.797 F(Normally)14.297 E 11.797(,i)-.65 G 11.797 -(fv)-11.797 G 9.297(ersion 8 sees an address lik)-11.947 F(e)-.1 E 1.256 -("<@hostA,@hostB:user@hostC>, sendmail will try to strip of)138 628.2 R -3.755(fa)-.25 G 3.755(sm)-3.755 G 1.255(uch as it can \(up to)-3.755 F -(user@hostC\) as suggested by RFC 1123.)138 640.2 Q -(This option disables that beha)5 E(viour)-.2 E(.)-.55 E 29.89(TT)102 -656.4 S 1.485(he \231Return T)-29.89 F 3.985(oS)-.8 G 1.485 -(ender\232 timeout has been e)-3.985 F 1.485(xtended to allo)-.15 F -3.986(ws)-.25 G 1.486(peci\214cation of a w)-3.986 F(arning)-.1 E .789 -(message interv)138 668.4 R .789 -(al, typically something on the order of four hours.)-.25 F .788 -(If a message cannot be)5.788 F(deli)138 680.4 Q -.15(ve)-.25 G 1.245 -(red in that interv).15 F 1.245(al, a w)-.25 F 1.245 -(arning message is sent back to the sender b)-.1 F 1.246(ut the message) --.2 F(continues to be tried.)138 692.4 Q 28.78(UU)102 708.6 S -(ser database spec.)-28.78 E(This is still e)5 E(xperimental.)-.15 E EP -%%Page: 7 7 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Changes in Sendmail V)72 60 Q(ersion 8)-1 E(7) -294.65 E/F1 10/Times-Roman@0 SF 28.78(VF)102 96 S .758(allback `)-28.93 -F(`MX')-.74 E 3.258('h)-.74 G 3.258(ost. This)-3.258 F .757 -(can be thought of as an MX host that applies to all addresses)3.258 F -(that has a v)138 108 Q(ery high preference v)-.15 E -(alue \(that is, use it only if e)-.25 E -.15(ve)-.25 G(rything else f) -.15 E(ails\).)-.1 E 28.78(wI)102 124.2 S 3.066(fs)-28.78 G .566(et, assume that if you are the best MX host for a host, you should send directly to that) --3.066 F 3.213(host. This)138 136.2 R .713 -(is intended for compatibility with UIUC sendmail, and may ha)3.213 F -1.013 -.15(ve s)-.2 H .712(ome use on).15 F(\214re)138 148.2 Q -.1(wa) --.25 G(lls.).1 E 31(7D)102 164.4 S 2.758(on)-31 G .258 -(ot run eight bit clean.)-2.758 F -.7(Te)5.258 G(chnically).7 E 2.758 -(,y)-.65 G .258(ou ha)-2.758 F .558 -.15(ve t)-.2 H 2.758(oa).15 G .259 -(ssert this option to be RFC 821 com-)-2.758 F(patible.)138 176.4 Q F0 -2.5(2.15. New)87 200.4 R(Mailer De\214nitions)2.5 E F1 21.75(L= Set)102 -216.6 R .93(the allo)3.43 F -.1(wa)-.25 G .93(ble line length.).1 F .93 -(In V5, the L mailer \215ag implied a line length limit of 990)5.93 F -(characters; this is no)138 228.6 Q 2.5(ws)-.25 G -(ettable to an arbitrary v)-2.5 E(alue.)-.25 E 17.86(F=a T)102 244.8 R -(ry to use ESMTP)-.35 E 5(.I)-1.11 G 2.5(tw)-5 G(ill f)-2.5 E -(all back to SMTP if the initial EHLO pack)-.1 E(et is rejected.)-.1 E -17.3(F=b Ensure)102 261 R 2.5(ab)2.5 G -(lank line at the end of messages.)-2.5 E(Useful on the *\214le* mailer) -5 E(.)-.55 E 17.86(F=c Strip)102 277.2 R .68(all comments from addresses; this should only be used as a last resort when dealing) -3.18 F(with crank)138 289.2 Q 2.5(ym)-.15 G(ailers.)-2.5 E 17.3(F=g Ne) -102 305.4 R -.15(ve)-.25 G 2.88(ru).15 G .38 -(se the null sender as the en)-2.88 F -.15(ve)-.4 G .379(lope sender).15 -F 2.879(,e)-.4 G -.15(ve)-3.129 G 2.879(nw).15 G .379(hen running SMTP) --2.879 F 5.379(.T)-1.11 G .379(his violates)-5.379 F(RFC 1123.)138 317.4 -Q 17.3(F=7 Strip)102 333.6 R(all output to this mailer to 7 bits.)2.5 E -16.19(F=L Used)102 349.8 R .198 -(to set the line limit to 990 bytes for SMTP compatibility)2.697 F 5.198 -(.I)-.65 G 2.698(tn)-5.198 G .698 -.25(ow d)-2.698 H .198 -(oes that only if the).25 F(L= k)138 361.8 Q -.15(ey)-.1 G -(letter is not speci\214ed.).15 E -(This \215ag is obsolete and should not be used.)5 E F0 2.5(2.16. New)87 -385.8 R(or Changed Pr)2.5 E(e-De\214ned Macr)-.18 E(os)-.18 E F1 23.5 -($k UUCP)102 402 R(node name from uname\(2\).)2.5 E 20.72($m Domain)102 -418.2 R(part of our full hostname.)2.5 E 23.5($_ RFC)102 434.4 R -(1413-pro)2.5 E(vided sender address.)-.15 E 21.28($w Pre)102 450.6 R -.148(viously w)-.25 F .148 -(as sometimes the full domain name, sometimes just the \214rst w)-.1 F -2.647(ord. No)-.1 F 2.647(wg)-.25 G(uar)-2.647 E(-)-.2 E -(anteed to be the \214rst w)138 462.6 Q -(ord of the domain name \(i.e., the host name\).)-.1 E 25.72($j Pre)102 -478.8 R .193(viously had to be de\214ned \212 it is no)-.25 F 2.693(wp) --.25 G .194(rede\214ned to be the full domain name, if that can)-2.693 F -(be determined.)138 490.8 Q(That is, it is equi)5 E -.25(va)-.25 G -(lent to $w).25 E(.$m.)-.65 E F0 2.5(2.17. New)87 514.8 R -(and Changed Classes)2.5 E F1 17.86($=k Initialized)102 531 R -(to contain $k.)2.5 E 15.64($=w No)102 547.2 R 3.069(wi)-.25 G .569 -(ncludes \231[1.2.3.4]\232 \(where 1.2.3.4 is your IP address\) to allo) --3.069 F 3.068(wt)-.25 G .568(he con\214guration \214le)-3.068 F -(to recognize your o)138 559.2 Q(wn IP address.)-.25 E F0 2.5(2.18. New) -87 583.2 R(Rewriting T)2.5 E(ok)-.92 E(ens)-.1 E F1(The)127 599.4 Q F0 -($&)3.25 E F1 .75(construct has been adopted from ID)3.25 F 3.25(At)-.4 -G 3.25(od)-3.25 G .75(efer macro e)-3.25 F -.25(va)-.25 G 3.25 -(luation. Normally).25 F 3.25(,m)-.65 G(acros)-3.25 E .476 -(in rulesets are bound when the rule is \214rst parsed during startup.) -102 611.4 R .476(Some macros change during pro-)5.476 F .046 -(cessing and are uninteresting during startup.)102 623.4 R(Ho)5.046 E -(we)-.25 E -.15(ve)-.25 G .846 -.4(r, t).15 H .047 -(hat macro can be referenced using \231$&x\232 to).4 F(defer the e)102 -635.4 Q -.25(va)-.25 G(ulation of $x until the rule is processed.).25 E -(The tok)127 651.6 Q(ens)-.1 E F0($\()2.5 E F1(and)2.5 E F0($\))2.5 E F1 -(ha)2.5 E .3 -.15(ve b)-.2 H(een added to allo).15 E 2.5(ws)-.25 G -(peci\214cation of map re)-2.5 E(writing.)-.25 E -1.11(Ve)127 667.8 S -1.499(rsion 8 allo)1.11 F(ws)-.25 E F0($@)3.999 E F1 1.499 -(on the Left Hand Side of an `R' line to match zero tok)3.999 F 3.998 -(ens. This)-.1 F(is)3.998 E -(intended to be used to match the null input.)102 679.8 Q EP -%%Page: 8 8 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 294.65(8C)72 60 S(hanges in Sendmail V)-294.65 E -(ersion 8)-1 E 2.5(2.19. Bigger)87 96 R(Defaults)2.5 E/F1 10 -/Times-Roman@0 SF -1.11(Ve)127 112.2 S 1.283(rsion 8 allo)1.11 F 1.284 -(ws up to 100 rulesets instead of 30.)-.25 F 1.284 -(It is recommended that rulesets 0\2559 be)6.284 F(reserv)102 124.2 Q -(ed for sendmail')-.15 E 2.5(sd)-.55 G(edicated use in future releases.) --2.5 E -(The total number of MX records that can be used has been raised to 20.) -127 140.4 Q .335(The number of queued messages that can be handled at one time has been raised from 600 to) -127 156.6 R(1000.)102 168.6 Q F0 2.5(2.20. Differ)87 192.6 R -(ent Default T)-.18 E(uning P)-.92 E(arameters)-.1 E F1 -1.11(Ve)127 -208.8 S .8(rsion 8 has changed the def)1.11 F .8 -(ault parameters for tuning queue costs to mak)-.1 F 3.3(et)-.1 G .8 -(he number of)-3.3 F .712(recipients more important than the size of the message \(for small messages\).) -102 220.8 R .712(This is reasonable if)5.712 F -(you are connected with reasonably f)102 232.8 Q(ast links.)-.1 E F0 2.5 -(2.21. A)87 256.8 R(uto-Quoting in Addr)-.5 E(esses)-.18 E F1(Pre)127 -273 Q(viously)-.25 E 3.2(,t)-.65 G .701(he `)-3.2 F .701 -(`Full Name <email address>')-.74 F 3.201('s)-.74 G .701(yntax w)-3.201 -F .701(ould generate incorrect protocol out-)-.1 F .006(put if `)102 285 -R .006(`Full Name')-.74 F 2.506('h)-.74 G .006 -(ad special characters such as dot.)-2.506 F .005(This v)5.006 F .005 -(ersion puts quotes around such names.)-.15 F F0 2.5(2.22. Symbolic)87 -309 R(Names On Err)2.5 E(or Mailer)-.18 E F1(Se)127 325.2 Q -.15(ve)-.25 -G(ral names ha).15 E .3 -.15(ve b)-.2 H(een b).15 E -(uilt in to the $@ portion of the $#error mailer)-.2 E 5(.F)-.55 G(or e) --5.15 E(xample:)-.15 E($#error $@NOHOST $: Host unkno)142 341.4 Q(wn) --.25 E(Prints the indicated message and sets the e)102 357.6 Q -(xit status of)-.15 E/F2 10/Times-Italic@0 SF(sendmail)2.5 E F1(to)2.5 E -/F3 9/Times-Roman@0 SF(EX_NOHOST)2.5 E F1(.)A F0 2.5(2.23. New)87 381.6 -R(Built-In Mailers)2.5 E F1 -1 -.8(Tw o)127 397.8 T(ne)3.901 E 3.101(wm) --.25 G .601(ailers, *\214le* and *include*, are included to de\214ne options when mailing to a \214le) --3.101 F(or a :include: \214le respecti)102 409.8 Q -.15(ve)-.25 G(ly) -.15 E 5(.P)-.65 G(re)-5 E(viously these were o)-.25 E -.15(ve)-.15 G -(rloaded on the local mailer).15 E(.)-.55 E F0 2.5(2.24. SMTP)87 433.8 R -(VRFY Doesn't Expand)2.5 E F1(Pre)127 450 Q 1.438(vious v)-.25 F 1.438 -(ersions of sendmail treated VRFY and EXPN the same.)-.15 F 1.437 -(In this v)6.437 F 1.437(ersion, VRFY)-.15 F(doesn')102 462 Q 2.5(te) --.18 G(xpand aliases or follo)-2.65 E 2.5(w.)-.25 G(forw)-2.5 E -(ard \214les.)-.1 E .663(As an optimization, if you run with your def) -127 478.2 R .664(ault deli)-.1 F -.15(ve)-.25 G .664 -(ry mode being queue-only).15 F 3.164(,t)-.65 G .664(he RCPT)-3.164 F -1.09(command will also not chase aliases and .forw)102 490.2 R 1.09 -(ard \214les.)-.1 F 1.09(It will chase them when it processes the)6.09 F -2.5(queue. This)102 502.2 R(speeds up RCPT processing.)2.5 E F0 2.5 -(2.25. [IPC])87 526.2 R(Mailers Allo)2.5 E 2.5(wM)-.1 G(ultiple Hosts) --2.5 E F1 .099(When an address resolv)127 542.4 R .099 -(es to a mailer that has `)-.15 F(`[IPC]')-.74 E 2.599('a)-.74 G 2.6(si) --2.599 G .1(ts `)-2.6 F(`P)-.74 E(ath')-.15 E .1 -(', the $@ part \(host name\))-.74 F .138 -(can be a colon-separated list of hosts instead of a single hostname.) -102 554.4 R .137(This asks sendmail to search the)5.137 F .16 -(list for the \214rst entry that is a)102 566.4 R -.25(va)-.2 G .16 -(ilable e).25 F .161(xactly as though it were an MX record.)-.15 F .161 -(The intent is to route)5.161 F .738(internal traf)102 578.4 R .738 -(\214c through internal netw)-.25 F .738 -(orks without publishing an MX record to the net.)-.1 F .737(MX e)5.737 -F(xpan-)-.15 E(sion is still done on the indi)102 590.4 Q(vidual items.) --.25 E F0 2.5(2.26. Aliases)87 614.4 R(Extended)2.5 E F1 .298 -(The implementation has been mer)127 630.6 R .298(ged with maps.)-.18 F -.299(Among other things, this supports multiple)5.298 F -(alias \214les and NIS-based aliases.)102 642.6 Q -.15(Fo)5 G 2.5(re).15 -G(xample:)-2.65 E -.35(OA)142 658.8 S(/etc/aliases,nis:mail.aliases).35 -E(will search \214rst the local database \231/etc/aliases\232 follo)102 -675 Q(wed by the NIS map)-.25 E EP -%%Page: 9 9 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Changes in Sendmail V)72 60 Q(ersion 8)-1 E(9) -294.65 E 2.5(2.27. P)87 96 R(ortability and Security Enhancements)-.2 E -/F1 10/Times-Roman@0 SF 2.5(An)127 112.2 S(umber of internal changes ha) --2.5 E .3 -.15(ve b)-.2 H(een made to enhance portability).15 E(.)-.65 E -(Se)127 128.4 Q -.15(ve)-.25 G(ral \214x).15 E(es ha)-.15 E .3 -.15 -(ve b)-.2 H(een made to increase the paranoia f).15 E(actor)-.1 E(.)-.55 -E .46(In particular)127 144.6 R 2.96(,t)-.4 G .46 -(he permissions required for .forw)-2.96 F .46 -(ard and :include: \214les ha)-.1 F .76 -.15(ve b)-.2 H .46 -(een tightened up).15 F(considerably)102 156.6 Q 5.182(.V)-.65 G 2.683 -(5w)-5.182 G .183(ould pretty much read an)-2.783 F 2.683<798c>-.15 G -.183(le it could get to as root, which e)-2.683 F .183 -(xposed some secu-)-.15 F 1.02(rity holes.)102 168.6 R 1.02 -(V8 insists that all directories leading up to the .forw)6.02 F 1.02 -(ard or :include: \214le be searchable)-.1 F .334 -(\("x" permission\) by the controlling user" \(de\214ned belo)102 180.6 -R .335(w\), that the \214le itself be readable by the con-)-.25 F -(trolling user)102 192.6 Q 2.5(,a)-.4 G(nd that .forw)-2.5 E -(ard \214les be o)-.1 E(wned by the user who is being forw)-.25 E -(arded to or root.)-.1 E .565(The "controlling user" is the user on whose behalf the mail is being deli) -127 208.8 R -.15(ve)-.25 G 3.065(red. F).15 F .565(or e)-.15 F(xample,) --.15 E .459 -(if you mail to "user1" then the controlling user for ~user1/.forw)102 -220.8 R .46(ard and an)-.1 F 2.96(ym)-.15 G .46(ailers in)-2.96 F -.2 -(vo)-.4 G -.1(ke).2 G 2.96(db).1 G 2.96(yt)-2.96 G(hat)-2.96 E(.forw)102 -232.8 Q(ard \214le, including :include: \214les.)-.1 E(Pre)127 249 Q -(viously)-.25 E 2.816(,a)-.65 G -.15(ny)-2.816 G .316 -(one who had a home directory could create a .forw).15 F .316 -(ard could forw)-.1 F .316(ard to a pro-)-.1 F 2.965(gram. No)102 261 R -1.765 -.65(w, s)-.25 H .466(endmail checks to mak).65 F 2.966(es)-.1 G -.466(ure that the)-2.966 F 2.966(yh)-.15 G -2.25 -.2(av e)-2.966 H .466 -(an "appro)3.166 F -.15(ve)-.15 G 2.966(ds).15 G .466 -(hell", that is, a shell listed)-2.966 F(in the /etc/shells \214le.)102 -273 Q F0 2.5(2.28. Miscellaneous)87 297 R(Fixes and Enhancements)2.5 E -F1 4.03(An)127 313.2 S 1.53(umber of small b)-4.03 F 1.53(ugs ha)-.2 F -1.53(ving to do with things lik)-.2 F 4.03(eb)-.1 G 1.53 -(ackslash-escaped quotes inside of)-4.03 F(comments ha)102 325.2 Q .3 --.15(ve b)-.2 H(een \214x).15 E(ed.)-.15 E 1.552(The \214x)127 341.4 R -1.552(ed size limit on header lines \(such as \231T)-.15 F 1.553 -(o:\232 and \231Cc:\232\) has been eliminated; those)-.8 F -.2(bu)102 -353.4 S -.25(ff).2 G(ers are dynamically allocated no).25 E -.65(w.)-.25 -G .289(Sendmail writes a /etc/sendmail.pid \214le with the current process id and the current in) -127 369.6 R -.2(vo)-.4 G(cation).2 E(\215ags.)102 381.6 Q -1 -.8(Tw o) -127 397.8 T .218 -(people using the same program \(e.g., submit\) are considered "dif) -3.518 F .219(ferent" so that duplicate)-.25 F .508(elimination doesn') -102 409.8 R 3.008(td)-.18 G .508(elete one of them.)-3.008 F -.15(Fo) -5.508 G 3.008(re).15 G .508(xample, tw)-3.158 F 3.008(op)-.1 G .508 -(eople forw)-3.008 F .508(arding their email to |submit)-.1 F -(will be treated as tw)102 421.8 Q 2.5(or)-.1 G(ecipients.)-2.5 E .721(The mailstats program prints mailer names and gets the location of the sendmail.st \214le from) -127 438 R(/etc/sendmail.cf.)102 450 Q(Man)127 466.2 Q 2.5(ym)-.15 G -(inor b)-2.5 E(ugs ha)-.2 E .3 -.15(ve b)-.2 H(een \214x).15 E -(ed, such as handling of backslashes inside of quotes.)-.15 E 2.5(Ah)127 -482.4 S(ook has been added to allo)-2.5 E 2.5(wr)-.25 G -.25(ew)-2.5 G -(riting of local addresses after aliasing.).25 E F0 2.5(3. FUTURE)72 -506.4 R -.1(WO)2.5 G(RK).1 E F1 1.719(The pre)112 522.6 R 1.719 -(vious section describes)-.25 F/F2 10/Times-Italic@0 SF(sendmail)4.219 E -F1 1.719(as of v)4.219 F 1.719(ersion 8.6.6.)-.15 F 1.718 -(There is still much to be done.)6.719 F -(Some high points are described belo)87 534.6 Q 3.8 -.65(w. T)-.25 H -(his list is by no means e).65 E(xhausti)-.15 E -.15(ve)-.25 G(.).15 E -F0 2.5(3.1. Full)87 558.6 R(MIME Support)2.5 E F1(Currently)127 574.8 Q -F2(sendmail)3.305 E F1 .805(only supports se)3.305 F -.15(ve)-.25 G -3.305(nb).15 G .805(it MIME messages.)-3.305 F .806 -(Although it can pass eight bit)5.805 F .371 -(MIME messages, it cannot adv)102 586.8 R .371(ertise that f)-.15 F .37 -(act because the standards say that the mail agent must be)-.1 F .26 -(able to do 8- to 7-bit con)102 598.8 R -.15(ve)-.4 G .26(rsion to ha) -.15 F .561 -.15(ve f)-.2 H .261(ull 8-bit support.).15 F .261 -(This requires f)5.261 F .261(ar more e)-.1 F(xtensi)-.15 E .561 -.15 -(ve m)-.25 H(odi\214-).15 E -(cation of the message body than is currently supported.)102 610.8 Q -.464(The best w)127 627 R .464(ay to do this w)-.1 F .463 -(ould be to support the general concept of an e)-.1 F .463(xternal `) --.15 F .463(`message \214l-)-.74 F(ter')102 639 Q 3.319('t)-.74 G .819 -(hat could do arbitrary modi\214cations of the message.)-3.319 F .819 -(This w)5.819 F .82(ould allo)-.1 F 3.32(wM)-.25 G .82(IME con)-3.32 F --.15(ve)-.4 G .82(rsion as).15 F .63 -(well as such things as automatic encryption of messages sent o)102 651 -R -.15(ve)-.15 G 3.129(re).15 G .629(xternal links.)-3.279 F .629 -(This is probably)5.629 F(an e)102 663 Q(xtremely non-tri)-.15 E -(vial change.)-.25 E F0 2.5(3.2. Ser)87 687 R(vice Switch Abstraction) --.1 E F1 .369(Most modern systems include some concept of a \231service switch\232 \212 for e) -127 703.2 R .37(xample, to look up)-.15 F .984 -(host names you can try DNS, NIS, NIS+, te)102 715.2 R .984 -(xt tables, NetInfo, or other services in some arbitrary)-.15 F EP -%%Page: 10 10 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 287.15(10 Changes)72 60 R(in Sendmail V)2.5 E -(ersion 8)-1 E/F1 10/Times-Roman@0 SF(order)102 96 Q 5.174(.T)-.55 G -.174(his is currently v)-5.174 F .174(ery clumsy in)-.15 F/F2 10 -/Times-Italic@0 SF(sendmail)2.674 E F1 2.674(,w)C .174 -(ith only limited control of the services pro)-2.674 F(vided.)-.15 E F0 -2.5(3.3. Mor)87 120 R 2.5(eC)-.18 G(ontr)-2.5 E(ol of Local Addr)-.18 E -(esses)-.18 E F1 .943(Currently some addresses are declared as \231local\232 and are handled specially \212 for e) -127 136.2 R(xample,)-.15 E(the)102 148.2 Q 3.455(ym)-.15 G .955(ay ha) --3.455 F 1.255 -.15(ve .)-.2 H(forw).15 E .956 -(ard \214les, may be translated into program calls or \214le deli)-.1 F --.15(ve)-.25 G .956(ries, and so forth.).15 F .311(These should be brok) -102 160.2 R .311(en out into separate \215ags to allo)-.1 F 2.811(wt) --.25 G .31(he local system administrator to ha)-2.811 F .61 -.15(ve m) --.2 H(ore).15 E(\214ne-grained control o)102 172.2 Q -.15(ve)-.15 G 2.5 -(ro).15 G(perations.)-2.5 E F0 2.5(3.4. Mor)87 196.2 R 2.5(eR)-.18 G -(un-T)-2.5 E(ime Con\214guration Options)-.18 E F1 .016(There are man) -127 212.4 R 2.516(yo)-.15 G .016(ptions that are con\214gured at compile time, such as the method of \214le locking) --2.516 F .719(and the use of the IDENT protocol [RFC1413].)102 224.4 R -.719(These should be transfered to run time by adding)5.719 F(ne)102 -236.4 Q 2.5(wo)-.25 G(ptions.)-2.5 E(Similarly)127 252.6 Q 3.413(,s)-.65 -G .913(ome options are currently o)-3.413 F -.15(ve)-.15 G .913 -(rloaded, that is, a single option controls more than).15 F(one thing.) -102 264.6 Q(These should probably be brok)5 E -(en out into separate options.)-.1 E -(This implies that options will change from single characters to w)127 -280.8 Q(ords.)-.1 E F0 2.5(3.5. Mor)87 304.8 R 2.5(eC)-.18 G -(on\214guration Contr)-2.5 E(ol Ov)-.18 E(er Err)-.1 E(ors)-.18 E F1 -(Currently)127 321 Q 3.649(,t)-.65 G 1.148(he con\214guration \214le can generate an error message during parsing.) --3.649 F(Ho)6.148 E(we)-.25 E -.15(ve)-.25 G 1.948 -.4(r, i).15 H(t).4 E -.569(cannot tweak other operations, such as issuing a w)102 333 R .57 -(arning message to the system postmaster)-.1 F 5.57(.S)-.55 G(imi-)-5.57 -E(larly)102 345 Q 2.558(,s)-.65 G .057 -(ome errors should not be triggered if the)-2.558 F 2.557(ya)-.15 G .057 -(re in aliases during an alias \214le reb)-2.557 F .057(uild, b)-.2 F -.057(ut should)-.2 F(be triggered if that alias is actually used.)102 -357 Q F0 2.5(3.6. Long)87 381 R -.92(Te)2.5 G(rm Host State).92 E F1 -(Currently)127 397.2 Q(,)-.65 E F2(sendmail)3.731 E F1 1.231 -(only remembers host status during a single queue run.)3.731 F 1.232 -(This should be)6.232 F(con)102 409.2 Q -.15(ve)-.4 G .492(rted to long term status stored on disk so it can be shared between instantiations of) -.15 F F2(sendmail)2.991 E F1(.)A .866(Entries will ha)102 421.2 R 1.167 --.15(ve t)-.2 H 3.367(ob).15 G 3.367(et)-3.367 G .867(imestamped so the) --3.367 F 3.367(yc)-.15 G .867(an time out.)-3.367 F .867(This will allo) -5.867 F(w)-.25 E F2(sendmail)3.367 E F1 .867(to implement)3.367 F -.15 -(ex)102 433.2 S(ponential back).15 E(of)-.1 E 2.5(fo)-.25 G 2.5(nq)-2.5 -G(ueue runs on a per)-2.5 E(-host basis.)-.2 E F0 2.5(3.7. Connection)87 -457.2 R(Contr)2.5 E(ol)-.18 E F1 .819(Modern netw)127 473.4 R .819 -(orks ha)-.1 F 1.119 -.15(ve d)-.2 H(if).15 E .819 -(ferent types of connecti)-.25 F .818(vity than the past.)-.25 F .818 -(In particular)5.818 F 3.318(,t)-.4 G .818(he rising)-3.318 F .636(prominence of dialup IP has created certain challenges for automated serv) -102 485.4 R 3.136(ers. It)-.15 F .636(is not uncommon)3.136 F .732 -(to try to mak)102 497.4 R 3.232(eac)-.1 G .732 -(onnection to a host and ha)-3.232 F 1.032 -.15(ve i)-.2 H 3.232(tf).15 -G .732(ail, e)-3.332 F -.15(ve)-.25 G 3.232(nt).15 G .732 -(hough if you tried ag)-3.232 F .732(ain it w)-.05 F .731(ould suc-)-.1 -F 2.5(ceed. The)102 509.4 R(connection management could be a bit cle)2.5 -E -.15(ve)-.25 G(rer to try to adapt to such situations.).15 E F0 2.5 -(3.8. Other)87 533.4 R(Caching)2.5 E F1 .074 -(When you do an MX record lookup, the name serv)127 549.6 R .075 -(er automatically returns the IP addresses of)-.15 F .518 -(the associated MX serv)102 561.6 R 3.018(ers. This)-.15 F .518 -(information is currently ignored, and another query is done to get) -3.018 F(this information.)102 573.6 Q(It should be cached to a)5 E -.2 -(vo)-.2 G(id e).2 E(xcess name serv)-.15 E(er traf)-.15 E(\214c.)-.25 E -F0 2.5(4. REFERENCES)72 597.6 R F1([Allman83a])87 613.8 Q .137 -(\231Sendmail \212 An Internetw)123 625.8 R .137(ork Mail Router)-.1 F -4.037 -.7(.\232 E)-.55 H 2.638(.A).7 G 2.638(llman. In)-2.638 F F2 .138 -(Unix Pr)2.638 F -.1(og)-.45 G -.15(ra).1 G(mmer).15 E(s')-.1 E 2.638 -(sM)-.4 G(anual,)-2.638 E F1(4.2)2.638 E(Berk)123 637.8 Q(ele)-.1 E 2.5 -(yS)-.15 G(oftw)-2.5 E(are Distrib)-.1 E(ution, v)-.2 E(olume 2C.)-.2 E -(August 1983.)5 E([Allman83b])87 654 Q .384 -(\231Mail Systems and Addressing in 4.2BSD.)123 666 R 5.384<9a45>-.7 G -2.884(.A)-5.384 G .383(llman In)-2.884 F F2 .383(UNICOM Confer)2.883 F -.383(ence Pr)-.37 F(oceedings.)-.45 E F1(San Die)123 678 Q -(go, California.)-.15 E(January 1983.)5 E([Allman&Amos85])87 694.2 Q --.74(``)123 706.2 S 1.145(Sendmail Re).74 F(visited.)-.25 E 5.125 -.74 -('' E)-.7 H 3.645(.A).74 G 1.145(llman and M. Amos.)-3.645 F(In)6.145 E -F2 1.145(Usenix Summer 1985 Confer)3.645 F 1.145(ence Pr)-.37 F(o-)-.45 -E(ceedings.)123 718.2 Q F1(Portland, Ore)5 E 2.5(gon. June)-.15 F(1985.) -2.5 E EP -%%Page: 11 11 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Changes in Sendmail V)72 60 Q(ersion 8)-1 E(11) -289.65 E/F1 10/Times-Roman@0 SF([ID)87 96 Q(A87])-.4 E/F2 10 -/Times-Italic@0 SF(Electr)1.97 E .983(onic Mail Addr)-.45 F .983 -(essing in Theory and Pr)-.37 F .982(actice with the ID)-.15 F 3.482(AS) --.35 G .982(endmail Enhancement Kit)-3.482 F .563(\(or The P)123 108 R -(ostmaster')-.8 E 3.063(sL)-.4 G .563(ast W)-3.063 F .564(ill and T)-.55 -F(estament\).)-.92 E F1 .564(Lennart Lo)5.564 F -.5(..)-5 -6 O 3.064 -(vstrand. Department)1 6 N .564(of Computer)3.064 F 1.267 -(and Information Science, Uni)123 120 R -.15(ve)-.25 G 1.267 -(rsity of Link).15 F(o)-.1 E -.5(..)-5 -6 O 1.266 -(ping, Sweden, Report no. LiTH-ID)1 6 N(A-Ex-8715.)-.4 E(May 1987.)123 -132 Q([RFC821])87 148.2 Q F2(Simple Mail T)123 160.2 Q -.15(ra)-.55 G -(nsport Pr).15 E(otocol.)-.45 E F1(J. Postel.)5 E(August 1982.)5 E -([RFC1123])87 176.4 Q F2(Requir)123 188.4 Q .163 -(ements for Internet Hosts \212 Application and Support.)-.37 F F1 .164 -(Internet Engineering T)5.164 F .164(ask F)-.8 F(orce,)-.15 E -(R. Braden, Editor)123 200.4 Q 5(.O)-.55 G(ctober 1989.)-5 E([RFC1344]) -87 216.6 Q F2(Implications of MIME for Internet Mail Gate)123 228.6 Q -(ways.)-.15 E F1(N. Borenstein.)5 E(June 1992.)5 E([RFC1413])87 244.8 Q -F2(Identi\214cation Pr)123 256.8 Q(otocol.)-.45 E F1(M. St. Johns.)5 E -(February 1993.)5 E([RFC1425])87 273 Q F2 2.352 -(SMTP Service Extensions.)123 285 R F1 2.352 -(J. Klensin, N. Freed, M. Rose, E. Stef)7.352 F 2.351 -(ferud, and D. Crock)-.25 F(er)-.1 E(.)-.55 E(February 1993.)123 297 Q -([RFC1426])87 313.2 Q F2 .12(SMTP Service Extension for 8bit-MIMEtr)123 -325.2 R(ansport.)-.15 E F1 .12(J. Klensin, N. Freed, M. Rose, E. Stef) -5.12 F(ferud,)-.25 E(and D. Crock)123 337.2 Q(er)-.1 E 5(.F)-.55 G -(ebruary 1993.)-5 E([RFC1427])87 353.4 Q F2 .813 -(SMTP Service Extension for Messa)123 365.4 R 1.013 -.1(ge S)-.1 H .813 -(ize Declar).1 F(ation.)-.15 E F1 .813 -(J. Klensin, N. Freed, and K. Moore.)5.813 F(February 1993.)123 377.4 Q -([RFC1521])87 393.6 Q F2 2.033 -(MIME \(Multipurpose Internet Mail Extensions\) P)123 405.6 R 2.033 -(art One: Mec)-.8 F 2.033(hanisms for Specifying and)-.15 F .933 -(Describing the F)123 417.6 R .933(ormat of Internet Messa)-1.05 F 1.133 --.1(ge B)-.1 H(odies.).1 E F1 .932(N. Borenstein and N. Freed.)5.932 F -(September)5.932 E(1993.)123 429.6 Q EP -%%Trailer -end -%%EOF diff --git a/doc/intro/Makefile b/doc/intro/Makefile deleted file mode 100644 index 6369a4a..0000000 --- a/doc/intro/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -# @(#)Makefile 8.2 (Berkeley) 2/28/1994 - -DIR= smm/09.sendmail -SRCS= intro.me -MACROS= -me - -all: intro.ps - -intro.ps: ${SRCS} - rm -f ${.TARGET} - ${PIC} ${SRCS} | ${ROFF} > ${.TARGET} - -.include <bsd.doc.mk> diff --git a/doc/intro/intro.me b/doc/intro/intro.me deleted file mode 100644 index 03cfa33..0000000 --- a/doc/intro/intro.me +++ /dev/null @@ -1,1456 +0,0 @@ -.\" Copyright (c) 1998 Sendmail, Inc. All rights reserved. -.\" Copyright (c) 1983 Eric P. Allman. All rights reserved. -.\" Copyright (c) 1988, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" By using this file, you agree to the terms and conditions set -.\" forth in the LICENSE file which can be found at the top level of -.\" the sendmail distribution. -.\" -.\" -.\" @(#)intro.me 8.7 (Berkeley) 5/19/1998 -.\" -.\" pic -Pxx intro.me | ditroff -me -Pxx -.eh 'SMM:9-%''SENDMAIL \*- An Internetwork Mail Router' -.oh 'SENDMAIL \*- An Internetwork Mail Router''SMM:9-%' -.nr si 3n -.if n .ls 2 -.+c -.(l C -.sz 14 -SENDMAIL \*- An Internetwork Mail Router -.sz -.sp -Eric Allman* -.sp 0.5 -.i -University of California, Berkeley -Mammoth Project -.)l -.sp -.(l F -.ce -ABSTRACT -.sp \n(psu -Routing mail through a heterogenous internet presents many new -problems. Among the worst of these is that of address mapping. -Historically, this has been handled on an -.i "ad hoc" -basis. However, -this approach has become unmanageable as internets grow. -.sp \n(psu -Sendmail acts a unified "post office" to which all mail can be -submitted. Address interpretation is controlled by a production -system, which can parse both domain-based addressing and old-style -.i "ad hoc" -addresses. -The production system is powerful -enough to rewrite addresses in the message header to conform to the -standards of a number of common target networks, including old -(NCP/RFC733) Arpanet, new (TCP/RFC822) Arpanet, UUCP, and Phonenet. -Sendmail also implements an SMTP server, message -queueing, and aliasing. -.)l -.sp 2 -.(f -*A considerable part of this work -was done while under the employ -of the INGRES Project -at the University of California at Berkeley -and at Britton Lee. -.)f -.pp -.i Sendmail -implements a general internetwork mail routing facility, -featuring aliasing and forwarding, -automatic routing to network gateways, -and flexible configuration. -.pp -In a simple network, -each node has an address, -and resources can be identified -with a host-resource pair; -in particular, -the mail system can refer to users -using a host-username pair. -Host names and numbers have to be administered by a central authority, -but usernames can be assigned locally to each host. -.pp -In an internet, -multiple networks with different characterstics -and managements -must communicate. -In particular, -the syntax and semantics of resource identification change. -Certain special cases can be handled trivially -by -.i "ad hoc" -techniques, -such as -providing network names that appear local to hosts -on other networks, -as with the Ethernet at Xerox PARC. -However, the general case is extremely complex. -For example, -some networks require point-to-point routing, -which simplifies the database update problem -since only adjacent hosts must be entered -into the system tables, -while others use end-to-end addressing. -Some networks use a left-associative syntax -and others use a right-associative syntax, -causing ambiguity in mixed addresses. -.pp -Internet standards seek to eliminate these problems. -Initially, these proposed expanding the address pairs -to address triples, -consisting of -{network, host, resource} -triples. -Network numbers must be universally agreed upon, -and hosts can be assigned locally -on each network. -The user-level presentation was quickly expanded -to address domains, -comprised of a local resource identification -and a hierarchical domain specification -with a common static root. -The domain technique -separates the issue of physical versus logical addressing. -For example, -an address of the form -.q "eric@a.cc.berkeley.arpa" -describes only the logical -organization of the address space. -.pp -.i Sendmail -is intended to help bridge the gap -between the totally -.i "ad hoc" -world -of networks that know nothing of each other -and the clean, tightly-coupled world -of unique network numbers. -It can accept old arbitrary address syntaxes, -resolving ambiguities using heuristics -specified by the system administrator, -as well as domain-based addressing. -It helps guide the conversion of message formats -between disparate networks. -In short, -.i sendmail -is designed to assist a graceful transition -to consistent internetwork addressing schemes. -.sp -.pp -Section 1 discusses the design goals for -.i sendmail . -Section 2 gives an overview of the basic functions of the system. -In section 3, -details of usage are discussed. -Section 4 compares -.i sendmail -to other internet mail routers, -and an evaluation of -.i sendmail -is given in section 5, -including future plans. -.sh 1 "DESIGN GOALS" -.pp -Design goals for -.i sendmail -include: -.np -Compatibility with the existing mail programs, -including Bell version 6 mail, -Bell version 7 mail -[UNIX83], -Berkeley -.i Mail -[Shoens79], -BerkNet mail -[Schmidt79], -and hopefully UUCP mail -[Nowitz78a, Nowitz78b]. -ARPANET mail -[Crocker77a, Postel77] -was also required. -.np -Reliability, in the sense of guaranteeing -that every message is correctly delivered -or at least brought to the attention of a human -for correct disposal; -no message should ever be completely lost. -This goal was considered essential -because of the emphasis on mail in our environment. -It has turned out to be one of the hardest goals to satisfy, -especially in the face of the many anomalous message formats -produced by various ARPANET sites. -For example, -certain sites generate improperly formated addresses, -occasionally -causing error-message loops. -Some hosts use blanks in names, -causing problems with -UNIX mail programs that assume that an address -is one word. -The semantics of some fields -are interpreted slightly differently -by different sites. -In summary, -the obscure features of the ARPANET mail protocol -really -.i are -used and -are difficult to support, -but must be supported. -.np -Existing software to do actual delivery -should be used whenever possible. -This goal derives as much from political and practical considerations -as technical. -.np -Easy expansion to -fairly complex environments, -including multiple -connections to a single network type -(such as with multiple UUCP or Ether nets -[Metcalfe76]). -This goal requires consideration of the contents of an address -as well as its syntax -in order to determine which gateway to use. -For example, -the ARPANET is bringing up the -TCP protocol to replace the old NCP protocol. -No host at Berkeley runs both TCP and NCP, -so it is necessary to look at the ARPANET host name -to determine whether to route mail to an NCP gateway -or a TCP gateway. -.np -Configuration should not be compiled into the code. -A single compiled program should be able to run as is at any site -(barring such basic changes as the CPU type or the operating system). -We have found this seemingly unimportant goal -to be critical in real life. -Besides the simple problems that occur when any program gets recompiled -in a different environment, -many sites like to -.q fiddle -with anything that they will be recompiling anyway. -.np -.i Sendmail -must be able to let various groups maintain their own mailing lists, -and let individuals specify their own forwarding, -without modifying the system alias file. -.np -Each user should be able to specify which mailer to execute -to process mail being delivered for him. -This feature allows users who are using specialized mailers -that use a different format to build their environment -without changing the system, -and facilitates specialized functions -(such as returning an -.q "I am on vacation" -message). -.np -Network traffic should be minimized -by batching addresses to a single host where possible, -without assistance from the user. -.pp -These goals motivated the architecture illustrated in figure 1. -.(z -.hl -.ie t \ -\{\ -.ie !"\*(.T"" \ -\{\ -.PS -boxht = 0.5i -boxwid = 1.0i - - down -S: [ - right - S1: box "sender1" - move - box "sender2" - move - S3: box "sender3" - ] - arrow -SM: box "sendmail" wid 2i ht boxht - arrow -M: [ - right - M1: box "mailer1" - move - box "mailer2" - move - M3: box "mailer3" - ] - - arrow from S.S1.s to 1/2 between SM.nw and SM.n - arrow from S.S3.s to 1/2 between SM.n and SM.ne - - arrow from 1/2 between SM.sw and SM.s to M.M1.n - arrow from 1/2 between SM.s and SM.se to M.M3.n -.PE -.\} -.el \ -. sp 18 -.\} -.el \{\ -.(c -+---------+ +---------+ +---------+ -| sender1 | | sender2 | | sender3 | -+---------+ +---------+ +---------+ - | | | - +----------+ + +----------+ - | | | - v v v - +-------------+ - | sendmail | - +-------------+ - | | | - +----------+ + +----------+ - | | | - v v v -+---------+ +---------+ +---------+ -| mailer1 | | mailer2 | | mailer3 | -+---------+ +---------+ +---------+ -.)c -.\} - -.ce -Figure 1 \*- Sendmail System Structure. -.hl -.)z -The user interacts with a mail generating and sending program. -When the mail is created, -the generator calls -.i sendmail , -which routes the message to the correct mailer(s). -Since some of the senders may be network servers -and some of the mailers may be network clients, -.i sendmail -may be used as an internet mail gateway. -.sh 1 "OVERVIEW" -.sh 2 "System Organization" -.pp -.i Sendmail -neither interfaces with the user -nor does actual mail delivery. -Rather, -it collects a message -generated by a user interface program (UIP) -such as Berkeley -.i Mail , -MS -[Crocker77b], -or MH -[Borden79], -edits the message as required by the destination network, -and calls appropriate mailers -to do mail delivery or queueing for network transmission\**. -.(f -\**except when mailing to a file, -when -.i sendmail -does the delivery directly. -.)f -This discipline allows the insertion of new mailers -at minimum cost. -In this sense -.i sendmail -resembles the Message Processing Module (MPM) -of [Postel79b]. -.sh 2 "Interfaces to the Outside World" -.pp -There are three ways -.i sendmail -can communicate with the outside world, -both in receiving and in sending mail. -These are using the conventional UNIX -argument vector/return status, -speaking SMTP over a pair of UNIX pipes, -and speaking SMTP over an interprocess(or) channel. -.sh 3 "Argument vector/exit status" -.pp -This technique is the standard UNIX method -for communicating with the process. -A list of recipients is sent in the argument vector, -and the message body is sent on the standard input. -Anything that the mailer prints -is simply collected and sent back to the sender -if there were any problems. -The exit status from the mailer is collected -after the message is sent, -and a diagnostic is printed if appropriate. -.sh 3 "SMTP over pipes" -.pp -The SMTP protocol -[Postel82] -can be used to run an interactive lock-step interface -with the mailer. -A subprocess is still created, -but no recipient addresses are passed to the mailer -via the argument list. -Instead, they are passed one at a time -in commands sent to the processes standard input. -Anything appearing on the standard output -must be a reply code -in a special format. -.sh 3 "SMTP over an IPC connection" -.pp -This technique is similar to the previous technique, -except that it uses a 4.2bsd IPC channel -[UNIX83]. -This method is exceptionally flexible -in that the mailer need not reside -on the same machine. -It is normally used to connect to a sendmail process -on another machine. -.sh 2 "Operational Description" -.pp -When a sender wants to send a message, -it issues a request to -.i sendmail -using one of the three methods described above. -.i Sendmail -operates in two distinct phases. -In the first phase, -it collects and stores the message. -In the second phase, -message delivery occurs. -If there were errors during processing -during the second phase, -.i sendmail -creates and returns a new message describing the error -and/or returns an status code -telling what went wrong. -.sh 3 "Argument processing and address parsing" -.pp -If -.i sendmail -is called using one of the two subprocess techniques, -the arguments -are first scanned -and option specifications are processed. -Recipient addresses are then collected, -either from the command line -or from the SMTP -RCPT command, -and a list of recipients is created. -Aliases are expanded at this step, -including mailing lists. -As much validation as possible of the addresses -is done at this step: -syntax is checked, and local addresses are verified, -but detailed checking of host names and addresses -is deferred until delivery. -Forwarding is also performed -as the local addresses are verified. -.pp -.i Sendmail -appends each address -to the recipient list after parsing. -When a name is aliased or forwarded, -the old name is retained in the list, -and a flag is set that tells the delivery phase -to ignore this recipient. -This list is kept free from duplicates, -preventing alias loops -and duplicate messages deliverd to the same recipient, -as might occur if a person is in two groups. -.sh 3 "Message collection" -.pp -.i Sendmail -then collects the message. -The message should have a header at the beginning. -No formatting requirements are imposed on the message -except that they must be lines of text -(i.e., binary data is not allowed). -The header is parsed and stored in memory, -and the body of the message is saved -in a temporary file. -.pp -To simplify the program interface, -the message is collected even if no addresses were valid. -The message will be returned with an error. -.sh 3 "Message delivery" -.pp -For each unique mailer and host in the recipient list, -.i sendmail -calls the appropriate mailer. -Each mailer invocation sends to all users receiving the message on one host. -Mailers that only accept one recipient at a time -are handled properly. -.pp -The message is sent to the mailer -using one of the same three interfaces -used to submit a message to sendmail. -Each copy of the message is -prepended by a customized header. -The mailer status code is caught and checked, -and a suitable error message given as appropriate. -The exit code must conform to a system standard -or a generic message -(\c -.q "Service unavailable" ) -is given. -.sh 3 "Queueing for retransmission" -.pp -If the mailer returned an status that -indicated that it might be able to handle the mail later, -.i sendmail -will queue the mail and try again later. -.sh 3 "Return to sender" -.pp -If errors occur during processing, -.i sendmail -returns the message to the sender for retransmission. -The letter can be mailed back -or written in the file -.q dead.letter -in the sender's home directory\**. -.(f -\**Obviously, if the site giving the error is not the originating -site, the only reasonable option is to mail back to the sender. -Also, there are many more error disposition options, -but they only effect the error message \*- the -.q "return to sender" -function is always handled in one of these two ways. -.)f -.sh 2 "Message Header Editing" -.pp -Certain editing of the message header -occurs automatically. -Header lines can be inserted -under control of the configuration file. -Some lines can be merged; -for example, -a -.q From: -line and a -.q Full-name: -line can be merged under certain circumstances. -.sh 2 "Configuration File" -.pp -Almost all configuration information is read at runtime -from an ASCII file, -encoding -macro definitions -(defining the value of macros used internally), -header declarations -(telling sendmail the format of header lines that it will process specially, -i.e., lines that it will add or reformat), -mailer definitions -(giving information such as the location and characteristics -of each mailer), -and address rewriting rules -(a limited production system to rewrite addresses -which is used to parse and rewrite the addresses). -.pp -To improve performance when reading the configuration file, -a memory image can be provided. -This provides a -.q compiled -form of the configuration file. -.sh 1 "USAGE AND IMPLEMENTATION" -.sh 2 "Arguments" -.pp -Arguments may be flags and addresses. -Flags set various processing options. -Following flag arguments, -address arguments may be given, -unless we are running in SMTP mode. -Addresses follow the syntax in RFC822 -[Crocker82] -for ARPANET -address formats. -In brief, the format is: -.np -Anything in parentheses is thrown away -(as a comment). -.np -Anything in angle brackets (\c -.q "<\|>" ) -is preferred -over anything else. -This rule implements the ARPANET standard that addresses of the form -.(b -user name <machine-address> -.)b -will send to the electronic -.q machine-address -rather than the human -.q "user name." -.np -Double quotes -(\ "\ ) -quote phrases; -backslashes quote characters. -Backslashes are more powerful -in that they will cause otherwise equivalent phrases -to compare differently \*- for example, -.i user -and -.i -"user" -.r -are equivalent, -but -.i \euser -is different from either of them. -.pp -Parentheses, angle brackets, and double quotes -must be properly balanced and nested. -The rewriting rules control remaining parsing\**. -.(f -\**Disclaimer: Some special processing is done -after rewriting local names; see below. -.)f -.sh 2 "Mail to Files and Programs" -.pp -Files and programs are legitimate message recipients. -Files provide archival storage of messages, -useful for project administration and history. -Programs are useful as recipients in a variety of situations, -for example, -to maintain a public repository of systems messages -(such as the Berkeley -.i msgs -program, -or the MARS system -[Sattley78]). -.pp -Any address passing through the initial parsing algorithm -as a local address -(i.e, not appearing to be a valid address for another mailer) -is scanned for two special cases. -If prefixed by a vertical bar (\c -.q \^|\^ ) -the rest of the address is processed as a shell command. -If the user name begins with a slash mark (\c -.q /\^ ) -the name is used as a file name, -instead of a login name. -.pp -Files that have setuid or setgid bits set -but no execute bits set -have those bits honored if -.i sendmail -is running as root. -.sh 2 "Aliasing, Forwarding, Inclusion" -.pp -.i Sendmail -reroutes mail three ways. -Aliasing applies system wide. -Forwarding allows each user to reroute incoming mail -destined for that account. -Inclusion directs -.i sendmail -to read a file for a list of addresses, -and is normally used -in conjunction with aliasing. -.sh 3 "Aliasing" -.pp -Aliasing maps names to address lists using a system-wide file. -This file is indexed to speed access. -Only names that parse as local -are allowed as aliases; -this guarantees a unique key -(since there are no nicknames for the local host). -.sh 3 "Forwarding" -.pp -After aliasing, -recipients that are local and valid -are checked for the existence of a -.q .forward -file in their home directory. -If it exists, -the message is -.i not -sent to that user, -but rather to the list of users in that file. -Often -this list will contain only one address, -and the feature will be used for network mail forwarding. -.pp -Forwarding also permits a user to specify a private incoming mailer. -For example, -forwarding to: -.(b -"\^|\|/usr/local/newmail myname" -.)b -will use a different incoming mailer. -.sh 3 "Inclusion" -.pp -Inclusion is specified in RFC 733 [Crocker77a] syntax: -.(b -:Include: pathname -.)b -An address of this form reads the file specified by -.i pathname -and sends to all users listed in that file. -.pp -The intent is -.i not -to support direct use of this feature, -but rather to use this as a subset of aliasing. -For example, -an alias of the form: -.(b -project: :include:/usr/project/userlist -.)b -is a method of letting a project maintain a mailing list -without interaction with the system administration, -even if the alias file is protected. -.pp -It is not necessary to rebuild the index on the alias database -when a :include: list is changed. -.sh 2 "Message Collection" -.pp -Once all recipient addresses are parsed and verified, -the message is collected. -The message comes in two parts: -a message header and a message body, -separated by a blank line. -.pp -The header is formatted as a series of lines -of the form -.(b - field-name: field-value -.)b -Field-value can be split across lines by starting the following -lines with a space or a tab. -Some header fields have special internal meaning, -and have appropriate special processing. -Other headers are simply passed through. -Some header fields may be added automatically, -such as time stamps. -.pp -The body is a series of text lines. -It is completely uninterpreted and untouched, -except that lines beginning with a dot -have the dot doubled -when transmitted over an SMTP channel. -This extra dot is stripped by the receiver. -.sh 2 "Message Delivery" -.pp -The send queue is ordered by receiving host -before transmission -to implement message batching. -Each address is marked as it is sent -so rescanning the list is safe. -An argument list is built as the scan proceeds. -Mail to files is detected during the scan of the send list. -The interface to the mailer -is performed using one of the techniques -described in section 2.2. -.pp -After a connection is established, -.i sendmail -makes the per-mailer changes to the header -and sends the result to the mailer. -If any mail is rejected by the mailer, -a flag is set to invoke the return-to-sender function -after all delivery completes. -.sh 2 "Queued Messages" -.pp -If the mailer returns a -.q "temporary failure" -exit status, -the message is queued. -A control file is used to describe the recipients to be sent to -and various other parameters. -This control file is formatted as a series of lines, -each describing a sender, -a recipient, -the time of submission, -or some other salient parameter of the message. -The header of the message is stored -in the control file, -so that the associated data file in the queue -is just the temporary file that was originally collected. -.sh 2 "Configuration" -.pp -Configuration is controlled primarily by a configuration file -read at startup. -.i Sendmail -should not need to be recomplied except -.np -To change operating systems -(V6, V7/32V, 4BSD). -.np -To remove or insert the DBM -(UNIX database) -library. -.np -To change ARPANET reply codes. -.np -To add headers fields requiring special processing. -.lp -Adding mailers or changing parsing -(i.e., rewriting) -or routing information -does not require recompilation. -.pp -If the mail is being sent by a local user, -and the file -.q .mailcf -exists in the sender's home directory, -that file is read as a configuration file -after the system configuration file. -The primary use of this feature is to add header lines. -.pp -The configuration file encodes macro definitions, -header definitions, -mailer definitions, -rewriting rules, -and options. -.sh 3 Macros -.pp -Macros can be used in three ways. -Certain macros transmit -unstructured textual information -into the mail system, -such as the name -.i sendmail -will use to identify itself in error messages. -Other macros transmit information from -.i sendmail -to the configuration file -for use in creating other fields -(such as argument vectors to mailers); -e.g., the name of the sender, -and the host and user -of the recipient. -Other macros are unused internally, -and can be used as shorthand in the configuration file. -.sh 3 "Header declarations" -.pp -Header declarations inform -.i sendmail -of the format of known header lines. -Knowledge of a few header lines -is built into -.i sendmail , -such as the -.q From: -and -.q Date: -lines. -.pp -Most configured headers -will be automatically inserted -in the outgoing message -if they don't exist in the incoming message. -Certain headers are suppressed by some mailers. -.sh 3 "Mailer declarations" -.pp -Mailer declarations tell -.i sendmail -of the various mailers available to it. -The definition specifies the internal name of the mailer, -the pathname of the program to call, -some flags associated with the mailer, -and an argument vector to be used on the call; -this vector is macro-expanded before use. -.sh 3 "Address rewriting rules" -.pp -The heart of address parsing in -.i sendmail -is a set of rewriting rules. -These are an ordered list of pattern-replacement rules, -(somewhat like a production system, -except that order is critical), -which are applied to each address. -The address is rewritten textually until it is either rewritten -into a special canonical form -(i.e., -a (mailer, host, user) -3-tuple, -such as {arpanet, usc-isif, postel} -representing the address -.q "postel@usc-isif" ), -or it falls off the end. -When a pattern matches, -the rule is reapplied until it fails. -.pp -The configuration file also supports the editing of addresses -into different formats. -For example, -an address of the form: -.(b -ucsfcgl!tef -.)b -might be mapped into: -.(b -tef@ucsfcgl.UUCP -.)b -to conform to the domain syntax. -Translations can also be done in the other direction. -.sh 3 "Option setting" -.pp -There are several options that can be set -from the configuration file. -These include the pathnames of various support files, -timeouts, -default modes, -etc. -.sh 1 "COMPARISON WITH OTHER MAILERS" -.sh 2 "Delivermail" -.pp -.i Sendmail -is an outgrowth of -.i delivermail . -The primary differences are: -.np -Configuration information is not compiled in. -This change simplifies many of the problems -of moving to other machines. -It also allows easy debugging of new mailers. -.np -Address parsing is more flexible. -For example, -.i delivermail -only supported one gateway to any network, -whereas -.i sendmail -can be sensitive to host names -and reroute to different gateways. -.np -Forwarding and -:include: -features eliminate the requirement that the system alias file -be writable by any user -(or that an update program be written, -or that the system administration make all changes). -.np -.i Sendmail -supports message batching across networks -when a message is being sent to multiple recipients. -.np -A mail queue is provided in -.i sendmail. -Mail that cannot be delivered immediately -but can potentially be delivered later -is stored in this queue for a later retry. -The queue also provides a buffer against system crashes; -after the message has been collected -it may be reliably redelivered -even if the system crashes during the initial delivery. -.np -.i Sendmail -uses the networking support provided by 4.2BSD -to provide a direct interface networks such as the ARPANET -and/or Ethernet -using SMTP (the Simple Mail Transfer Protocol) -over a TCP/IP connection. -.sh 2 "MMDF" -.pp -MMDF -[Crocker79] -spans a wider problem set than -.i sendmail . -For example, -the domain of -MMDF includes a -.q "phone network" -mailer, whereas -.i sendmail -calls on preexisting mailers in most cases. -.pp -MMDF and -.i sendmail -both support aliasing, -customized mailers, -message batching, -automatic forwarding to gateways, -queueing, -and retransmission. -MMDF supports two-stage timeout, -which -.i sendmail -does not support. -.pp -The configuration for MMDF -is compiled into the code\**. -.(f -\**Dynamic configuration tables are currently being considered -for MMDF; -allowing the installer to select either compiled -or dynamic tables. -.)f -.pp -Since MMDF does not consider backwards compatibility -as a design goal, -the address parsing is simpler but much less flexible. -.pp -It is somewhat harder to integrate a new channel\** -.(f -\**The MMDF equivalent of a -.i sendmail -.q mailer. -.)f -into MMDF. -In particular, -MMDF must know the location and format -of host tables for all channels, -and the channel must speak a special protocol. -This allows MMDF to do additional verification -(such as verifying host names) -at submission time. -.pp -MMDF strictly separates the submission and delivery phases. -Although -.i sendmail -has the concept of each of these stages, -they are integrated into one program, -whereas in MMDF they are split into two programs. -.sh 2 "Message Processing Module" -.pp -The Message Processing Module (MPM) -discussed by Postel [Postel79b] -matches -.i sendmail -closely in terms of its basic architecture. -However, -like MMDF, -the MPM includes the network interface software -as part of its domain. -.pp -MPM also postulates a duplex channel to the receiver, -as does MMDF, -thus allowing simpler handling of errors -by the mailer -than is possible in -.i sendmail . -When a message queued by -.i sendmail -is sent, -any errors must be returned to the sender -by the mailer itself. -Both MPM and MMDF mailers -can return an immediate error response, -and a single error processor can create an appropriate response. -.pp -MPM prefers passing the message as a structured object, -with type-length-value tuples\**. -.(f -\**This is similar to the NBS standard. -.)f -Such a convention requires a much higher degree of cooperation -between mailers than is required by -.i sendmail . -MPM also assumes a universally agreed upon internet name space -(with each address in the form of a net-host-user tuple), -which -.i sendmail -does not. -.sh 1 "EVALUATIONS AND FUTURE PLANS" -.pp -.i Sendmail -is designed to work in a nonhomogeneous environment. -Every attempt is made to avoid imposing unnecessary constraints -on the underlying mailers. -This goal has driven much of the design. -One of the major problems -has been the lack of a uniform address space, -as postulated in [Postel79a] -and [Postel79b]. -.pp -A nonuniform address space implies that a path will be specified -in all addresses, -either explicitly (as part of the address) -or implicitly -(as with implied forwarding to gateways). -This restriction has the unpleasant effect of making replying to messages -exceedingly difficult, -since there is no one -.q address -for any person, -but only a way to get there from wherever you are. -.pp -Interfacing to mail programs -that were not initially intended to be applied -in an internet environment -has been amazingly successful, -and has reduced the job to a manageable task. -.pp -.i Sendmail -has knowledge of a few difficult environments -built in. -It generates ARPANET FTP/SMTP compatible error messages -(prepended with three-digit numbers -[Neigus73, Postel74, Postel82]) -as necessary, -optionally generates UNIX-style -.q From -lines on the front of messages for some mailers, -and knows how to parse the same lines on input. -Also, -error handling has an option customized for BerkNet. -.pp -The decision to avoid doing any type of delivery where possible -(even, or perhaps especially, local delivery) -has turned out to be a good idea. -Even with local delivery, -there are issues of the location of the mailbox, -the format of the mailbox, -the locking protocol used, -etc., -that are best decided by other programs. -One surprisingly major annoyance in many internet mailers -is that the location and format of local mail is built in. -The feeling seems to be that local mail is so common -that it should be efficient. -This feeling is not born out by -our experience; -on the contrary, -the location and format of mailboxes seems to vary widely -from system to system. -.pp -The ability to automatically generate a response to incoming mail -(by forwarding mail to a program) -seems useful -(\c -.q "I am on vacation until late August...." ) -but can create problems -such as forwarding loops -(two people on vacation whose programs send notes back and forth, -for instance) -if these programs are not well written. -A program could be written to do standard tasks correctly, -but this would solve the general case. -.pp -It might be desirable to implement some form of load limiting. -I am unaware of any mail system that addresses this problem, -nor am I aware of any reasonable solution at this time. -.pp -The configuration file is currently practically inscrutable; -considerable convenience could be realized -with a higher-level format. -.pp -It seems clear that common protocols will be changing soon -to accommodate changing requirements and environments. -These changes will include modifications to the message header -(e.g., [NBS80]) -or to the body of the message itself -(such as for multimedia messages -[Postel80]). -Experience indicates that -these changes should be relatively trivial to integrate -into the existing system. -.pp -In tightly coupled environments, -it would be nice to have a name server -such as Grapvine -[Birrell82] -integrated into the mail system. -This would allow a site such as -.q Berkeley -to appear as a single host, -rather than as a collection of hosts, -and would allow people to move transparently among machines -without having to change their addresses. -Such a facility -would require an automatically updated database -and some method of resolving conflicts. -Ideally this would be effective even without -all hosts being under -a single management. -However, -it is not clear whether this feature -should be integrated into the -aliasing facility -or should be considered a -.q "value added" -feature outside -.i sendmail -itself. -.pp -As a more interesting case, -the CSNET name server -[Solomon81] -provides an facility that goes beyond a single -tightly-coupled environment. -Such a facility would normally exist outside of -.i sendmail -however. -.sh 0 "ACKNOWLEDGEMENTS" -.pp -Thanks are due to Kurt Shoens for his continual cheerful -assistance and good advice, -Bill Joy for pointing me in the correct direction -(over and over), -and Mark Horton for more advice, -prodding, -and many of the good ideas. -Kurt and Eric Schmidt are to be credited -for using -.i delivermail -as a server for their programs -(\c -.i Mail -and BerkNet respectively) -before any sane person should have, -and making the necessary modifications -promptly and happily. -Eric gave me considerable advice about the perils -of network software which saved me an unknown -amount of work and grief. -Mark did the original implementation of the DBM version -of aliasing, installed the VFORK code, -wrote the current version of -.i rmail , -and was the person who really convinced me -to put the work into -.i delivermail -to turn it into -.i sendmail . -Kurt deserves accolades for using -.i sendmail -when I was myself afraid to take the risk; -how a person can continue to be so enthusiastic -in the face of so much bitter reality is beyond me. -.pp -Kurt, -Mark, -Kirk McKusick, -Marvin Solomon, -and many others have reviewed this paper, -giving considerable useful advice. -.pp -Special thanks are reserved for Mike Stonebraker at Berkeley -and Bob Epstein at Britton-Lee, -who both knowingly allowed me to put so much work into this -project -when there were so many other things I really should -have been working on. -.+c -.ce -REFERENCES -.nr ii 1.5i -.ip [Birrell82] -Birrell, A. D., -Levin, R., -Needham, R. M., -and -Schroeder, M. D., -.q "Grapevine: An Exercise in Distributed Computing." -In -.ul -Comm. A.C.M. 25, -4, -April 82. -.ip [Borden79] -Borden, S., -Gaines, R. S., -and -Shapiro, N. Z., -.ul -The MH Message Handling System: Users' Manual. -R-2367-PAF. -Rand Corporation. -October 1979. -.ip [Crocker77a] -Crocker, D. H., -Vittal, J. J., -Pogran, K. T., -and -Henderson, D. A. Jr., -.ul -Standard for the Format of ARPA Network Text Messages. -RFC 733, -NIC 41952. -In [Feinler78]. -November 1977. -.ip [Crocker77b] -Crocker, D. H., -.ul -Framework and Functions of the MS Personal Message System. -R-2134-ARPA, -Rand Corporation, -Santa Monica, California. -1977. -.ip [Crocker79] -Crocker, D. H., -Szurkowski, E. S., -and -Farber, D. J., -.ul -An Internetwork Memo Distribution Facility \*- MMDF. -6th Data Communication Symposium, -Asilomar. -November 1979. -.ip [Crocker82] -Crocker, D. H., -.ul -Standard for the Format of Arpa Internet Text Messages. -RFC 822. -Network Information Center, -SRI International, -Menlo Park, California. -August 1982. -.ip [Metcalfe76] -Metcalfe, R., -and -Boggs, D., -.q "Ethernet: Distributed Packet Switching for Local Computer Networks" , -.ul -Communications of the ACM 19, -7. -July 1976. -.ip [Feinler78] -Feinler, E., -and -Postel, J. -(eds.), -.ul -ARPANET Protocol Handbook. -NIC 7104, -Network Information Center, -SRI International, -Menlo Park, California. -1978. -.ip [NBS80] -National Bureau of Standards, -.ul -Specification of a Draft Message Format Standard. -Report No. ICST/CBOS 80-2. -October 1980. -.ip [Neigus73] -Neigus, N., -.ul -File Transfer Protocol for the ARPA Network. -RFC 542, NIC 17759. -In [Feinler78]. -August, 1973. -.ip [Nowitz78a] -Nowitz, D. A., -and -Lesk, M. E., -.ul -A Dial-Up Network of UNIX Systems. -Bell Laboratories. -In -UNIX Programmer's Manual, Seventh Edition, -Volume 2. -August, 1978. -.ip [Nowitz78b] -Nowitz, D. A., -.ul -Uucp Implementation Description. -Bell Laboratories. -In -UNIX Programmer's Manual, Seventh Edition, -Volume 2. -October, 1978. -.ip [Postel74] -Postel, J., -and -Neigus, N., -Revised FTP Reply Codes. -RFC 640, NIC 30843. -In [Feinler78]. -June, 1974. -.ip [Postel77] -Postel, J., -.ul -Mail Protocol. -NIC 29588. -In [Feinler78]. -November 1977. -.ip [Postel79a] -Postel, J., -.ul -Internet Message Protocol. -RFC 753, -IEN 85. -Network Information Center, -SRI International, -Menlo Park, California. -March 1979. -.ip [Postel79b] -Postel, J. B., -.ul -An Internetwork Message Structure. -In -.ul -Proceedings of the Sixth Data Communications Symposium, -IEEE. -New York. -November 1979. -.ip [Postel80] -Postel, J. B., -.ul -A Structured Format for Transmission of Multi-Media Documents. -RFC 767. -Network Information Center, -SRI International, -Menlo Park, California. -August 1980. -.ip [Postel82] -Postel, J. B., -.ul -Simple Mail Transfer Protocol. -RFC821 -(obsoleting RFC788). -Network Information Center, -SRI International, -Menlo Park, California. -August 1982. -.ip [Schmidt79] -Schmidt, E., -.ul -An Introduction to the Berkeley Network. -University of California, Berkeley California. -1979. -.ip [Shoens79] -Shoens, K., -.ul -Mail Reference Manual. -University of California, Berkeley. -In UNIX Programmer's Manual, -Seventh Edition, -Volume 2C. -December 1979. -.ip [Sluizer81] -Sluizer, S., -and -Postel, J. B., -.ul -Mail Transfer Protocol. -RFC 780. -Network Information Center, -SRI International, -Menlo Park, California. -May 1981. -.ip [Solomon81] -Solomon, M., Landweber, L., and Neuhengen, D., -.q "The Design of the CSNET Name Server." -CS-DN-2, -University of Wisconsin, Madison. -November 1981. -.ip [Su82] -Su, Zaw-Sing, -and -Postel, Jon, -.ul -The Domain Naming Convention for Internet User Applications. -RFC819. -Network Information Center, -SRI International, -Menlo Park, California. -August 1982. -.ip [UNIX83] -.ul -The UNIX Programmer's Manual, Seventh Edition, -Virtual VAX-11 Version, -Volume 1. -Bell Laboratories, -modified by the University of California, -Berkeley, California. -March, 1983. diff --git a/doc/intro/intro.ps b/doc/intro/intro.ps deleted file mode 100644 index 62b686f..0000000 --- a/doc/intro/intro.ps +++ /dev/null @@ -1,1338 +0,0 @@ -%!PS-Adobe-3.0 -%%Creator: groff version 1.10 -%%CreationDate: Tue Dec 29 09:59:21 1998 -%%DocumentNeededResources: font Times-Roman -%%+ font Times-Italic -%%+ font Times-Bold -%%DocumentSuppliedResources: procset grops 1.10 0 -%%Pages: 13 -%%PageOrder: Ascend -%%Orientation: Portrait -%%EndComments -%%BeginProlog -%%BeginResource: procset grops 1.10 0 -/setpacking where{ -pop -currentpacking -true setpacking -}if -/grops 120 dict dup begin -/SC 32 def -/A/show load def -/B{0 SC 3 -1 roll widthshow}bind def -/C{0 exch ashow}bind def -/D{0 exch 0 SC 5 2 roll awidthshow}bind def -/E{0 rmoveto show}bind def -/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def -/G{0 rmoveto 0 exch ashow}bind def -/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/I{0 exch rmoveto show}bind def -/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def -/K{0 exch rmoveto 0 exch ashow}bind def -/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/M{rmoveto show}bind def -/N{rmoveto 0 SC 3 -1 roll widthshow}bind def -/O{rmoveto 0 exch ashow}bind def -/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/Q{moveto show}bind def -/R{moveto 0 SC 3 -1 roll widthshow}bind def -/S{moveto 0 exch ashow}bind def -/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/SF{ -findfont exch -[exch dup 0 exch 0 exch neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/MF{ -findfont -[5 2 roll -0 3 1 roll -neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/level0 0 def -/RES 0 def -/PL 0 def -/LS 0 def -/MANUAL{ -statusdict begin/manualfeed true store end -}bind def -/PLG{ -gsave newpath clippath pathbbox grestore -exch pop add exch pop -}bind def -/BP{ -/level0 save def -1 setlinecap -1 setlinejoin -72 RES div dup scale -LS{ -90 rotate -}{ -0 PL translate -}ifelse -1 -1 scale -}bind def -/EP{ -level0 restore -showpage -}bind def -/DA{ -newpath arcn stroke -}bind def -/SN{ -transform -.25 sub exch .25 sub exch -round .25 add exch round .25 add exch -itransform -}bind def -/DL{ -SN -moveto -SN -lineto stroke -}bind def -/DC{ -newpath 0 360 arc closepath -}bind def -/TM matrix def -/DE{ -TM currentmatrix pop -translate scale newpath 0 0 .5 0 360 arc closepath -TM setmatrix -}bind def -/RC/rcurveto load def -/RL/rlineto load def -/ST/stroke load def -/MT/moveto load def -/CL/closepath load def -/FL{ -currentgray exch setgray fill setgray -}bind def -/BL/fill load def -/LW/setlinewidth load def -/RE{ -findfont -dup maxlength 1 index/FontName known not{1 add}if dict begin -{ -1 index/FID ne{def}{pop pop}ifelse -}forall -/Encoding exch def -dup/FontName exch def -currentdict end definefont pop -}bind def -/DEFS 0 def -/EBEGIN{ -moveto -DEFS begin -}bind def -/EEND/end load def -/CNT 0 def -/level1 0 def -/PBEGIN{ -/level1 save def -translate -div 3 1 roll div exch scale -neg exch neg exch translate -0 setgray -0 setlinecap -1 setlinewidth -0 setlinejoin -10 setmiterlimit -[]0 setdash -/setstrokeadjust where{ -pop -false setstrokeadjust -}if -/setoverprint where{ -pop -false setoverprint -}if -newpath -/CNT countdictstack def -userdict begin -/showpage{}def -}bind def -/PEND{ -clear -countdictstack CNT sub{end}repeat -level1 restore -}bind def -end def -/setpacking where{ -pop -setpacking -}if -%%EndResource -%%IncludeResource: font Times-Roman -%%IncludeResource: font Times-Italic -%%IncludeResource: font Times-Bold -grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 -def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron -/scaron/zcaron/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent -/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen -/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon -/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O -/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex -/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y -/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft -/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl -/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut -/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash -/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen -/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft -/logicalnot/minus/registered/macron/degree/plusminus/twosuperior -/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior -/ordmasculine/guilsinglright/onequarter/onehalf/threequarters -/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE -/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex -/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis -/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn -/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla -/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis -/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash -/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def -/Times-Bold@0 ENC0/Times-Bold RE/Times-Italic@0 ENC0/Times-Italic RE -/Times-Roman@0 ENC0/Times-Roman RE -%%EndProlog -%%Page: 1 1 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 14/Times-Roman@0 SF(SENDMAIL \212 An Internetw)159.172 141 Q -(ork Mail Router)-.14 E/F1 10/Times-Roman@0 SF(Eric Allman*)260.92 165 Q -/F2 10/Times-Italic@0 SF(Univer)220.2 183 Q(sity of California, Berk)-.1 -E(ele)-.1 E(y)-.3 E(Mammoth Pr)251.98 195 Q(oject)-.45 E F1(ABSTRA) -262.085 227.4 Q(CT)-.4 E 1.41 -(Routing mail through a heterogenous internet presents man)112 243.6 R -3.91(yn)-.15 G 1.91 -.25(ew p)-3.91 H 3.91(roblems. Among).25 F .297 -(the w)112 255.6 R .297(orst of these is that of address mapping.)-.1 F -(Historically)5.297 E 2.797(,t)-.65 G .298(his has been handled on an) --2.797 F F2(ad hoc)112 267.6 Q F1 2.5(basis. Ho)2.5 F(we)-.25 E -.15(ve) --.25 G .8 -.4(r, t).15 H -(his approach has become unmanageable as internets gro).4 E -.65(w.)-.25 -G .15(Sendmail acts a uni\214ed "post of)112 283.8 R .15 -(\214ce" to which all mail can be submitted.)-.25 F .15(Address inter) -5.15 F(-)-.2 E .426(pretation is controlled by a production system, which can parse both domain-based ad-) -112 295.8 R .423(dressing and old-style)112 307.8 R F2 .423(ad hoc)2.923 -F F1 2.923(addresses. The)2.923 F .422(production system is po)2.922 F -.422(werful enough to)-.25 F(re)112 319.8 Q 1.357(write addresses in the message header to conform to the standards of a number of) --.25 F 1.15(common tar)112 331.8 R 1.15(get netw)-.18 F 1.15 -(orks, including old \(NCP/RFC733\) Arpanet, ne)-.1 F 3.65(w\()-.25 G -(TCP/RFC822\))-3.65 E 1.119(Arpanet, UUCP)112 343.8 R 3.619(,a)-1.11 G -1.119(nd Phonenet.)-3.619 F 1.119(Sendmail also implements an SMTP serv) -6.119 F(er)-.15 E 3.619(,m)-.4 G(essage)-3.619 E -(queueing, and aliasing.)112 355.8 Q F2(Sendmail)97 400.2 Q F1 .501 -(implements a general internetw)3 F .501(ork mail routing f)-.1 F -(acility)-.1 E 3.001(,f)-.65 G .501(eaturing aliasing and forw)-3.001 F -(arding,)-.1 E(automatic routing to netw)72 412.2 Q(ork g)-.1 E(ate)-.05 -E -.1(wa)-.25 G(ys, and \215e).1 E(xible con\214guration.)-.15 E .624 -(In a simple netw)97 428.4 R .624(ork, each node has an address, and resources can be identi\214ed with a host-resource) --.1 F .374(pair; in particular)72 440.4 R 2.874(,t)-.4 G .374 -(he mail system can refer to users using a host-username pair)-2.874 F -5.374(.H)-.55 G .375(ost names and numbers)-5.374 F(ha)72 452.4 Q .3 --.15(ve t)-.2 H 2.5(ob).15 G 2.5(ea)-2.5 G -(dministered by a central authority)-2.5 E 2.5(,b)-.65 G -(ut usernames can be assigned locally to each host.)-2.7 E .649 -(In an internet, multiple netw)97 468.6 R .649(orks with dif)-.1 F .649 -(ferent characterstics and managements must communicate.)-.25 F .389 -(In particular)72 480.6 R 2.889(,t)-.4 G .389 -(he syntax and semantics of resource identi\214cation change.)-2.889 F -.39(Certain special cases can be han-)5.389 F 1.033(dled tri)72 492.6 R -1.033(vially by)-.25 F F2 1.033(ad hoc)3.533 F F1 1.032 -(techniques, such as pro)3.533 F 1.032(viding netw)-.15 F 1.032 -(ork names that appear local to hosts on other)-.1 F(netw)72 504.6 Q -1.454(orks, as with the Ethernet at Xerox P)-.1 F 3.955(ARC. Ho)-.92 F -(we)-.25 E -.15(ve)-.25 G 4.755 -.4(r, t).15 H 1.455 -(he general case is e).4 F 1.455(xtremely comple)-.15 F 3.955(x. F)-.15 -F(or)-.15 E -.15(ex)72 516.6 S .192(ample, some netw).15 F .192(orks require point-to-point routing, which simpli\214es the database update problem since) --.1 F .618(only adjacent hosts must be entered into the system tables, while others use end-to-end addressing.) -72 528.6 R(Some)5.618 E(netw)72 540.6 Q .123(orks use a left-associati) --.1 F .423 -.15(ve s)-.25 H .123(yntax and others use a right-associati) -.15 F .423 -.15(ve s)-.25 H .123(yntax, causing ambiguity in mix).15 F -(ed)-.15 E(addresses.)72 552.6 Q .678 -(Internet standards seek to eliminate these problems.)97 568.8 R -(Initially)5.678 E 3.178(,t)-.65 G .679(hese proposed e)-3.178 F .679 -(xpanding the address)-.15 F .65 -(pairs to address triples, consisting of {netw)72 580.8 R .649 -(ork, host, resource} triples.)-.1 F(Netw)5.649 E .649 -(ork numbers must be uni)-.1 F -.15(ve)-.25 G -.2(r-).15 G 1.452 -(sally agreed upon, and hosts can be assigned locally on each netw)72 -592.8 R 3.952(ork. The)-.1 F(user)3.952 E(-le)-.2 E -.15(ve)-.25 G 3.952 -(lp).15 G 1.452(resentation w)-3.952 F(as)-.1 E 2.352(quickly e)72 604.8 -R 2.352(xpanded to address domains, comprised of a local resource identi\214cation and a hierarchical) --.15 F .256(domain speci\214cation with a common static root.)72 616.8 R -.257(The domain technique separates the issue of ph)5.257 F .257 -(ysical v)-.05 F(er)-.15 E(-)-.2 E .807(sus logical addressing.)72 628.8 -R -.15(Fo)5.807 G 3.307(re).15 G .807 -(xample, an address of the form \231eric@a.cc.berk)-3.457 F(ele)-.1 E --.65(y.)-.15 G .807(arpa\232 describes only the).65 F(logical or)72 -640.8 Q -.05(ga)-.18 G(nization of the address space.).05 E F2(Sendmail) -97 657 Q F1 .493(is intended to help bridge the g)2.992 F .493 -(ap between the totally)-.05 F F2 .493(ad hoc)2.993 F F1 -.1(wo)2.993 G -.493(rld of netw).1 F .493(orks that kno)-.1 F(w)-.25 E .855 -(nothing of each other and the clean, tightly-coupled w)72 669 R .854 -(orld of unique netw)-.1 F .854(ork numbers.)-.1 F .854 -(It can accept old)5.854 F .32 LW 76 678.6 72 678.6 DL 80 678.6 76 678.6 -DL 84 678.6 80 678.6 DL 88 678.6 84 678.6 DL 92 678.6 88 678.6 DL 96 -678.6 92 678.6 DL 100 678.6 96 678.6 DL 104 678.6 100 678.6 DL 108 678.6 -104 678.6 DL 112 678.6 108 678.6 DL 116 678.6 112 678.6 DL 120 678.6 116 -678.6 DL 124 678.6 120 678.6 DL 128 678.6 124 678.6 DL 132 678.6 128 -678.6 DL 136 678.6 132 678.6 DL 140 678.6 136 678.6 DL 144 678.6 140 -678.6 DL 148 678.6 144 678.6 DL 152 678.6 148 678.6 DL 156 678.6 152 -678.6 DL 160 678.6 156 678.6 DL 164 678.6 160 678.6 DL 168 678.6 164 -678.6 DL 172 678.6 168 678.6 DL 176 678.6 172 678.6 DL 180 678.6 176 -678.6 DL 184 678.6 180 678.6 DL 188 678.6 184 678.6 DL 192 678.6 188 -678.6 DL 196 678.6 192 678.6 DL 200 678.6 196 678.6 DL 204 678.6 200 -678.6 DL 208 678.6 204 678.6 DL 212 678.6 208 678.6 DL 216 678.6 212 -678.6 DL/F3 8/Times-Roman@0 SF .557(*A considerable part of this w)93.6 -690.6 R .557(ork w)-.08 F .557(as done while under the emplo)-.08 F -2.557(yo)-.08 G 2.556(ft)-2.557 G .556(he INGRES Project at the Uni) --2.556 F -.12(ve)-.2 G .556(rsity of California at).12 F(Berk)72 700.2 Q -(ele)-.08 E 2(ya)-.12 G(nd at Britton Lee.)-2 E/F4 10/Times-Bold@0 SF -(SENDMAIL \212 An Inter)72 756 Q(netw)-.15 E(ork Mail Router)-.1 E -(SMM:9-1)194.78 E EP -%%Page: 2 2 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 192.28(SMM:9-2 SENDMAIL)72 60 R 2.5<8a41>2.5 G -2.5(nI)-2.5 G(nter)-2.5 E(netw)-.15 E(ork Mail Router)-.1 E/F1 10 -/Times-Roman@0 SF .632(arbitrary address syntax)72 96 R .633(es, resolving ambiguities using heuristics speci\214ed by the system administrator) --.15 F 3.133(,a)-.4 G(s)-3.133 E .348(well as domain-based addressing.) -72 108 R .347(It helps guide the con)5.347 F -.15(ve)-.4 G .347 -(rsion of message formats between disparate net-).15 F -.1(wo)72 120 S -3.394(rks. In).1 F(short,)3.394 E/F2 10/Times-Italic@0 SF(sendmail)3.394 -E F1 .894 -(is designed to assist a graceful transition to consistent internetw) -3.394 F .895(ork addressing)-.1 F(schemes.)72 132 Q .153 -(Section 1 discusses the design goals for)97 160.2 R F2(sendmail)2.653 E -F1 5.153(.S)C .152(ection 2 gi)-5.153 F -.15(ve)-.25 G 2.652(sa).15 G -2.652(no)-2.652 G -.15(ve)-2.802 G(rvie).15 E 2.652(wo)-.25 G 2.652(ft) --2.652 G .152(he basic functions)-2.652 F .644(of the system.)72 172.2 R -.644(In section 3, details of usage are discussed.)5.644 F .644 -(Section 4 compares)5.644 F F2(sendmail)3.144 E F1 .645 -(to other internet)3.144 F(mail routers, and an e)72 184.2 Q -.25(va) --.25 G(luation of).25 E F2(sendmail)2.5 E F1(is gi)2.5 E -.15(ve)-.25 G -2.5(ni).15 G 2.5(ns)-2.5 G(ection 5, including future plans.)-2.5 E F0 -2.5(1. DESIGN)72 208.2 R(GO)2.5 E(ALS)-.4 E F1(Design goals for)112 -224.4 Q F2(sendmail)2.5 E F1(include:)2.5 E 12.5(\(1\) Compatibility)92 -240.6 R 1.363(with the e)3.864 F 1.363 -(xisting mail programs, including Bell v)-.15 F 1.363 -(ersion 6 mail, Bell v)-.15 F 1.363(ersion 7)-.15 F 1.202 -(mail [UNIX83], Berk)118.66 252.6 R(ele)-.1 E(y)-.15 E F2(Mail)3.702 E -F1 1.202([Shoens79], BerkNet mail [Schmidt79], and hopefully UUCP)3.702 -F(mail [No)118.66 264.6 Q(witz78a, No)-.25 E 2.5(witz78b]. ARP)-.25 F -(ANET mail [Crock)-.92 E(er77a, Postel77] w)-.1 E(as also required.)-.1 -E 12.5(\(2\) Reliability)92 280.8 R 4.003(,i)-.65 G 4.003(nt)-4.003 G -1.502(he sense of guaranteeing that e)-4.003 F -.15(ve)-.25 G 1.502 -(ry message is correctly deli).15 F -.15(ve)-.25 G 1.502 -(red or at least).15 F .368(brought to the attention of a human for correct disposal; no message should e) -118.66 292.8 R -.15(ve)-.25 G 2.868(rb).15 G 2.868(ec)-2.868 G -(ompletely)-2.868 E 2.541(lost. This)118.66 304.8 R .041(goal w)2.541 F -.041(as considered essential because of the emphasis on mail in our en) --.1 F 2.54(vironment. It)-.4 F 1.754 -(has turned out to be one of the hardest goals to satisfy)118.66 316.8 R -4.255(,e)-.65 G 1.755(specially in the f)-4.255 F 1.755(ace of the man) --.1 F(y)-.15 E .978(anomalous message formats produced by v)118.66 328.8 -R .977(arious ARP)-.25 F .977(ANET sites.)-.92 F -.15(Fo)5.977 G 3.477 -(re).15 G .977(xample, certain sites)-3.627 F .069 -(generate improperly formated addresses, occasionally causing error) -118.66 340.8 R .069(-message loops.)-.2 F .069(Some hosts)5.069 F .063(use blanks in names, causing problems with UNIX mail programs that assume that an address is) -118.66 352.8 R .111(one w)118.66 364.8 R 2.611(ord. The)-.1 F .111 -(semantics of some \214elds are interpreted slightly dif)2.611 F .112 -(ferently by dif)-.25 F .112(ferent sites.)-.25 F(In)5.112 E(summary) -118.66 376.8 Q 3.023(,t)-.65 G .523(he obscure features of the ARP) --3.023 F .523(ANET mail protocol really)-.92 F F2(ar)3.023 E(e)-.37 E F1 -.522(used and are dif)3.023 F(\214cult)-.25 E(to support, b)118.66 388.8 -Q(ut must be supported.)-.2 E 12.5(\(3\) Existing)92 405 R(softw)2.938 E -.438(are to do actual deli)-.1 F -.15(ve)-.25 G .439 -(ry should be used whene).15 F -.15(ve)-.25 G 2.939(rp).15 G 2.939 -(ossible. This)-2.939 F .439(goal deri)2.939 F -.15(ve)-.25 G 2.939(sa) -.15 G(s)-2.939 E -(much from political and practical considerations as technical.)118.66 -417 Q 12.5(\(4\) Easy)92 433.2 R -.15(ex)2.899 G .399(pansion to f).15 F -.399(airly comple)-.1 F 2.898(xe)-.15 G -.4(nv)-2.898 G .398 -(ironments, including multiple connections to a single net-).4 F -.1(wo) -118.66 445.2 S .115 -(rk type \(such as with multiple UUCP or Ether nets [Metcalfe76]\).).1 F -.115(This goal requires consid-)5.115 F .587(eration of the contents of an address as well as its syntax in order to determine which g) -118.66 457.2 R(ate)-.05 E -.1(wa)-.25 G(y).1 E 1.018(to use.)118.66 -469.2 R -.15(Fo)6.018 G 3.518(re).15 G 1.018(xample, the ARP)-3.668 F -1.019(ANET is bringing up the TCP protocol to replace the old NCP)-.92 F -4.791(protocol. No)118.66 481.2 R 2.291(host at Berk)4.791 F(ele)-.1 E -4.791(yr)-.15 G 2.291(uns both TCP and NCP)-4.791 F 4.791(,s)-1.11 G -4.79(oi)-4.791 G 4.79(ti)-4.79 G 4.79(sn)-4.79 G 2.29 -(ecessary to look at the)-4.79 F(ARP)118.66 493.2 Q .016 -(ANET host name to determine whether to route mail to an NCP g)-.92 F -(ate)-.05 E -.1(wa)-.25 G 2.517(yo).1 G 2.517(raT)-2.517 G .017(CP g) --2.517 F(ate)-.05 E -.1(wa)-.25 G -.65(y.).1 G 12.5 -(\(5\) Con\214guration)92 509.4 R .145 -(should not be compiled into the code.)2.645 F 2.645(As)5.145 G .145 -(ingle compiled program should be able)-2.645 F .91(to run as is at an) -118.66 521.4 R 3.41(ys)-.15 G .91(ite \(barring such basic changes as the CPU type or the operating system\).) --3.41 F 2.61 -.8(We h)118.66 533.4 T -2.25 -.2(av e).8 H 1.009 -(found this seemingly unimportant goal to be critical in real life.)3.71 -F 1.009(Besides the simple)6.009 F .66(problems that occur when an) -118.66 545.4 R 3.16(yp)-.15 G .66(rogram gets recompiled in a dif)-3.16 -F .66(ferent en)-.25 F .66(vironment, man)-.4 F 3.16(ys)-.15 G(ites) --3.16 E(lik)118.66 557.4 Q 2.5(et)-.1 G 2.5<6f99>-2.5 G -(\214ddle\232 with an)-2.5 E(ything that the)-.15 E 2.5(yw)-.15 G -(ill be recompiling an)-2.5 E(yw)-.15 E(ay)-.1 E(.)-.65 E(\(6\))92 573.6 -Q F2(Sendmail)15 E F1 .184(must be able to let v)2.684 F .184 -(arious groups maintain their o)-.25 F .184 -(wn mailing lists, and let indi)-.25 F(viduals)-.25 E(specify their o) -118.66 585.6 Q(wn forw)-.25 E -(arding, without modifying the system alias \214le.)-.1 E 12.5 -(\(7\) Each)92 601.8 R .313 -(user should be able to specify which mailer to e)2.813 F -.15(xe)-.15 G -.313(cute to process mail being deli).15 F -.15(ve)-.25 G .314(red for) -.15 F 3.098(him. This)118.66 613.8 R .598(feature allo)3.098 F .598 -(ws users who are using specialized mailers that use a dif)-.25 F .598 -(ferent format to)-.25 F -.2(bu)118.66 625.8 S .25(ild their en).2 F .25 -(vironment without changing the system, and f)-.4 F .25 -(acilitates specialized functions \(such)-.1 F -(as returning an \231I am on v)118.66 637.8 Q(acation\232 message\).) --.25 E 12.5(\(8\) Netw)92 654 R 1.553(ork traf)-.1 F 1.552(\214c should be minimized by batching addresses to a single host where possible,) --.25 F(without assistance from the user)118.66 666 Q(.)-.55 E .374 -(These goals moti)112 682.2 R -.25(va)-.25 G .374 -(ted the architecture illustrated in \214gure 1.).25 F .375 -(The user interacts with a mail gen-)5.375 F .491 -(erating and sending program.)87 694.2 R .491 -(When the mail is created, the generator calls)5.491 F F2(sendmail)2.99 -E F1 2.99(,w)C .49(hich routes the)-2.99 F .84 -(message to the correct mailer\(s\).)87 706.2 R .841 -(Since some of the senders may be netw)5.84 F .841(ork serv)-.1 F .841 -(ers and some of the)-.15 F(mailers may be netw)87 718.2 Q(ork clients,) --.1 E F2(sendmail)2.5 E F1(may be used as an internet mail g)2.5 E(ate) --.05 E -.1(wa)-.25 G -.65(y.).1 G EP -%%Page: 3 3 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(SENDMAIL \212 An Inter)72 60 Q(netw)-.15 E -(ork Mail Router)-.1 E(SMM:9-3)194.78 E .4 LW 77 108 72 108 DL 79 108 74 -108 DL 84 108 79 108 DL 89 108 84 108 DL 94 108 89 108 DL 99 108 94 108 -DL 104 108 99 108 DL 109 108 104 108 DL 114 108 109 108 DL 119 108 114 -108 DL 124 108 119 108 DL 129 108 124 108 DL 134 108 129 108 DL 139 108 -134 108 DL 144 108 139 108 DL 149 108 144 108 DL 154 108 149 108 DL 159 -108 154 108 DL 164 108 159 108 DL 169 108 164 108 DL 174 108 169 108 DL -179 108 174 108 DL 184 108 179 108 DL 189 108 184 108 DL 194 108 189 108 -DL 199 108 194 108 DL 204 108 199 108 DL 209 108 204 108 DL 214 108 209 -108 DL 219 108 214 108 DL 224 108 219 108 DL 229 108 224 108 DL 234 108 -229 108 DL 239 108 234 108 DL 244 108 239 108 DL 249 108 244 108 DL 254 -108 249 108 DL 259 108 254 108 DL 264 108 259 108 DL 269 108 264 108 DL -274 108 269 108 DL 279 108 274 108 DL 284 108 279 108 DL 289 108 284 108 -DL 294 108 289 108 DL 299 108 294 108 DL 304 108 299 108 DL 309 108 304 -108 DL 314 108 309 108 DL 319 108 314 108 DL 324 108 319 108 DL 329 108 -324 108 DL 334 108 329 108 DL 339 108 334 108 DL 344 108 339 108 DL 349 -108 344 108 DL 354 108 349 108 DL 359 108 354 108 DL 364 108 359 108 DL -369 108 364 108 DL 374 108 369 108 DL 379 108 374 108 DL 384 108 379 108 -DL 389 108 384 108 DL 394 108 389 108 DL 399 108 394 108 DL 404 108 399 -108 DL 409 108 404 108 DL 414 108 409 108 DL 419 108 414 108 DL 424 108 -419 108 DL 429 108 424 108 DL 434 108 429 108 DL 439 108 434 108 DL 444 -108 439 108 DL 449 108 444 108 DL 454 108 449 108 DL 459 108 454 108 DL -464 108 459 108 DL 469 108 464 108 DL 474 108 469 108 DL 479 108 474 108 -DL 484 108 479 108 DL 489 108 484 108 DL 494 108 489 108 DL 499 108 494 -108 DL 504 108 499 108 DL 216 171.6 MT 0 -36 RL -72 0 RL 0 36 RL CL ST -/F1 10/Times-Roman@0 SF(sender1)164.45 155.8 Q 324 171.6 MT 0 -36 RL -72 -0 RL 0 36 RL CL ST(sender2)272.45 155.8 Q 432 171.6 MT 0 -36 RL -72 0 RL -0 36 RL CL ST(sender3)380.45 155.8 Q 288 207.6 288 171.6 DL 288 207.6 MT --1.8 -7.2 RL 3.6 0 RL CL BL 288 207.6 MT -1.8 -7.2 RL 3.6 0 RL CL ST 360 -243.6 MT 0 -36 RL -144 0 RL 0 36 RL CL ST(sendmail)269.945 227.8 Q 288 -279.6 288 243.6 DL 288 279.6 MT -1.8 -7.2 RL 3.6 0 RL CL BL 288 279.6 MT --1.8 -7.2 RL 3.6 0 RL CL ST 216 315.6 MT 0 -36 RL -72 0 RL 0 36 RL CL ST -(mailer1)164.725 299.8 Q 324 315.6 MT 0 -36 RL -72 0 RL 0 36 RL CL ST -(mailer2)272.725 299.8 Q 432 315.6 MT 0 -36 RL -72 0 RL 0 36 RL CL ST -(mailer3)380.725 299.8 Q 252 207.6 180 171.6 DL 252 207.6 MT -7.272 --1.584 RL 1.584 -3.24 RL CL BL 252 207.6 MT -7.272 -1.584 RL 1.584 -3.24 -RL CL ST 324 207.6 396 171.6 DL 324 207.6 MT 5.616 -4.824 RL 1.584 3.24 -RL CL BL 324 207.6 MT 5.616 -4.824 RL 1.584 3.24 RL CL ST 180 279.6 252 -243.6 DL 180 279.6 MT 5.616 -4.824 RL 1.584 3.24 RL CL BL 180 279.6 MT -5.616 -4.824 RL 1.584 3.24 RL CL ST 396 279.6 324 243.6 DL 396 279.6 MT --7.272 -1.584 RL 1.584 -3.24 RL CL BL 396 279.6 MT -7.272 -1.584 RL -1.584 -3.24 RL CL ST(Figure 1 \212 Sendmail System Structure.)208 346.8 -Q 77 358.8 72 358.8 DL 79 358.8 74 358.8 DL 84 358.8 79 358.8 DL 89 -358.8 84 358.8 DL 94 358.8 89 358.8 DL 99 358.8 94 358.8 DL 104 358.8 99 -358.8 DL 109 358.8 104 358.8 DL 114 358.8 109 358.8 DL 119 358.8 114 -358.8 DL 124 358.8 119 358.8 DL 129 358.8 124 358.8 DL 134 358.8 129 -358.8 DL 139 358.8 134 358.8 DL 144 358.8 139 358.8 DL 149 358.8 144 -358.8 DL 154 358.8 149 358.8 DL 159 358.8 154 358.8 DL 164 358.8 159 -358.8 DL 169 358.8 164 358.8 DL 174 358.8 169 358.8 DL 179 358.8 174 -358.8 DL 184 358.8 179 358.8 DL 189 358.8 184 358.8 DL 194 358.8 189 -358.8 DL 199 358.8 194 358.8 DL 204 358.8 199 358.8 DL 209 358.8 204 -358.8 DL 214 358.8 209 358.8 DL 219 358.8 214 358.8 DL 224 358.8 219 -358.8 DL 229 358.8 224 358.8 DL 234 358.8 229 358.8 DL 239 358.8 234 -358.8 DL 244 358.8 239 358.8 DL 249 358.8 244 358.8 DL 254 358.8 249 -358.8 DL 259 358.8 254 358.8 DL 264 358.8 259 358.8 DL 269 358.8 264 -358.8 DL 274 358.8 269 358.8 DL 279 358.8 274 358.8 DL 284 358.8 279 -358.8 DL 289 358.8 284 358.8 DL 294 358.8 289 358.8 DL 299 358.8 294 -358.8 DL 304 358.8 299 358.8 DL 309 358.8 304 358.8 DL 314 358.8 309 -358.8 DL 319 358.8 314 358.8 DL 324 358.8 319 358.8 DL 329 358.8 324 -358.8 DL 334 358.8 329 358.8 DL 339 358.8 334 358.8 DL 344 358.8 339 -358.8 DL 349 358.8 344 358.8 DL 354 358.8 349 358.8 DL 359 358.8 354 -358.8 DL 364 358.8 359 358.8 DL 369 358.8 364 358.8 DL 374 358.8 369 -358.8 DL 379 358.8 374 358.8 DL 384 358.8 379 358.8 DL 389 358.8 384 -358.8 DL 394 358.8 389 358.8 DL 399 358.8 394 358.8 DL 404 358.8 399 -358.8 DL 409 358.8 404 358.8 DL 414 358.8 409 358.8 DL 419 358.8 414 -358.8 DL 424 358.8 419 358.8 DL 429 358.8 424 358.8 DL 434 358.8 429 -358.8 DL 439 358.8 434 358.8 DL 444 358.8 439 358.8 DL 449 358.8 444 -358.8 DL 454 358.8 449 358.8 DL 459 358.8 454 358.8 DL 464 358.8 459 -358.8 DL 469 358.8 464 358.8 DL 474 358.8 469 358.8 DL 479 358.8 474 -358.8 DL 484 358.8 479 358.8 DL 489 358.8 484 358.8 DL 494 358.8 489 -358.8 DL 499 358.8 494 358.8 DL 504 358.8 499 358.8 DL F0 2.5(2. O)72 -394.8 R(VER)-.5 E(VIEW)-.55 E 2.5(2.1. System)87 418.8 R(Or)2.5 E -(ganization)-.1 E/F2 10/Times-Italic@0 SF(Sendmail)127 435 Q F1 .874 -(neither interf)3.374 F .874 -(aces with the user nor does actual mail deli)-.1 F -.15(ve)-.25 G(ry) -.15 E 5.873(.R)-.65 G(ather)-5.873 E 3.373(,i)-.4 G 3.373(tc)-3.373 G -.873(ollects a)-3.373 F .619(message generated by a user interf)102 447 -R .619(ace program \(UIP\) such as Berk)-.1 F(ele)-.1 E(y)-.15 E F2 -(Mail)3.12 E F1 3.12(,M)C 3.12(S[)-3.12 G(Crock)-3.12 E .62(er77b], or) --.1 F 1.428 -(MH [Borden79], edits the message as required by the destination netw) -102 459 R 1.427(ork, and calls appropriate)-.1 F .28 -(mailers to do mail deli)102 473 R -.15(ve)-.25 G .281 -(ry or queueing for netw).15 F .281(ork transmission)-.1 F/F3 7 -/Times-Roman@0 SF(1)-4 I F1 5.281(.T)4 K .281(his discipline allo)-5.281 -F .281(ws the inser)-.25 F(-)-.2 E 1.354(tion of ne)102 485 R 3.854(wm) --.25 G 1.354(ailers at minimum cost.)-3.854 F 1.354(In this sense)6.354 -F F2(sendmail)3.853 E F1 1.353(resembles the Message Processing)3.853 F -(Module \(MPM\) of [Postel79b].)102 497 Q F0 2.5(2.2. Interfaces)87 521 -R(to the Outside W)2.5 E(orld)-.75 E F1 .041(There are three w)127 537.2 -R(ays)-.1 E F2(sendmail)2.541 E F1 .041 -(can communicate with the outside w)2.541 F .042(orld, both in recei)-.1 -F .042(ving and)-.25 F 1.195(in sending mail.)102 549.2 R 1.194 -(These are using the con)6.194 F -.15(ve)-.4 G 1.194(ntional UNIX ar).15 -F 1.194(gument v)-.18 F 1.194(ector/return status, speaking)-.15 F -(SMTP o)102 561.2 Q -.15(ve)-.15 G 2.5(rap).15 G -(air of UNIX pipes, and speaking SMTP o)-2.5 E -.15(ve)-.15 G 2.5(ra).15 -G 2.5(ni)-2.5 G(nterprocess\(or\) channel.)-2.5 E F0 2.5(2.2.1. Ar)102 -585.2 R(gument v)-.1 E(ector/exit status)-.1 E F1 .52(This technique is the standard UNIX method for communicating with the process.) -142 601.4 R 3.02(Al)5.52 G(ist)-3.02 E .442 -(of recipients is sent in the ar)117 613.4 R .441(gument v)-.18 F(ector) --.15 E 2.941(,a)-.4 G .441 -(nd the message body is sent on the standard input.)-2.941 F(An)117 -625.4 Q .351(ything that the mailer prints is simply collected and sent back to the sender if there were an) --.15 F(y)-.15 E 2.621(problems. The)117 637.4 R -.15(ex)2.621 G .121(it status from the mailer is collected after the message is sent, and a diagnostic) -.15 F(is printed if appropriate.)117 649.4 Q .32 LW 76 678.8 72 678.8 DL -80 678.8 76 678.8 DL 84 678.8 80 678.8 DL 88 678.8 84 678.8 DL 92 678.8 -88 678.8 DL 96 678.8 92 678.8 DL 100 678.8 96 678.8 DL 104 678.8 100 -678.8 DL 108 678.8 104 678.8 DL 112 678.8 108 678.8 DL 116 678.8 112 -678.8 DL 120 678.8 116 678.8 DL 124 678.8 120 678.8 DL 128 678.8 124 -678.8 DL 132 678.8 128 678.8 DL 136 678.8 132 678.8 DL 140 678.8 136 -678.8 DL 144 678.8 140 678.8 DL 148 678.8 144 678.8 DL 152 678.8 148 -678.8 DL 156 678.8 152 678.8 DL 160 678.8 156 678.8 DL 164 678.8 160 -678.8 DL 168 678.8 164 678.8 DL 172 678.8 168 678.8 DL 176 678.8 172 -678.8 DL 180 678.8 176 678.8 DL 184 678.8 180 678.8 DL 188 678.8 184 -678.8 DL 192 678.8 188 678.8 DL 196 678.8 192 678.8 DL 200 678.8 196 -678.8 DL 204 678.8 200 678.8 DL 208 678.8 204 678.8 DL 212 678.8 208 -678.8 DL 216 678.8 212 678.8 DL/F4 5/Times-Roman@0 SF(1)93.6 689.2 Q/F5 -8/Times-Roman@0 SF -.12(ex)3.2 K(cept when mailing to a \214le, when).12 -E/F6 8/Times-Italic@0 SF(sendmail)2 E F5(does the deli)2 E -.12(ve)-.2 G -(ry directly).12 E(.)-.52 E EP -%%Page: 4 4 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 192.28(SMM:9-4 SENDMAIL)72 60 R 2.5<8a41>2.5 G -2.5(nI)-2.5 G(nter)-2.5 E(netw)-.15 E(ork Mail Router)-.1 E 2.5 -(2.2.2. SMTP)102 96 R -.1(ove)2.5 G 2.5(rp).1 G(ipes)-2.5 E/F1 10 -/Times-Roman@0 SF .774 -(The SMTP protocol [Postel82] can be used to run an interacti)142 112.2 -R 1.074 -.15(ve l)-.25 H .774(ock-step interf).15 F .774(ace with)-.1 F -.507(the mailer)117 124.2 R 5.507(.A)-.55 G .506 -(subprocess is still created, b)-2.5 F .506 -(ut no recipient addresses are passed to the mailer via)-.2 F .075 -(the ar)117 136.2 R .075(gument list.)-.18 F .075(Instead, the)5.075 F -2.575(ya)-.15 G .075 -(re passed one at a time in commands sent to the processes stan-)-2.575 -F .19(dard input.)117 148.2 R(An)5.19 E .19(ything appearing on the standard output must be a reply code in a special format.) --.15 F F0 2.5(2.2.3. SMTP)102 172.2 R -.1(ove)2.5 G 2.5(ra).1 G 2.5(nI) --2.5 G(PC connection)-2.5 E F1 .366 -(This technique is similar to the pre)142 188.4 R .366 -(vious technique, e)-.25 F .366(xcept that it uses a 4.2bsd IPC chan-) --.15 F .953(nel [UNIX83].)117 200.4 R .953(This method is e)5.953 F .953 -(xceptionally \215e)-.15 F .952 -(xible in that the mailer need not reside on the)-.15 F(same machine.) -117 212.4 Q(It is normally used to connect to a sendmail process on another machine.) -5 E F0 2.5(2.3. Operational)87 236.4 R(Description)2.5 E F1 .228 -(When a sender w)127 252.6 R .228 -(ants to send a message, it issues a request to)-.1 F/F2 10 -/Times-Italic@0 SF(sendmail)2.729 E F1 .229(using one of the three)2.729 -F 1.028(methods described abo)102 264.6 R -.15(ve)-.15 G(.).15 E F2 -(Sendmail)6.028 E F1 1.028(operates in tw)3.528 F 3.528(od)-.1 G 1.028 -(istinct phases.)-3.528 F 1.028(In the \214rst phase, it collects)6.028 -F .612(and stores the message.)102 276.6 R .612 -(In the second phase, message deli)5.612 F -.15(ve)-.25 G .612 -(ry occurs.).15 F .612(If there were errors during)5.612 F 1.59 -(processing during the second phase,)102 288.6 R F2(sendmail)4.09 E F1 -1.59(creates and returns a ne)4.09 F 4.09(wm)-.25 G 1.59 -(essage describing the)-4.09 F -(error and/or returns an status code telling what went wrong.)102 300.6 -Q F0 2.5(2.3.1. Ar)102 324.6 R(gument pr)-.1 E(ocessing and addr)-.18 E -(ess parsing)-.18 E F1(If)142 340.8 Q F2(sendmail)3.321 E F1 .821 -(is called using one of the tw)3.321 F 3.322(os)-.1 G .822 -(ubprocess techniques, the ar)-3.322 F .822(guments are \214rst)-.18 F -.797(scanned and option speci\214cations are processed.)117 352.8 R .796 -(Recipient addresses are then collected, either)5.796 F .717(from the command line or from the SMTP RCPT command, and a list of recipients is created.) -117 364.8 R .347(Aliases are e)117 376.8 R .347 -(xpanded at this step, including mailing lists.)-.15 F .347(As much v) -5.347 F .346(alidation as possible of the)-.25 F 1.001 -(addresses is done at this step: syntax is check)117 388.8 R 1.002 -(ed, and local addresses are v)-.1 F 1.002(eri\214ed, b)-.15 F 1.002 -(ut detailed)-.2 F .709 -(checking of host names and addresses is deferred until deli)117 400.8 R --.15(ve)-.25 G(ry).15 E 5.708(.F)-.65 G(orw)-5.858 E .708 -(arding is also performed)-.1 F(as the local addresses are v)117 412.8 Q -(eri\214ed.)-.15 E F2(Sendmail)142 429 Q F1 .307 -(appends each address to the recipient list after parsing.)2.807 F .307 -(When a name is aliased)5.307 F .322(or forw)117 441 R .322(arded, the old name is retained in the list, and a \215ag is set that tells the deli) --.1 F -.15(ve)-.25 G .322(ry phase to).15 F .479(ignore this recipient.) -117 453 R .479(This list is k)5.479 F .479 -(ept free from duplicates, pre)-.1 F -.15(ve)-.25 G .48 -(nting alias loops and duplicate).15 F(messages deli)117 465 Q -.15(ve) --.25 G(rd to the same recipient, as might occur if a person is in tw).15 -E 2.5(og)-.1 G(roups.)-2.5 E F0 2.5(2.3.2. Message)102 489 R(collection) -2.5 E F2(Sendmail)142 505.2 Q F1 .454(then collects the message.)2.954 F -.454(The message should ha)5.454 F .754 -.15(ve a h)-.2 H .453 -(eader at the be).15 F(ginning.)-.15 E .778 -(No formatting requirements are imposed on the message e)117 517.2 R -.778(xcept that the)-.15 F 3.278(ym)-.15 G .778(ust be lines of te) --3.278 F(xt)-.15 E .78(\(i.e., binary data is not allo)117 529.2 R 3.28 -(wed\). The)-.25 F .779(header is parsed and stored in memory)3.28 F -3.279(,a)-.65 G .779(nd the body of)-3.279 F(the message is sa)117 541.2 -Q -.15(ve)-.2 G 2.5(di).15 G 2.5(nat)-2.5 G(emporary \214le.)-2.5 E -3.227 -.8(To s)142 557.4 T 1.627(implify the program interf).8 F 1.628 -(ace, the message is collected e)-.1 F -.15(ve)-.25 G 4.128(ni).15 G -4.128(fn)-4.128 G 4.128(oa)-4.128 G 1.628(ddresses were)-4.128 F -.25 -(va)117 569.4 S 2.5(lid. The).25 F -(message will be returned with an error)2.5 E(.)-.55 E F0 2.5 -(2.3.3. Message)102 593.4 R(deli)2.5 E -.1(ve)-.1 G(ry).1 E F1 -.15(Fo) -142 609.6 S 2.618(re).15 G .117 -(ach unique mailer and host in the recipient list,)-2.618 F F2(sendmail) -2.617 E F1 .117(calls the appropriate mailer)2.617 F(.)-.55 E .619 -(Each mailer in)117 621.6 R -.2(vo)-.4 G .619 -(cation sends to all users recei).2 F .619 -(ving the message on one host.)-.25 F .62(Mailers that only)5.62 F -(accept one recipient at a time are handled properly)117 633.6 Q(.)-.65 -E .47 -(The message is sent to the mailer using one of the same three interf) -142 649.8 R .47(aces used to submit a)-.1 F 1.465(message to sendmail.) -117 661.8 R 1.465(Each cop)6.465 F 3.965(yo)-.1 G 3.965(ft)-3.965 G -1.465(he message is prepended by a customized header)-3.965 F 6.465(.T) --.55 G(he)-6.465 E 1.455(mailer status code is caught and check)117 -673.8 R 1.455(ed, and a suitable error message gi)-.1 F -.15(ve)-.25 G -3.955(na).15 G 3.955(sa)-3.955 G(ppropriate.)-3.955 E .589(The e)117 -685.8 R .589(xit code must conform to a system standard or a generic message \(\231Service una) --.15 F -.25(va)-.2 G(ilable\232\)).25 E(is gi)117 697.8 Q -.15(ve)-.25 G -(n.).15 E EP -%%Page: 5 5 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(SENDMAIL \212 An Inter)72 60 Q(netw)-.15 E -(ork Mail Router)-.1 E(SMM:9-5)194.78 E 2.5(2.3.4. Queueing)102 96 R --.25(fo)2.5 G 2.5(rr).25 G(etransmission)-2.68 E/F1 10/Times-Roman@0 SF -.209(If the mailer returned an status that indicated that it might be able to handle the mail later) -142 112.2 R(,)-.4 E/F2 10/Times-Italic@0 SF(sendmail)117 124.2 Q F1 -(will queue the mail and try ag)2.5 E(ain later)-.05 E(.)-.55 E F0 2.5 -(2.3.5. Retur)102 148.2 R 2.5(nt)-.15 G 2.5(os)-2.5 G(ender)-2.5 E F1 -.588(If errors occur during processing,)142 164.4 R F2(sendmail)3.088 E -F1 .589(returns the message to the sender for retrans-)3.088 F 3.133 -(mission. The)117 176.4 R .632(letter can be mailed back or written in the \214le \231dead.letter\232 in the sender') -3.133 F 3.132(sh)-.55 G(ome)-3.132 E(directory)117 190.4 Q/F3 7 -/Times-Roman@0 SF(2)-4 I F1(.)4 I F0 2.5(2.4. Message)87 214.4 R -(Header Editing)2.5 E F1 1.756 -(Certain editing of the message header occurs automatically)127 230.6 R -6.756(.H)-.65 G 1.756(eader lines can be inserted)-6.756 F .41 -(under control of the con\214guration \214le.)102 242.6 R .41 -(Some lines can be mer)5.41 F .41(ged; for e)-.18 F .41 -(xample, a \231From:\232 line and)-.15 F 2.5<6199>102 254.6 S -(Full-name:\232 line can be mer)-2.5 E(ged under certain circumstances.) --.18 E F0 2.5(2.5. Con\214guration)87 278.6 R(File)2.5 E F1 .798(Almost all con\214guration information is read at runtime from an ASCII \214le, encoding macro) -127 294.8 R .679(de\214nitions \(de\214ning the v)102 306.8 R .678(alue of macros used internally\), header declarations \(telling sendmail the) --.25 F 1.009(format of header lines that it will process specially)102 -318.8 R 3.509(,i)-.65 G 1.009 -(.e., lines that it will add or reformat\), mailer)-3.509 F .478 -(de\214nitions \(gi)102 330.8 R .478(ving information such as the location and characteristics of each mailer\), and address) --.25 F(re)102 342.8 Q .428 -(writing rules \(a limited production system to re)-.25 F .429 -(write addresses which is used to parse and re)-.25 F(write)-.25 E -(the addresses\).)102 354.8 Q 2.828 -.8(To i)127 371 T(mpro).8 E 1.528 --.15(ve p)-.15 H 1.228(erformance when reading the con\214guration \214le, a memory image can be pro-) -.15 F 2.5(vided. This)102 383 R(pro)2.5 E -(vides a \231compiled\232 form of the con\214guration \214le.)-.15 E F0 -2.5(3. USA)72 407 R(GE AND IMPLEMENT)-.55 E -.95(AT)-.9 G(ION).95 E 2.5 -(3.1. Ar)87 431 R(guments)-.1 E F1(Ar)127 447.2 Q .376 -(guments may be \215ags and addresses.)-.18 F .377(Flags set v)5.377 F -.377(arious processing options.)-.25 F -.15(Fo)5.377 G(llo).15 E .377 -(wing \215ag)-.25 F(ar)102 459.2 Q .281(guments, address ar)-.18 F .281 -(guments may be gi)-.18 F -.15(ve)-.25 G .281 -(n, unless we are running in SMTP mode.).15 F .28(Addresses fol-)5.28 F -(lo)102 471.2 Q 2.5(wt)-.25 G(he syntax in RFC822 [Crock)-2.5 E -(er82] for ARP)-.1 E(ANET address formats.)-.92 E -(In brief, the format is:)5 E 12.5(\(1\) An)107 487.4 R -(ything in parentheses is thro)-.15 E(wn a)-.25 E -.1(wa)-.15 G 2.5(y\() -.1 G(as a comment\).)-2.5 E 12.5(\(2\) An)107 503.6 R .051 -(ything in angle brack)-.15 F .051(ets \(\231<)-.1 F .051 -(>\232\) is preferred o)1.666 F -.15(ve)-.15 G 2.551(ra).15 G -.15(ny) --2.551 G .051(thing else.).15 F .051(This rule implements the)5.051 F -(ARP)133.66 515.6 Q(ANET standard that addresses of the form)-.92 E -(user name <machine-address>)173.66 531.8 Q(will send to the electronic \231machine-address\232 rather than the human \231user name.) -133.66 548 Q<9a>-.7 E 12.5(\(3\) Double)107 564.2 R 2.246(quotes \() -4.746 F -2.754 2.5("\) q)2.5 H 2.246 -(uote phrases; backslashes quote characters.)-2.5 F 2.246 -(Backslashes are more)7.246 F(po)133.66 576.2 Q .654(werful in that the) --.25 F 3.154(yw)-.15 G .655(ill cause otherwise equi)-3.154 F -.25(va) --.25 G .655(lent phrases to compare dif).25 F .655(ferently \212 for) --.25 F -.15(ex)133.66 588.2 S(ample,).15 E F2(user)2.5 E F1(and)2.5 E F2 -("user")2.5 E F1(are equi)2.5 E -.25(va)-.25 G(lent, b).25 E(ut)-.2 E F2 -(\\user)2.5 E F1(is dif)2.5 E(ferent from either of them.)-.25 E -.15 -(Pa)127 604.4 S 1.12(rentheses, angle brack).15 F 1.12 -(ets, and double quotes must be properly balanced and nested.)-.1 F(The) -6.12 E(re)102 618.4 Q(writing rules control remaining parsing)-.25 E F3 -(3)-4 I F1(.)4 I .32 LW 76 646 72 646 DL 80 646 76 646 DL 84 646 80 646 -DL 88 646 84 646 DL 92 646 88 646 DL 96 646 92 646 DL 100 646 96 646 DL -104 646 100 646 DL 108 646 104 646 DL 112 646 108 646 DL 116 646 112 646 -DL 120 646 116 646 DL 124 646 120 646 DL 128 646 124 646 DL 132 646 128 -646 DL 136 646 132 646 DL 140 646 136 646 DL 144 646 140 646 DL 148 646 -144 646 DL 152 646 148 646 DL 156 646 152 646 DL 160 646 156 646 DL 164 -646 160 646 DL 168 646 164 646 DL 172 646 168 646 DL 176 646 172 646 DL -180 646 176 646 DL 184 646 180 646 DL 188 646 184 646 DL 192 646 188 646 -DL 196 646 192 646 DL 200 646 196 646 DL 204 646 200 646 DL 208 646 204 -646 DL 212 646 208 646 DL 216 646 212 646 DL/F4 5/Times-Roman@0 SF(2) -93.6 656.4 Q/F5 8/Times-Roman@0 SF(Ob)3.2 I(viously)-.12 E 2.226(,i)-.52 -G 2.226(ft)-2.226 G .226(he site gi)-2.226 F .226(ving the error is not the originating site, the only reasonable option is to mail back to the sender) --.2 F 4.227(.A)-.44 G(lso,)-4.227 E .191(there are man)72 669.2 R 2.191 -(ym)-.12 G .19(ore error disposition options, b)-2.191 F .19(ut the)-.16 -F 2.19(yo)-.12 G .19(nly ef)-2.19 F .19(fect the error message \212 the \231return to sender\232 function is al) --.2 F -.08(wa)-.08 G .19(ys han-).08 F(dled in one of these tw)72 678.8 -Q 2(ow)-.08 G(ays.)-2.08 E F4(3)93.6 689.2 Q F5 -(Disclaimer: Some special processing is done after re)3.2 I -(writing local names; see belo)-.2 E -.52(w.)-.2 G EP -%%Page: 6 6 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 192.28(SMM:9-6 SENDMAIL)72 60 R 2.5<8a41>2.5 G -2.5(nI)-2.5 G(nter)-2.5 E(netw)-.15 E(ork Mail Router)-.1 E 2.5 -(3.2. Mail)87 96 R(to Files and Pr)2.5 E(ograms)-.18 E/F1 10 -/Times-Roman@0 SF .609(Files and programs are le)127 112.2 R .609 -(gitimate message recipients.)-.15 F .609(Files pro)5.609 F .609 -(vide archi)-.15 F -.25(va)-.25 G 3.109(ls).25 G .61(torage of mes-) --3.109 F .124(sages, useful for project administration and history)102 -124.2 R 5.124(.P)-.65 G .124(rograms are useful as recipients in a v) --5.124 F .124(ariety of)-.25 F .69(situations, for e)102 136.2 R .691(xample, to maintain a public repository of systems messages \(such as the Berk) --.15 F(ele)-.1 E(y)-.15 E/F2 10/Times-Italic@0 SF(msgs)102 148.2 Q F1 -(program, or the MARS system [Sattle)2.5 E(y78]\).)-.15 E(An)127 164.4 Q -3.188(ya)-.15 G .688(ddress passing through the initial parsing algorithm as a local address \(i.e, not appear) --3.188 F(-)-.2 E .276(ing to be a v)102 176.4 R .276 -(alid address for another mailer\) is scanned for tw)-.25 F 2.776(os)-.1 -G .277(pecial cases.)-2.776 F .277(If pre\214x)5.277 F .277(ed by a v) --.15 F(erti-)-.15 E .18(cal bar \(\231)102 188.4 R .833<7c9a>.833 G 2.68 -(\)t)-.833 G .179 -(he rest of the address is processed as a shell command.)-2.68 F .179 -(If the user name be)5.179 F .179(gins with a)-.15 F(slash mark \(\231/) -102 200.4 Q -(\232\) the name is used as a \214le name, instead of a login name.).833 -E .241(Files that ha)127 216.6 R .541 -.15(ve s)-.2 H .241 -(etuid or setgid bits set b).15 F .241(ut no e)-.2 F -.15(xe)-.15 G .241 -(cute bits set ha).15 F .541 -.15(ve t)-.2 H .241(hose bits honored if) -.15 F F2(send-)2.742 E(mail)102 228.6 Q F1(is running as root.)2.5 E F0 -2.5(3.3. Aliasing,)87 252.6 R -.25(Fo)2.5 G(rwarding, Inclusion).25 E F2 -(Sendmail)127 268.8 Q F1 1.075(reroutes mail three w)3.575 F 3.575 -(ays. Aliasing)-.1 F 1.074(applies system wide.)3.575 F -.15(Fo)6.074 G -(rw).15 E 1.074(arding allo)-.1 F 1.074(ws each)-.25 F .233 -(user to reroute incoming mail destined for that account.)102 280.8 R -.233(Inclusion directs)5.233 F F2(sendmail)2.733 E F1 .233 -(to read a \214le for)2.733 F 2.5(al)102 292.8 S -(ist of addresses, and is normally used in conjunction with aliasing.) --2.5 E F0 2.5(3.3.1. Aliasing)102 316.8 R F1 1.554 -(Aliasing maps names to address lists using a system-wide \214le.)142 -333 R 1.553(This \214le is inde)6.553 F -.15(xe)-.15 G 4.053(dt).15 G(o) --4.053 E 1.1(speed access.)117 345 R 1.101 -(Only names that parse as local are allo)6.1 F 1.101 -(wed as aliases; this guarantees a unique)-.25 F -.1(ke)117 357 S 2.5 -(y\()-.05 G(since there are no nicknames for the local host\).)-2.5 E F0 -2.5(3.3.2. F)102 381 R(orwarding)-.25 E F1 .651 -(After aliasing, recipients that are local and v)142 397.2 R .651 -(alid are check)-.25 F .65(ed for the e)-.1 F .65 -(xistence of a \231.for)-.15 F(-)-.2 E -.1(wa)117 409.2 S .493 -(rd\232 \214le in their home directory).1 F 5.493(.I)-.65 G 2.994(fi) --5.493 G 2.994(te)-2.994 G .494(xists, the message is)-3.144 F F2(not) -2.994 E F1 .494(sent to that user)2.994 F 2.994(,b)-.4 G .494 -(ut rather to)-3.194 F .37(the list of users in that \214le.)117 421.2 R -.37 -(Often this list will contain only one address, and the feature will be) -5.37 F(used for netw)117 433.2 Q(ork mail forw)-.1 E(arding.)-.1 E -.15 -(Fo)142 449.4 S(rw).15 E 1.151 -(arding also permits a user to specify a pri)-.1 F -.25(va)-.25 G 1.152 -(te incoming mailer).25 F 6.152(.F)-.55 G 1.152(or e)-6.302 F 1.152 -(xample, for)-.15 F(-)-.2 E -.1(wa)117 461.4 S(rding to:).1 E -2.5 .833 -("| /)157 477.6 T(usr/local/ne)-.833 E(wmail myname")-.25 E -(will use a dif)117 493.8 Q(ferent incoming mailer)-.25 E(.)-.55 E F0 -2.5(3.3.3. Inclusion)102 517.8 R F1 -(Inclusion is speci\214ed in RFC 733 [Crock)142 534 Q(er77a] syntax:)-.1 -E(:Include: pathname)157 550.2 Q .391 -(An address of this form reads the \214le speci\214ed by)117 566.4 R F2 -(pathname)2.891 E F1 .391(and sends to all users listed in that)2.891 F -(\214le.)117 578.4 Q .644(The intent is)142 594.6 R F2(not)3.144 E F1 -.644(to support direct use of this feature, b)3.144 F .644 -(ut rather to use this as a subset of)-.2 F 2.5(aliasing. F)117 606.6 R -(or e)-.15 E(xample, an alias of the form:)-.15 E -(project: :include:/usr/project/userlist)157 622.8 Q 1.93(is a method of letting a project maintain a mailing list without interaction with the system) -117 639 R(administration, e)117 651 Q -.15(ve)-.25 G 2.5(ni).15 G 2.5 -(ft)-2.5 G(he alias \214le is protected.)-2.5 E 2.024 -(It is not necessary to reb)142 667.2 R 2.024(uild the inde)-.2 F 4.524 -(xo)-.15 G 4.524(nt)-4.524 G 2.025 -(he alias database when a :include: list is)-4.524 F(changed.)117 679.2 -Q EP -%%Page: 7 7 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(SENDMAIL \212 An Inter)72 60 Q(netw)-.15 E -(ork Mail Router)-.1 E(SMM:9-7)194.78 E 2.5(3.4. Message)87 96 R -(Collection)2.5 E/F1 10/Times-Roman@0 SF .857 -(Once all recipient addresses are parsed and v)127 112.2 R .857 -(eri\214ed, the message is collected.)-.15 F .856(The message)5.857 F -(comes in tw)102 124.2 Q 2.5(op)-.1 G -(arts: a message header and a message body)-2.5 E 2.5(,s)-.65 G -(eparated by a blank line.)-2.5 E -(The header is formatted as a series of lines of the form)127 140.4 Q -(\214eld-name: \214eld-v)178 156.6 Q(alue)-.25 E(Field-v)102 172.8 Q -1.366(alue can be split across lines by starting the follo)-.25 F 1.366 -(wing lines with a space or a tab)-.25 F 6.366(.S)-.4 G(ome)-6.366 E -.211(header \214elds ha)102 184.8 R .511 -.15(ve s)-.2 H .211 -(pecial internal meaning, and ha).15 F .511 -.15(ve a)-.2 H .211 -(ppropriate special processing.).15 F .21(Other headers)5.21 F -(are simply passed through.)102 196.8 Q -(Some header \214elds may be added automatically)5 E 2.5(,s)-.65 G -(uch as time stamps.)-2.5 E .86(The body is a series of te)127 213 R -.861(xt lines.)-.15 F .861 -(It is completely uninterpreted and untouched, e)5.861 F .861 -(xcept that)-.15 F 1.43(lines be)102 225 R 1.43(ginning with a dot ha) --.15 F 1.729 -.15(ve t)-.2 H 1.429(he dot doubled when transmitted o).15 -F -.15(ve)-.15 G 3.929(ra).15 G 3.929(nS)-3.929 G 1.429(MTP channel.) --3.929 F(This)6.429 E -.15(ex)102 237 S -(tra dot is stripped by the recei).15 E -.15(ve)-.25 G -.55(r.).15 G F0 -2.5(3.5. Message)87 261 R(Deli)2.5 E -.1(ve)-.1 G(ry).1 E F1 .028 -(The send queue is ordered by recei)127 277.2 R .029 -(ving host before transmission to implement message batch-)-.25 F 3.07 -(ing. Each)102 289.2 R .57(address is mark)3.07 F .57 -(ed as it is sent so rescanning the list is safe.)-.1 F .57(An ar)5.57 F -.57(gument list is b)-.18 F .57(uilt as)-.2 F 1.138(the scan proceeds.) -102 301.2 R 1.139 -(Mail to \214les is detected during the scan of the send list.)6.139 F -1.139(The interf)6.139 F 1.139(ace to the)-.1 F(mailer is performed using one of the techniques described in section 2.2.) -102 313.2 Q .996(After a connection is established,)127 329.4 R/F2 10 -/Times-Italic@0 SF(sendmail)3.496 E F1(mak)3.495 E .995(es the per)-.1 F -.995(-mailer changes to the header and)-.2 F .236 -(sends the result to the mailer)102 341.4 R 5.236(.I)-.55 G 2.736(fa) --5.236 G .537 -.15(ny m)-2.736 H .237(ail is rejected by the mailer).15 -F 2.737(,a\215)-.4 G .237(ag is set to in)-2.737 F -.2(vo)-.4 G .437 -.1 -(ke t).2 H .237(he return-).1 F(to-sender function after all deli)102 -353.4 Q -.15(ve)-.25 G(ry completes.).15 E F0 2.5(3.6. Queued)87 377.4 R -(Messages)2.5 E F1 .163(If the mailer returns a \231temporary f)127 -393.6 R .163(ailure\232 e)-.1 F .162(xit status, the message is queued.) --.15 F 2.662(Ac)5.162 G .162(ontrol \214le is)-2.662 F .85 -(used to describe the recipients to be sent to and v)102 405.6 R .851 -(arious other parameters.)-.25 F .851(This control \214le is for)5.851 F -(-)-.2 E 1.011(matted as a series of lines, each describing a sender)102 -417.6 R 3.511(,ar)-.4 G 1.011(ecipient, the time of submission, or some) --3.511 F .776(other salient parameter of the message.)102 429.6 R .776 -(The header of the message is stored in the control \214le, so)5.776 F(that the associated data \214le in the queue is just the temporary \214le that w) -102 441.6 Q(as originally collected.)-.1 E F0 2.5(3.7. Con\214guration) -87 465.6 R F1 .493(Con\214guration is controlled primarily by a con\214guration \214le read at startup.) -127 481.8 R F2(Sendmail)5.492 E F1(should)2.992 E -(not need to be recomplied e)102 493.8 Q(xcept)-.15 E 12.5(\(1\) T)107 -510 R 2.5(oc)-.8 G(hange operating systems \(V6, V7/32V)-2.5 E 2.5(,4) --1.29 G(BSD\).)-2.5 E 12.5(\(2\) T)107 526.2 R 2.5(or)-.8 G(emo)-2.5 E -.3 -.15(ve o)-.15 H 2.5(ri).15 G -(nsert the DBM \(UNIX database\) library)-2.5 E(.)-.65 E 12.5(\(3\) T) -107 542.4 R 2.5(oc)-.8 G(hange ARP)-2.5 E(ANET reply codes.)-.92 E 12.5 -(\(4\) T)107 558.6 R 2.5(oa)-.8 G -(dd headers \214elds requiring special processing.)-2.5 E .434 -(Adding mailers or changing parsing \(i.e., re)102 574.8 R .435 -(writing\) or routing information does not require recom-)-.25 F -(pilation.)102 586.8 Q 1.317(If the mail is being sent by a local user) -127 603 R 3.817(,a)-.4 G 1.317(nd the \214le \231.mailcf\232 e)-3.817 F -1.317(xists in the sender')-.15 F 3.817(sh)-.55 G(ome)-3.817 E -(directory)102 615 Q 2.721(,t)-.65 G .221(hat \214le is read as a con\214guration \214le after the system con\214guration \214le.) --2.721 F .222(The primary use)5.222 F -(of this feature is to add header lines.)102 627 Q 3.25(The con\214guration \214le encodes macro de\214nitions, header de\214nitions, mailer de\214nitions,) -127 643.2 R(re)102 655.2 Q(writing rules, and options.)-.25 E F0 2.5 -(3.7.1. Macr)102 679.2 R(os)-.18 E F1 .332 -(Macros can be used in three w)142 695.4 R 2.833(ays. Certain)-.1 F .333 -(macros transmit unstructured te)2.833 F .333(xtual informa-)-.15 F .07 -(tion into the mail system, such as the name)117 707.4 R F2(sendmail) -2.57 E F1 .07(will use to identify itself in error messages.)2.57 F -1.247(Other macros transmit information from)117 719.4 R F2(sendmail) -3.747 E F1 1.247(to the con\214guration \214le for use in creating)3.747 -F EP -%%Page: 8 8 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 192.28(SMM:9-8 SENDMAIL)72 60 R 2.5<8a41>2.5 G -2.5(nI)-2.5 G(nter)-2.5 E(netw)-.15 E(ork Mail Router)-.1 E/F1 10 -/Times-Roman@0 SF .312(other \214elds \(such as ar)117 96 R .312 -(gument v)-.18 F .312(ectors to mailers\); e.g., the name of the sender) --.15 F 2.811(,a)-.4 G .311(nd the host and)-2.811 F .848 -(user of the recipient.)117 108 R .848 -(Other macros are unused internally)5.848 F 3.348(,a)-.65 G .848 -(nd can be used as shorthand in the)-3.348 F(con\214guration \214le.)117 -120 Q F0 2.5(3.7.2. Header)102 144 R(declarations)2.5 E F1 .355 -(Header declarations inform)142 160.2 R/F2 10/Times-Italic@0 SF -(sendmail)2.854 E F1 .354(of the format of kno)2.854 F .354 -(wn header lines.)-.25 F(Kno)5.354 E .354(wledge of)-.25 F 2.5(af)117 -172.2 S .5 -.25(ew h)-2.5 H(eader lines is b).25 E(uilt into)-.2 E F2 -(sendmail)2.5 E F1 2.5(,s)C -(uch as the \231From:\232 and \231Date:\232 lines.)-2.5 E 1.201(Most con\214gured headers will be automatically inserted in the outgoing message if the) -142 188.4 R(y)-.15 E(don')117 200.4 Q 2.5(te)-.18 G -(xist in the incoming message.)-2.65 E -(Certain headers are suppressed by some mailers.)5 E F0 2.5 -(3.7.3. Mailer)102 224.4 R(declarations)2.5 E F1 1.756 -(Mailer declarations tell)142 240.6 R F2(sendmail)4.256 E F1 1.756 -(of the v)4.256 F 1.756(arious mailers a)-.25 F -.25(va)-.2 G 1.756 -(ilable to it.).25 F 1.755(The de\214nition)6.755 F .119 -(speci\214es the internal name of the mailer)117 252.6 R 2.619(,t)-.4 G -.12(he pathname of the program to call, some \215ags associ-)-2.619 F -2.036(ated with the mailer)117 264.6 R 4.536(,a)-.4 G 2.036(nd an ar) --4.536 F 2.036(gument v)-.18 F 2.036 -(ector to be used on the call; this v)-.15 F 2.035(ector is macro-)-.15 -F -.15(ex)117 276.6 S(panded before use.).15 E F0 2.5(3.7.4. Addr)102 -300.6 R(ess r)-.18 E(ewriting rules)-.18 E F1 .458 -(The heart of address parsing in)142 316.8 R F2(sendmail)2.959 E F1 .459 -(is a set of re)2.959 F .459(writing rules.)-.25 F .459 -(These are an ordered)5.459 F .561 -(list of pattern-replacement rules, \(some)117 328.8 R .561(what lik) --.25 F 3.061(eap)-.1 G .561(roduction system, e)-3.061 F .56 -(xcept that order is criti-)-.15 F 1.905 -(cal\), which are applied to each address.)117 340.8 R 1.905 -(The address is re)6.905 F 1.906(written te)-.25 F 1.906 -(xtually until it is either)-.15 F(re)117 352.8 Q .308 -(written into a special canonical form \(i.e., a \(mailer)-.25 F 2.807 -(,h)-.4 G .307(ost, user\) 3-tuple, such as {arpanet, usc-)-2.807 F .64 -(isif, postel} representing the address \231postel@usc-isif\232\), or it f) -117 364.8 R .641(alls of)-.1 F 3.141(ft)-.25 G .641(he end.)-3.141 F -.641(When a pattern)5.641 F(matches, the rule is reapplied until it f) -117 376.8 Q(ails.)-.1 E 1.222(The con\214guration \214le also supports the editing of addresses into dif) -142 393 R 1.221(ferent formats.)-.25 F -.15(Fo)6.221 G(r).15 E -.15(ex) -117 405 S(ample, an address of the form:).15 E(ucsfcgl!tef)157 421.2 Q -(might be mapped into:)117 437.4 Q(tef@ucsfcgl.UUCP)157 453.6 Q -(to conform to the domain syntax.)117 469.8 Q -.35(Tr)5 G -(anslations can also be done in the other direction.).35 E F0 2.5 -(3.7.5. Option)102 493.8 R(setting)2.5 E F1 1.168(There are se)142 510 R --.15(ve)-.25 G 1.169 -(ral options that can be set from the con\214guration \214le.).15 F -1.169(These include the)6.169 F(pathnames of v)117 522 Q -(arious support \214les, timeouts, def)-.25 E(ault modes, etc.)-.1 E F0 -2.5(4. COMP)72 546 R(ARISON WITH O)-.74 E(THER MAILERS)-.4 E 2.5 -(4.1. Deli)87 570 R -.1(ve)-.1 G(rmail).1 E F2(Sendmail)127 586.2 Q F1 -(is an outgro)2.5 E(wth of)-.25 E F2(delivermail)2.5 E F1 5(.T)C -(he primary dif)-5 E(ferences are:)-.25 E 12.5(\(1\) Con\214guration)107 -602.4 R .273(information is not compiled in.)2.773 F .272 -(This change simpli\214es man)5.273 F 2.772(yo)-.15 G 2.772(ft)-2.772 G -.272(he problems)-2.772 F(of mo)133.66 614.4 Q(ving to other machines.) --.15 E(It also allo)5 E(ws easy deb)-.25 E(ugging of ne)-.2 E 2.5(wm) --.25 G(ailers.)-2.5 E 12.5(\(2\) Address)107 630.6 R .681 -(parsing is more \215e)3.181 F 3.182(xible. F)-.15 F .682(or e)-.15 F -(xample,)-.15 E F2(delivermail)3.182 E F1 .682(only supported one g) -3.182 F(ate)-.05 E -.1(wa)-.25 G 3.182(yt).1 G(o)-3.182 E(an)133.66 -642.6 Q 2.817(yn)-.15 G(etw)-2.817 E .317(ork, whereas)-.1 F F2 -(sendmail)2.817 E F1 .317(can be sensiti)2.817 F .616 -.15(ve t)-.25 H -2.816(oh).15 G .316(ost names and reroute to dif)-2.816 F .316(ferent g) --.25 F(ate-)-.05 E -.1(wa)133.66 654.6 S(ys.).1 E 12.5(\(3\) F)107 670.8 -R(orw)-.15 E 1.627(arding and :include: features eliminate the requirement that the system alias \214le be) --.1 F .074(writable by an)133.66 682.8 R 2.574(yu)-.15 G .073(ser \(or that an update program be written, or that the system administration) --2.574 F(mak)133.66 694.8 Q 2.5(ea)-.1 G(ll changes\).)-2.5 E(\(4\))107 -711 Q F2(Sendmail)15 E F1 .4(supports message batching across netw)2.9 F -.401(orks when a message is being sent to mul-)-.1 F(tiple recipients.) -133.66 723 Q EP -%%Page: 9 9 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(SENDMAIL \212 An Inter)72 60 Q(netw)-.15 E -(ork Mail Router)-.1 E(SMM:9-9)194.78 E/F1 10/Times-Roman@0 SF 12.5 -(\(5\) A)107 96 R .875(mail queue is pro)3.375 F .874(vided in)-.15 F/F2 -10/Times-Italic@0 SF(sendmail.)3.374 E F1 .874(Mail that cannot be deli) -5.874 F -.15(ve)-.25 G .874(red immediately b).15 F .874(ut can)-.2 F -1.063(potentially be deli)133.66 108 R -.15(ve)-.25 G 1.064 -(red later is stored in this queue for a later retry).15 F 6.064(.T)-.65 -G 1.064(he queue also pro-)-6.064 F .896(vides a b)133.66 120 R(uf)-.2 E -.896(fer ag)-.25 F .895(ainst system crashes; after the message has been collected it may be reli-) --.05 F(ably redeli)133.66 132 Q -.15(ve)-.25 G(red e).15 E -.15(ve)-.25 -G 2.5(ni).15 G 2.5(ft)-2.5 G(he system crashes during the initial deli) --2.5 E -.15(ve)-.25 G(ry).15 E(.)-.65 E(\(6\))107 148.2 Q F2(Sendmail)15 -E F1 .197(uses the netw)2.696 F .197(orking support pro)-.1 F .197 -(vided by 4.2BSD to pro)-.15 F .197(vide a direct interf)-.15 F .197 -(ace net-)-.1 F -.1(wo)133.66 160.2 S .07(rks such as the ARP).1 F .07 -(ANET and/or Ethernet using SMTP \(the Simple Mail T)-.92 F .07 -(ransfer Proto-)-.35 F(col\) o)133.66 172.2 Q -.15(ve)-.15 G 2.5(raT).15 -G(CP/IP connection.)-2.5 E F0 2.5(4.2. MMDF)87 196.2 R F1 .957 -(MMDF [Crock)127 212.4 R .957(er79] spans a wider problem set than)-.1 F -F2(sendmail)3.458 E F1 5.958(.F)C .958(or e)-6.108 F .958 -(xample, the domain of)-.15 F .721(MMDF includes a \231phone netw)102 -224.4 R .721(ork\232 mailer)-.1 F 3.221(,w)-.4 G(hereas)-3.221 E F2 -(sendmail)3.221 E F1 .721(calls on pree)3.221 F .72 -(xisting mailers in most)-.15 F(cases.)102 236.4 Q .175(MMDF and)127 -252.6 R F2(sendmail)2.675 E F1 .175 -(both support aliasing, customized mailers, message batching, automatic) -2.675 F(forw)102 264.6 Q .792(arding to g)-.1 F(ate)-.05 E -.1(wa)-.25 G -.792(ys, queueing, and retransmission.).1 F .792(MMDF supports tw)5.792 -F .792(o-stage timeout, which)-.1 F F2(sendmail)102 276.6 Q F1 -(does not support.)2.5 E -(The con\214guration for MMDF is compiled into the code)127 294.8 Q/F3 7 -/Times-Roman@0 SF(4)-4 I F1(.)4 I .037 -(Since MMDF does not consider backw)127 311 R .037 -(ards compatibility as a design goal, the address parsing)-.1 F -(is simpler b)102 323 Q(ut much less \215e)-.2 E(xible.)-.15 E 1.159 -(It is some)127 341.2 R 1.159(what harder to inte)-.25 F 1.159 -(grate a ne)-.15 F 3.659(wc)-.25 G(hannel)-3.659 E F3(5)-4 I F1 1.159 -(into MMDF)3.659 4 N 6.16(.I)-.8 G 3.66(np)-6.16 G(articular)-3.66 E -3.66(,M)-.4 G 1.16(MDF must)-3.66 F(kno)102 353.2 Q 3.225(wt)-.25 G .725 -(he location and format of host tables for all channels, and the channel must speak a special) --3.225 F 2.525(protocol. This)102 365.2 R(allo)2.525 E .025 -(ws MMDF to do additional v)-.25 F .025(eri\214cation \(such as v)-.15 F -.025(erifying host names\) at submis-)-.15 F(sion time.)102 377.2 Q -1.761(MMDF strictly separates the submission and deli)127 393.4 R -.15 -(ve)-.25 G 1.761(ry phases.).15 F(Although)6.761 E F2(sendmail)4.261 E -F1 1.76(has the)4.261 F .784(concept of each of these stages, the)102 -405.4 R 3.284(ya)-.15 G .784(re inte)-3.284 F .785 -(grated into one program, whereas in MMDF the)-.15 F 3.285(ya)-.15 G(re) --3.285 E(split into tw)102 417.4 Q 2.5(op)-.1 G(rograms.)-2.5 E F0 2.5 -(4.3. Message)87 441.4 R(Pr)2.5 E(ocessing Module)-.18 E F1 .925(The Message Processing Module \(MPM\) discussed by Postel [Postel79b] matches) -127 457.6 R F2(sendmail)3.425 E F1 1.364 -(closely in terms of its basic architecture.)102 469.6 R(Ho)6.364 E(we) --.25 E -.15(ve)-.25 G 2.164 -.4(r, l).15 H(ik).4 E 3.864(eM)-.1 G(MDF) --3.864 E 3.864(,t)-.8 G 1.365(he MPM includes the netw)-3.864 F(ork)-.1 -E(interf)102 481.6 Q(ace softw)-.1 E(are as part of its domain.)-.1 E -.408(MPM also postulates a duple)127 497.8 R 2.907(xc)-.15 G .407 -(hannel to the recei)-2.907 F -.15(ve)-.25 G 1.207 -.4(r, a).15 H 2.907 -(sd).4 G .407(oes MMDF)-2.907 F 2.907(,t)-.8 G .407(hus allo)-2.907 F -.407(wing simpler)-.25 F .302 -(handling of errors by the mailer than is possible in)102 509.8 R F2 -(sendmail)2.802 E F1 5.302(.W)C .302(hen a message queued by)-5.302 F F2 -(sendmail)2.802 E F1 .23(is sent, an)102 521.8 R 2.73(ye)-.15 G .23 -(rrors must be returned to the sender by the mailer itself.)-2.73 F .229 -(Both MPM and MMDF mail-)5.229 F .883(ers can return an immediate error response, and a single error processor can create an appropriate) -102 533.8 R(response.)102 545.8 Q 2.24(MPM prefers passing the message as a structured object, with type-length-v) -127 564 R 2.24(alue tuples)-.25 F F3(6)-4 I F1(.)4 I .874(Such a con)102 -576 R -.15(ve)-.4 G .874(ntion requires a much higher de).15 F .875 -(gree of cooperation between mailers than is required)-.15 F(by)102 588 -Q F2(sendmail)2.796 E F1 5.296(.M)C .296(PM also assumes a uni)-5.296 F --.15(ve)-.25 G .296 -(rsally agreed upon internet name space \(with each address).15 F -(in the form of a net-host-user tuple\), which)102 600 Q F2(sendmail)2.5 -E F1(does not.)2.5 E .32 LW 76 642 72 642 DL 80 642 76 642 DL 84 642 80 -642 DL 88 642 84 642 DL 92 642 88 642 DL 96 642 92 642 DL 100 642 96 642 -DL 104 642 100 642 DL 108 642 104 642 DL 112 642 108 642 DL 116 642 112 -642 DL 120 642 116 642 DL 124 642 120 642 DL 128 642 124 642 DL 132 642 -128 642 DL 136 642 132 642 DL 140 642 136 642 DL 144 642 140 642 DL 148 -642 144 642 DL 152 642 148 642 DL 156 642 152 642 DL 160 642 156 642 DL -164 642 160 642 DL 168 642 164 642 DL 172 642 168 642 DL 176 642 172 642 -DL 180 642 176 642 DL 184 642 180 642 DL 188 642 184 642 DL 192 642 188 -642 DL 196 642 192 642 DL 200 642 196 642 DL 204 642 200 642 DL 208 642 -204 642 DL 212 642 208 642 DL 216 642 212 642 DL/F4 5/Times-Roman@0 SF -(4)93.6 652.4 Q/F5 8/Times-Roman@0 SF .179(Dynamic con\214guration tables are currently being considered for MMDF; allo) -3.2 J .18(wing the installer to select either compiled or dy-)-.2 F -(namic tables.)72 665.2 Q F4(5)93.6 675.6 Q F5(The MMDF equi)3.2 I -.2 -(va)-.2 G(lent of a).2 E/F6 8/Times-Italic@0 SF(sendmail)2 E F5 -(\231mailer)2 E -.56<2e9a>-.44 G F4(6)93.6 689.2 Q F5 -(This is similar to the NBS standard.)3.2 I EP -%%Page: 10 10 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 187.28(SMM:9-10 SENDMAIL)72 60 R 2.5<8a41>2.5 G -2.5(nI)-2.5 G(nter)-2.5 E(netw)-.15 E(ork Mail Router)-.1 E 2.5(5. EV)72 -96 R(ALU)-1.35 E -.95(AT)-.6 G(IONS AND FUTURE PLANS).95 E/F1 10 -/Times-Italic@0 SF(Sendmail)112 112.2 Q/F2 10/Times-Roman@0 SF 1.851 -(is designed to w)4.351 F 1.851(ork in a nonhomogeneous en)-.1 F 4.352 -(vironment. Ev)-.4 F 1.852(ery attempt is made to)-.15 F -.2(avo)87 -124.2 S 1.037 -(id imposing unnecessary constraints on the underlying mailers.).2 F -1.036(This goal has dri)6.036 F -.15(ve)-.25 G 3.536(nm).15 G 1.036 -(uch of the)-3.536 F 2.723(design. One)87 136.2 R .223(of the major problems has been the lack of a uniform address space, as postulated in [Pos-) -2.723 F(tel79a] and [Postel79b].)87 148.2 Q 2.647(An)112 164.4 S .147(onuniform address space implies that a path will be speci\214ed in all addresses, either e) --2.647 F(xplicitly)-.15 E .472 -(\(as part of the address\) or implicitly \(as with implied forw)87 -176.4 R .473(arding to g)-.1 F(ate)-.05 E -.1(wa)-.25 G 2.973 -(ys\). This).1 F .473(restriction has the)2.973 F .493(unpleasant ef)87 -188.4 R .493(fect of making replying to messages e)-.25 F .493 -(xceedingly dif)-.15 F .493 -(\214cult, since there is no one \231address\232)-.25 F(for an)87 200.4 -Q 2.5(yp)-.15 G(erson, b)-2.5 E(ut only a w)-.2 E -(ay to get there from where)-.1 E -.15(ve)-.25 G 2.5(ry).15 G(ou are.) --2.5 E(Interf)112 216.6 Q .448(acing to mail programs that were not initially intended to be applied in an internet en) --.1 F(viron-)-.4 E(ment has been amazingly successful, and has reduced the job to a manageable task.) -87 228.6 Q F1(Sendmail)112 244.8 Q F2 2.906(has kno)5.406 F 2.906 -(wledge of a fe)-.25 F 5.406(wd)-.25 G(if)-5.406 E 2.906(\214cult en) --.25 F 2.906(vironments b)-.4 F 2.906(uilt in.)-.2 F 2.905 -(It generates ARP)7.906 F(ANET)-.92 E .648(FTP/SMTP compatible error messages \(prepended with three-digit numbers [Neigus73, Postel74, Pos-) -87 256.8 R .771(tel82]\) as necessary)87 268.8 R 3.271(,o)-.65 G .771(ptionally generates UNIX-style \231From\232 lines on the front of messages for some) --3.271 F 1.669(mailers, and kno)87 280.8 R 1.669(ws ho)-.25 F 4.169(wt) --.25 G 4.169(op)-4.169 G 1.669(arse the same lines on input.)-4.169 F -1.67(Also, error handling has an option cus-)6.67 F -(tomized for BerkNet.)87 292.8 Q 1.482(The decision to a)112 309 R -.2 -(vo)-.2 G 1.482(id doing an).2 F 3.982(yt)-.15 G 1.481(ype of deli) --3.982 F -.15(ve)-.25 G 1.481(ry where possible \(e).15 F -.15(ve)-.25 G -1.481(n, or perhaps especially).15 F(,)-.65 E .574(local deli)87 321 R --.15(ve)-.25 G .574(ry\) has turned out to be a good idea.).15 F(Ev) -5.574 E .574(en with local deli)-.15 F -.15(ve)-.25 G(ry).15 E 3.074(,t) --.65 G .575(here are issues of the loca-)-3.074 F .469(tion of the mailbox, the format of the mailbox, the locking protocol used, etc., that are best decided by) -87 333 R .038(other programs.)87 345 R .038(One surprisingly major anno) -5.038 F .038(yance in man)-.1 F 2.538(yi)-.15 G .038 -(nternet mailers is that the location and for)-2.538 F(-)-.2 E .138 -(mat of local mail is b)87 357 R .138(uilt in.)-.2 F .137(The feeling seems to be that local mail is so common that it should be ef) -5.137 F<8c2d>-.25 E 3.045(cient. This)87 369 R .545 -(feeling is not born out by our e)3.045 F .545 -(xperience; on the contrary)-.15 F 3.045(,t)-.65 G .545 -(he location and format of mail-)-3.045 F(box)87 381 Q(es seems to v) --.15 E(ary widely from system to system.)-.25 E .681(The ability to automatically generate a response to incoming mail \(by forw) -112 397.2 R .68(arding mail to a pro-)-.1 F .435 -(gram\) seems useful \(\231I am on v)87 409.2 R .435 -(acation until late August....)-.25 F 2.935(\232\) b)-.7 F .435 -(ut can create problems such as forw)-.2 F(ard-)-.1 E .143 -(ing loops \(tw)87 421.2 R 2.643(op)-.1 G .143(eople on v)-2.643 F .143 -(acation whose programs send notes back and forth, for instance\) if these pro-) --.25 F .732(grams are not well written.)87 433.2 R 3.232(Ap)5.732 G .732 -(rogram could be written to do standard tasks correctly)-3.232 F 3.233 -(,b)-.65 G .733(ut this w)-3.433 F(ould)-.1 E(solv)87 445.2 Q 2.5(et) --.15 G(he general case.)-2.5 E .225 -(It might be desirable to implement some form of load limiting.)112 -461.4 R 2.725(Ia)5.225 G 2.724(mu)-2.725 G(na)-2.724 E -.1(wa)-.15 G -.224(re of an).1 F 2.724(ym)-.15 G .224(ail system)-2.724 F -(that addresses this problem, nor am I a)87 473.4 Q -.1(wa)-.15 G -(re of an).1 E 2.5(yr)-.15 G(easonable solution at this time.)-2.5 E -.113(The con\214guration \214le is currently practically inscrutable; considerable con) -112 489.6 R -.15(ve)-.4 G .114(nience could be real-).15 F -(ized with a higher)87 501.6 Q(-le)-.2 E -.15(ve)-.25 G 2.5(lf).15 G -(ormat.)-2.5 E .778(It seems clear that common protocols will be changing soon to accommodate changing require-) -112 517.8 R 2.774(ments and en)87 529.8 R 5.274(vironments. These)-.4 F -2.774 -(changes will include modi\214cations to the message header \(e.g.,) -5.274 F .859([NBS80]\) or to the body of the message itself \(such as for multimedia messages [Postel80]\).) -87 541.8 R(Experi-)5.859 E -(ence indicates that these changes should be relati)87 553.8 Q -.15(ve) --.25 G(ly tri).15 E(vial to inte)-.25 E(grate into the e)-.15 E -(xisting system.)-.15 E .811(In tightly coupled en)112 570 R .812 -(vironments, it w)-.4 F .812(ould be nice to ha)-.1 F 1.112 -.15(ve a n) --.2 H .812(ame serv).15 F .812(er such as Grapvine [Bir)-.15 F(-)-.2 E -.095(rell82] inte)87 582 R .095(grated into the mail system.)-.15 F .095 -(This w)5.095 F .095(ould allo)-.1 F 2.594(was)-.25 G .094 -(ite such as \231Berk)-2.594 F(ele)-.1 E .094 -(y\232 to appear as a single)-.15 F 2.606 -(host, rather than as a collection of hosts, and w)87 594 R 2.606 -(ould allo)-.1 F 5.106(wp)-.25 G 2.606(eople to mo)-5.106 F 2.906 -.15 -(ve t)-.15 H 2.606(ransparently among).15 F 1.664(machines without ha)87 -606 R 1.664(ving to change their addresses.)-.2 F 1.664(Such a f)6.664 F -1.664(acility w)-.1 F 1.663(ould require an automatically)-.1 F .428 -(updated database and some method of resolving con\215icts.)87 618 R -.428(Ideally this w)5.428 F .428(ould be ef)-.1 F(fecti)-.25 E .728 -.15 -(ve e)-.25 H -.15(ve)-.1 G 2.928(nw).15 G(ithout)-2.928 E .184 -(all hosts being under a single management.)87 630 R(Ho)5.184 E(we)-.25 -E -.15(ve)-.25 G .984 -.4(r, i).15 H 2.684(ti).4 G 2.683(sn)-2.684 G -.183(ot clear whether this feature should be inte-)-2.683 F -(grated into the aliasing f)87 642 Q -(acility or should be considered a \231v)-.1 E -(alue added\232 feature outside)-.25 E F1(sendmail)2.5 E F2(itself.)2.5 -E .79(As a more interesting case, the CSNET name serv)112 658.2 R .791 -(er [Solomon81] pro)-.15 F .791(vides an f)-.15 F .791 -(acility that goes)-.1 F(be)87 670.2 Q .375 -(yond a single tightly-coupled en)-.15 F 2.875(vironment. Such)-.4 F -2.875(af)2.875 G .375(acility w)-2.975 F .374(ould normally e)-.1 F .374 -(xist outside of)-.15 F F1(sendmail)2.874 E F2(ho)87 682.2 Q(we)-.25 E --.15(ve)-.25 G -.55(r.).15 G EP -%%Page: 11 11 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(SENDMAIL \212 An Inter)72 60 Q(netw)-.15 E -(ork Mail Router)-.1 E(SMM:9-11)189.78 E -.55(AC)72 96 S(KNO).55 E -(WLEDGEMENTS)-.5 E/F1 10/Times-Roman@0 SF 1.203(Thanks are due to K)97 -112.2 R 1.204(urt Shoens for his continual cheerful assistance and good advice, Bill Jo) --.15 F 3.704(yf)-.1 G(or)-3.704 E .102 -(pointing me in the correct direction \(o)72 124.2 R -.15(ve)-.15 G -2.602(ra).15 G .102(nd o)-2.602 F -.15(ve)-.15 G .102 -(r\), and Mark Horton for more advice, prodding, and man).15 F(y)-.15 E -.453(of the good ideas.)72 136.2 R -.15(Ku)5.453 G .453 -(rt and Eric Schmidt are to be credited for using).15 F/F2 10 -/Times-Italic@0 SF(delivermail)2.953 E F1 .453(as a serv)2.953 F .453 -(er for their pro-)-.15 F 1.663(grams \()72 148.2 R F2(Mail)A F1 1.663 -(and BerkNet respecti)4.163 F -.15(ve)-.25 G 1.663(ly\) before an).15 F -4.163(ys)-.15 G 1.663(ane person should ha)-4.163 F -.15(ve)-.2 G 4.163 -(,a).15 G 1.662(nd making the necessary)-4.163 F .078 -(modi\214cations promptly and happily)72 160.2 R 5.078(.E)-.65 G .078 -(ric g)-5.078 F -2.25 -.2(av e)-.05 H .079 -(me considerable advice about the perils of netw)2.778 F .079(ork softw) --.1 F(are)-.1 E .179(which sa)72 172.2 R -.15(ve)-.2 G 2.679(dm).15 G -2.679(ea)-2.679 G 2.679(nu)-2.679 G(nkno)-2.679 E .178(wn amount of w) --.25 F .178(ork and grief.)-.1 F .178 -(Mark did the original implementation of the DBM)5.178 F -.15(ve)72 -184.2 S .341 -(rsion of aliasing, installed the VFORK code, wrote the current v).15 F -.341(ersion of)-.15 F F2(rmail)2.841 E F1 2.841(,a)C .341(nd w)-2.841 F -.342(as the person who)-.1 F .61(really con)72 196.2 R .61 -(vinced me to put the w)-.4 F .61(ork into)-.1 F F2(delivermail)3.109 E -F1 .609(to turn it into)3.109 F F2(sendmail)3.109 E F1 5.609(.K)C .609 -(urt deserv)-5.759 F .609(es accolades for)-.15 F(using)72 208.2 Q F2 -(sendmail)2.57 E F1 .07(when I w)2.57 F .07(as myself afraid to tak)-.1 -F 2.57(et)-.1 G .07(he risk; ho)-2.57 F 2.57(wap)-.25 G .07 -(erson can continue to be so enthusiastic in)-2.57 F(the f)72 220.2 Q -(ace of so much bitter reality is be)-.1 E(yond me.)-.15 E -.15(Ku)97 -236.4 S 1.505(rt, Mark, Kirk McK).15 F 1.505 -(usick, Marvin Solomon, and man)-.15 F 4.005(yo)-.15 G 1.504(thers ha) --4.005 F 1.804 -.15(ve r)-.2 H -.25(ev).15 G(ie).25 E 1.504 -(wed this paper)-.25 F 4.004(,g)-.4 G -.25(iv)-4.004 G(ing).25 E -(considerable useful advice.)72 248.4 Q .846(Special thanks are reserv) -97 264.6 R .846(ed for Mik)-.15 F 3.346(eS)-.1 G(tonebrak)-3.346 E .846 -(er at Berk)-.1 F(ele)-.1 E 3.347(ya)-.15 G .847 -(nd Bob Epstein at Britton-Lee, who)-3.347 F .542(both kno)72 276.6 R -.542(wingly allo)-.25 F .542(wed me to put so much w)-.25 F .541 -(ork into this project when there were so man)-.1 F 3.041(yo)-.15 G .541 -(ther things I)-3.041 F(really should ha)72 288.6 Q .3 -.15(ve b)-.2 H -(een w).15 E(orking on.)-.1 E EP -%%Page: 12 12 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Roman@0 SF(REFERENCES)256.605 132 Q 62.73 -([Birrell82] Birrell,)72 148.2 R 1.084(A. D., Le)3.584 F 1.084 -(vin, R., Needham, R. M., and Schroeder)-.25 F 3.584(,M)-.4 G 3.585(.D) --3.584 G 1.085(., \231Grape)-3.585 F(vine:)-.25 E(An Ex)180 160.2 Q -(ercise in Distrib)-.15 E(uted Computing.)-.2 E 5<9a49>-.7 G(n)-5 E/F1 -10/Times-Italic@0 SF(Comm. A.C.M. 25,)2.5 E F0(4, April 82.)2.5 E 59.4 -([Borden79] Borden,)72 176.4 R .796 -(S., Gaines, R. S., and Shapiro, N. Z.,)3.296 F F1 .795(The MH Messa) -3.295 F .995 -.1(ge H)-.1 H .795(andling Sys-).1 F(tem: User)180 188.4 Q -(s' Manual.)-.1 E F0(R-2367-P)5 E(AF)-.92 E 5(.R)-.8 G(and Corporation.) --5 E(October 1979.)5 E([Crock)72 204.6 Q 52.29(er77a] Crock)-.1 F(er)-.1 -E 2.508(,D)-.4 G 2.508(.H)-2.508 G .008(., V)-2.508 F .009 -(ittal, J. J., Pogran, K. T)-.6 F .009(., and Henderson, D. A. Jr)-.74 F -(.,)-.55 E F1(Standar)2.509 E 2.509(df)-.37 G(or)-2.509 E .955(the F)180 -216.6 R .955(ormat of ARP)-1.05 F 3.454(AN)-.9 G .954(etwork T)-3.454 F --.2(ex)-.92 G 3.454(tM).2 G(essa)-3.454 E -.1(ge)-.1 G(s.).1 E F0 .954 -(RFC 733, NIC 41952.)5.954 F .954(In [Fein-)5.954 F 2.5(ler78]. No)180 -228.6 R -.15(ve)-.15 G(mber 1977.).15 E([Crock)72 244.8 Q 51.73 -(er77b] Crock)-.1 F(er)-.1 E 3.04(,D)-.4 G 3.04(.H)-3.04 G(.,)-3.04 E F1 --1.55 -.55(Fr a)3.04 H(me).55 E .54(work and Functions of the MS P)-.15 -F(er)-.8 E .54(sonal Messa)-.1 F .74 -.1(ge S)-.1 H(ystem.).1 E F0 -(R-2134-ARP)180 256.8 Q(A, Rand Corporation, Santa Monica, California.) --.92 E(1977.)5 E([Crock)72 273 Q 56.73(er79] Crock)-.1 F(er)-.1 E 2.557 -(,D)-.4 G 2.557(.H)-2.557 G .056(., Szurk)-2.557 F -.25(ow)-.1 G .056 -(ski, E. S., and F).25 F(arber)-.15 E 2.556(,D)-.4 G 2.556(.J)-2.556 G -(.,)-2.556 E F1 .056(An Internetwork Memo Dis-)2.556 F(trib)180 285 Q -1.341(ution F)-.2 F 1.341(acility \212 MMDF)-.75 F(.)-1.35 E F0 1.341 -(6th Data Communication Symposium, Asilomar)6.341 F(.)-.55 E(No)180 297 -Q -.15(ve)-.15 G(mber 1979.).15 E([Crock)72 313.2 Q 56.73(er82] Crock) --.1 F(er)-.1 E 3.383(,D)-.4 G 3.383(.H)-3.383 G(.,)-3.383 E F1(Standar) -3.383 E 3.383(df)-.37 G .883(or the F)-3.383 F .882 -(ormat of Arpa Internet T)-1.05 F -.2(ex)-.92 G 3.382(tM).2 G(essa) --3.382 E -.1(ge)-.1 G(s.).1 E F0(RFC)5.882 E 4.197(822. Netw)180 325.2 R -1.697(ork Information Center)-.1 F 4.197(,S)-.4 G 1.698 -(RI International, Menlo P)-4.197 F 1.698(ark, California.)-.15 F -(August 1982.)180 337.2 Q 53.3([Metcalfe76] Metcalfe,)72 353.4 R .727 -(R., and Boggs, D., \231Ethernet: Distrib)3.227 F .727(uted P)-.2 F(ack) --.15 E .727(et Switching for Local)-.1 F(Computer Netw)180 365.4 Q -(orks\232,)-.1 E F1(Communications of the A)2.5 E(CM 19,)-.3 E F0 2.5 -(7. July)2.5 F(1976.)2.5 E 60.51([Feinler78] Feinler)72 381.6 R 4.438 -(,E)-.4 G 1.938(., and Postel, J.)-4.438 F(\(eds.\),)6.938 E F1(ARP) -4.438 E 1.938(ANET Pr)-.9 F 1.938(otocol Handbook.)-.45 F F0 1.938 -(NIC 7104,)6.938 F(Netw)180 393.6 Q(ork Information Center)-.1 E 2.5(,S) --.4 G(RI International, Menlo P)-2.5 E(ark, California.)-.15 E(1978.)5 E -69.39([NBS80] National)72 409.8 R 1.46(Bureau of Standards,)3.96 F F1 -1.46(Speci\214cation of a Dr)3.96 F 1.46(aft Messa)-.15 F 1.66 -.1(ge F) --.1 H 1.46(ormat Stan-)-.95 F(dar)180 421.8 Q(d.)-.37 E F0 -(Report No. ICST/CBOS 80-2.)5 E(October 1980.)5 E 60.51 -([Neigus73] Neigus,)72 438 R(N.,)5.186 E F1 -.45(Fi)5.186 G 2.686(le T) -.45 F -.15(ra)-.55 G 2.686(nsfer Pr).15 F 2.686(otocol for the ARP)-.45 -F 5.187(AN)-.9 G(etwork.)-5.187 E F0 2.687(RFC 542, NIC)7.687 F 2.5 -(17759. In)180 450 R 2.5([Feinler78]. August,)2.5 F(1973.)2.5 E([No)72 -466.2 Q 55.21(witz78a] No)-.25 F 1.633(witz, D. A., and Lesk, M. E.,) --.25 F F1 4.132(AD)4.132 G 1.632(ial-Up Network of UNIX Systems.)-4.132 -F F0(Bell)6.632 E 5.403(Laboratories. In)180 478.2 R 2.904 -(UNIX Programmer')5.403 F 5.404(sM)-.55 G 2.904(anual, Se)-5.404 F -.15 -(ve)-.25 G 2.904(nth Edition, V).15 F 2.904(olume 2.)-1.29 F -(August, 1978.)180 490.2 Q([No)72 506.4 Q 54.65(witz78b] No)-.25 F .633 -(witz, D. A.,)-.25 F F1 .632(Uucp Implementation Description.)3.132 F F0 -.632(Bell Laboratories.)5.632 F .632(In UNIX)5.632 F(Programmer')180 -518.4 Q 2.5(sM)-.55 G(anual, Se)-2.5 E -.15(ve)-.25 G(nth Edition, V).15 -E(olume 2.)-1.29 E(October)5 E 2.5(,1)-.4 G(978.)-2.5 E 64.39 -([Postel74] Postel,)72 534.6 R .24(J., and Neigus, N., Re)2.74 F .241 -(vised FTP Reply Codes.)-.25 F .241(RFC 640, NIC 30843.)5.241 F(In)5.241 -E 2.5([Feinler78]. June,)180 546.6 R(1974.)2.5 E 64.39 -([Postel77] Postel,)72 562.8 R(J.,)2.5 E F1(Mail Pr)2.5 E(otocol.)-.45 E -F0(NIC 29588.)5 E(In [Feinler78].)5 E(No)5 E -.15(ve)-.15 G(mber 1977.) -.15 E 59.95([Postel79a] Postel,)72 579 R(J.,)3.144 E F1 .644 -(Internet Messa)3.144 F .844 -.1(ge P)-.1 H -.45(ro).1 G(tocol.).45 E F0 -.644(RFC 753, IEN 85.)5.644 F(Netw)5.644 E .644(ork Information)-.1 F -(Center)180 591 Q 2.5(,S)-.4 G(RI International, Menlo P)-2.5 E -(ark, California.)-.15 E(March 1979.)5 E 59.39([Postel79b] Postel,)72 -607.2 R 1.305(J. B.,)3.805 F F1 1.305(An Internetwork Messa)3.805 F -1.505 -.1(ge S)-.1 H(tructur).1 E -.15(e.)-.37 G F0(In)6.456 E F1(Pr) -3.806 E 1.306(oceedings of the Sixth)-.45 F -(Data Communications Symposium,)180 619.2 Q F0 2.5(IEEE. Ne)2.5 F 2.5 -(wY)-.25 G 2.5(ork. No)-3.6 F -.15(ve)-.15 G(mber 1979.).15 E 64.39 -([Postel80] Postel,)72 635.4 R .639(J. B.,)3.139 F F1 3.139(AS)3.139 G -(tructur)-3.139 E .639(ed F)-.37 F .639(ormat for T)-1.05 F -.15(ra)-.55 -G .639(nsmission of Multi-Media Documents.).15 F F0 .418(RFC 767.)180 -647.4 R(Netw)5.419 E .419(ork Information Center)-.1 F 2.919(,S)-.4 G -.419(RI International, Menlo P)-2.919 F .419(ark, Califor)-.15 F(-)-.2 E -2.5(nia. August)180 659.4 R(1980.)2.5 E 64.39([Postel82] Postel,)72 -675.6 R 2.05(J. B.,)4.55 F F1 2.05(Simple Mail T)4.55 F -.15(ra)-.55 G -2.05(nsfer Pr).15 F(otocol.)-.45 E F0 2.05 -(RFC821 \(obsoleting RFC788\).)7.05 F(Netw)180 687.6 Q .273 -(ork Information Center)-.1 F 2.774(,S)-.4 G .274 -(RI International, Menlo P)-2.774 F .274(ark, California.)-.15 F(August) -5.274 E(1982.)180 699.6 Q/F2 10/Times-Bold@0 SF 187.28 -(SMM:9-12 SENDMAIL)72 756 R 2.5<8a41>2.5 G 2.5(nI)-2.5 G(nter)-2.5 E -(netw)-.15 E(ork Mail Router)-.1 E EP -%%Page: 13 13 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(SENDMAIL \212 An Inter)72 60 Q(netw)-.15 E -(ork Mail Router)-.1 E(SMM:9-13)189.78 E/F1 10/Times-Roman@0 SF 55.5 -([Schmidt79] Schmidt,)72 96 R(E.,)2.972 E/F2 10/Times-Italic@0 SF .472 -(An Intr)2.972 F .472(oduction to the Berk)-.45 F(ele)-.1 E 2.972(yN)-.3 -G(etwork.)-2.972 E F1(Uni)5.472 E -.15(ve)-.25 G .472 -(rsity of California,).15 F(Berk)180 108 Q(ele)-.1 E 2.5(yC)-.15 G 2.5 -(alifornia. 1979.)-2.5 F 59.95([Shoens79] Shoens,)72 124.2 R(K.,)4.894 E -F2 2.394(Mail Refer)4.894 F 2.394(ence Manual.)-.37 F F1(Uni)7.394 E --.15(ve)-.25 G 2.395(rsity of California, Berk).15 F(ele)-.1 E 6.195 --.65(y. I)-.15 H(n).65 E(UNIX Programmer')180 136.2 Q 2.5(sM)-.55 G -(anual, Se)-2.5 E -.15(ve)-.25 G(nth Edition, V).15 E(olume 2C.)-1.29 E -(December 1979.)5 E 60.51([Sluizer81] Sluizer)72 152.4 R 2.872(,S)-.4 G -.372(., and Postel, J. B.,)-2.872 F F2 .372(Mail T)2.872 F -.15(ra)-.55 -G .372(nsfer Pr).15 F(otocol.)-.45 E F1 .371(RFC 780.)5.371 F(Netw)5.371 -E .371(ork Infor)-.1 F(-)-.2 E(mation Center)180 164.4 Q 2.5(,S)-.4 G -(RI International, Menlo P)-2.5 E(ark, California.)-.15 E(May 1981.)5 E -52.72([Solomon81] Solomon,)72 180.6 R .96(M., Landweber)3.46 F 3.46(,L) --.4 G .96(., and Neuhengen, D., \231The Design of the CSNET)-3.46 F -(Name Serv)180 192.6 Q(er)-.15 E 3.9 -.7(.\232 C)-.55 H(S-DN-2, Uni).7 E --.15(ve)-.25 G(rsity of W).15 E(isconsin, Madison.)-.4 E(No)5 E -.15(ve) --.15 G(mber 1981.).15 E 78.28([Su82] Su,)72 208.8 R(Za)4.344 E 1.844 -(w-Sing, and Postel, Jon,)-.15 F F2 1.844(The Domain Naming Con)4.344 F -1.844(vention for Internet)-.4 F 1.717(User Applications.)180 220.8 R F1 -4.217(RFC819. Netw)6.717 F 1.717(ork Information Center)-.1 F 4.217(,S) --.4 G 1.718(RI International,)-4.217 F(Menlo P)180 232.8 Q -(ark, California.)-.15 E(August 1982.)5 E([UNIX83])72 249 Q F2 2.12 -(The UNIX Pr)66.35 F -.1(og)-.45 G -.15(ra).1 G(mmer').15 E 4.62(sM)-.4 -G 2.12(anual, Se)-4.62 F 2.12(venth Edition,)-.15 F F1 -.6(Vi)4.62 G -2.12(rtual V).6 F 2.12(AX-11 V)-1.35 F(ersion,)-1.11 E -1.29(Vo)180 261 -S 1.027(lume 1.)1.29 F 1.027(Bell Laboratories, modi\214ed by the Uni) -6.027 F -.15(ve)-.25 G 1.027(rsity of California, Berk).15 F(e-)-.1 E -(le)180 273 Q 1.3 -.65(y, C)-.15 H 2.5(alifornia. March,).65 F(1983.)2.5 -E EP -%%Trailer -end -%%EOF diff --git a/doc/op/Makefile b/doc/op/Makefile deleted file mode 100644 index 0d86e91..0000000 --- a/doc/op/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -# @(#)Makefile 8.2 (Berkeley) 2/28/1994 - -DIR= smm/08.sendmailop -SRCS= op.me -MACROS= -me - -all: op.ps - -op.ps: ${SRCS} - rm -f ${.TARGET} - ${PIC} ${SRCS} | ${EQN} | ${ROFF} > ${.TARGET} - -.include <bsd.doc.mk> diff --git a/doc/op/op.me b/doc/op/op.me deleted file mode 100644 index e9c2e5c..0000000 --- a/doc/op/op.me +++ /dev/null @@ -1,8257 +0,0 @@ -.\" Copyright (c) 1998 Sendmail, Inc. All rights reserved. -.\" Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" By using this file, you agree to the terms and conditions set -.\" forth in the LICENSE file which can be found at the top level of -.\" the sendmail distribution. -.\" -.\" -.\" @(#)op.me 8.135 (Berkeley) 1/16/1999 -.\" -.\" eqn op.me | pic | troff -me -.eh 'SMM:08-%''Sendmail Installation and Operation Guide' -.oh 'Sendmail Installation and Operation Guide''SMM:08-%' -.\" SD is lib if sendmail is installed in /usr/lib, sbin if in /usr/sbin -.ds SD sbin -.\" SB is bin if newaliases/mailq are installed in /usr/bin, ucb if in /usr/ucb -.ds SB bin -.nr si 3n -.de $0 -.(x -.in \\$3u*3n -.ti -3n -\\$2. \\$1 -.)x -.. -.de $C -.(x -.in 0 -\\$1 \\$2. \\$3 -.)x -.. -.sc -.+c -.(l C -.sz 16 -.b SENDMAIL\u\s-6TM\s0\d -.sz 12 -.sp -.b "INSTALLATION AND OPERATION GUIDE" -.sz 10 -.sp -.r -Eric Allman -Sendmail, Inc. -eric@Sendmail.COM -.sp -Version 8.135 -.sp -For Sendmail Version 8.9 -.)l -.(f -Sendmail is a trademark of Sendmail, Inc. -.)f -.sp 2 -.pp -.i Sendmail \u\s-2TM\s0\d -implements a general purpose internetwork mail routing facility -under the UNIX\(rg -operating system. -It is not tied to any one transport protocol \*- -its function may be likened to a crossbar switch, -relaying messages from one domain into another. -In the process, -it can do a limited amount of message header editing -to put the message into a format that is appropriate -for the receiving domain. -All of this is done under the control of a configuration file. -.pp -Due to the requirements of flexibility -for -.i sendmail , -the configuration file can seem somewhat unapproachable. -However, there are only a few basic configurations -for most sites, -for which standard configuration files have been supplied. -Most other configurations -can be built by adjusting an existing configuration file -incrementally. -.pp -.i Sendmail -is based on -RFC821 (Simple Mail Transport Protocol), -RFC822 (Internet Mail Headers Format), -RFC1123 (Internet Host Requirements), -RFC2045 (MIME), -RFC1869 (SMTP Service Extensions), -RFC1652 (SMTP 8BITMIME Extension), -RFC1870 (SMTP SIZE Extension), -RFC1891 (SMTP Delivery Status Notifications), -RFC1892 (Multipart/Report), -RFC1893 (Mail System Status Codes), -RFC1894 (Delivery Status Notifications), -RFC1985 (SMTP Service Extension for Remote Message Queue Starting), -and -RFC2033 (Local Message Transmission Protocol). -However, since -.i sendmail -is designed to work in a wider world, -in many cases it can be configured to exceed these protocols. -These cases are described herein. -.pp -Although -.i sendmail -is intended to run -without the need for monitoring, -it has a number of features -that may be used to monitor or adjust the operation -under unusual circumstances. -These features are described. -.pp -Section one describes how to do a basic -.i sendmail -installation. -Section two -explains the day-to-day information you should know -to maintain your mail system. -If you have a relatively normal site, -these two sections should contain sufficient information -for you to install -.i sendmail -and keep it happy. -Section three -describes some parameters that may be safely tweaked. -Section four -has information regarding the command line arguments. -Section five -contains the nitty-gritty information about the configuration -file. -This section is for masochists -and people who must write their own configuration file. -Section six -describes configuration that can be done at compile time. -The appendixes give a brief -but detailed explanation of a number of features -not described in the rest of the paper. -.pp -.\"XXX -.b DISCLAIMER: -This documentation is under modification. -.bp -.rs -.sp |4i -.ce 2 -This page intentionally left blank; -replace it with a blank sheet for double-sided output. -.bp 7 -.sh 1 "BASIC INSTALLATION" -.pp -There are two basic steps to installing -.i sendmail . -First, you have to compile and install the binary. -If -.i sendmail -has already been ported to your operating system -that should be simple. -Second, you must build a run-time configuration file. -This is a file that -.i sendmail -reads when it starts up -that describes the mailers it knows about, -how to parse addresses, -how to rewrite the message header, -and the settings of various options. -Although the configuration file can be quite complex, -a configuration can usually be built -using an M4-based configuration language. -.pp -The remainder of this section will describe the installation of -.i sendmail -assuming you can use one of the existing configurations -and that the standard installation parameters are acceptable. -All pathnames and examples -are given from the root of the -.i sendmail -subtree, -normally -.i /usr/src/usr.\*(SD/sendmail -on 4.4BSD. -.pp -If you are loading this off the tape, -continue with the next section. -If you have a running binary already on your system, -you should probably skip to section 1.2. -.sh 2 "Compiling Sendmail" -.pp -All -.i sendmail -source is in the -.i src -subdirectory. -To compile sendmail, -.q cd -into the -.i src -directory and type -.(b -\&./Build -.)b -This will leave the binary in an appropriately named subdirectory, -e.g., -obj.BSD-OS.2.1.i386. -It works for multiple object versions -compiled out of the same directory. -.sh 3 "Tweaking the Build Invocation" -.pp -You can give parameters on the -.i Build -command. -In most cases these are only used when the -.i obj.* -directory is first created. -These commands include: -.nr ii 0.5i -.ip "\-L \fIlibdirs\fP" -A list of directories to search for libraries. -.ip "\-I \fIincdirs\fP" -A list of directories to search for include files. -.ip "\-E \fIenvar\fP=\fIvalue\fP" -Set an environment variable to an indicated -.i value -before compiling. -This is normally used to set an ABI on Irix. -.ip "\-c" -Create a new -.i obj.* -tree before running. -.ip "\-f \fIsiteconfig\fP" -Read the indicated site configuration file. -If this parameter is not specified, -.i Build -includes -.i all -of the files -.i $BUILDTOOLS/Site/site.$oscf.m4 -and -.i $BUILDTOOLS/Site/site.config.m4 , -where $BUILDTOOLS is normally -.i \&../BuildTools -and $oscf is the same name as used on the -.i obj.* -directory. -See below for a description of the site configuration file. -.ip "\-S" -Skip auto-configuration. -.i Build -will avoid auto-detecting libraries if this is set. -All libraries and map definitions must be specified -in the site configuration file. -.lp -Any other parameters are passed to the -.i make -program. -.sh 3 "Creating a Site Configuration File" -.\"XXX -.pp -(This section is not yet complete. -For now, see the file BuildTools/README for details.) -.sh 3 "Tweaking the Makefile" -.pp -.\" .b "XXX This should all be in the Site Configuration File section." -.i Sendmail -supports two different formats -for the local (on disk) version of databases, -notably the -.i aliases -database. -At least one of these should be defined if at all possible. -.nr ii 1i -.ip NDBM -The ``new DBM'' format, -available on nearly all systems around today. -This was the preferred format prior to 4.4BSD. -It allows such complex things as multiple databases -and closing a currently open database. -.ip NEWDB -The Berkeley DB package. -If you have this, use it. -It allows -long records, -multiple open databases, -real in-memory caching, -and so forth. -You can define this in conjunction with -.sm NDBM ; -if you do, -old alias databases are read, -but when a new database is created it will be in NEWDB format. -As a nasty hack, -if you have NEWDB, NDBM, and NIS defined, -and if the alias file name includes the substring -.q /yp/ , -.i sendmail -will create both new and old versions of the alias file -during a -.i newalias -command. -This is required because the Sun NIS/YP system -reads the DBM version of the alias file. -It's ugly as sin, -but it works. -.lp -If neither of these are defined, -.i sendmail -reads the alias file into memory on every invocation. -This can be slow and should be avoided. -There are also several methods for remote database access: -.ip NIS -Sun's Network Information Services (formerly YP). -.ip NISPLUS -Sun's NIS+ services. -.ip NETINFO -NeXT's NetInfo service. -.ip HESIOD -Hesiod service (from Athena). -.lp -Other compilation flags are set in conf.h -and should be predefined for you -unless you are porting to a new environment. -.sh 3 "Compilation and installation" -.pp -After making the local system configuration described above, -You should be able to compile and install the system. -The script -.q Build -is the best approach on most systems: -.(b -\&./Build -.)b -This will use -.i uname (1) -to create a custom Makefile for your environment. -.pp -If you are installing in the standard places, -you should be able to install using -.(b -\&./Build install -.)b -This should install the binary in -/usr/\*(SD -and create links from -/usr/\*(SB/newaliases -and -/usr/\*(SB/mailq -to -/usr/\*(SD/sendmail. -On 4.4BSD systems it will also format and install man pages. -.sh 2 "Configuration Files" -.pp -.i Sendmail -cannot operate without a configuration file. -The configuration defines the mail delivery mechanisms understood at this site, -how to access them, -how to forward email to remote mail systems, -and a number of tuning parameters. -This configuration file is detailed -in the later portion of this document. -.pp -The -.i sendmail -configuration can be daunting at first. -The world is complex, -and the mail configuration reflects that. -The distribution includes an m4-based configuration package -that hides a lot of the complexity. -.pp -These configuration files are simpler than old versions -largely because the world has become simpler; -in particular, -text-based host files are officially eliminated, -obviating the need to -.q hide -hosts behind a registered internet gateway. -.pp -These files also assume that most of your neighbors -use domain-based UUCP addressing; -that is, -instead of naming hosts as -.q host!user -they will use -.q host.domain!user . -The configuration files can be customized to work around this, -but it is more complex. -.pp -Our configuration files are processed by -.i m4 -to facilitate local customization; -the directory -.i cf -of the -.i sendmail -distribution directory -contains the source files. -This directory contains several subdirectories: -.nr ii 1i -.ip cf -Both site-dependent and site-independent descriptions of hosts. -These can be literal host names -(e.g., -.q ucbvax.mc ) -when the hosts are gateways -or more general descriptions -(such as -.q "generic-solaris2.mc" -as a general description of an SMTP-connected host -running Solaris 2.x. -Files ending -.b \&.mc -(``Master Configuration'') -are the input descriptions; -the output is in the corresponding -.b \&.cf -file. -The general structure of these files is described below. -.ip domain -Site-dependent subdomain descriptions. -These are tied to the way your organization wants to do addressing. -For example, -.b domain/CS.Berkeley.EDU.m4 -is our description for hosts in the CS.Berkeley.EDU subdomain. -These are referenced using the -.sm DOMAIN -.b m4 -macro in the -.b \&.mc -file. -.ip feature -Definitions of specific features that some particular host in your site -might want. -These are referenced using the -.sm FEATURE -.b m4 -macro. -An example feature is -use_cw_file -(which tells -.i sendmail -to read an /etc/sendmail.cw file on startup -to find the set of local names). -.ip hack -Local hacks, referenced using the -.sm HACK -.b m4 -macro. -Try to avoid these. -The point of having them here is to make it clear that they smell. -.ip m4 -Site-independent -.i m4 (1) -include files that have information common to all configuration files. -This can be thought of as a -.q #include -directory. -.ip mailer -Definitions of mailers, -referenced using the -.sm MAILER -.b m4 -macro. -The mailer types that are known in this distribution are -fax, -local, -smtp, -uucp, -and usenet. -For example, to include support for the UUCP-based mailers, -use -.q MAILER(uucp) . -.ip ostype -Definitions describing various operating system environments -(such as the location of support files). -These are referenced using the -.sm OSTYPE -.b m4 -macro. -.ip sh -Shell files used by the -.b m4 -build process. -You shouldn't have to mess with these. -.ip siteconfig -Local UUCP connectivity information. -This directory has been supplanted by the mailertable feature; -any new configurations should use that feature to do UUCP -(and other) routing. -.pp -If you are in a new domain -(e.g., a company), -you will probably want to create a -cf/domain -file for your domain. -This consists primarily of relay definitions -and features you want enabled site-wide: -for example, Berkeley's domain definition -defines relays for -BitNET -and UUCP. -These are specific to Berkeley, -and should be fully-qualified internet-style domain names. -Please check to make certain they are reasonable for your domain. -.pp -Subdomains at Berkeley are also represented in the -cf/domain -directory. -For example, -the domain -CS.Berkeley.EDU -is the Computer Science subdomain, -EECS.Berkeley.EDU -is the Electrical Engineering and Computer Sciences subdomain, -and -S2K.Berkeley.EDU -is the Sequoia 2000 subdomain. -You will probably have to add an entry to this directory -to be appropriate for your domain. -.pp -You will have to use or create -.b \&.mc -files in the -.i cf/cf -subdirectory for your hosts. -This is detailed in the -cf/README -file. -.sh 2 "Details of Installation Files" -.pp -This subsection describes the files that -comprise the -.i sendmail -installation. -.sh 3 "/usr/\*(SD/sendmail" -.pp -The binary for -.i sendmail -is located in /usr/\*(SD\**. -.(f -\**This is usually -/usr/sbin -on 4.4BSD and newer systems; -many systems install it in -/usr/lib. -I understand it is in /usr/ucblib -on System V Release 4. -.)f -It should be setuid root. -For security reasons, -/, /usr, and /usr/\*(SD -should be owned by root, mode 755\**. -.(f -\**Some vendors ship them owned by bin; -this creates a security hole that is not actually related to -.i sendmail . -Other important directories that should have restrictive ownerships -and permissions are -/bin, /usr/bin, /etc, /usr/etc, /lib, and /usr/lib. -.)f -.sh 3 "/etc/sendmail.cf" -.pp -This is the configuration file for -.i sendmail \**. -.(f -\**Actually, the pathname varies depending on the operating system; -/etc is the preferred directory. -Some older systems install it in -.b /usr/lib/sendmail.cf , -and I've also seen it in -.b /usr/ucblib -and -.b /etc/mail . -If you want to move this file, -add -D_PATH_SENDMAILCF=\e"/file/name\e" -to the flags passed to the C compiler. -Moving this file is not recommended: -other programs and scripts know of this location. -.)f -This is the only non-library file name compiled into -.i sendmail \**. -.(f -\**The system libraries can reference other files; -in particular, system library subroutines that -.i sendmail -calls probably reference -.i /etc/passwd -and -.i /etc/resolv.conf . -.)f -.pp -The configuration file is normally created -using the distribution files described above. -If you have a particularly unusual system configuration -you may need to create a special version. -The format of this file is detailed in later sections -of this document. -.sh 3 "/usr/\*(SB/newaliases" -.pp -The -.i newaliases -command should just be a link to -.i sendmail : -.(b -rm \-f /usr/\*(SB/newaliases -ln \-s /usr/\*(SD/sendmail /usr/\*(SB/newaliases -.)b -This can be installed in whatever search path you prefer -for your system. -.sh 3 "/usr/\*(SB/hoststat" -.pp -The -.i hoststat -command should just be a link to -.i sendmail , -in a fashion similar to -.i newaliases . -This command lists the status of the last mail transaction -with all remote hosts. The -.b \-v -flag will prevent the status display from being truncated. -It functions only when the -.b HostStatusDirectory -option is set. -.sh 3 "/usr/\*(SB/purgestat" -.pp -This command is also a link to -.i sendmail . -It flushes all information that is stored in the -.b HostStatusDirectory -tree. -.sh 3 "/var/spool/mqueue" -.pp -The directory -.i /var/spool/mqueue -should be created to hold the mail queue. -This directory should be mode 700 -and owned by root. -.pp -The actual path of this directory -is defined in the -.b Q -option of the -.i sendmail.cf -file. -.sh 3 "/var/spool/mqueue/.hoststat" -.pp -This is a typical value for the -.b HostStatusDirectory -option, -containing one file per host -that this sendmail has chatted with recently. -It is normally a subdirectory of -.i mqueue . -.sh 3 "/etc/aliases*" -.pp -The system aliases are held in -.q /etc/aliases . -A sample is given in -.q lib/aliases -which includes some aliases which -.i must -be defined: -.(b -cp lib/aliases /etc/aliases -.i "edit /etc/aliases" -.)b -You should extend this file with any aliases that are apropos to your system. -.pp -Normally -.i sendmail -looks at a database version of the files, -stored either in -.q /etc/aliases.dir -and -.q /etc/aliases.pag -or -.q /etc/aliases.db -depending on which database package you are using. -The actual path of this file -is defined in the -.b AliasFile -option of the -.i sendmail.cf -file. -.sh 3 "/etc/rc or /etc/init.d/sendmail" -.pp -It will be necessary to start up the -.i sendmail -daemon when your system reboots. -This daemon performs two functions: -it listens on the SMTP socket for connections -(to receive mail from a remote system) -and it processes the queue periodically -to insure that mail gets delivered when hosts come up. -.pp -Add the following lines to -.q /etc/rc -(or -.q /etc/rc.local -as appropriate) -in the area where it is starting up the daemons -on a BSD-base system, -or on a System-V-based system -in one of the startup files, typically -.q /etc/init.d/sendmail : -.(b -if [ \-f /usr/\*(SD/sendmail \-a \-f /etc/sendmail.cf ]; then - (cd /var/spool/mqueue; rm \-f [lnx]f*) - /usr/\*(SD/sendmail \-bd \-q30m & - echo \-n ' sendmail' >/dev/console -fi -.)b -The -.q cd -and -.q rm -commands insure that all lock files have been removed; -extraneous lock files may be left around -if the system goes down in the middle of processing a message. -The line that actually invokes -.i sendmail -has two flags: -.q \-bd -causes it to listen on the SMTP port, -and -.q \-q30m -causes it to run the queue every half hour. -.pp -Some people use a more complex startup script, -removing zero length qf files and df files for which there is no qf file. -For example, see Figure 1 -for an example of a complex script which does this clean up. -.(z -.hl -#!/bin/sh -# remove zero length qf files -for qffile in qf* -do - if [ \-r $qffile ] - then - if [ ! \-s $qffile ] - then - echo \-n " <zero: $qffile>" > /dev/console - rm \-f $qffile - fi - fi -done -# rename tf files to be qf if the qf does not exist -for tffile in tf* -do - qffile=`echo $tffile | sed 's/t/q/'` - if [ \-r $tffile \-a ! \-f $qffile ] - then - echo \-n " <recovering: $tffile>" > /dev/console - mv $tffile $qffile - else - if [ \-f $tffile ] - then - echo \-n " <extra: $tffile>" > /dev/console - rm \-f $tffile - fi - fi -done -# remove df files with no corresponding qf files -for dffile in df* -do - qffile=`echo $dffile | sed 's/d/q/'` - if [ \-r $dffile \-a ! \-f $qffile ] - then - echo \-n " <incomplete: $dffile>" > /dev/console - mv $dffile `echo $dffile | sed 's/d/D/'` - fi -done -# announce files that have been saved during disaster recovery -for xffile in [A-Z]f* -do - if [ \-f $xffile ] - then - echo \-n " <panic: $xffile>" > /dev/console - fi -done -.sp -.ce -Figure 1 \(em A complex startup script -.hl -.)z -.pp -If you are not running a version of UNIX -that supports Berkeley TCP/IP, -do not include the -.b \-bd -flag. -.sh 3 "/usr/lib/sendmail.hf" -.pp -This is the help file used by the SMTP -.b HELP -command. -It should be copied from -.q lib/sendmail.hf : -.(b -cp lib/sendmail.hf /usr/lib -.)b -The actual path of this file -is defined in the -.b HelpFile -option of the -.i sendmail.cf -file. -.sh 3 "/etc/sendmail.st" -.pp -If you wish to collect statistics -about your mail traffic, -you should create the file -.q /etc/sendmail.st : -.(b -cp /dev/null /etc/sendmail.st -chmod 644 /etc/sendmail.st -.)b -This file does not grow. -It is printed with the program -.q mailstats/mailstats.c. -The actual path of this file -is defined in the -.b S -option of the -.i sendmail.cf -file. -.sh 3 "/usr/\*(SB/mailq" -.pp -If -.i sendmail -is invoked as -.q mailq, -it will simulate the -.b \-bp -flag -(i.e., -.i sendmail -will print the contents of the mail queue; -see below). -This should be a link to /usr/\*(SD/sendmail. -.sh 1 "NORMAL OPERATIONS" -.sh 2 "The System Log" -.pp -The system log is supported by the -.i syslogd \|(8) -program. -All messages from -.i sendmail -are logged under the -.sm LOG_MAIL -facility\**. -.(f -\**Except on Ultrix, -which does not support facilities in the syslog. -.)f -.sh 3 "Format" -.pp -Each line in the system log -consists of a timestamp, -the name of the machine that generated it -(for logging from several machines -over the local area network), -the word -.q sendmail: , -and a message\**. -.(f -\**This format may vary slightly if your vendor has changed -the syntax. -.)f -Most messages are a sequence of -.i name \c -=\c -.i value -pairs. -.pp -The two most common lines are logged when a message is processed. -The first logs the receipt of a message; -there will be exactly one of these per message. -Some fields may be omitted if they do not contain interesting information. -Fields are: -.ip from -The envelope sender address. -.ip size -The size of the message in bytes. -.ip class -The class (i.e., numeric precedence) of the message. -.ip pri -The initial message priority (used for queue sorting). -.ip nrcpts -The number of envelope recipients for this message -(after aliasing and forwarding). -.ip msgid -The message id of the message (from the header). -.ip proto -The protocol used to receive this message (e.g., ESMTP or UUCP) -.ip relay -The machine from which it was received. -.lp -There is also one line logged per delivery attempt -(so there can be several per message if delivery is deferred -or there are multiple recipients). -Fields are: -.ip to -A comma-separated list of the recipients to this mailer. -.ip ctladdr -The ``controlling user'', that is, the name of the user -whose credentials we use for delivery. -.ip delay -The total delay between the time this message was received -and the time it was delivered. -.ip xdelay -The amount of time needed in this delivery attempt -(normally indicative of the speed of the connection). -.ip mailer -The name of the mailer used to deliver to this recipient. -.ip relay -The name of the host that actually accepted (or rejected) this recipient. -.ip stat -The delivery status. -.lp -Not all fields are present in all messages; -for example, the relay is not listed for local deliveries. -.sh 3 "Levels" -.pp -If you have -.i syslogd \|(8) -or an equivalent installed, -you will be able to do logging. -There is a large amount of information that can be logged. -The log is arranged as a succession of levels. -At the lowest level -only extremely strange situations are logged. -At the highest level, -even the most mundane and uninteresting events -are recorded for posterity. -As a convention, -log levels under ten -are considered generally -.q useful; -log levels above 64 -are reserved for debugging purposes. -Levels from 11\-64 are reserved for verbose information -that some sites might want. -.pp -A complete description of the log levels -is given in section -.\" XREF -4.6. -.sh 2 "Dumping State" -.pp -You can ask -.i sendmail -to log a dump of the open files -and the connection cache -by sending it a -.sm SIGUSR1 -signal. -The results are logged at -.sm LOG_DEBUG -priority. -.sh 2 "The Mail Queue" -.pp -Sometimes a host cannot handle a message immediately. -For example, it may be down or overloaded, causing it to refuse connections. -The sending host is then expected to save this message in -its mail queue -and attempt to deliver it later. -.pp -Under normal conditions the mail queue will be processed transparently. -However, you may find that manual intervention is sometimes necessary. -For example, -if a major host is down for a period of time -the queue may become clogged. -Although -.i sendmail -ought to recover gracefully when the host comes up, -you may find performance unacceptably bad in the meantime. -.sh 3 "Printing the queue" -.pp -The contents of the queue can be printed -using the -.i mailq -command -(or by specifying the -.b \-bp -flag to -.i sendmail ): -.(b -mailq -.)b -This will produce a listing of the queue id's, -the size of the message, -the date the message entered the queue, -and the sender and recipients. -.sh 3 "Forcing the queue" -.pp -.i Sendmail -should run the queue automatically -at intervals. -The algorithm is to read and sort the queue, -and then to attempt to process all jobs in order. -When it attempts to run the job, -.i sendmail -first checks to see if the job is locked. -If so, it ignores the job. -.pp -There is no attempt to insure that only one queue processor -exists at any time, -since there is no guarantee that a job cannot take forever -to process -(however, -.i sendmail -does include heuristics to try to abort jobs -that are taking absurd amounts of time; -technically, this violates RFC 821, but is blessed by RFC 1123). -Due to the locking algorithm, -it is impossible for one job to freeze the entire queue. -However, -an uncooperative recipient host -or a program recipient -that never returns -can accumulate many processes in your system. -Unfortunately, -there is no completely general way to solve this. -.pp -In some cases, -you may find that a major host going down -for a couple of days -may create a prohibitively large queue. -This will result in -.i sendmail -spending an inordinate amount of time -sorting the queue. -This situation can be fixed by moving the queue to a temporary place -and creating a new queue. -The old queue can be run later when the offending host returns to service. -.pp -To do this, -it is acceptable to move the entire queue directory: -.(b -cd /var/spool -mv mqueue omqueue; mkdir mqueue; chmod 700 mqueue -.)b -You should then kill the existing daemon -(since it will still be processing in the old queue directory) -and create a new daemon. -.pp -To run the old mail queue, -run the following command: -.(b -/usr/\*(SD/sendmail \-oQ/var/spool/omqueue \-q -.)b -The -.b \-oQ -flag specifies an alternate queue directory -and the -.b \-q -flag says to just run every job in the queue. -If you have a tendency toward voyeurism, -you can use the -.b \-v -flag to watch what is going on. -.pp -When the queue is finally emptied, -you can remove the directory: -.(b -rmdir /var/spool/omqueue -.)b -.sh 2 "Disk Based Connection Information" -.pp -.i Sendmail -stores a large amount of information about each remote system it -has connected to in memory. It is now possible to preserve some -of this information on disk as well, by using the -.b HostStatusDirectory -option, so that it may be shared between several invocations of -.i sendmail . -This allows mail to be queued immediately or skipped during a queue run if -there has been a recent failure in connecting to a remote machine. -.pp -Additionally enabling -.b SingleThreadDelivery -has the added effect of single-threading mail delivery to a destination. -This can be quite helpful -if the remote machine is running an SMTP server that is easily overloaded -or cannot accept more than a single connection at a time, -but can cause some messages to be punted to a future queue run. -It also applies to -.i all -hosts, so setting this because you have one machine on site -that runs some software that is easily overrun -can cause mail to other hosts to be slowed down. -If this option is set, -you probably want to set the -.b MinQueueAge -option as well and run the queue fairly frequently; -this way jobs that are skipped because another -.i sendmail -is talking to the same host will be tried again quickly -rather than being delayed for a long time. -.pp -The disk based host information is stored in a subdirectory of the -.b mqueue -directory called -.b \&.hoststat \**. -.(f -\**This is the usual value of the -.b HostStatusDirectory -option; -it can, of course, go anywhere you like in your filesystem. -.)f -Removing this directory and its subdirectories has an effect similar to -the -.i purgestat -command and is completely safe. -The information in these directories can -be perused with the -.i hoststat -command, which will indicate the host name, the last access, and the -status of that access. -An asterisk in the left most column indicates that a -.i sendmail -process currently has the host locked for mail delivery. -.pp -The disk based connection information is treated the same way as memory based -connection information for the purpose of timeouts. -By default, information about host failures is valid for 30 minutes. -This can be adjusted with -the -.b Timeout.hoststatus -option. -.pp -The connection information stored on disk may be purged at any time -with the -.i purgestat -command or by invoking sendmail with the -.b \-bH -switch. -The connection information may be viewed with the -.i hoststat -command or by invoking sendmail with the -.b \-bh -switch. -.sh 2 "The Service Switch" -.pp -The implementation of certain system services -such as host and user name lookup -is controlled by the service switch. -If the host operating system supports such a switch -.i sendmail -will use the native version. -Ultrix, Solaris, and DEC OSF/1 are examples of such systems\**. -.(f -\**HP-UX 10 has service switch support, -but since the APIs are apparently not available in the libraries -.i sendmail -does not use the native service switch in this release. -.)f -.pp -If the underlying operating system does not support a service switch -(e.g., SunOS 4.X, HP-UX, BSD) -then -.i sendmail -will provide a stub implementation. -The -.b ServiceSwitchFile -option points to the name of a file that has the service definitions. -Each line has the name of a service -and the possible implementations of that service. -For example, the file: -.(b -hosts dns files nis -aliases files nis -.)b -will ask -.i sendmail -to look for hosts in the Domain Name System first. -If the requested host name is not found, -it tries local files, -and if that fails it tries NIS. -Similarly, -when looking for aliases -it will try the local files first -followed by NIS. -.pp -Service switches are not completely integrated. -For example, despite the fact that the host entry listed in the above example -specifies to look in NIS, -on SunOS this won't happen because the system implementation of -.i gethostbyname \|(3) -doesn't understand this. -If there is enough demand -.i sendmail -may reimplement -.i gethostbyname \|(3), -.i gethostbyaddr \|(3), -.i getpwent \|(3), -and the other system routines that would be necessary -to make this work seamlessly. -.sh 2 "The Alias Database" -.pp -After recipient addresses are read from the SMTP connection -or command line -they are parsed by ruleset 0, -which must resolve to a -{\c -.i mailer , -.i host , -.i user } -triple. -If the flags selected by the -.i mailer -include the -.b A -(aliasable) flag, -the -.i user -part of the triple is looked up as the key -(i.e., the left hand side) -into the alias database. -If there is a match, the address is deleted from the send queue -and all addresses on the right hand side of the alias -are added in place of the alias that was found. -This is a recursive operation, -so aliases found in the right hand side of the alias -are similarly expanded. -.pp -The alias database exists in two forms. -One is a text form, -maintained in the file -.i /etc/aliases. -The aliases are of the form -.(b -name: name1, name2, ... -.)b -Only local names may be aliased; -e.g., -.(b -eric@prep.ai.MIT.EDU: eric@CS.Berkeley.EDU -.)b -will not have the desired effect -(except on prep.ai.MIT.EDU, -and they probably don't want me)\**. -.(f -\**Actually, any mailer that has the `A' mailer flag set -will permit aliasing; -this is normally limited to the local mailer. -.)f -Aliases may be continued by starting any continuation lines -with a space or a tab. -Blank lines and lines beginning with a sharp sign -(\c -.q # ) -are comments. -.pp -The second form is processed by the -.i ndbm \|(3)\** -.(f -\**The -.i gdbm -package does not work. -.)f -or the Berkeley DB library. -This form is in the file -.i /etc/aliases.db -(if using NEWDB) -or -.i /etc/aliases.dir -and -.i /etc/aliases.pag -(if using NDBM). -This is the form that -.i sendmail -actually uses to resolve aliases. -This technique is used to improve performance. -.pp -The control of search order is actually set by the service switch. -Essentially, the entry -.(b -O AliasFile=switch:aliases -.)b -is always added as the first alias entry; -also, the first alias file name without a class -(e.g., without -.q nis: -on the front) -will be used as the name of the file for a ``files'' entry -in the aliases switch. -For example, if the configuration file contains -.(b -O AliasFile=/etc/aliases -.)b -and the service switch contains -.(b -aliases nis files nisplus -.)b -then aliases will first be searched in the NIS database, -then in /etc/aliases, -then in the NIS+ database. -.pp -You can also use -.sm NIS -based -alias files. -For example, the specification: -.(b -O AliasFile=/etc/aliases -O AliasFile=nis:mail.aliases@my.nis.domain -.)b -will first search the /etc/aliases file -and then the map named -.q mail.aliases -in -.q my.nis.domain . -Warning: if you build your own -.sm NIS -based -alias files, -be sure to provide the -.b \-l -flag to -.i makedbm (8) -to map upper case letters in the keys to lower case; -otherwise, aliases with upper case letters in their names -won't match incoming addresses. -.pp -Additional flags can be added after the colon -exactly like a -.b K -line \(em for example: -.(b -O AliasFile=nis:\-N mail.aliases@my.nis.domain -.)b -will search the appropriate NIS map and always include null bytes in the key. -Also: -.(b -O AliasFile=nis:\-f mail.aliases@my.nis.domain -.)b -will prevent sendmail from downcasing the key before the alias lookup. -.sh 3 "Rebuilding the alias database" -.pp -The -.i hash -or -.i dbm -version of the database -may be rebuilt explicitly by executing the command -.(b -newaliases -.)b -This is equivalent to giving -.i sendmail -the -.b \-bi -flag: -.(b -/usr/\*(SD/sendmail \-bi -.)b -.pp -If the -.b RebuildAliases -(old -.b D ) -option is specified in the configuration, -.i sendmail -will rebuild the alias database automatically -if possible -when it is out of date. -Auto-rebuild can be dangerous -on heavily loaded machines -with large alias files; -if it might take more than the rebuild timeout -(option -.b AliasWait , -old -.b a , -which is normally five minutes) -to rebuild the database, -there is a chance that several processes will start the rebuild process -simultaneously. -.pp -If you have multiple aliases databases specified, -the -.b \-bi -flag rebuilds all the database types it understands -(for example, it can rebuild NDBM databases but not NIS databases). -.sh 3 "Potential problems" -.pp -There are a number of problems that can occur -with the alias database. -They all result from a -.i sendmail -process accessing the DBM version -while it is only partially built. -This can happen under two circumstances: -One process accesses the database -while another process is rebuilding it, -or the process rebuilding the database dies -(due to being killed or a system crash) -before completing the rebuild. -.pp -Sendmail has three techniques to try to relieve these problems. -First, it ignores interrupts while rebuilding the database; -this avoids the problem of someone aborting the process -leaving a partially rebuilt database. -Second, -it locks the database source file during the rebuild \(em -but that may not work over NFS or if the file is unwritable. -Third, -at the end of the rebuild -it adds an alias of the form -.(b -@: @ -.)b -(which is not normally legal). -Before -.i sendmail -will access the database, -it checks to insure that this entry exists\**. -.(f -\**The -.b AliasWait -option is required in the configuration -for this action to occur. -This should normally be specified. -.)f -.sh 3 "List owners" -.pp -If an error occurs on sending to a certain address, -say -.q \fIx\fP , -.i sendmail -will look for an alias -of the form -.q owner-\fIx\fP -to receive the errors. -This is typically useful -for a mailing list -where the submitter of the list -has no control over the maintenance of the list itself; -in this case the list maintainer would be the owner of the list. -For example: -.(b -unix-wizards: eric@ucbarpa, wnj@monet, nosuchuser, - sam@matisse -owner-unix-wizards: unix-wizards-request -unix-wizards-request: eric@ucbarpa -.)b -would cause -.q eric@ucbarpa -to get the error that will occur -when someone sends to -unix-wizards -due to the inclusion of -.q nosuchuser -on the list. -.pp -List owners also cause the envelope sender address to be modified. -The contents of the owner alias are used if they point to a single user, -otherwise the name of the alias itself is used. -For this reason, and to obey Internet conventions, -the -.q owner- -address normally points at the -.q -request -address; this causes messages to go out with the typical Internet convention -of using ``\c -.i list -request'' -as the return address. -.sh 2 "User Information Database" -.pp -If you have a version of -.i sendmail -with the user information database -compiled in, -and you have specified one or more databases using the -.b U -option, -the databases will be searched for a -.i user :maildrop -entry. -If found, the mail will be sent to the specified address. -.sh 2 "Per-User Forwarding (.forward Files)" -.pp -As an alternative to the alias database, -any user may put a file with the name -.q .forward -in his or her home directory. -If this file exists, -.i sendmail -redirects mail for that user -to the list of addresses listed in the .forward file. -For example, if the home directory for user -.q mckusick -has a .forward file with contents: -.(b -mckusick@ernie -kirk@calder -.)b -then any mail arriving for -.q mckusick -will be redirected to the specified accounts. -.pp -Actually, the configuration file defines a sequence of filenames to check. -By default, this is the user's .forward file, -but can be defined to be more generally using the -.b ForwardPath -option. -If you change this, -you will have to inform your user base of the change; -\&.forward is pretty well incorporated into the collective subconscious. -.sh 2 "Special Header Lines" -.pp -Several header lines have special interpretations -defined by the configuration file. -Others have interpretations built into -.i sendmail -that cannot be changed without changing the code. -These builtins are described here. -.sh 3 "Errors-To:" -.pp -If errors occur anywhere during processing, -this header will cause error messages to go to -the listed addresses. -This is intended for mailing lists. -.pp -The Errors-To: header was created in the bad old days -when UUCP didn't understand the distinction between an envelope and a header; -this was a hack to provide what should now be passed -as the envelope sender address. -It should go away. -It is only used if the -.b UseErrorsTo -option is set. -.pp -The Errors-To: header is officially deprecated -and will go away in a future release. -.sh 3 "Apparently-To:" -.pp -RFC 822 requires at least one recipient field -(To:, Cc:, or Bcc: line) -in every message. -If a message comes in with no recipients listed in the message -then -.i sendmail -will adjust the header based on the -.q NoRecipientAction -option. -One of the possible actions is to add an -.q "Apparently-To:" -header line for any recipients it is aware of. -.pp -The Apparently-To: header is non-standard -and is deprecated. -.sh 3 "Precedence" -.pp -The Precedence: header can be used as a crude control of message priority. -It tweaks the sort order in the queue -and can be configured to change the message timeout values. -.sh 2 "IDENT Protocol Support" -.pp -.i Sendmail -supports the IDENT protocol as defined in RFC 1413. -Although this enhances identification -of the author of an email message -by doing a ``call back'' to the originating system to include -the owner of a particular TCP connection -in the audit trail -it is in no sense perfect; -a determined forger can easily spoof the IDENT protocol. -The following description is excerpted from RFC 1413: -.ba +5 -.lp -6. Security Considerations -.lp -The information returned by this protocol is at most as trustworthy -as the host providing it OR the organization operating the host. For -example, a PC in an open lab has few if any controls on it to prevent -a user from having this protocol return any identifier the user -wants. Likewise, if the host has been compromised the information -returned may be completely erroneous and misleading. -.lp -The Identification Protocol is not intended as an authorization or -access control protocol. At best, it provides some additional -auditing information with respect to TCP connections. At worst, it -can provide misleading, incorrect, or maliciously incorrect -information. -.lp -The use of the information returned by this protocol for other than -auditing is strongly discouraged. Specifically, using Identification -Protocol information to make access control decisions - either as the -primary method (i.e., no other checks) or as an adjunct to other -methods may result in a weakening of normal host security. -.lp -An Identification server may reveal information about users, -entities, objects or processes which might normally be considered -private. An Identification server provides service which is a rough -analog of the CallerID services provided by some phone companies and -many of the same privacy considerations and arguments that apply to -the CallerID service apply to Identification. If you wouldn't run a -"finger" server due to privacy considerations you may not want to run -this protocol. -.ba -.lp -In some cases your system may not work properly with IDENT support -due to a bug in the TCP/IP implementation. -The symptoms will be that for some hosts -the SMTP connection will be closed -almost immediately. -If this is true or if you do not want to use IDENT, -you should set the IDENT timeout to zero; -this will disable the IDENT protocol. -.sh 1 "ARGUMENTS" -.pp -The complete list of arguments to -.i sendmail -is described in detail in Appendix A. -Some important arguments are described here. -.sh 2 "Queue Interval" -.pp -The amount of time between forking a process -to run through the queue -is defined by the -.b \-q -flag. -If you run with delivery mode set to -.b i -or -.b b -this can be relatively large, -since it will only be relevant -when a host that was down comes back up. -If you run in -.b q -mode -it should be relatively short, -since it defines the maximum amount of time that a message -may sit in the queue. -(See also the MinQueueAge option.) -.pp -RFC 1123 section 5.3.1.1 says that this value should be at least 30 minutes -(although that probably doesn't make sense if you use ``queue-only'' mode). -.sh 2 "Daemon Mode" -.pp -If you allow incoming mail over an IPC connection, -you should have a daemon running. -This should be set by your -.i /etc/rc -file using the -.b \-bd -flag. -The -.b \-bd -flag and the -.b \-q -flag may be combined in one call: -.(b -/usr/\*(SD/sendmail \-bd \-q30m -.)b -.pp -An alternative approach is to invoke sendmail from -.i inetd (8) -(use the -.b \-bs -flag to ask sendmail to speak SMTP on its standard input and output). -This works and allows you to wrap -.i sendmail -in a TCP wrapper program, -but may be a bit slower since the configuration file -has to be re-read on every message that comes in. -If you do this, you still need to have a -.i sendmail -running to flush the queue: -.(b -/usr/\*(SD/sendmail \-q30m -.)b -.sh 2 "Forcing the Queue" -.pp -In some cases you may find that the queue has gotten clogged for some reason. -You can force a queue run -using the -.b \-q -flag (with no value). -It is entertaining to use the -.b \-v -flag (verbose) -when this is done to watch what happens: -.(b -/usr/\*(SD/sendmail \-q \-v -.)b -.pp -You can also limit the jobs to those with a particular queue identifier, -sender, or recipient -using one of the queue modifiers. -For example, -.q \-qRberkeley -restricts the queue run to jobs that have the string -.q berkeley -somewhere in one of the recipient addresses. -Similarly, -.q \-qSstring -limits the run to particular senders and -.q \-qIstring -limits it to particular queue identifiers. -.sh 2 "Debugging" -.pp -There are a fairly large number of debug flags -built into -.i sendmail . -Each debug flag has a number and a level, -where higher levels means to print out more information. -The convention is that levels greater than nine are -.q absurd, -i.e., -they print out so much information that you wouldn't normally -want to see them except for debugging that particular piece of code. -Debug flags are set using the -.b \-d -option; -the syntax is: -.(b -.ta \w'debug-option 'u -debug-flag: \fB\-d\fP debug-list -debug-list: debug-option [ , debug-option ]* -debug-option: debug-range [ . debug-level ] -debug-range: integer | integer \- integer -debug-level: integer -.)b -where spaces are for reading ease only. -For example, -.(b -\-d12 Set flag 12 to level 1 -\-d12.3 Set flag 12 to level 3 -\-d3\-17 Set flags 3 through 17 to level 1 -\-d3\-17.4 Set flags 3 through 17 to level 4 -.)b -For a complete list of the available debug flags -you will have to look at the code -(they are too dynamic to keep this documentation up to date). -.sh 2 "Changing the Values of Options" -.pp -Options can be overridden using the -.b \-o -or -.b \-O -command line flags. -For example, -.(b -/usr/\*(SD/sendmail \-oT2m -.)b -sets the -.b T -(timeout) option to two minutes -for this run only; -the equivalent line using the long option name is -.(b -/usr/\*(SD/sendmail -OTimeout.queuereturn=2m -.)b -.pp -Some options have security implications. -Sendmail allows you to set these, -but relinquishes its setuid root permissions thereafter\**. -.(f -\**That is, it sets its effective uid to the real uid; -thus, if you are executing as root, -as from root's crontab file or during system startup -the root permissions will still be honored. -.)f -.sh 2 "Trying a Different Configuration File" -.pp -An alternative configuration file -can be specified using the -.b \-C -flag; for example, -.(b -/usr/\*(SD/sendmail \-Ctest.cf \-oQ/tmp/mqueue -.)b -uses the configuration file -.i test.cf -instead of the default -.i /etc/sendmail.cf. -If the -.b \-C -flag has no value -it defaults to -.i sendmail.cf -in the current directory. -.pp -.i Sendmail -gives up its setuid root permissions -when you use this flag, so it is common to use a publicly writable directory -(such as /tmp) -as the spool directory (QueueDirectory or Q option) while testing. -.sh 2 "Logging Traffic" -.pp -Many SMTP implementations do not fully implement the protocol. -For example, some personal computer based SMTPs -do not understand continuation lines in reply codes. -These can be very hard to trace. -If you suspect such a problem, you can set traffic logging using the -.b \-X -flag. -For example, -.(b -/usr/\*(SD/sendmail \-X /tmp/traffic \-bd -.)b -will log all traffic in the file -.i /tmp/traffic . -.pp -This logs a lot of data very quickly and should -.b NEVER -be used -during normal operations. -After starting up such a daemon, -force the errant implementation to send a message to your host. -All message traffic in and out of -.i sendmail , -including the incoming SMTP traffic, -will be logged in this file. -.sh 2 "Testing Configuration Files" -.pp -When you build a configuration table, -you can do a certain amount of testing -using the -.q "test mode" -of -.i sendmail . -For example, -you could invoke -.i sendmail -as: -.(b -sendmail \-bt \-Ctest.cf -.)b -which would read the configuration file -.q test.cf -and enter test mode. -In this mode, -you enter lines of the form: -.(b -rwset address -.)b -where -.i rwset -is the rewriting set you want to use -and -.i address -is an address to apply the set to. -Test mode shows you the steps it takes -as it proceeds, -finally showing you the address it ends up with. -You may use a comma separated list of rwsets -for sequential application of rules to an input. -For example: -.(b -3,1,21,4 monet:bollard -.)b -first applies ruleset three to the input -.q monet:bollard. -Ruleset one is then applied to the output of ruleset three, -followed similarly by rulesets twenty-one and four. -.pp -If you need more detail, -you can also use the -.q \-d21 -flag to turn on more debugging. -For example, -.(b -sendmail \-bt \-d21.99 -.)b -turns on an incredible amount of information; -a single word address -is probably going to print out several pages worth of information. -.pp -You should be warned that internally, -.i sendmail -applies ruleset 3 to all addresses. -In test mode -you will have to do that manually. -For example, older versions allowed you to use -.(b -0 bruce@broadcast.sony.com -.)b -This version requires that you use: -.(b -3,0 bruce@broadcast.sony.com -.)b -.pp -As of version 8.7, -some other syntaxes are available in test mode: -.bu -\&.D\|x\|value -defines macro -.i x -to have the indicated -.i value . -This is useful when debugging rules that use the -.b $& \c -.i x -syntax. -.bu -\&.C\|c\|value -adds the indicated -.i value -to class -.i c . -.bu -\&.S\|ruleset -dumps the contents of the indicated ruleset. -.bu -\-d\|debug-spec -is equivalent to the command-line flag. -.sh 2 "Persistent Host Status Information" -.pp -When -.b HostStatusDirectory -is enabled, -information about the status of hosts is maintained on disk -and can thus be shared between different instantiations of -.i sendmail . -The status of the last connection with each remote host -may be viewed with the command: -.(b -sendmail \-bh -.)b -This information may be flushed with the command: -.(b -sendmail \-bH -.)b -Flushing the information prevents new -.i sendmail -processes from loading it, -but does not prevent existing processes from using the status information -that they already have. -.sh 1 "TUNING" -.pp -There are a number of configuration parameters -you may want to change, -depending on the requirements of your site. -Most of these are set -using an option in the configuration file. -For example, -the line -.q "O Timeout.queuereturn=5d" -sets option -.q Timeout.queuereturn -to the value -.q 5d -(five days). -.pp -Most of these options have appropriate defaults for most sites. -However, -sites having very high mail loads may find they need to tune them -as appropriate for their mail load. -In particular, -sites experiencing a large number of small messages, -many of which are delivered to many recipients, -may find that they need to adjust the parameters -dealing with queue priorities. -.pp -All versions of -.i sendmail -prior to 8.7 -had single character option names. -As of 8.7, -options have long (multi-character names). -Although old short names are still accepted, -most new options do not have short equivalents. -.pp -This section only describes the options you are most likely -to want to tweak; -read section -.\"XREF -5 -for more details. -.sh 2 "Timeouts" -.pp -All time intervals are set -using a scaled syntax. -For example, -.q 10m -represents ten minutes, whereas -.q 2h30m -represents two and a half hours. -The full set of scales is: -.(b -.ta 4n -s seconds -m minutes -h hours -d days -w weeks -.)b -.sh 3 "Queue interval" -.pp -The argument to the -.b \-q -flag -specifies how often a sub-daemon will run the queue. -This is typically set to between fifteen minutes -and one hour. -RFC 1123 section 5.3.1.1 recommends that this be at least 30 minutes. -.sh 3 "Read timeouts" -.pp -Timeouts all have option names -.q Timeout.\fIsuboption\fP . -The recognized -.i suboption s, -their default values, and the minimum values -allowed by RFC 1123 section 5.3.2 are: -.nr ii 1i -.ip connect -The time to wait for an SMTP connection to open -(the -.i connect (2) -system call) -[0, unspecified]. -If zero, uses the kernel default. -In no case can this option extend the timeout -longer than the kernel provides, but it can shorten it. -This is to get around kernels that provide an absurdly long connection timeout -(90 minutes in one case). -.ip iconnect -The same as -.i connect, -except it applies only to the initial attempt to connect to a host -for a given message -[0, unspecified]. -The concept is that this should be very short (a few seconds); -hosts that are well connected and responsive will thus be serviced immediately. -Hosts that are slow will not hold up other deliveries in the initial -delivery attempt. -.ip initial -The wait for the initial 220 greeting message -[5m, 5m]. -.ip helo -The wait for a reply from a HELO or EHLO command -[5m, unspecified]. -This may require a host name lookup, so -five minutes is probably a reasonable minimum. -.ip mail\(dg -The wait for a reply from a MAIL command -[10m, 5m]. -.ip rcpt\(dg -The wait for a reply from a RCPT command -[1h, 5m]. -This should be long -because it could be pointing at a list -that takes a long time to expand -(see below). -.ip datainit\(dg -The wait for a reply from a DATA command -[5m, 2m]. -.ip datablock\(dg -The wait for reading a data block -(that is, the body of the message). -[1h, 3m]. -This should be long because it also applies to programs -piping input to -.i sendmail -which have no guarantee of promptness. -.ip datafinal\(dg -The wait for a reply from the dot terminating a message. -[1h, 10m]. -If this is shorter than the time actually needed -for the receiver to deliver the message, -duplicates will be generated. -This is discussed in RFC 1047. -.ip rset -The wait for a reply from a RSET command -[5m, unspecified]. -.ip quit -The wait for a reply from a QUIT command -[2m, unspecified]. -.ip misc -The wait for a reply from miscellaneous (but short) commands -such as NOOP (no-operation) and VERB (go into verbose mode). -[2m, unspecified]. -.ip command\(dg -In server SMTP, -the time to wait for another command. -[1h, 5m]. -.ip ident -The timeout waiting for a reply to an IDENT query -[30s\**, unspecified]. -.(f -\**On some systems the default is zero to turn the protocol off entirely. -.)f -.ip fileopen -The timeout for opening .forward and :include: files [60s, none]. -.ip hoststatus -How long status information about a host -(e.g., host down) -will be cached before it is considered stale -[30m, unspecified]. -.lp -For compatibility with old configuration files, -if no -.i suboption -is specified, -all the timeouts marked with \(dg are set to the indicated value. -.pp -Many of the RFC 1123 minimum values -may well be too short. -.i Sendmail -was designed to the RFC 822 protocols, -which did not specify read timeouts; -hence, versions of -.i sendmail -prior to version 8.1 did not guarantee to reply to messages promptly. -In particular, a -.q RCPT -command specifying a mailing list -will expand and verify the entire list; -a large list on a slow system -may easily take more than five minutes\**. -.(f -\**This verification includes looking up every address -with the name server; -this involves network delays, -and can in some cases can be considerable. -.)f -I recommend a one hour timeout \*- -since a communications failure during the RCPT phase is rare, -a long timeout is not onerous -and may ultimately help reduce network load -and duplicated messages. -.pp -For example, the lines: -.(b -O Timeout.command=25m -O Timeout.datablock=3h -.)b -sets the server SMTP command timeout to 25 minutes -and the input data block timeout to three hours. -.sh 3 "Message timeouts" -.pp -After sitting in the queue for a few days, -a message will time out. -This is to insure that at least the sender is aware -of the inability to send a message. -The timeout is typically set to five days. -It is sometimes considered convenient to also send a warning message -if the message is in the queue longer than a few hours -(assuming you normally have good connectivity; -if your messages normally took several hours to send -you wouldn't want to do this because it wouldn't be an unusual event). -These timeouts are set using the -.b Timeout.queuereturn -and -.b Timeout.queuewarn -options in the configuration file -(previously both were set using the -.b T -option). -.pp -Since these options are global, -and since you can not know -.i "a priori" -how long another host outside your domain will be down, -a five day timeout is recommended. -This allows a recipient to fix the problem even if it occurs -at the beginning of a long weekend. -RFC 1123 section 5.3.1.1 says that this parameter -should be ``at least 4\-5 days''. -.pp -The -.b Timeout.queuewarn -value can be piggybacked on the -.b T -option by indicating a time after which -a warning message should be sent; -the two timeouts are separated by a slash. -For example, the line -.(b -OT5d/4h -.)b -causes email to fail after five days, -but a warning message will be sent after four hours. -This should be large enough that the message will have been tried -several times. -.sh 2 "Forking During Queue Runs" -.pp -By setting the -.b ForkEachJob -(\c -.b Y ) -option, -.i sendmail -will fork before each individual message -while running the queue. -This will prevent -.i sendmail -from consuming large amounts of memory, -so it may be useful in memory-poor environments. -However, if the -.b ForkEachJob -option is not set, -.i sendmail -will keep track of hosts that are down during a queue run, -which can improve performance dramatically. -.pp -If the -.b ForkEachJob -option is set, -.i sendmail -can not use connection caching. -.sh 2 "Queue Priorities" -.pp -Every message is assigned a priority when it is first instantiated, -consisting of the message size (in bytes) -offset by the message class -(which is determined from the Precedence: header) -times the -.q "work class factor" -and the number of recipients times the -.q "work recipient factor." -The priority is used to order the queue. -Higher numbers for the priority mean that the message will be processed later -when running the queue. -.pp -The message size is included so that large messages are penalized -relative to small messages. -The message class allows users to send -.q "high priority" -messages by including a -.q Precedence: -field in their message; -the value of this field is looked up in the -.b P -lines of the configuration file. -Since the number of recipients affects the amount of load a message presents -to the system, -this is also included into the priority. -.pp -The recipient and class factors -can be set in the configuration file using the -.b RecipientFactor -(\c -.b y ) -and -.b ClassFactor -(\c -.b z ) -options respectively. -They default to 30000 (for the recipient factor) -and 1800 -(for the class factor). -The initial priority is: -.EQ -pri = msgsize - (class times bold ClassFactor) + (nrcpt times bold RecipientFactor) -.EN -(Remember, higher values for this parameter actually mean -that the job will be treated with lower priority.) -.pp -The priority of a job can also be adjusted each time it is processed -(that is, each time an attempt is made to deliver it) -using the -.q "work time factor," -set by the -.b RetryFactor -(\c -.b Z ) -option. -This is added to the priority, -so it normally decreases the precedence of the job, -on the grounds that jobs that have failed many times -will tend to fail again in the future. -The -.b RetryFactor -option defaults to 90000. -.sh 2 "Load Limiting" -.pp -.i Sendmail -can be asked to queue (but not deliver) -mail if the system load average gets too high -using the -.b QueueLA -(\c -.b x ) -option. -When the load average exceeds the value of the -.b QueueLA -option, -the delivery mode is set to -.b q -(queue only) -if the -.b QueueFactor -(\c -.b q ) -option divided by the difference in the current load average and the -.b QueueLA -option -plus one -exceeds the priority of the message \(em -that is, the message is queued iff: -.EQ -pri > { bold QueueFactor } over { LA - { bold QueueLA } + 1 } -.EN -The -.b QueueFactor -option defaults to 600000, -so each point of load average is worth 600000 -priority points -(as described above). -.pp -For drastic cases, -the -.b RefuseLA -(\c -.b X ) -option defines a load average at which -.i sendmail -will refuse -to accept network connections. -Locally generated mail -(including incoming UUCP mail) -is still accepted. -.sh 2 "Delivery Mode" -.pp -There are a number of delivery modes that -.i sendmail -can operate in, -set by the -.b DeliveryMode -(\c -.b d ) -configuration option. -These modes -specify how quickly mail will be delivered. -Legal modes are: -.(b -.ta 4n -i deliver interactively (synchronously) -b deliver in background (asynchronously) -q queue only (don't deliver) -d defer delvery attempts (don't deliver) -.)b -There are tradeoffs. -Mode -.q i -gives the sender the quickest feedback, -but may slow down some mailers and -is hardly ever necessary. -Mode -.q b -delivers promptly but -can cause large numbers of processes -if you have a mailer that takes a long time to deliver a message. -Mode -.q q -minimizes the load on your machine, -but means that delivery may be delayed for up to the queue interval. -Mode -.q d -is identical to mode -.q q -except that it also prevents all the early map lookups from working; -it is intended for ``dial on demand'' sites where DNS lookups -might cost real money. -Some simple error messages -(e.g., host unknown during the SMTP protocol) -will be delayed using this mode. -Mode -.q b -is the usual default. -.pp -If you run in mode -.q q -(queue only), -.q d -(defer), -or -.q b -(deliver in background) -.i sendmail -will not expand aliases and follow .forward files -upon initial receipt of the mail. -This speeds up the response to RCPT commands. -Mode -.q i -cannot be used by the SMTP server. -.sh 2 "Log Level" -.pp -The level of logging can be set for -.i sendmail . -The default using a standard configuration table is level 9. -The levels are as follows: -.nr ii 0.5i -.ip 0 -Minimal logging. -.ip 1 -Serious system failures and potential security problems. -.ip 2 -Lost communications (network problems) and protocol failures. -.ip 3 -Other serious failures, malformed addresses, transient forward/include -errors, connection timeouts. -.ip 4 -Minor failures, out of date alias databases, connection rejections -via check_ rulesets. -.ip 5 -Message collection statistics. -.ip 6 -Creation of error messages, -VRFY and EXPN commands. -.ip 7 -Delivery failures (host or user unknown, etc.). -.ip 8 -Successful deliveries and alias database rebuilds. -.ip 9 -Messages being deferred -(due to a host being down, etc.). -.ip 10 -Database expansion (alias, forward, and userdb lookups). -.ip 11 -NIS errors and end of job processing. -.ip 12 -Logs all SMTP connections. -.ip 13 -Log bad user shells, files with improper permissions, and other -questionable situations. -.ip 14 -Logs refused connections. -.ip 15 -Log all incoming and outgoing SMTP commands. -.ip 20 -Logs attempts to run locked queue files. -These are not errors, -but can be useful to note if your queue appears to be clogged. -.ip 30 -Lost locks (only if using lockf instead of flock). -.lp -Additionally, -values above 64 are reserved for extremely verbose debugging output. -No normal site would ever set these. -.sh 2 "File Modes" -.pp -The modes used for files depend on what functionality you want -and the level of security you require. -In many cases -.i sendmail -does careful checking of the modes -of files and directories -to avoid accidental compromise; -if you want to make it possible to have group-writable support files -you may need to use the -.b DontBlameSendmail -option to turn off some of these checks. -.sh 3 "To suid or not to suid?" -.pp -.i Sendmail -is normally installed -setuid to root. -At the point where it is about to -.i exec \|(2) -a mailer, -it checks to see if the userid is zero (root); -if so, -it resets the userid and groupid to a default -(set by the -.b U= -equate in the mailer line; -if that is not set, the -.b DefaultUser -option is used). -This can be overridden -by setting the -.b S -flag to the mailer -for mailers that are trusted -and must be called as root. -However, -this will cause mail processing -to be accounted -(using -.i sa \|(8)) -to root -rather than to the user sending the mail. -.pp -If you don't make -.i sendmail -setuid to root, it will still run but you lose a lot of functionality -and a lot of privacy, since you'll have to make the queue directory -world readable. -You could also make -.i sendmail -setuid to some pseudo-user -(e.g., create a user called -.q sendmail -and make -.i sendmail -setuid to that) -which will fix the privacy problems -but not the functionality issues. -Also, this isn't a guarantee of security: -for example, -root occasionally sends mail, -and the daemon often runs as root. -Note however that -.i sendmail -must run as root in order to create the SMTP listener socket. -.pp -A middle ground is to make -.i sendmail -setuid to root, -but set the -.b RunAsUser -option. -This causes -.i sendmail -to become the indicated user as soon as it has done the startup -that requires root privileges -(primarily, opening the -.sm SMTP -socket). -If you use -.b RunAsUser , -the queue directory -(normally -.i /var/spool/mqueue ) -should be owned by that user, -and all files and databases -(including user -.i \&.forward -files, -alias files, -:include: files, -and external databases) -must be readable by that user. -.b RunAsUser -is probably best suited for firewall configurations -that don't have regular user logins. -.sh 3 "Turning off security checks" -.pp -.i Sendmail -is very particular about the modes of files that it reads or writes. -For example, by default it will refuse to read most files -that are group writable -on the grounds that they might have been tampered with -by someone other than the owner; -it will even refuse to read files in group writable directories. -.pp -If you are -.i quite -sure that your configuration is safe and you want -.i sendmail -to avoid these security checks, -you can turn off certain checks using the -.b DontBlameSendmail -option. -This option takes one or more names that disable checks. -In the descriptions that follow, -.q "unsafe directory" -means a directory that is writable by anyone other than the owner. -The values are: -.nr ii 0.5i -.ip Safe -No special handling. -.ip AssumeSafeChown -Assume that the -.i chown -system call is restricted to root. -Since some versions of Unix permit regular users -to give away their files to other users on some filesystems, -.i sendmail -often cannot assume that a given file was created by the owner, -particularly when it is in a writable directory. -You can set this flag if you know that file giveaway is restricted -on your system. -.ip ClassFileInUnsafeDirPath -When reading class files (using the -.b F -line in the configuration file), -allow files that are in unsafe directories. -.ip ErrorHeaderInUnsafeDirPath -Allow the file named in the -.b ErrorHeader -option to be in an unsafe directory. -.ip GroupWritableDirPathSafe -Change the definition of -.q "unsafe directory" -to consider group-writable directories to be safe. -World-writable directories are always unsafe. -.ip GroupWritableForwardFileSafe -Accept group-writable -.i \&.forward -files. -.ip GroupWritableIncludeFileSafe -Accept group-writable -.i :include: -files. -.ip GroupWritableAliasFile -Allow group-writable alias files. -.ip HelpFileInUnsafeDirPath -Allow the file named in the -.b HelpFile -option to be in an unsafe directory. -.ip WorldWritableAliasFile -Accept world-writable alias files. -.ip ForwardFileInGroupWritableDirPath -Allow -.i \&.forward -files in group writable directories. -.ip IncludeFileInGroupWritableDirPath -Allow -.i :include: -files in group writable directories. -.ip ForwardFileInUnsafeDirPath -Allow -.i \&.forward -files in unsafe directories. -.ip IncludeFileInUnsafeDirPath -Allow -.i :include: -files in unsafe directories. -.ip ForwardFileInUnsafeDirPathSafe -Allow a -.i \&.forward -file that is in an unsafe directory to include references -to program and files. -.ip IncludeFileInUnsafeDirPathSafe -Allow a -.i :include: -file that is in an unsafe directory to include references -to program and files. -.ip MapInUnsafeDirPath -Allow maps (e.g., -.i hash , -.i btree , -and -.i dbm -files) -in unsafe directories. -.ip LinkedAliasFileInWritableDir -Allow an alias file that is a link in a writable directory. -.ip LinkedClassFileInWritableDir -Allow class files that are links in writable directories. -.ip LinkedForwardFileInWritableDir -Allow -.i \&.forward -files that are links in writable directories. -.ip LinkedIncludeFileInWritableDir -Allow -.i :include: -files that are links in writable directories. -.ip LinkedMapInWritableDir -Allow map files that are links in writable directories. -.ip LinkedServiceSwitchFileInWritableDir -Allow the service switch file to be a link -even if the directory is writable. -.ip FileDeliveryToHardLink -Allow delivery to files that are hard links. -.ip FileDeliveryToSymLink -Allow delivery to files that are symbolic links. -.ip RunProgramInUnsafeDirPath -Go ahead and run programs that are in writable directories. -.ip RunWritableProgram -Go ahead and run programs that are group- or world-writable. -.ip WriteMapToHardLink -Allow writes to maps that are hard links. -.ip WriteMapToSymLink -Allow writes to maps that are symbolic links. -.ip WriteStatsToHardLink -Allow the status file to be a hard link. -.ip WriteStatsToSymLink -Allow the status file to be a symbolic link. -.sh 2 "Connection Caching" -.pp -When processing the queue, -.i sendmail -will try to keep the last few open connections open -to avoid startup and shutdown costs. -This only applies to IPC connections. -.pp -When trying to open a connection -the cache is first searched. -If an open connection is found, it is probed to see if it is still active -by sending a -.sm RSET -command. -It is not an error if this fails; -instead, the connection is closed and reopened. -.pp -Two parameters control the connection cache. -The -.b ConnectionCacheSize -(\c -.b k ) -option defines the number of simultaneous open connections -that will be permitted. -If it is set to zero, -connections will be closed as quickly as possible. -The default is one. -This should be set as appropriate for your system size; -it will limit the amount of system resources that -.i sendmail -will use during queue runs. -Never set this higher than 4. -.pp -The -.b ConnectionCacheTimeout -(\c -.b K ) -option specifies the maximum time that any cached connection -will be permitted to idle. -When the idle time exceeds this value -the connection is closed. -This number should be small -(under ten minutes) -to prevent you from grabbing too many resources -from other hosts. -The default is five minutes. -.sh 2 "Name Server Access" -.pp -Control of host address lookups is set by the -.b hosts -service entry in your service switch file. -If you are on a system that has built-in service switch support -(e.g., Ultrix, Solaris, or DEC OSF/1) -then your system is probably configured properly already. -Otherwise, -.i sendmail -will consult the file -.b /etc/service.switch , -which should be created. -.i Sendmail -only uses two entries: -.b hosts -and -.b aliases , -although system routines may use other services -(notably the -.b passwd -service for user name lookups by -.i getpwname ). -.pp -However, some systems (such as SunOS 4.X) -will do DNS lookups -regardless of the setting of the service switch entry. -In particular, the system routine -.i gethostbyname (3) -is used to look up host names, -and many vendor versions try some combination of DNS, NIS, -and file lookup in /etc/hosts -without consulting a service switch. -.i Sendmail -makes no attempt to work around this problem, -and the DNS lookup will be done anyway. -If you do not have a nameserver configured at all, -such as at a UUCP-only site, -.i sendmail -will get a -.q "connection refused" -message when it tries to connect to the name server. -If the -.b hosts -switch entry has the service -.q dns -listed somewhere in the list, -.i sendmail -will interpret this to mean a temporary failure -and will queue the mail for later processing; -otherwise, it ignores the name server data. -.pp -The same technique is used to decide whether to do MX lookups. -If you want MX support, you -.i must -have -.q dns -listed as a service in the -.b hosts -switch entry. -.pp -The -.b ResolverOptions -(\c -.b I ) -option allows you to tweak name server options. -The command line takes a series of flags as documented in -.i resolver (3) -(with the leading -.q RES_ -deleted). -Each can be preceded by an optional `+' or `\(mi'. -For example, the line -.(b -O ResolverOptions=+AAONLY \(miDNSRCH -.)b -turns on the AAONLY (accept authoritative answers only) -and turns off the DNSRCH (search the domain path) options. -Most resolver libraries default DNSRCH, DEFNAMES, and RECURSE -flags on and all others off. -You can also include -.q HasWildcardMX -to specify that there is a wildcard MX record matching your domain; -this turns off MX matching when canonifying names, -which can lead to inappropriate canonifications. -.pp -Version level 1 configurations -turn DNSRCH and DEFNAMES off when doing delivery lookups, -but leave them on everywhere else. -Version 8 of -.i sendmail -ignores them when doing canonification lookups -(that is, when using $[ ... $]), -and always does the search. -If you don't want to do automatic name extension, -don't call $[ ... $]. -.pp -The search rules for $[ ... $] are somewhat different than usual. -If the name being looked up -has at least one dot, it always tries the unmodified name first. -If that fails, it tries the reduced search path, -and lastly tries the unmodified name -(but only for names without a dot, -since names with a dot have already been tried). -This allows names such as -``utc.CS'' -to match the site in Czechoslovakia -rather than the site in your local Computer Science department. -It also prefers A and CNAME records over MX records \*- -that is, if it finds an MX record it makes note of it, -but keeps looking. -This way, if you have a wildcard MX record matching your domain, -it will not assume that all names match. -.pp -To completely turn off all name server access -on systems without service switch support -(such as SunOS 4.X) -you will have to recompile with -\-DNAMED_BIND=0 -and remove \-lresolv from the list of libraries to be searched -when linking. -.sh 2 "Moving the Per-User Forward Files" -.pp -Some sites mount each user's home directory -from a local disk on their workstation, -so that local access is fast. -However, the result is that .forward file lookups are slow. -In some cases, -mail can even be delivered on machines inappropriately -because of a file server being down. -The performance can be especially bad if you run the automounter. -.pp -The -.b ForwardPath -(\c -.b J ) -option allows you to set a path of forward files. -For example, the config file line -.(b -O ForwardPath=/var/forward/$u:$z/.forward.$w -.)b -would first look for a file with the same name as the user's login -in /var/forward; -if that is not found (or is inaccessible) -the file -``.forward.\c -.i machinename '' -in the user's home directory is searched. -A truly perverse site could also search by sender -by using $r, $s, or $f. -.pp -If you create a directory such as /var/forward, -it should be mode 1777 -(that is, the sticky bit should be set). -Users should create the files mode 644. -Note that you must use the -forwardfileinunsafedirpath and -forwardfileinunsafedirpathsafe -flags with the DontBlameSendmail option -to allow forward files in a world -writable directory. -This might also be used as a -denial of service -attack (users could create forward files for other users); -a better approach might be to create -/var/forward -mode 755 -and create empty files for each user, -owned by that user, -mode 644. -If you do this, you don't have to set the DontBlameSendmail options -indicated above. -.sh 2 "Free Space" -.pp -On systems that have one of the system calls in the -.i statfs (2) -family -(including -.i statvfs -and -.i ustat ), -you can specify a minimum number of free blocks on the queue filesystem -using the -.b MinFreeBlocks -(\c -.b b ) -option. -If there are fewer than the indicated number of blocks free -on the filesystem on which the queue is mounted -the SMTP server will reject mail -with the -452 error code. -This invites the SMTP client to try again later. -.pp -Beware of setting this option too high; -it can cause rejection of email -when that mail would be processed without difficulty. -.sh 2 "Maximum Message Size" -.pp -To avoid overflowing your system with a large message, -the -.b MaxMessageSize -option can be set to set an absolute limit -on the size of any one message. -This will be advertised in the ESMTP dialogue -and checked during message collection. -.sh 2 "Privacy Flags" -.pp -The -.b PrivacyOptions -(\c -.b p ) -option allows you to set certain -``privacy'' -flags. -Actually, many of them don't give you any extra privacy, -rather just insisting that client SMTP servers -use the HELO command -before using certain commands -or adding extra headers to indicate possible spoof attempts. -.pp -The option takes a series of flag names; -the final privacy is the inclusive or of those flags. -For example: -.(b -O PrivacyOptions=needmailhelo, noexpn -.)b -insists that the HELO or EHLO command be used before a MAIL command is accepted -and disables the EXPN command. -.pp -The flags are detailed in section -.\"XREF -5.6. -.sh 2 "Send to Me Too" -.pp -Normally, -.i sendmail -deletes the (envelope) sender from any list expansions. -For example, if -.q matt -sends to a list that contains -.q matt -as one of the members he won't get a copy of the message. -If the -.b \-m -(me too) -command line flag, or if the -.b MeToo -(\c -.b m ) -option is set in the configuration file, -this behaviour is suppressed. -Some sites like to run the -.sm SMTP -daemon with -.b \-m . -.sh 1 "THE WHOLE SCOOP ON THE CONFIGURATION FILE" -.pp -This section describes the configuration file -in detail. -.pp -There is one point that should be made clear immediately: -the syntax of the configuration file -is designed to be reasonably easy to parse, -since this is done every time -.i sendmail -starts up, -rather than easy for a human to read or write. -On the -.q "future project" -list is a -configuration-file compiler. -.pp -The configuration file is organized as a series of lines, -each of which begins with a single character -defining the semantics for the rest of the line. -Lines beginning with a space or a tab -are continuation lines -(although the semantics are not well defined in many places). -Blank lines and lines beginning with a sharp symbol -(`#') -are comments. -.sh 2 "R and S \*- Rewriting Rules" -.pp -The core of address parsing -are the rewriting rules. -These are an ordered production system. -.i Sendmail -scans through the set of rewriting rules -looking for a match on the left hand side -(LHS) -of the rule. -When a rule matches, -the address is replaced by the right hand side -(RHS) -of the rule. -.pp -There are several sets of rewriting rules. -Some of the rewriting sets are used internally -and must have specific semantics. -Other rewriting sets -do not have specifically assigned semantics, -and may be referenced by the mailer definitions -or by other rewriting sets. -.pp -The syntax of these two commands are: -.(b F -.b S \c -.i n -.)b -Sets the current ruleset being collected to -.i n . -If you begin a ruleset more than once -it appends to the old definition. -.(b F -.b R \c -.i lhs -.i rhs -.i comments -.)b -The -fields must be separated -by at least one tab character; -there may be embedded spaces -in the fields. -The -.i lhs -is a pattern that is applied to the input. -If it matches, -the input is rewritten to the -.i rhs . -The -.i comments -are ignored. -.pp -Macro expansions of the form -.b $ \c -.i x -are performed when the configuration file is read. -Expansions of the form -.b $& \c -.i x -are performed at run time using a somewhat less general algorithm. -This is intended only for referencing internally defined macros -such as -.b $h -that are changed at runtime. -.sh 3 "The left hand side" -.pp -The left hand side of rewriting rules contains a pattern. -Normal words are simply matched directly. -Metasyntax is introduced using a dollar sign. -The metasymbols are: -.(b -.ta \w'\fB$=\fP\fIx\fP 'u -\fB$*\fP Match zero or more tokens -\fB$+\fP Match one or more tokens -\fB$\-\fP Match exactly one token -\fB$=\fP\fIx\fP Match any phrase in class \fIx\fP -\fB$~\fP\fIx\fP Match any word not in class \fIx\fP -.)b -If any of these match, -they are assigned to the symbol -.b $ \c -.i n -for replacement on the right hand side, -where -.i n -is the index in the LHS. -For example, -if the LHS: -.(b -$\-:$+ -.)b -is applied to the input: -.(b -UCBARPA:eric -.)b -the rule will match, and the values passed to the RHS will be: -.(b -.ta 4n -$1 UCBARPA -$2 eric -.)b -.pp -Additionally, the LHS can include -.b $@ -to match zero tokens. -This is -.i not -bound to a -.b $ \c -.i n -on the RHS, and is normally only used when it stands alone -in order to match the null input. -.sh 3 "The right hand side" -.pp -When the left hand side of a rewriting rule matches, -the input is deleted and replaced by the right hand side. -Tokens are copied directly from the RHS -unless they begin with a dollar sign. -Metasymbols are: -.(b -.ta \w'$#mailer\0\0\0'u -\fB$\fP\fIn\fP Substitute indefinite token \fIn\fP from LHS -\fB$[\fP\fIname\fP\fB$]\fP Canonicalize \fIname\fP -\fB$(\fP\fImap key\fP \fB$@\fP\fIarguments\fP \fB$:\fP\fIdefault\fP \fB$)\fP - Generalized keyed mapping function -\fB$>\fP\fIn\fP \*(lqCall\*(rq ruleset \fIn\fP -\fB$#\fP\fImailer\fP Resolve to \fImailer\fP -\fB$@\fP\fIhost\fP Specify \fIhost\fP -\fB$:\fP\fIuser\fP Specify \fIuser\fP -.)b -.pp -The -.b $ \c -.i n -syntax substitutes the corresponding value from a -.b $+ , -.b $\- , -.b $* , -.b $= , -or -.b $~ -match on the LHS. -It may be used anywhere. -.pp -A host name enclosed between -.b $[ -and -.b $] -is looked up in the host database(s) -and replaced by the canonical name\**. -.(f -\**This is actually -completely equivalent -to $(host \fIhostname\fP$). -In particular, a -.b $: -default can be used. -.)f -For example, -.q $[ftp$] -might become -.q ftp.CS.Berkeley.EDU -and -.q $[[128.32.130.2]$] -would become -.q vangogh.CS.Berkeley.EDU. -.i Sendmail -recognizes its numeric IP address -without calling the name server -and replaces it with its canonical name. -.pp -The -.b $( -\&... -.b $) -syntax is a more general form of lookup; -it uses a named map instead of an implicit map. -If no lookup is found, the indicated -.i default -is inserted; -if no default is specified and no lookup matches, -the value is left unchanged. -The -.i arguments -are passed to the map for possible use. -.pp -The -.b $> \c -.i n -syntax -causes the remainder of the line to be substituted as usual -and then passed as the argument to ruleset -.i n . -The final value of ruleset -.i n -then becomes -the substitution for this rule. -The -.b $> -syntax expands everything after the ruleset name -to the end of the replacement string -and then passes that as the initial input to the ruleset. -Recursive calls are allowed. -For example, -.(b -$>0 $>3 $1 -.)b -expands $1, passes that to ruleset 3, and then passes the result -of ruleset 3 to ruleset 0. -.pp -The -.b $# -syntax should -.i only -be used in ruleset zero -or a subroutine of ruleset zero. -It causes evaluation of the ruleset to terminate immediately, -and signals to -.i sendmail -that the address has completely resolved. -The complete syntax is: -.(b -\fB$#\fP\fImailer\fP \fB$@\fP\fIhost\fP \fB$:\fP\fIuser\fP -.)b -This specifies the -{mailer, host, user} -3-tuple necessary to direct the mailer. -If the mailer is local -the host part may be omitted\**. -.(f -\**You may want to use it for special -.q "per user" -extensions. -For example, in the address -.q jgm+foo@CMU.EDU ; -the -.q +foo -part is not part of the user name, -and is passed to the local mailer for local use. -.)f -The -.i mailer -must be a single word, -but the -.i host -and -.i user -may be multi-part. -If the -.i mailer -is the builtin IPC mailer, -the -.i host -may be a colon-separated list of hosts -that are searched in order for the first working address -(exactly like MX records). -The -.i user -is later rewritten by the mailer-specific envelope rewriting set -and assigned to the -.b $u -macro. -As a special case, if the mailer specified has the -.b F=@ -flag specified -and the first character of the -.b $: -value is -.q @ , -the -.q @ -is stripped off, and a flag is set in the address descriptor -that causes sendmail to not do ruleset 5 processing. -.pp -Normally, a rule that matches is retried, -that is, -the rule loops until it fails. -A RHS may also be preceded by a -.b $@ -or a -.b $: -to change this behavior. -A -.b $@ -prefix causes the ruleset to return with the remainder of the RHS -as the value. -A -.b $: -prefix causes the rule to terminate immediately, -but the ruleset to continue; -this can be used to avoid continued application of a rule. -The prefix is stripped before continuing. -.pp -The -.b $@ -and -.b $: -prefixes may precede a -.b $> -spec; -for example: -.(b -.ta 8n -R$+ $: $>7 $1 -.)b -matches anything, -passes that to ruleset seven, -and continues; -the -.b $: -is necessary to avoid an infinite loop. -.pp -Substitution occurs in the order described, -that is, -parameters from the LHS are substituted, -hostnames are canonicalized, -.q subroutines -are called, -and finally -.b $# , -.b $@ , -and -.b $: -are processed. -.sh 3 "Semantics of rewriting rule sets" -.pp -There are six rewriting sets -that have specific semantics. -Five of these are related as depicted by figure 1. -.(z -.hl -.ie n \{\ -.(c - +---+ - -->| 0 |-->resolved address - / +---+ - / +---+ +---+ - / ---->| 1 |-->| S |-- - +---+ / +---+ / +---+ +---+ \e +---+ -addr-->| 3 |-->| D |-- --->| 4 |-->msg - +---+ +---+ \e +---+ +---+ / +---+ - --->| 2 |-->| R |-- - +---+ +---+ -.)c - -.\} -.el .ie !"\*(.T"" \ -\{\ -.PS -boxwid = 0.3i -boxht = 0.3i -movewid = 0.3i -moveht = 0.3i -linewid = 0.3i -lineht = 0.3i - - box invis "addr"; arrow -Box3: box "3" -A1: arrow -BoxD: box "D"; line; L1: Here -C: [ - C1: arrow; box "1"; arrow; box "S"; line; E1: Here - move to C1 down 0.5; right - C2: arrow; box "2"; arrow; box "R"; line; E2: Here - ] with .w at L1 + (0.5, 0) - move to C.e right 0.5 -L4: arrow; box "4"; arrow; box invis "msg" - line from L1 to C.C1 - line from L1 to C.C2 - line from C.E1 to L4 - line from C.E2 to L4 - move to BoxD.n up 0.6; right -Box0: arrow; box "0" - arrow; box invis "resolved address" width 1.3 - line from 1/3 of the way between A1 and BoxD.w to Box0 -.PE -.\} -.el .sp 2i -.ce -Figure 1 \*- Rewriting set semantics -.(c -D \*- sender domain addition -S \*- mailer-specific sender rewriting -R \*- mailer-specific recipient rewriting -.)c -.hl -.)z -.pp -Ruleset three -should turn the address into -.q "canonical form." -This form should have the basic syntax: -.(b -local-part@host-domain-spec -.)b -Ruleset three -is applied by -.i sendmail -before doing anything with any address. -.pp -If no -.q @ -sign is specified, -then the -host-domain-spec -.i may -be appended (box -.q D -in Figure 1) -from the -sender address -(if the -.b C -flag is set in the mailer definition -corresponding to the -.i sending -mailer). -.pp -Ruleset zero -is applied after ruleset three -to addresses that are going to actually specify recipients. -It must resolve to a -.i "{mailer, host, user}" -triple. -The -.i mailer -must be defined in the mailer definitions -from the configuration file. -The -.i host -is defined into the -.b $h -macro -for use in the argv expansion of the specified mailer. -.pp -Rulesets one and two -are applied to all sender and recipient addresses respectively. -They are applied before any specification -in the mailer definition. -They must never resolve. -.pp -Ruleset four is applied to all addresses -in the message. -It is typically used -to translate internal to external form. -.pp -In addition, -ruleset 5 is applied to all local addresses -(specifically, those that resolve to a mailer with the `F=5' -flag set) -that do not have aliases. -This allows a last minute hook for local names. -.sh 3 "Ruleset hooks" -.pp -A few extra rulesets are defined as -.q hooks -that can be defined to get special features. -They are all named rulesets. -The -.q check_* -forms all give accept/reject status; -falling off the end or returning normally is an accept, -and resolving to -.b $#error -is a reject. -Many of these can also resolve to the special mailer -.b $#discard ; -this accepts the message as though it were successful -but then discards it without delivery. -.sh 4 "check_relay" -.pp -The -.i check_relay -ruleset is called after a connection is accepted. -It is passed -.(b -client.host.name $| client.host.address -.)b -where -.b $| -is a metacharacter separating the two parts. -This ruleset can reject connections from various locations. -.sh 4 "check_mail" -.pp -The -.i check_mail -ruleset is passed the user name parameter of the -.sm "SMTP MAIL" -command. -It can accept or reject the address. -.sh 4 "check_rcpt" -.pp -The -.i check_rcpt -ruleset is passed the user name parameter of the -.sm "SMTP RCPT" -command. -It can accept or reject the address. -.sh 4 "check_compat" -.pp -The -.i check_compat -ruleset is passed -.(b -sender-address $| recipient-address -.)b -where -.b $| -is a metacharacter separating the addresses. -It can accept or reject mail transfer between these two addresses -much like the -.i checkcompat() -function. -.sh 3 "IPC mailers" -.pp -Some special processing occurs -if the ruleset zero resolves to an IPC mailer -(that is, a mailer that has -.q [IPC] -listed as the Path in the -.b M -configuration line. -The host name passed after -.q $@ -has MX expansion performed; -this looks the name up in DNS to find alternate delivery sites. -.pp -The host name can also be provided as a dotted quad in square brackets; -for example: -.(b -[128.32.149.78] -.)b -This causes direct conversion of the numeric value -to an IP host address. -.pp -The host name passed in after the -.q $@ -may also be a colon-separated list of hosts. -Each is separately MX expanded and the results are concatenated -to make (essentially) one long MX list. -The intent here is to create -.q fake -MX records that are not published in DNS -for private internal networks. -.pp -As a final special case, the host name can be passed in -as a text string -in square brackets: -.(b -[ucbvax.berkeley.edu] -.)b -This form avoids the MX mapping. -.b N.B.: -.i -This is intended only for situations where you have a network firewall -or other host that will do special processing for all your mail, -so that your MX record points to a gateway machine; -this machine could then do direct delivery to machines -within your local domain. -Use of this feature directly violates RFC 1123 section 5.3.5: -it should not be used lightly. -.r -.sh 2 "D \*- Define Macro" -.pp -Macros are named with a single character -or with a word in {braces}. -Single character names may be selected from the entire ASCII set, -but user-defined macros -should be selected from the set of upper case letters only. -Lower case letters -and special symbols -are used internally. -Long names beginning with a lower case letter or a punctuation character -are reserved for use by sendmail, -so user-defined long macro names should begin with an upper case letter. -.pp -The syntax for macro definitions is: -.(b F -.b D \c -.i x\|val -.)b -where -.i x -is the name of the macro -(which may be a single character -or a word in braces) -and -.i val -is the value it should have. -There should be no spaces given -that do not actually belong in the macro value. -.pp -Macros are interpolated -using the construct -.b $ \c -.i x , -where -.i x -is the name of the macro to be interpolated. -This interpolation is done when the configuration file is read, -except in -.b M -lines. -The special construct -.b $& \c -.i x -can be used in -.b R -lines to get deferred interpolation. -.pp -Conditionals can be specified using the syntax: -.(b -$?x text1 $| text2 $. -.)b -This interpolates -.i text1 -if the macro -.b $x -is set, -and -.i text2 -otherwise. -The -.q else -(\c -.b $| ) -clause may be omitted. -.pp -Lower case macro names are reserved to have -special semantics, -used to pass information in or out of -.i sendmail , -and special characters are reserved to -provide conditionals, etc. -Upper case names -(that is, -.b $A -through -.b $Z ) -are specifically reserved for configuration file authors. -.pp -The following macros are defined and/or used internally by -.i sendmail -for interpolation into argv's for mailers -or for other contexts. -The ones marked \(dg are information passed into sendmail\**, -.(f -\**As of version 8.6, -all of these macros have reasonable defaults. -Previous versions required that they be defined. -.)f -the ones marked \(dd are information passed both in and out of sendmail, -and the unmarked macros are passed out of sendmail -but are not otherwise used internally. -These macros are: -.nr ii 5n -.ip $a -The origination date in RFC 822 format. -This is extracted from the Date: line. -.ip $b -The current date in RFC 822 format. -.ip $c -The hop count. -This is a count of the number of Received: lines -plus the value of the -.b \-h -command line flag. -.ip $d -The current date in UNIX (ctime) format. -.ip $e\(dg -(Obsolete; use SmtpGreetingMessage option instead.) -The SMTP entry message. -This is printed out when SMTP starts up. -The first word must be the -.b $j -macro as specified by RFC821. -Defaults to -.q "$j Sendmail $v ready at $b" . -Commonly redefined to include the configuration version number, e.g., -.q "$j Sendmail $v/$Z ready at $b" -.ip $f -The envelope sender (from) address. -.ip $g -The sender address relative to the recipient. -For example, if -.b $f -is -.q foo , -.b $g -will be -.q host!foo , -.q foo@host.domain , -or whatever is appropriate for the receiving mailer. -.ip $h -The recipient host. -This is set in ruleset 0 from the $@ field of a parsed address. -.ip $i -The queue id, -e.g., -.q HAA12345 . -.ip $j\(dd -The \*(lqofficial\*(rq domain name for this site. -This is fully qualified if the full qualification can be found. -It -.i must -be redefined to be the fully qualified domain name -if your system is not configured so that information can find -it automatically. -.ip $k -The UUCP node name (from the uname system call). -.ip $l\(dg -(Obsolete; use UnixFromLine option instead.) -The format of the UNIX from line. -Unless you have changed the UNIX mailbox format, -you should not change the default, -which is -.q "From $g $d" . -.ip $m -The domain part of the \fIgethostname\fP return value. -Under normal circumstances, -.b $j -is equivalent to -.b $w.$m . -.ip $n\(dg -The name of the daemon (for error messages). -Defaults to -.q MAILER-DAEMON . -.ip $o\(dg -(Obsolete: use OperatorChars option instead.) -The set of \*(lqoperators\*(rq in addresses. -A list of characters -which will be considered tokens -and which will separate tokens -when doing parsing. -For example, if -.q @ -were in the -.b $o -macro, then the input -.q a@b -would be scanned as three tokens: -.q a, -.q @, -and -.q b. -Defaults to -.q ".:@[]" , -which is the minimum set necessary to do RFC 822 parsing; -a richer set of operators is -.q ".:%@!/[]" , -which adds support for UUCP, the %-hack, and X.400 addresses. -.ip $p -Sendmail's process id. -.ip $q\(dg -Default format of sender address. -The -.b $q -macro specifies how an address should appear in a message -when it is defaulted. -Defaults to -.q "<$g>" . -It is commonly redefined to be -.q "$?x$x <$g>$|$g$." -or -.q "$g$?x ($x)$." , -corresponding to the following two formats: -.(b -Eric Allman <eric@CS.Berkeley.EDU> -eric@CS.Berkeley.EDU (Eric Allman) -.)b -.i Sendmail -properly quotes names that have special characters -if the first form is used. -.ip $r -Protocol used to receive the message. -Set from the -.b \-p -command line flag or by the SMTP server code. -.ip $s -Sender's host name. -Set from the -.b \-p -command line flag or by the SMTP server code. -.ip $t -A numeric representation of the current time. -.ip $u -The recipient user. -.ip $v -The version number of the -.i sendmail -binary. -.ip $w\(dd -The hostname of this site. -This is the root name of this host (but see below for caveats). -.ip $x -The full name of the sender. -.ip $z -The home directory of the recipient. -.ip $_ -The validated sender address. -.ip ${bodytype} -The message body type -(7BIT or 8BITMIME), -as determined from the envelope. -.ip ${client_addr} -The IP address of the SMTP client. -Defined in the SMTP server only. -.ip ${client_name} -The host name of the SMTP client. -This may be the client's bracketed IP address -in the form [ nnn.nnn.nnn.nnn ] if the client's -IP address is not resolvable. -Defined in the SMTP server only. -.ip ${client_port} -The port number of the SMTP client. -Defined in the SMTP server only. -.ip ${envid} -The envelope id passed to sendmail as part of the envelope. -.ip ${opMode} -The current operation mode (from the -.b \-b -flag). -.ip ${deliveryMode} -The current delivery mode -(from the -.b DeliveryMode -option). -.pp -There are three types of dates that can be used. -The -.b $a -and -.b $b -macros are in RFC 822 format; -.b $a -is the time as extracted from the -.q Date: -line of the message -(if there was one), -and -.b $b -is the current date and time -(used for postmarks). -If no -.q Date: -line is found in the incoming message, -.b $a -is set to the current time also. -The -.b $d -macro is equivalent to the -.b $b -macro in UNIX -(ctime) -format. -.pp -The macros -.b $w , -.b $j , -and -.b $m -are set to the identity of this host. -.i Sendmail -tries to find the fully qualified name of the host -if at all possible; -it does this by calling -.i gethostname (2) -to get the current hostname -and then passing that to -.i gethostbyname (3) -which is supposed to return the canonical version of that host name.\** -.(f -\**For example, on some systems -.i gethostname -might return -.q foo -which would be mapped to -.q foo.bar.com -by -.i gethostbyname . -.)f -Assuming this is successful, -.b $j -is set to the fully qualified name -and -.b $m -is set to the domain part of the name -(everything after the first dot). -The -.b $w -macro is set to the first word -(everything before the first dot) -if you have a level 5 or higher configuration file; -otherwise, it is set to the same value as -.b $j . -If the canonification is not successful, -it is imperative that the config file set -.b $j -to the fully qualified domain name\**. -.(f -\**Older versions of sendmail didn't pre-define -.b $j -at all, so up until 8.6, -config files -.i always -had to define -.b $j . -.)f -.pp -The -.b $f -macro is the id of the sender -as originally determined; -when mailing to a specific host -the -.b $g -macro is set to the address of the sender -.ul -relative to the recipient. -For example, -if I send to -.q bollard@matisse.CS.Berkeley.EDU -from the machine -.q vangogh.CS.Berkeley.EDU -the -.b $f -macro will be -.q eric -and the -.b $g -macro will be -.q eric@vangogh.CS.Berkeley.EDU. -.pp -The -.b $x -macro is set to the full name of the sender. -This can be determined in several ways. -It can be passed as flag to -.i sendmail . -It can be defined in the -.sm NAME -environment variable. -The third choice is the value of the -.q Full-Name: -line in the header if it exists, -and the fourth choice is the comment field -of a -.q From: -line. -If all of these fail, -and if the message is being originated locally, -the full name is looked up in the -.i /etc/passwd -file. -.pp -When sending, -the -.b $h , -.b $u , -and -.b $z -macros get set to the host, user, and home directory -(if local) -of the recipient. -The first two are set from the -.b $@ -and -.b $: -part of the rewriting rules, respectively. -.pp -The -.b $p -and -.b $t -macros are used to create unique strings -(e.g., for the -.q Message-Id: -field). -The -.b $i -macro is set to the queue id on this host; -if put into the timestamp line -it can be extremely useful for tracking messages. -The -.b $v -macro is set to be the version number of -.i sendmail ; -this is normally put in timestamps -and has been proven extremely useful for debugging. -.pp -The -.b $c -field is set to the -.q "hop count," -i.e., the number of times this message has been processed. -This can be determined -by the -.b \-h -flag on the command line -or by counting the timestamps in the message. -.pp -The -.b $r -and -.b $s -fields are set to the protocol used to communicate with -.i sendmail -and the sending hostname. -They can be set together using the -.b \-p -command line flag or separately using the -.b \-M -or -.b \-oM -flags. -.pp -The -.b $_ -is set to a validated sender host name. -If the sender is running an RFC 1413 compliant IDENT server -and the receiver has the IDENT protocol turned on, -it will include the user name on that host. -.pp -The -.b ${client_name} , -.b ${client_addr} , -and -.b ${client_port} -macros -are set to the name, address, and port number of the SMTP client -who is invoking -.i sendmail -as a server. -These can be used in the -.i check_* -rulesets (using the -.b $& -deferred evaluation form, of course!). -.sh 2 "C and F \*- Define Classes" -.pp -Classes of phrases may be defined -to match on the left hand side of rewriting rules, -where a -.q phrase -is a sequence of characters that does not contain space characters. -For example -a class of all local names for this site -might be created -so that attempts to send to oneself -can be eliminated. -These can either be defined directly in the configuration file -or read in from another file. -Classes are named as a single letter or a word in {braces}. -Class names beginning with lower case letters -and special characters are reserved for system use. -Classes defined in config files may be given names -from the set of upper case letters for short names -or beginning with an upper case letter for long names. -.pp -The syntax is: -.(b F -.b C \c -.i c\|phrase1 -.i phrase2... -.br -.b F \c -.i c\|file -.)b -The first form defines the class -.i c -to match any of the named words. -It is permissible to split them among multiple lines; -for example, the two forms: -.(b -CHmonet ucbmonet -.)b -and -.(b -CHmonet -CHucbmonet -.)b -are equivalent. -The ``F'' form -reads the elements of the class -.i c -from the named -.i file . -.pp -Elements of classes can be accessed in rules using -.b $= -or -.b $~ . -The -.b $~ -(match entries not in class) -only matches a single word; -multi-word entries in the class are ignored in this context. -.pp -Some classes have internal meaning to -.i sendmail : -.nr ii 0.5i -.\".ip $=b -.\"A set of Content-Types that will not have the newline character -.\"translated to CR-LF before encoding into base64 MIME. -.\"The class can have major times -.\"(e.g., -.\".q image ) -.\"or full types -.\"(such as -.\".q application/octet-stream ). -.\"The class is initialized with -.\".q application/octet-stream , -.\".q image , -.\".q audio , -.\"and -.\".q video . -.ip $=e -contains the Content-Transfer-Encodings that can be 8\(->7 bit encoded. -It is predefined to contain -.q 7bit , -.q 8bit , -and -.q binary . -.ip $=k -set to be the same as -.b $k , -that is, the UUCP node name. -.ip $=m -set to the set of domains by which this host is known, -initially just -.b $m . -.ip $=n -can be set to the set of MIME body types -that can never be eight to seven bit encoded. -It defaults to -.q multipart/signed . -Message types -.q message/* -and -.q multipart/* -are never encoded directly. -Multipart messages are always handled recursively. -The handling of message/* messages -are controlled by class -.b $=s . -.ip $=q -A set of Content-Types that will never be encoded as base64 -(if they have to be encoded, they will be encoded as quoted-printable). -It can have primary types -(e.g., -.q text ) -or full types -(such as -.q text/plain ). -The class is initialized to have -.q text/plain -only. -.ip $=s -contains the set of subtypes of message that can be treated recursively. -By default it contains only -.q rfc822 . -Other -.q message/* -types cannot be 8\(->7 bit encoded. -If a message containing eight bit data is sent to a seven bit host, -and that message cannot be encoded into seven bits, -it will be stripped to 7 bits. -.ip $=t -set to the set of trusted users by the -.b T -configuration line. -If you want to read trusted users from a file, use -.b Ft \c -.i /file/name . -.ip $=w -set to be the set of all names -this host is known by. -This can be used to match local hostnames. -.pp -.i Sendmail -can be compiled to allow a -.i scanf (3) -string on the -.b F -line. -This lets you do simplistic parsing of text files. -For example, to read all the user names in your system -.i /etc/passwd -file into a class, use -.(b -FL/etc/passwd %[^:] -.)b -which reads every line up to the first colon. -.sh 2 "M \*- Define Mailer" -.pp -Programs and interfaces to mailers -are defined in this line. -The format is: -.(b F -.b M \c -.i name , -{\c -.i field =\c -.i value \|}* -.)b -where -.i name -is the name of the mailer -(used internally only) -and the -.q field=name -pairs define attributes of the mailer. -Fields are: -.(b -.ta 1i -Path The pathname of the mailer -Flags Special flags for this mailer -Sender Rewriting set(s) for sender addresses -Recipient Rewriting set(s) for recipient addresses -Argv An argument vector to pass to this mailer -Eol The end-of-line string for this mailer -Maxsize The maximum message length to this mailer -Linelimit The maximum line length in the message body -Directory The working directory for the mailer -Userid The default user and group id to run as -Nice The nice(2) increment for the mailer -Charset The default character set for 8-bit characters -Type The MTS type information (used for error messages) -.)b -Only the first character of the field name is checked. -.pp -The following flags may be set in the mailer description. -Any other flags may be used freely -to conditionally assign headers to messages -destined for particular mailers. -Flags marked with \(dg -are not interpreted by the -.i sendmail -binary; -these are the conventionally used to correlate to the flags portion -of the -.b H -line. -Flags marked with \(dd -apply to the mailers for the sender address -rather than the usual recipient mailers. -.nr ii 4n -.ip a -Run Extended SMTP (ESMTP) protocol (defined in RFCs 1869, 1652, and 1870). -This flag defaults on if the SMTP greeting message includes the word -.q ESMTP . -.ip A -Look up the user part of the address in the alias database. -Normally this is only set for local mailers. -.ip b -Force a blank line on the end of a message. -This is intended to work around some stupid versions of -/bin/mail -that require a blank line, but do not provide it themselves. -It would not normally be used on network mail. -.ip c -Do not include comments in addresses. -This should only be used if you have to work around -a remote mailer that gets confused by comments. -This strips addresses of the form -.q "Phrase <address>" -or -.q "address (Comment)" -down to just -.q address . -.ip C\(dd -If mail is -.i received -from a mailer with this flag set, -any addresses in the header that do not have an at sign -(\c -.q @ ) -after being rewritten by ruleset three -will have the -.q @domain -clause from the sender envelope address -tacked on. -This allows mail with headers of the form: -.(b -From: usera@hosta -To: userb@hostb, userc -.)b -to be rewritten as: -.(b -From: usera@hosta -To: userb@hostb, userc@hosta -.)b -automatically. -However, it doesn't really work reliably. -.ip d -Do not include angle brackets around route-address syntax addresses. -This is useful on mailers that are going to pass addresses to a shell -that might interpret angle brackets as I/O redirection. -.ip D\(dg -This mailer wants a -.q Date: -header line. -.ip e -This mailer is expensive to connect to, -so try to avoid connecting normally; -any necessary connection will occur during a queue run. -.ip E -Escape lines beginning with -.q From\0 -in the message with a `>' sign. -.ip f -The mailer wants a -.b \-f -.i from -flag, -but only if this is a network forward operation -(i.e., -the mailer will give an error -if the executing user -does not have special permissions). -.ip F\(dg -This mailer wants a -.q From: -header line. -.ip g -Normally, -.i sendmail -sends internally generated email (e.g., error messages) -using the null return address -as required by RFC 1123. -However, some mailers don't accept a null return address. -If necessary, -you can set the -.b g -flag to prevent -.i sendmail -from obeying the standards; -error messages will be sent as from the MAILER-DAEMON -(actually, the value of the -.b $n -macro). -.ip h -Upper case should be preserved in host names -for this mailer. -.ip i -Do User Database rewriting on envelope sender address. -.ip I -This mailer will be speaking SMTP -to another -.i sendmail -\*- -as such it can use special protocol features. -This option is not required -(i.e., -if this option is omitted the transmission will still operate successfully, -although perhaps not as efficiently as possible). -.ip j -Do User Database rewriting on recipients as well as senders. -.ip k -Normally when -.i sendmail -connects to a host via SMTP, -it checks to make sure that this isn't accidently the same host name -as might happen if -.i sendmail -is misconfigured or if a long-haul network interface is set in loopback mode. -This flag disables the loopback check. -It should only be used under very unusual circumstances. -.ip K -Currently unimplemented. -Reserved for chunking. -.ip l -This mailer is local -(i.e., -final delivery will be performed). -.ip L -Limit the line lengths as specified in RFC821. -This deprecated option should be replaced by the -.b L= -mail declaration. -For historic reasons, the -.b L -flag also sets the -.b 7 -flag. -.ip m -This mailer can send to multiple users -on the same host -in one transaction. -When a -.b $u -macro occurs in the -.i argv -part of the mailer definition, -that field will be repeated as necessary -for all qualifying users. -.ip M\(dg -This mailer wants a -.q Message-Id: -header line. -.ip n -Do not insert a UNIX-style -.q From -line on the front of the message. -.ip o -Always run as the owner of the recipient mailbox. -Normally -.i sendmail -runs as the sender for locally generated mail -or as -.q daemon -(actually, the user specified in the -.b u -option) -when delivering network mail. -The normal behaviour is required by most local mailers, -which will not allow the envelope sender address -to be set unless the mailer is running as daemon. -This flag is ignored if the -.b S -flag is set. -.ip p -Use the route-addr style reverse-path in the SMTP -.q "MAIL FROM:" -command -rather than just the return address; -although this is required in RFC821 section 3.1, -many hosts do not process reverse-paths properly. -Reverse-paths are officially discouraged by RFC 1123. -.ip P\(dg -This mailer wants a -.q Return-Path: -line. -.ip q -When an address that resolves to this mailer is verified -(SMTP VRFY command), -generate 250 responses instead of 252 responses. -This will imply that the address is local. -.ip r -Same as -.b f , -but sends a -.b \-r -flag. -.ip R -Open SMTP connections from a -.q secure -port. -Secure ports aren't -(secure, that is) -except on UNIX machines, -so it is unclear that this adds anything. -.ip s -Strip quote characters (" and \e) off of the address -before calling the mailer. -.ip S -Don't reset the userid -before calling the mailer. -This would be used in a secure environment -where -.i sendmail -ran as root. -This could be used to avoid forged addresses. -If the -.b U= -field is also specified, -this flag causes the user id to always be set to that user and group -(instead of leaving it as root). -.ip u -Upper case should be preserved in user names -for this mailer. -.ip U -This mailer wants UUCP-style -.q From -lines with the ugly -.q "remote from <host>" -on the end. -.ip w -The user must have a valid account on this machine, -i.e., -getpwnam -must succeed. -If not, -the mail is bounced. -This is required to get -.q \&.forward -capability. -.ip x\(dg -This mailer wants a -.q Full-Name: -header line. -.ip X -This mailer want to use the hidden dot algorithm -as specified in RFC821; -basically, -any line beginning with a dot -will have an extra dot prepended -(to be stripped at the other end). -This insures that lines in the message containing a dot -will not terminate the message prematurely. -.ip z -Run Local Mail Transfer Protocol (LMTP) -between -.i sendmail -and the local mailer. -This is a variant on SMTP -defined in RFC 2033 -that is specifically designed for delivery to a local mailbox. -.ip 0 -Don't look up MX records for hosts sent via SMTP. -.ip 3 -Extend the list of characters converted to =XX notation -when converting to Quoted-Printable -to include those that don't map cleanly between ASCII and EBCDIC. -Useful if you have IBM mainframes on site. -.ip 5 -If no aliases are found for this address, -pass the address through ruleset 5 for possible alternate resolution. -This is intended to forward the mail to an alternate delivery spot. -.ip 7 -Strip all output to seven bits. -This is the default if the -.b L -flag is set. -Note that clearing this option is not -sufficient to get full eight bit data passed through -.i sendmail . -If the -.b 7 -option is set, this is essentially always set, -since the eighth bit was stripped on input. -Note that this option will only impact messages -that didn't have 8\(->7 bit MIME conversions performed. -.ip 8 -If set, -it is acceptable to send eight bit data to this mailer; -the usual attempt to do 8\(->7 bit MIME conversions will be bypassed. -.ip 9 -If set, -do -.i limited -7\(->8 bit MIME conversions. -These conversions are limited to text/plain data. -.ip : -Check addresses to see if they begin -.q :include: ; -if they do, convert them to the -.q *include* -mailer. -.ip | -Check addresses to see if they begin with a `|'; -if they do, convert them to the -.q prog -mailer. -.ip / -Check addresses to see if they begin with a `/'; -if they do, convert them to the -.q *file* -mailer. -.ip @ -Look up addresses in the user database. -.pp -Configuration files prior to level 6 -assume the `A', `w', `5', `:', `|', `/', and `@' options -on the mailer named -.q local . -.pp -The mailer with the special name -.q error -can be used to generate a user error. -The (optional) host field is an exit status to be returned, -and the user field is a message to be printed. -The exit status may be numeric or one of the values -USAGE, NOUSER, NOHOST, UNAVAILABLE, SOFTWARE, TEMPFAIL, PROTOCOL, or CONFIG -to return the corresponding EX_ exit code, -or an enhanced error code as described in RFC 1893, -.ul -Enhanced Mail System Status Codes. -For example, the entry: -.(b -$#error $@ NOHOST $: Host unknown in this domain -.)b -on the RHS of a rule -will cause the specified error to be generated -and the -.q "Host unknown" -exit status to be returned -if the LHS matches. -This mailer is only functional in rulesets 0, 5, -or one of the check_* rulesets. -.pp -The mailer with the special name -.q discard -causes any mail sent to it to be discarded -but otherwise treated as though it were successfully delivered. -.pp -The mailer named -.q local -.i must -be defined in every configuration file. -This is used to deliver local mail, -and is treated specially in several ways. -Additionally, three other mailers named -.q prog , -.q *file* , -and -.q *include* -may be defined to tune the delivery of messages to programs, -files, -and :include: lists respectively. -They default to: -.(b -Mprog, P=/bin/sh, F=lsoDq9, T=DNS/RFC822/X-Unix, A=sh \-c $u -M*file*, P=[FILE], F=lsDFMPEouq9, T=DNS/RFC822/X-Unix, A=FILE $u -M*include*, P=/dev/null, F=su, A=INCLUDE $u -.)b -.pp -The Sender and Recipient rewriting sets -may either be a simple ruleset id -or may be two ids separated by a slash; -if so, the first rewriting set is applied to envelope -addresses -and the second is applied to headers. -Setting any value zero disables corresponding mailer-specific rewriting. -.pp -The Directory -is actually a colon-separated path of directories to try. -For example, the definition -.q D=$z:/ -first tries to execute in the recipient's home directory; -if that is not available, -it tries to execute in the root of the filesystem. -This is intended to be used only on the -.q prog -mailer, -since some shells (such as -.i csh ) -refuse to execute if they cannot read the home directory. -Since the queue directory is not normally readable by unprivileged users -.i csh -scripts as recipients can fail. -.pp -The Userid -specifies the default user and group id to run as, -overriding the -.b DefaultUser -option (q.v.). -If the -.b S -mailer flag is also specified, -this is the user and group to run as in all circumstances. -This may be given as -.i user:group -to set both the user and group id; -either may be an integer or a symbolic name to be looked up -in the -.i passwd -and -.i group -files respectively. -If only a symbolic user name is specified, -the group id in the -.i passwd -file for that user is used as the group id. -.pp -The Charset field -is used when converting a message to MIME; -this is the character set used in the -Content-Type: header. -If this is not set, the -.b DefaultCharset -option is used, -and if that is not set, the value -.q unknown-8bit -is used. -.b WARNING: -this field applies to the sender's mailer, -not the recipient's mailer. -For example, if the envelope sender address -lists an address on the local network -and the recipient is on an external network, -the character set will be set from the Charset= field -for the local network mailer, -not that of the external network mailer. -.pp -The Type= field -sets the type information -used in MIME error messages -as defined by -RFC 1894. -It is actually three values separated by slashes: -the MTA-type (that is, the description of how hosts are named), -the address type (the description of e-mail addresses), -and the diagnostic type (the description of error diagnostic codes). -Each of these must be a registered value -or begin with -.q X\- . -The default is -.q dns/rfc822/smtp . -.sh 2 "H \*- Define Header" -.pp -The format of the header lines that -.i sendmail -inserts into the message -are defined by the -.b H -line. -The syntax of this line is: -.(b F -.b H [\c -.b ? \c -.i mflags \c -.b ? ]\c -.i hname \c -.b : -.i htemplate -.)b -Continuation lines in this spec -are reflected directly into the outgoing message. -The -.i htemplate -is macro-expanded before insertion into the message. -If the -.i mflags -(surrounded by question marks) -are specified, -at least one of the specified flags -must be stated in the mailer definition -for this header to be automatically output. -If one of these headers is in the input -it is reflected to the output -regardless of these flags. -.pp -Some headers have special semantics -that will be described later. -.pp -A secondary syntax allows validation of headers as they are being read. -To enable validation, use: -.(b -.b H \c -.i Header \c -.b ": $>" \c -.i Ruleset -.)b -The indicated -.i Ruleset -is called for the specified -.i Header , -and can return -.b $#error -to reject the message or -.b $#discard -to discard the message -(as with the other -.b check_ * -rulesets). -The header is treated as a structured field, -that is, -comments (in parentheses) are deleted before processing. -.pp -For example, the configuration lines: -.(b -HMessage-Id: $>CheckMessageId - -SCheckMessageId -R< $+ @ $+ > $@ OK -R$* $#error $: Illegal Message-Id header -.)b -would refuse any message that had a Message-Id: header of any of the -following forms: -.(b -Message-Id: <> -Message-Id: some text -Message-Id: <legal text@domain> extra crud -.)b -.sh 2 "O \*- Set Option" -.pp -There are a number of -global -options that -can be set from a configuration file. -Options are represented by full words; -some are also representable as single characters -for back compatibility. -The syntax of this line is: -.(b F -.b O \0 -.i option \c -.b = \c -.i value -.)b -This sets option -.i option -to be -.i value . -Note that there -.i must -be a space between the letter `O' and the name of the option. -An older version is: -.(b F -.b O \c -.i o\|value -.)b -where the option -.i o -is a single character. -Depending on the option, -.i value -may be a string, an integer, -a boolean -(with legal values -.q t , -.q T , -.q f , -or -.q F ; -the default is TRUE), -or -a time interval. -.pp -The options supported (with the old, one character names in brackets) are: -.nr ii 1i -.ip "AliasFile=\fIspec, spec, ...\fP" -[A] -Specify possible alias file(s). -Each -.i spec -should be in the format -``\c -.i class \c -.b : -.i file '' -where -.i class \c -.b : -is optional and defaults to ``implicit''. -Depending on how -.i sendmail -is compiled, valid classes are -.q implicit -(search through a compiled-in list of alias file types, -for back compatibility), -.q hash -(if -.sm NEWDB -is specified), -.q dbm -(if -.sm NDBM -is specified), -.q stab -(internal symbol table \*- not normally used -unless you have no other database lookup), -or -.q nis -(if -.sm NIS -is specified). -If a list of -.i spec s -are provided, -.i sendmail -searches them in order. -.ip AliasWait=\fItimeout\fP -[a] -If set, -wait up to -.i timeout -(units default to minutes) -for an -.q @:@ -entry to exist in the alias database -before starting up. -If it does not appear in the -.i timeout -interval -rebuild the database -(if the -.b AutoRebuildAliases -option is also set) -or issue a warning. -.ip AllowBogusHELO -[no short name] -If set, allow HELO SMTP commands that don't include a host name. -Setting this violates RFC 1123 section 5.2.5, -but is necessary to interoperate with several SMTP clients. -If there is a value, it is still checked for legitimacy. -.ip AutoRebuildAliases -[D] -If set, -rebuild the alias database if necessary and possible. -If this option is not set, -.i sendmail -will never rebuild the alias database -unless explicitly requested -using -.b \-bi . -Not recommended \(em can cause thrashing. -.ip BlankSub=\fIc\fP -[B] -Set the blank substitution character to -.i c . -Unquoted spaces in addresses are replaced by this character. -Defaults to space (i.e., no change is made). -.ip CheckAliases -[n] -Validate the RHS of aliases when rebuilding the alias database. -.ip CheckpointInterval=\fIN\fP -[C] -Checkpoints the queue every -.i N -(default 10) -addresses sent. -If your system crashes during delivery to a large list, -this prevents retransmission to any but the last -.I N -recipients. -.ip ClassFactor=\fIfact\fP -[z] -The indicated -.i fact or -is multiplied by the message class -(determined by the Precedence: field in the user header -and the -.b P -lines in the configuration file) -and subtracted from the priority. -Thus, messages with a higher Priority: will be favored. -Defaults to 1800. -.ip ColonOkInAddr -[no short name] -If set, colons are acceptable in e-mail addresses -(e.g., -.q host:user ). -If not set, colons indicate the beginning of a RFC 822 group construct -(\c -.q "groupname: member1, member2, ... memberN;" ). -Doubled colons are always acceptable -(\c -.q nodename::user ) -and proper route-addr nesting is understood -(\c -.q <@relay:user@host> ). -Furthermore, this option defaults on if the configuration version level -is less than 6 (for back compatibility). -However, it must be off for full compatibility with RFC 822. -.ip ConnectionCacheSize=\fIN\fP -[k] -The maximum number of open connections that will be cached at a time. -The default is one. -This delays closing the current connection until -either this invocation of -.i sendmail -needs to connect to another host -or it terminates. -Setting it to zero defaults to the old behavior, -that is, connections are closed immediately. -Since this consumes file descriptors, -the connection cache should be kept small: -4 is probably a practical maximum. -.ip ConnectionCacheTimeout=\fItimeout\fP -[K] -The maximum amount of time a cached connection will be permitted to idle -without activity. -If this time is exceeded, -the connection is immediately closed. -This value should be small (on the order of ten minutes). -Before -.i sendmail -uses a cached connection, -it always sends a RSET command -to check the connection; -if this fails, it reopens the connection. -This keeps your end from failing if the other end times out. -The point of this option is to be a good network neighbor -and avoid using up excessive resources -on the other end. -The default is five minutes. -.ip ConnectionRateThrottle=\fIN\fP -[no short name] -If set to a positive value, -allow no more than -.i N -incoming daemon connections in a one second period. -This is intended to flatten out peaks -and allow the load average checking to cut in. -Defaults to zero (no limits). -.ip DaemonPortOptions=\fIoptions\fP -[O] -Set server SMTP options. -The options are -.i key=value -pairs. -Known keys are: -.(b -.ta 1i -Port Name/number of listening port (defaults to "smtp") -Addr Address mask (defaults INADDR_ANY) -Family Address family (defaults to INET) -Listen Size of listen queue (defaults to 10) -SndBufSize Size of TCP send buffer -RcvBufSize Size of TCP receive buffer -.)b -The -.i Addr ess -mask may be a numeric address in dot notation -or a network name. -.ip DefaultCharSet=\fIcharset\fP -[no short name] -When a message that has 8-bit characters but is not in MIME format -is converted to MIME -(see the EightBitMode option) -a character set must be included in the Content-Type: header. -This character set is normally set from the Charset= field -of the mailer descriptor. -If that is not set, the value of this option is used. -If this option is not set, the value -.q unknown-8bit -is used. -.ip DefaultUser=\fIuser:group\fP -[u] -Set the default userid for mailers to -.i user:group . -If -.i group -is omitted and -.i user -is a user name -(as opposed to a numeric user id) -the default group listed in the /etc/passwd file for that user is used -as the default group. -Both -.i user -and -.i group -may be numeric. -Mailers without the -.i S -flag in the mailer definition -will run as this user. -Defaults to 1:1. -The value can also be given as a symbolic user name.\** -.(f -\**The old -.b g -option has been combined into the -.b DefaultUser -option. -.)f -.ip DeliveryMode=\fIx\fP -[d] -Deliver in mode -.i x . -Legal modes are: -.(b -.ta 4n -i Deliver interactively (synchronously) -b Deliver in background (asynchronously) -q Just queue the message (deliver during queue run) -d Defer delivery and all map lookups (deliver during queue run) -.)b -Defaults to ``b'' if no option is specified, -``i'' if it is specified but given no argument -(i.e., ``Od'' is equivalent to ``Odi''). -The -.b \-v -command line flag sets this to -.b i . -.ip DialDelay=\fIsleeptime\fP -[no short name] -Dial-on-demand network connections can see timeouts -if a connection is opened before the call is set up. -If this is set to an interval and a connection times out -on the first connection being attempted -.i sendmail -will sleep for this amount of time and try again. -This should give your system time to establish the connection -to your service provider. -Units default to seconds, so -.q DialDelay=5 -uses a five second delay. -Defaults to zero -(no retry). -.ip DontBlameSendmail=\fIoption,option,...\fP -[no short name] -In order to avoid possible cracking attempts -caused by world- and group-writable files and directories, -.i sendmail -does paranoid checking when opening most of its support files. -If for some reason you absolutely must run with, -for example, -a group-writable -.i /etc -directory, -then you will have to turn off this checking -(at the cost of making your system more vulnerable to attack). -The arguments are individual options that turn off checking: -.(b -Safe -AssumeSafeChown -ClassFileInUnsafeDirPath -ErrorHeaderInUnsafeDirPath -FileDeliveryToHardLink -FileDeliveryToSymLink -ForwardFileInUnsafeDirPath -ForwardFileInUnsafeDirPathSafe -ForwardFileIngroupWritableDirPath -GroupWritableAliasFile -GroupWritableDirPathSafe -GroupWritableForwardFileSafe -GroupWritableIncludeFileSafe -HelpFileinUnsafeDirPath -IncludeFileInUnsafeDirPath -IncludeFileInUnsafeDirPathSafe -IncludeFileIngroupWritableDirPath -LinkedAliasFileInWritableDir -LinkedClassFileInWritableDir -LinkedForwardFileInWritableDir -LinkedIncludeFileInWritableDir -LinkedMapInWritableDir -LinkedServiceSwitchFileInWritableDir -MapInUnsafeDirPath -RunProgramInUnsafeDirPath -RunWritableProgram -WorldWritableAliasFile -WriteMapToHardLink -WriteMapToSymLink -WriteStatsToHardLink -WriteStatsToSymLink -.)b -.b Safe -is the default. -The details of these flags are described above. -.\"XXX should have more here!!! XXX -.b "Use of this option is not recommended." -.ip DontExpandCnames -[no short name] -The standards say that all host addresses used in a mail message -must be fully canonical. -For example, if your host is named -.q Cruft.Foo.ORG -and also has an alias of -.q FTP.Foo.ORG , -the former name must be used at all times. -This is enforced during host name canonification -($[ ... $] lookups). -If this option is set, the protocols are ignored and the -.q wrong -thing is done. -However, the IETF is moving toward changing this standard, -so the behaviour may become acceptable. -Please note that hosts downstream may still rewrite the address -to be the true canonical name however. -.ip DontInitGroups -[no short name] -If set, -.i sendmail -will avoid using the initgroups(3) call. -If you are running NIS, -this causes a sequential scan of the groups.byname map, -which can cause your NIS server to be badly overloaded in a large domain. -The cost of this is that the only group found for users -will be their primary group (the one in the password file), -which will make file access permissions somewhat more restrictive. -Has no effect on systems that don't have group lists. -.ip DontProbeInterfaces -[no short name] -.i Sendmail -normally finds the names of all interfaces active on your machine -when it starts up -and adds their name to the -.b $=w -class of known host aliases. -If you have a large number of virtual interfaces -or if your DNS inverse lookups are slow -this can be time consuming. -This option turns off that probing. -However, you will need to be certain to include all variant names -in the -.b $=w -class by some other mechanism. -.ip DontPruneRoutes -[R] -Normally, -.i sendmail -tries to eliminate any unnecessary explicit routes -when sending an error message -(as discussed in RFC 1123 \(sc 5.2.6). -For example, -when sending an error message to -.(b -<@known1,@known2,@known3:user@unknown> -.)b -.i sendmail -will strip off the -.q @known1,@known2 -in order to make the route as direct as possible. -However, if the -.b R -option is set, this will be disabled, -and the mail will be sent to the first address in the route, -even if later addresses are known. -This may be useful if you are caught behind a firewall. -.ip DoubleBounceAddress=\fIerror-address\fP -[no short name] -If an error occurs when sending an error message, -send the error report -(termed a -.q "double bounce" -because it is an error -.q bounce -that occurs when trying to send another error -.q bounce ) -to the indicated address. -If not set, defaults to -.q postmaster . -.ip EightBitMode=\fIaction\fP -[8] -Set handling of eight-bit data. -There are two kinds of eight-bit data: -that declared as such using the -.b BODY=8BITMIME -ESMTP declaration or the -.b \-B8BITMIME -command line flag, -and undeclared 8-bit data, that is, -input that just happens to be eight bits. -There are three basic operations that can happen: -undeclared 8-bit data can be automatically converted to 8BITMIME, -undeclared 8-bit data can be passed as-is without conversion to MIME -(``just send 8''), -and declared 8-bit data can be converted to 7-bits -for transmission to a non-8BITMIME mailer. -The possible -.i action s -are: -.(b -.\" r Reject undeclared 8-bit data; -.\" don't convert 8BITMIME\(->7BIT (``reject'') - s Reject undeclared 8-bit data (``strict'') -.\" do convert 8BITMIME\(->7BIT (``strict'') -.\" c Convert undeclared 8-bit data to MIME; -.\" don't convert 8BITMIME\(->7BIT (``convert'') - m Convert undeclared 8-bit data to MIME (``mime'') -.\" do convert 8BITMIME\(->7BIT (``mime'') -.\" j Pass undeclared 8-bit data; -.\" don't convert 8BITMIME\(->7BIT (``just send 8'') - p Pass undeclared 8-bit data (``pass'') -.\" do convert 8BITMIME\(->7BIT (``pass'') -.\" a Adaptive algorithm: see below -.)b -.\"The adaptive algorithm is to accept 8-bit data, -.\"converting it to 8BITMIME only if the receiver understands that, -.\"otherwise just passing it as undeclared 8-bit data; -.\"8BITMIME\(->7BIT conversions are done. -In all cases properly declared 8BITMIME data will be converted to 7BIT -as needed. -.ip ErrorHeader=\fIfile-or-message\fP -[E] -Prepend error messages with the indicated message. -If it begins with a slash, -it is assumed to be the pathname of a file -containing a message (this is the recommended setting). -Otherwise, it is a literal message. -The error file might contain the name, email address, and/or phone number -of a local postmaster who could provide assistance -in to end users. -If the option is missing or null, -or if it names a file which does not exist or which is not readable, -no message is printed. -.ip ErrorMode=\fIx\fP -[e] -Dispose of errors using mode -.i x . -The values for -.i x -are: -.(b -p Print error messages (default) -q No messages, just give exit status -m Mail back errors -w Write back errors (mail if user not logged in) -e Mail back errors and give zero exit stat always -.)b -.ip FallbackMXhost=\fIfallbackhost\fP -[V] -If specified, the -.i fallbackhost -acts like a very low priority MX -on every host. -This is intended to be used by sites with poor network connectivity. -.ip ForkEachJob -[Y] -If set, -deliver each job that is run from the queue in a separate process. -Use this option if you are short of memory, -since the default tends to consume considerable amounts of memory -while the queue is being processed. -.ip ForwardPath=\fIpath\fP -[J] -Set the path for searching for users' .forward files. -The default is -.q $z/.forward . -Some sites that use the automounter may prefer to change this to -.q /var/forward/$u -to search a file with the same name as the user in a system directory. -It can also be set to a sequence of paths separated by colons; -.i sendmail -stops at the first file it can successfully and safely open. -For example, -.q /var/forward/$u:$z/.forward -will search first in /var/forward/\c -.i username -and then in -.i ~username /.forward -(but only if the first file does not exist). -.ip HelpFile=\fIfile\fP -[H] -Specify the help file -for SMTP. -.ip HoldExpensive -[c] -If an outgoing mailer is marked as being expensive, -don't connect immediately. -This requires that queueing be compiled in, -since it will depend on a queue run process to -actually send the mail. -.ip HostsFile=\fIpath\fP -[no short name] -The path to the hosts database, -normally -.q /etc/hosts . -This option is only consulted when sendmail -is canonifying addresses, -and then only when -.q files -is in the -.q hosts -service switch entry. -In particular, this file is -.i never -used when looking up host addresses; -that is under the control of the system -.i gethostbyname (3) -routine. -.ip HostStatusDirectory=\fIpath\fP -[no short name] -The location of the long term host status information. -When set, -information about the status of hosts -(e.g., host down or not accepting connections) -will be shared between all -.i sendmail -processes; -normally, this information is only held within a single queue run. -This option requires a connection cache of at least 1 to function. -If the option begins with a leading `/', -it is an absolute pathname; -otherwise, -it is relative to the mail queue directory. -A suggested value for sites desiring persistent host status is -.q \&.hoststat -(i.e., a subdirectory of the queue directory). -.ip IgnoreDots -[i] -Ignore dots in incoming messages. -This is always disabled (that is, dots are always accepted) -when reading SMTP mail. -.ip LogLevel=\fIn\fP -[L] -Set the log level to -.i n . -Defaults to 9. -.ip M\fIx\|value\fP -[no long version] -Set the macro -.i x -to -.i value . -This is intended only for use from the command line. -The -.b \-M -flag is preferred. -.ip MatchGECOS -[G] -Allow fuzzy matching on the GECOS field. -If this flag is set, -and the usual user name lookups fail -(that is, there is no alias with this name and a -.i getpwnam -fails), -sequentially search the password file -for a matching entry in the GECOS field. -This also requires that MATCHGECOS -be turned on during compilation. -This option is not recommended. -.ip MaxDaemonChildren=\fIN\fP -[no short name] -If set, -.i sendmail -will refuse connections when it has more than -.i N -children processing incoming mail. -This does not limit the number of outgoing connections. -If not set, there is no limit to the number of children -- -that is, the system load averaging controls this. -.ip MaxHopCount=\fIN\fP -[h] -The maximum hop count. -Messages that have been processed more than -.i N -times are assumed to be in a loop and are rejected. -Defaults to 25. -.ip MaxHostStatAge=\fIage\fP -[no short name] -Not yet implemented. -This option specifies how long host status information will be retained. -For example, if a host is found to be down, -connections to that host will not be retried for this interval. -The units default to minutes. -.ip MaxMessageSize=\fIN\fP -[no short name] -Specify the maximum message size -to be advertised in the ESMTP EHLO response. -Messages larger than this will be rejected. -.ip MaxQueueRunSize=\fIN\fP -[no short name] -The maximum number of jobs that will be processed -in a single queue run. -If not set, there is no limit on the size. -If you have very large queues or a very short queue run interval -this could be unstable. -However, since the first -.i N -jobs in queue directory order are run (rather than the -.i N -highest priority jobs) -this should be set as high as possible to avoid -.q losing -jobs that happen to fall late in the queue directory. -.ip MaxRecipientsPerMessage=\fIN\fP -[no short name] -The maximum number of recipients that will be accepted per message -in an SMTP transaction. -Note: setting this too low can interfere with sending mail from -MUAs that use SMTP for initial submission. -If not set, there is no limit on the number of recipients per envelope. -.ip MeToo -[m] -Send to me too, -even if I am in an alias expansion. -.ip MinFreeBlocks=\fIN\fP -[b] -Insist on at least -.i N -blocks free on the filesystem that holds the queue files -before accepting email via SMTP. -If there is insufficient space -.i sendmail -gives a 452 response -to the MAIL command. -This invites the sender to try again later. -.ip MinQueueAge=\fPage\fP -[no short name] -Don't process any queued jobs -that have been in the queue less than the indicated time interval. -This is intended to allow you to get responsiveness -by processing the queue fairly frequently -without thrashing your system by trying jobs too often. -The default units are minutes. -.ip MustQuoteChars=\fIs\fP -[no short name] -Sets the list of characters that must be quoted if used in a full name -that is in the phrase part of a ``phrase <address>'' syntax. -The default is ``\'.''. -The characters ``@,;:\e()[]'' are always added to this list. -.ip NoRecipientAction -[no short name] -The action to take when you receive a message that has no valid -recipient headers (To:, Cc:, Bcc:, or Apparently-To: \(em -the last included for back compatibility with old -.i sendmail s). -It can be -.b None -to pass the message on unmodified, -which violates the protocol, -.b Add-To -to add a To: header with any recipients it can find in the envelope -(which might expose Bcc: recipients), -.b Add-Apparently-To -to add an Apparently-To: header -(this is only for back-compatibility -and is officially deprecated), -.b Add-To-Undisclosed -to add a header -.q "To: undisclosed-recipients:;" -to make the header legal without disclosing anything, -or -.b Add-Bcc -to add an empty Bcc: header. -.ip OldStyleHeaders -[o] -Assume that the headers may be in old format, -i.e., -spaces delimit names. -This actually turns on -an adaptive algorithm: -if any recipient address contains a comma, parenthesis, -or angle bracket, -it will be assumed that commas already exist. -If this flag is not on, -only commas delimit names. -Headers are always output with commas between the names. -Defaults to off. -.ip OperatorChars=\fIcharlist\fP -[$o macro] -The list of characters that are considered to be -.q operators , -that is, characters that delimit tokens. -All operator characters are tokens by themselves; -sequences of non-operator characters are also tokens. -White space characters separate tokens -but are not tokens themselves \(em for example, -.q AAA.BBB -has three tokens, but -.q "AAA BBB" -has two. -If not set, OperatorChars defaults to -.q \&.\|:\|@\|[\|] ; -additionally, the characters -.q (\|)\|<\|>\|,\|; -are always operators. -.ip PostmasterCopy=\fIpostmaster\fP -[P] -If set, -copies of error messages will be sent to the named -.i postmaster . -Only the header of the failed message is sent. -Since most errors are user problems, -this is probably not a good idea on large sites, -and arguably contains all sorts of privacy violations, -but it seems to be popular with certain operating systems vendors. -Defaults to no postmaster copies. -.ip PrivacyOptions=\fI\|opt,opt,...\fP -[p] -Set the privacy -.i opt ions. -``Privacy'' is really a misnomer; -many of these are just a way of insisting on stricter adherence -to the SMTP protocol. -The -.i opt ions -can be selected from: -.(b -.ta \w'needvrfyhelo'u+3n -public Allow open access -needmailhelo Insist on HELO or EHLO command before MAIL -needexpnhelo Insist on HELO or EHLO command before EXPN -noexpn Disallow EXPN entirely -needvrfyhelo Insist on HELO or EHLO command before VRFY -novrfy Disallow VRFY entirely -noetrn Disallow ETRN entirely -noverb Disallow VERB entirely -restrictmailq Restrict mailq command -restrictqrun Restrict \-q command line flag -noreceipts Don't return success DSNs\** -goaway Disallow essentially all SMTP status queries -authwarnings Put X-Authentication-Warning: headers in messages -.)b -.(f -\**N.B.: -the -.b noreceipts -flag causes -.i sendmail -to violate RFC 1891, -which requires that return receipts be provided -if Delivery Status Notifications are supported. -.)f -The -.q goaway -pseudo-flag sets all flags except -.q restrictmailq -and -.q restrictqrun . -If mailq is restricted, -only people in the same group as the queue directory -can print the queue. -If queue runs are restricted, -only root and the owner of the queue directory -can run the queue. -Authentication Warnings add warnings about various conditions -that may indicate attempts to spoof the mail system, -such as using an non-standard queue directory. -.ip QueueDirectory=\fIdir\fP -[Q] -Use the named -.i dir -as the queue directory. -.ip QueueFactor=\fIfactor\fP -[q] -Use -.i factor -as the multiplier in the map function -to decide when to just queue up jobs rather than run them. -This value is divided by the difference between the current load average -and the load average limit -(\c -.b QueueLA -option) -to determine the maximum message priority -that will be sent. -Defaults to 600000. -.ip QueueLA=\fILA\fP -[x] -When the system load average exceeds -.i LA , -just queue messages -(i.e., don't try to send them). -Defaults to 8. -.ip QueueSortOrder=\fIalgorithm\fP -[no short name] -Sets the -.i algorithm -used for sorting the queue. -Only the first character of the value is used. -Legal values are -.q host -(to order by the name of the first host name of the first recipient), -.q time -(to order by the submission time), -and -.q priority -(to order by message priority). -Host ordering makes better use of the connection cache, -but may tend to process low priority messages -that go to a single host -over high priority messages that go to several hosts; -it probably shouldn't be used on slow network links. -Time ordering is almost always a bad idea, -since it allows large, bulk mail to go out -before smaller, personal mail, -but may have applicability on some hosts with very fast connections. -Priority ordering is the default. -.ip QueueTimeout=\fItimeout\fP -[T] -A synonym for -.q Timeout.queuereturn . -Use that form instead of the -.q QueueTimeout -form. -.ip ResolverOptions=\fIoptions\fP -[I] -Set resolver options. -Values can be set using -.b + \c -.i flag -and cleared using -.b \- \c -.i flag ; -the -.i flag s -can be -.q debug , -.q aaonly , -.q usevc , -.q primary , -.q igntc , -.q recurse , -.q defnames , -.q stayopen , -or -.q dnsrch . -The string -.q HasWildcardMX -(without a -.b + -or -.b \- ) -can be specified to turn off matching against MX records -when doing name canonifications. -.b N.B. -Prior to 8.7, -this option indicated that the name server be responding -in order to accept addresses. -This has been replaced by checking to see -if the -.q dns -method is listed in the service switch entry for the -.q hosts -service. -.ip RunAsUser=\fIuser\fP -[no short name] -The -.i user -parameter may be a user name -(looked up in -.i /etc/passwd ) -or a numeric user id; -either form can have -.q ":group" -attached -(where group can be numeric or symbolic). -If set to a non-zero (non-root) value, -.i sendmail -will change to this user id shortly after startup\**. -.(f -\**When running as a daemon, -it changes to this user after accepting a connection -but before reading any -.sm SMTP -commands. -.)f -This avoids a certain class of security problems. -However, this means that all -.q \&.forward -and -.q :include: -files must be readable by the indicated -.i user , -and on systems that don't support the saved uid bit properly, -all files to be written must be writable by -.i user -and all programs will be executed by -.i user . -It is also incompatible with the -.b SafeFileEnvironment -option. -In other words, it may not actually add much to security on an average system, -and may in fact detract from security -(because other file permissions must be loosened). -However, it should be useful on firewalls and other -places where users don't have accounts and the aliases file is -well constrained. -.ip RecipientFactor=\fIfact\fP -[y] -The indicated -.i fact or -is added to the priority (thus -.i lowering -the priority of the job) -for each recipient, -i.e., this value penalizes jobs with large numbers of recipients. -Defaults to 30000. -.ip RefuseLA=\fILA\fP -[X] -When the system load average exceeds -.i LA , -refuse incoming SMTP connections. -Defaults to 12. -.ip RetryFactor=\fIfact\fP -[Z] -The -.i fact or -is added to the priority -every time a job is processed. -Thus, -each time a job is processed, -its priority will be decreased by the indicated value. -In most environments this should be positive, -since hosts that are down are all too often down for a long time. -Defaults to 90000. -.ip SafeFileEnvironment=\fIdir\fP -[no short name] -If this option is set, -.i sendmail -will do a -.i chroot (2) -call into the indicated -.i dir ectory -before doing any file writes. -If the file name specified by the user begins with -.i dir , -that partial path name will be stripped off before writing, -so (for example) -if the SafeFileEnvironment variable is set to -.q /safe -then aliases of -.q /safe/logs/file -and -.q /logs/file -actually indicate the same file. -Additionally, if this option is set, -.i sendmail -refuses to deliver to symbolic links. -.ip SaveFromLine -[f] -Save -Unix-style -.q From -lines at the front of headers. -Normally they are assumed redundant -and discarded. -.ip SendMIMEErrors -[j] -If set, send error messages in MIME format -(see RFC2045 and RFC1344 for details). -If disabled, -.i sendmail -will not return the DSN keyword in response to an EHLO -and will not do Delivery Status Notification processing as described in -RFC1891. -.ip ServiceSwitchFile=\fIfilename\fP -[no short name] -If your host operating system has a service switch abstraction -(e.g., /etc/nsswitch.conf on Solaris -or /etc/svc.conf on Ultrix and DEC OSF/1) -that service will be consulted and this option is ignored. -Otherwise, this is the name of a file -that provides the list of methods used to implement particular services. -The syntax is a series of lines, -each of which is a sequence of words. -The first word is the service name, -and following words are service types. -The services that -.i sendmail -consults directly are -.q aliases -and -.q hosts. -Service types can be -.q dns , -.q nis , -.q nisplus , -or -.q files -(with the caveat that the appropriate support -must be compiled in -before the service can be referenced). -If ServiceSwitchFile is not specified, it defaults to /etc/service.switch. -If that file does not exist, the default switch is: -.(b -aliases files -hosts dns nis files -.)b -The default file is -.q /etc/service.switch . -.ip SevenBitInput -[7] -Strip input to seven bits for compatibility with old systems. -This shouldn't be necessary. -.ip SingleLineFromHeader -[no short name] -If set, From: lines that have embedded newlines are unwrapped -onto one line. -This is to get around a botch in Lotus Notes -that apparently cannot understand legally wrapped RFC822 headers. -.ip SingleThreadDelivery -[no short name] -If set, a client machine will never try to open two SMTP connections -to a single server machine at the same time, -even in different processes. -That is, if another -.i sendmail -is already talking to some host a new -.i sendmail -will not open another connection. -This property is of mixed value; -although this reduces the load on the other machine, -it can cause mail to be delayed -(for example, if one -.i sendmail -is delivering a huge message, other -.i sendmail s -won't be able to send even small messages). -Also, it requires another file descriptor -(for the lock file) -per connection, so you may have to reduce the -.b ConnectionCacheSize -option to avoid running out of per-process file descriptors. -Requires the -.b HostStatusDirectory -option. -.ip SmtpGreetingMessage=\fImessage\fP -[$e macro] -The message printed when the SMTP server starts up. -Defaults to -.q "$j Sendmail $v ready at $b". -.ip StatusFile=\fIfile\fP -[S] -Log summary statistics in the named -.i file . -If not set, -no summary statistics are saved. -This file does not grow in size. -It can be printed using the -.i mailstats (8) -program. -.ip SuperSafe -[s] -Be super-safe when running things, -i.e., -always instantiate the queue file, -even if you are going to attempt immediate delivery. -.i Sendmail -always instantiates the queue file -before returning control to the client -under any circumstances. -This should really -.i always -be set. -.ip TempFileMode=\fImode\fP -[F] -The file mode for queue files. -It is interpreted in octal by default. -Defaults to 0600. -.ip Timeout.\fItype\fP=\|\fItimeout\fP -[r; subsumes old T option as well] -Set timeout values. -The actual timeout is indicated by the -.i type . -The recognized timeouts and their default values, and their -minimum values specified in RFC 1123 section 5.3.2 are: -.(b -.ta \w'datafinal'u+3n -initial wait for initial greeting message [5m, 5m] -helo reply to HELO or EHLO command [5m, none] -mail reply to MAIL command [10m, 5m] -rcpt reply to RCPT command [1h, 5m] -datainit reply to DATA command [5m, 2m] -datablock data block read [1h, 3m] -datafinal reply to final ``.'' in data [1h, 10m] -rset reply to RSET command [5m, none] -quit reply to QUIT command [2m, none] -misc reply to NOOP and VERB commands [2m, none] -ident IDENT protocol timeout [30s, none] -fileopen\(dg timeout on opening .forward and :include: files [60s, none] -command\(dg command read [1h, 5m] -queuereturn\(dg how long until a message is returned [5d, 5d] -queuewarn\(dg how long until a warning is sent [none, none] -hoststatus\(dg how long until host status is ``stale'' [30m, none] -.)b -All but those marked with a dagger (\(dg) -apply to client SMTP. -If the message is submitted using the -.sm NOTIFY -.sm SMTP -extension, -warning messages will only be sent if -.sm NOTIFY=DELAY -is specified. -The queuereturn and queuewarn timeouts -can be further qualified with a tag based on the Precedence: field -in the message; -they must be one of -.q urgent -(indicating a positive non-zero precedence) -.q normal -(indicating a zero precedence), or -.q non-urgent -(indicating negative precedences). -For example, setting -.q Timeout.queuewarn.urgent=1h -sets the warning timeout for urgent messages only -to one hour. -The default if no precedence is indicated -is to set the timeout for all precedences. -.ip TimeZoneSpec=\fItzinfo\fP -[t] -Set the local time zone info to -.i tzinfo -\*- for example, -.q PST8PDT . -Actually, if this is not set, -the TZ environment variable is cleared (so the system default is used); -if set but null, the user's TZ variable is used, -and if set and non-null the TZ variable is set to this value. -.ip TryNullMXList -[w] -If this system is the -.q best -(that is, lowest preference) -MX for a given host, -its configuration rules should normally detect this situation -and treat that condition specially -by forwarding the mail to a UUCP feed, -treating it as local, -or whatever. -However, in some cases (such as Internet firewalls) -you may want to try to connect directly to that host -as though it had no MX records at all. -Setting this option causes -.i sendmail -to try this. -The downside is that errors in your configuration -are likely to be diagnosed as -.q "host unknown" -or -.q "message timed out" -instead of something more meaningful. -This option is disrecommended. -.ip UnixFromLine=\fIfromline\fP -[$l macro] -Defines the format used when -.i sendmail -must add a UNIX-style From_ line -(that is, a line beginning -.q From<space>user ). -Defaults to -.q "From $g $d" . -Don't change this unless your system uses a different UNIX mailbox format -(very unlikely). -.ip UnsafeGroupWrites -[no short name] -If set, -:include: and .forward files that are group writable are considered -.q unsafe , -that is, -they cannot reference programs or write directly to files. -World writable :include: and .forward files -are always unsafe.. -.ip UseErrorsTo -[l] -If there is an -.q Errors-To: -header, send error messages to the addresses listed there. -They normally go to the envelope sender. -Use of this option causes -.i sendmail -to violate RFC 1123. -This option is disrecommended and deprecated. -.ip UserDatabaseSpec=\fIudbspec\fP -[U] -The user database specification. -.ip UserSubmission -[no short name] -This is an initial submission directly from a Mail User Agent. -This can be set in the configuration file if you have -MUAs that don't pass the -.b \-U -flag or use the -XUSR -ESMTP extension, -but some relayed mail may get inappropriately rewritten if you do. -.ip Verbose -[v] -Run in verbose mode. -If this is set, -.i sendmail -adjusts options -.b HoldExpensive -(old -.b c ) -and -.b DeliveryMode -(old -.b d ) -so that all mail is delivered completely -in a single job -so that you can see the entire delivery process. -Option -.b Verbose -should -.i never -be set in the configuration file; -it is intended for command line use only. -.lp -All options can be specified on the command line using the -\-O or \-o flag, -but most will cause -.i sendmail -to relinquish its setuid permissions. -The options that will not cause this are -MinFreeBlocks [b], -DeliveryMode [d], -ErrorMode [e], -IgnoreDots [i], -LogLevel [L], -MeToo [m], -OldStyleHeaders [o], -PrivacyOptions [p], -Timeouts [r], -SuperSafe [s], -Verbose [v], -CheckpointInterval [C], -and -SevenBitInput [7]. -Also, M (define macro) when defining the r or s macros -is also considered -.q safe . -.sh 2 "P \*- Precedence Definitions" -.pp -Values for the -.q "Precedence:" -field may be defined using the -.b P -control line. -The syntax of this field is: -.(b -\fBP\fP\fIname\fP\fB=\fP\fInum\fP -.)b -When the -.i name -is found in a -.q Precedence: -field, -the message class is set to -.i num . -Higher numbers mean higher precedence. -Numbers less than zero -have the special property -that if an error occurs during processing -the body of the message will not be returned; -this is expected to be used for -.q "bulk" -mail such as through mailing lists. -The default precedence is zero. -For example, -our list of precedences is: -.(b -Pfirst-class=0 -Pspecial-delivery=100 -Plist=\-30 -Pbulk=\-60 -Pjunk=\-100 -.)b -People writing mailing list exploders -are encouraged to use -.q "Precedence: list" . -Older versions of -.i sendmail -(which discarded all error returns for negative precedences) -didn't recognize this name, giving it a default precedence of zero. -This allows list maintainers to see error returns -on both old and new versions of -.i sendmail . -.sh 2 "V \*- Configuration Version Level" -.pp -To provide compatibility with old configuration files, -the -.b V -line has been added to define some very basic semantics -of the configuration file. -These are not intended to be long term supports; -rather, they describe compatibility features -which will probably be removed in future releases. -.pp -.b N.B.: -these version -.i levels -have nothing -to do with the version -.i number -on the files. -For example, -as of this writing -version 8 config files -(specifically, 8.9) -used version level 8 configurations. -.pp -.q Old -configuration files are defined as version level one. -Version level two files make the following changes: -.np -Host name canonification ($[ ... $]) -appends a dot if the name is recognized; -this gives the config file a way of finding out if anything matched. -(Actually, this just initializes the -.q host -map with the -.q \-a. -flag \*- you can reset it to anything you prefer -by declaring the map explicitly.) -.np -Default host name extension is consistent throughout processing; -version level one configurations turned off domain extension -(that is, adding the local domain name) -during certain points in processing. -Version level two configurations are expected to include a trailing dot -to indicate that the name is already canonical. -.np -Local names that are not aliases -are passed through a new distinguished ruleset five; -this can be used to append a local relay. -This behaviour can be prevented by resolving the local name -with an initial `@'. -That is, something that resolves to a local mailer and a user name of -.q vikki -will be passed through ruleset five, -but a user name of -.q @vikki -will have the `@' stripped, -will not be passed through ruleset five, -but will otherwise be treated the same as the prior example. -The expectation is that this might be used to implement a policy -where mail sent to -.q vikki -was handled by a central hub, -but mail sent to -.q vikki@localhost -was delivered directly. -.pp -Version level three files -allow # initiated comments on all lines. -Exceptions are backslash escaped # marks -and the $# syntax. -.pp -Version level four configurations -are completely equivalent to level three -for historical reasons. -.pp -Version level five configuration files -change the default definition of -.b $w -to be just the first component of the hostname. -.pp -Version level six configuration files -change many of the local processing options -(such as aliasing and matching the beginning of the address for -`|' characters) -to be mailer flags; -this allows fine-grained control over the special local processing. -Level six configuration files may also use long option names. -The -.b ColonOkInAddr -option (to allow colons in the local-part of addresses) -defaults -.b on -for lower numbered configuration files; -the configuration file requires some additional intelligence -to properly handle the RFC 822 group construct. -.pp -Version level seven configuration files -used new option names to replace old macros -(\c -.b $e -became -.b SmtpGreeetingMessage , -.b $l -became -.b UnixFromLine , -and -.b $o -became -.b OperatorChars . -Also, prior to version seven, -the -.b F=q -flag (use 250 instead of 252 return value for -.sm "SMTP VRFY" -commands) -was assumed. -.pp -Version level eight configuration files allow -.b $# -on the left hand side of ruleset lines. -.pp -The -.b V -line may have an optional -.b / \c -.i vendor -to indicate that this configuration file uses modifications -specific to a particular vendor\**. -.(f -\**And of course, vendors are encouraged to add themselves -to the list of recognized vendors by editing the routine -.i setvendor -in -.i conf.c . -Please send e-mail to sendmail@Sendmail.ORG -to register your vendor dialect. -.)f -You may use -.q /Berkeley -to emphasize that this configuration file -uses the Berkeley dialect of -.i sendmail . -.sh 2 "K \*- Key File Declaration" -.pp -Special maps can be defined using the line: -.(b -Kmapname mapclass arguments -.)b -The -.i mapname -is the handle by which this map is referenced in the rewriting rules. -The -.i mapclass -is the name of a type of map; -these are compiled in to -.i sendmail . -The -.i arguments -are interpreted depending on the class; -typically, -there would be a single argument naming the file containing the map. -.pp -Maps are referenced using the syntax: -.(b -$( \fImap\fP \fIkey\fP $@ \fIarguments\fP $: \fIdefault\fP $) -.)b -where either or both of the -.i arguments -or -.i default -portion may be omitted. -The -.i "$@ arguments" -may appear more than once. -The indicated -.i key -and -.i arguments -are passed to the appropriate mapping function. -If it returns a value, it replaces the input. -If it does not return a value and the -.i default -is specified, the -.i default -replaces the input. -Otherwise, the input is unchanged. -.pp -The -.i arguments -are passed to the map for arbitrary use. -Most map classes can interpolate these arguments -into their values using the syntax -.q %\fIn\fP -(where -.i n -is a digit) -to indicate the corresponding -.i argument . -Argument -.q %0 -indicates the database key. -For example, the rule -.(b -.ta 1.5i -R$\- ! $+ $: $(uucp $1 $@ $2 $: %1 @ %0 . UUCP $) -.)b -Looks up the UUCP name in a (user defined) UUCP map; -if not found it turns it into -.q \&.UUCP -form. -The database might contain records like: -.(b -decvax %1@%0.DEC.COM -research %1@%0.ATT.COM -.)b -Note that -.i default -clauses never do this mapping. -.pp -The built in map with both name and class -.q host -is the host name canonicalization lookup. -Thus, -the syntax: -.(b -$(host \fIhostname\fP$) -.)b -is equivalent to: -.(b -$[\fIhostname\fP$] -.)b -.pp -There are many defined classes. -.ip dbm -Database lookups using the ndbm(3) library. -.i Sendmail -must be compiled with -.b NDBM -defined. -.ip btree -Database lookups using the btree interface to the Berkeley DB -library. -.i Sendmail -must be compiled with -.b NEWDB -defined. -.ip hash -Database lookups using the hash interface to the Berkeley DB -library. -.i Sendmail -must be compiled with -.b NEWDB -defined. -.ip nis -NIS lookups. -.i Sendmail -must be compiled with -.b NIS -defined. -.ip nisplus -NIS+ lookups. -.i Sendmail -must be compiled with -.b NISPLUS -defined. -The argument is the name of the table to use for lookups, -and the -.b \-k -and -.b \-v -flags may be used to set the key and value columns respectively. -.ip hesiod -Hesiod lookups. -.i Sendmail -must be compiled with -.b HESIOD -defined. -.ip ldapx -LDAP X500 directory lookups. -.i Sendmail -must be compiled with -.b LDAPMAP -defined. -The map supports most of the standard arguments -and most of the command line arguments of the -.i ldapsearch -program. -.ip netinfo -NeXT NetInfo lookups. -.i Sendmail -must be compiled with -.b NETINFO -defined. -.ip text -Text file lookups. -The format of the text file is defined by the -.b \-k -(key field number), -.b \-v -(value field number), -and -.b \-z -(field delimiter) -flags. -.ip stab -Internal symbol table lookups. -Used internally for aliasing. -.ip implicit -Really should be called -.q alias -\(em this is used to get the default lookups -for alias files, -and is the default if no class is specified for alias files. -.ip user -Looks up users using -.i getpwnam (3). -The -.b \-v -flag can be used to specify the name of the field to return -(although this is normally used only to check the existence -of a user). -.ip host -Canonifies host domain names. -Given a host name it calls the name server -to find the canonical name for that host. -.ip bestmx -Returns the best MX record for a host name given as the key. -The current machine is always preferred \*- -that is, if the current machine is one of the hosts listed as a -lowest-preference MX record, then it will be guaranteed to be returned. -This can be used to find out if this machine is the target for an MX record, -and mail can be accepted on that basis. -If the -.b \-z -flag is given, then all MX names are returned, -separated by the given delimiter. -.ip sequence -The arguments on the `K' line are a list of maps; -the resulting map searches the argument maps in order -until it finds a match for the indicated key. -For example, if the key definition is: -.(b -Kmap1 ... -Kmap2 ... -Kseqmap sequence map1 map2 -.)b -then a lookup against -.q seqmap -first does a lookup in map1. -If that is found, it returns immediately. -Otherwise, the same key is used for map2. -.ip switch -Much like the -.q sequence -map except that the order of maps is determined by the service switch. -The argument is the name of the service to be looked up; -the values from the service switch are appended to the map name -to create new map names. -For example, consider the key definition: -.(b -Kali switch aliases -.)b -together with the service switch entry: -.(b -aliases nis files -.)b -This causes a query against the map -.q ali -to search maps named -.q ali.nis -and -.q ali.files -in that order. -.ip dequote -Strip double quotes (") from a name. -It does not strip backslashes, -and will not strip quotes if the resulting string -would contain unscannable syntax -(that is, basic errors like unbalanced angle brackets; -more sophisticated errors such as unknown hosts are not checked). -The intent is for use when trying to accept mail from systems such as -DECnet -that routinely quote odd syntax such as -.(b -"49ers::ubell" -.)b -A typical usage is probably something like: -.(b -Kdequote dequote - -\&... - -R$\- $: $(dequote $1 $) -R$\- $+ $: $>3 $1 $2 -.)b -Care must be taken to prevent unexpected results; -for example, -.(b -"|someprogram < input > output" -.)b -will have quotes stripped, -but the result is probably not what you had in mind. -Fortunately these cases are rare. -.ip regex -The map definition on the -.b K -line contains a regular expression. -Any key input is compared to that expression using the -POSIX regular expressions routines regcomp(), regerr(), and regexec(). -Refer to the documentation for those routines for more information -about the regular expression matching. -No rewriting of the key is done if the -.b \-m -flag is used. Without it, the key is discarded or if -.b \-s -if used, it is substituted by the substring matches, delimited by -.b $| -or the string specified with the the -.b \-d -flag. The flags available for the map are -.(b --n not --f case sensitive --b basic regular expressions - (default is extended) --s substring match --d set the delimiter used for -s --a append string to key --m match only, do not - replace/discard value -.)b -The -.b \-s -flag can include an optional parameter which can be used -to select the substrings in the result of the lookup. For example, -.(b --s1,3,4 -.)b -.ip program -The arguments on the -.b K -line are the pathname to a program and any initial parameters to be passed. -When the map is called, -the key is added to the initial parameters -and the program is invoked -as the default user/group id. -The first line of standard output is returned as the value of the lookup. -This has many potential security problems, -and has terrible performance; -it should be used only when absolutely necessary. -.pp -Most of these accept as arguments the same optional flags -and a filename -(or a mapname for NIS; -the filename is the root of the database path, -so that -.q .db -or some other extension appropriate for the database type -will be added to get the actual database name). -Known flags are: -.ip "\-o" -Indicates that this map is optional \*- that is, -if it cannot be opened, -no error is produced, -and -.i sendmail -will behave as if the map existed but was empty. -.ip "\-N, \-O" -If neither -.b \-N -or -.b \-O -are specified, -.i sendmail -uses an adaptive algorithm to decide whether or not to look for null bytes -on the end of keys. -It starts by trying both; -if it finds any key with a null byte it never tries again without a null byte -and vice versa. -If -.b \-N -is specified it never tries without a null byte and -if -.b \-O -is specified it never tries with a null byte. -Setting one of -these can speed matches but are never necessary. -If both -.b \-N -and -.b \-O -are specified, -.i sendmail -will never try any matches at all \(em -that is, everything will appear to fail. -.ip "\-a\fIx\fP" -Append the string -.i x -on successful matches. -For example, the default -.i host -map appends a dot on successful matches. -.ip "\-T\fIx\fP" -Append the string -.i x -on temporary failures. -For example, -.i x -would be appended if a DNS lookup returned -.q "server failed" -or an NIS lookup could not locate a server. -See also the -.b \-t -flag. -.ip "\-f" -Do not fold upper to lower case before looking up the key. -.ip "\-m" -Match only (without replacing the value). -If you only care about the existence of a key and not the value -(as you might when searching the NIS map -.q hosts.byname -for example), -this flag prevents the map from substituting the value. -However, -The \-a argument is still appended on a match, -and the default is still taken if the match fails. -.ip "\-k\fIkeycol\fP" -The key column name (for NIS+) or number -(for text lookups). -For LDAP maps this is a filter string -passed to printf with a %s where the string to be -.q "mapped" -is inserted. -.ip "\-v\fIvalcol\fP" -The value column name (for NIS+) or number -(for text lookups). -For LDAP maps this is the name of the -attribute to be returned. -.ip "\-z\fIdelim\fP" -The column delimiter (for text lookups). -It can be a single character or one of the special strings -.q \|\en -or -.q \|\et -to indicate newline or tab respectively. -If omitted entirely, -the column separator is any sequence of whitespace. -.ip "\-t" -Normally, when a map attempts to do a lookup -and the server fails -(e.g., -.i sendmail -couldn't contact any name server; -this is -.i not -the same as an entry not being found in the map), -the message being processed is queued for future processing. -The -.b \-t -flag turns off this behaviour, -letting the temporary failure (server down) -act as though it were a permanent failure (entry not found). -It is particularly useful for DNS lookups, -where someone else's misconfigured name server can cause problems -on your machine. -However, care must be taken to ensure that you don't bounce mail -that would be resolved correctly if you tried again. -A common strategy is to forward such mail -to another, possibly better connected, mail server. -.ip "\-s\fIspacesub\fP -For the dequote map only, -the character to use to replace space characters -after a successful dequote. -.ip "\-q" -Don't dequote the key before lookup. -.ip "\-A" -When rebuilding an alias file, -the -.b \-A -flag causes duplicate entries in the text version -to be merged. -For example, two entries: -.(b -list: user1, user2 -list: user3 -.)b -would be treated as though it were the single entry -.(b -list: user1, user2, user3 -.)b -in the presence of the -.b \-A -flag. -.pp -The -.i dbm -map appends the strings -.q \&.pag -and -.q \&.dir -to the given filename; -the -.i hash -and -.i btree -maps append -.q \&.db . -For example, the map specification -.(b -Kuucp dbm \-o \-N /usr/lib/uucpmap -.)b -specifies an optional map named -.q uucp -of class -.q dbm ; -it always has null bytes at the end of every string, -and the data is located in -/usr/lib/uucpmap.{dir,pag}. -.pp -The program -.i makemap (8) -can be used to build any of the three database-oriented maps. -It takes the following flags: -.ip \-f -Do not fold upper to lower case in the map. -.ip \-N -Include null bytes in keys. -.ip \-o -Append to an existing (old) file. -.ip \-r -Allow replacement of existing keys; -normally, re-inserting an existing key is an error. -.ip \-v -Print what is happening. -.lp -The -.i sendmail -daemon does not have to be restarted to read the new maps -as long as you change them in place; -file locking is used so that the maps won't be read -while they are being updated.\** -.(f -\**That is, don't create new maps and then use -.i mv (1) -to move them into place. -Since the maps are already open -the new maps will never be seen. -.)f -.pp -New classes can be added in the routine -.b setupmaps -in file -.b conf.c . -.sh 2 "The User Database" -.pp -If you have a version of -.i sendmail -with the user database package -compiled in, -the handling of sender and recipient addresses -is modified. -.pp -The location of this database is controlled with the -.b UserDatabaseSpec -option. -.sh 3 "Structure of the user database" -.pp -The database is a sorted (BTree-based) structure. -User records are stored with the key: -.(b -\fIuser-name\fP\fB:\fP\fIfield-name\fP -.)b -The sorted database format ensures that user records are clustered together. -Meta-information is always stored with a leading colon. -.pp -Field names define both the syntax and semantics of the value. -Defined fields include: -.nr ii 1i -.ip maildrop -The delivery address for this user. -There may be multiple values of this record. -In particular, -mailing lists will have one -.i maildrop -record for each user on the list. -.ip "mailname" -The outgoing mailname for this user. -For each outgoing name, -there should be an appropriate -.i maildrop -record for that name to allow return mail. -See also -.i :default:mailname . -.ip mailsender -Changes any mail sent to this address to have the indicated envelope sender. -This is intended for mailing lists, -and will normally be the name of an appropriate -request address. -It is very similar to the owner-\c -.i list -syntax in the alias file. -.ip fullname -The full name of the user. -.ip office-address -The office address for this user. -.ip office-phone -The office phone number for this user. -.ip office-fax -The office FAX number for this user. -.ip home-address -The home address for this user. -.ip home-phone -The home phone number for this user. -.ip home-fax -The home FAX number for this user. -.ip project -A (short) description of the project this person is affiliated with. -In the University this is often just the name of their graduate advisor. -.ip plan -A pointer to a file from which plan information can be gathered. -.pp -As of this writing, -only a few of these fields are actually being used by -.i sendmail : -.i maildrop -and -.i mailname . -A -.i finger -program that uses the other fields is planned. -.sh 3 "User database semantics" -.pp -When the rewriting rules submit an address to the local mailer, -the user name is passed through the alias file. -If no alias is found (or if the alias points back to the same address), -the name (with -.q :maildrop -appended) -is then used as a key in the user database. -If no match occurs (or if the maildrop points at the same address), -forwarding is tried. -.pp -If the first token of the user name returned by ruleset 0 -is an -.q @ -sign, the user database lookup is skipped. -The intent is that the user database will act as a set of defaults -for a cluster (in our case, the Computer Science Division); -mail sent to a specific machine should ignore these defaults. -.pp -When mail is sent, -the name of the sending user is looked up in the database. -If that user has a -.q mailname -record, -the value of that record is used as their outgoing name. -For example, I might have a record: -.(b -eric:mailname Eric.Allman@CS.Berkeley.EDU -.)b -This would cause my outgoing mail to be sent as Eric.Allman. -.pp -If a -.q maildrop -is found for the user, -but no corresponding -.q mailname -record exists, -the record -.q :default:mailname -is consulted. -If present, this is the name of a host to override the local host. -For example, in our case we would set it to -.q CS.Berkeley.EDU . -The effect is that anyone known in the database -gets their outgoing mail stamped as -.q user@CS.Berkeley.EDU , -but people not listed in the database use the local hostname. -.sh 3 "Creating the database\**" -.(f -\**These instructions are known to be incomplete. -A future version of the user database is planned -including things such as finger service \*- and good documentation. -.)f -.pp -The user database is built from a text file -using the -.i makemap -utility -(in the distribution in the makemap subdirectory). -The text file is a series of lines corresponding to userdb records; -each line has a key and a value separated by white space. -The key is always in the format described above \*- -for example: -.(b -eric:maildrop -.)b -This file is normally installed in a system directory; -for example, it might be called -.i /etc/userdb . -To make the database version of the map, run the program: -.(b -makemap btree /etc/userdb.db < /etc/userdb -.)b -Then create a config file that uses this. -For example, using the V8 M4 configuration, include the -following line in your .mc file: -.(b -define(\`confUSERDB_SPEC\', /etc/userdb.db) -.)b -.sh 1 "OTHER CONFIGURATION" -.pp -There are some configuration changes that can be made by -recompiling -.i sendmail . -This section describes what changes can be made -and what has to be modified to make them. -In most cases this should be unnecessary -unless you are porting -.i sendmail -to a new environment. -.sh 2 "Parameters in BuildTools/OS/$oscf" -.pp -These parameters are intended to describe the compilation environment, -not site policy, -and should normally be defined in the operating system -configuration file. -.b "This section needs a complete rewrite." -.ip NDBM -If set, -the new version of the DBM library -that allows multiple databases will be used. -If neither NDBM nor NEWDB are set, -a much less efficient method of alias lookup is used. -.ip NEWDB -If set, use the new database package from Berkeley (from 4.4BSD). -This package is substantially faster than DBM or NDBM. -If NEWDB and NDBM are both set, -.i sendmail -will read DBM files, -but will create and use NEWDB files. -.ip NIS -Include support for NIS. -If set together with -.i both -NEWDB and NDBM, -.i sendmail -will create both DBM and NEWDB files if and only if -an alias file includes the substring -.q /yp/ -in the name. -This is intended for compatibility with Sun Microsystems' -.i mkalias -program used on YP masters. -.ip NISPLUS -Compile in support for NIS+. -.ip NETINFO -Compile in support for NetInfo (NeXT stations). -.ip LDAPMAP -Compile in support for LDAP X500 queries. -Requires libldap and liblber -from the Umich LDAP 3.2 or 3.3 release. -.ip HESIOD -Compile in support for Hesiod. -.ip _PATH_SENDMAILCF -The pathname of the sendmail.cf file. -.ip _PATH_SENDMAILPID -The pathname of the sendmail.pid file. -.pp -There are also several compilation flags to indicate the environment -such as -.q _AIX3 -and -.q _SCO_unix_ . -See the src/README -file for the latest scoop on these flags. -.sh 2 "Parameters in src/conf.h" -.pp -Parameters and compilation options -are defined in conf.h. -Most of these need not normally be tweaked; -common parameters are all in sendmail.cf. -However, the sizes of certain primitive vectors, etc., -are included in this file. -The numbers following the parameters -are their default value. -.pp -This document is not the best source of information -for compilation flags in conf.h \(em -see src/README or src/conf.h itself. -.nr ii 1.2i -.ip "MAXLINE [2048]" -The maximum line length of any input line. -If message lines exceed this length -they will still be processed correctly; -however, header lines, -configuration file lines, -alias lines, -etc., -must fit within this limit. -.ip "MAXNAME [256]" -The maximum length of any name, -such as a host or a user name. -.ip "MAXPV [40]" -The maximum number of parameters to any mailer. -This limits the number of recipients that may be passed in one transaction. -It can be set to any arbitrary number above about 10, -since -.i sendmail -will break up a delivery into smaller batches as needed. -A higher number may reduce load on your system, however. -.ip "MAXATOM [100]" -The maximum number of atoms -(tokens) -in a single address. -For example, -the address -.q "eric@CS.Berkeley.EDU" -is seven atoms. -.ip "MAXMAILERS [25]" -The maximum number of mailers that may be defined -in the configuration file. -.ip "MAXRWSETS [200]" -The maximum number of rewriting sets -that may be defined. -The first half of these are reserved for numeric specification -(e.g., ``S92''), -while the upper half are reserved for auto-numbering -(e.g., ``Sfoo''). -Thus, with a value of 200 an attempt to use ``S99'' will succeed, -but ``S100'' will fail. -.ip "MAXPRIORITIES [25]" -The maximum number of values for the -.q Precedence: -field that may be defined -(using the -.b P -line in sendmail.cf). -.ip "MAXUSERENVIRON [100]" -The maximum number of items in the user environment -that will be passed to subordinate mailers. -.ip "MAXMXHOSTS [100]" -The maximum number of MX records we will accept for any single host. -.ip "MAXALIASDB [12]" -The maximum number of alias databases that can be open at any time. -Note that there may also be an open file limit. -.ip "MAXMAPSTACK [12]" -The maximum number of maps that may be "stacked" in a -.b sequence -class map. -.ip "MAXMIMEARGS [20]" -The maximum number of arguments in a MIME Content-Type: header; -additional arguments will be ignored. -.ip "MAXMIMENESTING [20]" -The maximum depth to which MIME messages may be nested -(that is, nested Message or Multipart documents; -this does not limit the number of components in a single Multipart document). -.lp -A number of other compilation options exist. -These specify whether or not specific code should be compiled in. -Ones marked with \(dg -are 0/1 valued. -.nr ii 1.2i -.ip NETINET\(dg -If set, -support for Internet protocol networking is compiled in. -Previous versions of -.i sendmail -referred to this as -.sm DAEMON ; -this old usage is now incorrect. -Defaults on; -turn it off in the Makefile -if your system doesn't support the Internet protocols. -.ip NETISO\(dg -If set, -support for ISO protocol networking is compiled in -(it may be appropriate to #define this in the Makefile instead of conf.h). -.ip LOG -If set, -the -.i syslog -routine in use at some sites is used. -This makes an informational log record -for each message processed, -and makes a higher priority log record -for internal system errors. -.b "STRONGLY RECOMMENDED" -\(em if you want no logging, turn it off in the configuration file. -.ip MATCHGECOS\(dg -Compile in the code to do ``fuzzy matching'' on the GECOS field -in /etc/passwd. -This also requires that the -.b MatchGECOS -option be turned on. -.ip NAMED_BIND\(dg -Compile in code to use the -Berkeley Internet Name Domain (BIND) server -to resolve TCP/IP host names. -.ip NOTUNIX -If you are using a non-UNIX mail format, -you can set this flag to turn off special processing -of UNIX-style -.q "From " -lines. -.ip QUEUE\(dg -This flag should be set to compile in the queueing code. -If this is not set, -mailers must accept the mail immediately -or it will be returned to the sender. -.ip SMTP\(dg -If set, -the code to handle user and server SMTP will be compiled in. -This is only necessary if your machine has some mailer -that speaks SMTP -(this means most machines everywhere). -.ip USERDB\(dg -Include the -.b experimental -Berkeley user information database package. -This adds a new level of local name expansion -between aliasing and forwarding. -It also uses the NEWDB package. -This may change in future releases. -.lp -The following options are normally turned on -in per-operating-system clauses in conf.h. -.ip IDENTPROTO\(dg -Compile in the IDENT protocol as defined in RFC 1413. -This defaults on for all systems except Ultrix, -which apparently has the interesting -.q feature -that when it receives a -.q "host unreachable" -message it closes all open connections to that host. -Since some firewall gateways send this error code -when you access an unauthorized port (such as 113, used by IDENT), -Ultrix cannot receive email from such hosts. -.ip SYSTEM5 -Set all of the compilation parameters appropriate for System V. -.ip HASFLOCK\(dg -Use Berkeley-style -.b flock -instead of System V -.b lockf -to do file locking. -Due to the highly unusual semantics of locks -across forks in -.b lockf , -this should always be used if at all possible. -.ip HASINITGROUPS -Set this if your system has the -.i initgroups() -call -(if you have multiple group support). -This is the default if SYSTEM5 is -.i not -defined or if you are on HPUX. -.ip HASUNAME -Set this if you have the -.i uname (2) -system call (or corresponding library routine). -Set by default if -SYSTEM5 -is set. -.ip HASGETDTABLESIZE -Set this if you have the -.i getdtablesize (2) -system call. -.ip HASWAITPID -Set this if you have the -.i haswaitpid (2) -system call. -.ip SFS_TYPE -The mechanism that can be used to get file system capacity information. -The values can be one of -SFS_USTAT (use the ustat(2) syscall), -SFS_4ARGS (use the four argument statfs(2) syscall), -SFS_VFS (use the two argument statfs(2) syscall including <sys/vfs.h>), -SFS_MOUNT (use the two argument statfs(2) syscall including <sys/mount.h>), -SFS_STATFS (use the two argument statfs(2) syscall including <sys/statfs.h>), -SFS_STATVFS (use the two argument statfs(2) syscall including <sys/statvfs.h>), -or -SFS_NONE (no way to get this information). -.ip LA_TYPE -The load average type. -Details are described below. -.lp -The are several built-in ways of computing the load average. -.i Sendmail -tries to auto-configure them based on imperfect guesses; -you can select one using the -.i cc -option -.b \-DLA_TYPE= \c -.i type , -where -.i type -is: -.ip LA_INT -The kernel stores the load average in the kernel as an array of long integers. -The actual values are scaled by a factor FSCALE -(default 256). -.ip LA_SHORT -The kernel stores the load average in the kernel as an array of short integers. -The actual values are scaled by a factor FSCALE -(default 256). -.ip LA_FLOAT -The kernel stores the load average in the kernel as an array of -double precision floats. -.ip LA_MACH -Use MACH-style load averages. -.ip LA_SUBR -Call the -.i getloadavg -routine to get the load average as an array of doubles. -.ip LA_ZERO -Always return zero as the load average. -This is the fallback case. -.lp -If type -.sm LA_INT , -.sm LA_SHORT , -or -.sm LA_FLOAT -is specified, -you may also need to specify -.sm _PATH_UNIX -(the path to your system binary) -and -.sm LA_AVENRUN -(the name of the variable containing the load average in the kernel; -usually -.q _avenrun -or -.q avenrun ). -.sh 2 "Configuration in src/conf.c" -.pp -The following changes can be made in conf.c. -.sh 3 "Built-in Header Semantics" -.pp -Not all header semantics are defined in the configuration file. -Header lines that should only be included by certain mailers -(as well as other more obscure semantics) -must be specified in the -.i HdrInfo -table in -.i conf.c . -This table contains the header name -(which should be in all lower case) -and a set of header control flags (described below), -The flags are: -.ip H_ACHECK -Normally when the check is made to see if a header line is compatible -with a mailer, -.i sendmail -will not delete an existing line. -If this flag is set, -.i sendmail -will delete -even existing header lines. -That is, -if this bit is set and the mailer does not have flag bits set -that intersect with the required mailer flags -in the header definition in -sendmail.cf, -the header line is -.i always -deleted. -.ip H_EOH -If this header field is set, -treat it like a blank line, -i.e., -it will signal the end of the header -and the beginning of the message text. -.ip H_FORCE -Add this header entry -even if one existed in the message before. -If a header entry does not have this bit set, -.i sendmail -will not add another header line if a header line -of this name already existed. -This would normally be used to stamp the message -by everyone who handled it. -.ip H_TRACE -If set, -this is a timestamp -(trace) -field. -If the number of trace fields in a message -exceeds a preset amount -the message is returned -on the assumption that it has an aliasing loop. -.ip H_RCPT -If set, -this field contains recipient addresses. -This is used by the -.b \-t -flag to determine who to send to -when it is collecting recipients from the message. -.ip H_FROM -This flag indicates that this field -specifies a sender. -The order of these fields in the -.i HdrInfo -table specifies -.i sendmail 's -preference -for which field to return error messages to. -.ip H_ERRORSTO -Addresses in this header should receive error messages. -.ip H_CTE -This header is a Content-Transfer-Encoding header. -.ip H_CTYPE -This header is a Content-Type header. -.ip H_STRIPVAL -Strip the value from the header (for Bcc:). -.nr ii 5n -.lp -Let's look at a sample -.i HdrInfo -specification: -.(b -.ta 4n +\w'"content-transfer-encoding", 'u -struct hdrinfo HdrInfo[] = -\&{ - /* originator fields, most to least significant */ - "resent-sender", H_FROM, - "resent-from", H_FROM, - "sender", H_FROM, - "from", H_FROM, - "full-name", H_ACHECK, - "errors-to", H_FROM\^|\^H_ERRORSTO, - /* destination fields */ - "to", H_RCPT, - "resent-to", H_RCPT, - "cc", H_RCPT, - "bcc", H_RCPT\^|\^H_STRIPVAL, - /* message identification and control */ - "message", H_EOH, - "text", H_EOH, - /* trace fields */ - "received", H_TRACE\^|\^H_FORCE, - /* miscellaneous fields */ - "content-transfer-encoding", H_CTE, - "content-type", H_CTYPE, - - NULL, 0, -}; -.)b -This structure indicates that the -.q To: , -.q Resent-To: , -and -.q Cc: -fields -all specify recipient addresses. -Any -.q Full-Name: -field will be deleted unless the required mailer flag -(indicated in the configuration file) -is specified. -The -.q Message: -and -.q Text: -fields will terminate the header; -these are used by random dissenters around the network world. -The -.q Received: -field will always be added, -and can be used to trace messages. -.pp -There are a number of important points here. -First, -header fields are not added automatically just because they are in the -.i HdrInfo -structure; -they must be specified in the configuration file -in order to be added to the message. -Any header fields mentioned in the configuration file but not -mentioned in the -.i HdrInfo -structure have default processing performed; -that is, -they are added unless they were in the message already. -Second, -the -.i HdrInfo -structure only specifies cliched processing; -certain headers are processed specially by ad hoc code -regardless of the status specified in -.i HdrInfo . -For example, -the -.q Sender: -and -.q From: -fields are always scanned on ARPANET mail -to determine the sender\**; -.(f -\**Actually, this is no longer true in SMTP; -this information is contained in the envelope. -The older ARPANET protocols did not completely distinguish -envelope from header. -.)f -this is used to perform the -.q "return to sender" -function. -The -.q "From:" -and -.q "Full-Name:" -fields are used to determine the full name of the sender -if possible; -this is stored in the macro -.b $x -and used in a number of ways. -.sh 3 "Restricting Use of Email" -.pp -If it is necessary to restrict mail through a relay, -the -.i checkcompat -routine can be modified. -This routine is called for every recipient address. -It returns an exit status -indicating the status of the message. -The status -.sm EX_OK -accepts the address, -.sm EX_TEMPFAIL -queues the message for a later try, -and other values -(commonly -.sm EX_UNAVAILABLE ) -reject the message. -It is up to -.i checkcompat -to print an error message -(using -.i usrerr ) -if the message is rejected. -For example, -.i checkcompat -could read: -.(b -.re -.sz -1 -.ta 4n +4n +4n +4n +4n +4n +4n -int -checkcompat(to, e) - register ADDRESS *to; - register ENVELOPE *e; -\&{ - register STAB *s; - - s = stab("private", ST_MAILER, ST_FIND); - if (s != NULL && e\->e_from.q_mailer != LocalMailer && - to->q_mailer == s->s_mailer) - { - usrerr("No private net mail allowed through this machine"); - return (EX_UNAVAILABLE); - } - if (MsgSize > 50000 && bitnset(M_LOCALMAILER, to\->q_mailer)) - { - usrerr("Message too large for non-local delivery"); - e\->e_flags |= EF_NORETURN; - return (EX_UNAVAILABLE); - } - return (EX_OK); -} -.sz -.)b -This would reject messages greater than 50000 bytes -unless they were local. -The -.i EF_NORETURN -flag can be set in -.i e\(->e_flags -to suppress the return of the actual body -of the message in the error return. -The actual use of this routine is highly dependent on the -implementation, -and use should be limited. -.sh 3 "New Database Map Classes" -.pp -New key maps can be added by creating a class initialization function -and a lookup function. -These are then added to the routine -.i setupmaps. -.pp -The initialization function is called as -.(b -\fIxxx\fP_map_init(MAP *map, char *args) -.)b -The -.i map -is an internal data structure. -The -.i args -is a pointer to the portion of the configuration file line -following the map class name; -flags and filenames can be extracted from this line. -The initialization function must return -.sm TRUE -if it successfully opened the map, -.sm FALSE -otherwise. -.pp -The lookup function is called as -.(b -\fIxxx\fP_map_lookup(MAP *map, char buf[], char **av, int *statp) -.)b -The -.i map -defines the map internally. -The -.i buf -has the input key. -This may be (and often is) used destructively. -The -.i av -is a list of arguments passed in from the rewrite line. -The lookup function should return a pointer to the new value. -If the map lookup fails, -.i *statp -should be set to an exit status code; -in particular, it should be set to -.sm EX_TEMPFAIL -if recovery is to be attempted by the higher level code. -.sh 3 "Queueing Function" -.pp -The routine -.i shouldqueue -is called to decide if a message should be queued -or processed immediately. -Typically this compares the message priority to the current load average. -The default definition is: -.(b -bool -shouldqueue(pri, ctime) - long pri; - time_t ctime; -{ - if (CurrentLA < QueueLA) - return (FALSE); - return (pri > (QueueFactor / (CurrentLA \- QueueLA + 1))); -} -.)b -If the current load average -(global variable -.i CurrentLA , -which is set before this function is called) -is less than the low threshold load average -(option -.b x , -variable -.i QueueLA ), -.i shouldqueue -returns -.sm FALSE -immediately -(that is, it should -.i not -queue). -If the current load average exceeds the high threshold load average -(option -.b X , -variable -.i RefuseLA ), -.i shouldqueue -returns -.sm TRUE -immediately. -Otherwise, it computes the function based on the message priority, -the queue factor -(option -.b q , -global variable -.i QueueFactor ), -and the current and threshold load averages. -.pp -An implementation wishing to take the actual age of the message into account -can also use the -.i ctime -parameter, -which is the time that the message was first submitted to -.i sendmail . -Note that the -.i pri -parameter is already weighted -by the number of times the message has been tried -(although this tends to lower the priority of the message with time); -the expectation is that the -.i ctime -would be used as an -.q "escape clause" -to ensure that messages are eventually processed. -.sh 3 "Refusing Incoming SMTP Connections" -.pp -The function -.i refuseconnections -returns -.sm TRUE -if incoming SMTP connections should be refused. -The current implementation is based exclusively on the current load average -and the refuse load average option -(option -.b X , -global variable -.i RefuseLA ): -.(b -bool -refuseconnections() -{ - return (CurrentLA >= RefuseLA); -} -.)b -A more clever implementation -could look at more system resources. -.sh 3 "Load Average Computation" -.pp -The routine -.i getla -returns the current load average (as a rounded integer). -The distribution includes several possible implementations. -If you are porting to a new environment -you may need to add some new tweaks.\** -.(f -\**If you do, please send updates to -sendmail@Sendmail.ORG. -.)f -.sh 2 "Configuration in src/daemon.c" -.pp -The file -.i src/daemon.c -contains a number of routines that are dependent -on the local networking environment. -The version supplied assumes you have BSD style sockets. -.pp -In previous releases, -we recommended that you modify the routine -.i maphostname -if you wanted to generalize -.b $[ -\&...\& -.b $] -lookups. -We now recommend that you create a new keyed map instead. -.sh 1 "ACKNOWLEDGEMENTS" -.pp -I've worked on -.i sendmail -for many years, -and many employers have been remarkably patient -about letting me work on a large project -that was not part of my official job. -This includes time on the INGRES Project at -the University of California at Berkeley, -at Britton Lee, -and again on the Mammoth and Titan Projects at Berkeley. -.pp -Much of the second wave of improvements -resulting in version 8.1 -should be credited to Bryan Costales of the -International Computer Science Institute. -As he passed me drafts of his book on -.i sendmail -I was inspired to start working on things again. -Bryan was also available to bounce ideas off of. -.pp -Gregory Neil Shapiro -of Worchester Polytechnic Institute -has become instrumental in all phases of -.i sendmail -support and development, -and was largely responsible for getting versions 8.8 and 8.9 -out the door. -.pp -Many, many people contributed chunks of code and ideas to -.i sendmail . -It has proven to be a group network effort. -Version 8 in particular was a group project. -The following people made notable contributions: -.(l -John Beck, Hewlett-Packard & Sun Microsystems -Keith Bostic, CSRG, University of California, Berkeley -Andrew Cheng, Sun Microsystems -Michael J. Corrigan, University of California, San Diego -Bryan Costales, International Computer Science Institute & InfoBeat -Pa\*:r (Pell) Emanuelsson -Craig Everhart, Transarc Corporation -Per Hedeland, Ericsson -Tom Ivar Helbekkmo, Norwegian School of Economics -Kari Hurtta, Finnish Meteorological Institute -Allan E. Johannesen, WPI -Jonathan Kamens, OpenVision Technologies, Inc. -Takahiro Kanbe, Fuji Xerox Information Systems Co., Ltd. -Brian Kantor, University of California, San Diego -John Kennedy, Cal State University, Chico -Murray S. Kucherawy, HookUp Communication Corp. -Bruce Lilly, Sony U.S. -Karl London -Motonori Nakamura, Ritsumeikan University & Kyoto University -John Gardiner Myers, Carnegie Mellon University -Neil Rickert, Northern Illinois University -Gregory Neil Shapiro, WPI -Eric Schnoebelen, Convex Computer Corp. -Eric Wassenaar, National Institute for Nuclear and High Energy Physics, Amsterdam -Randall Winchester, University of Maryland -Christophe Wolfhugel, Pasteur Institute & Herve Schauer Consultants (Paris) -.)l -I apologize for anyone I have omitted, misspelled, misattributed, or -otherwise missed. -At this point, I suspect that at least a hundred people -have contributed code, -and many more have contributed ideas, comments, and encouragement. -I've tried to list them in the RELEASE_NOTES in the distribution directory. -I appreciate their contribution as well. -.pp -Special thanks are reserved for Michael Corrigan and Christophe Wolfhugel, -who besides being wonderful guinea pigs and contributors -have also consented to be added to the ``sendmail@Sendmail.ORG'' list -and, by answering the bulk of the questions sent to that list, -have freed me up to do other work. -.++ A -.+c "COMMAND LINE FLAGS" -.ba 0 -.nr ii 1i -.pp -Arguments must be presented with flags before addresses. -The flags are: -.ip \-b\fIx\fP -Set operation mode to -.i x . -Operation modes are: -.(b -.ta 4n -m Deliver mail (default) -s Speak SMTP on input side -a\(dg ``Arpanet'' mode (get envelope sender information from header) -d Run as a daemon in background -D Run as a daemon in foreground -t Run in test mode -v Just verify addresses, don't collect or deliver -i Initialize the alias database -p Print the mail queue -.)b -.(f -\(dgDeprecated. -.)f -.ip \-B\fItype\fP -Indicate body type. -.ip \-C\fIfile\fP -Use a different configuration file. -.i Sendmail -runs as the invoking user (rather than root) -when this flag is specified. -.ip \-d\fIlevel\fP -Set debugging level. -.ip "\-f\ \fIaddr\fP" -The sender's machine address is -.i addr . -.ip \-F\ \fIname\fP -Sets the full name of this user to -.i name . -.ip "\-h\ \fIcnt\fP" -Sets the -.q "hop count" -to -.i cnt . -This represents the number of times this message has been processed -by -.i sendmail -(to the extent that it is supported by the underlying networks). -.i Cnt -is incremented during processing, -and if it reaches -MAXHOP -(currently 30) -.i sendmail -throws away the message with an error. -.ip \-n -Don't do aliasing or forwarding. -.ip "\-N \fInotifications\fP" -Tag all addresses being sent as wanting the indicated -.i notifications , -which consists of the word -.q NEVER -or a comma-separated list of -.q SUCCESS , -.q FAILURE , -and -.q DELAY -for successful delivery, -failure, -and a message that is stuck in a queue somewhere. -The default is -.q FAILURE,DELAY . -.ip "\-r\ \fIaddr\fP" -An obsolete form of -.b \-f . -.ip \-o\fIx\|value\fP -Set option -.i x -to the specified -.i value . -These options are described in Section 5.6. -.ip \-O\fIoption\fP\fB=\fP\fIvalue\fP -Set -.i option -to the specified -.i value -(for long form option names). -These options are described in Section 5.6. -.ip \-M\fIx\|value -Set macro -.i x -to the specified -.i value . -.ip \-p\fIprotocol\fP -Set the sending protocol. -Programs are encouraged to set this. -The protocol field can be in the form -.i protocol \c -.b : \c -.i host -to set both the sending protocol and sending host. -For example, -.q \-pUUCP:uunet -sets the sending protocol to UUCP -and the sending host to uunet. -(Some existing programs use \-oM to set the r and s macros; -this is equivalent to using \-p.) -.ip \-q\fItime\fP -Try to process the queued up mail. -If the time is given, -a -.i sendmail -will run through the queue at the specified interval -to deliver queued mail; -otherwise, it only runs once. -.ip \-q\fIXstring\fP -Run the queue once, -limiting the jobs to those matching -.i Xstring . -The key letter -.i X -can be -.b I -to limit based on queue identifier, -.b R -to limit based on recipient, -or -.b S -to limit based on sender. -A particular queued job is accepted if one of the corresponding addresses -contains the indicated -.i string . -Multiple -.i \-q\fIX\fP -flags are permitted, -with items with the same key letter -.q or'ed -together, and items with different key letters -.q and'ed -together. -.ip "\-R ret" -What information you want returned if the message bounces; -.i ret -can be -.q HDRS -for headers only or -.q FULL -for headers plus body. -This is a request only; -the other end is not required to honor the parameter. -.ip \-t -Read the header for -.q To: , -.q Cc: , -and -.q Bcc: -lines, and send to everyone listed in those lists. -The -.q Bcc: -line will be deleted before sending. -Any addresses in the argument vector will be deleted -from the send list. -.ip "\-U" -Indicate that this is an initial User Agent submission. -In future releases, sendmail may complain about syntactically invalid messages -rather than fixing them when this flag is not set. -.ip "\-V envid" -The indicated -.i envid -is passed with the envelope of the message -and returned if the message bounces. -.ip "\-X \fIlogfile\fP" -Log all traffic in and out of -.i sendmail -in the indicated -.i logfile -for debugging mailer problems. -This produces a lot of data very quickly and should be used sparingly. -.pp -There are a number of options that may be specified as -primitive flags. -These are the e, i, m, and v options. -Also, -the f option -may be specified as the -.b \-s -flag. -.+c "QUEUE FILE FORMATS" -.pp -This appendix describes the format of the queue files. -These files live in the directory defined by the -.b Q -option in the -.i sendmail.cf -file, usually -.i /var/spool/mqueue -or -.i /usr/spool/mqueue . -.pp -All queue files have the name -\fIx\fP\|\fBf\fP\fIAAA99999\fP -where -.i AAA99999 -is the -.i id -for this message -and the -.i x -is a type. -The first letter of the id encodes the hour of the day -that the message was received by the system -(with A being the hour between midnight and 1:00AM). -All files with the same id collectively define one message. -.pp -The types are: -.nr ii 0.5i -.ip d -The data file. -The message body (excluding the header) is kept in this file. -.ip q -The queue control file. -This file contains the information necessary to process the job. -.ip t -A temporary file. -These are an image of the -.b qf -file when it is being rebuilt. -It should be renamed to a -.b qf -file very quickly. -.ip x -A transcript file, -existing during the life of a session -showing everything that happens -during that session. -.pp -The -.b qf -file is structured as a series of lines -each beginning with a code letter. -The lines are as follows: -.ip V -The version number of the queue file format, -used to allow new -.i sendmail -binaries to read queue files created by older versions. -Defaults to version zero. -Must be the first line of the file if present. -.ip H -A header definition. -There may be any number of these lines. -The order is important: -they represent the order in the final message. -These use the same syntax -as header definitions in the configuration file. -.ip C -The controlling address. -The syntax is -.q localuser:aliasname . -Recipient addresses following this line -will be flagged so that deliveries will be run as the -.i localuser -(a user name from the /etc/passwd file); -.i aliasname -is the name of the alias that expanded to this address -(used for printing messages). -.ip Q -The ``original recipient'', -specified by the ORCPT= field in an ESMTP transaction. -Used exclusively for Delivery Status Notifications. -It applies only to the immediately following `R' line. -.ip R -A recipient address. -This will normally be completely aliased, -but is actually realiased when the job is processed. -There will be one line -for each recipient. -Version 1 qf files -also include a leading colon-terminated list of flags, -which can be -`S' to return a message on successful final delivery, -`F' to return a message on failure, -`D' to return a message if the message is delayed, -`B' to indicate that the body should be returned, -`N' to suppress returning the body, -and -`P' to declare this as a ``primary'' (command line or SMTP-session) address. -.ip S -The sender address. -There may only be one of these lines. -.ip T -The job creation time. -This is used to compute when to time out the job. -.ip P -The current message priority. -This is used to order the queue. -Higher numbers mean lower priorities. -The priority changes -as the message sits in the queue. -The initial priority depends on the message class -and the size of the message. -.ip M -A message. -This line is printed by the -.i mailq -command, -and is generally used to store status information. -It can contain any text. -.ip F -Flag bits, represented as one letter per flag. -Defined flag bits are -.b r -indicating that this is a response message -and -.b w -indicating that a warning message has been sent -announcing that the mail has been delayed. -.ip N -The total number of delivery attempts. -.ip K -The time (as seconds since January 1, 1970) -of the last delivery attempt. -.ip I -The i-number of the data file; -this can be used to recover your mail queue -after a disastrous disk crash. -.ip $ -A macro definition. -The values of certain macros -(as of this writing, only -.b $r -and -.b $s ) -are passed through to the queue run phase. -.ip B -The body type. -The remainder of the line is a text string defining the body type. -If this field is missing, -the body type is assumed to be -.q "undefined" -and no special processing is attempted. -Legal values are -.q 7BIT -and -.q 8BITMIME . -.ip O -The original MTS value (from the ESMTP transaction). -For Deliver Status Notifications only. -.ip Z -The original envelope id (from the ESMTP transaction). -For Deliver Status Notifications only. -.pp -As an example, -the following is a queue file sent to -.q eric@mammoth.Berkeley.EDU -and -.q bostic@okeeffe.CS.Berkeley.EDU \**: -.(f -\**This example is contrived and probably inaccurate for your environment. -Glance over it to get an idea; -nothing can replace looking at what your own system generates. -.)f -.(b -P835771 -T404261372 -Seric -Ceric:sendmail@vangogh.CS.Berkeley.EDU -Reric@mammoth.Berkeley.EDU -Rbostic@okeeffe.CS.Berkeley.EDU -H?P?Return-path: <owner-sendmail@vangogh.CS.Berkeley.EDU> -HReceived: by vangogh.CS.Berkeley.EDU (5.108/2.7) id AAA06703; - Fri, 17 Jul 1992 00:28:55 -0700 -HReceived: from mail.CS.Berkeley.EDU by vangogh.CS.Berkeley.EDU (5.108/2.7) - id AAA06698; Fri, 17 Jul 1992 00:28:54 -0700 -HReceived: from [128.32.31.21] by mail.CS.Berkeley.EDU (5.96/2.5) - id AA22777; Fri, 17 Jul 1992 03:29:14 -0400 -HReceived: by foo.bar.baz.de (5.57/Ultrix3.0-C) - id AA22757; Fri, 17 Jul 1992 09:31:25 GMT -H?F?From: eric@foo.bar.baz.de (Eric Allman) -H?x?Full-name: Eric Allman -HMessage-id: <9207170931.AA22757@foo.bar.baz.de> -HTo: sendmail@vangogh.CS.Berkeley.EDU -HSubject: this is an example message -.)b -This shows -the person who sent the message, -the submission time -(in seconds since January 1, 1970), -the message priority, -the message class, -the recipients, -and the headers for the message. -.+c "SUMMARY OF SUPPORT FILES" -.pp -This is a summary of the support files -that -.i sendmail -creates or generates. -Many of these can be changed by editing the sendmail.cf file; -check there to find the actual pathnames. -.nr ii 1i -.ip "/usr/\*(SD/sendmail" -The binary of -.i sendmail . -.ip /usr/\*(SB/newaliases -A link to /usr/\*(SD/sendmail; -causes the alias database to be rebuilt. -Running this program is completely equivalent to giving -.i sendmail -the -.b \-bi -flag. -.ip /usr/\*(SB/mailq -Prints a listing of the mail queue. -This program is equivalent to using the -.b \-bp -flag to -.i sendmail . -.ip /etc/sendmail.cf -The configuration file, -in textual form. -.ip /usr/lib/sendmail.hf -The SMTP help file. -.ip /etc/sendmail.st -A statistics file; need not be present. -.ip /etc/sendmail.pid -Created in daemon mode; -it contains the process id of the current SMTP daemon. -If you use this in scripts; -use ``head \-1'' to get just the first line; -the second line contains the command line used to invoke the daemon, -and later versions of -.i sendmail -may add more information to subsequent lines. -.ip /etc/aliases -The textual version of the alias file. -.ip /etc/aliases.db -The alias file in -.i hash \|(3) -format. -.ip /etc/aliases.{pag,dir} -The alias file in -.i ndbm \|(3) -format. -.ip /var/spool/mqueue -The directory in which the mail queue -and temporary files reside. -.ip /var/spool/mqueue/qf* -Control (queue) files for messages. -.ip /var/spool/mqueue/df* -Data files. -.ip /var/spool/mqueue/tf* -Temporary versions of the qf files, -used during queue file rebuild. -.ip /var/spool/mqueue/xf* -A transcript of the current session. -.if o \ -\{\ -. bp -. rs -. sp |4i -. ce 2 -This page intentionally left blank; -replace it with a blank sheet for double-sided output. -.\} -.\".ro -.\".ls 1 -.\".tp -.\".sp 2i -.\".in 0 -.\".ce 100 -.\".sz 24 -.\".b SENDMAIL -.\".sz 14 -.\".sp -.\"INSTALLATION AND OPERATION GUIDE -.\".sp -.\".sz 10 -.\"Eric Allman -.\".sp -.\"Version 8.135 -.\".ce 0 -.bp 3 -.ce -.sz 12 -TABLE OF CONTENTS -.sz 10 -.sp -.\" remove some things to avoid "out of temp file space" problem -.rm sh -.rm (x -.rm )x -.rm ip -.rm pp -.rm lp -.rm he -.rm fo -.rm eh -.rm oh -.rm ef -.rm of -.xp -.if o \ -\{\ -. bp -. rs -. sp |4i -. ce 2 -This page intentionally left blank; -replace it with a blank sheet for double-sided output. -.\} diff --git a/doc/op/op.ps b/doc/op/op.ps deleted file mode 100644 index 2632525..0000000 --- a/doc/op/op.ps +++ /dev/null @@ -1,6588 +0,0 @@ -%!PS-Adobe-3.0 -%%Creator: groff version 1.11 -%%CreationDate: Fri Jan 22 21:52:41 1999 -%%DocumentNeededResources: font Times-Bold -%%+ font Times-Roman -%%+ font Times-Italic -%%+ font Symbol -%%DocumentSuppliedResources: procset grops 1.11 0 -%%Pages: 76 -%%PageOrder: Ascend -%%Orientation: Portrait -%%EndComments -%%BeginProlog -%%BeginResource: procset grops 1.11 0 -/setpacking where{ -pop -currentpacking -true setpacking -}if -/grops 120 dict dup begin -/SC 32 def -/A/show load def -/B{0 SC 3 -1 roll widthshow}bind def -/C{0 exch ashow}bind def -/D{0 exch 0 SC 5 2 roll awidthshow}bind def -/E{0 rmoveto show}bind def -/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def -/G{0 rmoveto 0 exch ashow}bind def -/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/I{0 exch rmoveto show}bind def -/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def -/K{0 exch rmoveto 0 exch ashow}bind def -/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/M{rmoveto show}bind def -/N{rmoveto 0 SC 3 -1 roll widthshow}bind def -/O{rmoveto 0 exch ashow}bind def -/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/Q{moveto show}bind def -/R{moveto 0 SC 3 -1 roll widthshow}bind def -/S{moveto 0 exch ashow}bind def -/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/SF{ -findfont exch -[exch dup 0 exch 0 exch neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/MF{ -findfont -[5 2 roll -0 3 1 roll -neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/level0 0 def -/RES 0 def -/PL 0 def -/LS 0 def -/MANUAL{ -statusdict begin/manualfeed true store end -}bind def -/PLG{ -gsave newpath clippath pathbbox grestore -exch pop add exch pop -}bind def -/BP{ -/level0 save def -1 setlinecap -1 setlinejoin -72 RES div dup scale -LS{ -90 rotate -}{ -0 PL translate -}ifelse -1 -1 scale -}bind def -/EP{ -level0 restore -showpage -}bind def -/DA{ -newpath arcn stroke -}bind def -/SN{ -transform -.25 sub exch .25 sub exch -round .25 add exch round .25 add exch -itransform -}bind def -/DL{ -SN -moveto -SN -lineto stroke -}bind def -/DC{ -newpath 0 360 arc closepath -}bind def -/TM matrix def -/DE{ -TM currentmatrix pop -translate scale newpath 0 0 .5 0 360 arc closepath -TM setmatrix -}bind def -/RC/rcurveto load def -/RL/rlineto load def -/ST/stroke load def -/MT/moveto load def -/CL/closepath load def -/FL{ -currentgray exch setgray fill setgray -}bind def -/BL/fill load def -/LW/setlinewidth load def -/RE{ -findfont -dup maxlength 1 index/FontName known not{1 add}if dict begin -{ -1 index/FID ne{def}{pop pop}ifelse -}forall -/Encoding exch def -dup/FontName exch def -currentdict end definefont pop -}bind def -/DEFS 0 def -/EBEGIN{ -moveto -DEFS begin -}bind def -/EEND/end load def -/CNT 0 def -/level1 0 def -/PBEGIN{ -/level1 save def -translate -div 3 1 roll div exch scale -neg exch neg exch translate -0 setgray -0 setlinecap -1 setlinewidth -0 setlinejoin -10 setmiterlimit -[]0 setdash -/setstrokeadjust where{ -pop -false setstrokeadjust -}if -/setoverprint where{ -pop -false setoverprint -}if -newpath -/CNT countdictstack def -userdict begin -/showpage{}def -}bind def -/PEND{ -clear -countdictstack CNT sub{end}repeat -level1 restore -}bind def -end def -/setpacking where{ -pop -setpacking -}if -%%EndResource -%%IncludeResource: font Times-Bold -%%IncludeResource: font Times-Roman -%%IncludeResource: font Times-Italic -%%IncludeResource: font Symbol -grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 -def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron -/scaron/zcaron/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent -/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen -/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon -/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O -/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex -/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y -/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft -/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl -/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut -/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash -/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen -/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft -/logicalnot/minus/registered/macron/degree/plusminus/twosuperior -/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior -/ordmasculine/guilsinglright/onequarter/onehalf/threequarters -/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE -/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex -/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis -/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn -/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla -/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis -/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash -/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def -/Times-Italic@0 ENC0/Times-Italic RE/Times-Roman@0 ENC0/Times-Roman RE -/Times-Bold@0 ENC0/Times-Bold RE -%%EndProlog -%%Page: 1 1 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 16/Times-Bold@0 SF(SENDMAIL)236.833 143.4 Q/F1 10/Times-Bold@0 SF -(TM)-8 I/F2 12/Times-Bold@0 SF(INST)170.172 172.2 Q(ALLA)-1.08 E -(TION AND OPERA)-1.14 E(TION GUIDE)-1.14 E/F3 10/Times-Roman@0 SF -(Eric Allman)263.42 196.2 Q(Sendmail, Inc.)258.975 208.2 Q -(eric@Sendmail.COM)244.37 220.2 Q -1.11(Ve)260.225 244.2 S(rsion 8.135) -1.11 E -.15(Fo)236.965 268.2 S 2.5(rS).15 G(endmail V)-2.5 E(ersion 8.9) --1.11 E/F4 10/Times-Italic@0 SF(Sendmail)97 312.6 Q/F5 8/Times-Roman@0 -SF(TM)-5 I F3 .1(implements a general purpose internetw)2.6 5 N .1 -(ork mail routing f)-.1 F .1(acility under the UNIX\256 oper)-.1 F(-)-.2 -E .017(ating system.)72 324.6 R .017(It is not tied to an)5.017 F 2.517 -(yo)-.15 G .017(ne transport protocol \212 its function may be lik) --2.517 F .017(ened to a crossbar switch,)-.1 F 1.036 -(relaying messages from one domain into another)72 336.6 R 6.036(.I)-.55 -G 3.536(nt)-6.036 G 1.036 -(he process, it can do a limited amount of message)-3.536 F .604(header editing to put the message into a format that is appropriate for the recei) -72 348.6 R .604(ving domain.)-.25 F .604(All of this is)5.604 F -(done under the control of a con\214guration \214le.)72 360.6 Q .711 -(Due to the requirements of \215e)97 376.8 R .711(xibility for)-.15 F F4 -(sendmail)3.211 E F3 3.211(,t)C .71 -(he con\214guration \214le can seem some)-3.211 F .71(what unap-)-.25 F -2.893(proachable. Ho)72 388.8 R(we)-.25 E -.15(ve)-.25 G 1.193 -.4(r, t) -.15 H .393(here are only a fe).4 F 2.893(wb)-.25 G .394 -(asic con\214gurations for most sites, for which standard con\214gu-) --2.893 F .646(ration \214les ha)72 400.8 R .946 -.15(ve b)-.2 H .646 -(een supplied.).15 F .645(Most other con\214gurations can be b)5.646 F -.645(uilt by adjusting an e)-.2 F .645(xisting con\214gura-)-.15 F -(tion \214le incrementally)72 412.8 Q(.)-.65 E F4(Sendmail)97 429 Q F3 -1.471(is based on RFC821 \(Simple Mail T)3.97 F 1.471 -(ransport Protocol\), RFC822 \(Internet Mail Headers)-.35 F -.15(Fo)72 -441 S 1.855(rmat\), RFC1123 \(Internet Host Requirements\), RFC2045 \(MIME\), RFC1869 \(SMTP Service Exten-) -.15 F 1.446(sions\), RFC1652 \(SMTP 8BITMIME Extension\), RFC1870 \(SMTP SIZE Extension\), RFC1891 \(SMTP) -72 453 R(Deli)72 465 Q -.15(ve)-.25 G 3.474(ry Status Noti\214cations\), RFC1892 \(Multipart/Report\), RFC1893 \(Mail System Status Codes\),) -.15 F .32(RFC1894 \(Deli)72 477 R -.15(ve)-.25 G .321(ry Status Noti\214cations\), RFC1985 \(SMTP Service Extension for Remote Message Queue) -.15 F .796(Starting\), and RFC2033 \(Local Message T)72 489 R .796 -(ransmission Protocol\).)-.35 F(Ho)5.796 E(we)-.25 E -.15(ve)-.25 G -1.596 -.4(r, s).15 H(ince).4 E F4(sendmail)3.296 E F3 .795 -(is designed to)3.296 F -.1(wo)72 501 S 1.548(rk in a wider w).1 F 1.549 -(orld, in man)-.1 F 4.049(yc)-.15 G 1.549 -(ases it can be con\214gured to e)-4.049 F 1.549(xceed these protocols.) --.15 F 1.549(These cases are)6.549 F(described herein.)72 513 Q -(Although)97 529.2 Q F4(sendmail)3.548 E F3 1.047(is intended to run without the need for monitoring, it has a number of features) -3.548 F 1.972(that may be used to monitor or adjust the operation under unusual circumstances.) -72 541.2 R 1.972(These features are)6.972 F(described.)72 553.2 Q .817 -(Section one describes ho)97 569.4 R 3.317(wt)-.25 G 3.317(od)-3.317 G -3.317(oa)-3.317 G(basic)-.001 E F4(sendmail)3.316 E F3 3.316 -(installation. Section)3.316 F(tw)3.316 E 3.316(oe)-.1 G .816 -(xplains the day-to-day)-3.466 F .282(information you should kno)72 -581.4 R 2.782(wt)-.25 G 2.782(om)-2.782 G .282 -(aintain your mail system.)-2.782 F .282(If you ha)5.282 F .583 -.15 -(ve a r)-.2 H(elati).15 E -.15(ve)-.25 G .283(ly normal site, these tw) -.15 F(o)-.1 E .635(sections should contain suf)72 593.4 R .635 -(\214cient information for you to install)-.25 F F4(sendmail)3.135 E F3 -.634(and k)3.135 F .634(eep it happ)-.1 F 4.434 -.65(y. S)-.1 H .634 -(ection three).65 F .925 -(describes some parameters that may be safely tweak)72 605.4 R 3.425 -(ed. Section)-.1 F .925(four has information re)3.425 F -.05(ga)-.15 G -.925(rding the com-).05 F .886(mand line ar)72 617.4 R 3.386 -(guments. Section)-.18 F<8c76>3.386 E 3.386(ec)-.15 G .885 -(ontains the nitty-gritty information about the con\214guration \214le.) --3.386 F(This)5.885 E .004 -(section is for masochists and people who must write their o)72 629.4 R -.005(wn con\214guration \214le.)-.25 F .005(Section six describes con-) -5.005 F .165(\214guration that can be done at compile time.)72 641.4 R -.165(The appendix)5.165 F .165(es gi)-.15 F .465 -.15(ve a b)-.25 H .165 -(rief b).15 F .165(ut detailed e)-.2 F .165(xplanation of a num-)-.15 F -(ber of features not described in the rest of the paper)72 653.4 Q(.) --.55 E F1(DISCLAIMER:)97 669.6 Q F3 -(This documentation is under modi\214cation.)2.5 E .32 LW 76 680.4 72 -680.4 DL 80 680.4 76 680.4 DL 84 680.4 80 680.4 DL 88 680.4 84 680.4 DL -92 680.4 88 680.4 DL 96 680.4 92 680.4 DL 100 680.4 96 680.4 DL 104 -680.4 100 680.4 DL 108 680.4 104 680.4 DL 112 680.4 108 680.4 DL 116 -680.4 112 680.4 DL 120 680.4 116 680.4 DL 124 680.4 120 680.4 DL 128 -680.4 124 680.4 DL 132 680.4 128 680.4 DL 136 680.4 132 680.4 DL 140 -680.4 136 680.4 DL 144 680.4 140 680.4 DL 148 680.4 144 680.4 DL 152 -680.4 148 680.4 DL 156 680.4 152 680.4 DL 160 680.4 156 680.4 DL 164 -680.4 160 680.4 DL 168 680.4 164 680.4 DL 172 680.4 168 680.4 DL 176 -680.4 172 680.4 DL 180 680.4 176 680.4 DL 184 680.4 180 680.4 DL 188 -680.4 184 680.4 DL 192 680.4 188 680.4 DL 196 680.4 192 680.4 DL 200 -680.4 196 680.4 DL 204 680.4 200 680.4 DL 208 680.4 204 680.4 DL 212 -680.4 208 680.4 DL 216 680.4 212 680.4 DL F5 -(Sendmail is a trademark of Sendmail, Inc.)93.6 692.4 Q F1 -(Sendmail Installation and Operation Guide)72 756 Q(SMM:08-1)200.86 E EP -%%Page: 2 2 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 198.36(SMM:08-2 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF -(This page intentionally left blank;)220.225 300 Q -(replace it with a blank sheet for double-sided output.)182.6 312 Q EP -%%Page: 7 3 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-7)200.86 E 2.5(1. B)72 96 R(ASIC INST)-.3 E(ALLA)-.9 E(TION)-.95 -E/F1 10/Times-Roman@0 SF .126(There are tw)112 112.2 R 2.626(ob)-.1 G -.126(asic steps to installing)-2.626 F/F2 10/Times-Italic@0 SF(sendmail) -2.626 E F1 5.126(.F)C .126(irst, you ha)-5.126 F .426 -.15(ve t)-.2 H -2.626(oc).15 G .127(ompile and install the binary)-2.626 F(.)-.65 E(If) -87 124.2 Q F2(sendmail)2.889 E F1 .388(has already been ported to your operating system that should be simple.) -2.889 F .388(Second, you must)5.388 F -.2(bu)87 136.2 S .278 -(ild a run-time con\214guration \214le.).2 F .278(This is a \214le that) -5.278 F F2(sendmail)2.778 E F1 .279 -(reads when it starts up that describes the)2.778 F .532(mailers it kno) -87 148.2 R .532(ws about, ho)-.25 F 3.031(wt)-.25 G 3.031(op)-3.031 G -.531(arse addresses, ho)-3.031 F 3.031(wt)-.25 G 3.031(or)-3.031 G -.25 -(ew)-3.031 G .531(rite the message header).25 F 3.031(,a)-.4 G .531 -(nd the settings of)-3.031 F -.25(va)87 160.2 S .868(rious options.).25 -F .868(Although the con\214guration \214le can be quite comple)5.868 F -.869(x, a con\214guration can usually be)-.15 F -.2(bu)87 172.2 S -(ilt using an M4-based con\214guration language.).2 E .192 -(The remainder of this section will describe the installation of)112 -188.4 R F2(sendmail)2.692 E F1 .192(assuming you can use one)2.692 F -1.431(of the e)87 200.4 R 1.432(xisting con\214gurations and that the standard installation parameters are acceptable.) --.15 F 1.432(All path-)6.432 F .977(names and e)87 212.4 R .976 -(xamples are gi)-.15 F -.15(ve)-.25 G 3.476(nf).15 G .976 -(rom the root of the)-3.476 F F2(sendmail)3.476 E F1 .976 -(subtree, normally)3.476 F F2(/usr/sr)3.476 E(c/usr)-.37 E(.sbin/send-) --1.11 E(mail)87 224.4 Q F1(on 4.4BSD.)2.5 E .542 -(If you are loading this of)112 240.6 R 3.042(ft)-.25 G .542 -(he tape, continue with the ne)-3.042 F .542(xt section.)-.15 F .542 -(If you ha)5.542 F .843 -.15(ve a r)-.2 H .543(unning binary).15 F -(already on your system, you should probably skip to section 1.2.)87 -252.6 Q F0 2.5(1.1. Compiling)87 276.6 R(Sendmail)2.5 E F1(All)127 292.8 -Q F2(sendmail)3.116 E F1 .616(source is in the)3.116 F F2(sr)3.116 E(c) --.37 E F1(subdirectory)3.116 E 5.616(.T)-.65 G 3.116(oc)-6.416 G .616 -(ompile sendmail, \231cd\232 into the)-3.116 F F2(sr)3.116 E(c)-.37 E F1 -(direc-)3.116 E(tory and type)102 304.8 Q(./Build)142 321 Q 1.41 -(This will lea)102 337.2 R 1.711 -.15(ve t)-.2 H 1.411 -(he binary in an appropriately named subdirectory).15 F 3.911(,e)-.65 G -1.411(.g., obj.BSD-OS.2.1.i386.)-3.911 F(It)6.411 E -.1(wo)102 349.2 S -(rks for multiple object v).1 E -(ersions compiled out of the same directory)-.15 E(.)-.65 E F0 2.5 -(1.1.1. T)102 373.2 R(weaking the Build In)-.74 E -.1(vo)-.4 G(cation).1 -E F1 -1.1(Yo)142 389.4 S 2.905(uc)1.1 G .405(an gi)-2.905 F .705 -.15 -(ve p)-.25 H .405(arameters on the).15 F F2(Build)2.905 E F1 2.905 -(command. In)2.905 F .404(most cases these are only used when)2.905 F -(the)117 401.4 Q F2(obj.*)2.5 E F1(directory is \214rst created.)5 E -(These commands include:)5 E<ad4c>117 417.6 Q F2(libdir)2.5 E(s)-.1 E F1 -2.5(Al)153 429.6 S(ist of directories to search for libraries.)-2.5 E -<ad49>117 445.8 Q F2(incdir)2.5 E(s)-.1 E F1 2.5(Al)153 457.8 S -(ist of directories to search for include \214les.)-2.5 E<ad45>117 474 Q -F2(en)2.5 E(var)-.4 E F1(=)A F2(value)A F1 .789(Set an en)153 486 R .789 -(vironment v)-.4 F .789(ariable to an indicated)-.25 F F2(value)3.289 E -F1 .789(before compiling.)3.289 F .79(This is normally)5.789 F -(used to set an ABI on Irix.)153 498 Q 23.42(\255c Create)117 514.2 R -2.5(an)2.5 G -.25(ew)-2.5 G F2(obj.*)2.75 E F1(tree before running.)5 E -<ad66>117 530.4 Q F2(sitecon\214g)2.5 E F1 2.193 -(Read the indicated site con\214guration \214le.)153 542.4 R 2.192 -(If this parameter is not speci\214ed,)7.193 F F2(Build)4.692 E F1 -(includes)153 554.4 Q F2(all)11.511 E F1 9.011(of the \214les)11.511 F -F2($B)11.512 E(UILDT)-.1 E(OOLS/Site/site)-.18 E(.$oscf)-.15 E(.m4)-.15 -E F1(and)11.512 E F2($B)11.512 E(UILD-)-.1 E -.18(TO)153 566.4 S -(OLS/Site/site).18 E(.con\214g)-.15 E(.m4)-.15 E F1 2.965(,w)C .465 -(here $B)-2.965 F(UILDT)-.1 E .464(OOLS is normally)-.18 F F2(../BuildT) -2.964 E(ools)-.92 E F1 .464(and $oscf)2.964 F .099 -(is the same name as used on the)153 578.4 R F2(obj.*)2.599 E F1 -(directory)5.099 E 5.099(.S)-.65 G .099(ee belo)-5.099 F 2.599(wf)-.25 G -.099(or a description of the site)-2.599 F(con\214guration \214le.)153 -590.4 Q 22.3(\255S Skip)117 606.6 R(auto-con\214guration.)4.421 E F2 -(Build)6.921 E F1 1.921(will a)4.421 F -.2(vo)-.2 G 1.921 -(id auto-detecting libraries if this is set.).2 F(All)6.92 E(libraries and map de\214nitions must be speci\214ed in the site con\214guration \214le.) -153 618.6 Q(An)117 634.8 Q 2.5(yo)-.15 G -(ther parameters are passed to the)-2.5 E F2(mak)2.5 E(e)-.1 E F1 -(program.)2.5 E F0 2.5(1.1.2. Cr)102 658.8 R -(eating a Site Con\214guration File)-.18 E F1 .276 -(\(This section is not yet complete.)142 675 R -.15(Fo)5.276 G 2.776(rn) -.15 G -.25(ow)-2.776 G 2.776(,s)-.4 G .276(ee the \214le BuildT)-2.776 F -.277(ools/README for details.\))-.8 F EP -%%Page: 8 4 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 198.36(SMM:08-8 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E 2.5(1.1.3. T)102 96 R -(weaking the Mak)-.74 E(e\214le)-.1 E/F1 10/Times-Italic@0 SF(Sendmail) -142 112.2 Q/F2 10/Times-Roman@0 SF 2.181(supports tw)4.681 F 4.681(od) --.1 G(if)-4.681 E 2.181(ferent formats for the local \(on disk\) v)-.25 -F 2.18(ersion of databases,)-.15 F(notably the)117 124.2 Q F1(aliases) -2.5 E F2 2.5(database. At)2.5 F -(least one of these should be de\214ned if at all possible.)2.5 E 39.5 -(NDBM The)117 140.4 R -.74(``)3.166 G(ne).74 E 3.166(wD)-.25 G(BM') --3.166 E 3.166('f)-.74 G .666(ormat, a)-3.166 F -.25(va)-.2 G .666 -(ilable on nearly all systems around today).25 F 5.667(.T)-.65 G(his) --5.667 E -.1(wa)189 152.4 S 3.541(st).1 G 1.041 -(he preferred format prior to 4.4BSD.)-3.541 F 1.041(It allo)6.041 F -1.041(ws such comple)-.25 F 3.54(xt)-.15 G 1.04(hings as)-3.54 F -(multiple databases and closing a currently open database.)189 164.4 Q -32.84(NEWDB The)117 180.6 R(Berk)3.787 E(ele)-.1 E 3.787(yD)-.15 G 3.787 -(Bp)-3.787 G 3.787(ackage. If)-3.787 F 1.288(you ha)3.788 F 1.588 -.15 -(ve t)-.2 H 1.288(his, use it.).15 F 1.288(It allo)6.288 F 1.288 -(ws long records,)-.25 F 2.56 -(multiple open databases, real in-memory caching, and so forth.)189 -192.6 R -1.1(Yo)7.56 G 5.06(uc)1.1 G(an)-5.06 E .468 -(de\214ne this in conjunction with)189 204.6 R/F3 9/Times-Roman@0 SF -(NDBM)2.968 E F2 2.968(;i)C 2.968(fy)-2.968 G .469 -(ou do, old alias databases are read,)-2.968 F -.2(bu)189 216.6 S 3.108 -(tw).2 G .608(hen a ne)-3.108 F 3.108(wd)-.25 G .608 -(atabase is created it will be in NEWDB format.)-3.108 F .608 -(As a nasty)5.608 F 1.803(hack, if you ha)189 228.6 R 2.104 -.15(ve N) --.2 H 1.804(EWDB, NDBM, and NIS de\214ned, and if the alias \214le).15 F -.124(name includes the substring \231/yp/\232,)189 240.6 R F1(sendmail) -2.623 E F2 .123(will create both ne)2.623 F 2.623(wa)-.25 G .123 -(nd old v)-2.623 F(er)-.15 E(-)-.2 E 1.08 -(sions of the alias \214le during a)189 252.6 R F1(ne)3.58 E(walias)-.15 -E F2 3.58(command. This)3.58 F 1.08(is required because)3.58 F .845 -(the Sun NIS/YP system reads the DBM v)189 264.6 R .845 -(ersion of the alias \214le.)-.15 F(It')5.845 E 3.345(su)-.55 G .845 -(gly as)-3.345 F(sin, b)189 276.6 Q(ut it w)-.2 E(orks.)-.1 E 1.112 -(If neither of these are de\214ned,)117 292.8 R F1(sendmail)3.612 E F2 -1.112(reads the alias \214le into memory on e)3.612 F -.15(ve)-.25 G -1.112(ry in).15 F -.2(vo)-.4 G(cation.).2 E 1.043(This can be slo)117 -304.8 R 3.543(wa)-.25 G 1.043(nd should be a)-3.543 F -.2(vo)-.2 G 3.543 -(ided. There).2 F 1.043(are also se)3.543 F -.15(ve)-.25 G 1.042 -(ral methods for remote database).15 F(access:)117 316.8 Q 53.39 -(NIS Sun')117 333 R 2.5(sN)-.55 G(etw)-2.5 E -(ork Information Services \(formerly YP\).)-.1 E 28.94(NISPLUS Sun')117 -349.2 R 2.5(sN)-.55 G(IS+ services.)-2.5 E 26.73(NETINFO NeXT')117 365.4 -R 2.5(sN)-.55 G(etInfo service.)-2.5 E 32.84(HESIOD Hesiod)117 381.6 R -(service \(from Athena\).)2.5 E .042(Other compilation \215ags are set in conf.h and should be prede\214ned for you unless you are porting) -117 397.8 R(to a ne)117 409.8 Q 2.5(we)-.25 G -.4(nv)-2.5 G(ironment.).4 -E F0 2.5(1.1.4. Compilation)102 433.8 R(and installation)2.5 E F2 .309 -(After making the local system con\214guration described abo)142 450 R --.15(ve)-.15 G 2.808(,Y).15 G .308(ou should be able to com-)-3.908 F -(pile and install the system.)117 462 Q -(The script \231Build\232 is the best approach on most systems:)5 E -(./Build)157 478.2 Q(This will use)117 494.4 Q F1(uname)2.5 E F2 -(\(1\) to create a custom Mak)A(e\214le for your en)-.1 E(vironment.)-.4 -E(If you are installing in the standard places, you should be able to install using) -142 510.6 Q(./Build install)157 526.8 Q 3.346(This should install the binary in /usr/sbin and create links from /usr/bin/ne) -117 543 R -.1(wa)-.25 G 3.346(liases and).1 F 1.577 -(/usr/bin/mailq to /usr/sbin/sendmail.)117 555 R 1.577 -(On 4.4BSD systems it will also format and install man)6.577 F(pages.) -117 567 Q F0 2.5(1.2. Con\214guration)87 591 R(Files)2.5 E F1(Sendmail) -127 607.2 Q F2 2.079(cannot operate without a con\214guration \214le.) -4.579 F 2.079(The con\214guration de\214nes the mail)7.079 F(deli)102 -619.2 Q -.15(ve)-.25 G .889(ry mechanisms understood at this site, ho) -.15 F 3.389(wt)-.25 G 3.389(oa)-3.389 G .889(ccess them, ho)-3.389 F -3.388(wt)-.25 G 3.388(of)-3.388 G(orw)-3.388 E .888(ard email to remote) --.1 F .088(mail systems, and a number of tuning parameters.)102 631.2 R -.088(This con\214guration \214le is detailed in the later por)5.088 F(-) --.2 E(tion of this document.)102 643.2 Q(The)127 659.4 Q F1(sendmail) -2.764 E F2 .264(con\214guration can be daunting at \214rst.)2.764 F .264 -(The w)5.264 F .264(orld is comple)-.1 F .264(x, and the mail con-)-.15 -F .108(\214guration re\215ects that.)102 671.4 R .108(The distrib)5.108 -F .109 -(ution includes an m4-based con\214guration package that hides a lot)-.2 -F(of the comple)102 683.4 Q(xity)-.15 E(.)-.65 E .47 -(These con\214guration \214les are simpler than old v)127 699.6 R .47 -(ersions lar)-.15 F .47(gely because the w)-.18 F .47(orld has become) --.1 F 1.448(simpler; in particular)102 711.6 R 3.948(,t)-.4 G -.15(ex) --3.948 G 1.448(t-based host \214les are of).15 F 1.449 -(\214cially eliminated, ob)-.25 F 1.449 -(viating the need to \231hide\232)-.15 F(hosts behind a re)102 723.6 Q -(gistered internet g)-.15 E(ate)-.05 E -.1(wa)-.25 G -.65(y.).1 G EP -%%Page: 9 5 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-9)200.86 E/F1 10/Times-Roman@0 SF .092(These \214les also assume that most of your neighbors use domain-based UUCP addressing; that) -127 96 R .361(is, instead of naming hosts as \231host!user\232 the)102 -108 R 2.861(yw)-.15 G .361(ill use \231host.domain!user\232.)-2.861 F -.361(The con\214guration \214les)5.361 F(can be customized to w)102 120 -Q(ork around this, b)-.1 E(ut it is more comple)-.2 E(x.)-.15 E .658 -(Our con\214guration \214les are processed by)127 136.2 R/F2 10 -/Times-Italic@0 SF(m4)3.158 E F1 .658(to f)3.158 F .657 -(acilitate local customization; the directory)-.1 F F2(cf)3.157 E F1 -.396(of the)102 148.2 R F2(sendmail)2.896 E F1(distrib)2.896 E .396 -(ution directory contains the source \214les.)-.2 F .396 -(This directory contains se)5.396 F -.15(ve)-.25 G .397(ral sub-).15 F -(directories:)102 160.2 Q 61.73(cf Both)102 176.4 R .56 -(site-dependent and site-independent descriptions of hosts.)3.06 F .56 -(These can be lit-)5.56 F .445(eral host names \(e.g., \231ucb)174 188.4 -R -.25(va)-.15 G .445(x.mc\232\) when the hosts are g).25 F(ate)-.05 E --.1(wa)-.25 G .445(ys or more general).1 F .535(descriptions \(such as \231generic-solaris2.mc\232 as a general description of an SMTP-) -174 200.4 R 1.125(connected host running Solaris 2.x.)174 212.4 R 1.126 -(Files ending)6.126 F F0(.mc)3.626 E F1(\(`)3.626 E 1.126 -(`Master Con\214guration')-.74 F('\))-.74 E .516 -(are the input descriptions; the output is in the corresponding)174 -224.4 R F0(.cf)3.016 E F1 3.016(\214le. The)3.016 F(general)3.016 E -(structure of these \214les is described belo)174 236.4 Q -.65(w.)-.25 G -39.5(domain Site-dependent)102 252.6 R .428(subdomain descriptions.) -2.928 F .428(These are tied to the w)5.428 F .428(ay your or)-.1 F -.05 -(ga)-.18 G(niza-).05 E .777(tion w)174 264.6 R .777 -(ants to do addressing.)-.1 F -.15(Fo)5.777 G 3.277(re).15 G(xample,) --3.427 E F0(domain/CS.Berk)3.276 E(eley)-.1 E(.EDU)-.7 E(.m4)-.5 E F1 -.776(is our)3.276 F 1.188(description for hosts in the CS.Berk)174 276.6 -R(ele)-.1 E -.65(y.)-.15 G 1.188(EDU subdomain.).65 F 1.188 -(These are referenced)6.188 F(using the)174 288.6 Q/F3 9/Times-Roman@0 -SF(DOMAIN)2.5 E F0(m4)2.5 E F1(macro in the)2.5 E F0(.mc)2.5 E F1 -(\214le.)2.5 E 41.74(feature De\214nitions)102 304.8 R .728 -(of speci\214c features that some particular host in your site might w) -3.229 F(ant.)-.1 E 2.466(These are referenced using the)174 316.8 R F3 -(FEA)4.966 E(TURE)-.999 E F0(m4)4.966 E F1 4.966(macro. An)4.966 F -.15 -(ex)4.967 G 2.467(ample feature is).15 F 1.317 -(use_cw_\214le \(which tells)174 328.8 R F2(sendmail)3.817 E F1 1.316 -(to read an /etc/sendmail.cw \214le on startup to)3.817 F -(\214nd the set of local names\).)174 340.8 Q 50.62(hack Local)102 357 R -1.886(hacks, referenced using the)4.386 F F3(HA)4.386 E(CK)-.36 E F0(m4) -4.386 E F1 4.386(macro. T)4.386 F 1.886(ry to a)-.35 F -.2(vo)-.2 G -1.886(id these.).2 F(The)6.887 E(point of ha)174 369 Q -(ving them here is to mak)-.2 E 2.5(ei)-.1 G 2.5(tc)-2.5 G -(lear that the)-2.5 E 2.5(ys)-.15 G(mell.)-2.5 E 56.72 -(m4 Site-independent)102 385.2 R F2(m4)2.538 E F1 .038 -(\(1\) include \214les that ha)B .338 -.15(ve i)-.2 H .038 -(nformation common to all con\214gu-).15 F(ration \214les.)174 397.2 Q -(This can be thought of as a \231#include\232 directory)5 E(.)-.65 E -43.95(mailer De\214nitions)102 413.4 R .152 -(of mailers, referenced using the)2.652 F F3(MAILER)2.652 E F0(m4)2.652 -E F1 2.652(macro. The)2.652 F .153(mailer types)2.652 F 1.787 -(that are kno)174 425.4 R 1.787(wn in this distrib)-.25 F 1.787 -(ution are f)-.2 F 1.787(ax, local, smtp, uucp, and usenet.)-.1 F -.15 -(Fo)6.786 G(r).15 E -.15(ex)174 437.4 S(ample, to include support for the UUCP-based mailers, use \231MAILER\(uucp\)\232.) -.15 E 43.39(ostype De\214nitions)102 453.6 R 1.156(describing v)3.656 F -1.157(arious operating system en)-.25 F 1.157 -(vironments \(such as the loca-)-.4 F(tion of support \214les\).)174 -465.6 Q(These are referenced using the)5 E F3(OSTYPE)2.5 E F0(m4)2.5 E -F1(macro.)2.5 E 60.61(sh Shell)102 481.8 R(\214les used by the)2.5 E F0 -(m4)2.5 E F1 -.2(bu)2.5 G(ild process.).2 E -1.1(Yo)5 G 2.5(us)1.1 G -(houldn')-2.5 E 2.5(th)-.18 G -2.25 -.2(av e)-2.5 H(to mess with these.) -2.7 E 30.61(sitecon\214g Local)102 498 R .251(UUCP connecti)2.751 F .251 -(vity information.)-.25 F .251 -(This directory has been supplanted by the)5.251 F 1.076 -(mailertable feature; an)174 510 R 3.576(yn)-.15 G 1.576 -.25(ew c) --3.576 H 1.077(on\214gurations should use that feature to do UUCP).25 F -(\(and other\) routing.)174 522 Q .757(If you are in a ne)127 538.2 R -3.257(wd)-.25 G .757(omain \(e.g., a compan)-3.257 F .756 -(y\), you will probably w)-.15 F .756(ant to create a cf/domain)-.1 F -.05(\214le for your domain.)102 550.2 R .051 -(This consists primarily of relay de\214nitions and features you w)5.05 -F .051(ant enabled site-)-.1 F .916(wide: for e)102 562.2 R .916 -(xample, Berk)-.15 F(ele)-.1 E(y')-.15 E 3.416(sd)-.55 G .915 -(omain de\214nition de\214nes relays for BitNET and UUCP)-3.416 F 5.915 -(.T)-1.11 G .915(hese are)-5.915 F 1.519(speci\214c to Berk)102 574.2 R -(ele)-.1 E 2.819 -.65(y, a)-.15 H 1.519 -(nd should be fully-quali\214ed internet-style domain names.).65 F 1.52 -(Please check to)6.519 F(mak)102 586.2 Q 2.5(ec)-.1 G(ertain the)-2.5 E -2.5(ya)-.15 G(re reasonable for your domain.)-2.5 E 1.407 -(Subdomains at Berk)127 602.4 R(ele)-.1 E 3.907(ya)-.15 G 1.407 -(re also represented in the cf/domain directory)-3.907 F 6.406(.F)-.65 G -1.406(or e)-6.556 F 1.406(xample, the)-.15 F .356(domain CS.Berk)102 -614.4 R(ele)-.1 E -.65(y.)-.15 G .356 -(EDU is the Computer Science subdomain, EECS.Berk).65 F(ele)-.1 E -.65 -(y.)-.15 G .356(EDU is the Electri-).65 F 1.278 -(cal Engineering and Computer Sciences subdomain, and S2K.Berk)102 626.4 -R(ele)-.1 E -.65(y.)-.15 G 1.278(EDU is the Sequoia 2000).65 F 4.003 -(subdomain. Y)102 638.4 R 1.503(ou will probably ha)-1.1 F 1.804 -.15 -(ve t)-.2 H 4.004(oa).15 G 1.504 -(dd an entry to this directory to be appropriate for your)-4.004 F -(domain.)102 650.4 Q -1.1(Yo)127 666.6 S 4.373(uw)1.1 G 1.873(ill ha) --4.373 F 2.173 -.15(ve t)-.2 H 4.373(ou).15 G 1.873(se or create)-4.373 -F F0(.mc)4.372 E F1 1.872(\214les in the)4.372 F F2(cf/cf)4.372 E F1 -1.872(subdirectory for your hosts.)4.372 F 1.872(This is)6.872 F -(detailed in the cf/README \214le.)102 678.6 Q EP -%%Page: 10 6 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-10 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E 2.5(1.3. Details)87 96 R -(of Installation Files)2.5 E/F1 10/Times-Roman@0 SF -(This subsection describes the \214les that comprise the)127 112.2 Q/F2 -10/Times-Italic@0 SF(sendmail)2.5 E F1(installation.)2.5 E F0 2.5 -(1.3.1. /usr/sbin/sendmail)102 136.2 R F1 .08(The binary for)142 154.4 R -F2(sendmail)2.58 E F1 .079(is located in /usr/sbin)2.58 F/F3 7 -/Times-Roman@0 SF(1)-4 I F1 5.079(.I)4 K 2.579(ts)-5.079 G .079 -(hould be setuid root.)-2.579 F -.15(Fo)5.079 G 2.579(rs).15 G .079 -(ecurity rea-)-2.579 F(sons, /, /usr)117 168.4 Q 2.5(,a)-.4 G -(nd /usr/sbin should be o)-2.5 E(wned by root, mode 755)-.25 E F3(2)-4 I -F1(.)4 I F0 2.5(1.3.2. /etc/sendmail.cf)102 192.4 R F1 .965 -(This is the con\214guration \214le for)142 210.6 R F2(sendmail)3.466 E -F3(3)-4 I F1 5.966(.T)4 K .966 -(his is the only non-library \214le name com-)-5.966 F(piled into)117 -224.6 Q F2(sendmail)2.5 E F3(4)-4 I F1(.)4 I .721 -(The con\214guration \214le is normally created using the distrib)142 -240.8 R .721(ution \214les described abo)-.2 F -.15(ve)-.15 G 5.721(.I) -.15 G(f)-5.721 E .64(you ha)117 252.8 R .94 -.15(ve a p)-.2 H .64(articularly unusual system con\214guration you may need to create a special v) -.15 F(ersion.)-.15 E(The format of this \214le is detailed in later sections of this document.) -117 264.8 Q F0 2.5(1.3.3. /usr/bin/newaliases)102 288.8 R F1(The)142 305 -Q F2(ne)2.5 E(waliases)-.15 E F1(command should just be a link to)2.5 E -F2(sendmail)2.5 E F1(:)A(rm \255f /usr/bin/ne)157 321.2 Q -.1(wa)-.25 G -(liases).1 E(ln \255s /usr/sbin/sendmail /usr/bin/ne)157 333.2 Q -.1(wa) --.25 G(liases).1 E(This can be installed in whate)117 349.4 Q -.15(ve) --.25 G 2.5(rs).15 G(earch path you prefer for your system.)-2.5 E F0 2.5 -(1.3.4. /usr/bin/hoststat)102 373.4 R F1(The)142 389.6 Q F2(hoststat) -5.844 E F1 3.344(command should just be a link to)5.844 F F2(sendmail) -5.844 E F1 5.844(,i)C 5.845(naf)-5.844 G 3.345(ashion similar to)-5.945 -F F2(ne)117 401.6 Q(waliases)-.15 E F1 6.444(.T)C 1.444(his command lists the status of the last mail transaction with all remote hosts.) --6.444 F(The)117 413.6 Q F0<ad76>3.856 E F1 1.356(\215ag will pre)3.856 -F -.15(ve)-.25 G 1.357(nt the status display from being truncated.).15 F -1.357(It functions only when the)6.357 F F0(HostStatusDir)117 425.6 Q -(ectory)-.18 E F1(option is set.)2.5 E F0 2.5(1.3.5. /usr/bin/pur)102 -449.6 R(gestat)-.1 E F1 .993(This command is also a link to)142 465.8 R -F2(sendmail)3.493 E F1 5.993(.I)C 3.493<748d>-5.993 G .993 -(ushes all information that is stored in the)-3.493 F F0(HostStatusDir) -117 477.8 Q(ectory)-.18 E F1(tree.)2.5 E F0 2.5(1.3.6. /v)102 501.8 R -(ar/spool/mqueue)-.1 E F1 .217(The directory)142 518 R F2 -(/var/spool/mqueue)2.717 E F1 .218 -(should be created to hold the mail queue.)2.717 F .218(This directory) -5.218 F(should be mode 700 and o)117 530 Q(wned by root.)-.25 E -(The actual path of this directory is de\214ned in the)142 546.2 Q F0(Q) -2.5 E F1(option of the)2.5 E F2(sendmail.cf)2.5 E F1(\214le.)2.5 E .32 -LW 76 580.4 72 580.4 DL 80 580.4 76 580.4 DL 84 580.4 80 580.4 DL 88 -580.4 84 580.4 DL 92 580.4 88 580.4 DL 96 580.4 92 580.4 DL 100 580.4 96 -580.4 DL 104 580.4 100 580.4 DL 108 580.4 104 580.4 DL 112 580.4 108 -580.4 DL 116 580.4 112 580.4 DL 120 580.4 116 580.4 DL 124 580.4 120 -580.4 DL 128 580.4 124 580.4 DL 132 580.4 128 580.4 DL 136 580.4 132 -580.4 DL 140 580.4 136 580.4 DL 144 580.4 140 580.4 DL 148 580.4 144 -580.4 DL 152 580.4 148 580.4 DL 156 580.4 152 580.4 DL 160 580.4 156 -580.4 DL 164 580.4 160 580.4 DL 168 580.4 164 580.4 DL 172 580.4 168 -580.4 DL 176 580.4 172 580.4 DL 180 580.4 176 580.4 DL 184 580.4 180 -580.4 DL 188 580.4 184 580.4 DL 192 580.4 188 580.4 DL 196 580.4 192 -580.4 DL 200 580.4 196 580.4 DL 204 580.4 200 580.4 DL 208 580.4 204 -580.4 DL 212 580.4 208 580.4 DL 216 580.4 212 580.4 DL/F4 5 -/Times-Roman@0 SF(1)93.6 590.8 Q/F5 8/Times-Roman@0 SF .384 -(This is usually /usr/sbin on 4.4BSD and ne)3.2 J .384(wer systems; man) --.2 F 2.385(ys)-.12 G .385(ystems install it in /usr/lib)-2.385 F 4.385 -(.I)-.32 G .385(understand it is in /usr/ucblib on)-2 F -(System V Release 4.)72 603.6 Q F4(2)93.6 614 Q F5 .149(Some v)3.2 J .15 -(endors ship them o)-.12 F .15(wned by bin; this creates a security hole that is not actually related to) --.2 F/F6 8/Times-Italic@0 SF(sendmail)2.15 E F5 4.15(.O)C .15 -(ther important di-)-4.15 F(rectories that should ha)72 626.8 Q .24 -.12 -(ve r)-.16 H(estricti).12 E .24 -.12(ve o)-.2 H(wnerships and permissions are /bin, /usr/bin, /etc, /usr/etc, /lib, and /usr/lib) --.08 E(.)-.32 E F4(3)93.6 637.2 Q F5(Actually)3.2 I 2.277(,t)-.52 G .277 -(he pathname v)-2.277 F .276(aries depending on the operating system; /etc is the preferred directory) --.2 F 4.276(.S)-.52 G .276(ome older systems install it)-4.276 F(in)72 -650 Q/F7 8/Times-Bold@0 SF(/usr/lib/sendmail.cf)2.27 E F5 2.27(,a)C .27 -(nd I')-2.27 F .51 -.12(ve a)-.4 H .271(lso seen it in).12 F F7 -(/usr/ucblib)2.271 E F5(and)2.271 E F7(/etc/mail)2.271 E F5 4.271(.I)C -2.271(fy)-4.271 G .271(ou w)-2.271 F .271(ant to mo)-.08 F .511 -.12 -(ve t)-.12 H .271(his \214le, add -D_P).12 F -.888(AT)-.736 G -(H_SENDMAIL-).888 E .093 -(CF=\\"/\214le/name\\" to the \215ags passed to the C compiler)72 659.6 -R 4.093(.M)-.44 G -.12(ov)-4.093 G .093 -(ing this \214le is not recommended: other programs and scripts kno).12 -F 2.093(wo)-.2 G 2.092(ft)-2.093 G(his)-2.092 E(location.)72 669.2 Q F4 -(4)93.6 679.6 Q F5 .589 -(The system libraries can reference other \214les; in particular)3.2 J -2.589(,s)-.32 G .589(ystem library subroutines that)-2.589 F F6 -(sendmail)2.588 E F5 .588(calls probably reference)2.588 F F6 -(/etc/passwd)72 692.4 Q F5(and)2 E F6(/etc/r)2 E(esolv)-.296 E(.conf) --.592 E F5(.)A EP -%%Page: 11 7 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-11)195.86 E 2.5(1.3.7. /v)102 96 R(ar/spool/mqueue/.hoststat)-.1 -E/F1 10/Times-Roman@0 SF 1.045(This is a typical v)142 112.2 R 1.045 -(alue for the)-.25 F F0(HostStatusDir)3.545 E(ectory)-.18 E F1 1.044 -(option, containing one \214le per host)3.545 F -(that this sendmail has chatted with recently)117 124.2 Q 5(.I)-.65 G -2.5(ti)-5 G 2.5(sn)-2.5 G(ormally a subdirectory of)-2.5 E/F2 10 -/Times-Italic@0 SF(mqueue)2.5 E F1(.)A F0 2.5(1.3.8. /etc/aliases*)102 -148.2 R F1 1.492(The system aliases are held in \231/etc/aliases\232.) -142 164.4 R 3.992(As)6.492 G 1.492(ample is gi)-3.992 F -.15(ve)-.25 G -3.993(ni).15 G 3.993<6e99>-3.993 G 1.493(lib/aliases\232 which)-3.993 F -(includes some aliases which)117 176.4 Q F2(must)2.5 E F1(be de\214ned:) -2.5 E(cp lib/aliases /etc/aliases)157 192.6 Q F2(edit /etc/aliases)157 -204.6 Q F1 -1.1(Yo)117 220.8 S 2.5(us)1.1 G(hould e)-2.5 E -(xtend this \214le with an)-.15 E 2.5(ya)-.15 G -(liases that are apropos to your system.)-2.5 E(Normally)142 237 Q F2 -(sendmail)7.984 E F1 5.484(looks at a database v)7.984 F 5.483 -(ersion of the \214les, stored either in)-.15 F .851(\231/etc/aliases.dir\232 and \231/etc/aliases.pag\232 or \231/etc/aliases.db\232 depending on which database pack-) -117 249 R 1.132(age you are using.)117 261 R 1.132 -(The actual path of this \214le is de\214ned in the)6.132 F F0 -(AliasFile)3.631 E F1 1.131(option of the)3.631 F F2(send-)3.631 E -(mail.cf)117 273 Q F1(\214le.)2.5 E F0 2.5(1.3.9. /etc/r)102 297 R 2.5 -(co)-.18 G 2.5(r/)-2.5 G(etc/init.d/sendmail)-2.5 E F1 .155 -(It will be necessary to start up the)142 313.2 R F2(sendmail)2.655 E F1 -.156(daemon when your system reboots.)2.655 F .156(This dae-)5.156 F -1.538(mon performs tw)117 325.2 R 4.037(of)-.1 G 1.537 -(unctions: it listens on the SMTP sock)-4.037 F 1.537 -(et for connections \(to recei)-.1 F 1.837 -.15(ve m)-.25 H(ail).15 E -.442(from a remote system\) and it processes the queue periodically to insure that mail gets deli) -117 337.2 R -.15(ve)-.25 G(red).15 E(when hosts come up.)117 349.2 Q -.505(Add the follo)142 365.4 R .505(wing lines to \231/etc/rc\232 \(or \231/etc/rc.local\232 as appropriate\) in the area where it) --.25 F .375 -(is starting up the daemons on a BSD-base system, or on a System-V)117 -377.4 R .375(-based system in one of the)-1 F -(startup \214les, typically \231/etc/init.d/sendmail\232:)117 389.4 Q -(if [ \255f /usr/sbin/sendmail \255a \255f /etc/sendmail.cf ]; then)157 -405.6 Q(\(cd /v)193 417.6 Q(ar/spool/mqueue; rm \255f [lnx]f*\))-.25 E -(/usr/sbin/sendmail \255bd \255q30m &)193 429.6 Q -(echo \255n ' sendmail' >/de)193 441.6 Q(v/console)-.25 E<8c>157 453.6 Q -.174 -(The \231cd\232 and \231rm\232 commands insure that all lock \214les ha) -117 469.8 R .473 -.15(ve b)-.2 H .173(een remo).15 F -.15(ve)-.15 G .173 -(d; e).15 F .173(xtraneous lock \214les)-.15 F .004 -(may be left around if the system goes do)117 481.8 R .005 -(wn in the middle of processing a message.)-.25 F .005(The line that) -5.005 F 2.294(actually in)117 493.8 R -.2(vo)-.4 G -.1(ke).2 G(s).1 E F2 -(sendmail)4.794 E F1 2.294(has tw)4.794 F 4.794<6f8d>-.1 G 2.293 -(ags: \231\255bd\232 causes it to listen on the SMTP port, and)-4.794 F -(\231\255q30m\232 causes it to run the queue e)117 505.8 Q -.15(ve)-.25 -G(ry half hour).15 E(.)-.55 E .378(Some people use a more comple)142 522 -R 2.879(xs)-.15 G .379(tartup script, remo)-2.879 F .379 -(ving zero length qf \214les and df \214les)-.15 F 1.399 -(for which there is no qf \214le.)117 534 R -.15(Fo)6.398 G 3.898(re).15 -G 1.398(xample, see Figure 1 for an e)-4.048 F 1.398(xample of a comple) --.15 F 3.898(xs)-.15 G(cript)-3.898 E(which does this clean up.)117 546 -Q .755(If you are not running a v)142 562.2 R .755 -(ersion of UNIX that supports Berk)-.15 F(ele)-.1 E 3.256(yT)-.15 G -(CP/IP)-3.256 E 3.256(,d)-1.11 G 3.256(on)-3.256 G .756(ot include) --3.256 F(the)117 574.2 Q F0(\255bd)2.5 E F1(\215ag.)2.5 E F0 2.5 -(1.3.10. /usr/lib/sendmail.hf)102 598.2 R F1 2.078 -(This is the help \214le used by the SMTP)142 614.4 R F0(HELP)4.578 E F1 -4.578(command. It)4.578 F 2.078(should be copied from)4.578 F -(\231lib/sendmail.hf\232:)117 626.4 Q(cp lib/sendmail.hf /usr/lib)157 -642.6 Q(The actual path of this \214le is de\214ned in the)117 658.8 Q -F0(HelpFile)2.5 E F1(option of the)2.5 E F2(sendmail.cf)2.5 E F1 -(\214le.)2.5 E F0 2.5(1.3.11. /etc/sendmail.st)102 682.8 R F1 3.04 -(If you wish to collect statistics about your mail traf)142 699 R 3.04 -(\214c, you should create the \214le)-.25 F(\231/etc/sendmail.st\232:) -117 711 Q EP -%%Page: 12 8 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-12 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E .4 LW 77 108 72 108 DL 79 108 74 -108 DL 84 108 79 108 DL 89 108 84 108 DL 94 108 89 108 DL 99 108 94 108 -DL 104 108 99 108 DL 109 108 104 108 DL 114 108 109 108 DL 119 108 114 -108 DL 124 108 119 108 DL 129 108 124 108 DL 134 108 129 108 DL 139 108 -134 108 DL 144 108 139 108 DL 149 108 144 108 DL 154 108 149 108 DL 159 -108 154 108 DL 164 108 159 108 DL 169 108 164 108 DL 174 108 169 108 DL -179 108 174 108 DL 184 108 179 108 DL 189 108 184 108 DL 194 108 189 108 -DL 199 108 194 108 DL 204 108 199 108 DL 209 108 204 108 DL 214 108 209 -108 DL 219 108 214 108 DL 224 108 219 108 DL 229 108 224 108 DL 234 108 -229 108 DL 239 108 234 108 DL 244 108 239 108 DL 249 108 244 108 DL 254 -108 249 108 DL 259 108 254 108 DL 264 108 259 108 DL 269 108 264 108 DL -274 108 269 108 DL 279 108 274 108 DL 284 108 279 108 DL 289 108 284 108 -DL 294 108 289 108 DL 299 108 294 108 DL 304 108 299 108 DL 309 108 304 -108 DL 314 108 309 108 DL 319 108 314 108 DL 324 108 319 108 DL 329 108 -324 108 DL 334 108 329 108 DL 339 108 334 108 DL 344 108 339 108 DL 349 -108 344 108 DL 354 108 349 108 DL 359 108 354 108 DL 364 108 359 108 DL -369 108 364 108 DL 374 108 369 108 DL 379 108 374 108 DL 384 108 379 108 -DL 389 108 384 108 DL 394 108 389 108 DL 399 108 394 108 DL 404 108 399 -108 DL 409 108 404 108 DL 414 108 409 108 DL 419 108 414 108 DL 424 108 -419 108 DL 429 108 424 108 DL 434 108 429 108 DL 439 108 434 108 DL 444 -108 439 108 DL 449 108 444 108 DL 454 108 449 108 DL 459 108 454 108 DL -464 108 459 108 DL 469 108 464 108 DL 474 108 469 108 DL 479 108 474 108 -DL 484 108 479 108 DL 489 108 484 108 DL 494 108 489 108 DL 499 108 494 -108 DL 504 108 499 108 DL/F1 10/Times-Roman@0 SF(#!/bin/sh)72 132 Q 2.5 -(#r)72 144 S(emo)-2.5 E .3 -.15(ve z)-.15 H(ero length qf \214les).15 E -(for qf)72 156 Q(\214le in qf*)-.25 E(do)72 168 Q(if [ \255r $qf)108 180 -Q(\214le ])-.25 E(then)108 192 Q(if [ ! \255s $qf)144 204 Q(\214le ]) --.25 E(then)144 216 Q(echo \255n " <zero: $qf)180 228 Q(\214le>" > /de) --.25 E(v/console)-.25 E(rm \255f $qf)180 240 Q(\214le)-.25 E<8c>144 252 -Q<8c>108 264 Q(done)72 276 Q 2.5(#r)72 288 S -(ename tf \214les to be qf if the qf does not e)-2.5 E(xist)-.15 E -(for tf)72 300 Q(\214le in tf*)-.25 E(do)72 312 Q(qf)108 324 Q -(\214le=`echo $tf)-.25 E(\214le | sed ')-.25 E(s/t/q/'`)-.55 E -(if [ \255r $tf)108 336 Q(\214le \255a ! \255f $qf)-.25 E(\214le ])-.25 -E(then)108 348 Q(echo \255n " <reco)144 360 Q -.15(ve)-.15 G(ring: $tf) -.15 E(\214le>" > /de)-.25 E(v/console)-.25 E(mv $tf)144 372 Q -(\214le $qf)-.25 E(\214le)-.25 E(else)108 384 Q(if [ \255f $tf)144 396 Q -(\214le ])-.25 E(then)144 408 Q(echo \255n " <e)180 420 Q(xtra: $tf)-.15 -E(\214le>" > /de)-.25 E(v/console)-.25 E(rm \255f $tf)180 432 Q(\214le) --.25 E<8c>144 444 Q<8c>108 456 Q(done)72 468 Q 2.5(#r)72 480 S(emo)-2.5 -E .3 -.15(ve d)-.15 H 2.5<668c>.15 G -(les with no corresponding qf \214les)-2.5 E(for df)72 492 Q -(\214le in df*)-.25 E(do)72 504 Q(qf)108 516 Q(\214le=`echo $df)-.25 E -(\214le | sed ')-.25 E(s/d/q/'`)-.55 E(if [ \255r $df)108 528 Q -(\214le \255a ! \255f $qf)-.25 E(\214le ])-.25 E(then)108 540 Q -(echo \255n " <incomplete: $df)144 552 Q(\214le>" > /de)-.25 E -(v/console)-.25 E(mv $df)144 564 Q(\214le `echo $df)-.25 E -(\214le | sed ')-.25 E(s/d/D/'`)-.55 E<8c>108 576 Q(done)72 588 Q 2.5 -(#a)72 600 S(nnounce \214les that ha)-2.5 E .3 -.15(ve b)-.2 H(een sa) -.15 E -.15(ve)-.2 G 2.5(dd).15 G(uring disaster reco)-2.5 E -.15(ve)-.15 -G(ry).15 E(for xf)72 612 Q(\214le in [A-Z]f*)-.25 E(do)72 624 Q -(if [ \255f $xf)108 636 Q(\214le ])-.25 E(then)108 648 Q -(echo \255n " <panic: $xf)144 660 Q(\214le>" > /de)-.25 E(v/console)-.25 -E<8c>108 672 Q(done)72 684 Q(Figure 1 \212 A comple)214.47 708 Q 2.5(xs) --.15 G(tartup script)-2.5 E 77 720 72 720 DL 79 720 74 720 DL 84 720 79 -720 DL 89 720 84 720 DL 94 720 89 720 DL 99 720 94 720 DL 104 720 99 720 -DL 109 720 104 720 DL 114 720 109 720 DL 119 720 114 720 DL 124 720 119 -720 DL 129 720 124 720 DL 134 720 129 720 DL 139 720 134 720 DL 144 720 -139 720 DL 149 720 144 720 DL 154 720 149 720 DL 159 720 154 720 DL 164 -720 159 720 DL 169 720 164 720 DL 174 720 169 720 DL 179 720 174 720 DL -184 720 179 720 DL 189 720 184 720 DL 194 720 189 720 DL 199 720 194 720 -DL 204 720 199 720 DL 209 720 204 720 DL 214 720 209 720 DL 219 720 214 -720 DL 224 720 219 720 DL 229 720 224 720 DL 234 720 229 720 DL 239 720 -234 720 DL 244 720 239 720 DL 249 720 244 720 DL 254 720 249 720 DL 259 -720 254 720 DL 264 720 259 720 DL 269 720 264 720 DL 274 720 269 720 DL -279 720 274 720 DL 284 720 279 720 DL 289 720 284 720 DL 294 720 289 720 -DL 299 720 294 720 DL 304 720 299 720 DL 309 720 304 720 DL 314 720 309 -720 DL 319 720 314 720 DL 324 720 319 720 DL 329 720 324 720 DL 334 720 -329 720 DL 339 720 334 720 DL 344 720 339 720 DL 349 720 344 720 DL 354 -720 349 720 DL 359 720 354 720 DL 364 720 359 720 DL 369 720 364 720 DL -374 720 369 720 DL 379 720 374 720 DL 384 720 379 720 DL 389 720 384 720 -DL 394 720 389 720 DL 399 720 394 720 DL 404 720 399 720 DL 409 720 404 -720 DL 414 720 409 720 DL 419 720 414 720 DL 424 720 419 720 DL 429 720 -424 720 DL 434 720 429 720 DL 439 720 434 720 DL 444 720 439 720 DL 449 -720 444 720 DL 454 720 449 720 DL 459 720 454 720 DL 464 720 459 720 DL -469 720 464 720 DL 474 720 469 720 DL 479 720 474 720 DL 484 720 479 720 -DL 489 720 484 720 DL 494 720 489 720 DL 499 720 494 720 DL 504 720 499 -720 DL EP -%%Page: 13 9 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-13)195.86 E/F1 10/Times-Roman@0 SF(cp /de)157 96 Q -(v/null /etc/sendmail.st)-.25 E(chmod 644 /etc/sendmail.st)157 108 Q -.716(This \214le does not gro)117 124.2 R 4.516 -.65(w. I)-.25 H 3.216 -(ti).65 G 3.216(sp)-3.216 G .716 -(rinted with the program \231mailstats/mailstats.c.)-3.216 F 5.715<9a54> --.7 G .715(he actual path)-5.715 F(of this \214le is de\214ned in the) -117 136.2 Q F0(S)2.5 E F1(option of the)2.5 E/F2 10/Times-Italic@0 SF -(sendmail.cf)2.5 E F1(\214le.)2.5 E F0 2.5(1.3.12. /usr/bin/mailq)102 -160.2 R F1(If)142 176.4 Q F2(sendmail)3.439 E F1 .939(is in)3.439 F -.2 -(vo)-.4 G -.1(ke).2 G 3.439(da).1 G 3.439<7399>-3.439 G(mailq,)-3.439 E -3.439<9a69>-.7 G 3.439(tw)-3.439 G .939(ill simulate the)-3.439 F F0 -(\255bp)3.439 E F1 .94(\215ag \(i.e.,)3.44 F F2(sendmail)3.44 E F1 .94 -(will print)3.44 F(the contents of the mail queue; see belo)117 188.4 Q -2.5(w\). This)-.25 F(should be a link to /usr/sbin/sendmail.)2.5 E F0 -2.5(2. NORMAL)72 212.4 R(OPERA)2.5 E(TIONS)-.95 E 2.5(2.1. The)87 236.4 -R(System Log)2.5 E F1 1.511(The system log is supported by the)127 252.6 -R F2(syslo)4.011 E(gd)-.1 E F1 1.511(\(8\) program.)1.666 F 1.511 -(All messages from)6.511 F F2(sendmail)4.011 E F1(are)4.011 E -(logged under the)102 266.6 Q/F3 9/Times-Roman@0 SF(LOG_MAIL)2.5 E F1 --.1(fa)2.5 G(cility).1 E/F4 7/Times-Roman@0 SF(5)-4 I F1(.)4 I F0 2.5 -(2.1.1. F)102 290.6 R(ormat)-.25 E F1 .574(Each line in the system log consists of a timestamp, the name of the machine that gener) -142 306.8 R(-)-.2 E .849(ated it \(for logging from se)117 318.8 R -.15 -(ve)-.25 G .849(ral machines o).15 F -.15(ve)-.15 G 3.349(rt).15 G .848 -(he local area netw)-3.349 F .848(ork\), the w)-.1 F .848 -(ord \231sendmail:\232,)-.1 F(and a message)117 332.8 Q F4(6)-4 I F1 5 -(.M)4 K(ost messages are a sequence of)-5 E F2(name)2.5 E F1(=)A F2 -(value)A F1(pairs.)2.5 E .68(The tw)142 349 R 3.18(om)-.1 G .68 -(ost common lines are logged when a message is processed.)-3.18 F .68 -(The \214rst logs the)5.68 F .376(receipt of a message; there will be e) -117 361 R .376(xactly one of these per message.)-.15 F .376 -(Some \214elds may be omit-)5.376 F(ted if the)117 373 Q 2.5(yd)-.15 G -2.5(on)-2.5 G(ot contain interesting information.)-2.5 E(Fields are:)5 E -50.06(from The)117 389.2 R(en)2.5 E -.15(ve)-.4 G(lope sender address.) -.15 E 53.95(size The)117 405.4 R(size of the message in bytes.)2.5 E -50.06(class The)117 421.6 R -(class \(i.e., numeric precedence\) of the message.)2.5 E 58.39(pri The) -117 437.8 R(initial message priority \(used for queue sorting\).)2.5 E -45.06(nrcpts The)117 454 R 1.514(number of en)4.014 F -.15(ve)-.4 G -1.515(lope recipients for this message \(after aliasing and for).15 F(-) --.2 E -.1(wa)189 466 S(rding\).).1 E 45.05(msgid The)117 482.2 R -(message id of the message \(from the header\).)2.5 E 48.39(proto The) -117 498.4 R(protocol used to recei)2.5 E .3 -.15(ve t)-.25 H -(his message \(e.g., ESMTP or UUCP\)).15 E 49.51(relay The)117 514.6 R -(machine from which it w)2.5 E(as recei)-.1 E -.15(ve)-.25 G(d.).15 E -.43(There is also one line logged per deli)117 530.8 R -.15(ve)-.25 G -.43(ry attempt \(so there can be se).15 F -.15(ve)-.25 G .43 -(ral per message if deli).15 F(v-)-.25 E -(ery is deferred or there are multiple recipients\).)117 542.8 Q -(Fields are:)5 E 61.72(to A)117 559 R -(comma-separated list of the recipients to this mailer)2.5 E(.)-.55 E -41.73(ctladdr The)117 575.2 R -.74(``)2.726 G .226(controlling user').74 -F .226(', that is, the name of the user whose credentials we use)-.74 F -(for deli)189 587.2 Q -.15(ve)-.25 G(ry).15 E(.)-.65 E 47.84(delay The) -117 603.4 R 1.303(total delay between the time this message w)3.804 F -1.303(as recei)-.1 F -.15(ve)-.25 G 3.803(da).15 G 1.303(nd the time it) --3.803 F -.1(wa)189 615.4 S 2.5(sd).1 G(eli)-2.5 E -.15(ve)-.25 G(red.) -.15 E 42.84(xdelay The)117 631.6 R .116 -(amount of time needed in this deli)2.615 F -.15(ve)-.25 G .116 -(ry attempt \(normally indicati).15 F .416 -.15(ve o)-.25 H 2.616(ft).15 -G(he)-2.616 E(speed of the connection\).)189 643.6 Q .32 LW 76 665.2 72 -665.2 DL 80 665.2 76 665.2 DL 84 665.2 80 665.2 DL 88 665.2 84 665.2 DL -92 665.2 88 665.2 DL 96 665.2 92 665.2 DL 100 665.2 96 665.2 DL 104 -665.2 100 665.2 DL 108 665.2 104 665.2 DL 112 665.2 108 665.2 DL 116 -665.2 112 665.2 DL 120 665.2 116 665.2 DL 124 665.2 120 665.2 DL 128 -665.2 124 665.2 DL 132 665.2 128 665.2 DL 136 665.2 132 665.2 DL 140 -665.2 136 665.2 DL 144 665.2 140 665.2 DL 148 665.2 144 665.2 DL 152 -665.2 148 665.2 DL 156 665.2 152 665.2 DL 160 665.2 156 665.2 DL 164 -665.2 160 665.2 DL 168 665.2 164 665.2 DL 172 665.2 168 665.2 DL 176 -665.2 172 665.2 DL 180 665.2 176 665.2 DL 184 665.2 180 665.2 DL 188 -665.2 184 665.2 DL 192 665.2 188 665.2 DL 196 665.2 192 665.2 DL 200 -665.2 196 665.2 DL 204 665.2 200 665.2 DL 208 665.2 204 665.2 DL 212 -665.2 208 665.2 DL 216 665.2 212 665.2 DL/F5 5/Times-Roman@0 SF(5)93.6 -675.6 Q/F6 8/Times-Roman@0 SF -(Except on Ultrix, which does not support f)3.2 I -(acilities in the syslog.)-.08 E F5(6)93.6 689.2 Q F6(This format may v) -3.2 I(ary slightly if your v)-.2 E(endor has changed the syntax.)-.12 E -EP -%%Page: 14 10 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-14 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF 43.95 -(mailer The)117 96 R(name of the mailer used to deli)2.5 E -.15(ve)-.25 -G 2.5(rt).15 G 2.5(ot)-2.5 G(his recipient.)-2.5 E 49.51(relay The)117 -112.2 R(name of the host that actually accepted \(or rejected\) this recipient.) -2.5 E 55.61(stat The)117 128.4 R(deli)2.5 E -.15(ve)-.25 G(ry status.) -.15 E(Not all \214elds are present in all messages; for e)117 144.6 Q -(xample, the relay is not listed for local deli)-.15 E -.15(ve)-.25 G -(ries.).15 E F0 2.5(2.1.2. Le)102 168.6 R -.1(ve)-.15 G(ls).1 E F1 .205 -(If you ha)142 184.8 R -.15(ve)-.2 G/F2 10/Times-Italic@0 SF(syslo)2.855 -E(gd)-.1 E F1 .205(\(8\) or an equi)1.666 F -.25(va)-.25 G .205 -(lent installed, you will be able to do logging.).25 F .204(There is) -5.204 F 2.787(al)117 196.8 S(ar)-2.787 E .287 -(ge amount of information that can be logged.)-.18 F .287 -(The log is arranged as a succession of le)5.287 F -.15(ve)-.25 G(ls.) -.15 E .651(At the lo)117 208.8 R .651(west le)-.25 F -.15(ve)-.25 G -3.151(lo).15 G .651(nly e)-3.151 F .651 -(xtremely strange situations are logged.)-.15 F .65(At the highest le) -5.651 F -.15(ve)-.25 G .65(l, e).15 F -.15(ve)-.25 G 3.15(nt).15 G(he) --3.15 E .825(most mundane and uninteresting e)117 220.8 R -.15(ve)-.25 G -.825(nts are recorded for posterity).15 F 5.826(.A)-.65 G 3.326(sac) --5.826 G(on)-3.326 E -.15(ve)-.4 G .826(ntion, log le).15 F -.15(ve)-.25 -G(ls).15 E .201 -(under ten are considered generally \231useful;\232 log le)117 232.8 R --.15(ve)-.25 G .201(ls abo).15 F .501 -.15(ve 6)-.15 H 2.701(4a).15 G .2 -(re reserv)-2.701 F .2(ed for deb)-.15 F .2(ugging pur)-.2 F(-)-.2 E 2.5 -(poses. Le)117 244.8 R -.15(ve)-.25 G(ls from 11\25564 are reserv).15 E -(ed for v)-.15 E(erbose information that some sites might w)-.15 E(ant.) --.1 E 2.5(Ac)142 261 S(omplete description of the log le)-2.5 E -.15(ve) --.25 G(ls is gi).15 E -.15(ve)-.25 G 2.5(ni).15 G 2.5(ns)-2.5 G -(ection 4.6.)-2.5 E F0 2.5(2.2. Dumping)87 285 R(State)2.5 E F1 -1.1(Yo) -127 301.2 S 2.563(uc)1.1 G .063(an ask)-2.563 F F2(sendmail)2.563 E F1 -.064(to log a dump of the open \214les and the connection cache by sending it a) -2.563 F/F3 9/Times-Roman@0 SF(SIGUSR1)102 313.2 Q F1 2.5(signal. The)2.5 -F(results are logged at)2.5 E F3(LOG_DEB)2.5 E(UG)-.09 E F1(priority)2.5 -E(.)-.65 E F0 2.5(2.3. The)87 337.2 R(Mail Queue)2.5 E F1 1.283 -(Sometimes a host cannot handle a message immediately)127 353.4 R 6.283 -(.F)-.65 G 1.283(or e)-6.433 F 1.283(xample, it may be do)-.15 F 1.282 -(wn or)-.25 F -.15(ove)102 365.4 S .042 -(rloaded, causing it to refuse connections.).15 F .043 -(The sending host is then e)5.043 F .043(xpected to sa)-.15 F .343 -.15 -(ve t)-.2 H .043(his message).15 F -(in its mail queue and attempt to deli)102 377.4 Q -.15(ve)-.25 G 2.5 -(ri).15 G 2.5(tl)-2.5 G(ater)-2.5 E(.)-.55 E .568 -(Under normal conditions the mail queue will be processed transparently) -127 393.6 R 5.568(.H)-.65 G -.25(ow)-5.568 G -2.15 -.25(ev e).25 H 1.368 --.4(r, y).25 H .568(ou may).4 F .993(\214nd that manual interv)102 405.6 -R .993(ention is sometimes necessary)-.15 F 5.993(.F)-.65 G .993(or e) --6.143 F .993(xample, if a major host is do)-.15 F .994(wn for a)-.25 F -1.699(period of time the queue may become clogged.)102 417.6 R(Although) -6.699 E F2(sendmail)4.199 E F1 1.699(ought to reco)4.199 F -.15(ve)-.15 -G 4.199(rg).15 G(racefully)-4.199 E(when the host comes up, you may \214nd performance unacceptably bad in the meantime.) -102 429.6 Q F0 2.5(2.3.1. Printing)102 453.6 R(the queue)2.5 E F1 .526 -(The contents of the queue can be printed using the)142 469.8 R F2 -(mailq)3.026 E F1 .526(command \(or by specifying the)3.026 F F0(\255bp) -117 481.8 Q F1(\215ag to)2.5 E F2(sendmail)2.5 E F1(\):)A(mailq)157 498 -Q 1.673(This will produce a listing of the queue id')117 514.2 R 1.673 -(s, the size of the message, the date the message)-.55 F -(entered the queue, and the sender and recipients.)117 526.2 Q F0 2.5 -(2.3.2. F)102 550.2 R(or)-.25 E(cing the queue)-.18 E F2(Sendmail)142 -566.4 Q F1 1.137(should run the queue automatically at interv)3.637 F -3.638(als. The)-.25 F 1.138(algorithm is to read and)3.638 F .355 -(sort the queue, and then to attempt to process all jobs in order)117 -578.4 R 5.355(.W)-.55 G .355(hen it attempts to run the job,)-5.355 F F2 -(sendmail)117 590.4 Q F1(\214rst checks to see if the job is lock)2.5 E -2.5(ed. If)-.1 F(so, it ignores the job)2.5 E(.)-.4 E .338 -(There is no attempt to insure that only one queue processor e)142 606.6 -R .338(xists at an)-.15 F 2.838(yt)-.15 G .339(ime, since there)-2.838 F -.095(is no guarantee that a job cannot tak)117 618.6 R 2.595(ef)-.1 G -(ore)-2.595 E -.15(ve)-.25 G 2.595(rt).15 G 2.595(op)-2.595 G .094 -(rocess \(ho)-2.595 F(we)-.25 E -.15(ve)-.25 G -.4(r,).15 G F2(sendmail) -2.994 E F1 .094(does include heuris-)2.594 F 1.086(tics to try to abort jobs that are taking absurd amounts of time; technically) -117 630.6 R 3.587(,t)-.65 G 1.087(his violates RFC)-3.587 F .462(821, b) -117 642.6 R .461(ut is blessed by RFC 1123\).)-.2 F .461 -(Due to the locking algorithm, it is impossible for one job to)5.461 F -1.086(freeze the entire queue.)117 654.6 R(Ho)6.086 E(we)-.25 E -.15(ve) --.25 G 1.886 -.4(r, a).15 H 3.586(nu).4 G(ncooperati)-3.586 E 1.386 -.15 -(ve r)-.25 H 1.086(ecipient host or a program recipient that).15 F(ne) -117 666.6 Q -.15(ve)-.25 G 3.351(rr).15 G .851 -(eturns can accumulate man)-3.351 F 3.351(yp)-.15 G .851 -(rocesses in your system.)-3.351 F(Unfortunately)5.851 E 3.351(,t)-.65 G -.85(here is no com-)-3.351 F(pletely general w)117 678.6 Q(ay to solv) --.1 E 2.5(et)-.15 G(his.)-2.5 E .082 -(In some cases, you may \214nd that a major host going do)142 694.8 R -.083(wn for a couple of days may create)-.25 F 2.925(ap)117 706.8 S -(rohibiti)-2.925 E -.15(ve)-.25 G .425(ly lar).15 F .425(ge queue.)-.18 -F .424(This will result in)5.425 F F2(sendmail)2.924 E F1 .424 -(spending an inordinate amount of time)2.924 F 1.084(sorting the queue.) -117 718.8 R 1.084(This situation can be \214x)6.084 F 1.084(ed by mo) --.15 F 1.085(ving the queue to a temporary place and)-.15 F EP -%%Page: 15 11 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-15)195.86 E/F1 10/Times-Roman@0 SF .023(creating a ne)117 96 R -2.523(wq)-.25 G 2.523(ueue. The)-2.523 F .022 -(old queue can be run later when the of)2.523 F .022 -(fending host returns to service.)-.25 F 1.6 -.8(To d)142 112.2 T 2.5 -(ot).8 G(his, it is acceptable to mo)-2.5 E .3 -.15(ve t)-.15 H -(he entire queue directory:).15 E(cd /v)157 128.4 Q(ar/spool)-.25 E -(mv mqueue omqueue; mkdir mqueue; chmod 700 mqueue)157 140.4 Q -1.1(Yo) -117 156.6 S 2.708(us)1.1 G .208(hould then kill the e)-2.708 F .209(xisting daemon \(since it will still be processing in the old queue direc-) --.15 F(tory\) and create a ne)117 168.6 Q 2.5(wd)-.25 G(aemon.)-2.5 E -1.6 -.8(To r)142 184.8 T(un the old mail queue, run the follo).8 E -(wing command:)-.25 E(/usr/sbin/sendmail \255oQ/v)157 201 Q -(ar/spool/omqueue \255q)-.25 E(The)117 217.2 Q F0(\255oQ)2.868 E F1 .367 -(\215ag speci\214es an alternate queue directory and the)2.868 F F0 -<ad71>2.867 E F1 .367(\215ag says to just run e)2.867 F -.15(ve)-.25 G -.367(ry job in).15 F .593(the queue.)117 229.2 R .593(If you ha)5.593 F -.893 -.15(ve a t)-.2 H(endenc).15 E 3.093(yt)-.15 G -2.1 -.25(ow a) --3.093 H .593(rd v).25 F -.1(oy)-.2 G .593(eurism, you can use the).1 F -F0<ad76>3.094 E F1 .594(\215ag to w)3.094 F .594(atch what is)-.1 F -(going on.)117 241.2 Q -(When the queue is \214nally emptied, you can remo)142 257.4 Q .3 -.15 -(ve t)-.15 H(he directory:).15 E(rmdir /v)157 273.6 Q(ar/spool/omqueue) --.25 E F0 2.5(2.4. Disk)87 301.8 R(Based Connection Inf)2.5 E(ormation) --.25 E/F2 10/Times-Italic@0 SF(Sendmail)127 318 Q F1 .597(stores a lar) -3.097 F .596 -(ge amount of information about each remote system it has connected to) --.18 F 1.127(in memory)102 330 R 3.627(.I)-.65 G 3.627(ti)-3.627 G 3.627 -(sn)-3.627 G 1.627 -.25(ow p)-3.627 H 1.127(ossible to preserv).25 F -3.627(es)-.15 G 1.127 -(ome of this information on disk as well, by using the)-3.627 F F0 -(HostStatusDir)102 342 Q(ectory)-.18 E F1 1.705 -(option, so that it may be shared between se)4.205 F -.15(ve)-.25 G -1.705(ral in).15 F -.2(vo)-.4 G 1.705(cations of).2 F F2(sendmail)4.205 -E F1(.)A .283(This allo)102 354 R .283(ws mail to be queued immediately or skipped during a queue run if there has been a recent) --.25 F -.1(fa)102 366 S(ilure in connecting to a remote machine.).1 E -1.439(Additionally enabling)127 382.2 R F0(SingleThr)3.939 E(eadDeli) --.18 E -.1(ve)-.1 G(ry).1 E F1 1.439(has the added ef)3.939 F 1.439 -(fect of single-threading mail)-.25 F(deli)102 394.2 Q -.15(ve)-.25 G -1.61(ry to a destination.).15 F 1.611 -(This can be quite helpful if the remote machine is running an SMTP)6.61 -F(serv)102 406.2 Q 1.011(er that is easily o)-.15 F -.15(ve)-.15 G 1.011 -(rloaded or cannot accept more than a single connection at a time, b).15 -F 1.01(ut can)-.2 F .458 -(cause some messages to be punted to a future queue run.)102 418.2 R -.458(It also applies to)5.458 F F2(all)2.958 E F1 .458 -(hosts, so setting this)2.958 F .282(because you ha)102 430.2 R .582 --.15(ve o)-.2 H .281(ne machine on site that runs some softw).15 F .281 -(are that is easily o)-.1 F -.15(ve)-.15 G .281(rrun can cause mail).15 -F .315(to other hosts to be slo)102 442.2 R .315(wed do)-.25 F 2.815 -(wn. If)-.25 F .315(this option is set, you probably w)2.815 F .315 -(ant to set the)-.1 F F0(MinQueueAge)2.815 E F1 .872 -(option as well and run the queue f)102 454.2 R .871 -(airly frequently; this w)-.1 F .871 -(ay jobs that are skipped because another)-.1 F F2(sendmail)102 466.2 Q -F1 .363(is talking to the same host will be tried ag)2.863 F .364 -(ain quickly rather than being delayed for a long)-.05 F(time.)102 478.2 -Q 1.099 -(The disk based host information is stored in a subdirectory of the)127 -494.4 R F0(mqueue)3.598 E F1 1.098(directory called)3.598 F F0 -(.hoststat)102 508.4 Q/F3 7/Times-Roman@0 SF(7)-4 I F1 6.749(.R)4 K(emo) --6.749 E 1.749(ving this directory and its subdirectories has an ef)-.15 -F 1.75(fect similar to the)-.25 F F2(pur)4.25 E -.1(ge)-.37 G(stat).1 E -F1 .046(command and is completely safe.)102 520.4 R .045 -(The information in these directories can be perused with the)5.046 F F2 -(host-)2.545 E(stat)102 532.4 Q F1 .513(command, which will indicate the host name, the last access, and the status of that access.) -3.012 F(An)5.513 E .69 -(asterisk in the left most column indicates that a)102 544.4 R F2 -(sendmail)3.19 E F1 .69(process currently has the host lock)3.19 F .69 -(ed for)-.1 F(mail deli)102 556.4 Q -.15(ve)-.25 G(ry).15 E(.)-.65 E .53 -(The disk based connection information is treated the same w)127 572.6 R -.53(ay as memory based connection)-.1 F .536 -(information for the purpose of timeouts.)102 584.6 R .536(By def)5.536 -F .536(ault, information about host f)-.1 F .536(ailures is v)-.1 F .536 -(alid for 30)-.25 F 2.5(minutes. This)102 596.6 R -(can be adjusted with the)2.5 E F0 -.18(Ti)2.5 G(meout.hoststatus).18 E -F1(option.)2.5 E .022 -(The connection information stored on disk may be pur)127 612.8 R .023 -(ged at an)-.18 F 2.523(yt)-.15 G .023(ime with the)-2.523 F F2(pur) -2.523 E -.1(ge)-.37 G(stat).1 E F1(com-)2.523 E .95(mand or by in)102 -624.8 R -.2(vo)-.4 G .949(king sendmail with the).2 F F0(\255bH)3.449 E -F1 3.449(switch. The)3.449 F .949(connection information may be vie) -3.449 F(wed)-.25 E(with the)102 636.8 Q F2(hoststat)2.5 E F1 -(command or by in)2.5 E -.2(vo)-.4 G(king sendmail with the).2 E F0 -(\255bh)2.5 E F1(switch.)2.5 E .32 LW 76 678.8 72 678.8 DL 80 678.8 76 -678.8 DL 84 678.8 80 678.8 DL 88 678.8 84 678.8 DL 92 678.8 88 678.8 DL -96 678.8 92 678.8 DL 100 678.8 96 678.8 DL 104 678.8 100 678.8 DL 108 -678.8 104 678.8 DL 112 678.8 108 678.8 DL 116 678.8 112 678.8 DL 120 -678.8 116 678.8 DL 124 678.8 120 678.8 DL 128 678.8 124 678.8 DL 132 -678.8 128 678.8 DL 136 678.8 132 678.8 DL 140 678.8 136 678.8 DL 144 -678.8 140 678.8 DL 148 678.8 144 678.8 DL 152 678.8 148 678.8 DL 156 -678.8 152 678.8 DL 160 678.8 156 678.8 DL 164 678.8 160 678.8 DL 168 -678.8 164 678.8 DL 172 678.8 168 678.8 DL 176 678.8 172 678.8 DL 180 -678.8 176 678.8 DL 184 678.8 180 678.8 DL 188 678.8 184 678.8 DL 192 -678.8 188 678.8 DL 196 678.8 192 678.8 DL 200 678.8 196 678.8 DL 204 -678.8 200 678.8 DL 208 678.8 204 678.8 DL 212 678.8 208 678.8 DL 216 -678.8 212 678.8 DL/F4 5/Times-Roman@0 SF(7)93.6 689.2 Q/F5 8 -/Times-Roman@0 SF(This is the usual v)3.2 I(alue of the)-.2 E/F6 8 -/Times-Bold@0 SF(HostStatusDir)2 E(ectory)-.144 E F5 -(option; it can, of course, go an)2 E(ywhere you lik)-.12 E 2(ei)-.08 G -2(ny)-2 G(our \214lesystem.)-2 E EP -%%Page: 16 12 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-16 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E 2.5(2.5. The)87 96 R(Ser)2.5 E -(vice Switch)-.1 E/F1 10/Times-Roman@0 SF 1.416(The implementation of certain system services such as host and user name lookup is con-) -127 112.2 R .336(trolled by the service switch.)102 124.2 R .336 -(If the host operating system supports such a switch)5.336 F/F2 10 -/Times-Italic@0 SF(sendmail)2.835 E F1 .335(will use)2.835 F(the nati) -102 138.2 Q .3 -.15(ve ve)-.25 H 2.5(rsion. Ultrix,).15 F -(Solaris, and DEC OSF/1 are e)2.5 E(xamples of such systems)-.15 E/F3 7 -/Times-Roman@0 SF(8)-4 I F1(.)4 I .88(If the underlying operating system does not support a service switch \(e.g., SunOS 4.X, HP-) -127 154.4 R .211(UX, BSD\) then)102 166.4 R F2(sendmail)2.711 E F1 .212 -(will pro)2.711 F .212(vide a stub implementation.)-.15 F(The)5.212 E F0 -(Ser)2.712 E(viceSwitchFile)-.1 E F1 .212(option points)2.712 F .937 -(to the name of a \214le that has the service de\214nitions.)102 178.4 R -.937(Each line has the name of a service and the)5.937 F -(possible implementations of that service.)102 190.4 Q -.15(Fo)5 G 2.5 -(re).15 G(xample, the \214le:)-2.65 E 12.94(hosts dns)142 206.6 R -(\214les nis)2.5 E 6.84(aliases \214les)142 218.6 R(nis)2.5 E .328 -(will ask)102 234.8 R F2(sendmail)2.828 E F1 .328 -(to look for hosts in the Domain Name System \214rst.)2.828 F .329 -(If the requested host name is)5.329 F .379 -(not found, it tries local \214les, and if that f)102 246.8 R .379 -(ails it tries NIS.)-.1 F(Similarly)5.379 E 2.879(,w)-.65 G .379 -(hen looking for aliases it will)-2.879 F -(try the local \214les \214rst follo)102 258.8 Q(wed by NIS.)-.25 E -1.269(Service switches are not completely inte)127 275 R 3.769 -(grated. F)-.15 F 1.269(or e)-.15 F 1.269(xample, despite the f)-.15 F -1.27(act that the host)-.1 F .294(entry listed in the abo)102 287 R .594 --.15(ve ex)-.15 H .293 -(ample speci\214es to look in NIS, on SunOS this w).15 F(on')-.1 E 2.793 -(th)-.18 G .293(appen because the)-2.793 F 1.398 -(system implementation of)102 299 R F2 -.1(ge)3.898 G(thostbyname).1 E -F1 1.398(\(3\) doesn')1.666 F 3.898(tu)-.18 G 1.399(nderstand this.) --3.898 F 1.399(If there is enough demand)6.399 F F2(sendmail)102 311 Q -F1 .015(may reimplement)2.515 F F2 -.1(ge)2.515 G(thostbyname).1 E F1 -(\(3\),)1.666 E F2 -.1(ge)2.515 G(thostbyaddr).1 E F1(\(3\),)1.666 E F2 --.1(ge)2.515 G(tpwent).1 E F1 .014(\(3\), and the other system)1.666 F -(routines that w)102 323 Q(ould be necessary to mak)-.1 E 2.5(et)-.1 G -(his w)-2.5 E(ork seamlessly)-.1 E(.)-.65 E F0 2.5(2.6. The)87 347 R -(Alias Database)2.5 E F1 2.074(After recipient addresses are read from the SMTP connection or command line the) -127 363.2 R 4.574(ya)-.15 G(re)-4.574 E .5 -(parsed by ruleset 0, which must resolv)102 375.2 R 3(et)-.15 G 3(oa)-3 -G({)-.001 E F2(mailer)A F1(,)A F2(host)2.999 E F1(,)A F2(user)2.999 E F1 -2.999(}t)C 2.999(riple. If)-2.999 F .499(the \215ags selected by the) -2.999 F F2(mailer)102 387.2 Q F1 .454(include the)2.954 F F0(A)2.954 E -F1 .454(\(aliasable\) \215ag, the)2.954 F F2(user)2.954 E F1 .454 -(part of the triple is look)2.954 F .454(ed up as the k)-.1 F .754 -.15 -(ey \()-.1 H .454(i.e., the left).15 F .903 -(hand side\) into the alias database.)102 399.2 R .903 -(If there is a match, the address is deleted from the send queue)5.903 F -.678(and all addresses on the right hand side of the alias are added in place of the alias that w) -102 411.2 R .679(as found.)-.1 F 2.007(This is a recursi)102 423.2 R -2.307 -.15(ve o)-.25 H 2.007(peration, so aliases found in the right hand side of the alias are similarly) -.15 F -.15(ex)102 435.2 S(panded.).15 E .36(The alias database e)127 -451.4 R .36(xists in tw)-.15 F 2.86(of)-.1 G 2.861(orms. One)-2.86 F -.361(is a te)2.861 F .361(xt form, maintained in the \214le)-.15 F F2 -(/etc/aliases.)2.861 E F1(The aliases are of the form)102 463.4 Q -(name: name1, name2, ...)142 479.6 Q -(Only local names may be aliased; e.g.,)102 495.8 Q(eric@prep.ai.MIT)142 -512 Q(.EDU: eric@CS.Berk)-.74 E(ele)-.1 E -.65(y.)-.15 G(EDU).65 E 1.088 -(will not ha)102 530.2 R 1.388 -.15(ve t)-.2 H 1.088(he desired ef).15 F -1.088(fect \(e)-.25 F 1.088(xcept on prep.ai.MIT)-.15 F 1.088 -(.EDU, and the)-.74 F 3.588(yp)-.15 G 1.088(robably don')-3.588 F 3.587 -(tw)-.18 G 1.087(ant me\))-3.687 F F3(9)-4 I F1(.)4 I .561 -(Aliases may be continued by starting an)102 542.2 R 3.061(yc)-.15 G -.561(ontinuation lines with a space or a tab)-3.061 F 5.562(.B)-.4 G -.562(lank lines and)-5.562 F(lines be)102 554.2 Q -(ginning with a sharp sign \(\231#\232\) are comments.)-.15 E .651 -(The second form is processed by the)127 572.4 R F2(ndbm)3.15 E F1 -(\(3\))1.666 E F3(10)-4 I F1 .65(or the Berk)3.15 4 N(ele)-.1 E 3.15(yD) --.15 G 3.15(Bl)-3.15 G(ibrary)-3.15 E 5.65(.T)-.65 G .65(his form is in) --5.65 F .593(the \214le)102 584.4 R F2(/etc/aliases.db)3.093 E F1 .593 -(\(if using NEWDB\) or)3.093 F F2(/etc/aliases.dir)3.093 E F1(and)3.093 -E F2(/etc/aliases.pa)3.094 E(g)-.1 E F1 .594(\(if using NDBM\).)3.094 F -.954(This is the form that)102 596.4 R F2(sendmail)3.454 E F1 .954 -(actually uses to resolv)3.454 F 3.454(ea)-.15 G 3.454(liases. This) --3.454 F .953(technique is used to impro)3.454 F -.15(ve)-.15 G -(performance.)102 608.4 Q -(The control of search order is actually set by the service switch.)127 -624.6 Q(Essentially)5 E 2.5(,t)-.65 G(he entry)-2.5 E .32 LW 76 642 72 -642 DL 80 642 76 642 DL 84 642 80 642 DL 88 642 84 642 DL 92 642 88 642 -DL 96 642 92 642 DL 100 642 96 642 DL 104 642 100 642 DL 108 642 104 642 -DL 112 642 108 642 DL 116 642 112 642 DL 120 642 116 642 DL 124 642 120 -642 DL 128 642 124 642 DL 132 642 128 642 DL 136 642 132 642 DL 140 642 -136 642 DL 144 642 140 642 DL 148 642 144 642 DL 152 642 148 642 DL 156 -642 152 642 DL 160 642 156 642 DL 164 642 160 642 DL 168 642 164 642 DL -172 642 168 642 DL 176 642 172 642 DL 180 642 176 642 DL 184 642 180 642 -DL 188 642 184 642 DL 192 642 188 642 DL 196 642 192 642 DL 200 642 196 -642 DL 204 642 200 642 DL 208 642 204 642 DL 212 642 208 642 DL 216 642 -212 642 DL/F4 5/Times-Roman@0 SF(8)93.6 652.4 Q/F5 8/Times-Roman@0 SF -.107(HP-UX 10 has service switch support, b)3.2 J .108 -(ut since the APIs are apparently not a)-.16 F -.2(va)-.16 G .108 -(ilable in the libraries).2 F/F6 8/Times-Italic@0 SF(sendmail)2.108 E F5 -.108(does not use the)2.108 F(nati)72 665.2 Q .24 -.12(ve s)-.2 H -(ervice switch in this release.).12 E F4(9)93.6 675.6 Q F5(Actually)3.2 -I 2(,a)-.52 G .24 -.12(ny m)-2 H(ailer that has the `).12 E 1.776 -.888 -(A' m)-.64 H(ailer \215ag set will permit aliasing; this is normally limited to the local mailer) -.888 E(.)-.44 E F4(10)93.6 689.2 Q F5(The)3.2 I F6(gdbm)2 E F5 -(package does not w)2 E(ork.)-.08 E EP -%%Page: 17 13 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-17)195.86 E/F1 10/Times-Roman@0 SF 2.5(OA)142 96 S -(liasFile=switch:aliases)-2.5 E .926(is al)102 112.2 R -.1(wa)-.1 G .927 -(ys added as the \214rst alias entry; also, the \214rst alias \214le name without a class \(e.g., without) -.1 F .269(\231nis:\232 on the front\) will be used as the name of the \214le for a `) -102 124.2 R(`\214les')-.74 E 2.768('e)-.74 G .268 -(ntry in the aliases switch.)-2.768 F -.15(Fo)5.268 G(r).15 E -.15(ex) -102 136.2 S(ample, if the con\214guration \214le contains).15 E 2.5(OA) -142 152.4 S(liasFile=/etc/aliases)-2.5 E -(and the service switch contains)102 168.6 Q 6.84(aliases nis)142 184.8 -R(\214les nisplus)2.5 E 2.449(then aliases will \214rst be searched in the NIS database, then in /etc/aliases, then in the NIS+) -102 201 R(database.)102 213 Q -1.1(Yo)127 229.2 S 2.5(uc)1.1 G -(an also use)-2.5 E/F2 9/Times-Roman@0 SF(NIS)2.5 E F1 -(-based alias \214les.)A -.15(Fo)5 G 2.5(re).15 G -(xample, the speci\214cation:)-2.65 E 2.5(OA)142 245.4 S -(liasFile=/etc/aliases)-2.5 E 2.5(OA)142 257.4 S -(liasFile=nis:mail.aliases@my)-2.5 E(.nis.domain)-.65 E 1.725(will \214rst search the /etc/aliases \214le and then the map named \231mail.aliases\232 in \231my) -102 273.6 R(.nis.domain\232.)-.65 E -.8(Wa)102 285.6 S .589 -(rning: if you b).8 F .589(uild your o)-.2 F(wn)-.25 E F2(NIS)3.089 E F1 -.589(-based alias \214les, be sure to pro)B .59(vide the)-.15 F F0<ad6c> -3.09 E F1 .59(\215ag to)3.09 F/F3 10/Times-Italic@0 SF(mak)3.09 E(edbm) --.1 E F1(\(8\))A .159(to map upper case letters in the k)102 297.6 R --.15(ey)-.1 G 2.659(st).15 G 2.659(ol)-2.659 G -.25(ow)-2.659 G .159 -(er case; otherwise, aliases with upper case letters in their).25 F -(names w)102 309.6 Q(on')-.1 E 2.5(tm)-.18 G(atch incoming addresses.) --2.5 E(Additional \215ags can be added after the colon e)127 325.8 Q -(xactly lik)-.15 E 2.5(ea)-.1 G F0(K)A F1(line \212 for e)2.5 E(xample:) --.15 E 2.5(OA)142 342 S(liasFile=nis:\255N mail.aliases@my)-2.5 E -(.nis.domain)-.65 E(will search the appropriate NIS map and al)102 358.2 -Q -.1(wa)-.1 G(ys include null bytes in the k).1 E -.15(ey)-.1 G 5(.A) --.5 G(lso:)-5 E 2.5(OA)142 374.4 S(liasFile=nis:\255f mail.aliases@my) --2.5 E(.nis.domain)-.65 E(will pre)102 390.6 Q -.15(ve)-.25 G -(nt sendmail from do).15 E(wncasing the k)-.25 E .3 -.15(ey b)-.1 H -(efore the alias lookup.).15 E F0 2.5(2.6.1. Reb)102 414.6 R -(uilding the alias database)-.2 E F1(The)142 430.8 Q F3(hash)3.079 E F1 -(or)3.079 E F3(dbm)3.079 E F1 -.15(ve)3.079 G .579 -(rsion of the database may be reb).15 F .58(uilt e)-.2 F .58 -(xplicitly by e)-.15 F -.15(xe)-.15 G .58(cuting the com-).15 F(mand)117 -442.8 Q(ne)157 459 Q -.1(wa)-.25 G(liases).1 E(This is equi)117 475.2 Q --.25(va)-.25 G(lent to gi).25 E(ving)-.25 E F3(sendmail)2.5 E F1(the)2.5 -E F0(\255bi)2.5 E F1(\215ag:)2.5 E(/usr/sbin/sendmail \255bi)157 491.4 Q -2.29(If the)142 511.8 R F0(Reb)4.79 E(uildAliases)-.2 E F1(\(old)4.79 E -F0(D)4.79 E F1 4.79(\)o)C 2.29 -(ption is speci\214ed in the con\214guration,)-4.79 F F3(sendmail)4.79 E -F1(will)4.79 E(reb)117 523.8 Q .775(uild the alias database automatically if possible when it is out of date.) --.2 F(Auto-reb)5.775 E .775(uild can be)-.2 F 1.854(dangerous on hea)117 -535.8 R 1.854(vily loaded machines with lar)-.2 F 1.853 -(ge alias \214les; if it might tak)-.18 F 4.353(em)-.1 G 1.853 -(ore than the)-4.353 F(reb)117 547.8 Q 2.831(uild timeout \(option)-.2 F -F0(AliasW)5.331 E(ait)-.65 E F1 5.331(,o)C(ld)-5.331 E F0(a)5.331 E F1 -5.331(,w)C 2.832(hich is normally \214v)-5.331 F 5.332(em)-.15 G 2.832 -(inutes\) to reb)-5.332 F 2.832(uild the)-.2 F -(database, there is a chance that se)117 559.8 Q -.15(ve)-.25 G -(ral processes will start the reb).15 E(uild process simultaneously)-.2 -E(.)-.65 E 1.77(If you ha)142 576 R 2.07 -.15(ve m)-.2 H 1.77 -(ultiple aliases databases speci\214ed, the).15 F F0(\255bi)4.27 E F1 -1.77(\215ag reb)4.27 F 1.77(uilds all the database)-.2 F -(types it understands \(for e)117 588 Q(xample, it can reb)-.15 E -(uild NDBM databases b)-.2 E(ut not NIS databases\).)-.2 E F0 2.5 -(2.6.2. P)102 612 R(otential pr)-.2 E(oblems)-.18 E F1 1.131 -(There are a number of problems that can occur with the alias database.) -142 628.2 R(The)6.131 E 3.631(ya)-.15 G 1.131(ll result)-3.631 F 1.104 -(from a)117 640.2 R F3(sendmail)3.604 E F1 1.104 -(process accessing the DBM v)3.604 F 1.103 -(ersion while it is only partially b)-.15 F 3.603(uilt. This)-.2 F(can) -3.603 E 1.248(happen under tw)117 652.2 R 3.748(oc)-.1 G 1.248(ircumstances: One process accesses the database while another process is) --3.748 F(reb)117 664.2 Q .518(uilding it, or the process reb)-.2 F .518 -(uilding the database dies \(due to being killed or a system crash\))-.2 -F(before completing the reb)117 676.2 Q(uild.)-.2 E .401 -(Sendmail has three techniques to try to relie)142 692.4 R .701 -.15 -(ve t)-.25 H .401(hese problems.).15 F .401 -(First, it ignores interrupts)5.401 F .045(while reb)117 704.4 R .045 -(uilding the database; this a)-.2 F -.2(vo)-.2 G .045 -(ids the problem of someone aborting the process lea).2 F .045(ving a) --.2 F .176(partially reb)117 716.4 R .176(uilt database.)-.2 F .177 -(Second, it locks the database source \214le during the reb)5.176 F .177 -(uild \212 b)-.2 F .177(ut that)-.2 F EP -%%Page: 18 14 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-18 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF .813 -(may not w)117 96 R .813(ork o)-.1 F -.15(ve)-.15 G 3.313(rN).15 G .813 -(FS or if the \214le is unwritable.)-3.313 F .812 -(Third, at the end of the reb)5.812 F .812(uild it adds an)-.2 F -(alias of the form)117 108 Q(@: @)157 124.2 Q .336 -(\(which is not normally le)117 140.4 R -.05(ga)-.15 G 2.836 -(l\). Before).05 F/F2 10/Times-Italic@0 SF(sendmail)2.836 E F1 .336 -(will access the database, it checks to insure that)2.836 F -(this entry e)117 154.4 Q(xists)-.15 E/F3 7/Times-Roman@0 SF(11)-4 I F1 -(.)4 I F0 2.5(2.6.3. List)102 178.4 R -.1(ow)2.5 G(ners).1 E F1 .401 -(If an error occurs on sending to a certain address, say \231)142 194.6 -R F2(x)A F1<9a2c>A F2(sendmail)2.9 E F1 .4(will look for an alias)2.9 F -.417(of the form \231o)117 206.6 R(wner)-.25 E(-)-.2 E F2(x)A F1 2.917 -<9a74>C 2.917(or)-2.917 G(ecei)-2.917 E .717 -.15(ve t)-.25 H .418 -(he errors.).15 F .418 -(This is typically useful for a mailing list where the)5.418 F 1.117 -(submitter of the list has no control o)117 218.6 R -.15(ve)-.15 G 3.617 -(rt).15 G 1.116 -(he maintenance of the list itself; in this case the list)-3.617 F -(maintainer w)117 230.6 Q(ould be the o)-.1 E(wner of the list.)-.25 E --.15(Fo)5 G 2.5(re).15 G(xample:)-2.65 E -(unix-wizards: eric@ucbarpa, wnj@monet, nosuchuser)157 246.8 Q(,)-.4 E -(sam@matisse)193 258.8 Q -.25(ow)157 270.8 S(ner).25 E -(-unix-wizards: unix-wizards-request)-.2 E -(unix-wizards-request: eric@ucbarpa)157 282.8 Q -.1(wo)117 299 S .689(uld cause \231eric@ucbarpa\232 to get the error that will occur when someone sends to unix-wiz-) -.1 F(ards due to the inclusion of \231nosuchuser\232 on the list.)117 -311 Q .959(List o)142 327.2 R .959(wners also cause the en)-.25 F -.15 -(ve)-.4 G .959(lope sender address to be modi\214ed.).15 F .958 -(The contents of the)5.958 F -.25(ow)117 339.2 S .428 -(ner alias are used if the).25 F 2.928(yp)-.15 G .428 -(oint to a single user)-2.928 F 2.928(,o)-.4 G .429 -(therwise the name of the alias itself is used.)-2.928 F -.15(Fo)117 -351.2 S 3.455(rt).15 G .955(his reason, and to obe)-3.455 F 3.454(yI) --.15 G .954(nternet con)-3.454 F -.15(ve)-.4 G .954(ntions, the \231o) -.15 F(wner)-.25 E .954(-\232 address normally points at the)-.2 F .503(\231-request\232 address; this causes messages to go out with the typical Internet con) -117 363.2 R -.15(ve)-.4 G .504(ntion of using).15 F -.74(``)117 375.2 S -F2(list).74 E F1(-request')A 2.5('a)-.74 G 2.5(st)-2.5 G -(he return address.)-2.5 E F0 2.5(2.7. User)87 399.2 R(Inf)2.5 E -(ormation Database)-.25 E F1 1.06(If you ha)127 415.4 R 1.36 -.15 -(ve a ve)-.2 H 1.06(rsion of).15 F F2(sendmail)3.559 E F1 1.059 -(with the user information database compiled in, and you)3.559 F(ha)102 -427.4 Q 2.205 -.15(ve s)-.2 H 1.905 -(peci\214ed one or more databases using the).15 F F0(U)4.406 E F1 1.906 -(option, the databases will be searched for a)4.406 F F2(user)102 439.4 -Q F1(:maildrop entry)A 5(.I)-.65 G 2.5(ff)-5 G -(ound, the mail will be sent to the speci\214ed address.)-2.5 E F0 2.5 -(2.8. P)87 463.4 R(er)-.2 E(-User F)-.37 E(orwarding \(.f)-.25 E -(orward Files\))-.25 E F1 .121(As an alternati)127 479.6 R .421 -.15 -(ve t)-.25 H 2.621(ot).15 G .121(he alias database, an)-2.621 F 2.621 -(yu)-.15 G .12(ser may put a \214le with the name \231.forw)-2.621 F .12 -(ard\232 in his)-.1 F .205(or her home directory)102 491.6 R 5.205(.I) --.65 G 2.705(ft)-5.205 G .205(his \214le e)-2.705 F(xists,)-.15 E F2 -(sendmail)2.705 E F1 .205 -(redirects mail for that user to the list of addresses)2.705 F .909 -(listed in the .forw)102 503.6 R .908(ard \214le.)-.1 F -.15(Fo)5.908 G -3.408(re).15 G .908 -(xample, if the home directory for user \231mckusick\232 has a .forw) --3.558 F(ard)-.1 E(\214le with contents:)102 515.6 Q(mckusick@ernie)142 -531.8 Q(kirk@calder)142 543.8 Q(then an)102 560 Q 2.5(ym)-.15 G -(ail arri)-2.5 E(ving for \231mckusick\232 will be redirected to the speci\214ed accounts.) --.25 E(Actually)127 576.2 Q 3.374(,t)-.65 G .874(he con\214guration \214le de\214nes a sequence of \214lenames to check.) --3.374 F .875(By def)5.875 F .875(ault, this is)-.1 F .517(the user')102 -588.2 R 3.017(s.)-.55 G(forw)-3.017 E .517(ard \214le, b)-.1 F .517 -(ut can be de\214ned to be more generally using the)-.2 F F0 -.25(Fo) -3.017 G(rwardP).25 E(ath)-.1 E F1 3.016(option. If)3.016 F .182 -(you change this, you will ha)102 600.2 R .482 -.15(ve t)-.2 H 2.682(oi) -.15 G .182(nform your user base of the change; .forw)-2.682 F .183 -(ard is pretty well incor)-.1 F(-)-.2 E(porated into the collecti)102 -612.2 Q .3 -.15(ve s)-.25 H(ubconscious.).15 E F0 2.5(2.9. Special)87 -636.2 R(Header Lines)2.5 E F1(Se)127 652.4 Q -.15(ve)-.25 G 1.898 -(ral header lines ha).15 F 2.197 -.15(ve s)-.2 H 1.897 -(pecial interpretations de\214ned by the con\214guration \214le.).15 F -(Others)6.897 E(ha)102 664.4 Q 1.205 -.15(ve i)-.2 H .905 -(nterpretations b).15 F .905(uilt into)-.2 F F2(sendmail)3.405 E F1 .906 -(that cannot be changed without changing the code.)3.405 F(These)5.906 E --.2(bu)102 676.4 S(iltins are described here.).2 E .32 LW 76 686 72 686 -DL 80 686 76 686 DL 84 686 80 686 DL 88 686 84 686 DL 92 686 88 686 DL -96 686 92 686 DL 100 686 96 686 DL 104 686 100 686 DL 108 686 104 686 DL -112 686 108 686 DL 116 686 112 686 DL 120 686 116 686 DL 124 686 120 686 -DL 128 686 124 686 DL 132 686 128 686 DL 136 686 132 686 DL 140 686 136 -686 DL 144 686 140 686 DL 148 686 144 686 DL 152 686 148 686 DL 156 686 -152 686 DL 160 686 156 686 DL 164 686 160 686 DL 168 686 164 686 DL 172 -686 168 686 DL 176 686 172 686 DL 180 686 176 686 DL 184 686 180 686 DL -188 686 184 686 DL 192 686 188 686 DL 196 686 192 686 DL 200 686 196 686 -DL 204 686 200 686 DL 208 686 204 686 DL 212 686 208 686 DL 216 686 212 -686 DL/F4 5/Times-Roman@0 SF(11)93.6 696.4 Q/F5 8/Times-Roman@0 SF(The) -3.2 I/F6 8/Times-Bold@0 SF(AliasW)2 E(ait)-.52 E F5 -(option is required in the con\214guration for this action to occur)2 E -4(.T)-.44 G(his should normally be speci\214ed.)-4 E EP -%%Page: 19 15 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-19)195.86 E 2.5(2.9.1. Err)102 96 R(ors-T)-.18 E(o:)-.92 E/F1 10 -/Times-Roman@0 SF .22(If errors occur an)142 112.2 R .22(ywhere during processing, this header will cause error messages to go to) --.15 F(the listed addresses.)117 124.2 Q -(This is intended for mailing lists.)5 E .384(The Errors-T)142 140.4 R -.384(o: header w)-.8 F .384 -(as created in the bad old days when UUCP didn')-.1 F 2.885(tu)-.18 G -.385(nderstand the)-2.885 F .89(distinction between an en)117 152.4 R --.15(ve)-.4 G .89(lope and a header; this w).15 F .889(as a hack to pro) --.1 F .889(vide what should no)-.15 F 3.389(wb)-.25 G(e)-3.389 E .809 -(passed as the en)117 164.4 R -.15(ve)-.4 G .809(lope sender address.) -.15 F .809(It should go a)5.809 F -.1(wa)-.15 G 4.609 -.65(y. I).1 H -3.31(ti).65 G 3.31(so)-3.31 G .81(nly used if the)-3.31 F F0(UseErr)3.31 -E(orsT)-.18 E(o)-.92 E F1(option is set.)117 176.4 Q(The Errors-T)142 -192.6 Q(o: header is of)-.8 E(\214cially deprecated and will go a)-.25 E --.1(wa)-.15 G 2.5(yi).1 G 2.5(naf)-2.5 G(uture release.)-2.5 E F0 2.5 -(2.9.2. A)102 216.6 R(ppar)-.25 E(ently-T)-.18 E(o:)-.92 E F1 .045 -(RFC 822 requires at least one recipient \214eld \(T)142 232.8 R .045 -(o:, Cc:, or Bcc: line\) in e)-.8 F -.15(ve)-.25 G .044(ry message.).15 -F .044(If a)5.044 F .562 -(message comes in with no recipients listed in the message then)117 -244.8 R/F2 10/Times-Italic@0 SF(sendmail)3.062 E F1 .562 -(will adjust the header)3.062 F .085 -(based on the \231NoRecipientAction\232 option.)117 256.8 R .085 -(One of the possible actions is to add an \231)5.085 F(Apparently-)-.8 E --.8(To)117 268.8 S(:\232 header line for an).8 E 2.5(yr)-.15 G -(ecipients it is a)-2.5 E -.1(wa)-.15 G(re of.).1 E(The Apparently-T)142 -285 Q(o: header is non-standard and is deprecated.)-.8 E F0 2.5 -(2.9.3. Pr)102 309 R(ecedence)-.18 E F1 .425(The Precedence: header can be used as a crude control of message priority) -142 325.2 R 5.425(.I)-.65 G 2.925(tt)-5.425 G .425(weaks the)-2.925 F(sort order in the queue and can be con\214gured to change the message timeout v) -117 337.2 Q(alues.)-.25 E F0 2.5(2.10. IDENT)87 361.2 R(Pr)2.5 E -(otocol Support)-.18 E F2(Sendmail)127 377.4 Q F1 1.835 -(supports the IDENT protocol as de\214ned in RFC 1413.)4.335 F 1.835 -(Although this enhances)6.835 F .289 -(identi\214cation of the author of an email message by doing a `)102 -389.4 R .29(`call back')-.74 F 2.79('t)-.74 G 2.79(ot)-2.79 G .29 -(he originating system to)-2.79 F .469(include the o)102 401.4 R .469(wner of a particular TCP connection in the audit trail it is in no sense perfect; a deter) --.25 F(-)-.2 E 1.293(mined for)102 413.4 R 1.294 -(ger can easily spoof the IDENT protocol.)-.18 F 1.294(The follo)6.294 F -1.294(wing description is e)-.25 F 1.294(xcerpted from)-.15 F(RFC 1413:) -102 425.4 Q 2.5(6. Security)127 441.6 R(Considerations)2.5 E .006 -(The information returned by this protocol is at most as trustw)127 -457.8 R(orth)-.1 E 2.505(ya)-.05 G 2.505(st)-2.505 G .005(he host pro) --2.505 F .005(viding it OR)-.15 F .273(the or)127 469.8 R -.05(ga)-.18 G -.273(nization operating the host.).05 F -.15(Fo)5.273 G 2.773(re).15 G -.274(xample, a PC in an open lab has fe)-2.923 F 2.774(wi)-.25 G 2.774 -(fa)-2.774 G .574 -.15(ny c)-2.774 H(ontrols).15 E .987(on it to pre)127 -481.8 R -.15(ve)-.25 G .986(nt a user from ha).15 F .986 -(ving this protocol return an)-.2 F 3.486(yi)-.15 G .986 -(denti\214er the user w)-3.486 F 3.486(ants. Lik)-.1 F(e-)-.1 E 1.441(wise, if the host has been compromised the information returned may be completely erro-) -127 493.8 R(neous and misleading.)127 505.8 Q .521(The Identi\214cation Protocol is not intended as an authorization or access control protocol.) -127 522 R(At)5.52 E 1.036(best, it pro)127 534 R 1.037(vides some additional auditing information with respect to TCP connections.) --.15 F(At)6.037 E -.1(wo)127 546 S(rst, it can pro).1 E -(vide misleading, incorrect, or maliciously incorrect information.)-.15 -E 1.006(The use of the information returned by this protocol for other than auditing is strongly dis-) -127 562.2 R 2.697(couraged. Speci\214cally)127 574.2 R 2.697(,u)-.65 G -.197(sing Identi\214cation Protocol information to mak)-2.697 F 2.697 -(ea)-.1 G .197(ccess control deci-)-2.697 F .514(sions - either as the primary method \(i.e., no other checks\) or as an adjunct to other methods) -127 586.2 R(may result in a weak)127 598.2 Q -(ening of normal host security)-.1 E(.)-.65 E 1.778 -(An Identi\214cation serv)127 614.4 R 1.778(er may re)-.15 F -.15(ve) --.25 G 1.778(al information about users, entities, objects or processes) -.15 F .337(which might normally be considered pri)127 626.4 R -.25(va) --.25 G 2.836(te. An).25 F .336(Identi\214cation serv)2.836 F .336 -(er pro)-.15 F .336(vides service which)-.15 F .806 -(is a rough analog of the CallerID services pro)127 638.4 R .806 -(vided by some phone companies and man)-.15 F 3.306(yo)-.15 G(f)-3.306 E -1.398(the same pri)127 650.4 R -.25(va)-.25 G 1.698 -.15(cy c).25 H -1.398(onsiderations and ar).15 F 1.398 -(guments that apply to the CallerID service apply to)-.18 F 3.545 -(Identi\214cation. If)127 662.4 R 1.045(you w)3.545 F(ouldn')-.1 E 3.545 -(tr)-.18 G 1.045(un a "\214nger" serv)-3.545 F 1.046(er due to pri)-.15 -F -.25(va)-.25 G 1.346 -.15(cy c).25 H 1.046(onsiderations you may).15 F -(not w)127 674.4 Q(ant to run this protocol.)-.1 E .377 -(In some cases your system may not w)102 690.6 R .377 -(ork properly with IDENT support due to a b)-.1 F .376(ug in the TCP/IP) --.2 F 3.675(implementation. The)102 702.6 R 1.175(symptoms will be that for some hosts the SMTP connection will be closed) -3.675 F .566(almost immediately)102 714.6 R 5.566(.I)-.65 G 3.066(ft) --5.566 G .565(his is true or if you do not w)-3.066 F .565 -(ant to use IDENT)-.1 F 3.065(,y)-.74 G .565(ou should set the IDENT) --3.065 F EP -%%Page: 20 16 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-20 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF -(timeout to zero; this will disable the IDENT protocol.)102 96 Q F0 2.5 -(3. ARGUMENTS)72 120 R F1 .017(The complete list of ar)112 136.2 R .017 -(guments to)-.18 F/F2 10/Times-Italic@0 SF(sendmail)2.517 E F1 .017 -(is described in detail in Appendix A.)2.517 F .018(Some important)5.018 -F(ar)87 148.2 Q(guments are described here.)-.18 E F0 2.5(3.1. Queue)87 -172.2 R(Inter)2.5 E -.1(va)-.1 G(l).1 E F1 .455(The amount of time between forking a process to run through the queue is de\214ned by the) -127 188.4 R F0<ad71>2.955 E F1 2.675(\215ag. If)102 200.4 R .175 -(you run with deli)2.675 F -.15(ve)-.25 G .175(ry mode set to).15 F F0 -(i)2.675 E F1(or)2.675 E F0(b)2.675 E F1 .176(this can be relati)2.675 F --.15(ve)-.25 G .176(ly lar).15 F .176(ge, since it will only be rel-) --.18 F -.25(eva)102 212.4 S .207(nt when a host that w).25 F .207(as do) --.1 F .207(wn comes back up.)-.25 F .206(If you run in)5.207 F F0(q) -2.706 E F1 .206(mode it should be relati)2.706 F -.15(ve)-.25 G .206 -(ly short,).15 F 1.039(since it de\214nes the maximum amount of time that a message may sit in the queue.) -102 224.4 R 1.039(\(See also the)6.039 F(MinQueueAge option.\))102 236.4 -Q 1.336(RFC 1123 section 5.3.1.1 says that this v)127 252.6 R 1.335 -(alue should be at least 30 minutes \(although that)-.25 F -(probably doesn')102 264.6 Q 2.5(tm)-.18 G(ak)-2.5 E 2.5(es)-.1 G -(ense if you use `)-2.5 E(`queue-only')-.74 E 2.5('m)-.74 G(ode\).)-2.5 -E F0 2.5(3.2. Daemon)87 288.6 R(Mode)2.5 E F1 .084(If you allo)127 304.8 -R 2.584(wi)-.25 G .084(ncoming mail o)-2.584 F -.15(ve)-.15 G 2.585(ra) -.15 G 2.585(nI)-2.585 G .085(PC connection, you should ha)-2.585 F .385 --.15(ve a d)-.2 H .085(aemon running.).15 F(This)5.085 E .07 -(should be set by your)102 316.8 R F2(/etc/r)2.57 E(c)-.37 E F1 .07 -(\214le using the)2.57 F F0(\255bd)2.57 E F1 2.569(\215ag. The)2.57 F F0 -(\255bd)2.569 E F1 .069(\215ag and the)2.569 F F0<ad71>2.569 E F1 .069 -(\215ag may be combined)2.569 F(in one call:)102 328.8 Q -(/usr/sbin/sendmail \255bd \255q30m)142 345 Q .292(An alternati)127 -365.4 R .592 -.15(ve a)-.25 H .292(pproach is to in).15 F -.2(vo)-.4 G -.493 -.1(ke s).2 H .293(endmail from).1 F F2(inetd)2.793 E F1 .293 -(\(8\) \(use the)B F0(\255bs)2.793 E F1 .293(\215ag to ask sendmail) -2.793 F .255(to speak SMTP on its standard input and output\).)102 377.4 -R .255(This w)5.255 F .255(orks and allo)-.1 F .255(ws you to wrap)-.25 -F F2(sendmail)2.755 E F1 .255(in a)2.755 F 1.39(TCP wrapper program, b) -102 389.4 R 1.39(ut may be a bit slo)-.2 F 1.39 -(wer since the con\214guration \214le has to be re-read on)-.25 F -2.15 --.25(ev e)102 401.4 T .556(ry message that comes in.).25 F .556 -(If you do this, you still need to ha)5.556 F .856 -.15(ve a)-.2 H F2 -(sendmail)3.206 E F1 .555(running to \215ush the)3.055 F(queue:)102 -413.4 Q(/usr/sbin/sendmail \255q30m)142 429.6 Q F0 2.5(3.3. F)87 457.8 R -(or)-.25 E(cing the Queue)-.18 E F1 .04(In some cases you may \214nd that the queue has gotten clogged for some reason.) -127 474 R -1.1(Yo)5.04 G 2.54(uc)1.1 G .04(an force)-2.54 F 3.185(aq)102 -486 S .685(ueue run using the)-3.185 F F0<ad71>3.184 E F1 .684 -(\215ag \(with no v)3.184 F 3.184(alue\). It)-.25 F .684 -(is entertaining to use the)3.184 F F0<ad76>3.184 E F1 .684(\215ag \(v) -3.184 F .684(erbose\) when)-.15 F(this is done to w)102 498 Q -(atch what happens:)-.1 E(/usr/sbin/sendmail \255q \255v)142 514.2 Q --1.1(Yo)127 534.6 S 4.004(uc)1.1 G 1.504 -(an also limit the jobs to those with a particular queue identi\214er) --4.004 F 4.004(,s)-.4 G(ender)-4.004 E 4.004(,o)-.4 G 4.004(rr)-4.004 G -(ecipient)-4.004 E .687(using one of the queue modi\214ers.)102 546.6 R --.15(Fo)5.687 G 3.187(re).15 G .687(xample, \231\255qRberk)-3.337 F(ele) --.1 E .686(y\232 restricts the queue run to jobs that)-.15 F(ha)102 -558.6 Q .525 -.15(ve t)-.2 H .225(he string \231berk).15 F(ele)-.1 E -.225(y\232 some)-.15 F .225(where in one of the recipient addresses.) --.25 F(Similarly)5.226 E 2.726<2c99>-.65 G .226(\255qSstring\232 lim-) --2.726 F(its the run to particular senders and \231\255qIstring\232 limits it to particular queue identi\214ers.) -102 570.6 Q F0 2.5(3.4. Deb)87 594.6 R(ugging)-.2 E F1 1.365 -(There are a f)127 610.8 R 1.365(airly lar)-.1 F 1.365(ge number of deb) --.18 F 1.365(ug \215ags b)-.2 F 1.365(uilt into)-.2 F F2(sendmail)3.865 -E F1 6.365(.E)C 1.365(ach deb)-6.365 F 1.365(ug \215ag has a)-.2 F 1.116 -(number and a le)102 622.8 R -.15(ve)-.25 G 1.116(l, where higher le).15 -F -.15(ve)-.25 G 1.116(ls means to print out more information.).15 F -1.116(The con)6.116 F -.15(ve)-.4 G 1.116(ntion is).15 F .294(that le) -102 634.8 R -.15(ve)-.25 G .294(ls greater than nine are \231absurd,).15 -F 2.794<9a69>-.7 G .294(.e., the)-2.794 F 2.794(yp)-.15 G .293 -(rint out so much information that you w)-2.794 F(ouldn')-.1 E(t)-.18 E -.691(normally w)102 646.8 R .692(ant to see them e)-.1 F .692 -(xcept for deb)-.15 F .692(ugging that particular piece of code.)-.2 F -(Deb)5.692 E .692(ug \215ags are set)-.2 F(using the)102 658.8 Q F0 -<ad64>2.5 E F1(option; the syntax is:)2.5 E EP -%%Page: 21 17 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-21)195.86 E/F1 10/Times-Roman@0 SF(deb)142 96 Q(ug-\215ag:)-.2 E -F0<ad64>12.78 E F1(deb)2.5 E(ug-list)-.2 E(deb)142 108 Q 13.05 -(ug-list: deb)-.2 F(ug-option [ , deb)-.2 E(ug-option ]*)-.2 E(deb)142 -120 Q -.28(ug-option: deb)-.2 F(ug-range [ . deb)-.2 E(ug-le)-.2 E -.15 -(ve)-.25 G 2.5(l]).15 G(deb)142 132 Q 3.07(ug-range: inte)-.2 F -(ger | inte)-.15 E(ger \255 inte)-.15 E(ger)-.15 E(deb)142 144 Q(ug-le) --.2 E -.15(ve)-.25 G 6.24(l: inte).15 F(ger)-.15 E -(where spaces are for reading ease only)102 160.2 Q 5(.F)-.65 G(or e) --5.15 E(xample,)-.15 E 34.99(\255d12 Set)142 176.4 R(\215ag 12 to le)2.5 -E -.15(ve)-.25 G 2.5(l1).15 G 27.49(\255d12.3 Set)142 188.4 R -(\215ag 12 to le)2.5 E -.15(ve)-.25 G 2.5(l3).15 G 24.35 -(\255d3\25517 Set)142 200.4 R(\215ags 3 through 17 to le)2.5 E -.15(ve) --.25 G 2.5(l1).15 G 16.85(\255d3\25517.4 Set)142 212.4 R -(\215ags 3 through 17 to le)2.5 E -.15(ve)-.25 G 2.5(l4).15 G -.15(Fo) -102 228.6 S 4.066(rac).15 G 1.566(omplete list of the a)-4.066 F -.25 -(va)-.2 G 1.565(ilable deb).25 F 1.565(ug \215ags you will ha)-.2 F -1.865 -.15(ve t)-.2 H 4.065(ol).15 G 1.565(ook at the code \(the)-4.065 -F 4.065(ya)-.15 G 1.565(re too)-4.065 F(dynamic to k)102 240.6 Q -(eep this documentation up to date\).)-.1 E F0 2.5(3.5. Changing)87 -264.6 R(the V)2.5 E(alues of Options)-.92 E F1(Options can be o)127 -280.8 Q -.15(ve)-.15 G(rridden using the).15 E F0<ad6f>2.5 E F1(or)2.5 E -F0<ad4f>2.5 E F1(command line \215ags.)2.5 E -.15(Fo)5 G 2.5(re).15 G -(xample,)-2.65 E(/usr/sbin/sendmail \255oT2m)142 297 Q .02(sets the)102 -313.2 R F0(T)2.52 E F1 .02(\(timeout\) option to tw)2.52 F 2.52(om)-.1 G -.021(inutes for this run only; the equi)-2.52 F -.25(va)-.25 G .021 -(lent line using the long option).25 F(name is)102 325.2 Q -(/usr/sbin/sendmail -O)142 341.4 Q -.35(Ti)-.4 G(meout.queuereturn=2m) -.35 E .72(Some options ha)127 361.8 R 1.02 -.15(ve s)-.2 H .72 -(ecurity implications.).15 F .72(Sendmail allo)5.72 F .72 -(ws you to set these, b)-.25 F .72(ut relinquishes)-.2 F -(its setuid root permissions thereafter)102 375.8 Q/F2 7/Times-Roman@0 -SF(12)-4 I F1(.)4 I F0 2.5(3.6. T)87 399.8 R(rying a Differ)-.74 E -(ent Con\214guration File)-.18 E F1(An alternati)127 416 Q .3 -.15(ve c) --.25 H(on\214guration \214le can be speci\214ed using the).15 E F0<ad43> -2.5 E F1(\215ag; for e)2.5 E(xample,)-.15 E -(/usr/sbin/sendmail \255Ctest.cf \255oQ/tmp/mqueue)142 432.2 Q .429 -(uses the con\214guration \214le)102 448.4 R/F3 10/Times-Italic@0 SF -(test.cf)2.928 E F1 .428(instead of the def)2.928 F(ault)-.1 E F3 -(/etc/sendmail.cf)2.928 E(.)-.15 E F1 .428(If the)5.428 F F0<ad43>2.928 -E F1 .428(\215ag has no v)2.928 F(alue)-.25 E(it def)102 460.4 Q -(aults to)-.1 E F3(sendmail.cf)2.5 E F1(in the current directory)2.5 E -(.)-.65 E F3(Sendmail)127 476.6 Q F1(gi)2.679 E -.15(ve)-.25 G 2.679(su) -.15 G 2.679(pi)-2.679 G .18(ts setuid root permissions when you use this \215ag, so it is common to use a) --2.679 F .069(publicly writable directory \(such as /tmp\) as the spool directory \(QueueDirectory or Q option\) while) -102 488.6 R(testing.)102 500.6 Q F0 2.5(3.7. Logging)87 524.6 R -.74(Tr) -2.5 G(af\214c).74 E F1(Man)127 540.8 Q 3.254(yS)-.15 G .754 -(MTP implementations do not fully implement the protocol.)-3.254 F -.15 -(Fo)5.754 G 3.254(re).15 G .755(xample, some per)-3.404 F(-)-.2 E 1.178 -(sonal computer based SMTPs do not understand continuation lines in reply codes.) -102 552.8 R 1.177(These can be)6.178 F -.15(ve)102 564.8 S .13 -(ry hard to trace.).15 F .13 -(If you suspect such a problem, you can set traf)5.13 F .13 -(\214c logging using the)-.25 F F0<ad58>2.63 E F1 2.63(\215ag. F)2.63 F -(or)-.15 E -.15(ex)102 576.8 S(ample,).15 E -(/usr/sbin/sendmail \255X /tmp/traf)142 593 Q(\214c \255bd)-.25 E -(will log all traf)102 609.2 Q(\214c in the \214le)-.25 E F3(/tmp/tr)2.5 -E(af)-.15 E<8c63>-.18 E F1(.)A .998(This logs a lot of data v)127 625.4 -R .997(ery quickly and should)-.15 F F0(NEVER)3.497 E F1 .997 -(be used during normal operations.)3.497 F .962(After starting up such a daemon, force the errant implementation to send a message to your host.) -102 637.4 R .609(All message traf)102 649.4 R .609(\214c in and out of) --.25 F F3(sendmail)3.109 E F1 3.109(,i)C .609 -(ncluding the incoming SMTP traf)-3.109 F .608(\214c, will be logged in) --.25 F(this \214le.)102 661.4 Q .32 LW 76 671 72 671 DL 80 671 76 671 DL -84 671 80 671 DL 88 671 84 671 DL 92 671 88 671 DL 96 671 92 671 DL 100 -671 96 671 DL 104 671 100 671 DL 108 671 104 671 DL 112 671 108 671 DL -116 671 112 671 DL 120 671 116 671 DL 124 671 120 671 DL 128 671 124 671 -DL 132 671 128 671 DL 136 671 132 671 DL 140 671 136 671 DL 144 671 140 -671 DL 148 671 144 671 DL 152 671 148 671 DL 156 671 152 671 DL 160 671 -156 671 DL 164 671 160 671 DL 168 671 164 671 DL 172 671 168 671 DL 176 -671 172 671 DL 180 671 176 671 DL 184 671 180 671 DL 188 671 184 671 DL -192 671 188 671 DL 196 671 192 671 DL 200 671 196 671 DL 204 671 200 671 -DL 208 671 204 671 DL 212 671 208 671 DL 216 671 212 671 DL/F4 5 -/Times-Roman@0 SF(12)93.6 681.4 Q/F5 8/Times-Roman@0 SF .497 -(That is, it sets its ef)3.2 J(fecti)-.2 E .737 -.12(ve u)-.2 H .497 -(id to the real uid; thus, if you are e).12 F -.12(xe)-.12 G .497 -(cuting as root, as from root').12 F 2.497(sc)-.44 G .497 -(rontab \214le or during system)-2.497 F -(startup the root permissions will still be honored.)72 694.2 Q EP -%%Page: 22 18 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-22 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E 2.5(3.8. T)87 96 R -(esting Con\214guration Files)-.92 E/F1 10/Times-Roman@0 SF .643 -(When you b)127 112.2 R .644(uild a con\214guration table, you can do a certain amount of testing using the \231test) --.2 F(mode\232 of)102 124.2 Q/F2 10/Times-Italic@0 SF(sendmail)2.5 E F1 -5(.F)C(or e)-5.15 E(xample, you could in)-.15 E -.2(vo)-.4 G -.1(ke).2 G -F2(sendmail)2.6 E F1(as:)2.5 E(sendmail \255bt \255Ctest.cf)142 140.4 Q -.448(which w)102 156.6 R .448(ould read the con\214guration \214le \231test.cf\232 and enter test mode.) --.1 F .447(In this mode, you enter lines)5.447 F(of the form:)102 168.6 -Q(rwset address)142 184.8 Q(where)102 201 Q F2(rwset)3.006 E F1 .506 -(is the re)3.006 F .506(writing set you w)-.25 F .506(ant to use and)-.1 -F F2(addr)3.007 E(ess)-.37 E F1 .507(is an address to apply the set to.) -3.007 F -.7(Te)5.507 G(st).7 E .794(mode sho)102 213 R .794 -(ws you the steps it tak)-.25 F .794(es as it proceeds, \214nally sho) --.1 F .794(wing you the address it ends up with.)-.25 F -1.1(Yo)102 225 -S 3.331(um)1.1 G .832(ay use a comma separated list of rwsets for sequential application of rules to an input.) --3.331 F -.15(Fo)5.832 G(r).15 E -.15(ex)102 237 S(ample:).15 E -(3,1,21,4 monet:bollard)142 253.2 Q .622 -(\214rst applies ruleset three to the input \231monet:bollard.)102 269.4 -R 5.622<9a52>-.7 G .622(uleset one is then applied to the output of) --5.622 F(ruleset three, follo)102 281.4 Q -(wed similarly by rulesets twenty-one and four)-.25 E(.)-.55 E 1.084(If you need more detail, you can also use the \231\255d21\232 \215ag to turn on more deb) -127 297.6 R 3.585(ugging. F)-.2 F(or)-.15 E -.15(ex)102 309.6 S(ample,) -.15 E(sendmail \255bt \255d21.99)142 325.8 Q .689 -(turns on an incredible amount of information; a single w)102 342 R .688 -(ord address is probably going to print out)-.1 F(se)102 354 Q -.15(ve) --.25 G(ral pages w).15 E(orth of information.)-.1 E -1.1(Yo)127 370.2 S -2.574(us)1.1 G .074(hould be w)-2.574 F .074(arned that internally)-.1 F -(,)-.65 E F2(sendmail)2.575 E F1 .075 -(applies ruleset 3 to all addresses.)2.575 F .075(In test mode)5.075 F -(you will ha)102 382.2 Q .3 -.15(ve t)-.2 H 2.5(od).15 G 2.5(ot)-2.5 G -(hat manually)-2.5 E 5(.F)-.65 G(or e)-5.15 E(xample, older v)-.15 E -(ersions allo)-.15 E(wed you to use)-.25 E 2.5(0b)142 398.4 S -(ruce@broadcast.son)-2.5 E -.65(y.)-.15 G(com).65 E(This v)102 414.6 Q -(ersion requires that you use:)-.15 E(3,0 bruce@broadcast.son)142 430.8 -Q -.65(y.)-.15 G(com).65 E(As of v)127 451.2 Q -(ersion 8.7, some other syntax)-.15 E(es are a)-.15 E -.25(va)-.2 G -(ilable in test mode:).25 E 5<832e>107 467.4 S 1.666(Dxv)-5 G .328 -(alue de\214nes macro)-1.916 F F2(x)2.828 E F1 .328(to ha)2.828 F .628 --.15(ve t)-.2 H .328(he indicated).15 F F2(value)2.828 E F1 5.328(.T)C -.328(his is useful when deb)-5.328 F .327(ugging rules that)-.2 F -(use the)115.5 479.4 Q F0($&)2.5 E F2(x)A F1(syntax.)2.5 E 5<832e>107 -491.4 S 1.666(Ccv)-5 G(alue adds the indicated)-1.916 E F2(value)2.5 E -F1(to class)2.5 E F2(c)2.5 E F1(.)A 5<832e>107 503.4 S 1.666(Sr)-5 G -(uleset dumps the contents of the indicated ruleset.)-1.666 E 5<83ad>107 -515.4 S 1.666(dd)-5 G(eb)-1.666 E(ug-spec is equi)-.2 E -.25(va)-.25 G -(lent to the command-line \215ag.).25 E F0 2.5(3.9. P)87 539.4 R -(ersistent Host Status Inf)-.2 E(ormation)-.25 E F1(When)127 555.6 Q F0 -(HostStatusDir)2.569 E(ectory)-.18 E F1 .069 -(is enabled, information about the status of hosts is maintained on) -2.569 F .249(disk and can thus be shared between dif)102 567.6 R .249 -(ferent instantiations of)-.25 F F2(sendmail)2.749 E F1 5.249(.T)C .248 -(he status of the last con-)-5.249 F -(nection with each remote host may be vie)102 579.6 Q -(wed with the command:)-.25 E(sendmail \255bh)142 595.8 Q -(This information may be \215ushed with the command:)102 612 Q -(sendmail \255bH)142 628.2 Q 1.534(Flushing the information pre)102 -644.4 R -.15(ve)-.25 G 1.534(nts ne).15 F(w)-.25 E F2(sendmail)4.034 E -F1 1.535(processes from loading it, b)4.035 F 1.535(ut does not pre)-.2 -F -.15(ve)-.25 G(nt).15 E -.15(ex)102 656.4 S -(isting processes from using the status information that the).15 E 2.5 -(ya)-.15 G(lready ha)-2.5 E -.15(ve)-.2 G(.).15 E F0 2.5(4. TUNING)72 -680.4 R F1 1.922 -(There are a number of con\214guration parameters you may w)112 696.6 R -1.922(ant to change, depending on the)-.1 F .366 -(requirements of your site.)87 708.6 R .367 -(Most of these are set using an option in the con\214guration \214le.) -5.366 F -.15(Fo)5.367 G 2.867(re).15 G(xample,)-3.017 E -(the line \231O T)87 720.6 Q -(imeout.queuereturn=5d\232 sets option \231T)-.35 E -(imeout.queuereturn\232 to the v)-.35 E(alue \2315d\232 \(\214v)-.25 E -2.5(ed)-.15 G(ays\).)-2.5 E EP -%%Page: 23 19 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-23)195.86 E/F1 10/Times-Roman@0 SF .735 -(Most of these options ha)112 96 R 1.035 -.15(ve a)-.2 H .735 -(ppropriate def).15 F .735(aults for most sites.)-.1 F(Ho)5.735 E(we) --.25 E -.15(ve)-.25 G 1.535 -.4(r, s).15 H .735(ites ha).4 F .735 -(ving v)-.2 F .735(ery high)-.15 F .045(mail loads may \214nd the)87 108 -R 2.545(yn)-.15 G .046 -(eed to tune them as appropriate for their mail load.)-2.545 F .046 -(In particular)5.046 F 2.546(,s)-.4 G .046(ites e)-2.546 F(xperi-)-.15 E -1.088(encing a lar)87 120 R 1.088(ge number of small messages, man)-.18 -F 3.588(yo)-.15 G 3.587(fw)-3.588 G 1.087(hich are deli)-3.587 F -.15 -(ve)-.25 G 1.087(red to man).15 F 3.587(yr)-.15 G 1.087 -(ecipients, may \214nd)-3.587 F(that the)87 132 Q 2.5(yn)-.15 G -(eed to adjust the parameters dealing with queue priorities.)-2.5 E .523 -(All v)112 148.2 R .523(ersions of)-.15 F/F2 10/Times-Italic@0 SF -(sendmail)3.023 E F1 .524 -(prior to 8.7 had single character option names.)3.023 F .524 -(As of 8.7, options ha)5.524 F -.15(ve)-.2 G 1.216 -(long \(multi-character names\).)87 160.2 R 1.216 -(Although old short names are still accepted, most ne)6.216 F 3.715(wo) --.25 G 1.215(ptions do not)-3.715 F(ha)87 172.2 Q .3 -.15(ve s)-.2 H -(hort equi).15 E -.25(va)-.25 G(lents.).25 E .802 -(This section only describes the options you are most lik)112 188.4 R -.802(ely to w)-.1 F .802(ant to tweak; read section 5 for)-.1 F -(more details.)87 200.4 Q F0 2.5(4.1. T)87 224.4 R(imeouts)-.18 E F1 -.583(All time interv)127 240.6 R .583 -(als are set using a scaled syntax.)-.25 F -.15(Fo)5.583 G 3.083(re).15 -G .583(xample, \23110m\232 represents ten minutes,)-3.233 F -(whereas \2312h30m\232 represents tw)102 252.6 Q 2.5(oa)-.1 G -(nd a half hours.)-2.5 E(The full set of scales is:)5 E 16.11(ss)142 -268.8 S(econds)-16.11 E 12.22(mm)142 280.8 S(inutes)-12.22 E 15(hh)142 -292.8 S(ours)-15 E 15(dd)142 304.8 S(ays)-15 E 12.78(ww)142 316.8 S -(eeks)-12.78 E F0 2.5(4.1.1. Queue)102 345 R(inter)2.5 E -.1(va)-.1 G(l) -.1 E F1 .18(The ar)142 361.2 R .18(gument to the)-.18 F F0<ad71>2.68 E -F1 .18(\215ag speci\214es ho)2.68 F 2.68(wo)-.25 G .18 -(ften a sub-daemon will run the queue.)-2.68 F .18(This is)5.18 F .968 -(typically set to between \214fteen minutes and one hour)117 373.2 R -5.968(.R)-.55 G .967(FC 1123 section 5.3.1.1 recommends)-5.968 F -(that this be at least 30 minutes.)117 385.2 Q F0 2.5(4.1.2. Read)102 -409.2 R(timeouts)2.5 E F1 -.35(Ti)142 425.4 S 1.052(meouts all ha).35 F -1.352 -.15(ve o)-.2 H 1.052(ption names \231T).15 F(imeout.)-.35 E F2 -(suboption)A F1 3.552(\232. The)B(recognized)3.552 E F2(suboption)3.553 -E F1 1.053(s, their)B(def)117 437.4 Q(ault v)-.1 E -(alues, and the minimum v)-.25 E(alues allo)-.25 E -(wed by RFC 1123 section 5.3.2 are:)-.25 E 38.4(connect The)117 453.6 R -.161(time to w)2.661 F .161(ait for an SMTP connection to open \(the)-.1 -F F2(connect)2.66 E F1 .16(\(2\) system call\))B 1.153 -([0, unspeci\214ed].)189 465.6 R 1.153(If zero, uses the k)6.153 F 1.153 -(ernel def)-.1 F 3.653(ault. In)-.1 F 1.153(no case can this option) -3.653 F -.15(ex)189 477.6 S .519(tend the timeout longer than the k).15 -F .518(ernel pro)-.1 F .518(vides, b)-.15 F .518(ut it can shorten it.) --.2 F(This)5.518 E .579(is to get around k)189 489.6 R .579 -(ernels that pro)-.1 F .579 -(vide an absurdly long connection timeout \(90)-.15 F -(minutes in one case\).)189 501.6 Q 35.62(iconnect The)117 517.8 R .311 -(same as)2.811 F F2(connect,)2.811 E F1 -.15(ex)2.811 G .311 -(cept it applies only to the initial attempt to connect to).15 F 2.75 -(ah)189 529.8 S .25(ost for a gi)-2.75 F -.15(ve)-.25 G 2.75(nm).15 G -.25(essage [0, unspeci\214ed].)-2.75 F .25 -(The concept is that this should be)5.25 F -.15(ve)189 541.8 S .767 -(ry short \(a fe).15 F 3.267(ws)-.25 G .767 -(econds\); hosts that are well connected and responsi)-3.267 F 1.066 --.15(ve w)-.25 H(ill).15 E .026(thus be serviced immediately)189 553.8 R -5.026(.H)-.65 G .026(osts that are slo)-5.026 F 2.526(ww)-.25 G .026 -(ill not hold up other deli)-2.526 F(v-)-.25 E -(eries in the initial deli)189 565.8 Q -.15(ve)-.25 G(ry attempt.).15 E -46.16(initial The)117 582 R -.1(wa)2.5 G -(it for the initial 220 greeting message [5m, 5m].).1 E 52.28(helo The) -117 598.2 R -.1(wa)4.227 G 1.727 -(it for a reply from a HELO or EHLO command [5m, unspeci\214ed].).1 F .1 -(This may require a host name lookup, so \214v)189 610.2 R 2.6(em)-.15 G -.1(inutes is probably a reasonable)-2.6 F(minimum.)189 622.2 Q 46.72 -(mail\207 The)117 638.4 R -.1(wa)2.5 G -(it for a reply from a MAIL command [10m, 5m].).1 E 48.95(rcpt\207 The) -117 654.6 R -.1(wa)3.482 G .982 -(it for a reply from a RCPT command [1h, 5m].).1 F .981 -(This should be long)5.981 F 1.556 -(because it could be pointing at a list that tak)189 666.6 R 1.556 -(es a long time to e)-.1 F 1.556(xpand \(see)-.15 F(belo)189 678.6 Q -(w\).)-.25 E 34.5(datainit\207 The)117 694.8 R -.1(wa)2.5 G -(it for a reply from a D).1 E -1.21 -1.11(AT A)-.4 H(command [5m, 2m].) -3.61 E 25.62(datablock\207 The)117 711 R -.1(wa)2.696 G .196 -(it for reading a data block \(that is, the body of the message\).).1 F -.196([1h, 3m].)5.196 F 2.686(This should be long because it also applies to programs piping input to) -189 723 R EP -%%Page: 24 20 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-24 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Italic@0 SF -(sendmail)189 96 Q/F2 10/Times-Roman@0 SF(which ha)2.5 E .3 -.15(ve n) --.2 H 2.5(og).15 G(uarantee of promptness.)-2.5 E 30.06 -(data\214nal\207 The)117 112.2 R -.1(wa)2.806 G .306 -(it for a reply from the dot terminating a message.).1 F .306 -([1h, 10m].)5.306 F .306(If this is)5.306 F .883 -(shorter than the time actually needed for the recei)189 124.2 R -.15 -(ve)-.25 G 3.384(rt).15 G 3.384(od)-3.384 G(eli)-3.384 E -.15(ve)-.25 G -3.384(rt).15 G .884(he message,)-3.384 F(duplicates will be generated.) -189 136.2 Q(This is discussed in RFC 1047.)5 E 55.06(rset The)117 152.4 -R -.1(wa)2.5 G(it for a reply from a RSET command [5m, unspeci\214ed].) -.1 E 53.94(quit The)117 168.6 R -.1(wa)2.5 G(it for a reply from a Q).1 -E(UIT command [2m, unspeci\214ed].)-.1 E 50.61(misc The)117 184.8 R -.1 -(wa)2.761 G .261(it for a reply from miscellaneous \(b).1 F .261 -(ut short\) commands such as NOOP)-.2 F -(\(no-operation\) and VERB \(go into v)189 196.8 Q(erbose mode\).)-.15 E -([2m, unspeci\214ed].)5 E 25.06(command\207 In)117 213 R(serv)2.5 E -(er SMTP)-.15 E 2.5(,t)-1.11 G(he time to w)-2.5 E -(ait for another command.)-.1 E([1h, 5m].)5 E 49.5(ident The)117 231.2 R -(timeout w)2.5 E(aiting for a reply to an IDENT query [30s)-.1 E/F3 7 -/Times-Roman@0 SF(13)-4 I F2 2.5(,u)4 K(nspeci\214ed].)-2.5 E 37.28 -(\214leopen The)117 247.4 R(timeout for opening .forw)2.5 E -(ard and :include: \214les [60s, none].)-.1 E 30.05(hoststatus Ho)117 -263.6 R 4.141(wl)-.25 G 1.642 -(ong status information about a host \(e.g., host do)-4.141 F 1.642 -(wn\) will be cached)-.25 F -(before it is considered stale [30m, unspeci\214ed].)189 275.6 Q -.15 -(Fo)117 291.8 S 4.609(rc).15 G 2.109 -(ompatibility with old con\214guration \214les, if no)-4.609 F F1 -(suboption)4.608 E F2 2.108(is speci\214ed, all the timeouts)4.608 F -(mark)117 303.8 Q(ed with \207 are set to the indicated v)-.1 E(alue.) --.25 E(Man)142 320 Q 2.5(yo)-.15 G 2.5(ft)-2.5 G(he RFC 1123 minimum v) --2.5 E .001(alues may well be too short.)-.25 F F1(Sendmail)5.001 E F2 --.1(wa)2.501 G 2.501(sd).1 G .001(esigned to)-2.501 F .712 -(the RFC 822 protocols, which did not specify read timeouts; hence, v) -117 332 R .711(ersions of)-.15 F F1(sendmail)3.211 E F2(prior)3.211 E -.864(to v)117 344 R .865 -(ersion 8.1 did not guarantee to reply to messages promptly)-.15 F 5.865 -(.I)-.65 G 3.365(np)-5.865 G(articular)-3.365 E 3.365(,a\231)-.4 G .865 -(RCPT\232 com-)-3.365 F .061(mand specifying a mailing list will e)117 -356 R .061(xpand and v)-.15 F .06(erify the entire list; a lar)-.15 F -.06(ge list on a slo)-.18 F 2.56(ws)-.25 G(ystem)-2.56 E .436 -(may easily tak)117 370 R 2.936(em)-.1 G .436(ore than \214v)-2.936 F -2.936(em)-.15 G(inutes)-2.936 E F3(14)-4 I F2 5.436(.I)4 K .435 -(recommend a one hour timeout \212 since a commu-)-2.5 F 1.365 -(nications f)117 382 R 1.366(ailure during the RCPT phase is rare, a long timeout is not onerous and may ulti-) --.1 F(mately help reduce netw)117 394 Q -(ork load and duplicated messages.)-.1 E -.15(Fo)142 410.2 S 2.5(re).15 -G(xample, the lines:)-2.65 E 2.5(OT)157 426.4 S(imeout.command=25m)-2.85 -E 2.5(OT)157 438.4 S(imeout.datablock=3h)-2.85 E .344(sets the serv)117 -454.6 R .344(er SMTP command timeout to 25 minutes and the input data block timeout to three) --.15 F(hours.)117 466.6 Q F0 2.5(4.1.3. Message)102 490.6 R(timeouts)2.5 -E F2 .237(After sitting in the queue for a fe)142 506.8 R 2.737(wd)-.25 -G .237(ays, a message will time out.)-2.737 F .238 -(This is to insure that at)5.238 F .568(least the sender is a)117 518.8 -R -.1(wa)-.15 G .568(re of the inability to send a message.).1 F .567 -(The timeout is typically set to \214v)5.568 F(e)-.15 E 2.599(days. It) -117 530.8 R .099(is sometimes considered con)2.599 F -.15(ve)-.4 G .099 -(nient to also send a w).15 F .1(arning message if the message is in)-.1 -F .176(the queue longer than a fe)117 542.8 R 2.675(wh)-.25 G .175 -(ours \(assuming you normally ha)-2.675 F .475 -.15(ve g)-.2 H .175 -(ood connecti).15 F .175(vity; if your mes-)-.25 F .645 -(sages normally took se)117 554.8 R -.15(ve)-.25 G .645 -(ral hours to send you w).15 F(ouldn')-.1 E 3.145(tw)-.18 G .645 -(ant to do this because it w)-3.245 F(ouldn')-.1 E 3.145(tb)-.18 G(e) --3.145 E .058(an unusual e)117 566.8 R -.15(ve)-.25 G 2.558(nt\). These) -.15 F .057(timeouts are set using the)2.557 F F0 -.18(Ti)2.557 G -(meout.queuer).18 E(etur)-.18 E(n)-.15 E F2(and)2.557 E F0 -.18(Ti)2.557 -G(meout.queue-).18 E(war)117 578.8 Q(n)-.15 E F2 -(options in the con\214guration \214le \(pre)2.5 E -(viously both were set using the)-.25 E F0(T)2.5 E F2(option\).)2.5 E -.106(Since these options are global, and since you can not kno)142 595 R -(w)-.25 E F1 2.606(ap)2.606 G(riori)-2.606 E F2(ho)2.607 E 2.607(wl)-.25 -G .107(ong another host)-2.607 F .476(outside your domain will be do)117 -607 R .475(wn, a \214v)-.25 F 2.975(ed)-.15 G .475 -(ay timeout is recommended.)-2.975 F .475(This allo)5.475 F .475 -(ws a recipient)-.25 F 1.579(to \214x the problem e)117 619 R -.15(ve) --.25 G 4.079(ni).15 G 4.079(fi)-4.079 G 4.079(to)-4.079 G 1.579 -(ccurs at the be)-4.079 F 1.58(ginning of a long week)-.15 F 4.08 -(end. RFC)-.1 F 1.58(1123 section)4.08 F -(5.3.1.1 says that this parameter should be `)117 631 Q -(`at least 4\2555 days')-.74 E('.)-.74 E .32 LW 76 655.6 72 655.6 DL 80 -655.6 76 655.6 DL 84 655.6 80 655.6 DL 88 655.6 84 655.6 DL 92 655.6 88 -655.6 DL 96 655.6 92 655.6 DL 100 655.6 96 655.6 DL 104 655.6 100 655.6 -DL 108 655.6 104 655.6 DL 112 655.6 108 655.6 DL 116 655.6 112 655.6 DL -120 655.6 116 655.6 DL 124 655.6 120 655.6 DL 128 655.6 124 655.6 DL 132 -655.6 128 655.6 DL 136 655.6 132 655.6 DL 140 655.6 136 655.6 DL 144 -655.6 140 655.6 DL 148 655.6 144 655.6 DL 152 655.6 148 655.6 DL 156 -655.6 152 655.6 DL 160 655.6 156 655.6 DL 164 655.6 160 655.6 DL 168 -655.6 164 655.6 DL 172 655.6 168 655.6 DL 176 655.6 172 655.6 DL 180 -655.6 176 655.6 DL 184 655.6 180 655.6 DL 188 655.6 184 655.6 DL 192 -655.6 188 655.6 DL 196 655.6 192 655.6 DL 200 655.6 196 655.6 DL 204 -655.6 200 655.6 DL 208 655.6 204 655.6 DL 212 655.6 208 655.6 DL 216 -655.6 212 655.6 DL/F4 5/Times-Roman@0 SF(13)93.6 666 Q/F5 8 -/Times-Roman@0 SF(On some systems the def)3.2 I -(ault is zero to turn the protocol of)-.08 E 2(fe)-.2 G(ntirely)-2 E(.) --.52 E F4(14)93.6 679.6 Q F5 .212(This v)3.2 J .212 -(eri\214cation includes looking up e)-.12 F -.12(ve)-.2 G .212 -(ry address with the name serv).12 F .212(er; this in)-.12 F -.16(vo) --.32 G(lv).16 E .212(es netw)-.12 F .213 -(ork delays, and can in some cases)-.08 F(can be considerable.)72 692.4 -Q EP -%%Page: 25 21 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-25)195.86 E/F1 10/Times-Roman@0 SF(The)142 96 Q F0 -.18(Ti)2.923 -G(meout.queuewar).18 E(n)-.15 E F1 -.25(va)2.923 G .423 -(lue can be piggyback).25 F .422(ed on the)-.1 F F0(T)2.922 E F1 .422 -(option by indicating a time)2.922 F .845(after which a w)117 108 R .845 -(arning message should be sent; the tw)-.1 F 3.346(ot)-.1 G .846 -(imeouts are separated by a slash.)-3.346 F -.15(Fo)5.846 G(r).15 E -.15 -(ex)117 120 S(ample, the line).15 E -.4(OT)157 136.2 S(5d/4h).4 E .972 -(causes email to f)117 152.4 R .971(ail after \214v)-.1 F 3.471(ed)-.15 -G .971(ays, b)-3.471 F .971(ut a w)-.2 F .971 -(arning message will be sent after four hours.)-.1 F(This)5.971 E -(should be lar)117 164.4 Q(ge enough that the message will ha)-.18 E .3 --.15(ve b)-.2 H(een tried se).15 E -.15(ve)-.25 G(ral times.).15 E F0 -2.5(4.2. F)87 188.4 R(orking During Queue Runs)-.25 E F1 .848 -(By setting the)127 204.6 R F0 -.25(Fo)3.348 G(rkEachJ).25 E(ob)-.15 E -F1(\()3.348 E F0(Y)A F1 3.348(\)o)C(ption,)-3.348 E/F2 10/Times-Italic@0 -SF(sendmail)3.348 E F1 .849(will fork before each indi)3.348 F .849 -(vidual message)-.25 F .293(while running the queue.)102 216.6 R .293 -(This will pre)5.293 F -.15(ve)-.25 G(nt).15 E F2(sendmail)2.793 E F1 -.293(from consuming lar)2.793 F .293(ge amounts of memory)-.18 F 2.792 -(,s)-.65 G(o)-2.792 E 1.11(it may be useful in memory-poor en)102 228.6 -R 3.61(vironments. Ho)-.4 F(we)-.25 E -.15(ve)-.25 G 1.91 -.4(r, i).15 H -3.61(ft).4 G(he)-3.61 E F0 -.25(Fo)3.61 G(rkEachJ).25 E(ob)-.15 E F1 -1.11(option is not set,)3.61 F F2(sendmail)102 240.6 Q F1 .085(will k) -2.585 F .085(eep track of hosts that are do)-.1 F .084 -(wn during a queue run, which can impro)-.25 F .384 -.15(ve p)-.15 H -(erformance).15 E(dramatically)102 252.6 Q(.)-.65 E(If the)127 268.8 Q -F0 -.25(Fo)2.5 G(rkEachJ).25 E(ob)-.15 E F1(option is set,)2.5 E F2 -(sendmail)2.5 E F1(can not use connection caching.)2.5 E F0 2.5 -(4.3. Queue)87 292.8 R(Priorities)2.5 E F1(Ev)127 309 Q 1.128(ery message is assigned a priority when it is \214rst instantiated, consisting of the message) --.15 F .286(size \(in bytes\) of)102 321 R .286(fset by the message class \(which is determined from the Precedence: header\) times) --.25 F .342(the \231w)102 333 R .342(ork class f)-.1 F .343 -(actor\232 and the number of recipients times the \231w)-.1 F .343 -(ork recipient f)-.1 F(actor)-.1 E 4.243 -.7(.\232 T)-.55 H .343 -(he priority).7 F .073(is used to order the queue.)102 345 R .073(Higher numbers for the priority mean that the message will be processed) -5.073 F(later when running the queue.)102 357 Q .328 -(The message size is included so that lar)127 373.2 R .329 -(ge messages are penalized relati)-.18 F .629 -.15(ve t)-.25 H 2.829(os) -.15 G .329(mall messages.)-2.829 F .285(The message class allo)102 385.2 -R .285(ws users to send \231high priority\232 messages by including a \231Precedence:\232 \214eld) --.25 F .007(in their message; the v)102 397.2 R .007 -(alue of this \214eld is look)-.25 F .008(ed up in the)-.1 F F0(P)2.508 -E F1 .008(lines of the con\214guration \214le.)2.508 F .008(Since the) -5.008 F 1.967(number of recipients af)102 409.2 R 1.967(fects the amount of load a message presents to the system, this is also) --.25 F(included into the priority)102 421.2 Q(.)-.65 E .53 -(The recipient and class f)127 437.4 R .53 -(actors can be set in the con\214guration \214le using the)-.1 F F0 -(RecipientF)3.03 E(actor)-.25 E F1(\()102 449.4 Q F0(y)A F1 3.443(\)a)C -(nd)-3.443 E F0(ClassF)3.443 E(actor)-.25 E F1(\()3.442 E F0(z)A F1 -3.442(\)o)C .942(ptions respecti)-3.442 F -.15(ve)-.25 G(ly).15 E 5.942 -(.T)-.65 G(he)-5.942 E 3.442(yd)-.15 G(ef)-3.442 E .942 -(ault to 30000 \(for the recipient f)-.1 F .942(actor\) and)-.1 F -(1800 \(for the class f)102 461.4 Q 2.5(actor\). The)-.1 F -(initial priority is:)2.5 E F2(pri)168.495 479.4 Q/F3 10/Symbol SF(=) -3.16 E F2(msgsize)3.18 E F3(-)2.38 E F1(\()2.2 E F2(class).2 E F3<b4> -2.47 E F0(ClassFactor\))2.2 E F3(+)2.2 E F1(\()2.2 E F2(nrcpt).36 E F3 -<b4>2.88 E F0(RecipientFactor\))2.2 E F1(\(Remember)102 497.4 Q 3.328 -(,h)-.4 G .828(igher v)-3.328 F .828(alues for this parameter actually mean that the job will be treated with lo) --.25 F(wer)-.25 E(priority)102 509.4 Q(.\))-.65 E 1.519(The priority of a job can also be adjusted each time it is processed \(that is, each time an) -127 525.6 R .235(attempt is made to deli)102 537.6 R -.15(ve)-.25 G -2.736(ri).15 G .236(t\) using the \231w)-2.736 F .236(ork time f)-.1 F -(actor)-.1 E 1.636 -.7(,\232 s)-.4 H .236(et by the).7 F F0(RetryF)2.736 -E(actor)-.25 E F1(\()2.736 E F0(Z)A F1 2.736(\)o)C 2.736(ption. This) --2.736 F .367(is added to the priority)102 549.6 R 2.867(,s)-.65 G 2.867 -(oi)-2.867 G 2.867(tn)-2.867 G .366 -(ormally decreases the precedence of the job, on the grounds that jobs) --2.867 F .137(that ha)102 561.6 R .437 -.15(ve f)-.2 H .137(ailed man) -.05 F 2.637(yt)-.15 G .137(imes will tend to f)-2.637 F .137(ail ag)-.1 -F .137(ain in the future.)-.05 F(The)5.137 E F0(RetryF)2.637 E(actor) --.25 E F1 .137(option def)2.637 F .138(aults to)-.1 F(90000.)102 573.6 Q -F0 2.5(4.4. Load)87 597.6 R(Limiting)2.5 E F2(Sendmail)127 613.8 Q F1 -.102(can be ask)2.602 F .101(ed to queue \(b)-.1 F .101(ut not deli)-.2 -F -.15(ve)-.25 G .101(r\) mail if the system load a).15 F -.15(ve)-.2 G -.101(rage gets too high).15 F .483(using the)102 625.8 R F0(QueueLA) -2.983 E F1(\()2.983 E F0(x)A F1 2.983(\)o)C 2.983(ption. When)-2.983 F -.483(the load a)2.983 F -.15(ve)-.2 G .483(rage e).15 F .483 -(xceeds the v)-.15 F .484(alue of the)-.25 F F0(QueueLA)2.984 E F1 -(option,)2.984 E .532(the deli)102 637.8 R -.15(ve)-.25 G .532 -(ry mode is set to).15 F F0(q)3.032 E F1 .532(\(queue only\) if the) -3.032 F F0(QueueF)3.032 E(actor)-.25 E F1(\()3.032 E F0(q)A F1 3.032 -(\)o)C .531(ption di)-3.032 F .531(vided by the dif)-.25 F(ference)-.25 -E .004(in the current load a)102 649.8 R -.15(ve)-.2 G .004 -(rage and the).15 F F0(QueueLA)2.504 E F1 .004(option plus one e)2.504 F -.004(xceeds the priority of the message \212)-.15 F -(that is, the message is queued if)102 661.8 Q(f:)-.25 E F2(pri)251.425 -685.21 Q F1(>)3.16 E F0(QueueFactor)15.315 -7 M F2(LA)-66.835 14 M F3(-) -2.23 E F0(QueueLA)2.2 E F3(+)2.2 E .4 LW 354.625 682.61 275.895 682.61 -DL F1(1)349.625 692.21 Q(The)102 708.47 Q F0(QueueF)2.616 E(actor)-.25 E -F1 .116(option def)2.616 F .116 -(aults to 600000, so each point of load a)-.1 F -.15(ve)-.2 G .116 -(rage is w).15 F .116(orth 600000 priority)-.1 F -(points \(as described abo)102 720.47 Q -.15(ve)-.15 G(\).).15 E EP -%%Page: 26 22 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-26 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF -.15(Fo) -127 96 S 3.893(rd).15 G 1.393(rastic cases, the)-3.893 F F0(RefuseLA) -3.893 E F1(\()3.893 E F0(X)A F1 3.893(\)o)C 1.394 -(ption de\214nes a load a)-3.893 F -.15(ve)-.2 G 1.394(rage at which).15 -F/F2 10/Times-Italic@0 SF(sendmail)3.894 E F1(will)3.894 E .69 -(refuse to accept netw)102 108 R .689(ork connections.)-.1 F .689 -(Locally generated mail \(including incoming UUCP mail\) is)5.689 F -(still accepted.)102 120 Q F0 2.5(4.5. Deli)87 144 R -.1(ve)-.1 G -(ry Mode).1 E F1 .253(There are a number of deli)127 160.2 R -.15(ve) --.25 G .253(ry modes that).15 F F2(sendmail)2.753 E F1 .254 -(can operate in, set by the)2.753 F F0(Deli)2.754 E -.1(ve)-.1 G(ryMode) -.1 E F1(\()102 172.2 Q F0(d)A F1 3.599(\)c)C 1.099 -(on\214guration option.)-3.599 F 1.099(These modes specify ho)6.099 F -3.598(wq)-.25 G 1.098(uickly mail will be deli)-3.598 F -.15(ve)-.25 G -3.598(red. Le).15 F -.05(ga)-.15 G 3.598(lm).05 G(odes)-3.598 E(are:)102 -184.2 Q 17.22(id)142 200.4 S(eli)-17.22 E -.15(ve)-.25 G 2.5(ri).15 G -(nteracti)-2.5 E -.15(ve)-.25 G(ly \(synchronously\)).15 E 15(bd)142 -212.4 S(eli)-15 E -.15(ve)-.25 G 2.5(ri).15 G 2.5(nb)-2.5 G -(ackground \(asynchronously\))-2.5 E 15(qq)142 224.4 S(ueue only \(don') --15 E 2.5(td)-.18 G(eli)-2.5 E -.15(ve)-.25 G(r\)).15 E 15(dd)142 236.4 -S(efer delv)-15 E(ery attempts \(don')-.15 E 2.5(td)-.18 G(eli)-2.5 E --.15(ve)-.25 G(r\)).15 E 1.273(There are tradeof)102 252.6 R 3.773 -(fs. Mode)-.25 F 1.273(\231i\232 gi)3.773 F -.15(ve)-.25 G 3.773(st).15 -G 1.273(he sender the quick)-3.773 F 1.273(est feedback, b)-.1 F 1.274 -(ut may slo)-.2 F 3.774(wd)-.25 G -.25(ow)-3.774 G 3.774(ns).25 G(ome) --3.774 E .799(mailers and is hardly e)102 264.6 R -.15(ve)-.25 G 3.299 -(rn).15 G(ecessary)-3.299 E 5.799(.M)-.65 G .799(ode \231b\232 deli) --5.799 F -.15(ve)-.25 G .799(rs promptly b).15 F .798(ut can cause lar) --.2 F .798(ge numbers of)-.18 F .223(processes if you ha)102 276.6 R -.524 -.15(ve a m)-.2 H .224(ailer that tak).15 F .224 -(es a long time to deli)-.1 F -.15(ve)-.25 G 2.724(ram).15 G 2.724 -(essage. Mode)-2.724 F .224(\231q\232 minimizes the)2.724 F .597 -(load on your machine, b)102 288.6 R .597(ut means that deli)-.2 F -.15 -(ve)-.25 G .596(ry may be delayed for up to the queue interv).15 F 3.096 -(al. Mode)-.25 F .039(\231d\232 is identical to mode \231q\232 e)102 -300.6 R .039(xcept that it also pre)-.15 F -.15(ve)-.25 G .04 -(nts all the early map lookups from w).15 F .04(orking; it is)-.1 F .086 -(intended for `)102 312.6 R .086(`dial on demand')-.74 F 2.586('s)-.74 G -.085(ites where DNS lookups might cost real mone)-2.586 F 3.885 -.65 -(y. S)-.15 H .085(ome simple error).65 F .817 -(messages \(e.g., host unkno)102 324.6 R .817 -(wn during the SMTP protocol\) will be delayed using this mode.)-.25 F -(Mode)5.818 E(\231b\232 is the usual def)102 336.6 Q(ault.)-.1 E .052(If you run in mode \231q\232 \(queue only\), \231d\232 \(defer\), or \231b\232 \(deli) -127 352.8 R -.15(ve)-.25 G 2.552(ri).15 G 2.552(nb)-2.552 G(ackground\)) --2.552 E F2(sendmail)2.551 E F1(will)2.551 E 1.391(not e)102 364.8 R -1.392(xpand aliases and follo)-.15 F 3.892(w.)-.25 G(forw)-3.892 E 1.392 -(ard \214les upon initial receipt of the mail.)-.1 F 1.392 -(This speeds up the)6.392 F(response to RCPT commands.)102 376.8 Q -(Mode \231i\232 cannot be used by the SMTP serv)5 E(er)-.15 E(.)-.55 E -F0 2.5(4.6. Log)87 400.8 R(Le)2.5 E -.1(ve)-.15 G(l).1 E F1 .19(The le) -127 417 R -.15(ve)-.25 G 2.69(lo).15 G 2.69(fl)-2.69 G .19 -(ogging can be set for)-2.69 F F2(sendmail)2.689 E F1 5.189(.T)C .189 -(he def)-5.189 F .189(ault using a standard con\214guration table)-.1 F -(is le)102 429 Q -.15(ve)-.25 G 2.5(l9).15 G 5(.T)-2.5 G(he le)-5 E -.15 -(ve)-.25 G(ls are as follo).15 E(ws:)-.25 E 31(0M)102 445.2 S -(inimal logging.)-31 E 31(1S)102 461.4 S(erious system f)-31 E -(ailures and potential security problems.)-.1 E 31(2L)102 477.6 S -(ost communications \(netw)-31 E(ork problems\) and protocol f)-.1 E -(ailures.)-.1 E 31(3O)102 493.8 S 1.237(ther serious f)-31 F 1.237 -(ailures, malformed addresses, transient forw)-.1 F 1.238 -(ard/include errors, connection)-.1 F(timeouts.)138 505.8 Q 31(4M)102 -522 S(inor f)-31 E(ailures, out of date alias databases, connection rejections via check_ rulesets.) --.1 E 31(5M)102 538.2 S(essage collection statistics.)-31 E 31(6C)102 -554.4 S(reation of error messages, VRFY and EXPN commands.)-31 E 31(7D) -102 570.6 S(eli)-31 E -.15(ve)-.25 G(ry f).15 E -(ailures \(host or user unkno)-.1 E(wn, etc.\).)-.25 E 31(8S)102 586.8 S -(uccessful deli)-31 E -.15(ve)-.25 G(ries and alias database reb).15 E -(uilds.)-.2 E 31(9M)102 603 S -(essages being deferred \(due to a host being do)-31 E(wn, etc.\).)-.25 -E 23.5(10 Database)102 619.2 R -.15(ex)2.5 G(pansion \(alias, forw).15 E -(ard, and userdb lookups\).)-.1 E 23.5(11 NIS)102 635.4 R -(errors and end of job processing.)2.5 E 23.5(12 Logs)102 651.6 R -(all SMTP connections.)2.5 E 23.5(13 Log)102 667.8 R(bad user shells, \214les with improper permissions, and other questionable situations.) -2.5 E 23.5(14 Logs)102 684 R(refused connections.)2.5 E 23.5(15 Log)102 -700.2 R(all incoming and outgoing SMTP commands.)2.5 E EP -%%Page: 27 23 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-27)195.86 E/F1 10/Times-Roman@0 SF 23.5(20 Logs)102 96 R .603 -(attempts to run lock)3.103 F .603(ed queue \214les.)-.1 F .603 -(These are not errors, b)5.603 F .603(ut can be useful to note if)-.2 F -(your queue appears to be clogged.)138 108 Q 23.5(30 Lost)102 124.2 R -(locks \(only if using lockf instead of \215ock\).)2.5 E(Additionally) -102 140.4 Q 2.716(,v)-.65 G .216(alues abo)-2.966 F .516 -.15(ve 6)-.15 -H 2.716(4a).15 G .216(re reserv)-2.716 F .216(ed for e)-.15 F .216 -(xtremely v)-.15 F .216(erbose deb)-.15 F .216(ugging output.)-.2 F .217 -(No normal site)5.216 F -.1(wo)102 152.4 S(uld e).1 E -.15(ve)-.25 G 2.5 -(rs).15 G(et these.)-2.5 E F0 2.5(4.7. File)87 176.4 R(Modes)2.5 E F1 -.264(The modes used for \214les depend on what functionality you w)127 -192.6 R .264(ant and the le)-.1 F -.15(ve)-.25 G 2.763(lo).15 G 2.763 -(fs)-2.763 G .263(ecurity you)-2.763 F 2.56(require. In)102 204.6 R(man) -2.56 E 2.56(yc)-.15 G(ases)-2.56 E/F2 10/Times-Italic@0 SF(sendmail)2.56 -E F1 .061 -(does careful checking of the modes of \214les and directories to a)2.56 -F -.2(vo)-.2 G(id).2 E 1.336(accidental compromise; if you w)102 216.6 R -1.336(ant to mak)-.1 F 3.836(ei)-.1 G 3.836(tp)-3.836 G 1.336 -(ossible to ha)-3.836 F 1.635 -.15(ve g)-.2 H 1.335 -(roup-writable support \214les you).15 F(may need to use the)102 228.6 Q -F0(DontBlameSendmail)2.5 E F1(option to turn of)2.5 E 2.5(fs)-.25 G -(ome of these checks.)-2.5 E F0 2.5(4.7.1. T)102 252.6 R 2.5(os)-.92 G -(uid or not to suid?)-2.5 E F2(Sendmail)142 268.8 Q F1 .66 -(is normally installed setuid to root.)3.16 F .66 -(At the point where it is about to)5.66 F F2 -.2(ex)3.161 G(ec).2 E F1 -.661(\(2\) a)1.666 F(mailer)117 280.8 Q 3.679(,i)-.4 G 3.679(tc)-3.679 G -1.178(hecks to see if the userid is zero \(root\); if so, it resets the userid and groupid to a) --3.679 F(def)117 292.8 Q 1.391(ault \(set by the)-.1 F F0(U=)3.891 E F1 -1.392(equate in the mailer line; if that is not set, the)3.891 F F0 -(DefaultUser)3.892 E F1 1.392(option is)3.892 F 2.848(used\). This)117 -304.8 R .348(can be o)2.848 F -.15(ve)-.15 G .347 -(rridden by setting the).15 F F0(S)2.847 E F1 .347 -(\215ag to the mailer for mailers that are trusted and)2.847 F .541 -(must be called as root.)117 316.8 R(Ho)5.541 E(we)-.25 E -.15(ve)-.25 G -1.341 -.4(r, t).15 H .541 -(his will cause mail processing to be accounted \(using).4 F F2(sa)3.041 -E F1(\(8\)\))1.666 E(to root rather than to the user sending the mail.) -117 328.8 Q .339(If you don')142 345 R 2.839(tm)-.18 G(ak)-2.839 E(e)-.1 -E F2(sendmail)2.839 E F1 .339(setuid to root, it will still run b)2.839 -F .339(ut you lose a lot of functional-)-.2 F .007(ity and a lot of pri) -117 357 R -.25(va)-.25 G -.15(cy).25 G 2.507(,s)-.5 G .008(ince you') --2.507 F .008(ll ha)-.1 F .308 -.15(ve t)-.2 H 2.508(om).15 G(ak)-2.508 -E 2.508(et)-.1 G .008(he queue directory w)-2.508 F .008(orld readable.) --.1 F -1.1(Yo)5.008 G 2.508(uc)1.1 G(ould)-2.508 E .501(also mak)117 369 -R(e)-.1 E F2(sendmail)3.001 E F1 .501(setuid to some pseudo-user \(e.g., create a user called \231sendmail\232 and mak) -3.001 F(e)-.1 E F2(sendmail)117 381 Q F1 1.533 -(setuid to that\) which will \214x the pri)4.033 F -.25(va)-.25 G 1.834 --.15(cy p).25 H 1.534(roblems b).15 F 1.534 -(ut not the functionality issues.)-.2 F .642(Also, this isn')117 393 R -3.142(tag)-.18 G .641(uarantee of security: for e)-3.142 F .641 -(xample, root occasionally sends mail, and the dae-)-.15 F 1.483 -(mon often runs as root.)117 405 R 1.483(Note ho)6.483 F(we)-.25 E -.15 -(ve)-.25 G 3.983(rt).15 G(hat)-3.983 E F2(sendmail)3.983 E F1 1.483 -(must run as root in order to create the)3.983 F(SMTP listener sock)117 -417 Q(et.)-.1 E 2.839(Am)142 433.2 S .339(iddle ground is to mak)-2.839 -F(e)-.1 E F2(sendmail)2.839 E F1 .339(setuid to root, b)2.839 F .338 -(ut set the)-.2 F F0(RunAsUser)2.838 E F1 2.838(option. This)2.838 F -(causes)117 445.2 Q F2(sendmail)2.572 E F1 .072(to become the indicated user as soon as it has done the startup that requires root) -2.572 F(pri)117 457.2 Q(vile)-.25 E 1.226(ges \(primarily)-.15 F 3.726 -(,o)-.65 G 1.225(pening the)-3.726 F/F3 9/Times-Roman@0 SF(SMTP)3.725 E -F1(sock)3.725 E 3.725(et\). If)-.1 F 1.225(you use)3.725 F F0(RunAsUser) -3.725 E F1 3.725(,t)C 1.225(he queue directory)-3.725 F(\(normally)117 -469.2 Q F2(/var/spool/mqueue)2.921 E F1 2.921(\)s)C .421(hould be o) --2.921 F .421(wned by that user)-.25 F 2.922(,a)-.4 G .422 -(nd all \214les and databases \(includ-)-2.922 F 1.175(ing user)117 -481.2 R F2(.forwar)3.675 E(d)-.37 E F1 1.175 -(\214les, alias \214les, :include: \214les, and e)3.675 F 1.175 -(xternal databases\) must be readable by)-.15 F .386(that user)117 493.2 -R(.)-.55 E F0(RunAsUser)5.386 E F1 .386 -(is probably best suited for \214re)2.886 F -.1(wa)-.25 G .386 -(ll con\214gurations that don').1 F 2.887(th)-.18 G -2.25 -.2(av e) --2.887 H(re)3.087 E(gular)-.15 E(user logins.)117 505.2 Q F0 2.5 -(4.7.2. T)102 529.2 R(ur)-.92 E(ning off security checks)-.15 E F2 -(Sendmail)142 545.4 Q F1 .648(is v)3.148 F .648 -(ery particular about the modes of \214les that it reads or writes.)-.15 -F -.15(Fo)5.648 G 3.148(re).15 G(xample,)-3.298 E .25(by def)117 557.4 R -.251(ault it will refuse to read most \214les that are group writable on the grounds that the) --.1 F 2.751(ym)-.15 G(ight)-2.751 E(ha)117 569.4 Q 1.216 -.15(ve b)-.2 H -.916(een tampered with by someone other than the o).15 F .916 -(wner; it will e)-.25 F -.15(ve)-.25 G 3.416(nr).15 G .916 -(efuse to read \214les in)-3.416 F(group writable directories.)117 581.4 -Q .437(If you are)142 597.6 R F2(quite)2.937 E F1 .437 -(sure that your con\214guration is safe and you w)2.937 F(ant)-.1 E F2 -(sendmail)2.938 E F1 .438(to a)2.938 F -.2(vo)-.2 G .438(id these).2 F -1.187(security checks, you can turn of)117 609.6 R 3.687(fc)-.25 G 1.187 -(ertain checks using the)-3.687 F F0(DontBlameSendmail)3.686 E F1 3.686 -(option. This)3.686 F 1.389(option tak)117 621.6 R 1.389 -(es one or more names that disable checks.)-.1 F 1.39 -(In the descriptions that follo)6.389 F 2.69 -.65(w, \231)-.25 H(unsafe) -.65 E(directory\232 means a directory that is writable by an)117 633.6 Q -(yone other than the o)-.15 E(wner)-.25 E 5(.T)-.55 G(he v)-5 E -(alues are:)-.25 E 15.73(Safe No)117 649.8 R(special handling.)2.5 E -(AssumeSafeCho)117 666 Q(wn)-.25 E .77(Assume that the)153 678 R F2 -.15 -(ch)3.27 G(own).15 E F1 .769(system call is restricted to root.)3.27 F -.769(Since some v)5.769 F .769(ersions of Unix)-.15 F .865(permit re)153 -690 R .865(gular users to gi)-.15 F 1.166 -.15(ve aw)-.25 H .866 -(ay their \214les to other users on some \214lesystems,).05 F F2(send-) -3.366 E(mail)153 702 Q F1 .457(often cannot assume that a gi)2.957 F --.15(ve)-.25 G 2.956<6e8c>.15 G .456(le w)-2.956 F .456 -(as created by the o)-.1 F(wner)-.25 E 2.956(,p)-.4 G .456 -(articularly when)-2.956 F 1.474(it is in a writable directory)153 714 R -6.475(.Y)-.65 G 1.475(ou can set this \215ag if you kno)-7.575 F 3.975 -(wt)-.25 G 1.475(hat \214le gi)-3.975 F -.15(ve)-.25 G -2.3 -.15(aw a) -.15 H 3.975(yi).15 G(s)-3.975 E EP -%%Page: 28 24 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-28 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF -(restricted on your system.)153 96 Q(ClassFileInUnsafeDirP)117 112.2 Q -(ath)-.15 E .494(When reading class \214les \(using the)153 124.2 R F0 -(F)2.993 E F1 .493(line in the con\214guration \214le\), allo)2.993 F -2.993<778c>-.25 G .493(les that are)-2.993 F(in unsafe directories.)153 -136.2 Q(ErrorHeaderInUnsafeDirP)117 152.4 Q(ath)-.15 E(Allo)153 164.4 Q -2.5(wt)-.25 G(he \214le named in the)-2.5 E F0(Err)2.5 E(orHeader)-.18 E -F1(option to be in an unsafe directory)2.5 E(.)-.65 E(GroupWritableDirP) -117 180.6 Q(athSafe)-.15 E .224(Change the de\214nition of \231unsafe directory\232 to consider group-writable directories to be) -153 192.6 R 2.5(safe. W)153 204.6 R(orld-writable directories are al)-.8 -E -.1(wa)-.1 G(ys unsafe.).1 E(GroupWritableF)117 220.8 Q(orw)-.15 E -(ardFileSafe)-.1 E(Accept group-writable)153 232.8 Q/F2 10 -/Times-Italic@0 SF(.forwar)2.5 E(d)-.37 E F1(\214les.)2.5 E -(GroupWritableIncludeFileSafe)117 249 Q(Accept group-writable)153 261 Q -F2(:include:)2.5 E F1(\214les.)2.5 E(GroupWritableAliasFile)117 277.2 Q -(Allo)153 289.2 Q 2.5(wg)-.25 G(roup-writable alias \214les.)-2.5 E -(HelpFileInUnsafeDirP)117 305.4 Q(ath)-.15 E(Allo)153 317.4 Q 2.5(wt) --.25 G(he \214le named in the)-2.5 E F0(HelpFile)2.5 E F1 -(option to be in an unsafe directory)2.5 E(.)-.65 E -.8(Wo)117 333.6 S -(rldWritableAliasFile).8 E(Accept w)153 345.6 Q -(orld-writable alias \214les.)-.1 E -.15(Fo)117 361.8 S(rw).15 E -(ardFileInGroupWritableDirP)-.1 E(ath)-.15 E(Allo)153 373.8 Q(w)-.25 E -F2(.forwar)2.5 E(d)-.37 E F1(\214les in group writable directories.)2.5 -E(IncludeFileInGroupWritableDirP)117 390 Q(ath)-.15 E(Allo)153 402 Q(w) --.25 E F2(:include:)2.5 E F1(\214les in group writable directories.)2.5 -E -.15(Fo)117 418.2 S(rw).15 E(ardFileInUnsafeDirP)-.1 E(ath)-.15 E -(Allo)153 430.2 Q(w)-.25 E F2(.forwar)2.5 E(d)-.37 E F1 -(\214les in unsafe directories.)2.5 E(IncludeFileInUnsafeDirP)117 446.4 -Q(ath)-.15 E(Allo)153 458.4 Q(w)-.25 E F2(:include:)2.5 E F1 -(\214les in unsafe directories.)2.5 E -.15(Fo)117 474.6 S(rw).15 E -(ardFileInUnsafeDirP)-.1 E(athSafe)-.15 E(Allo)153 486.6 Q 2.612(wa)-.25 -G F2(.forwar)A(d)-.37 E F1 .112(\214le that is in an unsafe directory to include references to program and) -2.612 F(\214les.)153 498.6 Q(IncludeFileInUnsafeDirP)117 514.8 Q -(athSafe)-.15 E(Allo)153 526.8 Q 3.705(wa)-.25 G F2(:include:)A F1 1.206 -(\214le that is in an unsafe directory to include references to program) -3.705 F(and \214les.)153 538.8 Q(MapInUnsafeDirP)117 555 Q(ath)-.15 E -(Allo)153 567 Q 2.5(wm)-.25 G(aps \(e.g.,)-2.5 E F2(hash)2.5 E F1(,)A F2 -(btr)2.5 E(ee)-.37 E F1 2.5(,a)C(nd)-2.5 E F2(dbm)2.5 E F1 -(\214les\) in unsafe directories.)2.5 E(Link)117 583.2 Q -(edAliasFileInWritableDir)-.1 E(Allo)153 595.2 Q 2.5(wa)-.25 G 2.5(na) --2.5 G(lias \214le that is a link in a writable directory)-2.5 E(.)-.65 -E(Link)117 611.4 Q(edClassFileInWritableDir)-.1 E(Allo)153 623.4 Q 2.5 -(wc)-.25 G(lass \214les that are links in writable directories.)-2.5 E -(Link)117 639.6 Q(edF)-.1 E(orw)-.15 E(ardFileInWritableDir)-.1 E(Allo) -153 651.6 Q(w)-.25 E F2(.forwar)2.5 E(d)-.37 E F1 -(\214les that are links in writable directories.)2.5 E(Link)117 667.8 Q -(edIncludeFileInWritableDir)-.1 E(Allo)153 679.8 Q(w)-.25 E F2 -(:include:)2.5 E F1(\214les that are links in writable directories.)2.5 -E(Link)117 696 Q(edMapInWritableDir)-.1 E(Allo)153 708 Q 2.5(wm)-.25 G -(ap \214les that are links in writable directories.)-2.5 E EP -%%Page: 29 25 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-29)195.86 E/F1 10/Times-Roman@0 SF(Link)117 96 Q -(edServiceSwitchFileInWritableDir)-.1 E(Allo)153 108 Q 2.5(wt)-.25 G -(he service switch \214le to be a link e)-2.5 E -.15(ve)-.25 G 2.5(ni) -.15 G 2.5(ft)-2.5 G(he directory is writable.)-2.5 E(FileDeli)117 124.2 -Q -.15(ve)-.25 G(ryT).15 E(oHardLink)-.8 E(Allo)153 136.2 Q 2.5(wd)-.25 -G(eli)-2.5 E -.15(ve)-.25 G(ry to \214les that are hard links.).15 E -(FileDeli)117 152.4 Q -.15(ve)-.25 G(ryT).15 E(oSymLink)-.8 E(Allo)153 -164.4 Q 2.5(wd)-.25 G(eli)-2.5 E -.15(ve)-.25 G -(ry to \214les that are symbolic links.).15 E(RunProgramInUnsafeDirP)117 -180.6 Q(ath)-.15 E -(Go ahead and run programs that are in writable directories.)153 192.6 Q -(RunWritableProgram)117 208.8 Q -(Go ahead and run programs that are group- or w)153 220.8 Q -(orld-writable.)-.1 E(WriteMapT)117 237 Q(oHardLink)-.8 E(Allo)153 249 Q -2.5(ww)-.25 G(rites to maps that are hard links.)-2.5 E(WriteMapT)117 -265.2 Q(oSymLink)-.8 E(Allo)153 277.2 Q 2.5(ww)-.25 G -(rites to maps that are symbolic links.)-2.5 E(WriteStatsT)117 293.4 Q -(oHardLink)-.8 E(Allo)153 305.4 Q 2.5(wt)-.25 G -(he status \214le to be a hard link.)-2.5 E(WriteStatsT)117 321.6 Q -(oSymLink)-.8 E(Allo)153 333.6 Q 2.5(wt)-.25 G -(he status \214le to be a symbolic link.)-2.5 E F0 2.5(4.8. Connection) -87 357.6 R(Caching)2.5 E F1 .642(When processing the queue,)127 373.8 R -/F2 10/Times-Italic@0 SF(sendmail)3.142 E F1 .642(will try to k)3.142 F -.642(eep the last fe)-.1 F 3.142(wo)-.25 G .642(pen connections open to) --3.142 F -.2(avo)102 385.8 S(id startup and shutdo).2 E(wn costs.)-.25 E -(This only applies to IPC connections.)5 E .286 -(When trying to open a connection the cache is \214rst searched.)127 402 -R .287(If an open connection is found,)5.286 F 1.034 -(it is probed to see if it is still acti)102 414 R 1.333 -.15(ve b)-.25 -H 3.533(ys).15 G 1.033(ending a)-3.533 F/F3 9/Times-Roman@0 SF(RSET) -3.533 E F1 3.533(command. It)3.533 F 1.033(is not an error if this f) -3.533 F(ails;)-.1 E(instead, the connection is closed and reopened.)102 -426 Q -1 -.8(Tw o)127 442.2 T .408 -(parameters control the connection cache.)3.708 F(The)5.408 E F0 -(ConnectionCacheSize)2.908 E F1(\()2.908 E F0(k)A F1 2.908(\)o)C .408 -(ption de\214nes)-2.908 F .145 -(the number of simultaneous open connections that will be permitted.)102 -454.2 R .145(If it is set to zero, connections)5.145 F .212 -(will be closed as quickly as possible.)102 466.2 R .212(The def)5.212 F -.212(ault is one.)-.1 F .213(This should be set as appropriate for your) -5.212 F .63 -(system size; it will limit the amount of system resources that)102 -478.2 R F2(sendmail)3.129 E F1 .629(will use during queue runs.)3.129 F -(Ne)102 490.2 Q -.15(ve)-.25 G 2.5(rs).15 G(et this higher than 4.)-2.5 -E(The)127 506.4 Q F0(ConnectionCacheT)2.74 E(imeout)-.18 E F1(\()2.741 E -F0(K)A F1 2.741(\)o)C .241(ption speci\214es the maximum time that an) --2.741 F 2.741(yc)-.15 G .241(ached con-)-2.741 F .9 -(nection will be permitted to idle.)102 518.4 R .899 -(When the idle time e)5.9 F .899(xceeds this v)-.15 F .899 -(alue the connection is closed.)-.25 F .34 -(This number should be small \(under ten minutes\) to pre)102 530.4 R --.15(ve)-.25 G .34(nt you from grabbing too man).15 F 2.84(yr)-.15 G -(esources)-2.84 E(from other hosts.)102 542.4 Q(The def)5 E -(ault is \214v)-.1 E 2.5(em)-.15 G(inutes.)-2.5 E F0 2.5(4.9. Name)87 -566.4 R(Ser)2.5 E -.1(ve)-.1 G 2.5(rA).1 G(ccess)-2.5 E F1 .104 -(Control of host address lookups is set by the)127 582.6 R F0(hosts) -2.604 E F1 .103(service entry in your service switch \214le.)2.603 F(If) -5.103 E .99(you are on a system that has b)102 594.6 R .99 -(uilt-in service switch support \(e.g., Ultrix, Solaris, or DEC OSF/1\)) --.2 F .336(then your system is probably con\214gured properly already) -102 606.6 R 5.335(.O)-.65 G(therwise,)-5.335 E F2(sendmail)2.835 E F1 -.335(will consult the \214le)2.835 F F0(/etc/ser)102 618.6 Q -(vice.switch)-.1 E F1 3.775(,w)C 1.276(hich should be created.)-3.775 F -F2(Sendmail)6.276 E F1 1.276(only uses tw)3.776 F 3.776(oe)-.1 G -(ntries:)-3.776 E F0(hosts)3.776 E F1(and)3.776 E F0(aliases)3.776 E F1 -(,)A .147(although system routines may use other services \(notably the) -102 630.6 R F0(passwd)2.646 E F1 .146(service for user name lookups) -2.646 F(by)102 642.6 Q F2 -.1(ge)2.5 G(tpwname).1 E F1(\).)A(Ho)127 -658.8 Q(we)-.25 E -.15(ve)-.25 G 1.51 -.4(r, s).15 H .711 -(ome systems \(such as SunOS 4.X\) will do DNS lookups re).4 F -.05(ga) --.15 G .711(rdless of the setting).05 F 1.029 -(of the service switch entry)102 670.8 R 6.029(.I)-.65 G 3.529(np)-6.029 -G(articular)-3.529 E 3.529(,t)-.4 G 1.029(he system routine)-3.529 F F2 --.1(ge)3.529 G(thostbyname).1 E F1 1.028(\(3\) is used to look up)B -1.868(host names, and man)102 682.8 R 4.368(yv)-.15 G 1.868(endor v) --4.518 F 1.869 -(ersions try some combination of DNS, NIS, and \214le lookup in)-.15 F -1.731(/etc/hosts without consulting a service switch.)102 694.8 R F2 -(Sendmail)6.731 E F1(mak)4.231 E 1.731(es no attempt to w)-.1 F 1.73 -(ork around this)-.1 F .367(problem, and the DNS lookup will be done an) -102 706.8 R(yw)-.15 E(ay)-.1 E 5.368(.I)-.65 G 2.868(fy)-5.368 G .368 -(ou do not ha)-2.868 F .668 -.15(ve a n)-.2 H(ameserv).15 E .368 -(er con\214gured at)-.15 F .464(all, such as at a UUCP-only site,)102 -718.8 R F2(sendmail)2.964 E F1 .464 -(will get a \231connection refused\232 message when it tries to)2.964 F -EP -%%Page: 30 26 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-30 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF .423 -(connect to the name serv)102 96 R(er)-.15 E 5.423(.I)-.55 G 2.923(ft) --5.423 G(he)-2.923 E F0(hosts)2.923 E F1 .424 -(switch entry has the service \231dns\232 listed some)2.923 F .424 -(where in the)-.25 F(list,)102 108 Q/F2 10/Times-Italic@0 SF(sendmail) -3.313 E F1 .813(will interpret this to mean a temporary f)3.313 F .813 -(ailure and will queue the mail for later pro-)-.1 F -(cessing; otherwise, it ignores the name serv)102 120 Q(er data.)-.15 E -.672(The same technique is used to decide whether to do MX lookups.)127 -136.2 R .673(If you w)5.673 F .673(ant MX support,)-.1 F(you)102 148.2 Q -F2(must)2.5 E F1(ha)2.5 E .3 -.15(ve \231)-.2 H -(dns\232 listed as a service in the).15 E F0(hosts)2.5 E F1 -(switch entry)2.5 E(.)-.65 E(The)127 164.4 Q F0(Resolv)3.87 E(erOptions) --.1 E F1(\()3.87 E F0(I)A F1 3.869(\)o)C 1.369(ption allo)-3.869 F 1.369 -(ws you to tweak name serv)-.25 F 1.369(er options.)-.15 F 1.369 -(The command)6.369 F .892(line tak)102 176.4 R .892 -(es a series of \215ags as documented in)-.1 F F2 -.37(re)3.392 G -(solver).37 E F1 .892(\(3\) \(with the leading \231RES_\232 deleted\).)B -(Each)5.892 E(can be preceded by an optional `+' or `)102 188.4 Q/F3 10 -/Symbol SF(-)A F1 2.5('. F)B(or e)-.15 E(xample, the line)-.15 E 2.5(OR) -142 204.6 S(esolv)-2.5 E(erOptions=+AA)-.15 E(ONL)-.55 E(Y)-1 E F3(-)2.5 -E F1(DNSRCH)A .862(turns on the AA)102 220.8 R(ONL)-.55 E 3.362(Y\()-1 G -.862(accept authoritati)-3.362 F 1.162 -.15(ve a)-.25 H .861 -(nswers only\) and turns of).15 F 3.361(ft)-.25 G .861 -(he DNSRCH \(search the)-3.361 F 2.039(domain path\) options.)102 232.8 -R 2.039(Most resolv)7.039 F 2.039(er libraries def)-.15 F 2.039 -(ault DNSRCH, DEFN)-.1 F 2.039(AMES, and RECURSE)-.35 F .503 -(\215ags on and all others of)102 244.8 R 3.003(f. Y)-.25 F .503 -(ou can also include \231HasW)-1.1 F .503 -(ildcardMX\232 to specify that there is a wild-)-.4 F 1.972 -(card MX record matching your domain; this turns of)102 256.8 R 4.472 -(fM)-.25 G 4.473(Xm)-4.472 G 1.973(atching when canonifying names,) --4.473 F(which can lead to inappropriate canoni\214cations.)102 268.8 Q --1.11(Ve)127 285 S 2.257(rsion le)1.11 F -.15(ve)-.25 G 4.757(l1c).15 G -2.256(on\214gurations turn DNSRCH and DEFN)-4.757 F 2.256(AMES of)-.35 F -4.756(fw)-.25 G 2.256(hen doing deli)-4.756 F -.15(ve)-.25 G(ry).15 E -2.06(lookups, b)102 297 R 2.06(ut lea)-.2 F 2.36 -.15(ve t)-.2 H 2.06 -(hem on e).15 F -.15(ve)-.25 G 2.06(rywhere else.).15 F -1.11(Ve)7.06 G -2.06(rsion 8 of)1.11 F F2(sendmail)4.56 E F1 2.06 -(ignores them when doing)4.56 F .313 -(canoni\214cation lookups \(that is, when using $[ ... $]\), and al)102 -309 R -.1(wa)-.1 G .313(ys does the search.).1 F .313(If you don')5.313 -F 2.812(tw)-.18 G(ant)-2.912 E(to do automatic name e)102 321 Q -(xtension, don')-.15 E 2.5(tc)-.18 G(all $[ ... $].)-2.5 E .485 -(The search rules for $[ ... $] are some)127 337.2 R .485(what dif)-.25 -F .485(ferent than usual.)-.25 F .486(If the name being look)5.485 F -.486(ed up)-.1 F .11(has at least one dot, it al)102 349.2 R -.1(wa)-.1 -G .11(ys tries the unmodi\214ed name \214rst.).1 F .109(If that f)5.109 -F .109(ails, it tries the reduced search)-.1 F .124 -(path, and lastly tries the unmodi\214ed name \(b)102 361.2 R .124 -(ut only for names without a dot, since names with a dot)-.2 F(ha)102 -373.2 Q .789 -.15(ve a)-.2 H .489(lready been tried\).).15 F .489 -(This allo)5.489 F .489(ws names such as `)-.25 F(`utc.CS')-.74 E 2.989 -('t)-.74 G 2.988(om)-2.989 G .488(atch the site in Czechoslo)-2.988 F --.25(va)-.15 G(kia).25 E 1.587 -(rather than the site in your local Computer Science department.)102 -385.2 R 1.588(It also prefers A and CN)6.587 F(AME)-.35 E .513 -(records o)102 397.2 R -.15(ve)-.15 G 3.013(rM).15 G 3.013(Xr)-3.013 G -.513(ecords \212 that is, if it \214nds an MX record it mak)-3.013 F -.512(es note of it, b)-.1 F .512(ut k)-.2 F .512(eeps looking.)-.1 F -1.541(This w)102 409.2 R(ay)-.1 E 4.041(,i)-.65 G 4.041(fy)-4.041 G -1.541(ou ha)-4.041 F 1.841 -.15(ve a w)-.2 H 1.541 -(ildcard MX record matching your domain, it will not assume that all).15 -F(names match.)102 421.2 Q 3.454 -.8(To c)127 437.4 T 1.853 -(ompletely turn of).8 F 4.353(fa)-.25 G 1.853(ll name serv)-4.353 F -1.853(er access on systems without service switch support)-.15 F .941 -(\(such as SunOS 4.X\) you will ha)102 449.4 R 1.242 -.15(ve t)-.2 H -3.442(or).15 G .942(ecompile with \255DN)-3.442 F .942 -(AMED_BIND=0 and remo)-.35 F 1.242 -.15(ve \255)-.15 H(lresolv).15 E -(from the list of libraries to be searched when linking.)102 461.4 Q F0 -2.5(4.10. Mo)87 485.4 R(ving the P)-.1 E(er)-.2 E(-User F)-.37 E -(orward Files)-.25 E F1 .772(Some sites mount each user')127 501.6 R -3.272(sh)-.55 G .772(ome directory from a local disk on their w)-3.272 F -.772(orkstation, so that)-.1 F .575(local access is f)102 513.6 R 3.075 -(ast. Ho)-.1 F(we)-.25 E -.15(ve)-.25 G 1.375 -.4(r, t).15 H .575 -(he result is that .forw).4 F .575(ard \214le lookups are slo)-.1 F -4.376 -.65(w. I)-.25 H 3.076(ns).65 G .576(ome cases, mail)-3.076 F .216 -(can e)102 525.6 R -.15(ve)-.25 G 2.716(nb).15 G 2.716(ed)-2.716 G(eli) --2.716 E -.15(ve)-.25 G .216 -(red on machines inappropriately because of a \214le serv).15 F .216 -(er being do)-.15 F 2.716(wn. The)-.25 F(perfor)2.716 E(-)-.2 E -(mance can be especially bad if you run the automounter)102 537.6 Q(.) --.55 E(The)127 553.8 Q F0 -.25(Fo)2.743 G(rwardP).25 E(ath)-.1 E F1(\() -2.743 E F0(J)A F1 2.743(\)o)C .243(ption allo)-2.743 F .243 -(ws you to set a path of forw)-.25 F .243(ard \214les.)-.1 F -.15(Fo) -5.243 G 2.743(re).15 G .244(xample, the con-)-2.893 F(\214g \214le line) -102 565.8 Q 2.5(OF)142 582 S(orw)-2.65 E(ardP)-.1 E(ath=/v)-.15 E -(ar/forw)-.25 E(ard/$u:$z/.forw)-.1 E(ard.$w)-.1 E -.1(wo)102 598.2 S -.208(uld \214rst look for a \214le with the same name as the user').1 F -2.707(sl)-.55 G .207(ogin in /v)-2.707 F(ar/forw)-.25 E .207 -(ard; if that is not found)-.1 F 1.17 -(\(or is inaccessible\) the \214le `)102 610.2 R(`.forw)-.74 E(ard.)-.1 -E F2(mac)A(hinename)-.15 E F1 2.651 -.74('' i)D 3.671(nt).74 G 1.171 -(he user')-3.671 F 3.671(sh)-.55 G 1.171(ome directory is searched.) --3.671 F(A)6.171 E(truly perv)102 622.2 Q -(erse site could also search by sender by using $r)-.15 E 2.5(,$)-.4 G -(s, or $f.)-2.5 E .69(If you create a directory such as /v)127 638.4 R -(ar/forw)-.25 E .69(ard, it should be mode 1777 \(that is, the stick)-.1 -F 3.19(yb)-.15 G(it)-3.19 E .134(should be set\).)102 650.4 R .134 -(Users should create the \214les mode 644.)5.134 F .135 -(Note that you must use the forw)5.134 F(ard\214leinun-)-.1 E 1.1 -(safedirpath and forw)102 662.4 R 1.1(ard\214leinunsafedirpathsafe \215ags with the DontBlameSendmail option to allo) --.1 F(w)-.25 E(forw)102 674.4 Q 1.168(ard \214les in a w)-.1 F 1.169 -(orld writable directory)-.1 F 6.169(.T)-.65 G 1.169 -(his might also be used as a denial of service attack)-6.169 F .635 -(\(users could create forw)102 686.4 R .635 -(ard \214les for other users\); a better approach might be to create /v) --.1 F(ar/forw)-.25 E(ard)-.1 E .661 -(mode 755 and create empty \214les for each user)102 698.4 R 3.161(,o) --.4 G .661(wned by that user)-3.411 F 3.161(,m)-.4 G .661(ode 644.) --3.161 F .661(If you do this, you)5.661 F(don')102 710.4 Q 2.5(th)-.18 G --2.25 -.2(av e)-2.5 H -(to set the DontBlameSendmail options indicated abo)2.7 E -.15(ve)-.15 G -(.).15 E EP -%%Page: 31 27 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-31)195.86 E 2.5(4.11. Fr)87 96 R(ee Space)-.18 E/F1 10 -/Times-Roman@0 SF 1.406(On systems that ha)127 112.2 R 1.706 -.15(ve o) --.2 H 1.405(ne of the system calls in the).15 F/F2 10/Times-Italic@0 SF -(statfs)3.905 E F1 1.405(\(2\) f)B 1.405(amily \(including)-.1 F F2 -(statvfs)3.905 E F1(and)3.905 E F2(ustat)102 124.2 Q F1 .839(\), you can specify a minimum number of free blocks on the queue \214lesystem using the) -B F0(Min-)3.34 E(Fr)102 136.2 Q(eeBlocks)-.18 E F1(\()2.554 E F0(b)A F1 -2.554(\)o)C 2.553(ption. If)-2.554 F .053(there are fe)2.553 F .053 -(wer than the indicated number of blocks free on the \214lesystem)-.25 F -1.354(on which the queue is mounted the SMTP serv)102 148.2 R 1.355 -(er will reject mail with the 452 error code.)-.15 F(This)6.355 E(in)102 -160.2 Q(vites the SMTP client to try ag)-.4 E(ain later)-.05 E(.)-.55 E -(Be)127 176.4 Q -.1(wa)-.25 G .746(re of setting this option too high; it can cause rejection of email when that mail w) -.1 F(ould)-.1 E(be processed without dif)102 188.4 Q(\214culty)-.25 E(.) --.65 E F0 2.5(4.12. Maximum)87 212.4 R(Message Size)2.5 E F1 2.077 -.8 -(To a)127 228.6 T -.2(vo).6 G .477(id o).2 F -.15(ve)-.15 G(r\215o).15 E -.478(wing your system with a lar)-.25 F .478(ge message, the)-.18 F F0 -(MaxMessageSize)2.978 E F1 .478(option can be)2.978 F .693 -(set to set an absolute limit on the size of an)102 240.6 R 3.193(yo) --.15 G .693(ne message.)-3.193 F .692(This will be adv)5.692 F .692 -(ertised in the ESMTP)-.15 F(dialogue and check)102 252.6 Q -(ed during message collection.)-.1 E F0 2.5(4.13. Pri)87 276.6 R -.1(va) --.1 G(cy Flags).1 E F1(The)127 292.8 Q F0(Pri)2.96 E -.1(va)-.1 G -(cyOptions).1 E F1(\()2.96 E F0(p)A F1 2.96(\)o)C .46(ption allo)-2.96 F -.46(ws you to set certain `)-.25 F(`pri)-.74 E -.25(va)-.25 G -.15(cy) -.25 G 1.94 -.74('' \215).15 H 2.96(ags. Actually).74 F 2.96(,m)-.65 G -(an)-2.96 E 2.96(yo)-.15 G(f)-2.96 E .534(them don')102 304.8 R 3.034 -(tg)-.18 G -2.15 -.25(iv e)-3.034 H .534(you an)3.284 F 3.034(ye)-.15 G -.534(xtra pri)-3.184 F -.25(va)-.25 G -.15(cy).25 G 3.034(,r)-.5 G .534 -(ather just insisting that client SMTP serv)-3.034 F .533 -(ers use the HELO)-.15 F 2.87 -(command before using certain commands or adding e)102 316.8 R 2.87 -(xtra headers to indicate possible spoof)-.15 F(attempts.)102 328.8 Q -.124(The option tak)127 345 R .124 -(es a series of \215ag names; the \214nal pri)-.1 F -.25(va)-.25 G .424 --.15(cy i).25 H 2.624(st).15 G .124(he inclusi)-2.624 F .424 -.15(ve o) --.25 H 2.624(ro).15 G 2.624(ft)-2.624 G .123(hose \215ags.)-2.624 F -.15 -(Fo)5.123 G(r).15 E -.15(ex)102 357 S(ample:).15 E 2.5(OP)142 373.2 S -(ri)-2.5 E -.25(va)-.25 G -.15(cy).25 G(Options=needmailhelo, noe).15 E -(xpn)-.15 E .928(insists that the HELO or EHLO command be used before a MAIL command is accepted and dis-) -102 389.4 R(ables the EXPN command.)102 401.4 Q -(The \215ags are detailed in section 5.6.)127 417.6 Q F0 2.5(4.14. Send) -87 441.6 R(to Me T)2.5 E(oo)-.92 E F1(Normally)127 457.8 Q(,)-.65 E F2 -(sendmail)3.424 E F1 .924(deletes the \(en)3.424 F -.15(ve)-.4 G .923 -(lope\) sender from an).15 F 3.423(yl)-.15 G .923(ist e)-3.423 F 3.423 -(xpansions. F)-.15 F .923(or e)-.15 F .923(xample, if)-.15 F .761(\231matt\232 sends to a list that contains \231matt\232 as one of the members he w) -102 469.8 R(on')-.1 E 3.261(tg)-.18 G .761(et a cop)-3.261 F 3.261(yo) --.1 G 3.261(ft)-3.261 G .761(he mes-)-3.261 F 2.883(sage. If)102 481.8 R -(the)2.883 E F0<ad6d>2.883 E F1 .383 -(\(me too\) command line \215ag, or if the)2.883 F F0(MeT)2.883 E(oo) --.92 E F1(\()2.882 E F0(m)A F1 2.882(\)o)C .382 -(ption is set in the con\214guration)-2.882 F(\214le, this beha)102 -493.8 Q(viour is suppressed.)-.2 E(Some sites lik)5 E 2.5(et)-.1 G 2.5 -(or)-2.5 G(un the)-2.5 E/F3 9/Times-Roman@0 SF(SMTP)2.5 E F1 -(daemon with)2.5 E F0<ad6d>2.5 E F1(.)A F0 2.5(5. THE)72 517.8 R -(WHOLE SCOOP ON THE CONFIGURA)2.5 E(TION FILE)-.95 E F1 -(This section describes the con\214guration \214le in detail.)112 534 Q -.648(There is one point that should be made clear immediately: the syntax of the con\214guration \214le is) -112 550.2 R 1.077 -(designed to be reasonably easy to parse, since this is done e)87 562.2 -R -.15(ve)-.25 G 1.076(ry time).15 F F2(sendmail)3.576 E F1 1.076 -(starts up, rather than)3.576 F(easy for a human to read or write.)87 -574.2 Q(On the \231future project\232 list is a con\214guration-\214le compiler) -5 E(.)-.55 E .243(The con\214guration \214le is or)112 590.4 R -.05(ga) --.18 G .243(nized as a series of lines, each of which be).05 F .243 -(gins with a single charac-)-.15 F .102 -(ter de\214ning the semantics for the rest of the line.)87 602.4 R .102 -(Lines be)5.102 F .102(ginning with a space or a tab are continuation) --.15 F 1.322 -(lines \(although the semantics are not well de\214ned in man)87 614.4 R -3.823(yp)-.15 G 3.823(laces\). Blank)-3.823 F 1.323(lines and lines be) -3.823 F(ginning)-.15 E(with a sharp symbol \(`#'\) are comments.)87 -626.4 Q F0 2.5(5.1. R)87 650.4 R(and S \212 Rewriting Rules)2.5 E F1 -.466(The core of address parsing are the re)127 666.6 R .466 -(writing rules.)-.25 F .465(These are an ordered production system.) -5.466 F F2(Sendmail)102 678.6 Q F1 .19(scans through the set of re)2.69 -F .19 -(writing rules looking for a match on the left hand side \(LHS\) of)-.25 -F(the rule.)102 690.6 Q(When a rule matches, the address is replaced by the right hand side \(RHS\) of the rule.) -5 E .922(There are se)127 706.8 R -.15(ve)-.25 G .922(ral sets of re).15 -F .921(writing rules.)-.25 F .921(Some of the re)5.921 F .921 -(writing sets are used internally and)-.25 F .359(must ha)102 718.8 R -.659 -.15(ve s)-.2 H .359(peci\214c semantics.).15 F .359(Other re)5.359 -F .359(writing sets do not ha)-.25 F .659 -.15(ve s)-.2 H .36 -(peci\214cally assigned semantics, and).15 F EP -%%Page: 32 28 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-32 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF -(may be referenced by the mailer de\214nitions or by other re)102 96 Q -(writing sets.)-.25 E(The syntax of these tw)127 112.2 Q 2.5(oc)-.1 G -(ommands are:)-2.5 E F0(S)142 128.4 Q/F2 10/Times-Italic@0 SF(n)A F1 -.249(Sets the current ruleset being collected to)102 144.6 R F2(n)2.749 -E F1 5.249(.I)C 2.748(fy)-5.249 G .248(ou be)-2.748 F .248 -(gin a ruleset more than once it appends to the)-.15 F -(old de\214nition.)102 156.6 Q F0(R)142 172.8 Q F2(lhs rhs comments)A F1 -1.185(The \214elds must be separated by at least one tab character; there may be embedded spaces in the) -102 189 R 2.595(\214elds. The)102 201 R F2(lhs)2.595 E F1 .095 -(is a pattern that is applied to the input.)2.595 F .095 -(If it matches, the input is re)5.095 F .094(written to the)-.25 F F2 -(rhs)2.594 E F1(.)A(The)102 213 Q F2(comments)2.5 E F1(are ignored.)2.5 -E .755(Macro e)127 229.2 R .755(xpansions of the form)-.15 F F0($)3.255 -E F2(x)A F1 .755(are performed when the con\214guration \214le is read.) -3.255 F(Expan-)5.755 E .577(sions of the form)102 241.2 R F0($&)3.077 E -F2(x)A F1 .577(are performed at run time using a some)3.077 F .577 -(what less general algorithm.)-.25 F .577(This is)5.577 F -(intended only for referencing internally de\214ned macros such as)102 -253.2 Q F0($h)2.5 E F1(that are changed at runtime.)2.5 E F0 2.5 -(5.1.1. The)102 277.2 R(left hand side)2.5 E F1 2.77 -(The left hand side of re)142 293.4 R 2.771 -(writing rules contains a pattern.)-.25 F 2.771(Normal w)7.771 F 2.771 -(ords are simply)-.1 F(matched directly)117 305.4 Q 5(.M)-.65 G -(etasyntax is introduced using a dollar sign.)-5 E(The metasymbols are:) -5 E F0($*)157 321.6 Q F1(Match zero or more tok)10.14 E(ens)-.1 E F0($+) -157 333.6 Q F1(Match one or more tok)9.44 E(ens)-.1 E F0<24ad>157 345.6 -Q F1(Match e)9.44 E(xactly one tok)-.15 E(en)-.1 E F0($=)157 357.6 Q F2 -(x)A F1(Match an)5 E 2.5(yp)-.15 G(hrase in class)-2.5 E F2(x)2.5 E F0 -($~)157 369.6 Q F2(x)A F1(Match an)7.37 E 2.5(yw)-.15 G -(ord not in class)-2.6 E F2(x)2.5 E F1 .132(If an)117 385.8 R 2.632(yo) --.15 G 2.632(ft)-2.632 G .132(hese match, the)-2.632 F 2.632(ya)-.15 G -.132(re assigned to the symbol)-2.632 F F0($)2.632 E F2(n)A F1 .131 -(for replacement on the right hand side,)2.632 F(where)117 397.8 Q F2(n) -2.5 E F1(is the inde)2.5 E 2.5(xi)-.15 G 2.5(nt)-2.5 G(he LHS.)-2.5 E --.15(Fo)5 G 2.5(re).15 G(xample, if the LHS:)-2.65 E($\255:$+)157 414 Q -(is applied to the input:)117 430.2 Q(UCB)157 446.4 Q(ARP)-.35 E(A:eric) --.92 E(the rule will match, and the v)117 462.6 Q -(alues passed to the RHS will be:)-.25 E 7.5($1 UCB)157 478.8 R(ARP)-.35 -E(A)-.92 E 7.5($2 eric)157 490.8 R(Additionally)142 511.2 Q 2.704(,t) --.65 G .204(he LHS can include)-2.704 F F0($@)2.704 E F1 .204 -(to match zero tok)2.704 F 2.704(ens. This)-.1 F(is)2.704 E F2(not)2.704 -E F1 .204(bound to a)2.704 F F0($)2.705 E F2(n)A F1(on)2.705 E(the RHS, and is normally only used when it stands alone in order to match the null input.) -117 523.2 Q F0 2.5(5.1.2. The)102 547.2 R(right hand side)2.5 E F1 .649 -(When the left hand side of a re)142 563.4 R .649 -(writing rule matches, the input is deleted and replaced by)-.25 F 1.036 -(the right hand side.)117 575.4 R -.8(To)6.036 G -.1(ke).8 G 1.036 -(ns are copied directly from the RHS unless the).1 F 3.537(yb)-.15 G --.15(eg)-3.537 G 1.037(in with a dollar).15 F 2.5(sign. Metasymbols)117 -587.4 R(are:)2.5 E F0($)157 603.6 Q F2(n)A F1 -(Substitute inde\214nite tok)40.55 E(en)-.1 E F2(n)2.5 E F1(from LHS)2.5 -E F0($[)157 615.6 Q F2(name)A F0($])A F1(Canonicalize)12.23 E F2(name) -2.5 E F0($\()157 627.6 Q F2(map k)A -.3(ey)-.1 G F0($@)2.8 E F2(ar)A -(guments)-.37 E F0($:)2.5 E F2(default)A F0($\))2.5 E F1(Generalized k) -207.55 639.6 Q -.15(ey)-.1 G(ed mapping function).15 E F0($>)157 651.6 Q -F2(n)A F1(\231Call\232 ruleset)34.85 E F2(n)2.5 E F0($#)157 663.6 Q F2 -(mailer)A F1(Resolv)14.44 E 2.5(et)-.15 G(o)-2.5 E F2(mailer)2.5 E F0 -($@)157 675.6 Q F2(host)A F1(Specify)19.58 E F2(host)2.5 E F0($:)157 -687.6 Q F2(user)A F1(Specify)25 E F2(user)2.5 E F1(The)142 708 Q F0($) -3.137 E F2(n)A F1 .637(syntax substitutes the corresponding v)3.137 F -.637(alue from a)-.25 F F0($+)3.137 E F1(,)A F0<24ad>3.137 E F1(,)A F0 -($*)3.137 E F1(,)A F0($=)3.137 E F1 3.137(,o)C(r)-3.137 E F0($~)3.137 E -F1 .636(match on)3.136 F(the LHS.)117 720 Q(It may be used an)5 E -(ywhere.)-.15 E EP -%%Page: 33 29 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-33)195.86 E/F1 10/Times-Roman@0 SF 2.705(Ah)142 96 S .205 -(ost name enclosed between)-2.705 F F0($[)2.705 E F1(and)2.705 E F0($]) -2.706 E F1 .206(is look)2.706 F .206 -(ed up in the host database\(s\) and replaced)-.1 F 1.683 -(by the canonical name)117 110 R/F2 7/Times-Roman@0 SF(15)-4 I F1 6.683 -(.F)4 K 1.683(or e)-6.833 F 1.683 -(xample, \231$[ftp$]\232 might become \231ftp.CS.Berk)-.15 F(ele)-.1 E --.65(y.)-.15 G 1.683(EDU\232 and).65 F 3.17 -(\231$[[128.32.130.2]$]\232 w)117 122 R 3.17(ould become \231v)-.1 F -(angogh.CS.Berk)-.25 E(ele)-.1 E -.65(y.)-.15 G(EDU.).65 E<9a>-.7 E/F3 -10/Times-Italic@0 SF(Sendmail)8.17 E F1 3.17(recognizes its)5.67 F -(numeric IP address without calling the name serv)117 134 Q -(er and replaces it with its canonical name.)-.15 E(The)142 150.2 Q F0 -($\()3.004 E F1(...)3.004 E F0($\))5.504 E F1 .503(syntax is a more general form of lookup; it uses a named map instead of an) -3.003 F .809(implicit map.)117 162.2 R .809 -(If no lookup is found, the indicated)5.809 F F3(default)3.309 E F1 .81 -(is inserted; if no def)3.309 F .81(ault is speci\214ed)-.1 F .776 -(and no lookup matches, the v)117 174.2 R .776(alue is left unchanged.) --.25 F(The)5.776 E F3(ar)3.276 E(guments)-.37 E F1 .775 -(are passed to the map for)3.275 F(possible use.)117 186.2 Q(The)142 -202.4 Q F0($>)2.619 E F3(n)A F1 .119(syntax causes the remainder of the line to be substituted as usual and then passed) -2.619 F .587(as the ar)117 214.4 R .587(gument to ruleset)-.18 F F3(n) -3.087 E F1 5.587(.T)C .587(he \214nal v)-5.587 F .586(alue of ruleset) --.25 F F3(n)3.086 E F1 .586(then becomes the substitution for this)3.086 -F 3.758(rule. The)117 226.4 R F0($>)3.758 E F1 1.258(syntax e)3.758 F -1.258(xpands e)-.15 F -.15(ve)-.25 G 1.259 -(rything after the ruleset name to the end of the replacement).15 F .976 -(string and then passes that as the initial input to the ruleset.)117 -238.4 R(Recursi)5.976 E 1.276 -.15(ve c)-.25 H .976(alls are allo).15 F -3.476(wed. F)-.25 F(or)-.15 E -.15(ex)117 250.4 S(ample,).15 E -($>0 $>3 $1)157 266.6 Q -.15(ex)117 282.8 S(pands $1, passes that to ruleset 3, and then passes the result of ruleset 3 to ruleset 0.) -.15 E(The)142 299 Q F0($#)2.507 E F1 .007(syntax should)2.507 F F3(only) -2.507 E F1 .008 -(be used in ruleset zero or a subroutine of ruleset zero.)2.507 F .008 -(It causes)5.008 F -.25(eva)117 311 S .685 -(luation of the ruleset to terminate immediately).25 F 3.184(,a)-.65 G -.684(nd signals to)-3.184 F F3(sendmail)3.184 E F1 .684 -(that the address has)3.184 F(completely resolv)117 323 Q 2.5(ed. The) --.15 F(complete syntax is:)2.5 E F0($#)157 339.2 Q F3(mailer)A F0($@)2.5 -E F3(host)A F0($:)2.5 E F3(user)A F1 1.394(This speci\214es the {mailer) -117 355.4 R 3.894(,h)-.4 G 1.394 -(ost, user} 3-tuple necessary to direct the mailer)-3.894 F 6.394(.I) --.55 G 3.894(ft)-6.394 G 1.394(he mailer is)-3.894 F .774 -(local the host part may be omitted)117 369.4 R F2(16)-4 I F1 5.774(.T)4 -K(he)-5.774 E F3(mailer)3.274 E F1 .775(must be a single w)3.274 F .775 -(ord, b)-.1 F .775(ut the)-.2 F F3(host)3.275 E F1(and)3.275 E F3(user) -3.275 E F1 .253(may be multi-part.)117 381.4 R .253(If the)5.253 F F3 -(mailer)2.753 E F1 .253(is the b)2.753 F .253(uiltin IPC mailer)-.2 F -2.753(,t)-.4 G(he)-2.753 E F3(host)2.753 E F1 .253 -(may be a colon-separated list)2.753 F .5 -(of hosts that are searched in order for the \214rst w)117 393.4 R .5 -(orking address \(e)-.1 F .5(xactly lik)-.15 F 3(eM)-.1 G 3(Xr)-3 G 3 -(ecords\). The)-3 F F3(user)117 405.4 Q F1 .036(is later re)2.536 F .036 -(written by the mailer)-.25 F .036(-speci\214c en)-.2 F -.15(ve)-.4 G -.036(lope re).15 F .036(writing set and assigned to the)-.25 F F0($u) -2.536 E F1(macro.)2.536 E .162 -(As a special case, if the mailer speci\214ed has the)117 417.4 R F0 -(F=@)2.662 E F1 .163 -(\215ag speci\214ed and the \214rst character of the)2.662 F F0($:)117 -429.4 Q F1 -.25(va)3.377 G .877 -(lue is \231@\232, the \231@\232 is stripped of).25 F .876 -(f, and a \215ag is set in the address descriptor that causes)-.25 F -(sendmail to not do ruleset 5 processing.)117 441.4 Q(Normally)142 457.6 -Q 3.251(,ar)-.65 G .751 -(ule that matches is retried, that is, the rule loops until it f)-3.251 -F 3.252(ails. A)-.1 F .752(RHS may)3.252 F 1.086(also be preceded by a) -117 469.6 R F0($@)3.586 E F1 1.085(or a)3.585 F F0($:)3.585 E F1 1.085 -(to change this beha)3.585 F(vior)-.2 E 6.085(.A)-.55 G F0($@)-2.5 E F1 -1.085(pre\214x causes the ruleset to)3.585 F 1.46 -(return with the remainder of the RHS as the v)117 481.6 R 3.96(alue. A) --.25 F F0($:)3.96 E F1 1.46(pre\214x causes the rule to terminate)3.96 F -(immediately)117 493.6 Q 3.756(,b)-.65 G 1.256 -(ut the ruleset to continue; this can be used to a)-3.956 F -.2(vo)-.2 G -1.256(id continued application of a).2 F 2.5(rule. The)117 505.6 R -(pre\214x is stripped before continuing.)2.5 E(The)142 521.8 Q F0($@)2.5 -E F1(and)2.5 E F0($:)2.5 E F1(pre\214x)2.5 E(es may precede a)-.15 E F0 -($>)2.5 E F1(spec; for e)2.5 E(xample:)-.15 E 20.19(R$+ $:)157 538 R -($>7 $1)2.5 E 1.256(matches an)117 554.2 R 1.256 -(ything, passes that to ruleset se)-.15 F -.15(ve)-.25 G 1.256 -(n, and continues; the).15 F F0($:)3.756 E F1 1.256(is necessary to a) -3.756 F -.2(vo)-.2 G 1.256(id an).2 F(in\214nite loop.)117 566.2 Q 1.205 -(Substitution occurs in the order described, that is, parameters from the LHS are substi-) -142 582.4 R .219(tuted, hostnames are canonicalized, \231subroutines\232 are called, and \214nally) -117 594.4 R F0($#)2.719 E F1(,)A F0($@)2.719 E F1 2.72(,a)C(nd)-2.72 E -F0($:)2.72 E F1 .22(are pro-)2.72 F(cessed.)117 606.4 Q .32 LW 76 655.6 -72 655.6 DL 80 655.6 76 655.6 DL 84 655.6 80 655.6 DL 88 655.6 84 655.6 -DL 92 655.6 88 655.6 DL 96 655.6 92 655.6 DL 100 655.6 96 655.6 DL 104 -655.6 100 655.6 DL 108 655.6 104 655.6 DL 112 655.6 108 655.6 DL 116 -655.6 112 655.6 DL 120 655.6 116 655.6 DL 124 655.6 120 655.6 DL 128 -655.6 124 655.6 DL 132 655.6 128 655.6 DL 136 655.6 132 655.6 DL 140 -655.6 136 655.6 DL 144 655.6 140 655.6 DL 148 655.6 144 655.6 DL 152 -655.6 148 655.6 DL 156 655.6 152 655.6 DL 160 655.6 156 655.6 DL 164 -655.6 160 655.6 DL 168 655.6 164 655.6 DL 172 655.6 168 655.6 DL 176 -655.6 172 655.6 DL 180 655.6 176 655.6 DL 184 655.6 180 655.6 DL 188 -655.6 184 655.6 DL 192 655.6 188 655.6 DL 196 655.6 192 655.6 DL 200 -655.6 196 655.6 DL 204 655.6 200 655.6 DL 208 655.6 204 655.6 DL 212 -655.6 208 655.6 DL 216 655.6 212 655.6 DL/F4 5/Times-Roman@0 SF(15)93.6 -666 Q/F5 8/Times-Roman@0 SF(This is actually completely equi)3.2 I -.2 -(va)-.2 G(lent to $\(host).2 E/F6 8/Times-Italic@0 SF(hostname)2 E F5 2 -($\). In)B(particular)2 E 2(,a)-.32 G/F7 8/Times-Bold@0 SF($:)A F5(def)2 -E(ault can be used.)-.08 E F4(16)93.6 679.6 Q F5 -.88(Yo)3.2 K 2.726(um) -.88 G .726(ay w)-2.726 F .726 -(ant to use it for special \231per user\232 e)-.08 F 2.726(xtensions. F) --.12 F .726(or e)-.12 F .725 -(xample, in the address \231jgm+foo@CMU.EDU\232; the \231+foo\232)-.12 F -(part is not part of the user name, and is passed to the local mailer for local use.) -72 692.4 Q EP -%%Page: 34 30 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-34 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E 2.5(5.1.3. Semantics)102 96 R -(of r)2.5 E(ewriting rule sets)-.18 E/F1 10/Times-Roman@0 SF 1.848 -(There are six re)142 112.2 R 1.847(writing sets that ha)-.25 F 2.147 --.15(ve s)-.2 H 1.847(peci\214c semantics.).15 F(Fi)6.847 E 2.147 -.15 -(ve o)-.25 H 4.347(ft).15 G 1.847(hese are related as)-4.347 F -(depicted by \214gure 1.)117 124.2 Q 1.029 -(Ruleset three should turn the address into \231canonical form.)142 -140.4 R 6.029<9a54>-.7 G 1.03(his form should ha)-6.029 F 1.33 -.15 -(ve t)-.2 H(he).15 E(basic syntax:)117 152.4 Q -(local-part@host-domain-spec)157 168.6 Q(Ruleset three is applied by)117 -184.8 Q/F2 10/Times-Italic@0 SF(sendmail)2.5 E F1(before doing an)2.5 E -(ything with an)-.15 E 2.5(ya)-.15 G(ddress.)-2.5 E .302 -(If no \231@\232 sign is speci\214ed, then the host-domain-spec)142 201 -R F2(may)2.801 E F1 .301(be appended \(box \231D\232 in Fig-)2.801 F -.577(ure 1\) from the sender address \(if the)117 213 R F0(C)3.077 E F1 -.577(\215ag is set in the mailer de\214nition corresponding to the)3.077 -F F2(sending)117 225 Q F1(mailer\).)2.5 E 1.021(Ruleset zero is applied after ruleset three to addresses that are going to actually specify) -142 241.2 R 3.663(recipients. It)117 253.2 R 1.163(must resolv)3.663 F -3.663(et)-.15 G 3.664(oa)-3.663 G F2({mailer)A 3.664(,h)-1.11 G 1.164 -(ost, user})-3.664 F F1 3.664(triple. The)3.664 F F2(mailer)3.664 E F1 -1.164(must be de\214ned in the)3.664 F .752 -(mailer de\214nitions from the con\214guration \214le.)117 265.2 R(The) -5.751 E F2(host)3.251 E F1 .751(is de\214ned into the)3.251 F F0($h) -3.251 E F1 .751(macro for use in)3.251 F(the ar)117 277.2 Q(gv e)-.18 E -(xpansion of the speci\214ed mailer)-.15 E(.)-.55 E .452 -(Rulesets one and tw)142 293.4 R 2.952(oa)-.1 G .452 -(re applied to all sender and recipient addresses respecti)-2.952 F -.15 -(ve)-.25 G(ly).15 E 5.453(.T)-.65 G(he)-5.453 E(y)-.15 E -(are applied before an)117 305.4 Q 2.5(ys)-.15 G -(peci\214cation in the mailer de\214nition.)-2.5 E(The)5 E 2.5(ym)-.15 G -(ust ne)-2.5 E -.15(ve)-.25 G 2.5(rr).15 G(esolv)-2.5 E(e.)-.15 E 1.266 -(Ruleset four is applied to all addresses in the message.)142 321.6 R -1.265(It is typically used to translate)6.265 F(internal to e)117 333.6 -Q(xternal form.)-.15 E .652(In addition, ruleset 5 is applied to all local addresses \(speci\214cally) -142 349.8 R 3.153(,t)-.65 G .653(hose that resolv)-3.153 F 3.153(et)-.15 -G 3.153(oa)-3.153 G .296 -(mailer with the `F=5' \215ag set\) that do not ha)117 361.8 R .596 -.15 -(ve a)-.2 H 2.796(liases. This).15 F(allo)2.796 E .296 -(ws a last minute hook for local)-.25 F(names.)117 373.8 Q F0 2.5 -(5.1.4. Ruleset)102 397.8 R(hooks)2.5 E F1 3.814(Af)142 414 S 1.814 -.25 -(ew e)-3.814 H 1.315(xtra rulesets are de\214ned as \231hooks\232 that can be de\214ned to get special features.) -.1 F(The)117 426 Q 3.468(ya)-.15 G .968(re all named rulesets.)-3.468 F -.968(The \231check_*\232 forms all gi)5.968 F 1.268 -.15(ve a)-.25 H -.968(ccept/reject status; f).15 F .967(alling of)-.1 F 3.467(ft)-.25 G -(he)-3.467 E .502 -(end or returning normally is an accept, and resolving to)117 438 R F0 -($#err)3.002 E(or)-.18 E F1 .502(is a reject.)3.002 F(Man)5.502 E 3.002 -(yo)-.15 G 3.002(ft)-3.002 G .502(hese can)-3.002 F .166(also resolv)117 -450 R 2.666(et)-.15 G 2.666(ot)-2.666 G .166(he special mailer)-2.666 F -F0($#discard)2.666 E F1 2.666(;t)C .166 -(his accepts the message as though it were success-)-2.666 F(ful b)117 -462 Q(ut then discards it without deli)-.2 E -.15(ve)-.25 G(ry).15 E(.) --.65 E .4 LW 77 486 72 486 DL 79 486 74 486 DL 84 486 79 486 DL 89 486 -84 486 DL 94 486 89 486 DL 99 486 94 486 DL 104 486 99 486 DL 109 486 -104 486 DL 114 486 109 486 DL 119 486 114 486 DL 124 486 119 486 DL 129 -486 124 486 DL 134 486 129 486 DL 139 486 134 486 DL 144 486 139 486 DL -149 486 144 486 DL 154 486 149 486 DL 159 486 154 486 DL 164 486 159 486 -DL 169 486 164 486 DL 174 486 169 486 DL 179 486 174 486 DL 184 486 179 -486 DL 189 486 184 486 DL 194 486 189 486 DL 199 486 194 486 DL 204 486 -199 486 DL 209 486 204 486 DL 214 486 209 486 DL 219 486 214 486 DL 224 -486 219 486 DL 229 486 224 486 DL 234 486 229 486 DL 239 486 234 486 DL -244 486 239 486 DL 249 486 244 486 DL 254 486 249 486 DL 259 486 254 486 -DL 264 486 259 486 DL 269 486 264 486 DL 274 486 269 486 DL 279 486 274 -486 DL 284 486 279 486 DL 289 486 284 486 DL 294 486 289 486 DL 299 486 -294 486 DL 304 486 299 486 DL 309 486 304 486 DL 314 486 309 486 DL 319 -486 314 486 DL 324 486 319 486 DL 329 486 324 486 DL 334 486 329 486 DL -339 486 334 486 DL 344 486 339 486 DL 349 486 344 486 DL 354 486 349 486 -DL 359 486 354 486 DL 364 486 359 486 DL 369 486 364 486 DL 374 486 369 -486 DL 379 486 374 486 DL 384 486 379 486 DL 389 486 384 486 DL 394 486 -389 486 DL 399 486 394 486 DL 404 486 399 486 DL 409 486 404 486 DL 414 -486 409 486 DL 419 486 414 486 DL 424 486 419 486 DL 429 486 424 486 DL -434 486 429 486 DL 439 486 434 486 DL 444 486 439 486 DL 449 486 444 486 -DL 454 486 449 486 DL 459 486 454 486 DL 464 486 459 486 DL 469 486 464 -486 DL 474 486 469 486 DL 479 486 474 486 DL 484 486 479 486 DL 489 486 -484 486 DL 494 486 489 486 DL 499 486 494 486 DL 504 486 499 486 DL -(addr)91.915 580.6 Q 133.2 578.4 111.6 578.4 DL 133.2 578.4 MT -7.2 1.8 -RL 0 -3.6 RL CL BL 133.2 578.4 MT -7.2 1.8 RL 0 -3.6 RL CL ST 154.8 -589.2 MT 0 -21.6 RL -21.6 0 RL 0 21.6 RL CL ST(3)141.5 580.6 Q 176.4 -578.4 154.8 578.4 DL 176.4 578.4 MT -7.2 1.8 RL 0 -3.6 RL CL BL 176.4 -578.4 MT -7.2 1.8 RL 0 -3.6 RL CL ST 198 589.2 MT 0 -21.6 RL -21.6 0 RL -0 21.6 RL CL ST(D)183.59 580.6 Q 219.6 578.4 198 578.4 DL 277.2 560.4 -255.6 560.4 DL 277.2 560.4 MT -7.2 1.8 RL 0 -3.6 RL CL BL 277.2 560.4 MT --7.2 1.8 RL 0 -3.6 RL CL ST 298.8 571.2 MT 0 -21.6 RL -21.6 0 RL 0 21.6 -RL CL ST(1)285.5 562.6 Q 320.4 560.4 298.8 560.4 DL 320.4 560.4 MT -7.2 -1.8 RL 0 -3.6 RL CL BL 320.4 560.4 MT -7.2 1.8 RL 0 -3.6 RL CL ST 342 -571.2 MT 0 -21.6 RL -21.6 0 RL 0 21.6 RL CL ST(S)328.42 562.6 Q 363.6 -560.4 342 560.4 DL 277.2 596.4 255.6 596.4 DL 277.2 596.4 MT -7.2 1.8 RL -0 -3.6 RL CL BL 277.2 596.4 MT -7.2 1.8 RL 0 -3.6 RL CL ST 298.8 607.2 -MT 0 -21.6 RL -21.6 0 RL 0 21.6 RL CL ST(2)285.5 598.6 Q 320.4 596.4 -298.8 596.4 DL 320.4 596.4 MT -7.2 1.8 RL 0 -3.6 RL CL BL 320.4 596.4 MT --7.2 1.8 RL 0 -3.6 RL CL ST 342 607.2 MT 0 -21.6 RL -21.6 0 RL 0 21.6 RL -CL ST(R)327.865 598.6 Q 363.6 596.4 342 596.4 DL 421.2 578.4 399.6 578.4 -DL 421.2 578.4 MT -7.2 1.8 RL 0 -3.6 RL CL BL 421.2 578.4 MT -7.2 1.8 RL -0 -3.6 RL CL ST 442.8 589.2 MT 0 -21.6 RL -21.6 0 RL 0 21.6 RL CL ST(4) -429.5 580.6 Q 464.4 578.4 442.8 578.4 DL 464.4 578.4 MT -7.2 1.8 RL 0 --3.6 RL CL BL 464.4 578.4 MT -7.2 1.8 RL 0 -3.6 RL CL ST(msg)466.865 -580.6 Q 255.6 560.4 219.6 578.4 DL 255.6 596.4 219.6 578.4 DL 399.6 -578.4 363.6 560.4 DL 399.6 578.4 363.6 596.4 DL 208.8 524.4 187.2 524.4 -DL 208.8 524.4 MT -7.2 1.8 RL 0 -3.6 RL CL BL 208.8 524.4 MT -7.2 1.8 RL -0 -3.6 RL CL ST 230.4 535.2 MT 0 -21.6 RL -21.6 0 RL 0 21.6 RL CL ST(0) -217.1 526.6 Q 252 524.4 230.4 524.4 DL 252 524.4 MT -7.2 1.8 RL 0 -3.6 -RL CL BL 252 524.4 MT -7.2 1.8 RL 0 -3.6 RL CL ST(resolv)265.69 526.6 Q -(ed address)-.15 E 187.2 524.4 162 578.4 DL(Figure 1 \212 Re)216.045 -626.4 Q(writing set semantics)-.25 E 2.5(D\212s)209.35 638.4 S -(ender domain addition)-2.5 E 2.5(S\212m)209.35 650.4 S(ailer)-2.5 E -(-speci\214c sender re)-.2 E(writing)-.25 E 2.5(R\212m)209.35 662.4 S -(ailer)-2.5 E(-speci\214c recipient re)-.2 E(writing)-.25 E 77 674.4 72 -674.4 DL 79 674.4 74 674.4 DL 84 674.4 79 674.4 DL 89 674.4 84 674.4 DL -94 674.4 89 674.4 DL 99 674.4 94 674.4 DL 104 674.4 99 674.4 DL 109 -674.4 104 674.4 DL 114 674.4 109 674.4 DL 119 674.4 114 674.4 DL 124 -674.4 119 674.4 DL 129 674.4 124 674.4 DL 134 674.4 129 674.4 DL 139 -674.4 134 674.4 DL 144 674.4 139 674.4 DL 149 674.4 144 674.4 DL 154 -674.4 149 674.4 DL 159 674.4 154 674.4 DL 164 674.4 159 674.4 DL 169 -674.4 164 674.4 DL 174 674.4 169 674.4 DL 179 674.4 174 674.4 DL 184 -674.4 179 674.4 DL 189 674.4 184 674.4 DL 194 674.4 189 674.4 DL 199 -674.4 194 674.4 DL 204 674.4 199 674.4 DL 209 674.4 204 674.4 DL 214 -674.4 209 674.4 DL 219 674.4 214 674.4 DL 224 674.4 219 674.4 DL 229 -674.4 224 674.4 DL 234 674.4 229 674.4 DL 239 674.4 234 674.4 DL 244 -674.4 239 674.4 DL 249 674.4 244 674.4 DL 254 674.4 249 674.4 DL 259 -674.4 254 674.4 DL 264 674.4 259 674.4 DL 269 674.4 264 674.4 DL 274 -674.4 269 674.4 DL 279 674.4 274 674.4 DL 284 674.4 279 674.4 DL 289 -674.4 284 674.4 DL 294 674.4 289 674.4 DL 299 674.4 294 674.4 DL 304 -674.4 299 674.4 DL 309 674.4 304 674.4 DL 314 674.4 309 674.4 DL 319 -674.4 314 674.4 DL 324 674.4 319 674.4 DL 329 674.4 324 674.4 DL 334 -674.4 329 674.4 DL 339 674.4 334 674.4 DL 344 674.4 339 674.4 DL 349 -674.4 344 674.4 DL 354 674.4 349 674.4 DL 359 674.4 354 674.4 DL 364 -674.4 359 674.4 DL 369 674.4 364 674.4 DL 374 674.4 369 674.4 DL 379 -674.4 374 674.4 DL 384 674.4 379 674.4 DL 389 674.4 384 674.4 DL 394 -674.4 389 674.4 DL 399 674.4 394 674.4 DL 404 674.4 399 674.4 DL 409 -674.4 404 674.4 DL 414 674.4 409 674.4 DL 419 674.4 414 674.4 DL 424 -674.4 419 674.4 DL 429 674.4 424 674.4 DL 434 674.4 429 674.4 DL 439 -674.4 434 674.4 DL 444 674.4 439 674.4 DL 449 674.4 444 674.4 DL 454 -674.4 449 674.4 DL 459 674.4 454 674.4 DL 464 674.4 459 674.4 DL 469 -674.4 464 674.4 DL 474 674.4 469 674.4 DL 479 674.4 474 674.4 DL 484 -674.4 479 674.4 DL 489 674.4 484 674.4 DL 494 674.4 489 674.4 DL 499 -674.4 494 674.4 DL 504 674.4 499 674.4 DL EP -%%Page: 35 31 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-35)195.86 E 2.5(5.1.4.1. check_r)117 96 R(elay)-.18 E/F1 10 -/Times-Roman@0 SF(The)157 112.2 Q/F2 10/Times-Italic@0 SF -.15(ch)2.5 G -(ec).15 E(k_r)-.2 E(elay)-.37 E F1 -(ruleset is called after a connection is accepted.)2.5 E(It is passed)5 -E(client.host.name $| client.host.address)172 128.4 Q(where)132 144.6 Q -F0($|)4.016 E F1 1.517(is a metacharacter separating the tw)4.017 F -4.017(op)-.1 G 4.017(arts. This)-4.017 F 1.517 -(ruleset can reject connections)4.017 F(from v)132 156.6 Q -(arious locations.)-.25 E F0 2.5(5.1.4.2. check_mail)117 180.6 R F1(The) -157 196.8 Q F2 -.15(ch)3.723 G(ec).15 E(k_mail)-.2 E F1 1.223 -(ruleset is passed the user name parameter of the)3.723 F/F3 9 -/Times-Roman@0 SF 1.222(SMTP MAIL)3.723 F F1(com-)3.722 E 2.5(mand. It) -132 208.8 R(can accept or reject the address.)2.5 E F0 2.5 -(5.1.4.3. check_r)117 232.8 R(cpt)-.18 E F1(The)157 249 Q F2 -.15(ch) -3.917 G(ec).15 E(k_r)-.2 E(cpt)-.37 E F1 1.417 -(ruleset is passed the user name parameter of the)3.917 F F3 1.418 -(SMTP RCPT)3.917 F F1(com-)3.918 E 2.5(mand. It)132 261 R -(can accept or reject the address.)2.5 E F0 2.5(5.1.4.4. check_compat) -117 285 R F1(The)157 301.2 Q F2 -.15(ch)2.5 G(ec).15 E(k_compat)-.2 E F1 -(ruleset is passed)2.5 E(sender)172 317.4 Q -(-address $| recipient-address)-.2 E(where)132 333.6 Q F0($|)3.725 E F1 -1.225(is a metacharacter separating the addresses.)3.725 F 1.225 -(It can accept or reject mail transfer)6.225 F(between these tw)132 -345.6 Q 2.5(oa)-.1 G(ddresses much lik)-2.5 E 2.5(et)-.1 G(he)-2.5 E F2 --.15(ch)2.5 G(ec).15 E(kcompat\(\))-.2 E F1(function.)2.5 E F0 2.5 -(5.1.5. IPC)102 369.6 R(mailers)2.5 E F1 1.332 -(Some special processing occurs if the ruleset zero resolv)142 385.8 R -1.333(es to an IPC mailer \(that is, a)-.15 F 1.179 -(mailer that has \231[IPC]\232 listed as the P)117 397.8 R 1.179 -(ath in the)-.15 F F0(M)3.679 E F1 1.179(con\214guration line.)3.679 F -1.178(The host name passed)6.178 F .168(after \231$@\232 has MX e)117 -409.8 R .168(xpansion performed; this looks the name up in DNS to \214nd alternate deli) --.15 F(v-)-.25 E(ery sites.)117 421.8 Q(The host name can also be pro) -142 438 Q(vided as a dotted quad in square brack)-.15 E(ets; for e)-.1 E -(xample:)-.15 E([128.32.149.78])157 454.2 Q(This causes direct con)117 -470.4 Q -.15(ve)-.4 G(rsion of the numeric v).15 E -(alue to an IP host address.)-.25 E .214(The host name passed in after the \231$@\232 may also be a colon-separated list of hosts.) -142 486.6 R(Each)5.213 E .484(is separately MX e)117 498.6 R .484 -(xpanded and the results are concatenated to mak)-.15 F 2.985(e\()-.1 G -.485(essentially\) one long MX)-2.985 F 3.465(list. The)117 510.6 R .964 -(intent here is to create \231f)3.465 F(ak)-.1 E .964 -(e\232 MX records that are not published in DNS for pri)-.1 F -.25(va) --.25 G(te).25 E(internal netw)117 522.6 Q(orks.)-.1 E -(As a \214nal special case, the host name can be passed in as a te)142 -538.8 Q(xt string in square brack)-.15 E(ets:)-.1 E([ucb)157 555 Q -.25 -(va)-.15 G(x.berk).25 E(ele)-.1 E -.65(y.)-.15 G(edu]).65 E .312 -(This form a)117 571.2 R -.2(vo)-.2 G .312(ids the MX mapping.).2 F F0 -(N.B.:)5.312 E F2 .313(This is intended only for situations wher)2.812 F -2.813(ey)-.37 G .313(ou have a)-2.813 F .338(network \214r)117 583.2 R --.15(ew)-.37 G .337(all or other host that will do special pr).15 F .337 -(ocessing for all your mail, so that your MX)-.45 F -.37(re)117 595.2 S -(cor).37 E 3.958(dp)-.37 G 1.458(oints to a gate)-3.958 F 1.458(way mac) --.15 F 1.458(hine; this mac)-.15 F 1.459(hine could then do dir)-.15 F -1.459(ect delivery to mac)-.37 F(hines)-.15 E .09 -(within your local domain.)117 607.2 R .09(Use of this featur)5.09 F -2.59(ed)-.37 G(ir)-2.59 E .09 -(ectly violates RFC 1123 section 5.3.5: it should)-.37 F -(not be used lightly)117 619.2 Q(.)-.55 E F0 2.5(5.2. D)87 643.2 R 2.5 -<8a44>2.5 G(e\214ne Macr)-2.5 E(o)-.18 E F1 .081 -(Macros are named with a single character or with a w)127 659.4 R .082 -(ord in {braces}.)-.1 F .082(Single character names)5.082 F .45 -(may be selected from the entire ASCII set, b)102 671.4 R .45(ut user) --.2 F .45(-de\214ned macros should be selected from the set)-.2 F .446 -(of upper case letters only)102 683.4 R 5.446(.L)-.65 G -.25(ow)-5.446 G -.446(er case letters and special symbols are used internally).25 F 5.446 -(.L)-.65 G .446(ong names)-5.446 F(be)102 695.4 Q .913 -(ginning with a lo)-.15 F .913 -(wer case letter or a punctuation character are reserv)-.25 F .912 -(ed for use by sendmail, so)-.15 F(user)102 707.4 Q -(-de\214ned long macro names should be)-.2 E -(gin with an upper case letter)-.15 E(.)-.55 E EP -%%Page: 36 32 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-36 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF -(The syntax for macro de\214nitions is:)127 96 Q F0(D)142 112.2 Q/F2 10 -/Times-Italic@0 SF 1.666(xv)C(al)-1.666 E F1(where)102 128.4 Q F2(x) -3.068 E F1 .568 -(is the name of the macro \(which may be a single character or a w)3.068 -F .569(ord in braces\) and)-.1 F F2(val)3.069 E F1(is)3.069 E .479 -(the v)102 140.4 R .479(alue it should ha)-.25 F -.15(ve)-.2 G 5.479(.T) -.15 G .478(here should be no spaces gi)-5.479 F -.15(ve)-.25 G 2.978(nt) -.15 G .478(hat do not actually belong in the macro)-2.978 F -.25(va)102 -152.4 S(lue.).25 E .494(Macros are interpolated using the construct)127 -168.6 R F0($)2.994 E F2(x)A F1 2.994(,w)C(here)-2.994 E F2(x)2.994 E F1 -.494(is the name of the macro to be inter)2.994 F(-)-.2 E 2.933 -(polated. This)102 180.6 R .433 -(interpolation is done when the con\214guration \214le is read, e)2.933 -F .432(xcept in)-.15 F F0(M)2.932 E F1 2.932(lines. The)2.932 F(spe-) -2.932 E(cial construct)102 192.6 Q F0($&)2.5 E F2(x)A F1(can be used in) -2.5 E F0(R)2.5 E F1(lines to get deferred interpolation.)2.5 E -(Conditionals can be speci\214ed using the syntax:)127 208.8 Q($?x te) -142 225 Q(xt1 $| te)-.15 E(xt2 $.)-.15 E 1.127(This interpolates)102 -241.2 R F2(te)3.627 E(xt1)-.2 E F1 1.127(if the macro)3.627 F F0($x) -3.627 E F1 1.128(is set, and)3.628 F F2(te)3.628 E(xt2)-.2 E F1 3.628 -(otherwise. The)3.628 F 1.128(\231else\232 \()3.628 F F0($|)A F1 3.628 -(\)c)C 1.128(lause may be)-3.628 F(omitted.)102 253.2 Q(Lo)127 269.4 Q -.58(wer case macro names are reserv)-.25 F .58(ed to ha)-.15 F .88 -.15 -(ve s)-.2 H .58(pecial semantics, used to pass information in).15 F 1.56 -(or out of)102 281.4 R F2(sendmail)4.06 E F1 4.06(,a)C 1.561 -(nd special characters are reserv)-4.06 F 1.561(ed to pro)-.15 F 1.561 -(vide conditionals, etc.)-.15 F 1.561(Upper case)6.561 F -(names \(that is,)102 293.4 Q F0($A)2.5 E F1(through)2.5 E F0($Z)2.5 E -F1 2.5(\)a)C(re speci\214cally reserv)-2.5 E -(ed for con\214guration \214le authors.)-.15 E 1.303(The follo)127 309.6 -R 1.303(wing macros are de\214ned and/or used internally by)-.25 F F2 -(sendmail)3.802 E F1 1.302(for interpolation into)3.802 F(ar)102 323.6 Q -(gv')-.18 E 2.792(sf)-.55 G .292(or mailers or for other conte)-2.792 F -2.793(xts. The)-.15 F .293(ones mark)2.793 F .293 -(ed \207 are information passed into sendmail)-.1 F/F3 7/Times-Roman@0 -SF(17)-4 I F1(,)4 I .036(the ones mark)102 335.6 R .036(ed \210 are information passed both in and out of sendmail, and the unmark) --.1 F .035(ed macros are)-.1 F(passed out of sendmail b)102 347.6 Q -(ut are not otherwise used internally)-.2 E 5(.T)-.65 G -(hese macros are:)-5 E 13.06($a The)102 363.8 R -(origination date in RFC 822 format.)2.5 E(This is e)5 E -(xtracted from the Date: line.)-.15 E 12.5($b The)102 380 R -(current date in RFC 822 format.)2.5 E 13.06($c The)102 396.2 R .002 -(hop count.)2.502 F .002(This is a count of the number of Recei)5.002 F --.15(ve)-.25 G .003(d: lines plus the v).15 F .003(alue of the)-.25 F F0 -<ad68>2.503 E F1(com-)2.503 E(mand line \215ag.)127 408.2 Q 12.5($d The) -102 424.4 R(current date in UNIX \(ctime\) format.)2.5 E 8.06 -($e\207 \(Obsolete;)102 440.6 R 1.814 -(use SmtpGreetingMessage option instead.\))4.314 F 1.814 -(The SMTP entry message.)6.814 F 1.814(This is)6.814 F 2.008 -(printed out when SMTP starts up.)127 452.6 R 2.008(The \214rst w)7.008 -F 2.008(ord must be the)-.1 F F0($j)4.508 E F1 2.009 -(macro as speci\214ed by)4.508 F 2.732(RFC821. Def)127 464.6 R .232 -(aults to \231$j Sendmail $v ready at $b\232.)-.1 F .231 -(Commonly rede\214ned to include the con-)5.231 F(\214guration v)127 -476.6 Q(ersion number)-.15 E 2.5(,e)-.4 G -(.g., \231$j Sendmail $v/$Z ready at $b\232)-2.5 E 14.17($f The)102 -492.8 R(en)2.5 E -.15(ve)-.4 G(lope sender \(from\) address.).15 E 12.5 -($g The)102 509 R .017(sender address relati)2.517 F .317 -.15(ve t)-.25 -H 2.517(ot).15 G .017(he recipient.)-2.517 F -.15(Fo)5.017 G 2.517(re) -.15 G .018(xample, if)-2.667 F F0($f)2.518 E F1 .018(is \231foo\232,) -2.518 F F0($g)2.518 E F1 .018(will be \231host!foo\232,)2.518 F -(\231foo@host.domain\232, or whate)127 521 Q -.15(ve)-.25 G 2.5(ri).15 G -2.5(sa)-2.5 G(ppropriate for the recei)-2.5 E(ving mailer)-.25 E(.)-.55 -E 12.5($h The)102 537.2 R(recipient host.)2.5 E -(This is set in ruleset 0 from the $@ \214eld of a parsed address.)5 E -14.72($i The)102 553.4 R(queue id, e.g., \231HAA12345\232.)2.5 E 9.72 -($j\210 The)102 569.6 R(\231of)2.747 E .247 -(\214cial\232 domain name for this site.)-.25 F .247 -(This is fully quali\214ed if the full quali\214cation can be)5.247 F -3.093(found. It)127 581.6 R F2(must)3.093 E F1 .594(be rede\214ned to be the fully quali\214ed domain name if your system is not con-) -3.093 F(\214gured so that information can \214nd it automatically)127 -593.6 Q(.)-.65 E 12.5($k The)102 609.8 R -(UUCP node name \(from the uname system call\).)2.5 E 9.72 -($l\207 \(Obsolete;)102 626 R 1.282(use UnixFromLine option instead.\)) -3.782 F 1.282(The format of the UNIX from line.)6.282 F(Unless)6.281 E -1.409(you ha)127 638 R 1.709 -.15(ve c)-.2 H 1.409 -(hanged the UNIX mailbox format, you should not change the def).15 F -1.41(ault, which is)-.1 F(\231From $g)127 650 Q($d\232.)5 E 9.72($m The) -102 666.2 R .719(domain part of the)3.219 F F2 -.1(ge)3.219 G(thostname) -.1 E F1 .718(return v)3.219 F 3.218(alue. Under)-.25 F .718 -(normal circumstances,)3.218 F F0($j)3.218 E F1 .718(is equi)3.218 F(v-) --.25 E(alent to)127 678.2 Q F0($w)2.5 E(.$m)-.7 E F1(.)A .32 LW 76 687.8 -72 687.8 DL 80 687.8 76 687.8 DL 84 687.8 80 687.8 DL 88 687.8 84 687.8 -DL 92 687.8 88 687.8 DL 96 687.8 92 687.8 DL 100 687.8 96 687.8 DL 104 -687.8 100 687.8 DL 108 687.8 104 687.8 DL 112 687.8 108 687.8 DL 116 -687.8 112 687.8 DL 120 687.8 116 687.8 DL 124 687.8 120 687.8 DL 128 -687.8 124 687.8 DL 132 687.8 128 687.8 DL 136 687.8 132 687.8 DL 140 -687.8 136 687.8 DL 144 687.8 140 687.8 DL 148 687.8 144 687.8 DL 152 -687.8 148 687.8 DL 156 687.8 152 687.8 DL 160 687.8 156 687.8 DL 164 -687.8 160 687.8 DL 168 687.8 164 687.8 DL 172 687.8 168 687.8 DL 176 -687.8 172 687.8 DL 180 687.8 176 687.8 DL 184 687.8 180 687.8 DL 188 -687.8 184 687.8 DL 192 687.8 188 687.8 DL 196 687.8 192 687.8 DL 200 -687.8 196 687.8 DL 204 687.8 200 687.8 DL 208 687.8 204 687.8 DL 212 -687.8 208 687.8 DL 216 687.8 212 687.8 DL/F4 5/Times-Roman@0 SF(17)93.6 -698.2 Q/F5 8/Times-Roman@0 SF(As of v)3.2 I -(ersion 8.6, all of these macros ha)-.12 E .24 -.12(ve r)-.16 H -(easonable def).12 E 2(aults. Pre)-.08 F(vious v)-.2 E -(ersions required that the)-.12 E 2(yb)-.12 G 2(ed)-2 G(e\214ned.)-2 E -EP -%%Page: 37 33 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-37)195.86 E/F1 10/Times-Roman@0 SF 7.5($n\207 The)102 96 R -(name of the daemon \(for error messages\).)2.5 E(Def)5 E -(aults to \231MAILER-D)-.1 E(AEMON\232.)-.4 E 7.5($o\207 \(Obsolete:)102 -112.2 R .65(use OperatorChars option instead.\))3.15 F .651 -(The set of \231operators\232 in addresses.)5.651 F 3.151(Al)5.651 G -.651(ist of)-3.151 F .582(characters which will be considered tok)127 -124.2 R .581(ens and which will separate tok)-.1 F .581 -(ens when doing pars-)-.1 F 3.277(ing. F)127 136.2 R .777(or e)-.15 F -.777(xample, if \231@\232 were in the)-.15 F F0($o)3.278 E F1 .778 -(macro, then the input \231a@b\232 w)3.278 F .778(ould be scanned as)-.1 -F .628(three tok)127 148.2 R .628(ens: \231a,)-.1 F 3.128<9a99>-.7 G(@,) --3.128 E 3.128<9a61>-.7 G .628(nd \231b)-3.128 F 4.527 -.7(.\232 D)-.4 H -(ef).7 E .627 -(aults to \231.:@[]\232, which is the minimum set necessary to)-.1 F -.856(do RFC 822 parsing; a richer set of operators is \231.:%@!/[]\232, which adds support for UUCP) -127 160.2 R(,)-1.11 E(the %-hack, and X.400 addresses.)127 172.2 Q 12.5 -($p Sendmail')102 188.4 R 2.5(sp)-.55 G(rocess id.)-2.5 E 7.5 -($q\207 Def)102 204.6 R .404(ault format of sender address.)-.1 F(The) -5.404 E F0($q)2.903 E F1 .403(macro speci\214es ho)2.903 F 2.903(wa)-.25 -G 2.903(na)-2.903 G .403(ddress should appear in a)-2.903 F 1.18 -(message when it is def)127 216.6 R 3.681(aulted. Def)-.1 F 1.181 -(aults to \231<$g>\232.)-.1 F 1.181 -(It is commonly rede\214ned to be \231$?x$x)6.181 F(<$g>$|$g$.)127 228.6 -Q 5<9a6f>-.7 G 2.5<7299>-5 G($g$?x \($x\)$.)-2.5 E -(\232, corresponding to the follo)-.7 E(wing tw)-.25 E 2.5(of)-.1 G -(ormats:)-2.5 E(Eric Allman <eric@CS.Berk)167 244.8 Q(ele)-.1 E -.65(y.) --.15 G(EDU>).65 E(eric@CS.Berk)167 256.8 Q(ele)-.1 E -.65(y.)-.15 G -(EDU \(Eric Allman\)).65 E/F2 10/Times-Italic@0 SF(Sendmail)127 273 Q F1 -(properly quotes names that ha)2.5 E .3 -.15(ve s)-.2 H -(pecial characters if the \214rst form is used.).15 E 14.17($r Protocol) -102 289.2 R .977(used to recei)3.477 F 1.277 -.15(ve t)-.25 H .976 -(he message.).15 F .976(Set from the)5.976 F F0<ad70>3.476 E F1 .976 -(command line \215ag or by the SMTP)3.476 F(serv)127 301.2 Q(er code.) --.15 E 13.61($s Sender')102 317.4 R 2.5(sh)-.55 G(ost name.)-2.5 E -(Set from the)5 E F0<ad70>2.5 E F1 -(command line \215ag or by the SMTP serv)2.5 E(er code.)-.15 E 14.72 -($t A)102 333.6 R(numeric representation of the current time.)2.5 E 12.5 -($u The)102 349.8 R(recipient user)2.5 E(.)-.55 E 12.5($v The)102 366 R --.15(ve)2.5 G(rsion number of the).15 E F2(sendmail)2.5 E F1(binary)2.5 -E(.)-.65 E 5.28($w\210 The)102 382.2 R(hostname of this site.)2.5 E -(This is the root name of this host \(b)5 E(ut see belo)-.2 E 2.5(wf) --.25 G(or ca)-2.5 E -.15(ve)-.2 G(ats\).).15 E 12.5($x The)102 398.4 R -(full name of the sender)2.5 E(.)-.55 E 13.06($z The)102 414.6 R -(home directory of the recipient.)2.5 E 12.5($_ The)102 430.8 R -.25(va) -2.5 G(lidated sender address.).25 E(${bodytype})102 447 Q -(The message body type \(7BIT or 8BITMIME\), as determined from the en) -127 459 Q -.15(ve)-.4 G(lope.).15 E(${client_addr})102 475.2 Q -(The IP address of the SMTP client.)127 487.2 Q -(De\214ned in the SMTP serv)5 E(er only)-.15 E(.)-.65 E(${client_name}) -102 503.4 Q .24(The host name of the SMTP client.)127 515.4 R .241 -(This may be the client')5.24 F 2.741(sb)-.55 G(rack)-2.741 E .241 -(eted IP address in the form)-.1 F 3.292([n)127 527.4 S .792 -(nn.nnn.nnn.nnn ] if the client')-3.292 F 3.292(sI)-.55 G 3.292(Pa) --3.292 G .792(ddress is not resolv)-3.292 F 3.292(able. De\214ned)-.25 F -.792(in the SMTP serv)3.292 F(er)-.15 E(only)127 539.4 Q(.)-.65 E -(${client_port})102 555.6 Q(The port number of the SMTP client.)127 -567.6 Q(De\214ned in the SMTP serv)5 E(er only)-.15 E(.)-.65 E(${en)102 -583.8 Q(vid})-.4 E(The en)127 595.8 Q -.15(ve)-.4 G -(lope id passed to sendmail as part of the en).15 E -.15(ve)-.4 G(lope.) -.15 E(${opMode})102 612 Q(The current operation mode \(from the)127 624 -Q F0<ad62>2.5 E F1(\215ag\).)2.5 E(${deli)102 640.2 Q -.15(ve)-.25 G -(ryMode}).15 E(The current deli)127 652.2 Q -.15(ve)-.25 G -(ry mode \(from the).15 E F0(Deli)2.5 E -.1(ve)-.1 G(ryMode).1 E F1 -(option\).)2.5 E .749(There are three types of dates that can be used.) -127 668.4 R(The)5.749 E F0($a)3.249 E F1(and)3.249 E F0($b)3.249 E F1 -.749(macros are in RFC 822 for)3.249 F(-)-.2 E(mat;)102 680.4 Q F0($a) -3.214 E F1 .714(is the time as e)3.214 F .713 -(xtracted from the \231Date:\232 line of the message \(if there w)-.15 F -.713(as one\), and)-.1 F F0($b)3.213 E F1(is)3.213 E .056 -(the current date and time \(used for postmarks\).)102 692.4 R .057 -(If no \231Date:\232 line is found in the incoming message,)5.056 F F0 -($a)102 704.4 Q F1 .305(is set to the current time also.)2.805 F(The) -5.305 E F0($d)2.805 E F1 .304(macro is equi)2.805 F -.25(va)-.25 G .304 -(lent to the).25 F F0($b)2.804 E F1 .304(macro in UNIX \(ctime\) for) -2.804 F(-)-.2 E(mat.)102 716.4 Q EP -%%Page: 38 34 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-38 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF .238 -(The macros)127 96 R F0($w)2.738 E F1(,)A F0($j)2.738 E F1 2.738(,a)C -(nd)-2.738 E F0($m)2.738 E F1 .238 -(are set to the identity of this host.)2.738 F/F2 10/Times-Italic@0 SF -(Sendmail)5.239 E F1 .239(tries to \214nd the fully)2.739 F .335(quali\214ed name of the host if at all possible; it does this by calling) -102 108 R F2 -.1(ge)2.834 G(thostname).1 E F1 .334 -(\(2\) to get the current)B .457(hostname and then passing that to)102 -120 R F2 -.1(ge)2.957 G(thostbyname).1 E F1 .457 -(\(3\) which is supposed to return the canonical v)B(er)-.15 E(-)-.2 E -.279(sion of that host name.)102 134 R/F3 7/Times-Roman@0 SF(18)-4 I F1 -.279(Assuming this is successful,)2.779 4 N F0($j)2.778 E F1 .278 -(is set to the fully quali\214ed name and)2.778 F F0($m)2.778 E F1(is) -2.778 E .706(set to the domain part of the name \(e)102 146 R -.15(ve) --.25 G .706(rything after the \214rst dot\).).15 F(The)5.706 E F0($w) -3.206 E F1 .706(macro is set to the \214rst)3.206 F -.1(wo)102 158 S -.359(rd \(e).1 F -.15(ve)-.25 G .358 -(rything before the \214rst dot\) if you ha).15 F .658 -.15(ve a l)-.2 H --2.15 -.25(ev e).15 H 2.858(l5o).25 G 2.858(rh)-2.858 G .358 -(igher con\214guration \214le; otherwise, it)-2.858 F .404 -(is set to the same v)102 170 R .405(alue as)-.25 F F0($j)2.905 E F1 -5.405(.I)C 2.905(ft)-5.405 G .405 -(he canoni\214cation is not successful, it is imperati)-2.905 F .705 --.15(ve t)-.25 H .405(hat the con\214g).15 F(\214le set)102 184 Q F0($j) -2.5 E F1(to the fully quali\214ed domain name)2.5 E F3(19)-4 I F1(.)4 I -(The)127 200.2 Q F0($f)2.833 E F1 .333(macro is the id of the sender as originally determined; when mailing to a speci\214c host) -2.833 F(the)102 212.2 Q F0($g)3.224 E F1 .724 -(macro is set to the address of the sender)3.224 F F2 -.37(re)3.225 G -.725(lative to the r).37 F(ecipient.)-.37 E F1 -.15(Fo)5.725 G 3.225(re) -.15 G .725(xample, if I send to)-3.375 F(\231bollard@matisse.CS.Berk)102 -224.2 Q(ele)-.1 E -.65(y.)-.15 G .425(EDU\232 from the machine \231v).65 -F(angogh.CS.Berk)-.25 E(ele)-.1 E -.65(y.)-.15 G .424(EDU\232 the).65 F -F0($f)2.924 E F1(macro)2.924 E(will be \231eric\232 and the)102 236.2 Q -F0($g)2.5 E F1(macro will be \231eric@v)2.5 E(angogh.CS.Berk)-.25 E(ele) --.1 E -.65(y.)-.15 G(EDU.).65 E<9a>-.7 E(The)127 252.4 Q F0($x)2.562 E -F1 .062(macro is set to the full name of the sender)2.562 F 5.062(.T) --.55 G .062(his can be determined in se)-5.062 F -.15(ve)-.25 G .063 -(ral w).15 F 2.563(ays. It)-.1 F .63(can be passed as \215ag to)102 -264.4 R F2(sendmail)3.13 E F1 5.629(.I)C 3.129(tc)-5.629 G .629 -(an be de\214ned in the)-3.129 F/F4 9/Times-Roman@0 SF -.315(NA)3.129 G -(ME).315 E F1(en)3.129 E .629(vironment v)-.4 F 3.129(ariable. The)-.25 -F(third)3.129 E .948(choice is the v)102 276.4 R .948 -(alue of the \231Full-Name:\232 line in the header if it e)-.25 F .949 -(xists, and the fourth choice is the)-.15 F .526 -(comment \214eld of a \231From:\232 line.)102 288.4 R .526 -(If all of these f)5.526 F .526 -(ail, and if the message is being originated locally)-.1 F(,)-.65 E -(the full name is look)102 300.4 Q(ed up in the)-.1 E F2(/etc/passwd)2.5 -E F1(\214le.)2.5 E 1.32(When sending, the)127 316.6 R F0($h)3.82 E F1(,) -A F0($u)3.82 E F1 3.82(,a)C(nd)-3.82 E F0($z)3.82 E F1 1.321 -(macros get set to the host, user)3.82 F 3.821(,a)-.4 G 1.321 -(nd home directory \(if)-3.821 F .517(local\) of the recipient.)102 -328.6 R .517(The \214rst tw)5.517 F 3.016(oa)-.1 G .516(re set from the) --3.016 F F0($@)3.016 E F1(and)3.016 E F0($:)3.016 E F1 .516 -(part of the re)3.016 F .516(writing rules, respec-)-.25 F(ti)102 340.6 -Q -.15(ve)-.25 G(ly).15 E(.)-.65 E(The)127 356.8 Q F0($p)3.806 E F1(and) -3.806 E F0($t)3.806 E F1 1.306(macros are used to create unique strings \(e.g., for the \231Message-Id:\232 \214eld\).) -3.806 F(The)102 368.8 Q F0($i)3.252 E F1 .751(macro is set to the queue id on this host; if put into the timestamp line it can be e) -3.252 F(xtremely)-.15 E .164(useful for tracking messages.)102 380.8 R -(The)5.164 E F0($v)2.664 E F1 .164(macro is set to be the v)2.664 F .165 -(ersion number of)-.15 F F2(sendmail)2.665 E F1 2.665(;t)C .165 -(his is nor)-2.665 F(-)-.2 E(mally put in timestamps and has been pro) -102 392.8 Q -.15(ve)-.15 G 2.5(ne).15 G(xtremely useful for deb)-2.65 E -(ugging.)-.2 E(The)127 409 Q F0($c)3.548 E F1 1.048 -(\214eld is set to the \231hop count,)3.548 F 3.548<9a69>-.7 G 1.048 -(.e., the number of times this message has been pro-)-3.548 F 2.856 -(cessed. This)102 421 R .356(can be determined by the)2.856 F F0<ad68> -2.856 E F1 .357 -(\215ag on the command line or by counting the timestamps)2.856 F -(in the message.)102 433 Q(The)127 449.2 Q F0($r)2.833 E F1(and)2.833 E -F0($s)2.833 E F1 .333 -(\214elds are set to the protocol used to communicate with)2.833 F F2 -(sendmail)2.833 E F1 .333(and the send-)2.833 F .194(ing hostname.)102 -461.2 R(The)5.194 E 2.694(yc)-.15 G .194(an be set together using the) --2.694 F F0<ad70>2.694 E F1 .194 -(command line \215ag or separately using the)2.694 F F0<ad4d>2.695 E F1 -(or)102 473.2 Q F0(\255oM)2.5 E F1(\215ags.)2.5 E(The)127 489.4 Q F0($_) -2.967 E F1 .467(is set to a v)2.967 F .467(alidated sender host name.) --.25 F .466(If the sender is running an RFC 1413 compli-)5.467 F .384 -(ant IDENT serv)102 501.4 R .384(er and the recei)-.15 F -.15(ve)-.25 G -2.884(rh).15 G .384 -(as the IDENT protocol turned on, it will include the user name)-2.884 F -(on that host.)102 513.4 Q(The)127 529.6 Q F0(${client_name})5.98 E F1 -(,)A F0(${client_addr})5.98 E F1 5.98(,a)C(nd)-5.98 E F0(${client_port}) -5.98 E F1 3.48(macros are set to the name,)5.98 F .786 -(address, and port number of the SMTP client who is in)102 541.6 R -.2 -(vo)-.4 G(king).2 E F2(sendmail)3.286 E F1 .786(as a serv)3.286 F(er) --.15 E 5.786(.T)-.55 G .786(hese can be)-5.786 F(used in the)102 553.6 Q -F2 -.15(ch)2.5 G(ec).15 E(k_*)-.2 E F1(rulesets \(using the)2.5 E F0($&) -2.5 E F1(deferred e)2.5 E -.25(va)-.25 G(luation form, of course!\).).25 -E F0 2.5(5.3. C)87 577.6 R(and F \212 De\214ne Classes)2.5 E F1 .66(Classes of phrases may be de\214ned to match on the left hand side of re) -127 593.8 R .659(writing rules, where a)-.25 F .464(\231phrase\232 is a sequence of characters that does not contain space characters.) -102 605.8 R -.15(Fo)5.465 G 2.965(re).15 G .465(xample a class of)-3.115 -F .654(all local names for this site might be created so that attempts to send to oneself can be eliminated.) -102 617.8 R .041(These can either be de\214ned directly in the con\214guration \214le or read in from another \214le.) -102 629.8 R .041(Classes are)5.041 F .649 -(named as a single letter or a w)102 641.8 R .649(ord in {braces}.)-.1 F -.649(Class names be)5.649 F .649(ginning with lo)-.15 F .648 -(wer case letters and)-.25 F .638(special characters are reserv)102 -653.8 R .638(ed for system use.)-.15 F .639 -(Classes de\214ned in con\214g \214les may be gi)5.639 F -.15(ve)-.25 G -3.139(nn).15 G(ames)-3.139 E 1.05 -(from the set of upper case letters for short names or be)102 665.8 R -1.05(ginning with an upper case letter for long)-.15 F .32 LW 76 675.4 -72 675.4 DL 80 675.4 76 675.4 DL 84 675.4 80 675.4 DL 88 675.4 84 675.4 -DL 92 675.4 88 675.4 DL 96 675.4 92 675.4 DL 100 675.4 96 675.4 DL 104 -675.4 100 675.4 DL 108 675.4 104 675.4 DL 112 675.4 108 675.4 DL 116 -675.4 112 675.4 DL 120 675.4 116 675.4 DL 124 675.4 120 675.4 DL 128 -675.4 124 675.4 DL 132 675.4 128 675.4 DL 136 675.4 132 675.4 DL 140 -675.4 136 675.4 DL 144 675.4 140 675.4 DL 148 675.4 144 675.4 DL 152 -675.4 148 675.4 DL 156 675.4 152 675.4 DL 160 675.4 156 675.4 DL 164 -675.4 160 675.4 DL 168 675.4 164 675.4 DL 172 675.4 168 675.4 DL 176 -675.4 172 675.4 DL 180 675.4 176 675.4 DL 184 675.4 180 675.4 DL 188 -675.4 184 675.4 DL 192 675.4 188 675.4 DL 196 675.4 192 675.4 DL 200 -675.4 196 675.4 DL 204 675.4 200 675.4 DL 208 675.4 204 675.4 DL 212 -675.4 208 675.4 DL 216 675.4 212 675.4 DL/F5 5/Times-Roman@0 SF(18)93.6 -685.8 Q/F6 8/Times-Roman@0 SF -.12(Fo)3.2 K 2(re).12 G -(xample, on some systems)-2.12 E/F7 8/Times-Italic@0 SF -.08(ge)2 G -(thostname).08 E F6(might return \231foo\232 which w)2 E -(ould be mapped to \231foo.bar)-.08 E(.com\232 by)-.44 E F7 -.08(ge)2 G -(thostbyname).08 E F6(.)A F5(19)93.6 699.4 Q F6(Older v)3.2 I -(ersions of sendmail didn')-.12 E 2(tp)-.144 G(re-de\214ne)-2 E/F8 8 -/Times-Bold@0 SF($j)2 E F6(at all, so up until 8.6, con\214g \214les)2 E -F7(always)2 E F6(had to de\214ne)2 E F8($j)2 E F6(.)A EP -%%Page: 39 35 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-39)195.86 E/F1 10/Times-Roman@0 SF(names.)102 96 Q -(The syntax is:)127 112.2 Q F0(C)142 128.4 Q/F2 10/Times-Italic@0 SF -1.666(cp)C(hr)-1.666 E(ase1 phr)-.15 E(ase2...)-.15 E F0(F)142 140.4 Q -F2 1.666<638c>C(le)-1.666 E F1 .661 -(The \214rst form de\214nes the class)102 156.6 R F2(c)3.161 E F1 .661 -(to match an)3.161 F 3.161(yo)-.15 G 3.161(ft)-3.161 G .661(he named w) --3.161 F 3.161(ords. It)-.1 F .661(is permissible to split them)3.161 F -(among multiple lines; for e)102 168.6 Q(xample, the tw)-.15 E 2.5(of) --.1 G(orms:)-2.5 E(CHmonet ucbmonet)142 184.8 Q(and)102 201 Q(CHmonet) -142 217.2 Q(CHucbmonet)142 229.2 Q(are equi)102 245.4 Q -.25(va)-.25 G -2.5(lent. The).25 F -.74(``)2.5 G(F').74 E 2.5('f)-.74 G -(orm reads the elements of the class)-2.5 E F2(c)2.5 E F1 -(from the named)2.5 E F2(\214le)2.5 E F1(.)A 1.339 -(Elements of classes can be accessed in rules using)127 261.6 R F0($=) -3.839 E F1(or)3.839 E F0($~)3.839 E F1 6.339(.T)C(he)-6.339 E F0($~) -3.839 E F1 1.338(\(match entries not in)3.839 F -(class\) only matches a single w)102 273.6 Q(ord; multi-w)-.1 E -(ord entries in the class are ignored in this conte)-.1 E(xt.)-.15 E -(Some classes ha)127 289.8 Q .3 -.15(ve i)-.2 H(nternal meaning to).15 E -F2(sendmail)2.5 E F1(:)A 18.42($=e contains)102 306 R .561 -(the Content-T)3.061 F(ransfer)-.35 E .561(-Encodings that can be 8)-.2 -F/F3 10/Symbol SF<ae>A F1 3.062(7b)C .562(it encoded.)-3.062 F .562 -(It is prede\214ned to)5.562 F -(contain \2317bit\232, \2318bit\232, and \231binary\232.)138 318 Q 17.86 -($=k set)102 334.2 R(to be the same as)2.5 E F0($k)2.5 E F1 2.5(,t)C -(hat is, the UUCP node name.)-2.5 E 15.08($=m set)102 350.4 R -(to the set of domains by which this host is kno)2.5 E -(wn, initially just)-.25 E F0($m)2.5 E F1(.)A 17.86($=n can)102 366.6 R -.581(be set to the set of MIME body types that can ne)3.081 F -.15(ve) --.25 G 3.08(rb).15 G 3.08(ee)-3.08 G .58(ight to se)-3.08 F -.15(ve)-.25 -G 3.08(nb).15 G .58(it encoded.)-3.08 F(It)5.58 E(def)138 378.6 Q 1.81 -(aults to \231multipart/signed\232.)-.1 F 1.81 -(Message types \231message/*\232 and \231multipart/*\232 are ne)6.81 F --.15(ve)-.25 G(r).15 E 1.853(encoded directly)138 390.6 R 6.853(.M)-.65 -G 1.853(ultipart messages are al)-6.853 F -.1(wa)-.1 G 1.853 -(ys handled recursi).1 F -.15(ve)-.25 G(ly).15 E 6.853(.T)-.65 G 1.853 -(he handling of)-6.853 F(message/* messages are controlled by class)138 -402.6 Q F0($=s)2.5 E F1(.)A 17.86($=q A)102 418.8 R .711 -(set of Content-T)3.211 F .712(ypes that will ne)-.8 F -.15(ve)-.25 G -3.212(rb).15 G 3.212(ee)-3.212 G .712(ncoded as base64 \(if the)-3.212 F -3.212(yh)-.15 G -2.25 -.2(av e)-3.212 H .712(to be encoded,)3.412 F(the) -138 430.8 Q 3.358(yw)-.15 G .858(ill be encoded as quoted-printable\).) --3.358 F .858(It can ha)5.858 F 1.158 -.15(ve p)-.2 H .858 -(rimary types \(e.g., \231te).15 F .857(xt\232\) or full)-.15 F -(types \(such as \231te)138 442.8 Q 2.5(xt/plain\232\). The)-.15 F -(class is initialized to ha)2.5 E .3 -.15(ve \231)-.2 H(te).15 E -(xt/plain\232 only)-.15 E(.)-.65 E 18.97($=s contains)102 459 R .648 -(the set of subtypes of message that can be treated recursi)3.148 F -.15 -(ve)-.25 G(ly).15 E 5.648(.B)-.65 G 3.148(yd)-5.648 G(ef)-3.148 E .648 -(ault it con-)-.1 F .97(tains only \231rfc822\232.)138 471 R .969 -(Other \231message/*\232 types cannot be 8)5.97 F F3<ae>A F1 3.469(7b)C -.969(it encoded.)-3.469 F .969(If a message)5.969 F 1.045 -(containing eight bit data is sent to a se)138 483 R -.15(ve)-.25 G -3.545(nb).15 G 1.045(it host, and that message cannot be encoded)-3.545 -F(into se)138 495 Q -.15(ve)-.25 G 2.5(nb).15 G -(its, it will be stripped to 7 bits.)-2.5 E 20.08($=t set)102 511.2 R -.372(to the set of trusted users by the)2.873 F F0(T)2.872 E F1 .372 -(con\214guration line.)2.872 F .372(If you w)5.372 F .372 -(ant to read trusted users)-.1 F(from a \214le, use)138 523.2 Q F0(Ft) -2.5 E F2(/\214le/name)A F1(.)A 15.64($=w set)102 539.4 R .513 -(to be the set of all names this host is kno)3.013 F .513(wn by)-.25 F -5.513(.T)-.65 G .513(his can be used to match local host-)-5.513 F -(names.)138 551.4 Q F2(Sendmail)127 567.6 Q F1 .183 -(can be compiled to allo)2.683 F 2.683(wa)-.25 G F2(scanf)-.001 E F1 -.182(\(3\) string on the)B F0(F)2.682 E F1 2.682(line. This)2.682 F .182 -(lets you do simplistic)2.682 F .554(parsing of te)102 579.6 R .554 -(xt \214les.)-.15 F -.15(Fo)5.554 G 3.054(re).15 G .554 -(xample, to read all the user names in your system)-3.204 F F2 -(/etc/passwd)3.055 E F1 .555(\214le into a)3.055 F(class, use)102 591.6 -Q(FL/etc/passwd %[^:])142 607.8 Q(which reads e)102 624 Q -.15(ve)-.25 G -(ry line up to the \214rst colon.).15 E F0 2.5(5.4. M)87 648 R 2.5<8a44> -2.5 G(e\214ne Mailer)-2.5 E F1(Programs and interf)127 664.2 Q -(aces to mailers are de\214ned in this line.)-.1 E(The format is:)5 E F0 -(M)142 680.4 Q F2(name)A F1 2.5(,{)C F2(\214eld)-2.5 E F1(=)A F2(value)A -F1(}*)1.666 E(where)102 696.6 Q F2(name)4.244 E F1 1.744(is the name of the mailer \(used internally only\) and the \231\214eld=name\232 pairs de\214ne) -4.244 F(attrib)102 708.6 Q(utes of the mailer)-.2 E 5(.F)-.55 G -(ields are:)-5 E EP -%%Page: 40 36 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-40 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF -.15(Pa) -142 96 S 51.87(th The).15 F(pathname of the mailer)2.5 E 47.83 -(Flags Special)142 108 R(\215ags for this mailer)2.5 E 41.73(Sender Re) -142 120 R(writing set\(s\) for sender addresses)-.25 E 31.17 -(Recipient Re)142 132 R(writing set\(s\) for recipient addresses)-.25 E -(Ar)142 144 Q 49.13(gv An)-.18 F(ar)2.5 E(gument v)-.18 E -(ector to pass to this mailer)-.15 E 55.61(Eol The)142 156 R -(end-of-line string for this mailer)2.5 E 35.62(Maxsize The)142 168 R -(maximum message length to this mailer)2.5 E 32.27(Linelimit The)142 180 -R(maximum line length in the message body)2.5 E 31.18(Directory The)142 -192 R -.1(wo)2.5 G(rking directory for the mailer).1 E 42.84(Userid The) -142 204 R(def)2.5 E(ault user and group id to run as)-.1 E 50.62 -(Nice The)142 216 R(nice\(2\) increment for the mailer)2.5 E 38.95 -(Charset The)142 228 R(def)2.5 E -(ault character set for 8-bit characters)-.1 E -.8(Ty)142 240 S 49.75 -(pe The).8 F(MTS type information \(used for error messages\))2.5 E -(Only the \214rst character of the \214eld name is check)102 256.2 Q -(ed.)-.1 E .396(The follo)127 272.4 R .396 -(wing \215ags may be set in the mailer description.)-.25 F(An)5.396 E -2.896(yo)-.15 G .397(ther \215ags may be used freely)-2.896 F .075(to conditionally assign headers to messages destined for particular mailers.) -102 284.4 R .075(Flags mark)5.075 F .075(ed with \207 are)-.1 F 1.192 -(not interpreted by the)102 296.4 R/F2 10/Times-Italic@0 SF(sendmail) -3.692 E F1 1.193(binary; these are the con)3.692 F -.15(ve)-.4 G 1.193 -(ntionally used to correlate to the \215ags).15 F .738(portion of the) -102 308.4 R F0(H)3.238 E F1 3.237(line. Flags)3.238 F(mark)3.237 E .737 -(ed with \210 apply to the mailers for the sender address rather than) --.1 F(the usual recipient mailers.)102 320.4 Q 15.56(aR)102 336.6 S .987 -(un Extended SMTP \(ESMTP\) protocol \(de\214ned in RFCs 1869, 1652, and 1870\).) --15.56 F .987(This \215ag)5.987 F(def)122 348.6 Q -(aults on if the SMTP greeting message includes the w)-.1 E -(ord \231ESMTP\232.)-.1 E 12.78(AL)102 364.8 S .762 -(ook up the user part of the address in the alias database.)-12.78 F -.762(Normally this is only set for local)5.762 F(mailers.)122 376.8 Q 15 -(bF)102 393 S .456(orce a blank line on the end of a message.)-15.15 F -.456(This is intended to w)5.456 F .456(ork around some stupid v)-.1 F -(er)-.15 E(-)-.2 E .362(sions of /bin/mail that require a blank line, b) -122 405 R .362(ut do not pro)-.2 F .362(vide it themselv)-.15 F 2.861 -(es. It)-.15 F -.1(wo)2.861 G .361(uld not nor).1 F(-)-.2 E -(mally be used on netw)122 417 Q(ork mail.)-.1 E 15.56(cD)102 433.2 S -2.662(on)-15.56 G .163(ot include comments in addresses.)-2.662 F .163 -(This should only be used if you ha)5.163 F .463 -.15(ve t)-.2 H 2.663 -(ow).15 G .163(ork around a)-2.763 F 1.846 -(remote mailer that gets confused by comments.)122 445.2 R 1.846 -(This strips addresses of the form \231Phrase)6.846 F -(<address>\232 or \231address \(Comment\)\232 do)122 457.2 Q -(wn to just \231address\232.)-.25 E 5.83(C\210 If)102 473.4 R .213 -(mail is)2.713 F F2 -.37(re)2.713 G(ceived).37 E F1 .213 -(from a mailer with this \215ag set, an)2.713 F 2.713(ya)-.15 G .213 -(ddresses in the header that do not ha)-2.713 F -.15(ve)-.2 G .97 -(an at sign \(\231@\232\) after being re)122 485.4 R .97 -(written by ruleset three will ha)-.25 F 1.27 -.15(ve t)-.2 H .97 -(he \231@domain\232 clause from).15 F(the sender en)122 497.4 Q -.15(ve) --.4 G(lope address tack).15 E(ed on.)-.1 E(This allo)5 E -(ws mail with headers of the form:)-.25 E(From: usera@hosta)162 513.6 Q --.8(To)162 525.6 S 2.5(:u).8 G(serb@hostb, userc)-2.5 E(to be re)122 -541.8 Q(written as:)-.25 E(From: usera@hosta)162 558 Q -.8(To)162 570 S -2.5(:u).8 G(serb@hostb, userc@hosta)-2.5 E(automatically)122 586.2 Q 5 -(.H)-.65 G -.25(ow)-5 G -2.15 -.25(ev e).25 H .8 -.4(r, i).25 H 2.5(td) -.4 G(oesn')-2.5 E 2.5(tr)-.18 G(eally w)-2.5 E(ork reliably)-.1 E(.)-.65 -E 15(dD)102 602.4 S 2.56(on)-15 G .06(ot include angle brack)-2.56 F .06 -(ets around route-address syntax addresses.)-.1 F .06 -(This is useful on mailers)5.06 F .188(that are going to pass addresses to a shell that might interpret angle brack) -122 614.4 R .187(ets as I/O redirection.)-.1 F 5.28(D\207 This)102 630.6 -R(mailer w)2.5 E(ants a \231Date:\232 header line.)-.1 E 15.56(eT)102 -646.8 S .173(his mailer is e)-15.56 F(xpensi)-.15 E .473 -.15(ve t)-.25 -H 2.673(oc).15 G .173(onnect to, so try to a)-2.673 F -.2(vo)-.2 G .174 -(id connecting normally; an).2 F 2.674(yn)-.15 G .174(ecessary con-) --2.674 F(nection will occur during a queue run.)122 658.8 Q 13.89(EE)102 -675 S(scape lines be)-13.89 E(ginning with \231From)-.15 E 2.5<9a69>5 G -2.5(nt)-2.5 G(he message with a `>' sign.)-2.5 E 16.67(fT)102 691.2 S -.19(he mailer w)-16.67 F .19(ants a)-.1 F F0<ad66>2.69 E F2(fr)2.69 E -(om)-.45 E F1 .19(\215ag, b)2.69 F .19(ut only if this is a netw)-.2 F -.19(ork forw)-.1 F .19(ard operation \(i.e., the mailer)-.1 F(will gi) -122 703.2 Q .3 -.15(ve a)-.25 H 2.5(ne).15 G(rror if the e)-2.5 E -.15 -(xe)-.15 G(cuting user does not ha).15 E .3 -.15(ve s)-.2 H -(pecial permissions\).).15 E EP -%%Page: 41 37 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-41)195.86 E/F1 10/Times-Roman@0 SF 6.94(F\207 This)102 96 R -(mailer w)2.5 E(ants a \231From:\232 header line.)-.1 E 15(gN)102 112.2 -S(ormally)-15 E(,)-.65 E/F2 10/Times-Italic@0 SF(sendmail)4.892 E F1 -2.393(sends internally generated email \(e.g., error messages\) using the null) -4.892 F 1.327(return address as required by RFC 1123.)122 124.2 R(Ho) -6.327 E(we)-.25 E -.15(ve)-.25 G 2.127 -.4(r, s).15 H 1.327 -(ome mailers don').4 F 3.827(ta)-.18 G 1.327(ccept a null return)-3.827 -F 3.31(address. If)122 136.2 R(necessary)3.31 E 3.31(,y)-.65 G .81 -(ou can set the)-3.31 F F0(g)3.311 E F1 .811(\215ag to pre)3.311 F -.15 -(ve)-.25 G(nt).15 E F2(sendmail)3.311 E F1 .811(from obe)3.311 F .811 -(ying the standards;)-.15 F 1.57 -(error messages will be sent as from the MAILER-D)122 148.2 R 1.57 -(AEMON \(actually)-.4 F 4.07(,t)-.65 G 1.57(he v)-4.07 F 1.57 -(alue of the)-.25 F F0($n)4.07 E F1(macro\).)122 160.2 Q 15(hU)102 176.4 -S(pper case should be preserv)-15 E(ed in host names for this mailer) --.15 E(.)-.55 E 17.22(iD)102 192.6 S 2.5(oU)-17.22 G(ser Database re) --2.5 E(writing on en)-.25 E -.15(ve)-.4 G(lope sender address.).15 E -16.67(IT)102 208.8 S .474(his mailer will be speaking SMTP to another) --16.67 F F2(sendmail)2.974 E F1 2.974<8a61>2.974 G 2.975(ss)-2.974 G -.475(uch it can use special protocol)-2.975 F 3.633(features. This)122 -220.8 R 1.133(option is not required \(i.e., if this option is omitted the transmission will still) -3.633 F(operate successfully)122 232.8 Q 2.5(,a)-.65 G -(lthough perhaps not as ef)-2.5 E(\214ciently as possible\).)-.25 E -17.22(jD)102 249 S 2.5(oU)-17.22 G(ser Database re)-2.5 E -(writing on recipients as well as senders.)-.25 E 15(kN)102 265.2 S -1.029(ormally when)-15 F F2(sendmail)3.529 E F1 1.029 -(connects to a host via SMTP)3.529 F 3.529(,i)-1.11 G 3.529(tc)-3.529 G -1.03(hecks to mak)-3.529 F 3.53(es)-.1 G 1.03(ure that this isn')-3.53 F -(t)-.18 E .562(accidently the same host name as might happen if)122 -277.2 R F2(sendmail)3.062 E F1 .562 -(is miscon\214gured or if a long-haul)3.062 F(netw)122 289.2 Q 1.073 -(ork interf)-.1 F 1.073(ace is set in loopback mode.)-.1 F 1.074 -(This \215ag disables the loopback check.)6.074 F 1.074(It should)6.074 -F(only be used under v)122 301.2 Q(ery unusual circumstances.)-.15 E -12.78(KC)102 317.4 S(urrently unimplemented.)-12.78 E(Reserv)5 E -(ed for chunking.)-.15 E 17.22(lT)102 333.6 S -(his mailer is local \(i.e., \214nal deli)-17.22 E -.15(ve)-.25 G -(ry will be performed\).).15 E 13.89(LL)102 349.8 S .82 -(imit the line lengths as speci\214ed in RFC821.)-13.89 F .819 -(This deprecated option should be replaced by)5.819 F(the)122 361.8 Q F0 -(L=)2.5 E F1(mail declaration.)2.5 E -.15(Fo)5 G 2.5(rh).15 G -(istoric reasons, the)-2.5 E F0(L)2.5 E F1(\215ag also sets the)2.5 E F0 -(7)2.5 E F1(\215ag.)2.5 E 12.22(mT)102 378 S .463(his mailer can send to multiple users on the same host in one transaction.) --12.22 F .464(When a)5.464 F F0($u)2.964 E F1(macro)2.964 E .732 -(occurs in the)122 390 R F2(ar)3.232 E(gv)-.37 E F1 .732(part of the mailer de\214nition, that \214eld will be repeated as necessary for all) -3.232 F(qualifying users.)122 402 Q 3.61(M\207 This)102 418.2 R -(mailer w)2.5 E(ants a \231Message-Id:\232 header line.)-.1 E 15(nD)102 -434.4 S 2.5(on)-15 G -(ot insert a UNIX-style \231From\232 line on the front of the message.) --2.5 E 15(oA)102 450.6 S -.1(lwa)-15 G .816(ys run as the o).1 F .816 -(wner of the recipient mailbox.)-.25 F(Normally)5.816 E F2(sendmail) -3.316 E F1 .816(runs as the sender for)3.316 F .198 -(locally generated mail or as \231daemon\232 \(actually)122 462.6 R -2.698(,t)-.65 G .198(he user speci\214ed in the)-2.698 F F0(u)2.698 E F1 -.198(option\) when deli)2.698 F(v-)-.25 E .98(ering netw)122 474.6 R .98 -(ork mail.)-.1 F .98(The normal beha)5.98 F .981 -(viour is required by most local mailers, which will not)-.2 F(allo)122 -486.6 Q 2.521(wt)-.25 G .021(he en)-2.521 F -.15(ve)-.4 G .021 -(lope sender address to be set unless the mailer is running as daemon.) -.15 F .02(This \215ag is)5.02 F(ignored if the)122 498.6 Q F0(S)2.5 E F1 -(\215ag is set.)2.5 E 15(pU)102 514.8 S .497(se the route-addr style re) --15 F -.15(ve)-.25 G .498(rse-path in the SMTP \231MAIL FR).15 F .498 -(OM:\232 command rather than just)-.4 F .385(the return address; although this is required in RFC821 section 3.1, man) -122 526.8 R 2.885(yh)-.15 G .385(osts do not process)-2.885 F(re)122 -538.8 Q -.15(ve)-.25 G(rse-paths properly).15 E 5(.R)-.65 G -2.15 -.25 -(ev e)-5 H(rse-paths are of).25 E(\214cially discouraged by RFC 1123.) --.25 E 6.94(P\207 This)102 555 R(mailer w)2.5 E(ants a \231Return-P)-.1 -E(ath:\232 line.)-.15 E 15(qW)102 571.2 S .068 -(hen an address that resolv)-15 F .069(es to this mailer is v)-.15 F -.069(eri\214ed \(SMTP VRFY command\), generate 250)-.15 F -(responses instead of 252 responses.)122 583.2 Q -(This will imply that the address is local.)5 E 16.67(rS)102 599.4 S -(ame as)-16.67 E F0(f)2.5 E F1 2.5(,b)C(ut sends a)-2.7 E F0<ad72>2.5 E -F1(\215ag.)2.5 E 13.33(RO)102 615.6 S .67 -(pen SMTP connections from a \231secure\232 port.)-13.33 F .669 -(Secure ports aren')5.669 F 3.169(t\()-.18 G .669(secure, that is\) e) --3.169 F .669(xcept on)-.15 F -(UNIX machines, so it is unclear that this adds an)122 627.6 Q(ything.) --.15 E 16.11(sS)102 643.8 S(trip quote characters \(" and \\\) of)-16.11 -E 2.5(fo)-.25 G 2.5(ft)-2.5 G(he address before calling the mailer)-2.5 -E(.)-.55 E 14.44(SD)102 660 S(on')-14.44 E 3.331(tr)-.18 G .831 -(eset the userid before calling the mailer)-3.331 F 5.831(.T)-.55 G .831 -(his w)-5.831 F .832(ould be used in a secure en)-.1 F(vironment)-.4 E -(where)122 672 Q F2(sendmail)3.318 E F1 .817(ran as root.)3.317 F .817 -(This could be used to a)5.817 F -.2(vo)-.2 G .817(id for).2 F .817 -(ged addresses.)-.18 F .817(If the)5.817 F F0(U=)3.317 E F1 .817 -(\214eld is)3.317 F .974 -(also speci\214ed, this \215ag causes the user id to al)122 684 R -.1 -(wa)-.1 G .974(ys be set to that user and group \(instead of).1 F(lea) -122 696 Q(ving it as root\).)-.2 E 15(uU)102 712.2 S -(pper case should be preserv)-15 E(ed in user names for this mailer)-.15 -E(.)-.55 E EP -%%Page: 42 38 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-42 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF 12.78(UT) -102 96 S(his mailer w)-12.78 E(ants UUCP-style \231From\232 lines with the ugly \231remote from <host>\232 on the end.) --.1 E 12.78(wT)102 112.2 S .566(he user must ha)-12.78 F .866 -.15 -(ve a v)-.2 H .566 -(alid account on this machine, i.e., getpwnam must succeed.)-.1 F .565 -(If not, the)5.565 F(mail is bounced.)122 124.2 Q -(This is required to get \231.forw)5 E(ard\232 capability)-.1 E(.)-.65 E -7.5(x\207 This)102 140.4 R(mailer w)2.5 E -(ants a \231Full-Name:\232 header line.)-.1 E 12.78(XT)102 156.6 S .972 -(his mailer w)-12.78 F .972(ant to use the hidden dot algorithm as speci\214ed in RFC821; basically) --.1 F 3.472(,a)-.65 G 1.272 -.15(ny l)-3.472 H(ine).15 E(be)122 168.6 Q -.797(ginning with a dot will ha)-.15 F 1.097 -.15(ve a)-.2 H 3.297(ne) -.15 G .796(xtra dot prepended \(to be stripped at the other end\).) --3.447 F(This)5.796 E(insures that lines in the message containing a dot will not terminate the message prematurely) -122 180.6 Q(.)-.65 E 15.56(zR)102 196.8 S .965(un Local Mail T)-15.56 F -.965(ransfer Protocol \(LMTP\) between)-.35 F/F2 10/Times-Italic@0 SF -(sendmail)3.465 E F1 .965(and the local mailer)3.465 F 5.965(.T)-.55 G -.965(his is a)-5.965 F -.25(va)122 208.8 S .167(riant on SMTP de\214ned in RFC 2033 that is speci\214cally designed for deli) -.25 F -.15(ve)-.25 G .167(ry to a local mail-).15 F(box.)122 220.8 Q 15 -(0D)102 237 S(on')-15 E 2.5(tl)-.18 G -(ook up MX records for hosts sent via SMTP)-2.5 E(.)-1.11 E 15(3E)102 -253.2 S .001(xtend the list of characters con)-15 F -.15(ve)-.4 G .002 -(rted to =XX notation when con).15 F -.15(ve)-.4 G .002 -(rting to Quoted-Printable to).15 F .978(include those that don')122 -265.2 R 3.478(tm)-.18 G .978(ap cleanly between ASCII and EBCDIC.)-3.478 -F .978(Useful if you ha)5.978 F 1.277 -.15(ve I)-.2 H(BM).15 E -(mainframes on site.)122 277.2 Q 15(5I)102 293.4 S 2.716(fn)-15 G 2.716 -(oa)-2.716 G .217(liases are found for this address, pass the address through ruleset 5 for possible alternate) --2.716 F 2.5(resolution. This)122 305.4 R(is intended to forw)2.5 E -(ard the mail to an alternate deli)-.1 E -.15(ve)-.25 G(ry spot.).15 E -15(7S)102 321.6 S 1.141(trip all output to se)-15 F -.15(ve)-.25 G 3.641 -(nb).15 G 3.641(its. This)-3.641 F 1.141(is the def)3.641 F 1.141 -(ault if the)-.1 F F0(L)3.64 E F1 1.14(\215ag is set.)3.64 F 1.14 -(Note that clearing this)6.14 F .295(option is not suf)122 333.6 R .295 -(\214cient to get full eight bit data passed through)-.25 F F2(sendmail) -2.795 E F1 5.295(.I)C 2.795(ft)-5.295 G(he)-2.795 E F0(7)2.795 E F1 .295 -(option is set,)2.795 F .717(this is essentially al)122 345.6 R -.1(wa) --.1 G .717(ys set, since the eighth bit w).1 F .717 -(as stripped on input.)-.1 F .716(Note that this option)5.717 F -(will only impact messages that didn')122 357.6 Q 2.5(th)-.18 G -2.25 --.2(av e)-2.5 H(8)2.7 E/F3 10/Symbol SF<ae>A F1 2.5(7b)C(it MIME con) --2.5 E -.15(ve)-.4 G(rsions performed.).15 E 15(8I)102 373.8 S 3.782(fs) --15 G 1.283(et, it is acceptable to send eight bit data to this mailer; the usual attempt to do 8) --3.782 F F3<ae>A F1 3.783(7b)C(it)-3.783 E(MIME con)122 385.8 Q -.15(ve) --.4 G(rsions will be bypassed.).15 E 15(9I)102 402 S 2.705(fs)-15 G .205 -(et, do)-2.705 F F2(limited)2.705 E F1(7)2.705 E F3<ae>A F1 2.704(8b)C -.204(it MIME con)-2.704 F -.15(ve)-.4 G 2.704(rsions. These).15 F(con) -2.704 E -.15(ve)-.4 G .204(rsions are limited to te).15 F .204 -(xt/plain data.)-.15 F 17.22(:C)102 418.2 S .982 -(heck addresses to see if the)-17.22 F 3.482(yb)-.15 G -.15(eg)-3.482 G -.982(in \231:include:\232; if the).15 F 3.482(yd)-.15 G .982(o, con) --3.482 F -.15(ve)-.4 G .982(rt them to the \231*include*\232).15 F -(mailer)122 430.2 Q(.)-.55 E 18(|C)102 446.4 S -(heck addresses to see if the)-18 E 2.5(yb)-.15 G -.15(eg)-2.5 G -(in with a `|'; if the).15 E 2.5(yd)-.15 G(o, con)-2.5 E -.15(ve)-.4 G -(rt them to the \231prog\232 mailer).15 E(.)-.55 E 17.22(/C)102 462.6 S -(heck addresses to see if the)-17.22 E 2.5(yb)-.15 G -.15(eg)-2.5 G -(in with a `/'; if the).15 E 2.5(yd)-.15 G(o, con)-2.5 E -.15(ve)-.4 G -(rt them to the \231*\214le*\232 mailer).15 E(.)-.55 E 10.79(@L)102 -478.8 S(ook up addresses in the user database.)-10.79 E .268 -(Con\214guration \214les prior to le)127 495 R -.15(ve)-.25 G 2.768(l6a) -.15 G .268(ssume the `)-2.768 F -1.11(A')-.8 G 2.768(,`)1.11 G .268 -(w', `5', `:', `|', `/', and `@' options on the)-2.768 F -(mailer named \231local\232.)102 507 Q .306(The mailer with the special name \231error\232 can be used to generate a user error) -127 523.2 R 5.306(.T)-.55 G .306(he \(optional\))-5.306 F .324 -(host \214eld is an e)102 535.2 R .323(xit status to be returned, and the user \214eld is a message to be printed.) --.15 F .323(The e)5.323 F .323(xit sta-)-.15 F .891 -(tus may be numeric or one of the v)102 547.2 R .891(alues USA)-.25 F -.891(GE, NOUSER, NOHOST)-.4 F 3.391(,U)-.74 G -.35(NA)-3.391 G -1.35(VA) --1 G .891(ILABLE, SOFT)1.35 F(-)-.92 E -1.2(WA)102 559.2 S 1.142 -(RE, TEMPF)1.2 F 1.142(AIL, PR)-.74 F -1.88 -.4(OT O)-.4 H 1.142 -(COL, or CONFIG to return the corresponding EX_ e).4 F 1.141 -(xit code, or an)-.15 F .288 -(enhanced error code as described in RFC 1893,)102 571.2 R F2 .288 -(Enhanced Mail System Status Codes.)2.788 F F1 -.15(Fo)5.288 G 2.788(re) -.15 G(xample,)-2.938 E(the entry:)102 583.2 Q -($#error $@ NOHOST $: Host unkno)142 599.4 Q(wn in this domain)-.25 E -.145(on the RHS of a rule will cause the speci\214ed error to be generated and the \231Host unkno) -102 615.6 R .145(wn\232 e)-.25 F .145(xit sta-)-.15 F .491 -(tus to be returned if the LHS matches.)102 627.6 R .491 -(This mailer is only functional in rulesets 0, 5, or one of the)5.491 F -(check_* rulesets.)102 639.6 Q .257 -(The mailer with the special name \231discard\232 causes an)127 655.8 R -2.756(ym)-.15 G .256(ail sent to it to be discarded b)-2.756 F .256 -(ut oth-)-.2 F(erwise treated as though it were successfully deli)102 -667.8 Q -.15(ve)-.25 G(red.).15 E .468(The mailer named \231local\232) -127 684 R F2(must)2.968 E F1 .468(be de\214ned in e)2.968 F -.15(ve)-.25 -G .468(ry con\214guration \214le.).15 F .468(This is used to deli)5.468 -F -.15(ve)-.25 G(r).15 E .25(local mail, and is treated specially in se) -102 696 R -.15(ve)-.25 G .25(ral w).15 F 2.75(ays. Additionally)-.1 F -2.75(,t)-.65 G .25(hree other mailers named \231prog\232,)-2.75 F .942(\231*\214le*\232, and \231*include*\232 may be de\214ned to tune the deli) -102 708 R -.15(ve)-.25 G .942(ry of messages to programs, \214les, and) -.15 F(:include: lists respecti)102 720 Q -.15(ve)-.25 G(ly).15 E 5(.T) --.65 G(he)-5 E 2.5(yd)-.15 G(ef)-2.5 E(ault to:)-.1 E EP -%%Page: 43 39 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-43)195.86 E/F1 10/Times-Roman@0 SF -(Mprog, P=/bin/sh, F=lsoDq9, T=DNS/RFC822/X-Unix, A=sh \255c $u)142 96 Q -(M*\214le*, P=[FILE], F=lsDFMPEouq9, T=DNS/RFC822/X-Unix, A=FILE $u)142 -108 Q(M*include*, P=/de)142 120 Q(v/null, F=su, A=INCLUDE $u)-.25 E .616 -(The Sender and Recipient re)127 140.4 R .615 -(writing sets may either be a simple ruleset id or may be tw)-.25 F -3.115(oi)-.1 G(ds)-3.115 E .575 -(separated by a slash; if so, the \214rst re)102 152.4 R .576 -(writing set is applied to en)-.25 F -.15(ve)-.4 G .576 -(lope addresses and the second is).15 F(applied to headers.)102 164.4 Q -(Setting an)5 E 2.5(yv)-.15 G(alue zero disables corresponding mailer) --2.75 E(-speci\214c re)-.2 E(writing.)-.25 E .197 -(The Directory is actually a colon-separated path of directories to try) -127 180.6 R 5.196(.F)-.65 G .196(or e)-5.346 F .196 -(xample, the de\214ni-)-.15 F .104 -(tion \231D=$z:/\232 \214rst tries to e)102 192.6 R -.15(xe)-.15 G .104 -(cute in the recipient').15 F 2.604(sh)-.55 G .104 -(ome directory; if that is not a)-2.604 F -.25(va)-.2 G .104 -(ilable, it tries to).25 F -.15(exe)102 204.6 S .816 -(cute in the root of the \214lesystem.).15 F .816 -(This is intended to be used only on the \231prog\232 mailer)5.816 F -3.316(,s)-.4 G(ince)-3.316 E .367(some shells \(such as)102 216.6 R/F2 -10/Times-Italic@0 SF(csh)2.867 E F1 2.867(\)r)C .367(efuse to e)-2.867 F --.15(xe)-.15 G .368(cute if the).15 F 2.868(yc)-.15 G .368 -(annot read the home directory)-2.868 F 5.368(.S)-.65 G .368 -(ince the queue)-5.368 F(directory is not normally readable by unpri)102 -228.6 Q(vile)-.25 E(ged users)-.15 E F2(csh)2.5 E F1 -(scripts as recipients can f)2.5 E(ail.)-.1 E 1.863 -(The Userid speci\214es the def)127 244.8 R 1.863 -(ault user and group id to run as, o)-.1 F -.15(ve)-.15 G 1.862 -(rriding the).15 F F0(DefaultUser)4.362 E F1 .286(option \(q.v)102 256.8 -R 2.786(.\). If)-.65 F(the)2.786 E F0(S)2.786 E F1 .287(mailer \215ag is also speci\214ed, this is the user and group to run as in all circum-) -2.786 F 2.588(stances. This)102 268.8 R .088(may be gi)2.588 F -.15(ve) --.25 G 2.588(na).15 G(s)-2.588 E F2(user:gr)2.588 E(oup)-.45 E F1 .088 -(to set both the user and group id; either may be an inte)2.588 F(ger) --.15 E .541(or a symbolic name to be look)102 280.8 R .541(ed up in the) --.1 F F2(passwd)3.041 E F1(and)3.041 E F2(gr)3.041 E(oup)-.45 E F1 .541 -(\214les respecti)3.041 F -.15(ve)-.25 G(ly).15 E 5.541(.I)-.65 G 3.041 -(fo)-5.541 G .542(nly a symbolic)-3.041 F -(user name is speci\214ed, the group id in the)102 292.8 Q F2(passwd)2.5 -E F1(\214le for that user is used as the group id.)2.5 E .545 -(The Charset \214eld is used when con)127 309 R -.15(ve)-.4 G .545 -(rting a message to MIME; this is the character set used).15 F .465 -(in the Content-T)102 321 R .465(ype: header)-.8 F 5.465(.I)-.55 G 2.965 -(ft)-5.465 G .465(his is not set, the)-2.965 F F0(DefaultCharset)2.966 E -F1 .466(option is used, and if that is not)2.966 F .258(set, the v)102 -333 R .258(alue \231unkno)-.25 F .258(wn-8bit\232 is used.)-.25 F F0 --1.2(WA)5.257 G(RNING:)1.2 E F1 .257 -(this \214eld applies to the sender')2.757 F 2.757(sm)-.55 G(ailer) --2.757 E 2.757(,n)-.4 G .257(ot the)-2.757 F(recipient')102 345 Q 2.701 -(sm)-.55 G(ailer)-2.701 E 5.201(.F)-.55 G .201(or e)-5.351 F .201 -(xample, if the en)-.15 F -.15(ve)-.4 G .202 -(lope sender address lists an address on the local netw).15 F(ork)-.1 E -.48(and the recipient is on an e)102 357 R .48(xternal netw)-.15 F .48 -(ork, the character set will be set from the Charset= \214eld for)-.1 F -(the local netw)102 369 Q(ork mailer)-.1 E 2.5(,n)-.4 G -(ot that of the e)-2.5 E(xternal netw)-.15 E(ork mailer)-.1 E(.)-.55 E -.794(The T)127 385.2 R .795(ype= \214eld sets the type information used in MIME error messages as de\214ned by RFC) --.8 F 2.805(1894. It)102 397.2 R .305(is actually three v)2.805 F .305 -(alues separated by slashes: the MT)-.25 F .305 -(A-type \(that is, the description of ho)-.93 F(w)-.25 E .083(hosts are named\), the address type \(the description of e-mail addresses\), and the diagnostic type \(the) -102 409.2 R .143(description of error diagnostic codes\).)102 421.2 R -.143(Each of these must be a re)5.143 F .142(gistered v)-.15 F .142 -(alue or be)-.25 F .142(gin with \231X\255\232.)-.15 F(The def)102 433.2 -Q(ault is \231dns/rfc822/smtp\232.)-.1 E F0 2.5(5.5. H)87 457.2 R 2.5 -<8a44>2.5 G(e\214ne Header)-2.5 E F1 1.135 -(The format of the header lines that)127 473.4 R F2(sendmail)3.636 E F1 -1.136(inserts into the message are de\214ned by the)3.636 F F0(H)3.636 E -F1 2.5(line. The)102 485.4 R(syntax of this line is:)2.5 E F0(H)142 -501.6 Q F1([)A F0(?)A F2(m\215a)A(gs)-.1 E F0(?)A F1(])A F2(hname)A F0 -(:)A F2(htemplate)2.5 E F1 1.058(Continuation lines in this spec are re\215ected directly into the outgoing message.) -102 517.8 R(The)6.058 E F2(htemplate)3.557 E F1(is)3.557 E(macro-e)102 -529.8 Q 1.12(xpanded before insertion into the message.)-.15 F 1.12 -(If the)6.12 F F2(m\215a)3.62 E(gs)-.1 E F1 1.12 -(\(surrounded by question marks\))3.62 F .161(are speci\214ed, at least one of the speci\214ed \215ags must be stated in the mailer de\214nition for this header) -102 541.8 R .191(to be automatically output.)102 553.8 R .192(If one of these headers is in the input it is re\215ected to the output re) -5.191 F -.05(ga)-.15 G(rd-).05 E(less of these \215ags.)102 565.8 Q -(Some headers ha)127 582 Q .3 -.15(ve s)-.2 H -(pecial semantics that will be described later).15 E(.)-.55 E 2.711(As) -127 598.2 S .211(econdary syntax allo)-2.711 F .211(ws v)-.25 F .211 -(alidation of headers as the)-.25 F 2.711(ya)-.15 G .211(re being read.) --2.711 F 1.81 -.8(To e)5.21 H .21(nable v).8 F(alidation,)-.25 E(use:) -102 610.2 Q F0(H)142 626.4 Q F2(Header)A F0 2.5(:$)C(>)-2.5 E F2 -(Ruleset)A F1 .715(The indicated)102 642.6 R F2(Ruleset)3.215 E F1 .715 -(is called for the speci\214ed)3.215 F F2(Header)3.216 E F1 3.216(,a)C -.716(nd can return)-3.216 F F0($#err)3.216 E(or)-.18 E F1 .716 -(to reject the mes-)3.216 F 1.972(sage or)102 654.6 R F0($#discard)4.472 -E F1 1.971(to discard the message \(as with the other)4.472 F F0(check_) -4.471 E F1 4.471(*r)C 4.471(ulesets\). The)-4.471 F 1.971(header is) -4.471 F(treated as a structured \214eld, that is, comments \(in parentheses\) are deleted before processing.) -102 666.6 Q -.15(Fo)127 682.8 S 2.5(re).15 G -(xample, the con\214guration lines:)-2.65 E EP -%%Page: 44 40 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-44 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF -(HMessage-Id: $>CheckMessageId)142 96 Q(SCheckMessageId)142 120 Q -(R< $+ @ $+)142 132 Q 11.06(>$)5 G 2.5(@O)-11.06 G(K)-2.5 E 52.83 -(R$* $#error)142 144 R($: Ille)2.5 E -.05(ga)-.15 G 2.5(lM).05 G -(essage-Id header)-2.5 E -.1(wo)102 160.2 S(uld refuse an).1 E 2.5(ym) --.15 G(essage that had a Message-Id: header of an)-2.5 E 2.5(yo)-.15 G -2.5(ft)-2.5 G(he follo)-2.5 E(wing forms:)-.25 E(Message-Id: <>)142 -176.4 Q(Message-Id: some te)142 188.4 Q(xt)-.15 E(Message-Id: <le)142 -200.4 Q -.05(ga)-.15 G 2.5(lt).05 G -.15(ex)-2.5 G(t@domain> e).15 E -(xtra crud)-.15 E F0 2.5(5.6. O)87 228.6 R 2.5<8a53>2.5 G(et Option)-2.5 -E F1 .962(There are a number of global options that can be set from a con\214guration \214le.) -127 244.8 R .963(Options are)5.963 F .86(represented by full w)102 256.8 -R .86(ords; some are also representable as single characters for back compatibility) --.1 F(.)-.65 E(The syntax of this line is:)102 268.8 Q F0(O)142 285 Q/F2 -10/Times-Italic@0 SF(option)7.5 E F0(=)A F2(value)A F1 .562 -(This sets option)102 301.2 R F2(option)3.062 E F1 .562(to be)3.062 F F2 -(value)3.062 E F1 5.562(.N)C .562(ote that there)-5.562 F F2(must)3.062 -E F1 .562(be a space between the letter `O' and the)3.062 F -(name of the option.)102 313.2 Q(An older v)5 E(ersion is:)-.15 E F0(O) -142 329.4 Q F2 1.666(ov)C(alue)-1.666 E F1 .13(where the option)102 -345.6 R F2(o)2.63 E F1 .13(is a single character)2.63 F 5.13(.D)-.55 G -.13(epending on the option,)-5.13 F F2(value)2.63 E F1 .13 -(may be a string, an inte)2.63 F(ger)-.15 E(,)-.4 E 2.5(ab)102 357.6 S -(oolean \(with le)-2.5 E -.05(ga)-.15 G 2.5(lv).05 G -(alues \231t\232, \231T\232, \231f\232, or \231F\232; the def)-2.75 E -(ault is TR)-.1 E(UE\), or a time interv)-.4 E(al.)-.25 E -(The options supported \(with the old, one character names in brack)127 -373.8 Q(ets\) are:)-.1 E(AliasFile=)102 390 Q F2(spec, spec, ...)A F1 -.439([A] Specify possible alias \214le\(s\).)174 402 R(Each)5.439 E F2 -(spec)2.939 E F1 .439(should be in the format `)2.939 F(`)-.74 E F2 -(class)A F0(:)A F2(\214le)2.94 E F1 -.74('')C(where)174 414 Q F2(class) -3.1 E F0(:)A F1 .599(is optional and def)3.099 F .599(aults to `)-.1 F -(`implicit')-.74 E 3.099('. Depending)-.74 F .599(on ho)3.099 F(w)-.25 E -F2(sendmail)3.099 E F1 .186(is compiled, v)174 426 R .187(alid classes are \231implicit\232 \(search through a compiled-in list of alias) --.25 F 2.055(\214le types, for back compatibility\), \231hash\232 \(if) -174 438 R/F3 9/Times-Roman@0 SF(NEWDB)4.555 E F1 2.055 -(is speci\214ed\), \231dbm\232 \(if)4.555 F F3(NDBM)174 450 Q F1 1.588(is speci\214ed\), \231stab\232 \(internal symbol table \212 not normally used unless) -4.088 F .075(you ha)174 462 R .375 -.15(ve n)-.2 H 2.575(oo).15 G .075 -(ther database lookup\), or \231nis\232 \(if)-2.575 F F3(NIS)2.574 E F1 -.074(is speci\214ed\).)2.574 F .074(If a list of)5.074 F F2(spec)2.574 E -F1(s)A(are pro)174 474 Q(vided,)-.15 E F2(sendmail)2.5 E F1 -(searches them in order)2.5 E(.)-.55 E(AliasW)102 490.2 Q(ait=)-.8 E F2 -(timeout)A F1 .14([a] If set, w)174 502.2 R .14(ait up to)-.1 F F2 -(timeout)2.64 E F1 .141(\(units def)2.641 F .141 -(ault to minutes\) for an \231@:@\232 entry to e)-.1 F(xist)-.15 E .518 -(in the alias database before starting up.)174 514.2 R .517 -(If it does not appear in the)5.517 F F2(timeout)3.017 E F1(inter)3.017 -E(-)-.2 E -.25(va)174 526.2 S 3.21(lr).25 G(eb)-3.21 E .71 -(uild the database \(if the)-.2 F F0 -.5(Au)3.21 G(toReb).5 E -(uildAliases)-.2 E F1 .71(option is also set\) or issue a)3.21 F -.1(wa) -174 538.2 S(rning.).1 E(Allo)102 554.4 Q(wBogusHELO)-.25 E 1.104 -([no short name] If set, allo)174 566.4 R 3.604(wH)-.25 G 1.104 -(ELO SMTP commands that don')-3.604 F 3.604(ti)-.18 G 1.103 -(nclude a host)-3.604 F 2.881(name. Setting)174 578.4 R .382 -(this violates RFC 1123 section 5.2.5, b)2.881 F .382 -(ut is necessary to interoper)-.2 F(-)-.2 E .061(ate with se)174 590.4 R --.15(ve)-.25 G .061(ral SMTP clients.).15 F .061(If there is a v)5.061 F -.06(alue, it is still check)-.25 F .06(ed for le)-.1 F(gitimac)-.15 E --.65(y.)-.15 G(AutoReb)102 606.6 Q(uildAliases)-.2 E .128 -([D] If set, reb)174 618.6 R .128 -(uild the alias database if necessary and possible.)-.2 F .128 -(If this option is not)5.128 F(set,)174 630.6 Q F2(sendmail)4.885 E F1 -2.385(will ne)4.885 F -.15(ve)-.25 G 4.885(rr).15 G(eb)-4.885 E 2.385 -(uild the alias database unless e)-.2 F 2.385(xplicitly requested)-.15 F -(using)174 642.6 Q F0(\255bi)2.5 E F1 5(.N)C -(ot recommended \212 can cause thrashing.)-5 E(BlankSub=)102 658.8 Q F2 -(c)A F1 1.255([B] Set the blank substitution character to)22.47 F F2(c) -3.755 E F1 6.255(.U)C 1.255(nquoted spaces in addresses are)-6.255 F -(replaced by this character)174 670.8 Q 5(.D)-.55 G(ef)-5 E -(aults to space \(i.e., no change is made\).)-.1 E 14.51 -(CheckAliases [n])102 687 R -1.11(Va)2.5 G -(lidate the RHS of aliases when reb)1.11 E(uilding the alias database.) --.2 E(CheckpointInterv)102 703.2 Q(al=)-.25 E F2(N)A F1 1.297 -([C] Checkpoints the queue e)174 715.2 R -.15(ve)-.25 G(ry).15 E F2(N) -3.797 E F1(\(def)3.797 E 1.297(ault 10\) addresses sent.)-.1 F 1.296 -(If your system)6.296 F EP -%%Page: 45 41 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-45)195.86 E/F1 10/Times-Roman@0 SF .746(crashes during deli)174 -96 R -.15(ve)-.25 G .746(ry to a lar).15 F .746(ge list, this pre)-.18 F --.15(ve)-.25 G .746(nts retransmission to an).15 F 3.247(yb)-.15 G .747 -(ut the)-3.447 F(last recipients.)174 108 Q(ClassF)102 124.2 Q(actor=) --.15 E/F2 10/Times-Italic@0 SF(fact)A F1 1.625([z] The indicated)4.29 F -F2(fact)4.124 E F1 1.624 -(or is multiplied by the message class \(determined by the)B .718 -(Precedence: \214eld in the user header and the)174 136.2 R F0(P)3.219 E -F1 .719(lines in the con\214guration \214le\) and)3.219 F 2.638 -(subtracted from the priority)174 148.2 R 7.637(.T)-.65 G 2.637 -(hus, messages with a higher Priority: will be)-7.637 F -.1(fa)174 160.2 -S -.2(vo)-.1 G 2.5(red. Def).2 F(aults to 1800.)-.1 E 3.95 -(ColonOkInAddr [no)102 176.4 R 4.679 -(short name] If set, colons are acceptable in e-mail addresses \(e.g.,) -7.179 F 3.54(\231host:user\232\). If)174 188.4 R 1.04 -(not set, colons indicate the be)3.54 F 1.04 -(ginning of a RFC 822 group con-)-.15 F 1.987 -(struct \(\231groupname: member1, member2, ... memberN;\232\).)174 200.4 -R 1.988(Doubled colons are)6.988 F(al)174 212.4 Q -.1(wa)-.1 G 2.215(ys acceptable \(\231nodename::user\232\) and proper route-addr nesting is under) -.1 F(-)-.2 E 1.036(stood \(\231<@relay:user@host>\232\).)174 224.4 R -1.037(Furthermore, this option def)6.036 F 1.037(aults on if the con-) --.1 F .854(\214guration v)174 236.4 R .854(ersion le)-.15 F -.15(ve)-.25 -G 3.354(li).15 G 3.354(sl)-3.354 G .853 -(ess than 6 \(for back compatibility\).)-3.354 F(Ho)5.853 E(we)-.25 E --.15(ve)-.25 G 1.653 -.4(r, i).15 H 3.353(tm).4 G(ust)-3.353 E(be of)174 -248.4 Q 2.5(ff)-.25 G(or full compatibility with RFC 822.)-2.5 E -(ConnectionCacheSize=)102 264.6 Q F2(N)A F1 .242([k] The maximum number of open connections that will be cached at a time.) -174 276.6 R(The)5.243 E(def)174 288.6 Q .386(ault is one.)-.1 F .386 -(This delays closing the current connection until either this in)5.386 F --.2(vo)-.4 G(ca-).2 E 1.191(tion of)174 300.6 R F2(sendmail)3.691 E F1 -1.191(needs to connect to another host or it terminates.)3.691 F 1.192 -(Setting it to)6.192 F 2.047(zero def)174 312.6 R 2.047 -(aults to the old beha)-.1 F(vior)-.2 E 4.546(,t)-.4 G 2.046 -(hat is, connections are closed immediately)-4.546 F(.)-.65 E .266(Since this consumes \214le descriptors, the connection cache should be k) -174 324.6 R .266(ept small: 4)-.1 F(is probably a practical maximum.)174 -336.6 Q(ConnectionCacheT)102 352.8 Q(imeout=)-.35 E F2(timeout)A F1 .708 -([K] The maximum amount of time a cached connection will be permitted to idle) -174 364.8 R 1.082(without acti)174 376.8 R(vity)-.25 E 6.082(.I)-.65 G -3.582(ft)-6.082 G 1.083(his time is e)-3.582 F 1.083 -(xceeded, the connection is immediately closed.)-.15 F .418(This v)174 -388.8 R .418(alue should be small \(on the order of ten minutes\).)-.25 -F(Before)5.418 E F2(sendmail)2.918 E F1 .417(uses a)2.917 F .507 -(cached connection, it al)174 400.8 R -.1(wa)-.1 G .508 -(ys sends a RSET command to check the connection; if).1 F .402(this f) -174 412.8 R .402(ails, it reopens the connection.)-.1 F .401(This k) -5.402 F .401(eeps your end from f)-.1 F .401(ailing if the other)-.1 F -1.544(end times out.)174 424.8 R 1.545 -(The point of this option is to be a good netw)6.544 F 1.545 -(ork neighbor and)-.1 F -.2(avo)174 436.8 S(id using up e).2 E(xcessi) --.15 E .3 -.15(ve r)-.25 H(esources on the other end.).15 E(The def)5 E -(ault is \214v)-.1 E 2.5(em)-.15 G(inutes.)-2.5 E -(ConnectionRateThrottle=)102 453 Q F2(N)A F1 .211 -([no short name] If set to a positi)174 465 R .511 -.15(ve v)-.25 H .211 -(alue, allo)-.1 F 2.711(wn)-.25 G 2.71(om)-2.711 G .21(ore than)-2.71 F -F2(N)2.71 E F1 .21(incoming daemon)2.71 F 1.776 -(connections in a one second period.)174 477 R 1.776 -(This is intended to \215atten out peaks and)6.776 F(allo)174 489 Q 2.5 -(wt)-.25 G(he load a)-2.5 E -.15(ve)-.2 G(rage checking to cut in.).15 E -(Def)5 E(aults to zero \(no limits\).)-.1 E(DaemonPortOptions=)102 505.2 -Q F2(options)A F1([O] Set serv)174 517.2 Q(er SMTP options.)-.15 E -(The options are)5 E F2 -.1(ke)2.5 G(y=value)-.2 E F1 2.5(pairs. Kno)2.5 -F(wn k)-.25 E -.15(ey)-.1 G 2.5(sa).15 G(re:)-2.5 E 52.83 -(Port Name/number)214 533.4 R(of listening port \(def)2.5 E -(aults to "smtp"\))-.1 E 48.95(Addr Address)214 545.4 R(mask \(def)2.5 E -(aults IN)-.1 E(ADDR_ANY\))-.35 E -.15(Fa)214 557.4 S 41.31 -(mily Address).15 F -.1(fa)2.5 G(mily \(def).1 E(aults to INET\))-.1 E -44.5(Listen Size)214 569.4 R(of listen queue \(def)2.5 E(aults to 10\)) --.1 E 21.72(SndBufSize Size)214 581.4 R(of TCP send b)2.5 E(uf)-.2 E -(fer)-.25 E 21.17(RcvBufSize Size)214 593.4 R(of TCP recei)2.5 E .3 -.15 -(ve b)-.25 H(uf)-.05 E(fer)-.25 E(The)174 609.6 Q F2(Addr)2.5 E F1 -(ess mask may be a numeric address in dot notation or a netw)A -(ork name.)-.1 E(Def)102 625.8 Q(aultCharSet=)-.1 E F2 -.15(ch)C(ar).15 -E(set)-.1 E F1 .161 -([no short name] When a message that has 8-bit characters b)174 637.8 R -.16(ut is not in MIME for)-.2 F(-)-.2 E .494(mat is con)174 649.8 R -.15 -(ve)-.4 G .495 -(rted to MIME \(see the EightBitMode option\) a character set must be) -.15 F .488(included in the Content-T)174 661.8 R .488(ype: header)-.8 F -5.488(.T)-.55 G .487(his character set is normally set from the)-5.488 F -.133(Charset= \214eld of the mailer descriptor)174 673.8 R 5.133(.I)-.55 -G 2.633(ft)-5.133 G .133(hat is not set, the v)-2.633 F .133 -(alue of this option is)-.25 F 2.5(used. If)174 685.8 R -(this option is not set, the v)2.5 E(alue \231unkno)-.25 E -(wn-8bit\232 is used.)-.25 E(Def)102 702 Q(aultUser=)-.1 E F2(user:gr)A -(oup)-.45 E F1 .014([u] Set the def)174 714 R .014 -(ault userid for mailers to)-.1 F F2(user:gr)2.513 E(oup)-.45 E F1 5.013 -(.I)C(f)-5.013 E F2(gr)2.513 E(oup)-.45 E F1 .013(is omitted and)2.513 F -F2(user)2.513 E F1(is)2.513 E EP -%%Page: 46 42 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-46 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF 4.306(au) -174 96 S 1.807(ser name \(as opposed to a numeric user id\) the def) --4.306 F 1.807(ault group listed in the)-.1 F 1.153 -(/etc/passwd \214le for that user is used as the def)174 108 R 1.153 -(ault group.)-.1 F(Both)6.153 E/F2 10/Times-Italic@0 SF(user)3.653 E F1 -(and)3.652 E F2(gr)3.652 E(oup)-.45 E F1 1.152(may be numeric.)174 120 R -1.152(Mailers without the)6.152 F F2(S)3.652 E F1 1.152 -(\215ag in the mailer de\214nition will run as)3.652 F .142(this user) -174 134 R 5.142(.D)-.55 G(ef)-5.142 E .142(aults to 1:1.)-.1 F .142 -(The v)5.142 F .142(alue can also be gi)-.25 F -.15(ve)-.25 G 2.642(na) -.15 G 2.642(sas)-2.642 G .142(ymbolic user name.)-2.642 F/F3 7 -/Times-Roman@0 SF(20)-4 I F1(Deli)102 150.2 Q -.15(ve)-.25 G(ryMode=).15 -E F2(x)A F1([d] Deli)4 E -.15(ve)-.25 G 2.5(ri).15 G 2.5(nm)-2.5 G(ode) --2.5 E F2(x)2.5 E F1 5(.L)C -2.25 -.15(eg a)-5 H 2.5(lm).15 G(odes are:) --2.5 E 17.22(iD)214 166.4 S(eli)-17.22 E -.15(ve)-.25 G 2.5(ri).15 G -(nteracti)-2.5 E -.15(ve)-.25 G(ly \(synchronously\)).15 E 15(bD)214 -178.4 S(eli)-15 E -.15(ve)-.25 G 2.5(ri).15 G 2.5(nb)-2.5 G -(ackground \(asynchronously\))-2.5 E 15(qJ)214 190.4 S -(ust queue the message \(deli)-15 E -.15(ve)-.25 G 2.5(rd).15 G -(uring queue run\))-2.5 E 15(dD)214 202.4 S(efer deli)-15 E -.15(ve)-.25 -G(ry and all map lookups \(deli).15 E -.15(ve)-.25 G 2.5(rd).15 G -(uring queue run\))-2.5 E(Def)174 218.6 Q .711(aults to `)-.1 F(`b')-.74 -E 3.211('i)-.74 G 3.211(fn)-3.211 G 3.211(oo)-3.211 G .711 -(ption is speci\214ed, `)-3.211 F(`i')-.74 E 3.211('i)-.74 G 3.211(fi) --3.211 G 3.211(ti)-3.211 G 3.211(ss)-3.211 G .712(peci\214ed b)-3.211 F -.712(ut gi)-.2 F -.15(ve)-.25 G 3.212(nn).15 G 3.212(oa)-3.212 G -.18 -(rg)-3.212 G(u-).18 E .094(ment \(i.e., `)174 230.6 R(`Od')-.74 E 2.594 -('i)-.74 G 2.594(se)-2.594 G(qui)-2.594 E -.25(va)-.25 G .094(lent to `) -.25 F(`Odi')-.74 E 2.594('\). The)-.74 F F0<ad76>2.594 E F1 .094 -(command line \215ag sets this to)2.594 F F0(i)2.594 E F1(.)A -(DialDelay=)102 246.8 Q F2(sleeptime)A F1 .798 -([no short name] Dial-on-demand netw)174 258.8 R .798 -(ork connections can see timeouts if a con-)-.1 F .665 -(nection is opened before the call is set up.)174 270.8 R .665 -(If this is set to an interv)5.665 F .665(al and a con-)-.25 F .742 -(nection times out on the \214rst connection being attempted)174 282.8 R -F2(sendmail)3.243 E F1 .743(will sleep for)3.243 F .31 -(this amount of time and try ag)174 294.8 R 2.81(ain. This)-.05 F .31 -(should gi)2.81 F .61 -.15(ve y)-.25 H .31(our system time to establish) -.15 F 1.542(the connection to your service pro)174 306.8 R(vider)-.15 E -6.543(.U)-.55 G 1.543(nits def)-6.543 F 1.543 -(ault to seconds, so \231DialDe-)-.1 F(lay=5\232 uses a \214v)174 318.8 -Q 2.5(es)-.15 G(econd delay)-2.5 E 5(.D)-.65 G(ef)-5 E -(aults to zero \(no retry\).)-.1 E(DontBlameSendmail=)102 335 Q F2 -(option,option,...)A F1 .065([no short name] In order to a)174 347 R -.2 -(vo)-.2 G .064(id possible cracking attempts caused by w).2 F .064 -(orld- and)-.1 F .254(group-writable \214les and directories,)174 359 R -F2(sendmail)2.754 E F1 .255(does paranoid checking when open-)2.754 F -.298(ing most of its support \214les.)174 371 R .297 -(If for some reason you absolutely must run with, for)5.297 F -.15(ex) -174 383 S .176(ample, a group-writable).15 F F2(/etc)2.677 E F1 -(directory)2.677 E 2.677(,t)-.65 G .177(hen you will ha)-2.677 F .477 --.15(ve t)-.2 H 2.677(ot).15 G .177(urn of)-2.677 F 2.677(ft)-.25 G .177 -(his check-)-2.677 F .125 -(ing \(at the cost of making your system more vulnerable to attack\).) -174 395 R .124(The ar)5.124 F(guments)-.18 E(are indi)174 407 Q -(vidual options that turn of)-.25 E 2.5(fc)-.25 G(hecking:)-2.5 E .32 LW -76 678.8 72 678.8 DL 80 678.8 76 678.8 DL 84 678.8 80 678.8 DL 88 678.8 -84 678.8 DL 92 678.8 88 678.8 DL 96 678.8 92 678.8 DL 100 678.8 96 678.8 -DL 104 678.8 100 678.8 DL 108 678.8 104 678.8 DL 112 678.8 108 678.8 DL -116 678.8 112 678.8 DL 120 678.8 116 678.8 DL 124 678.8 120 678.8 DL 128 -678.8 124 678.8 DL 132 678.8 128 678.8 DL 136 678.8 132 678.8 DL 140 -678.8 136 678.8 DL 144 678.8 140 678.8 DL 148 678.8 144 678.8 DL 152 -678.8 148 678.8 DL 156 678.8 152 678.8 DL 160 678.8 156 678.8 DL 164 -678.8 160 678.8 DL 168 678.8 164 678.8 DL 172 678.8 168 678.8 DL 176 -678.8 172 678.8 DL 180 678.8 176 678.8 DL 184 678.8 180 678.8 DL 188 -678.8 184 678.8 DL 192 678.8 188 678.8 DL 196 678.8 192 678.8 DL 200 -678.8 196 678.8 DL 204 678.8 200 678.8 DL 208 678.8 204 678.8 DL 212 -678.8 208 678.8 DL 216 678.8 212 678.8 DL/F4 5/Times-Roman@0 SF(20)93.6 -689.2 Q/F5 8/Times-Roman@0 SF(The old)3.2 I/F6 8/Times-Bold@0 SF(g)2 E -F5(option has been combined into the)2 E F6(DefaultUser)2 E F5(option.)2 -E EP -%%Page: 47 43 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-47)195.86 E/F1 10/Times-Roman@0 SF(Safe)214 96 Q(AssumeSafeCho) -214 108 Q(wn)-.25 E(ClassFileInUnsafeDirP)214 120 Q(ath)-.15 E -(ErrorHeaderInUnsafeDirP)214 132 Q(ath)-.15 E(FileDeli)214 144 Q -.15 -(ve)-.25 G(ryT).15 E(oHardLink)-.8 E(FileDeli)214 156 Q -.15(ve)-.25 G -(ryT).15 E(oSymLink)-.8 E -.15(Fo)214 168 S(rw).15 E -(ardFileInUnsafeDirP)-.1 E(ath)-.15 E -.15(Fo)214 180 S(rw).15 E -(ardFileInUnsafeDirP)-.1 E(athSafe)-.15 E -.15(Fo)214 192 S(rw).15 E -(ardFileIngroupWritableDirP)-.1 E(ath)-.15 E(GroupWritableAliasFile)214 -204 Q(GroupWritableDirP)214 216 Q(athSafe)-.15 E(GroupWritableF)214 228 -Q(orw)-.15 E(ardFileSafe)-.1 E(GroupWritableIncludeFileSafe)214 240 Q -(HelpFileinUnsafeDirP)214 252 Q(ath)-.15 E(IncludeFileInUnsafeDirP)214 -264 Q(ath)-.15 E(IncludeFileInUnsafeDirP)214 276 Q(athSafe)-.15 E -(IncludeFileIngroupWritableDirP)214 288 Q(ath)-.15 E(Link)214 300 Q -(edAliasFileInWritableDir)-.1 E(Link)214 312 Q(edClassFileInWritableDir) --.1 E(Link)214 324 Q(edF)-.1 E(orw)-.15 E(ardFileInWritableDir)-.1 E -(Link)214 336 Q(edIncludeFileInWritableDir)-.1 E(Link)214 348 Q -(edMapInWritableDir)-.1 E(Link)214 360 Q -(edServiceSwitchFileInWritableDir)-.1 E(MapInUnsafeDirP)214 372 Q(ath) --.15 E(RunProgramInUnsafeDirP)214 384 Q(ath)-.15 E(RunWritableProgram) -214 396 Q -.8(Wo)214 408 S(rldWritableAliasFile).8 E(WriteMapT)214 420 Q -(oHardLink)-.8 E(WriteMapT)214 432 Q(oSymLink)-.8 E(WriteStatsT)214 444 -Q(oHardLink)-.8 E(WriteStatsT)214 456 Q(oSymLink)-.8 E F0(Safe)174 472.2 -Q F1 1.223(is the def)3.723 F 3.723(ault. The)-.1 F 1.224 -(details of these \215ags are described abo)3.723 F -.15(ve)-.15 G(.).15 -E F0 1.224(Use of this)6.224 F(option is not r)174 484.2 Q(ecommended.) --.18 E F1(DontExpandCnames)102 500.4 Q .559([no short name] The standards say that all host addresses used in a mail message) -174 512.4 R 1.407(must be fully canonical.)174 524.4 R -.15(Fo)6.407 G -3.907(re).15 G 1.407(xample, if your host is named \231Cruft.F)-4.057 F -(oo.ORG\232)-.15 E 1.462(and also has an alias of \231FTP)174 536.4 R -(.F)-1.11 E 1.462(oo.ORG\232, the former name must be used at all)-.15 F -2.63(times. This)174 548.4 R .131 -(is enforced during host name canoni\214cation \($[ ... $] lookups\).) -2.63 F .131(If this)5.131 F .662(option is set, the protocols are ignored and the \231wrong\232 thing is done.) -174 560.4 R(Ho)5.661 E(we)-.25 E -.15(ve)-.25 G -.4(r,).15 G .455 -(the IETF is mo)174 572.4 R .455(ving to)-.15 F -.1(wa)-.25 G .455 -(rd changing this standard, so the beha).1 F .455(viour may become)-.2 F -3.01(acceptable. Please)174 584.4 R .509(note that hosts do)3.01 F .509 -(wnstream may still re)-.25 F .509(write the address to be)-.25 F -(the true canonical name ho)174 596.4 Q(we)-.25 E -.15(ve)-.25 G -.55 -(r.).15 G 6.17(DontInitGroups [no)102 612.6 R .25(short name] If set,) -2.75 F/F2 10/Times-Italic@0 SF(sendmail)2.75 E F1 .25(will a)2.75 F -.2 -(vo)-.2 G .25(id using the initgroups\(3\) call.).2 F .25(If you are) -5.25 F .583(running NIS, this causes a sequential scan of the groups.byname map, which can) -174 624.6 R .435(cause your NIS serv)174 636.6 R .435(er to be badly o) --.15 F -.15(ve)-.15 G .435(rloaded in a lar).15 F .436(ge domain.)-.18 F -.436(The cost of this)5.436 F .697(is that the only group found for users will be their primary group \(the one in the) -174 648.6 R(passw)174 660.6 Q 1.189(ord \214le\), which will mak)-.1 F -3.689<658c>-.1 G 1.189(le access permissions some)-3.689 F 1.189 -(what more restric-)-.25 F(ti)174 672.6 Q -.15(ve)-.25 G 5(.H).15 G -(as no ef)-5 E(fect on systems that don')-.25 E 2.5(th)-.18 G -2.25 -.2 -(av e)-2.5 H(group lists.)2.7 E(DontProbeInterf)102 688.8 Q(aces)-.1 E -1.713([no short name])174 700.8 R F2(Sendmail)4.213 E F1 1.712 -(normally \214nds the names of all interf)4.213 F 1.712(aces acti)-.1 F -2.012 -.15(ve o)-.25 H(n).15 E 1.103 -(your machine when it starts up and adds their name to the)174 712.8 R -F0($=w)3.603 E F1 1.103(class of kno)3.603 F(wn)-.25 E 1.836 -(host aliases.)174 724.8 R 1.836(If you ha)6.836 F 2.136 -.15(ve a l)-.2 -H(ar).15 E 1.836(ge number of virtual interf)-.18 F 1.835 -(aces or if your DNS)-.1 F EP -%%Page: 48 44 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-48 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF(in)174 96 -Q -.15(ve)-.4 G .958(rse lookups are slo).15 F 3.458(wt)-.25 G .958 -(his can be time consuming.)-3.458 F .959(This option turns of)5.959 F -3.459(ft)-.25 G(hat)-3.459 E 2.974(probing. Ho)174 108 R(we)-.25 E -.15 -(ve)-.25 G 1.274 -.4(r, y).15 H .474 -(ou will need to be certain to include all v).4 F .473 -(ariant names in the)-.25 F F0($=w)174 120 Q F1 -(class by some other mechanism.)2.5 E -1.61(DontPruneRoutes [R])102 -136.2 R(Normally)3.905 E(,)-.65 E/F2 10/Times-Italic@0 SF(sendmail)3.905 -E F1 1.405(tries to eliminate an)3.905 F 3.905(yu)-.15 G 1.405 -(nnecessary e)-3.905 F 1.405(xplicit routes when)-.15 F .155 -(sending an error message \(as discussed in RFC 1123 \247 5.2.6\).)174 -148.2 R -.15(Fo)5.154 G 2.654(re).15 G .154(xample, when)-2.804 F -(sending an error message to)174 160.2 Q(<@kno)214 176.4 Q(wn1,@kno)-.25 -E(wn2,@kno)-.25 E(wn3:user@unkno)-.25 E(wn>)-.25 E F2(sendmail)174 192.6 -Q F1 1.155(will strip of)3.655 F 3.655(ft)-.25 G 1.155(he \231@kno) --3.655 F(wn1,@kno)-.25 E 1.155(wn2\232 in order to mak)-.25 F 3.655(et) --.1 G 1.155(he route as)-3.655 F .813(direct as possible.)174 204.6 R -(Ho)5.813 E(we)-.25 E -.15(ve)-.25 G 1.613 -.4(r, i).15 H 3.313(ft).4 G -(he)-3.313 E F0(R)3.313 E F1 .812 -(option is set, this will be disabled, and the)3.313 F .009 -(mail will be sent to the \214rst address in the route, e)174 216.6 R --.15(ve)-.25 G 2.51(ni).15 G 2.51(fl)-2.51 G .01(ater addresses are kno) --2.51 F(wn.)-.25 E(This may be useful if you are caught behind a \214re) -174 228.6 Q -.1(wa)-.25 G(ll.).1 E(DoubleBounceAddress=)102 244.8 Q F2 -(err)A(or)-.45 E(-addr)-.2 E(ess)-.37 E F1 .504([no short name] If an error occurs when sending an error message, send the error) -174 256.8 R 1.999(report \(termed a \231double bounce\232 because it is an error \231bounce\232 that occurs) -174 268.8 R .818(when trying to send another error \231bounce\232\) to the indicated address.) -174 280.8 R .817(If not set,)5.817 F(def)174 292.8 Q -(aults to \231postmaster\232.)-.1 E(EightBitMode=)102 309 Q F2(action)A -F1 1.955([8] Set handling of eight-bit data.)174 321 R 1.955 -(There are tw)6.955 F 4.456(ok)-.1 G 1.956(inds of eight-bit data: that) --4.456 F 3.335(declared as such using the)174 333 R F0(BOD)5.834 E -(Y=8BITMIME)-.4 E F1 3.334(ESMTP declaration or the)5.834 F F0 -(\255B8BITMIME)174 345 Q F1 .948 -(command line \215ag, and undeclared 8-bit data, that is, input that) -3.448 F 1.18(just happens to be eight bits.)174 357 R 1.18 -(There are three basic operations that can happen:)6.18 F .995 -(undeclared 8-bit data can be automatically con)174 369 R -.15(ve)-.4 G -.996(rted to 8BITMIME, undeclared).15 F .887 -(8-bit data can be passed as-is without con)174 381 R -.15(ve)-.4 G .887 -(rsion to MIME \(`).15 F .887(`just send 8')-.74 F .886('\), and)-.74 F -1.794(declared 8-bit data can be con)174 393 R -.15(ve)-.4 G 1.794 -(rted to 7-bits for transmission to a non-8BIT).15 F(-)-.92 E -(MIME mailer)174 405 Q 5(.T)-.55 G(he possible)-5 E F2(action)2.5 E F1 -2.5(sa)C(re:)-2.5 E 11.11(sR)219 421.2 S -(eject undeclared 8-bit data \(`)-11.11 E(`strict')-.74 E('\))-.74 E -7.22(mC)219 433.2 S(on)-7.22 E -.15(ve)-.4 G -(rt undeclared 8-bit data to MIME \(`).15 E(`mime')-.74 E('\))-.74 E 10 -(pP)219 445.2 S(ass undeclared 8-bit data \(`)-10.15 E(`pass')-.74 E -('\))-.74 E 2.228 -(In all cases properly declared 8BITMIME data will be con)174 461.4 R --.15(ve)-.4 G 2.227(rted to 7BIT as).15 F(needed.)174 473.4 Q -(ErrorHeader=)102 489.6 Q F2(\214le-or)A(-messa)-.2 E -.1(ge)-.1 G F1 -.486([E] Prepend error messages with the indicated message.)174 501.6 R -.486(If it be)5.486 F .487(gins with a slash,)-.15 F .246(it is assumed to be the pathname of a \214le containing a message \(this is the recom-) -174 513.6 R .86(mended setting\).)174 525.6 R .86 -(Otherwise, it is a literal message.)5.86 F .86 -(The error \214le might contain)5.86 F 1.116(the name, email address, and/or phone number of a local postmaster who could) -174 537.6 R(pro)174 549.6 Q .173(vide assistance in to end users.)-.15 F -.174(If the option is missing or null, or if it names a)5.173 F -(\214le which does not e)174 561.6 Q -(xist or which is not readable, no message is printed.)-.15 E -(ErrorMode=)102 577.8 Q F2(x)A F1([e] Dispose of errors using mode)17.49 -E F2(x)2.5 E F1 5(.T)C(he v)-5 E(alues for)-.25 E F2(x)2.5 E F1(are:)2.5 -E 15(pP)214 594 S(rint error messages \(def)-15 E(ault\))-.1 E 15(qN)214 -606 S 2.5(om)-15 G(essages, just gi)-2.5 E .3 -.15(ve ex)-.25 H -(it status).15 E 12.22(mM)214 618 S(ail back errors)-12.22 E 12.78(wW) -214 630 S(rite back errors \(mail if user not logged in\))-12.78 E 15.56 -(eM)214 642 S(ail back errors and gi)-15.56 E .3 -.15(ve z)-.25 H(ero e) -.15 E(xit stat al)-.15 E -.1(wa)-.1 G(ys).1 E -.15(Fa)102 662.4 S -(llbackMXhost=).15 E F2(fallbac)A(khost)-.2 E F1 .797 -([V] If speci\214ed, the)174 674.4 R F2(fallbac)3.297 E(khost)-.2 E F1 -.797(acts lik)3.297 F 3.296(eav)-.1 G .796(ery lo)-3.446 F 3.296(wp)-.25 -G .796(riority MX on e)-3.296 F -.15(ve)-.25 G .796(ry host.).15 F -(This is intended to be used by sites with poor netw)174 686.4 Q -(ork connecti)-.1 E(vity)-.25 E(.)-.65 E -.15(Fo)102 702.6 S 16.88 -(rkEachJob [Y]).15 F .707(If set, deli)3.207 F -.15(ve)-.25 G 3.207(re) -.15 G .708(ach job that is run from the queue in a separate process.) --3.207 F(Use)5.708 E 2.753(this option if you are short of memory)174 -714.6 R 5.252(,s)-.65 G 2.752(ince the def)-5.252 F 2.752 -(ault tends to consume)-.1 F EP -%%Page: 49 45 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-49)195.86 E/F1 10/Times-Roman@0 SF -(considerable amounts of memory while the queue is being processed.)174 -96 Q -.15(Fo)102 112.2 S(rw).15 E(ardP)-.1 E(ath=)-.15 E/F2 10 -/Times-Italic@0 SF(path)A F1 1.511 -([J] Set the path for searching for users' .forw)174 124.2 R 1.512 -(ard \214les.)-.1 F 1.512(The def)6.512 F 1.512(ault is \231$z/.for)-.1 -F(-)-.2 E -.1(wa)174 136.2 S 5.8(rd\232. Some).1 F 3.299 -(sites that use the automounter may prefer to change this to)5.8 F -(\231/v)174 148.2 Q(ar/forw)-.25 E 1.696(ard/$u\232 to search a \214le with the same name as the user in a system) --.1 F(directory)174 160.2 Q 5.488(.I)-.65 G 2.988(tc)-5.488 G .488 -(an also be set to a sequence of paths separated by colons;)-2.988 F F2 -(sendmail)2.987 E F1 .831 -(stops at the \214rst \214le it can successfully and safely open.)174 -172.2 R -.15(Fo)5.831 G 3.331(re).15 G .831(xample, \231/v)-3.481 F -(ar/for)-.25 E(-)-.2 E -.1(wa)174 184.2 S(rd/$u:$z/.forw).1 E .277 -(ard\232 will search \214rst in /v)-.1 F(ar/forw)-.25 E(ard/)-.1 E F2 -(username)A F1 .276(and then in)2.777 F F2(~user)2.776 E(-)-.2 E(name) -174 196.2 Q F1(/.forw)A(ard \(b)-.1 E -(ut only if the \214rst \214le does not e)-.2 E(xist\).)-.15 E -(HelpFile=)102 212.4 Q F2(\214le)A F1 -([H] Specify the help \214le for SMTP)19.14 E(.)-1.11 E(HoldExpensi)102 -228.6 Q 8.54 -.15(ve [)-.25 H 1.393(c] If an outgoing mailer is mark).15 -F 1.393(ed as being e)-.1 F(xpensi)-.15 E -.15(ve)-.25 G 3.894(,d).15 G -(on')-3.894 E 3.894(tc)-.18 G 1.394(onnect immedi-)-3.894 F(ately)174 -240.6 Q 5.268(.T)-.65 G .268(his requires that queueing be compiled in, since it will depend on a queue) --5.268 F(run process to actually send the mail.)174 252.6 Q(HostsFile=) -102 268.8 Q F2(path)A F1 .026([no short name] The path to the hosts database, normally \231/etc/hosts\232.) -10.24 F .026(This option)5.026 F 1.417(is only consulted when sendmail is canonifying addresses, and then only when) -174 280.8 R .783 -(\231\214les\232 is in the \231hosts\232 service switch entry)174 292.8 -R 5.784(.I)-.65 G 3.284(np)-5.784 G(articular)-3.284 E 3.284(,t)-.4 G -.784(his \214le is)-3.284 F F2(ne)3.284 E(ver)-.15 E F1(used)3.284 E -.202(when looking up host addresses; that is under the control of the system) -174 304.8 R F2 -.1(ge)2.702 G(thostby-).1 E(name)174 316.8 Q F1 -(\(3\) routine.)A(HostStatusDirectory=)102 333 Q F2(path)A F1 .43 -([no short name] The location of the long term host status information.) -174 345 R .43(When set,)5.43 F 1.39 -(information about the status of hosts \(e.g., host do)174 357 R 1.39 -(wn or not accepting connec-)-.25 F .162 -(tions\) will be shared between all)174 369 R F2(sendmail)2.663 E F1 -.163(processes; normally)2.663 F 2.663(,t)-.65 G .163 -(his information is)-2.663 F .123(only held within a single queue run.) -174 381 R .123(This option requires a connection cache of at)5.123 F -.688(least 1 to function.)174 393 R .688(If the option be)5.688 F .688 -(gins with a leading `/', it is an absolute path-)-.15 F .617 -(name; otherwise, it is relati)174 405 R .917 -.15(ve t)-.25 H 3.117(ot) -.15 G .617(he mail queue directory)-3.117 F 5.617(.A)-.65 G .617 -(suggested v)-2.5 F .616(alue for)-.25 F .558(sites desiring persistent host status is \231.hoststat\232 \(i.e., a subdirectory of the queue) -174 417 R(directory\).)174 429 Q 24.51(IgnoreDots [i])102 445.2 R 1.172 -(Ignore dots in incoming messages.)3.672 F 1.172(This is al)6.172 F -.1 -(wa)-.1 G 1.171(ys disabled \(that is, dots are).1 F(al)174 457.2 Q -.1 -(wa)-.1 G(ys accepted\) when reading SMTP mail.).1 E(LogLe)102 473.4 Q --.15(ve)-.25 G(l=).15 E F2(n)A F1([L] Set the log le)22.88 E -.15(ve) --.25 G 2.5(lt).15 G(o)-2.5 E F2(n)2.5 E F1 5(.D)C(ef)-5 E(aults to 9.) --.1 E(M)102 489.6 Q F2 1.666(xv)C(alue)-1.666 E F1 .255([no long v) -35.344 F .255(ersion] Set the macro)-.15 F F2(x)2.755 E F1(to)2.755 E F2 -(value)2.755 E F1 5.255(.T)C .255(his is intended only for use from the) --5.255 F(command line.)174 501.6 Q(The)5 E F0<ad4d>2.5 E F1 -(\215ag is preferred.)2.5 E 11.17(MatchGECOS [G])102 517.8 R(Allo)3.334 -E 3.334(wf)-.25 G .834(uzzy matching on the GECOS \214eld.)-3.334 F .833 -(If this \215ag is set, and the usual)5.833 F .867(user name lookups f) -174 529.8 R .867(ail \(that is, there is no alias with this name and a) --.1 F F2 -.1(ge)3.368 G(tpwnam).1 E F1 -.1(fa)174 541.8 S 1.155 -(ils\), sequentially search the passw).1 F 1.155 -(ord \214le for a matching entry in the GECOS)-.1 F 3.696(\214eld. This) -174 553.8 R 1.196(also requires that MA)3.696 F 1.196 -(TCHGECOS be turned on during compilation.)-1.11 F -(This option is not recommended.)174 565.8 Q(MaxDaemonChildren=)102 582 -Q F2(N)A F1 .54([no short name] If set,)174 594 R F2(sendmail)3.039 E F1 -.539(will refuse connections when it has more than)3.039 F F2(N)3.039 E -F1 1.086(children processing incoming mail.)174 606 R 1.087 -(This does not limit the number of outgoing)6.086 F 3.37 -(connections. If)174 618 R .87 -(not set, there is no limit to the number of children -- that is, the) -3.37 F(system load a)174 630 Q -.15(ve)-.2 G(raging controls this.).15 E -(MaxHopCount=)102 646.2 Q F2(N)A F1 1.237([h] The maximum hop count.)174 -658.2 R 1.237(Messages that ha)6.237 F 1.538 -.15(ve b)-.2 H 1.238 -(een processed more than).15 F F2(N)3.738 E F1 -(times are assumed to be in a loop and are rejected.)174 670.2 Q(Def)5 E -(aults to 25.)-.1 E(MaxHostStatAge=)102 686.4 Q F2 -.1(age)C F1 .439 -([no short name] Not yet implemented.)174 698.4 R .438 -(This option speci\214es ho)5.438 F 2.938(wl)-.25 G .438 -(ong host status)-2.938 F .36(information will be retained.)174 710.4 R --.15(Fo)5.36 G 2.86(re).15 G .36(xample, if a host is found to be do) --3.01 F .36(wn, connec-)-.25 F .246 -(tions to that host will not be retried for this interv)174 722.4 R -2.746(al. The)-.25 F .246(units def)2.746 F .246(ault to minutes.)-.1 F -EP -%%Page: 50 46 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-50 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF -(MaxMessageSize=)102 96 Q/F2 10/Times-Italic@0 SF(N)A F1 2.562 -([no short name] Specify the maximum message size to be adv)174 108 R -2.563(ertised in the)-.15 F(ESMTP EHLO response.)174 120 Q(Messages lar) -5 E(ger than this will be rejected.)-.18 E(MaxQueueRunSize=)102 136.2 Q -F2(N)A F1 .677([no short name] The maximum number of jobs that will be processed in a single) -174 148.2 R .501(queue run.)174 160.2 R .501 -(If not set, there is no limit on the size.)5.501 F .501(If you ha)5.501 -F .802 -.15(ve ve)-.2 H .502(ry lar).15 F .502(ge queues)-.18 F .445 -(or a v)174 172.2 R .445(ery short queue run interv)-.15 F .445 -(al this could be unstable.)-.25 F(Ho)5.445 E(we)-.25 E -.15(ve)-.25 G -1.245 -.4(r, s).15 H .445(ince the \214rst).4 F F2(N)174 184.2 Q F1 -1.115(jobs in queue directory order are run \(rather than the)3.615 F F2 -(N)3.615 E F1 1.115(highest priority jobs\))3.615 F .136 -(this should be set as high as possible to a)174 196.2 R -.2(vo)-.2 G -.136(id \231losing\232 jobs that happen to f).2 F .136(all late)-.1 F -(in the queue directory)174 208.2 Q(.)-.65 E(MaxRecipientsPerMessage=) -102 224.4 Q F2(N)A F1 1.672([no short name] The maximum number of recipients that will be accepted per) -174 236.4 R 1.459(message in an SMTP transaction.)174 248.4 R 1.458 -(Note: setting this too lo)6.458 F 3.958(wc)-.25 G 1.458 -(an interfere with)-3.958 F .048(sending mail from MU)174 260.4 R .048 -(As that use SMTP for initial submission.)-.4 F .049 -(If not set, there is)5.049 F -(no limit on the number of recipients per en)174 272.4 Q -.15(ve)-.4 G -(lope.).15 E(MeT)102 288.6 Q 40.86(oo [m])-.8 F(Send to me too, e)2.5 E --.15(ve)-.25 G 2.5(ni).15 G 2.5(fIa)-2.5 G 2.5(mi)-2.5 G 2.5(na)-2.5 G -2.5(na)-2.5 G(lias e)-2.5 E(xpansion.)-.15 E(MinFreeBlocks=)102 304.8 Q -F2(N)A F1 1.539([b] Insist on at least)174 316.8 R F2(N)4.039 E F1 1.538 -(blocks free on the \214lesystem that holds the queue \214les)4.039 F -.845(before accepting email via SMTP)174 328.8 R 5.846(.I)-1.11 G 3.346 -(ft)-5.846 G .846(here is insuf)-3.346 F .846(\214cient space)-.25 F F2 -(sendmail)3.346 E F1(gi)3.346 E -.15(ve)-.25 G 3.346(sa).15 G -(452 response to the MAIL command.)174 340.8 Q(This in)5 E -(vites the sender to try ag)-.4 E(ain later)-.05 E(.)-.55 E -(MinQueueAge=age)102 357 Q .887([no short name] Don')174 369 R 3.387(tp) --.18 G .887(rocess an)-3.387 F 3.387(yq)-.15 G .886(ueued jobs that ha) --3.387 F 1.186 -.15(ve b)-.2 H .886(een in the queue less).15 F 1.899 -(than the indicated time interv)174 381 R 4.399(al. This)-.25 F 1.899 -(is intended to allo)4.399 F 4.399(wy)-.25 G 1.9(ou to get respon-) --4.399 F(si)174 393 Q -.15(ve)-.25 G .665 -(ness by processing the queue f).15 F .665 -(airly frequently without thrashing your system)-.1 F -(by trying jobs too often.)174 405 Q(The def)5 E -(ault units are minutes.)-.1 E(MustQuoteChars=)102 421.2 Q F2(s)A F1 -1.252([no short name] Sets the list of characters that must be quoted if used in a full) -174 433.2 R 1.217(name that is in the phrase part of a `)174 445.2 R -1.217(`phrase <address>')-.74 F 3.717('s)-.74 G 3.717(yntax. The)-3.717 -F(def)3.717 E 1.217(ault is)-.1 F -.74(``)174 457.2 S<b42e>.74 E -.74 -('')-.7 G 5(.T).74 G(he characters `)-5 E(`@,;:\\\(\)[]')-.74 E 2.5('a) --.74 G(re al)-2.5 E -.1(wa)-.1 G(ys added to this list.).1 E -(NoRecipientAction)102 473.4 Q .554([no short name] The action to tak) -174 485.4 R 3.055(ew)-.1 G .555(hen you recei)-3.055 F .855 -.15(ve a m) --.25 H .555(essage that has no v).15 F(alid)-.25 E .625 -(recipient headers \(T)174 497.4 R .625(o:, Cc:, Bcc:, or Apparently-T) --.8 F .625(o: \212 the last included for back)-.8 F .108 -(compatibility with old)174 509.4 R F2(sendmail)2.608 E F1 2.608 -(s\). It)B .108(can be)2.608 F F0(None)2.608 E F1 .109 -(to pass the message on unmod-)2.609 F .297 -(i\214ed, which violates the protocol,)174 521.4 R F0(Add-T)2.796 E(o) --.92 E F1 .296(to add a T)2.796 F .296(o: header with an)-.8 F 2.796(yr) --.15 G(ecipients)-2.796 E 1.638(it can \214nd in the en)174 533.4 R -.15 -(ve)-.4 G 1.638(lope \(which might e).15 F 1.638 -(xpose Bcc: recipients\),)-.15 F F0(Add-A)4.139 E(ppar)-.25 E(-)-.37 E -(ently-T)174 545.4 Q(o)-.92 E F1 .338(to add an Apparently-T)2.838 F -.337(o: header \(this is only for back-compatibility and)-.8 F .841 -(is of)174 557.4 R .841(\214cially deprecated\),)-.25 F F0(Add-T)3.341 E -(o-Undisclosed)-.92 E F1 .841(to add a header \231T)3.341 F .842 -(o: undisclosed-)-.8 F .398(recipients:;\232 to mak)174 569.4 R 2.898 -(et)-.1 G .397(he header le)-2.898 F -.05(ga)-.15 G 2.897(lw).05 G .397 -(ithout disclosing an)-2.897 F .397(ything, or)-.15 F F0(Add-Bcc)2.897 E -F1(to)2.897 E(add an empty Bcc: header)174 581.4 Q(.)-.55 E 1.18 -(OldStyleHeaders [o])102 597.6 R 1.713(Assume that the headers may be in old format, i.e., spaces delimit names.) -4.213 F 1.069(This actually turns on an adapti)174 609.6 R 1.368 -.15 -(ve a)-.25 H 1.068(lgorithm: if an).15 F 3.568(yr)-.15 G 1.068 -(ecipient address contains a)-3.568 F 1.681 -(comma, parenthesis, or angle brack)174 621.6 R 1.681 -(et, it will be assumed that commas already)-.1 F -.15(ex)174 633.6 S -2.825(ist. If).15 F .325 -(this \215ag is not on, only commas delimit names.)2.825 F .325 -(Headers are al)5.325 F -.1(wa)-.1 G .325(ys out-).1 F -(put with commas between the names.)174 645.6 Q(Def)5 E(aults to of)-.1 -E(f.)-.25 E(OperatorChars=)102 661.8 Q F2 -.15(ch)C(arlist).15 E F1 -1.438([$o macro] The list of characters that are considered to be \231operators\232, that is,) -174 673.8 R .82(characters that delimit tok)174 685.8 R 3.32(ens. All) --.1 F .82(operator characters are tok)3.32 F .82(ens by themselv)-.1 F -(es;)-.15 E .078(sequences of non-operator characters are also tok)174 -697.8 R 2.578(ens. White)-.1 F .078(space characters sep-)2.578 F .27 -(arate tok)174 709.8 R .27(ens b)-.1 F .269(ut are not tok)-.2 F .269 -(ens themselv)-.1 F .269(es \212 for e)-.15 F .269(xample, \231)-.15 F -.269(AAA.BBB\232 has three)-.8 F(tok)174 721.8 Q .433(ens, b)-.1 F .433 -(ut \231)-.2 F .433(AAA BBB\232 has tw)-.8 F 2.933(o. If)-.1 F .433 -(not set, OperatorChars def)2.933 F .433(aults to \231.)-.1 F 1.666 -(:@[])1.666 G<9a3b>-1.666 E EP -%%Page: 51 47 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-51)195.86 E/F1 10/Times-Roman@0 SF(additionally)174 96 Q 2.5(,t) --.65 G(he characters \231\()-2.5 E 1.666(\)<>,;)1.666 G 2.5<9a61>-1.666 -G(re al)-2.5 E -.1(wa)-.1 G(ys operators.).1 E(PostmasterCop)102 112.2 Q -(y=)-.1 E/F2 10/Times-Italic@0 SF(postmaster)A F1 .003 -([P] If set, copies of error messages will be sent to the named)174 -124.2 R F2(postmaster)2.503 E F1 5.003(.O)C .003(nly the)-5.003 F .626 -(header of the f)174 136.2 R .626(ailed message is sent.)-.1 F .627 -(Since most errors are user problems, this is)5.626 F .453 -(probably not a good idea on lar)174 148.2 R .453(ge sites, and ar)-.18 -F .453(guably contains all sorts of pri)-.18 F -.25(va)-.25 G -.15(cy) -.25 G 1.978(violations, b)174 160.2 R 1.978 -(ut it seems to be popular with certain operating systems v)-.2 F -(endors.)-.15 E(Def)174 172.2 Q(aults to no postmaster copies.)-.1 E -(Pri)102 188.4 Q -.25(va)-.25 G -.15(cy).25 G(Options=).15 E F2 -(opt,opt,...)1.666 E F1 1.192([p] Set the pri)174 200.4 R -.25(va)-.25 G --.15(cy).25 G F2(opt)3.842 E F1 3.692(ions. `)B(`Pri)-.74 E -.25(va)-.25 -G -.15(cy).25 G 2.672 -.74('' i).15 H 3.692(sr).74 G 1.191 -(eally a misnomer; man)-3.692 F 3.691(yo)-.15 G 3.691(ft)-3.691 G 1.191 -(hese are)-3.691 F .928(just a w)174 212.4 R .928 -(ay of insisting on stricter adherence to the SMTP protocol.)-.1 F(The) -5.929 E F2(opt)3.429 E F1(ions)A(can be selected from:)174 224.4 Q 40.26 -(public Allo)214 240.6 R 2.5(wo)-.25 G(pen access)-2.5 E 11.38 -(needmailhelo Insist)214 252.6 R(on HELO or EHLO command before MAIL)2.5 -E(neede)214 264.6 Q 9.87(xpnhelo Insist)-.15 F -(on HELO or EHLO command before EXPN)2.5 E(noe)214 276.6 Q 35.97 -(xpn Disallo)-.15 F 2.5(wE)-.25 G(XPN entirely)-2.5 E 12.5 -(needvrfyhelo Insist)214 288.6 R(on HELO or EHLO command before VRFY)2.5 -E(no)214 300.6 Q 38.75(vrfy Disallo)-.15 F 2.5(wV)-.25 G(RFY entirely) --2.5 E 39.71(noetrn Disallo)214 312.6 R 2.5(wE)-.25 G(TRN entirely)-2.5 -E(no)214 324.6 Q -.15(ve)-.15 G 37.79(rb Disallo).15 F 2.5(wV)-.25 G -(ERB entirely)-2.5 E 14.71(restrictmailq Restrict)214 336.6 R -(mailq command)2.5 E 19.16(restrictqrun Restrict)214 348.6 R -(\255q command line \215ag)2.5 E 24.16(noreceipts Don')214 362.6 R 2.5 -(tr)-.18 G(eturn success DSNs)-2.5 E/F3 7/Times-Roman@0 SF(21)-4 I F1 -(goa)214 374.6 Q -.1(wa)-.15 G 36.91(yD).1 G(isallo)-36.91 E 2.5(we)-.25 -G(ssentially all SMTP status queries)-2.5 E(authw)214 386.6 Q 11.48 -(arnings Put)-.1 F(X-Authentication-W)2.5 E(arning: headers in messages) --.8 E .485(The \231goa)174 402.8 R -.1(wa)-.15 G .485 -(y\232 pseudo-\215ag sets all \215ags e).1 F .486 -(xcept \231restrictmailq\232 and \231restrictqrun\232.)-.15 F 1.175(If mailq is restricted, only people in the same group as the queue directory can) -174 414.8 R .207(print the queue.)174 426.8 R .207 -(If queue runs are restricted, only root and the o)5.207 F .208 -(wner of the queue)-.25 F .066(directory can run the queue.)174 438.8 R -.066(Authentication W)5.066 F .066(arnings add w)-.8 F .066 -(arnings about v)-.1 F(arious)-.25 E .77(conditions that may indicate attempts to spoof the mail system, such as using an) -174 450.8 R(non-standard queue directory)174 462.8 Q(.)-.65 E -(QueueDirectory=)102 479 Q F2(dir)A F1([Q] Use the named)174 491 Q F2 -(dir)2.5 E F1(as the queue directory)2.5 E(.)-.65 E(QueueF)102 507.2 Q -(actor=)-.15 E F2(factor)A F1 .614([q] Use)174 519.2 R F2(factor)3.114 E -F1 .613 -(as the multiplier in the map function to decide when to just queue) -3.114 F .415(up jobs rather than run them.)174 531.2 R .415(This v)5.415 -F .415(alue is di)-.25 F .415(vided by the dif)-.25 F .415 -(ference between the)-.25 F 1.004(current load a)174 543.2 R -.15(ve)-.2 -G 1.004(rage and the load a).15 F -.15(ve)-.2 G 1.004(rage limit \().15 -F F0(QueueLA)A F1 1.003(option\) to determine)3.503 F -(the maximum message priority that will be sent.)174 555.2 Q(Def)5 E -(aults to 600000.)-.1 E(QueueLA=)102 571.4 Q F2(LA)A F1 .164 -([x] When the system load a)15.26 F -.15(ve)-.2 G .165(rage e).15 F -(xceeds)-.15 E F2(LA)2.665 E F1 2.665(,j)C .165 -(ust queue messages \(i.e., don')-2.665 F 2.665(tt)-.18 G(ry)-2.665 E -(to send them\).)174 583.4 Q(Def)5 E(aults to 8.)-.1 E(QueueSortOrder=) -102 599.6 Q F2(algorithm)A F1 .097([no short name] Sets the)174 611.6 R -F2(algorithm)2.597 E F1 .096(used for sorting the queue.)2.597 F .096 -(Only the \214rst char)5.096 F(-)-.2 E 1.021(acter of the v)174 623.6 R -1.021(alue is used.)-.25 F(Le)6.021 E -.05(ga)-.15 G 3.521(lv).05 G -1.021(alues are \231host\232 \(to order by the name of the)-3.771 F .002 -(\214rst host name of the \214rst recipient\), \231time\232 \(to order by the submission time\), and) -174 635.6 R .986(\231priority\232 \(to order by message priority\).)174 -647.6 R .986(Host ordering mak)5.986 F .986(es better use of the)-.1 F -1.834(connection cache, b)174 659.6 R 1.833(ut may tend to process lo) --.2 F 4.333(wp)-.25 G 1.833(riority messages that go to a)-4.333 F .32 -LW 76 669.2 72 669.2 DL 80 669.2 76 669.2 DL 84 669.2 80 669.2 DL 88 -669.2 84 669.2 DL 92 669.2 88 669.2 DL 96 669.2 92 669.2 DL 100 669.2 96 -669.2 DL 104 669.2 100 669.2 DL 108 669.2 104 669.2 DL 112 669.2 108 -669.2 DL 116 669.2 112 669.2 DL 120 669.2 116 669.2 DL 124 669.2 120 -669.2 DL 128 669.2 124 669.2 DL 132 669.2 128 669.2 DL 136 669.2 132 -669.2 DL 140 669.2 136 669.2 DL 144 669.2 140 669.2 DL 148 669.2 144 -669.2 DL 152 669.2 148 669.2 DL 156 669.2 152 669.2 DL 160 669.2 156 -669.2 DL 164 669.2 160 669.2 DL 168 669.2 164 669.2 DL 172 669.2 168 -669.2 DL 176 669.2 172 669.2 DL 180 669.2 176 669.2 DL 184 669.2 180 -669.2 DL 188 669.2 184 669.2 DL 192 669.2 188 669.2 DL 196 669.2 192 -669.2 DL 200 669.2 196 669.2 DL 204 669.2 200 669.2 DL 208 669.2 204 -669.2 DL 212 669.2 208 669.2 DL 216 669.2 212 669.2 DL/F4 5 -/Times-Roman@0 SF(21)93.6 679.6 Q/F5 8/Times-Roman@0 SF .817(N.B.: the) -3.2 J/F6 8/Times-Bold@0 SF(nor)2.817 E(eceipts)-.144 E F5 .817 -(\215ag causes)2.817 F/F7 8/Times-Italic@0 SF(sendmail)2.817 E F5 .817 -(to violate RFC 1891, which requires that return receipts be pro)2.817 F -.816(vided if Deli)-.12 F -.12(ve)-.2 G(ry).12 E -(Status Noti\214cations are supported.)72 692.4 Q EP -%%Page: 52 48 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-52 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF 2.605 -(single host o)174 96 R -.15(ve)-.15 G 5.106(rh).15 G 2.606 -(igh priority messages that go to se)-5.106 F -.15(ve)-.25 G 2.606 -(ral hosts; it probably).15 F(shouldn')174 108 Q 3.419(tb)-.18 G 3.419 -(eu)-3.419 G .919(sed on slo)-3.419 F 3.419(wn)-.25 G(etw)-3.419 E .919 -(ork links.)-.1 F -.35(Ti)5.918 G .918(me ordering is almost al).35 F --.1(wa)-.1 G .918(ys a bad).1 F .844(idea, since it allo)174 120 R .844 -(ws lar)-.25 F .844(ge, b)-.18 F .844(ulk mail to go out before smaller) --.2 F 3.345(,p)-.4 G .845(ersonal mail, b)-3.345 F(ut)-.2 E .708(may ha) -174 132 R 1.008 -.15(ve a)-.2 H .707(pplicability on some hosts with v) -.15 F .707(ery f)-.15 F .707(ast connections.)-.1 F .707(Priority order) -5.707 F(-)-.2 E(ing is the def)174 144 Q(ault.)-.1 E(QueueT)102 160.2 Q -(imeout=)-.35 E/F2 10/Times-Italic@0 SF(timeout)A F1 .355([T] A synon) -174 172.2 R .355(ym for \231T)-.15 F 2.855(imeout.queuereturn\232. Use) --.35 F .356(that form instead of the \231Queue-)2.855 F -.35(Ti)174 -184.2 S(meout\232 form.).35 E(Resolv)102 200.4 Q(erOptions=)-.15 E F2 -(options)A F1 .128([I] Set resolv)174 212.4 R .127(er options.)-.15 F --1.11(Va)5.127 G .127(lues can be set using)1.11 F F0(+)2.627 E F2<8d61> -A(g)-.1 E F1 .127(and cleared using)2.627 F F0<ad>2.627 E F2<8d61>A(g) --.1 E F1 2.627(;t)C(he)-2.627 E F2<8d61>174 224.4 Q(g)-.1 E F1 5.013(sc) -C 2.513(an be \231deb)-5.013 F 2.513(ug\232, \231aaonly\232, \231use)-.2 -F 2.514 -(vc\232, \231primary\232, \231igntc\232, \231recurse\232, \231def-)-.25 -F .867(names\232, \231stayopen\232, or \231dnsrch\232.)174 236.4 R .867 -(The string \231HasW)5.867 F .867(ildcardMX\232 \(without a)-.4 F F0(+) -3.367 E F1(or)3.367 E F0<ad>174 248.4 Q F1 3.82(\)c)C 1.32 -(an be speci\214ed to turn of)-3.82 F 3.82(fm)-.25 G 1.32(atching ag) --3.82 F 1.32(ainst MX records when doing name)-.05 F(canoni\214cations.) -174 260.4 Q F0(N.B.)5.918 E F1 .917 -(Prior to 8.7, this option indicated that the name serv)5.918 F .917 -(er be)-.15 F 1.025(responding in order to accept addresses.)174 272.4 R -1.025(This has been replaced by checking to)6.025 F .078(see if the \231dns\232 method is listed in the service switch entry for the \231hosts\232 service.) -174 284.4 R(RunAsUser=)102 300.6 Q F2(user)A F1 3.752 -([no short name] The)2.48 F F2(user)6.252 E F1 3.752 -(parameter may be a user name \(look)6.252 F 3.753(ed up in)-.1 F F2 -(/etc/passwd)174 312.6 Q F1 3.046(\)o)C 3.046(ran)-3.046 G .546 -(umeric user id; either form can ha)-3.046 F .846 -.15(ve \231)-.2 H -.545(:group\232 attached \(where).15 F .965 -(group can be numeric or symbolic\).)174 324.6 R .966 -(If set to a non-zero \(non-root\) v)5.965 F(alue,)-.25 E F2(send-)3.466 -E(mail)174 338.6 Q F1 .484 -(will change to this user id shortly after startup)2.984 F/F3 7 -/Times-Roman@0 SF(22)-4 I F1 5.483(.T)4 K .483(his a)-5.483 F -.2(vo)-.2 -G .483(ids a certain class).2 F 1.844(of security problems.)174 350.6 R -(Ho)6.844 E(we)-.25 E -.15(ve)-.25 G 2.644 -.4(r, t).15 H 1.844 -(his means that all \231.forw).4 F 1.844(ard\232 and \231:include:\232) --.1 F .194(\214les must be readable by the indicated)174 362.6 R F2 -(user)2.694 E F1 2.694(,a)C .193(nd on systems that don')-2.694 F 2.693 -(ts)-.18 G .193(upport the)-2.693 F(sa)174 374.6 Q -.15(ve)-.2 G 2.894 -(du).15 G .394(id bit properly)-2.894 F 2.894(,a)-.65 G .394 -(ll \214les to be written must be writable by)-2.894 F F2(user)2.895 E -F1 .395(and all pro-)2.895 F 1.218(grams will be e)174 386.6 R -.15(xe) --.15 G 1.218(cuted by).15 F F2(user)3.718 E F1 6.218(.I)C 3.717(ti) --6.218 G 3.717(sa)-3.717 G 1.217(lso incompatible with the)-3.717 F F0 -(SafeFileEn)3.717 E(vi-)-.4 E -.18(ro)174 398.6 S(nment).18 E F1 3.177 -(option. In)3.177 F .677(other w)3.177 F .677 -(ords, it may not actually add much to security on an)-.1 F -2.25 -.2 -(av e)174 410.6 T .624(rage system, and may in f).2 F .623 -(act detract from security \(because other \214le permis-)-.1 F 1.948 -(sions must be loosened\).)174 422.6 R(Ho)6.948 E(we)-.25 E -.15(ve)-.25 -G 2.748 -.4(r, i).15 H 4.448(ts).4 G 1.948(hould be useful on \214re) --4.448 F -.1(wa)-.25 G 1.949(lls and other).1 F(places where users don') -174 434.6 Q 2.5(th)-.18 G -2.25 -.2(av e)-2.5 H -(accounts and the aliases \214le is well constrained.)2.7 E(RecipientF) -102 450.8 Q(actor=)-.15 E F2(fact)A F1 .638([y] The indicated)174 462.8 -R F2(fact)3.137 E F1 .637(or is added to the priority \(thus)B F2 -(lowering)3.137 E F1 .637(the priority of the)3.137 F .23 -(job\) for each recipient, i.e., this v)174 474.8 R .231 -(alue penalizes jobs with lar)-.25 F .231(ge numbers of recipi-)-.18 F -2.5(ents. Def)174 486.8 R(aults to 30000.)-.1 E(RefuseLA=)102 503 Q F2 -(LA)A F1 1.012([X] When the system load a)13.59 F -.15(ve)-.2 G 1.012 -(rage e).15 F(xceeds)-.15 E F2(LA)3.512 E F1 3.512(,r)C 1.011 -(efuse incoming SMTP connec-)-3.512 F 2.5(tions. Def)174 515 R -(aults to 12.)-.1 E(RetryF)102 531.2 Q(actor=)-.15 E F2(fact)A F1 .771 -([Z] The)3.74 F F2(fact)3.271 E F1 .771(or is added to the priority e)B --.15(ve)-.25 G .772(ry time a job is processed.).15 F .772(Thus, each) -5.772 F .994(time a job is processed, its priority will be decreased by the indicated v) -174 543.2 R 3.493(alue. In)-.25 F 1.107(most en)174 555.2 R 1.107 -(vironments this should be positi)-.4 F -.15(ve)-.25 G 3.608(,s).15 G -1.108(ince hosts that are do)-3.608 F 1.108(wn are all too)-.25 F -(often do)174 567.2 Q(wn for a long time.)-.25 E(Def)5 E -(aults to 90000.)-.1 E(SafeFileEn)102 583.4 Q(vironment=)-.4 E F2(dir)A -F1 .022([no short name] If this option is set,)174 595.4 R F2(sendmail) -2.521 E F1 .021(will do a)2.521 F F2 -.15(ch)2.521 G -.45(ro).15 G(ot) -.45 E F1 .021(\(2\) call into the indi-)B(cated)174 607.4 Q F2(dir)2.832 -E F1 .333(ectory before doing an)B 2.833<798c>-.15 G .333(le writes.) --2.833 F .333(If the \214le name speci\214ed by the user)5.333 F(be)174 -619.4 Q .588(gins with)-.15 F F2(dir)3.088 E F1 3.087(,t)C .587 -(hat partial path name will be stripped of)-3.087 F 3.087(fb)-.25 G .587 -(efore writing, so \(for)-3.087 F -.15(ex)174 631.4 S 2.224 -(ample\) if the SafeFileEn).15 F 2.224(vironment v)-.4 F 2.225 -(ariable is set to \231/safe\232 then aliases of)-.25 F 1.557(\231/safe/logs/\214le\232 and \231/logs/\214le\232 actually indicate the same \214le.) -174 643.4 R(Additionally)6.556 E 4.056(,i)-.65 G(f)-4.056 E -(this option is set,)174 655.4 Q F2(sendmail)2.5 E F1(refuses to deli) -2.5 E -.15(ve)-.25 G 2.5(rt).15 G 2.5(os)-2.5 G(ymbolic links.)-2.5 E -.32 LW 76 678.8 72 678.8 DL 80 678.8 76 678.8 DL 84 678.8 80 678.8 DL 88 -678.8 84 678.8 DL 92 678.8 88 678.8 DL 96 678.8 92 678.8 DL 100 678.8 96 -678.8 DL 104 678.8 100 678.8 DL 108 678.8 104 678.8 DL 112 678.8 108 -678.8 DL 116 678.8 112 678.8 DL 120 678.8 116 678.8 DL 124 678.8 120 -678.8 DL 128 678.8 124 678.8 DL 132 678.8 128 678.8 DL 136 678.8 132 -678.8 DL 140 678.8 136 678.8 DL 144 678.8 140 678.8 DL 148 678.8 144 -678.8 DL 152 678.8 148 678.8 DL 156 678.8 152 678.8 DL 160 678.8 156 -678.8 DL 164 678.8 160 678.8 DL 168 678.8 164 678.8 DL 172 678.8 168 -678.8 DL 176 678.8 172 678.8 DL 180 678.8 176 678.8 DL 184 678.8 180 -678.8 DL 188 678.8 184 678.8 DL 192 678.8 188 678.8 DL 196 678.8 192 -678.8 DL 200 678.8 196 678.8 DL 204 678.8 200 678.8 DL 208 678.8 204 -678.8 DL 212 678.8 208 678.8 DL 216 678.8 212 678.8 DL/F4 5 -/Times-Roman@0 SF(22)93.6 689.2 Q/F5 8/Times-Roman@0 SF(When running as a daemon, it changes to this user after accepting a connection b) -3.2 I(ut before reading an)-.16 E(y)-.12 E F3(SMTP)2 E F5(commands.)2 E -EP -%%Page: 53 49 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-53)195.86 E/F1 10/Times-Roman@0 SF(Sa)102 96 Q -.15(ve)-.2 G -10.41(FromLine [f]).15 F(Sa)4.908 E 2.708 -.15(ve U)-.2 H 2.408 -(nix-style \231From\232 lines at the front of headers.).15 F 2.409 -(Normally the)7.409 F 4.909(ya)-.15 G(re)-4.909 E -(assumed redundant and discarded.)174 108 Q(SendMIMEErrors)102 124.2 Q -.815([j] If set, send error messages in MIME format \(see RFC2045 and RFC1344 for) -174 136.2 R 2.914(details\). If)174 148.2 R(disabled,)2.914 E/F2 10 -/Times-Italic@0 SF(sendmail)2.914 E F1 .415(will not return the DSN k) -2.914 F -.15(ey)-.1 G -.1(wo).15 G .415(rd in response to an).1 F 1.731 -(EHLO and will not do Deli)174 160.2 R -.15(ve)-.25 G 1.731 -(ry Status Noti\214cation processing as described in).15 F(RFC1891.)174 -172.2 Q(ServiceSwitchFile=)102 188.4 Q F2(\214lename)A F1 1.532([no short name] If your host operating system has a service switch abstraction) -174 200.4 R .003(\(e.g., /etc/nsswitch.conf on Solaris or /etc/svc.conf on Ultrix and DEC OSF/1\) that) -174 212.4 R .814(service will be consulted and this option is ignored.) -174 224.4 R .814(Otherwise, this is the name)5.814 F 1.083 -(of a \214le that pro)174 236.4 R 1.082 -(vides the list of methods used to implement particular services.)-.15 F -1.069(The syntax is a series of lines, each of which is a sequence of w) -174 248.4 R 3.57(ords. The)-.1 F(\214rst)3.57 E -.1(wo)174 260.4 S 1.364 -(rd is the service name, and follo).1 F 1.363(wing w)-.25 F 1.363 -(ords are service types.)-.1 F 1.363(The services)6.363 F(that)174 272.4 -Q F2(sendmail)4.11 E F1 1.61 -(consults directly are \231aliases\232 and \231hosts.)4.11 F 6.61<9a53> --.7 G 1.61(ervice types can be)-6.61 F 1.755(\231dns\232, \231nis\232, \231nisplus\232, or \231\214les\232 \(with the ca) -174 284.4 R -.15(ve)-.2 G 1.754(at that the appropriate support).15 F -.791(must be compiled in before the service can be referenced\).)174 -296.4 R .791(If ServiceSwitchFile)5.791 F 1.303 -(is not speci\214ed, it def)174 308.4 R 1.303 -(aults to /etc/service.switch.)-.1 F 1.303(If that \214le does not e) -6.303 F 1.303(xist, the)-.15 F(def)174 320.4 Q(ault switch is:)-.1 E -38.6(aliases \214les)214 336.6 R 44.7(hosts dns)214 348.6 R(nis \214les) -2.5 E(The def)174 364.8 Q(ault \214le is \231/etc/service.switch\232.) --.1 E(Se)102 381 Q -.15(ve)-.25 G 12.12(nBitInput [7]).15 F .321 -(Strip input to se)2.821 F -.15(ve)-.25 G 2.821(nb).15 G .322 -(its for compatibility with old systems.)-2.821 F .322(This shouldn') -5.322 F 2.822(tb)-.18 G(e)-2.822 E(necessary)174 393 Q(.)-.65 E -(SingleLineFromHeader)102 409.2 Q .959 -([no short name] If set, From: lines that ha)174 421.2 R 1.258 -.15 -(ve e)-.2 H .958(mbedded ne).15 F .958(wlines are unwrapped)-.25 F .242 -(onto one line.)174 433.2 R .243 -(This is to get around a botch in Lotus Notes that apparently cannot) -5.242 F(understand le)174 445.2 Q -.05(ga)-.15 G -(lly wrapped RFC822 headers.).05 E(SingleThreadDeli)102 461.4 Q -.15(ve) --.25 G(ry).15 E .334([no short name] If set, a client machine will ne) -174 473.4 R -.15(ve)-.25 G 2.833(rt).15 G .333(ry to open tw)-2.833 F -2.833(oS)-.1 G .333(MTP connec-)-2.833 F 1.711(tions to a single serv) -174 485.4 R 1.712(er machine at the same time, e)-.15 F -.15(ve)-.25 G -4.212(ni).15 G 4.212(nd)-4.212 G(if)-4.212 E 1.712(ferent processes.) --.25 F .953(That is, if another)174 497.4 R F2(sendmail)3.452 E F1 .952 -(is already talking to some host a ne)3.452 F(w)-.25 E F2(sendmail)3.452 -E F1(will)3.452 E 2.387(not open another connection.)174 509.4 R 2.387 -(This property is of mix)7.387 F 2.388(ed v)-.15 F 2.388 -(alue; although this)-.25 F .386(reduces the load on the other machine, it can cause mail to be delayed \(for e) -174 521.4 R(xam-)-.15 E .718(ple, if one)174 533.4 R F2(sendmail)3.218 E -F1 .718(is deli)3.218 F -.15(ve)-.25 G .718(ring a huge message, other) -.15 F F2(sendmail)3.219 E F1 3.219(sw)C(on')-3.319 E 3.219(tb)-.18 G -3.219(ea)-3.219 G(ble)-3.219 E 1.543(to send e)174 545.4 R -.15(ve)-.25 -G 4.043(ns).15 G 1.543(mall messages\).)-4.043 F 1.542 -(Also, it requires another \214le descriptor \(for the)6.543 F .996 -(lock \214le\) per connection, so you may ha)174 557.4 R 1.297 -.15 -(ve t)-.2 H 3.497(or).15 G .997(educe the)-3.497 F F0 -(ConnectionCacheSize)3.497 E F1 .235(option to a)174 569.4 R -.2(vo)-.2 -G .235(id running out of per).2 F .234(-process \214le descriptors.)-.2 -F .234(Requires the)5.234 F F0(HostSta-)2.734 E(tusDir)174 581.4 Q -(ectory)-.18 E F1(option.)2.5 E(SmtpGreetingMessage=)102 597.6 Q F2 -(messa)A -.1(ge)-.1 G F1 .344 -([$e macro] The message printed when the SMTP serv)174 609.6 R .345 -(er starts up.)-.15 F(Def)5.345 E .345(aults to \231$j)-.1 F -(Sendmail $v ready at $b\232.)174 621.6 Q(StatusFile=)102 637.8 Q F2 -(\214le)A F1 .3([S] Log summary statistics in the named)14.13 F F2 -(\214le)2.799 E F1 5.299(.I)C 2.799(fn)-5.299 G .299 -(ot set, no summary statistics are)-2.799 F(sa)174 649.8 Q -.15(ve)-.2 G -3.775(d. This).15 F 1.275(\214le does not gro)3.775 F 3.775(wi)-.25 G -3.775(ns)-3.775 G 3.775(ize. It)-3.775 F 1.275(can be printed using the) -3.775 F F2(mailstats)3.775 E F1(\(8\))A(program.)174 661.8 Q 28.4 -(SuperSafe [s])102 678 R .373(Be super)2.873 F .373 -(-safe when running things, i.e., al)-.2 F -.1(wa)-.1 G .372 -(ys instantiate the queue \214le, e).1 F -.15(ve)-.25 G(n).15 E .697 -(if you are going to attempt immediate deli)174 690 R -.15(ve)-.25 G(ry) -.15 E(.)-.65 E F2(Sendmail)5.697 E F1(al)3.198 E -.1(wa)-.1 G .698 -(ys instantiates the).1 F 1.509 -(queue \214le before returning control to the client under an)174 702 R -4.009(yc)-.15 G 4.009(ircumstances. This)-4.009 F(should really)174 714 -Q F2(always)2.5 E F1(be set.)2.5 E EP -%%Page: 54 50 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-54 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF -.7(Te) -102 96 S(mpFileMode=).7 E/F2 10/Times-Italic@0 SF(mode)A F1 .331 -([F] The \214le mode for queue \214les.)174 108 R .331 -(It is interpreted in octal by def)5.331 F 2.832(ault. Def)-.1 F .332 -(aults to)-.1 F(0600.)174 120 Q -.35(Ti)102 136.2 S(meout.).35 E F2 -(type)A F1(=)A F2(timeout)1.666 E F1 .297 -([r; subsumes old T option as well] Set timeout v)174 148.2 R 2.796 -(alues. The)-.25 F .296(actual timeout is indi-)2.796 F 1.678 -(cated by the)174 160.2 R F2(type)4.178 E F1 6.678(.T)C 1.678 -(he recognized timeouts and their def)-6.678 F 1.679(ault v)-.1 F 1.679 -(alues, and their)-.25 F(minimum v)174 172.2 Q -(alues speci\214ed in RFC 1123 section 5.3.2 are:)-.25 E 23.6(initial w) -214 188.4 R(ait for initial greeting message [5m, 5m])-.1 E 29.72 -(helo reply)214 200.4 R(to HELO or EHLO command [5m, none])2.5 E 29.16 -(mail reply)214 212.4 R(to MAIL command [10m, 5m])2.5 E 31.39 -(rcpt reply)214 224.4 R(to RCPT command [1h, 5m])2.5 E 16.94 -(datainit reply)214 236.4 R(to D)2.5 E -1.21 -1.11(AT A)-.4 H -(command [5m, 2m])3.61 E 8.06(datablock data)214 248.4 R -(block read [1h, 3m])2.5 E 12.5(data\214nal reply)214 260.4 R -(to \214nal `)2.5 E(`.)-.74 E 1.48 -.74('' i)-.7 H 2.5(nd).74 G -(ata [1h, 10m])-2.5 E 32.5(rset reply)214 272.4 R -(to RSET command [5m, none])2.5 E 31.38(quit reply)214 284.4 R(to Q)2.5 -E(UIT command [2m, none])-.1 E 28.05(misc reply)214 296.4 R -(to NOOP and VERB commands [2m, none])2.5 E 26.94(ident IDENT)214 308.4 -R(protocol timeout [30s, none])2.5 E 9.72(\214leopen\207 timeout)214 -320.4 R(on opening .forw)2.5 E(ard and :include: \214les [60s, none])-.1 -E 2.5(command\207 command)214 332.4 R(read [1h, 5m])2.5 E -(queuereturn\207ho)214 344.4 Q 2.5(wl)-.25 G -(ong until a message is returned [5d, 5d])-2.5 E(queue)214 356.4 Q -.1 -(wa)-.25 G -1.58(rn\207 ho).1 F 2.5(wl)-.25 G(ong until a w)-2.5 E -(arning is sent [none, none])-.1 E 2.49(hoststatus\207 ho)214 368.4 R -2.5(wl)-.25 G(ong until host status is `)-2.5 E(`stale')-.74 E 2.5('[) --.74 G(30m, none])-2.5 E .893(All b)174 384.6 R .893(ut those mark)-.2 F -.893(ed with a dagger \(\207\) apply to client SMTP)-.1 F 5.892(.I)-1.11 -G 3.392(ft)-5.892 G .892(he message is)-3.392 F .273 -(submitted using the)174 396.6 R/F3 9/Times-Roman@0 SF(NO)2.773 E .523 -(TIFY SMTP)-.36 F F1 -.15(ex)2.773 G .273(tension, w).15 F .274 -(arning messages will only be sent)-.1 F(if)174 408.6 Q F3(NO)3.038 E -(TIFY=DELA)-.36 E(Y)-.945 E F1 .538(is speci\214ed.)3.038 F .537 -(The queuereturn and queue)5.537 F -.1(wa)-.25 G .537 -(rn timeouts can be).1 F 1.234(further quali\214ed with a tag based on the Precedence: \214eld in the message; the) -174 420.6 R(y)-.15 E 1.9(must be one of \231ur)174 432.6 R 1.9 -(gent\232 \(indicating a positi)-.18 F 2.2 -.15(ve n)-.25 H 1.9 -(on-zero precedence\) \231normal\232).15 F .251 -(\(indicating a zero precedence\), or \231non-ur)174 444.6 R .251 -(gent\232 \(indicating ne)-.18 F -.05(ga)-.15 G(ti).05 E .552 -.15(ve p) --.25 H(recedences\).).15 E -.15(Fo)174 456.6 S 4.423(re).15 G 1.923 -(xample, setting \231T)-4.573 F(imeout.queue)-.35 E -.1(wa)-.25 G(rn.ur) -.1 E 1.923(gent=1h\232 sets the w)-.18 F 1.922(arning timeout)-.1 F .222 -(for ur)174 468.6 R .223(gent messages only to one hour)-.18 F 5.223(.T) --.55 G .223(he def)-5.223 F .223(ault if no precedence is indicated is) --.1 F(to set the timeout for all precedences.)174 480.6 Q -.35(Ti)102 -496.8 S(meZoneSpec=).35 E F2(tzinfo)A F1 .218 -([t] Set the local time zone info to)174 508.8 R F2(tzinfo)2.718 E F1 -2.718<8a66>2.718 G .218(or e)-2.718 F .218(xample, \231PST8PDT\232.)-.15 -F(Actually)5.217 E 2.717(,i)-.65 G(f)-2.717 E 1.345 -(this is not set, the TZ en)174 520.8 R 1.346(vironment v)-.4 F 1.346 -(ariable is cleared \(so the system def)-.25 F 1.346(ault is)-.1 F .209 -(used\); if set b)174 532.8 R .208(ut null, the user')-.2 F 2.708(sT) --.55 G 2.708(Zv)-2.708 G .208 -(ariable is used, and if set and non-null the TZ)-2.958 F -.25(va)174 -544.8 S(riable is set to this v).25 E(alue.)-.25 E -.35(Tr)102 561 S -5.96(yNullMXList [w]).35 F .114 -(If this system is the \231best\232 \(that is, lo)2.613 F .114 -(west preference\) MX for a gi)-.25 F -.15(ve)-.25 G 2.614(nh).15 G .114 -(ost, its)-2.614 F 1.168(con\214guration rules should normally detect this situation and treat that condition) -174 573 R .257(specially by forw)174 585 R .258 -(arding the mail to a UUCP feed, treating it as local, or whate)-.1 F --.15(ve)-.25 G -.55(r.).15 G(Ho)174 597 Q(we)-.25 E -.15(ve)-.25 G 1.686 --.4(r, i).15 H 3.386(ns).4 G .886(ome cases \(such as Internet \214re) --3.386 F -.1(wa)-.25 G .886(lls\) you may w).1 F .885 -(ant to try to con-)-.1 F .07 -(nect directly to that host as though it had no MX records at all.)174 -609 R .07(Setting this option)5.07 F(causes)174 621 Q F2(sendmail)3.014 -E F1 .514(to try this.)3.014 F .514(The do)5.514 F .514 -(wnside is that errors in your con\214guration are)-.25 F(lik)174 633 Q -2.116(ely to be diagnosed as \231host unkno)-.1 F 2.116 -(wn\232 or \231message timed out\232 instead of)-.25 F -(something more meaningful.)174 645 Q(This option is disrecommended.)5 E -(UnixFromLine=)102 661.2 Q F2(fr)A(omline)-.45 E F1 .236 -([$l macro] De\214nes the format used when)174 673.2 R F2(sendmail)2.736 -E F1 .236(must add a UNIX-style From_)2.736 F 1.324 -(line \(that is, a line be)174 685.2 R 1.325 -(ginning \231From<space>user\232\).)-.15 F(Def)6.325 E 1.325 -(aults to \231From $g)-.1 F($d\232.)6.325 E(Don')174 697.2 Q 2.646(tc) --.18 G .146(hange this unless your system uses a dif)-2.646 F .146 -(ferent UNIX mailbox format \(v)-.25 F(ery)-.15 E(unlik)174 709.2 Q -(ely\).)-.1 E EP -%%Page: 55 51 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-55)195.86 E/F1 10/Times-Roman@0 SF(UnsafeGroupWrites)102 96 Q -.211([no short name] If set, :include: and .forw)174 108 R .212 -(ard \214les that are group writable are con-)-.1 F .367 -(sidered \231unsafe\232, that is, the)174 120 R 2.867(yc)-.15 G .366 -(annot reference programs or write directly to \214les.)-2.867 F -.8(Wo) -174 132 S(rld writable :include: and .forw).8 E(ard \214les are al)-.1 E --.1(wa)-.1 G(ys unsafe..).1 E(UseErrorsT)102 148.2 Q 21.15(o[)-.8 G .826 -(l] If there is an \231Errors-T)-21.15 F .826(o:\232 header)-.8 F 3.326 -(,s)-.4 G .826(end error messages to the addresses listed)-3.326 F 3.135 -(there. The)174 160.2 R 3.135(yn)-.15 G .635(ormally go to the en)-3.135 -F -.15(ve)-.4 G .635(lope sender).15 F 5.635(.U)-.55 G .634 -(se of this option causes)-5.635 F/F2 10/Times-Italic@0 SF(send-)3.134 E -(mail)174 172.2 Q F1(to violate RFC 1123.)2.5 E -(This option is disrecommended and deprecated.)5 E(UserDatabaseSpec=)102 -188.4 Q F2(udbspec)A F1([U] The user database speci\214cation.)174 200.4 -Q 3.94(UserSubmission [no)102 216.6 R 1.369(short name] This is an initial submission directly from a Mail User Agent.) -3.869 F .433(This can be set in the con\214guration \214le if you ha)174 -228.6 R .733 -.15(ve M)-.2 H -.4(UA).15 G 2.933(st).4 G .433(hat don') --2.933 F 2.933(tp)-.18 G .433(ass the)-2.933 F F0<ad55>2.933 E F1 .37 -(\215ag or use the XUSR ESMTP e)174 240.6 R .371(xtension, b)-.15 F .371 -(ut some relayed mail may get inappro-)-.2 F(priately re)174 252.6 Q -(written if you do.)-.25 E -1.11(Ve)102 268.8 S 37.29(rbose [v])1.11 F -.561(Run in v)3.061 F .561(erbose mode.)-.15 F .561(If this is set,) -5.561 F F2(sendmail)3.061 E F1 .56(adjusts options)3.061 F F0 -(HoldExpensi)3.06 E -.1(ve)-.1 G F1(\(old)174 280.8 Q F0(c)2.635 E F1 -2.635(\)a)C(nd)-2.635 E F0(Deli)2.635 E -.1(ve)-.1 G(ryMode).1 E F1 -(\(old)2.635 E F0(d)2.635 E F1 2.635(\)s)C 2.635(ot)-2.635 G .135 -(hat all mail is deli)-2.635 F -.15(ve)-.25 G .136 -(red completely in a sin-).15 F 1.244 -(gle job so that you can see the entire deli)174 292.8 R -.15(ve)-.25 G -1.244(ry process.).15 F(Option)6.244 E F0 -1(Ve)3.743 G(rbose)1 E F1 -(should)3.743 E F2(ne)174 304.8 Q(ver)-.15 E F1(be set in the con\214guration \214le; it is intended for command line use only) -2.5 E(.)-.65 E .108(All options can be speci\214ed on the command line using the \255O or \255o \215ag, b) -102 321 R .109(ut most will cause)-.2 F F2(send-)2.609 E(mail)102 333 Q -F1 1.135(to relinquish its setuid permissions.)3.635 F 1.135 -(The options that will not cause this are MinFreeBlocks)6.135 F .513 -([b], Deli)102 345 R -.15(ve)-.25 G .513 -(ryMode [d], ErrorMode [e], IgnoreDots [i], LogLe).15 F -.15(ve)-.25 G -3.014(l[).15 G .514(L], MeT)-3.014 F .514(oo [m], OldStyleHeaders)-.8 F -.53([o], Pri)102 357 R -.25(va)-.25 G -.15(cy).25 G .53(Options [p], T) -.15 F .53(imeouts [r], SuperSafe [s], V)-.35 F .53 -(erbose [v], CheckpointInterv)-1.11 F .53(al [C], and Se)-.25 F(v-)-.25 -E(enBitInput [7].)102 369 Q(Also, M \(de\214ne macro\) when de\214ning the r or s macros is also considered \231safe\232.) -5 E F0 2.5(5.7. P)87 393 R 2.5<8a50>2.5 G -.18(re)-2.5 G -(cedence De\214nitions).18 E F1 -1.11(Va)127 409.2 S .164 -(lues for the \231Precedence:\232 \214eld may be de\214ned using the) -1.11 F F0(P)2.664 E F1 .164(control line.)2.664 F .164 -(The syntax of this)5.164 F(\214eld is:)102 421.2 Q F0(P)142 437.4 Q F2 -(name)A F0(=)A F2(num)A F1 .384(When the)102 453.6 R F2(name)2.884 E F1 -.384 -(is found in a \231Precedence:\232 \214eld, the message class is set to) -2.884 F F2(num)2.883 E F1 5.383(.H)C .383(igher numbers)-5.383 F .85 -(mean higher precedence.)102 465.6 R .85(Numbers less than zero ha)5.85 -F 1.15 -.15(ve t)-.2 H .85(he special property that if an error occurs) -.15 F 1.551(during processing the body of the message will not be returned; this is e) -102 477.6 R 1.551(xpected to be used for)-.15 F<9962>102 489.6 Q .461 -(ulk\232 mail such as through mailing lists.)-.2 F .461(The def)5.461 F -.461(ault precedence is zero.)-.1 F -.15(Fo)5.461 G 2.962(re).15 G .462 -(xample, our list of)-3.112 F(precedences is:)102 501.6 Q -(P\214rst-class=0)142 517.8 Q(Pspecial-deli)142 529.8 Q -.15(ve)-.25 G -(ry=100).15 E(Plist=\25530)142 541.8 Q(Pb)142 553.8 Q(ulk=\25560)-.2 E -(Pjunk=\255100)142 565.8 Q 1.059(People writing mailing list e)102 582 R -1.058(xploders are encouraged to use \231Precedence: list\232.)-.15 F -1.058(Older v)6.058 F 1.058(ersions of)-.15 F F2(sendmail)102 594 Q F1 -1.19(\(which discarded all error returns for ne)3.69 F -.05(ga)-.15 G -(ti).05 E 1.49 -.15(ve p)-.25 H 1.19(recedences\) didn').15 F 3.69(tr) --.18 G 1.19(ecognize this name,)-3.69 F(gi)102 606 Q .599(ving it a def) --.25 F .598(ault precedence of zero.)-.1 F .598(This allo)5.598 F .598 -(ws list maintainers to see error returns on both old)-.25 F(and ne)102 -618 Q 2.5(wv)-.25 G(ersions of)-2.65 E F2(sendmail)2.5 E F1(.)A F0 2.5 -(5.8. V)87 642 R 2.5<8a43>2.5 G(on\214guration V)-2.5 E(ersion Le)-1 E --.1(ve)-.15 G(l).1 E F1 3.181 -.8(To p)127 658.2 T(ro).8 E 1.581 -(vide compatibility with old con\214guration \214les, the)-.15 F F0(V) -4.081 E F1 1.582(line has been added to de\214ne)4.082 F 1.11(some v)102 -670.2 R 1.11(ery basic semantics of the con\214guration \214le.)-.15 F -1.11(These are not intended to be long term sup-)6.11 F .033 -(ports; rather)102 682.2 R 2.533(,t)-.4 G(he)-2.533 E 2.533(yd)-.15 G -.033(escribe compatibility features which will probably be remo)-2.533 F --.15(ve)-.15 G 2.533(di).15 G 2.533(nf)-2.533 G .034(uture releases.) --2.533 F F0(N.B.:)127 698.4 Q F1 .197(these v)2.697 F(ersion)-.15 E F2 -(le)2.697 E(vels)-.15 E F1(ha)2.697 E .496 -.15(ve n)-.2 H .196 -(othing to do with the v).15 F(ersion)-.15 E F2(number)2.696 E F1 .196 -(on the \214les.)2.696 F -.15(Fo)5.196 G 2.696(re).15 G(xam-)-2.846 E -(ple, as of this writing v)102 710.4 Q -(ersion 8 con\214g \214les \(speci\214cally)-.15 E 2.5(,8)-.65 G -(.9\) used v)-2.5 E(ersion le)-.15 E -.15(ve)-.25 G 2.5(l8c).15 G -(on\214gurations.)-2.5 E EP -%%Page: 56 52 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-56 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF 1.102 -(\231Old\232 con\214guration \214les are de\214ned as v)127 96 R 1.102 -(ersion le)-.15 F -.15(ve)-.25 G 3.602(lo).15 G 3.602(ne. V)-3.602 F -1.102(ersion le)-1.11 F -.15(ve)-.25 G 3.602(lt).15 G 1.302 -.1(wo \214) --3.602 H 1.103(les mak).1 F 3.603(et)-.1 G(he)-3.603 E(follo)102 108 Q -(wing changes:)-.25 E 12.5(\(1\) Host)107 124.2 R .727(name canoni\214cation \($[ ... $]\) appends a dot if the name is recognized; this gi) -3.227 F -.15(ve)-.25 G 3.226(st).15 G(he)-3.226 E 1.974 -(con\214g \214le a w)133.66 136.2 R 1.974(ay of \214nding out if an)-.1 -F 1.974(ything matched.)-.15 F(\(Actually)6.974 E 4.475(,t)-.65 G 1.975 -(his just initializes the)-4.475 F .739 -(\231host\232 map with the \231\255a.)133.66 148.2 R 5.739<9a8d>-.7 G -.739(ag \212 you can reset it to an)-5.739 F .738 -(ything you prefer by declaring the)-.15 F(map e)133.66 160.2 Q -(xplicitly)-.15 E(.\))-.65 E 12.5(\(2\) Def)107 176.4 R .384 -(ault host name e)-.1 F .385 -(xtension is consistent throughout processing; v)-.15 F .385(ersion le) --.15 F -.15(ve)-.25 G 2.885(lo).15 G .385(ne con\214gu-)-2.885 F .83 -(rations turned of)133.66 188.4 R 3.33(fd)-.25 G .83(omain e)-3.33 F .83 -(xtension \(that is, adding the local domain name\) during certain)-.15 -F .4(points in processing.)133.66 200.4 R -1.11(Ve)5.4 G .4(rsion le) -1.11 F -.15(ve)-.25 G 2.9(lt).15 G .6 -.1(wo c)-2.9 H .4 -(on\214gurations are e).1 F .4(xpected to include a trailing dot)-.15 F -(to indicate that the name is already canonical.)133.66 212.4 Q 12.5 -(\(3\) Local)107 228.6 R .072 -(names that are not aliases are passed through a ne)2.572 F 2.572(wd) --.25 G .072(istinguished ruleset \214v)-2.572 F .072(e; this can)-.15 F -1.426(be used to append a local relay)133.66 240.6 R 6.426(.T)-.65 G -1.426(his beha)-6.426 F 1.426(viour can be pre)-.2 F -.15(ve)-.25 G -1.426(nted by resolving the local).15 F .209(name with an initial `@'.) -133.66 252.6 R .209(That is, something that resolv)5.209 F .209 -(es to a local mailer and a user name)-.15 F 1.072 -(of \231vikki\232 will be passed through ruleset \214v)133.66 264.6 R -1.072(e, b)-.15 F 1.073(ut a user name of \231@vikki\232 will ha)-.2 F -1.373 -.15(ve t)-.2 H(he).15 E .417 -(`@' stripped, will not be passed through ruleset \214v)133.66 276.6 R -.417(e, b)-.15 F .416(ut will otherwise be treated the same)-.2 F 1.702 -(as the prior e)133.66 288.6 R 4.202(xample. The)-.15 F -.15(ex)4.202 G -1.703(pectation is that this might be used to implement a polic).15 F(y) --.15 E .136(where mail sent to \231vikki\232 w)133.66 300.6 R .135 -(as handled by a central hub, b)-.1 F .135 -(ut mail sent to \231vikki@localhost\232)-.2 F -.1(wa)133.66 312.6 S 2.5 -(sd).1 G(eli)-2.5 E -.15(ve)-.25 G(red directly).15 E(.)-.65 E -1.11(Ve) -127 328.8 S 1.382(rsion le)1.11 F -.15(ve)-.25 G 3.882(lt).15 G 1.382 -(hree \214les allo)-3.882 F 3.882(w#i)-.25 G 1.382 -(nitiated comments on all lines.)-3.882 F 1.383 -(Exceptions are backslash)6.383 F(escaped # marks and the $# syntax.)102 -340.8 Q -1.11(Ve)127 357 S 1.208(rsion le)1.11 F -.15(ve)-.25 G 3.708 -(lf).15 G 1.208(our con\214gurations are completely equi)-3.708 F -.25 -(va)-.25 G 1.207(lent to le).25 F -.15(ve)-.25 G 3.707(lt).15 G 1.207 -(hree for historical rea-)-3.707 F(sons.)102 369 Q -1.11(Ve)127 385.2 S -1.234(rsion le)1.11 F -.15(ve)-.25 G 3.734<6c8c>.15 G 1.534 -.15(ve c) --3.734 H 1.234(on\214guration \214les change the def).15 F 1.234 -(ault de\214nition of)-.1 F F0($w)3.734 E F1 1.234 -(to be just the \214rst)3.734 F(component of the hostname.)102 397.2 Q --1.11(Ve)127 413.4 S 1.589(rsion le)1.11 F -.15(ve)-.25 G 4.089(ls).15 G -1.589(ix con\214guration \214les change man)-4.089 F 4.088(yo)-.15 G -4.088(ft)-4.088 G 1.588(he local processing options \(such as)-4.088 F -.48(aliasing and matching the be)102 425.4 R .481(ginning of the address for `|' characters\) to be mailer \215ags; this allo) --.15 F(ws)-.25 E 1.345(\214ne-grained control o)102 437.4 R -.15(ve)-.15 -G 3.845(rt).15 G 1.345(he special local processing.)-3.845 F(Le)6.345 E --.15(ve)-.25 G 3.845(ls).15 G 1.344 -(ix con\214guration \214les may also use)-3.845 F 1.221 -(long option names.)102 449.4 R(The)6.221 E F0(ColonOkInAddr)3.721 E F1 -1.221(option \(to allo)3.721 F 3.722(wc)-.25 G 1.222 -(olons in the local-part of addresses\))-3.722 F(def)102 461.4 Q(aults) --.1 E F0(on)3.44 E F1 .94(for lo)3.44 F .94(wer numbered con\214guration \214les; the con\214guration \214le requires some additional) --.25 F(intelligence to properly handle the RFC 822 group construct.)102 -473.4 Q -1.11(Ve)127 489.6 S 1.97(rsion le)1.11 F -.15(ve)-.25 G 4.47 -(ls).15 G -2.15 -.25(ev e)-4.47 H 4.47(nc).25 G 1.97 -(on\214guration \214les used ne)-4.47 F 4.47(wo)-.25 G 1.97 -(ption names to replace old macros \()-4.47 F F0($e)A F1(became)102 -501.6 Q F0(SmtpGr)4.993 E(eeetingMessage)-.18 E F1(,)A F0($l)4.993 E F1 -(became)4.993 E F0(UnixFr)4.993 E(omLine)-.18 E F1 4.992(,a)C(nd)-4.992 -E F0($o)4.992 E F1(became)4.992 E F0(OperatorChars)4.992 E F1(.)A .086 -(Also, prior to v)102 513.6 R .086(ersion se)-.15 F -.15(ve)-.25 G .086 -(n, the).15 F F0(F=q)2.586 E F1 .087 -(\215ag \(use 250 instead of 252 return v)2.586 F .087(alue for)-.25 F -/F2 9/Times-Roman@0 SF .087(SMTP VRFY)2.587 F F1(com-)2.587 E(mands\) w) -102 525.6 Q(as assumed.)-.1 E -1.11(Ve)127 541.8 S(rsion le)1.11 E -.15 -(ve)-.25 G 2.5(le).15 G(ight con\214guration \214les allo)-2.5 E(w)-.25 -E F0($#)2.5 E F1(on the left hand side of ruleset lines.)2.5 E(The)127 -558 Q F0(V)2.678 E F1 .178(line may ha)2.678 F .478 -.15(ve a)-.2 H -2.677(no).15 G(ptional)-2.677 E F0(/)2.677 E/F3 10/Times-Italic@0 SF -(vendor)A F1 .177 -(to indicate that this con\214guration \214le uses modi\214ca-)2.677 F -.866(tions speci\214c to a particular v)102 572 R(endor)-.15 E/F4 7 -/Times-Roman@0 SF(23)-4 I F1 5.866(.Y)4 K .866(ou may use \231/Berk) --6.966 F(ele)-.1 E .865(y\232 to emphasize that this con\214gura-)-.15 F -(tion \214le uses the Berk)102 584 Q(ele)-.1 E 2.5(yd)-.15 G(ialect of) --2.5 E F3(sendmail)2.5 E F1(.)A F0 2.5(5.9. K)87 608 R 2.5<8a4b>2.5 G -(ey File Declaration)-2.75 E F1 -(Special maps can be de\214ned using the line:)127 624.2 Q -(Kmapname mapclass ar)142 640.4 Q(guments)-.18 E(The)102 656.6 Q F3 -(mapname)2.75 E F1 .251 -(is the handle by which this map is referenced in the re)2.75 F .251 -(writing rules.)-.25 F(The)5.251 E F3(mapclass)2.751 E F1(is)2.751 E -1.889(the name of a type of map; these are compiled in to)102 668.6 R F3 -(sendmail)4.389 E F1 6.888(.T)C(he)-6.888 E F3(ar)4.388 E(guments)-.37 E -F1 1.888(are interpreted)4.388 F .32 LW 76 678.2 72 678.2 DL 80 678.2 76 -678.2 DL 84 678.2 80 678.2 DL 88 678.2 84 678.2 DL 92 678.2 88 678.2 DL -96 678.2 92 678.2 DL 100 678.2 96 678.2 DL 104 678.2 100 678.2 DL 108 -678.2 104 678.2 DL 112 678.2 108 678.2 DL 116 678.2 112 678.2 DL 120 -678.2 116 678.2 DL 124 678.2 120 678.2 DL 128 678.2 124 678.2 DL 132 -678.2 128 678.2 DL 136 678.2 132 678.2 DL 140 678.2 136 678.2 DL 144 -678.2 140 678.2 DL 148 678.2 144 678.2 DL 152 678.2 148 678.2 DL 156 -678.2 152 678.2 DL 160 678.2 156 678.2 DL 164 678.2 160 678.2 DL 168 -678.2 164 678.2 DL 172 678.2 168 678.2 DL 176 678.2 172 678.2 DL 180 -678.2 176 678.2 DL 184 678.2 180 678.2 DL 188 678.2 184 678.2 DL 192 -678.2 188 678.2 DL 196 678.2 192 678.2 DL 200 678.2 196 678.2 DL 204 -678.2 200 678.2 DL 208 678.2 204 678.2 DL 212 678.2 208 678.2 DL 216 -678.2 212 678.2 DL/F5 5/Times-Roman@0 SF(23)93.6 688.6 Q/F6 8 -/Times-Roman@0 SF .214(And of course, v)3.2 J .214 -(endors are encouraged to add themselv)-.12 F .214 -(es to the list of recognized v)-.12 F .214 -(endors by editing the routine)-.12 F/F7 8/Times-Italic@0 SF(setvendor) -2.214 E F6(in)2.214 E F7(conf)72 701.4 Q(.c)-.12 E F6 4(.P)C -(lease send e-mail to sendmail@Sendmail.ORG to re)-4 E(gister your v) --.12 E(endor dialect.)-.12 E EP -%%Page: 57 53 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-57)195.86 E/F1 10/Times-Roman@0 SF .79 -(depending on the class; typically)102 96 R 3.29(,t)-.65 G .791(here w) --3.29 F .791(ould be a single ar)-.1 F .791 -(gument naming the \214le containing the)-.18 F(map.)102 108 Q -(Maps are referenced using the syntax:)127 124.2 Q($\()142 140.4 Q/F2 10 -/Times-Italic@0 SF(map k)2.5 E -.3(ey)-.1 G F1($@)2.8 E F2(ar)2.5 E -(guments)-.37 E F1($:)2.5 E F2(default)2.5 E F1($\))2.5 E .641 -(where either or both of the)102 156.6 R F2(ar)3.141 E(guments)-.37 E F1 -(or)3.141 E F2(default)3.141 E F1 .64(portion may be omitted.)3.141 F -(The)5.64 E F2 .64($@ ar)3.14 F(guments)-.37 E F1(may)3.14 E 1.276 -(appear more than once.)102 168.6 R 1.276(The indicated)6.276 F F2 -.1 -(ke)3.776 G(y)-.2 E F1(and)3.776 E F2(ar)3.776 E(guments)-.37 E F1 1.277 -(are passed to the appropriate mapping)3.777 F 3.253(function. If)102 -180.6 R .753(it returns a v)3.253 F .753(alue, it replaces the input.) --.25 F .753(If it does not return a v)5.753 F .753(alue and the)-.25 F -F2(default)3.253 E F1(is)3.253 E(speci\214ed, the)102 192.6 Q F2 -(default)2.5 E F1(replaces the input.)2.5 E -(Otherwise, the input is unchanged.)5 E(The)127 208.8 Q F2(ar)4.063 E -(guments)-.37 E F1 1.563(are passed to the map for arbitrary use.)4.063 -F 1.564(Most map classes can interpolate)6.564 F .883(these ar)102 220.8 -R .883(guments into their v)-.18 F .883(alues using the syntax \231%) --.25 F F2(n)A F1 3.382<9a28>C(where)-3.382 E F2(n)3.382 E F1 .882 -(is a digit\) to indicate the corre-)3.382 F(sponding)102 232.8 Q F2(ar) -2.5 E(gument)-.37 E F1 5(.A)C -.18(rg)-5 G -(ument \231%0\232 indicates the database k).18 E -.15(ey)-.1 G 5(.F)-.5 -G(or e)-5.15 E(xample, the rule)-.15 E(R$\255 ! $+)142 249 Q -($: $\(uucp $1 $@ $2 $: %1 @ %0 . UUCP $\))71.72 E 1.269(Looks up the UUCP name in a \(user de\214ned\) UUCP map; if not found it turns it into \231.UUCP\232) -102 265.2 R 2.5(form. The)102 277.2 R -(database might contain records lik)2.5 E(e:)-.1 E(decv)142 293.4 Q -77.43(ax %1@%0.DEC.COM)-.25 F 72.19(research %1@%0.A)142 305.4 R(TT) --1.11 E(.COM)-.74 E(Note that)102 321.6 Q F2(default)2.5 E F1 -(clauses ne)2.5 E -.15(ve)-.25 G 2.5(rd).15 G 2.5(ot)-2.5 G -(his mapping.)-2.5 E .742(The b)127 337.8 R .741(uilt in map with both name and class \231host\232 is the host name canonicalization lookup.) --.2 F(Thus, the syntax:)102 349.8 Q($\(host)142 366 Q F2(hostname)2.5 E -F1($\))A(is equi)102 382.2 Q -.25(va)-.25 G(lent to:).25 E($[)142 398.4 -Q F2(hostname)A F1($])A(There are man)127 418.8 Q 2.5(yd)-.15 G -(e\214ned classes.)-2.5 E 51.72(dbm Database)102 435 R 1.623 -(lookups using the ndbm\(3\) library)4.123 F(.)-.65 E F2(Sendmail)6.623 -E F1 1.623(must be compiled with)4.123 F F0(NDBM)174 447 Q F1 -(de\214ned.)2.5 E 49.51(btree Database)102 463.2 R .678 -(lookups using the btree interf)3.178 F .677(ace to the Berk)-.1 F(ele) --.1 E 3.177(yD)-.15 G 3.177(Bl)-3.177 G(ibrary)-3.177 E(.)-.65 E F2 -(Sendmail)5.677 E F1(must be compiled with)174 475.2 Q F0(NEWDB)2.5 E F1 -(de\214ned.)2.5 E 51.17(hash Database)102 491.4 R .828 -(lookups using the hash interf)3.328 F .828(ace to the Berk)-.1 F(ele) --.1 E 3.328(yD)-.15 G 3.329(Bl)-3.328 G(ibrary)-3.329 E(.)-.65 E F2 -(Sendmail)5.829 E F1(must be compiled with)174 503.4 Q F0(NEWDB)2.5 E F1 -(de\214ned.)2.5 E 57.83(nis NIS)102 519.6 R(lookups.)2.5 E F2(Sendmail)5 -E F1(must be compiled with)2.5 E F0(NIS)2.5 E F1(de\214ned.)2.5 E 41.16 -(nisplus NIS+)102 535.8 R(lookups.)3.733 E F2(Sendmail)6.233 E F1 1.233 -(must be compiled with)3.733 F F0(NISPLUS)3.733 E F1 3.733 -(de\214ned. The)3.733 F(ar)3.733 E(gu-)-.18 E .495 -(ment is the name of the table to use for lookups, and the)174 547.8 R -F0<ad6b>2.995 E F1(and)2.995 E F0<ad76>2.995 E F1 .495(\215ags may be) -2.995 F(used to set the k)174 559.8 Q .3 -.15(ey a)-.1 H(nd v).15 E -(alue columns respecti)-.25 E -.15(ve)-.25 G(ly).15 E(.)-.65 E 43.39 -(hesiod Hesiod)102 576 R(lookups.)2.5 E F2(Sendmail)5 E F1 -(must be compiled with)2.5 E F0(HESIOD)2.5 E F1(de\214ned.)2.5 E 47.28 -(ldapx LD)102 592.2 R 1.784(AP X500 directory lookups.)-.4 F F2 -(Sendmail)6.783 E F1 1.783(must be compiled with)4.283 F F0(LD)4.283 E -(APMAP)-.35 E F1 2.965(de\214ned. The)174 604.2 R .465 -(map supports most of the standard ar)2.965 F .466 -(guments and most of the com-)-.18 F(mand line ar)174 616.2 Q -(guments of the)-.18 E F2(ldapsear)2.5 E -.15(ch)-.37 G F1(program.)2.65 -E 41.17(netinfo NeXT)102 632.4 R(NetInfo lookups.)2.5 E F2(Sendmail)5 E -F1(must be compiled with)2.5 E F0(NETINFO)2.5 E F1(de\214ned.)2.5 E(te) -102 648.6 Q 54.65(xt T)-.15 F -.15(ex)-.7 G 2.918<748c>.15 G .418 -(le lookups.)-2.918 F .418(The format of the te)5.418 F .417 -(xt \214le is de\214ned by the)-.15 F F0<ad6b>2.917 E F1(\(k)2.917 E -.717 -.15(ey \214)-.1 H .417(eld num-).15 F(ber\),)174 660.6 Q F0<ad76> -2.5 E F1(\(v)2.5 E(alue \214eld number\), and)-.25 E F0<ad7a>2.5 E F1 -(\(\214eld delimiter\) \215ags.)2.5 E 53.39(stab Internal)102 676.8 R -(symbol table lookups.)2.5 E(Used internally for aliasing.)5 E 38.38 -(implicit Really)102 693 R .546 -(should be called \231alias\232 \212 this is used to get the def)3.046 F -.546(ault lookups for alias)-.1 F(\214les, and is the def)174 705 Q -(ault if no class is speci\214ed for alias \214les.)-.1 E EP -%%Page: 58 54 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-58 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF 52.84 -(user Looks)102 96 R .477(up users using)2.977 F/F2 10/Times-Italic@0 SF --.1(ge)2.977 G(tpwnam).1 E F1 2.977(\(3\). The)B F0<ad76>2.977 E F1 .476 -(\215ag can be used to specify the name)2.976 F .142(of the \214eld to return \(although this is normally used only to check the e) -174 108 R .142(xistence of)-.15 F 2.5(au)174 120 S(ser\).)-2.5 E 52.83 -(host Canoni\214es)102 136.2 R .2(host domain names.)2.7 F(Gi)5.2 E -.15 -(ve)-.25 G 2.7(nah).15 G .2(ost name it calls the name serv)-2.7 F .2 -(er to \214nd)-.15 F(the canonical name for that host.)174 148.2 Q 40.61 -(bestmx Returns)102 164.4 R 2.478(the best MX record for a host name gi) -4.978 F -.15(ve)-.25 G 4.979(na).15 G 4.979(st)-4.979 G 2.479(he k) --4.979 F -.15(ey)-.1 G 7.479(.T)-.5 G 2.479(he current)-7.479 F .722 -(machine is al)174 176.4 R -.1(wa)-.1 G .721 -(ys preferred \212 that is, if the current machine is one of the hosts) -.1 F .218(listed as a lo)174 188.4 R .219 -(west-preference MX record, then it will be guaranteed to be returned.) --.25 F .961(This can be used to \214nd out if this machine is the tar) -174 200.4 R .961(get for an MX record, and)-.18 F .313 -(mail can be accepted on that basis.)174 212.4 R .313(If the)5.313 F F0 -<ad7a>2.813 E F1 .313(\215ag is gi)2.813 F -.15(ve)-.25 G .313 -(n, then all MX names are).15 F(returned, separated by the gi)174 224.4 -Q -.15(ve)-.25 G 2.5(nd).15 G(elimiter)-2.5 E(.)-.55 E 32.85 -(sequence The)102 240.6 R(ar)3.35 E .849(guments on the `K' line are a list of maps; the resulting map searches the) --.18 F(ar)174 252.6 Q .438 -(gument maps in order until it \214nds a match for the indicated k)-.18 -F -.15(ey)-.1 G 5.439(.F)-.5 G .439(or e)-5.589 F(xample,)-.15 E -(if the k)174 264.6 Q .3 -.15(ey d)-.1 H(e\214nition is:).15 E -(Kmap1 ...)214 280.8 Q(Kmap2 ...)214 292.8 Q(Kseqmap sequence map1 map2) -214 304.8 Q .968(then a lookup ag)174 321 R .968 -(ainst \231seqmap\232 \214rst does a lookup in map1.)-.05 F .968 -(If that is found, it)5.968 F(returns immediately)174 333 Q 5(.O)-.65 G -(therwise, the same k)-5 E .3 -.15(ey i)-.1 H 2.5(su).15 G -(sed for map2.)-2.5 E 43.39(switch Much)102 349.2 R(lik)2.8 E 2.8(et)-.1 -G .3(he \231sequence\232 map e)-2.8 F .301 -(xcept that the order of maps is determined by the)-.15 F .392 -(service switch.)174 361.2 R .392(The ar)5.392 F .391 -(gument is the name of the service to be look)-.18 F .391(ed up; the v) --.1 F(al-)-.25 E 1.492 -(ues from the service switch are appended to the map name to create ne) -174 373.2 R 3.993(wm)-.25 G(ap)-3.993 E 2.5(names. F)174 385.2 R(or e) --.15 E(xample, consider the k)-.15 E .3 -.15(ey d)-.1 H(e\214nition:).15 -E(Kali switch aliases)214 401.4 Q -(together with the service switch entry:)174 417.6 Q 78.84(aliases nis) -214 433.8 R(\214les)2.5 E 1.633(This causes a query ag)174 450 R 1.633 -(ainst the map \231ali\232 to search maps named \231ali.nis\232 and)-.05 -F(\231ali.\214les\232 in that order)174 462 Q(.)-.55 E 37.84 -(dequote Strip)102 478.2 R .96(double quotes \("\) from a name.)3.46 F -.961(It does not strip backslashes, and will not)5.961 F .173 -(strip quotes if the resulting string w)174 490.2 R .172 -(ould contain unscannable syntax \(that is, basic)-.1 F .386(errors lik) -174 502.2 R 2.886(eu)-.1 G .386(nbalanced angle brack)-2.886 F .386 -(ets; more sophisticated errors such as unkno)-.1 F(wn)-.25 E .252 -(hosts are not check)174 514.2 R 2.752(ed\). The)-.1 F .251 -(intent is for use when trying to accept mail from sys-)2.752 F -(tems such as DECnet that routinely quote odd syntax such as)174 526.2 Q -("49ers::ubell")214 542.4 Q 2.5(At)174 558.6 S -(ypical usage is probably something lik)-2.5 E(e:)-.1 E -(Kdequote dequote)214 574.8 Q(...)214 598.8 Q 88.19(R$\255 $:)214 622.8 -R($\(dequote $1 $\))2.5 E(R$\255 $+)214 634.8 Q($: $>3 $1 $2)77.55 E -(Care must be tak)174 651 Q(en to pre)-.1 E -.15(ve)-.25 G(nt une).15 E -(xpected results; for e)-.15 E(xample,)-.15 E -("|someprogram < input > output")214 667.2 Q 1.31(will ha)174 683.4 R -1.61 -.15(ve q)-.2 H 1.31(uotes stripped, b).15 F 1.31 -(ut the result is probably not what you had in mind.)-.2 F -.15(Fo)174 -695.4 S(rtunately these cases are rare.).15 E(re)102 711.6 Q(ge)-.15 E -50.09(xT)-.15 G .489(he map de\214nition on the)-50.09 F F0(K)2.989 E F1 -.489(line contains a re)2.989 F .488(gular e)-.15 F 2.988(xpression. An) --.15 F 2.988(yk)-.15 G .788 -.15(ey i)-3.088 H .488(nput is).15 F 3.665 -(compared to that e)174 723.6 R 3.666(xpression using the POSIX re)-.15 -F 3.666(gular e)-.15 F 3.666(xpressions routines)-.15 F EP -%%Page: 59 55 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-59)195.86 E/F1 10/Times-Roman@0 SF(re)174 96 Q .474 -(gcomp\(\), re)-.15 F .474(gerr\(\), and re)-.15 F(ge)-.15 E -.15(xe) --.15 G 2.974(c\(\). Refer).15 F .474 -(to the documentation for those routines)2.974 F .585 -(for more information about the re)174 108 R .585(gular e)-.15 F .586 -(xpression matching.)-.15 F .586(No re)5.586 F .586(writing of the)-.25 -F -.1(ke)174 120 S 2.607(yi)-.05 G 2.607(sd)-2.607 G .107(one if the) --2.607 F F0<ad6d>2.607 E F1 .107(\215ag is used.)2.607 F -.4(Wi)5.107 G -.107(thout it, the k).4 F .407 -.15(ey i)-.1 H 2.607(sd).15 G .107 -(iscarded or if)-2.607 F F0<ad73>2.606 E F1 .106(if used,)2.606 F 1.07 -(it is substituted by the substring matches, delimited by)174 132 R F0 -($|)3.57 E F1 1.07(or the string speci\214ed)3.57 F(with the the)174 144 -Q F0<ad64>2.5 E F1 2.5(\215ag. The)2.5 F(\215ags a)2.5 E -.25(va)-.2 G -(ilable for the map are).25 E 97.17(-n not)214 160.2 R 98.84(-f case)214 -172.2 R(sensiti)2.5 E -.15(ve)-.25 G 97.17(-b basic)214 184.2 R(re)2.5 E -(gular e)-.15 E(xpressions)-.15 E(\(def)322 196.2 Q(ault is e)-.1 E -(xtended\))-.15 E 98.28(-s substring)214 208.2 R(match)2.5 E 97.17 -(-d set)214 220.2 R(the delimiter used for -s)2.5 E 97.73(-a append)214 -232.2 R(string to k)2.5 E -.15(ey)-.1 G 94.39(-m match)214 244.2 R(only) -2.5 E 2.5(,d)-.65 G 2.5(on)-2.5 G(ot)-2.5 E(replace/discard v)322 256.2 -Q(alue)-.25 E(The)174 272.4 Q F0<ad73>2.551 E F1 .051(\215ag can include an optional parameter which can be used to select the sub-) -2.551 F(strings in the result of the lookup.)174 284.4 Q -.15(Fo)5 G 2.5 -(re).15 G(xample,)-2.65 E(-s1,3,4)214 300.6 Q 35.62(program The)102 321 -R(ar)2.544 E .044(guments on the)-.18 F F0(K)2.544 E F1 .045 -(line are the pathname to a program and an)2.544 F 2.545(yi)-.15 G .045 -(nitial param-)-2.545 F .176(eters to be passed.)174 333 R .176 -(When the map is called, the k)5.176 F .475 -.15(ey i)-.1 H 2.675(sa).15 -G .175(dded to the initial parame-)-2.675 F .112 -(ters and the program is in)174 345 R -.2(vo)-.4 G -.1(ke).2 G 2.612(da) -.1 G 2.612(st)-2.612 G .112(he def)-2.612 F .112(ault user/group id.)-.1 -F .112(The \214rst line of stan-)5.112 F .508 -(dard output is returned as the v)174 357 R .508(alue of the lookup.) --.25 F .508(This has man)5.508 F 3.007(yp)-.15 G .507(otential secu-) --3.007 F 1.277(rity problems, and has terrible performance; it should be used only when abso-) -174 369 R(lutely necessary)174 381 Q(.)-.65 E .488 -(Most of these accept as ar)127 397.2 R .488 -(guments the same optional \215ags and a \214lename \(or a mapname for) --.18 F .31(NIS; the \214lename is the root of the database path, so that \231.db\232 or some other e) -102 409.2 R .31(xtension appropriate)-.15 F -(for the database type will be added to get the actual database name\).) -102 421.2 Q(Kno)5 E(wn \215ags are:)-.25 E 58.86(\255o Indicates)102 -437.4 R 1.147(that this map is optional \212 that is, if it cannot be opened, no error is) -3.648 F(produced, and)174 449.4 Q/F2 10/Times-Italic@0 SF(sendmail)2.5 E -F1(will beha)2.5 E .3 -.15(ve a)-.2 H 2.5(si).15 G 2.5(ft)-2.5 G -(he map e)-2.5 E(xisted b)-.15 E(ut w)-.2 E(as empty)-.1 E(.)-.65 E -(\255N, \255O)102 465.6 Q .696(If neither)41.28 F F0<ad4e>3.197 E F1(or) -3.197 E F0<ad4f>3.197 E F1 .697(are speci\214ed,)3.197 F F2(sendmail) -3.197 E F1 .697(uses an adapti)3.197 F .997 -.15(ve a)-.25 H .697 -(lgorithm to decide).15 F .108 -(whether or not to look for null bytes on the end of k)174 477.6 R -.15 -(ey)-.1 G 2.608(s. It).15 F .107(starts by trying both; if)2.608 F .819 -(it \214nds an)174 489.6 R 3.319(yk)-.15 G 1.119 -.15(ey w)-3.419 H .819 -(ith a null byte it ne).15 F -.15(ve)-.25 G 3.319(rt).15 G .82(ries ag) --3.319 F .82(ain without a null byte and vice)-.05 F -.15(ve)174 501.6 S -2.828(rsa. If).15 F F0<ad4e>2.828 E F1 .328(is speci\214ed it ne)2.828 F --.15(ve)-.25 G 2.828(rt).15 G .328(ries without a null byte and if) --2.828 F F0<ad4f>2.827 E F1 .327(is speci\214ed it)2.827 F(ne)174 513.6 -Q -.15(ve)-.25 G 2.886(rt).15 G .386(ries with a null byte.)-2.886 F -.386(Setting one of these can speed matches b)5.386 F .386(ut are ne)-.2 -F -.15(ve)-.25 G(r).15 E(necessary)174 525.6 Q 5.546(.I)-.65 G 3.046(fb) --5.546 G(oth)-3.046 E F0<ad4e>3.046 E F1(and)3.046 E F0<ad4f>3.046 E F1 -.545(are speci\214ed,)3.045 F F2(sendmail)3.045 E F1 .545(will ne)3.045 -F -.15(ve)-.25 G 3.045(rt).15 G .545(ry an)-3.045 F 3.045(ym)-.15 G -(atches)-3.045 E(at all \212 that is, e)174 537.6 Q -.15(ve)-.25 G -(rything will appear to f).15 E(ail.)-.1 E<ad61>102 553.8 Q F2(x)A F1 -1.356(Append the string)57.48 F F2(x)3.856 E F1 1.357 -(on successful matches.)3.856 F -.15(Fo)6.357 G 3.857(re).15 G 1.357 -(xample, the def)-4.007 F(ault)-.1 E F2(host)3.857 E F1(map)3.857 E -(appends a dot on successful matches.)174 565.8 Q<ad54>102 582 Q F2(x)A -F1 .021(Append the string)55.81 F F2(x)2.521 E F1 .021(on temporary f) -2.521 F 2.521(ailures. F)-.1 F .021(or e)-.15 F(xample,)-.15 E F2(x) -2.521 E F1 -.1(wo)2.521 G .02(uld be appended if a).1 F .72 -(DNS lookup returned \231serv)174 594 R .72(er f)-.15 F .72 -(ailed\232 or an NIS lookup could not locate a serv)-.1 F(er)-.15 E(.) --.55 E(See also the)174 606 Q F0<ad74>2.5 E F1(\215ag.)2.5 E 60.53 -(\255f Do)102 622.2 R(not fold upper to lo)2.5 E -(wer case before looking up the k)-.25 E -.15(ey)-.1 G(.)-.5 E 56.08 -(\255m Match)102 638.4 R .4(only \(without replacing the v)2.9 F 2.899 -(alue\). If)-.25 F .399(you only care about the e)2.899 F .399 -(xistence of)-.15 F 7.306(ak)174 650.4 S 5.107 -.15(ey a)-7.406 H 4.807 -(nd not the v).15 F 4.807 -(alue \(as you might when searching the NIS map)-.25 F 1.947 -(\231hosts.byname\232 for e)174 662.4 R 1.947(xample\), this \215ag pre) --.15 F -.15(ve)-.25 G 1.947(nts the map from substituting the).15 F -.25 -(va)174 674.4 S 2.849(lue. Ho).25 F(we)-.25 E -.15(ve)-.25 G 1.149 -.4 -(r, T).15 H .349(he \255a ar).4 F .349 -(gument is still appended on a match, and the def)-.18 F .35(ault is)-.1 -F(still tak)174 686.4 Q(en if the match f)-.1 E(ails.)-.1 E<ad6b>102 -702.6 Q F2 -.1(ke)C(ycol)-.2 E F1 .52(The k)36.22 F .82 -.15(ey c)-.1 H -.519(olumn name \(for NIS+\) or number \(for te).15 F .519 -(xt lookups\).)-.15 F -.15(Fo)5.519 G 3.019(rL).15 G -.4(DA)-3.019 G -3.019(Pm).4 G(aps)-3.019 E .312(this is a \214lter string passed to printf with a %s where the string to be \231mapped\232 is) -174 714.6 R EP -%%Page: 60 56 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-60 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF -(inserted.)174 96 Q<ad76>102 112.2 Q/F2 10/Times-Italic@0 SF(valcol)A F1 -1.929(The v)36.92 F 1.928 -(alue column name \(for NIS+\) or number \(for te)-.25 F 1.928 -(xt lookups\).)-.15 F -.15(Fo)6.928 G 4.428(rL).15 G -.4(DA)-4.428 G(P) -.4 E(maps this is the name of the attrib)174 124.2 Q -(ute to be returned.)-.2 E<ad7a>102 140.4 Q F2(delim)A F1 .218 -(The column delimiter \(for te)39.7 F .218(xt lookups\).)-.15 F .219 -(It can be a single character or one of the)5.219 F 1.826 -(special strings \231)174 152.4 R 1.826(\\n\232 or \231)1.666 F 1.826 -(\\t\232 to indicate ne)1.666 F 1.825(wline or tab respecti)-.25 F -.15 -(ve)-.25 G(ly).15 E 6.825(.I)-.65 G 4.325(fo)-6.825 G(mitted)-4.325 E -(entirely)174 164.4 Q 2.5(,t)-.65 G(he column separator is an)-2.5 E 2.5 -(ys)-.15 G(equence of whitespace.)-2.5 E 61.08(\255t Normally)102 180.6 -R 2.726(,w)-.65 G .226(hen a map attempts to do a lookup and the serv) --2.726 F .227(er f)-.15 F .227(ails \(e.g.,)-.1 F F2(sendmail)2.727 E F1 -(couldn')174 192.6 Q 2.776(tc)-.18 G .276(ontact an)-2.776 F 2.776(yn) --.15 G .276(ame serv)-2.776 F .276(er; this is)-.15 F F2(not)2.776 E F1 -.276(the same as an entry not being found)2.776 F .251(in the map\), the message being processed is queued for future processing.) -174 204.6 R(The)5.251 E F0<ad74>2.751 E F1 1.623(\215ag turns of)174 -216.6 R 4.123(ft)-.25 G 1.623(his beha)-4.123 F(viour)-.2 E 4.123(,l)-.4 -G 1.622(etting the temporary f)-4.123 F 1.622(ailure \(serv)-.1 F 1.622 -(er do)-.15 F 1.622(wn\) act as)-.25 F .675 -(though it were a permanent f)174 228.6 R .675 -(ailure \(entry not found\).)-.1 F .676(It is particularly useful for) -5.676 F .772(DNS lookups, where someone else')174 240.6 R 3.272(sm)-.55 -G .772(iscon\214gured name serv)-3.272 F .772(er can cause prob-)-.15 F -1.645(lems on your machine.)174 252.6 R(Ho)6.645 E(we)-.25 E -.15(ve) --.25 G 2.445 -.4(r, c).15 H 1.645(are must be tak).4 F 1.646 -(en to ensure that you don')-.1 F(t)-.18 E .263(bounce mail that w)174 -264.6 R .263(ould be resolv)-.1 F .262(ed correctly if you tried ag)-.15 -F 2.762(ain. A)-.05 F .262(common strat-)2.762 F -.15(eg)174 276.6 S 2.5 -(yi).15 G 2.5(st)-2.5 G 2.5(of)-2.5 G(orw)-2.5 E -(ard such mail to another)-.1 E 2.5(,p)-.4 G -(ossibly better connected, mail serv)-2.5 E(er)-.15 E(.)-.55 E<ad73>102 -292.8 Q F2(spacesub)A F1 -.15(Fo)25.81 G 3.1(rt).15 G .6 -(he dequote map only)-3.1 F 3.101(,t)-.65 G .601 -(he character to use to replace space characters after a)-3.101 F -(successful dequote.)174 304.8 Q 58.86(\255q Don')102 321 R 2.5(td)-.18 -G(equote the k)-2.5 E .3 -.15(ey b)-.1 H(efore lookup.).15 E 56.64 -(\255A When)102 337.2 R(reb)3 E .5(uilding an alias \214le, the)-.2 F F0 -<ad41>3 E F1 .5(\215ag causes duplicate entries in the te)3 F .5(xt v) --.15 F(er)-.15 E(-)-.2 E(sion to be mer)174 349.2 Q 2.5(ged. F)-.18 F -(or e)-.15 E(xample, tw)-.15 E 2.5(oe)-.1 G(ntries:)-2.5 E 90.49 -(list: user1,)214 365.4 R(user2)2.5 E 90.49(list: user3)214 377.4 R -.1 -(wo)174 393.6 S(uld be treated as though it were the single entry).1 E -90.49(list: user1,)214 409.8 R(user2, user3)2.5 E -(in the presence of the)174 426 Q F0<ad41>2.5 E F1(\215ag.)2.5 E(The)127 -442.2 Q F2(dbm)2.989 E F1 .489 -(map appends the strings \231.pag\232 and \231.dir\232 to the gi)2.989 F --.15(ve)-.25 G 2.99<6e8c>.15 G .49(lename; the)-2.99 F F2(hash)2.99 E F1 -(and)2.99 E F2(btr)2.99 E(ee)-.37 E F1(maps append \231.db\232.)102 -454.2 Q -.15(Fo)5 G 2.5(re).15 G(xample, the map speci\214cation)-2.65 E --.15(Ku)142 470.4 S(ucp dbm \255o \255N /usr/lib/uucpmap).15 E .21(speci\214es an optional map named \231uucp\232 of class \231dbm\232; it al) -102 486.6 R -.1(wa)-.1 G .21(ys has null bytes at the end of e).1 F -.15 -(ve)-.25 G(ry).15 E -(string, and the data is located in /usr/lib/uucpmap.{dir)102 498.6 Q -(,pag}.)-.4 E 1.094(The program)127 514.8 R F2(mak)3.594 E(emap)-.1 E F1 -1.094(\(8\) can be used to b)B 1.094(uild an)-.2 F 3.594(yo)-.15 G 3.594 -(ft)-3.594 G 1.095(he three database-oriented maps.)-3.594 F(It)6.095 E -(tak)102 526.8 Q(es the follo)-.1 E(wing \215ags:)-.25 E 60.53(\255f Do) -102 543 R(not fold upper to lo)2.5 E(wer case in the map.)-.25 E 56.64 -(\255N Include)102 559.2 R(null bytes in k)2.5 E -.15(ey)-.1 G(s.).15 E -58.86(\255o Append)102 575.4 R(to an e)2.5 E(xisting \(old\) \214le.) --.15 E 60.53(\255r Allo)102 591.6 R 3.669(wr)-.25 G 1.169 -(eplacement of e)-3.669 F 1.168(xisting k)-.15 F -.15(ey)-.1 G 1.168 -(s; normally).15 F 3.668(,r)-.65 G 1.168(e-inserting an e)-3.668 F 1.168 -(xisting k)-.15 F 1.468 -.15(ey i)-.1 H 3.668(sa).15 G(n)-3.668 E(error) -174 603.6 Q(.)-.55 E 58.86(\255v Print)102 619.8 R(what is happening.) -2.5 E(The)102 636 Q F2(sendmail)3.605 E F1 1.105(daemon does not ha) -3.605 F 1.405 -.15(ve t)-.2 H 3.605(ob).15 G 3.605(er)-3.605 G 1.106 -(estarted to read the ne)-3.605 F 3.606(wm)-.25 G 1.106 -(aps as long as you change)-3.606 F -(them in place; \214le locking is used so that the maps w)102 650 Q(on') --.1 E 2.5(tb)-.18 G 2.5(er)-2.5 G(ead while the)-2.5 E 2.5(ya)-.15 G -(re being updated.)-2.5 E/F3 7/Times-Roman@0 SF(24)-4 I .32 LW 76 669.2 -72 669.2 DL 80 669.2 76 669.2 DL 84 669.2 80 669.2 DL 88 669.2 84 669.2 -DL 92 669.2 88 669.2 DL 96 669.2 92 669.2 DL 100 669.2 96 669.2 DL 104 -669.2 100 669.2 DL 108 669.2 104 669.2 DL 112 669.2 108 669.2 DL 116 -669.2 112 669.2 DL 120 669.2 116 669.2 DL 124 669.2 120 669.2 DL 128 -669.2 124 669.2 DL 132 669.2 128 669.2 DL 136 669.2 132 669.2 DL 140 -669.2 136 669.2 DL 144 669.2 140 669.2 DL 148 669.2 144 669.2 DL 152 -669.2 148 669.2 DL 156 669.2 152 669.2 DL 160 669.2 156 669.2 DL 164 -669.2 160 669.2 DL 168 669.2 164 669.2 DL 172 669.2 168 669.2 DL 176 -669.2 172 669.2 DL 180 669.2 176 669.2 DL 184 669.2 180 669.2 DL 188 -669.2 184 669.2 DL 192 669.2 188 669.2 DL 196 669.2 192 669.2 DL 200 -669.2 196 669.2 DL 204 669.2 200 669.2 DL 208 669.2 204 669.2 DL 212 -669.2 208 669.2 DL 216 669.2 212 669.2 DL/F4 5/Times-Roman@0 SF(24)93.6 -679.6 Q/F5 8/Times-Roman@0 SF .466(That is, don')3.2 J 2.466(tc)-.144 G -.466(reate ne)-2.466 F 2.466(wm)-.2 G .466(aps and then use)-2.466 F/F6 -8/Times-Italic@0 SF(mv)2.466 E F5 .466(\(1\) to mo)B .706 -.12(ve t)-.12 -H .466(hem into place.).12 F .465 -(Since the maps are already open the ne)4.466 F 2.465(wm)-.2 G(aps) --2.465 E(will ne)72 692.4 Q -.12(ve)-.2 G 2(rb).12 G 2(es)-2 G(een.)-2 E -EP -%%Page: 61 57 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-61)195.86 E/F1 10/Times-Roman@0 SF(Ne)127 96 Q 2.5(wc)-.25 G -(lasses can be added in the routine)-2.5 E F0(setupmaps)2.5 E F1 -(in \214le)2.5 E F0(conf)2.5 E(.c)-.15 E F1(.)A F0 2.5(5.10. The)87 120 -R(User Database)2.5 E F1 .108(If you ha)127 136.2 R .408 -.15(ve a ve) --.2 H .109(rsion of).15 F/F2 10/Times-Italic@0 SF(sendmail)2.609 E F1 -.109(with the user database package compiled in, the handling of)2.609 F -(sender and recipient addresses is modi\214ed.)102 148.2 Q -(The location of this database is controlled with the)127 164.4 Q F0 -(UserDatabaseSpec)2.5 E F1(option.)2.5 E F0 2.5(5.10.1. Structur)102 -188.4 R 2.5(eo)-.18 G 2.5(ft)-2.5 G(he user database)-2.5 E F1 -(The database is a sorted \(BT)142 204.6 Q(ree-based\) structure.)-.35 E -(User records are stored with the k)5 E -.15(ey)-.1 G(:).15 E F2(user) -157 220.8 Q(-name)-.2 E F0(:)A F2(\214eld-name)A F1 .128(The sorted database format ensures that user records are clustered together) -117 237 R 5.128(.M)-.55 G .128(eta-information is)-5.128 F(al)117 249 Q --.1(wa)-.1 G(ys stored with a leading colon.).1 E -(Field names de\214ne both the syntax and semantics of the v)142 265.2 Q -2.5(alue. De\214ned)-.25 F(\214elds include:)2.5 E 33.39(maildrop The) -117 281.4 R(deli)4.872 E -.15(ve)-.25 G 2.372(ry address for this user) -.15 F 7.372(.T)-.55 G 2.373(here may be multiple v)-7.372 F 2.373 -(alues of this)-.25 F 2.675(record. In)189 293.4 R(particular)2.675 E -2.675(,m)-.4 G .175(ailing lists will ha)-2.675 F .475 -.15(ve o)-.2 H -(ne).15 E F2(maildr)2.675 E(op)-.45 E F1 .175(record for each user)2.675 -F(on the list.)189 305.4 Q 30.06(mailname The)117 321.6 R 1.026 -(outgoing mailname for this user)3.526 F 6.026(.F)-.55 G 1.027 -(or each outgoing name, there should)-6.176 F .08(be an appropriate)189 -333.6 R F2(maildr)2.58 E(op)-.45 E F1 .08(record for that name to allo) -2.58 F 2.58(wr)-.25 G .08(eturn mail.)-2.58 F .08(See also)5.08 F F2 -(:default:mailname)189 345.6 Q F1(.)A 25.62(mailsender Changes)117 361.8 -R(an)3.447 E 3.447(ym)-.15 G .947(ail sent to this address to ha)-3.447 -F 1.248 -.15(ve t)-.2 H .948(he indicated en).15 F -.15(ve)-.4 G .948 -(lope sender).15 F(.)-.55 E .498(This is intended for mailing lists, and will normally be the name of an appro-) -189 373.8 R .754(priate -request address.)189 385.8 R .754(It is v)5.754 -F .755(ery similar to the o)-.15 F(wner)-.25 E(-)-.2 E F2(list)A F1 .755 -(syntax in the alias)3.255 F(\214le.)189 397.8 Q 33.95(fullname The)117 -414 R(full name of the user)2.5 E(.)-.55 E(of)117 430.2 Q 13.66 -(\214ce-address The)-.25 F(of)2.5 E(\214ce address for this user)-.25 E -(.)-.55 E(of)117 446.4 Q 19.21(\214ce-phone The)-.25 F(of)2.5 E -(\214ce phone number for this user)-.25 E(.)-.55 E(of)117 462.6 Q -(\214ce-f)-.25 E 30.98(ax The)-.1 F(of)2.5 E(\214ce F)-.25 E -(AX number for this user)-.74 E(.)-.55 E 13.96(home-address The)117 -478.8 R(home address for this user)2.5 E(.)-.55 E 19.51(home-phone The) -117 495 R(home phone number for this user)2.5 E(.)-.55 E(home-f)117 -511.2 Q 31.28(ax The)-.1 F(home F)2.5 E(AX number for this user)-.74 E -(.)-.55 E 41.73(project A)117 527.4 R .856 -(\(short\) description of the project this person is af)3.356 F .855 -(\214liated with.)-.25 F .855(In the Uni-)5.855 F -.15(ve)189 539.4 S -(rsity this is often just the name of their graduate advisor).15 E(.) --.55 E 52.28(plan A)117 555.6 R -(pointer to a \214le from which plan information can be g)2.5 E -(athered.)-.05 E .924(As of this writing, only a fe)142 571.8 R 3.424 -(wo)-.25 G 3.424(ft)-3.424 G .925 -(hese \214elds are actually being used by)-3.424 F F2(sendmail)3.425 E -F1(:)A F2(mail-)3.425 E(dr)117 583.8 Q(op)-.45 E F1(and)2.5 E F2 -(mailname)2.5 E F1 5(.A)C F2(\214ng)-2.5 E(er)-.1 E F1 -(program that uses the other \214elds is planned.)2.5 E F0 2.5 -(5.10.2. User)102 607.8 R(database semantics)2.5 E F1 .996(When the re) -142 624 R .995(writing rules submit an address to the local mailer)-.25 -F 3.495(,t)-.4 G .995(he user name is passed)-3.495 F .78 -(through the alias \214le.)117 636 R .781(If no alias is found \(or if the alias points back to the same address\), the) -5.78 F 1.778 -(name \(with \231:maildrop\232 appended\) is then used as a k)117 648 R -2.077 -.15(ey i)-.1 H 4.277(nt).15 G 1.777(he user database.)-4.277 F -1.777(If no match)6.777 F -(occurs \(or if the maildrop points at the same address\), forw)117 660 -Q(arding is tried.)-.1 E .55(If the \214rst tok)142 676.2 R .551(en of the user name returned by ruleset 0 is an \231@\232 sign, the user database) --.1 F .626(lookup is skipped.)117 688.2 R .625 -(The intent is that the user database will act as a set of def)5.626 F -.625(aults for a cluster)-.1 F 1.533 -(\(in our case, the Computer Science Di)117 700.2 R 1.533 -(vision\); mail sent to a speci\214c machine should ignore)-.25 F -(these def)117 712.2 Q(aults.)-.1 E EP -%%Page: 62 58 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-62 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF .351 -(When mail is sent, the name of the sending user is look)142 96 R .351 -(ed up in the database.)-.1 F .351(If that user)5.351 F .04 -(has a \231mailname\232 record, the v)117 108 R .041 -(alue of that record is used as their outgoing name.)-.25 F -.15(Fo) -5.041 G 2.541(re).15 G .041(xample, I)-2.691 F(might ha)117 120 Q .3 --.15(ve a r)-.2 H(ecord:).15 E 48.29(eric:mailname Eric.Allman@CS.Berk) -157 136.2 R(ele)-.1 E -.65(y.)-.15 G(EDU).65 E(This w)117 152.4 Q -(ould cause my outgoing mail to be sent as Eric.Allman.)-.1 E .52 -(If a \231maildrop\232 is found for the user)142 168.6 R 3.019(,b)-.4 G -.519(ut no corresponding \231mailname\232 record e)-3.219 F .519 -(xists, the)-.15 F 1.127(record \231:def)117 180.6 R 1.127 -(ault:mailname\232 is consulted.)-.1 F 1.127 -(If present, this is the name of a host to o)6.127 F -.15(ve)-.15 G -1.128(rride the).15 F .625(local host.)117 192.6 R -.15(Fo)5.625 G 3.125 -(re).15 G .625(xample, in our case we w)-3.275 F .625 -(ould set it to \231CS.Berk)-.1 F(ele)-.1 E -.65(y.)-.15 G 3.125 -(EDU\232. The).65 F(ef)3.125 E .625(fect is that)-.25 F(an)117 204.6 Q -.881(yone kno)-.15 F .882(wn in the database gets their outgoing mail stamped as \231user@CS.Berk) --.25 F(ele)-.1 E -.65(y.)-.15 G(EDU\232,).65 E -.2(bu)117 216.6 S 2.5 -(tp).2 G(eople not listed in the database use the local hostname.)-2.5 E -F0 2.5(5.10.3. Cr)102 242.6 R(eating the database)-.18 E/F2 7 -/Times-Bold@0 SF(25)-4 I F1 .375(The user database is b)142 258.8 R .375 -(uilt from a te)-.2 F .375(xt \214le using the)-.15 F/F3 10 -/Times-Italic@0 SF(mak)2.875 E(emap)-.1 E F1 .375 -(utility \(in the distrib)2.875 F .375(ution in)-.2 F 1.039(the mak)117 -270.8 R 1.039(emap subdirectory\).)-.1 F 1.039(The te)6.039 F 1.038 -(xt \214le is a series of lines corresponding to userdb records;)-.15 F -1.588(each line has a k)117 282.8 R 1.889 -.15(ey a)-.1 H 1.589(nd a v) -.15 F 1.589(alue separated by white space.)-.25 F 1.589(The k)6.589 F -1.889 -.15(ey i)-.1 H 4.089(sa).15 G -.1(lwa)-4.089 G 1.589 -(ys in the format).1 F(described abo)117 294.8 Q .3 -.15(ve \212 f)-.15 -H(or e).15 E(xample:)-.15 E(eric:maildrop)157 311 Q .448 -(This \214le is normally installed in a system directory; for e)117 -327.2 R .447(xample, it might be called)-.15 F F3(/etc/user)2.947 E(db) --.37 E F1(.)A 1.6 -.8(To m)117 339.2 T(ak).8 E 2.5(et)-.1 G -(he database v)-2.5 E(ersion of the map, run the program:)-.15 E(mak)157 -355.4 Q(emap btree /etc/userdb)-.1 E(.db < /etc/userdb)-.4 E .077 -(Then create a con\214g \214le that uses this.)117 371.6 R -.15(Fo)5.077 -G 2.577(re).15 G .077 -(xample, using the V8 M4 con\214guration, include the)-2.727 F(follo)117 -383.6 Q(wing line in your .mc \214le:)-.25 E -(de\214ne\(\222confUSERDB_SPEC\264, /etc/userdb)157 399.8 Q(.db\))-.4 E -F0 2.5(6. O)72 428 R(THER CONFIGURA)-.4 E(TION)-.95 E F1 .907 -(There are some con\214guration changes that can be made by recompiling) -112 444.2 R F3(sendmail)3.407 E F1 5.907(.T)C .906(his section)-5.907 F -1.139(describes what changes can be made and what has to be modi\214ed to mak) -87 456.2 R 3.639(et)-.1 G 3.639(hem. In)-3.639 F 1.139(most cases this) -3.639 F(should be unnecessary unless you are porting)87 468.2 Q F3 -(sendmail)2.5 E F1(to a ne)2.5 E 2.5(we)-.25 G -.4(nv)-2.5 G(ironment.) -.4 E F0 2.5(6.1. P)87 492.2 R(arameters in BuildT)-.1 E(ools/OS/$oscf) --.92 E F1 .92 -(These parameters are intended to describe the compilation en)127 508.4 -R .92(vironment, not site polic)-.4 F 2.22 -.65(y, a)-.15 H(nd).65 E -.739(should normally be de\214ned in the operating system con\214guration \214le.) -102 520.4 R F0 .74(This section needs a com-)5.739 F(plete r)102 532.4 Q -(ewrite.)-.18 E F1 39.5(NDBM If)102 548.6 R .665(set, the ne)3.165 F -3.165(wv)-.25 G .664(ersion of the DBM library that allo)-3.315 F .664 -(ws multiple databases will be)-.25 F 2.542(used. If)174 560.6 R .042 -(neither NDBM nor NEWDB are set, a much less ef)2.542 F .043 -(\214cient method of alias)-.25 F(lookup is used.)174 572.6 Q 32.84 -(NEWDB If)102 588.8 R .142(set, use the ne)2.642 F 2.642(wd)-.25 G .142 -(atabase package from Berk)-2.642 F(ele)-.1 E 2.641(y\()-.15 G .141 -(from 4.4BSD\).)-2.641 F .141(This package)5.141 F .266 -(is substantially f)174 600.8 R .267(aster than DBM or NDBM.)-.1 F .267 -(If NEWDB and NDBM are both set,)5.267 F F3(sendmail)174 612.8 Q F1 -(will read DBM \214les, b)2.5 E(ut will create and use NEWDB \214les.) --.2 E 53.39(NIS Include)102 629 R .12(support for NIS.)2.62 F .119 -(If set together with)5.119 F F3(both)2.619 E F1 .119(NEWDB and NDBM,) -2.619 F F3(sendmail)2.619 E F1 .947(will create both DBM and NEWDB \214les if and only if an alias \214le includes the) -174 641 R 3.409(substring \231/yp/\232 in the name.)174 653 R 3.409 -(This is intended for compatibility with Sun)8.409 F(Microsystems')174 -665 Q F3(mkalias)2.5 E F1(program used on YP masters.)2.5 E .32 LW 76 -674.6 72 674.6 DL 80 674.6 76 674.6 DL 84 674.6 80 674.6 DL 88 674.6 84 -674.6 DL 92 674.6 88 674.6 DL 96 674.6 92 674.6 DL 100 674.6 96 674.6 DL -104 674.6 100 674.6 DL 108 674.6 104 674.6 DL 112 674.6 108 674.6 DL 116 -674.6 112 674.6 DL 120 674.6 116 674.6 DL 124 674.6 120 674.6 DL 128 -674.6 124 674.6 DL 132 674.6 128 674.6 DL 136 674.6 132 674.6 DL 140 -674.6 136 674.6 DL 144 674.6 140 674.6 DL 148 674.6 144 674.6 DL 152 -674.6 148 674.6 DL 156 674.6 152 674.6 DL 160 674.6 156 674.6 DL 164 -674.6 160 674.6 DL 168 674.6 164 674.6 DL 172 674.6 168 674.6 DL 176 -674.6 172 674.6 DL 180 674.6 176 674.6 DL 184 674.6 180 674.6 DL 188 -674.6 184 674.6 DL 192 674.6 188 674.6 DL 196 674.6 192 674.6 DL 200 -674.6 196 674.6 DL 204 674.6 200 674.6 DL 208 674.6 204 674.6 DL 212 -674.6 208 674.6 DL 216 674.6 212 674.6 DL/F4 5/Times-Roman@0 SF(25)93.6 -685 Q/F5 8/Times-Roman@0 SF .289(These instructions are kno)3.2 J .289 -(wn to be incomplete.)-.2 F 2.289(Af)4.289 G .289(uture v)-2.289 F .289 -(ersion of the user database is planned including things such as \214n-) --.12 F(ger service \212 and good documentation.)72 697.8 Q EP -%%Page: 63 59 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-63)195.86 E/F1 10/Times-Roman@0 SF 28.94(NISPLUS Compile)102 96 -R(in support for NIS+.)2.5 E 26.73(NETINFO Compile)102 112.2 R -(in support for NetInfo \(NeXT stations\).)2.5 E(LD)102 128.4 Q 22.12 -(APMAP Compile)-.4 F 1.225(in support for LD)3.725 F 1.225 -(AP X500 queries.)-.4 F 1.226(Requires libldap and liblber from)6.226 F -(the Umich LD)174 140.4 Q(AP 3.2 or 3.3 release.)-.4 E 32.84 -(HESIOD Compile)102 156.6 R(in support for Hesiod.)2.5 E(_P)102 172.8 Q --1.11(AT)-.92 G(H_SENDMAILCF)1.11 E -(The pathname of the sendmail.cf \214le.)174 184.8 Q(_P)102 201 Q -1.11 -(AT)-.92 G(H_SENDMAILPID)1.11 E -(The pathname of the sendmail.pid \214le.)174 213 Q 1.44 -(There are also se)127 229.2 R -.15(ve)-.25 G 1.439 -(ral compilation \215ags to indicate the en).15 F 1.439 -(vironment such as \231_AIX3\232 and)-.4 F 2.5(\231_SCO_unix_\232. See) -102 241.2 R -(the src/README \214le for the latest scoop on these \215ags.)2.5 E F0 -2.5(6.2. P)87 265.2 R(arameters in sr)-.1 E(c/conf)-.18 E(.h)-.15 E F1 --.15(Pa)127 281.4 S .895 -(rameters and compilation options are de\214ned in conf.h.).15 F .896 -(Most of these need not normally)5.895 F .193(be tweak)102 293.4 R .192 -(ed; common parameters are all in sendmail.cf.)-.1 F(Ho)5.192 E(we)-.25 -E -.15(ve)-.25 G .992 -.4(r, t).15 H .192(he sizes of certain primiti).4 -F .492 -.15(ve ve)-.25 H(c-).15 E -(tors, etc., are included in this \214le.)102 305.4 Q(The numbers follo) -5 E(wing the parameters are their def)-.25 E(ault v)-.1 E(alue.)-.25 E -1.247(This document is not the best source of information for compilation \215ags in conf.h \212 see) -127 321.6 R(src/README or src/conf.h itself.)102 333.6 Q(MAXLINE [2048]) -102 349.8 Q 2.069(The maximum line length of an)11.14 F 4.568(yi)-.15 G -2.068(nput line.)-4.568 F 2.068(If message lines e)7.068 F 2.068 -(xceed this)-.15 F .575(length the)188.4 361.8 R 3.075(yw)-.15 G .575 -(ill still be processed correctly; ho)-3.075 F(we)-.25 E -.15(ve)-.25 G -1.375 -.4(r, h).15 H .575(eader lines, con\214gura-).4 F -(tion \214le lines, alias lines, etc., must \214t within this limit.) -188.4 373.8 Q(MAXN)102 390 Q(AME [256])-.35 E(The maximum length of an) -9.82 E 2.5(yn)-.15 G(ame, such as a host or a user name.)-2.5 E -(MAXPV [40])102 406.2 Q .25(The maximum number of parameters to an)31.13 -F 2.75(ym)-.15 G(ailer)-2.75 E 5.25(.T)-.55 G .25 -(his limits the number of)-5.25 F .375 -(recipients that may be passed in one transaction.)188.4 418.2 R .376 -(It can be set to an)5.376 F 2.876(ya)-.15 G(rbitrary)-2.876 E .876 -(number abo)188.4 430.2 R 1.176 -.15(ve a)-.15 H .876(bout 10, since).15 -F/F2 10/Times-Italic@0 SF(sendmail)3.376 E F1 .876(will break up a deli) -3.376 F -.15(ve)-.25 G .875(ry into smaller).15 F .886 -(batches as needed.)188.4 442.2 R 3.386(Ah)5.886 G .887 -(igher number may reduce load on your system, ho)-3.386 F(w-)-.25 E --2.15 -.25(ev e)188.4 454.2 T -.55(r.).25 G(MAXA)102 470.4 Q -.18(TO) --1.11 G 2.5(M[).18 G 8.26(100] The)-2.5 F .064 -(maximum number of atoms \(tok)2.564 F .063(ens\) in a single address.) --.1 F -.15(Fo)5.063 G 2.563(re).15 G .063(xample, the)-2.713 F -(address \231eric@CS.Berk)188.4 482.4 Q(ele)-.1 E -.65(y.)-.15 G -(EDU\232 is se).65 E -.15(ve)-.25 G 2.5(na).15 G(toms.)-2.5 E -(MAXMAILERS [25])102 498.6 Q .122(The maximum number of mailers that may be de\214ned in the con\214guration \214le.) -.02 F(MAXR)102 514.8 Q(WSETS [200])-.55 E .432(The maximum number of re) -.01 F .432(writing sets that may be de\214ned.)-.25 F .431 -(The \214rst half of)5.431 F .034(these are reserv)188.4 526.8 R .034 -(ed for numeric speci\214cation \(e.g., `)-.15 F(`S92')-.74 E .035 -('\), while the upper half)-.74 F .492(are reserv)188.4 538.8 R .492 -(ed for auto-numbering \(e.g., `)-.15 F(`Sfoo')-.74 E 2.992('\). Thus,) --.74 F .492(with a v)2.992 F .491(alue of 200 an)-.25 F -(attempt to use `)188.4 550.8 Q(`S99')-.74 E 2.5('w)-.74 G -(ill succeed, b)-2.5 E(ut `)-.2 E(`S100')-.74 E 2.5('w)-.74 G(ill f)-2.5 -E(ail.)-.1 E(MAXPRIORITIES [25])102 567 Q 2.481(The maximum number of v) -188.4 579 R 2.482(alues for the \231Precedence:\232 \214eld that may be) --.25 F(de\214ned \(using the)188.4 591 Q F0(P)2.5 E F1 -(line in sendmail.cf\).)2.5 E(MAXUSERENVIR)102 607.2 Q(ON [100])-.4 E -.399(The maximum number of items in the user en)188.4 619.2 R .399 -(vironment that will be passed to)-.4 F(subordinate mailers.)188.4 631.2 -Q(MAXMXHOSTS [100])102 647.4 Q -(The maximum number of MX records we will accept for an)188.4 659.4 Q -2.5(ys)-.15 G(ingle host.)-2.5 E(MAXALIASDB [12])102 675.6 Q .767 -(The maximum number of alias databases that can be open at an).58 F -3.267(yt)-.15 G 3.267(ime. Note)-3.267 F -(that there may also be an open \214le limit.)188.4 687.6 Q(MAXMAPST)102 -703.8 Q -.4(AC)-.93 G 2.5(K[).4 G(12])-2.5 E 1.65 -(The maximum number of maps that may be "stack)188.4 715.8 R 1.65 -(ed" in a)-.1 F F0(sequence)4.15 E F1(class)4.15 E EP -%%Page: 64 60 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-64 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF(map.) -188.4 96 Q(MAXMIMEARGS [20])102 112.2 Q .718(The maximum number of ar) -188.4 124.2 R .718(guments in a MIME Content-T)-.18 F .718 -(ype: header; addi-)-.8 F(tional ar)188.4 136.2 Q -(guments will be ignored.)-.18 E(MAXMIMENESTING [20])102 152.4 Q .4(The maximum depth to which MIME messages may be nested \(that is, nested) -188.4 164.4 R 1.344(Message or Multipart documents; this does not limit the number of compo-) -188.4 176.4 R(nents in a single Multipart document\).)188.4 188.4 Q -2.851(An)102 204.6 S .351(umber of other compilation options e)-2.851 F -2.851(xist. These)-.15 F .35 -(specify whether or not speci\214c code should be)2.851 F(compiled in.) -102 216.6 Q(Ones mark)5 E(ed with \207 are 0/1 v)-.1 E(alued.)-.25 E -36.69(NETINET\207 If)102 232.8 R .829 -(set, support for Internet protocol netw)3.329 F .829 -(orking is compiled in.)-.1 F(Pre)5.829 E .83(vious v)-.25 F(er)-.15 E -(-)-.2 E .178(sions of)188.4 244.8 R/F2 10/Times-Italic@0 SF(sendmail) -2.678 E F1 .178(referred to this as)2.678 F/F3 9/Times-Roman@0 SF -.36 -(DA)2.678 G(EMON).36 E F1 2.677(;t)C .177(his old usage is no)-2.677 F -2.677(wi)-.25 G(ncorrect.)-2.677 E(Def)188.4 256.8 Q 1.87 -(aults on; turn it of)-.1 F 4.37(fi)-.25 G 4.37(nt)-4.37 G 1.87(he Mak) --4.37 F 1.87(e\214le if your system doesn')-.1 F 4.37(ts)-.18 G 1.87 -(upport the)-4.37 F(Internet protocols.)188.4 268.8 Q 43.35 -(NETISO\207 If)102 285 R .143(set, support for ISO protocol netw)2.643 F -.142(orking is compiled in \(it may be appropri-)-.1 F -(ate to #de\214ne this in the Mak)188.4 297 Q -(e\214le instead of conf.h\).)-.1 E 63.35(LOG If)102 313.2 R .5 -(set, the)3 F F2(syslo)3 E(g)-.1 E F1 .5 -(routine in use at some sites is used.)3 F .5(This mak)5.5 F .5 -(es an informa-)-.1 F .504 -(tional log record for each message processed, and mak)188.4 325.2 R -.504(es a higher priority log)-.1 F .052 -(record for internal system errors.)188.4 337.2 R F0(STR)5.052 E(ONGL) --.3 E 2.552(YR)-.92 G(ECOMMENDED)-2.552 E F1 2.553<8a69>2.552 G 2.553 -(fy)-2.553 G(ou)-2.553 E -.1(wa)188.4 349.2 S(nt no logging, turn it of) -.1 E 2.5(fi)-.25 G 2.5(nt)-2.5 G(he con\214guration \214le.)-2.5 E(MA) -102 365.4 Q 11.12(TCHGECOS\207 Compile)-1.11 F 3.555 -(in the code to do `)6.055 F 3.555(`fuzzy matching')-.74 F 6.055('o)-.74 -G 6.055(nt)-6.055 G 3.555(he GECOS \214eld in)-6.055 F 2.5 -(/etc/passwd. This)188.4 377.4 R(also requires that the)2.5 E F0 -(MatchGECOS)2.5 E F1(option be turned on.)2.5 E -.35(NA)102 393.6 S -13.15(MED_BIND\207 Compile).35 F .412(in code to use the Berk)2.912 F -(ele)-.1 E 2.913(yI)-.15 G .413(nternet Name Domain \(BIND\) serv)-2.913 -F .413(er to)-.15 F(resolv)188.4 405.6 Q 2.5(eT)-.15 G -(CP/IP host names.)-2.5 E(NO)102 421.8 Q 38.76(TUNIX If)-.4 F .248(you are using a non-UNIX mail format, you can set this \215ag to turn of) -2.748 F 2.747(fs)-.25 G(pe-)-2.747 E -(cial processing of UNIX-style \231From \232 lines.)188.4 433.8 Q -.1 -(QU)102 450 S 45.12(EUE\207 This).1 F 1.559 -(\215ag should be set to compile in the queueing code.)4.059 F 1.56 -(If this is not set,)6.56 F(mailers must accept the mail immediately or it will be returned to the sender) -188.4 462 Q(.)-.55 E 52.78(SMTP\207 If)102 478.2 R .756 -(set, the code to handle user and serv)3.256 F .756 -(er SMTP will be compiled in.)-.15 F .756(This is)5.756 F 2.507 -(only necessary if your machine has some mailer that speaks SMTP \(this) -188.4 490.2 R(means most machines e)188.4 502.2 Q -.15(ve)-.25 G -(rywhere\).).15 E 39.45(USERDB\207 Include)102 518.4 R(the)3.449 E F0 -(experimental)3.449 E F1(Berk)3.449 E(ele)-.1 E 3.449(yu)-.15 G .949 -(ser information database package.)-3.449 F(This)5.948 E .27(adds a ne) -188.4 530.4 R 2.77(wl)-.25 G -2.15 -.25(ev e)-2.77 H 2.77(lo).25 G 2.77 -(fl)-2.77 G .27(ocal name e)-2.77 F .27 -(xpansion between aliasing and forw)-.15 F 2.77(arding. It)-.1 F -(also uses the NEWDB package.)188.4 542.4 Q -(This may change in future releases.)5 E(The follo)102 558.6 Q -(wing options are normally turned on in per)-.25 E -(-operating-system clauses in conf.h.)-.2 E(IDENTPR)102 574.8 Q -1.88 --.4(OT O)-.4 H 19.61<8743>.4 G .376 -(ompile in the IDENT protocol as de\214ned in RFC 1413.)-19.61 F .375 -(This def)5.375 F .375(aults on for)-.1 F 1.053(all systems e)188.4 -586.8 R 1.053(xcept Ultrix, which apparently has the interesting \231feature\232 that) --.15 F .83(when it recei)188.4 598.8 R -.15(ve)-.25 G 3.33(sa\231).15 G -.83(host unreachable\232 message it closes all open connections)-3.33 F -1.921(to that host.)188.4 610.8 R 1.921(Since some \214re)6.921 F -.1 -(wa)-.25 G 1.922(ll g).1 F(ate)-.05 E -.1(wa)-.25 G 1.922 -(ys send this error code when you).1 F 2.055(access an unauthorized port \(such as 113, used by IDENT\), Ultrix cannot) -188.4 622.8 R(recei)188.4 634.8 Q .3 -.15(ve e)-.25 H -(mail from such hosts.).15 E 39.45(SYSTEM5 Set)102 651 R -(all of the compilation parameters appropriate for System V)2.5 E(.) --1.29 E 26.12(HASFLOCK\207 Use)102 667.2 R(Berk)2.844 E(ele)-.1 E -(y-style)-.15 E F0(\215ock)2.844 E F1 .344(instead of System V)2.844 F -F0(lockf)2.845 E F1 .345(to do \214le locking.)2.845 F .345(Due to)5.345 -F .184(the highly unusual semantics of locks across forks in)188.4 679.2 -R F0(lockf)2.684 E F1 2.684(,t)C .184(his should al)-2.684 F -.1(wa)-.1 -G(ys).1 E(be used if at all possible.)188.4 691.2 Q(HASINITGR)102 707.4 -Q 4.86(OUPS Set)-.4 F 1.284(this if your system has the)3.783 F F2 -(initgr)3.784 E(oups\(\))-.45 E F1 1.284(call \(if you ha)3.784 F 1.584 --.15(ve m)-.2 H 1.284(ultiple group).15 F 4.417(support\). This)188.4 -719.4 R 1.917(is the def)4.417 F 1.917(ault if SYSTEM5 is)-.1 F F2(not) -4.416 E F1 1.916(de\214ned or if you are on)4.416 F EP -%%Page: 65 61 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-65)195.86 E/F1 10/Times-Roman@0 SF(HPUX.)188.4 96 Q(HASUN)102 -112.2 Q 27.59(AME Set)-.35 F 1.148(this if you ha)3.648 F 1.448 -.15 -(ve t)-.2 H(he).15 E/F2 10/Times-Italic@0 SF(uname)3.648 E F1 1.149 -(\(2\) system call \(or corresponding library rou-)B 2.5(tine\). Set) -188.4 124.2 R(by def)2.5 E(ault if SYSTEM5 is set.)-.1 E(HASGETDT)102 -140.4 Q(ABLESIZE)-.93 E(Set this if you ha)188.4 152.4 Q .3 -.15(ve t) --.2 H(he).15 E F2 -.1(ge)2.5 G(tdtablesize).1 E F1(\(2\) system call.)A -(HASW)102 168.6 Q 22.89(AITPID Set)-1.2 F(this if you ha)2.5 E .3 -.15 -(ve t)-.2 H(he).15 E F2(haswaitpid)2.5 E F1(\(2\) system call.)A 37.22 -(SFS_TYPE The)102 184.8 R .517 -(mechanism that can be used to get \214le system capacity information.) -3.017 F(The)5.516 E -.25(va)188.4 196.8 S .214 -(lues can be one of SFS_UST).25 F 2.435 -1.11(AT \()-.93 H .215 -(use the ustat\(2\) syscall\), SFS_4ARGS \(use)1.11 F .415(the four ar) -188.4 208.8 R .415(gument statfs\(2\) syscall\), SFS_VFS \(use the tw) --.18 F 2.915(oa)-.1 G -.18(rg)-2.915 G .415(ument statfs\(2\)).18 F .716 -(syscall including <sys/vfs.h>\), SFS_MOUNT \(use the tw)188.4 220.8 R -3.217(oa)-.1 G -.18(rg)-3.217 G .717(ument statfs\(2\)).18 F 4.32 -(syscall including <sys/mount.h>\), SFS_ST)188.4 232.8 R -1.11(AT)-.93 G -4.32(FS \(use the tw)1.11 F 6.82(oa)-.1 G -.18(rg)-6.82 G(ument).18 E -1.108(statfs\(2\) syscall including <sys/statfs.h>\), SFS_ST)188.4 244.8 -R -1.11(AT)-.93 G 1.109(VFS \(use the tw)1.11 F 3.609(oa)-.1 G -.18(rg) --3.609 G(u-).18 E 1.511(ment statfs\(2\) syscall including <sys/statvfs.h>\), or SFS_NONE \(no w) -188.4 256.8 R 1.511(ay to)-.1 F(get this information\).)188.4 268.8 Q -40.57(LA_TYPE The)102 285 R(load a)2.5 E -.15(ve)-.2 G(rage type.).15 E -(Details are described belo)5 E -.65(w.)-.25 G .342(The are se)102 301.2 -R -.15(ve)-.25 G .342(ral b).15 F .342(uilt-in w)-.2 F .342 -(ays of computing the load a)-.1 F -.15(ve)-.2 G(rage.).15 E F2 -(Sendmail)5.342 E F1 .343(tries to auto-con\214gure them)2.842 F .267 -(based on imperfect guesses; you can select one using the)102 313.2 R F2 -(cc)2.766 E F1(option)2.766 E F0(\255DLA_TYPE=)2.766 E F2(type)A F1 -2.766(,w)C(here)-2.766 E F2(type)2.766 E F1(is:)102 325.2 Q 48.91 -(LA_INT The)102 341.4 R -.1(ke)3.452 G .952(rnel stores the load a).1 F --.15(ve)-.2 G .952(rage in the k).15 F .952 -(ernel as an array of long inte)-.1 F(gers.)-.15 E(The actual v)188.4 -353.4 Q(alues are scaled by a f)-.25 E(actor FSCALE \(def)-.1 E -(ault 256\).)-.1 E(LA_SHOR)102 369.6 Q 35.89(TT)-.6 G .794(he k)-35.89 F -.794(ernel stores the load a)-.1 F -.15(ve)-.2 G .794(rage in the k).15 -F .793(ernel as an array of short inte)-.1 F(gers.)-.15 E(The actual v) -188.4 381.6 Q(alues are scaled by a f)-.25 E(actor FSCALE \(def)-.1 E -(ault 256\).)-.1 E(LA_FLO)102 397.8 Q 37.03 -1.11(AT T)-.35 H .088(he k) -1.11 F .088(ernel stores the load a)-.1 F -.15(ve)-.2 G .089 -(rage in the k).15 F .089(ernel as an array of double precision)-.1 F -(\215oats.)188.4 409.8 Q(LA_MA)102 426 Q 35.97(CH Use)-.4 F(MA)2.5 E -(CH-style load a)-.4 E -.15(ve)-.2 G(rages.).15 E 39.45(LA_SUBR Call)102 -442.2 R(the)2.5 E F2 -.1(ge)2.5 G(tloadavg).1 E F1 -(routine to get the load a)2.5 E -.15(ve)-.2 G -(rage as an array of doubles.).15 E(LA_ZER)102 458.4 Q 42.36(OA)-.4 G --.1(lwa)-42.36 G(ys return zero as the load a).1 E -.15(ve)-.2 G 2.5 -(rage. This).15 F(is the f)2.5 E(allback case.)-.1 E .494(If type)102 -474.6 R/F3 9/Times-Roman@0 SF(LA_INT)2.994 E F1(,)A F3(LA_SHOR)2.994 E -(T)-.54 E F1 2.994(,o)C(r)-2.994 E F3(LA_FLO)2.993 E -.999(AT)-.315 G F1 -.493(is speci\214ed, you may also need to specify)3.992 F F3(_P)2.993 E --.999(AT)-.828 G(H_UNIX).999 E F1 .948 -(\(the path to your system binary\) and)102 486.6 R F3(LA_A)3.448 E -(VENR)-1.215 E(UN)-.36 E F1 .949(\(the name of the v)3.448 F .949 -(ariable containing the load)-.25 F -2.25 -.2(av e)102 498.6 T -(rage in the k).2 E(ernel; usually \231_a)-.1 E -.15(ve)-.2 G -(nrun\232 or \231a).15 E -.15(ve)-.2 G(nrun\232\).).15 E F0 2.5 -(6.3. Con\214guration)87 522.6 R(in sr)2.5 E(c/conf)-.18 E(.c)-.15 E F1 -(The follo)127 538.8 Q(wing changes can be made in conf.c.)-.25 E F0 2.5 -(6.3.1. Built-in)102 562.8 R(Header Semantics)2.5 E F1 1.248 -(Not all header semantics are de\214ned in the con\214guration \214le.) -142 579 R 1.247(Header lines that should)6.247 F .305(only be included by certain mailers \(as well as other more obscure semantics\) must be speci\214ed) -117 591 R .047(in the)117 603 R F2(HdrInfo)2.547 E F1 .047(table in) -2.547 F F2(conf)2.547 E(.c)-.15 E F1 5.047(.T)C .046 -(his table contains the header name \(which should be in all lo)-5.047 F -(wer)-.25 E(case\) and a set of header control \215ags \(described belo) -117 615 Q(w\), The \215ags are:)-.25 E(H_A)117 631.2 Q 30.97 -(CHECK Normally)-.4 F .007 -(when the check is made to see if a header line is compatible with)2.507 -F 2.941(am)203.4 643.2 S(ailer)-2.941 E(,)-.4 E F2(sendmail)2.941 E F1 -.441(will not delete an e)2.941 F .441(xisting line.)-.15 F .44 -(If this \215ag is set,)5.441 F F2(send-)2.94 E(mail)203.4 655.2 Q F1 -.152(will delete e)2.652 F -.15(ve)-.25 G 2.652(ne).15 G .152 -(xisting header lines.)-2.802 F .152 -(That is, if this bit is set and the)5.152 F 1.425(mailer does not ha) -203.4 667.2 R 1.725 -.15(ve \215)-.2 H 1.425 -(ag bits set that intersect with the required mailer).15 F 2.204 -(\215ags in the header de\214nition in sendmail.cf, the header line is) -203.4 679.2 R F2(always)4.704 E F1(deleted.)203.4 691.2 Q 51.13 -(H_EOH If)117 707.4 R .206(this header \214eld is set, treat it lik) -2.706 F 2.706(eab)-.1 G .206(lank line, i.e., it will signal the end) --2.706 F(of the header and the be)203.4 719.4 Q -(ginning of the message te)-.15 E(xt.)-.15 E EP -%%Page: 66 62 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-66 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF 39.45 -(H_FORCE Add)117 96 R 2.038(this header entry e)4.538 F -.15(ve)-.25 G -4.538(ni).15 G 4.538(fo)-4.538 G 2.038(ne e)-4.538 F 2.039 -(xisted in the message before.)-.15 F 2.039(If a)7.039 F 2.189 -(header entry does not ha)203.4 108 R 2.488 -.15(ve t)-.2 H 2.188 -(his bit set,).15 F/F2 10/Times-Italic@0 SF(sendmail)4.688 E F1 2.188 -(will not add another)4.688 F .62 -(header line if a header line of this name already e)203.4 120 R 3.12 -(xisted. This)-.15 F -.1(wo)3.12 G .62(uld nor).1 F(-)-.2 E -(mally be used to stamp the message by e)203.4 132 Q -.15(ve)-.25 G -(ryone who handled it.).15 E(H_TRA)117 148.2 Q 39.3(CE If)-.4 F 1.044 -(set, this is a timestamp \(trace\) \214eld.)3.544 F 1.043 -(If the number of trace \214elds in a)6.043 F .705(message e)203.4 160.2 -R .705(xceeds a preset amount the message is returned on the assump-) --.15 F(tion that it has an aliasing loop.)203.4 172.2 Q 46.67(H_RCPT If) -117 188.4 R .332(set, this \214eld contains recipient addresses.)2.833 F -.332(This is used by the)5.332 F F0<ad74>2.832 E F1 .332(\215ag to)2.832 -F 1.349(determine who to send to when it is collecting recipients from the mes-) -203.4 200.4 R(sage.)203.4 212.4 Q(H_FR)117 228.6 Q 43.74(OM This)-.4 F -1.673(\215ag indicates that this \214eld speci\214es a sender)4.174 F -6.673(.T)-.55 G 1.673(he order of these)-6.673 F .898(\214elds in the) -203.4 240.6 R F2(HdrInfo)3.398 E F1 .898(table speci\214es)3.398 F F2 -(sendmail)3.398 E F1 1.998 -.55('s p)D .898(reference for which \214eld) -.55 F(to return error messages to.)203.4 252.6 Q(H_ERR)117 268.8 Q(ORST) --.4 E 22.53(OA)-.18 G(ddresses in this header should recei)-22.53 E .3 --.15(ve e)-.25 H(rror messages.).15 E 52.79(H_CTE This)117 285 R -(header is a Content-T)2.5 E(ransfer)-.35 E(-Encoding header)-.2 E(.) --.55 E 40.01(H_CTYPE This)117 301.2 R(header is a Content-T)2.5 E -(ype header)-.8 E(.)-.55 E(H_STRIPV)117 317.4 Q 25.25(AL Strip)-1.35 F -(the v)2.5 E(alue from the header \(for Bcc:\).)-.25 E(Let')117 333.6 Q -2.5(sl)-.55 G(ook at a sample)-2.5 E F2(HdrInfo)2.5 E F1 -(speci\214cation:)2.5 E(struct hdrinfo)157 349.8 Q(HdrInfo[] =)84.6 E({) -157 361.8 Q(/* originator \214elds, most to least signi\214cant)189.5 -373.8 Q(*/)5 E 52.29("resent-sender", H_FR)177 385.8 R(OM,)-.4 E 58.95 -("resent-from", H_FR)177 397.8 R(OM,)-.4 E 79.5("sender", H_FR)177 409.8 -R(OM,)-.4 E 86.16("from", H_FR)177 421.8 R(OM,)-.4 E 66.72 -("full-name", H_A)177 433.8 R(CHECK,)-.4 E 71.17("errors-to", H_FR)177 -445.8 R -1.667(OM | H_ERR)-.4 F(ORST)-.4 E(O,)-.18 E -(/* destination \214elds */)189.5 457.8 Q 97.82("to", H_RCPT)177 469.8 R -(,)-.74 E 70.61("resent-to", H_RCPT)177 481.8 R(,)-.74 E 96.72 -("cc", H_RCPT)177 493.8 R(,)-.74 E 91.72("bcc", H_RCPT)177 505.8 R .833 -(|H).833 G(_STRIPV)-.833 E(AL,)-1.35 E -(/* message identi\214cation and control */)189.5 517.8 Q 71.72 -("message", H_EOH,)177 529.8 R("te)177 541.8 Q 90.75(xt", H_EOH,)-.15 F -(/* trace \214elds */)189.5 553.8 Q("recei)177 565.8 Q -.15(ve)-.25 G -72.13(d", H_TRA).15 F -1.667(CE | H_FORCE,)-.4 F -(/* miscellaneous \214elds */)189.5 577.8 Q("content-transfer)177 589.8 -Q 2.5(-encoding", H_CTE,)-.2 F 55.61("content-type", H_CTYPE,)177 601.8 -R 87.1(NULL, 0,)177 625.8 R(};)157 637.8 Q 2.435 -(This structure indicates that the \231T)117 654 R 2.435 -(o:\232, \231Resent-T)-.8 F 2.435 -(o:\232, and \231Cc:\232 \214elds all specify recipient)-.8 F 3.161 -(addresses. An)117 666 R 3.161<7999>-.15 G .662(Full-Name:\232 \214eld will be deleted unless the required mailer \215ag \(indicated in) --3.161 F .246(the con\214guration \214le\) is speci\214ed.)117 678 R -.245(The \231Message:\232 and \231T)5.246 F -.15(ex)-.7 G .245 -(t:\232 \214elds will terminate the header;).15 F 1.936 -(these are used by random dissenters around the netw)117 690 R 1.936 -(ork w)-.1 F 4.436(orld. The)-.1 F(\231Recei)4.436 E -.15(ve)-.25 G -1.937(d:\232 \214eld will).15 F(al)117 702 Q -.1(wa)-.1 G -(ys be added, and can be used to trace messages.).1 E EP -%%Page: 67 63 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-67)195.86 E/F1 10/Times-Roman@0 SF .446 -(There are a number of important points here.)142 96 R .445 -(First, header \214elds are not added automati-)5.446 F .656 -(cally just because the)117 108 R 3.156(ya)-.15 G .656(re in the)-3.156 -F/F2 10/Times-Italic@0 SF(HdrInfo)3.157 E F1 .657(structure; the)3.157 F -3.157(ym)-.15 G .657(ust be speci\214ed in the con\214guration)-3.157 F -.728(\214le in order to be added to the message.)117 120 R(An)5.727 E -3.227(yh)-.15 G .727 -(eader \214elds mentioned in the con\214guration \214le)-3.227 F -.2(bu) -117 132 S 3.24(tn).2 G .74(ot mentioned in the)-3.24 F F2(HdrInfo)3.24 E -F1 .74(structure ha)3.24 F 1.04 -.15(ve d)-.2 H(ef).15 E .74 -(ault processing performed; that is, the)-.1 F 3.24(ya)-.15 G(re)-3.24 E -1.375(added unless the)117 144 R 3.875(yw)-.15 G 1.375 -(ere in the message already)-3.875 F 6.375(.S)-.65 G 1.374(econd, the) --6.375 F F2(HdrInfo)3.874 E F1 1.374(structure only speci\214es)3.874 F -.324(cliched processing; certain headers are processed specially by ad hoc code re) -117 156 R -.05(ga)-.15 G .325(rdless of the sta-).05 F .481 -(tus speci\214ed in)117 168 R F2(HdrInfo)2.981 E F1 5.481(.F)C .481 -(or e)-5.631 F .481 -(xample, the \231Sender:\232 and \231From:\232 \214elds are al)-.15 F --.1(wa)-.1 G .48(ys scanned on).1 F(ARP)117 182 Q .751 -(ANET mail to determine the sender)-.92 F/F3 7/Times-Roman@0 SF(26)-4 I -F1 3.251(;t)4 K .75 -(his is used to perform the \231return to sender\232 func-)-3.251 F -2.976(tion. The)117 194 R .476(\231From:\232 and \231Full-Name:\232 \214elds are used to determine the full name of the sender if) -2.976 F(possible; this is stored in the macro)117 206 Q F0($x)2.5 E F1 -(and used in a number of w)2.5 E(ays.)-.1 E F0 2.5(6.3.2. Restricting) -102 230 R(Use of Email)2.5 E F1 .15 -(If it is necessary to restrict mail through a relay)142 246.2 R 2.649 -(,t)-.65 G(he)-2.649 E F2 -.15(ch)2.649 G(ec).15 E(kcompat)-.2 E F1 .149 -(routine can be modi\214ed.)2.649 F .163(This routine is called for e) -117 258.2 R -.15(ve)-.25 G .163(ry recipient address.).15 F .163 -(It returns an e)5.163 F .163(xit status indicating the status of)-.15 F -.895(the message.)117 270.2 R .895(The status)5.895 F/F4 9/Times-Roman@0 -SF(EX_OK)3.395 E F1 .895(accepts the address,)3.395 F F4(EX_TEMPF)3.395 -E(AIL)-.666 E F1 .895(queues the message for a)3.395 F .263(later try) -117 282.2 R 2.763(,a)-.65 G .263(nd other v)-2.763 F .264 -(alues \(commonly)-.25 F F4(EX_UN)2.764 E -1.215(AVA)-.315 G(ILABLE) -1.215 E F1 2.764(\)r)C .264(eject the message.)-2.764 F .264 -(It is up to)5.264 F F2 -.15(ch)2.764 G(ec).15 E(k-)-.2 E(compat)117 -294.2 Q F1 .43(to print an error message \(using)2.93 F F2(usr)2.929 E -(err)-.37 E F1 2.929(\)i)C 2.929(ft)-2.929 G .429 -(he message is rejected.)-2.929 F -.15(Fo)5.429 G 2.929(re).15 G -(xample,)-3.079 E F2 -.15(ch)2.929 G(ec).15 E(k-)-.2 E(compat)117 306.2 -Q F1(could read:)2.5 E F4(int)157 321.2 Q(checkcompat\(to, e\))157 332 Q -(re)175 342.8 Q(gister ADDRESS *to;)-.135 E(re)175 353.6 Q -(gister ENVELOPE *e;)-.135 E({)157 364.4 Q(re)175 375.2 Q(gister ST) --.135 E(AB *s;)-.837 E 2.25(s=s)175 396.8 S(tab\("pri)-2.25 E -.225(va) --.225 G(te", ST_MAILER, ST_FIND\);).225 E -(if \(s != NULL && e\255>e_from.q_mailer != LocalMailer &&)175 407.6 Q -(to->q_mailer == s->s_mailer\))184 418.4 Q({)175 429.2 Q -(usrerr\("No pri)193 440 Q -.225(va)-.225 G(te net mail allo).225 E -(wed through this machine"\);)-.225 E(return \(EX_UN)193 450.8 Q -1.215 -(AVA)-.315 G(ILABLE\);)1.215 E(})175 461.6 Q -(if \(MsgSize > 50000 && bitnset\(M_LOCALMAILER, to\255>q_mailer\)\))175 -472.4 Q({)175 483.2 Q(usrerr\("Message too lar)193 494 Q -(ge for non-local deli)-.162 E -.135(ve)-.225 G(ry"\);).135 E -(e\255>e_\215ags |= EF_NORETURN;)193 504.8 Q(return \(EX_UN)193 515.6 Q --1.215(AVA)-.315 G(ILABLE\);)1.215 E(})175 526.4 Q(return \(EX_OK\);)175 -537.2 Q(})157 548 Q F1 .969(This w)117 564.2 R .969 -(ould reject messages greater than 50000 bytes unless the)-.1 F 3.469 -(yw)-.15 G .97(ere local.)-3.469 F(The)5.97 E F2(EF_NORE-)3.47 E(TURN) -117 576.2 Q F1 .652(\215ag can be set in)3.152 F F2(e)3.152 E/F5 10 -/Symbol SF<ae>A F2(e_\215a)A(gs)-.1 E F1 .651 -(to suppress the return of the actual body of the message in)3.152 F -.655(the error return.)117 588.2 R .655(The actual use of this routine is highly dependent on the implementation, and) -5.655 F(use should be limited.)117 600.2 Q F0 2.5(6.3.3. New)102 624.2 R -(Database Map Classes)2.5 E F1(Ne)142 640.4 Q 2.876(wk)-.25 G .676 -.15 -(ey m)-2.976 H .375(aps can be added by creating a class initialization function and a lookup func-) -.15 F 2.5(tion. These)117 652.4 R(are then added to the routine)2.5 E F2 -(setupmaps.)2.5 E .32 LW 76 669.2 72 669.2 DL 80 669.2 76 669.2 DL 84 -669.2 80 669.2 DL 88 669.2 84 669.2 DL 92 669.2 88 669.2 DL 96 669.2 92 -669.2 DL 100 669.2 96 669.2 DL 104 669.2 100 669.2 DL 108 669.2 104 -669.2 DL 112 669.2 108 669.2 DL 116 669.2 112 669.2 DL 120 669.2 116 -669.2 DL 124 669.2 120 669.2 DL 128 669.2 124 669.2 DL 132 669.2 128 -669.2 DL 136 669.2 132 669.2 DL 140 669.2 136 669.2 DL 144 669.2 140 -669.2 DL 148 669.2 144 669.2 DL 152 669.2 148 669.2 DL 156 669.2 152 -669.2 DL 160 669.2 156 669.2 DL 164 669.2 160 669.2 DL 168 669.2 164 -669.2 DL 172 669.2 168 669.2 DL 176 669.2 172 669.2 DL 180 669.2 176 -669.2 DL 184 669.2 180 669.2 DL 188 669.2 184 669.2 DL 192 669.2 188 -669.2 DL 196 669.2 192 669.2 DL 200 669.2 196 669.2 DL 204 669.2 200 -669.2 DL 208 669.2 204 669.2 DL 212 669.2 208 669.2 DL 216 669.2 212 -669.2 DL/F6 5/Times-Roman@0 SF(26)93.6 679.6 Q/F7 8/Times-Roman@0 SF -(Actually)3.2 I 2.631(,t)-.52 G .631 -(his is no longer true in SMTP; this information is contained in the en) --2.631 F -.12(ve)-.32 G 2.632(lope. The).12 F .632(older ARP)2.632 F -.632(ANET protocols did)-.736 F(not completely distinguish en)72 692.4 Q --.12(ve)-.32 G(lope from header).12 E(.)-.44 E EP -%%Page: 68 64 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-68 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF -(The initialization function is called as)142 96 Q/F2 10/Times-Italic@0 -SF(xxx)157 112.2 Q F1(_map_init\(MAP *map, char *ar)A(gs\))-.18 E(The) -117 128.4 Q F2(map)3.279 E F1 .779(is an internal data structure.)3.279 -F(The)5.779 E F2(ar)3.279 E(gs)-.37 E F1 .78 -(is a pointer to the portion of the con\214guration)3.279 F .397 -(\214le line follo)117 140.4 R .396 -(wing the map class name; \215ags and \214lenames can be e)-.25 F .396 -(xtracted from this line.)-.15 F(The)5.396 E -(initialization function must return)117 152.4 Q/F3 9/Times-Roman@0 SF -(TR)2.5 E(UE)-.36 E F1(if it successfully opened the map,)2.5 E F3 -.666 -(FA)2.5 G(LSE).666 E F1(otherwise.)2.5 E -(The lookup function is called as)142 168.6 Q F2(xxx)157 184.8 Q F1 -(_map_lookup\(MAP *map, char b)A(uf[], char **a)-.2 E 1.3 -.65(v, i)-.2 -H(nt *statp\)).65 E(The)117 201 Q F2(map)2.772 E F1 .272 -(de\214nes the map internally)2.772 F 5.273(.T)-.65 G(he)-5.273 E F2 -.2 -(bu)2.773 G(f).2 E F1 .273(has the input k)2.773 F -.15(ey)-.1 G 5.273 -(.T)-.5 G .273(his may be \(and often is\) used)-5.273 F(destructi)117 -213 Q -.15(ve)-.25 G(ly).15 E 5.152(.T)-.65 G(he)-5.152 E F2(av)2.652 E -F1 .151(is a list of ar)2.652 F .151(guments passed in from the re)-.18 -F .151(write line.)-.25 F .151(The lookup function)5.151 F .322 -(should return a pointer to the ne)117 225 R 2.822(wv)-.25 G 2.822 -(alue. If)-3.072 F .322(the map lookup f)2.822 F(ails,)-.1 E F2(*statp) -2.822 E F1 .322(should be set to an e)2.822 F(xit)-.15 E .302 -(status code; in particular)117 237 R 2.802(,i)-.4 G 2.802(ts)-2.802 G -.302(hould be set to)-2.802 F F3(EX_TEMPF)2.802 E(AIL)-.666 E F1 .302 -(if reco)2.802 F -.15(ve)-.15 G .301(ry is to be attempted by the).15 F -(higher le)117 249 Q -.15(ve)-.25 G 2.5(lc).15 G(ode.)-2.5 E F0 2.5 -(6.3.4. Queueing)102 273 R(Function)2.5 E F1 .782(The routine)142 289.2 -R F2(shouldqueue)3.282 E F1 .783 -(is called to decide if a message should be queued or processed)3.283 F -(immediately)117 301.2 Q 6.619(.T)-.65 G 1.618 -(ypically this compares the message priority to the current load a) --7.419 F -.15(ve)-.2 G 4.118(rage. The).15 F(def)117 313.2 Q -(ault de\214nition is:)-.1 E(bool)157 329.4 Q(shouldqueue\(pri, ctime\)) -157 341.4 Q(long pri;)175 353.4 Q(time_t ctime;)175 365.4 Q({)157 377.4 -Q(if \(CurrentLA < QueueLA\))175 389.4 Q(return \(F)193 401.4 Q(ALSE\);) --.74 E(return \(pri > \(QueueF)175 413.4 Q -(actor / \(CurrentLA \255 QueueLA + 1\)\)\);)-.15 E(})157 425.4 Q 2.062 -(If the current load a)117 441.6 R -.15(ve)-.2 G 2.062(rage \(global v) -.15 F(ariable)-.25 E F2(Curr)4.562 E(entLA)-.37 E F1 4.562(,w)C 2.062 -(hich is set before this function is)-4.562 F 1.058 -(called\) is less than the lo)117 453.6 R 3.558(wt)-.25 G 1.058 -(hreshold load a)-3.558 F -.15(ve)-.2 G 1.058(rage \(option).15 F F0(x) -3.557 E F1 3.557(,v)C(ariable)-3.807 E F2(QueueLA)3.557 E F1(\),)A F2 -(shouldqueue)3.557 E F1(returns)117 465.6 Q F3 -.666(FA)2.586 G(LSE).666 -E F1 .086(immediately \(that is, it should)2.586 F F2(not)2.586 E F1 -2.586(queue\). If)2.586 F .086(the current load a)2.586 F -.15(ve)-.2 G -.087(rage e).15 F .087(xceeds the)-.15 F .588(high threshold load a)117 -477.6 R -.15(ve)-.2 G .588(rage \(option).15 F F0(X)3.087 E F1 3.087(,v) -C(ariable)-3.337 E F2(RefuseLA)3.087 E F1(\),)A F2(shouldqueue)3.087 E -F1(returns)3.087 E F3(TR)3.087 E(UE)-.36 E F1(immedi-)3.087 E(ately)117 -489.6 Q 7.125(.O)-.65 G 2.125 -(therwise, it computes the function based on the message priority)-7.125 -F 4.626(,t)-.65 G 2.126(he queue f)-4.626 F(actor)-.1 E(\(option)117 -501.6 Q F0(q)2.5 E F1 2.5(,g)C(lobal v)-2.5 E(ariable)-.25 E F2(QueueF) -2.5 E(actor)-.75 E F1(\), and the current and threshold load a)A -.15 -(ve)-.2 G(rages.).15 E 1.067(An implementation wishing to tak)142 517.8 -R 3.567(et)-.1 G 1.066 -(he actual age of the message into account can also)-3.567 F 1.41 -(use the)117 529.8 R F2(ctime)3.91 E F1(parameter)3.91 E 3.91(,w)-.4 G -1.41(hich is the time that the message w)-3.91 F 1.41 -(as \214rst submitted to)-.1 F F2(sendmail)3.91 E F1(.)A .929 -(Note that the)117 541.8 R F2(pri)3.428 E F1 .928(parameter is already weighted by the number of times the message has been) -3.428 F .395(tried \(although this tends to lo)117 553.8 R .395 -(wer the priority of the message with time\); the e)-.25 F .395 -(xpectation is that)-.15 F(the)117 565.8 Q F2(ctime)2.674 E F1 -.1(wo) -2.674 G .174 -(uld be used as an \231escape clause\232 to ensure that messages are e) -.1 F -.15(ve)-.25 G .174(ntually processed.).15 F F0 2.5 -(6.3.5. Refusing)102 589.8 R(Incoming SMTP Connections)2.5 E F1 1.148 -(The function)142 606 R F2 -.37(re)3.648 G(fuseconnections).37 E F1 -(returns)3.648 E F3(TR)3.648 E(UE)-.36 E F1 1.148 -(if incoming SMTP connections should be)3.648 F 3.564(refused. The)117 -618 R 1.063(current implementation is based e)3.563 F(xclusi)-.15 E -.15 -(ve)-.25 G 1.063(ly on the current load a).15 F -.15(ve)-.2 G 1.063 -(rage and the).15 F(refuse load a)117 630 Q -.15(ve)-.2 G -(rage option \(option).15 E F0(X)2.5 E F1 2.5(,g)C(lobal v)-2.5 E -(ariable)-.25 E F2(RefuseLA)2.5 E F1(\):)A(bool)157 646.2 Q -(refuseconnections\(\))157 658.2 Q({)157 670.2 Q -(return \(CurrentLA >= RefuseLA\);)175 682.2 Q(})157 694.2 Q 2.5(Am)117 -710.4 S(ore cle)-2.5 E -.15(ve)-.25 G 2.5(ri).15 G -(mplementation could look at more system resources.)-2.5 E EP -%%Page: 69 65 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-69)195.86 E 2.5(6.3.6. Load)102 96 R -.6 -1(Av e)2.5 H -(rage Computation)1 E/F1 10/Times-Roman@0 SF .243(The routine)142 112.2 -R/F2 10/Times-Italic@0 SF -.1(ge)2.743 G(tla).1 E F1 .243 -(returns the current load a)2.743 F -.15(ve)-.2 G .243 -(rage \(as a rounded inte).15 F 2.743(ger\). The)-.15 F(distrib)2.744 E -(ution)-.2 E 1.157(includes se)117 124.2 R -.15(ve)-.25 G 1.157 -(ral possible implementations.).15 F 1.157(If you are porting to a ne) -6.157 F 3.657(we)-.25 G -.4(nv)-3.657 G 1.157(ironment you may).4 F -(need to add some ne)117 138.2 Q 2.5(wt)-.25 G(weaks.)-2.5 E/F3 7 -/Times-Roman@0 SF(27)-4 I F0 2.5(6.4. Con\214guration)87 162.2 R(in sr) -2.5 E(c/daemon.c)-.18 E F1 .4(The \214le)127 178.4 R F2(sr)2.9 E -(c/daemon.c)-.37 E F1 .4 -(contains a number of routines that are dependent on the local netw)2.9 -F(ork-)-.1 E(ing en)102 190.4 Q 2.5(vironment. The)-.4 F -.15(ve)2.5 G -(rsion supplied assumes you ha).15 E .3 -.15(ve B)-.2 H(SD style sock) -.15 E(ets.)-.1 E 2.16(In pre)127 206.6 R 2.16 -(vious releases, we recommended that you modify the routine)-.25 F F2 -(maphostname)4.66 E F1 2.16(if you)4.66 F -.1(wa)102 218.6 S 1.918 -(nted to generalize).1 F F0($[)4.418 E F1(...)4.418 E F0($])4.418 E F1 -4.418(lookups. W)4.418 F 4.418(en)-.8 G 2.418 -.25(ow r)-4.418 H 1.918 -(ecommend that you create a ne).25 F 4.419(wk)-.25 G -.15(ey)-4.519 G -1.919(ed map).15 F(instead.)102 230.6 Q F0 2.5(7. A)72 254.6 R(CKNO)-.55 -E(WLEDGEMENTS)-.5 E F1(I')112 270.8 Q 2.037 -.15(ve w)-.5 H(ork).05 E -1.737(ed on)-.1 F F2(sendmail)4.237 E F1 1.737(for man)4.237 F 4.237(yy) --.15 G 1.737(ears, and man)-4.237 F 4.237(ye)-.15 G(mplo)-4.237 E 1.737 -(yers ha)-.1 F 2.037 -.15(ve b)-.2 H 1.737(een remarkably patient).15 F -.403(about letting me w)87 282.8 R .403(ork on a lar)-.1 F .403 -(ge project that w)-.18 F .404(as not part of my of)-.1 F .404 -(\214cial job)-.25 F 5.404(.T)-.4 G .404(his includes time on the)-5.404 -F .282(INGRES Project at the Uni)87 294.8 R -.15(ve)-.25 G .282 -(rsity of California at Berk).15 F(ele)-.1 E 1.582 -.65(y, a)-.15 H -2.782(tB).65 G .282(ritton Lee, and ag)-2.782 F .281(ain on the Mammoth) --.05 F(and T)87 306.8 Q(itan Projects at Berk)-.35 E(ele)-.1 E -.65(y.) --.15 G .789(Much of the second w)112 323 R -2.25 -.2(av e)-.1 H .789 -(of impro)3.489 F -.15(ve)-.15 G .789(ments resulting in v).15 F .79 -(ersion 8.1 should be credited to Bryan)-.15 F .545 -(Costales of the International Computer Science Institute.)87 335 R .545 -(As he passed me drafts of his book on)5.545 F F2(send-)3.045 E(mail)87 -347 Q F1 2.5(Iw)2.5 G(as inspired to start w)-2.6 E(orking on things ag) --.1 E 2.5(ain. Bryan)-.05 F -.1(wa)2.5 G 2.5(sa).1 G(lso a)-2.5 E -.25 -(va)-.2 G(ilable to bounce ideas of).25 E 2.5(fo)-.25 G(f.)-2.5 E(Gre) -112 363.2 Q .667(gory Neil Shapiro of W)-.15 F .668 -(orchester Polytechnic Institute has become instrumental in all phases) --.8 F(of)87 375.2 Q F2(sendmail)3.1 E F1 .6(support and de)3.1 F -.15 -(ve)-.25 G .6(lopment, and w).15 F .599(as lar)-.1 F .599 -(gely responsible for getting v)-.18 F .599(ersions 8.8 and 8.9 out)-.15 -F(the door)87 387.2 Q(.)-.55 E(Man)112 403.4 Q 2.856 -.65(y, m)-.15 H -(an).65 E 4.056(yp)-.15 G 1.556(eople contrib)-4.056 F 1.556 -(uted chunks of code and ideas to)-.2 F F2(sendmail)4.056 E F1 6.556(.I) -C 4.056(th)-6.556 G 1.557(as pro)-4.056 F -.15(ve)-.15 G 4.057(nt).15 G -4.057(ob)-4.057 G 4.057(ea)-4.057 G .464(group netw)87 415.4 R .464 -(ork ef)-.1 F 2.964(fort. V)-.25 F .464(ersion 8 in particular w)-1.11 F -.463(as a group project.)-.1 F .463(The follo)5.463 F .463 -(wing people made notable)-.25 F(contrib)87 427.4 Q(utions:)-.2 E -(John Beck, He)127 443.6 Q(wlett-P)-.25 E(ackard & Sun Microsystems)-.15 -E -.25(Ke)127 455.6 S(ith Bostic, CSRG, Uni).25 E -.15(ve)-.25 G -(rsity of California, Berk).15 E(ele)-.1 E(y)-.15 E(Andre)127 467.6 Q -2.5(wC)-.25 G(heng, Sun Microsystems)-2.5 E(Michael J. Corrig)127 479.6 -Q(an, Uni)-.05 E -.15(ve)-.25 G(rsity of California, San Die).15 E(go) --.15 E -(Bryan Costales, International Computer Science Institute & InfoBeat)127 -491.6 Q -.15(Pa)127 503.6 S -.5(..)-4.402 -6 O 2.5(r\().552 6 O -(Pell\) Emanuelsson)-2.5 E(Craig Ev)127 515.6 Q(erhart, T)-.15 E -(ransarc Corporation)-.35 E(Per Hedeland, Ericsson)127 527.6 Q -.8(To) -127 539.6 S 2.5(mI).8 G -.25(va)-2.5 G 2.5(rH).25 G(elbekkmo, Norwe)-2.5 -E(gian School of Economics)-.15 E -(Kari Hurtta, Finnish Meteorological Institute)127 551.6 Q -(Allan E. Johannesen, WPI)127 563.6 Q(Jonathan Kamens, OpenV)127 575.6 Q -(ision T)-.6 E(echnologies, Inc.)-.7 E -.8(Ta)127 587.6 S -(kahiro Kanbe, Fuji Xerox Information Systems Co., Ltd.).8 E -(Brian Kantor)127 599.6 Q 2.5(,U)-.4 G(ni)-2.5 E -.15(ve)-.25 G -(rsity of California, San Die).15 E(go)-.15 E(John K)127 611.6 Q(ennedy) --.25 E 2.5(,C)-.65 G(al State Uni)-2.5 E -.15(ve)-.25 G(rsity).15 E 2.5 -(,C)-.65 G(hico)-2.5 E(Murray S. K)127 623.6 Q(uchera)-.15 E(wy)-.15 E -2.5(,H)-.65 G(ookUp Communication Corp.)-2.5 E(Bruce Lilly)127 635.6 Q -2.5(,S)-.65 G(on)-2.5 E 2.5(yU)-.15 G(.S.)-2.5 E(Karl London)127 647.6 Q -(Motonori Nakamura, Ritsumeikan Uni)127 659.6 Q -.15(ve)-.25 G -(rsity & K).15 E(yoto Uni)-.25 E -.15(ve)-.25 G(rsity).15 E -(John Gardiner Myers, Carne)127 671.6 Q(gie Mellon Uni)-.15 E -.15(ve) --.25 G(rsity).15 E .32 LW 76 681.2 72 681.2 DL 80 681.2 76 681.2 DL 84 -681.2 80 681.2 DL 88 681.2 84 681.2 DL 92 681.2 88 681.2 DL 96 681.2 92 -681.2 DL 100 681.2 96 681.2 DL 104 681.2 100 681.2 DL 108 681.2 104 -681.2 DL 112 681.2 108 681.2 DL 116 681.2 112 681.2 DL 120 681.2 116 -681.2 DL 124 681.2 120 681.2 DL 128 681.2 124 681.2 DL 132 681.2 128 -681.2 DL 136 681.2 132 681.2 DL 140 681.2 136 681.2 DL 144 681.2 140 -681.2 DL 148 681.2 144 681.2 DL 152 681.2 148 681.2 DL 156 681.2 152 -681.2 DL 160 681.2 156 681.2 DL 164 681.2 160 681.2 DL 168 681.2 164 -681.2 DL 172 681.2 168 681.2 DL 176 681.2 172 681.2 DL 180 681.2 176 -681.2 DL 184 681.2 180 681.2 DL 188 681.2 184 681.2 DL 192 681.2 188 -681.2 DL 196 681.2 192 681.2 DL 200 681.2 196 681.2 DL 204 681.2 200 -681.2 DL 208 681.2 204 681.2 DL 212 681.2 208 681.2 DL 216 681.2 212 -681.2 DL/F4 5/Times-Roman@0 SF(27)93.6 691.6 Q/F5 8/Times-Roman@0 SF -(If you do, please send updates to sendmail@Sendmail.ORG.)3.2 I EP -%%Page: 70 66 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-70 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF -(Neil Rick)127 96 Q(ert, Northern Illinois Uni)-.1 E -.15(ve)-.25 G -(rsity).15 E(Gre)127 108 Q(gory Neil Shapiro, WPI)-.15 E -(Eric Schnoebelen, Con)127 120 Q .3 -.15(vex C)-.4 H(omputer Corp.).15 E -(Eric W)127 132 Q(assenaar)-.8 E 2.5(,N)-.4 G -(ational Institute for Nuclear and High Ener)-2.5 E(gy Ph)-.18 E -(ysics, Amsterdam)-.05 E(Randall W)127 144 Q(inchester)-.4 E 2.5(,U)-.4 -G(ni)-2.5 E -.15(ve)-.25 G(rsity of Maryland).15 E(Christophe W)127 156 -Q(olfhugel, P)-.8 E(asteur Institute & Herv)-.15 E 2.5(eS)-.15 G -(chauer Consultants \(P)-2.5 E(aris\))-.15 E 3.219(Ia)87 172.2 S .719 -(pologize for an)-3.219 F .719(yone I ha)-.15 F 1.019 -.15(ve o)-.2 H -.719(mitted, misspelled, misattrib).15 F .719 -(uted, or otherwise missed.)-.2 F .72(At this point, I)5.72 F 1.093 -(suspect that at least a hundred people ha)87 184.2 R 1.393 -.15(ve c) --.2 H(ontrib).15 E 1.093(uted code, and man)-.2 F 3.592(ym)-.15 G 1.092 -(ore ha)-3.592 F 1.392 -.15(ve c)-.2 H(ontrib).15 E 1.092(uted ideas,) --.2 F 1.533(comments, and encouragement.)87 196.2 R(I')6.534 E 1.834 --.15(ve t)-.5 H 1.534(ried to list them in the RELEASE_NO).15 F 1.534 -(TES in the distrib)-.4 F(ution)-.2 E(directory)87 208.2 Q 5(.I)-.65 G -(appreciate their contrib)-2.5 E(ution as well.)-.2 E .743 -(Special thanks are reserv)112 224.4 R .743(ed for Michael Corrig)-.15 F -.742(an and Christophe W)-.05 F .742(olfhugel, who besides being)-.8 F --.1(wo)87 236.4 S 2.1(nderful guinea pigs and contrib).1 F 2.1(utors ha) --.2 F 2.4 -.15(ve a)-.2 H 2.1(lso consented to be added to the `).15 F -(`sendmail@Send-)-.74 E(mail.ORG')87 248.4 Q 3.611('l)-.74 G 1.111 -(ist and, by answering the b)-3.611 F 1.111 -(ulk of the questions sent to that list, ha)-.2 F 1.41 -.15(ve f)-.2 H -1.11(reed me up to do).15 F(other w)87 260.4 Q(ork.)-.1 E EP -%%Page: 71 67 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 12/Times-Bold@0 SF 3(APPENDIX A)257.172 98.4 R(COMMAND LINE FLA) -224.832 141.6 Q(GS)-.66 E/F1 10/Times-Roman@0 SF(Ar)97 201 Q -(guments must be presented with \215ags before addresses.)-.18 E -(The \215ags are:)5 E<ad62>72 217.2 Q/F2 10/Times-Italic@0 SF(x)A F1 -(Set operation mode to)56.92 E F2(x)2.5 E F1 5(.O)C(peration modes are:) --5 E 12.22(mD)184 233.4 S(eli)-12.22 E -.15(ve)-.25 G 2.5(rm).15 G -(ail \(def)-2.5 E(ault\))-.1 E 16.11(sS)184 245.4 S -(peak SMTP on input side)-16.11 E 8.06(a\207 `)184 257.4 R -.8(`A)-.74 G -(rpanet').8 E 2.5('m)-.74 G(ode \(get en)-2.5 E -.15(ve)-.4 G -(lope sender information from header\)).15 E 15(dR)184 269.4 S -(un as a daemon in background)-15 E 12.78(DR)184 281.4 S -(un as a daemon in fore)-12.78 E(ground)-.15 E 17.22(tR)184 293.4 S -(un in test mode)-17.22 E 15(vJ)184 305.4 S(ust v)-15 E -(erify addresses, don')-.15 E 2.5(tc)-.18 G(ollect or deli)-2.5 E -.15 -(ve)-.25 G(r).15 E 17.22(iI)184 317.4 S(nitialize the alias database) --17.22 E 15(pP)184 329.4 S(rint the mail queue)-15 E<ad42>72 349.8 Q F2 -(type)A F1(Indicate body type.)43.03 E<ad43>72 366 Q F2(\214le)A F1 .946 -(Use a dif)47.47 F .946(ferent con\214guration \214le.)-.25 F F2 -(Sendmail)5.946 E F1 .946(runs as the in)3.446 F -.2(vo)-.4 G .946 -(king user \(rather than root\)).2 F(when this \215ag is speci\214ed.) -144 378 Q<ad64>72 394.2 Q F2(le)A(vel)-.15 E F1(Set deb)42.63 E -(ugging le)-.2 E -.15(ve)-.25 G(l.).15 E<ad66>72 410.4 Q F2(addr)2.5 E -F1(The sender')41.64 E 2.5(sm)-.55 G(achine address is)-2.5 E F2(addr) -2.5 E F1(.)A<ad46>72 426.6 Q F2(name)2.5 E F1 -(Sets the full name of this user to)36.64 E F2(name)2.5 E F1(.)A<ad68>72 -442.8 Q F2(cnt)2.5 E F1 .726(Sets the \231hop count\232 to)46.64 F F2 -(cnt)3.226 E F1 5.725(.T)C .725 -(his represents the number of times this message has been)-5.725 F .02 -(processed by)144 454.8 R F2(sendmail)2.52 E F1 .02(\(to the e)2.52 F -.02(xtent that it is supported by the underlying netw)-.15 F(orks\).)-.1 -E F2(Cnt)5.02 E F1 1.521(is incremented during processing, and if it reaches MAXHOP \(currently 30\)) -144 466.8 R F2(sendmail)4.02 E F1(thro)144 478.8 Q(ws a)-.25 E -.1(wa) --.15 G 2.5(yt).1 G(he message with an error)-2.5 E(.)-.55 E 58.86 -(\255n Don')72 495 R 2.5(td)-.18 G 2.5(oa)-2.5 G(liasing or forw)-2.5 E -(arding.)-.1 E<ad4e>72 511.2 Q F2(noti\214cations)2.5 E F1 -.8(Ta)7.19 G -3.127(ga).8 G .627(ll addresses being sent as w)-3.127 F .628 -(anting the indicated)-.1 F F2(noti\214cations)3.128 E F1 3.128(,w)C -.628(hich consists of the)-3.128 F -.1(wo)144 523.2 S .474 -(rd \231NEVER\232 or a comma-separated list of \231SUCCESS\232, \231F).1 -F .474(AILURE\232, and \231DELA)-.74 F<599a>-1.05 E .86 -(for successful deli)144 535.2 R -.15(ve)-.25 G(ry).15 E 3.36(,f)-.65 G -.86(ailure, and a message that is stuck in a queue some)-3.46 F 3.36 -(where. The)-.25 F(def)144 547.2 Q(ault is \231F)-.1 E(AILURE,DELA)-.74 -E(Y\232.)-1.05 E<ad72>72 563.4 Q F2(addr)2.5 E F1(An obsolete form of) -41.64 E/F3 10/Times-Bold@0 SF<ad66>2.5 E F1(.)A<ad6f>72 579.6 Q F2 1.666 -(xv)C(alue)-1.666 E F1(Set option)33.594 E F2(x)2.5 E F1 -(to the speci\214ed)2.5 E F2(value)2.5 E F1 5(.T)C -(hese options are described in Section 5.6.)-5 E<ad4f>72 595.8 Q F2 -(option)A F3(=)A F2(value)A F1(Set)6.22 E F2(option)5.174 E F1 2.674 -(to the speci\214ed)5.174 F F2(value)5.174 E F1 2.674 -(\(for long form option names\).)5.174 F 2.673(These options are)7.674 F -(described in Section 5.6.)144 607.8 Q<ad4d>72 624 Q F2 1.666(xv)C -27.204(alue Set)-1.666 F(macr)2.5 E 2.5(oxt)-.45 G 2.5(ot)-2.5 G -(he speci\214ed value)-2.5 E(.)-.15 E F1<ad70>72 640.2 Q F2(pr)A(otocol) --.45 E F1 .4(Set the sending protocol.)27.92 F .401 -(Programs are encouraged to set this.)5.4 F .401 -(The protocol \214eld can be)5.401 F .115(in the form)144 652.2 R F2(pr) -2.615 E(otocol)-.45 E F3(:)A F2(host)A F1 .114 -(to set both the sending protocol and sending host.)2.615 F -.15(Fo) -5.114 G 2.614(re).15 G(xample,)-2.764 E 2.147(\231\255pUUCP:uunet\232 sets the sending protocol to UUCP and the sending host to uunet.) -144 664.2 R .974(\(Some e)144 676.2 R .974 -(xisting programs use \255oM to set the r and s macros; this is equi) --.15 F -.25(va)-.25 G .973(lent to using).25 F .32 LW 76 685.8 72 685.8 -DL 80 685.8 76 685.8 DL 84 685.8 80 685.8 DL 88 685.8 84 685.8 DL 92 -685.8 88 685.8 DL 96 685.8 92 685.8 DL 100 685.8 96 685.8 DL 104 685.8 -100 685.8 DL 108 685.8 104 685.8 DL 112 685.8 108 685.8 DL 116 685.8 112 -685.8 DL 120 685.8 116 685.8 DL 124 685.8 120 685.8 DL 128 685.8 124 -685.8 DL 132 685.8 128 685.8 DL 136 685.8 132 685.8 DL 140 685.8 136 -685.8 DL 144 685.8 140 685.8 DL 148 685.8 144 685.8 DL 152 685.8 148 -685.8 DL 156 685.8 152 685.8 DL 160 685.8 156 685.8 DL 164 685.8 160 -685.8 DL 168 685.8 164 685.8 DL 172 685.8 168 685.8 DL 176 685.8 172 -685.8 DL 180 685.8 176 685.8 DL 184 685.8 180 685.8 DL 188 685.8 184 -685.8 DL 192 685.8 188 685.8 DL 196 685.8 192 685.8 DL 200 685.8 196 -685.8 DL 204 685.8 200 685.8 DL 208 685.8 204 685.8 DL 212 685.8 208 -685.8 DL 216 685.8 212 685.8 DL/F4 8/Times-Roman@0 SF(\207Deprecated.) -93.6 697.8 Q F3(Sendmail Installation and Operation Guide)72 756 Q -(SMM:08-71)195.86 E EP -%%Page: 72 68 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-72 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF(\255p.\)) -144 96 Q<ad71>72 112.2 Q/F2 10/Times-Italic@0 SF(time)A F1 -.35(Tr)44.14 -G 3.167(yt).35 G 3.167(op)-3.167 G .667(rocess the queued up mail.) --3.167 F .667(If the time is gi)5.667 F -.15(ve)-.25 G .667(n, a).15 F -F2(sendmail)3.167 E F1 .667(will run through the)3.167 F -(queue at the speci\214ed interv)144 124.2 Q(al to deli)-.25 E -.15(ve) --.25 G 2.5(rq).15 G(ueued mail; otherwise, it only runs once.)-2.5 E -<ad71>72 140.4 Q F2(Xstring)A F1 .313 -(Run the queue once, limiting the jobs to those matching)31.91 F F2 -(Xstring)2.812 E F1 5.312(.T)C .312(he k)-5.312 F .612 -.15(ey l)-.1 H -(etter).15 E F2(X)2.812 E F1 .312(can be)2.812 F F0(I)144 152.4 Q F1 .67 -(to limit based on queue identi\214er)3.17 F(,)-.4 E F0(R)3.17 E F1 .671 -(to limit based on recipient, or)3.17 F F0(S)3.171 E F1 .671 -(to limit based on)3.171 F(sender)144 164.4 Q 6.054(.A)-.55 G 1.054(particular queued job is accepted if one of the corresponding addresses con-) --2.5 F .032(tains the indicated)144 176.4 R F2(string)2.533 E F1 5.033 -(.M)C(ultiple)-5.033 E F2(\255qX)2.533 E F1 .033 -(\215ags are permitted, with items with the same k)2.533 F -.15(ey)-.1 G -(letter \231or'ed\232 together)144 188.4 Q 2.5(,a)-.4 G -(nd items with dif)-2.5 E(ferent k)-.25 E .3 -.15(ey l)-.1 H -(etters \231and'ed\232 together).15 E(.)-.55 E(\255R ret)72 204.6 Q -1.687(What information you w)46.64 F 1.687 -(ant returned if the message bounces;)-.1 F F2 -.37(re)4.187 G(t).37 E -F1 1.687(can be \231HDRS\232 for)4.187 F .877 -(headers only or \231FULL\232 for headers plus body)144 216.6 R 5.877 -(.T)-.65 G .878(his is a request only; the other end is)-5.877 F -(not required to honor the parameter)144 228.6 Q(.)-.55 E 61.08 -(\255t Read)72 244.8 R .752(the header for \231T)3.252 F .752 -(o:\232, \231Cc:\232, and \231Bcc:\232 lines, and send to e)-.8 F -.15 -(ve)-.25 G .752(ryone listed in those).15 F 2.539(lists. The)144 256.8 R -.039(\231Bcc:\232 line will be deleted before sending.)2.539 F(An)5.039 -E 2.539(ya)-.15 G .04(ddresses in the ar)-2.539 F .04(gument v)-.18 F -(ec-)-.15 E(tor will be deleted from the send list.)144 268.8 Q 56.64 -(\255U Indicate)72 285 R 1.029 -(that this is an initial User Agent submission.)3.529 F 1.028 -(In future releases, sendmail may)6.028 F 1.12 -(complain about syntactically in)144 297 R -.25(va)-.4 G 1.121 -(lid messages rather than \214xing them when this \215ag is).25 F -(not set.)144 309 Q(\255V en)72 325.2 Q 32.32(vid The)-.4 F(indicated) -3.18 E F2(en)3.18 E(vid)-.4 E F1 .68(is passed with the en)3.18 F -.15 -(ve)-.4 G .679(lope of the message and returned if the mes-).15 F -(sage bounces.)144 337.2 Q<ad58>72 353.4 Q F2(lo)2.5 E(g\214le)-.1 E F1 -.724(Log all traf)31.74 F .724(\214c in and out of)-.25 F F2(sendmail) -3.225 E F1 .725(in the indicated)3.225 F F2(lo)3.225 E(g\214le)-.1 E F1 -.725(for deb)3.225 F .725(ugging mailer prob-)-.2 F 2.5(lems. This)144 -365.4 R(produces a lot of data v)2.5 E -(ery quickly and should be used sparingly)-.15 E(.)-.65 E .638 -(There are a number of options that may be speci\214ed as primiti)97 -381.6 R .937 -.15(ve \215)-.25 H 3.137(ags. These).15 F .637 -(are the e, i, m, and v)3.137 F 2.5(options. Also,)72 393.6 R -(the f option may be speci\214ed as the)2.5 E F0<ad73>2.5 E F1(\215ag.) -2.5 E EP -%%Page: 73 69 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 12/Times-Bold@0 SF 3(APPENDIX B)250.002 98.4 R -.12(QU)220.29 141.6 -S(EUE FILE FORMA).12 E(TS)-1.14 E/F1 10/Times-Roman@0 SF .291 -(This appendix describes the format of the queue \214les.)97 201 R .292 -(These \214les li)5.292 F .592 -.15(ve i)-.25 H 2.792(nt).15 G .292 -(he directory de\214ned by the)-2.792 F/F2 10/Times-Bold@0 SF(Q)72 213 Q -F1(option in the)2.5 E/F3 10/Times-Italic@0 SF(sendmail.cf)2.5 E F1 -(\214le, usually)2.5 E F3(/var/spool/mqueue)2.5 E F1(or)2.5 E F3 -(/usr/spool/mqueue)2.5 E F1(.)A .23(All queue \214les ha)97 229.2 R .53 --.15(ve t)-.2 H .23(he name).15 F F3(x)2.73 E F2(f)1.666 E F3(AAA99999)A -F1(where)2.73 E F3(AAA99999)2.73 E F1 .23(is the)2.73 F F3(id)2.73 E F1 -.229(for this message and the)2.73 F F3(x)2.729 E F1 .229(is a)2.729 F -3.601(type. The)72 241.2 R 1.101(\214rst letter of the id encodes the hour of the day that the message w) -3.601 F 1.101(as recei)-.1 F -.15(ve)-.25 G 3.601(db).15 G 3.601(yt) --3.601 G 1.101(he system)-3.601 F .552 -(\(with A being the hour between midnight and 1:00AM\).)72 253.2 R .552 -(All \214les with the same id collecti)5.552 F -.15(ve)-.25 G .551 -(ly de\214ne one).15 F(message.)72 265.2 Q(The types are:)97 281.4 Q 31 -(dT)72 297.6 S(he data \214le.)-31 E(The message body \(e)5 E -(xcluding the header\) is k)-.15 E(ept in this \214le.)-.1 E 31(qT)72 -313.8 S(he queue control \214le.)-31 E -(This \214le contains the information necessary to process the job)5 E -(.)-.4 E 33.22(tA)72 330 S .344(temporary \214le.)-30.376 F .344 -(These are an image of the)5.344 F F2(qf)2.844 E F1 .344 -(\214le when it is being reb)2.844 F 2.845(uilt. It)-.2 F .345 -(should be renamed)2.845 F(to a)108 342 Q F2(qf)2.5 E F1(\214le v)2.5 E -(ery quickly)-.15 E(.)-.65 E 31(xA)72 358.2 S .567(transcript \214le, e) --27.933 F .567(xisting during the life of a session sho)-.15 F .566 -(wing e)-.25 F -.15(ve)-.25 G .566(rything that happens during that).15 -F(session.)108 370.2 Q(The)97 386.4 Q F2(qf)3.333 E F1 .833 -(\214le is structured as a series of lines each be)3.333 F .834 -(ginning with a code letter)-.15 F 5.834(.T)-.55 G .834 -(he lines are as fol-)-5.834 F(lo)72 398.4 Q(ws:)-.25 E 28.78(VT)72 -414.6 S .82(he v)-28.78 F .82 -(ersion number of the queue \214le format, used to allo)-.15 F 3.319(wn) --.25 G -.25(ew)-3.319 G F3(sendmail)3.569 E F1 .819 -(binaries to read queue)3.319 F .003(\214les created by older v)108 -426.6 R 2.504(ersions. Def)-.15 F .004(aults to v)-.1 F .004 -(ersion zero.)-.15 F .004 -(Must be the \214rst line of the \214le if present.)5.004 F 28.78(HA)72 -442.8 S .33(header de\214nition.)-25.95 F .33(There may be an)5.33 F -2.829(yn)-.15 G .329(umber of these lines.)-2.829 F .329 -(The order is important: the)5.329 F 2.829(yr)-.15 G(epre-)-2.829 E .046 -(sent the order in the \214nal message.)108 454.8 R .046 -(These use the same syntax as header de\214nitions in the con\214gu-) -5.046 F(ration \214le.)108 466.8 Q 29.33(CT)72 483 S .575 -(he controlling address.)-29.33 F .575 -(The syntax is \231localuser:aliasname\232.)5.575 F .575 -(Recipient addresses follo)5.575 F .575(wing this)-.25 F 2.814 -(line will be \215agged so that deli)108 495 R -.15(ve)-.25 G 2.814 -(ries will be run as the).15 F F3(localuser)5.314 E F1 2.814 -(\(a user name from the)5.314 F .562(/etc/passwd \214le\);)108 507 R F3 -(aliasname)3.062 E F1 .561(is the name of the alias that e)3.062 F .561 -(xpanded to this address \(used for print-)-.15 F(ing messages\).)108 -519 Q 28.78(QT)72 535.2 S .797(he `)-28.78 F .797(`original recipient') --.74 F .798 -(', speci\214ed by the ORCPT= \214eld in an ESMTP transaction.)-.74 F -.798(Used e)5.798 F(xclu-)-.15 E(si)108 547.2 Q -.15(ve)-.25 G -(ly for Deli).15 E -.15(ve)-.25 G(ry Status Noti\214cations.).15 E -(It applies only to the immediately follo)5 E(wing `R' line.)-.25 E -29.33(RA)72 563.4 S .705(recipient address.)-26.125 F .705 -(This will normally be completely aliased, b)5.705 F .705 -(ut is actually realiased when the)-.2 F .492(job is processed.)108 -575.4 R .492(There will be one line for each recipient.)5.492 F -1.11 -(Ve)5.492 G .493(rsion 1 qf \214les also include a lead-)1.11 F .689(ing colon-terminated list of \215ags, which can be `S' to return a message on successful \214nal deli) -108 587.4 R(v-)-.25 E(ery)108 599.4 Q 3.327(,`)-.65 G .828 -(F' to return a message on f)-3.327 F .828 -(ailure, `D' to return a message if the message is delayed, `B' to)-.1 F -.941(indicate that the body should be returned, `N' to suppress returning the body) -108 611.4 R 3.44(,a)-.65 G .94(nd `P' to declare)-3.44 F(this as a `)108 -623.4 Q(`primary')-.74 E 2.5('\()-.74 G -(command line or SMTP-session\) address.)-2.5 E 30.44(ST)72 639.6 S -(he sender address.)-30.44 E(There may only be one of these lines.)5 E -29.89(TT)72 655.8 S(he job creation time.)-29.89 E -(This is used to compute when to time out the job)5 E(.)-.4 E 30.44(PT) -72 672 S .113(he current message priority)-30.44 F 5.113(.T)-.65 G .113 -(his is used to order the queue.)-5.113 F .114(Higher numbers mean lo) -5.114 F .114(wer priori-)-.25 F 3.677(ties. The)108 684 R 1.176 -(priority changes as the message sits in the queue.)3.677 F 1.176 -(The initial priority depends on the)6.176 F -(message class and the size of the message.)108 696 Q 27.11(MA)72 712.2 -S 2.703(message. This)-24.407 F .203(line is printed by the)2.703 F F3 -(mailq)2.703 E F1 .204 -(command, and is generally used to store status infor)2.704 F(-)-.2 E -2.5(mation. It)108 724.2 R(can contain an)2.5 E 2.5(yt)-.15 G -.15(ex) --2.5 G(t.).15 E F2(Sendmail Installation and Operation Guide)72 756 Q -(SMM:08-73)195.86 E EP -%%Page: 74 70 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-74 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF 30.44(FF) -72 96 S .044(lag bits, represented as one letter per \215ag.)-30.44 F -.043(De\214ned \215ag bits are)5.043 F F0(r)2.543 E F1 .043 -(indicating that this is a response)2.543 F .142(message and)108 108 R -F0(w)2.642 E F1 .142(indicating that a w)2.642 F .143 -(arning message has been sent announcing that the mail has been)-.1 F -(delayed.)108 120 Q 28.78(NT)72 136.2 S(he total number of deli)-28.78 E --.15(ve)-.25 G(ry attempts.).15 E 28.78(KT)72 152.4 S -(he time \(as seconds since January 1, 1970\) of the last deli)-28.78 E --.15(ve)-.25 G(ry attempt.).15 E 32.67(IT)72 168.6 S .725 -(he i-number of the data \214le; this can be used to reco)-32.67 F -.15 -(ve)-.15 G 3.224(ry).15 G .724(our mail queue after a disastrous disk) --3.224 F(crash.)108 180.6 Q 31($A)72 196.8 S .829(macro de\214nition.) --27.671 F .829(The v)5.829 F .829 -(alues of certain macros \(as of this writing, only)-.25 F F0($r)3.33 E -F1(and)3.33 E F0($s)3.33 E F1 3.33(\)a)C .83(re passed)-3.33 F -(through to the queue run phase.)108 208.8 Q 29.33(BT)72 225 S .925 -(he body type.)-29.33 F .925(The remainder of the line is a te)5.925 F -.925(xt string de\214ning the body type.)-.15 F .924(If this \214eld is) -5.924 F .009(missing, the body type is assumed to be \231unde\214ned\232 and no special processing is attempted.) -108 237 R(Le)5.009 E -.05(ga)-.15 G(l).05 E -.25(va)108 249 S -(lues are \2317BIT\232 and \2318BITMIME\232.).25 E 28.78(OT)72 265.2 S -(he original MTS v)-28.78 E(alue \(from the ESMTP transaction\).)-.25 E --.15(Fo)5 G 2.5(rD).15 G(eli)-2.5 E -.15(ve)-.25 G 2.5(rS).15 G -(tatus Noti\214cations only)-2.5 E(.)-.65 E 29.89(ZT)72 281.4 S -(he original en)-29.89 E -.15(ve)-.4 G -(lope id \(from the ESMTP transaction\).).15 E -.15(Fo)5 G 2.5(rD).15 G -(eli)-2.5 E -.15(ve)-.25 G 2.5(rS).15 G(tatus Noti\214cations only)-2.5 -E(.)-.65 E 4.073(As an e)97 297.6 R 4.073(xample, the follo)-.15 F 4.072 -(wing is a queue \214le sent to \231eric@mammoth.Berk)-.25 F(ele)-.1 E --.65(y.)-.15 G 4.072(EDU\232 and).65 F(\231bostic@ok)72 311.6 Q(eef)-.1 -E(fe.CS.Berk)-.25 E(ele)-.1 E -.65(y.)-.15 G(EDU\232).65 E/F2 7 -/Times-Roman@0 SF(1)-4 I F1(:)4 I(P835771)112 327.8 Q(T404261372)112 -339.8 Q(Seric)112 351.8 Q(Ceric:sendmail@v)112 363.8 Q(angogh.CS.Berk) --.25 E(ele)-.1 E -.65(y.)-.15 G(EDU).65 E(Reric@mammoth.Berk)112 375.8 Q -(ele)-.1 E -.65(y.)-.15 G(EDU).65 E(Rbostic@ok)112 387.8 Q(eef)-.1 E -(fe.CS.Berk)-.25 E(ele)-.1 E -.65(y.)-.15 G(EDU).65 E -(H?P?Return-path: <o)112 399.8 Q(wner)-.25 E(-sendmail@v)-.2 E -(angogh.CS.Berk)-.25 E(ele)-.1 E -.65(y.)-.15 G(EDU>).65 E(HRecei)112 -411.8 Q -.15(ve)-.25 G(d: by v).15 E(angogh.CS.Berk)-.25 E(ele)-.1 E --.65(y.)-.15 G(EDU \(5.108/2.7\) id AAA06703;).65 E -(Fri, 17 Jul 1992 00:28:55 -0700)132 423.8 Q(HRecei)112 435.8 Q -.15(ve) --.25 G(d: from mail.CS.Berk).15 E(ele)-.1 E -.65(y.)-.15 G(EDU by v).65 -E(angogh.CS.Berk)-.25 E(ele)-.1 E -.65(y.)-.15 G(EDU \(5.108/2.7\)).65 E -(id AAA06698; Fri, 17 Jul 1992 00:28:54 -0700)132 447.8 Q(HRecei)112 -459.8 Q -.15(ve)-.25 G(d: from [128.32.31.21] by mail.CS.Berk).15 E(ele) --.1 E -.65(y.)-.15 G(EDU \(5.96/2.5\)).65 E -(id AA22777; Fri, 17 Jul 1992 03:29:14 -0400)132 471.8 Q(HRecei)112 -483.8 Q -.15(ve)-.25 G(d: by foo.bar).15 E(.baz.de \(5.57/Ultrix3.0-C\)) --.55 E(id AA22757; Fri, 17 Jul 1992 09:31:25 GMT)132 495.8 Q -(H?F?From: eric@foo.bar)112 507.8 Q(.baz.de \(Eric Allman\))-.55 E -(H?x?Full-name: Eric Allman)112 519.8 Q -(HMessage-id: <9207170931.AA22757@foo.bar)112 531.8 Q(.baz.de>)-.55 E -(HT)112 543.8 Q(o: sendmail@v)-.8 E(angogh.CS.Berk)-.25 E(ele)-.1 E -.65 -(y.)-.15 G(EDU).65 E(HSubject: this is an e)112 555.8 Q(xample message) --.15 E .658(This sho)72 572 R .658(ws the person who sent the message, the submission time \(in seconds since January 1, 1970\), the) --.25 F(message priority)72 584 Q 2.5(,t)-.65 G -(he message class, the recipients, and the headers for the message.)-2.5 -E .32 LW 76 669.2 72 669.2 DL 80 669.2 76 669.2 DL 84 669.2 80 669.2 DL -88 669.2 84 669.2 DL 92 669.2 88 669.2 DL 96 669.2 92 669.2 DL 100 669.2 -96 669.2 DL 104 669.2 100 669.2 DL 108 669.2 104 669.2 DL 112 669.2 108 -669.2 DL 116 669.2 112 669.2 DL 120 669.2 116 669.2 DL 124 669.2 120 -669.2 DL 128 669.2 124 669.2 DL 132 669.2 128 669.2 DL 136 669.2 132 -669.2 DL 140 669.2 136 669.2 DL 144 669.2 140 669.2 DL 148 669.2 144 -669.2 DL 152 669.2 148 669.2 DL 156 669.2 152 669.2 DL 160 669.2 156 -669.2 DL 164 669.2 160 669.2 DL 168 669.2 164 669.2 DL 172 669.2 168 -669.2 DL 176 669.2 172 669.2 DL 180 669.2 176 669.2 DL 184 669.2 180 -669.2 DL 188 669.2 184 669.2 DL 192 669.2 188 669.2 DL 196 669.2 192 -669.2 DL 200 669.2 196 669.2 DL 204 669.2 200 669.2 DL 208 669.2 204 -669.2 DL 212 669.2 208 669.2 DL 216 669.2 212 669.2 DL/F3 5 -/Times-Roman@0 SF(1)93.6 679.6 Q/F4 8/Times-Roman@0 SF .718(This e)3.2 J -.718(xample is contri)-.12 F -.12(ve)-.2 G 2.718(da).12 G .718 -(nd probably inaccurate for your en)-2.718 F 2.719(vironment. Glance) --.32 F -.12(ove)2.719 G 2.719(ri).12 G 2.719(tt)-2.719 G 2.719(og)-2.719 -G .719(et an idea; nothing can replace)-2.719 F(looking at what your o) -72 692.4 Q(wn system generates.)-.2 E EP -%%Page: 75 71 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 12/Times-Bold@0 SF 3(APPENDIX C)249.672 98.4 R(SUMMAR)198.282 141.6 -Q 3(YO)-.42 G 3(FS)-3 G(UPPOR)-3 E 3(TF)-.48 G(ILES)-3 E/F1 10 -/Times-Roman@0 SF 1.519(This is a summary of the support \214les that)97 -201 R/F2 10/Times-Italic@0 SF(sendmail)4.019 E F1 1.52 -(creates or generates.)4.019 F(Man)6.52 E 4.02(yo)-.15 G 4.02(ft)-4.02 G -1.52(hese can be)-4.02 F(changed by editing the sendmail.cf \214le; check there to \214nd the actual pathnames.) -72 213 Q(/usr/sbin/sendmail)72 229.2 Q(The binary of)144 241.2 Q F2 -(sendmail)2.5 E F1(.)A(/usr/bin/ne)72 257.4 Q -.1(wa)-.25 G(liases).1 E -3.735(Al)144 269.4 S 1.235 -(ink to /usr/sbin/sendmail; causes the alias database to be reb)-3.735 F -3.734(uilt. Running)-.2 F 1.234(this pro-)3.734 F -(gram is completely equi)144 281.4 Q -.25(va)-.25 G(lent to gi).25 E -(ving)-.25 E F2(sendmail)2.5 E F1(the)2.5 E/F3 10/Times-Bold@0 SF -(\255bi)2.5 E F1(\215ag.)2.5 E 13.38(/usr/bin/mailq Prints)72 297.6 R -3.702(al)3.702 G 1.202(isting of the mail queue.)-3.702 F 1.203 -(This program is equi)6.202 F -.25(va)-.25 G 1.203(lent to using the).25 -F F3(\255bp)3.703 E F1 1.203(\215ag to)3.703 F F2(sendmail)144 309.6 Q -F1(.)A 5.9(/etc/sendmail.cf The)72 325.8 R -(con\214guration \214le, in te)2.5 E(xtual form.)-.15 E -(/usr/lib/sendmail.hf)72 342 Q(The SMTP help \214le.)144 354 Q 7 -(/etc/sendmail.st A)72 370.2 R(statistics \214le; need not be present.) -2.5 E .89(/etc/sendmail.pid Created)72 386.4 R .318 -(in daemon mode; it contains the process id of the current SMTP daemon.) -2.818 F .318(If you)5.318 F 1.047(use this in scripts; use `)144 398.4 R -1.047(`head \2551')-.74 F 3.548('t)-.74 G 3.548(og)-3.548 G 1.048 -(et just the \214rst line; the second line contains the)-3.548 F .68 -(command line used to in)144 410.4 R -.2(vo)-.4 G .879 -.1(ke t).2 H -.679(he daemon, and later v).1 F .679(ersions of)-.15 F F2(sendmail) -3.179 E F1 .679(may add more)3.179 F(information to subsequent lines.) -144 422.4 Q 25.62(/etc/aliases The)72 438.6 R(te)2.5 E(xtual v)-.15 E -(ersion of the alias \214le.)-.15 E 13.12(/etc/aliases.db The)72 454.8 R -(alias \214le in)2.5 E F2(hash)2.5 E F1(\(3\) format.)1.666 E -(/etc/aliases.{pag,dir})72 471 Q(The alias \214le in)144 483 Q F2(ndbm) -2.5 E F1(\(3\) format.)1.666 E(/v)72 499.2 Q(ar/spool/mqueue)-.25 E -(The directory in which the mail queue and temporary \214les reside.)144 -511.2 Q(/v)72 527.4 Q(ar/spool/mqueue/qf*)-.25 E -(Control \(queue\) \214les for messages.)144 539.4 Q(/v)72 555.6 Q -(ar/spool/mqueue/df*)-.25 E(Data \214les.)144 567.6 Q(/v)72 583.8 Q -(ar/spool/mqueue/tf*)-.25 E -.7(Te)144 595.8 S(mporary v).7 E -(ersions of the qf \214les, used during queue \214le reb)-.15 E(uild.) --.2 E(/v)72 612 Q(ar/spool/mqueue/xf*)-.25 E 2.5(At)144 624 S -(ranscript of the current session.)-2.5 E F3 -(Sendmail Installation and Operation Guide)72 756 Q(SMM:08-75)195.86 E -EP -%%Page: 76 72 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-76 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF -(This page intentionally left blank;)256.225 300 Q -(replace it with a blank sheet for double-sided output.)218.6 312 Q EP -%%Page: 3 73 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-3)200.86 E/F1 12/Times-Roman@0 SF -1.116(TA)263.226 98.4 S -(BLE OF CONTENTS)1.116 E/F2 10/Times-Roman@0 SF 2.5(1. B)72 124.8 R -(ASIC INST)-.35 E(ALLA)-.93 E 1.18(TION ...............................................................................................................) --1.11 F(7)31 E 2.5(1.1. Compiling)87 139.2 R .43(Sendmail ..............................................................................................................) -2.5 F(7)31 E 2.5(1.1.1. T)102 153.6 R(weaking the Build In)-.8 E -.2(vo) --.4 G .19(cation .....................................................................................) -.2 F(7)31 E 2.5(1.1.2. Creating)102 168 R 2.5(aS)2.5 G -(ite Con\214guration File)-2.5 E 28.5(................................................................................ 7) -2.94 F 2.5(1.1.3. T)102 182.4 R(weaking the Mak)-.8 E 1.64(e\214le .................................................................................................) --.1 F(8)31 E 2.5(1.1.4. Compilation)102 196.8 R(and installation)2.5 E -28.5(........................................................................................ 8) -4.6 F 2.5(1.2. Con\214guration)87 211.2 R .99(Files ................................................................................................................) -2.5 F(8)31 E 2.5(1.3. Details)87 225.6 R(of Installation Files)2.5 E -23.5(................................................................................................... 10) -4.89 F 2.5(1.3.1. /usr/sbin/sendmail)102 240 R 23.5(......................................................................................................... 10) -2.66 F 2.5(1.3.2. /etc/sendmail.cf)102 254.4 R 23.5(............................................................................................................ 10) -4.9 F 2.5(1.3.3. /usr/bin/ne)102 268.8 R -.1(wa)-.25 G 2.19(liases .......................................................................................................) -.1 F(10)26 E 2.5(1.3.4. /usr/bin/hoststat)102 283.2 R 23.5(............................................................................................................ 10) -4.6 F 2.5(1.3.5. /usr/bin/pur)102 297.6 R 1.18(gestat ..........................................................................................................) --.18 F(10)26 E 2.5(1.3.6. /v)102 312 R 1.81(ar/spool/mqueue ........................................................................................................) --.25 F(10)26 E 2.5(1.3.7. /v)102 326.4 R .97(ar/spool/mqueue/.hoststat ..........................................................................................) --.25 F(11)26 E 2.5(1.3.8. /etc/aliases*)102 340.8 R 23.5(.................................................................................................................. 11) -4.62 F 2.5(1.3.9. /etc/rc)102 355.2 R(or /etc/init.d/sendmail)2.5 E 23.5 -(........................................................................................ 11) -3.23 F 2.5(1.3.10. /usr/lib/sendmail.hf)102 369.6 R 23.5(..................................................................................................... 11) -2.94 F 2.5(1.3.11. /etc/sendmail.st)102 384 R 23.5(........................................................................................................... 11) -3.5 F 2.5(1.3.12. /usr/bin/mailq)102 398.4 R 23.5(............................................................................................................. 13) -4.88 F 2.5(2. NORMAL)72 412.8 R(OPERA)2.5 E 1.56(TIONS .............................................................................................................) --1.11 F(13)26 E 2.5(2.1. The)87 427.2 R(System Log)2.5 E 23.5(.................................................................................................................... 13) -4.89 F 2.5(2.1.1. F)102 441.6 R 2.26(ormat ..........................................................................................................................) --.15 F(13)26 E 2.5(2.1.2. Le)102 456 R -.15(ve)-.25 G 2.24(ls ...........................................................................................................................) -.15 F(14)26 E 2.5(2.2. Dumping)87 470.4 R .72(State .......................................................................................................................) -2.5 F(14)26 E 2.5(2.3. The)87 484.8 R(Mail Queue)2.5 E 23.5(..................................................................................................................... 14) -2.96 F 2.5(2.3.1. Printing)102 499.2 R(the queue)2.5 E 23.5(......................................................................................................... 14) -2.67 F 2.5(2.3.2. F)102 513.6 R(orcing the queue)-.15 E 23.5(......................................................................................................... 14) -3.94 F 2.5(2.4. Disk)87 528 R(Based Connection Information)2.5 E 23.5(..................................................................................... 15) -3.79 F 2.5(2.5. The)87 542.4 R(Service Switch)2.5 E 23.5(................................................................................................................ 16) -2.68 F 2.5(2.6. The)87 556.8 R(Alias Database)2.5 E 23.5(................................................................................................................ 16) -2.69 F 2.5(2.6.1. Reb)102 571.2 R(uilding the alias database)-.2 E 23.5 -(....................................................................................... 17) -4.27 F 2.5(2.6.2. Potential)102 585.6 R .72(problems ........................................................................................................) -2.5 F(17)26 E 2.5(2.6.3. List)102 600 R -.25(ow)2.5 G 1.81(ners ...................................................................................................................) -.25 F(18)26 E 2.5(2.7. User)87 614.4 R(Information Database)2.5 E 23.5(.................................................................................................... 18) -2.7 F 2.5(2.8. Per)87 628.8 R(-User F)-.2 E(orw)-.15 E(arding \(.forw) --.1 E(ard Files\))-.1 E 23.5(................................................................................... 18) -4.09 F 2.5(2.9. Special)87 643.2 R(Header Lines)2.5 E 23.5(............................................................................................................. 18) -2.97 F 2.5(2.9.1. Errors-T)102 657.6 R 2.09(o: .....................................................................................................................) --.8 F(19)26 E 2.5(2.9.2. Apparently-T)102 672 R 2.09(o: .............................................................................................................) --.8 F(19)26 E 2.5(2.9.3. Precedence)102 686.4 R 23.5(.................................................................................................................... 19) -2.97 F 2.5(2.10. IDENT)87 700.8 R(Protocol Support)2.5 E 23.5(..................................................................................................... 19) -2.95 F 2.5(3. ARGUMENTS)72 715.2 R 23.5(............................................................................................................................... 20) -3.78 F EP -%%Page: 4 74 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 198.36(SMM:08-4 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF 2.5 -(3.1. Queue)87 96 R(Interv)2.5 E 1.55(al .......................................................................................................................) --.25 F(20)26 E 2.5(3.2. Daemon)87 110.4 R 1.29(Mode .......................................................................................................................) -2.5 F(20)26 E 2.5(3.3. F)87 124.8 R(orcing the Queue)-.15 E 23.5(................................................................................................................. 20) -4.22 F 2.5(3.4. Deb)87 139.2 R 1.76(ugging .............................................................................................................................) --.2 F(20)26 E 2.5(3.5. Changing)87 153.6 R(the V)2.5 E(alues of Options) --1.11 E 23.5(............................................................................................ 21) -3.23 F 2.5(3.6. T)87 168 R(rying a Dif)-.35 E -(ferent Con\214guration File)-.25 E 23.5(................................................................................... 21) -4.67 F 2.5(3.7. Logging)87 182.4 R -.35(Tr)2.5 G(af).35 E .5(\214c ......................................................................................................................) --.25 F(21)26 E 2.5(3.8. T)87 196.8 R(esting Con\214guration Files)-.7 E -23.5(................................................................................................... 22) -4.19 F 2.5(3.9. Persistent)87 211.2 R(Host Status Information)2.5 E 23.5 -(........................................................................................ 22) -3.5 F 2.5(4. TUNING)72 225.6 R 23.5(......................................................................................................................................... 22) -2.68 F 2.5(4.1. T)87 240 R 1.07(imeouts ................................................................................................................................) --.35 F(23)26 E 2.5(4.1.1. Queue)102 254.4 R(interv)2.5 E 2.1(al ..............................................................................................................) --.25 F(23)26 E 2.5(4.1.2. Read)102 268.8 R 1(timeouts ...............................................................................................................) -2.5 F(23)26 E 2.5(4.1.3. Message)102 283.2 R 1.56(timeouts .........................................................................................................) -2.5 F(24)26 E 2.5(4.2. F)87 297.6 R(orking During Queue Runs)-.15 E 23.5 -(................................................................................................. 25) -4.49 F 2.5(4.3. Queue)87 312 R .73(Priorities .....................................................................................................................) -2.5 F(25)26 E 2.5(4.4. Load)87 326.4 R .44(Limiting ........................................................................................................................) -2.5 F(25)26 E 2.5(4.5. Deli)87 340.8 R -.15(ve)-.25 G(ry Mode).15 E 23.5 -(....................................................................................................................... 26) -3.08 F 2.5(4.6. Log)87 355.2 R(Le)2.5 E -.15(ve)-.25 G 2.52(l.).15 G -23.5(.............................................................................................................................. 26) --2.52 F 2.5(4.7. File)87 369.6 R .72(Modes .............................................................................................................................) -2.5 F(27)26 E 2.5(4.7.1. T)102 384 R 2.5(os)-.8 G(uid or not to suid?) --2.5 E 23.5(................................................................................................. 27) -6.52 F 2.5(4.7.2. T)102 398.4 R(urning of)-.45 E 2.5(fs)-.25 G -(ecurity checks)-2.5 E 23.5(.......................................................................................... 27) -3.95 F 2.5(4.8. Connection)87 412.8 R 1.56(Caching ..............................................................................................................) -2.5 F(29)26 E 2.5(4.9. Name)87 427.2 R(Serv)2.5 E(er Access)-.15 E 23.5 -(.............................................................................................................. 29) -2.85 F 2.5(4.10. Mo)87 441.6 R(ving the Per)-.15 E(-User F)-.2 E(orw) --.15 E(ard Files)-.1 E 23.5(.................................................................................... 30) -3.84 F 2.5(4.11. Free)87 456 R 1.85(Space ...........................................................................................................................) -2.5 F(31)26 E 2.5(4.12. Maximum)87 470.4 R(Message Size)2.5 E 23.5(..................................................................................................... 31) -4.62 F 2.5(4.13. Pri)87 484.8 R -.25(va)-.25 G .3 -.15(cy F).25 H 1.93(lags .......................................................................................................................) -.15 F(31)26 E 2.5(4.14. Send)87 499.2 R(to Me T)2.5 E 2.08(oo ...................................................................................................................) --.8 F(31)26 E 2.5(5. THE)72 513.6 R(WHOLE SCOOP ON THE CONFIGURA)2.5 E -(TION FILE)-1.11 E 23.5 -(........................................................ 31)4.64 F 2.5 -(5.1. R)87 528 R(and S \212 Re)2.5 E(writing Rules)-.25 E 23.5(.................................................................................................. 31) -4.3 F 2.5(5.1.1. The)102 542.4 R(left hand side)2.5 E 23.5(......................................................................................................... 32) -4.07 F 2.5(5.1.2. The)102 556.8 R(right hand side)2.5 E 23.5(....................................................................................................... 32) -3.51 F 2.5(5.1.3. Semantics)102 571.2 R(of re)2.5 E(writing rule sets) --.25 E 23.5(................................................................................... 34) -4.6 F 2.5(5.1.4. Ruleset)102 585.6 R 2.11(hooks ...............................................................................................................) -2.5 F(34)26 E 2.5(5.1.4.1. check_relay)117 600 R 23.5(.......................................................................................................... 35) -2.69 F 2.5(5.1.4.2. check_mail)117 614.4 R 23.5(.......................................................................................................... 35) -4.9 F 2.5(5.1.4.3. check_rcpt)117 628.8 R 23.5(........................................................................................................... 35) -4.63 F 2.5(5.1.4.4. check_compat)117 643.2 R 23.5(...................................................................................................... 35) -3.24 F 2.5(5.1.5. IPC)102 657.6 R 1(mailers ...................................................................................................................) -2.5 F(35)26 E 2.5(5.2. D)87 672 R 2.5<8a44>2.5 G(e\214ne Macro)-2.5 E -23.5(................................................................................................................ 35) -3.52 F 2.5(5.3. C)87 686.4 R(and F \212 De\214ne Classes)2.5 E 23.5(..................................................................................................... 38) -2.67 F 2.5(5.4. M)87 700.8 R 2.5<8a44>2.5 G(e\214ne Mailer)-2.5 E 23.5(............................................................................................................... 39) -3.79 F 2.5(5.5. H)87 715.2 R 2.5<8a44>2.5 G(e\214ne Header)-2.5 E 23.5(............................................................................................................... 43) -3.25 F EP -%%Page: 5 75 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-5)200.86 E/F1 10/Times-Roman@0 SF 2.5(5.6. O)87 96 R 2.5<8a53> -2.5 G(et Option)-2.5 E 23.5(..................................................................................................................... 44) -3.22 F 2.5(5.7. P)87 110.4 R 2.5<8a50>2.5 G(recedence De\214nitions)-2.5 -E 23.5(.................................................................................................. 55) -2.96 F 2.5(5.8. V)87 124.8 R 2.5<8a43>2.5 G(on\214guration V)-2.5 E -(ersion Le)-1.11 E -.15(ve)-.25 G 2.8(l.).15 G 23.5(........................................................................................ 55) --2.8 F 2.5(5.9. K)87 139.2 R 2.5<8a4b>2.5 G .3 -.15(ey F)-2.75 H -(ile Declaration).15 E 23.5(..................................................................................................... 56) -2.81 F 2.5(5.10. The)87 153.6 R(User Database)2.5 E 23.5(.............................................................................................................. 61) -4.92 F 2.5(5.10.1. Structure)102 168 R(of the user database)2.5 E 23.5(..................................................................................... 61) -2.7 F 2.5(5.10.2. User)102 182.4 R(database semantics)2.5 E 23.5(............................................................................................. 61) -3.25 F 2.5(5.10.3. Creating)102 198.8 R(the database)2.5 E/F2 7 -/Times-Roman@0 SF(25)-4 I F1 23.5(............................................................................................... 62) -2.91 4 N 2.5(6. O)72 213.2 R(THER CONFIGURA)-.4 E 1.97(TION .........................................................................................................) --1.11 F(62)26 E 2.5(6.1. P)87 227.6 R(arameters in BuildT)-.15 E 2.23(ools/OS/$oscf ......................................................................................) --.8 F(62)26 E 2.5(6.2. P)87 242 R(arameters in src/conf.h)-.15 E 23.5(........................................................................................................ 63) -4.23 F 2.5(6.3. Con\214guration)87 256.4 R(in src/conf.c)2.5 E 23.5(.................................................................................................... 65) -3.51 F 2.5(6.3.1. Built-in)102 270.8 R(Header Semantics)2.5 E 23.5(........................................................................................... 65) -4.9 F 2.5(6.3.2. Restricting)102 285.2 R(Use of Email)2.5 E 23.5(.............................................................................................. 67) -4.34 F 2.5(6.3.3. Ne)102 299.6 R 2.5(wD)-.25 G(atabase Map Classes)-2.5 -E 23.5(......................................................................................... 67) -4.89 F 2.5(6.3.4. Queueing)102 314 R 1.56(Function .......................................................................................................) -2.5 F(68)26 E 2.5(6.3.5. Refusing)102 328.4 R(Incoming SMTP Connections) -2.5 E 23.5(....................................................................... 68) -2.94 F 2.5(6.3.6. Load)102 342.8 R -1.17 -.74(Av e)2.5 H -(rage Computation).74 E 23.5(.......................................................................................... 69) -2.74 F 2.5(6.4. Con\214guration)87 357.2 R(in src/daemon.c)2.5 E 23.5(.............................................................................................. 69) -4.62 F 2.5(7. A)72 371.6 R(CKNO)-.4 E .1(WLEDGEMENTS ............................................................................................................) --.35 F(69)26 E(Appendix A.)72 386 Q(COMMAND LINE FLA)5 E 1.97(GS .........................................................................................) --.4 F(71)26 E(Appendix B.)72 400.4 Q -.1(QU)5 G(EUE FILE FORMA).1 E 1.38 -(TS ............................................................................................) --1.11 F(73)26 E(Appendix C.)72 414.8 Q(SUMMAR)5 E 2.5(YO)-.65 G 2.5(FS) --2.5 G(UPPOR)-2.5 E 2.5(TF)-.6 G 1.12(ILES ..............................................................................) --2.5 F(75)26 E EP -%%Page: 6 76 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 198.36(SMM:08-6 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF -(This page intentionally left blank;)256.225 300 Q -(replace it with a blank sheet for double-sided output.)218.6 312 Q EP -%%Trailer -end -%%EOF diff --git a/doc/usenix/Makefile b/doc/usenix/Makefile deleted file mode 100644 index d2308cb..0000000 --- a/doc/usenix/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -# @(#)Makefile 8.2 (Berkeley) 2/28/1994 - -SRCS= usenix.me -MACROS= -me - -all: usenix.ps - -usenix.ps: ${SRCS} - rm -f ${.TARGET} - ${PIC} ${SRCS} | ${ROFF} > ${.TARGET} - -.include <bsd.doc.mk> diff --git a/doc/usenix/usenix.me b/doc/usenix/usenix.me deleted file mode 100644 index 4f88a94..0000000 --- a/doc/usenix/usenix.me +++ /dev/null @@ -1,1076 +0,0 @@ -.nr si 3n -.he 'Mail Systems and Addressing in 4.2bsd''%' -.fo 'Version 8.2'USENIX \- Jan 83'Last Mod 11/27/1993' -.if n .ls 2 -.+c -.(l C -.sz 14 -Mail Systems and Addressing -in 4.2bsd -.sz -.sp -Eric Allman* -.sp 0.5 -.i -Britton-Lee, Inc. -1919 Addison Street, Suite 105. -Berkeley, California 94704. -.sp 0.5 -.r -eric@Berkeley.ARPA -ucbvax!eric -.)l -.sp -.(l F -.ce -ABSTRACT -.sp \n(psu -Routing mail through a heterogeneous internet presents many new -problems. -Among the worst of these is that of address mapping. -Historically, this has been handled on an ad hoc basis. -However, -this approach has become unmanageable as internets grow. -.sp \n(psu -Sendmail acts a unified -.q "post office" -to which all mail can be -submitted. -Address interpretation is controlled by a production -system, -which can parse both old and new format addresses. -The -new format is -.q "domain-based," -a flexible technique that can -handle many common situations. -Sendmail is not intended to perform -user interface functions. -.sp \n(psu -Sendmail will replace delivermail in the Berkeley 4.2 distribution. -Several major hosts are now or will soon be running sendmail. -This change will affect any users that route mail through a sendmail -gateway. -The changes that will be user visible are emphasized. -.)l -.sp 2 -.(f -*A considerable part of this work -was done while under the employ -of the INGRES Project -at the University of California at Berkeley. -.)f -.pp -The mail system to appear in 4.2bsd -will contain a number of changes. -Most of these changes are based on the replacement of -.i delivermail -with a new module called -.i sendmail. -.i Sendmail -implements a general internetwork mail routing facility, -featuring aliasing and forwarding, -automatic routing to network gateways, -and flexible configuration. -Of key interest to the mail system user -will be the changes in the network addressing structure. -.pp -In a simple network, -each node has an address, -and resources can be identified -with a host-resource pair; -in particular, -the mail system can refer to users -using a host-username pair. -Host names and numbers have to be administered by a central authority, -but usernames can be assigned locally to each host. -.pp -In an internet, -multiple networks with different characteristics -and managements -must communicate. -In particular, -the syntax and semantics of resource identification change. -Certain special cases can be handled trivially -by -.i "ad hoc" -techniques, -such as -providing network names that appear local to hosts -on other networks, -as with the Ethernet at Xerox PARC. -However, the general case is extremely complex. -For example, -some networks require that the route the message takes -be explicitly specified by the sender, -simplifying the database update problem -since only adjacent hosts must be entered -into the system tables, -while others use logical addressing, -where the sender specifies the location of the recipient -but not how to get there. -Some networks use a left-associative syntax -and others use a right-associative syntax, -causing ambiguity in mixed addresses. -.pp -Internet standards seek to eliminate these problems. -Initially, these proposed expanding the address pairs -to address triples, -consisting of -{network, host, username} -triples. -Network numbers must be universally agreed upon, -and hosts can be assigned locally -on each network. -The user-level presentation was changed -to address domains, -comprised of a local resource identification -and a hierarchical domain specification -with a common static root. -The domain technique -separates the issue of physical versus logical addressing. -For example, -an address of the form -.q "eric@a.cc.berkeley.arpa" -describes the logical -organization of the address space -(user -.q eric -on host -.q a -in the Computer Center -at Berkeley) -but not the physical networks used -(for example, this could go over different networks -depending on whether -.q a -were on an ethernet -or a store-and-forward network). -.pp -.i Sendmail -is intended to help bridge the gap -between the totally -.i "ad hoc" -world -of networks that know nothing of each other -and the clean, tightly-coupled world -of unique network numbers. -It can accept old arbitrary address syntaxes, -resolving ambiguities using heuristics -specified by the system administrator, -as well as domain-based addressing. -It helps guide the conversion of message formats -between disparate networks. -In short, -.i sendmail -is designed to assist a graceful transition -to consistent internetwork addressing schemes. -.sp -.pp -Section 1 defines some of the terms -frequently left fuzzy -when working in mail systems. -Section 2 discusses the design goals for -.i sendmail . -In section 3, -the new address formats -and basic features of -.i sendmail -are described. -Section 4 discusses some of the special problems -of the UUCP network. -The differences between -.i sendmail -and -.i delivermail -are presented in section 5. -.sp -.(l F -.b DISCLAIMER: -A number of examples -in this paper -use names of actual people -and organizations. -This is not intended -to imply a commitment -or even an intellectual agreement -on the part of these people or organizations. -In particular, -Bell Telephone Laboratories (BTL), -Digital Equipment Corporation (DEC), -Lawrence Berkeley Laboratories (LBL), -Britton-Lee Incorporated (BLI), -and the University of California at Berkeley -are not committed to any of these proposals at this time. -Much of this paper -represents no more than -the personal opinions of the author. -.)l -.sh 1 "DEFINITIONS" -.pp -There are four basic concepts -that must be clearly distinguished -when dealing with mail systems: -the user (or the user's agent), -the user's identification, -the user's address, -and the route. -These are distinguished primarily by their position independence. -.sh 2 "User and Identification" -.pp -The user is the being -(a person or program) -that is creating or receiving a message. -An -.i agent -is an entity operating on behalf of the user \*- -such as a secretary who handles my mail. -or a program that automatically returns a -message such as -.q "I am at the UNICOM conference." -.pp -The identification is the tag -that goes along with the particular user. -This tag is completely independent of location. -For example, -my identification is the string -.q "Eric Allman," -and this identification does not change -whether I am located at U.C. Berkeley, -at Britton-Lee, -or at a scientific institute in Austria. -.pp -Since the identification is frequently ambiguous -(e.g., there are two -.q "Robert Henry" s -at Berkeley) -it is common to add other disambiguating information -that is not strictly part of the identification -(e.g., -Robert -.q "Code Generator" -Henry -versus -Robert -.q "System Administrator" -Henry). -.sh 2 "Address" -.pp -The address specifies a location. -As I move around, -my address changes. -For example, -my address might change from -.q eric@Berkeley.ARPA -to -.q eric@bli.UUCP -or -.q allman@IIASA.Austria -depending on my current affiliation. -.pp -However, -an address is independent of the location of anyone else. -That is, -my address remains the same to everyone who might be sending me mail. -For example, -a person at MIT and a person at USC -could both send to -.q eric@Berkeley.ARPA -and have it arrive to the same mailbox. -.pp -Ideally a -.q "white pages" -service would be provided to map user identifications -into addresses -(for example, see -[Solomon81]). -Currently this is handled by passing around -scraps of paper -or by calling people on the telephone -to find out their address. -.sh 2 "Route" -.pp -While an address specifies -.i where -to find a mailbox, -a route specifies -.i how -to find the mailbox. -Specifically, -it specifies a path -from sender to receiver. -As such, the route is potentially different -for every pair of people in the electronic universe. -.pp -Normally the route is hidden from the user -by the software. -However, -some networks put the burden of determining the route -onto the sender. -Although this simplifies the software, -it also greatly impairs the usability -for most users. -The UUCP network is an example of such a network. -.sh 1 "DESIGN GOALS" -.pp -Design goals for -.i sendmail \** -.(f -\**This section makes no distinction between -.i delivermail -and -.i sendmail. -.)f -include: -.np -Compatibility with the existing mail programs, -including Bell version 6 mail, -Bell version 7 mail, -Berkeley -.i Mail -[Shoens79], -BerkNet mail -[Schmidt79], -and hopefully UUCP mail -[Nowitz78]. -ARPANET mail -[Crocker82] -was also required. -.np -Reliability, in the sense of guaranteeing -that every message is correctly delivered -or at least brought to the attention of a human -for correct disposal; -no message should ever be completely lost. -This goal was considered essential -because of the emphasis on mail in our environment. -It has turned out to be one of the hardest goals to satisfy, -especially in the face of the many anomalous message formats -produced by various ARPANET sites. -For example, -certain sites generate improperly formated addresses, -occasionally -causing error-message loops. -Some hosts use blanks in names, -causing problems with -mail programs that assume that an address -is one word. -The semantics of some fields -are interpreted slightly differently -by different sites. -In summary, -the obscure features of the ARPANET mail protocol -really -.i are -used and -are difficult to support, -but must be supported. -.np -Existing software to do actual delivery -should be used whenever possible. -This goal derives as much from political and practical considerations -as technical. -.np -Easy expansion to -fairly complex environments, -including multiple -connections to a single network type -(such as with multiple UUCP or Ethernets). -This goal requires consideration of the contents of an address -as well as its syntax -in order to determine which gateway to use. -.np -Configuration information should not be compiled into the code. -A single compiled program should be able to run as is at any site -(barring such basic changes as the CPU type or the operating system). -We have found this seemingly unimportant goal -to be critical in real life. -Besides the simple problems that occur when any program gets recompiled -in a different environment, -many sites like to -.q fiddle -with anything that they will be recompiling anyway. -.np -.i Sendmail -must be able to let various groups maintain their own mailing lists, -and let individuals specify their own forwarding, -without modifying the system alias file. -.np -Each user should be able to specify which mailer to execute -to process mail being delivered for him. -This feature allows users who are using specialized mailers -that use a different format to build their environment -without changing the system, -and facilitates specialized functions -(such as returning an -.q "I am on vacation" -message). -.np -Network traffic should be minimized -by batching addresses to a single host where possible, -without assistance from the user. -.pp -These goals motivated the architecture illustrated in figure 1. -.(z -.hl -.ie t \ -. sp 18 -.el \{\ -.(c -+---------+ +---------+ +---------+ -| sender1 | | sender2 | | sender3 | -+---------+ +---------+ +---------+ - | | | - +----------+ + +----------+ - | | | - v v v - +-------------+ - | sendmail | - +-------------+ - | | | - +----------+ + +----------+ - | | | - v v v -+---------+ +---------+ +---------+ -| mailer1 | | mailer2 | | mailer3 | -+---------+ +---------+ +---------+ -.)c -.\} - -.ce -Figure 1 \*- Sendmail System Structure. -.hl -.)z -The user interacts with a mail generating and sending program. -When the mail is created, -the generator calls -.i sendmail , -which routes the message to the correct mailer(s). -Since some of the senders may be network servers -and some of the mailers may be network clients, -.i sendmail -may be used as an internet mail gateway. -.sh 1 "USAGE" -.sh 2 "Address Formats" -.pp -Arguments may be flags or addresses. -Flags set various processing options. -Following flag arguments, -address arguments may be given. -Addresses follow the syntax in RFC822 -[Crocker82] -for ARPANET -address formats. -In brief, the format is: -.np -Anything in parentheses is thrown away -(as a comment). -.np -Anything in angle brackets (\c -.q "<\|>" ) -is preferred -over anything else. -This rule implements the ARPANET standard that addresses of the form -.(b -user name <machine-address> -.)b -will send to the electronic -.q machine-address -rather than the human -.q "user name." -.np -Double quotes -(\ "\ ) -quote phrases; -backslashes quote characters. -Backslashes are more powerful -in that they will cause otherwise equivalent phrases -to compare differently \*- for example, -.i user -and -.i -"user" -.r -are equivalent, -but -.i \euser -is different from either of them. -This might be used -to avoid normal aliasing -or duplicate suppression algorithms. -.pp -Parentheses, angle brackets, and double quotes -must be properly balanced and nested. -The rewriting rules control remaining parsing\**. -.(f -\**Disclaimer: Some special processing is done -after rewriting local names; see below. -.)f -.pp -Although old style addresses are still accepted -in most cases, -the preferred address format -is based on ARPANET-style domain-based addresses -[Su82a]. -These addresses are based on a hierarchical, logical decomposition -of the address space. -The addresses are hierarchical in a sense -similar to the U.S. postal addresses: -the messages may first be routed to the correct state, -with no initial consideration of the city -or other addressing details. -The addresses are logical -in that each step in the hierarchy -corresponds to a set of -.q "naming authorities" -rather than a physical network. -.pp -For example, -the address: -.(l -eric@HostA.BigSite.ARPA -.)l -would first look up the domain -BigSite -in the namespace administrated by -ARPA. -A query could then be sent to -BigSite -for interpretation of -HostA. -Eventually the mail would arrive at -HostA, -which would then do final delivery -to user -.q eric. -.sh 2 "Mail to Files and Programs" -.pp -Files and programs are legitimate message recipients. -Files provide archival storage of messages, -useful for project administration and history. -Programs are useful as recipients in a variety of situations, -for example, -to maintain a public repository of systems messages -(such as the Berkeley -.i msgs -program). -.pp -Any address passing through the initial parsing algorithm -as a local address -(i.e, not appearing to be a valid address for another mailer) -is scanned for two special cases. -If prefixed by a vertical bar (\c -.q \^|\^ ) -the rest of the address is processed as a shell command. -If the user name begins with a slash mark (\c -.q /\^ ) -the name is used as a file name, -instead of a login name. -.sh 2 "Aliasing, Forwarding, Inclusion" -.pp -.i Sendmail -reroutes mail three ways. -Aliasing applies system wide. -Forwarding allows each user to reroute incoming mail -destined for that account. -Inclusion directs -.i sendmail -to read a file for a list of addresses, -and is normally used -in conjunction with aliasing. -.sh 3 "Aliasing" -.pp -Aliasing maps local addresses to address lists using a system-wide file. -This file is hashed to speed access. -Only addresses that parse as local -are allowed as aliases; -this guarantees a unique key -(since there are no nicknames for the local host). -.sh 3 "Forwarding" -.pp -After aliasing, -if an recipient address specifies a local user -.i sendmail -searches for a -.q .forward -file in the recipient's home directory. -If it exists, -the message is -.i not -sent to that user, -but rather to the list of addresses in that file. -Often -this list will contain only one address, -and the feature will be used for network mail forwarding. -.pp -Forwarding also permits a user to specify a private incoming mailer. -For example, -forwarding to: -.(b -"\^|\|/usr/local/newmail myname" -.)b -will use a different incoming mailer. -.sh 3 "Inclusion" -.pp -Inclusion is specified in RFC 733 [Crocker77] syntax: -.(b -:Include: pathname -.)b -An address of this form reads the file specified by -.i pathname -and sends to all users listed in that file. -.pp -The intent is -.i not -to support direct use of this feature, -but rather to use this as a subset of aliasing. -For example, -an alias of the form: -.(b -project: :include:/usr/project/userlist -.)b -is a method of letting a project maintain a mailing list -without interaction with the system administration, -even if the alias file is protected. -.pp -It is not necessary to rebuild the index on the alias database -when a :include: list is changed. -.sh 2 "Message Collection" -.pp -Once all recipient addresses are parsed and verified, -the message is collected. -The message comes in two parts: -a message header and a message body, -separated by a blank line. -The body is an uninterpreted -sequence of text lines. -.pp -The header is formated as a series of lines -of the form -.(b - field-name: field-value -.)b -Field-value can be split across lines by starting the following -lines with a space or a tab. -Some header fields have special internal meaning, -and have appropriate special processing. -Other headers are simply passed through. -Some header fields may be added automatically, -such as time stamps. -.sh 1 "THE UUCP PROBLEM" -.pp -Of particular interest -is the UUCP network. -The explicit routing -used in the UUCP environment -causes a number of serious problems. -First, -giving out an address -is impossible -without knowing the address of your potential correspondent. -This is typically handled -by specifying the address -relative to some -.q "well-known" -host -(e.g., -ucbvax or decvax). -Second, -it is often difficult to compute -the set of addresses -to reply to -without some knowledge -of the topology of the network. -Although it may be easy for a human being -to do this -under many circumstances, -a program does not have equally sophisticated heuristics -built in. -Third, -certain addresses will become painfully and unnecessarily long, -as when a message is routed through many hosts in the USENET. -And finally, -certain -.q "mixed domain" -addresses -are impossible to parse unambiguously \*- -e.g., -.(l -decvax!ucbvax!lbl-h!user@LBL-CSAM -.)l -might have many possible resolutions, -depending on whether the message was first routed -to decvax -or to LBL-CSAM. -.pp -To solve this problem, -the UUCP syntax -would have to be changed to use addresses -rather than routes. -For example, -the address -.q decvax!ucbvax!eric -might be expressed as -.q eric@ucbvax.UUCP -(with the hop through decvax implied). -This address would itself be a domain-based address; -for example, -an address might be of the form: -.(l -mark@d.cbosg.btl.UUCP -.)l -Hosts outside of Bell Telephone Laboratories -would then only need to know -how to get to a designated BTL relay, -and the BTL topology -would only be maintained inside Bell. -.pp -There are three major problems -associated with turning UUCP addresses -into something reasonable: -defining the namespace, -creating and propagating the necessary software, -and building and maintaining the database. -.sh 2 "Defining the Namespace" -.pp -Putting all UUCP hosts into a flat namespace -(e.g., -.q \&...@host.UUCP ) -is not practical for a number of reasons. -First, -with over 1600 sites already, -and (with the increasing availability of inexpensive microcomputers -and autodialers) -several thousand more coming within a few years, -the database update problem -is simply intractable -if the namespace is flat. -Second, -there are almost certainly name conflicts today. -Third, -as the number of sites grow -the names become ever less mnemonic. -.pp -It seems inevitable -that there be some sort of naming authority -for the set of top level names -in the UUCP domain, -as unpleasant a possibility -as that may seem. -It will simply not be possible -to have one host resolving all names. -It may however be possible -to handle this -in a fashion similar to that of assigning names of newsgroups -in USENET. -However, -it will be essential to encourage everyone -to become subdomains of an existing domain -whenever possible \*- -even though this will certainly bruise some egos. -For example, -if a new host named -.q blid -were to be added to the UUCP network, -it would probably actually be addressed as -.q d.bli.UUCP -(i.e., -as host -.q d -in the pseudo-domain -.q bli -rather than as host -.q blid -in the UUCP domain). -.sh 2 "Creating and Propagating the Software" -.pp -The software required to implement a consistent namespace -is relatively trivial. -Two modules are needed, -one to handle incoming mail -and one to handle outgoing mail. -.pp -The incoming module -must be prepared to handle either old or new style addresses. -New-style addresses -can be passed through unchanged. -Old style addresses -must be turned into new style addresses -where possible. -.pp -The outgoing module -is slightly trickier. -It must do a database lookup on the recipient addresses -(passed on the command line) -to determine what hosts to send the message to. -If those hosts do not accept new-style addresses, -it must transform all addresses in the header of the message -into old style using the database lookup. -.pp -Both of these modules -are straightforward -except for the issue of modifying the header. -It seems prudent to choose one format -for the message headers. -For a number of reasons, -Berkeley has elected to use the ARPANET protocols -for message formats. -However, -this protocol is somewhat difficult to parse. -.pp -Propagation is somewhat more difficult. -There are a large number of hosts -connected to UUCP -that will want to run completely standard systems -(for very good reasons). -The strategy is not to convert the entire network \*- -only enough of it it alleviate the problem. -.sh 2 "Building and Maintaining the Database" -.pp -This is by far the most difficult problem. -A prototype for this database -already exists, -but it is maintained by hand -and does not pretend to be complete. -.pp -This problem will be reduced considerably -if people choose to group their hosts -into subdomains. -This would require a global update -only when a new top level domain -joined the network. -A message to a host in a subdomain -could simply be routed to a known domain gateway -for further processing. -For example, -the address -.q eric@a.bli.UUCP -might be routed to the -.q bli -gateway -for redistribution; -new hosts could be added -within BLI -without notifying the rest of the world. -Of course, -other hosts -.i could -be notified as an efficiency measure. -.pp -There may be more than one domain gateway. -A domain such as BTL, -for instance, -might have a dozen gateways to the outside world; -a non-BTL site -could choose the closest gateway. -The only restriction -would be that all gateways -maintain a consistent view of the domain -they represent. -.sh 2 "Logical Structure" -.pp -Logically, -domains are organized into a tree. -There need not be a host actually associated -with each level in the tree \*- -for example, -there will be no host associated with the name -.q UUCP. -Similarly, -an organization might group names together for administrative reasons; -for example, -the name -.(l -CAD.research.BigCorp.UUCP -.)l -might not actually have a host representing -.q research. -.pp -However, -it may frequently be convenient to have a host -or hosts -that -.q represent -a domain. -For example, -if a single host exists that -represents -Berkeley, -then mail from outside Berkeley -can forward mail to that host -for further resolution -without knowing Berkeley's -(rather volatile) -topology. -This is not unlike the operation -of the telephone network. -.pp -This may also be useful -inside certain large domains. -For example, -at Berkeley it may be presumed -that most hosts know about other hosts -inside the Berkeley domain. -But if they process an address -that is unknown, -they can pass it -.q upstairs -for further examination. -Thus as new hosts are added -only one host -(the domain master) -.i must -be updated immediately; -other hosts can be updated as convenient. -.pp -Ideally this name resolution process -would be performed by a name server -(e.g., [Su82b]) -to avoid unnecessary copying -of the message. -However, -in a batch network -such as UUCP -this could result in unnecessary delays. -.sh 1 "COMPARISON WITH DELIVERMAIL" -.pp -.i Sendmail -is an outgrowth of -.i delivermail . -The primary differences are: -.np -Configuration information is not compiled in. -This change simplifies many of the problems -of moving to other machines. -It also allows easy debugging of new mailers. -.np -Address parsing is more flexible. -For example, -.i delivermail -only supported one gateway to any network, -whereas -.i sendmail -can be sensitive to host names -and reroute to different gateways. -.np -Forwarding and -:include: -features eliminate the requirement that the system alias file -be writable by any user -(or that an update program be written, -or that the system administration make all changes). -.np -.i Sendmail -supports message batching across networks -when a message is being sent to multiple recipients. -.np -A mail queue is provided in -.i sendmail. -Mail that cannot be delivered immediately -but can potentially be delivered later -is stored in this queue for a later retry. -The queue also provides a buffer against system crashes; -after the message has been collected -it may be reliably redelivered -even if the system crashes during the initial delivery. -.np -.i Sendmail -uses the networking support provided by 4.2BSD -to provide a direct interface networks such as the ARPANET -and/or Ethernet -using SMTP (the Simple Mail Transfer Protocol) -over a TCP/IP connection. -.+c -.ce -REFERENCES -.nr ii 1.5i -.ip [Crocker77] -Crocker, D. H., -Vittal, J. J., -Pogran, K. T., -and -Henderson, D. A. Jr., -.ul -Standard for the Format of ARPA Network Text Messages. -RFC 733, -NIC 41952. -In [Feinler78]. -November 1977. -.ip [Crocker82] -Crocker, D. H., -.ul -Standard for the Format of Arpa Internet Text Messages. -RFC 822. -Network Information Center, -SRI International, -Menlo Park, California. -August 1982. -.ip [Feinler78] -Feinler, E., -and -Postel, J. -(eds.), -.ul -ARPANET Protocol Handbook. -NIC 7104, -Network Information Center, -SRI International, -Menlo Park, California. -1978. -.ip [Nowitz78] -Nowitz, D. A., -and -Lesk, M. E., -.ul -A Dial-Up Network of UNIX Systems. -Bell Laboratories. -In -UNIX Programmer's Manual, Seventh Edition, -Volume 2. -August, 1978. -.ip [Schmidt79] -Schmidt, E., -.ul -An Introduction to the Berkeley Network. -University of California, Berkeley California. -1979. -.ip [Shoens79] -Shoens, K., -.ul -Mail Reference Manual. -University of California, Berkeley. -In UNIX Programmer's Manual, -Seventh Edition, -Volume 2C. -December 1979. -.ip [Solomon81] -Solomon, M., -Landweber, L., -and -Neuhengen, D., -.ul -The Design of the CSNET Name Server. -CS-DN-2. -University of Wisconsin, -Madison. -October 1981. -.ip [Su82a] -Su, Zaw-Sing, -and -Postel, Jon, -.ul -The Domain Naming Convention for Internet User Applications. -RFC819. -Network Information Center, -SRI International, -Menlo Park, California. -August 1982. -.ip [Su82b] -Su, Zaw-Sing, -.ul -A Distributed System for Internet Name Service. -RFC830. -Network Information Center, -SRI International, -Menlo Park, California. -October 1982. diff --git a/doc/usenix/usenix.ps b/doc/usenix/usenix.ps deleted file mode 100644 index e6add99..0000000 --- a/doc/usenix/usenix.ps +++ /dev/null @@ -1,1034 +0,0 @@ -%!PS-Adobe-3.0 -%%Creator: groff version 1.10 -%%CreationDate: Tue Dec 29 09:59:22 1998 -%%DocumentNeededResources: font Times-Roman -%%+ font Times-Italic -%%+ font Times-Bold -%%DocumentSuppliedResources: procset grops 1.10 0 -%%Pages: 9 -%%PageOrder: Ascend -%%Orientation: Portrait -%%EndComments -%%BeginProlog -%%BeginResource: procset grops 1.10 0 -/setpacking where{ -pop -currentpacking -true setpacking -}if -/grops 120 dict dup begin -/SC 32 def -/A/show load def -/B{0 SC 3 -1 roll widthshow}bind def -/C{0 exch ashow}bind def -/D{0 exch 0 SC 5 2 roll awidthshow}bind def -/E{0 rmoveto show}bind def -/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def -/G{0 rmoveto 0 exch ashow}bind def -/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/I{0 exch rmoveto show}bind def -/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def -/K{0 exch rmoveto 0 exch ashow}bind def -/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/M{rmoveto show}bind def -/N{rmoveto 0 SC 3 -1 roll widthshow}bind def -/O{rmoveto 0 exch ashow}bind def -/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/Q{moveto show}bind def -/R{moveto 0 SC 3 -1 roll widthshow}bind def -/S{moveto 0 exch ashow}bind def -/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/SF{ -findfont exch -[exch dup 0 exch 0 exch neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/MF{ -findfont -[5 2 roll -0 3 1 roll -neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/level0 0 def -/RES 0 def -/PL 0 def -/LS 0 def -/MANUAL{ -statusdict begin/manualfeed true store end -}bind def -/PLG{ -gsave newpath clippath pathbbox grestore -exch pop add exch pop -}bind def -/BP{ -/level0 save def -1 setlinecap -1 setlinejoin -72 RES div dup scale -LS{ -90 rotate -}{ -0 PL translate -}ifelse -1 -1 scale -}bind def -/EP{ -level0 restore -showpage -}bind def -/DA{ -newpath arcn stroke -}bind def -/SN{ -transform -.25 sub exch .25 sub exch -round .25 add exch round .25 add exch -itransform -}bind def -/DL{ -SN -moveto -SN -lineto stroke -}bind def -/DC{ -newpath 0 360 arc closepath -}bind def -/TM matrix def -/DE{ -TM currentmatrix pop -translate scale newpath 0 0 .5 0 360 arc closepath -TM setmatrix -}bind def -/RC/rcurveto load def -/RL/rlineto load def -/ST/stroke load def -/MT/moveto load def -/CL/closepath load def -/FL{ -currentgray exch setgray fill setgray -}bind def -/BL/fill load def -/LW/setlinewidth load def -/RE{ -findfont -dup maxlength 1 index/FontName known not{1 add}if dict begin -{ -1 index/FID ne{def}{pop pop}ifelse -}forall -/Encoding exch def -dup/FontName exch def -currentdict end definefont pop -}bind def -/DEFS 0 def -/EBEGIN{ -moveto -DEFS begin -}bind def -/EEND/end load def -/CNT 0 def -/level1 0 def -/PBEGIN{ -/level1 save def -translate -div 3 1 roll div exch scale -neg exch neg exch translate -0 setgray -0 setlinecap -1 setlinewidth -0 setlinejoin -10 setmiterlimit -[]0 setdash -/setstrokeadjust where{ -pop -false setstrokeadjust -}if -/setoverprint where{ -pop -false setoverprint -}if -newpath -/CNT countdictstack def -userdict begin -/showpage{}def -}bind def -/PEND{ -clear -countdictstack CNT sub{end}repeat -level1 restore -}bind def -end def -/setpacking where{ -pop -setpacking -}if -%%EndResource -%%IncludeResource: font Times-Roman -%%IncludeResource: font Times-Italic -%%IncludeResource: font Times-Bold -grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 -def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron -/scaron/zcaron/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent -/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen -/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon -/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O -/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex -/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y -/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft -/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl -/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut -/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash -/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen -/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft -/logicalnot/minus/registered/macron/degree/plusminus/twosuperior -/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior -/ordmasculine/guilsinglright/onequarter/onehalf/threequarters -/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE -/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex -/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis -/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn -/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla -/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis -/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash -/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def -/Times-Bold@0 ENC0/Times-Bold RE/Times-Italic@0 ENC0/Times-Italic RE -/Times-Roman@0 ENC0/Times-Roman RE -%%EndProlog -%%Page: 1 1 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 14/Times-Roman@0 SF(Mail Systems and Addressing)204.196 141 Q -(in 4.2bsd)262.331 157.8 Q/F1 10/Times-Roman@0 SF(Eric Allman*)260.92 -181.8 Q/F2 10/Times-Italic@0 SF(Britton-Lee)254.86 199.8 Q 2.5(,I)-.1 G -(nc.)-2.5 E(1919 Addison Str)225.13 211.8 Q(eet, Suite 105.)-.37 E(Berk) -232.645 223.8 Q(ele)-.1 E 1.1 -.55(y, C)-.3 H(alifornia 94704.).55 E F1 -(eric@Berk)244.175 241.8 Q(ele)-.1 E -.65(y.)-.15 G(ARP).65 E(A)-.92 E -(ucb)264.6 253.8 Q -.25(va)-.15 G(x!eric).25 E(ABSTRA)262.085 286.2 Q -(CT)-.4 E .966 -(Routing mail through a heterogeneous internet presents man)112 302.4 R -3.466(yn)-.15 G 1.466 -.25(ew p)-3.466 H 3.466(roblems. Among).25 F .297 -(the w)112 314.4 R .297(orst of these is that of address mapping.)-.1 F -(Historically)5.297 E 2.797(,t)-.65 G .298(his has been handled on an) --2.797 F(ad hoc basis.)112 326.4 Q(Ho)5 E(we)-.25 E -.15(ve)-.25 G .8 --.4(r, t).15 H(his approach has become unmanageable as internets gro).4 -E -.65(w.)-.25 G .099(Sendmail acts a uni\214ed \231post of)112 342.6 R -.098(\214ce\232 to which all mail can be submitted.)-.25 F .098 -(Address inter)5.098 F(-)-.2 E .754(pretation is controlled by a production system, which can parse both old and ne) -112 354.6 R 3.255(wf)-.25 G(or)-3.255 E(-)-.2 E .242(mat addresses.)112 -366.6 R .242(The ne)5.242 F 2.742(wf)-.25 G .242 -(ormat is \231domain-based,)-2.742 F 2.742<9a618d>-.7 G -.15(ex)-2.742 G -.241(ible technique that can handle).15 F(man)112 378.6 Q 2.606(yc)-.15 -G .106(ommon situations.)-2.606 F .106 -(Sendmail is not intended to perform user interf)5.106 F .107 -(ace functions.)-.1 F .399(Sendmail will replace deli)112 394.8 R -.15 -(ve)-.25 G .399(rmail in the Berk).15 F(ele)-.1 E 2.899(y4)-.15 G .399 -(.2 distrib)-2.899 F 2.899(ution. Se)-.2 F -.15(ve)-.25 G .399 -(ral major hosts).15 F .421(are no)112 406.8 R 2.921(wo)-.25 G 2.921(rw) --2.921 G .421(ill soon be running sendmail.)-2.921 F .421 -(This change will af)5.421 F .422(fect an)-.25 F 2.922(yu)-.15 G .422 -(sers that route)-2.922 F 1.5(mail through a sendmail g)112 418.8 R(ate) --.05 E -.1(wa)-.25 G 5.3 -.65(y. T).1 H 1.5 -(he changes that will be user visible are empha-).65 F(sized.)112 430.8 -Q .906 -(The mail system to appear in 4.2bsd will contain a number of changes.) -97 475.2 R .906(Most of these changes are)5.906 F .469 -(based on the replacement of)72 487.2 R F2(delivermail)2.969 E F1 .469 -(with a ne)2.969 F 2.969(wm)-.25 G .469(odule called)-2.969 F F2 2.97 -(sendmail. Sendmail)2.97 F F1 .47(implements a gen-)2.97 F 1.834 -(eral internetw)72 499.2 R 1.834(ork mail routing f)-.1 F(acility)-.1 E -4.333(,f)-.65 G 1.833(eaturing aliasing and forw)-4.333 F 1.833 -(arding, automatic routing to netw)-.1 F(ork)-.1 E -.05(ga)72 511.2 S -(te).05 E -.1(wa)-.25 G .205(ys, and \215e).1 F .205 -(xible con\214guration.)-.15 F .205(Of k)5.205 F .505 -.15(ey i)-.1 H -.205(nterest to the mail system user will be the changes in the net-).15 -F -.1(wo)72 523.2 S(rk addressing structure.).1 E .624(In a simple netw) -97 539.4 R .624(ork, each node has an address, and resources can be identi\214ed with a host-resource) --.1 F .374(pair; in particular)72 551.4 R 2.874(,t)-.4 G .374 -(he mail system can refer to users using a host-username pair)-2.874 F -5.374(.H)-.55 G .375(ost names and numbers)-5.374 F(ha)72 563.4 Q .3 --.15(ve t)-.2 H 2.5(ob).15 G 2.5(ea)-2.5 G -(dministered by a central authority)-2.5 E 2.5(,b)-.65 G -(ut usernames can be assigned locally to each host.)-2.7 E .397 -(In an internet, multiple netw)97 579.6 R .396(orks with dif)-.1 F .396 -(ferent characteristics and managements must communicate.)-.25 F .389 -(In particular)72 591.6 R 2.889(,t)-.4 G .389 -(he syntax and semantics of resource identi\214cation change.)-2.889 F -.39(Certain special cases can be han-)5.389 F 1.033(dled tri)72 603.6 R -1.033(vially by)-.25 F F2 1.033(ad hoc)3.533 F F1 1.032 -(techniques, such as pro)3.533 F 1.032(viding netw)-.15 F 1.032 -(ork names that appear local to hosts on other)-.1 F(netw)72 615.6 Q -1.621(orks, as with the Ethernet at Xerox P)-.1 F 4.121(ARC. Ho)-.92 F -(we)-.25 E -.15(ve)-.25 G 2.421 -.4(r, t).15 H 1.622 -(he general case is e).4 F 1.622(xtremely comple)-.15 F 4.122(x. F)-.15 -F(or)-.15 E -.15(ex)72 627.6 S .29(ample, some netw).15 F .29 -(orks require that the route the message tak)-.1 F .29(es be e)-.1 F .29 -(xplicitly speci\214ed by the sender)-.15 F 2.79(,s)-.4 G(im-)-2.79 E -1.618(plifying the database update problem since only adjacent hosts must be entered into the system tables,) -72 639.6 R .573(while others use logical addressing, where the sender speci\214es the location of the recipient b) -72 651.6 R .573(ut not ho)-.2 F 3.072(wt)-.25 G(o)-3.072 E 1.065 -(get there.)72 663.6 R 1.065(Some netw)6.065 F 1.066 -(orks use a left-associati)-.1 F 1.366 -.15(ve s)-.25 H 1.066 -(yntax and others use a right-associati).15 F 1.366 -.15(ve s)-.25 H -1.066(yntax, causing).15 F .32 LW 76 673.2 72 673.2 DL 80 673.2 76 673.2 -DL 84 673.2 80 673.2 DL 88 673.2 84 673.2 DL 92 673.2 88 673.2 DL 96 -673.2 92 673.2 DL 100 673.2 96 673.2 DL 104 673.2 100 673.2 DL 108 673.2 -104 673.2 DL 112 673.2 108 673.2 DL 116 673.2 112 673.2 DL 120 673.2 116 -673.2 DL 124 673.2 120 673.2 DL 128 673.2 124 673.2 DL 132 673.2 128 -673.2 DL 136 673.2 132 673.2 DL 140 673.2 136 673.2 DL 144 673.2 140 -673.2 DL 148 673.2 144 673.2 DL 152 673.2 148 673.2 DL 156 673.2 152 -673.2 DL 160 673.2 156 673.2 DL 164 673.2 160 673.2 DL 168 673.2 164 -673.2 DL 172 673.2 168 673.2 DL 176 673.2 172 673.2 DL 180 673.2 176 -673.2 DL 184 673.2 180 673.2 DL 188 673.2 184 673.2 DL 192 673.2 188 -673.2 DL 196 673.2 192 673.2 DL 200 673.2 196 673.2 DL 204 673.2 200 -673.2 DL 208 673.2 204 673.2 DL 212 673.2 208 673.2 DL 216 673.2 212 -673.2 DL/F3 8/Times-Roman@0 SF .556(*A considerable part of this w)93.6 -685.2 R .556(ork w)-.08 F .556(as done while under the emplo)-.08 F -2.557(yo)-.08 G 2.557(ft)-2.557 G .557(he INGRES Project at the Uni) --2.557 F -.12(ve)-.2 G .557(rsity of California at).12 F(Berk)72 694.8 Q -(ele)-.08 E -.52(y.)-.12 G/F4 10/Times-Bold@0 SF(Mail Systems and Addr) -72 756 Q(essing in 4.2bsd)-.18 E(1)259.93 E EP -%%Page: 2 2 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Mail Systems and Addr)72 60 Q(essing in 4.2bsd) --.18 E(2)259.93 E/F1 10/Times-Roman@0 SF(ambiguity in mix)72 96 Q -(ed addresses.)-.15 E .679 -(Internet standards seek to eliminate these problems.)97 112.2 R -(Initially)5.678 E 3.178(,t)-.65 G .678(hese proposed e)-3.178 F .678 -(xpanding the address)-.15 F .331 -(pairs to address triples, consisting of {netw)72 124.2 R .331 -(ork, host, username} triples.)-.1 F(Netw)5.332 E .332 -(ork numbers must be uni)-.1 F -.15(ve)-.25 G -.2(r-).15 G 1.452 -(sally agreed upon, and hosts can be assigned locally on each netw)72 -136.2 R 3.952(ork. The)-.1 F(user)3.952 E(-le)-.2 E -.15(ve)-.25 G 3.952 -(lp).15 G 1.452(resentation w)-3.952 F(as)-.1 E .249(changed to address domains, comprised of a local resource identi\214cation and a hierarchical domain speci\214-) -72 148.2 R 1.54(cation with a common static root.)72 160.2 R 1.539 -(The domain technique separates the issue of ph)6.539 F 1.539(ysical v) --.05 F 1.539(ersus logical)-.15 F 3.001(addressing. F)72 172.2 R .501 -(or e)-.15 F .502(xample, an address of the form \231eric@a.cc.berk)-.15 -F(ele)-.1 E -.65(y.)-.15 G .502(arpa\232 describes the logical or).65 F --.05(ga)-.18 G(niza-).05 E .443(tion of the address space \(user \231eric\232 on host \231a\232 in the Computer Center at Berk) -72 184.2 R(ele)-.1 E .443(y\) b)-.15 F .443(ut not the ph)-.2 F(ysical) --.05 E(netw)72 196.2 Q .934(orks used \(for e)-.1 F .934 -(xample, this could go o)-.15 F -.15(ve)-.15 G 3.434(rd).15 G(if)-3.434 -E .934(ferent netw)-.25 F .935 -(orks depending on whether \231a\232 were on an)-.1 F -(ethernet or a store-and-forw)72 208.2 Q(ard netw)-.1 E(ork\).)-.1 E/F2 -10/Times-Italic@0 SF(Sendmail)97 224.4 Q F1 .493 -(is intended to help bridge the g)2.993 F .493(ap between the totally) --.05 F F2 .493(ad hoc)2.993 F F1 -.1(wo)2.993 G .493(rld of netw).1 F -.493(orks that kno)-.1 F(w)-.25 E .854 -(nothing of each other and the clean, tightly-coupled w)72 236.4 R .854 -(orld of unique netw)-.1 F .855(ork numbers.)-.1 F .855 -(It can accept old)5.855 F .633(arbitrary address syntax)72 248.4 R .632 -(es, resolving ambiguities using heuristics speci\214ed by the system administrator) --.15 F 3.132(,a)-.4 G(s)-3.132 E .347(well as domain-based addressing.) -72 260.4 R .347(It helps guide the con)5.347 F -.15(ve)-.4 G .347 -(rsion of message formats between disparate net-).15 F -.1(wo)72 272.4 S -3.395(rks. In).1 F(short,)3.395 E F2(sendmail)3.395 E F1 .894 -(is designed to assist a graceful transition to consistent internetw) -3.395 F .894(ork addressing)-.1 F(schemes.)72 284.4 Q .689 -(Section 1 de\214nes some of the terms frequently left fuzzy when w)97 -312.6 R .69(orking in mail systems.)-.1 F .69(Section 2)5.69 F .595 -(discusses the design goals for)72 324.6 R F2(sendmail)3.095 E F1 5.595 -(.I)C 3.095(ns)-5.595 G .595(ection 3, the ne)-3.095 F 3.095(wa)-.25 G -.594(ddress formats and basic features of)-3.095 F F2(send-)3.094 E -(mail)72 336.6 Q F1 .893(are described.)3.393 F .893 -(Section 4 discusses some of the special problems of the UUCP netw)5.893 -F 3.394(ork. The)-.1 F(dif)3.394 E(fer)-.25 E(-)-.2 E(ences between)72 -348.6 Q F2(sendmail)2.5 E F1(and)2.5 E F2(delivermail)2.5 E F1 -(are presented in section 5.)2.5 E F0(DISCLAIMER:)112 376.8 Q F1 3.333 -(An)3.333 G .833(umber of e)-3.333 F .832 -(xamples in this paper use names of actual people and)-.15 F(or)112 -388.8 Q -.05(ga)-.18 G 4.572(nizations. This).05 F 2.072 -(is not intended to imply a commitment or e)4.572 F -.15(ve)-.25 G 4.573 -(na).15 G 4.573(ni)-4.573 G(ntellectual)-4.573 E 1.094 -(agreement on the part of these people or or)112 400.8 R -.05(ga)-.18 G -3.594(nizations. In).05 F(particular)3.594 E 3.594(,B)-.4 G 1.094(ell T) --3.594 F(elephone)-.7 E .656 -(Laboratories \(BTL\), Digital Equipment Corporation \(DEC\), La)112 -412.8 R .657(wrence Berk)-.15 F(ele)-.1 E 3.157(yL)-.15 G(abo-)-3.157 E -2.136(ratories \(LBL\), Britton-Lee Incorporated \(BLI\), and the Uni) -112 424.8 R -.15(ve)-.25 G 2.136(rsity of California at).15 F(Berk)112 -436.8 Q(ele)-.1 E 3.088(ya)-.15 G .588(re not committed to an)-3.088 F -3.089(yo)-.15 G 3.089(ft)-3.089 G .589(hese proposals at this time.) --3.089 F .589(Much of this paper)5.589 F -(represents no more than the personal opinions of the author)112 448.8 Q -(.)-.55 E F0 2.5(1. DEFINITIONS)72 477 R F1 .266(There are four basic concepts that must be clearly distinguished when dealing with mail systems:) -112 493.2 R .514(the user \(or the user')87 505.2 R 3.014(sa)-.55 G .515 -(gent\), the user')-3.014 F 3.015(si)-.55 G .515 -(denti\214cation, the user')-3.015 F 3.015(sa)-.55 G .515 -(ddress, and the route.)-3.015 F .515(These are dis-)5.515 F -(tinguished primarily by their position independence.)87 517.2 Q F0 2.5 -(1.1. User)87 541.2 R(and Identi\214cation)2.5 E F1 .264(The user is the being \(a person or program\) that is creating or recei) -127 557.4 R .263(ving a message.)-.25 F(An)5.263 E F2 -.1(age)2.763 G -(nt).1 E F1 .659(is an entity operating on behalf of the user \212 such as a secretary who handles my mail.) -102 569.4 R .66(or a pro-)5.66 F(gram that automatically returns a message such as \231I am at the UNICOM conference.) -102 581.4 Q<9a>-.7 E .931(The identi\214cation is the tag that goes along with the particular user) -127 597.6 R 5.931(.T)-.55 G .931(his tag is completely)-5.931 F .216 -(independent of location.)102 609.6 R -.15(Fo)5.216 G 2.716(re).15 G -.216(xample, my identi\214cation is the string \231Eric Allman,)-2.866 F -2.717<9a61>-.7 G .217(nd this identi-)-2.717 F 1.228 -(\214cation does not change whether I am located at U.C. Berk)102 621.6 -R(ele)-.1 E 2.527 -.65(y, a)-.15 H 3.727(tB).65 G 1.227 -(ritton-Lee, or at a scienti\214c)-3.727 F(institute in Austria.)102 -633.6 Q 2.379(Since the identi\214cation is frequently ambiguous \(e.g., there are tw) -127 649.8 R 4.879<6f99>-.1 G 2.38(Robert Henry\232s at)-4.879 F(Berk)102 -661.8 Q(ele)-.1 E .316(y\) it is common to add other disambiguating information that is not strictly part of the iden-) --.15 F(ti\214cation \(e.g., Robert \231Code Generator\232 Henry v)102 -673.8 Q(ersus Robert \231System Administrator\232 Henry\).)-.15 E F0 -1 -(Ve)72 756 S(rsion 8.2)1 E(USENIX \255 J)130.475 E(an 83)-.15 E -(Last Mod 11/27/1993)88.355 E EP -%%Page: 3 3 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Mail Systems and Addr)72 60 Q(essing in 4.2bsd) --.18 E(3)259.93 E 2.5(1.2. Addr)87 96 R(ess)-.18 E/F1 10/Times-Roman@0 -SF .785(The address speci\214es a location.)127 112.2 R .786(As I mo) -5.786 F 1.086 -.15(ve a)-.15 H .786(round, my address changes.).15 F --.15(Fo)5.786 G 3.286(re).15 G .786(xample, my)-3.436 F .749 -(address might change from \231eric@Berk)102 124.2 R(ele)-.1 E -.65(y.) --.15 G(ARP).65 E .749 -(A\232 to \231eric@bli.UUCP\232 or \231allman@IIASA.Aus-)-.92 F -(tria\232 depending on my current af)102 136.2 Q(\214liation.)-.25 E(Ho) -127 152.4 Q(we)-.25 E -.15(ve)-.25 G 2.819 -.4(r, a).15 H 4.519(na).4 G -2.019(ddress is independent of the location of an)-4.519 F 2.019 -(yone else.)-.15 F 2.02(That is, my address)7.02 F .385 -(remains the same to e)102 164.4 R -.15(ve)-.25 G .385 -(ryone who might be sending me mail.).15 F -.15(Fo)5.385 G 2.885(re).15 -G .385(xample, a person at MIT and a)-3.035 F -(person at USC could both send to \231eric@Berk)102 176.4 Q(ele)-.1 E --.65(y.)-.15 G(ARP).65 E(A\232 and ha)-.92 E .3 -.15(ve i)-.2 H 2.5(ta) -.15 G(rri)-2.5 E .3 -.15(ve t)-.25 H 2.5(ot).15 G(he same mailbox.)-2.5 -E .627(Ideally a \231white pages\232 service w)127 192.6 R .627 -(ould be pro)-.1 F .627 -(vided to map user identi\214cations into addresses)-.15 F .444(\(for e) -102 204.6 R .444(xample, see [Solomon81]\).)-.15 F .444 -(Currently this is handled by passing around scraps of paper or by)5.444 -F(calling people on the telephone to \214nd out their address.)102 216.6 -Q F0 2.5(1.3. Route)87 240.6 R F1 .288(While an address speci\214es)127 -256.8 R/F2 10/Times-Italic@0 SF(wher)2.788 E(e)-.37 E F1 .289 -(to \214nd a mailbox, a route speci\214es)2.789 F F2(how)2.789 E F1 .289 -(to \214nd the mailbox.)2.789 F(Speci\214cally)102 268.8 Q 2.607(,i)-.65 -G 2.607(ts)-2.607 G .106(peci\214es a path from sender to recei)-2.607 F --.15(ve)-.25 G 3.706 -.55(r. A).15 H 2.606(ss).55 G .106 -(uch, the route is potentially dif)-2.606 F .106(ferent for)-.25 F -2.15 --.25(ev e)102 280.8 T(ry pair of people in the electronic uni).25 E -.15 -(ve)-.25 G(rse.).15 E .258 -(Normally the route is hidden from the user by the softw)127 297 R 2.758 -(are. Ho)-.1 F(we)-.25 E -.15(ve)-.25 G 1.058 -.4(r, s).15 H .258 -(ome netw).4 F .258(orks put the)-.1 F -.2(bu)102 309 S 1.972 -(rden of determining the route onto the sender).2 F 6.971(.A)-.55 G -1.971(lthough this simpli\214es the softw)-6.971 F 1.971(are, it also) --.1 F(greatly impairs the usability for most users.)102 321 Q -(The UUCP netw)5 E(ork is an e)-.1 E(xample of such a netw)-.15 E(ork.) --.1 E F0 2.5(2. DESIGN)72 345 R(GO)2.5 E(ALS)-.4 E F1(Design goals for) -112 363.2 Q F2(sendmail)2.5 E/F3 7/Times-Roman@0 SF(1)-4 I F1(include:) -2.5 4 M 12.5(\(1\) Compatibility)92 379.4 R 1.363(with the e)3.863 F -1.363(xisting mail programs, including Bell v)-.15 F 1.363 -(ersion 6 mail, Bell v)-.15 F 1.364(ersion 7)-.15 F 3.589(mail, Berk) -118.66 391.4 R(ele)-.1 E(y)-.15 E F2(Mail)6.089 E F1 3.589 -([Shoens79], BerkNet mail [Schmidt79], and hopefully UUCP mail)6.089 F -([No)118.66 403.4 Q 2.5(witz78]. ARP)-.25 F(ANET mail [Crock)-.92 E -(er82] w)-.1 E(as also required.)-.1 E 12.5(\(2\) Reliability)92 419.6 R -4.002(,i)-.65 G 4.002(nt)-4.002 G 1.502(he sense of guaranteeing that e) --4.002 F -.15(ve)-.25 G 1.502(ry message is correctly deli).15 F -.15 -(ve)-.25 G 1.503(red or at least).15 F .368(brought to the attention of a human for correct disposal; no message should e) -118.66 431.6 R -.15(ve)-.25 G 2.868(rb).15 G 2.868(ec)-2.868 G -(ompletely)-2.868 E 2.54(lost. This)118.66 443.6 R .04(goal w)2.54 F -.041(as considered essential because of the emphasis on mail in our en) --.1 F 2.541(vironment. It)-.4 F 1.755 -(has turned out to be one of the hardest goals to satisfy)118.66 455.6 R -4.254(,e)-.65 G 1.754(specially in the f)-4.254 F 1.754(ace of the man) --.1 F(y)-.15 E .977(anomalous message formats produced by v)118.66 467.6 -R .977(arious ARP)-.25 F .977(ANET sites.)-.92 F -.15(Fo)5.977 G 3.478 -(re).15 G .978(xample, certain sites)-3.628 F .069 -(generate improperly formated addresses, occasionally causing error) -118.66 479.6 R .069(-message loops.)-.2 F .068(Some hosts)5.069 F .766(use blanks in names, causing problems with mail programs that assume that an address is one) -118.66 491.6 R -.1(wo)118.66 503.6 S 3.924(rd. The).1 F 1.423 -(semantics of some \214elds are interpreted slightly dif)3.923 F 1.423 -(ferently by dif)-.25 F 1.423(ferent sites.)-.25 F(In)6.423 E(summary) -118.66 515.6 Q 3.022(,t)-.65 G .523(he obscure features of the ARP) --3.022 F .523(ANET mail protocol really)-.92 F F2(ar)3.023 E(e)-.37 E F1 -.523(used and are dif)3.023 F(\214cult)-.25 E(to support, b)118.66 527.6 -Q(ut must be supported.)-.2 E 12.5(\(3\) Existing)92 543.8 R(softw)2.939 -E .439(are to do actual deli)-.1 F -.15(ve)-.25 G .439 -(ry should be used whene).15 F -.15(ve)-.25 G 2.938(rp).15 G 2.938 -(ossible. This)-2.938 F .438(goal deri)2.938 F -.15(ve)-.25 G 2.938(sa) -.15 G(s)-2.938 E -(much from political and practical considerations as technical.)118.66 -555.8 Q 12.5(\(4\) Easy)92 572 R -.15(ex)2.898 G .398(pansion to f).15 F -.398(airly comple)-.1 F 2.898(xe)-.15 G -.4(nv)-2.898 G .399 -(ironments, including multiple connections to a single net-).4 F -.1(wo) -118.66 584 S .63(rk type \(such as with multiple UUCP or Ethernets\).).1 -F .63(This goal requires consideration of the)5.63 F(contents of an address as well as its syntax in order to determine which g) -118.66 596 Q(ate)-.05 E -.1(wa)-.25 G 2.5(yt).1 G 2.5(ou)-2.5 G(se.)-2.5 -E 12.5(\(5\) Con\214guration)92 612.2 R 1.048 -(information should not be compiled into the code.)3.548 F 3.549(As) -6.049 G 1.049(ingle compiled program)-3.549 F .084 -(should be able to run as is at an)118.66 624.2 R 2.584(ys)-.15 G .083 -(ite \(barring such basic changes as the CPU type or the operat-)-2.584 -F .342(ing system\).)118.66 636.2 R 1.942 -.8(We h)5.342 H -2.25 -.2 -(av e).8 H .343 -(found this seemingly unimportant goal to be critical in real life.) -3.042 F(Besides)5.343 E .734(the simple problems that occur when an) -118.66 648.2 R 3.234(yp)-.15 G .734(rogram gets recompiled in a dif) --3.234 F .733(ferent en)-.25 F(vironment,)-.4 E(man)118.66 660.2 Q 2.5 -(ys)-.15 G(ites lik)-2.5 E 2.5(et)-.1 G 2.5<6f99>-2.5 G -(\214ddle\232 with an)-2.5 E(ything that the)-.15 E 2.5(yw)-.15 G -(ill be recompiling an)-2.5 E(yw)-.15 E(ay)-.1 E(.)-.65 E .32 LW 76 -678.8 72 678.8 DL 80 678.8 76 678.8 DL 84 678.8 80 678.8 DL 88 678.8 84 -678.8 DL 92 678.8 88 678.8 DL 96 678.8 92 678.8 DL 100 678.8 96 678.8 DL -104 678.8 100 678.8 DL 108 678.8 104 678.8 DL 112 678.8 108 678.8 DL 116 -678.8 112 678.8 DL 120 678.8 116 678.8 DL 124 678.8 120 678.8 DL 128 -678.8 124 678.8 DL 132 678.8 128 678.8 DL 136 678.8 132 678.8 DL 140 -678.8 136 678.8 DL 144 678.8 140 678.8 DL 148 678.8 144 678.8 DL 152 -678.8 148 678.8 DL 156 678.8 152 678.8 DL 160 678.8 156 678.8 DL 164 -678.8 160 678.8 DL 168 678.8 164 678.8 DL 172 678.8 168 678.8 DL 176 -678.8 172 678.8 DL 180 678.8 176 678.8 DL 184 678.8 180 678.8 DL 188 -678.8 184 678.8 DL 192 678.8 188 678.8 DL 196 678.8 192 678.8 DL 200 -678.8 196 678.8 DL 204 678.8 200 678.8 DL 208 678.8 204 678.8 DL 212 -678.8 208 678.8 DL 216 678.8 212 678.8 DL/F4 5/Times-Roman@0 SF(1)93.6 -689.2 Q/F5 8/Times-Roman@0 SF(This section mak)3.2 I -(es no distinction between)-.08 E/F6 8/Times-Italic@0 SF(delivermail)2 E -F5(and)2 E F6(sendmail.)2 E F0 -1(Ve)72 756 S(rsion 8.2)1 E -(USENIX \255 J)130.475 E(an 83)-.15 E(Last Mod 11/27/1993)88.355 E EP -%%Page: 4 4 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Mail Systems and Addr)72 60 Q(essing in 4.2bsd) --.18 E(4)259.93 E/F1 10/Times-Roman@0 SF(\(6\))92 96 Q/F2 10 -/Times-Italic@0 SF(Sendmail)15 E F1 .184(must be able to let v)2.684 F -.184(arious groups maintain their o)-.25 F .184 -(wn mailing lists, and let indi)-.25 F(viduals)-.25 E(specify their o) -118.66 108 Q(wn forw)-.25 E -(arding, without modifying the system alias \214le.)-.1 E 12.5 -(\(7\) Each)92 124.2 R .313 -(user should be able to specify which mailer to e)2.814 F -.15(xe)-.15 G -.313(cute to process mail being deli).15 F -.15(ve)-.25 G .313(red for) -.15 F 3.098(him. This)118.66 136.2 R .598(feature allo)3.098 F .598 -(ws users who are using specialized mailers that use a dif)-.25 F .598 -(ferent format to)-.25 F -.2(bu)118.66 148.2 S .25(ild their en).2 F .25 -(vironment without changing the system, and f)-.4 F .25 -(acilitates specialized functions \(such)-.1 F -(as returning an \231I am on v)118.66 160.2 Q(acation\232 message\).) --.25 E 12.5(\(8\) Netw)92 176.4 R 1.552(ork traf)-.1 F 1.552(\214c should be minimized by batching addresses to a single host where possible,) --.25 F(without assistance from the user)118.66 188.4 Q(.)-.55 E .375 -(These goals moti)112 204.6 R -.25(va)-.25 G .375 -(ted the architecture illustrated in \214gure 1.).25 F .374 -(The user interacts with a mail gen-)5.375 F .49 -(erating and sending program.)87 216.6 R .491 -(When the mail is created, the generator calls)5.49 F F2(sendmail)2.991 -E F1 2.991(,w)C .491(hich routes the)-2.991 F .841 -(message to the correct mailer\(s\).)87 228.6 R .841 -(Since some of the senders may be netw)5.841 F .84(ork serv)-.1 F .84 -(ers and some of the)-.15 F(mailers may be netw)87 240.6 Q(ork clients,) --.1 E F2(sendmail)2.5 E F1(may be used as an internet mail g)2.5 E(ate) --.05 E -.1(wa)-.25 G -.65(y.).1 G F0 2.5(3. USA)72 264.6 R(GE)-.55 E 2.5 -(3.1. Addr)87 288.6 R(ess F)-.18 E(ormats)-.25 E F1(Ar)127 304.8 Q .886 -(guments may be \215ags or addresses.)-.18 F .886(Flags set v)5.886 F -.886(arious processing options.)-.25 F -.15(Fo)5.886 G(llo).15 E .886 -(wing \215ag)-.25 F(ar)102 316.8 Q .611(guments, address ar)-.18 F .611 -(guments may be gi)-.18 F -.15(ve)-.25 G 3.111(n. Addresses).15 F(follo) -3.111 E 3.111(wt)-.25 G .611(he syntax in RFC822 [Crock)-3.111 F(er82]) --.1 E(for ARP)102 328.8 Q(ANET address formats.)-.92 E -(In brief, the format is:)5 E 12.5(\(1\) An)107 345 R -(ything in parentheses is thro)-.15 E(wn a)-.25 E -.1(wa)-.15 G 2.5(y\() -.1 G(as a comment\).)-2.5 E 12.5(\(2\) An)107 361.2 R .051 -(ything in angle brack)-.15 F .051(ets \(\231<)-.1 F .051 -(>\232\) is preferred o)1.666 F -.15(ve)-.15 G 2.551(ra).15 G -.15(ny) --2.551 G .051(thing else.).15 F .051(This rule implements the)5.051 F -(ARP)133.66 373.2 Q(ANET standard that addresses of the form)-.92 E .4 -LW 77 408 72 408 DL 79 408 74 408 DL 84 408 79 408 DL 89 408 84 408 DL -94 408 89 408 DL 99 408 94 408 DL 104 408 99 408 DL 109 408 104 408 DL -114 408 109 408 DL 119 408 114 408 DL 124 408 119 408 DL 129 408 124 408 -DL 134 408 129 408 DL 139 408 134 408 DL 144 408 139 408 DL 149 408 144 -408 DL 154 408 149 408 DL 159 408 154 408 DL 164 408 159 408 DL 169 408 -164 408 DL 174 408 169 408 DL 179 408 174 408 DL 184 408 179 408 DL 189 -408 184 408 DL 194 408 189 408 DL 199 408 194 408 DL 204 408 199 408 DL -209 408 204 408 DL 214 408 209 408 DL 219 408 214 408 DL 224 408 219 408 -DL 229 408 224 408 DL 234 408 229 408 DL 239 408 234 408 DL 244 408 239 -408 DL 249 408 244 408 DL 254 408 249 408 DL 259 408 254 408 DL 264 408 -259 408 DL 269 408 264 408 DL 274 408 269 408 DL 279 408 274 408 DL 284 -408 279 408 DL 289 408 284 408 DL 294 408 289 408 DL 299 408 294 408 DL -304 408 299 408 DL 309 408 304 408 DL 314 408 309 408 DL 319 408 314 408 -DL 324 408 319 408 DL 329 408 324 408 DL 334 408 329 408 DL 339 408 334 -408 DL 344 408 339 408 DL 349 408 344 408 DL 354 408 349 408 DL 359 408 -354 408 DL 364 408 359 408 DL 369 408 364 408 DL 374 408 369 408 DL 379 -408 374 408 DL 384 408 379 408 DL 389 408 384 408 DL 394 408 389 408 DL -399 408 394 408 DL 404 408 399 408 DL 409 408 404 408 DL 414 408 409 408 -DL 419 408 414 408 DL 424 408 419 408 DL 429 408 424 408 DL 434 408 429 -408 DL 439 408 434 408 DL 444 408 439 408 DL 449 408 444 408 DL 454 408 -449 408 DL 459 408 454 408 DL 464 408 459 408 DL 469 408 464 408 DL 474 -408 469 408 DL 479 408 474 408 DL 484 408 479 408 DL 489 408 484 408 DL -494 408 489 408 DL 499 408 494 408 DL 504 408 499 408 DL -(Figure 1 \212 Sendmail System Structure.)208 660 Q 77 672 72 672 DL 79 -672 74 672 DL 84 672 79 672 DL 89 672 84 672 DL 94 672 89 672 DL 99 672 -94 672 DL 104 672 99 672 DL 109 672 104 672 DL 114 672 109 672 DL 119 -672 114 672 DL 124 672 119 672 DL 129 672 124 672 DL 134 672 129 672 DL -139 672 134 672 DL 144 672 139 672 DL 149 672 144 672 DL 154 672 149 672 -DL 159 672 154 672 DL 164 672 159 672 DL 169 672 164 672 DL 174 672 169 -672 DL 179 672 174 672 DL 184 672 179 672 DL 189 672 184 672 DL 194 672 -189 672 DL 199 672 194 672 DL 204 672 199 672 DL 209 672 204 672 DL 214 -672 209 672 DL 219 672 214 672 DL 224 672 219 672 DL 229 672 224 672 DL -234 672 229 672 DL 239 672 234 672 DL 244 672 239 672 DL 249 672 244 672 -DL 254 672 249 672 DL 259 672 254 672 DL 264 672 259 672 DL 269 672 264 -672 DL 274 672 269 672 DL 279 672 274 672 DL 284 672 279 672 DL 289 672 -284 672 DL 294 672 289 672 DL 299 672 294 672 DL 304 672 299 672 DL 309 -672 304 672 DL 314 672 309 672 DL 319 672 314 672 DL 324 672 319 672 DL -329 672 324 672 DL 334 672 329 672 DL 339 672 334 672 DL 344 672 339 672 -DL 349 672 344 672 DL 354 672 349 672 DL 359 672 354 672 DL 364 672 359 -672 DL 369 672 364 672 DL 374 672 369 672 DL 379 672 374 672 DL 384 672 -379 672 DL 389 672 384 672 DL 394 672 389 672 DL 399 672 394 672 DL 404 -672 399 672 DL 409 672 404 672 DL 414 672 409 672 DL 419 672 414 672 DL -424 672 419 672 DL 429 672 424 672 DL 434 672 429 672 DL 439 672 434 672 -DL 444 672 439 672 DL 449 672 444 672 DL 454 672 449 672 DL 459 672 454 -672 DL 464 672 459 672 DL 469 672 464 672 DL 474 672 469 672 DL 479 672 -474 672 DL 484 672 479 672 DL 489 672 484 672 DL 494 672 489 672 DL 499 -672 494 672 DL 504 672 499 672 DL F0 -1(Ve)72 756 S(rsion 8.2)1 E -(USENIX \255 J)130.475 E(an 83)-.15 E(Last Mod 11/27/1993)88.355 E EP -%%Page: 5 5 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Mail Systems and Addr)72 60 Q(essing in 4.2bsd) --.18 E(5)259.93 E/F1 10/Times-Roman@0 SF(user name <machine-address>) -173.66 96 Q(will send to the electronic \231machine-address\232 rather than the human \231user name.) -133.66 112.2 Q<9a>-.7 E 12.5(\(3\) Double)107 128.4 R 2.246(quotes \() -4.746 F -2.754 2.5("\) q)2.5 H 2.246 -(uote phrases; backslashes quote characters.)-2.5 F 2.246 -(Backslashes are more)7.246 F(po)133.66 140.4 Q .654(werful in that the) --.25 F 3.154(yw)-.15 G .655(ill cause otherwise equi)-3.154 F -.25(va) --.25 G .655(lent phrases to compare dif).25 F .655(ferently \212 for) --.25 F -.15(ex)133.66 152.4 S(ample,).15 E/F2 10/Times-Italic@0 SF(user) -3.873 E F1(and)3.873 E F2("user")3.872 E F1 1.372(are equi)3.872 F -.25 -(va)-.25 G 1.372(lent, b).25 F(ut)-.2 E F2(\\user)3.872 E F1 1.372 -(is dif)3.872 F 1.372(ferent from either of them.)-.25 F(This)6.372 E -(might be used to a)133.66 164.4 Q -.2(vo)-.2 G -(id normal aliasing or duplicate suppression algorithms.).2 E -.15(Pa) -127 180.6 S 1.12(rentheses, angle brack).15 F 1.12 -(ets, and double quotes must be properly balanced and nested.)-.1 F(The) -6.12 E(re)102 194.6 Q(writing rules control remaining parsing)-.25 E/F3 -7/Times-Roman@0 SF(2)-4 I F1(.)4 I .644(Although old style addresses are still accepted in most cases, the preferred address format is) -127 210.8 R .299(based on ARP)102 222.8 R(ANET)-.92 E .299 -(-style domain-based addresses [Su82a].)-.92 F .299 -(These addresses are based on a hierar)5.299 F(-)-.2 E .13 -(chical, logical decomposition of the address space.)102 234.8 R .13 -(The addresses are hierarchical in a sense similar)5.13 F 1.133(to the U.S. postal addresses: the messages may \214rst be routed to the correct state, with no initial) -102 246.8 R .72(consideration of the city or other addressing details.) -102 258.8 R .72(The addresses are logical in that each step in)5.72 F -(the hierarch)102 270.8 Q 2.5(yc)-.05 G -(orresponds to a set of \231naming authorities\232 rather than a ph)-2.5 -E(ysical netw)-.05 E(ork.)-.1 E -.15(Fo)127 287 S 2.5(re).15 G -(xample, the address:)-2.65 E(eric@HostA.BigSite.ARP)142 303.2 Q(A)-.92 -E -.1(wo)102 319.4 S .851(uld \214rst look up the domain BigSite in the namespace administrated by ARP) -.1 F 3.351(A. A)-.92 F .851(query could)3.351 F 1.476 -(then be sent to BigSite for interpretation of HostA.)102 331.4 R(Ev) -6.475 E 1.475(entually the mail w)-.15 F 1.475(ould arri)-.1 F 1.775 --.15(ve a)-.25 H 3.975(tH).15 G(ostA,)-3.975 E(which w)102 343.4 Q -(ould then do \214nal deli)-.1 E -.15(ve)-.25 G(ry to user \231eric.).15 -E<9a>-.7 E F0 2.5(3.2. Mail)87 367.4 R(to Files and Pr)2.5 E(ograms)-.18 -E F1 .609(Files and programs are le)127 383.6 R .609 -(gitimate message recipients.)-.15 F .609(Files pro)5.609 F .609 -(vide archi)-.15 F -.25(va)-.25 G 3.109(ls).25 G .61(torage of mes-) --3.109 F .124(sages, useful for project administration and history)102 -395.6 R 5.124(.P)-.65 G .124(rograms are useful as recipients in a v) --5.124 F .124(ariety of)-.25 F .69(situations, for e)102 407.6 R .691(xample, to maintain a public repository of systems messages \(such as the Berk) --.15 F(ele)-.1 E(y)-.15 E F2(msgs)102 419.6 Q F1(program\).)2.5 E(An)127 -435.8 Q 3.188(ya)-.15 G .688(ddress passing through the initial parsing algorithm as a local address \(i.e, not appear) --3.188 F(-)-.2 E .276(ing to be a v)102 447.8 R .276 -(alid address for another mailer\) is scanned for tw)-.25 F 2.776(os)-.1 -G .277(pecial cases.)-2.776 F .277(If pre\214x)5.277 F .277(ed by a v) --.15 F(erti-)-.15 E .18(cal bar \(\231)102 459.8 R .833<7c9a>.833 G 2.68 -(\)t)-.833 G .179 -(he rest of the address is processed as a shell command.)-2.68 F .179 -(If the user name be)5.179 F .179(gins with a)-.15 F(slash mark \(\231/) -102 471.8 Q -(\232\) the name is used as a \214le name, instead of a login name.).833 -E F0 2.5(3.3. Aliasing,)87 495.8 R -.25(Fo)2.5 G(rwarding, Inclusion).25 -E F2(Sendmail)127 512 Q F1 1.074(reroutes mail three w)3.574 F 3.574 -(ays. Aliasing)-.1 F 1.075(applies system wide.)3.575 F -.15(Fo)6.075 G -(rw).15 E 1.075(arding allo)-.1 F 1.075(ws each)-.25 F .233 -(user to reroute incoming mail destined for that account.)102 524 R .233 -(Inclusion directs)5.233 F F2(sendmail)2.733 E F1 .233 -(to read a \214le for)2.733 F 2.5(al)102 536 S -(ist of addresses, and is normally used in conjunction with aliasing.) --2.5 E F0 2.5(3.3.1. Aliasing)102 560 R F1 .065(Aliasing maps local addresses to address lists using a system-wide \214le.) -142 576.2 R .065(This \214le is hashed)5.065 F 1.546(to speed access.) -117 588.2 R 1.545(Only addresses that parse as local are allo)6.546 F -1.545(wed as aliases; this guarantees a)-.25 F(unique k)117 600.2 Q .3 --.15(ey \()-.1 H(since there are no nicknames for the local host\).).15 -E F0 2.5(3.3.2. F)102 624.2 R(orwarding)-.25 E F1 .641 -(After aliasing, if an recipient address speci\214es a local user)142 -640.4 R F2(sendmail)3.141 E F1 .641(searches for a \231.for)3.141 F(-) --.2 E -.1(wa)117 652.4 S .413(rd\232 \214le in the recipient').1 F 2.913 -(sh)-.55 G .413(ome directory)-2.913 F 5.413(.I)-.65 G 2.913(fi)-5.413 G -2.913(te)-2.913 G .413(xists, the message is)-3.063 F F2(not)2.913 E F1 -.412(sent to that user)2.913 F 2.912(,b)-.4 G(ut)-3.112 E .745 -(rather to the list of addresses in that \214le.)117 664.4 R .746 -(Often this list will contain only one address, and the)5.746 F -(feature will be used for netw)117 676.4 Q(ork mail forw)-.1 E(arding.) --.1 E .32 LW 76 686 72 686 DL 80 686 76 686 DL 84 686 80 686 DL 88 686 -84 686 DL 92 686 88 686 DL 96 686 92 686 DL 100 686 96 686 DL 104 686 -100 686 DL 108 686 104 686 DL 112 686 108 686 DL 116 686 112 686 DL 120 -686 116 686 DL 124 686 120 686 DL 128 686 124 686 DL 132 686 128 686 DL -136 686 132 686 DL 140 686 136 686 DL 144 686 140 686 DL 148 686 144 686 -DL 152 686 148 686 DL 156 686 152 686 DL 160 686 156 686 DL 164 686 160 -686 DL 168 686 164 686 DL 172 686 168 686 DL 176 686 172 686 DL 180 686 -176 686 DL 184 686 180 686 DL 188 686 184 686 DL 192 686 188 686 DL 196 -686 192 686 DL 200 686 196 686 DL 204 686 200 686 DL 208 686 204 686 DL -212 686 208 686 DL 216 686 212 686 DL/F4 5/Times-Roman@0 SF(2)93.6 696.4 -Q/F5 8/Times-Roman@0 SF -(Disclaimer: Some special processing is done after re)3.2 I -(writing local names; see belo)-.2 E -.52(w.)-.2 G F0 -1(Ve)72 756 S -(rsion 8.2)1 E(USENIX \255 J)130.475 E(an 83)-.15 E(Last Mod 11/27/1993) -88.355 E EP -%%Page: 6 6 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Mail Systems and Addr)72 60 Q(essing in 4.2bsd) --.18 E(6)259.93 E/F1 10/Times-Roman@0 SF -.15(Fo)142 96 S(rw).15 E 1.152 -(arding also permits a user to specify a pri)-.1 F -.25(va)-.25 G 1.151 -(te incoming mailer).25 F 6.151(.F)-.55 G 1.151(or e)-6.301 F 1.151 -(xample, for)-.15 F(-)-.2 E -.1(wa)117 108 S(rding to:).1 E -2.5 .833 -("| /)157 124.2 T(usr/local/ne)-.833 E(wmail myname")-.25 E -(will use a dif)117 140.4 Q(ferent incoming mailer)-.25 E(.)-.55 E F0 -2.5(3.3.3. Inclusion)102 164.4 R F1 -(Inclusion is speci\214ed in RFC 733 [Crock)142 180.6 Q(er77] syntax:) --.1 E(:Include: pathname)157 196.8 Q .391 -(An address of this form reads the \214le speci\214ed by)117 213 R/F2 10 -/Times-Italic@0 SF(pathname)2.891 E F1 .391 -(and sends to all users listed in that)2.891 F(\214le.)117 225 Q .645 -(The intent is)142 241.2 R F2(not)3.145 E F1 .644 -(to support direct use of this feature, b)3.145 F .644 -(ut rather to use this as a subset of)-.2 F 2.5(aliasing. F)117 253.2 R -(or e)-.15 E(xample, an alias of the form:)-.15 E -(project: :include:/usr/project/userlist)157 269.4 Q 1.93(is a method of letting a project maintain a mailing list without interaction with the system) -117 285.6 R(administration, e)117 297.6 Q -.15(ve)-.25 G 2.5(ni).15 G -2.5(ft)-2.5 G(he alias \214le is protected.)-2.5 E 2.025 -(It is not necessary to reb)142 313.8 R 2.025(uild the inde)-.2 F 4.524 -(xo)-.15 G 4.524(nt)-4.524 G 2.024 -(he alias database when a :include: list is)-4.524 F(changed.)117 325.8 -Q F0 2.5(3.4. Message)87 349.8 R(Collection)2.5 E F1 .857 -(Once all recipient addresses are parsed and v)127 366 R .857 -(eri\214ed, the message is collected.)-.15 F .857(The message)5.857 F -.574(comes in tw)102 378 R 3.074(op)-.1 G .574 -(arts: a message header and a message body)-3.074 F 3.074(,s)-.65 G .574 -(eparated by a blank line.)-3.074 F .573(The body is)5.574 F -(an uninterpreted sequence of te)102 390 Q(xt lines.)-.15 E -(The header is formated as a series of lines of the form)127 406.2 Q -(\214eld-name: \214eld-v)178 422.4 Q(alue)-.25 E(Field-v)102 438.6 Q -1.366(alue can be split across lines by starting the follo)-.25 F 1.366 -(wing lines with a space or a tab)-.25 F 6.366(.S)-.4 G(ome)-6.366 E -.211(header \214elds ha)102 450.6 R .511 -.15(ve s)-.2 H .211 -(pecial internal meaning, and ha).15 F .511 -.15(ve a)-.2 H .211 -(ppropriate special processing.).15 F .21(Other headers)5.21 F -(are simply passed through.)102 462.6 Q -(Some header \214elds may be added automatically)5 E 2.5(,s)-.65 G -(uch as time stamps.)-2.5 E F0 2.5(4. THE)72 486.6 R(UUCP PR)2.5 E -(OBLEM)-.3 E F1 .43(Of particular interest is the UUCP netw)112 502.8 R -2.93(ork. The)-.1 F -.15(ex)2.93 G .43 -(plicit routing used in the UUCP en).15 F(vironment)-.4 E .909 -(causes a number of serious problems.)87 514.8 R .909(First, gi)5.909 F -.908(ving out an address is impossible without kno)-.25 F .908(wing the) --.25 F .453(address of your potential correspondent.)87 526.8 R .454 -(This is typically handled by specifying the address relati)5.453 F .754 --.15(ve t)-.25 H(o).15 E 1.208(some \231well-kno)87 538.8 R 1.208 -(wn\232 host \(e.g., ucb)-.25 F -.25(va)-.15 G 3.708(xo).25 G 3.708(rd) --3.708 G(ecv)-3.708 E 3.708(ax\). Second,)-.25 F 1.207(it is often dif) -3.708 F 1.207(\214cult to compute the set of)-.25 F .157 -(addresses to reply to without some kno)87 550.8 R .157 -(wledge of the topology of the netw)-.25 F 2.657(ork. Although)-.1 F -.157(it may be easy)2.657 F .352(for a human being to do this under man) -87 562.8 R 2.851(yc)-.15 G .351(ircumstances, a program does not ha) --2.851 F .651 -.15(ve e)-.2 H .351(qually sophisticated).15 F 1.153 -(heuristics b)87 574.8 R 1.153(uilt in.)-.2 F 1.154(Third, certain addresses will become painfully and unnecessarily long, as when a) -6.153 F .406(message is routed through man)87 586.8 R 2.906(yh)-.15 G -.406(osts in the USENET)-2.906 F 5.406(.A)-.74 G .406(nd \214nally) --5.406 F 2.905(,c)-.65 G .405(ertain \231mix)-2.905 F .405 -(ed domain\232 addresses)-.15 F -(are impossible to parse unambiguously \212 e.g.,)87 598.8 Q(decv)127 -615 Q(ax!ucb)-.25 E -.25(va)-.15 G(x!lbl-h!user@LBL-CSAM).25 E .378 -(might ha)87 631.2 R .678 -.15(ve m)-.2 H(an).15 E 2.878(yp)-.15 G .379 -(ossible resolutions, depending on whether the message w)-2.878 F .379 -(as \214rst routed to decv)-.1 F .379(ax or)-.25 F(to LBL-CSAM.)87 643.2 -Q 2.32 -.8(To s)112 659.4 T(olv).8 E 3.22(et)-.15 G .72 -(his problem, the UUCP syntax w)-3.22 F .719(ould ha)-.1 F 1.019 -.15 -(ve t)-.2 H 3.219(ob).15 G 3.219(ec)-3.219 G .719 -(hanged to use addresses rather than)-3.219 F 3.718(routes. F)87 671.4 R -1.218(or e)-.15 F 1.218(xample, the address \231decv)-.15 F(ax!ucb)-.25 -E -.25(va)-.15 G 1.218(x!eric\232 might be e).25 F 1.218 -(xpressed as \231eric@ucb)-.15 F -.25(va)-.15 G(x.UUCP\232).25 E .079 -(\(with the hop through decv)87 683.4 R .079(ax implied\).)-.25 F .079 -(This address w)5.079 F .078 -(ould itself be a domain-based address; for e)-.1 F(xam-)-.15 E -(ple, an address might be of the form:)87 695.4 Q(mark@d.cbosg.btl.UUCP) -127 711.6 Q F0 -1(Ve)72 756 S(rsion 8.2)1 E(USENIX \255 J)130.475 E -(an 83)-.15 E(Last Mod 11/27/1993)88.355 E EP -%%Page: 7 7 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Mail Systems and Addr)72 60 Q(essing in 4.2bsd) --.18 E(7)259.93 E/F1 10/Times-Roman@0 SF .311(Hosts outside of Bell T)87 -96 R .311(elephone Laboratories w)-.7 F .311(ould then only need to kno) --.1 F 2.811(wh)-.25 G .811 -.25(ow t)-2.811 H 2.811(og).25 G .312 -(et to a designated)-2.811 F(BTL relay)87 108 Q 2.5(,a)-.65 G -(nd the BTL topology w)-2.5 E(ould only be maintained inside Bell.)-.1 E -.543(There are three major problems associated with turning UUCP addresses into something reason-) -112 124.2 R .465(able: de\214ning the namespace, creating and propag)87 -136.2 R .465(ating the necessary softw)-.05 F .466(are, and b)-.1 F .466 -(uilding and main-)-.2 F(taining the database.)87 148.2 Q F0 2.5 -(4.1. De\214ning)87 172.2 R(the Namespace)2.5 E F1 1.015(Putting all UUCP hosts into a \215at namespace \(e.g., \231...@host.UUCP\232\) is not practical for a) -127 188.4 R .222(number of reasons.)102 200.4 R .222(First, with o)5.222 -F -.15(ve)-.15 G 2.722(r1).15 G .222(600 sites already)-2.722 F 2.722 -(,a)-.65 G .222(nd \(with the increasing a)-2.722 F -.25(va)-.2 G .222 -(ilability of ine).25 F(x-)-.15 E(pensi)102 212.4 Q 1.973 -.15(ve m)-.25 -H 1.673(icrocomputers and autodialers\) se).15 F -.15(ve)-.25 G 1.672 -(ral thousand more coming within a fe).15 F 4.172(wy)-.25 G 1.672 -(ears, the)-4.172 F .078(database update problem is simply intractable if the namespace is \215at.) -102 224.4 R .078(Second, there are almost cer)5.078 F(-)-.2 E 2.446 -(tainly name con\215icts today)102 236.4 R 7.446(.T)-.65 G 2.446 -(hird, as the number of sites gro)-7.446 F 4.946(wt)-.25 G 2.446 -(he names become e)-4.946 F -.15(ve)-.25 G 4.946(rl).15 G(ess)-4.946 E -(mnemonic.)102 248.4 Q .534(It seems ine)127 264.6 R .535(vitable that there be some sort of naming authority for the set of top le) --.25 F -.15(ve)-.25 G 3.035(ln).15 G(ames)-3.035 E .157 -(in the UUCP domain, as unpleasant a possibility as that may seem.)102 -276.6 R .157(It will simply not be possible to)5.157 F(ha)102 288.6 Q -.536 -.15(ve o)-.2 H .236(ne host resolving all names.).15 F .236 -(It may ho)5.236 F(we)-.25 E -.15(ve)-.25 G 2.736(rb).15 G 2.736(ep) --2.736 G .236(ossible to handle this in a f)-2.736 F .237 -(ashion similar to)-.1 F 1.582(that of assigning names of ne)102 300.6 R -1.582(wsgroups in USENET)-.25 F 6.582(.H)-.74 G -.25(ow)-6.582 G -2.15 --.25(ev e).25 H 2.382 -.4(r, i).25 H 4.082(tw).4 G 1.582 -(ill be essential to encourage)-4.082 F -2.15 -.25(ev e)102 312.6 T .52 -(ryone to become subdomains of an e).25 F .52(xisting domain whene)-.15 -F -.15(ve)-.25 G 3.02(rp).15 G .52(ossible \212 e)-3.02 F -.15(ve)-.25 G -3.02(nt).15 G .52(hough this will)-3.02 F .077(certainly bruise some e) -102 324.6 R 2.577(gos. F)-.15 F .077(or e)-.15 F .077(xample, if a ne) --.15 F 2.577(wh)-.25 G .076 -(ost named \231blid\232 were to be added to the UUCP)-2.577 F(netw)102 -336.6 Q .65(ork, it w)-.1 F .651(ould probably actually be addressed as \231d.bli.UUCP\232 \(i.e., as host \231d\232 in the pseudo-) --.1 F(domain \231bli\232 rather than as host \231blid\232 in the UUCP domain\).) -102 348.6 Q F0 2.5(4.2. Cr)87 372.6 R(eating and Pr)-.18 E -(opagating the Softwar)-.18 E(e)-.18 E F1 .078(The softw)127 388.8 R -.078(are required to implement a consistent namespace is relati)-.1 F --.15(ve)-.25 G .077(ly tri).15 F 2.577(vial. T)-.25 F .277 -.1(wo m)-.8 -H(odules).1 E(are needed, one to handle incoming mail and one to handle outgoing mail.) -102 400.8 Q 1.136 -(The incoming module must be prepared to handle either old or ne)127 417 -R 3.636(ws)-.25 G 1.136(tyle addresses.)-3.636 F(Ne)6.136 E(w-)-.25 E -.025(style addresses can be passed through unchanged.)102 429 R .024 -(Old style addresses must be turned into ne)5.025 F 2.524(ws)-.25 G -(tyle)-2.524 E(addresses where possible.)102 441 Q 2.247 -(The outgoing module is slightly trickier)127 457.2 R 7.247(.I)-.55 G -4.747(tm)-7.247 G 2.247(ust do a database lookup on the recipient)-4.747 -F .823(addresses \(passed on the command line\) to determine what hosts to send the message to.) -102 469.2 R .823(If those)5.823 F .023(hosts do not accept ne)102 481.2 -R .024(w-style addresses, it must transform all addresses in the header of the message) --.25 F(into old style using the database lookup.)102 493.2 Q 1.197 -(Both of these modules are straightforw)127 509.4 R 1.197(ard e)-.1 F -1.197(xcept for the issue of modifying the header)-.15 F 6.197(.I)-.55 G -(t)-6.197 E .944 -(seems prudent to choose one format for the message headers.)102 521.4 R --.15(Fo)5.944 G 3.444(ran).15 G .944(umber of reasons, Berk)-3.444 F -(ele)-.1 E(y)-.15 E .824(has elected to use the ARP)102 533.4 R .824 -(ANET protocols for message formats.)-.92 F(Ho)5.823 E(we)-.25 E -.15 -(ve)-.25 G 1.623 -.4(r, t).15 H .823(his protocol is some-).4 F -(what dif)102 545.4 Q(\214cult to parse.)-.25 E(Propag)127 561.6 Q 1.903 -(ation is some)-.05 F 1.903(what more dif)-.25 F 4.403(\214cult. There) --.25 F 1.903(are a lar)4.403 F 1.903(ge number of hosts connected to) --.18 F .812(UUCP that will w)102 573.6 R .811 -(ant to run completely standard systems \(for v)-.1 F .811 -(ery good reasons\).)-.15 F .811(The strate)5.811 F .811(gy is)-.15 F -(not to con)102 585.6 Q -.15(ve)-.4 G(rt the entire netw).15 E -(ork \212 only enough of it it alle)-.1 E(viate the problem.)-.25 E F0 -2.5(4.3. Building)87 609.6 R(and Maintaining the Database)2.5 E F1 .127 -(This is by f)127 625.8 R .127(ar the most dif)-.1 F .128 -(\214cult problem.)-.25 F 2.628(Ap)5.128 G .128 -(rototype for this database already e)-2.628 F .128(xists, b)-.15 F .128 -(ut it is)-.2 F(maintained by hand and does not pretend to be complete.) -102 637.8 Q .701(This problem will be reduced considerably if people choose to group their hosts into subdo-) -127 654 R 3.219(mains. This)102 666 R -.1(wo)3.219 G .719 -(uld require a global update only when a ne).1 F 3.22(wt)-.25 G .72 -(op le)-3.22 F -.15(ve)-.25 G 3.22(ld).15 G .72(omain joined the netw) --3.22 F(ork.)-.1 E 2.805(Am)102 678 S .305 -(essage to a host in a subdomain could simply be routed to a kno)-2.805 -F .304(wn domain g)-.25 F(ate)-.05 E -.1(wa)-.25 G 2.804(yf).1 G .304 -(or further)-2.804 F 3.073(processing. F)102 690 R .573(or e)-.15 F .573 -(xample, the address \231eric@a.bli.UUCP\232 might be routed to the \231bli\232 g) --.15 F(ate)-.05 E -.1(wa)-.25 G 3.074(yf).1 G(or)-3.074 E(redistrib)102 -702 Q 1.376(ution; ne)-.2 F 3.876(wh)-.25 G 1.375 -(osts could be added within BLI without notifying the rest of the w) --3.876 F 3.875(orld. Of)-.1 F(course, other hosts)102 714 Q/F2 10 -/Times-Italic@0 SF(could)2.5 E F1(be noti\214ed as an ef)2.5 E -(\214cienc)-.25 E 2.5(ym)-.15 G(easure.)-2.5 E F0 -1(Ve)72 756 S -(rsion 8.2)1 E(USENIX \255 J)130.475 E(an 83)-.15 E(Last Mod 11/27/1993) -88.355 E EP -%%Page: 8 8 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Mail Systems and Addr)72 60 Q(essing in 4.2bsd) --.18 E(8)259.93 E/F1 10/Times-Roman@0 SF .966 -(There may be more than one domain g)127 96 R(ate)-.05 E -.1(wa)-.25 G -4.767 -.65(y. A).1 H .967(domain such as BTL, for instance, might)4.117 -F(ha)102 108 Q .653 -.15(ve a d)-.2 H .353(ozen g).15 F(ate)-.05 E -.1 -(wa)-.25 G .353(ys to the outside w).1 F .352 -(orld; a non-BTL site could choose the closest g)-.1 F(ate)-.05 E -.1 -(wa)-.25 G 4.152 -.65(y. T).1 H(he).65 E .308(only restriction w)102 120 -R .308(ould be that all g)-.1 F(ate)-.05 E -.1(wa)-.25 G .308 -(ys maintain a consistent vie).1 F 2.808(wo)-.25 G 2.808(ft)-2.808 G -.308(he domain the)-2.808 F 2.808(yr)-.15 G(epresent.)-2.808 E F0 2.5 -(4.4. Logical)87 144 R(Structur)2.5 E(e)-.18 E F1(Logically)127 160.2 Q -3.803(,d)-.65 G 1.303(omains are or)-3.803 F -.05(ga)-.18 G 1.303 -(nized into a tree.).05 F 1.303 -(There need not be a host actually associated)6.303 F .462(with each le) -102 172.2 R -.15(ve)-.25 G 2.962(li).15 G 2.962(nt)-2.962 G .462 -(he tree \212 for e)-2.962 F .462 -(xample, there will be no host associated with the name \231UUCP)-.15 F --.7<2e9a>-1.11 G(Similarly)102 184.2 Q 3.115(,a)-.65 G 3.115(no)-3.115 G --2.19 -.18(rg a)-3.115 H .614 -(nization might group names together for administrati).18 F .914 -.15 -(ve r)-.25 H .614(easons; for e).15 F .614(xample, the)-.15 F(name)102 -196.2 Q(CAD.research.BigCorp.UUCP)142 212.4 Q(might not actually ha)102 -228.6 Q .3 -.15(ve a h)-.2 H(ost representing \231research.).15 E<9a>-.7 -E(Ho)127 244.8 Q(we)-.25 E -.15(ve)-.25 G 1.531 -.4(r, i).15 H 3.231(tm) -.4 G .731(ay frequently be con)-3.231 F -.15(ve)-.4 G .731(nient to ha) -.15 F 1.031 -.15(ve a h)-.2 H .732 -(ost or hosts that \231represent\232 a domain.).15 F -.15(Fo)102 256.8 S -3.466(re).15 G .966(xample, if a single host e)-3.616 F .966 -(xists that represents Berk)-.15 F(ele)-.1 E 2.266 -.65(y, t)-.15 H .966 -(hen mail from outside Berk).65 F(ele)-.1 E 3.466(yc)-.15 G(an)-3.466 E -(forw)102 268.8 Q .796 -(ard mail to that host for further resolution without kno)-.1 F .796 -(wing Berk)-.25 F(ele)-.1 E(y')-.15 E 3.296(s\()-.55 G .797(rather v) --3.296 F .797(olatile\) topol-)-.2 F(ogy)102 280.8 Q 5(.T)-.65 G -(his is not unlik)-5 E 2.5(et)-.1 G(he operation of the telephone netw) --2.5 E(ork.)-.1 E .053(This may also be useful inside certain lar)127 -297 R .053(ge domains.)-.18 F -.15(Fo)5.053 G 2.553(re).15 G .053 -(xample, at Berk)-2.703 F(ele)-.1 E 2.553(yi)-.15 G 2.553(tm)-2.553 G -.053(ay be pre-)-2.553 F .722(sumed that most hosts kno)102 309 R 3.222 -(wa)-.25 G .722(bout other hosts inside the Berk)-3.222 F(ele)-.1 E -3.223(yd)-.15 G 3.223(omain. But)-3.223 F .723(if the)3.223 F 3.223(yp) --.15 G .723(rocess an)-3.223 F .405(address that is unkno)102 321 R .405 -(wn, the)-.25 F 2.905(yc)-.15 G .405 -(an pass it \231upstairs\232 for further e)-2.905 F 2.905 -(xamination. Thus)-.15 F .405(as ne)2.905 F 2.905(wh)-.25 G .405 -(osts are)-2.905 F .488(added only one host \(the domain master\))102 -333 R/F2 10/Times-Italic@0 SF(must)2.989 E F1 .489 -(be updated immediately; other hosts can be updated)2.989 F(as con)102 -345 Q -.15(ve)-.4 G(nient.).15 E .583 -(Ideally this name resolution process w)127 361.2 R .583 -(ould be performed by a name serv)-.1 F .582(er \(e.g., [Su82b]\) to) --.15 F -.2(avo)102 373.2 S .507(id unnecessary cop).2 F .507 -(ying of the message.)-.1 F(Ho)5.507 E(we)-.25 E -.15(ve)-.25 G 1.307 --.4(r, i).15 H 3.007(nab).4 G .507(atch netw)-3.007 F .508 -(ork such as UUCP this could)-.1 F(result in unnecessary delays.)102 -385.2 Q F0 2.5(5. COMP)72 409.2 R(ARISON WITH DELIVERMAIL)-.74 E F2 -(Sendmail)112 425.4 Q F1(is an outgro)2.5 E(wth of)-.25 E F2 -(delivermail)2.5 E F1 5(.T)C(he primary dif)-5 E(ferences are:)-.25 E -12.5(\(1\) Con\214guration)92 441.6 R .573 -(information is not compiled in.)3.073 F .572 -(This change simpli\214es man)5.572 F 3.072(yo)-.15 G 3.072(ft)-3.072 G -.572(he problems of)-3.072 F(mo)118.66 453.6 Q(ving to other machines.) --.15 E(It also allo)5 E(ws easy deb)-.25 E(ugging of ne)-.2 E 2.5(wm) --.25 G(ailers.)-2.5 E 12.5(\(2\) Address)92 469.8 R .491 -(parsing is more \215e)2.991 F 2.991(xible. F)-.15 F .491(or e)-.15 F -(xample,)-.15 E F2(delivermail)2.992 E F1 .492(only supported one g) -2.992 F(ate)-.05 E -.1(wa)-.25 G 2.992(yt).1 G 2.992(oa)-2.992 G -.15 -(ny)-2.992 G(netw)118.66 481.8 Q(ork, whereas)-.1 E F2(sendmail)2.5 E F1 -(can be sensiti)2.5 E .3 -.15(ve t)-.25 H 2.5(oh).15 G -(ost names and reroute to dif)-2.5 E(ferent g)-.25 E(ate)-.05 E -.1(wa) --.25 G(ys.).1 E 12.5(\(3\) F)92 498 R(orw)-.15 E 2.878(arding and :include: features eliminate the requirement that the system alias \214le be) --.1 F 1.073(writable by an)118.66 510 R 3.573(yu)-.15 G 1.073(ser \(or that an update program be written, or that the system administration) --3.573 F(mak)118.66 522 Q 2.5(ea)-.1 G(ll changes\).)-2.5 E(\(4\))92 -538.2 Q F2(Sendmail)15 E F1 .443(supports message batching across netw) -2.944 F .443(orks when a message is being sent to multiple)-.1 F -(recipients.)118.66 550.2 Q 12.5(\(5\) A)92 566.4 R 1.945 -(mail queue is pro)4.445 F 1.946(vided in)-.15 F F2(sendmail.)4.446 E F1 -1.946(Mail that cannot be deli)6.946 F -.15(ve)-.25 G 1.946 -(red immediately b).15 F 1.946(ut can)-.2 F .439(potentially be deli) -118.66 578.4 R -.15(ve)-.25 G .438 -(red later is stored in this queue for a later retry).15 F 5.438(.T)-.65 -G .438(he queue also pro)-5.438 F .438(vides a)-.15 F -.2(bu)118.66 -590.4 S -.25(ff).2 G .838(er ag).25 F .839(ainst system crashes; after the message has been collected it may be reliably redeli) --.05 F(v-)-.25 E(ered e)118.66 602.4 Q -.15(ve)-.25 G 2.5(ni).15 G 2.5 -(ft)-2.5 G(he system crashes during the initial deli)-2.5 E -.15(ve)-.25 -G(ry).15 E(.)-.65 E(\(6\))92 618.6 Q F2(Sendmail)15 E F1 1.351 -(uses the netw)3.851 F 1.351(orking support pro)-.1 F 1.351 -(vided by 4.2BSD to pro)-.15 F 1.35(vide a direct interf)-.15 F 1.35 -(ace net-)-.1 F -.1(wo)118.66 630.6 S .283(rks such as the ARP).1 F .284 -(ANET and/or Ethernet using SMTP \(the Simple Mail T)-.92 F .284 -(ransfer Protocol\))-.35 F -.15(ove)118.66 642.6 S 2.5(raT).15 G -(CP/IP connection.)-2.5 E F0 -1(Ve)72 756 S(rsion 8.2)1 E(USENIX \255 J) -130.475 E(an 83)-.15 E(Last Mod 11/27/1993)88.355 E EP -%%Page: 9 9 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Roman@0 SF(REFERENCES)264.105 132 Q([Crock)87 148.2 Q 56.73 -(er77] Crock)-.1 F(er)-.1 E 3.535(,D)-.4 G 3.535(.H)-3.535 G 1.035(., V) --3.535 F 1.035(ittal, J. J., Pogran, K. T)-.6 F 1.035 -(., and Henderson, D. A. Jr)-.74 F(.,)-.55 E/F1 10/Times-Italic@0 SF -(Stan-)3.535 E(dar)195 160.2 Q 2.627(df)-.37 G .127(or the F)-2.627 F -.127(ormat of ARP)-1.05 F 2.627(AN)-.9 G .128(etwork T)-2.627 F -.2(ex) --.92 G 2.628(tM).2 G(essa)-2.628 E -.1(ge)-.1 G(s.).1 E F0 .128 -(RFC 733, NIC 41952.)5.128 F(In [Feinler78].)195 172.2 Q(No)5 E -.15(ve) --.15 G(mber 1977.).15 E([Crock)87 188.4 Q 56.73(er82] Crock)-.1 F(er)-.1 -E 4.272(,D)-.4 G 4.272(.H)-4.272 G(.,)-4.272 E F1(Standar)4.272 E 4.272 -(df)-.37 G 1.772(or the F)-4.272 F 1.772(ormat of Arpa Internet T)-1.05 -F -.2(ex)-.92 G 4.271(tM).2 G(essa)-4.271 E -.1(ge)-.1 G(s.).1 E F0 .025 -(RFC 822.)195 200.4 R(Netw)5.025 E .025(ork Information Center)-.1 F -2.526(,S)-.4 G .026(RI International, Menlo P)-2.526 F .026(ark, Cali-) --.15 F 2.5(fornia. August)195 212.4 R(1982.)2.5 E 60.51 -([Feinler78] Feinler)87 228.6 R 2.938(,E)-.4 G .438(., and Postel, J.) --2.938 F(\(eds.\),)5.438 E F1(ARP)2.938 E .438(ANET Pr)-.9 F .438 -(otocol Handbook.)-.45 F F0 .438(NIC 7104,)5.438 F(Netw)195 240.6 Q -3.011(ork Information Center)-.1 F 5.511(,S)-.4 G 3.012 -(RI International, Menlo P)-5.511 F 3.012(ark, California.)-.15 F(1978.) -195 252.6 Q([No)87 268.8 Q 59.65(witz78] No)-.25 F .479 -(witz, D. A., and Lesk, M. E.,)-.25 F F1 2.978(AD)2.978 G .478 -(ial-Up Network of UNIX Systems.)-2.978 F F0(Bell)5.478 E 3.528 -(Laboratories. In)195 280.8 R 1.029(UNIX Programmer')3.528 F 3.529(sM) --.55 G 1.029(anual, Se)-3.529 F -.15(ve)-.25 G 1.029(nth Edition, V).15 -F 1.029(olume 2.)-1.29 F(August, 1978.)195 292.8 Q 55.5 -([Schmidt79] Schmidt,)87 309 R(E.,)2.631 E F1 .131(An Intr)2.631 F .131 -(oduction to the Berk)-.45 F(ele)-.1 E 2.631(yN)-.3 G(etwork.)-2.631 E -F0(Uni)5.131 E -.15(ve)-.25 G .131(rsity of Califor).15 F(-)-.2 E -(nia, Berk)195 321 Q(ele)-.1 E 2.5(yC)-.15 G 2.5(alifornia. 1979.)-2.5 F -59.95([Shoens79] Shoens,)87 337.2 R(K.,)3.227 E F1 .728(Mail Refer)3.227 -F .728(ence Manual.)-.37 F F0(Uni)5.728 E -.15(ve)-.25 G .728 -(rsity of California, Berk).15 F(ele)-.1 E 4.528 -.65(y. I)-.15 H(n).65 -E 3.478(UNIX Programmer')195 349.2 R 5.977(sM)-.55 G 3.477(anual, Se) --5.977 F -.15(ve)-.25 G 3.477(nth Edition, V).15 F 3.477(olume 2C.)-1.29 -F(December)8.477 E(1979.)195 361.2 Q 52.72([Solomon81] Solomon,)87 377.4 -R .251(M., Landweber)2.75 F 2.751(,L)-.4 G .251(., and Neuhengen, D.,) --2.751 F F1 .251(The Design of the CSNET)2.751 F .397(Name Server)195 -389.4 R(.)-1.11 E F0 2.896(CS-DN-2. Uni)5.397 F -.15(ve)-.25 G .396 -(rsity of W).15 F .396(isconsin, Madison.)-.4 F .396(October 1981.)5.396 -F 73.84([Su82a] Su,)87 405.6 R(Za)2.844 E .344(w-Sing, and Postel, Jon,) --.15 F F1 .344(The Domain Naming Con)2.844 F .344(vention for Internet) --.4 F 2.71(User Applications.)195 417.6 R F0 5.21(RFC819. Netw)7.71 F -2.71(ork Information Center)-.1 F 5.21(,S)-.4 G 2.71(RI Interna-)-5.21 F -(tional, Menlo P)195 429.6 Q(ark, California.)-.15 E(August 1982.)5 E -73.28([Su82b] Su,)87 445.8 R(Za)4.174 E(w-Sing,)-.15 E F1 4.174(AD)4.174 -G(istrib)-4.174 E 1.675(uted System for Internet Name Service)-.2 F(.) --.15 E F0(RFC830.)6.675 E(Netw)195 457.8 Q 3.012(ork Information Center) --.1 F 5.512(,S)-.4 G 3.011(RI International, Menlo P)-5.512 F 3.011 -(ark, California.)-.15 F(October 1982.)195 469.8 Q/F2 10/Times-Bold@0 SF -(Mail Systems and Addr)72 756 Q(essing in 4.2bsd)-.18 E(9)259.93 E EP -%%Trailer -end -%%EOF diff --git a/mail.local/Build b/mail.local/Build deleted file mode 120000 index 6308dba..0000000 --- a/mail.local/Build +++ /dev/null @@ -1 +0,0 @@ -../BuildTools/bin/Build
\ No newline at end of file diff --git a/mail.local/Makefile.m4 b/mail.local/Makefile.m4 deleted file mode 100644 index bf9a155..0000000 --- a/mail.local/Makefile.m4 +++ /dev/null @@ -1,106 +0,0 @@ -# -# This Makefile is designed to work on the old "make" program. -# -# @(#)Makefile.m4 8.22 (Berkeley) 7/12/1998 -# - -# C compiler -CC= confCC - -# Shell -SHELL= confSHELL - -# use O=-O (usual) or O=-g (debugging) -O= ifdef(`confOPTIMIZE', `confOPTIMIZE', `-O') - -# location of sendmail source directory -SRCDIR= ifdef(`confSRCDIR', `confSRCDIR', `../../src') - -# environment definitions (e.g., -D_AIX3) -ENVDEF= -DNOT_SENDMAIL ifdef(`confENVDEF', `confENVDEF') - -# see also conf.h for additional compilation flags - -# include directories -INCDIRS=-I${SRCDIR} confINCDIRS - -# loader options -LDOPTS= ifdef(`confLDOPTS', `confLDOPTS') - -# library directories -LIBDIRS=confLIBDIRS - -# libraries required on your system -LIBS= ifdef(`confLIBS', `confLIBS') - -# location of mail.local binary (usually /usr/sbin or /usr/etc) -EBINDIR=${DESTDIR}ifdef(`confEBINDIR', `confEBINDIR', `/usr/libexec') - -# additional .o files needed -OBJADD= ifdef(`confOBJADD', `confOBJADD') - -undivert(1) - -################### end of user configuration flags ###################### - -BUILDBIN=confBUILDBIN -COPTS= -I. ${INCDIRS} ${ENVDEF} -CFLAGS= $O ${COPTS} - -BEFORE= snprintf.c confBEFORE -OBJS= mail.local.o snprintf.o ${OBJADD} - -NROFF= ifdef(`confNROFF', `confNROFF', `groff -Tascii') -MANDOC= ifdef(`confMANDOC', `confMANDOC', `-mandoc') - -INSTALL=ifdef(`confINSTALL', `confINSTALL', `install') -BINOWN= ifdef(`confSBINOWN', `confSBINOWN', `root') -BINGRP= ifdef(`confSBINGRP', `confSBINGRP', `bin') -BINMODE=ifdef(`confSBINMODE', `confSBINMODE', `4555') - -MANOWN= ifdef(`confMANOWN', `confMANOWN', `bin') -MANGRP= ifdef(`confMANGRP', `confMANGRP', `bin') -MANMODE=ifdef(`confMANMODE', `confMANMODE', `444') - -MANROOT=${DESTDIR}ifdef(`confMANROOT', `confMANROOT', `/usr/share/man/cat') -MAN8= ${MANROOT}ifdef(`confMAN8', `confMAN8', `8') -MAN8EXT=ifdef(`confMAN8EXT', `confMAN8EXT', `8') -MAN8SRC=ifdef(`confMAN8SRC', `confMAN8SRC', `0') - -ALL= mail.local mail.local.${MAN8SRC} - -all: ${ALL} - -mail.local: ${BEFORE} ${OBJS} - ${CC} -o mail.local ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} - -snprintf.c: ${SRCDIR}/snprintf.c - -ln -s ${SRCDIR}/snprintf.c snprintf.c - -undivert(3) - -mail.local.${MAN8SRC}: mail.local.8 - ${NROFF} ${MANDOC} mail.local.8 > mail.local.${MAN8SRC} - -install: - @echo "NOTE: This version of mail.local is not suited for some operating" - @echo " systems such as HP-UX and Solaris. Please consult the" - @echo " README file in the mail.local directory. You can force" - @echo " the install using '${MAKE} force-install'." - -force-install: install-mail.local install-docs - -install-mail.local: mail.local - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} mail.local ${EBINDIR} - -install-docs: mail.local.${MAN8SRC} -ifdef(`confNO_MAN_INSTALL', `dnl', -` ${INSTALL} -c -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} mail.local.${MAN8SRC} ${MAN8}/mail.local.${MAN8EXT}') - -clean: - rm -f ${OBJS} mail.local mail.local.${MAN8SRC} - -################ Dependency scripts -include(confBUILDTOOLSDIR/M4/depend/ifdef(`confDEPEND_TYPE', `confDEPEND_TYPE', -`generic').m4)dnl -################ End of dependency scripts diff --git a/mail.local/README b/mail.local/README deleted file mode 100644 index 5da44bb..0000000 --- a/mail.local/README +++ /dev/null @@ -1,12 +0,0 @@ -# @(#)README 8.1 (Berkeley) 2/17/1998 - -This directory contains the source files for mail.local. - -This is not intended to be used on *stock* System V derived systems such as -Solaris or HP-UX, since they use a totally different approach to mailboxes -(essentially, they have a setgid program rather than setuid, and they rely -on the ability to "give away" files to do their work). - -If you choose to run *this* mail.local on these systems then you may also -need to replace the existing MUAs, as well as IMAP and POP servers, with -ones that are compatible with the BSD interface. You have been warned! diff --git a/mail.local/mail.local.0 b/mail.local/mail.local.0 deleted file mode 100644 index ffc0891..0000000 --- a/mail.local/mail.local.0 +++ /dev/null @@ -1,52 +0,0 @@ -MAIL.LOCAL(8) BSD System Manager's Manual MAIL.LOCAL(8) - -NNAAMMEE - mmaaiill..llooccaall - store mail in a mailbox - -SSYYNNOOPPSSIISS - mmaaiill..llooccaall [--ff _f_r_o_m] _u_s_e_r _._._. - -DDEESSCCRRIIPPTTIIOONN - MMaaiill..llooccaall reads the standard input up to an end-of-file and appends it - to each _u_s_e_r_'_s _m_a_i_l file. The _u_s_e_r must be a valid user name. - - The options are as follows: - - --ff _f_r_o_m Specify the sender's name. - - Individual mail messages in the mailbox are delimited by an empty line - followed by a line beginning with the string ``From ''. A line contain- - ing the string ``From '', the sender's name and a time stamp is prepended - to each delivered mail message. A blank line is appended to each mes- - sage. A greater-than character (``>'') is prepended to any line in the - message which could be mistaken for a ``From '' delimiter line (that is, - a line beginning with the five characters ``From '' following a blank - line). - - The mail files are exclusively locked with flock(2) while mail is append- - ed, and a _u_s_e_r_._l_o_c_k file also is created while the mailbox is locked for - compatibility with older MUAs. - - If the ``biff'' service is returned by getservbyname(3), the biff server - is notified of delivered mail. - - The mmaaiill..llooccaall utility exits 0 on success, and >0 if an error occurs. - -EENNVVIIRROONNMMEENNTT - TZ Used to set the appropriate time zone on the timestamp. - -FFIILLEESS - /tmp/local.XXXXXX temporary files - /var/mail/user user's mailbox directory - /var/mail/user.lock - lock file for a user's mailbox - -SSEEEE AALLSSOO - mail(1), xsend(1), flock(2), getservbyname(3), comsat(8), send- - mail(8) - -HHIISSTTOORRYY - A superset of mmaaiill..llooccaall (handling mailbox reading as well as mail deliv- - ery) appeared in Version 7 AT&T UNIX. as the program mmaaiill. - -BSDI BSD/OS May 19, 1998 1 diff --git a/mail.local/mail.local.8 b/mail.local/mail.local.8 deleted file mode 100644 index 05f11ed..0000000 --- a/mail.local/mail.local.8 +++ /dev/null @@ -1,92 +0,0 @@ -.\" Copyright (c) 1998 Sendmail, Inc. All rights reserved. -.\" Copyright (c) 1990, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" By using this file, you agree to the terms and conditions set -.\" forth in the LICENSE file which can be found at the top level of -.\" the sendmail distribution. -.\" -.\" -.\" @(#)mail.local.8 8.7 (Berkeley) 5/19/1998 -.\" -.Dd May 19, 1998 -.Dt MAIL.LOCAL 8 -.Os -.Sh NAME -.Nm mail.local -.Nd store mail in a mailbox -.Sh SYNOPSIS -.Nm mail.local -.Op Fl f Ar from -.Ar user ... -.Sh DESCRIPTION -.Nm Mail.local -reads the standard input up to an end-of-file and appends it to each -.Ar user's -.Pa mail -file. -The -.Ar user -must be a valid user name. -.Pp -The options are as follows: -.Bl -tag -width xxxfrom -.It Fl f Ar from -Specify the sender's name. -.El -.Pp -Individual mail messages in the mailbox are delimited by an empty -line followed by a line beginning with the string ``From ''. -A line containing the string ``From '', the sender's name and a time stamp -is prepended to each delivered mail message. -A blank line is appended to each message. -A greater-than character (``>'') is prepended to any line in the message -which could be mistaken for a ``From '' delimiter line -(that is, -a line beginning with the five characters -``From '' following a blank line). -.Pp -The mail files are exclusively locked with -.Xr flock 2 -while mail is appended, -and a -.Pa user.lock -file also is created while the mailbox is locked -for compatibility with older MUAs. -.Pp -If the ``biff'' service is returned by -.Xr getservbyname 3 , -the biff server is notified of delivered mail. -.Pp -The -.Nm mail.local -utility exits 0 on success, and >0 if an error occurs. -.Sh ENVIRONMENT -.Bl -tag -width indent -.It Ev TZ -Used to set the appropriate time zone on the timestamp. -.El -.Sh FILES -.Bl -tag -width /tmp/local.XXXXXX -compact -.It Pa /tmp/local.XXXXXX -temporary files -.It Pa /var/mail/user -user's mailbox directory -.It Pa /var/mail/user.lock -lock file for a user's mailbox -.El -.Sh SEE ALSO -.Xr mail 1 , -.Xr xsend 1 , -.Xr flock 2 , -.Xr getservbyname 3 , -.Xr comsat 8 , -.Xr sendmail 8 -.Sh HISTORY -A superset of -.Nm mail.local -(handling mailbox reading as well as mail delivery) -appeared in -.At v7 . -as the program -.Nm mail . diff --git a/mail.local/mail.local.c b/mail.local/mail.local.c deleted file mode 100644 index abe1a19..0000000 --- a/mail.local/mail.local.c +++ /dev/null @@ -1,1304 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1990, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char copyright[] = -"@(#) Copyright (c) 1990, 1993, 1994\n\ - The Regents of the University of California. All rights reserved.\n"; -#endif /* not lint */ - -#ifndef lint -static char sccsid[] = "@(#)mail.local.c 8.83 (Berkeley) 12/17/1998"; -#endif /* not lint */ - -/* - * This is not intended to work on System V derived systems - * such as Solaris or HP-UX, since they use a totally different - * approach to mailboxes (essentially, they have a setgid program - * rather than setuid, and they rely on the ability to "give away" - * files to do their work). IT IS NOT A BUG that this doesn't - * work on such architectures. - */ - -#include <sys/param.h> -#include <sys/stat.h> -#include <sys/socket.h> -#include <sys/file.h> - -#include <netinet/in.h> - -#include <errno.h> -#include <fcntl.h> -#include <netdb.h> -#include <pwd.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <syslog.h> -#include <time.h> -#include <unistd.h> -#ifdef EX_OK -# undef EX_OK /* unistd.h may have another use for this */ -#endif -#include <sysexits.h> -#include <ctype.h> - -#ifdef __STDC__ -#include <stdarg.h> -#else -#include <varargs.h> -#endif - -#if (defined(sun) && defined(__svr4__)) || defined(__SVR4) -# define USE_LOCKF 1 -# define USE_SETEUID 1 -# define _PATH_MAILDIR "/var/mail" -#endif - -#if (defined(sun) && !defined(__svr4__)) && !defined(__SVR4) -# ifdef __dead -# undef __dead -# define __dead -# endif -#endif - -#if defined(_AIX) -# define USE_LOCKF 1 -# define USE_SETEUID 1 -# define USE_VSYSLOG 0 -#endif - -#if defined(__hpux) -# define USE_LOCKF 1 -# define USE_SETRESUID 1 -# define USE_VSYSLOG 0 -# ifdef __dead -# undef __dead -# define __dead -# endif -#endif - -#if defined(_CRAY) -# if !defined(MAXPATHLEN) -# define MAXPATHLEN PATHSIZE -# endif -# define USE_VSYSLOG 0 -# define _PATH_MAILDIR "/usr/spool/mail" -#endif - -#if defined(ultrix) -# define USE_VSYSLOG 0 -#endif - -#if defined(__osf__) -# define USE_VSYSLOG 0 -#endif - -#if defined(NeXT) && !defined(__APPLE__) -# include <libc.h> -# define _PATH_MAILDIR "/usr/spool/mail" -# define __dead /* empty */ -# define S_IRUSR S_IREAD -# define S_IWUSR S_IWRITE -#endif - -#if defined(IRIX64) || defined(IRIX5) || defined(IRIX6) -# include <paths.h> -# define HASSTRERROR 1 /* has strerror(3) */ -#endif - -/* - * If you don't have flock, you could try using lockf instead. - */ - -#ifdef USE_LOCKF -# define flock(a, b) lockf(a, b, 0) -# define LOCK_EX F_LOCK -#endif - -#ifndef USE_VSYSLOG -# define USE_VSYSLOG 1 -#endif - -#ifndef LOCK_EX -# include <sys/file.h> -#endif - -#if defined(BSD4_4) || defined(__GLIBC__) -# include "pathnames.h" -#endif - -#ifndef __P -# ifdef __STDC__ -# define __P(protos) protos -# else -# define __P(protos) () -# define const -# endif -#endif -#ifndef __dead -# if defined(__GNUC__) && (__GNUC__ < 2 || __GNUC_MINOR__ < 5) && !defined(__STRICT_ANSI__) -# define __dead __volatile -# else -# define __dead -# endif -#endif - -#ifdef BSD4_4 -# define HAS_ST_GEN 1 -#else -# ifndef _BSD_VA_LIST_ -# define _BSD_VA_LIST_ va_list -# endif -#endif - -#if defined(BSD4_4) || defined(linux) -# define HASSNPRINTF 1 -#else -# ifndef ultrix -extern FILE *fdopen __P((int, const char *)); -# endif -#endif - -#if SOLARIS >= 20600 || (SOLARIS < 10000 && SOLARIS >= 206) -# define HASSNPRINTF 1 /* has snprintf starting in 2.6 */ -#endif - -#if !HASSNPRINTF -extern int snprintf __P((char *, size_t, const char *, ...)); -# ifndef _CRAY -extern int vsnprintf __P((char *, size_t, const char *, ...)); -# endif -#endif - -#if defined(BSD4_4) || defined(__osf__) || defined(__GNU_LIBRARY__) -# ifndef HASSTRERROR -# define HASSTRERROR 1 -# endif -#endif - -#if !HASSTRERROR -extern char *strerror __P((int)); -#endif - -/* - * If you don't have setreuid, and you have saved uids, and you have - * a seteuid() call that doesn't try to emulate using setuid(), then - * you can try defining USE_SETEUID. - */ -#ifdef USE_SETEUID -# define setreuid(r, e) seteuid(e) -#endif - -/* - * And of course on hpux you have setresuid() - */ -#ifdef USE_SETRESUID -# define setreuid(r, e) setresuid(-1, e, -1) -#endif - -#ifndef _PATH_LOCTMP -# define _PATH_LOCTMP "/tmp/local.XXXXXX" -#endif -#ifndef _PATH_MAILDIR -# define _PATH_MAILDIR "/var/spool/mail" -#endif - -#ifndef S_ISREG -# define S_ISREG(mode) (((mode) & _S_IFMT) == S_IFREG) -#endif - -#ifndef MAILER_DAEMON -# define MAILER_DAEMON "MAILER-DAEMON" -#endif - -int eval = EX_OK; /* sysexits.h error value. */ -int lmtpmode = 0; -u_char tTdvect[100]; - -void deliver __P((int, char *)); -void e_to_sys __P((int)); -void notifybiff __P((char *)); -int store __P((char *, int)); -void usage __P((void)); -void vwarn __P((const char *, _BSD_VA_LIST_)); -void lockmbox __P((char *)); -void unlockmbox __P((void)); -void mailerr __P((const char *, const char *, ...)); - -int -main(argc, argv) - int argc; - char *argv[]; -{ - struct passwd *pw; - int ch, fd; - uid_t uid; - char *from; - extern char *optarg; - extern int optind; - extern void dolmtp __P((void)); - - /* make sure we have some open file descriptors */ - for (fd = 10; fd < 30; fd++) - (void) close(fd); - - /* use a reasonable umask */ - (void) umask(0077); - -#ifdef LOG_MAIL - openlog("mail.local", 0, LOG_MAIL); -#else - openlog("mail.local", 0); -#endif - - from = NULL; - while ((ch = getopt(argc, argv, "df:r:l")) != EOF) - switch(ch) { - case 'd': /* Backward compatible. */ - break; - case 'f': - case 'r': /* Backward compatible. */ - if (from != NULL) { - mailerr(NULL, "multiple -f options"); - usage(); - } - from = optarg; - break; - case 'l': - lmtpmode++; - break; - case '?': - default: - usage(); - } - argc -= optind; - argv += optind; - - if (lmtpmode) - dolmtp(); - - if (!*argv) - usage(); - - /* - * If from not specified, use the name from getlogin() if the - * uid matches, otherwise, use the name from the password file - * corresponding to the uid. - */ - uid = getuid(); - if (!from && (!(from = getlogin()) || - !(pw = getpwnam(from)) || pw->pw_uid != uid)) - from = (pw = getpwuid(uid)) ? pw->pw_name : "???"; - - /* - * There is no way to distinguish the error status of one delivery - * from the rest of the deliveries. So, if we failed hard on one - * or more deliveries, but had no failures on any of the others, we - * return a hard failure. If we failed temporarily on one or more - * deliveries, we return a temporary failure regardless of the other - * failures. This results in the delivery being reattempted later - * at the expense of repeated failures and multiple deliveries. - */ - for (fd = store(from, 0); *argv; ++argv) - deliver(fd, *argv); - exit(eval); -} - -char * -parseaddr(s) - char *s; -{ - char *p; - int len; - - if (*s++ != '<') - return NULL; - - p = s; - - /* at-domain-list */ - while (*p == '@') { - p++; - if (*p == '[') { - p++; - while (isascii(*p) && - (isalnum(*p) || *p == '.' || - *p == '-' || *p == ':')) - p++; - if (*p++ != ']') - return NULL; - } else { - while ((isascii(*p) && isalnum(*p)) || - strchr(".-_", *p)) - p++; - } - if (*p == ',' && p[1] == '@') - p++; - else if (*p == ':' && p[1] != '@') - p++; - else - return NULL; - } - - s = p; - - /* local-part */ - if (*p == '\"') { - p++; - while (*p && *p != '\"') { - if (*p == '\\') { - if (!*++p) - return NULL; - } - p++; - } - if (!*p++) - return NULL; - } else { - while (*p && *p != '@' && *p != '>') { - if (*p == '\\') { - if (!*++p) - return NULL; - } else { - if (*p <= ' ' || (*p & 128) || - strchr("<>()[]\\,;:\"", *p)) - return NULL; - } - p++; - } - } - - /* @domain */ - if (*p == '@') { - p++; - if (*p == '[') { - p++; - while (isascii(*p) && - (isalnum(*p) || *p == '.' || - *p == '-' || *p == ':')) - p++; - if (*p++ != ']') - return NULL; - } else { - while ((isascii(*p) && isalnum(*p)) || - strchr(".-_", *p)) - p++; - } - } - - if (*p++ != '>') - return NULL; - if (*p && *p != ' ') - return NULL; - len = p - s - 1; - if (*s == '\0' || len <= 0) - { - s = MAILER_DAEMON; - len = strlen(s); - } - - p = malloc(len + 1); - if (p == NULL) { - printf("421 4.3.0 memory exhausted\r\n"); - exit(EX_TEMPFAIL); - } - - strncpy(p, s, len); - p[len] = '\0'; - return p; -} - -char * -process_recipient(addr) - char *addr; -{ - if (getpwnam(addr) == NULL) { - return "550 5.1.1 user unknown"; - } - - return NULL; -} - - -#define RCPT_GROW 30 - -void -dolmtp() -{ - char *return_path = NULL; - char **rcpt_addr = NULL; - int rcpt_num = 0; - int rcpt_alloc = 0; - char myhostname[1024]; - char buf[4096]; - char *err; - int msgfd; - char *p; - int i; - - gethostname(myhostname, sizeof myhostname - 1); - - printf("220 %s LMTP ready\r\n", myhostname); - for (;;) { - fflush(stdout); - if (fgets(buf, sizeof(buf)-1, stdin) == NULL) { - exit(EX_OK); - } - p = buf + strlen(buf) - 1; - if (p >= buf && *p == '\n') - *p-- = '\0'; - if (p >= buf && *p == '\r') - *p-- = '\0'; - - switch (buf[0]) { - - case 'd': - case 'D': - if (strcasecmp(buf, "data") == 0) { - if (rcpt_num == 0) { - printf("503 5.5.1 No recipients\r\n"); - continue; - } - msgfd = store(return_path, rcpt_num); - if (msgfd == -1) - continue; - - for (i = 0; i < rcpt_num; i++) { - p = strchr(rcpt_addr[i], '+'); - if (p != NULL) - *p++ = '\0'; - deliver(msgfd, rcpt_addr[i]); - } - close(msgfd); - goto rset; - } - goto syntaxerr; - - case 'l': - case 'L': - if (strncasecmp(buf, "lhlo ", 5) == 0) { - printf("250-%s\r\n250-8BITMIME\r\n250-ENHANCEDSTATUSCODES\r\n250 PIPELINING\r\n", - myhostname); - continue; - } - goto syntaxerr; - - case 'm': - case 'M': - if (strncasecmp(buf, "mail ", 5) == 0) { - if (return_path != NULL) { - printf("503 5.5.1 Nested MAIL command\r\n"); - continue; - } - if (strncasecmp(buf+5, "from:", 5) != 0 || - ((return_path = parseaddr(buf+10)) == NULL)) { - printf("501 5.5.4 Syntax error in parameters\r\n"); - continue; - } - printf("250 2.5.0 ok\r\n"); - continue; - } - goto syntaxerr; - - case 'n': - case 'N': - if (strcasecmp(buf, "noop") == 0) { - printf("250 2.0.0 ok\r\n"); - continue; - } - goto syntaxerr; - - case 'q': - case 'Q': - if (strcasecmp(buf, "quit") == 0) { - printf("221 2.0.0 bye\r\n"); - exit(EX_OK); - } - goto syntaxerr; - - case 'r': - case 'R': - if (strncasecmp(buf, "rcpt ", 5) == 0) { - if (return_path == NULL) { - printf("503 5.5.1 Need MAIL command\r\n"); - continue; - } - if (rcpt_num >= rcpt_alloc) { - rcpt_alloc += RCPT_GROW; - rcpt_addr = (char **) - realloc((char *)rcpt_addr, - rcpt_alloc * sizeof(char **)); - if (rcpt_addr == NULL) { - printf("421 4.3.0 memory exhausted\r\n"); - exit(EX_TEMPFAIL); - } - } - if (strncasecmp(buf+5, "to:", 3) != 0 || - ((rcpt_addr[rcpt_num] = parseaddr(buf+8)) == NULL)) { - printf("501 5.5.4 Syntax error in parameters\r\n"); - continue; - } - if ((err = process_recipient(rcpt_addr[rcpt_num])) != NULL) { - printf("%s\r\n", err); - continue; - } - rcpt_num++; - printf("250 2.1.5 ok\r\n"); - continue; - } - else if (strcasecmp(buf, "rset") == 0) { - printf("250 2.0.0 ok\r\n"); - - rset: - while (rcpt_num) { - free(rcpt_addr[--rcpt_num]); - } - if (return_path != NULL) - free(return_path); - return_path = NULL; - continue; - } - goto syntaxerr; - - case 'v': - case 'V': - if (strncasecmp(buf, "vrfy ", 5) == 0) { - printf("252 2.3.3 try RCPT to attempt delivery\r\n"); - continue; - } - goto syntaxerr; - - default: - syntaxerr: - printf("500 5.5.2 Syntax error\r\n"); - continue; - } - } -} - -int -store(from, lmtprcpts) - char *from; - int lmtprcpts; -{ - FILE *fp = NULL; - time_t tval; - int fd, eline; - char line[2048]; - char tmpbuf[sizeof _PATH_LOCTMP + 1]; - - strcpy(tmpbuf, _PATH_LOCTMP); - if ((fd = mkstemp(tmpbuf)) == -1 || (fp = fdopen(fd, "w+")) == NULL) { - if (lmtprcpts) { - printf("451 4.3.0 unable to open temporary file\r\n"); - return -1; - } else { - mailerr("451 4.3.0", "unable to open temporary file"); - exit(eval); - } - } - (void)unlink(tmpbuf); - - if (lmtpmode) { - printf("354 go ahead\r\n"); - fflush(stdout); - } - - (void)time(&tval); - (void)fprintf(fp, "From %s %s", from, ctime(&tval)); - - line[0] = '\0'; - for (eline = 1; fgets(line, sizeof(line), stdin);) { - size_t line_len = strlen(line); - - if (line_len >= 2 && - line[line_len - 2] == '\r' && - line[line_len - 1] == '\n') { - strcpy(line + line_len - 2, "\n"); - } - if (lmtprcpts && line[0] == '.') { - char *src = line + 1, *dest = line; - - if (line[1] == '\n') - goto lmtpdot; - while (*src != '\0') - *dest++ = *src++; - *dest = '\0'; - } - if (line[0] == '\n') - eline = 1; - else { - if (eline && line[0] == 'F' && - !memcmp(line, "From ", 5)) - (void)putc('>', fp); - eline = 0; - } - (void)fprintf(fp, "%s", line); - if (ferror(fp)) { - if (lmtprcpts) { - while (lmtprcpts--) { - printf("451 4.3.0 temporary file write error\r\n"); - } - fclose(fp); - return -1; - } else { - mailerr("451 4.3.0", - "temporary file write error"); - fclose(fp); - exit(eval); - } - } - } - - if (lmtprcpts) { - /* Got a premature EOF -- toss message and exit */ - exit(EX_OK); - } - - /* If message not newline terminated, need an extra. */ - if (strchr(line, '\n') == NULL) - (void)putc('\n', fp); - - lmtpdot: - - /* Output a newline; note, empty messages are allowed. */ - (void)putc('\n', fp); - - if (fflush(fp) == EOF || ferror(fp)) { - if (lmtprcpts) { - while (lmtprcpts--) { - printf("451 4.3.0 temporary file write error\r\n"); - } - fclose(fp); - return -1; - } else { - mailerr("451 4.3.0", "temporary file write error"); - fclose(fp); - exit(eval); - } - } - return (fd); -} - -void -deliver(fd, name) - int fd; - char *name; -{ - struct stat fsb, sb; - struct passwd *pw; - int mbfd, nr, nw, off; - char *p; - char biffmsg[100], buf[8*1024], path[MAXPATHLEN]; - off_t curoff; - extern char *quad_to_string(); - - /* - * Disallow delivery to unknown names -- special mailboxes can be - * handled in the sendmail aliases file. - */ - if ((pw = getpwnam(name)) == NULL) { - if (eval != EX_TEMPFAIL) - eval = EX_UNAVAILABLE; - if (lmtpmode) { - if (eval == EX_TEMPFAIL) { - printf("451 4.3.0 cannot lookup name: %s\r\n", name); - } else { - printf("550 5.1.1 unknown name: %s\r\n", name); - } - } - else { - char *errcode = NULL; - - if (eval == EX_TEMPFAIL) - errcode = "451 4.3.0"; - else - errcode = "550 5.1.1"; - mailerr(errcode, "unknown name: %s", name); - } - return; - } - endpwent(); - - /* - * Keep name reasonably short to avoid buffer overruns. - * This isn't necessary on BSD because of the proper - * definition of snprintf(), but it can cause problems - * on other systems. - * Also, clear out any bogus characters. - */ - - if (strlen(name) > 40) - name[40] = '\0'; - for (p = name; *p != '\0'; p++) - { - if (!isascii(*p)) - *p &= 0x7f; - else if (!isprint(*p)) - *p = '.'; - } - - (void)snprintf(path, sizeof(path), "%s/%s", _PATH_MAILDIR, name); - - /* - * If the mailbox is linked or a symlink, fail. There's an obvious - * race here, that the file was replaced with a symbolic link after - * the lstat returned, but before the open. We attempt to detect - * this by comparing the original stat information and information - * returned by an fstat of the file descriptor returned by the open. - * - * NB: this is a symptom of a larger problem, that the mail spooling - * directory is writeable by the wrong users. If that directory is - * writeable, system security is compromised for other reasons, and - * it cannot be fixed here. - * - * If we created the mailbox, set the owner/group. If that fails, - * just return. Another process may have already opened it, so we - * can't unlink it. Historically, binmail set the owner/group at - * each mail delivery. We no longer do this, assuming that if the - * ownership or permissions were changed there was a reason. - * - * XXX - * open(2) should support flock'ing the file. - */ -tryagain: - lockmbox(path); - if (lstat(path, &sb) < 0) { - mbfd = open(path, - O_APPEND|O_CREAT|O_EXCL|O_WRONLY, S_IRUSR|S_IWUSR); - if (lstat(path, &sb) < 0) - { - eval = EX_CANTCREAT; - mailerr("550 5.2.0", - "%s: lstat: file changed after open", path); - goto err1; - } - else - sb.st_uid = pw->pw_uid; - if (mbfd == -1) { - if (errno == EEXIST) - goto tryagain; - } else if (fchown(mbfd, pw->pw_uid, pw->pw_gid)) { - mailerr("451 4.3.0", "chown %u.%u: %s", - pw->pw_uid, pw->pw_gid, name); - goto err1; - } - } else if (sb.st_nlink != 1 || !S_ISREG(sb.st_mode)) { - mailerr("550 5.2.0", "%s: irregular file", path); - goto err0; - } else if (sb.st_uid != pw->pw_uid) { - eval = EX_CANTCREAT; - mailerr("550 5.2.0", "%s: wrong ownership (%d)", - path, sb.st_uid); - goto err0; - } else { - mbfd = open(path, O_APPEND|O_WRONLY, 0); - } - - if (mbfd == -1) { - mailerr("450 4.2.0", "%s: %s", path, strerror(errno)); - goto err0; - } else if (fstat(mbfd, &fsb) < 0 || - fsb.st_nlink != 1 || - sb.st_nlink != 1 || - !S_ISREG(fsb.st_mode) || - sb.st_dev != fsb.st_dev || - sb.st_ino != fsb.st_ino || -#if HAS_ST_GEN && 0 /* AFS returns random values for st_gen */ - sb.st_gen != fsb.st_gen || -#endif - sb.st_uid != fsb.st_uid) { - eval = EX_TEMPFAIL; - mailerr("550 5.2.0", "%s: fstat: file changed after open", - path); - goto err1; - } - - /* Wait until we can get a lock on the file. */ - if (flock(mbfd, LOCK_EX)) { - mailerr("450 4.2.0", "%s: %s", path, strerror(errno)); - goto err1; - } - - /* Get the starting offset of the new message for biff. */ - curoff = lseek(mbfd, (off_t)0, SEEK_END); - if (sizeof curoff > sizeof(long)) - (void)snprintf(biffmsg, sizeof(biffmsg), "%s@%s\n", - name, quad_to_string(curoff)); - else - (void)snprintf(biffmsg, sizeof(biffmsg), "%s@%ld\n", - name, curoff); - - /* Copy the message into the file. */ - if (lseek(fd, (off_t)0, SEEK_SET) == (off_t)-1) { - mailerr("450 4.2.0", "temporary file: %s", - strerror(errno)); - goto err1; - } - if (setreuid(0, pw->pw_uid) < 0) { - mailerr("450 4.2.0", "setreuid(0, %d): %s (r=%d, e=%d)", - pw->pw_uid, strerror(errno), getuid(), geteuid()); - goto err1; - } -#ifdef DEBUG - printf("new euid = %d\n", geteuid()); -#endif - while ((nr = read(fd, buf, sizeof(buf))) > 0) - for (off = 0; off < nr; off += nw) - if ((nw = write(mbfd, buf + off, nr - off)) < 0) { - mailerr("450 4.2.0", "%s: %s", - path, strerror(errno)); - goto err3; - } - if (nr < 0) { - mailerr("450 4.2.0", "temporary file: %s", - strerror(errno)); - goto err3; - } - - /* Flush to disk, don't wait for update. */ - if (fsync(mbfd)) { - mailerr("450 4.2.0", "%s: %s", path, strerror(errno)); -err3: - if (setreuid(0, 0) < 0) { -#if 0 - /* already printed an error above for this recipient */ - e_to_sys(errno); - mailerr("450 4.2.0", "setreuid(0, 0): %s", - strerror(errno)); -#endif - } -#ifdef DEBUG - printf("reset euid = %d\n", geteuid()); -#endif - (void)ftruncate(mbfd, curoff); -err1: (void)close(mbfd); -err0: unlockmbox(); - return; - } - - /* Close and check -- NFS doesn't write until the close. */ - if (close(mbfd)) { - mailerr("450 4.2.0", "%s: %s", path, strerror(errno)); - truncate(path, curoff); - } else - notifybiff(biffmsg); - - if (setreuid(0, 0) < 0) { - mailerr("450 4.2.0", "setreuid(0, 0): %s", - strerror(errno)); - goto err0; - } -#ifdef DEBUG - printf("reset euid = %d\n", geteuid()); -#endif - unlockmbox(); - if (lmtpmode) { - printf("250 2.1.5 %s OK\r\n", name); - } -} - -/* - * user.lock files are necessary for compatibility with other - * systems, e.g., when the mail spool file is NFS exported. - * Alas, mailbox locking is more than just a local matter. - * EPA 11/94. - */ - -char lockname[MAXPATHLEN]; -int locked = 0; - -void -lockmbox(path) - char *path; -{ - int statfailed = 0; - - if (locked) - return; - if (strlen(path) + 6 > sizeof lockname) - return; - snprintf(lockname, sizeof lockname, "%s.lock", path); - for (;; sleep(5)) { - int fd; - struct stat st; - time_t now; - - fd = open(lockname, O_WRONLY|O_EXCL|O_CREAT, 0); - if (fd >= 0) { - /* defeat lock checking programs which test pid */ - write(fd, "0", 2); - locked = 1; - close(fd); - return; - } - if (stat(lockname, &st) < 0) { - if (statfailed++ > 5) - return; - continue; - } - statfailed = 0; - time(&now); - if (now < st.st_ctime + 300) - continue; - unlink(lockname); - } -} - -void -unlockmbox() -{ - if (!locked) - return; - unlink(lockname); - locked = 0; -} - -void -notifybiff(msg) - char *msg; -{ - static struct sockaddr_in addr; - static int f = -1; - struct hostent *hp; - struct servent *sp; - int len; - - if (addr.sin_family == 0) { - /* Be silent if biff service not available. */ - if ((sp = getservbyname("biff", "udp")) == NULL) - return; - if ((hp = gethostbyname("localhost")) == NULL) { - return; - } - addr.sin_family = hp->h_addrtype; - memcpy(&addr.sin_addr, hp->h_addr, hp->h_length); - addr.sin_port = sp->s_port; - } - if (f < 0 && (f = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { - return; - } - len = strlen(msg) + 1; - (void) sendto(f, msg, len, 0, (struct sockaddr *)&addr, sizeof(addr)); -} - -void -usage() -{ - eval = EX_USAGE; - mailerr(NULL, "usage: mail.local [-l] [-f from] user ..."); - exit(eval); -} - -void -#ifdef __STDC__ -mailerr(const char *hdr, const char *fmt, ...) -#else -mailerr(hdr, fmt, va_alist) - const char *hdr; - const char *fmt; - va_dcl -#endif -{ - va_list ap; - -#ifdef __STDC__ - va_start(ap, fmt); -#else - va_start(ap); -#endif - if (lmtpmode) - { - if (hdr != NULL) - printf("%s ", hdr); - vprintf(fmt, ap); - printf("\r\n"); - } - else - { - e_to_sys(errno); - vwarn(fmt, ap); - } -} - -void -vwarn(fmt, ap) - const char *fmt; - _BSD_VA_LIST_ ap; -{ - /* - * Log the message to stderr. - * - * Don't use LOG_PERROR as an openlog() flag to do this, - * it's not portable enough. - */ - if (eval != EX_USAGE) - (void)fprintf(stderr, "mail.local: "); - (void)vfprintf(stderr, fmt, ap); - (void)fprintf(stderr, "\n"); - -#if USE_VSYSLOG - /* Log the message to syslog. */ - vsyslog(LOG_ERR, fmt, ap); -#else - { - char fmtbuf[10240]; - - (void) vsnprintf(fmtbuf, sizeof fmtbuf, fmt, ap); - syslog(LOG_ERR, "%s", fmtbuf); - } -#endif -} - -/* - * e_to_sys -- - * Guess which errno's are temporary. Gag me. - */ -void -e_to_sys(num) - int num; -{ - /* Temporary failures override hard errors. */ - if (eval == EX_TEMPFAIL) - return; - - switch(num) { /* Hopefully temporary errors. */ -#ifdef EAGAIN - case EAGAIN: /* Resource temporarily unavailable */ -#endif -#ifdef EDQUOT - case EDQUOT: /* Disc quota exceeded */ -#endif -#ifdef EBUSY - case EBUSY: /* Device busy */ -#endif -#ifdef EPROCLIM - case EPROCLIM: /* Too many processes */ -#endif -#ifdef EUSERS - case EUSERS: /* Too many users */ -#endif -#ifdef ECONNABORTED - case ECONNABORTED: /* Software caused connection abort */ -#endif -#ifdef ECONNREFUSED - case ECONNREFUSED: /* Connection refused */ -#endif -#ifdef ECONNRESET - case ECONNRESET: /* Connection reset by peer */ -#endif -#ifdef EDEADLK - case EDEADLK: /* Resource deadlock avoided */ -#endif -#ifdef EFBIG - case EFBIG: /* File too large */ -#endif -#ifdef EHOSTDOWN - case EHOSTDOWN: /* Host is down */ -#endif -#ifdef EHOSTUNREACH - case EHOSTUNREACH: /* No route to host */ -#endif -#ifdef EMFILE - case EMFILE: /* Too many open files */ -#endif -#ifdef ENETDOWN - case ENETDOWN: /* Network is down */ -#endif -#ifdef ENETRESET - case ENETRESET: /* Network dropped connection on reset */ -#endif -#ifdef ENETUNREACH - case ENETUNREACH: /* Network is unreachable */ -#endif -#ifdef ENFILE - case ENFILE: /* Too many open files in system */ -#endif -#ifdef ENOBUFS - case ENOBUFS: /* No buffer space available */ -#endif -#ifdef ENOMEM - case ENOMEM: /* Cannot allocate memory */ -#endif -#ifdef ENOSPC - case ENOSPC: /* No space left on device */ -#endif -#ifdef EROFS - case EROFS: /* Read-only file system */ -#endif -#ifdef ESTALE - case ESTALE: /* Stale NFS file handle */ -#endif -#ifdef ETIMEDOUT - case ETIMEDOUT: /* Connection timed out */ -#endif -#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN && EWOULDBLOCK != EDEADLK - case EWOULDBLOCK: /* Operation would block. */ -#endif - eval = EX_TEMPFAIL; - break; - default: - eval = EX_UNAVAILABLE; - break; - } -} - -#if !HASSTRERROR - -char * -strerror(eno) - int eno; -{ - extern int sys_nerr; - extern char *sys_errlist[]; - static char ebuf[60]; - - if (eno >= 0 && eno < sys_nerr) - return sys_errlist[eno]; - (void) sprintf(ebuf, "Error %d", eno); - return ebuf; -} - -#endif /* !HASSTRERROR */ - -#if defined(ultrix) || defined(_CRAY) - -/* - * Copyright (c) 1987, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)mktemp.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <errno.h> -#include <stdio.h> -#include <ctype.h> - -static int _gettemp(); - -mkstemp(path) - char *path; -{ - int fd; - - return (_gettemp(path, &fd) ? fd : -1); -} - -/* -char * -mktemp(path) - char *path; -{ - return(_gettemp(path, (int *)NULL) ? path : (char *)NULL); -} -*/ - -static -_gettemp(path, doopen) - char *path; - register int *doopen; -{ - extern int errno; - register char *start, *trv; - struct stat sbuf; - u_int pid; - - pid = getpid(); - for (trv = path; *trv; ++trv); /* extra X's get set to 0's */ - while (*--trv == 'X') { - *trv = (pid % 10) + '0'; - pid /= 10; - } - - /* - * check the target directory; if you have six X's and it - * doesn't exist this runs for a *very* long time. - */ - for (start = trv + 1;; --trv) { - if (trv <= path) - break; - if (*trv == '/') { - *trv = '\0'; - if (stat(path, &sbuf) < 0) - return(0); - if (!S_ISDIR(sbuf.st_mode)) { - errno = ENOTDIR; - return(0); - } - *trv = '/'; - break; - } - } - - for (;;) { - if (doopen) { - if ((*doopen = - open(path, O_CREAT|O_EXCL|O_RDWR, 0600)) >= 0) - return(1); - if (errno != EEXIST) - return(0); - } - else if (stat(path, &sbuf) < 0) - return(errno == ENOENT ? 1 : 0); - - /* tricky little algorithm for backward compatibility */ - for (trv = start;;) { - if (!*trv) - return(0); - if (*trv == 'z') - *trv++ = 'a'; - else { - if (isascii(*trv) && isdigit(*trv)) - *trv = 'a'; - else - ++*trv; - break; - } - } - } - /*NOTREACHED*/ -} - -#endif /* ultrix */ diff --git a/mail.local/pathnames.h b/mail.local/pathnames.h deleted file mode 100644 index 33d949e..0000000 --- a/mail.local/pathnames.h +++ /dev/null @@ -1,15 +0,0 @@ -/*- - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - * - * @(#)pathnames.h 8.5 (Berkeley) 5/19/1998 - */ -#include <paths.h> - -#define _PATH_LOCTMP "/tmp/local.XXXXXX" diff --git a/mailstats/Build b/mailstats/Build deleted file mode 120000 index 6308dba..0000000 --- a/mailstats/Build +++ /dev/null @@ -1 +0,0 @@ -../BuildTools/bin/Build
\ No newline at end of file diff --git a/mailstats/Makefile.m4 b/mailstats/Makefile.m4 deleted file mode 100644 index 2de9904..0000000 --- a/mailstats/Makefile.m4 +++ /dev/null @@ -1,97 +0,0 @@ -# -# This Makefile is designed to work on the old "make" program. -# -# @(#)Makefile.m4 8.15 (Berkeley) 7/12/1998 -# - -# C compiler -CC= confCC - -# Shell -SHELL= confSHELL - -# use O=-O (usual) or O=-g (debugging) -O= ifdef(`confOPTIMIZE', `confOPTIMIZE', `-O') - -# location of sendmail source directory -SRCDIR= ifdef(`confSRCDIR', `confSRCDIR', `../../src') - -# environment definitions (e.g., -D_AIX3) -ENVDEF= ifdef(`confENVDEF', `confENVDEF') - -# see also conf.h for additional compilation flags - -# include directories -INCDIRS=-I${SRCDIR} confINCDIRS - -# loader options -LDOPTS= ifdef(`confLDOPTS', `confLDOPTS') - -# library directories -LIBDIRS=confLIBDIRS - -# libraries required on your system -LIBS= ifdef(`confLIBS', `confLIBS') - -# location of mailstats binary (usually /usr/sbin or /usr/etc) -SBINDIR=${DESTDIR}ifdef(`confSBINDIR', `confSBINDIR', `/usr/sbin') - -# additional .o files needed -OBJADD= ifdef(`confOBJADD', `confOBJADD') - -undivert(1) - -################### end of user configuration flags ###################### - -BUILDBIN=confBUILDBIN -COPTS= -I. ${INCDIRS} ${ENVDEF} -CFLAGS= $O ${COPTS} - -BEFORE= confBEFORE -OBJS= mailstats.o ${OBJADD} - -NROFF= ifdef(`confNROFF', `confNROFF', `groff -Tascii') -MANDOC= ifdef(`confMANDOC', `confMANDOC', `-mandoc') - -INSTALL=ifdef(`confINSTALL', `confINSTALL', `install') -BINOWN= ifdef(`confUBINOWN', `confUBINOWN', `bin') -BINGRP= ifdef(`confUBINGRP', `confUBINGRP', `bin') -BINMODE=ifdef(`confUBINMODE', `confUBINMODE', `555') - -MANOWN= ifdef(`confMANOWN', `confMANOWN', `bin') -MANGRP= ifdef(`confMANGRP', `confMANGRP', `bin') -MANMODE=ifdef(`confMANMODE', `confMANMODE', `444') - -MANROOT=${DESTDIR}ifdef(`confMANROOT', `confMANROOT', `/usr/share/man/cat') -MAN8= ${MANROOT}ifdef(`confMAN8', `confMAN8', `8') -MAN8EXT=ifdef(`confMAN8EXT', `confMAN8EXT', `8') -MAN8SRC=ifdef(`confMAN8SRC', `confMAN8SRC', `0') - -ALL= mailstats mailstats.${MAN8SRC} - -all: ${ALL} - -mailstats: ${BEFORE} ${OBJS} - ${CC} -o mailstats ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} - -undivert(3) - -mailstats.${MAN8SRC}: mailstats.8 - ${NROFF} ${MANDOC} mailstats.8 > mailstats.${MAN8SRC} - -install: install-mailstats install-docs - -install-mailstats: mailstats - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} mailstats ${SBINDIR} - -install-docs: mailstats.${MAN8SRC} -ifdef(`confNO_MAN_INSTALL', `dnl', -` ${INSTALL} -c -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} mailstats.${MAN8SRC} ${MAN8}/mailstats.${MAN8EXT}') - -clean: - rm -f ${OBJS} mailstats mailstats.${MAN8SRC} - -################ Dependency scripts -include(confBUILDTOOLSDIR/M4/depend/ifdef(`confDEPEND_TYPE', `confDEPEND_TYPE', -`generic').m4)dnl -################ End of dependency scripts diff --git a/mailstats/mailstats.0 b/mailstats/mailstats.0 deleted file mode 100644 index 06b9b02..0000000 --- a/mailstats/mailstats.0 +++ /dev/null @@ -1,49 +0,0 @@ -MAILSTATS(1) BSD Reference Manual MAILSTATS(1) - -NNAAMMEE - mmaaiillssttaattss - display mail statistics - -SSYYNNOOPPSSIISS - mmaaiillssttaattss [--oo] [--CC _c_f_f_i_l_e] [--ff _s_t_f_i_l_e] - -DDEESSCCRRIIPPTTIIOONN - The mmaaiillssttaattss utility displays the current mail statistics. - - First, the time at which statistics started being kept is displayed, in - the format specified by ctime(3). Then, the statistics for each mailer - are displayed on a single line, each with the following whitespace sepa- - rated fields: - - MM The mailer number. - mmssggssffrr Number of messages from the mailer. - bbyytteess__ffrroomm Kbytes from the mailer. - mmssggssttoo Number of messages to the mailer. - bbyytteess__ttoo Kbytes to the mailer. - mmssggssrreejj Number of messages rejected. - mmssggssddiiss Number of messages discarded. - MMaaiilleerr The name of the mailer. - - After this display, a line totaling the values for all of the mailers is - displayed, separated from the previous information by a line containing - only equals (``='') characters. - - The options are as follows: - - --CC Read the specified file instead of the default sseennddmmaaiill ``cf'' - file. - - --ff Read the specified statistics file instead of the statistics file - specified in the sseennddmmaaiill ``cf'' file. - - --oo Don't display the name of the mailer in the output. - - The mmaaiillssttaattss utility exits 0 on success, and >0 if an error occurs. - -FFIILLEESS - /etc/sendmail.cf The default sseennddmmaaiill ``cf'' file. - /var/log/sendmail.st The default sseennddmmaaiill statistics file. - -SSEEEE AALLSSOO - mailq(1), sendmail(8) - -3rd Berkeley Distribution April 25, 1996 1 diff --git a/mailstats/mailstats.8 b/mailstats/mailstats.8 deleted file mode 100644 index be2203d..0000000 --- a/mailstats/mailstats.8 +++ /dev/null @@ -1,100 +0,0 @@ -.\" Copyright (c) 1998 Sendmail, Inc. All rights reserved. -.\" -.\" By using this file, you agree to the terms and conditions set -.\" forth in the LICENSE file which can be found at the top level of -.\" the sendmail distribution. -.\" -.\" -.\" @(#)mailstats.8 8.8 (Berkeley) 11/13/1998 -.\" -.Dd April 25, 1996 -.Dt MAILSTATS 1 -.Os BSD 3 -.Sh NAME -.Nm mailstats -.Nd display mail statistics -.Sh SYNOPSIS -.Nm mailstats -.Op Fl o -.if \nP .Op Fl p -.Op Fl C Ar cffile -.Op Fl f Ar stfile -.Sh DESCRIPTION -The -.Nm mailstats -utility displays the current mail statistics. -.Pp -First, the time at which statistics started being kept is displayed, -in the format specified by -.Xr ctime 3 . -Then, -the statistics for each mailer are displayed on a single line, -each with the following whitespace separated fields: -.Pp -.Bl -tag -width 10n -offset indent -compact -.It Sy M -The mailer number. -.It Sy msgsfr -Number of messages from the mailer. -.It Sy bytes_from -Kbytes from the mailer. -.It Sy msgsto -Number of messages to the mailer. -.It Sy bytes_to -Kbytes to the mailer. -.It Sy msgsrej -Number of messages rejected. -.It Sy msgsdis -Number of messages discarded. -.It Sy Mailer -The name of the mailer. -.El -.Pp -After this display, a line totaling the values for all of the mailers -is displayed, -separated from the previous information by a line containing only equals -.Pq Dq \&= -characters. -.Pp -The options are as follows: -.Bl -tag -width Ds -.It Fl C -Read the specified file instead of the default -.Nm sendmail -.Dq cf -file. -.It Fl f -Read the specified statistics file instead of the statistics file -specified in the -.Nm sendmail -.Dq cf -file. -.if \nP \ -\{ -.It Fl p -Output information in program-readable mode and clear statistics. -.\} -.It Fl o -Don't display the name of the mailer in the output. -.El -.Pp -The -.Nm mailstats -utility exits 0 on success, and >0 if an error occurs. -.Sh FILES -.Bl -tag -width /var/log/sendmail.stXX -compact -.ie \nP .It Pa /etc/mail/sendmail.cf -.el .It Pa /etc/sendmail.cf -The default -.Nm sendmail -.Dq cf -file. -.ie \nP .It Pa /etc/mail/statistics -.el .It Pa /var/log/sendmail.st -The default -.Nm sendmail -statistics file. -.El -.Sh SEE ALSO -.Xr mailq 1 , -.Xr sendmail 8 diff --git a/mailstats/mailstats.c b/mailstats/mailstats.c deleted file mode 100644 index 56e9357..0000000 --- a/mailstats/mailstats.c +++ /dev/null @@ -1,296 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - * - */ - -#ifndef lint -static char copyright[] = -"@(#) Copyright (c) 1988, 1993\n\ - The Regents of the University of California. All rights reserved.\n"; -#endif /* not lint */ - -#ifndef lint -static char sccsid[] = "@(#)mailstats.c 8.29 (Berkeley) 1/25/1999"; -#endif /* not lint */ - -#ifndef NOT_SENDMAIL -# define NOT_SENDMAIL -#endif -#include <sendmail.h> -#include <mailstats.h> -#include <pathnames.h> - -#define MNAMELEN 20 /* max length of mailer name */ - -int -main(argc, argv) - int argc; - char **argv; -{ - extern char *optarg; - extern int optind; - struct statistics stat; - register int i; - int mno; - int ch, fd; - char *sfile; - char *cfile; - FILE *cfp; - bool mnames; - bool progmode; - long frmsgs = 0, frbytes = 0, tomsgs = 0, tobytes = 0, rejmsgs = 0; - long dismsgs = 0; - char mtable[MAXMAILERS][MNAMELEN+1]; - char sfilebuf[MAXLINE]; - char buf[MAXLINE]; - time_t now; - extern char *ctime(); - - cfile = _PATH_SENDMAILCF; - sfile = NULL; - mnames = TRUE; - progmode = FALSE; - while ((ch = getopt(argc, argv, "C:f:op")) != EOF) - { - switch (ch) - { - case 'C': - cfile = optarg; - break; - - case 'f': - sfile = optarg; - break; - - case 'o': - mnames = FALSE; - break; - -#if _FFR_MAILSTATS_PROGMODE - case 'p': - progmode = TRUE; - break; -#endif - - case '?': - default: - usage: -#if _FFR_MAILSTATS_PROGMODE - fputs("usage: mailstats [-C cffile] [-f stfile] -o -p\n", - stderr); -#else - fputs("usage: mailstats [-C cffile] [-f stfile] -o \n", - stderr); -#endif - exit(EX_USAGE); - } - } - argc -= optind; - argv += optind; - - if (argc != 0) - goto usage; - - if ((cfp = fopen(cfile, "r")) == NULL) - { - fprintf(stderr, "mailstats: "); - perror(cfile); - exit(EX_NOINPUT); - } - - mno = 0; - (void) strcpy(mtable[mno++], "prog"); - (void) strcpy(mtable[mno++], "*file*"); - (void) strcpy(mtable[mno++], "*include*"); - - while (fgets(buf, sizeof(buf), cfp) != NULL) - { - register char *b; - char *s; - register char *m; - - b = buf; - switch (*b++) - { - case 'M': /* mailer definition */ - break; - - case 'O': /* option -- see if .st file */ - if (strncasecmp(b, " StatusFile", 11) == 0 && - !(isascii(b[11]) && isalnum(b[11]))) - { - /* new form -- find value */ - b = strchr(b, '='); - if (b == NULL) - continue; - while (isascii(*++b) && isspace(*b)) - continue; - } - else if (*b++ != 'S') - { - /* something else boring */ - continue; - } - - /* this is the S or StatusFile option -- save it */ - if (strlen(b) >= sizeof sfilebuf) - { - fprintf(stderr, - "StatusFile filename too long: %.30s...\n", - b); - exit(EX_CONFIG); - } - strcpy(sfilebuf, b); - b = strchr(sfilebuf, '#'); - if (b == NULL) - b = strchr(sfilebuf, '\n'); - if (b == NULL) - b = &sfilebuf[strlen(sfilebuf)]; - while (isascii(*--b) && isspace(*b)) - continue; - *++b = '\0'; - if (sfile == NULL) - sfile = sfilebuf; - - default: - continue; - } - - if (mno >= MAXMAILERS) - { - fprintf(stderr, - "Too many mailers defined, %d max.\n", - MAXMAILERS); - exit(EX_SOFTWARE); - } - m = mtable[mno]; - s = m + MNAMELEN; /* is [MNAMELEN+1] */ - while (*b != ',' && !(isascii(*b) && isspace(*b)) && - *b != '\0' && m < s) - *m++ = *b++; - *m = '\0'; - for (i = 0; i < mno; i++) - { - if (strcmp(mtable[i], mtable[mno]) == 0) - break; - } - if (i == mno) - mno++; - } - (void) fclose(cfp); - for (; mno < MAXMAILERS; mno++) - mtable[mno][0]='\0'; - - if (sfile == NULL) - { - fprintf(stderr, "mailstats: no statistics file located\n"); - exit (EX_OSFILE); - } - - if ((fd = open(sfile, O_RDONLY)) < 0 || - (i = read(fd, &stat, sizeof stat)) < 0) - { - fputs("mailstats: ", stderr); - perror(sfile); - exit(EX_NOINPUT); - } - if (i == 0) - { - sleep(1); - if ((i = read(fd, &stat, sizeof stat)) < 0) - { - fputs("mailstats: ", stderr); - perror(sfile); - exit(EX_NOINPUT); - } - else if (i == 0) - { - bzero((ARBPTR_T) &stat, sizeof stat); - (void) time(&stat.stat_itime); - } - } - if (i != 0) - { - if (stat.stat_magic != STAT_MAGIC) - { - fprintf(stderr, - "mailstats: incorrect magic number in %s\n", - sfile); - exit(EX_OSERR); - } - else if (stat.stat_version != STAT_VERSION) - { - fprintf(stderr, - "mailstats version (%d) incompatible with %s version(%d)\n", - STAT_VERSION, sfile, stat.stat_version); - exit(EX_OSERR); - } - else if (i != sizeof stat || stat.stat_size != sizeof(stat)) - { - fputs("mailstats: file size changed.\n", stderr); - exit(EX_OSERR); - } - } - - if (progmode) - { - time(&now); - printf("%ld %ld\n", (long) stat.stat_itime, (long) now); - } - else - { - printf("Statistics from %s", ctime(&stat.stat_itime)); - printf(" M msgsfr bytes_from msgsto bytes_to msgsrej msgsdis%s\n", - mnames ? " Mailer" : ""); - } - for (i = 0; i < MAXMAILERS; i++) - { - if (stat.stat_nf[i] || stat.stat_nt[i] || - stat.stat_nr[i] || stat.stat_nd[i]) - { - char *format; - - if (progmode) - format = "%2d %8ld %10ld %8ld %10ld %6ld %6ld"; - else - format = "%2d %8ld %10ldK %8ld %10ldK %6ld %6ld"; - printf(format, i, - stat.stat_nf[i], stat.stat_bf[i], - stat.stat_nt[i], stat.stat_bt[i], - stat.stat_nr[i], stat.stat_nd[i]); - if (mnames) - printf(" %s", mtable[i]); - printf("\n"); - frmsgs += stat.stat_nf[i]; - frbytes += stat.stat_bf[i]; - tomsgs += stat.stat_nt[i]; - tobytes += stat.stat_bt[i]; - rejmsgs += stat.stat_nr[i]; - dismsgs += stat.stat_nd[i]; - } - } - if (progmode) - { - printf(" T %8ld %10ld %8ld %10ld %6ld %6ld\n", - frmsgs, frbytes, tomsgs, tobytes, rejmsgs, dismsgs); - close(fd); - fd = open(sfile, O_RDWR | O_TRUNC); - if (fd >= 0) - close(fd); - } - else - { - printf("=============================================================\n"); - printf(" T %8ld %10ldK %8ld %10ldK %6ld %6ld\n", - frmsgs, frbytes, tomsgs, tobytes, rejmsgs, dismsgs); - } - exit(EX_OK); -} diff --git a/makemap/Build b/makemap/Build deleted file mode 120000 index 6308dba..0000000 --- a/makemap/Build +++ /dev/null @@ -1 +0,0 @@ -../BuildTools/bin/Build
\ No newline at end of file diff --git a/makemap/Makefile.m4 b/makemap/Makefile.m4 deleted file mode 100644 index 983ffdf..0000000 --- a/makemap/Makefile.m4 +++ /dev/null @@ -1,110 +0,0 @@ -# -# This Makefile is designed to work on the old "make" program. -# -# @(#)Makefile.m4 8.21 (Berkeley) 7/12/1998 -# - -# C compiler -CC= confCC - -# Shell -SHELL= confSHELL - -# use O=-O (usual) or O=-g (debugging) -O= ifdef(`confOPTIMIZE', `confOPTIMIZE', `-O') - -# location of sendmail source directory -SRCDIR= ifdef(`confSRCDIR', `confSRCDIR', `../../src') - -# define the database mechanisms available for map & alias lookups: -# -DNDBM -- use new DBM -# -DNEWDB -- use new Berkeley DB -# The really old (V7) DBM library is no longer supported. -# -MAPDEF= ifdef(`confMAPDEF', `confMAPDEF') - -# environment definitions (e.g., -D_AIX3) -ENVDEF= -DNOT_SENDMAIL ifdef(`confENVDEF', `confENVDEF') - -# see also conf.h for additional compilation flags - -# include directories -INCDIRS=-I${SRCDIR} confINCDIRS - -# loader options -LDOPTS= ifdef(`confLDOPTS', `confLDOPTS') - -# library directories -LIBDIRS=confLIBDIRS - -# libraries required on your system -LIBS= ifdef(`confLIBS', `confLIBS') - -# location of makemap binary (usually /usr/sbin or /usr/etc) -SBINDIR=${DESTDIR}ifdef(`confSBINDIR', `confSBINDIR', `/usr/sbin') - -# additional .o files needed -OBJADD= ifdef(`confOBJADD', `confOBJADD') - -undivert(1) - -################### end of user configuration flags ###################### - -BUILDBIN=confBUILDBIN -COPTS= -I. ${INCDIRS} ${MAPDEF} ${ENVDEF} -CFLAGS= $O ${COPTS} - -BEFORE= confBEFORE safefile.c snprintf.c -OBJS= makemap.o safefile.o snprintf.o ${OBJADD} - -NROFF= ifdef(`confNROFF', `confNROFF', `groff -Tascii') -MANDOC= ifdef(`confMANDOC', `confMANDOC', `-mandoc') - -INSTALL=ifdef(`confINSTALL', `confINSTALL', `install') -BINOWN= ifdef(`confUBINOWN', `confUBINOWN', `bin') -BINGRP= ifdef(`confUBINGRP', `confUBINGRP', `bin') -BINMODE=ifdef(`confUBINMODE', `confUBINMODE', `555') - -MANOWN= ifdef(`confMANOWN', `confMANOWN', `bin') -MANGRP= ifdef(`confMANGRP', `confMANGRP', `bin') -MANMODE=ifdef(`confMANMODE', `confMANMODE', `444') - -MANROOT=${DESTDIR}ifdef(`confMANROOT', `confMANROOT', `/usr/share/man/cat') -MAN8= ${MANROOT}ifdef(`confMAN8', `confMAN8', `8') -MAN8EXT=ifdef(`confMAN8EXT', `confMAN8EXT', `8') -MAN8SRC=ifdef(`confMAN8SRC', `confMAN8SRC', `0') - -ALL= makemap makemap.${MAN8SRC} - -all: ${ALL} - -makemap: ${BEFORE} ${OBJS} - ${CC} -o makemap ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} - -safefile.c: ${SRCDIR}/safefile.c - -ln -s ${SRCDIR}/safefile.c safefile.c - -snprintf.c: ${SRCDIR}/snprintf.c - -ln -s ${SRCDIR}/snprintf.c snprintf.c - -undivert(3) - -makemap.${MAN8SRC}: makemap.8 - ${NROFF} ${MANDOC} makemap.8 > makemap.${MAN8SRC} - -install: install-makemap install-docs - -install-makemap: makemap - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} makemap ${SBINDIR} - -install-docs: makemap.${MAN8SRC} -ifdef(`confNO_MAN_INSTALL', `dnl', -` ${INSTALL} -c -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} makemap.${MAN8SRC} ${MAN8}/makemap.${MAN8EXT}') - -clean: - rm -f ${OBJS} makemap makemap.${MAN8SRC} - -################ Dependency scripts -include(confBUILDTOOLSDIR/M4/depend/ifdef(`confDEPEND_TYPE', `confDEPEND_TYPE', -`generic').m4)dnl -################ End of dependency scripts diff --git a/makemap/makemap.0 b/makemap/makemap.0 deleted file mode 100644 index eb6cd77..0000000 --- a/makemap/makemap.0 +++ /dev/null @@ -1,63 +0,0 @@ -MAKEMAP(8) BSD System Manager's Manual MAKEMAP(8) - -NNAAMMEE - mmaakkeemmaapp - create database maps for sendmail - -SSYYNNOOPPSSIISS - mmaakkeemmaapp [--NN] [--dd] [--ff] [--oo] [--rr] [--ss] [--vv] _m_a_p_t_y_p_e _m_a_p_n_a_m_e - -DDEESSCCRRIIPPTTIIOONN - mmaakkeemmaapp creates the database maps used by the keyed map lookups in - sendmail(8). It reads input from the standard input and outputs them to - the indicated _m_a_p_n_a_m_e. - - Depending on how it is compiled, mmaakkeemmaapp handles up to three different - database formats, selected using the _m_a_p_t_y_p_e parameter. They may be - - dbm DBM format maps. This requires the ndbm(3) library. - - btree B-Tree format maps. This requires the new Berkeley DB li- - brary. - - hash Hash format maps. This also requires the Berkeley DB li- - brary. - - In all cases, mmaakkeemmaapp reads lines from the standard input consisting of - two words separated by white space. The first is the database key, the - second is the value. The value may contain ``%_n'' strings to indicated - parameter substitution. Literal percents should be doubled (``%%''). - Blank lines and lines beginning with ``#'' are ignored. - - FFllaaggss - - --NN Include the null byte that terminates strings in the map. - This must match the -N flag in the sendmail.cf ``K'' line. - - --dd Allow duplicate keys in the map. This is only allowed on B- - Tree format maps. If two identical keys are read, they will - both be inserted into the map. - - --ff Normally all upper case letters in the key are folded to low- - er case. This flag disables that behaviour. This is intend- - ed to mesh with the -f flag in the KK line in sendmail.cf. - The value is never case folded. - - --oo Append to an old file. This allows you to augment an exist- - ing file. - - --rr Allow replacement of existing keys. Normally mmaakkeemmaapp com- - plains if you repeat a key, and does not do the insert. - - --ss Ignore safety checks on maps being created. This includes - checking for hard or symbolic links in world writable direc- - tories. - - --vv Verbosely print what it is doing. - -SSEEEE AALLSSOO - sendmail(8) - -HHIISSTTOORRYY - The mmaakkeemmaapp command appeared in 4.4BSD. - -4.4BSD November 16, 1992 1 diff --git a/makemap/makemap.8 b/makemap/makemap.8 deleted file mode 100644 index 81f53a8..0000000 --- a/makemap/makemap.8 +++ /dev/null @@ -1,127 +0,0 @@ -.\" Copyright (c) 1998 Sendmail, Inc. All rights reserved. -.\" Copyright (c) 1988, 1991, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" By using this file, you agree to the terms and conditions set -.\" forth in the LICENSE file which can be found at the top level of -.\" the sendmail distribution. -.\" -.\" -.\" @(#)makemap.8 8.12 (Berkeley) 11/13/1998 -.\" -.Dd November 16, 1992 -.Dt MAKEMAP 8 -.Os BSD 4.4 -.Sh NAME -.Nm makemap -.Nd create database maps for sendmail -.Sh SYNOPSIS -.Nm -.Op Fl N -.if \nP .Op Fl c Ar cachesize -.Op Fl d -.Op Fl f -.if \nP .Op Fl l -.Op Fl o -.Op Fl r -.Op Fl s -.Op Fl v -.Ar maptype -.Ar mapname -.Sh DESCRIPTION -.Nm -creates the database maps used by the keyed map lookups in -.Xr sendmail 8 . -It reads input from the standard input -and outputs them to the indicated -.Ar mapname . -.Pp -Depending on how it is compiled, -.Nm -handles up to three different database formats, -selected using the -.Ar maptype -parameter. -They may be -.Bl -tag -width Fl -.It Li dbm -DBM format maps. -This requires the -.Xr ndbm 3 -library. -.It Li btree -B-Tree format maps. -This requires the new Berkeley DB -library. -.It Li hash -Hash format maps. -This also requires the Berkeley DB -library. -.El -.Pp -In all cases, -.Nm -reads lines from the standard input consisting of two -words separated by white space. -The first is the database key, -the second is the value. -The value may contain -``%\fIn\fP'' -strings to indicated parameter substitution. -Literal percents should be doubled -(``%%''). -Blank lines and lines beginning with ``#'' are ignored. -.Ss Flags -.Bl -tag -width Fl -.It Fl N -Include the null byte that terminates strings -in the map. -This must match the \-N flag in the sendmail.cf -``K'' line. -.if \nP \ -\{\ -.It Fl c -Use the specified hash and B-Tree cache size. -.\} -.It Fl d -Allow duplicate keys in the map. -This is only allowed on B-Tree format maps. -If two identical keys are read, -they will both be inserted into the map. -.It Fl f -Normally all upper case letters in the key -are folded to lower case. -This flag disables that behaviour. -This is intended to mesh with the -\-f flag in the -\fBK\fP -line in sendmail.cf. -The value is never case folded. -.if \nP \ -\{\ -.It Fl l -List supported map types. -.\} -.It Fl o -Append to an old file. -This allows you to augment an existing file. -.It Fl r -Allow replacement of existing keys. -Normally -.Nm -complains if you repeat a key, -and does not do the insert. -.It Fl s -Ignore safety checks on maps being created. -This includes checking for hard or symbolic -links in world writable directories. -.It Fl v -Verbosely print what it is doing. -.El -.Sh SEE ALSO -.Xr sendmail 8 -.Sh HISTORY -The -.Nm -command appeared in -.Bx 4.4 . diff --git a/makemap/makemap.c b/makemap/makemap.c deleted file mode 100644 index aaaba32..0000000 --- a/makemap/makemap.c +++ /dev/null @@ -1,1016 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1992 Eric P. Allman. All rights reserved. - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)makemap.c 8.71 (Berkeley) 11/29/1998"; -#endif /* not lint */ - -#include <sys/types.h> -#include <sys/errno.h> -#ifndef ISC_UNIX -# include <sys/file.h> -#endif -#include "sendmail.h" -#include "pathnames.h" - -#ifdef NDBM -# include <ndbm.h> -#endif - -#ifdef NEWDB -# include <db.h> -# ifndef DB_VERSION_MAJOR -# define DB_VERSION_MAJOR 1 -# endif -#endif - -enum type { T_DBM, T_BTREE, T_HASH, T_ERR, T_UNKNOWN }; - -union dbent -{ -#ifdef NDBM - datum dbm; -#endif -#ifdef NEWDB - DBT db; -#endif - struct - { - char *data; - size_t size; - } xx; -}; - -uid_t RealUid; -gid_t RealGid; -char *RealUserName; -uid_t RunAsUid; -uid_t RunAsGid; -char *RunAsUserName; -int Verbose = 2; -bool DontInitGroups = FALSE; -long DontBlameSendmail = DBS_SAFE; -u_char tTdvect[100]; -uid_t TrustedUid = 0; - -#define BUFSIZE 1024 - -int -main(argc, argv) - int argc; - char **argv; -{ - char *progname; - char *cfile; - bool inclnull = FALSE; - bool notrunc = FALSE; - bool allowreplace = FALSE; - bool allowdups = FALSE; - bool verbose = FALSE; - bool foldcase = TRUE; - int exitstat; - int opt; - char *typename = NULL; - char *mapname = NULL; - char *ext = NULL; - int lineno; - int st; - int mode; - int putflags = 0; -#ifdef NEWDB - long dbcachesize = 1024 * 1024; -#endif - enum type type; -#if !O_EXLOCK - int fd; -#endif - int sff = SFF_ROOTOK|SFF_REGONLY; - struct passwd *pw; - union - { -#ifdef NDBM - DBM *dbm; -#endif -#ifdef NEWDB - DB *db; -#endif - void *dbx; - } dbp; - union dbent key, val; -#ifdef NEWDB -# if DB_VERSION_MAJOR < 2 - BTREEINFO bti; - HASHINFO hinfo; -# else - DB_INFO dbinfo; -# endif -#endif - char ibuf[BUFSIZE]; - char fbuf[MAXNAME]; - char dbuf[MAXNAME]; -#ifdef NDBM - char pbuf[MAXNAME]; -#endif -#if _FFR_TRUSTED_USER - FILE *cfp; - char buf[MAXLINE]; -#endif - static char rnamebuf[MAXNAME]; /* holds RealUserName */ - struct stat std; -#ifdef NDBM - struct stat stp; -#endif - extern char *optarg; - extern int optind; - - progname = argv[0]; - cfile = _PATH_SENDMAILCF; - - RunAsUid = RealUid = getuid(); - RunAsGid = RealGid = getgid(); - pw = getpwuid(RealUid); - if (pw != NULL) - { - if (strlen(pw->pw_name) > MAXNAME - 1) - pw->pw_name[MAXNAME] = 0; - sprintf(rnamebuf, "%s", pw->pw_name); - } - else - sprintf(rnamebuf, "Unknown UID %d", (int) RealUid); - RunAsUserName = RealUserName = rnamebuf; - -#if _FFR_NEW_MAKEMAP_FLAGS -#define OPTIONS "C:Nc:dflorsv" -#else -#define OPTIONS "C:Ndforsv" -#endif - while ((opt = getopt(argc, argv, OPTIONS)) != EOF) - { - switch (opt) - { - case 'C': - cfile = optarg; - break; - - case 'N': - inclnull = TRUE; - break; - -#if _FFR_NEW_MAKEMAP_FLAGS - case 'c': -# ifdef NEWDB - dbcachesize = atol(optarg); -# endif - break; -#endif - - case 'd': - allowdups = TRUE; - break; - - case 'f': - foldcase = FALSE; - break; - -#if _FFR_NEW_MAKEMAP_FLAGS - case 'l': -# ifdef NDBM - printf("dbm\n"); -# endif -# ifdef NEWDB - printf("hash\n"); - printf("btree\n"); -# endif - exit(EX_OK); - break; -#endif - - case 'o': - notrunc = TRUE; - break; - - case 'r': - allowreplace = TRUE; - break; - - case 's': - DontBlameSendmail |= DBS_MAPINUNSAFEDIRPATH|DBS_WRITEMAPTOHARDLINK|DBS_WRITEMAPTOSYMLINK|DBS_LINKEDMAPINWRITABLEDIR; - break; - - case 'v': - verbose = TRUE; - break; - - default: - type = T_ERR; - break; - } - } - - if (!bitset(DBS_WRITEMAPTOSYMLINK, DontBlameSendmail)) - sff |= SFF_NOSLINK; - if (!bitset(DBS_WRITEMAPTOHARDLINK, DontBlameSendmail)) - sff |= SFF_NOHLINK; - if (!bitset(DBS_LINKEDMAPINWRITABLEDIR, DontBlameSendmail)) - sff |= SFF_NOWLINK; - - argc -= optind; - argv += optind; - if (argc != 2) - type = T_ERR; - else - { - typename = argv[0]; - mapname = argv[1]; - ext = NULL; - - if (strcmp(typename, "dbm") == 0) - { - type = T_DBM; - } - else if (strcmp(typename, "btree") == 0) - { - type = T_BTREE; - ext = ".db"; - } - else if (strcmp(typename, "hash") == 0) - { - type = T_HASH; - ext = ".db"; - } - else - type = T_UNKNOWN; - } - -#if _FFR_TRUSTED_USER - if ((cfp = fopen(cfile, "r")) == NULL) - { - fprintf(stderr, "mailstats: "); - perror(cfile); - exit(EX_NOINPUT); - } - while (fgets(buf, sizeof(buf), cfp) != NULL) - { - register char *b; - - if ((b = strchr(buf, '\n')) != NULL) - *b = '\0'; - - b = buf; - switch (*b++) - { - case 'O': /* option */ - if (strncasecmp(b, " TrustedUser", 12) == 0 && - !(isascii(b[12]) && isalnum(b[12]))) - { - b = strchr(b, '='); - if (b == NULL) - continue; - while (isascii(*++b) && isspace(*b)) - continue; - if (isascii(*b) && isdigit(*b)) - TrustedUid = atoi(b); - else - { - register struct passwd *pw; - - TrustedUid = 0; - pw = getpwnam(b); - if (pw == NULL) - fprintf(stderr, - "TrustedUser: unknown user %s\n", b); - else - TrustedUid = pw->pw_uid; - } - -# ifdef UID_MAX - if (TrustedUid > UID_MAX) - { - syserr("TrustedUser: uid value (%ld) > UID_MAX (%ld)", - TrustedUid, UID_MAX); - TrustedUid = 0; - } -# endif - break; - } - - - default: - continue; - } - } - (void) fclose(cfp); -#endif - switch (type) - { - case T_ERR: -#if _FFR_NEW_MAKEMAP_FLAGS - fprintf(stderr, - "Usage: %s [-N] [-c cachesize] [-d] [-f] [-l] [-o] [-r] [-s] [-v] type mapname\n", - progname); -#else - fprintf(stderr, "Usage: %s [-N] [-d] [-f] [-o] [-r] [-s] [-v] type mapname\n", progname); -#endif - exit(EX_USAGE); - - case T_UNKNOWN: - fprintf(stderr, "%s: Unknown database type %s\n", - progname, typename); - exit(EX_USAGE); - -#ifndef NDBM - case T_DBM: -#endif -#ifndef NEWDB - case T_BTREE: - case T_HASH: -#endif - fprintf(stderr, "%s: Type %s not supported in this version\n", - progname, typename); - exit(EX_UNAVAILABLE); - -#ifdef NEWDB - case T_BTREE: -# if DB_VERSION_MAJOR < 2 - bzero(&bti, sizeof bti); -# else - bzero(&dbinfo, sizeof dbinfo); -# endif - if (allowdups) - { -# if DB_VERSION_MAJOR < 2 - bti.flags |= R_DUP; -# else - dbinfo.flags |= DB_DUP; -# endif - } - if (allowdups || allowreplace) - putflags = 0; - else - { -# if DB_VERSION_MAJOR < 2 - putflags = R_NOOVERWRITE; -# else - putflags = DB_NOOVERWRITE; -# endif - } - break; - - case T_HASH: -# if DB_VERSION_MAJOR < 2 - bzero(&hinfo, sizeof hinfo); -# else - bzero(&dbinfo, sizeof dbinfo); -# endif - if (allowreplace) - putflags = 0; - else - { -# if DB_VERSION_MAJOR < 2 - putflags = R_NOOVERWRITE; -# else - putflags = DB_NOOVERWRITE; -# endif - } - break; -#endif -#ifdef NDBM - case T_DBM: - if (allowdups) - { - fprintf(stderr, "%s: Type %s does not support -d (allow dups)\n", - progname, typename); - exit(EX_UNAVAILABLE); - } - if (allowreplace) - putflags = DBM_REPLACE; - else - putflags = DBM_INSERT; - break; -#endif - } - - /* - ** Adjust file names. - */ - - if (ext != NULL) - { - int el, fl; - - el = strlen(ext); - fl = strlen(mapname); - if (el + fl + 1 >= sizeof fbuf) - { - fprintf(stderr, "%s: file name too long", mapname); - exit(EX_USAGE); - } - if (fl < el || strcmp(&mapname[fl - el], ext) != 0) - { - strcpy(fbuf, mapname); - strcat(fbuf, ext); - mapname = fbuf; - } - } - - if (!notrunc) - sff |= SFF_CREAT; - switch (type) - { -#ifdef NEWDB - case T_BTREE: - case T_HASH: - if (strlen(mapname) >= sizeof dbuf) - { - fprintf(stderr, - "%s: map name too long\n", mapname); - exit(EX_USAGE); - } - strcpy(dbuf, mapname); - if ((st = safefile(dbuf, RealUid, RealGid, RealUserName, - sff, S_IWUSR, &std)) != 0) - { - fprintf(stderr, - "%s: could not create: %s\n", - dbuf, errstring(st)); - exit(EX_CANTCREAT); - } - break; -#endif -#ifdef NDBM - case T_DBM: - if (strlen(mapname) + 5 > sizeof dbuf) - { - fprintf(stderr, - "%s: map name too long\n", mapname); - exit(EX_USAGE); - } - sprintf(dbuf, "%s.dir", mapname); - if ((st = safefile(dbuf, RealUid, RealGid, RealUserName, - sff, S_IWUSR, &std)) != 0) - { - fprintf(stderr, - "%s: could not create: %s\n", - dbuf, errstring(st)); - exit(EX_CANTCREAT); - } - sprintf(pbuf, "%s.pag", mapname); - if ((st = safefile(pbuf, RealUid, RealGid, RealUserName, - sff, S_IWUSR, &stp)) != 0) - { - fprintf(stderr, - "%s: could not create: %s\n", - pbuf, errstring(st)); - exit(EX_CANTCREAT); - } - break; -#endif - default: - fprintf(stderr, - "%s: internal error: type %d\n", - progname, - type); - exit(EX_SOFTWARE); - } - - /* - ** Create the database. - */ - - mode = O_RDWR; - if (!notrunc) - mode |= O_CREAT|O_TRUNC; -#if O_EXLOCK - mode |= O_EXLOCK; -#else - /* pre-lock the database */ - fd = safeopen(dbuf, mode & ~O_TRUNC, 0644, sff); - if (fd < 0) - { - fprintf(stderr, "%s: cannot create type %s map %s\n", - progname, typename, mapname); - exit(EX_CANTCREAT); - } -#endif - switch (type) - { -#ifdef NDBM - case T_DBM: - dbp.dbm = dbm_open(mapname, mode, 0644); - if (dbp.dbm != NULL && - dbm_dirfno(dbp.dbm) == dbm_pagfno(dbp.dbm)) - { - fprintf(stderr, "dbm map %s: cannot run with GDBM\n", - mapname); - dbm_close(dbp.dbm); - exit(EX_CONFIG); - } - if (dbp.dbm != NULL && - (filechanged(dbuf, dbm_dirfno(dbp.dbm), &std) || - filechanged(pbuf, dbm_pagfno(dbp.dbm), &stp))) - { - fprintf(stderr, - "dbm map %s: file changed after open\n", - mapname); - dbm_close(dbp.dbm); - exit(EX_CANTCREAT); - } -#if _FFR_TRUSTED_USER - if (geteuid() == 0 && TrustedUid != 0) - { - if (fchown(dbm_dirfno(dbp.dbm), TrustedUid, -1) < 0 || - fchown(dbm_pagfno(dbp.dbm), TrustedUid, -1) < 0) - { - fprintf(stderr, - "WARNING: ownership change on %s failed: %s", - mapname, errstring(errno)); - } - } -#endif - - break; -#endif - -#ifdef NEWDB - case T_HASH: - /* tweak some parameters for performance */ -# if DB_VERSION_MAJOR < 2 - hinfo.nelem = 4096; - hinfo.cachesize = dbcachesize; -# else - dbinfo.h_nelem = 4096; - dbinfo.db_cachesize = dbcachesize; -# endif - -# if DB_VERSION_MAJOR < 2 - dbp.db = dbopen(mapname, mode, 0644, DB_HASH, &hinfo); -# else - { - int flags = 0; - - if (bitset(O_CREAT, mode)) - flags |= DB_CREATE; - if (bitset(O_TRUNC, mode)) - flags |= DB_TRUNCATE; - - dbp.db = NULL; - errno = db_open(mapname, DB_HASH, flags, 0644, - NULL, &dbinfo, &dbp.db); - } -# endif - if (dbp.db != NULL) - { - int fd; - -# if DB_VERSION_MAJOR < 2 - fd = dbp.db->fd(dbp.db); -# else - fd = -1; - errno = dbp.db->fd(dbp.db, &fd); -# endif - if (filechanged(dbuf, fd, &std)) - { - fprintf(stderr, - "db map %s: file changed after open\n", - mapname); -# if DB_VERSION_MAJOR < 2 - dbp.db->close(dbp.db); -# else - errno = dbp.db->close(dbp.db, 0); -# endif - exit(EX_CANTCREAT); - } - (void) (*dbp.db->sync)(dbp.db, 0); -#if _FFR_TRUSTED_USER - if (geteuid() == 0 && TrustedUid != 0) - { - if (fchown(fd, TrustedUid, -1) < 0) - { - fprintf(stderr, - "WARNING: ownership change on %s failed: %s", - mapname, errstring(errno)); - } - } -#endif - } - break; - - case T_BTREE: - /* tweak some parameters for performance */ -# if DB_VERSION_MAJOR < 2 - bti.cachesize = dbcachesize; -# else - dbinfo.db_cachesize = dbcachesize; -# endif - -# if DB_VERSION_MAJOR < 2 - dbp.db = dbopen(mapname, mode, 0644, DB_BTREE, &bti); -# else - { - int flags = 0; - - if (bitset(O_CREAT, mode)) - flags |= DB_CREATE; - if (bitset(O_TRUNC, mode)) - flags |= DB_TRUNCATE; - - dbp.db = NULL; - errno = db_open(mapname, DB_BTREE, flags, 0644, - NULL, &dbinfo, &dbp.db); - } -# endif - if (dbp.db != NULL) - { - int fd; - -# if DB_VERSION_MAJOR < 2 - fd = dbp.db->fd(dbp.db); -# else - fd = -1; - errno = dbp.db->fd(dbp.db, &fd); -# endif - if (filechanged(dbuf, fd, &std)) - { - fprintf(stderr, - "db map %s: file changed after open\n", - mapname); -# if DB_VERSION_MAJOR < 2 - dbp.db->close(dbp.db); -# else - errno = dbp.db->close(dbp.db, 0); -# endif - exit(EX_CANTCREAT); - } - (void) (*dbp.db->sync)(dbp.db, 0); -#if _FFR_TRUSTED_USER - if (geteuid() == 0 && TrustedUid != 0) - { - if (fchown(fd, TrustedUid, -1) < 0) - { - fprintf(stderr, - "WARNING: ownership change on %s failed: %s", - mapname, errstring(errno)); - } - } -#endif - } - break; -#endif - - default: - fprintf(stderr, "%s: internal error: type %d\n", - progname, type); - exit(EX_SOFTWARE); - } - - if (dbp.dbx == NULL) - { - fprintf(stderr, "%s: cannot open type %s map %s\n", - progname, typename, mapname); - exit(EX_CANTCREAT); - } - - /* - ** Copy the data - */ - - lineno = 0; - exitstat = EX_OK; - while (fgets(ibuf, sizeof ibuf, stdin) != NULL) - { - register char *p; - - lineno++; - - /* - ** Parse the line. - */ - - p = strchr(ibuf, '\n'); - if (p != NULL) - *p = '\0'; - else if (!feof(stdin)) - { - fprintf(stderr, "%s: %s: line %d: line too long (%ld bytes max)\n", - progname, mapname, lineno, (long) sizeof ibuf); - continue; - } - - if (ibuf[0] == '\0' || ibuf[0] == '#') - continue; - if (isascii(ibuf[0]) && isspace(ibuf[0])) - { - fprintf(stderr, "%s: %s: line %d: syntax error (leading space)\n", - progname, mapname, lineno); - continue; - } -#ifdef NEWDB - if (type == T_HASH || type == T_BTREE) - { - bzero(&key.db, sizeof key.db); - bzero(&val.db, sizeof val.db); - } -#endif - - key.xx.data = ibuf; - for (p = ibuf; *p != '\0' && !(isascii(*p) && isspace(*p)); p++) - { - if (foldcase && isascii(*p) && isupper(*p)) - *p = tolower(*p); - } - key.xx.size = p - key.xx.data; - if (inclnull) - key.xx.size++; - if (*p != '\0') - *p++ = '\0'; - while (isascii(*p) && isspace(*p)) - p++; - if (*p == '\0') - { - fprintf(stderr, "%s: %s: line %d: no RHS for LHS %s\n", - progname, mapname, lineno, key.xx.data); - continue; - } - val.xx.data = p; - val.xx.size = strlen(p); - if (inclnull) - val.xx.size++; - - /* - ** Do the database insert. - */ - - if (verbose) - { - printf("key=`%s', val=`%s'\n", key.xx.data, val.xx.data); - } - - switch (type) - { -#ifdef NDBM - case T_DBM: - st = dbm_store(dbp.dbm, key.dbm, val.dbm, putflags); - break; -#endif - -#ifdef NEWDB - case T_BTREE: - case T_HASH: -# if DB_VERSION_MAJOR < 2 - st = (*dbp.db->put)(dbp.db, &key.db, &val.db, putflags); -# else - errno = (*dbp.db->put)(dbp.db, NULL, &key.db, - &val.db, putflags); - switch (errno) - { - case DB_KEYEXIST: - st = 1; - break; - - case 0: - st = 0; - break; - - default: - st = -1; - break; - } -# endif - break; -#endif - default: - break; - } - - if (st < 0) - { - fprintf(stderr, "%s: %s: line %d: key %s: put error\n", - progname, mapname, lineno, key.xx.data); - perror(mapname); - exitstat = EX_IOERR; - } - else if (st > 0) - { - fprintf(stderr, - "%s: %s: line %d: key %s: duplicate key\n", - progname, mapname, lineno, key.xx.data); - } - } - - /* - ** Now close the database. - */ - - switch (type) - { -#ifdef NDBM - case T_DBM: - dbm_close(dbp.dbm); - break; -#endif - -#ifdef NEWDB - case T_HASH: - case T_BTREE: -# if DB_VERSION_MAJOR < 2 - if ((*dbp.db->close)(dbp.db) < 0) -# else - if ((errno = (*dbp.db->close)(dbp.db, 0)) != 0) -# endif - { - fprintf(stderr, "%s: %s: error on close\n", - progname, mapname); - perror(mapname); - exitstat = EX_IOERR; - } -#endif - default: - break; - } - -#if !O_EXLOCK - /* release locks */ - close(fd); -#endif - - exit (exitstat); -} -/* -** LOCKFILE -- lock a file using flock or (shudder) fcntl locking -** -** Parameters: -** fd -- the file descriptor of the file. -** filename -- the file name (for error messages). -** ext -- the filename extension. -** type -- type of the lock. Bits can be: -** LOCK_EX -- exclusive lock. -** LOCK_NB -- non-blocking. -** -** Returns: -** TRUE if the lock was acquired. -** FALSE otherwise. -*/ - -bool -lockfile(fd, filename, ext, type) - int fd; - char *filename; - char *ext; - int type; -{ -# if !HASFLOCK - int action; - struct flock lfd; - extern int errno; - - bzero(&lfd, sizeof lfd); - if (bitset(LOCK_UN, type)) - lfd.l_type = F_UNLCK; - else if (bitset(LOCK_EX, type)) - lfd.l_type = F_WRLCK; - else - lfd.l_type = F_RDLCK; - if (bitset(LOCK_NB, type)) - action = F_SETLK; - else - action = F_SETLKW; - - if (fcntl(fd, action, &lfd) >= 0) - return TRUE; - - /* - ** On SunOS, if you are testing using -oQ/tmp/mqueue or - ** -oA/tmp/aliases or anything like that, and /tmp is mounted - ** as type "tmp" (that is, served from swap space), the - ** previous fcntl will fail with "Invalid argument" errors. - ** Since this is fairly common during testing, we will assume - ** that this indicates that the lock is successfully grabbed. - */ - - if (errno == EINVAL) - return TRUE; - -# else /* HASFLOCK */ - - if (flock(fd, type) >= 0) - return TRUE; - -# endif - - return FALSE; -} - -/*VARARGS1*/ -void -#ifdef __STDC__ -message(const char *msg, ...) -#else -message(msg, va_alist) - const char *msg; - va_dcl -#endif -{ - const char *m; - VA_LOCAL_DECL - - m = msg; - if (isascii(m[0]) && isdigit(m[0]) && - isascii(m[1]) && isdigit(m[1]) && - isascii(m[2]) && isdigit(m[2]) && m[3] == ' ') - m += 4; - VA_START(msg); - vfprintf(stderr, m, ap); - VA_END; - fprintf(stderr, "\n"); -} - -/*VARARGS1*/ -void -#ifdef __STDC__ -syserr(const char *msg, ...) -#else -syserr(msg, va_alist) - const char *msg; - va_dcl -#endif -{ - const char *m; - VA_LOCAL_DECL - - m = msg; - if (isascii(m[0]) && isdigit(m[0]) && - isascii(m[1]) && isdigit(m[1]) && - isascii(m[2]) && isdigit(m[2]) && m[3] == ' ') - m += 4; - VA_START(msg); - vfprintf(stderr, m, ap); - VA_END; - fprintf(stderr, "\n"); -} - -const char * -errstring(err) - int err; -{ -#if !HASSTRERROR - static char errstr[64]; -# if !defined(ERRLIST_PREDEFINED) - extern char *sys_errlist[]; - extern int sys_nerr; -# endif -#endif - - /* handle pseudo-errors internal to sendmail */ - switch (err) - { - case E_SM_OPENTIMEOUT: - return "Timeout on file open"; - - case E_SM_NOSLINK: - return "Symbolic links not allowed"; - - case E_SM_NOHLINK: - return "Hard links not allowed"; - - case E_SM_REGONLY: - return "Regular files only"; - - case E_SM_ISEXEC: - return "Executable files not allowed"; - - case E_SM_WWDIR: - return "World writable directory"; - - case E_SM_GWDIR: - return "Group writable directory"; - - case E_SM_FILECHANGE: - return "File changed after open"; - - case E_SM_WWFILE: - return "World writable file"; - - case E_SM_GWFILE: - return "Group writable file"; - } - -#if HASSTRERROR - return strerror(err); -#else - if (err < 0 || err >= sys_nerr) - { - sprintf(errstr, "Error %d", err); - return errstr; - } - return sys_errlist[err]; -#endif -} diff --git a/praliases/Build b/praliases/Build deleted file mode 120000 index 6308dba..0000000 --- a/praliases/Build +++ /dev/null @@ -1 +0,0 @@ -../BuildTools/bin/Build
\ No newline at end of file diff --git a/praliases/Makefile.m4 b/praliases/Makefile.m4 deleted file mode 100644 index 7e78412..0000000 --- a/praliases/Makefile.m4 +++ /dev/null @@ -1,104 +0,0 @@ -# -# This Makefile is designed to work on the old "make" program. -# -# @(#)Makefile.m4 8.16 (Berkeley) 7/12/1998 -# - -# C compiler -CC= confCC - -# Shell -SHELL= confSHELL - -# use O=-O (usual) or O=-g (debugging) -O= ifdef(`confOPTIMIZE', `confOPTIMIZE', `-O') - -# location of sendmail source directory -SRCDIR= ifdef(`confSRCDIR', `confSRCDIR', `../../src') - -# define the database mechanisms available for map & alias lookups: -# -DNDBM -- use new DBM -# -DNEWDB -- use new Berkeley DB -# The really old (V7) DBM library is no longer supported. -# -MAPDEF= ifdef(`confMAPDEF', `confMAPDEF') - -# environment definitions (e.g., -D_AIX3) -ENVDEF= ifdef(`confENVDEF', `confENVDEF') - -# see also conf.h for additional compilation flags - -# include directories -INCDIRS=-I${SRCDIR} confINCDIRS - -# loader options -LDOPTS= ifdef(`confLDOPTS', `confLDOPTS') - -# library directories -LIBDIRS=confLIBDIRS - -# libraries required on your system -LIBS= ifdef(`confLIBS', `confLIBS') - -# location of praliases binary (usually /usr/sbin or /usr/etc) -SBINDIR=${DESTDIR}ifdef(`confSBINDIR', `confSBINDIR', `/usr/sbin') - -# additional .o files needed -OBJADD= ifdef(`confOBJADD', `confOBJADD') - -undivert(1) - -################### end of user configuration flags ###################### - -BUILDBIN=confBUILDBIN -COPTS= -I. ${INCDIRS} ${MAPDEF} ${ENVDEF} -CFLAGS= $O ${COPTS} - -BEFORE= confBEFORE -OBJS= praliases.o ${OBJADD} - -NROFF= ifdef(`confNROFF', `confNROFF', `groff -Tascii') -MANDOC= ifdef(`confMANDOC', `confMANDOC', `-mandoc') - -INSTALL=ifdef(`confINSTALL', `confINSTALL', `install') -BINOWN= ifdef(`confUBINOWN', `confUBINOWN', `bin') -BINGRP= ifdef(`confUBINGRP', `confUBINGRP', `bin') -BINMODE=ifdef(`confUBINMODE', `confUBINMODE', `555') - -MANOWN= ifdef(`confMANOWN', `confMANOWN', `bin') -MANGRP= ifdef(`confMANGRP', `confMANGRP', `bin') -MANMODE=ifdef(`confMANMODE', `confMANMODE', `444') - -MANROOT=${DESTDIR}ifdef(`confMANROOT', `confMANROOT', `/usr/share/man/cat') -MAN8= ${MANROOT}ifdef(`confMAN8', `confMAN8', `8') -MAN8EXT=ifdef(`confMAN8EXT', `confMAN8EXT', `8') -MAN8SRC=ifdef(`confMAN8SRC', `confMAN8SRC', `0') - -ALL= praliases praliases.${MAN8SRC} - -all: ${ALL} - -praliases: ${BEFORE} ${OBJS} - ${CC} -o praliases ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} - -undivert(3) - -praliases.${MAN8SRC}: praliases.8 - ${NROFF} ${MANDOC} praliases.8 > praliases.${MAN8SRC} - -install: install-praliases install-docs - -install-praliases: praliases - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} praliases ${SBINDIR} - -install-docs: praliases.${MAN8SRC} -ifdef(`confNO_MAN_INSTALL', `dnl', -` ${INSTALL} -c -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} praliases.${MAN8SRC} ${MAN8}/praliases.${MAN8EXT}') - -clean: - rm -f ${OBJS} praliases praliases.${MAN8SRC} - -################ Dependency scripts -include(confBUILDTOOLSDIR/M4/depend/ifdef(`confDEPEND_TYPE', `confDEPEND_TYPE', -`generic').m4)dnl -################ End of dependency scripts diff --git a/praliases/praliases.0 b/praliases/praliases.0 deleted file mode 100644 index 6b53e1d..0000000 --- a/praliases/praliases.0 +++ /dev/null @@ -1,27 +0,0 @@ -PRALIASES(1) BSD Reference Manual PRALIASES(1) - -NNAAMMEE - pprraalliiaasseess - display system mail aliases - -SSYYNNOOPPSSIISS - pprraalliiaasseess [--ff _f_i_l_e] - -DDEESSCCRRIIPPTTIIOONN - The pprraalliiaasseess utility displays the current system aliases, one per line, - in no particular order. - - The options are as follows: - - --ff Read the specified file instead of the default sseennddmmaaiill system - aliases file. - - The pprraalliiaasseess utility exits 0 on success, and >0 if an error occurs. - -FFIILLEESS - /etc/aliases The default sseennddmmaaiill system aliases file. - /etc/aliases.db The database version of the _/_e_t_c_/_a_l_i_a_s_e_s file. - -SSEEEE AALLSSOO - mailq(1), sendmail(8) - -3rd Berkeley Distribution April 25, 1996 1 diff --git a/praliases/praliases.8 b/praliases/praliases.8 deleted file mode 100644 index 0833701..0000000 --- a/praliases/praliases.8 +++ /dev/null @@ -1,49 +0,0 @@ -.\" Copyright (c) 1998 Sendmail, Inc. All rights reserved. -.\" -.\" By using this file, you agree to the terms and conditions set -.\" forth in the LICENSE file which can be found at the top level of -.\" the sendmail distribution. -.\" -.\" -.\" @(#)praliases.8 8.5 (Berkeley) 5/19/1998 -.\" -.Dd April 25, 1996 -.Dt PRALIASES 1 -.Os BSD 3 -.Sh NAME -.Nm praliases -.Nd display system mail aliases -.Sh SYNOPSIS -.Nm praliases -.Op Fl f Ar file -.Sh DESCRIPTION -The -.Nm praliases -utility displays the current system aliases, -one per line, in no particular order. -.Pp -The options are as follows: -.Bl -tag -width Ds -.It Fl f -Read the specified file instead of the default -.Nm sendmail -system aliases file. -.El -.Pp -The -.Nm praliases -utility exits 0 on success, and >0 if an error occurs. -.Sh FILES -.Bl -tag -width /var/log/sendmail.stXX -compact -.It Pa /etc/aliases -The default -.Nm sendmail -system aliases file. -.It Pa /etc/aliases.db -The database version of the -.Pa /etc/aliases -file. -.El -.Sh SEE ALSO -.Xr mailq 1 , -.Xr sendmail 8 diff --git a/praliases/praliases.c b/praliases/praliases.c deleted file mode 100644 index 3935191..0000000 --- a/praliases/praliases.c +++ /dev/null @@ -1,370 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char copyright[] = -"@(#) Copyright (c) 1988, 1993\n\ - The Regents of the University of California. All rights reserved.\n"; -#endif /* not lint */ - -#ifndef lint -static char sccsid[] = "@(#)praliases.c 8.21 (Berkeley) 12/27/1998"; -#endif /* not lint */ - -#if !defined(NDBM) && !defined(NEWDB) - ERROR README: You must define one of NDBM or NEWDB in order to compile - ERROR README: praliases. -#endif - -#ifdef NDBM -# include <ndbm.h> -#endif -#ifndef NOT_SENDMAIL -# define NOT_SENDMAIL -#endif -#include <sendmail.h> -#include <pathnames.h> -#ifdef NEWDB -# include <db.h> -# ifndef DB_VERSION_MAJOR -# define DB_VERSION_MAJOR 1 -# endif -#endif - -#if defined(IRIX64) || defined(IRIX5) || defined(IRIX6) || \ - defined(BSD4_4) || defined(__osf__) || defined(__GNU_LIBRARY__) -# ifndef HASSTRERROR -# define HASSTRERROR 1 /* has strerror(3) */ -# endif -#endif - -#if !HASSTRERROR -extern char *strerror __P((int)); -#endif - -static void praliases __P((char *, int, char **)); -#ifdef NDBM -static void praliases_dbm __P((char *, int, char **)); -#endif - -int -main(argc, argv) - int argc; - char **argv; -{ - extern char *optarg; - extern int optind; - char *cfile; -#if _FFR_GRAB_ALIASFILE_OPTION - char *filename = NULL; -#else - char *filename = "/etc/aliases"; -#endif - FILE *cfp; - int ch; - char afilebuf[MAXLINE]; - char buf[MAXLINE]; - - cfile = _PATH_SENDMAILCF; -#if _FFR_GRAB_ALIASFILE_OPTION - while ((ch = getopt(argc, argv, "C:f:")) != EOF) -#else - while ((ch = getopt(argc, argv, "f:")) != EOF) -#endif - { - switch ((char)ch) { - case 'C': - cfile = optarg; - break; - case 'f': - filename = optarg; - break; - case '?': - default: - (void)fprintf(stderr, -#if _FFR_GRAB_ALIASFILE_OPTION - "usage: praliases [-C cffile] [-f aliasfile]\n"); -#else - "usage: praliases [-f aliasfile]\n"); -#endif - exit(EX_USAGE); - } - } - argc -= optind; - argv += optind; - - if (filename != NULL) - { - praliases(filename, argc, argv); - exit(EX_OK); - } - - if ((cfp = fopen(cfile, "r")) == NULL) - { - fprintf(stderr, "praliases: "); - perror(cfile); - exit(EX_NOINPUT); - } - - while (fgets(buf, sizeof(buf), cfp) != NULL) - { - register char *b, *p; - - b = buf; - switch (*b++) - { - case 'O': /* option -- see if alias file */ - if (strncasecmp(b, " AliasFile", 10) == 0 && - !(isascii(b[10]) && isalnum(b[10]))) - { - /* new form -- find value */ - b = strchr(b, '='); - if (b == NULL) - continue; - while (isascii(*++b) && isspace(*b)) - continue; - } - else if (*b++ != 'A') - { - /* something else boring */ - continue; - } - - /* this is the A or AliasFile option -- save it */ - if (strlen(b) >= sizeof afilebuf) - { - fprintf(stderr, - "AliasFile filename too long: %.30s...\n", - b); - (void) fclose(cfp); - exit(EX_CONFIG); - } - strcpy(afilebuf, b); - b = afilebuf; - - for (p = b; p != NULL; ) - { - while (isascii(*p) && isspace(*p)) - p++; - if (*p == '\0') - break; - b = p; - - p = strpbrk(p, " ,/"); - /* find end of spec */ - if (p != NULL) - p = strpbrk(p, ",\n"); - if (p != NULL) - *p++ = '\0'; - - praliases(b, argc, argv); - } - - default: - continue; - } - } - (void) fclose(cfp); - exit(EX_OK); -} - -static void -praliases(filename, argc, argv) - char *filename; - int argc; - char **argv; -{ -#ifdef NEWDB - DB *db; - DBT newdbkey, newdbcontent; - char buf[MAXNAME]; -#endif - char *class; - - class = strchr(filename, ':'); - if (class != NULL) - { - if (strncasecmp(filename, "dbm:", 4) == 0) - { -#ifdef NDBM - praliases_dbm(class + 1, argc, argv); - return; -#else - fprintf(stderr, "class dbm not available\n"); - exit(EX_DATAERR); -#endif - } - filename = class + 1; - } -#ifdef NEWDB - if (strlen(filename) + 4 >= sizeof buf) - { - fprintf(stderr, "Alias filename too long: %.30s...\n", filename); - exit(EX_USAGE); - } - (void) strcpy(buf, filename); - (void) strcat(buf, ".db"); -# if DB_VERSION_MAJOR < 2 - db = dbopen(buf, O_RDONLY, 0444, DB_HASH, NULL); -# else - db = NULL; - errno = db_open(buf, DB_HASH, DB_RDONLY, 0444, NULL, NULL, &db); -# endif - if (db != NULL) - { - if (!argc) - { -# if DB_VERSION_MAJOR > 1 - DBC *dbc; -# endif - bzero(&newdbkey, sizeof newdbkey); - bzero(&newdbcontent, sizeof newdbcontent); - -# if DB_VERSION_MAJOR < 2 - while(!db->seq(db, &newdbkey, &newdbcontent, R_NEXT)) -# else -# if DB_VERSION_MAJOR > 2 || DB_VERSION_MINOR >=6 - if ((errno = db->cursor(db, NULL, &dbc, 0)) == 0) -# else - if ((errno = db->cursor(db, NULL, &dbc)) == 0) -# endif - { - while ((errno = dbc->c_get(dbc, &newdbkey, - &newdbcontent, - DB_NEXT)) == 0) -# endif - printf("%.*s:%.*s\n", - (int) newdbkey.size, - (char *) newdbkey.data, - (int) newdbcontent.size, - (char *) newdbcontent.data); -# if DB_VERSION_MAJOR > 1 - (void) dbc->c_close(dbc); - } - else - { - fprintf(stderr, - "praliases: %s: Could not set cursor: %s\n", - buf, strerror(errno)); - errno = db->close(db, 0); - exit(EX_DATAERR); - } -# endif - } - else for (; *argv; ++argv) - { - bzero(&newdbkey, sizeof newdbkey); - bzero(&newdbcontent, sizeof newdbcontent); - newdbkey.data = *argv; - newdbkey.size = strlen(*argv) + 1; -# if DB_VERSION_MAJOR < 2 - if (!db->get(db, &newdbkey, &newdbcontent, 0)) -# else - if ((errno = db->get(db, NULL, &newdbkey, - &newdbcontent, 0)) == 0) -# endif - printf("%s:%.*s\n", (char *) newdbkey.data, - (int) newdbcontent.size, - (char *) newdbcontent.data); - else - printf("%s: No such key\n", - (char *) newdbkey.data); - } -# if DB_VERSION_MAJOR < 2 - (void)db->close(db); -# else - errno = db->close(db, 0); -# endif - } - else - { -#endif -#ifdef NDBM - praliases_dbm(filename, argc, argv); -#endif -#ifdef NEWDB - } -#endif -} - -#ifdef NDBM -static void -praliases_dbm(filename, argc, argv) - char *filename; - int argc; - char **argv; -{ - DBM *dbp; - datum content, key; - - if ((dbp = dbm_open(filename, O_RDONLY, 0)) == NULL) - { - (void)fprintf(stderr, - "praliases: %s: %s\n", filename, strerror(errno)); - exit(EX_OSFILE); - } - if (!argc) - { - for (key = dbm_firstkey(dbp); - key.dptr != NULL; key = dbm_nextkey(dbp)) - { - content = dbm_fetch(dbp, key); - (void)printf("%.*s:%.*s\n", - (int) key.dsize, key.dptr, - (int) content.dsize, content.dptr); - } - } - else - { - for (; *argv; ++argv) - { - /* - ** Use the sendmail adaptive algorithm of trying - ** the key first without, then if needed with, - ** the terminating NULL byte. - */ - key.dptr = *argv; - key.dsize = strlen(*argv); - content = dbm_fetch(dbp, key); - if (content.dptr == NULL) - { - key.dsize++; - content = dbm_fetch(dbp, key); - } - if (content.dptr != NULL) - (void)printf("%s:%.*s\n", key.dptr, - (int) content.dsize, content.dptr); - else - (void)printf("%s: No such key\n", key.dptr); - } - } - dbm_close(dbp); -} -#endif - -#if !HASSTRERROR - -char * -strerror(eno) - int eno; -{ - extern int sys_nerr; - extern char *sys_errlist[]; - static char ebuf[60]; - - if (eno >= 0 && eno < sys_nerr) - return sys_errlist[eno]; - (void) sprintf(ebuf, "Error %d", eno); - return ebuf; -} - -#endif /* !HASSTRERROR */ diff --git a/rmail/Build b/rmail/Build deleted file mode 120000 index 6308dba..0000000 --- a/rmail/Build +++ /dev/null @@ -1 +0,0 @@ -../BuildTools/bin/Build
\ No newline at end of file diff --git a/rmail/Makefile.m4 b/rmail/Makefile.m4 deleted file mode 100644 index 9f2d87b..0000000 --- a/rmail/Makefile.m4 +++ /dev/null @@ -1,105 +0,0 @@ -# -# This Makefile is designed to work on the old "make" program. -# -# @(#)Makefile.m4 8.17 (Berkeley) 7/12/1998 -# - -# C compiler -CC= confCC - -# Shell -SHELL= confSHELL - -# use O=-O (usual) or O=-g (debugging) -O= ifdef(`confOPTIMIZE', `confOPTIMIZE', `-O') - -# location of sendmail source directory -SRCDIR= ifdef(`confSRCDIR', `confSRCDIR', `../../src') - -# environment definitions (e.g., -D_AIX3) -ENVDEF= ifdef(`confENVDEF', `confENVDEF') - -# see also conf.h for additional compilation flags - -# include directories -INCDIRS=-I${SRCDIR} confINCDIRS - -# loader options -LDOPTS= ifdef(`confLDOPTS', `confLDOPTS') - -# library directories -LIBDIRS=confLIBDIRS - -# libraries required on your system -LIBS= ifdef(`confLIBS', `confLIBS') - -# location of rmail binary (usually /usr/sbin or /usr/etc) -UBINDIR=${DESTDIR}ifdef(`confUBINDIR', `confUBINDIR', `/usr/bin') - -# additional .o files needed -OBJADD= ifdef(`confOBJADD', `confOBJADD') - -undivert(1) - -################### end of user configuration flags ###################### - -BUILDBIN=confBUILDBIN -COPTS= -I. ${INCDIRS} ${ENVDEF} -CFLAGS= $O ${COPTS} - -BEFORE= snprintf.c confBEFORE -OBJS= rmail.o snprintf.o ${OBJADD} - -NROFF= ifdef(`confNROFF', `confNROFF', `groff -Tascii') -MANDOC= ifdef(`confMANDOC', `confMANDOC', `-mandoc') - -INSTALL=ifdef(`confINSTALL', `confINSTALL', `install') -BINOWN= ifdef(`confUBINOWN', `confUBINOWN', `bin') -BINGRP= ifdef(`confUBINGRP', `confUBINGRP', `bin') -BINMODE=ifdef(`confUBINMODE', `confUBINMODE', `555') - -MANOWN= ifdef(`confMANOWN', `confMANOWN', `bin') -MANGRP= ifdef(`confMANGRP', `confMANGRP', `bin') -MANMODE=ifdef(`confMANMODE', `confMANMODE', `444') - -MANROOT=${DESTDIR}ifdef(`confMANROOT', `confMANROOT', `/usr/share/man/cat') -MAN8= ${MANROOT}ifdef(`confMAN8', `confMAN8', `8') -MAN8EXT=ifdef(`confMAN8EXT', `confMAN8EXT', `8') -MAN8SRC=ifdef(`confMAN8SRC', `confMAN8SRC', `0') - -ALL= rmail rmail.${MAN8SRC} - -all: ${ALL} - -rmail: ${BEFORE} ${OBJS} - ${CC} -o rmail ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} - -snprintf.c: ${SRCDIR}/snprintf.c - -ln -s ${SRCDIR}/snprintf.c snprintf.c - -undivert(3) - -rmail.${MAN8SRC}: rmail.8 - ${NROFF} ${MANDOC} rmail.8 > rmail.${MAN8SRC} - -install: - @echo "NOTE: This version of rmail is not suited for some operating" - @echo " systems. You can force the install using" - @echo " '${MAKE} force-install'." - -force-install: install-rmail install-docs - -install-rmail: rmail - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} rmail ${UBINDIR} - -install-docs: rmail.${MAN8SRC} -ifdef(`confNO_MAN_INSTALL', `dnl', -` ${INSTALL} -c -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} rmail.${MAN8SRC} ${MAN8}/rmail.${MAN8EXT}') - -clean: - rm -f ${OBJS} rmail rmail.${MAN8SRC} - -################ Dependency scripts -include(confBUILDTOOLSDIR/M4/depend/ifdef(`confDEPEND_TYPE', `confDEPEND_TYPE', -`generic').m4)dnl -################ End of dependency scripts diff --git a/rmail/rmail.0 b/rmail/rmail.0 deleted file mode 100644 index e8eb25e..0000000 --- a/rmail/rmail.0 +++ /dev/null @@ -1,26 +0,0 @@ -RMAIL(8) BSD System Manager's Manual RMAIL(8) - -NNAAMMEE - rrmmaaiill - handle remote mail received via uucp - -SSYYNNOOPPSSIISS - rrmmaaiill _u_s_e_r _._._. - -DDEESSCCRRIIPPTTIIOONN - RRmmaaiill interprets incoming mail received via uucp(1), collapsing ``From'' - lines in the form generated by mail.local(8) into a single line of the - form ``return-path!sender'', and passing the processed mail on to - sendmail(8). - - RRmmaaiill is explicitly designed for use with uucp and sendmail. - -SSEEEE AALLSSOO - uucp(1), mail.local(8), sendmail(8) - -HHIISSTTOORRYY - The rrmmaaiill program appeared in 4.2BSD. - -BBUUGGSS - RRmmaaiill should not reside in _/_b_i_n. - -4.2 Berkeley Distribution May 19, 1998 1 diff --git a/rmail/rmail.8 b/rmail/rmail.8 deleted file mode 100644 index 9f6ee26..0000000 --- a/rmail/rmail.8 +++ /dev/null @@ -1,49 +0,0 @@ -.\" Copyright (c) 1998 Sendmail, Inc. All rights reserved. -.\" Copyright (c) 1983, 1990 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" By using this file, you agree to the terms and conditions set -.\" forth in the LICENSE file which can be found at the top level of -.\" the sendmail distribution. -.\" -.\" -.\" @(#)rmail.8 6.14 (Berkeley) 5/19/1998 -.\" -.Dd May 19, 1998 -.Dt RMAIL 8 -.Os BSD 4.2 -.Sh NAME -.Nm rmail -.Nd handle remote mail received via uucp -.Sh SYNOPSIS -.Nm rmail -.Ar user ... -.Sh DESCRIPTION -.Nm Rmail -interprets incoming mail received via -.Xr uucp 1 , -collapsing ``From'' lines in the form generated -by -.Xr mail.local 8 -into a single line of the form ``return-path!sender'', -and passing the processed mail on to -.Xr sendmail 8 . -.Pp -.Nm Rmail -is explicitly designed for use with -.Xr uucp -and -.Xr sendmail . -.Sh SEE ALSO -.Xr uucp 1 , -.Xr mail.local 8 , -.Xr sendmail 8 -.Sh HISTORY -The -.Nm rmail -program appeared in -.Bx 4.2 . -.Sh BUGS -.Nm Rmail -should not reside in -.Pa /bin . diff --git a/rmail/rmail.c b/rmail/rmail.c deleted file mode 100644 index f3f5cf6..0000000 --- a/rmail/rmail.c +++ /dev/null @@ -1,430 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char copyright[] = -"@(#) Copyright (c) 1988, 1993\n\ - The Regents of the University of California. All rights reserved.\n"; -#endif /* not lint */ - -#ifndef lint -static char sccsid[] = "@(#)rmail.c 8.18 (Berkeley) 10/23/1998"; -#endif /* not lint */ - -/* - * RMAIL -- UUCP mail server. - * - * This program reads the >From ... remote from ... lines that UUCP is so - * fond of and turns them into something reasonable. It then execs sendmail - * with various options built from these lines. - * - * The expected syntax is: - * - * <user> := [-a-z0-9]+ - * <date> := ctime format - * <site> := [-a-z0-9!]+ - * <blank line> := "^\n$" - * <from> := "From" <space> <user> <space> <date> - * [<space> "remote from" <space> <site>] - * <forward> := ">" <from> - * msg := <from> <forward>* <blank-line> <body> - * - * The output of rmail(8) compresses the <forward> lines into a single - * from path. - * - * The err(3) routine is included here deliberately to make this code - * a bit more portable. - */ -#include <sys/param.h> -#include <sys/stat.h> -#include <sys/wait.h> - -#include <ctype.h> -#include <fcntl.h> -#ifdef BSD4_4 -# define FORK vfork -# include <paths.h> -#else -# define FORK fork -# ifndef _PATH_SENDMAIL -# define _PATH_SENDMAIL "/usr/lib/sendmail" -# endif -#endif -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#ifdef EX_OK -# undef EX_OK /* unistd.h may have another use for this */ -#endif -#include <sysexits.h> - -#ifndef MAX -# define MAX(a, b) ((a) < (b) ? (b) : (a)) -#endif - -#ifndef __P -# ifdef __STDC__ -# define __P(protos) protos -# else -# define __P(protos) () -# define const -# endif -#endif - -#if defined(BSD4_4) || defined(linux) || SOLARIS >= 20600 || (SOLARIS < 10000 && SOLARIS >= 206) -# define HASSNPRINTF 1 -#endif - -#if defined(IRIX64) || defined(IRIX5) || defined(IRIX6) || \ - defined(BSD4_4) || defined(__osf__) || defined(__GNU_LIBRARY__) -# ifndef HASSTRERROR -# define HASSTRERROR 1 /* has strerror(3) */ -# endif -#endif - -#if !HASSTRERROR -extern char *strerror __P((int)); -#endif - -#if defined(sun) && !defined(BSD) && !defined(SOLARIS) && !defined(__svr4__) && !defined(__SVR4) -# define memmove(d, s, l) (bcopy((s), (d), (l))) -#endif - -#if !HASSNPRINTF -extern int snprintf __P((char *, size_t, const char *, ...)); -#endif /* !HASSNPRINTF */ - -u_char tTdvect[100]; - -void err __P((int, const char *, ...)); -void usage __P((void)); -char *xalloc __P((int)); - -#define newstr(s) strcpy(xalloc(strlen(s) + 1), s) - -char * -xalloc(sz) - register int sz; -{ - register char *p; - - /* some systems can't handle size zero mallocs */ - if (sz <= 0) - sz = 1; - - p = malloc((unsigned) sz); - if (p == NULL) - err(EX_TEMPFAIL, "out of memory"); - return (p); -} - -int -main(argc, argv) - int argc; - char *argv[]; -{ - extern char *optarg; - extern int errno, optind; - FILE *fp; - struct stat sb; - size_t fplen = 0, fptlen = 0, len; - off_t offset; - int ch, debug, i, pdes[2], pid, status; - char *addrp = NULL, *domain, *p, *t; - char *from_path, *from_sys, *from_user; - char *args[100], buf[2048], lbuf[2048]; - - debug = 0; - domain = "UUCP"; /* Default "domain". */ - while ((ch = getopt(argc, argv, "D:T")) != EOF) - switch (ch) { - case 'T': - debug = 1; - break; - case 'D': - domain = optarg; - break; - case '?': - default: - usage(); - } - argc -= optind; - argv += optind; - - if (argc < 1) - usage(); - - from_path = from_sys = from_user = NULL; - for (offset = 0;;) { - - /* Get and nul-terminate the line. */ - if (fgets(lbuf, sizeof(lbuf), stdin) == NULL) - exit (EX_DATAERR); - if ((p = strchr(lbuf, '\n')) == NULL) - err(EX_DATAERR, "line too long"); - *p = '\0'; - - /* Parse lines until reach a non-"From" line. */ - if (!strncmp(lbuf, "From ", 5)) - addrp = lbuf + 5; - else if (!strncmp(lbuf, ">From ", 6)) - addrp = lbuf + 6; - else if (offset == 0) - err(EX_DATAERR, - "missing or empty From line: %s", lbuf); - else { - *p = '\n'; - break; - } - - if (*addrp == '\0') - err(EX_DATAERR, "corrupted From line: %s", lbuf); - - /* Use the "remote from" if it exists. */ - for (p = addrp; (p = strchr(p + 1, 'r')) != NULL;) - if (!strncmp(p, "remote from ", 12)) { - for (t = p += 12; - *t && !(isascii(*t) && isspace(*t)); ++t); - *t = '\0'; - if (debug) - (void)fprintf(stderr, - "remote from: %s\n", p); - break; - } - - /* Else use the string up to the last bang. */ - if (p == NULL) { - if (*addrp == '!') - err(EX_DATAERR, - "bang starts address: %s", addrp); - else if ((t = strrchr(addrp, '!')) != NULL) { - *t = '\0'; - p = addrp; - addrp = t + 1; - if (*addrp == '\0') - err(EX_DATAERR, - "corrupted From line: %s", lbuf); - if (debug) - (void)fprintf(stderr, "bang: %s\n", p); - } - } - /* 'p' now points to any system string from this line. */ - if (p != NULL) { - /* Nul terminate it as necessary. */ - for (t = p; *t && !(isascii(*t) && isspace(*t)); ++t); - *t = '\0'; - - /* If the first system, copy to the from_sys string. */ - if (from_sys == NULL) { - from_sys = newstr(p); - if (debug) - (void)fprintf(stderr, - "from_sys: %s\n", from_sys); - } - - /* Concatenate to the path string. */ - len = t - p; - if (from_path == NULL) { - fplen = 0; - if ((from_path = malloc(fptlen = 256)) == NULL) - err(EX_TEMPFAIL, NULL); - } - if (fplen + len + 2 > fptlen) { - fptlen += MAX(fplen + len + 2, 256); - if ((from_path = - realloc(from_path, fptlen)) == NULL) - err(EX_TEMPFAIL, NULL); - } - memmove(from_path + fplen, p, len); - fplen += len; - from_path[fplen++] = '!'; - from_path[fplen] = '\0'; - } - - /* Save off from user's address; the last one wins. */ - for (p = addrp; *p && !(isascii(*p) && isspace(*p)); ++p); - *p = '\0'; - if (*addrp == '\0') - addrp = "<>"; - if (from_user != NULL) - free(from_user); - from_user = newstr(addrp); - - if (debug) { - if (from_path != NULL) - (void)fprintf(stderr, - "from_path: %s\n", from_path); - (void)fprintf(stderr, "from_user: %s\n", from_user); - } - - if (offset != -1) - offset = (off_t)ftell(stdin); - } - - i = 0; - args[i++] = _PATH_SENDMAIL; /* Build sendmail's argument list. */ - args[i++] = "-oee"; /* No errors, just status. */ - args[i++] = "-odq"; /* Queue it, don't try to deliver. */ - args[i++] = "-oi"; /* Ignore '.' on a line by itself. */ - - /* set from system and protocol used */ - if (from_sys == NULL) - (void)snprintf(buf, sizeof(buf), "-p%s", domain); - else if (strchr(from_sys, '.') == NULL) - (void)snprintf(buf, sizeof(buf), "-p%s:%s.%s", - domain, from_sys, domain); - else - (void)snprintf(buf, sizeof(buf), "-p%s:%s", domain, from_sys); - args[i++] = newstr(buf); - - /* Set name of ``from'' person. */ - (void)snprintf(buf, sizeof(buf), "-f%s%s", - from_path ? from_path : "", from_user); - args[i++] = newstr(buf); - - /* - * Don't copy arguments beginning with - as they will be - * passed to sendmail and could be interpreted as flags. - * To prevent confusion of sendmail wrap < and > around - * the address (helps to pass addrs like @gw1,@gw2:aa@bb) - */ - while (*argv) { - if (**argv == '-') - err(EX_USAGE, "dash precedes argument: %s", *argv); - if (strchr(*argv, ',') == NULL || strchr(*argv, '<') != NULL) - args[i++] = *argv; - else { - if ((args[i] = malloc(strlen(*argv) + 3)) == NULL) - err(EX_TEMPFAIL, "Cannot malloc"); - sprintf (args [i++], "<%s>", *argv); - } - argv++; - } - args[i] = 0; - - if (debug) { - (void)fprintf(stderr, "Sendmail arguments:\n"); - for (i = 0; args[i]; i++) - (void)fprintf(stderr, "\t%s\n", args[i]); - } - - /* - * If called with a regular file as standard input, seek to the right - * position in the file and just exec sendmail. Could probably skip - * skip the stat, but it's not unreasonable to believe that a failed - * seek will cause future reads to fail. - */ - if (!fstat(STDIN_FILENO, &sb) && S_ISREG(sb.st_mode)) { - if (lseek(STDIN_FILENO, offset, SEEK_SET) != offset) - err(EX_TEMPFAIL, "stdin seek"); - execv(_PATH_SENDMAIL, args); - err(EX_OSERR, "%s", _PATH_SENDMAIL); - } - - if (pipe(pdes) < 0) - err(EX_OSERR, NULL); - - switch (pid = FORK()) { - case -1: /* Err. */ - err(EX_OSERR, NULL); - case 0: /* Child. */ - if (pdes[0] != STDIN_FILENO) { - (void)dup2(pdes[0], STDIN_FILENO); - (void)close(pdes[0]); - } - (void)close(pdes[1]); - execv(_PATH_SENDMAIL, args); - _exit(127); - /* NOTREACHED */ - } - - if ((fp = fdopen(pdes[1], "w")) == NULL) - err(EX_OSERR, NULL); - (void)close(pdes[0]); - - /* Copy the file down the pipe. */ - do { - (void)fprintf(fp, "%s", lbuf); - } while (fgets(lbuf, sizeof(lbuf), stdin) != NULL); - - if (ferror(stdin)) - err(EX_TEMPFAIL, "stdin: %s", strerror(errno)); - - if (fclose(fp)) - err(EX_OSERR, NULL); - - if ((waitpid(pid, &status, 0)) == -1) - err(EX_OSERR, "%s", _PATH_SENDMAIL); - - if (!WIFEXITED(status)) - err(EX_OSERR, - "%s: did not terminate normally", _PATH_SENDMAIL); - - if (WEXITSTATUS(status)) - err(status, "%s: terminated with %d (non-zero) status", - _PATH_SENDMAIL, WEXITSTATUS(status)); - exit(EX_OK); -} - -void -usage() -{ - (void)fprintf(stderr, "usage: rmail [-T] [-D domain] user ...\n"); - exit(EX_USAGE); -} - -#ifdef __STDC__ -#include <stdarg.h> -#else -#include <varargs.h> -#endif - -void -#ifdef __STDC__ -err(int eval, const char *fmt, ...) -#else -err(eval, fmt, va_alist) - int eval; - const char *fmt; - va_dcl -#endif -{ - va_list ap; -#if __STDC__ - va_start(ap, fmt); -#else - va_start(ap); -#endif - (void)fprintf(stderr, "rmail: "); - (void)vfprintf(stderr, fmt, ap); - va_end(ap); - (void)fprintf(stderr, "\n"); - exit(eval); -} - -#if !HASSTRERROR - -char * -strerror(eno) - int eno; -{ - extern int sys_nerr; - extern char *sys_errlist[]; - static char ebuf[60]; - - if (eno >= 0 && eno < sys_nerr) - return sys_errlist[eno]; - (void) sprintf(ebuf, "Error %d", eno); - return ebuf; -} - -#endif /* !HASSTRERROR */ diff --git a/sendmail.8.12.3.tar.gz b/sendmail.8.12.3.tar.gz Binary files differnew file mode 100644 index 0000000..94631bd --- /dev/null +++ b/sendmail.8.12.3.tar.gz diff --git a/sendmail.8.12.3.tar.sig b/sendmail.8.12.3.tar.sig Binary files differnew file mode 100644 index 0000000..c600428 --- /dev/null +++ b/sendmail.8.12.3.tar.sig diff --git a/smrsh/Build b/smrsh/Build deleted file mode 120000 index 6308dba..0000000 --- a/smrsh/Build +++ /dev/null @@ -1 +0,0 @@ -../BuildTools/bin/Build
\ No newline at end of file diff --git a/smrsh/Makefile.m4 b/smrsh/Makefile.m4 deleted file mode 100644 index 5cae3f0..0000000 --- a/smrsh/Makefile.m4 +++ /dev/null @@ -1,96 +0,0 @@ -# -# This Makefile is designed to work on the old "make" program. -# -# @(#)Makefile.m4 8.14 (Berkeley) 7/12/1998 -# - -# C compiler -CC= confCC - -# Shell -SHELL= confSHELL - -# use O=-O (usual) or O=-g (debugging) -O= ifdef(`confOPTIMIZE', `confOPTIMIZE', `-O') - -# location of sendmail source directory -SRCDIR= ifdef(`confSRCDIR', `confSRCDIR', `../../src') - -# environment definitions (e.g., -D_AIX3) -ENVDEF= ifdef(`confENVDEF', `confENVDEF') - -# include directories -INCDIRS=-I${SRCDIR} confINCDIRS - -# loader options -LDOPTS= ifdef(`confLDOPTS', `confLDOPTS') - -# library directories -LIBDIRS=confLIBDIRS - -# libraries required on your system -LIBS= ifdef(`confLIBS', `confLIBS') - -# location of smrsh binary (usually /usr/libexec or /usr/etc) -EBINDIR=${DESTDIR}ifdef(`confEBINDIR', `confEBINDIR', `/usr/libexec') - -# additional .o files needed -OBJADD= ifdef(`confOBJADD', `confOBJADD') - -undivert(1) - -################### end of user configuration flags ###################### - -BUILDBIN=confBUILDBIN -COPTS= -I. ${INCDIRS} ${ENVDEF} -CFLAGS= $O ${COPTS} - -BEFORE= confBEFORE -OBJS= smrsh.o ${OBJADD} - -# Which *roff program has -mandoc support -NROFF= ifdef(`confNROFF', `confNROFF', `groff -Tascii') -MANDOC= ifdef(`confMANDOC', `confMANDOC', `-mandoc') - -INSTALL=ifdef(`confINSTALL', `confINSTALL', `install') -BINOWN= ifdef(`confUBINOWN', `confUBINOWN', `bin') -BINGRP= ifdef(`confUBINGRP', `confUBINGRP', `bin') -BINMODE=ifdef(`confUBINMODE', `confUBINMODE', `555') - -MANOWN= ifdef(`confMANOWN', `confMANOWN', `bin') -MANGRP= ifdef(`confMANGRP', `confMANGRP', `bin') -MANMODE=ifdef(`confMANMODE', `confMANMODE', `444') - -MANROOT=${DESTDIR}ifdef(`confMANROOT', `confMANROOT', `/usr/share/man/cat') -MAN8= ${MANROOT}ifdef(`confMAN8', `confMAN8', `8') -MAN8EXT=ifdef(`confMAN8EXT', `confMAN8EXT', `8') -MAN8SRC=ifdef(`confMAN8SRC', `confMAN8SRC', `0') - -ALL= smrsh smrsh.${MAN8SRC} - -all: ${ALL} - -smrsh: ${BEFORE} ${OBJS} - ${CC} -o smrsh ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} - -undivert(3) - -smrsh.${MAN8SRC}: smrsh.8 - ${NROFF} ${MANDOC} smrsh.8 > smrsh.${MAN8SRC} - -install: install-smrsh install-docs - -install-smrsh: smrsh - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} smrsh ${EBINDIR} - -install-docs: smrsh.${MAN8SRC} -ifdef(`confNO_MAN_INSTALL', `dnl', -` ${INSTALL} -c -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} smrsh.${MAN8SRC} ${MAN8}/smrsh.${MAN8EXT}') - -clean: - rm -f ${OBJS} smrsh smrsh.${MAN8SRC} - -################ Dependency scripts -include(confBUILDTOOLSDIR/M4/depend/ifdef(`confDEPEND_TYPE', `confDEPEND_TYPE', -`generic').m4)dnl -################ End of dependency scripts diff --git a/smrsh/README b/smrsh/README deleted file mode 100644 index fa4e2de..0000000 --- a/smrsh/README +++ /dev/null @@ -1,144 +0,0 @@ - - - -README smrsh - sendmail restricted shell. - - @(#)README 8.2 11/11/1995 - - -This README file is provided as a courtesy of the CERT Coordination Center, -Software Engineering Institute, Carnegie Mellon University. This file is -intended as a supplement to the CERT advisory CA-93:16.sendmail.vulnerability, -and to the software, smrsh.c, written by Eric Allman. - - - -The smrsh(8) program is intended as a replacement for /bin/sh in the -program mailer definition of sendmail(8). This README file describes -the steps needed to compile and install smrsh. - -smrsh is a restricted shell utility that provides the ability to -specify, through a configuration, an explicit list of executable -programs. When used in conjunction with sendmail, smrsh effectively -limits sendmail's scope of program execution to only those programs -specified in smrsh's configuration. - -smrsh has been written with portability in mind, and uses traditional -Unix library utilities. As such, smrsh should compile on most -Unix C compilers. - - - -To compile smrsh.c, use the following command: - -host.domain% cc -o smrsh smrsh.c - -For machines that provide dynamic linking, it is advisable to compile -smrsh without dynamic linking. As an example with the Sun Microsystems -compiler, you should compile with the -Bstatic option. - -host.domain% cc -Bstatic -o smrsh smrsh.c - - -Choose a directory that smrsh will reside in. We will use the traditional -/usr/local/etc directory for the remainder of this document. - -As root, install smrsh in /usr/local/etc directory, with mode 511. - -host.domain# mv smrsh /usr/local/etc -host.domain# chmod 511 /usr/local/etc/smrsh - - - -Next, determine the list of commands that smrsh should allow sendmail -to run. This list of allowable commands can be determined by: - - 1. examining your /etc/aliases file, to indicate what commands - are being used by the system. - - 2. surveying your host's .forward files, to determine what - commands users have specified. - -See the man page for aliases(5) if you are unfamiliar with the format of -these specifications. Additionally, you should include in the list, -popular commands such as /usr/ucb/vacation. - -You should NOT include interpreter programs such as sh(1), csh(1), -perl(1), uudecode(1) or the stream editor sed(1) in your list of -acceptable commands. - - -You will next need to create the directory /usr/adm/sm.bin and populate -it with the programs that your site feels are allowable for sendmail -to execute. This directory is explicitly specified in the source -code for smrsh, so changing this directory must be accompanied with -a change in smrsh.c. - - -You will have to be root to make these modifications. - -After creating the /usr/adm/sm.bin directory, either copy the programs -to the directory, or establish links to the allowable programs from -/usr/adm/sm.bin. Change the file permissions, so that these programs -can not be modified by non-root users. If you use links, you should -ensure that the target programs are not modifiable. - -To allow the popular vacation(1) program by creating a link in the -/usr/adm/sm.bin directory, you should: - -host.domain# cd /usr/adm/sm.bin -host.domain# ln -s /usr/ucb/vacation vacation - - - - -After populating the /usr/adm/sm.bin directory, you can now configure -sendmail to use the restricted shell. Save the current sendmail.cf -file prior to modifying it, as a prudent precaution. - -Typically, the program mailer is defined by a single line in the -sendmail configuration file, sendmail.cf. This file is traditionally -found in the /etc, /usr/lib or /etc/mail directories, depending on -the UNIX vendor. - -If you are unsure of the location of the actual sendmail configuration -file, a search of the strings(1) output of the sendmail binary, will -help to locate it. - -In order to configure sendmail to use smrsh, you must modify the Mprog -definition in the sendmail.cf file, by replacing the /bin/sh specification -with /usr/local/etc/smrsh. - -As an example: - -In most Sun Microsystems' sendmail.cf files, the line is: -Mprog, P=/bin/sh, F=lsDFMeuP, S=10, R=20, A=sh -c $u - -which should be changed to: -Mprog, P=/usr/local/etc/smrsh, F=lsDFMeuP, S=10, R=20, A=sh -c $u - ^^^^^^^^^^^^^^^^^^^^ - -A more generic line may be: -Mprog, P=/bin/sh, F=lsDFM, A=sh -c $u - -and should be changed to; -Mprog, P=/usr/local/etc/smrsh, F=lsDFM, A=sh -c $u - - -After modifying the Mprog definition in the sendmail.cf file, if a frozen -configuration file is being used, it is essential to create a new one. -You can determine if you need a frozen configuration by discovering -if a sendmail.fc file currently exists in either the /etc/, /usr/lib, -or /etc/mail directories. The specific location can be determined using -a search of the strings(1) output of the sendmail binary. - -In order to create a new frozen configuration, if it is required: -host.domain# /usr/lib/sendmail -bz - -Now re-start the sendmail process. An example of how to do this on -a typical system follows: - -host.domain# /usr/bin/ps aux | /usr/bin/grep sendmail -root 130 0.0 0.0 168 0 ? IW Oct 2 0:10 /usr/lib/sendmail -bd -q -host.domain# /bin/kill -9 130 -host.domain# /usr/lib/sendmail -bd -q30m diff --git a/smrsh/smrsh.0 b/smrsh/smrsh.0 deleted file mode 100644 index 95a3dbf..0000000 --- a/smrsh/smrsh.0 +++ /dev/null @@ -1,66 +0,0 @@ - - - -SMRSH(8) SMRSH(8) - - -NNAAMMEE - smrsh - restricted shell for sendmail - -SSYYNNOOPPSSIISS - ssmmrrsshh --cc command - -DDEESSCCRRIIPPTTIIOONN - The _s_m_r_s_h program is intended as a replacement for _s_h for - use in the ``prog'' mailer in _s_e_n_d_m_a_i_l(8) configuration - files. It sharply limits the commands that can be run - using the ``|program'' syntax of _s_e_n_d_m_a_i_l in order to - improve the over all security of your system. Briefly, - even if a ``bad guy'' can get sendmail to run a program - without going through an alias or forward file, _s_m_r_s_h lim- - its the set of programs that he or she can execute. - - Briefly, _s_m_r_s_h limits programs to be in the directory - /usr/adm/sm.bin, allowing the system administrator to - choose the set of acceptable commands. It also rejects - any commands with the characters ``', `<', `>', `|', `;', - `&', `$', `(', `)', `\r' (carriage return), or `\n' (new- - line) on the command line to prevent ``end run'' attacks. - - Initial pathnames on programs are stripped, so forwarding - to ``/usr/ucb/vacation'', ``/usr/bin/vacation'', - ``/home/server/mydir/bin/vacation'', and ``vacation'' all - actually forward to ``/usr/adm/sm.bin/vacation''. - - System administrators should be conservative about popu- - lating /usr/adm/sm.bin. Reasonable additions are _v_a_c_a_- - _t_i_o_n(1), _p_r_o_c_m_a_i_l(1), and the like. No matter how brow- - beaten you may be, never include any shell or shell-like - program (such as _p_e_r_l(1)) in the sm.bin directory. Note - that this does not restrict the use of shell or perl - scripts in the sm.bin directory (using the ``#!'' syntax); - it simply disallows execution of arbitrary programs. - -CCOOMMPPIILLAATTIIOONN - Compilation should be trivial on most systems. You may - need to use -DPATH=\"_p_a_t_h\" to adjust the default search - path (defaults to ``/bin:/usr/bin:/usr/ucb'') and/or - -DCMDBIN=\"_d_i_r\" to change the default program directory - (defaults to ``/usr/adm/sm.bin''). - -FFIILLEESS - /usr/adm/sm.bin - directory for restricted programs - -SSEEEE AALLSSOO - sendmail(8) - - - - - - - - - 11/02/93 1 - - diff --git a/smrsh/smrsh.8 b/smrsh/smrsh.8 deleted file mode 100644 index af08fc4..0000000 --- a/smrsh/smrsh.8 +++ /dev/null @@ -1,83 +0,0 @@ -.\" Copyright (c) 1998 Sendmail, Inc. All rights reserved. -.\" Copyright (c) 1993 Eric P. Allman. All rights reserved. -.\" Copyright (c) 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" By using this file, you agree to the terms and conditions set -.\" forth in the LICENSE file which can be found at the top level of -.\" the sendmail distribution. -.\" -.\" -.\" @(#)smrsh.8 8.7 (Berkeley) 5/19/1998 -.\" -.TH SMRSH 8 11/02/93 -.SH NAME -smrsh \- restricted shell for sendmail -.SH SYNOPSIS -.B smrsh -.B \-c -command -.SH DESCRIPTION -The -.I smrsh -program is intended as a replacement for -.I sh -for use in the ``prog'' mailer in -.IR sendmail (8) -configuration files. -It sharply limits the commands that can be run using the -``|program'' syntax of -.I sendmail -in order to improve the over all security of your system. -Briefly, even if a ``bad guy'' can get sendmail to run a program -without going through an alias or forward file, -.I smrsh -limits the set of programs that he or she can execute. -.PP -Briefly, -.I smrsh -limits programs to be in the directory -/usr/adm/sm.bin, -allowing the system administrator to choose the set of acceptable commands. -It also rejects any commands with the characters -`\`', `<', `>', `|', `;', `&', `$', `(', `)', `\er' (carriage return), -or `\en' (newline) -on the command line to prevent ``end run'' attacks. -.PP -Initial pathnames on programs are stripped, -so forwarding to ``/usr/ucb/vacation'', -``/usr/bin/vacation'', -``/home/server/mydir/bin/vacation'', -and -``vacation'' -all actually forward to -``/usr/adm/sm.bin/vacation''. -.PP -System administrators should be conservative about populating -/usr/adm/sm.bin. -Reasonable additions are -.IR vacation (1), -.IR procmail (1), -and the like. -No matter how brow-beaten you may be, -never include any shell or shell-like program -(such as -.IR perl (1)) -in the -sm.bin -directory. -Note that this does not restrict the use of shell or perl scripts -in the sm.bin directory (using the ``#!'' syntax); -it simply disallows execution of arbitrary programs. -.SH COMPILATION -Compilation should be trivial on most systems. -You may need to use \-DPATH=\e"\fIpath\fP\e" -to adjust the default search path -(defaults to ``/bin:/usr/bin:/usr/ucb'') -and/or \-DCMDBIN=\e"\fIdir\fP\e" -to change the default program directory -(defaults to ``/usr/adm/sm.bin''). -.SH FILES -/usr/adm/sm.bin \- directory for restricted programs -.SH SEE ALSO -sendmail(8) diff --git a/smrsh/smrsh.c b/smrsh/smrsh.c deleted file mode 100644 index d4af285..0000000 --- a/smrsh/smrsh.c +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1993 Eric P. Allman. All rights reserved. - * Copyright (c) 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)smrsh.c 8.11 (Berkeley) 5/19/1998"; -#endif /* not lint */ - -/* -** SMRSH -- sendmail restricted shell -** -** This is a patch to get around the prog mailer bugs in most -** versions of sendmail. -** -** Use this in place of /bin/sh in the "prog" mailer definition -** in your sendmail.cf file. You then create CMDDIR (owned by -** root, mode 755) and put links to any programs you want -** available to prog mailers in that directory. This should -** include things like "vacation" and "procmail", but not "sed" -** or "sh". -** -** Leading pathnames are stripped from program names so that -** existing .forward files that reference things like -** "/usr/ucb/vacation" will continue to work. -** -** The following characters are completely illegal: -** < > | ^ ; & $ ` ( ) \n \r -** This is more restrictive than strictly necessary. -** -** To use this, edit /etc/sendmail.cf, search for ^Mprog, and -** change P=/bin/sh to P=/usr/local/etc/smrsh, where this compiled -** binary is installed /usr/local/etc/smrsh. -** -** This can be used on any version of sendmail. -** -** In loving memory of RTM. 11/02/93. -*/ - -#include <unistd.h> -#include <stdio.h> -#include <sys/file.h> -#include <string.h> -#include <ctype.h> -#ifdef EX_OK -# undef EX_OK -#endif -#include <sysexits.h> -#include <syslog.h> -#include <stdlib.h> - -/* directory in which all commands must reside */ -#ifndef CMDDIR -# define CMDDIR "/usr/adm/sm.bin" -#endif - -/* characters disallowed in the shell "-c" argument */ -#define SPECIALS "<|>^();&`$\r\n" - -/* default search path */ -#ifndef PATH -# define PATH "/bin:/usr/bin:/usr/ucb" -#endif - -int -main(argc, argv) - int argc; - char **argv; -{ - register char *p; - register char *q; - register char *cmd; - int i; - char *newenv[2]; - char cmdbuf[1000]; - char pathbuf[1000]; - -#ifndef LOG_MAIL - openlog("smrsh", 0); -#else - openlog("smrsh", LOG_ODELAY|LOG_CONS, LOG_MAIL); -#endif - - strcpy(pathbuf, "PATH="); - strcat(pathbuf, PATH); - newenv[0] = pathbuf; - newenv[1] = NULL; - - /* - ** Do basic argv usage checking - */ - - if (argc != 3 || strcmp(argv[1], "-c") != 0) - { - fprintf(stderr, "Usage: %s -c command\n", argv[0]); - syslog(LOG_ERR, "usage"); - exit(EX_USAGE); - } - - /* - ** Disallow special shell syntax. This is overly restrictive, - ** but it should shut down all attacks. - ** Be sure to include 8-bit versions, since many shells strip - ** the address to 7 bits before checking. - */ - - strcpy(cmdbuf, SPECIALS); - for (p = cmdbuf; *p != '\0'; p++) - *p |= '\200'; - strcat(cmdbuf, SPECIALS); - p = strpbrk(argv[2], cmdbuf); - if (p != NULL) - { - fprintf(stderr, "%s: cannot use %c in command\n", - argv[0], *p); - syslog(LOG_CRIT, "uid %d: attempt to use %c in command: %s", - getuid(), *p, argv[2]); - exit(EX_UNAVAILABLE); - } - - /* - ** Do a quick sanity check on command line length. - */ - - i = strlen(argv[2]); - if (i > (sizeof cmdbuf - sizeof CMDDIR - 2)) - { - fprintf(stderr, "%s: command too long: %s\n", argv[0], argv[2]); - syslog(LOG_WARNING, "command too long: %.40s", argv[2]); - exit(EX_UNAVAILABLE); - } - - /* - ** Strip off a leading pathname on the command name. For - ** example, change /usr/ucb/vacation to vacation. - */ - - /* strip leading spaces */ - for (q = argv[2]; *q != '\0' && isascii(*q) && isspace(*q); ) - q++; - - /* find the end of the command name */ - p = strpbrk(q, " \t"); - if (p == NULL) - cmd = &q[strlen(q)]; - else - { - *p = '\0'; - cmd = p; - } - - /* search backwards for last / (allow for 0200 bit) */ - while (cmd > q) - { - if ((*--cmd & 0177) == '/') - { - cmd++; - break; - } - } - - /* cmd now points at final component of path name */ - - /* - ** Check to see if the command name is legal. - */ - - (void) strcpy(cmdbuf, CMDDIR); - (void) strcat(cmdbuf, "/"); - (void) strcat(cmdbuf, cmd); -#ifdef DEBUG - printf("Trying %s\n", cmdbuf); -#endif - if (access(cmdbuf, X_OK) < 0) - { - /* oops.... crack attack possiblity */ - fprintf(stderr, "%s: %s not available for sendmail programs\n", - argv[0], cmd); - if (p != NULL) - *p = ' '; - syslog(LOG_CRIT, "uid %d: attempt to use %s", getuid(), cmd); - exit(EX_UNAVAILABLE); - } - if (p != NULL) - *p = ' '; - - /* - ** Create the actual shell input. - */ - - strcpy(cmdbuf, CMDDIR); - strcat(cmdbuf, "/"); - strcat(cmdbuf, cmd); - - /* - ** Now invoke the shell - */ - -#ifdef DEBUG - printf("%s\n", cmdbuf); -#endif - execle("/bin/sh", "/bin/sh", "-c", cmdbuf, NULL, newenv); - syslog(LOG_CRIT, "Cannot exec /bin/sh: %m"); - perror("/bin/sh"); - exit(EX_OSFILE); -} diff --git a/src/Build b/src/Build deleted file mode 120000 index 6308dba..0000000 --- a/src/Build +++ /dev/null @@ -1 +0,0 @@ -../BuildTools/bin/Build
\ No newline at end of file diff --git a/src/Makefile.m4 b/src/Makefile.m4 deleted file mode 100644 index d88d35b..0000000 --- a/src/Makefile.m4 +++ /dev/null @@ -1,152 +0,0 @@ -# -# This Makefile is designed to work on any reasonably current version of -# "make" program. -# -# @(#)Makefile.m4 8.26 (Berkeley) 1/23/1999 -# - -# C compiler -CC= confCC - -# Shell -SHELL= confSHELL - -# use O=-O (usual) or O=-g (debugging) -O= ifdef(`confOPTIMIZE', `confOPTIMIZE', `-O') - -# location of sendmail source directory -SRCDIR= . - -# define the database mechanisms available for map & alias lookups: -# -DNDBM -- use new DBM -# -DNEWDB -- use new Berkeley DB -# -DNIS -- include NIS support -# The really old (V7) DBM library is no longer supported. -# See README for a description of how these flags interact. -# -MAPDEF= ifdef(`confMAPDEF', `confMAPDEF') - -# environment definitions (e.g., -D_AIX3) -ENVDEF= ifdef(`confENVDEF', `confENVDEF') - -# see also conf.h for additional compilation flags - -# include directories -INCDIRS=confINCDIRS - -# loader options -LDOPTS= ifdef(`confLDOPTS', `confLDOPTS') - -# library directories -LIBDIRS=confLIBDIRS - -# libraries required on your system -# delete -l44bsd if you are not running BIND 4.9.x -LIBS= ifdef(`confLIBS', `confLIBS') - -# location of sendmail binary (usually /usr/sbin or /usr/lib) -BINDIR= ${DESTDIR}ifdef(`confMBINDIR', `confMBINDIR', `/usr/sbin') - -# location of "user" binaries (usually /usr/bin or /usr/ucb) -UBINDIR=${DESTDIR}ifdef(`confUBINDIR', `confUBINDIR', `/usr/bin') - -# location of sendmail.st file (usually /var/log or /usr/lib) -STDIR= ${DESTDIR}ifdef(`confSTDIR', `confSTDIR', `/var/log') - -# location of sendmail.hf file (usually /usr/share/misc or /usr/lib) -HFDIR= ${DESTDIR}ifdef(`confHFDIR', `confHFDIR', `/usr/share/misc') - -# additional .o files needed -OBJADD= ifdef(`confOBJADD', `confOBJADD') ifdef(`confSMOBJADD', `confSMOBJADD') - -undivert(1) - -################### end of user configuration flags ###################### - -BUILDBIN=confBUILDBIN -COPTS= -I. ${INCDIRS} ${MAPDEF} ${ENVDEF} -CFLAGS= $O ${COPTS} - -BEFORE= confBEFORE -OBJS= alias.o arpadate.o clock.o collect.o conf.o control.o convtime.o \ - daemon.o deliver.o domain.o envelope.o err.o headers.o macro.o \ - main.o map.o mci.o mime.o parseaddr.o queue.o readcf.o recipient.o \ - safefile.o savemail.o snprintf.o srvrsmtp.o stab.o stats.o \ - sysexits.o trace.o udb.o usersmtp.o util.o version.o ${OBJADD} - -LINKS= ifdef(`confLINKS', `confLINKS', - `${UBINDIR}/newaliases \ - ${UBINDIR}/mailq \ - ${UBINDIR}/hoststat \ - ${UBINDIR}/purgestat') - -NROFF= ifdef(`confNROFF', `confNROFF', `groff -Tascii') -MANDOC= ifdef(`confMANDOC', `confMANDOC', `-mandoc') - -INSTALL=ifdef(`confINSTALL', `confINSTALL', `install') -BINOWN= ifdef(`confSBINOWN', `confSBINOWN', `root') -BINGRP= ifdef(`confSBINGRP', `confSBINGRP', `kmem') -BINMODE=ifdef(`confSBINMODE', `confSBINMODE', `4555') - -MANOWN= ifdef(`confMANOWN', `confMANOWN', `bin') -MANGRP= ifdef(`confMANGRP', `confMANGRP', `bin') -MANMODE=ifdef(`confMANMODE', `confMANMODE', `444') - -MANROOT=${DESTDIR}ifdef(`confMANROOT', `confMANROOT', `/usr/share/man/cat') -MAN1= ${MANROOT}ifdef(`confMAN1', `confMAN1', `1') -MAN1EXT=ifdef(`confMAN1EXT', `confMAN1EXT', `1') -MAN1SRC=ifdef(`confMAN1SRC', `confMAN1SRC', `0') -MAN5= ${MANROOT}ifdef(`confMAN5', `confMAN5', `5') -MAN5EXT=ifdef(`confMAN5EXT', `confMAN5EXT', `5') -MAN5SRC=ifdef(`confMAN5SRC', `confMAN5SRC', `0') -MAN8= ${MANROOT}ifdef(`confMAN8', `confMAN8', `8') -MAN8EXT=ifdef(`confMAN8EXT', `confMAN8EXT', `8') -MAN8SRC=ifdef(`confMAN8SRC', `confMAN8SRC', `0') - -ALL= sendmail sendmail.st aliases.${MAN5SRC} mailq.${MAN1SRC} newaliases.${MAN1SRC} sendmail.${MAN8SRC} - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${LDOPTS} ${LIBDIRS} ${OBJS} ${LIBS} - -undivert(3) - -sendmail.st: - cp /dev/null sendmail.st - -aliases.${MAN5SRC}: aliases.5 - ${NROFF} ${MANDOC} aliases.5 > aliases.${MAN5SRC} - -mailq.${MAN1SRC}: mailq.1 - ${NROFF} ${MANDOC} mailq.1 > mailq.${MAN1SRC} - -newaliases.${MAN1SRC}: newaliases.1 - ${NROFF} ${MANDOC} newaliases.1 > newaliases.${MAN1SRC} - -sendmail.${MAN8SRC}: sendmail.8 - ${NROFF} ${MANDOC} sendmail.8 > sendmail.${MAN8SRC} - -install: install-sendmail install-docs - -install-sendmail: sendmail - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} - for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf \ - ${HFDIR}/sendmail.hf - ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 644 sendmail.st \ - ${STDIR}/sendmail.st - -install-docs: aliases.${MAN5SRC} mailq.${MAN1SRC} newaliases.${MAN1SRC} sendmail.${MAN8SRC} -ifdef(`confNO_MAN_INSTALL', `dnl', -` ${INSTALL} -c -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} sendmail.${MAN8SRC} ${MAN8}/sendmail.${MAN8EXT} - ${INSTALL} -c -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} aliases.${MAN5SRC} ${MAN5}/aliases.${MAN5EXT} - ${INSTALL} -c -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} mailq.${MAN1SRC} ${MAN1}/mailq.${MAN1EXT} - ${INSTALL} -c -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} newaliases.${MAN1SRC} ${MAN1}/newaliases.${MAN1EXT}') - -clean: - rm -f ${OBJS} sendmail aliases.${MAN5SRC} mailq.${MAN1SRC} newaliases.${MAN1SRC} sendmail.${MAN8SRC} - -################ Dependency scripts -include(confBUILDTOOLSDIR/M4/depend/ifdef(`confDEPEND_TYPE', `confDEPEND_TYPE', `generic').m4)dnl -################ End of dependency scripts diff --git a/src/README b/src/README deleted file mode 100644 index 7106e8c..0000000 --- a/src/README +++ /dev/null @@ -1,1464 +0,0 @@ -# Copyright (c) 1998 Sendmail, Inc. All rights reserved. -# Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. -# Copyright (c) 1988 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# -# @(#)README 8.211 (Berkeley) 2/2/1999 -# - -This directory contains the source files for sendmail(TM). - -********************* -!! DO NOT USE MAKE !! in this directory to compile sendmail -- -********************* instead, use the "Build" script located in -the src directory. It will build an appropriate Makefile, and -create an appropriate obj.* subdirectory so that multiplatform -support works easily. - - ********************************************************** - ** Read below for more details on building sendmail. ** - ********************************************************** - -************************************************************************** -** IMPORTANT: Read the appropriate paragraphs in the section on ** -** ``Operating System and Compile Quirks''. ** -************************************************************************** - -For detailed instructions, please read the document ../doc/op/op.me: - - eqn ../doc/op/op.me | pic | ditroff -me - -Sendmail is a trademark of Sendmail, Inc. - - -+-------------------+ -| BUILDING SENDMAIL | -+-------------------+ - -By far, the easiest way to compile sendmail is to use the "Build" -script: - - sh Build - -This uses the "uname" command to figure out what architecture you are -on and creates a proper Makefile accordingly. It also creates a -subdirectory per object format, so that multiarchitecture support is -easy. In general this should be all you need. IRIX 6.x users should -read the note below in the OPERATING SYSTEM AND COMPILE QUIRKS section. - -If you need to look at other include or library directories, use the --I or -L flags on the command line, e.g., - - sh Build -I/usr/sww/include -L/usr/sww/lib - -It's also possible to create local site configuration in the file -site.config.m4 (or another file settable with the -f flag). This -file contains M4 definitions for various compilation values; the -most useful are: - -confMAPDEF -D flags to specify database types to be included - (see below) -confENVDEF -D flags to specify other environment information -confINCDIRS -I flags for finding include files during compilation -confLIBDIRS -L flags for finding libraries during linking -confLIBS -l flags for selecting libraries during linking -confLDOPTS other ld(1) linker options - -Others can be found by examining Makefile.m4. Please read -../BuildTools/README for more information about the site.config.m4 -file. - -You can recompile from scratch using the -c flag with the Build -command. This removes the existing compilation directory for the -current platform and builds a new one. - -Porting to a new Unix-based system should be a matter of creating -an appropriate configuration file in the BuildTools/OS/ directory. - - - -+----------------------+ -| DATABASE DEFINITIONS | -+----------------------+ - -There are several database formats that can be used for the alias files -and for general maps. When used for alias files they interact in an -attempt to be backward compatible. - -The options are: - -NEWDB The new Berkeley DB package. Some systems (e.g., BSD/OS and - Digital UNIX 4.0) have some version of this package - pre-installed. If your system does not have Berkeley DB - pre-installed, or the version installed is not version 2.0 - or greater (e.g., is Berkeley DB 1.85 or 1.86), get the - current version from http://www.sleepycat.com/. DO NOT - use a version from any of the University of California, - Berkeley "Net" or other distributions. If you are still - running BSD/386 1.x, you will need to upgrade the included - Berkeley DB library to a current version. NEWDB is included - automatically if the Build script can find a library named - libdb.a. -NDBM The older NDBM implementation -- the very old V7 DBM - implementation is no longer supported. -NIS Network Information Services. To use this you must have - NIS support on your system. -NISPLUS NIS+ (the revised NIS released with Solaris 2). You must - have NIS+ support on your system to use this flag. -HESIOD Support for Hesiod (from the DEC/Athena distribution). You - must already have Hesiod support on your system for this to - work. You may be able to get this to work with the MIT/Athena - version of Hesiod, but that's likely to be a lot of work. -LDAPMAP Lightweight Directory Lookup Protocol support. You will - have to install the UMich or OpenLDAP ldap and lber - libraries to use this flag. -MAP_REGEX Regular Expression support. You will need to use an - operating system which comes with the POSIX regex() - routines or install a regexp library such as libregex from - the Free Software Foundation. - ->>> NOTE WELL for NEWDB support: If you want to get ndbm support, for ->>> Berkeley DB versions under 2.0, it is CRITICAL that you remove ->>> ndbm.o from libdb.a before you install it and DO NOT install ndbm.h; ->>> for Berkeley DB versions 2.0 through 2.3.14, remove dbm.o from libdb.a ->>> before you install it. If you don't delete these, there is absolutely ->>> no point to including -DNDBM, since it will just get you another ->>> (inferior) API to the same format database. These files OVERRIDE ->>> calls to ndbm routines -- in particular, if you leave ndbm.h in, ->>> you can find yourself using the new db package even if you don't ->>> define NEWDB. Berkeley DB versions later than 2.3.14 do not need ->>> to be modified. Please also consult the README in the top level ->>> directory of the sendmail distribution for other important information. ->>> ->>> Further note: DO NOT remove your existing /usr/include/ndbm.h -- ->>> you need that one. But do not install an updated ndbm.h in ->>> /usr/include, /usr/local/include, or anywhere else. - -If NEWDB and NDBM are defined (but not NIS), then sendmail will read -NDBM format alias files, but the next time a newaliases is run the -format will be converted to NEWDB; that format will be used forever -more. This is intended as a transition feature. - -If NEWDB, NDBM, and NIS are all defined and the name of the file includes -the string "/yp/", sendmail will rebuild BOTH the NEWDB and NDBM format -alias files. However, it will only read the NEWDB file; the NDBM format -file is used only by the NIS subsystem. This is needed because the NIS -maps on an NIS server are built directly from the NDBM files. - -If NDBM and NIS are defined (regardless of the definition of NEWDB), -and the filename includes the string "/yp/", sendmail adds the special -tokens "YP_LAST_MODIFIED" and "YP_MASTER_NAME", both of which are -required if the NDBM file is to be used as an NIS map. - -All of these flags are normally defined in the DBMDEF line in the -Makefile. - -If you define NEWDB or HESIOD you get the User Database (USERDB) -automatically. Generally you do want to have NEWDB for it to do -anything interesting. See above for getting the Berkeley DB -package (i.e., NEWDB). There is no separate "user database" -package -- don't bother searching for it on the net. - -Hesiod and LDAP require libraries that may not be installed with your -system. These are outside of my ability to provide support. See the -"Quirks" section for more information. - -The regex map can be used to see if an address matches a certain regular -expression. For example, all-numerics local parts are common spam -addresses, so "^[0-9]+$" would match this. By using such a map in a -check_* rule-set, you can block a certain range of addresses that would -otherwise be considered valid. - -+---------------+ -| COMPILE FLAGS | -+---------------+ - -Wherever possible, I try to make sendmail pull in the correct -compilation options needed to compile on various environments based on -automatically defined symbols. Some machines don't seem to have useful -symbols available, requiring that a compilation flag be defined in -the Makefile; see the Buildtools/OS subdirectory for the supported -architectures. - -If you are a system to which sendmail has already been ported you -should not have to touch the following symbols. But if you are porting, -you may have to tweak the following compilation flags in conf.h in order -to get it to compile and link properly: - -SYSTEM5 Adjust for System V (not necessarily Release 4). -SYS5SIGNALS Use System V signal semantics -- the signal handler - is automatically dropped when the signal is caught. - If this is not set, use POSIX/BSD semantics, where the - signal handler stays in force until an exec or an - explicit delete. Implied by SYSTEM5. -SYS5SETPGRP Use System V setpgrp() semantics. Implied by SYSTEM5. -HASFCHMOD Define this to one if you have the fchmod(2) system call. - This improves security. -HASFLOCK Set this if you prefer to use the flock(2) system call - rather than using fcntl-based locking. Fcntl locking - has some semantic gotchas, but many vendor systems - also interface it to lockd(8) to do NFS-style locking. - Unfortunately, may vendors implementations of fcntl locking - is just plain broken (e.g., locks are never released, - causing your sendmail to deadlock; when the kernel runs - out of locks your system crashes). For this reason, I - recommend always defining this unless you are absolutely - certain that your fcntl locking implementation really works. -HASUNAME Set if you have the "uname" system call. Implied by - SYSTEM5. -HASUNSETENV Define this if your system library has the "unsetenv" - subroutine. -HASSETSID Define this if you have the setsid(2) system call. This - is implied if your system appears to be POSIX compliant. -HASINITGROUPS Define this if you have the initgroups(3) routine. -HASSETVBUF Define this if you have the setvbuf(3) library call. - If you don't, setlinebuf will be used instead. This - defaults on if your compiler defines __STDC__. -HASSETREUID Define this if you have setreuid(2) ***AND*** root can - use setreuid to change to an arbitrary user. This second - condition is not satisfied on AIX 3.x. You may find that - your system has setresuid(2), (for example, on HP-UX) in - which case you will also have to #define setreuid(r, e) - to be the appropriate call. Some systems (such as Solaris) - have a compatibility routine that doesn't work properly, - but may have "saved user ids" properly implemented so you - can ``#define setreuid(r, e) seteuid(e)'' and have it work. - The important thing is that you have a call that will set - the effective uid independently of the real or saved uid - and be able to set the effective uid back again when done. - There's a test program in ../test/t_setreuid.c that will - try things on your system. Setting this improves the - security, since sendmail doesn't have to read .forward - and :include: files as root. There are certain attacks - that may be unpreventable without this call. -USESETEUID Define this to 1 if you have a seteuid(2) system call that - will allow root to set only the effective user id to an - arbitrary value ***AND*** you have saved user ids. This is - preferable to HASSETREUID if these conditions are fulfilled. - These are the semantics of the to-be-released revision of - Posix.1. The test program ../test/t_seteuid.c will try - this out on your system. If you define both HASSETREUID - and USESETEUID, the former is ignored. -HASLSTAT Define this if you have symbolic links (and thus the - lstat(2) system call). This improves security. Unlike - most other options, this one is on by default, so you - need to #undef it in conf.h if you don't have symbolic - links (these days everyone does). -HASSETRLIMIT Define this to 1 if you have the setrlimit(2) syscall. - You can define it to 0 to force it off. It is assumed - if you are running a BSD-like system. -HASULIMIT Define this if you have the ulimit(2) syscall (System V - style systems). HASSETRLIMIT overrides, as it is more - general. -HASWAITPID Define this if you have the waitpid(2) syscall. -HASGETDTABLESIZE - Define this if you have the getdtablesize(2) syscall. -HAS_ST_GEN Define this to 1 if your system has the st_gen field in - the stat structure (see stat(2)). -USESTRERROR Define this if you have the libc strerror function (which - should be declared in <errno.h>), and it should be used - instead of sys_errlist. -NEEDGETOPT Define this if you need a reimplementation of getopt(3). - On some systems, getopt does very odd things if called - to scan the arguments twice. This flag will ask sendmail - to compile in a local version of getopt that works - properly. -NEEDSTRTOL Define this if your standard C library does not define - strtol(3). This will compile in a local version. -NEEDVPRINTF Define this if your standard C library does not define - vprintf(3). Note that the resulting fake implementation - is not very elegant and may not even work on some - architectures. -NEEDFSYNC Define this if your standard C library does not define - fsync(2). This will try to simulate the operation using - fcntl(2); if that is not available it does nothing, which - isn't great, but at least it compiles and runs. -HASGETUSERSHELL Define this to 1 if you have getusershell(3) in your - standard C library. If this is not defined, or is defined - to be 0, sendmail will scan the /etc/shells file (no - NIS-style support, defaults to /bin/sh and /bin/csh if - that file does not exist) to get a list of unrestricted - user shells. This is used to determine whether users - are allowed to forward their mail to a program or a file. -NEEDPUTENV Define this if your system needs am emulation of the - putenv(3) call. Define to 1 to implement it in terms - of setenv(3) or to 2 to do it in terms of primitives. -NOFTRUNCATE Define this if you don't have the ftruncate(2) syscall. - If you don't have this system call, there is an unavoidable - race condition that occurs when creating alias databases. -GIDSET_T The type of entries in a gidset passed as the second - argument to getgroups(2). Historically this has been an - int, so this is the default, but some systems (such as - IRIX) pass it as a gid_t, which is an unsigned short. - This will make a difference, so it is important to get - this right! However, it is only an issue if you have - group sets. -SLEEP_T The type returned by the system sleep() function. - Defaults to "unsigned int". Don't worry about this - if you don't have compilation problems. -ARBPTR_T The type of an arbitrary pointer -- defaults to "void *". - If you are an very old compiler you may need to define - this to be "char *". -SOCKADDR_LEN_T The type used for the third parameter to accept(2), - getsockname(2), and getpeername(2), representing the - length of a struct sockaddr. Defaults to int. -SOCKOPT_LEN_T The type used for the fifth parameter to getsockopt(2) - and setsockopt(2), representing the length of the option - buffer. Defaults to int. -LA_TYPE The type of load average your kernel supports. These - can be one of: - LA_ZERO (1) -- it always returns the load average as - "zero" (and does so on all architectures). - LA_INT (2) to read /dev/kmem for the symbol avenrun and - interpret as a long integer. - LA_FLOAT (3) same, but interpret the result as a floating - point number. - LA_SHORT (6) to interpret as a short integer. - LA_SUBR (4) if you have the getloadavg(3) routine in your - system library. - LA_MACH (5) to use MACH-style load averages (calls - processor_set_info()), - LA_PROCSTR (7) to read /proc/loadavg and interpret it - as a string representing a floating-point - number (Linux-style). - LA_READKSYM (8) is an implementation suitable for some - versions of SVr4 that uses the MIOC_READKSYM ioctl - call to read /dev/kmem. - LA_DGUX (9) is a special implementation for DG/UX that uses - the dg_sys_info system call. - LA_HPUX (10) is an HP-UX specific version that uses the - pstat_getdynamic system call. - LA_IRIX6 (11) is an IRIX 6.x specific version that adapts - to 32 or 64 bit kernels; it is otherwise very similar - to LA_INT. - LA_KSTAT (12) uses the (Solaris-specific) kstat(3k) - implementation. - LA_DEVSHORT (13) reads a short from a system file (default: - /dev/table/avenrun) and scales it in the same manner - as LA_SHORT. - LA_INT, LA_SHORT, LA_FLOAT, and LA_READKSYM have several - other parameters that they try to divine: the name of your - kernel, the name of the variable in the kernel to examine, - the number of bits of precision in a fixed point load average, - and so forth. LA_DEVSHORT uses _PATH_AVENRUN to find the - device to be read to find the load average. - In desperation, use LA_ZERO. The actual code is in - conf.c -- it can be tweaked if you are brave. -FSHIFT For LA_INT, LA_SHORT, and LA_READKSYM, this is the number - of bits of load average after the binary point -- i.e., - the number of bits to shift right in order to scale the - integer to get the true integer load average. Defaults to 8. -_PATH_UNIX The path to your kernel. Needed only for LA_INT, LA_SHORT, - and LA_FLOAT. Defaults to "/unix" on System V, "/vmunix" - everywhere else. -LA_AVENRUN For LA_INT, LA_SHORT, and LA_FLOAT, the name of the kernel - variable that holds the load average. Defaults to "avenrun" - on System V, "_avenrun" everywhere else. -SFS_TYPE Encodes how your kernel can locate the amount of free - space on a disk partition. This can be set to SFS_NONE - (0) if you have no way of getting this information, - SFS_USTAT (1) if you have the ustat(2) system call, - SFS_4ARGS (2) if you have a four-argument statfs(2) - system call (and the include file is <sys/statfs.h>), - SFS_VFS (3), SFS_MOUNT (4), SFS_STATFS (5) if you have - the two-argument statfs(2) system call with includes in - <sys/vfs.h>, <sys/mount.h>, or <sys/statfs.h> respectively, - or SFS_STATVFS (6) if you have the two-argument statvfs(2) - call. The default if nothing is defined is SFS_NONE. -SFS_BAVAIL with SFS_4ARGS you can also set SFS_BAVAIL to the field name - in the statfs structure that holds the useful information; - this defaults to f_bavail. -SPT_TYPE Encodes how your system can display what a process is doing - on a ps(1) command (SPT stands for Set Process Title). Can - be set to: - SPT_NONE (0) -- Don't try to set the process title at all. - SPT_REUSEARGV (1) -- Pad out your argv with the information; - this is the default if none specified. - SPT_BUILTIN (2) -- The system library has setproctitle. - SPT_PSTAT (3) -- Use the PSTAT_SETCMD option to pstat(2) - to set the process title; this is used by HP-UX. - SPT_PSSTRINGS (4) -- Use the magic PS_STRINGS pointer (4.4BSD). - SPT_SYSMIPS (5) -- Use sysmips() supported by NEWS-OS 6. - SPT_SCO (6) -- Write kernel u. area. - SPT_CHANGEARGV (7) -- Write pointers to our own strings into - the existing argv vector. -SPT_PADCHAR Character used to pad the process title; if undefined, - the space character (0x20) is used. This is ignored if - SPT_TYPE != SPT_REUSEARGV -ERRLIST_PREDEFINED - If set, assumes that some header file defines sys_errlist. - This may be needed if you get type conflicts on this - variable -- otherwise don't worry about it. -WAITUNION The wait(2) routine takes a "union wait" argument instead - of an integer argument. This is for compatibility with - old versions of BSD. -SCANF You can set this to extend the F command to accept a - scanf string -- this gives you a primitive parser for - class definitions -- BUT it can make you vulnerable to - core dumps if the target file is poorly formed. -SYSLOG_BUFSIZE You can define this to be the size of the buffer that - syslog accepts. If it is not defined, it assumes a - 1024-byte buffer. If the buffer is very small (under - 256 bytes) the log message format changes -- each - e-mail message will log many more messages, since it - will log each piece of information as a separate line - in syslog. -BROKEN_RES_SEARCH - On Ultrix (and maybe other systems?) if you use the - res_search routine with an unknown host name, it returns - -1 but sets h_errno to 0 instead of HOST_NOT_FOUND. If - you set this, sendmail considers 0 to be the same as - HOST_NOT_FOUND. -NAMELISTMASK If defined, values returned by nlist(3) are masked - against this value before use -- a common value is - 0x7fffffff to strip off the top bit. -BSD4_4_SOCKADDR If defined, socket addresses have an sa_len field that - defines the length of this address. -SAFENFSPATHCONF Set this to 1 if and only if you have verified that a - pathconf(2) call with _PC_CHOWN_RESTRICTED argument on an - NFS filesystem where the underlying system allows users to - give away files to other users returns <= 0. Be sure you - try both on NFS V2 and V3. Some systems assume that their - local policy apply to NFS servers -- this is a bad - assumption! The test/t_pathconf.c program will try this - for you -- you have to run it in a directory that is - mounted from a server that allows file giveaway. -SIOCGIFCONF_IS_BROKEN - Set this if your system has an SIOCGIFCONF ioctl defined, - but it doesn't behave the same way as "most" systems (BSD, - Solaris, SunOS, HP-UX, etc.) -SIOCGIFNUM_IS_BROKEN - Set this if your system has an SIOCGIFNUM ioctl defined, - but it doesn't behave the same way as "most" systems - (Solaris, HP-UX). -NEED_PERCENTQ Set this if your system doesn't support the printf - format strings %lld or %llu. If this is set, %qd and - %qu are used instead. - - - -+-----------------------+ -| COMPILE-TIME FEATURES | -+-----------------------+ - -There are a bunch of features that you can decide to compile in, such -as selecting various database packages and special protocol support. -Several are assumed based on other compilation flags -- if you want to -"un-assume" something, you probably need to edit conf.h. Compilation -flags that add support for special features include: - -NDBM Include support for "new" DBM library for aliases and maps. - Normally defined in the Makefile. -NEWDB Include support for Berkeley DB package (hash & btree) - for aliases and maps. Normally defined in the Makefile. - If the version of NEWDB you have is the old one that does - not include the "fd" call (this call was added in version - 1.5 of the Berkeley DB code), you must upgrade to the - current version of Berkeley DB. -NIS Define this to get NIS (YP) support for aliases and maps. - Normally defined in the Makefile. -NISPLUS Define this to get NIS+ support for aliases and maps. - Normally defined in the Makefile. -HESIOD Define this to get Hesiod support for aliases and maps. - Normally defined in the Makefile. -NETINFO Define this to get NeXT NetInfo support for aliases and maps. - Normally defined in the Makefile. -USERDB Define this to 1 to include support for the User Information - Database. Implied by NEWDB or HESIOD. You can use - -DUSERDB=0 to explicitly turn it off. -IDENTPROTO Define this as 1 to get IDENT (RFC 1413) protocol support. - This is assumed unless you are running on Ultrix or - HP-UX, both of which have a problem in the UDP - implementation. You can define it to be 0 to explicitly - turn off IDENT protocol support. If defined off, the code - is actually still compiled in, but it defaults off; you - can turn it on by setting the IDENT timeout to 30s in the - configuration file. -IP_SRCROUTE Define this to 1 to get IP source routing information - displayed in the Received: header. This is assumed on - most systems, but some (e.g., Ultrix) apparently have a - broken version of getsockopt that doesn't properly - support the IP_OPTIONS call. You probably want this if - your OS can cope with it. Symptoms of failure will be that - it won't compile properly (that is, no support for fetching - IP_OPTIONs), or it compiles but source-routed TCP connections - either refuse to open or open and hang for no apparent reason. - Ultrix and AIX3 are known to fail this way. -LOG Set this to get syslog(3) support. Defined by default - in conf.h. You want this if at all possible. -NETINET Set this to get TCP/IP support. Defined by default - in conf.h. You probably want this. -NETISO Define this to get ISO networking support. -NETUNIX Define this to get Unix domain networking support. Defined - by default. A few bizarre systems (SCO, ISC, Altos) don't - support this networking domain. -SMTP Define this to get the SMTP code. Implied by NETINET - or NETISO. -NAMED_BIND If non-zero, include DNS (name daemon) support, including - MX support. The specs say you must use this if you run - SMTP. You don't have to be running a name server daemon - on your machine to need this -- any use of the DNS resolver, - including remote access to another machine, requires this - option. Defined by default in conf.h. Define it to zero - ONLY on machines that do not use DNS in any way. -QUEUE Define this to get queueing code. Implied by NETINET - or NETISO; required by SMTP. This gives you other good - stuff -- it should be on. -DAEMON Define this to get general network support. Implied by - NETINET or NETISO. Defined by default in conf.h. You - almost certainly want it on. -MATCHGECOS Permit fuzzy matching of user names against the full - name (GECOS) field in the /etc/passwd file. This should - probably be on, since you can disable it from the config - file if you want to. Defined by default in conf.h. -MIME8TO7 If non-zero, include 8 to 7 bit MIME conversions. This - also controls advertisement of 8BITMIME in the ESMTP - startup dialogue. -MIME7TO8 If non-zero, include 7 to 8 bit MIME conversions. -HES_GETMAILHOST Define this to 1 if you are using Hesiod with the - hes_getmailhost() routine. This is included with the MIT - Hesiod distribution, but not with the DEC Hesiod distribution. -XDEBUG Do additional internal checking. These don't cost too - much; you might as well leave this on. -TCPWRAPPERS Turns on support for the TCP wrappers library (-lwrap). - See below for further information. -SECUREWARE Enable calls to the SecureWare luid enabling/changing routines. - SecureWare is a C2 security package added to several UNIX's - (notably ConvexOS) to get a C2 Secure system. This - option causes mail delivery to be done with the luid of the - recipient. -SHARE_V1 Support for the fair share scheduler, version 1. Setting to - 1 causes final delivery to be done using the recipients - resource limitations. So far as I know, this is only - supported on ConvexOS. - - -+---------------------+ -| DNS/RESOLVER ISSUES | -+---------------------+ - -Many systems have old versions of the resolver library. At a minimum, -you should be running BIND 4.8.3; older versions may compile, but they -have known bugs that should give you pause. - -Common problems in old versions include "undefined" errors for -dn_skipname. - -Some people have had a problem with BIND 4.9; it uses some routines -that it expects to be externally defined such as strerror(). It may -help to link with "-l44bsd" to solve this problem. This has apparently -been fixed in later versions of BIND, starting around 4.9.3. In other -words, if you use 4.9.0 through 4.9.2, you need -l44bsd; for earlier or -later versions, you do not. - -!PLEASE! be sure to link with the same version of the resolver as -the header files you used -- some people have used the 4.9 headers -and linked with BIND 4.8 or vice versa, and it doesn't work. -Unfortunately, it doesn't fail in an obvious way -- things just -subtly don't work. - -WILDCARD MX RECORDS ARE A BAD IDEA! The only situation in which they -work reliably is if you have two versions of DNS, one in the real world -which has a wildcard pointing to your firewall, and a completely -different version of the database internally that does not include -wildcard MX records that match your domain. ANYTHING ELSE WILL GIVE -YOU HEADACHES! - - -+-------------------------------------+ -| OPERATING SYSTEM AND COMPILE QUIRKS | -+-------------------------------------+ - -GCC problems - ***************************************************************** - ** IMPORTANT: DO NOT USE OPTIMIZATION (``-O'') IF YOU ARE ** - ** RUNNING GCC 2.4.x or 2.5.x. THERE IS A BUG IN THE GCC ** - ** OPTIMIZER THAT CAUSES SENDMAIL COMPILES TO FAIL MISERABLY. ** - ***************************************************************** - - Jim Wilson of Cygnus believes he has found the problem -- it will - probably be fixed in GCC 2.5.6 -- but until this is verified, be - very suspicious of gcc -O. This problem is reported to have been - fixed in gcc 2.6. - - A bug in gcc 2.5.5 caused problems compiling sendmail 8.6.5 with - optimization on a Sparc. If you are using gcc 2.5.5, youi should - upgrade to the latest version of gcc. - - Apparently GCC 2.7.0 on the Pentium processor has optimization - problems. I recommend against using -O on that architecture. This - has been seen on FreeBSD 2.0.5 RELEASE. - - Solaris 2.X users should use version 2.7.2.3 over 2.7.2. - - We have been told there are problems with gcc 2.8.0. If you are - using this version, you should upgrade to 2.8.1 or later. - -GDBM GDBM does not work with sendmail 8.8 because the additional - security checks and file locking cause problems. Unfortunately, - gdbm does not provide a compile flag in its version of ndbm.h so - the code can adapt. Until the GDBM authors can fix these problems, - GDBM will not be supported. Please use Berkeley DB instead. - -Configuration file location - Up to 8.6, sendmail tried to find the sendmail.cf file in the same - place as the vendors had put it, even when this was obviously - stupid. As of 8.7, sendmail ALWAYS looks for /etc/sendmail.cf. - Beginning with 8.10, sendmail will use /etc/mail/sendmail.cf. - You can get sendmail to use the stupid vendor .cf location by - adding -DUSE_VENDOR_CF_PATH during compilation, but this may break - support programs and scripts that need to find sendmail.cf. You - are STRONGLY urged to use symbolic links if you want to use the - vendor location rather than changing the location in the sendmail - binary. - -SunOS 4.x (Solaris 1.x) - You may have to use -lresolv on SunOS. However, beware that - this links in a new version of gethostbyname that does not - understand NIS, so you must have all of your hosts in DNS. - - Some people have reported problems with the SunOS version of - -lresolv and/or in.named, and suggest that you get a newer - version. The symptoms are delays when you connect to the - SMTP server on a SunOS machine or having your domain added to - addresses inappropriately. There is a version of BIND - version 4.9 on gatekeeper.DEC.COM in pub/BSD/bind/4.9. - - There is substantial disagreement about whether you can make - this work with resolv+, which allows you to specify a search-path - of services. Some people report that it works fine, others - claim it doesn't work at all (including causing sendmail to - drop core when it tries to do multiple resolv+ lookups for a - single job). I haven't tried resolv+, as we use DNS exclusively. - - Should you want to try resolv+, it is on ftp.uu.net in - /networking/ip/dns. - - Apparently getservbyname() can fail under moderate to high - load under some circumstances. This will exhibit itself as - the message ``554 makeconnection: service "smtp" unknown''. - The problem has been traced to one or more blank lines in - /etc/services on the NIS server machine. Delete these - and it should work. This info is thanks to Brian Bartholomew - <bb@math.ufl.edu> of I-Kinetics, Inc. - -SunOS 4.0.2 (Sun 386i) - Date: Fri, 25 Aug 1995 11:13:58 +0200 (MET DST) - From: teus@oce.nl - - Sendmail 8.7.Beta.12 compiles and runs nearly out of the box with the - following changes: - * Don't use /usr/5bin in your PATH, but make /usr/5bin/uname - available as "uname" command. - * Use the defines "-DBSD4_3 -DNAMED_BIND=0" in - BuildTools/OS/SunOS.4.0, which is selected via the "uname" command. - I recommend to make available the db-library on the system first - (and change the Makefile to use this library). - Note that the sendmail.cf and aliases files are found in /etc. - -SunOS 4.1.3, 4.1.3_U1 - Sendmail causes crashes on SunOS 4.1.3 and 4.1.3_U1. According - to Sun bug number 1077939: - - If an application does a getsockopt() on a SOCK_STREAM (TCP) socket - after the other side of the connection has sent a TCP RESET for - the stream, the kernel gets a Bus Trap in the tcp_ctloutput() or - ip_ctloutput() routine. - - For 4.1.3, this is fixed in patch 100584-08, available on the - Sunsolve 2.7.1 or later CDs. For 4.1.3_U1, this was fixed in patch - 101790-01 (SunOS 4.1.3_U1: TCP socket and reset problems), later - obsoleted by patch 102010-05. - - Sun patch 100584-08 is not currently publicly available on their - ftp site but a user has reported it can be found at other sites - using a web search engine. - -Solaris 2.x (SunOS 5.x) - To compile for Solaris, the Makefile built by Build must - include a SOLARIS definition which reflects the Solaris version - (i.e. -DSOLARIS=20400 for 2.4 or -DSOLARIS=20501 for 2.5.1). - If you are using gcc, make sure -I/usr/include is not used (or - it might complain about TopFrame). If you are using Sun's cc, - make sure /opt/SUNWspro/bin/cc is used instead of /usr/ucb/cc - (or it might complain about tm_zone). - - To the best of my knowledge, Solaris does not have the - gethostbyname problem described above. However, it does - have another one: - - From a correspondent: - - For solaris 2.2, I have - - hosts: files dns - - in /etc/nsswitch.conf and /etc/hosts has to have the fully - qualified host name. I think "files" has to be before "dns" - in /etc/nsswitch.conf during bootup. - - From another correspondent: - - When running sendmail under Solaris, the gethostbyname() - hack in conf.c which should perform proper canonicalization - of host names could fail. Result: the host name is not - canonicalized despite the hack, and you'll have to define $j - and $m in sendmail.cf somewhere. - - The reason could be that /etc/nsswitch.conf is improperly - configured (at least from sendmail's point of view). For - example, the line - - hosts: files nisplus dns - - will make gethostbyname() look in /etc/hosts first, then ask - nisplus, then dns. However, if /etc/hosts does not contain - the full canonicalized hostname, then no amount of - gethostbyname()s will work. - - Solution (or rather, a workaround): Ask nisplus first, then - dns, then local files: - - hosts: nisplus dns [NOTFOUND=return] files - - The Solaris "syslog" function is apparently limited to something - about 90 characters because of a kernel limitation. If you have - source code, you can probably up this number. You can get patches - that fix this problem: the patch ids are: - - Solaris 2.1 100834 - Solaris 2.2 100999 - Solaris 2.3 101318 - - Be sure you have the appropriate patch installed or you won't - see system logging. - -Solaris 2.4 (SunOS 5.4) - If you include /usr/lib at the end of your LD_LIBRARY_PATH you run - the risk of getting the wrong libraries under some circumstances. - This is because of a new feature in Solaris 2.4, described by - Rod.Evans@Eng.Sun.COM: - - >> Prior to SunOS 5.4, any LD_LIBRARY_PATH setting was ignored by the - >> runtime linker if the application was setxid (secure), thus your - >> applications search path would be: - >> - >> /usr/local/lib LD_LIBRARY_PATH component - IGNORED - >> /usr/lib LD_LIBRARY_PATH component - IGNORED - >> /usr/local/lib RPATH - honored - >> /usr/lib RPATH - honored - >> - >> the effect is that path 3 would be the first used, and this would - >> satisfy your resolv.so lookup. - >> - >> In SunOS 5.4 we made the LD_LIBRARY_PATH a little more flexible. - >> People who developed setxid applications wanted to be able to alter - >> the library search path to some degree to allow for their own - >> testing and debugging mechanisms. It was decided that the only - >> secure way to do this was to allow a `trusted' path to be used in - >> LD_LIBRARY_PATH. The only trusted directory we presently define - >> is /usr/lib. Thus a setuid root developer could play with some - >> alternative shared object implementations and place them in - >> /usr/lib (being root we assume they'ed have access to write in this - >> directory). This change was made as part of 1155380 - after a - >> *huge* amount of discussion regarding the security aspect of things. - >> - >> So, in SunOS 5.4 your applications search path would be: - >> - >> /usr/local/lib from LD_LIBRARY_PATH - IGNORED (untrustworthy) - >> /usr/lib from LD_LIBRARY_PATH - honored (trustworthy) - >> /usr/local/lib from RPATH - honored - >> /usr/lib from RPATH - honored - >> - >> here, path 2 would be the first used. - -Solaris 2.6 (SunOS 5.6) - If you built sendmail 8.8.1 through 8.8.4 inclusive on a Solaris 2.5 - system, that binary will not run on Solaris 2.6, due to problems with - incompatible snprintf(3s) calls. This problem is fixed in sendmail - 8.8.5. - -Solaris 2.5.1 (SunOS 5.5.1) and 2.6 (SunOS 5.6) - Apparently Solaris 2.5.1 patch 103663-01 installs a new - /usr/include/resolv.h file that defines the __P macro without - checking to see if it is already defined. This new resolv.h is also - included in the Solaris 2.6 distribution. This causes compile - warnings such as: - - In file included from daemon.c:51: - /usr/include/resolv.h:208: warning: `__P' redefined - cdefs.h:58: warning: this is the location of the previous definition - - These warnings can be safely ignored or you can create a resolv.h - file in the obj.SunOS.5.5.1.* or obj.SunOS.5.6.* directory that reads: - - #undef __P - #include "/usr/include/resolv.h" - - Sun is aware of the problem (Sun bug ID 4081053) and it will be fixed - in Solaris 2.7. - -Ultrix - By default, the IDENT protocol is turned off on Ultrix. If you - are running Ultrix 4.4 or later, or if you have included patch - CXO-8919 for Ultrix 4.2 or 4.3 to fix the TCP problem, you can turn - IDENT on in the configuration file by setting the "ident" timeout - to 30 seconds. - -Digital UNIX (formerly DEC OSF/1) - If you are compiling on OSF/1 (DEC Alpha), you must use - -L/usr/shlib (otherwise it core dumps on startup). You may also - need -mld to get the nlist() function, although some versions - apparently don't need this. - - Also, the enclosed makefile removed /usr/sbin/smtpd; if you need - it, just create the link to the sendmail binary. - - On DEC OSF/1 3.2 or earlier, the MatchGECOS option doesn't work - properly due to a bug in the getpw* routines. If you want to use - this, use -DDEC_OSF_BROKEN_GETPWENT=1. The problem is fixed in 3.2C. - - Digital's mail delivery agent, /bin/mail (aka /bin/binmail), will - only preserve the envelope sender in the "From " header if - DefaultUserID is set to daemon. Setting this to mailnull will - cause all mail to have the header "From mailnull ...". To use - a different DefaultUserID, you will need to use a different mail - delivery agent (such as mail.local found in the sendmail - distribution). - - On Digital UNIX 4.0 and later, Berkeley DB 1.85 is included with the - operating system and already has the ndbm.o module removed. However, - Digital has modified the original Berkeley DB db.h include file. - This results in the following warning while compiling map.c and udb.c: - - cc: Warning: /usr/include/db.h, line 74: The redefinition of the macro - "__signed" conflicts with a current definition because the replacement - lists differ. The redefinition is now in effect. - #define __signed signed - ------------------------^ - - This warning can be ignored. - - Digital UNIX's linker checks /usr/ccs/lib/ before /usr/lib/. - If you have installed a new version of BIND in /usr/include - and /usr/lib, you will experience difficulties as Digital ships - libresolv.a in /usr/ccs/lib/ as well. Be sure to replace both - copies of libresolv.a. - -IRIX - The header files on SGI IRIX are completely prototyped, and as - a result you can sometimes get some warning messages during - compilation. These can be ignored. There are two errors in - deliver only if you are using gcc, both of the form ``warning: - passing arg N of `execve' from incompatible pointer type''. - Also, if you compile with -DNIS, you will get a complaint - about a declaration of struct dom_binding in a prototype - when compiling map.c; this is not important because the - function being prototyped is not used in that file. - - In order to compile sendmail you will have had to install - the developers' option in order to get the necessary include - files. - - If you compile with -lmalloc (the fast memory allocator), you may - get warning messages such as the following: - - ld32: WARNING 85: definition of _calloc in /usr/lib32/libmalloc.so - preempts that definition in /usr/lib32/mips3/libc.so. - ld32: WARNING 85: definition of _malloc in /usr/lib32/libmalloc.so - preempts that definition in /usr/lib32/mips3/libc.so. - ld32: WARNING 85: definition of _realloc in /usr/lib32/libmalloc.so - preempts that definition in /usr/lib32/mips3/libc.so. - ld32: WARNING 85: definition of _free in /usr/lib32/libmalloc.so - preempts that definition in /usr/lib32/mips3/libc.so. - ld32: WARNING 85: definition of _cfree in /usr/lib32/libmalloc.so - preempts that definition in /usr/lib32/mips3/libc.so. - - These are unavoidable and innocuous -- just ignore them. - - According to Dave Sill <de5@ornl.gov>, there is a version of the - Berkeley DB library patched to run on Irix 6.2 available from - http://reality.sgi.com/ariel/freeware/#db . - -IRIX 6.x - It is important that on IRIX 6.x you give used ABI in command - line of Build, otherwise configuration script does not work - correctly, e.g., - - sh Build -E ABI=-n32 - - If you are using XFS filesystem, avoid using ABI=-32 if possible. - -NeXT or NEXTSTEP - NEXTSTEP 3.3 and earlier ship with the old DBM library. Also, - Berkeley DB does not currently run on NEXTSTEP. - - If you are compiling on NEXTSTEP, you will have to create an - empty file "unistd.h" and create a file "dirent.h" containing: - - #include <sys/dir.h> - #define dirent direct - - (BuildTools/OS/NeXT should try to do both of these for you.) - - Apparently, there is a bug in getservbyname on Nextstep 3.0 - that causes it to fail under some circumstances with the - message "SYSERR: service "smtp" unknown" logged. You should - be able to work around this by including the line: - - OOPort=25 - - in your .cf file. - - You may have to use -DNeXT. - -BSDI (BSD/386) 1.0, NetBSD 0.9, FreeBSD 1.0 - The "m4" from BSDI won't handle the config files properly. - I haven't had a chance to test this myself. - - The M4 shipped in FreeBSD and NetBSD 0.9 don't handle the config - files properly. One must use either GNU m4 1.1 or the PD-M4 - recently posted in comp.os.386bsd.bugs (and maybe others). - NetBSD-current includes the PD-M4 (as stated in the NetBSD file - CHANGES). - - FreeBSD 1.0 RELEASE has uname(2) now. Use -DUSEUNAME in order to - use it (look into BuildTools/OS/FreeBSD). NetBSD-current may have - it too but it has not been verified. - - The latest version of Berkeley DB uses a different naming - scheme than the version that is supplied with your release. This - means you will be able to use the current version of Berkeley DB - with sendmail as long you use the new db.h when compiling - sendmail and link it against the new libdb.a. You should probably - keep the original db.h in /usr/include and the new db.h in - /usr/local/include. - -4.3BSD - If you are running a "virgin" version of 4.3BSD, you'll have - a very old resolver and be missing some header files. The - header files are simple -- create empty versions and everything - will work fine. For the resolver you should really port a new - version (4.8.3 or later) of the resolver; 4.9 is available on - gatekeeper.DEC.COM in pub/BSD/bind/4.9. If you are really - determined to continue to use your old, buggy version (or as - a shortcut to get sendmail working -- I'm sure you have the - best intentions to port a modern version of BIND), you can - copy ../contrib/oldbind.compat.c into src and add - oldbind.compat.o to OBJADD in the Makefile. - -A/UX - Date: Tue, 12 Oct 1993 18:28:28 -0400 (EDT) - From: "Eric C. Hagberg" <hagberg@med.cornell.edu> - Subject: Fix for A/UX ndbm - - I guess this isn't really a sendmail bug, however, it is something - that A/UX users should be aware of when compiling sendmail 8.6. - - Apparently, the calls that sendmail is using to the ndbm routines - in A/UX 3.0.x contain calls to "broken" routines, in that the - aliases database will break when it gets "just a little big" - (sorry I don't have exact numbers here, but it broke somewhere - around 20-25 aliases for me.), making all aliases non-functional - after exceeding this point. - - What I did was to get the gnu-dbm-1.6 package, compile it, and - then re-compile sendmail with "-lgdbm", "-DNDBM", and using the - ndbm.h header file that comes with the gnu-package. This makes - things behave properly. - [NOTE: see comment above about GDBM] - - I suppose porting the New Berkeley DB package is another route, - however, I made a quick attempt at it, and found it difficult - (not easy at least); the gnu-dbm package "configured" and - compiled easily. - - [NOTE: Berkeley DB version 2.X runs on A/UX and can be used for - database maps.] - -SCO Unix - From: Thomas Essebier <tom@stallion.oz.au> - Organisation: Stallion Technologies Pty Ltd. - - It will probably help those who are trying to configure sendmail 8.6.9 - to know that if they are on SCO, they had better set - OI-dnsrch - or they will core dump as soon as they try to use the resolver. - ie. although SCO has _res.dnsrch defined, and is kinda BIND 4.8.3, it - does not inititialise it, nor does it understand 'search' in - /etc/named.boot. - - sigh - - - According to SCO, the m4 which ships with UnixWare 2.1.2 is broken. - We recommend installing GNU m4 before attempting to build sendmail. - -DG/UX - Doug Anderson <dlander@afterlife.ncsc.mil> has successfully run - V8 on the DG/UX 5.4.2 and 5.4R3.x platforms under heavy usage. - Originally, the DG /bin/mail program wasn't compatible with - the V8 sendmail, since the DG /bin/mail requires the environment - variable "_FORCE_MAIL_LOCAL_=yes" be set. Version 8.7 now includes - this in the environment before invoking the local mailer. Some - have used procmail to avoid this problem in the past. It works - but some have experienced file locking problems with their DG/UX - ports of procmail. - -Apollo DomainOS - If you are compiling on Apollo, you will have to create an empty - file "unistd.h" (for DomainOS 10.3 and earlier) and create a file - "dirent.h" containing: - - #include <sys/dir.h> - #define dirent direct - - (BuildTools/OS/DomainOS will attempt to do both of these for you.) - -HP-UX 8.00 - Date: Mon, 24 Jan 1994 13:25:45 +0200 - From: Kimmo Suominen <Kimmo.Suominen@lut.fi> - Subject: 8.6.5 w/ HP-UX 8.00 on s300 - - Just compiled and fought with sendmail 8.6.5 on a HP9000/360 (ie. a - series 300 machine) running HP-UX 8.00. - - I was getting segmentation fault when delivering to a local user. - With debugging I saw it was faulting when doing _free@libc... *sigh* - It seems the new implementation of malloc on s300 is buggy as of 8.0, - so I tried out the one in -lmalloc (malloc(3X)). With that it seems - to work just dandy. - - When linking, you will get the following error: - - ld: multiply defined symbol _freespace in file /usr/lib/libmalloc.a - - but you can just ignore it. You might want to add this info to the - README file for the future... - -Linux - Something broke between versions 0.99.13 and 0.99.14 of Linux: - the flock() system call gives errors. If you are running .14, - you must not use flock. You can do this with -DHASFLOCK=0. - - Around the inclusion of bind-4.9.3 & Linux libc-4.6.20, the - initialization of the _res structure changed. If /etc/hosts.conf - was configured as "hosts, bind" the resolver code could return - "Name server failure" errors. This is supposedly fixed in - later versions of libc (>= 4.6.29?), and later versions of - sendmail (> 8.6.10) try to work around the problem. - - Some older versions (< 4.6.20?) of the libc/include files conflict - with sendmail's version of cdefs.h. Deleting sendmail's version - on those systems should be non-harmful, and new versions don't care. - - Sendmail assumes that libc has snprintf, which has been true since - libc 4.7.0. If you are running an older version, you will need to - use -DHASSNPRINTF=0 in the Makefile. If may be able to use -lbsd - (which includes snprintf) instead of turning this off on versions - of libc between 4.4.4 and 4.7.0 (snprintf improves security, so - you want to use this if at all possible). - - NOTE ON LINUX & BIND: By default, the Makefile generated for Linux - includes header files in /usr/local/include and libraries in - /usr/local/lib. If you've installed BIND on your system, the header - files typically end up in the search path and you need to add - "-lresolv" to the LIBS line in your Makefile. Really old versions - may need to include "-l44bsd" as well (particularly if the link phase - complains about missing strcasecmp, strncasecmp or strpbrk). - Complaints about an undefined reference to `__dn_skipname' in - domain.o are a sure sign that you need to add -lresolv to LIBS. - Newer versions of Linux are basically threaded BIND, so you may or - may not see complaints if you accidentally mix BIND - headers/libraries with virginal libc. If you have BIND headers in - /usr/local/include (resolv.h, etc) you *should* be adding -lresolv - to LIBS. Data structures may change and you'd be asking for a - core dump. - - A number of problems have been reported regarding the Linux 2.2.0 - kernel. So far, these problems have been tracked down to syslog() - and DNS resolution. We believe the problem is with the poll() - implementation in the Linux 2.2.0 kernel and poll()-aware versions - of glib (at least up to 2.0.111). - -AIX 4.2 - The AIX m4 implements a different mechanism for ifdef which is - inconsistent with other versions of m4. Therefore, it will not - work properly with the sendmail Build architecture or m4 - configuration method. To work around this problem, please use - GNU m4 from ftp://ftp.gnu.org/pub/gnu/. - -AIX 3.x - This version of sendmail does not support MB, MG, and MR resource - records, which are supported by AIX sendmail. - - Several people have reported that the IBM-supplied named returns - fairly random results -- the named should be replaced. It is not - necessary to replace the resolver, which will simplify installation. - A new BIND resolver can be found at http://www.isc.org/isc/. - -AIX 3.1.x - The supplied load average code only works correctly for AIX 3.2.x. - For 3.1, use -DLA_TYPE=LA_SUBR and get the latest ``monitor'' - package by Jussi Maki <jmaki@hut.fi> from ftp.funet.fi in the - directory pub/unix/AIX/rs6000/monitor-1.12.tar.Z; use the loadavgd - daemon, and the getloadavg subroutine supplied with that package. - If you don't care about load average throttling, just turn off - load average checking using -DLA_TYPE=LA_ZERO. - -AIX 2.2.1 - Date: Mon Dec 4 14:14:56 CST 1995 - From: Mark Whetzel <markw@antimatr.houston.tx.us> - Subject: Porting sendmail 8.7.2 to AIX V2 on the RT. - - This version of sendmail does not support MB, MG, and MR resource - records, which are supported by AIX sendmail. - - AIX V2 on the RT does not have 'paths.h'. Create a null - file in the 'obj' directory to remove this compile error. - - A patch file is needed to get the BSD 'db' library to compile - for AIX/RT. I have sent the necessary updates to the author, - but they may not be immediately available. - [NOTE: Berkeley DB version 2.X runs on AIX/RT.] - - The original AIX/RT resolver libraries are very old, and you - should get the latest BIND to replace it. The 4.8.3 version - has been tested, but 4.9.x is out and should work. - - To make the load average code work correctly requires an - external routine, as the kernel does not maintain system - load averages, similar to AIX V3.1.x. A reverse port of the - older 1.05 'monitor' load average daemon code written by - Jussi Maki that will work on AIX V2 for the RT is available - by E-mail to Mark Whetzel <markw@antimatr.houston.tx.us>. - That code depends on an external daemon to collect system - load information, and the external routine 'getloadavg', - that will return that information. The 'LA_SUBR' define - will handle this for AIX V2 on the RT. - - Note: You will have to change BuildTools/OS/AIX.2 to correctly - point to the locatons of the updated BIND source tree and - the location of the 'newdb' tree and library location. - You will also have to change BuildTools/OS/AIX.2 to know - about the location of the 'getloadavg' routine if you use - the LA_SUBR define. - - - Manual pages will format correctly if given the mandoc macros - and used with nroff. I have not tried groff. - -RISC/os - RISC/os from MIPS is a merged AT&T/Berkeley system. When you - compile on that platform you will get duplicate definitions - on many files. You can ignore these. - -System V Release 4 Based Systems - There is a single BuildTools OS that is intended for all SVR4-based - systems (built from BuildTools/OS/SVR4). It defines __svr4__, - which is predefined by some compilers. If your compiler already - defines this compile variable, you can delete the definition from - the generated Makefile or create a BuildTools/Site/site.config.m4 - file. - - It's been tested on Dell Issue 2.2. - -DELL SVR4 - Date: Mon, 06 Dec 1993 10:42:29 EST - From: "Kimmo Suominen" <kim@grendel.lut.fi> - Message-ID: <2d0352f9.lento29@lento29.UUCP> - To: eric@cs.berkeley.edu - Cc: sendmail@cs.berkeley.edu - Subject: Notes for DELL SVR4 - - Eric, - - Here are some notes for compiling Sendmail 8.6.4 on DELL SVR4. I ran - across these things when helping out some people who contacted me by - e-mail. - - 1) Use gcc 2.4.5 (or later?). Dell distributes gcc 2.1 with their - Issue 2.2 Unix. It is too old, and gives you problems with - clock.c, because sigset_t won't get defined in <sys/signal.h>. - This is due to a problematic protection rule in there, and is - fixed with gcc 2.4.5. - - 2) If you don't use the new Berkeley DB (-DNEWDB), then you need - to add "-lc -lucb" to the libraries to link with. This is because - the -ldbm distributed by Dell needs the bcopy, bcmp and bzero - functions. It is important that you specify both libraries in - the given order to be sure you only get the BSTRING functions - from the UCB library (and not the signal routines etc.). - - 3) Don't leave out "-lelf" even if compiling with "-lc -lucb". - The UCB library also has another copy of the nlist routines, - but we do want the ones from "-lelf". - - If anyone needs a compiled gcc 2.4.5 and/or a ported DB library, they - can use anonymous ftp to fetch them from lut.fi in the /kim directory. - They are copies of what I use on grendel.lut.fi, and offering them - does not imply that I would also support them. I have sent the DB - port for SVR4 back to Keith Bostic for inclusion in the official - distribution, but I haven't heard anything from him as of today. - - - gcc-2.4.5-svr4.tar.gz (gcc 2.4.5 and the corresponding libg++) - - db-1.72.tar.gz (with source, objects and a installed copy) - - Cheers - + Kim - -- - * Kimmo.Suominen@lut.fi * SysVr4 enthusiast at GRENDEL.LUT.FI * - * KIM@FINFILES.BITNET * Postmaster and Hostmaster at LUT.FI * - * + 358 200 865 718 * Unix area moderator at NIC.FUNET.FI * - -ConvexOS 10.1 and below - In order to use the name server, you must create the file - /etc/use_nameserver. If this file does not exist, the call - to res_init() will fail and you will have absolutely no - access to DNS, including MX records. - -Amdahl UTS 2.1.5 - In order to get UTS to work, you will have to port BIND 4.9. - The vendor's BIND is reported to be ``totally inadequate.'' - See sendmail/contrib/AmdahlUTS.patch for the patches necessary - to get BIND 4.9 compiled for UTS. - -UnixWare - According to Alexander Kolbasov <sasha@unitech.gamma.ru>, - the m4 on UnixWare 2.0 (still in Beta) will core dump on the - config files. GNU m4 and the m4 from UnixWare 1.x both work. - - According to Larry Rosenman <ler@lerami.lerctr.org>: - - UnixWare 2.1.[23]'s m4 chokes (not obviously) when - processing the 8.9.0 cf files. - - I had a LOCAL_RULE_0 that wound up AFTER the - SBasic_check_rcpt rules using the SCO supplied M4. - GNU M4 works fine. - -UNICOS 8.0.3.4 - Some people have reported that the -O flag on UNICOS can cause - problems. You may want to turn this off if you have problems - running sendmail. Reported by Jerry G. DeLapp <jgd@acl.lanl.gov>. - -GNU getopt - I'm told that GNU getopt has a problem in that it gets confused - by the double call. Use the version in conf.c instead. - -BIND 4.9.2 and Ultrix - If you are running on Ultrix, be sure you read conf/Info.Ultrix - in the BIND distribution very carefully -- there is information - in there that you need to know in order to avoid errors of the - form: - - /lib/libc.a(gethostent.o): sethostent: multiply defined - /lib/libc.a(gethostent.o): endhostent: multiply defined - /lib/libc.a(gethostent.o): gethostbyname: multiply defined - /lib/libc.a(gethostent.o): gethostbyaddr: multiply defined - - during the link stage. - -strtoul - Some compilers (notably gcc) claim to be ANSI C but do not - include the ANSI-required routine "strtoul". If your compiler - has this problem, you will get an error in srvrsmtp.c on the - code: - - # ifdef defined(__STDC__) && !defined(BROKEN_ANSI_LIBRARY) - e->e_msgsize = strtoul(vp, (char **) NULL, 10); - # else - e->e_msgsize = strtol(vp, (char **) NULL, 10); - # endif - - You can use -DBROKEN_ANSI_LIBRARY to get around this problem. - -Listproc 6.0c - Date: 23 Sep 1995 23:56:07 GMT - Message-ID: <95925101334.~INN-AUMa00187.comp-news@dl.ac.uk> - From: alansz@mellers1.psych.berkeley.edu (Alan Schwartz) - Subject: Listproc 6.0c + Sendmail 8.7 [Helpful hint] - - Just upgraded to sendmail 8.7, and discovered that listproc 6.0c - breaks, because it, by default, sends a blank "HELO" rather than - a "HELO hostname" when using the 'system' or 'telnet' mailmethod. - - The fix is to include -DZMAILER in the compilation, which will - cause it to use "HELO hostname" (which Z-mail apparently requires - as well. :) - -LDAP - LDAP was provided by Booker Bense <bbense+ldap@stanford.edu> of - Stanford University. From Booker: - - - The patch attached to this message implements an Ldap map class. - Currently we are using this at stanford to support campus-wide - email addressing. More information can be found at - http://www.stanford.edu/~bbense/Inst.html. - - - Currently we are using the ldap map as follows: - - Kluser ldapx - -h"localhost borax.stanford.edu borate.stanford.edu boron.stanford.edu" - -k"mailacceptinggeneralid=%s" -v maildrop - - and in Rule set S5 - - # Now attempt to lookup in luser (ldap map) - R< $L > $+ $: < $L > $( luser $1 $) - R< $* > $+ @ $+ $: < $3 > $2 Rewrite if forward - - - The map definition supports most of the standard Map args plus most - of the command line options of ldapsearch. The software is currently - limited to only accepting the first entry returned. It expects that - the map defines an ldap filter that returns at most 1 valid entry. - It requires the ldap and lber libraries from the Umich Ldap3.2 - release. - - The software has been in production on Solaris.2.5.1 at Stanford - for over 2 years. - - The LDAP map supports both the UMich LDAP 3.2 and 3.3 libraries as - well as the OpenLDAP (http://www.openldap.org/) libraries. - -TCP Wrappers - If you are using -DTCPWRAPPERS to get TCP Wrappers support you will - also need to install libwrap.a and modify your site.config.m4 file - or the generated Makefile to include -lwrap in the LIBS line - (make sure that INCDIRS and LIBDIRS point to where the tcpd.h and - libwrap.a can be found). - - TCP Wrappers is available on ftp.win.tue.nl in /pub/security; - grab tcp_wrappers_<VER>.tar.gz (where <VER> is the highest - numbered version). - - If you have alternate MX sites for your site, be sure that all of - your MX sites reject the same set of hosts. If not, a bad guy whom - you reject will connect to your site, fail, and move on to the next - MX site, which will accept the mail for you and forward it on to you. - -Regular Expressions (MAP_REGEX) - If sendmail linking fails with: - - undefined reference to 'regcomp' - - or sendmail gives an error about a regular expression with: - - pattern-compile-error: : Operation not applicable - - Your libc does not include a running version of POSIX-regex. Use - librx or regex.o from the GNU Free Software Foundation, - ftp://ftp.gnu.org/pub/gnu/rx-?.?.tar.gz or - ftp://ftp.gnu.org/pub/gnu/regex-?.?.tar.gz. - You can also use the regex-lib by Henry Spencer, - ftp://ftp.funet.fi/pub/languages/C/spencer/regex.shar.gz - Make sure, your compiler reads regex.h from the distribution, - not from /usr/include, otherwise sendmail will dump a core. - - -+--------------+ -| MANUAL PAGES | -+--------------+ - -The manual pages have been written against the -mandoc macros -instead of the -man macros. The latest version of groff has them -included. You can also get a copy from FTP.UU.NET in the directory -/systems/unix/bsd-sources/share/tmac. groff is available from -ftp.gnu.org in the /pub/gnu directory. - - -+-----------------+ -| DEBUGGING HOOKS | -+-----------------+ - -As of 8.6.5, sendmail daemons will catch a SIGUSR1 signal and log -some debugging output (logged at LOG_DEBUG severity). The -information dumped is: - - * The value of the $j macro. - * A warning if $j is not in the set $=w. - * A list of the open file descriptors. - * The contents of the connection cache. - * If ruleset 89 is defined, it is evaluated and the results printed. - -This allows you to get information regarding the runtime state of the -daemon on the fly. This should not be done too frequently, since -the process of rewriting may lose memory which will not be recovered. -Also, ruleset 89 may call non-reentrant routines, so there is a small -non-zero probability that this will cause other problems. It is -really only for debugging serious problems. - -A typical formulation of ruleset 89 would be: - - R$* $@ $>0 some test address - - -+-----------------------------+ -| DESCRIPTION OF SOURCE FILES | -+-----------------------------+ - -The following list describes the files in this directory: - -Makefile.m4 A template for constructing a makefile based on the - information in the BuildTools directory. -README This file. -TRACEFLAGS My own personal list of the trace flags -- not guaranteed - to be particularly up to date. -alias.c Does name aliasing in all forms. -arpadate.c A subroutine which creates ARPANET standard dates. -clock.c Routines to implement real-time oriented functions - in sendmail -- e.g., timeouts. -collect.c The routine that actually reads the mail into a temp - file. It also does a certain amount of parsing of - the header, etc. -conf.c The configuration file. This contains information - that is presumed to be quite static and non- - controversial, or code compiled in for efficiency - reasons. Most of the configuration is in sendmail.cf. -conf.h Configuration that must be known everywhere. -convtime.c A routine to sanely process times. -daemon.c Routines to implement daemon mode. This version is - specifically for Berkeley 4.1 IPC. -deliver.c Routines to deliver mail. -domain.c Routines that interface with DNS (the Domain Name - System). -err.c Routines to print error messages. -envelope.c Routines to manipulate the envelope structure. -headers.c Routines to process message headers. -macro.c The macro expander. This is used internally to - insert information from the configuration file. -main.c The main routine to sendmail. This file also - contains some miscellaneous routines. -map.c Support for database maps. -mci.c Routines that handle mail connection information caching. -mime.c MIME conversion routines. -parseaddr.c The routines which do address parsing. -queue.c Routines to implement message queueing. -readcf.c The routine that reads the configuration file and - translates it to internal form. -recipient.c Routines that manipulate the recipient list. -safefile.c Routines to do careful checking of file modes and permissions - when opening or creating files. -savemail.c Routines which save the letter on processing errors. -sendmail.h Main header file for sendmail. -snprintf.c Routines to manipulate strings but prevent buffer overflows. -srvrsmtp.c Routines to implement server SMTP. -stab.c Routines to manage the symbol table. -stats.c Routines to collect and post the statistics. -sysexits.c List of error messages associated with error codes - in sysexits.h. -trace.c The trace package. These routines allow setting and - testing of trace flags with a high granularity. -udb.c The user database interface module. -usersmtp.c Routines to implement user SMTP. -util.c Some general purpose routines used by sendmail. -version.c The version number and information about this - version of sendmail. Theoretically, this gets - modified on every change. - -Eric Allman - -(Version 8.211, last update 2/2/1999 15:28:18) diff --git a/src/TRACEFLAGS b/src/TRACEFLAGS deleted file mode 100644 index 04b9b3c..0000000 --- a/src/TRACEFLAGS +++ /dev/null @@ -1,79 +0,0 @@ -# @(#)TRACEFLAGS 8.21 (Berkeley) 4/27/1998 -0, 1 main.c main skip background fork -0, 4 main.c main canonical name, UUCP node name, a.k.a.s -0, 15 main.c main print configuration -0, 44 util.c printav print address of each string -0, 101 main.c main print version and exit -1 main.c main print from person -2 main.c finis -3 conf.c getla, shouldqueue -4 conf.c enoughspace -5 clock.c setevent, clrevent, tick -6 savemail.c savemail, returntosender -7 queue.c queuename -8 domain.c getmxrr, getcanonname -9 daemon.c getauthinfo IDENT protocol -9 daemon.c maphostname -10 deliver.c deliver -11 deliver.c openmailer, mailfile -12 parseaddr.c remotename -13 deliver.c sendall, sendenvelope -14 headers.c commaize -15 daemon.c getrequests -16 daemon.c makeconnection -17 deliver.c hostsignature -17 domain.c mxrand -18 usersmtp.c reply, smtpmessage, smtpinit, smtpmailfrom -19 srvrsmtp.c smtp -20 parseaddr.c parseaddr -21 parseaddr.c rewrite -22 parseaddr.c prescan -24 parseaddr.c buildaddr, allocaddr -25 recipient.c sendtolist -26 recipient.c recipient -27 alias.c alias -27 alias.c readaliases -27 alias.c forward -27 recipient.c include -28 udb.c udbexpand, udbsender -29 parseaddr.c maplocaluser -29 recipient.c recipient (local users), finduser -30 collect.c collect -30 collect.c eatfrom -31 headers.c chompheader -32 headers.c eatheader -33 headers.c crackaddr -34 headers.c putheader -35 macro.c expand, define -36 stab.c stab -37 readcf.c (many) -38 map.c initmaps -39 map.c map_rewrite -40 queue.c queueup, orderq, dowork -41 queue.c orderq -42 mci.c mci_get -43 mime.c mime8to7 -44 recipient.c writeable -44 safefile.c safefile, safedirpath, filechanged -45 envelope.c setsender -46 envelope.c openxscript -47 main.c drop_privileges -48 parseaddr.c rscheck -48 conf.c validate_connection -49 conf.c checkcompat -50 envelope.c dropenvelope -51 queue.c unlockqueue -52 main.c disconnect -53 util.c xfclose -54 err.c putoutmsg -55 conf.c lockfile -56 mci.c persistent host status -57 util.c snprintf -60 map.c -61 conf.c sm_gethostbyname -62 multiple file descriptor checking -80 content length -81 sun remote mode -91 mci.c syslogging of MCI cache information -94 srvrsmtp.c cause commands to fail (for protocol testing) -99 main.c avoid backgrounding (no printed output) diff --git a/src/alias.c b/src/alias.c deleted file mode 100644 index a7149f2..0000000 --- a/src/alias.c +++ /dev/null @@ -1,895 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - */ - -# include "sendmail.h" - -#ifndef lint -static char sccsid[] = "@(#)alias.c 8.96 (Berkeley) 12/18/1998"; -#endif /* not lint */ - - -MAP *AliasFileMap = NULL; /* the actual aliases.files map */ -int NAliasFileMaps; /* the number of entries in AliasFileMap */ -/* -** ALIAS -- Compute aliases. -** -** Scans the alias file for an alias for the given address. -** If found, it arranges to deliver to the alias list instead. -** Uses libdbm database if -DDBM. -** -** Parameters: -** a -- address to alias. -** sendq -- a pointer to the head of the send queue -** to put the aliases in. -** aliaslevel -- the current alias nesting depth. -** e -- the current envelope. -** -** Returns: -** none -** -** Side Effects: -** Aliases found are expanded. -** -** Deficiencies: -** It should complain about names that are aliased to -** nothing. -*/ - -void -alias(a, sendq, aliaslevel, e) - register ADDRESS *a; - ADDRESS **sendq; - int aliaslevel; - register ENVELOPE *e; -{ - register char *p; - char *owner; - auto int stat = EX_OK; - char obuf[MAXNAME + 7]; - extern char *aliaslookup __P((char *, int *, ENVELOPE *)); - - if (tTd(27, 1)) - printf("alias(%s)\n", a->q_user); - - /* don't realias already aliased names */ - if (bitset(QDONTSEND|QBADADDR|QVERIFIED, a->q_flags)) - return; - - if (NoAlias) - return; - - e->e_to = a->q_paddr; - - /* - ** Look up this name. - ** - ** If the map was unavailable, we will queue this message - ** until the map becomes available; otherwise, we could - ** bounce messages inappropriately. - */ - - p = aliaslookup(a->q_user, &stat, e); - if (stat == EX_TEMPFAIL || stat == EX_UNAVAILABLE) - { - a->q_flags |= QQUEUEUP; - if (e->e_message == NULL) - e->e_message = newstr("alias database unavailable"); - return; - } - if (p == NULL) - return; - - /* - ** Match on Alias. - ** Deliver to the target list. - */ - - if (tTd(27, 1)) - printf("%s (%s, %s) aliased to %s\n", - a->q_paddr, a->q_host, a->q_user, p); - if (bitset(EF_VRFYONLY, e->e_flags)) - { - a->q_flags |= QVERIFIED; - return; - } - message("aliased to %s", shortenstring(p, MAXSHORTSTR)); - if (LogLevel > 9) - sm_syslog(LOG_INFO, e->e_id, - "alias %.100s => %s", - a->q_paddr, shortenstring(p, MAXSHORTSTR)); - a->q_flags &= ~QSELFREF; - if (tTd(27, 5)) - { - printf("alias: QDONTSEND "); - printaddr(a, FALSE); - } - a->q_flags |= QDONTSEND; - (void) sendtolist(p, a, sendq, aliaslevel + 1, e); - if (bitset(QSELFREF, a->q_flags)) - a->q_flags &= ~QDONTSEND; - - /* - ** Look for owner of alias - */ - - (void) strcpy(obuf, "owner-"); - if (strncmp(a->q_user, "owner-", 6) == 0 || - strlen(a->q_user) > (SIZE_T) sizeof obuf - 7) - (void) strcat(obuf, "owner"); - else - (void) strcat(obuf, a->q_user); - owner = aliaslookup(obuf, &stat, e); - if (owner == NULL) - return; - - /* reflect owner into envelope sender */ - if (strpbrk(owner, ",:/|\"") != NULL) - owner = obuf; - a->q_owner = newstr(owner); - - /* announce delivery to this alias; NORECEIPT bit set later */ - if (e->e_xfp != NULL) - fprintf(e->e_xfp, "Message delivered to mailing list %s\n", - a->q_paddr); - e->e_flags |= EF_SENDRECEIPT; - a->q_flags |= QDELIVERED|QEXPANDED; -} -/* -** ALIASLOOKUP -- look up a name in the alias file. -** -** Parameters: -** name -- the name to look up. -** pstat -- a pointer to a place to put the status. -** e -- the current envelope. -** -** Returns: -** the value of name. -** NULL if unknown. -** -** Side Effects: -** none. -** -** Warnings: -** The return value will be trashed across calls. -*/ - -char * -aliaslookup(name, pstat, e) - char *name; - int *pstat; - ENVELOPE *e; -{ - static MAP *map = NULL; - - if (map == NULL) - { - STAB *s = stab("aliases", ST_MAP, ST_FIND); - - if (s == NULL) - return NULL; - map = &s->s_map; - } - if (!bitset(MF_OPEN, map->map_mflags)) - return NULL; - - /* special case POstMastER -- always use lower case */ - if (strcasecmp(name, "postmaster") == 0) - name = "postmaster"; - - return (*map->map_class->map_lookup)(map, name, NULL, pstat); -} -/* -** SETALIAS -- set up an alias map -** -** Called when reading configuration file. -** -** Parameters: -** spec -- the alias specification -** -** Returns: -** none. -*/ - -void -setalias(spec) - char *spec; -{ - register char *p; - register MAP *map; - char *class; - STAB *s; - - if (tTd(27, 8)) - printf("setalias(%s)\n", spec); - - for (p = spec; p != NULL; ) - { - char buf[50]; - - while (isascii(*p) && isspace(*p)) - p++; - if (*p == '\0') - break; - spec = p; - - if (NAliasFileMaps >= MAXMAPSTACK) - { - syserr("Too many alias databases defined, %d max", - MAXMAPSTACK); - return; - } - if (AliasFileMap == NULL) - { - strcpy(buf, "aliases.files sequence"); - AliasFileMap = makemapentry(buf); - if (AliasFileMap == NULL) - { - syserr("setalias: cannot create aliases.files map"); - return; - } - } - (void) snprintf(buf, sizeof buf, "Alias%d", NAliasFileMaps); - s = stab(buf, ST_MAP, ST_ENTER); - map = &s->s_map; - bzero(map, sizeof *map); - map->map_mname = s->s_name; - - p = strpbrk(p, " ,/:"); - if (p != NULL && *p == ':') - { - /* map name */ - *p++ = '\0'; - class = spec; - spec = p; - } - else - { - class = "implicit"; - map->map_mflags = MF_INCLNULL; - } - - /* find end of spec */ - if (p != NULL) - p = strchr(p, ','); - if (p != NULL) - *p++ = '\0'; - - if (tTd(27, 20)) - printf(" map %s:%s %s\n", class, s->s_name, spec); - - /* look up class */ - s = stab(class, ST_MAPCLASS, ST_FIND); - if (s == NULL) - { - syserr("setalias: unknown alias class %s", class); - } - else if (!bitset(MCF_ALIASOK, s->s_mapclass.map_cflags)) - { - syserr("setalias: map class %s can't handle aliases", - class); - } - else - { - map->map_class = &s->s_mapclass; - if (map->map_class->map_parse(map, spec)) - { - map->map_mflags |= MF_VALID|MF_ALIAS; - AliasFileMap->map_stack[NAliasFileMaps++] = map; - } - } - } -} -/* -** ALIASWAIT -- wait for distinguished @:@ token to appear. -** -** This can decide to reopen or rebuild the alias file -** -** Parameters: -** map -- a pointer to the map descriptor for this alias file. -** ext -- the filename extension (e.g., ".db") for the -** database file. -** isopen -- if set, the database is already open, and we -** should check for validity; otherwise, we are -** just checking to see if it should be created. -** -** Returns: -** TRUE -- if the database is open when we return. -** FALSE -- if the database is closed when we return. -*/ - -bool -aliaswait(map, ext, isopen) - MAP *map; - char *ext; - int isopen; -{ - bool attimeout = FALSE; - time_t mtime; - struct stat stb; - char buf[MAXNAME + 1]; - - if (tTd(27, 3)) - printf("aliaswait(%s:%s)\n", - map->map_class->map_cname, map->map_file); - if (bitset(MF_ALIASWAIT, map->map_mflags)) - return isopen; - map->map_mflags |= MF_ALIASWAIT; - - if (SafeAlias > 0) - { - auto int st; - time_t toolong = curtime() + SafeAlias; - unsigned int sleeptime = 2; - - while (isopen && - map->map_class->map_lookup(map, "@", NULL, &st) == NULL) - { - if (curtime() > toolong) - { - /* we timed out */ - attimeout = TRUE; - break; - } - - /* - ** Close and re-open the alias database in case - ** the one is mv'ed instead of cp'ed in. - */ - - if (tTd(27, 2)) - printf("aliaswait: sleeping for %d seconds\n", - sleeptime); - - map->map_class->map_close(map); - map->map_mflags &= ~(MF_OPEN|MF_WRITABLE); - sleep(sleeptime); - sleeptime *= 2; - if (sleeptime > 60) - sleeptime = 60; - isopen = map->map_class->map_open(map, O_RDONLY); - } - } - - /* see if we need to go into auto-rebuild mode */ - if (!bitset(MCF_REBUILDABLE, map->map_class->map_cflags)) - { - if (tTd(27, 3)) - printf("aliaswait: not rebuildable\n"); - map->map_mflags &= ~MF_ALIASWAIT; - return isopen; - } - if (stat(map->map_file, &stb) < 0) - { - if (tTd(27, 3)) - printf("aliaswait: no source file\n"); - map->map_mflags &= ~MF_ALIASWAIT; - return isopen; - } - mtime = stb.st_mtime; - snprintf(buf, sizeof buf, "%s%s", - map->map_file, ext == NULL ? "" : ext); - if (stat(buf, &stb) < 0 || stb.st_mtime < mtime || attimeout) - { - /* database is out of date */ - if (AutoRebuild && stb.st_ino != 0 && - (stb.st_uid == geteuid() || - (geteuid() == 0 && stb.st_uid == TrustedUid))) - { - bool oldSuprErrs; - - message("auto-rebuilding alias database %s", buf); - oldSuprErrs = SuprErrs; - SuprErrs = TRUE; - if (isopen) - { - map->map_class->map_close(map); - map->map_mflags &= ~(MF_OPEN|MF_WRITABLE); - } - (void) rebuildaliases(map, TRUE); - isopen = map->map_class->map_open(map, O_RDONLY); - SuprErrs = oldSuprErrs; - } - else - { - if (LogLevel > 3) - sm_syslog(LOG_INFO, NOQID, - "alias database %s out of date", - buf); - message("Warning: alias database %s out of date", buf); - } - } - map->map_mflags &= ~MF_ALIASWAIT; - return isopen; -} -/* -** REBUILDALIASES -- rebuild the alias database. -** -** Parameters: -** map -- the database to rebuild. -** automatic -- set if this was automatically generated. -** -** Returns: -** TRUE if successful; FALSE otherwise. -** -** Side Effects: -** Reads the text version of the database, builds the -** DBM or DB version. -*/ - -bool -rebuildaliases(map, automatic) - register MAP *map; - bool automatic; -{ - FILE *af; - bool nolock = FALSE; - bool success = FALSE; - int sff = SFF_OPENASROOT|SFF_REGONLY|SFF_NOLOCK; - sigfunc_t oldsigint, oldsigquit; -#ifdef SIGTSTP - sigfunc_t oldsigtstp; -#endif - - if (!bitset(MCF_REBUILDABLE, map->map_class->map_cflags)) - return FALSE; - - if (!bitset(DBS_LINKEDALIASFILEINWRITABLEDIR, DontBlameSendmail)) - sff |= SFF_NOWLINK; - if (!bitset(DBS_GROUPWRITABLEALIASFILE, DontBlameSendmail)) - sff |= SFF_NOGWFILES; - if (!bitset(DBS_WORLDWRITABLEALIASFILE, DontBlameSendmail)) - sff |= SFF_NOWWFILES; - - /* try to lock the source file */ - if ((af = safefopen(map->map_file, O_RDWR, 0, sff)) == NULL) - { - struct stat stb; - - if ((errno != EACCES && errno != EROFS) || automatic || - (af = safefopen(map->map_file, O_RDONLY, 0, sff)) == NULL) - { - int saveerr = errno; - - if (tTd(27, 1)) - printf("Can't open %s: %s\n", - map->map_file, errstring(saveerr)); - if (!automatic && !bitset(MF_OPTIONAL, map->map_mflags)) - message("newaliases: cannot open %s: %s", - map->map_file, errstring(saveerr)); - errno = 0; - return FALSE; - } - nolock = TRUE; - if (tTd(27, 1) || - fstat(fileno(af), &stb) < 0 || - bitset(S_IWUSR|S_IWGRP|S_IWOTH, stb.st_mode)) - message("warning: cannot lock %s: %s", - map->map_file, errstring(errno)); - } - - /* see if someone else is rebuilding the alias file */ - if (!nolock && - !lockfile(fileno(af), map->map_file, NULL, LOCK_EX|LOCK_NB)) - { - /* yes, they are -- wait until done */ - message("Alias file %s is locked (maybe being rebuilt)", - map->map_file); - if (OpMode != MD_INITALIAS) - { - /* wait for other rebuild to complete */ - (void) lockfile(fileno(af), map->map_file, NULL, - LOCK_EX); - } - (void) xfclose(af, "rebuildaliases1", map->map_file); - errno = 0; - return FALSE; - } - - oldsigint = setsignal(SIGINT, SIG_IGN); - oldsigquit = setsignal(SIGQUIT, SIG_IGN); -#ifdef SIGTSTP - oldsigtstp = setsignal(SIGTSTP, SIG_IGN); -#endif - - if (map->map_class->map_open(map, O_RDWR)) - { - if (LogLevel > 7) - { - sm_syslog(LOG_NOTICE, NOQID, - "alias database %s %srebuilt by %s", - map->map_file, automatic ? "auto" : "", - username()); - } - map->map_mflags |= MF_OPEN|MF_WRITABLE; - map->map_pid = getpid(); - readaliases(map, af, !automatic, TRUE); - success = TRUE; - } - else - { - if (tTd(27, 1)) - printf("Can't create database for %s: %s\n", - map->map_file, errstring(errno)); - if (!automatic) - syserr("Cannot create database for alias file %s", - map->map_file); - } - - /* close the file, thus releasing locks */ - xfclose(af, "rebuildaliases2", map->map_file); - - /* add distinguished entries and close the database */ - if (bitset(MF_OPEN, map->map_mflags)) - { - map->map_class->map_close(map); - map->map_mflags &= ~(MF_OPEN|MF_WRITABLE); - } - - /* restore the old signals */ - (void) setsignal(SIGINT, oldsigint); - (void) setsignal(SIGQUIT, oldsigquit); -#ifdef SIGTSTP - (void) setsignal(SIGTSTP, oldsigtstp); -#endif - return success; -} -/* -** READALIASES -- read and process the alias file. -** -** This routine implements the part of initaliases that occurs -** when we are not going to use the DBM stuff. -** -** Parameters: -** map -- the alias database descriptor. -** af -- file to read the aliases from. -** announcestats -- anounce statistics regarding number of -** aliases, longest alias, etc. -** logstats -- lot the same info. -** -** Returns: -** none. -** -** Side Effects: -** Reads aliasfile into the symbol table. -** Optionally, builds the .dir & .pag files. -*/ - -void -readaliases(map, af, announcestats, logstats) - register MAP *map; - FILE *af; - bool announcestats; - bool logstats; -{ - register char *p; - char *rhs; - bool skipping; - long naliases, bytes, longest; - ADDRESS al, bl; - char line[BUFSIZ]; - - /* - ** Read and interpret lines - */ - - FileName = map->map_file; - LineNumber = 0; - naliases = bytes = longest = 0; - skipping = FALSE; - while (fgets(line, sizeof (line), af) != NULL) - { - int lhssize, rhssize; - int c; - - LineNumber++; - p = strchr(line, '\n'); -#if _FFR_BACKSLASH_IN_ALIASES - while (p != NULL && p > line && p[-1] == '\\') - { - p--; - if (fgets(p, SPACELEFT(line, p), af) == NULL) - break; - LineNumber++; - p = strchr(p, '\n'); - } -#endif - if (p != NULL) - *p = '\0'; - else if (!feof(af)) - { - syserr("554 alias line too long"); - - /* flush to end of line */ - while ((c = getc(af)) != EOF && c != '\n') - continue; - - /* skip any continuation lines */ - skipping = TRUE; - continue; - } - switch (line[0]) - { - case '#': - case '\0': - skipping = FALSE; - continue; - - case ' ': - case '\t': - if (!skipping) - syserr("554 Non-continuation line starts with space"); - skipping = TRUE; - continue; - } - skipping = FALSE; - - /* - ** Process the LHS - ** Find the colon separator, and parse the address. - ** It should resolve to a local name -- this will - ** be checked later (we want to optionally do - ** parsing of the RHS first to maximize error - ** detection). - */ - - for (p = line; *p != '\0' && *p != ':' && *p != '\n'; p++) - continue; - if (*p++ != ':') - { - syserr("554 missing colon"); - continue; - } - if (parseaddr(line, &al, RF_COPYALL, ':', NULL, CurEnv) == NULL) - { - syserr("554 %.40s... illegal alias name", line); - continue; - } - - /* - ** Process the RHS. - ** 'al' is the internal form of the LHS address. - ** 'p' points to the text of the RHS. - */ - - while (isascii(*p) && isspace(*p)) - p++; - rhs = p; - for (;;) - { - register char *nlp; - - nlp = &p[strlen(p)]; - if (nlp[-1] == '\n') - *--nlp = '\0'; - - if (CheckAliases) - { - /* do parsing & compression of addresses */ - while (*p != '\0') - { - auto char *delimptr; - - while ((isascii(*p) && isspace(*p)) || - *p == ',') - p++; - if (*p == '\0') - break; - if (parseaddr(p, &bl, RF_COPYNONE, ',', - &delimptr, CurEnv) == NULL) - usrerr("553 %s... bad address", p); - p = delimptr; - } - } - else - { - p = nlp; - } - - /* see if there should be a continuation line */ - c = getc(af); - if (!feof(af)) - (void) ungetc(c, af); - if (c != ' ' && c != '\t') - break; - - /* read continuation line */ - if (fgets(p, sizeof line - (p - line), af) == NULL) - break; - LineNumber++; - - /* check for line overflow */ - if (strchr(p, '\n') == NULL && !feof(af)) - { - usrerr("554 alias too long"); - while ((c = fgetc(af)) != EOF && c != '\n') - continue; - skipping = TRUE; - break; - } - } - - if (skipping) - continue; - - if (!bitnset(M_ALIASABLE, al.q_mailer->m_flags)) - { - syserr("554 %s... cannot alias non-local names", - al.q_paddr); - continue; - } - - /* - ** Insert alias into symbol table or database file. - ** - ** Special case pOStmaStER -- always make it lower case. - */ - - if (strcasecmp(al.q_user, "postmaster") == 0) - makelower(al.q_user); - - lhssize = strlen(al.q_user); - rhssize = strlen(rhs); - map->map_class->map_store(map, al.q_user, rhs); - - if (al.q_paddr != NULL) - free(al.q_paddr); - if (al.q_host != NULL) - free(al.q_host); - if (al.q_user != NULL) - free(al.q_user); - - /* statistics */ - naliases++; - bytes += lhssize + rhssize; - if (rhssize > longest) - longest = rhssize; - } - - CurEnv->e_to = NULL; - FileName = NULL; - if (Verbose || announcestats) - message("%s: %d aliases, longest %d bytes, %d bytes total", - map->map_file, naliases, longest, bytes); - if (LogLevel > 7 && logstats) - sm_syslog(LOG_INFO, NOQID, - "%s: %d aliases, longest %d bytes, %d bytes total", - map->map_file, naliases, longest, bytes); -} -/* -** FORWARD -- Try to forward mail -** -** This is similar but not identical to aliasing. -** -** Parameters: -** user -- the name of the user who's mail we would like -** to forward to. It must have been verified -- -** i.e., the q_home field must have been filled -** in. -** sendq -- a pointer to the head of the send queue to -** put this user's aliases in. -** aliaslevel -- the current alias nesting depth. -** e -- the current envelope. -** -** Returns: -** none. -** -** Side Effects: -** New names are added to send queues. -*/ - -void -forward(user, sendq, aliaslevel, e) - ADDRESS *user; - ADDRESS **sendq; - int aliaslevel; - register ENVELOPE *e; -{ - char *pp; - char *ep; - bool got_transient; - - if (tTd(27, 1)) - printf("forward(%s)\n", user->q_paddr); - - if (!bitnset(M_HASPWENT, user->q_mailer->m_flags) || - bitset(QBADADDR, user->q_flags)) - return; - if (user->q_home == NULL) - { - syserr("554 forward: no home"); - user->q_home = "/no/such/directory"; - } - - /* good address -- look for .forward file in home */ - define('z', user->q_home, e); - define('u', user->q_user, e); - define('h', user->q_host, e); - if (ForwardPath == NULL) - ForwardPath = newstr("\201z/.forward"); - - got_transient = FALSE; - for (pp = ForwardPath; pp != NULL; pp = ep) - { - int err; - char buf[MAXPATHLEN+1]; - - ep = strchr(pp, ':'); - if (ep != NULL) - *ep = '\0'; - expand(pp, buf, sizeof buf, e); - if (ep != NULL) - *ep++ = ':'; - if (buf[0] == '\0') - continue; - if (tTd(27, 3)) - printf("forward: trying %s\n", buf); - - err = include(buf, TRUE, user, sendq, aliaslevel, e); - if (err == 0) - break; - else if (transienterror(err)) - { - /* we may have to suspend this message */ - got_transient = TRUE; - if (tTd(27, 2)) - printf("forward: transient error on %s\n", buf); - if (LogLevel > 2) - sm_syslog(LOG_ERR, e->e_id, - "forward %s: transient error: %s", - buf, errstring(err)); - } - else - { - switch (err) - { - case ENOENT: - break; - -#if _FFR_FORWARD_SYSERR - case E_SM_NOSLINK: - case E_SM_NOHLINK: - case E_SM_REGONLY: - case E_SM_ISEXEC: - case E_SM_WWDIR: - case E_SM_GWDIR: - case E_SM_WWFILE: - case E_SM_GWFILE: - syserr("forward: %s: %s", buf, errstring(err)); - break; -#endif - - default: - if (LogLevel > (RunAsUid == 0 ? 2 : 10)) - sm_syslog(LOG_WARNING, e->e_id, - "forward %s: %s", buf, - errstring(err)); - if (Verbose) - message("forward: %s: %s", - buf, - errstring(err)); - break; - } - } - } - if (pp == NULL && got_transient) - { - /* - ** There was no successful .forward open and at least one - ** transient open. We have to defer this address for - ** further delivery. - */ - - message("transient .forward open error: message queued"); - user->q_flags |= QQUEUEUP; - return; - } -} diff --git a/src/aliases b/src/aliases deleted file mode 100644 index 7540eea..0000000 --- a/src/aliases +++ /dev/null @@ -1,53 +0,0 @@ -# -# @(#)aliases 8.2 (Berkeley) 3/5/94 -# -# Aliases in this file will NOT be expanded in the header from -# Mail, but WILL be visible over networks or from /bin/mail. -# -# >>>>>>>>>> The program "newaliases" must be run after -# >> NOTE >> this file is updated for any changes to -# >>>>>>>>>> show through to sendmail. -# - -# Basic system aliases -- these MUST be present. -MAILER-DAEMON: postmaster -postmaster: root - -# General redirections for pseudo accounts. -bin: root -daemon: root -games: root -ingres: root -nobody: root -system: root -toor: root -uucp: root - -# Well-known aliases. -manager: root -dumper: root -operator: root - -# trap decode to catch security attacks -decode: root - -# OFFICIAL CSRG/BUG ADDRESSES - -# Ftp maintainer. -ftp: ftp-bugs -ftp-bugs: bigbug@cs.berkeley.edu - -# Distribution office. -bsd-dist: bsd-dist@cs.berkeley.edu - -# Fortune maintainer. -fortune: fortune@cs.berkeley.edu - -# Termcap maintainer. -termcap: termcap@cs.berkeley.edu - -# General bug address. -ucb-fixes: bigbug@cs.berkeley.edu -ucb-fixes-request: bigbug@cs.berkeley.edu -bugs: bugs@cs.berkeley.edu -# END OFFICIAL BUG ADDRESSES diff --git a/src/aliases.0 b/src/aliases.0 deleted file mode 100644 index 1163f42..0000000 --- a/src/aliases.0 +++ /dev/null @@ -1,48 +0,0 @@ -ALIASES(5) BSD Programmer's Manual ALIASES(5) - -NNAAMMEE - aalliiaasseess - aliases file for sendmail - -SSYYNNOOPPSSIISS - aalliiaasseess - -DDEESSCCRRIIPPTTIIOONN - This file describes user ID aliases used by _/_u_s_r_/_s_b_i_n_/_s_e_n_d_m_a_i_l. The file - resides in _/_e_t_c and is formatted as a series of lines of the form - - name: name_1, name2, name_3, . . . - - The _n_a_m_e is the name to alias, and the _n_a_m_e___n are the aliases for that - name. Lines beginning with white space are continuation lines. Lines - beginning with `#' are comments. - - Aliasing occurs only on local names. Loops can not occur, since no mes- - sage will be sent to any person more than once. - - After aliasing has been done, local and valid recipients who have a - ``_._f_o_r_w_a_r_d'' file in their home directory have messages forwarded to the - list of users defined in that file. - - This is only the raw data file; the actual aliasing information is placed - into a binary format in the file _/_e_t_c_/_a_l_i_a_s_e_s_._d_b using the program - newaliases(1). A newaliases command should be executed each time the - aliases file is changed for the change to take effect. - -SSEEEE AALLSSOO - newaliases(1), dbopen(3), dbm(3), sendmail(8) - - _S_E_N_D_M_A_I_L _I_n_s_t_a_l_l_a_t_i_o_n _a_n_d _O_p_e_r_a_t_i_o_n _G_u_i_d_e. - - _S_E_N_D_M_A_I_L _A_n _I_n_t_e_r_n_e_t_w_o_r_k _M_a_i_l _R_o_u_t_e_r. - -BBUUGGSS - If you have compiled sendmail with DBM support instead of NEWDB, you may - have encountered problems in dbm(3) restricting a single alias to about - 1000 bytes of information. You can get longer aliases by ``chaining''; - that is, make the last name in the alias be a dummy name which is a con- - tinuation alias. - -HHIISSTTOORRYY - The aalliiaasseess file format appeared in 4.0BSD. - -4th Berkeley Distribution May 19, 1998 1 diff --git a/src/aliases.5 b/src/aliases.5 deleted file mode 100644 index bf45838..0000000 --- a/src/aliases.5 +++ /dev/null @@ -1,85 +0,0 @@ -.\" Copyright (c) 1998 Sendmail, Inc. All rights reserved. -.\" Copyright (c) 1983, 1997 Eric P. Allman. All rights reserved. -.\" Copyright (c) 1985, 1991, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" By using this file, you agree to the terms and conditions set -.\" forth in the LICENSE file which can be found at the top level of -.\" the sendmail distribution. -.\" -.\" -.\" @(#)aliases.5 8.8 (Berkeley) 5/19/1998 -.\" -.Dd May 19, 1998 -.Dt ALIASES 5 -.Os BSD 4 -.Sh NAME -.Nm aliases -.Nd aliases file for sendmail -.Sh SYNOPSIS -.Nm aliases -.Sh DESCRIPTION -This file describes user -.Tn ID -aliases used by -.Pa /usr/sbin/sendmail . -The file resides in -.Pa /etc -and -is formatted as a series of lines of the form -.Bd -filled -offset indent -name: name_1, name2, name_3, . . . -.Ed -.Pp -The -.Em name -is the name to alias, and the -.Em name_n -are the aliases for that name. -Lines beginning with white space are continuation lines. -Lines beginning with -.Ql # -are comments. -.Pp -Aliasing occurs only on local names. -Loops can not occur, since no message will be sent to any person more than once. -.Pp -After aliasing has been done, local and valid recipients who have a -.Dq Pa .forward -file in their home directory have messages forwarded to the -list of users defined in that file. -.Pp -This is only the raw data file; the actual aliasing information is -placed into a binary format in the file -.Pa /etc/aliases.db -using the program -.Xr newaliases 1 . -A -.Xr newaliases -command should be executed each time the aliases file is changed for the -change to take effect. -.Sh SEE ALSO -.Xr newaliases 1 , -.Xr dbopen 3 , -.Xr dbm 3 , -.Xr sendmail 8 -.Rs -.%T "SENDMAIL Installation and Operation Guide" -.Re -.Rs -.%T "SENDMAIL An Internetwork Mail Router" -.Re -.Sh BUGS -If you have compiled -.Xr sendmail -with DBM support instead of NEWDB, -you may have encountered problems in -.Xr dbm 3 -restricting a single alias to about 1000 bytes of information. -You can get longer aliases by ``chaining''; that is, make the last name in -the alias be a dummy name which is a continuation alias. -.Sh HISTORY -The -.Nm -file format appeared in -.Bx 4.0 . diff --git a/src/arpadate.c b/src/arpadate.c deleted file mode 100644 index c02decd..0000000 --- a/src/arpadate.c +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)arpadate.c 8.14 (Berkeley) 2/2/1999"; -#endif /* not lint */ - -# include "sendmail.h" - -/* -** ARPADATE -- Create date in ARPANET format -** -** Parameters: -** ud -- unix style date string. if NULL, one is created. -** -** Returns: -** pointer to an ARPANET date field -** -** Side Effects: -** none -** -** WARNING: -** date is stored in a local buffer -- subsequent -** calls will overwrite. -** -** Bugs: -** Timezone is computed from local time, rather than -** from whereever (and whenever) the message was sent. -** To do better is very hard. -** -** Some sites are now inserting the timezone into the -** local date. This routine should figure out what -** the format is and work appropriately. -*/ - -#ifndef TZNAME_MAX -# define TZNAME_MAX 50 /* max size of timezone */ -#endif - -/* values for TZ_TYPE */ -#define TZ_NONE 0 /* no character timezone support */ -#define TZ_TM_NAME 1 /* use tm->tm_name */ -#define TZ_TM_ZONE 2 /* use tm->tm_zone */ -#define TZ_TZNAME 3 /* use tzname[] */ -#define TZ_TIMEZONE 4 /* use timezone() */ - -char * -arpadate(ud) - register char *ud; -{ - register char *p; - register char *q; - register int off; - register int i; - register struct tm *lt; - time_t t; - struct tm gmt; - char *tz; - static char b[43 + TZNAME_MAX]; - - /* - ** Get current time. - ** This will be used if a null argument is passed and - ** to resolve the timezone. - */ - - t = curtime(); - if (ud == NULL) - ud = ctime(&t); - - /* - ** Crack the UNIX date line in a singularly unoriginal way. - */ - - q = b; - - p = &ud[0]; /* Mon */ - *q++ = *p++; - *q++ = *p++; - *q++ = *p++; - *q++ = ','; - *q++ = ' '; - - p = &ud[8]; /* 16 */ - if (*p == ' ') - p++; - else - *q++ = *p++; - *q++ = *p++; - *q++ = ' '; - - p = &ud[4]; /* Sep */ - *q++ = *p++; - *q++ = *p++; - *q++ = *p++; - *q++ = ' '; - - p = &ud[20]; /* 1979 */ - *q++ = *p++; - *q++ = *p++; - *q++ = *p++; - *q++ = *p++; - *q++ = ' '; - - p = &ud[11]; /* 01:03:52 */ - for (i = 8; i > 0; i--) - *q++ = *p++; - - /* - * should really get the timezone from the time in "ud" (which - * is only different if a non-null arg was passed which is different - * from the current time), but for all practical purposes, returning - * the current local zone will do (its all that is ever needed). - */ - gmt = *gmtime(&t); - lt = localtime(&t); - - off = (lt->tm_hour - gmt.tm_hour) * 60 + lt->tm_min - gmt.tm_min; - - /* assume that offset isn't more than a day ... */ - if (lt->tm_year < gmt.tm_year) - off -= 24 * 60; - else if (lt->tm_year > gmt.tm_year) - off += 24 * 60; - else if (lt->tm_yday < gmt.tm_yday) - off -= 24 * 60; - else if (lt->tm_yday > gmt.tm_yday) - off += 24 * 60; - - *q++ = ' '; - if (off == 0) - { - *q++ = 'G'; - *q++ = 'M'; - *q++ = 'T'; - } - else - { - tz = NULL; -#if TZ_TYPE == TZ_TM_NAME - tz = lt->tm_name; -#endif -#if TZ_TYPE == TZ_TM_ZONE - tz = lt->tm_zone; -#endif -#if TZ_TYPE == TZ_TZNAME - { - extern char *tzname[]; - - if (lt->tm_isdst > 0) - tz = tzname[1]; - else if (lt->tm_isdst == 0) - tz = tzname[0]; - else - tz = NULL; - } -#endif -#if TZ_TYPE == TZ_TIMEZONE - { - extern char *timezone(); - - tz = timezone(off, lt->tm_isdst); - } -#endif - if (off < 0) - { - off = -off; - *q++ = '-'; - } - else - *q++ = '+'; - - if (off >= 24*60) /* should be impossible */ - off = 23*60+59; /* if not, insert silly value */ - - *q++ = (off / 600) + '0'; - *q++ = (off / 60) % 10 + '0'; - off %= 60; - *q++ = (off / 10) + '0'; - *q++ = (off % 10) + '0'; - if (tz != NULL && *tz != '\0') - { - *q++ = ' '; - *q++ = '('; - while (*tz != '\0' && q < &b[sizeof b - 3]) - *q++ = *tz++; - *q++ = ')'; - } - } - *q = '\0'; - - return (b); -} diff --git a/src/cdefs.h b/src/cdefs.h deleted file mode 100644 index e586cbf..0000000 --- a/src/cdefs.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Berkeley Software Design, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)cdefs.h 8.8 (Berkeley) 1/9/95 - */ - -#ifndef _CDEFS_H_ -#define _CDEFS_H_ - -#if defined(__cplusplus) -#define __BEGIN_DECLS extern "C" { -#define __END_DECLS }; -#else -#define __BEGIN_DECLS -#define __END_DECLS -#endif - -/* - * The __CONCAT macro is used to concatenate parts of symbol names, e.g. - * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo. - * The __CONCAT macro is a bit tricky -- make sure you don't put spaces - * in between its arguments. __CONCAT can also concatenate double-quoted - * strings produced by the __STRING macro, but this only works with ANSI C. - */ -#if defined(__STDC__) || defined(__cplusplus) -#define __P(protos) protos /* full-blown ANSI C */ -#define __CONCAT(x,y) x ## y -#define __STRING(x) #x - -#define __const const /* define reserved names to standard */ -#define __signed signed -#define __volatile volatile -#if defined(__cplusplus) -#define __inline inline /* convert to C++ keyword */ -#else -#ifndef __GNUC__ -#define __inline /* delete GCC keyword */ -#endif /* !__GNUC__ */ -#endif /* !__cplusplus */ - -#else /* !(__STDC__ || __cplusplus) */ -#define __P(protos) () /* traditional C preprocessor */ -#define __CONCAT(x,y) x/**/y -#define __STRING(x) "x" - -#ifndef __GNUC__ -#define __const /* delete pseudo-ANSI C keywords */ -#define __inline -#define __signed -#define __volatile -/* - * In non-ANSI C environments, new programs will want ANSI-only C keywords - * deleted from the program and old programs will want them left alone. - * When using a compiler other than gcc, programs using the ANSI C keywords - * const, inline etc. as normal identifiers should define -DNO_ANSI_KEYWORDS. - * When using "gcc -traditional", we assume that this is the intent; if - * __GNUC__ is defined but __STDC__ is not, we leave the new keywords alone. - */ -#ifndef NO_ANSI_KEYWORDS -#define const /* delete ANSI C keywords */ -#define inline -#define signed -#define volatile -#endif -#endif /* !__GNUC__ */ -#endif /* !(__STDC__ || __cplusplus) */ - -/* - * GCC1 and some versions of GCC2 declare dead (non-returning) and - * pure (no side effects) functions using "volatile" and "const"; - * unfortunately, these then cause warnings under "-ansi -pedantic". - * GCC2 uses a new, peculiar __attribute__((attrs)) style. All of - * these work for GNU C++ (modulo a slight glitch in the C++ grammar - * in the distribution version of 2.5.5). - */ -#if !defined(__GNUC__) || __GNUC__ < 2 || \ - (__GNUC__ == 2 && __GNUC_MINOR__ < 5) -#define __attribute__(x) /* delete __attribute__ if non-gcc or gcc1 */ -#if defined(__GNUC__) && !defined(__STRICT_ANSI__) -#define __dead __volatile -#define __pure __const -#endif -#endif - -/* Delete pseudo-keywords wherever they are not available or needed. */ -#ifndef __dead -#define __dead -#define __pure -#endif - -#endif /* !_CDEFS_H_ */ diff --git a/src/clock.c b/src/clock.c deleted file mode 100644 index e6466e6..0000000 --- a/src/clock.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)clock.c 8.35 (Berkeley) 2/2/1999"; -#endif /* not lint */ - -# include "sendmail.h" - -# ifndef sigmask -# define sigmask(s) (1 << ((s) - 1)) -# endif - -/* -** SETEVENT -- set an event to happen at a specific time. -** -** Events are stored in a sorted list for fast processing. -** An event only applies to the process that set it. -** -** Parameters: -** intvl -- intvl until next event occurs. -** func -- function to call on event. -** arg -- argument to func on event. -** -** Returns: -** none. -** -** Side Effects: -** none. -*/ - -EVENT *FreeEventList; /* list of free events */ - -static SIGFUNC_DECL tick __P((int)); - -EVENT * -setevent(intvl, func, arg) - time_t intvl; - void (*func)(); - int arg; -{ - register EVENT **evp; - register EVENT *ev; - auto time_t now; - int wasblocked; - - if (intvl <= 0) - { - syserr("554 setevent: intvl=%ld\n", intvl); - return (NULL); - } - - wasblocked = blocksignal(SIGALRM); - now = curtime(); - - /* search event queue for correct position */ - for (evp = &EventQueue; (ev = *evp) != NULL; evp = &ev->ev_link) - { - if (ev->ev_time >= now + intvl) - break; - } - - /* insert new event */ - ev = FreeEventList; - if (ev == NULL) - ev = (EVENT *) xalloc(sizeof *ev); - else - FreeEventList = ev->ev_link; - ev->ev_time = now + intvl; - ev->ev_func = func; - ev->ev_arg = arg; - ev->ev_pid = getpid(); - ev->ev_link = *evp; - *evp = ev; - - if (tTd(5, 5)) - printf("setevent: intvl=%ld, for=%ld, func=%lx, arg=%d, ev=%lx\n", - (long) intvl, (long)(now + intvl), (u_long) func, - arg, (u_long) ev); - - setsignal(SIGALRM, tick); - intvl = EventQueue->ev_time - now; - (void) alarm((unsigned) intvl < 1 ? 1 : intvl); - if (wasblocked == 0) - (void) releasesignal(SIGALRM); - return (ev); -} -/* -** CLREVENT -- remove an event from the event queue. -** -** Parameters: -** ev -- pointer to event to remove. -** -** Returns: -** none. -** -** Side Effects: -** arranges for event ev to not happen. -*/ - -void -clrevent(ev) - register EVENT *ev; -{ - register EVENT **evp; - int wasblocked; - - if (tTd(5, 5)) - printf("clrevent: ev=%lx\n", (u_long) ev); - if (ev == NULL) - return; - - /* find the parent event */ - wasblocked = blocksignal(SIGALRM); - for (evp = &EventQueue; *evp != NULL; evp = &(*evp)->ev_link) - { - if (*evp == ev) - break; - } - - /* now remove it */ - if (*evp != NULL) - { - *evp = ev->ev_link; - ev->ev_link = FreeEventList; - FreeEventList = ev; - } - - /* restore clocks and pick up anything spare */ - if (wasblocked == 0) - releasesignal(SIGALRM); - if (EventQueue != NULL) - kill(getpid(), SIGALRM); -} -/* -** TICK -- take a clock tick -** -** Called by the alarm clock. This routine runs events as needed. -** Always called as a signal handler, so we assume that SIGALRM -** has been blocked. -** -** Parameters: -** One that is ignored; for compatibility with signal handlers. -** -** Returns: -** none. -** -** Side Effects: -** calls the next function in EventQueue. -*/ - -/* ARGSUSED */ -static SIGFUNC_DECL -tick(sig) - int sig; -{ - register time_t now; - register EVENT *ev; - int mypid = getpid(); - int olderrno = errno; - - (void) alarm(0); - now = curtime(); - - if (tTd(5, 4)) - printf("tick: now=%ld\n", (long) now); - - /* reset signal in case System V semantics */ - (void) setsignal(SIGALRM, tick); - while ((ev = EventQueue) != NULL && - (ev->ev_time <= now || ev->ev_pid != mypid)) - { - void (*f)(); - int arg; - int pid; - - /* process the event on the top of the queue */ - ev = EventQueue; - EventQueue = EventQueue->ev_link; - if (tTd(5, 6)) - printf("tick: ev=%lx, func=%lx, arg=%d, pid=%d\n", - (u_long) ev, (u_long) ev->ev_func, - ev->ev_arg, ev->ev_pid); - - /* we must be careful in here because ev_func may not return */ - f = ev->ev_func; - arg = ev->ev_arg; - pid = ev->ev_pid; - ev->ev_link = FreeEventList; - FreeEventList = ev; - if (pid != getpid()) - continue; - if (EventQueue != NULL) - { - if (EventQueue->ev_time > now) - (void) alarm((unsigned) (EventQueue->ev_time - now)); - else - (void) alarm(3); - } - - /* call ev_func */ - errno = olderrno; - (*f)(arg); - (void) alarm(0); - now = curtime(); - } - if (EventQueue != NULL) - (void) alarm((unsigned) (EventQueue->ev_time - now)); - errno = olderrno; - return SIGFUNC_RETURN; -} -/* -** SLEEP -- a version of sleep that works with this stuff -** -** Because sleep uses the alarm facility, I must reimplement -** it here. -** -** Parameters: -** intvl -- time to sleep. -** -** Returns: -** none. -** -** Side Effects: -** waits for intvl time. However, other events can -** be run during that interval. -*/ - -static bool SleepDone; -static void endsleep __P((void)); - -#ifndef SLEEP_T -# define SLEEP_T unsigned int -#endif - -SLEEP_T -sleep(intvl) - unsigned int intvl; -{ - int was_held; - - if (intvl == 0) - return (SLEEP_T) 0; - SleepDone = FALSE; - (void) setevent((time_t) intvl, endsleep, 0); - was_held = releasesignal(SIGALRM); - while (!SleepDone) - pause(); - if (was_held > 0) - blocksignal(SIGALRM); - return (SLEEP_T) 0; -} - -static void -endsleep() -{ - SleepDone = TRUE; -} diff --git a/src/collect.c b/src/collect.c deleted file mode 100644 index a8916b1..0000000 --- a/src/collect.c +++ /dev/null @@ -1,772 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)collect.c 8.93 (Berkeley) 1/26/1999"; -#endif /* not lint */ - -# include <errno.h> -# include "sendmail.h" - -/* -** COLLECT -- read & parse message header & make temp file. -** -** Creates a temporary file name and copies the standard -** input to that file. Leading UNIX-style "From" lines are -** stripped off (after important information is extracted). -** -** Parameters: -** fp -- file to read. -** smtpmode -- if set, we are running SMTP: give an RFC821 -** style message to say we are ready to collect -** input, and never ignore a single dot to mean -** end of message. -** hdrp -- the location to stash the header. -** e -- the current envelope. -** -** Returns: -** none. -** -** Side Effects: -** Temp file is created and filled. -** The from person may be set. -*/ - -static jmp_buf CtxCollectTimeout; -static void collecttimeout __P((time_t)); -static bool CollectProgress; -static EVENT *CollectTimeout; - -/* values for input state machine */ -#define IS_NORM 0 /* middle of line */ -#define IS_BOL 1 /* beginning of line */ -#define IS_DOT 2 /* read a dot at beginning of line */ -#define IS_DOTCR 3 /* read ".\r" at beginning of line */ -#define IS_CR 4 /* read a carriage return */ - -/* values for message state machine */ -#define MS_UFROM 0 /* reading Unix from line */ -#define MS_HEADER 1 /* reading message header */ -#define MS_BODY 2 /* reading message body */ -#define MS_DISCARD 3 /* discarding rest of message */ - -void -collect(fp, smtpmode, hdrp, e) - FILE *fp; - bool smtpmode; - HDR **hdrp; - register ENVELOPE *e; -{ - register FILE *volatile tf; - volatile bool ignrdot = smtpmode ? FALSE : IgnrDot; - volatile time_t dbto = smtpmode ? TimeOuts.to_datablock : 0; - register char *volatile bp; - volatile int c = EOF; - volatile bool inputerr = FALSE; - bool headeronly; - char *volatile buf; - volatile int buflen; - volatile int istate; - volatile int mstate; - u_char *volatile pbp; - int hdrslen = 0; - u_char peekbuf[8]; - char dfname[MAXQFNAME]; - char bufbuf[MAXLINE]; - extern bool isheader __P((char *)); - extern void tferror __P((FILE *volatile, ENVELOPE *)); - - headeronly = hdrp != NULL; - - /* - ** Create the temp file name and create the file. - */ - - if (!headeronly) - { - int tfd; - struct stat stbuf; - - strcpy(dfname, queuename(e, 'd')); - tfd = dfopen(dfname, O_WRONLY|O_CREAT|O_TRUNC, FileMode, SFF_ANYFILE); - if (tfd < 0 || (tf = fdopen(tfd, "w")) == NULL) - { - syserr("Cannot create %s", dfname); - e->e_flags |= EF_NO_BODY_RETN; - finis(TRUE, ExitStat); - } - if (fstat(fileno(tf), &stbuf) < 0) - e->e_dfino = -1; - else - { - e->e_dfdev = stbuf.st_dev; - e->e_dfino = stbuf.st_ino; - } - HasEightBits = FALSE; - e->e_msgsize = 0; - e->e_flags |= EF_HAS_DF; - } - - /* - ** Tell ARPANET to go ahead. - */ - - if (smtpmode) - message("354 Enter mail, end with \".\" on a line by itself"); - - if (tTd(30, 2)) - printf("collect\n"); - - /* - ** Read the message. - ** - ** This is done using two interleaved state machines. - ** The input state machine is looking for things like - ** hidden dots; the message state machine is handling - ** the larger picture (e.g., header versus body). - */ - - buf = bp = bufbuf; - buflen = sizeof bufbuf; - pbp = peekbuf; - istate = IS_BOL; - mstate = SaveFrom ? MS_HEADER : MS_UFROM; - CollectProgress = FALSE; - - if (dbto != 0) - { - /* handle possible input timeout */ - if (setjmp(CtxCollectTimeout) != 0) - { - if (LogLevel > 2) - sm_syslog(LOG_NOTICE, e->e_id, - "timeout waiting for input from %s during message collect", - CurHostName ? CurHostName : "<local machine>"); - errno = 0; - usrerr("451 timeout waiting for input during message collect"); - goto readerr; - } - CollectTimeout = setevent(dbto, collecttimeout, dbto); - } - - for (;;) - { - if (tTd(30, 35)) - printf("top, istate=%d, mstate=%d\n", istate, mstate); - for (;;) - { - if (pbp > peekbuf) - c = *--pbp; - else - { - while (!feof(fp) && !ferror(fp)) - { - errno = 0; - c = getc(fp); - if (errno != EINTR) - break; - clearerr(fp); - } - CollectProgress = TRUE; - if (TrafficLogFile != NULL && !headeronly) - { - if (istate == IS_BOL) - fprintf(TrafficLogFile, "%05d <<< ", - (int) getpid()); - if (c == EOF) - fprintf(TrafficLogFile, "[EOF]\n"); - else - putc(c, TrafficLogFile); - } - if (c == EOF) - goto readerr; - if (SevenBitInput) - c &= 0x7f; - else - HasEightBits |= bitset(0x80, c); - } - if (tTd(30, 94)) - printf("istate=%d, c=%c (0x%x)\n", - istate, c, c); - switch (istate) - { - case IS_BOL: - if (c == '.') - { - istate = IS_DOT; - continue; - } - break; - - case IS_DOT: - if (c == '\n' && !ignrdot && - !bitset(EF_NL_NOT_EOL, e->e_flags)) - goto readerr; - else if (c == '\r' && - !bitset(EF_CRLF_NOT_EOL, e->e_flags)) - { - istate = IS_DOTCR; - continue; - } - else if (c != '.' || - (OpMode != MD_SMTP && - OpMode != MD_DAEMON && - OpMode != MD_ARPAFTP)) - { - *pbp++ = c; - c = '.'; - } - break; - - case IS_DOTCR: - if (c == '\n' && !ignrdot) - goto readerr; - else - { - /* push back the ".\rx" */ - *pbp++ = c; - *pbp++ = '\r'; - c = '.'; - } - break; - - case IS_CR: - if (c == '\n') - istate = IS_BOL; - else - { - ungetc(c, fp); - c = '\r'; - istate = IS_NORM; - } - goto bufferchar; - } - - if (c == '\r' && !bitset(EF_CRLF_NOT_EOL, e->e_flags)) - { - istate = IS_CR; - continue; - } - else if (c == '\n' && !bitset(EF_NL_NOT_EOL, e->e_flags)) - istate = IS_BOL; - else - istate = IS_NORM; - -bufferchar: - if (!headeronly) - e->e_msgsize++; - switch (mstate) - { - case MS_BODY: - /* just put the character out */ - if (MaxMessageSize <= 0 || - e->e_msgsize <= MaxMessageSize) - putc(c, tf); - - /* fall through */ - - case MS_DISCARD: - continue; - } - - /* header -- buffer up */ - if (bp >= &buf[buflen - 2]) - { - char *obuf; - - if (mstate != MS_HEADER) - break; - - /* out of space for header */ - obuf = buf; - if (buflen < MEMCHUNKSIZE) - buflen *= 2; - else - buflen += MEMCHUNKSIZE; - buf = xalloc(buflen); - bcopy(obuf, buf, bp - obuf); - bp = &buf[bp - obuf]; - if (obuf != bufbuf) - free(obuf); - } - if (c >= 0200 && c <= 0237) - { -#if 0 /* causes complaints -- figure out something for 8.9 */ - usrerr("Illegal character 0x%x in header", c); -#endif - } - else if (c != '\0') - { - *bp++ = c; - if (MaxHeadersLength > 0 && - ++hdrslen > MaxHeadersLength) - { - sm_syslog(LOG_NOTICE, e->e_id, - "headers too large (%d max) from %s during message collect", - MaxHeadersLength, - CurHostName != NULL ? CurHostName : "localhost"); - errno = 0; - e->e_flags |= EF_CLRQUEUE; - e->e_status = "5.6.0"; - usrerr("552 Headers too large (%d max)", - MaxHeadersLength); - mstate = MS_DISCARD; - } - } - if (istate == IS_BOL) - break; - } - *bp = '\0'; - -nextstate: - if (tTd(30, 35)) - printf("nextstate, istate=%d, mstate=%d, line = \"%s\"\n", - istate, mstate, buf); - switch (mstate) - { - case MS_UFROM: - mstate = MS_HEADER; -#ifndef NOTUNIX - if (strncmp(buf, "From ", 5) == 0) - { - extern void eatfrom __P((char *volatile, ENVELOPE *)); - - bp = buf; - eatfrom(buf, e); - continue; - } -#endif - /* fall through */ - - case MS_HEADER: - if (!isheader(buf)) - { - mstate = MS_BODY; - goto nextstate; - } - - /* check for possible continuation line */ - do - { - clearerr(fp); - errno = 0; - c = getc(fp); - } while (errno == EINTR); - if (c != EOF) - ungetc(c, fp); - if (c == ' ' || c == '\t') - { - /* yep -- defer this */ - continue; - } - - /* trim off trailing CRLF or NL */ - if (*--bp != '\n' || *--bp != '\r') - bp++; - *bp = '\0'; - - if (bitset(H_EOH, chompheader(buf, FALSE, hdrp, e))) - { - mstate = MS_BODY; - goto nextstate; - } - break; - - case MS_BODY: - if (tTd(30, 1)) - printf("EOH\n"); - if (headeronly) - goto readerr; - bp = buf; - - /* toss blank line */ - if ((!bitset(EF_CRLF_NOT_EOL, e->e_flags) && - bp[0] == '\r' && bp[1] == '\n') || - (!bitset(EF_NL_NOT_EOL, e->e_flags) && - bp[0] == '\n')) - { - break; - } - - /* if not a blank separator, write it out */ - if (MaxMessageSize <= 0 || - e->e_msgsize <= MaxMessageSize) - { - while (*bp != '\0') - putc(*bp++, tf); - } - break; - } - bp = buf; - } - -readerr: - if ((feof(fp) && smtpmode) || ferror(fp)) - { - const char *errmsg = errstring(errno); - - if (tTd(30, 1)) - printf("collect: premature EOM: %s\n", errmsg); - if (LogLevel >= 2) - sm_syslog(LOG_WARNING, e->e_id, - "collect: premature EOM: %s", errmsg); - inputerr = TRUE; - } - - /* reset global timer */ - clrevent(CollectTimeout); - - if (headeronly) - return; - - if (tf != NULL && - (fflush(tf) != 0 || ferror(tf) || - (SuperSafe && fsync(fileno(tf)) < 0) || - fclose(tf) < 0)) - { - tferror(tf, e); - flush_errors(TRUE); - finis(TRUE, ExitStat); - } - - /* An EOF when running SMTP is an error */ - if (inputerr && (OpMode == MD_SMTP || OpMode == MD_DAEMON)) - { - char *host; - char *problem; - - host = RealHostName; - if (host == NULL) - host = "localhost"; - - if (feof(fp)) - problem = "unexpected close"; - else if (ferror(fp)) - problem = "I/O error"; - else - problem = "read timeout"; - if (LogLevel > 0 && feof(fp)) - sm_syslog(LOG_NOTICE, e->e_id, - "collect: %s on connection from %.100s, sender=%s: %s", - problem, host, - shortenstring(e->e_from.q_paddr, MAXSHORTSTR), - errstring(errno)); - if (feof(fp)) - usrerr("451 collect: %s on connection from %s, from=%s", - problem, host, - shortenstring(e->e_from.q_paddr, MAXSHORTSTR)); - else - syserr("451 collect: %s on connection from %s, from=%s", - problem, host, - shortenstring(e->e_from.q_paddr, MAXSHORTSTR)); - - /* don't return an error indication */ - e->e_to = NULL; - e->e_flags &= ~EF_FATALERRS; - e->e_flags |= EF_CLRQUEUE; - - /* and don't try to deliver the partial message either */ - if (InChild) - ExitStat = EX_QUIT; - finis(TRUE, ExitStat); - } - - /* - ** Find out some information from the headers. - ** Examples are who is the from person & the date. - */ - - eatheader(e, TRUE); - - if (GrabTo && e->e_sendqueue == NULL) - usrerr("No recipient addresses found in header"); - - /* collect statistics */ - if (OpMode != MD_VERIFY) - markstats(e, (ADDRESS *) NULL, FALSE); - -#if _FFR_DSN_RRT_OPTION - /* - ** If we have a Return-Receipt-To:, turn it into a DSN. - */ - - if (RrtImpliesDsn && hvalue("return-receipt-to", e->e_header) != NULL) - { - ADDRESS *q; - - for (q = e->e_sendqueue; q != NULL; q = q->q_next) - if (!bitset(QHASNOTIFY, q->q_flags)) - q->q_flags |= QHASNOTIFY|QPINGONSUCCESS; - } -#endif - - /* - ** Add an Apparently-To: line if we have no recipient lines. - */ - - if (hvalue("to", e->e_header) != NULL || - hvalue("cc", e->e_header) != NULL || - hvalue("apparently-to", e->e_header) != NULL) - { - /* have a valid recipient header -- delete Bcc: headers */ - e->e_flags |= EF_DELETE_BCC; - } - else if (hvalue("bcc", e->e_header) == NULL) - { - /* no valid recipient headers */ - register ADDRESS *q; - char *hdr = NULL; - - /* create an Apparently-To: field */ - /* that or reject the message.... */ - switch (NoRecipientAction) - { - case NRA_ADD_APPARENTLY_TO: - hdr = "Apparently-To"; - break; - - case NRA_ADD_TO: - hdr = "To"; - break; - - case NRA_ADD_BCC: - addheader("Bcc", " ", &e->e_header); - break; - - case NRA_ADD_TO_UNDISCLOSED: - addheader("To", "undisclosed-recipients:;", &e->e_header); - break; - } - - if (hdr != NULL) - { - for (q = e->e_sendqueue; q != NULL; q = q->q_next) - { - if (q->q_alias != NULL) - continue; - if (tTd(30, 3)) - printf("Adding %s: %s\n", - hdr, q->q_paddr); - addheader(hdr, q->q_paddr, &e->e_header); - } - } - } - - /* check for message too large */ - if (MaxMessageSize > 0 && e->e_msgsize > MaxMessageSize) - { - e->e_flags |= EF_NO_BODY_RETN|EF_CLRQUEUE; - e->e_status = "5.2.3"; - usrerr("552 Message exceeds maximum fixed size (%ld)", - MaxMessageSize); - if (LogLevel > 6) - sm_syslog(LOG_NOTICE, e->e_id, - "message size (%ld) exceeds maximum (%ld)", - e->e_msgsize, MaxMessageSize); - } - - /* check for illegal 8-bit data */ - if (HasEightBits) - { - e->e_flags |= EF_HAS8BIT; - if (!bitset(MM_PASS8BIT|MM_MIME8BIT, MimeMode) && - !bitset(EF_IS_MIME, e->e_flags)) - { - e->e_status = "5.6.1"; - usrerr("554 Eight bit data not allowed"); - } - } - else - { - /* if it claimed to be 8 bits, well, it lied.... */ - if (e->e_bodytype != NULL && - strcasecmp(e->e_bodytype, "8BITMIME") == 0) - e->e_bodytype = "7BIT"; - } - - if ((e->e_dfp = fopen(dfname, "r")) == NULL) - { - /* we haven't acked receipt yet, so just chuck this */ - syserr("Cannot reopen %s", dfname); - finis(TRUE, ExitStat); - } -} - - -static void -collecttimeout(timeout) - time_t timeout; -{ - /* if no progress was made, die now */ - if (!CollectProgress) - longjmp(CtxCollectTimeout, 1); - - /* otherwise reset the timeout */ - CollectTimeout = setevent(timeout, collecttimeout, timeout); - CollectProgress = FALSE; -} -/* -** TFERROR -- signal error on writing the temporary file. -** -** Parameters: -** tf -- the file pointer for the temporary file. -** e -- the current envelope. -** -** Returns: -** none. -** -** Side Effects: -** Gives an error message. -** Arranges for following output to go elsewhere. -*/ - -void -tferror(tf, e) - FILE *volatile tf; - register ENVELOPE *e; -{ - setstat(EX_IOERR); - if (errno == ENOSPC) - { -#if STAT64 > 0 - struct stat64 st; -#else - struct stat st; -#endif - long avail; - long bsize; - extern long freediskspace __P((char *, long *)); - - e->e_flags |= EF_NO_BODY_RETN; - - if ( -#if STAT64 > 0 - fstat64(fileno(tf), &st) -#else - fstat(fileno(tf), &st) -#endif - < 0) - st.st_size = 0; - (void) freopen(queuename(e, 'd'), "w", tf); - if (st.st_size <= 0) - fprintf(tf, "\n*** Mail could not be accepted"); - else if (sizeof st.st_size > sizeof (long)) - fprintf(tf, "\n*** Mail of at least %s bytes could not be accepted\n", - quad_to_string(st.st_size)); - else - fprintf(tf, "\n*** Mail of at least %lu bytes could not be accepted\n", - (unsigned long) st.st_size); - fprintf(tf, "*** at %s due to lack of disk space for temp file.\n", - MyHostName); - avail = freediskspace(QueueDir, &bsize); - if (avail > 0) - { - if (bsize > 1024) - avail *= bsize / 1024; - else if (bsize < 1024) - avail /= 1024 / bsize; - fprintf(tf, "*** Currently, %ld kilobytes are available for mail temp files.\n", - avail); - } - e->e_status = "4.3.1"; - usrerr("452 Out of disk space for temp file"); - } - else - syserr("collect: Cannot write tf%s", e->e_id); - if (freopen("/dev/null", "w", tf) == NULL) - sm_syslog(LOG_ERR, e->e_id, - "tferror: freopen(\"/dev/null\") failed: %s", - errstring(errno)); -} -/* -** EATFROM -- chew up a UNIX style from line and process -** -** This does indeed make some assumptions about the format -** of UNIX messages. -** -** Parameters: -** fm -- the from line. -** -** Returns: -** none. -** -** Side Effects: -** extracts what information it can from the header, -** such as the date. -*/ - -# ifndef NOTUNIX - -char *DowList[] = -{ - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", NULL -}; - -char *MonthList[] = -{ - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", - NULL -}; - -void -eatfrom(fm, e) - char *volatile fm; - register ENVELOPE *e; -{ - register char *p; - register char **dt; - - if (tTd(30, 2)) - printf("eatfrom(%s)\n", fm); - - /* find the date part */ - p = fm; - while (*p != '\0') - { - /* skip a word */ - while (*p != '\0' && *p != ' ') - p++; - while (*p == ' ') - p++; - if (!(isascii(*p) && isupper(*p)) || - p[3] != ' ' || p[13] != ':' || p[16] != ':') - continue; - - /* we have a possible date */ - for (dt = DowList; *dt != NULL; dt++) - if (strncmp(*dt, p, 3) == 0) - break; - if (*dt == NULL) - continue; - - for (dt = MonthList; *dt != NULL; dt++) - if (strncmp(*dt, &p[4], 3) == 0) - break; - if (*dt != NULL) - break; - } - - if (*p != '\0') - { - char *q; - - /* we have found a date */ - q = xalloc(25); - (void) strncpy(q, p, 25); - q[24] = '\0'; - q = arpadate(q); - define('a', newstr(q), e); - } -} - -# endif /* NOTUNIX */ diff --git a/src/conf.c b/src/conf.c deleted file mode 100644 index 3cfa73b..0000000 --- a/src/conf.c +++ /dev/null @@ -1,4938 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)conf.c 8.452 (Berkeley) 1/26/1999"; -#endif /* not lint */ - -# include "sendmail.h" -# include "pathnames.h" -# include <sys/ioctl.h> -# include <sys/param.h> -# include <limits.h> - -/* -** CONF.C -- Sendmail Configuration Tables. -** -** Defines the configuration of this installation. -** -** Configuration Variables: -** HdrInfo -- a table describing well-known header fields. -** Each entry has the field name and some flags, -** which are described in sendmail.h. -** -** Notes: -** I have tried to put almost all the reasonable -** configuration information into the configuration -** file read at runtime. My intent is that anything -** here is a function of the version of UNIX you -** are running, or is really static -- for example -** the headers are a superset of widely used -** protocols. If you find yourself playing with -** this file too much, you may be making a mistake! -*/ - - -/* -** Header info table -** Final (null) entry contains the flags used for any other field. -** -** Not all of these are actually handled specially by sendmail -** at this time. They are included as placeholders, to let -** you know that "someday" I intend to have sendmail do -** something with them. -*/ - -struct hdrinfo HdrInfo[] = -{ - /* originator fields, most to least significant */ - { "resent-sender", H_FROM|H_RESENT }, - { "resent-from", H_FROM|H_RESENT }, - { "resent-reply-to", H_FROM|H_RESENT }, - { "sender", H_FROM }, - { "from", H_FROM }, - { "reply-to", H_FROM }, - { "errors-to", H_FROM|H_ERRORSTO }, - { "full-name", H_ACHECK }, - { "return-receipt-to", H_RECEIPTTO }, - - /* destination fields */ - { "to", H_RCPT }, - { "resent-to", H_RCPT|H_RESENT }, - { "cc", H_RCPT }, - { "resent-cc", H_RCPT|H_RESENT }, - { "bcc", H_RCPT|H_BCC }, - { "resent-bcc", H_RCPT|H_BCC|H_RESENT }, - { "apparently-to", H_RCPT }, - - /* message identification and control */ - { "message-id", 0 }, - { "resent-message-id", H_RESENT }, - { "message", H_EOH }, - { "text", H_EOH }, - - /* date fields */ - { "date", 0 }, - { "resent-date", H_RESENT }, - - /* trace fields */ - { "received", H_TRACE|H_FORCE }, - { "x400-received", H_TRACE|H_FORCE }, - { "via", H_TRACE|H_FORCE }, - { "mail-from", H_TRACE|H_FORCE }, - - /* miscellaneous fields */ - { "comments", H_FORCE|H_ENCODABLE }, - { "return-path", H_FORCE|H_ACHECK }, - { "content-transfer-encoding", H_CTE }, - { "content-type", H_CTYPE }, - { "content-length", H_ACHECK }, - { "subject", H_ENCODABLE }, - - { NULL, 0 } -}; - - - -/* -** Privacy values -*/ - -struct prival PrivacyValues[] = -{ - { "public", PRIV_PUBLIC }, - { "needmailhelo", PRIV_NEEDMAILHELO }, - { "needexpnhelo", PRIV_NEEDEXPNHELO }, - { "needvrfyhelo", PRIV_NEEDVRFYHELO }, - { "noexpn", PRIV_NOEXPN }, - { "novrfy", PRIV_NOVRFY }, - { "restrictmailq", PRIV_RESTRICTMAILQ }, - { "restrictqrun", PRIV_RESTRICTQRUN }, - { "noetrn", PRIV_NOETRN }, - { "noverb", PRIV_NOVERB }, - { "authwarnings", PRIV_AUTHWARNINGS }, - { "noreceipts", PRIV_NORECEIPTS }, - { "goaway", PRIV_GOAWAY }, - { NULL, 0 } -}; - -/* -** DontBlameSendmail values -*/ -struct dbsval DontBlameSendmailValues[] = -{ - { "safe", DBS_SAFE }, - { "assumesafechown", DBS_ASSUMESAFECHOWN }, - { "groupwritabledirpathsafe", DBS_GROUPWRITABLEDIRPATHSAFE }, - { "groupwritableforwardfilesafe", - DBS_GROUPWRITABLEFORWARDFILESAFE }, - { "groupwritableincludefilesafe", - DBS_GROUPWRITABLEINCLUDEFILESAFE }, - { "groupwritablealiasfile", DBS_GROUPWRITABLEALIASFILE }, - { "worldwritablealiasfile", DBS_WORLDWRITABLEALIASFILE }, - { "forwardfileinunsafedirpath", DBS_FORWARDFILEINUNSAFEDIRPATH }, - { "includefileinunsafedirpath", DBS_INCLUDEFILEINUNSAFEDIRPATH }, - { "mapinunsafedirpath", DBS_MAPINUNSAFEDIRPATH }, - { "linkedaliasfileinwritabledir", - DBS_LINKEDALIASFILEINWRITABLEDIR }, - { "linkedclassfileinwritabledir", - DBS_LINKEDCLASSFILEINWRITABLEDIR }, - { "linkedforwardfileinwritabledir", - DBS_LINKEDFORWARDFILEINWRITABLEDIR }, - { "linkedincludefileinwritabledir", - DBS_LINKEDINCLUDEFILEINWRITABLEDIR }, - { "linkedmapinwritabledir", DBS_LINKEDMAPINWRITABLEDIR }, - { "linkedserviceswitchfileinwritabledir", - DBS_LINKEDSERVICESWITCHFILEINWRITABLEDIR }, - { "filedeliverytohardlink", DBS_FILEDELIVERYTOHARDLINK }, - { "filedeliverytosymlink", DBS_FILEDELIVERYTOSYMLINK }, - { "writemaptohardlink", DBS_WRITEMAPTOHARDLINK }, - { "writemaptosymlink", DBS_WRITEMAPTOSYMLINK }, - { "writestatstohardlink", DBS_WRITESTATSTOHARDLINK }, - { "writestatstosymlink", DBS_WRITESTATSTOSYMLINK }, - { "forwardfileingroupwritabledirpath", - DBS_FORWARDFILEINGROUPWRITABLEDIRPATH }, - { "includefileingroupwritabledirpath", - DBS_INCLUDEFILEINGROUPWRITABLEDIRPATH }, - { "classfileinunsafedirpath", DBS_CLASSFILEINUNSAFEDIRPATH }, - { "errorheaderinunsafedirpath", DBS_ERRORHEADERINUNSAFEDIRPATH }, - { "helpfileinunsafedirpath", DBS_HELPFILEINUNSAFEDIRPATH }, - { "forwardfileinunsafedirpathsafe", - DBS_FORWARDFILEINUNSAFEDIRPATHSAFE }, - { "includefileinunsafedirpathsafe", - DBS_INCLUDEFILEINUNSAFEDIRPATHSAFE }, - { "runprograminunsafedirpath", DBS_RUNPROGRAMINUNSAFEDIRPATH }, - { "runwritableprogram", DBS_RUNWRITABLEPROGRAM }, - { NULL, 0 } -}; - - -/* -** Miscellaneous stuff. -*/ - -int DtableSize = 50; /* max open files; reset in 4.2bsd */ -/* -** SETDEFAULTS -- set default values -** -** Because of the way freezing is done, these must be initialized -** using direct code. -** -** Parameters: -** e -- the default envelope. -** -** Returns: -** none. -** -** Side Effects: -** Initializes a bunch of global variables to their -** default values. -*/ - -#define MINUTES * 60 -#define HOURS * 60 MINUTES -#define DAYS * 24 HOURS - -#ifndef _PATH_VARTMP -# define _PATH_VARTMP "/usr/tmp/" -#endif - -#ifndef MAXRULERECURSION -# define MAXRULERECURSION 50 /* max ruleset recursion depth */ -#endif - -void -setdefaults(e) - register ENVELOPE *e; -{ - int i; - struct passwd *pw; - char buf[MAXNAME]; - extern void setdefuser __P((void)); - extern void setupmaps __P((void)); - extern void setupmailers __P((void)); - extern void setupheaders __P((void)); - - SpaceSub = ' '; /* option B */ - QueueLA = 8; /* option x */ - RefuseLA = 12; /* option X */ - WkRecipFact = 30000L; /* option y */ - WkClassFact = 1800L; /* option z */ - WkTimeFact = 90000L; /* option Z */ - QueueFactor = WkRecipFact * 20; /* option q */ - FileMode = (RealUid != geteuid()) ? 0644 : 0600; - /* option F */ - - if (((pw = getpwnam("mailnull")) != NULL && pw->pw_uid != 0) || - ((pw = getpwnam("sendmail")) != NULL && pw->pw_uid != 0) || - ((pw = getpwnam("daemon")) != NULL && pw->pw_uid != 0)) - { - DefUid = pw->pw_uid; /* option u */ - DefGid = pw->pw_gid; /* option g */ - DefUser = newstr(pw->pw_name); - } - else - { - DefUid = 1; /* option u */ - DefGid = 1; /* option g */ - setdefuser(); - } - TrustedUid = 0; - if (tTd(37, 4)) - printf("setdefaults: DefUser=%s, DefUid=%d, DefGid=%d\n", - DefUser != NULL ? DefUser : "<1:1>", - (int) DefUid, (int) DefGid); - CheckpointInterval = 10; /* option C */ - MaxHopCount = 25; /* option h */ - e->e_sendmode = SM_FORK; /* option d */ - e->e_errormode = EM_PRINT; /* option e */ - SevenBitInput = FALSE; /* option 7 */ - MaxMciCache = 1; /* option k */ - MciCacheTimeout = 5 MINUTES; /* option K */ - LogLevel = 9; /* option L */ - inittimeouts(NULL); /* option r */ - PrivacyFlags = PRIV_PUBLIC; /* option p */ - DontBlameSendmail = DBS_SAFE; /* DontBlameSendmail option */ -#if MIME8TO7 - MimeMode = MM_CVTMIME|MM_PASS8BIT; /* option 8 */ -#else - MimeMode = MM_PASS8BIT; -#endif - for (i = 0; i < MAXTOCLASS; i++) - { - TimeOuts.to_q_return[i] = 5 DAYS; /* option T */ - TimeOuts.to_q_warning[i] = 0; /* option T */ - } - ServiceSwitchFile = "/etc/service.switch"; - ServiceCacheMaxAge = (time_t) 10; - HostsFile = _PATH_HOSTS; - PidFile = newstr(_PATH_SENDMAILPID); - MustQuoteChars = "@,;:\\()[].'"; - MciInfoTimeout = 30 MINUTES; - MaxRuleRecursion = MAXRULERECURSION; - MaxAliasRecursion = 10; - MaxMacroRecursion = 10; - ColonOkInAddr = TRUE; - DontLockReadFiles = TRUE; - DoubleBounceAddr = "postmaster"; - MaxHeadersLength = MAXHDRSLEN; - snprintf(buf, sizeof buf, "%s%sdead.letter", - _PATH_VARTMP, - _PATH_VARTMP[sizeof _PATH_VARTMP - 2] == '/' ? "" : "/"); - DeadLetterDrop = newstr(buf); -#ifdef HESIOD_INIT - HesiodContext = NULL; -#endif - ControlSocketName = NULL; - setupmaps(); - setupmailers(); - setupheaders(); -} - - -/* -** SETDEFUSER -- set/reset DefUser using DefUid (for initgroups()) -*/ - -void -setdefuser() -{ - struct passwd *defpwent; - static char defuserbuf[40]; - - DefUser = defuserbuf; - defpwent = sm_getpwuid(DefUid); - snprintf(defuserbuf, sizeof defuserbuf, "%s", - defpwent == NULL ? "nobody" : defpwent->pw_name); - if (tTd(37, 4)) - printf("setdefuser: DefUid=%d, DefUser=%s\n", - (int) DefUid, DefUser); -} -/* -** SETUPMAILERS -- initialize default mailers -*/ - -void -setupmailers() -{ - char buf[100]; - - strcpy(buf, "prog, P=/bin/sh, F=lsoDq9, T=DNS/RFC822/X-Unix, A=sh -c \201u"); - makemailer(buf); - - strcpy(buf, "*file*, P=[FILE], F=lsDFMPEouq9, T=DNS/RFC822/X-Unix, A=FILE \201u"); - makemailer(buf); - - strcpy(buf, "*include*, P=/dev/null, F=su, A=INCLUDE \201u"); - makemailer(buf); -} -/* -** SETUPMAPS -- set up map classes -*/ - -#define MAPDEF(name, ext, flags, parse, open, close, lookup, store) \ - { \ - extern bool parse __P((MAP *, char *)); \ - extern bool open __P((MAP *, int)); \ - extern void close __P((MAP *)); \ - extern char *lookup __P((MAP *, char *, char **, int *)); \ - extern void store __P((MAP *, char *, char *)); \ - s = stab(name, ST_MAPCLASS, ST_ENTER); \ - s->s_mapclass.map_cname = name; \ - s->s_mapclass.map_ext = ext; \ - s->s_mapclass.map_cflags = flags; \ - s->s_mapclass.map_parse = parse; \ - s->s_mapclass.map_open = open; \ - s->s_mapclass.map_close = close; \ - s->s_mapclass.map_lookup = lookup; \ - s->s_mapclass.map_store = store; \ - } - -void -setupmaps() -{ - register STAB *s; - -#ifdef NEWDB - MAPDEF("hash", ".db", MCF_ALIASOK|MCF_REBUILDABLE, - map_parseargs, hash_map_open, db_map_close, - db_map_lookup, db_map_store); - - MAPDEF("btree", ".db", MCF_ALIASOK|MCF_REBUILDABLE, - map_parseargs, bt_map_open, db_map_close, - db_map_lookup, db_map_store); -#endif - -#ifdef NDBM - MAPDEF("dbm", ".dir", MCF_ALIASOK|MCF_REBUILDABLE, - map_parseargs, ndbm_map_open, ndbm_map_close, - ndbm_map_lookup, ndbm_map_store); -#endif - -#ifdef NIS - MAPDEF("nis", NULL, MCF_ALIASOK, - map_parseargs, nis_map_open, null_map_close, - nis_map_lookup, null_map_store); -#endif - -#ifdef NISPLUS - MAPDEF("nisplus", NULL, MCF_ALIASOK, - map_parseargs, nisplus_map_open, null_map_close, - nisplus_map_lookup, null_map_store); -#endif -#ifdef LDAPMAP - MAPDEF("ldapx", NULL, 0, - ldap_map_parseargs, ldap_map_open, ldap_map_close, - ldap_map_lookup, null_map_store); -#endif - -#ifdef HESIOD - MAPDEF("hesiod", NULL, MCF_ALIASOK|MCF_ALIASONLY, - map_parseargs, hes_map_open, null_map_close, - hes_map_lookup, null_map_store); -#endif - -#if NETINFO - MAPDEF("netinfo", NULL, MCF_ALIASOK, - map_parseargs, ni_map_open, null_map_close, - ni_map_lookup, null_map_store); -#endif - -#if 0 - MAPDEF("dns", NULL, 0, - dns_map_init, null_map_open, null_map_close, - dns_map_lookup, null_map_store); -#endif - -#if NAMED_BIND - /* best MX DNS lookup */ - MAPDEF("bestmx", NULL, MCF_OPTFILE, - map_parseargs, null_map_open, null_map_close, - bestmx_map_lookup, null_map_store); -#endif - - MAPDEF("host", NULL, 0, - host_map_init, null_map_open, null_map_close, - host_map_lookup, null_map_store); - - MAPDEF("text", NULL, MCF_ALIASOK, - map_parseargs, text_map_open, null_map_close, - text_map_lookup, null_map_store); - - MAPDEF("stab", NULL, MCF_ALIASOK|MCF_ALIASONLY, - map_parseargs, stab_map_open, null_map_close, - stab_map_lookup, stab_map_store); - - MAPDEF("implicit", NULL, MCF_ALIASOK|MCF_ALIASONLY|MCF_REBUILDABLE, - map_parseargs, impl_map_open, impl_map_close, - impl_map_lookup, impl_map_store); - - /* access to system passwd file */ - MAPDEF("user", NULL, MCF_OPTFILE, - map_parseargs, user_map_open, null_map_close, - user_map_lookup, null_map_store); - - /* dequote map */ - MAPDEF("dequote", NULL, 0, - dequote_init, null_map_open, null_map_close, - dequote_map, null_map_store); - -#ifdef MAP_REGEX - MAPDEF("regex", NULL, 0, - regex_map_init, null_map_open, null_map_close, - regex_map_lookup, null_map_store); -#endif - -#if USERDB - /* user database */ - MAPDEF("userdb", ".db", 0, - map_parseargs, null_map_open, null_map_close, - udb_map_lookup, null_map_store); -#endif - - /* arbitrary programs */ - MAPDEF("program", NULL, MCF_ALIASOK, - map_parseargs, null_map_open, null_map_close, - prog_map_lookup, null_map_store); - - /* sequenced maps */ - MAPDEF("sequence", NULL, MCF_ALIASOK, - seq_map_parse, null_map_open, null_map_close, - seq_map_lookup, seq_map_store); - - /* switched interface to sequenced maps */ - MAPDEF("switch", NULL, MCF_ALIASOK, - map_parseargs, switch_map_open, null_map_close, - seq_map_lookup, seq_map_store); - - /* null map lookup -- really for internal use only */ - MAPDEF("null", NULL, MCF_ALIASOK|MCF_OPTFILE, - map_parseargs, null_map_open, null_map_close, - null_map_lookup, null_map_store); - -#if _FFR_MAP_SYSLOG - /* syslog map -- logs information to syslog */ - MAPDEF("syslog", NULL, 0, - syslog_map_parseargs, null_map_open, null_map_close, - syslog_map_lookup, null_map_store); -#endif -} - -#undef MAPDEF -/* -** INITHOSTMAPS -- initial host-dependent maps -** -** This should act as an interface to any local service switch -** provided by the host operating system. -** -** Parameters: -** none -** -** Returns: -** none -** -** Side Effects: -** Should define maps "host" and "users" as necessary -** for this OS. If they are not defined, they will get -** a default value later. It should check to make sure -** they are not defined first, since it's possible that -** the config file has provided an override. -*/ - -void -inithostmaps() -{ - register int i; - int nmaps; - char *maptype[MAXMAPSTACK]; - short mapreturn[MAXMAPACTIONS]; - char buf[MAXLINE]; - - /* - ** Set up default hosts maps. - */ - -#if 0 - nmaps = switch_map_find("hosts", maptype, mapreturn); - for (i = 0; i < nmaps; i++) - { - if (strcmp(maptype[i], "files") == 0 && - stab("hosts.files", ST_MAP, ST_FIND) == NULL) - { - strcpy(buf, "hosts.files text -k 0 -v 1 /etc/hosts"); - (void) makemapentry(buf); - } -#if NAMED_BIND - else if (strcmp(maptype[i], "dns") == 0 && - stab("hosts.dns", ST_MAP, ST_FIND) == NULL) - { - strcpy(buf, "hosts.dns dns A"); - (void) makemapentry(buf); - } -#endif -#ifdef NISPLUS - else if (strcmp(maptype[i], "nisplus") == 0 && - stab("hosts.nisplus", ST_MAP, ST_FIND) == NULL) - { - strcpy(buf, "hosts.nisplus nisplus -k name -v address -d hosts.org_dir"); - (void) makemapentry(buf); - } -#endif -#ifdef NIS - else if (strcmp(maptype[i], "nis") == 0 && - stab("hosts.nis", ST_MAP, ST_FIND) == NULL) - { - strcpy(buf, "hosts.nis nis -d -k 0 -v 1 hosts.byname"); - (void) makemapentry(buf); - } -#endif -#if NETINFO - else if (strcmp(maptype[i], "netinfo") == 0) && - stab("hosts.netinfo", ST_MAP, ST_FIND) == NULL) - { - strcpy(buf, "hosts.netinfo netinfo -v name /machines"); - (void) makemapentry(buf); - } -#endif - } -#endif - - /* - ** Make sure we have a host map. - */ - - if (stab("host", ST_MAP, ST_FIND) == NULL) - { - /* user didn't initialize: set up host map */ - strcpy(buf, "host host"); -#if NAMED_BIND - if (ConfigLevel >= 2) - strcat(buf, " -a."); -#endif - (void) makemapentry(buf); - } - - /* - ** Set up default aliases maps - */ - - nmaps = switch_map_find("aliases", maptype, mapreturn); - for (i = 0; i < nmaps; i++) - { - if (strcmp(maptype[i], "files") == 0 && - stab("aliases.files", ST_MAP, ST_FIND) == NULL) - { - strcpy(buf, "aliases.files null"); - (void) makemapentry(buf); - } -#ifdef NISPLUS - else if (strcmp(maptype[i], "nisplus") == 0 && - stab("aliases.nisplus", ST_MAP, ST_FIND) == NULL) - { - strcpy(buf, "aliases.nisplus nisplus -kalias -vexpansion -d mail_aliases.org_dir"); - (void) makemapentry(buf); - } -#endif -#ifdef NIS - else if (strcmp(maptype[i], "nis") == 0 && - stab("aliases.nis", ST_MAP, ST_FIND) == NULL) - { - strcpy(buf, "aliases.nis nis -d mail.aliases"); - (void) makemapentry(buf); - } -#endif -#ifdef NETINFO - else if (strcmp(maptype[i], "netinfo") == 0 && - stab("aliases.netinfo", ST_MAP, ST_FIND) == NULL) - { - strcpy(buf, "aliases.netinfo netinfo -z, /aliases"); - (void) makemapentry(buf); - } -#endif -#ifdef HESIOD - else if (strcmp(maptype[i], "hesiod") == 0 && - stab("aliases.hesiod", ST_MAP, ST_FIND) == NULL) - { - strcpy(buf, "aliases.hesiod hesiod aliases"); - (void) makemapentry(buf); - } -#endif - } - if (stab("aliases", ST_MAP, ST_FIND) == NULL) - { - strcpy(buf, "aliases switch aliases"); - (void) makemapentry(buf); - } - -#if 0 /* "user" map class is a better choice */ - /* - ** Set up default users maps. - */ - - nmaps = switch_map_find("passwd", maptype, mapreturn); - for (i = 0; i < nmaps; i++) - { - if (strcmp(maptype[i], "files") == 0 && - stab("users.files", ST_MAP, ST_FIND) == NULL) - { - strcpy(buf, "users.files text -m -z: -k0 -v6 /etc/passwd"); - (void) makemapentry(buf); - } -#ifdef NISPLUS - else if (strcmp(maptype[i], "nisplus") == 0 && - stab("users.nisplus", ST_MAP, ST_FIND) == NULL) - { - strcpy(buf, "users.nisplus nisplus -m -kname -vhome -d passwd.org_dir"); - (void) makemapentry(buf); - } -#endif -#ifdef NIS - else if (strcmp(maptype[i], "nis") == 0 && - stab("users.nis", ST_MAP, ST_FIND) == NULL) - { - strcpy(buf, "users.nis nis -m -d passwd.byname"); - (void) makemapentry(buf); - } -#endif -#ifdef HESIOD - else if (strcmp(maptype[i], "hesiod") == 0) && - stab("users.hesiod", ST_MAP, ST_FIND) == NULL) - { - strcpy(buf, "users.hesiod hesiod"); - (void) makemapentry(buf); - } -#endif - } - if (stab("users", ST_MAP, ST_FIND) == NULL) - { - strcpy(buf, "users switch -m passwd"); - (void) makemapentry(buf); - } -#endif -} -/* -** SWITCH_MAP_FIND -- find the list of types associated with a map -** -** This is the system-dependent interface to the service switch. -** -** Parameters: -** service -- the name of the service of interest. -** maptype -- an out-array of strings containing the types -** of access to use for this service. There can -** be at most MAXMAPSTACK types for a single service. -** mapreturn -- an out-array of return information bitmaps -** for the map. -** -** Returns: -** The number of map types filled in, or -1 for failure. -*/ - -#if defined(SOLARIS) || (defined(sony_news) && defined(__svr4)) -# define _USE_SUN_NSSWITCH_ -#endif - -#ifdef _USE_SUN_NSSWITCH_ -# include <nsswitch.h> -#endif - -#if defined(ultrix) || (defined(__osf__) && defined(__alpha)) -# define _USE_DEC_SVC_CONF_ -#endif - -#ifdef _USE_DEC_SVC_CONF_ -# include <sys/svcinfo.h> -#endif - -int -switch_map_find(service, maptype, mapreturn) - char *service; - char *maptype[MAXMAPSTACK]; - short mapreturn[MAXMAPACTIONS]; -{ - int svcno; - -#ifdef _USE_SUN_NSSWITCH_ - struct __nsw_switchconfig *nsw_conf; - enum __nsw_parse_err pserr; - struct __nsw_lookup *lk; - static struct __nsw_lookup lkp0 = - { "files", {1, 0, 0, 0}, NULL, NULL }; - static struct __nsw_switchconfig lkp_default = - { 0, "sendmail", 3, &lkp0 }; - - for (svcno = 0; svcno < MAXMAPACTIONS; svcno++) - mapreturn[svcno] = 0; - - if ((nsw_conf = __nsw_getconfig(service, &pserr)) == NULL) - lk = lkp_default.lookups; - else - lk = nsw_conf->lookups; - svcno = 0; - while (lk != NULL) - { - maptype[svcno] = lk->service_name; - if (lk->actions[__NSW_NOTFOUND] == __NSW_RETURN) - mapreturn[MA_NOTFOUND] |= 1 << svcno; - if (lk->actions[__NSW_TRYAGAIN] == __NSW_RETURN) - mapreturn[MA_TRYAGAIN] |= 1 << svcno; - if (lk->actions[__NSW_UNAVAIL] == __NSW_RETURN) - mapreturn[MA_TRYAGAIN] |= 1 << svcno; - svcno++; - lk = lk->next; - } - return svcno; -#endif - -#ifdef _USE_DEC_SVC_CONF_ - struct svcinfo *svcinfo; - int svc; - - for (svcno = 0; svcno < MAXMAPACTIONS; svcno++) - mapreturn[svcno] = 0; - - svcinfo = getsvc(); - if (svcinfo == NULL) - goto punt; - if (strcmp(service, "hosts") == 0) - svc = SVC_HOSTS; - else if (strcmp(service, "aliases") == 0) - svc = SVC_ALIASES; - else if (strcmp(service, "passwd") == 0) - svc = SVC_PASSWD; - else - return -1; - for (svcno = 0; svcno < SVC_PATHSIZE; svcno++) - { - switch (svcinfo->svcpath[svc][svcno]) - { - case SVC_LOCAL: - maptype[svcno] = "files"; - break; - - case SVC_YP: - maptype[svcno] = "nis"; - break; - - case SVC_BIND: - maptype[svcno] = "dns"; - break; - -#ifdef SVC_HESIOD - case SVC_HESIOD: - maptype[svcno] = "hesiod"; - break; -#endif - - case SVC_LAST: - return svcno; - } - } - return svcno; -#endif - -#if !defined(_USE_SUN_NSSWITCH_) && !defined(_USE_DEC_SVC_CONF_) - /* - ** Fall-back mechanism. - */ - - STAB *st; - time_t now = curtime(); - - for (svcno = 0; svcno < MAXMAPACTIONS; svcno++) - mapreturn[svcno] = 0; - - if ((now - ServiceCacheTime) > (time_t) ServiceCacheMaxAge) - { - /* (re)read service switch */ - register FILE *fp; - int sff = SFF_REGONLY|SFF_OPENASROOT|SFF_NOLOCK; - - if (!bitset(DBS_LINKEDSERVICESWITCHFILEINWRITABLEDIR, DontBlameSendmail)) - sff |= SFF_NOWLINK; - - if (ConfigFileRead) - ServiceCacheTime = now; - fp = safefopen(ServiceSwitchFile, O_RDONLY, 0, sff); - if (fp != NULL) - { - char buf[MAXLINE]; - - while (fgets(buf, sizeof buf, fp) != NULL) - { - register char *p; - - p = strpbrk(buf, "#\n"); - if (p != NULL) - *p = '\0'; - p = strpbrk(buf, " \t"); - if (p != NULL) - *p++ = '\0'; - if (buf[0] == '\0') - continue; - if (p == NULL) - { - sm_syslog(LOG_ERR, NOQID, - "Bad line on %.100s: %.100s", - ServiceSwitchFile, - buf); - continue; - } - while (isspace(*p)) - p++; - if (*p == '\0') - continue; - - /* - ** Find/allocate space for this service entry. - ** Space for all of the service strings - ** are allocated at once. This means - ** that we only have to free the first - ** one to free all of them. - */ - - st = stab(buf, ST_SERVICE, ST_ENTER); - if (st->s_service[0] != NULL) - free((void *) st->s_service[0]); - p = newstr(p); - for (svcno = 0; svcno < MAXMAPSTACK; ) - { - if (*p == '\0') - break; - st->s_service[svcno++] = p; - p = strpbrk(p, " \t"); - if (p == NULL) - break; - *p++ = '\0'; - while (isspace(*p)) - p++; - } - if (svcno < MAXMAPSTACK) - st->s_service[svcno] = NULL; - } - fclose(fp); - } - } - - /* look up entry in cache */ - st = stab(service, ST_SERVICE, ST_FIND); - if (st != NULL && st->s_service[0] != NULL) - { - /* extract data */ - svcno = 0; - while (svcno < MAXMAPSTACK) - { - maptype[svcno] = st->s_service[svcno]; - if (maptype[svcno++] == NULL) - break; - } - return --svcno; - } -#endif - -#if !defined(_USE_SUN_NSSWITCH_) - /* if the service file doesn't work, use an absolute fallback */ -# ifdef _USE_DEC_SVC_CONF_ - punt: -# endif - for (svcno = 0; svcno < MAXMAPACTIONS; svcno++) - mapreturn[svcno] = 0; - svcno = 0; - if (strcmp(service, "aliases") == 0) - { - maptype[svcno++] = "files"; -# ifdef AUTO_NIS_ALIASES -# ifdef NISPLUS - maptype[svcno++] = "nisplus"; -# endif -# ifdef NIS - maptype[svcno++] = "nis"; -# endif -# endif - return svcno; - } - if (strcmp(service, "hosts") == 0) - { -# if NAMED_BIND - maptype[svcno++] = "dns"; -# else -# if defined(sun) && !defined(BSD) - /* SunOS */ - maptype[svcno++] = "nis"; -# endif -# endif - maptype[svcno++] = "files"; - return svcno; - } - return -1; -#endif -} -/* -** USERNAME -- return the user id of the logged in user. -** -** Parameters: -** none. -** -** Returns: -** The login name of the logged in user. -** -** Side Effects: -** none. -** -** Notes: -** The return value is statically allocated. -*/ - -char * -username() -{ - static char *myname = NULL; - extern char *getlogin(); - register struct passwd *pw; - - /* cache the result */ - if (myname == NULL) - { - myname = getlogin(); - if (myname == NULL || myname[0] == '\0') - { - pw = sm_getpwuid(RealUid); - if (pw != NULL) - myname = newstr(pw->pw_name); - } - else - { - uid_t uid = RealUid; - - myname = newstr(myname); - if ((pw = sm_getpwnam(myname)) == NULL || - (uid != 0 && uid != pw->pw_uid)) - { - pw = sm_getpwuid(uid); - if (pw != NULL) - myname = newstr(pw->pw_name); - } - } - if (myname == NULL || myname[0] == '\0') - { - syserr("554 Who are you?"); - myname = "postmaster"; - } - } - - return (myname); -} -/* -** TTYPATH -- Get the path of the user's tty -** -** Returns the pathname of the user's tty. Returns NULL if -** the user is not logged in or if s/he has write permission -** denied. -** -** Parameters: -** none -** -** Returns: -** pathname of the user's tty. -** NULL if not logged in or write permission denied. -** -** Side Effects: -** none. -** -** WARNING: -** Return value is in a local buffer. -** -** Called By: -** savemail -*/ - -char * -ttypath() -{ - struct stat stbuf; - register char *pathn; - extern char *ttyname(); - extern char *getlogin(); - - /* compute the pathname of the controlling tty */ - if ((pathn = ttyname(2)) == NULL && (pathn = ttyname(1)) == NULL && - (pathn = ttyname(0)) == NULL) - { - errno = 0; - return (NULL); - } - - /* see if we have write permission */ - if (stat(pathn, &stbuf) < 0 || !bitset(S_IWOTH, stbuf.st_mode)) - { - errno = 0; - return (NULL); - } - - /* see if the user is logged in */ - if (getlogin() == NULL) - return (NULL); - - /* looks good */ - return (pathn); -} -/* -** 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 an EX_ code -** should be returned. You can also set to->q_status to -** a DSN-style status code. -** -** EF_NO_BODY_RETN can be set in e->e_flags to suppress the -** body during the return-to-sender function; this should be done -** on huge messages. This bit may already be set by the ESMTP -** protocol. -** -** Parameters: -** to -- the person being sent to. -** -** Returns: -** an exit status -** -** Side Effects: -** none (unless you include the usrerr stuff) -*/ - -int -checkcompat(to, e) - register ADDRESS *to; - register ENVELOPE *e; -{ -# ifdef lint - if (to == NULL) - to++; -# endif /* lint */ - - if (tTd(49, 1)) - printf("checkcompat(to=%s, from=%s)\n", - to->q_paddr, e->e_from.q_paddr); - -# ifdef EXAMPLE_CODE - /* this code is intended as an example only */ - register STAB *s; - - s = stab("arpa", ST_MAILER, ST_FIND); - if (s != NULL && strcmp(e->e_from.q_mailer->m_name, "local") != 0 && - to->q_mailer == s->s_mailer) - { - usrerr("553 No ARPA mail through this machine: see your system administration"); - /* e->e_flags |= EF_NO_BODY_RETN; to supress body on return */ - to->q_status = "5.7.1"; - return (EX_UNAVAILABLE); - } -# endif /* EXAMPLE_CODE */ - return (EX_OK); -} -/* -** SETSIGNAL -- set a signal handler -** -** This is essentially old BSD "signal(3)". -*/ - -sigfunc_t -setsignal(sig, handler) - int sig; - sigfunc_t handler; -{ -#if defined(SYS5SIGNALS) || defined(BSD4_3) -# ifdef BSD4_3 - return signal(sig, handler); -# else - return sigset(sig, handler); -# endif -#else - struct sigaction n, o; - - bzero(&n, sizeof n); -# if USE_SA_SIGACTION - n.sa_sigaction = (void(*)(int, siginfo_t *, void *)) handler; - n.sa_flags = SA_RESTART|SA_SIGINFO; -# else - n.sa_handler = handler; -# ifdef SA_RESTART - n.sa_flags = SA_RESTART; -# endif -# endif - if (sigaction(sig, &n, &o) < 0) - return SIG_ERR; - return o.sa_handler; -#endif -} -/* -** BLOCKSIGNAL -- hold a signal to prevent delivery -** -** Parameters: -** sig -- the signal to block. -** -** Returns: -** 1 signal was previously blocked -** 0 signal was not previously blocked -** -1 on failure. -*/ - -int -blocksignal(sig) - int sig; -{ -#ifdef BSD4_3 -# ifndef sigmask -# define sigmask(s) (1 << ((s) - 1)) -# endif - return (sigblock(sigmask(sig)) & sigmask(sig)) != 0; -#else -# ifdef ALTOS_SYSTEM_V - sigfunc_t handler; - - handler = sigset(sig, SIG_HOLD); - if (handler == SIG_ERR) - return -1; - else - return handler == SIG_HOLD; -# else - sigset_t sset, oset; - - sigemptyset(&sset); - sigaddset(&sset, sig); - if (sigprocmask(SIG_BLOCK, &sset, &oset) < 0) - return -1; - else - return sigismember(&oset, sig); -# endif -#endif -} -/* -** RELEASESIGNAL -- release a held signal -** -** Parameters: -** sig -- the signal to release. -** -** Returns: -** 1 signal was previously blocked -** 0 signal was not previously blocked -** -1 on failure. -*/ - -int -releasesignal(sig) - int sig; -{ -#ifdef BSD4_3 - return (sigsetmask(sigblock(0) & ~sigmask(sig)) & sigmask(sig)) != 0; -#else -# ifdef ALTOS_SYSTEM_V - sigfunc_t handler; - - handler = sigset(sig, SIG_HOLD); - if (sigrelse(sig) < 0) - return -1; - else - return handler == SIG_HOLD; -# else - sigset_t sset, oset; - - sigemptyset(&sset); - sigaddset(&sset, sig); - if (sigprocmask(SIG_UNBLOCK, &sset, &oset) < 0) - return -1; - else - return sigismember(&oset, sig); -# endif -#endif -} -/* -** HOLDSIGS -- arrange to hold all signals -** -** Parameters: -** none. -** -** Returns: -** none. -** -** Side Effects: -** Arranges that signals are held. -*/ - -void -holdsigs() -{ -} -/* -** RLSESIGS -- arrange to release all signals -** -** This undoes the effect of holdsigs. -** -** Parameters: -** none. -** -** Returns: -** none. -** -** Side Effects: -** Arranges that signals are released. -*/ - -void -rlsesigs() -{ -} -/* -** INIT_MD -- do machine dependent initializations -** -** Systems that have global modes that should be set should do -** them here rather than in main. -*/ - -#ifdef _AUX_SOURCE -# include <compat.h> -#endif - -#if SHARE_V1 -# include <shares.h> -#endif - -void -init_md(argc, argv) - int argc; - char **argv; -{ -#ifdef _AUX_SOURCE - setcompat(getcompat() | COMPAT_BSDPROT); -#endif - -#ifdef SUN_EXTENSIONS - init_md_sun(); -#endif - -#if _CONVEX_SOURCE - /* keep gethostby*() from stripping the local domain name */ - set_domain_trim_off(); -#endif -#ifdef __QNX__ - /* - ** Due to QNX's network distributed nature, you can target a tcpip - ** stack on a different node in the qnx network; this patch lets - ** this feature work. The __sock_locate() must be done before the - ** environment is clear. - */ - __sock_locate(); -#endif -#if SECUREWARE || defined(_SCO_unix_) - set_auth_parameters(argc, argv); - -# ifdef _SCO_unix_ - /* - ** This is required for highest security levels (the kernel - ** won't let it call set*uid() or run setuid binaries without - ** it). It may be necessary on other SECUREWARE systems. - */ - - if (getluid() == -1) - setluid(0); -# endif -#endif - -#ifdef VENDOR_DEFAULT - VendorCode = VENDOR_DEFAULT; -#else - VendorCode = VENDOR_BERKELEY; -#endif -} -/* -** INIT_VENDOR_MACROS -- vendor-dependent macro initializations -** -** Called once, on startup. -** -** Parameters: -** e -- the global envelope. -** -** Returns: -** none. -** -** Side Effects: -** vendor-dependent. -*/ - -void -init_vendor_macros(e) - register ENVELOPE *e; -{ -} -/* -** GETLA -- get the current load average -** -** This code stolen from la.c. -** -** Parameters: -** none. -** -** Returns: -** The current load average as an integer. -** -** Side Effects: -** none. -*/ - -/* try to guess what style of load average we have */ -#define LA_ZERO 1 /* always return load average as zero */ -#define LA_INT 2 /* read kmem for avenrun; interpret as long */ -#define LA_FLOAT 3 /* read kmem for avenrun; interpret as float */ -#define LA_SUBR 4 /* call getloadavg */ -#define LA_MACH 5 /* MACH load averages (as on NeXT boxes) */ -#define LA_SHORT 6 /* read kmem for avenrun; interpret as short */ -#define LA_PROCSTR 7 /* read string ("1.17") from /proc/loadavg */ -#define LA_READKSYM 8 /* SVR4: use MIOC_READKSYM ioctl call */ -#define LA_DGUX 9 /* special DGUX implementation */ -#define LA_HPUX 10 /* special HPUX implementation */ -#define LA_IRIX6 11 /* special IRIX 6.2 implementation */ -#define LA_KSTAT 12 /* special Solaris kstat(3k) implementation */ -#define LA_DEVSHORT 13 /* read short from a device */ -#define LA_ALPHAOSF 14 /* Digital UNIX (OSF/1 on Alpha) table() call */ - -/* do guesses based on general OS type */ -#ifndef LA_TYPE -# define LA_TYPE LA_ZERO -#endif - -#ifndef FSHIFT -# if defined(unixpc) -# define FSHIFT 5 -# endif - -# if defined(__alpha) || defined(IRIX) -# define FSHIFT 10 -# endif - -#endif - -#ifndef FSHIFT -# define FSHIFT 8 -#endif - -#ifndef FSCALE -# define FSCALE (1 << FSHIFT) -#endif - -#ifndef LA_AVENRUN -# ifdef SYSTEM5 -# define LA_AVENRUN "avenrun" -# else -# define LA_AVENRUN "_avenrun" -# endif -#endif - -/* _PATH_KMEM should be defined in <paths.h> */ -#ifndef _PATH_KMEM -# define _PATH_KMEM "/dev/kmem" -#endif - -#if (LA_TYPE == LA_INT) || (LA_TYPE == LA_FLOAT) || (LA_TYPE == LA_SHORT) - -#include <nlist.h> - -/* _PATH_UNIX should be defined in <paths.h> */ -#ifndef _PATH_UNIX -# if defined(SYSTEM5) -# define _PATH_UNIX "/unix" -# else -# define _PATH_UNIX "/vmunix" -# endif -#endif - -#ifdef _AUX_SOURCE -struct nlist Nl[2]; -#else -struct nlist Nl[] = -{ - { LA_AVENRUN }, - { 0 }, -}; -#endif -#define X_AVENRUN 0 - -int -getla() -{ - static int kmem = -1; -#if LA_TYPE == LA_INT - long avenrun[3]; -#else -# if LA_TYPE == LA_SHORT - short avenrun[3]; -# else - double avenrun[3]; -# endif -#endif - extern int errno; - extern off_t lseek(); - - if (kmem < 0) - { -#ifdef _AUX_SOURCE - strcpy(Nl[X_AVENRUN].n_name, LA_AVENRUN); - Nl[1].n_name[0] = '\0'; -#endif - -#if defined(_AIX3) || defined(_AIX4) - if (knlist(Nl, 1, sizeof Nl[0]) < 0) -#else - if (nlist(_PATH_UNIX, Nl) < 0) -#endif - { - if (tTd(3, 1)) - printf("getla: nlist(%s): %s\n", _PATH_UNIX, - errstring(errno)); - return (-1); - } - if (Nl[X_AVENRUN].n_value == 0) - { - if (tTd(3, 1)) - printf("getla: nlist(%s, %s) ==> 0\n", - _PATH_UNIX, LA_AVENRUN); - return (-1); - } -#ifdef NAMELISTMASK - Nl[X_AVENRUN].n_value &= NAMELISTMASK; -#endif - - kmem = open(_PATH_KMEM, 0, 0); - if (kmem < 0) - { - if (tTd(3, 1)) - printf("getla: open(/dev/kmem): %s\n", - errstring(errno)); - return (-1); - } - (void) fcntl(kmem, F_SETFD, 1); - } - if (tTd(3, 20)) - printf("getla: symbol address = %#lx\n", - (u_long) Nl[X_AVENRUN].n_value); - if (lseek(kmem, (off_t) Nl[X_AVENRUN].n_value, SEEK_SET) == -1 || - read(kmem, (char *) avenrun, sizeof(avenrun)) < sizeof(avenrun)) - { - /* thank you Ian */ - if (tTd(3, 1)) - printf("getla: lseek or read: %s\n", errstring(errno)); - return (-1); - } -# if (LA_TYPE == LA_INT) || (LA_TYPE == LA_SHORT) - if (tTd(3, 5)) - { -# if LA_TYPE == LA_SHORT - printf("getla: avenrun = %d", avenrun[0]); - if (tTd(3, 15)) - printf(", %d, %d", avenrun[1], avenrun[2]); -# else - printf("getla: avenrun = %ld", avenrun[0]); - if (tTd(3, 15)) - printf(", %ld, %ld", avenrun[1], avenrun[2]); -# endif - printf("\n"); - } - if (tTd(3, 1)) - printf("getla: %d\n", (int) (avenrun[0] + FSCALE/2) >> FSHIFT); - return ((int) (avenrun[0] + FSCALE/2) >> FSHIFT); -# else /* LA_TYPE == LA_FLOAT */ - if (tTd(3, 5)) - { - printf("getla: avenrun = %g", avenrun[0]); - if (tTd(3, 15)) - printf(", %g, %g", avenrun[1], avenrun[2]); - printf("\n"); - } - if (tTd(3, 1)) - printf("getla: %d\n", (int) (avenrun[0] +0.5)); - return ((int) (avenrun[0] + 0.5)); -# endif -} - -#endif /* LA_TYPE == LA_INT or LA_SHORT or LA_FLOAT */ - -#if LA_TYPE == LA_READKSYM - -# include <sys/ksym.h> - -getla() -{ - static int kmem = -1; - long avenrun[3]; - extern int errno; - struct mioc_rksym mirk; - - if (kmem < 0) - { - kmem = open("/dev/kmem", 0, 0); - if (kmem < 0) - { - if (tTd(3, 1)) - printf("getla: open(/dev/kmem): %s\n", - errstring(errno)); - return (-1); - } - (void) fcntl(kmem, F_SETFD, 1); - } - mirk.mirk_symname = LA_AVENRUN; - mirk.mirk_buf = avenrun; - mirk.mirk_buflen = sizeof(avenrun); - if (ioctl(kmem, MIOC_READKSYM, &mirk) < 0) - { - if (tTd(3, 1)) - printf("getla: ioctl(MIOC_READKSYM) failed: %s\n", - errstring(errno)); - return -1; - } - if (tTd(3, 5)) - { - printf("getla: avenrun = %d", avenrun[0]); - if (tTd(3, 15)) - printf(", %d, %d", avenrun[1], avenrun[2]); - printf("\n"); - } - if (tTd(3, 1)) - printf("getla: %d\n", (int) (avenrun[0] + FSCALE/2) >> FSHIFT); - return ((int) (avenrun[0] + FSCALE/2) >> FSHIFT); -} - -#endif /* LA_TYPE == LA_READKSYM */ - -#if LA_TYPE == LA_DGUX - -# include <sys/dg_sys_info.h> - -int -getla() -{ - struct dg_sys_info_load_info load_info; - - dg_sys_info((long *)&load_info, - DG_SYS_INFO_LOAD_INFO_TYPE, DG_SYS_INFO_LOAD_VERSION_0); - - if (tTd(3, 1)) - printf("getla: %d\n", (int) (load_info.one_minute + 0.5)); - - return((int) (load_info.one_minute + 0.5)); -} - -#endif /* LA_TYPE == LA_DGUX */ - -#if LA_TYPE == LA_HPUX - -/* forward declarations to keep gcc from complaining */ -struct pst_dynamic; -struct pst_status; -struct pst_static; -struct pst_vminfo; -struct pst_diskinfo; -struct pst_processor; -struct pst_lv; -struct pst_swapinfo; - -# include <sys/param.h> -# include <sys/pstat.h> - -int -getla() -{ - struct pst_dynamic pstd; - - if (pstat_getdynamic(&pstd, sizeof(struct pst_dynamic), - (size_t) 1, 0) == -1) - return 0; - - if (tTd(3, 1)) - printf("getla: %d\n", (int) (pstd.psd_avg_1_min + 0.5)); - - return (int) (pstd.psd_avg_1_min + 0.5); -} - -#endif /* LA_TYPE == LA_HPUX */ - -#if LA_TYPE == LA_SUBR - -int -getla() -{ - double avenrun[3]; - - if (getloadavg(avenrun, sizeof(avenrun) / sizeof(avenrun[0])) < 0) - { - if (tTd(3, 1)) - perror("getla: getloadavg failed:"); - return (-1); - } - if (tTd(3, 1)) - printf("getla: %d\n", (int) (avenrun[0] +0.5)); - return ((int) (avenrun[0] + 0.5)); -} - -#endif /* LA_TYPE == LA_SUBR */ - -#if LA_TYPE == LA_MACH - -/* -** This has been tested on NEXTSTEP release 2.1/3.X. -*/ - -#if defined(NX_CURRENT_COMPILER_RELEASE) && NX_CURRENT_COMPILER_RELEASE > NX_COMPILER_RELEASE_3_0 -# include <mach/mach.h> -#else -# include <mach.h> -#endif - -int -getla() -{ - processor_set_t default_set; - kern_return_t error; - unsigned int info_count; - struct processor_set_basic_info info; - host_t host; - - error = processor_set_default(host_self(), &default_set); - if (error != KERN_SUCCESS) - { - if (tTd(3, 1)) - perror("getla: processor_set_default failed:"); - return -1; - } - info_count = PROCESSOR_SET_BASIC_INFO_COUNT; - if (processor_set_info(default_set, PROCESSOR_SET_BASIC_INFO, - &host, (processor_set_info_t)&info, - &info_count) != KERN_SUCCESS) - { - if (tTd(3, 1)) - perror("getla: processor_set_info failed:"); - return -1; - } - if (tTd(3, 1)) - printf("getla: %d\n", (int) (info.load_average + (LOAD_SCALE / 2)) / LOAD_SCALE); - return (int) (info.load_average + (LOAD_SCALE / 2)) / LOAD_SCALE; -} - -#endif /* LA_TYPE == LA_MACH */ - -#if LA_TYPE == LA_PROCSTR - -/* -** Read /proc/loadavg for the load average. This is assumed to be -** in a format like "0.15 0.12 0.06". -** -** Initially intended for Linux. This has been in the kernel -** since at least 0.99.15. -*/ - -# ifndef _PATH_LOADAVG -# define _PATH_LOADAVG "/proc/loadavg" -# endif - -int -getla() -{ - double avenrun; - register int result; - FILE *fp; - - fp = fopen(_PATH_LOADAVG, "r"); - if (fp == NULL) - { - if (tTd(3, 1)) - printf("getla: fopen(%s): %s\n", - _PATH_LOADAVG, errstring(errno)); - return -1; - } - result = fscanf(fp, "%lf", &avenrun); - fclose(fp); - if (result != 1) - { - if (tTd(3, 1)) - printf("getla: fscanf() = %d: %s\n", - result, errstring(errno)); - return -1; - } - - if (tTd(3, 1)) - printf("getla(): %.2f\n", avenrun); - - return ((int) (avenrun + 0.5)); -} - -#endif /* LA_TYPE == LA_PROCSTR */ - -#if LA_TYPE == LA_IRIX6 -#include <sys/sysmp.h> - -int getla(void) -{ - static int kmem = -1; - int avenrun[3]; - - if (kmem < 0) - { - kmem = open(_PATH_KMEM, 0, 0); - if (kmem < 0) - { - if (tTd(3, 1)) - printf("getla: open(%s): %s\n", _PATH_KMEM, - errstring(errno)); - return -1; - } - (void) fcntl(kmem, F_SETFD, 1); - } - - if (lseek(kmem, (sysmp(MP_KERNADDR, MPKA_AVENRUN) & 0x7fffffff), SEEK_SET) == -1 || - read(kmem, (char *)avenrun, sizeof(avenrun)) < sizeof(avenrun)) - { - if (tTd(3, 1)) - printf("getla: lseek or read: %s\n", - errstring(errno)); - return -1; - } - if (tTd(3, 5)) - { - printf("getla: avenrun = %ld", (long int) avenrun[0]); - if (tTd(3, 15)) - printf(", %ld, %ld", - (long int) avenrun[1], (long int) avenrun[2]); - printf("\n"); - } - - if (tTd(3, 1)) - printf("getla: %d\n", (int) (avenrun[0] + FSCALE/2) >> FSHIFT); - return ((int) (avenrun[0] + FSCALE/2) >> FSHIFT); - -} -#endif - -#if LA_TYPE == LA_KSTAT - -#include <kstat.h> - -int -getla() -{ - static kstat_ctl_t *kc = NULL; - static kstat_t *ksp = NULL; - kstat_named_t *ksn; - int la; - - if (kc == NULL) /* if not initialized before */ - kc = kstat_open(); - if (kc == NULL) - { - if (tTd(3, 1)) - printf("getla: kstat_open(): %s\n", - errstring(errno)); - return -1; - } - if (ksp == NULL) - ksp = kstat_lookup(kc, "unix", 0, "system_misc"); - if (ksp == NULL) - { - if (tTd(3, 1)) - printf("getla: kstat_lookup(): %s\n", - errstring(errno)); - return -1; - } - if (kstat_read(kc, ksp, NULL) < 0) - { - if (tTd(3, 1)) - printf("getla: kstat_read(): %s\n", - errstring(errno)); - return -1; - } - ksn = (kstat_named_t *) kstat_data_lookup(ksp, "avenrun_1min"); - la = ((double)ksn->value.ul + FSCALE/2) / FSCALE; - /* kstat_close(kc); /o do not close for fast access */ - return la; -} - -#endif /* LA_TYPE == LA_KSTAT */ - -#if LA_TYPE == LA_DEVSHORT - -/* -** Read /dev/table/avenrun for the load average. This should contain -** three shorts for the 1, 5, and 15 minute loads. We only read the -** first, since that's all we care about. -** -** Intended for SCO OpenServer 5. -*/ - -# ifndef _PATH_AVENRUN -# define _PATH_AVENRUN "/dev/table/avenrun" -# endif - -int -getla() -{ - static int afd = -1; - short avenrun; - int loadav; - int r; - - errno = EBADF; - - if (afd == -1 || lseek(afd, 0L, SEEK_SET) == -1) - { - if (errno != EBADF) - return -1; - afd = open(_PATH_AVENRUN, O_RDONLY|O_SYNC); - if (afd < 0) - { - sm_syslog(LOG_ERR, NOQID, - "can't open %s: %m", - _PATH_AVENRUN); - return -1; - } - } - - r = read(afd, &avenrun, sizeof avenrun); - - if (tTd(3, 5)) - printf("getla: avenrun = %d\n", avenrun); - loadav = (int) (avenrun + FSCALE/2) >> FSHIFT; - if (tTd(3, 1)) - printf("getla: %d\n", loadav); - return loadav; -} - -#endif /* LA_TYPE == LA_DEVSHORT */ - -#if LA_TYPE == LA_ALPHAOSF -struct rtentry; -struct mbuf; -# include <sys/table.h> - -int getla() -{ - int ave = 0; - struct tbl_loadavg tab; - - if (table(TBL_LOADAVG, 0, &tab, 1, sizeof(tab)) == -1) - { - if (tTd(3, 1)) - printf("getla: table %s\n", errstring(errno)); - return (-1); - } - - if (tTd(3, 1)) - printf("getla: scale = %d\n", tab.tl_lscale); - - if (tab.tl_lscale) - ave = (tab.tl_avenrun.l[0] + (tab.tl_lscale/2)) / tab.tl_lscale; - else - ave = (int) (tab.tl_avenrun.d[0] + 0.5); - - if (tTd(3, 1)) - printf("getla: %d\n", ave); - - return ave; -} - -#endif - -#if LA_TYPE == LA_ZERO - -int -getla() -{ - if (tTd(3, 1)) - printf("getla: ZERO\n"); - return (0); -} - -#endif /* LA_TYPE == LA_ZERO */ - -/* - * Copyright 1989 Massachusetts Institute of Technology - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of M.I.T. not be used in advertising or - * publicity pertaining to distribution of the software without specific, - * written prior permission. M.I.T. makes no representations about the - * suitability of this software for any purpose. It is provided "as is" - * without express or implied warranty. - * - * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. - * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Authors: Many and varied... - */ - -/* Non Apollo stuff removed by Don Lewis 11/15/93 */ -#ifndef lint -static char rcsid[] = "@(#)$Id: getloadavg.c,v 1.16 1991/06/21 12:51:15 paul Exp $"; -#endif /* !lint */ - -#ifdef apollo -# undef volatile -# include <apollo/base.h> - -/* ARGSUSED */ -int getloadavg( call_data ) - caddr_t call_data; /* pointer to (double) return value */ -{ - double *avenrun = (double *) call_data; - int i; - status_$t st; - long loadav[3]; - proc1_$get_loadav(loadav, &st); - *avenrun = loadav[0] / (double) (1 << 16); - return(0); -} -# endif /* apollo */ -/* -** SHOULDQUEUE -- should this message be queued or sent? -** -** Compares the message cost to the load average to decide. -** -** Parameters: -** pri -- the priority of the message in question. -** ctime -- the message creation time. -** -** Returns: -** TRUE -- if this message should be queued up for the -** time being. -** FALSE -- if the load is low enough to send this message. -** -** Side Effects: -** none. -*/ - -extern int get_num_procs_online __P((void)); - -bool -shouldqueue(pri, ctime) - long pri; - time_t ctime; -{ - bool rval; - int queuela = QueueLA * get_num_procs_online(); - - if (tTd(3, 30)) - printf("shouldqueue: CurrentLA=%d, pri=%ld: ", CurrentLA, pri); - if (CurrentLA < queuela) - { - if (tTd(3, 30)) - printf("FALSE (CurrentLA < QueueLA)\n"); - return (FALSE); - } -#if 0 /* this code is reported to cause oscillation around RefuseLA */ - if (CurrentLA >= RefuseLA && QueueLA < RefuseLA) - { - if (tTd(3, 30)) - printf("TRUE (CurrentLA >= RefuseLA)\n"); - return (TRUE); - } -#endif - rval = pri > (QueueFactor / (CurrentLA - queuela + 1)); - if (tTd(3, 30)) - printf("%s (by calculation)\n", rval ? "TRUE" : "FALSE"); - return rval; -} -/* -** REFUSECONNECTIONS -- decide if connections should be refused -** -** Parameters: -** port -- port number (for error messages only) -** -** Returns: -** TRUE if incoming SMTP connections should be refused -** (for now). -** FALSE if we should accept new work. -** -** Side Effects: -** Sets process title when it is rejecting connections. -*/ - -bool -refuseconnections(port) - int port; -{ - int refusela = RefuseLA * get_num_procs_online(); - time_t now; - static time_t lastconn = (time_t) 0; - static int conncnt = 0; - extern bool enoughdiskspace __P((long)); - -#ifdef XLA - if (!xla_smtp_ok()) - return TRUE; -#endif - - now = curtime(); - if (now != lastconn) - { - lastconn = now; - conncnt = 0; - } - else if (conncnt++ > ConnRateThrottle && ConnRateThrottle > 0) - { - /* sleep to flatten out connection load */ - sm_setproctitle(TRUE, "deferring connections on port %d: %d per second", - port, ConnRateThrottle); - if (LogLevel >= 14) - sm_syslog(LOG_INFO, NOQID, - "deferring connections on port %d: %d per second", - port, ConnRateThrottle); - sleep(1); - } - - CurrentLA = getla(); - if (CurrentLA >= refusela) - { - sm_setproctitle(TRUE, "rejecting connections on port %d: load average: %d", - port, CurrentLA); - if (LogLevel >= 14) - sm_syslog(LOG_INFO, NOQID, - "rejecting connections on port %d: load average: %d", - port, CurrentLA); - return TRUE; - } - - if (!enoughdiskspace(MinBlocksFree + 1)) - { - sm_setproctitle(TRUE, "rejecting connections on port %d: min free: %d", - port, MinBlocksFree); - if (LogLevel >= 14) - sm_syslog(LOG_INFO, NOQID, - "rejecting connections on port %d: min free: %d", - port, MinBlocksFree); - return TRUE; - } - - if (MaxChildren > 0 && CurChildren >= MaxChildren) - { - proc_list_probe(); - if (CurChildren >= MaxChildren) - { - sm_setproctitle(TRUE, "rejecting connections on port %d: %d children, max %d", - port, CurChildren, MaxChildren); - if (LogLevel >= 14) - sm_syslog(LOG_INFO, NOQID, - "rejecting connections on port %d: %d children, max %d", - port, CurChildren, MaxChildren); - return TRUE; - } - } - - return FALSE; -} -/* -** SETPROCTITLE -- set process title for ps -** -** Parameters: -** fmt -- a printf style format string. -** a, b, c -- possible parameters to fmt. -** -** Returns: -** none. -** -** Side Effects: -** Clobbers argv of our main procedure so ps(1) will -** display the title. -*/ - -#define SPT_NONE 0 /* don't use it at all */ -#define SPT_REUSEARGV 1 /* cover argv with title information */ -#define SPT_BUILTIN 2 /* use libc builtin */ -#define SPT_PSTAT 3 /* use pstat(PSTAT_SETCMD, ...) */ -#define SPT_PSSTRINGS 4 /* use PS_STRINGS->... */ -#define SPT_SYSMIPS 5 /* use sysmips() supported by NEWS-OS 6 */ -#define SPT_SCO 6 /* write kernel u. area */ -#define SPT_CHANGEARGV 7 /* write our own strings into argv[] */ - -#ifndef SPT_TYPE -# define SPT_TYPE SPT_REUSEARGV -#endif - -#if SPT_TYPE != SPT_NONE && SPT_TYPE != SPT_BUILTIN - -# if SPT_TYPE == SPT_PSTAT -# include <sys/pstat.h> -# endif -# if SPT_TYPE == SPT_PSSTRINGS -# include <machine/vmparam.h> -# include <sys/exec.h> -# ifndef PS_STRINGS /* hmmmm.... apparently not available after all */ -# undef SPT_TYPE -# define SPT_TYPE SPT_REUSEARGV -# else -# ifndef NKPDE /* FreeBSD 2.0 */ -# define NKPDE 63 -typedef unsigned int *pt_entry_t; -# endif -# endif -# endif - -# if SPT_TYPE == SPT_PSSTRINGS || SPT_TYPE == SPT_CHANGEARGV -# define SETPROC_STATIC static -# else -# define SETPROC_STATIC -# endif - -# if SPT_TYPE == SPT_SYSMIPS -# include <sys/sysmips.h> -# include <sys/sysnews.h> -# endif - -# if SPT_TYPE == SPT_SCO -# include <sys/immu.h> -# include <sys/dir.h> -# include <sys/user.h> -# include <sys/fs/s5param.h> -# if PSARGSZ > MAXLINE -# define SPT_BUFSIZE PSARGSZ -# endif -# endif - -# ifndef SPT_PADCHAR -# define SPT_PADCHAR ' ' -# endif - -#endif /* SPT_TYPE != SPT_NONE && SPT_TYPE != SPT_BUILTIN */ - -# ifndef SPT_BUFSIZE -# define SPT_BUFSIZE MAXLINE -# endif - -/* -** Pointers for setproctitle. -** This allows "ps" listings to give more useful information. -*/ - -char **Argv = NULL; /* pointer to argument vector */ -char *LastArgv = NULL; /* end of argv */ - -void -initsetproctitle(argc, argv, envp) - int argc; - char **argv; - char **envp; -{ - register int i, envpsize = 0; - extern char **environ; - - /* - ** Move the environment so setproctitle can use the space at - ** the top of memory. - */ - - for (i = 0; envp[i] != NULL; i++) - envpsize += strlen(envp[i]) + 1; - environ = (char **) xalloc(sizeof (char *) * (i + 1)); - for (i = 0; envp[i] != NULL; i++) - environ[i] = newstr(envp[i]); - environ[i] = NULL; - - /* - ** Save start and extent of argv for setproctitle. - */ - - Argv = argv; - - /* - ** Determine how much space we can use for setproctitle. - ** Use all contiguous argv and envp pointers starting at argv[0] - */ - for (i = 0; i < argc; i++) - { - if (i==0 || LastArgv + 1 == argv[i]) - LastArgv = argv[i] + strlen(argv[i]); - else - continue; - } - for (i=0; envp[i] != NULL; i++) - { - if (LastArgv + 1 == envp[i]) - LastArgv = envp[i] + strlen(envp[i]); - else - continue; - } -} - -#if SPT_TYPE != SPT_BUILTIN - - -/*VARARGS1*/ -void -# ifdef __STDC__ -setproctitle(const char *fmt, ...) -# else -setproctitle(fmt, va_alist) - const char *fmt; - va_dcl -# endif -{ -# if SPT_TYPE != SPT_NONE - register char *p; - register int i; - SETPROC_STATIC char buf[SPT_BUFSIZE]; - VA_LOCAL_DECL -# if SPT_TYPE == SPT_PSTAT - union pstun pst; -# endif -# if SPT_TYPE == SPT_SCO - off_t seek_off; - static int kmem = -1; - static int kmempid = -1; - struct user u; -# endif - - p = buf; - - /* print sendmail: heading for grep */ - (void) strcpy(p, "sendmail: "); - p += strlen(p); - - /* print the argument string */ - VA_START(fmt); - (void) vsnprintf(p, SPACELEFT(buf, p), fmt, ap); - VA_END; - - i = strlen(buf); - -# if SPT_TYPE == SPT_PSTAT - pst.pst_command = buf; - pstat(PSTAT_SETCMD, pst, i, 0, 0); -# endif -# if SPT_TYPE == SPT_PSSTRINGS - PS_STRINGS->ps_nargvstr = 1; - PS_STRINGS->ps_argvstr = buf; -# endif -# if SPT_TYPE == SPT_SYSMIPS - sysmips(SONY_SYSNEWS, NEWS_SETPSARGS, buf); -# endif -# if SPT_TYPE == SPT_SCO - if (kmem < 0 || kmempid != getpid()) - { - if (kmem >= 0) - close(kmem); - kmem = open(_PATH_KMEM, O_RDWR, 0); - if (kmem < 0) - return; - (void) fcntl(kmem, F_SETFD, 1); - kmempid = getpid(); - } - buf[PSARGSZ - 1] = '\0'; - seek_off = UVUBLK + (off_t) u.u_psargs - (off_t) &u; - if (lseek(kmem, (off_t) seek_off, SEEK_SET) == seek_off) - (void) write(kmem, buf, PSARGSZ); -# endif -# if SPT_TYPE == SPT_REUSEARGV - if (i > LastArgv - Argv[0] - 2) - { - i = LastArgv - Argv[0] - 2; - buf[i] = '\0'; - } - (void) strcpy(Argv[0], buf); - p = &Argv[0][i]; - while (p < LastArgv) - *p++ = SPT_PADCHAR; - Argv[1] = NULL; -# endif -# if SPT_TYPE == SPT_CHANGEARGV - Argv[0] = buf; - Argv[1] = 0; -# endif -# endif /* SPT_TYPE != SPT_NONE */ -} - -#endif /* SPT_TYPE != SPT_BUILTIN */ -/* -** SM_SETPROCTITLE -- set process task and set process title for ps -** -** Possibly set process status and call setproctitle() to -** change the ps display. -** -** Parameters: -** status -- whether or not to store as process status -** fmt -- a printf style format string. -** a, b, c -- possible parameters to fmt. -** -** Returns: -** none. -*/ - -/*VARARGS2*/ -void -# ifdef __STDC__ -sm_setproctitle(bool status, const char *fmt, ...) -# else -sm_setproctitle(status, fmt, va_alist) - bool status; - const char *fmt; - va_dcl -#endif -{ - char buf[SPT_BUFSIZE]; - - VA_LOCAL_DECL - /* print the argument string */ - VA_START(fmt); - (void) vsnprintf(buf, SPT_BUFSIZE, fmt, ap); - VA_END; - - if (status) - proc_list_set(getpid(), buf); - setproctitle("%s", buf); -} -/* -** WAITFOR -- wait for a particular process id. -** -** Parameters: -** pid -- process id to wait for. -** -** Returns: -** status of pid. -** -1 if pid never shows up. -** -** Side Effects: -** none. -*/ - -int -waitfor(pid) - pid_t pid; -{ -#ifdef WAITUNION - union wait st; -#else - auto int st; -#endif - pid_t i; -#if defined(ISC_UNIX) || defined(_SCO_unix_) - int savesig; -#endif - - do - { - errno = 0; -#if defined(ISC_UNIX) || defined(_SCO_unix_) - savesig = releasesignal(SIGCHLD); -#endif - i = wait(&st); -#if defined(ISC_UNIX) || defined(_SCO_unix_) - if (savesig > 0) - blocksignal(SIGCHLD); -#endif - if (i > 0) - proc_list_drop(i); - } while ((i >= 0 || errno == EINTR) && i != pid); - if (i < 0) - return -1; -#ifdef WAITUNION - return st.w_status; -#else - return st; -#endif -} -/* -** REAPCHILD -- pick up the body of my child, lest it become a zombie -** -** Parameters: -** sig -- the signal that got us here (unused). -** -** Returns: -** none. -** -** Side Effects: -** Picks up extant zombies. -*/ - -SIGFUNC_DECL -reapchild(sig) - int sig; -{ - int olderrno = errno; - pid_t pid; -# ifdef HASWAITPID - auto int status; - int count; - - count = 0; - while ((pid = waitpid(-1, &status, WNOHANG)) > 0) - { - if (count++ > 1000) - { - if (LogLevel > 0) - sm_syslog(LOG_ALERT, NOQID, - "reapchild: waitpid loop: pid=%d, status=%x", - pid, status); - break; - } - proc_list_drop(pid); - } -# else -# ifdef WNOHANG - union wait status; - - while ((pid = wait3(&status, WNOHANG, (struct rusage *) NULL)) > 0) - proc_list_drop(pid); -# else /* WNOHANG */ - auto int status; - - /* - ** Catch one zombie -- we will be re-invoked (we hope) if there - ** are more. Unreliable signals probably break this, but this - ** is the "old system" situation -- waitpid or wait3 are to be - ** strongly preferred. - */ - - if ((pid = wait(&status)) > 0) - proc_list_drop(pid); -# endif /* WNOHANG */ -# endif -# ifdef SYS5SIGNALS - (void) setsignal(SIGCHLD, reapchild); -# endif - errno = olderrno; - return SIGFUNC_RETURN; -} -/* -** PUTENV -- emulation of putenv() in terms of setenv() -** -** Not needed on Posix-compliant systems. -** This doesn't have full Posix semantics, but it's good enough -** for sendmail. -** -** Parameter: -** env -- the environment to put. -** -** Returns: -** none. -*/ - -#ifdef NEEDPUTENV - -# if NEEDPUTENV == 2 /* no setenv(3) call available */ - -int -putenv(str) - char *str; -{ - char **current; - int matchlen, envlen=0; - char *tmp; - char **newenv; - static int first=1; - extern char **environ; - - /* - * find out how much of str to match when searching - * for a string to replace. - */ - if ((tmp = strchr(str, '=')) == NULL || tmp == str) - matchlen = strlen(str); - else - matchlen = (int) (tmp - str); - ++matchlen; - - /* - * Search for an existing string in the environment and find the - * length of environ. If found, replace and exit. - */ - for (current=environ; *current; current++) { - ++envlen; - - if (strncmp(str, *current, matchlen) == 0) { - /* found it, now insert the new version */ - *current = (char *)str; - return(0); - } - } - - /* - * There wasn't already a slot so add space for a new slot. - * If this is our first time through, use malloc(), else realloc(). - */ - if (first) { - newenv = (char **) malloc(sizeof(char *) * (envlen + 2)); - if (newenv == NULL) - return(-1); - - first=0; - (void) memcpy(newenv, environ, sizeof(char *) * envlen); - } else { - newenv = (char **) realloc((char *)environ, sizeof(char *) * (envlen + 2)); - if (newenv == NULL) - return(-1); - } - - /* actually add in the new entry */ - environ = newenv; - environ[envlen] = (char *)str; - environ[envlen+1] = NULL; - - return(0); -} - -#else /* implement putenv() in terms of setenv() */ - -int -putenv(env) - char *env; -{ - char *p; - int l; - char nbuf[100]; - - p = strchr(env, '='); - if (p == NULL) - return 0; - l = p - env; - if (l > sizeof nbuf - 1) - l = sizeof nbuf - 1; - bcopy(env, nbuf, l); - nbuf[l] = '\0'; - return setenv(nbuf, ++p, 1); -} - -# endif -#endif -/* -** UNSETENV -- remove a variable from the environment -** -** Not needed on newer systems. -** -** Parameters: -** name -- the string name of the environment variable to be -** deleted from the current environment. -** -** Returns: -** none. -** -** Globals: -** environ -- a pointer to the current environment. -** -** Side Effects: -** Modifies environ. -*/ - -#ifndef HASUNSETENV - -void -unsetenv(name) - char *name; -{ - extern char **environ; - register char **pp; - int len = strlen(name); - - for (pp = environ; *pp != NULL; pp++) - { - if (strncmp(name, *pp, len) == 0 && - ((*pp)[len] == '=' || (*pp)[len] == '\0')) - break; - } - - for (; *pp != NULL; pp++) - *pp = pp[1]; -} - -#endif -/* -** GETDTABLESIZE -- return number of file descriptors -** -** Only on non-BSD systems -** -** Parameters: -** none -** -** Returns: -** size of file descriptor table -** -** Side Effects: -** none -*/ - -#ifdef SOLARIS -# include <sys/resource.h> -#endif - -int -getdtsize() -{ -#ifdef RLIMIT_NOFILE - struct rlimit rl; - - if (getrlimit(RLIMIT_NOFILE, &rl) >= 0) - return rl.rlim_cur; -#endif - -# ifdef HASGETDTABLESIZE - return getdtablesize(); -# else -# ifdef _SC_OPEN_MAX - return sysconf(_SC_OPEN_MAX); -# else - return NOFILE; -# endif -# endif -} -/* -** UNAME -- get the UUCP name of this system. -*/ - -#ifndef HASUNAME - -int -uname(name) - struct utsname *name; -{ - FILE *file; - char *n; - - name->nodename[0] = '\0'; - - /* try /etc/whoami -- one line with the node name */ - if ((file = fopen("/etc/whoami", "r")) != NULL) - { - (void) fgets(name->nodename, NODE_LENGTH + 1, file); - (void) fclose(file); - n = strchr(name->nodename, '\n'); - if (n != NULL) - *n = '\0'; - if (name->nodename[0] != '\0') - return (0); - } - - /* try /usr/include/whoami.h -- has a #define somewhere */ - if ((file = fopen("/usr/include/whoami.h", "r")) != NULL) - { - char buf[MAXLINE]; - - while (fgets(buf, MAXLINE, file) != NULL) - if (sscanf(buf, "#define sysname \"%*[^\"]\"", - NODE_LENGTH, name->nodename) > 0) - break; - (void) fclose(file); - if (name->nodename[0] != '\0') - return (0); - } - -#ifdef TRUST_POPEN - /* - ** Popen is known to have security holes. - */ - - /* try uuname -l to return local name */ - if ((file = popen("uuname -l", "r")) != NULL) - { - (void) fgets(name, NODE_LENGTH + 1, file); - (void) pclose(file); - n = strchr(name, '\n'); - if (n != NULL) - *n = '\0'; - if (name->nodename[0] != '\0') - return (0); - } -#endif - - return (-1); -} -#endif /* HASUNAME */ -/* -** INITGROUPS -- initialize groups -** -** Stub implementation for System V style systems -*/ - -#ifndef HASINITGROUPS - -initgroups(name, basegid) - char *name; - int basegid; -{ - return 0; -} - -#endif -/* -** SETGROUPS -- set group list -** -** Stub implementation for systems that don't have group lists -*/ - -#ifndef NGROUPS_MAX - -int -setgroups(ngroups, grouplist) - int ngroups; - GIDSET_T grouplist[]; -{ - return 0; -} - -#endif -/* -** SETSID -- set session id (for non-POSIX systems) -*/ - -#ifndef HASSETSID - -pid_t -setsid __P ((void)) -{ -#ifdef TIOCNOTTY - int fd; - - fd = open("/dev/tty", O_RDWR, 0); - if (fd >= 0) - { - (void) ioctl(fd, (int) TIOCNOTTY, (char *) 0); - (void) close(fd); - } -#endif /* TIOCNOTTY */ -# ifdef SYS5SETPGRP - return setpgrp(); -# else - return setpgid(0, getpid()); -# endif -} - -#endif -/* -** FSYNC -- dummy fsync -*/ - -#ifdef NEEDFSYNC - -fsync(fd) - int fd; -{ -# ifdef O_SYNC - return fcntl(fd, F_SETFL, O_SYNC); -# else - /* nothing we can do */ - return 0; -# endif -} - -#endif -/* -** DGUX_INET_ADDR -- inet_addr for DG/UX -** -** Data General DG/UX version of inet_addr returns a struct in_addr -** instead of a long. This patches things. Only needed on versions -** prior to 5.4.3. -*/ - -#ifdef DGUX_5_4_2 - -#undef inet_addr - -long -dgux_inet_addr(host) - char *host; -{ - struct in_addr haddr; - - haddr = inet_addr(host); - return haddr.s_addr; -} - -#endif -/* -** GETOPT -- for old systems or systems with bogus implementations -*/ - -#ifdef NEEDGETOPT - -/* - * Copyright (c) 1985 Regents of the University of California. - * All rights reserved. The Berkeley software License Agreement - * specifies the terms and conditions for redistribution. - */ - - -/* -** this version hacked to add `atend' flag to allow state machine -** to reset if invoked by the program to scan args for a 2nd time -*/ - -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)getopt.c 4.3 (Berkeley) 3/9/86"; -#endif /* LIBC_SCCS and not lint */ - -#include <stdio.h> - -/* - * get option letter from argument vector - */ -#ifdef _CONVEX_SOURCE -extern int optind, opterr, optopt; -extern char *optarg; -#else -int opterr = 1; /* if error message should be printed */ -int optind = 1; /* index into parent argv vector */ -int optopt = 0; /* character checked for validity */ -char *optarg = NULL; /* argument associated with option */ -#endif - -#define BADCH (int)'?' -#define EMSG "" -#define tell(s) if (opterr) {fputs(*nargv,stderr);fputs(s,stderr); \ - fputc(optopt,stderr);fputc('\n',stderr);return(BADCH);} - -int -getopt(nargc,nargv,ostr) - int nargc; - char *const *nargv; - const char *ostr; -{ - static char *place = EMSG; /* option letter processing */ - static char atend = 0; - register char *oli = NULL; /* option letter list index */ - - if (atend) { - atend = 0; - place = EMSG; - } - if(!*place) { /* update scanning pointer */ - if (optind >= nargc || *(place = nargv[optind]) != '-' || !*++place) { - atend++; - return -1; - } - if (*place == '-') { /* found "--" */ - ++optind; - atend++; - return -1; - } - } /* option letter okay? */ - if ((optopt = (int)*place++) == (int)':' || !(oli = strchr(ostr,optopt))) { - if (!*place) ++optind; - tell(": illegal option -- "); - } - if (oli && *++oli != ':') { /* don't need argument */ - optarg = NULL; - if (!*place) ++optind; - } - else { /* need an argument */ - if (*place) optarg = place; /* no white space */ - else if (nargc <= ++optind) { /* no arg */ - place = EMSG; - tell(": option requires an argument -- "); - } - else optarg = nargv[optind]; /* white space */ - place = EMSG; - ++optind; - } - return(optopt); /* dump back option letter */ -} - -#endif -/* -** VFPRINTF, VSPRINTF -- for old 4.3 BSD systems missing a real version -*/ - -#ifdef NEEDVPRINTF - -#define MAXARG 16 - -vfprintf(fp, fmt, ap) - FILE *fp; - char *fmt; - char **ap; -{ - char *bp[MAXARG]; - int i = 0; - - while (*ap && i < MAXARG) - bp[i++] = *ap++; - fprintf(fp, fmt, bp[0], bp[1], bp[2], bp[3], - bp[4], bp[5], bp[6], bp[7], - bp[8], bp[9], bp[10], bp[11], - bp[12], bp[13], bp[14], bp[15]); -} - -vsprintf(s, fmt, ap) - char *s; - char *fmt; - char **ap; -{ - char *bp[MAXARG]; - int i = 0; - - while (*ap && i < MAXARG) - bp[i++] = *ap++; - sprintf(s, fmt, bp[0], bp[1], bp[2], bp[3], - bp[4], bp[5], bp[6], bp[7], - bp[8], bp[9], bp[10], bp[11], - bp[12], bp[13], bp[14], bp[15]); -} - -#endif -/* -** USERSHELLOK -- tell if a user's shell is ok for unrestricted use -** -** Parameters: -** user -- the name of the user we are checking. -** shell -- the user's shell from /etc/passwd -** -** Returns: -** TRUE -- if it is ok to use this for unrestricted access. -** FALSE -- if the shell is restricted. -*/ - -#if !HASGETUSERSHELL - -# ifndef _PATH_SHELLS -# define _PATH_SHELLS "/etc/shells" -# endif - -# if defined(_AIX3) || defined(_AIX4) -# include <userconf.h> -# if _AIX4 >= 40200 -# include <userpw.h> -# endif -# include <usersec.h> -# endif - -char *DefaultUserShells[] = -{ - "/bin/sh", /* standard shell */ - "/usr/bin/sh", - "/bin/csh", /* C shell */ - "/usr/bin/csh", -#ifdef __hpux -# ifdef V4FS - "/usr/bin/rsh", /* restricted Bourne shell */ - "/usr/bin/ksh", /* Korn shell */ - "/usr/bin/rksh", /* restricted Korn shell */ - "/usr/bin/pam", - "/usr/bin/keysh", /* key shell (extended Korn shell) */ - "/usr/bin/posix/sh", -# else - "/bin/rsh", /* restricted Bourne shell */ - "/bin/ksh", /* Korn shell */ - "/bin/rksh", /* restricted Korn shell */ - "/bin/pam", - "/usr/bin/keysh", /* key shell (extended Korn shell) */ - "/bin/posix/sh", -# endif -#endif -#if defined(_AIX3) || defined(_AIX4) - "/bin/ksh", /* Korn shell */ - "/usr/bin/ksh", - "/bin/tsh", /* trusted shell */ - "/usr/bin/tsh", - "/bin/bsh", /* Bourne shell */ - "/usr/bin/bsh", -#endif -#if defined(__svr4__) || defined(__svr5__) - "/bin/ksh", /* Korn shell */ - "/usr/bin/ksh", -#endif -#ifdef sgi - "/sbin/sh", /* SGI's shells really live in /sbin */ - "/sbin/csh", - "/bin/ksh", /* Korn shell */ - "/sbin/ksh", - "/usr/bin/ksh", - "/bin/tcsh", /* Extended csh */ - "/usr/bin/tcsh", -#endif - NULL -}; - -#endif - -#define WILDCARD_SHELL "/SENDMAIL/ANY/SHELL/" - -bool -usershellok(user, shell) - char *user; - char *shell; -{ -#if HASGETUSERSHELL - register char *p; - extern char *getusershell(); - - if (shell == NULL || shell[0] == '\0' || wordinclass(user, 't') || - ConfigLevel <= 1) - return TRUE; - - setusershell(); - while ((p = getusershell()) != NULL) - if (strcmp(p, shell) == 0 || strcmp(p, WILDCARD_SHELL) == 0) - break; - endusershell(); - return p != NULL; -#else -# if USEGETCONFATTR - auto char *v; -# endif - register FILE *shellf; - char buf[MAXLINE]; - - if (shell == NULL || shell[0] == '\0' || wordinclass(user, 't') || - ConfigLevel <= 1) - return TRUE; - -# if USEGETCONFATTR - /* - ** Naturally IBM has a "better" idea..... - ** - ** What a crock. This interface isn't documented, it is - ** considered part of the security library (-ls), and it - ** only works if you are running as root (since the list - ** of valid shells is obviously a source of great concern). - ** I recommend that you do NOT define USEGETCONFATTR, - ** especially since you are going to have to set up an - ** /etc/shells anyhow to handle the cases where getconfattr - ** fails. - */ - - if (getconfattr(SC_SYS_LOGIN, SC_SHELLS, &v, SEC_LIST) == 0 && v != NULL) - { - while (*v != '\0') - { - if (strcmp(v, shell) == 0 || strcmp(v, WILDCARD_SHELL) == 0) - return TRUE; - v += strlen(v) + 1; - } - return FALSE; - } -# endif - - shellf = fopen(_PATH_SHELLS, "r"); - if (shellf == NULL) - { - /* no /etc/shells; see if it is one of the std shells */ - char **d; - - if (errno != ENOENT && LogLevel > 3) - sm_syslog(LOG_ERR, NOQID, - "usershellok: cannot open %s: %s", - _PATH_SHELLS, errstring(errno)); - - for (d = DefaultUserShells; *d != NULL; d++) - { - if (strcmp(shell, *d) == 0) - return TRUE; - } - return FALSE; - } - - while (fgets(buf, sizeof buf, shellf) != NULL) - { - register char *p, *q; - - p = buf; - while (*p != '\0' && *p != '#' && *p != '/') - p++; - if (*p == '#' || *p == '\0') - continue; - q = p; - while (*p != '\0' && *p != '#' && !(isascii(*p) && isspace(*p))) - p++; - *p = '\0'; - if (strcmp(shell, q) == 0 || strcmp(WILDCARD_SHELL, q) == 0) - { - fclose(shellf); - return TRUE; - } - } - fclose(shellf); - return FALSE; -#endif -} -/* -** FREEDISKSPACE -- see how much free space is on the queue filesystem -** -** Only implemented if you have statfs. -** -** Parameters: -** dir -- the directory in question. -** bsize -- a variable into which the filesystem -** block size is stored. -** -** Returns: -** The number of bytes free on the queue filesystem. -** -1 if the statfs call fails. -** -** Side effects: -** Puts the filesystem block size into bsize. -*/ - -/* statfs types */ -#define SFS_NONE 0 /* no statfs implementation */ -#define SFS_USTAT 1 /* use ustat */ -#define SFS_4ARGS 2 /* use four-argument statfs call */ -#define SFS_VFS 3 /* use <sys/vfs.h> implementation */ -#define SFS_MOUNT 4 /* use <sys/mount.h> implementation */ -#define SFS_STATFS 5 /* use <sys/statfs.h> implementation */ -#define SFS_STATVFS 6 /* use <sys/statvfs.h> implementation */ - -#ifndef SFS_TYPE -# define SFS_TYPE SFS_NONE -#endif - -#if SFS_TYPE == SFS_USTAT -# include <ustat.h> -#endif -#if SFS_TYPE == SFS_4ARGS || SFS_TYPE == SFS_STATFS -# include <sys/statfs.h> -#endif -#if SFS_TYPE == SFS_VFS -# include <sys/vfs.h> -#endif -#if SFS_TYPE == SFS_MOUNT -# include <sys/mount.h> -#endif -#if SFS_TYPE == SFS_STATVFS -# include <sys/statvfs.h> -#endif - -long -freediskspace(dir, bsize) - char *dir; - long *bsize; -{ -#if SFS_TYPE != SFS_NONE -# if SFS_TYPE == SFS_USTAT - struct ustat fs; - struct stat statbuf; -# define FSBLOCKSIZE DEV_BSIZE -# define SFS_BAVAIL f_tfree -# else -# if defined(ultrix) - struct fs_data fs; -# define SFS_BAVAIL fd_bfreen -# define FSBLOCKSIZE 1024L -# else -# if SFS_TYPE == SFS_STATVFS - struct statvfs fs; -# define FSBLOCKSIZE fs.f_frsize -# else - struct statfs fs; -# define FSBLOCKSIZE fs.f_bsize -# endif -# endif -# endif -# ifndef SFS_BAVAIL -# define SFS_BAVAIL f_bavail -# endif - -# if SFS_TYPE == SFS_USTAT - if (stat(dir, &statbuf) == 0 && ustat(statbuf.st_dev, &fs) == 0) -# else -# if SFS_TYPE == SFS_4ARGS - if (statfs(dir, &fs, sizeof fs, 0) == 0) -# else -# if SFS_TYPE == SFS_STATVFS - if (statvfs(dir, &fs) == 0) -# else -# if defined(ultrix) - if (statfs(dir, &fs) > 0) -# else - if (statfs(dir, &fs) == 0) -# endif -# endif -# endif -# endif - { - if (bsize != NULL) - *bsize = FSBLOCKSIZE; - if (fs.SFS_BAVAIL <= 0) - return 0; - else if (fs.SFS_BAVAIL > LONG_MAX) - return LONG_MAX; - else - return (long) fs.SFS_BAVAIL; - } -#endif - return (-1); -} -/* -** ENOUGHDISKSPACE -- is there enough free space on the queue fs? -** -** Only implemented if you have statfs. -** -** Parameters: -** msize -- the size to check against. If zero, we don't yet -** know how big the message will be, so just check for -** a "reasonable" amount. -** -** Returns: -** TRUE if there is enough space. -** FALSE otherwise. -*/ - -bool -enoughdiskspace(msize) - long msize; -{ - long bfree, bsize; - - if (MinBlocksFree <= 0 && msize <= 0) - { - if (tTd(4, 80)) - printf("enoughdiskspace: no threshold\n"); - return TRUE; - } - - if ((bfree = freediskspace(QueueDir, &bsize)) >= 0) - { - if (tTd(4, 80)) - printf("enoughdiskspace: bavail=%ld, need=%ld\n", - bfree, msize); - - /* convert msize to block count */ - msize = msize / bsize + 1; - if (MinBlocksFree >= 0) - msize += MinBlocksFree; - - if (bfree < msize) - { - if (LogLevel > 0) - sm_syslog(LOG_ALERT, CurEnv->e_id, - "low on space (have %ld, %s needs %ld in %s)", - bfree, - CurHostName == NULL ? "SMTP-DAEMON" : CurHostName, - msize, QueueDir); - return FALSE; - } - } - else if (tTd(4, 80)) - printf("enoughdiskspace failure: min=%ld, need=%ld: %s\n", - MinBlocksFree, msize, errstring(errno)); - return TRUE; -} -/* -** TRANSIENTERROR -- tell if an error code indicates a transient failure -** -** This looks at an errno value and tells if this is likely to -** go away if retried later. -** -** Parameters: -** err -- the errno code to classify. -** -** Returns: -** TRUE if this is probably transient. -** FALSE otherwise. -*/ - -bool -transienterror(err) - int err; -{ - switch (err) - { - case EIO: /* I/O error */ - case ENXIO: /* Device not configured */ - case EAGAIN: /* Resource temporarily unavailable */ - case ENOMEM: /* Cannot allocate memory */ - case ENODEV: /* Operation not supported by device */ - case ENFILE: /* Too many open files in system */ - case EMFILE: /* Too many open files */ - case ENOSPC: /* No space left on device */ -#ifdef ETIMEDOUT - case ETIMEDOUT: /* Connection timed out */ -#endif -#ifdef ESTALE - case ESTALE: /* Stale NFS file handle */ -#endif -#ifdef ENETDOWN - case ENETDOWN: /* Network is down */ -#endif -#ifdef ENETUNREACH - case ENETUNREACH: /* Network is unreachable */ -#endif -#ifdef ENETRESET - case ENETRESET: /* Network dropped connection on reset */ -#endif -#ifdef ECONNABORTED - case ECONNABORTED: /* Software caused connection abort */ -#endif -#ifdef ECONNRESET - case ECONNRESET: /* Connection reset by peer */ -#endif -#ifdef ENOBUFS - case ENOBUFS: /* No buffer space available */ -#endif -#ifdef ESHUTDOWN - case ESHUTDOWN: /* Can't send after socket shutdown */ -#endif -#ifdef ECONNREFUSED - case ECONNREFUSED: /* Connection refused */ -#endif -#ifdef EHOSTDOWN - case EHOSTDOWN: /* Host is down */ -#endif -#ifdef EHOSTUNREACH - case EHOSTUNREACH: /* No route to host */ -#endif -#ifdef EDQUOT - case EDQUOT: /* Disc quota exceeded */ -#endif -#ifdef EPROCLIM - case EPROCLIM: /* Too many processes */ -#endif -#ifdef EUSERS - case EUSERS: /* Too many users */ -#endif -#ifdef EDEADLK - case EDEADLK: /* Resource deadlock avoided */ -#endif -#ifdef EISCONN - case EISCONN: /* Socket already connected */ -#endif -#ifdef EINPROGRESS - case EINPROGRESS: /* Operation now in progress */ -#endif -#ifdef EALREADY - case EALREADY: /* Operation already in progress */ -#endif -#ifdef EADDRINUSE - case EADDRINUSE: /* Address already in use */ -#endif -#ifdef EADDRNOTAVAIL - case EADDRNOTAVAIL: /* Can't assign requested address */ -#endif -#ifdef ETXTBSY - case ETXTBSY: /* (Apollo) file locked */ -#endif -#if defined(ENOSR) && (!defined(ENOBUFS) || (ENOBUFS != ENOSR)) - case ENOSR: /* Out of streams resources */ -#endif - case E_SM_OPENTIMEOUT: /* PSEUDO: open timed out */ - return TRUE; - } - - /* nope, must be permanent */ - return FALSE; -} -/* -** LOCKFILE -- lock a file using flock or (shudder) fcntl locking -** -** Parameters: -** fd -- the file descriptor of the file. -** filename -- the file name (for error messages). -** ext -- the filename extension. -** type -- type of the lock. Bits can be: -** LOCK_EX -- exclusive lock. -** LOCK_NB -- non-blocking. -** -** Returns: -** TRUE if the lock was acquired. -** FALSE otherwise. -*/ - -bool -lockfile(fd, filename, ext, type) - int fd; - char *filename; - char *ext; - int type; -{ - int i; - int save_errno; -# if !HASFLOCK - int action; - struct flock lfd; - - if (ext == NULL) - ext = ""; - - bzero(&lfd, sizeof lfd); - if (bitset(LOCK_UN, type)) - lfd.l_type = F_UNLCK; - else if (bitset(LOCK_EX, type)) - lfd.l_type = F_WRLCK; - else - lfd.l_type = F_RDLCK; - - if (bitset(LOCK_NB, type)) - action = F_SETLK; - else - action = F_SETLKW; - - if (tTd(55, 60)) - printf("lockfile(%s%s, action=%d, type=%d): ", - filename, ext, action, lfd.l_type); - - while ((i = fcntl(fd, action, &lfd)) < 0 && errno == EINTR) - continue; - if (i >= 0) - { - if (tTd(55, 60)) - printf("SUCCESS\n"); - return TRUE; - } - save_errno = errno; - - if (tTd(55, 60)) - printf("(%s) ", errstring(save_errno)); - - /* - ** On SunOS, if you are testing using -oQ/tmp/mqueue or - ** -oA/tmp/aliases or anything like that, and /tmp is mounted - ** as type "tmp" (that is, served from swap space), the - ** previous fcntl will fail with "Invalid argument" errors. - ** Since this is fairly common during testing, we will assume - ** that this indicates that the lock is successfully grabbed. - */ - - if (save_errno == EINVAL) - { - if (tTd(55, 60)) - printf("SUCCESS\n"); - return TRUE; - } - - if (!bitset(LOCK_NB, type) || (save_errno != EACCES && save_errno != EAGAIN)) - { - int omode = -1; -# ifdef F_GETFL - (void) fcntl(fd, F_GETFL, &omode); - errno = save_errno; -# endif - syserr("cannot lockf(%s%s, fd=%d, type=%o, omode=%o, euid=%d)", - filename, ext, fd, type, omode, geteuid()); - dumpfd(fd, TRUE, TRUE); - } -# else - if (ext == NULL) - ext = ""; - - if (tTd(55, 60)) - printf("lockfile(%s%s, type=%o): ", filename, ext, type); - - while ((i = flock(fd, type)) < 0 && errno == EINTR) - continue; - if (i >= 0) - { - if (tTd(55, 60)) - printf("SUCCESS\n"); - return TRUE; - } - save_errno = errno; - - if (tTd(55, 60)) - printf("(%s) ", errstring(save_errno)); - - if (!bitset(LOCK_NB, type) || save_errno != EWOULDBLOCK) - { - int omode = -1; -# ifdef F_GETFL - (void) fcntl(fd, F_GETFL, &omode); - errno = save_errno; -# endif - syserr("cannot flock(%s%s, fd=%d, type=%o, omode=%o, euid=%d)", - filename, ext, fd, type, omode, geteuid()); - dumpfd(fd, TRUE, TRUE); - } -# endif - if (tTd(55, 60)) - printf("FAIL\n"); - errno = save_errno; - return FALSE; -} -/* -** CHOWNSAFE -- tell if chown is "safe" (executable only by root) -** -** Unfortunately, given that we can't predict other systems on which -** a remote mounted (NFS) filesystem will be mounted, the answer is -** almost always that this is unsafe. -** -** Note also that many operating systems have non-compliant -** implementations of the _POSIX_CHOWN_RESTRICTED variable and the -** fpathconf() routine. According to IEEE 1003.1-1990, if -** _POSIX_CHOWN_RESTRICTED is defined and not equal to -1, then -** no non-root process can give away the file. However, vendors -** don't take NFS into account, so a comfortable value of -** _POSIX_CHOWN_RESTRICTED tells us nothing. -** -** Also, some systems (e.g., IRIX 6.2) return 1 from fpathconf() -** even on files where chown is not restricted. Many systems get -** this wrong on NFS-based filesystems (that is, they say that chown -** is restricted [safe] on NFS filesystems where it may not be, since -** other systems can access the same filesystem and do file giveaway; -** only the NFS server knows for sure!) Hence, it is important to -** get the value of SAFENFSPATHCONF correct -- it should be defined -** _only_ after testing (see test/t_pathconf.c) a system on an unsafe -** NFS-based filesystem to ensure that you can get meaningful results. -** If in doubt, assume unsafe! -** -** You may also need to tweak IS_SAFE_CHOWN -- it should be a -** condition indicating whether the return from pathconf indicates -** that chown is safe (typically either > 0 or >= 0 -- there isn't -** even any agreement about whether a zero return means that a file -** is or is not safe). It defaults to "> 0". -** -** If the parent directory is safe (writable only by owner back -** to the root) then we can relax slightly and trust fpathconf -** in more circumstances. This is really a crock -- if this is an -** NFS mounted filesystem then we really know nothing about the -** underlying implementation. However, most systems pessimize and -** return an error (EINVAL or EOPNOTSUPP) on NFS filesystems, which -** we interpret as unsafe, as we should. Thus, this heuristic gets -** us into a possible problem only on systems that have a broken -** pathconf implementation and which are also poorly configured -** (have :include: files in group- or world-writable directories). -** -** Parameters: -** fd -- the file descriptor to check. -** safedir -- set if the parent directory is safe. -** -** Returns: -** TRUE -- if the chown(2) operation is "safe" -- that is, -** only root can chown the file to an arbitrary user. -** FALSE -- if an arbitrary user can give away a file. -*/ - -#ifndef IS_SAFE_CHOWN -# define IS_SAFE_CHOWN > 0 -#endif - -bool -chownsafe(fd, safedir) - int fd; - bool safedir; -{ -#if (!defined(_POSIX_CHOWN_RESTRICTED) || _POSIX_CHOWN_RESTRICTED != -1) && \ - (defined(_PC_CHOWN_RESTRICTED) || defined(_GNU_TYPES_H)) - int rval; - - /* give the system administrator a chance to override */ - if (bitset(DBS_ASSUMESAFECHOWN, DontBlameSendmail)) - return TRUE; - - /* - ** Some systems (e.g., SunOS) seem to have the call and the - ** #define _PC_CHOWN_RESTRICTED, but don't actually implement - ** the call. This heuristic checks for that. - */ - - errno = 0; - rval = fpathconf(fd, _PC_CHOWN_RESTRICTED); -# if SAFENFSPATHCONF - return errno == 0 && rval IS_SAFE_CHOWN; -# else - return safedir && errno == 0 && rval IS_SAFE_CHOWN; -# endif -#else - return bitset(DBS_ASSUMESAFECHOWN, DontBlameSendmail); -#endif -} -/* -** RESETLIMITS -- reset system controlled resource limits -** -** This is to avoid denial-of-service attacks -** -** Parameters: -** none -** -** Returns: -** none -*/ - -#if HASSETRLIMIT -# ifdef RLIMIT_NEEDS_SYS_TIME_H -# include <sys/time.h> -# endif -# include <sys/resource.h> -#endif -#ifndef FD_SETSIZE -# define FD_SETSIZE 256 -#endif - -void -resetlimits() -{ -#if HASSETRLIMIT - struct rlimit lim; - - lim.rlim_cur = lim.rlim_max = RLIM_INFINITY; - (void) setrlimit(RLIMIT_CPU, &lim); - (void) setrlimit(RLIMIT_FSIZE, &lim); -# ifdef RLIMIT_NOFILE - lim.rlim_cur = lim.rlim_max = FD_SETSIZE; - (void) setrlimit(RLIMIT_NOFILE, &lim); -# endif -#else -# if HASULIMIT - (void) ulimit(2, 0x3fffff); - (void) ulimit(4, FD_SETSIZE); -# endif -#endif - errno = 0; -} -/* -** GETCFNAME -- return the name of the .cf file. -** -** Some systems (e.g., NeXT) determine this dynamically. -*/ - -char * -getcfname() -{ - - if (ConfFile != NULL) - return ConfFile; -#if NETINFO - { - extern char *ni_propval __P((char *, char *, char *, char *, int)); - char *cflocation; - - cflocation = ni_propval("/locations", NULL, "sendmail", - "sendmail.cf", '\0'); - if (cflocation != NULL) - return cflocation; - } -#endif - - return _PATH_SENDMAILCF; -} -/* -** SETVENDOR -- process vendor code from V configuration line -** -** Parameters: -** vendor -- string representation of vendor. -** -** Returns: -** TRUE -- if ok. -** FALSE -- if vendor code could not be processed. -** -** Side Effects: -** It is reasonable to set mode flags here to tweak -** processing in other parts of the code if necessary. -** For example, if you are a vendor that uses $%y to -** indicate YP lookups, you could enable that here. -*/ - -bool -setvendor(vendor) - char *vendor; -{ - if (strcasecmp(vendor, "Berkeley") == 0) - { - VendorCode = VENDOR_BERKELEY; - return TRUE; - } - - /* add vendor extensions here */ - -#ifdef SUN_EXTENSIONS - if (strcasecmp(vendor, "Sun") == 0) - { - VendorCode = VENDOR_SUN; - return TRUE; - } -#endif - -#if defined(VENDOR_NAME) && defined(VENDOR_CODE) - if (strcasecmp(vendor, VENDOR_NAME) == 0) - { - VendorCode = VENDOR_CODE; - return TRUE; - } -#endif - - return FALSE; -} -/* -** GETVENDOR -- return vendor name based on vendor code -** -** Parameters: -** vendorcode -- numeric representation of vendor. -** -** Returns: -** string containing vendor name. -*/ - -char * -getvendor(vendorcode) - int vendorcode; -{ -#if defined(VENDOR_NAME) && defined(VENDOR_CODE) - /* - ** Can't have the same switch case twice so need to - ** handle VENDOR_CODE outside of switch. It might - ** match one of the existing VENDOR_* codes. - */ - - if (vendorcode == VENDOR_CODE) - return VENDOR_NAME; -#endif - - switch (vendorcode) - { - case VENDOR_BERKELEY: - return "Berkeley"; - - case VENDOR_SUN: - return "Sun"; - - case VENDOR_HP: - return "HP"; - - case VENDOR_IBM: - return "IBM"; - - case VENDOR_SENDMAIL: - return "Sendmail"; - - default: - return "Unknown"; - } -} -/* -** VENDOR_PRE_DEFAULTS, VENDOR_POST_DEFAULTS -- set vendor-specific defaults -** -** Vendor_pre_defaults is called before reading the configuration -** file; vendor_post_defaults is called immediately after. -** -** Parameters: -** e -- the global environment to initialize. -** -** Returns: -** none. -*/ - -#if SHARE_V1 -int DefShareUid; /* default share uid to run as -- unused??? */ -#endif - -void -vendor_pre_defaults(e) - ENVELOPE *e; -{ -#if SHARE_V1 - /* OTHERUID is defined in shares.h, do not be alarmed */ - DefShareUid = OTHERUID; -#endif -#if defined(SUN_EXTENSIONS) && defined(SUN_DEFAULT_VALUES) - sun_pre_defaults(e); -#endif -#ifdef apollo - /* stupid domain/os can't even open /etc/sendmail.cf without this */ - setuserenv("ISP", NULL); - setuserenv("SYSTYPE", NULL); -#endif -} - - -void -vendor_post_defaults(e) - ENVELOPE *e; -{ -#ifdef __QNX__ - char *p; - - /* Makes sure the SOCK environment variable remains */ - if (p = getextenv("SOCK")) - setuserenv("SOCK", p); -#endif -#if defined(SUN_EXTENSIONS) && defined(SUN_DEFAULT_VALUES) - sun_post_defaults(e); -#endif -} -/* -** VENDOR_DAEMON_SETUP -- special vendor setup needed for daemon mode -*/ - -void -vendor_daemon_setup(e) - ENVELOPE *e; -{ -#if SECUREWARE - if (getluid() != -1) - { - usrerr("Daemon cannot have LUID"); - finis(FALSE, EX_USAGE); - } -#endif /* SECUREWARE */ -} -/* -** VENDOR_SET_UID -- do setup for setting a user id -** -** This is called when we are still root. -** -** Parameters: -** uid -- the uid we are about to become. -** -** Returns: -** none. -*/ - -void -vendor_set_uid(uid) - UID_T uid; -{ - /* - ** We need to setup the share groups (lnodes) - ** and and auditing inforation (luid's) - ** before we loose our ``root''ness. - */ -#if SHARE_V1 - if (setupshares(uid, syserr) != 0) - syserr("Unable to set up shares"); -#endif -#if SECUREWARE - (void) setup_secure(uid); -#endif -} -/* -** VALIDATE_CONNECTION -- check connection for rationality -** -** If the connection is rejected, this routine should log an -** appropriate message -- but should never issue any SMTP protocol. -** -** Parameters: -** sap -- a pointer to a SOCKADDR naming the peer. -** hostname -- the name corresponding to sap. -** e -- the current envelope. -** -** Returns: -** error message from rejection. -** NULL if not rejected. -*/ - -#if TCPWRAPPERS -# include <tcpd.h> - -/* tcpwrappers does no logging, but you still have to declare these -- ugh */ -int allow_severity = LOG_INFO; -int deny_severity = LOG_NOTICE; -#endif - -#if DAEMON -char * -validate_connection(sap, hostname, e) - SOCKADDR *sap; - char *hostname; - ENVELOPE *e; -{ -#if TCPWRAPPERS - char *host; -#endif - - if (tTd(48, 3)) - printf("validate_connection(%s, %s)\n", - hostname, anynet_ntoa(sap)); - - if (rscheck("check_relay", hostname, anynet_ntoa(sap), e) != EX_OK) - { - static char reject[BUFSIZ*2]; - extern char MsgBuf[]; - - if (tTd(48, 4)) - printf(" ... validate_connection: BAD (rscheck)\n"); - - if (strlen(MsgBuf) > 5) - { - if (isascii(MsgBuf[0]) && isdigit(MsgBuf[0]) && - isascii(MsgBuf[1]) && isdigit(MsgBuf[1]) && - isascii(MsgBuf[2]) && isdigit(MsgBuf[2])) - strcpy(reject, &MsgBuf[4]); - else - strcpy(reject, MsgBuf); - } - else - strcpy(reject, "Access denied"); - - return reject; - } - -#if TCPWRAPPERS - if (hostname[0] == '[' && hostname[strlen(hostname) - 1] == ']') - host = "unknown"; - else - host = hostname; - if (!hosts_ctl("sendmail", host, anynet_ntoa(sap), STRING_UNKNOWN)) - { - if (tTd(48, 4)) - printf(" ... validate_connection: BAD (tcpwrappers)\n"); - if (LogLevel >= 4) - sm_syslog(LOG_NOTICE, NOQID, - "tcpwrappers (%s, %s) rejection", - host, anynet_ntoa(sap)); - return "Access denied"; - } -#endif - if (tTd(48, 4)) - printf(" ... validate_connection: OK\n"); - return NULL; -} - -#endif -/* -** STRTOL -- convert string to long integer -** -** For systems that don't have it in the C library. -** -** This is taken verbatim from the 4.4-Lite C library. -*/ - -#ifdef NEEDSTRTOL - -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)strtol.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -/* - * Convert a string to a long integer. - * - * Ignores `locale' stuff. Assumes that the upper and lower case - * alphabets and digits are each contiguous. - */ - -long -strtol(nptr, endptr, base) - const char *nptr; - char **endptr; - register int base; -{ - register const char *s = nptr; - register unsigned long acc; - register int c; - register unsigned long cutoff; - register int neg = 0, any, cutlim; - - /* - * Skip white space and pick up leading +/- sign if any. - * If base is 0, allow 0x for hex and 0 for octal, else - * assume decimal; if base is already 16, allow 0x. - */ - do { - c = *s++; - } while (isspace(c)); - if (c == '-') { - neg = 1; - c = *s++; - } else if (c == '+') - c = *s++; - if ((base == 0 || base == 16) && - c == '0' && (*s == 'x' || *s == 'X')) { - c = s[1]; - s += 2; - base = 16; - } - if (base == 0) - base = c == '0' ? 8 : 10; - - /* - * Compute the cutoff value between legal numbers and illegal - * numbers. That is the largest legal value, divided by the - * base. An input number that is greater than this value, if - * followed by a legal input character, is too big. One that - * is equal to this value may be valid or not; the limit - * between valid and invalid numbers is then based on the last - * digit. For instance, if the range for longs is - * [-2147483648..2147483647] and the input base is 10, - * cutoff will be set to 214748364 and cutlim to either - * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated - * a value > 214748364, or equal but the next digit is > 7 (or 8), - * the number is too big, and we will return a range error. - * - * Set any if any `digits' consumed; make it negative to indicate - * overflow. - */ - cutoff = neg ? -(unsigned long)LONG_MIN : LONG_MAX; - cutlim = cutoff % (unsigned long)base; - cutoff /= (unsigned long)base; - for (acc = 0, any = 0;; c = *s++) { - if (isdigit(c)) - c -= '0'; - else if (isalpha(c)) - c -= isupper(c) ? 'A' - 10 : 'a' - 10; - else - break; - if (c >= base) - break; - if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim) - any = -1; - else { - any = 1; - acc *= base; - acc += c; - } - } - if (any < 0) { - acc = neg ? LONG_MIN : LONG_MAX; - errno = ERANGE; - } else if (neg) - acc = -acc; - if (endptr != 0) - *endptr = (char *)(any ? s - 1 : nptr); - return (acc); -} - -#endif -/* -** STRSTR -- find first substring in string -** -** Parameters: -** big -- the big (full) string. -** little -- the little (sub) string. -** -** Returns: -** A pointer to the first instance of little in big. -** big if little is the null string. -** NULL if little is not contained in big. -*/ - -#ifdef NEEDSTRSTR - -char * -strstr(big, little) - char *big; - char *little; -{ - register char *p = big; - int l; - - if (*little == '\0') - return big; - l = strlen(little); - - while ((p = strchr(p, *little)) != NULL) - { - if (strncmp(p, little, l) == 0) - return p; - p++; - } - return NULL; -} - -#endif -/* -** SM_GETHOSTBY{NAME,ADDR} -- compatibility routines for gethostbyXXX -** -** Some operating systems have wierd problems with the gethostbyXXX -** routines. For example, Solaris versions at least through 2.3 -** don't properly deliver a canonical h_name field. This tries to -** work around these problems. -*/ - -struct hostent * -sm_gethostbyname(name) - char *name; -{ - struct hostent *h; -#if (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) || (defined(sony_news) && defined(__svr4)) -# if SOLARIS == 20300 || SOLARIS == 203 - static struct hostent hp; - static char buf[1000]; - extern struct hostent *_switch_gethostbyname_r(); - - if (tTd(61, 10)) - printf("_switch_gethostbyname_r(%s)... ", name); - h = _switch_gethostbyname_r(name, &hp, buf, sizeof(buf), &h_errno); -# else - extern struct hostent *__switch_gethostbyname(); - - if (tTd(61, 10)) - printf("__switch_gethostbyname(%s)... ", name); - h = __switch_gethostbyname(name); -# endif -#else - int nmaps; - char *maptype[MAXMAPSTACK]; - short mapreturn[MAXMAPACTIONS]; - char hbuf[MAXNAME]; - - if (tTd(61, 10)) - printf("gethostbyname(%s)... ", name); - h = gethostbyname(name); - if (h == NULL) - { - if (tTd(61, 10)) - printf("failure\n"); - - nmaps = switch_map_find("hosts", maptype, mapreturn); - while (--nmaps >= 0) - if (strcmp(maptype[nmaps], "nis") == 0 || - strcmp(maptype[nmaps], "files") == 0) - break; - if (nmaps >= 0) - { - /* try short name */ - if (strlen(name) > (SIZE_T) sizeof hbuf - 1) - return NULL; - strcpy(hbuf, name); - shorten_hostname(hbuf); - - /* if it hasn't been shortened, there's no point */ - if (strcmp(hbuf, name) != 0) - { - if (tTd(61, 10)) - printf("gethostbyname(%s)... ", hbuf); - h = gethostbyname(hbuf); - } - } - } -#endif - if (tTd(61, 10)) - { - if (h == NULL) - printf("failure\n"); - else - printf("%s\n", h->h_name); - } - return h; -} - -struct hostent * -sm_gethostbyaddr(addr, len, type) - char *addr; - int len; - int type; -{ -#if (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) -# if SOLARIS == 20300 || SOLARIS == 203 - static struct hostent hp; - static char buf[1000]; - extern struct hostent *_switch_gethostbyaddr_r(); - - return _switch_gethostbyaddr_r(addr, len, type, &hp, buf, sizeof(buf), &h_errno); -# else - extern struct hostent *__switch_gethostbyaddr(); - - return __switch_gethostbyaddr(addr, len, type); -# endif -#else - return gethostbyaddr(addr, len, type); -#endif -} -/* -** SM_GETPW{NAM,UID} -- wrapper for getpwnam and getpwuid -*/ - -struct passwd * -sm_getpwnam(user) - char *user; -{ -#ifdef _AIX4 - extern struct passwd *_getpwnam_shadow(const char *, const int); - - return _getpwnam_shadow(user, 0); -#else - return getpwnam(user); -#endif -} - -struct passwd * -sm_getpwuid(uid) - UID_T uid; -{ -#if defined(_AIX4) && 0 - extern struct passwd *_getpwuid_shadow(const int, const int); - - return _getpwuid_shadow(uid,0); -#else - return getpwuid(uid); -#endif -} -/* -** SECUREWARE_SETUP_SECURE -- Convex SecureWare setup -** -** Set up the trusted computing environment for C2 level security -** under SecureWare. -** -** Parameters: -** uid -- uid of the user to initialize in the TCB -** -** Returns: -** none -** -** Side Effects: -** Initialized the user in the trusted computing base -*/ - -#if SECUREWARE - -# include <sys/security.h> -# include <prot.h> - -void -secureware_setup_secure(uid) - UID_T uid; -{ - int rc; - - if (getluid() != -1) - return; - - if ((rc = set_secure_info(uid)) != SSI_GOOD_RETURN) - { - switch (rc) - { - case SSI_NO_PRPW_ENTRY: - syserr("No protected passwd entry, uid = %d", uid); - break; - - case SSI_LOCKED: - syserr("Account has been disabled, uid = %d", uid); - break; - - case SSI_RETIRED: - syserr("Account has been retired, uid = %d", uid); - break; - - case SSI_BAD_SET_LUID: - syserr("Could not set LUID, uid = %d", uid); - break; - - case SSI_BAD_SET_PRIVS: - syserr("Could not set kernel privs, uid = %d", uid); - - default: - syserr("Unknown return code (%d) from set_secure_info(%d)", - rc, uid); - break; - } - finis(FALSE, EX_NOPERM); - } -} -#endif /* SECUREWARE */ -/* -** ADD_LOCAL_HOST_NAMES -- Add a hostname to class 'w' based on IP address -** -** Add hostnames to class 'w' based on the IP address read from -** the network interface. -** -** Parameters: -** sa -- a pointer to a SOCKADDR containing the address -** -** Returns: -** 0 if successful, -1 if host lookup fails. -*/ - -int -add_hostnames(sa) - SOCKADDR *sa; -{ - struct hostent *hp; - - /* lookup name with IP address */ - switch (sa->sa.sa_family) - { - case AF_INET: - hp = sm_gethostbyaddr((char *) &sa->sin.sin_addr, - sizeof(sa->sin.sin_addr), sa->sa.sa_family); - break; - - default: -#if _FFR_LOG_UNSUPPORTED_FAMILIES - /* XXX: Give warning about unsupported family */ - if (LogLevel > 3) - sm_syslog(LOG_WARNING, NOQID, - "Unsupported address family %d: %.100s", - sa->sa.sa_family, anynet_ntoa(sa)); -#endif - return -1; - } - - if (hp == NULL) - { - int save_errno = errno; - - if (LogLevel > 3) - sm_syslog(LOG_WARNING, NOQID, - "gethostbyaddr(%.100s) failed: %d\n", - anynet_ntoa(sa), -#if NAMED_BIND - h_errno -#else - -1 -#endif - ); - errno = save_errno; - return -1; - } - - /* save its cname */ - if (!wordinclass((char *) hp->h_name, 'w')) - { - setclass('w', (char *) hp->h_name); - if (tTd(0, 4)) - printf("\ta.k.a.: %s\n", hp->h_name); - } - - /* save all it aliases name */ - while (*hp->h_aliases) - { - if (!wordinclass(*hp->h_aliases, 'w')) - { - setclass('w', *hp->h_aliases); - if (tTd(0, 4)) - printf("\ta.k.a.: %s\n", *hp->h_aliases); - } - hp->h_aliases++; - } - return 0; -} -/* -** LOAD_IF_NAMES -- load interface-specific names into $=w -** -** Parameters: -** none. -** -** Returns: -** none. -** -** Side Effects: -** Loads $=w with the names of all the interfaces. -*/ - -#if defined(SIOCGIFCONF) && !SIOCGIFCONF_IS_BROKEN -struct rtentry; -struct mbuf; -# include <arpa/inet.h> -# ifndef SUNOS403 -# include <sys/time.h> -# endif -# if _AIX4 >= 40300 -# undef __P -# endif -# include <net/if.h> -#endif - -void -load_if_names() -{ -#if defined(SIOCGIFCONF) && !SIOCGIFCONF_IS_BROKEN - int s; - int i; - struct ifconf ifc; - int numifs; - - s = socket(AF_INET, SOCK_DGRAM, 0); - if (s == -1) - return; - - /* get the list of known IP address from the kernel */ -# if defined(SIOCGIFNUM) && !SIOCGIFNUM_IS_BROKEN - if (ioctl(s, SIOCGIFNUM, (char *) &numifs) < 0) - { - /* can't get number of interfaces -- fall back */ - if (tTd(0, 4)) - printf("SIOCGIFNUM failed: %s\n", errstring(errno)); - numifs = -1; - } - else if (tTd(0, 42)) - printf("system has %d interfaces\n", numifs); - if (numifs < 0) -# endif - numifs = 512; - - if (numifs <= 0) - { - close(s); - return; - } - ifc.ifc_len = numifs * sizeof (struct ifreq); - ifc.ifc_buf = xalloc(ifc.ifc_len); - if (ioctl(s, SIOCGIFCONF, (char *)&ifc) < 0) - { - if (tTd(0, 4)) - printf("SIOGIFCONF failed: %s\n", errstring(errno)); - close(s); - return; - } - - /* scan the list of IP address */ - if (tTd(0, 40)) - printf("scanning for interface specific names, ifc_len=%d\n", - ifc.ifc_len); - - for (i = 0; i < ifc.ifc_len; ) - { - struct ifreq *ifr = (struct ifreq *) &ifc.ifc_buf[i]; - SOCKADDR *sa = (SOCKADDR *) &ifr->ifr_addr; - struct in_addr ia; -#ifdef SIOCGIFFLAGS - struct ifreq ifrf; -#endif - char ip_addr[256]; - extern char *inet_ntoa(); - -#ifdef BSD4_4_SOCKADDR - if (sa->sa.sa_len > sizeof ifr->ifr_addr) - i += sizeof ifr->ifr_name + sa->sa.sa_len; - else -#endif - i += sizeof *ifr; - - if (tTd(0, 20)) - printf("%s\n", anynet_ntoa(sa)); - - if (ifr->ifr_addr.sa_family != AF_INET) - continue; - -#ifdef SIOCGIFFLAGS - bzero(&ifrf, sizeof(struct ifreq)); - strncpy(ifrf.ifr_name, ifr->ifr_name, sizeof(ifrf.ifr_name)); - ioctl(s, SIOCGIFFLAGS, (char *) &ifrf); - if (tTd(0, 41)) - printf("\tflags: %x\n", ifrf.ifr_flags); -# define IFRFREF ifrf -#else -# define IFRFREF (*ifr) -#endif - if (!bitset(IFF_UP, IFRFREF.ifr_flags)) - continue; - - /* extract IP address from the list*/ - ia = sa->sin.sin_addr; - if (ia.s_addr == INADDR_ANY || ia.s_addr == INADDR_NONE) - { - message("WARNING: interface %s is UP with %s address", - ifr->ifr_name, inet_ntoa(ia)); - continue; - } - - /* save IP address in text from */ - (void) snprintf(ip_addr, sizeof ip_addr, "[%.*s]", - sizeof ip_addr - 3, - inet_ntoa(ia)); - if (!wordinclass(ip_addr, 'w')) - { - setclass('w', ip_addr); - if (tTd(0, 4)) - printf("\ta.k.a.: %s\n", ip_addr); - } - - /* skip "loopback" interface "lo" */ - if (bitset(IFF_LOOPBACK, IFRFREF.ifr_flags)) - continue; - - (void) add_hostnames(sa); - } - free(ifc.ifc_buf); - close(s); -# undef IFRFREF -#endif -} -/* -** GET_NUM_PROCS_ONLINE -- return the number of processors currently online -** -** Parameters: -** none. -** -** Returns: -** The number of processors online. -*/ - -int -get_num_procs_online() -{ - int nproc = 0; - -#if _FFR_SCALE_LA_BY_NUM_PROCS -#ifdef _SC_NPROCESSORS_ONLN - nproc = (int) sysconf(_SC_NPROCESSORS_ONLN); -#endif -#endif - if (nproc <= 0) - nproc = 1; - return nproc; -} -/* -** SM_SYSLOG -- syslog wrapper to keep messages under SYSLOG_BUFSIZE -** -** Parameters: -** level -- syslog level -** id -- envelope ID or NULL (NOQUEUE) -** fmt -- format string -** arg... -- arguments as implied by fmt. -** -** Returns: -** none -*/ - -/* VARARGS3 */ -void -# ifdef __STDC__ -sm_syslog(int level, const char *id, const char *fmt, ...) -# else -sm_syslog(level, id, fmt, va_alist) - int level; - const char *id; - const char *fmt; - va_dcl -#endif -{ - static char *buf = NULL; - static size_t bufsize = MAXLINE; - char *begin, *end; - int seq = 1; - int idlen; - extern int SnprfOverflow; - extern int SyslogErrno; - extern char *DoprEnd; - VA_LOCAL_DECL - extern void sm_dopr __P((char *, const char *, va_list)); - - SyslogErrno = errno; - if (id == NULL) - { - id = "NOQUEUE"; - idlen = 9; - } - else if (strcmp(id, NOQID) == 0) - { - id = ""; - idlen = 0; - } - else - idlen = strlen(id + 2); -bufalloc: - if (buf == NULL) - buf = (char *) xalloc(sizeof(char) * bufsize); - - /* do a virtual vsnprintf into buf */ - VA_START(fmt); - buf[0] = 0; - DoprEnd = buf + bufsize - 1; - SnprfOverflow = 0; - sm_dopr(buf, fmt, ap); - *DoprEnd = '\0'; - VA_END; - /* end of virtual vsnprintf */ - - if (SnprfOverflow) - { - /* String too small, redo with correct size */ - bufsize += SnprfOverflow + 1; - free(buf); - buf = NULL; - goto bufalloc; - } - if ((strlen(buf) + idlen + 1) < SYSLOG_BUFSIZE) - { -#if LOG - if (*id == '\0') - syslog(level, "%s", buf); - else - syslog(level, "%s: %s", id, buf); -#else - /*XXX should do something more sensible */ - if (*id == '\0') - fprintf(stderr, "%s\n", buf); - else - fprintf(stderr, "%s: %s\n", id, buf); -#endif - return; - } - - begin = buf; - while (*begin != '\0' && - (strlen(begin) + idlen + 5) > SYSLOG_BUFSIZE) - { - char save; - - if (seq == 999) - { - /* Too many messages */ - break; - } - end = begin + SYSLOG_BUFSIZE - idlen - 12; - while (end > begin) - { - /* Break on comma or space */ - if (*end == ',' || *end == ' ') - { - end++; /* Include separator */ - break; - } - end--; - } - /* No separator, break midstring... */ - if (end == begin) - end = begin + SYSLOG_BUFSIZE - idlen - 12; - save = *end; - *end = 0; -#if LOG - syslog(level, "%s[%d]: %s ...", id, seq++, begin); -#else - fprintf(stderr, "%s[%d]: %s ...\n", id, seq++, begin); -#endif - *end = save; - begin = end; - } - if (seq == 999) -#if LOG - syslog(level, "%s[%d]: log terminated, too many parts", id, seq); -#else - fprintf(stderr, "%s[%d]: log terminated, too many parts\n", id, seq); -#endif - else if (*begin != '\0') -#if LOG - syslog(level, "%s[%d]: %s", id, seq, begin); -#else - fprintf(stderr, "%s[%d]: %s\n", id, seq, begin); -#endif -} -/* -** HARD_SYSLOG -- call syslog repeatedly until it works -** -** Needed on HP-UX, which apparently doesn't guarantee that -** syslog succeeds during interrupt handlers. -*/ - -#if defined(__hpux) && !defined(HPUX11) - -# define MAXSYSLOGTRIES 100 -# undef syslog -# ifdef V4FS -# define XCNST const -# define CAST (const char *) -# else -# define XCNST -# define CAST -# endif - -void -# ifdef __STDC__ -hard_syslog(int pri, XCNST char *msg, ...) -# else -hard_syslog(pri, msg, va_alist) - int pri; - XCNST char *msg; - va_dcl -# endif -{ - int i; - char buf[SYSLOG_BUFSIZE]; - VA_LOCAL_DECL; - - VA_START(msg); - vsnprintf(buf, sizeof buf, msg, ap); - VA_END; - - for (i = MAXSYSLOGTRIES; --i >= 0 && syslog(pri, CAST "%s", buf) < 0; ) - continue; -} - -# undef CAST -#endif -/* -** LOCAL_HOSTNAME_LENGTH -** -** This is required to get sendmail to compile against BIND 4.9.x -** on Ultrix. -*/ - -#if defined(ultrix) && NAMED_BIND - -# include <resolv.h> -# if __RES >= 19931104 && __RES < 19950621 - -int -local_hostname_length(hostname) - char *hostname; -{ - int len_host, len_domain; - - if (!*_res.defdname) - res_init(); - len_host = strlen(hostname); - len_domain = strlen(_res.defdname); - if (len_host > len_domain && - (strcasecmp(hostname + len_host - len_domain,_res.defdname) == 0) && - hostname[len_host - len_domain - 1] == '.') - return len_host - len_domain - 1; - else - return 0; -} - -# endif -#endif -/* -** Compile-Time options -*/ - -char *CompileOptions[] = -{ -#ifdef HESIOD - "HESIOD", -#endif -#if HES_GETMAILHOST - "HES_GETMAILHOST", -#endif -#ifdef LDAPMAP - "LDAPMAP", -#endif -#ifdef MAP_REGEX - "MAP_REGEX", -#endif -#if LOG - "LOG", -#endif -#if MATCHGECOS - "MATCHGECOS", -#endif -#if MIME7TO8 - "MIME7TO8", -#endif -#if MIME8TO7 - "MIME8TO7", -#endif -#if NAMED_BIND - "NAMED_BIND", -#endif -#ifdef NDBM - "NDBM", -#endif -#if NETINET - "NETINET", -#endif -#if NETINFO - "NETINFO", -#endif -#if NETISO - "NETISO", -#endif -#if NETNS - "NETNS", -#endif -#if NETUNIX - "NETUNIX", -#endif -#if NETX25 - "NETX25", -#endif -#ifdef NEWDB - "NEWDB", -#endif -#ifdef NIS - "NIS", -#endif -#ifdef NISPLUS - "NISPLUS", -#endif -#if QUEUE - "QUEUE", -#endif -#if SCANF - "SCANF", -#endif -#if SMTP - "SMTP", -#endif -#if SMTPDEBUG - "SMTPDEBUG", -#endif -#ifdef SUID_ROOT_FILES_OK - "SUID_ROOT_FILES_OK", -#endif -#if TCPWRAPPERS - "TCPWRAPPERS", -#endif -#if USERDB - "USERDB", -#endif -#if XDEBUG - "XDEBUG", -#endif -#ifdef XLA - "XLA", -#endif - NULL -}; - - -/* -** OS compile options. -*/ - -char *OsCompileOptions[] = -{ -#if BOGUS_O_EXCL - "BOGUS_O_EXCL", -#endif -#if HASFCHMOD - "HASFCHMOD", -#endif -#if HASFLOCK - "HASFLOCK", -#endif -#if HASGETDTABLESIZE - "HASGETDTABLESIZE", -#endif -#if HASGETUSERSHELL - "HASGETUSERSHELL", -#endif -#if HASINITGROUPS - "HASINITGROUPS", -#endif -#if HASLSTAT - "HASLSTAT", -#endif -#if HASSETREUID - "HASSETREUID", -#endif -#if HASSETRLIMIT - "HASSETRLIMIT", -#endif -#if HASSETSID - "HASSETSID", -#endif -#if HASSETUSERCONTEXT - "HASSETUSERCONTEXT", -#endif -#if HASSETVBUF - "HASSETVBUF", -#endif -#if HASSNPRINTF - "HASSNPRINTF", -#endif -#if HAS_ST_GEN - "HAS_ST_GEN", -#endif -#if HASSTRERROR - "HASSTRERROR", -#endif -#if HASULIMIT - "HASULIMIT", -#endif -#if HASUNAME - "HASUNAME", -#endif -#if HASUNSETENV - "HASUNSETENV", -#endif -#if HASWAITPID - "HASWAITPID", -#endif -#if IDENTPROTO - "IDENTPROTO", -#endif -#if IP_SRCROUTE - "IP_SRCROUTE", -#endif -#if O_EXLOCK && HASFLOCK && !BOGUS_O_EXCL - "LOCK_ON_OPEN", -#endif -#if NEEDFSYNC - "NEEDFSYNC", -#endif -#if NOFTRUNCATE - "NOFTRUNCATE", -#endif -#if RLIMIT_NEEDS_SYS_TIME_H - "RLIMIT_NEEDS_SYS_TIME_H", -#endif -#if SAFENFSPATHCONF - "SAFENFSPATHCONF", -#endif -#if SECUREWARE - "SECUREWARE", -#endif -#if SHARE_V1 - "SHARE_V1", -#endif -#if SIOCGIFCONF_IS_BROKEN - "SIOCGIFCONF_IS_BROKEN", -#endif -#if SIOCGIFNUM_IS_BROKEN - "SIOCGIFNUM_IS_BROKEN", -#endif -#if SYS5SETPGRP - "SYS5SETPGRP", -#endif -#if SYSTEM5 - "SYSTEM5", -#endif -#if USE_SA_SIGACTION - "USE_SA_SIGACTION", -#endif -#if USE_SIGLONGJMP - "USE_SIGLONGJMP", -#endif -#if USESETEUID - "USESETEUID", -#endif - NULL -}; diff --git a/src/conf.h b/src/conf.h deleted file mode 100644 index 6097c27..0000000 --- a/src/conf.h +++ /dev/null @@ -1,2522 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - * - * @(#)conf.h 8.385 (Berkeley) 1/28/1999 - */ - -/* -** CONF.H -- All user-configurable parameters for sendmail -** -** Send updates to sendmail@Sendmail.ORG so they will be -** included in the next release. -*/ - -#ifdef __GNUC__ -struct rusage; /* forward declaration to get gcc to shut up in wait.h */ -#endif - -# include <sys/param.h> -# include <sys/types.h> -# include <sys/stat.h> -#ifndef __QNX__ -/* in QNX this grabs bogus LOCK_* manifests */ -# include <sys/file.h> -#endif -# include <sys/wait.h> -# include <limits.h> -# include <fcntl.h> -# include <signal.h> -# include <netdb.h> -# include <pwd.h> - -/********************************************************************** -** Table sizes, etc.... -** There shouldn't be much need to change these.... -**********************************************************************/ - -# define MAXLINE 2048 /* max line length */ -# define MAXNAME 256 /* max length of a name */ -# define MAXPV 40 /* max # of parms to mailers */ -# define MAXATOM 200 /* max atoms per address */ -# define MAXMAILERS 25 /* maximum mailers known to system */ -# define MAXRWSETS 200 /* max # of sets of rewriting rules */ -# define MAXPRIORITIES 25 /* max values for Precedence: field */ -# define MAXMXHOSTS 100 /* max # of MX records for one host */ -# define SMTPLINELIM 990 /* maximum SMTP line length */ -# define MAXKEY 128 /* maximum size of a database key */ -# define MEMCHUNKSIZE 1024 /* chunk size for memory allocation */ -# define MAXUSERENVIRON 100 /* max envars saved, must be >= 3 */ -# define MAXALIASDB 12 /* max # of alias databases */ -# define MAXMAPSTACK 12 /* max # of stacked or sequenced maps */ -# define MAXTOCLASS 8 /* max # of message timeout classes */ -# define MAXMIMEARGS 20 /* max args in Content-Type: */ -# define MAXMIMENESTING 20 /* max MIME multipart nesting */ -# define QUEUESEGSIZE 1000 /* increment for queue size */ -# define MAXQFNAME 20 /* max qf file name length */ -# define MACBUFSIZE 4096 /* max expanded macro buffer size */ -# define TOBUFSIZE 512 /* max buffer to hold address list */ -# define MAXSHORTSTR 203 /* max short string length */ -# if _FFR_MAX_MIME_HEADER_LENGTH -# define MAXMACNAMELEN 25 /* max macro name length */ -# else -# define MAXMACNAMELEN 20 /* max macro name length */ -# endif -# ifndef MAXHDRSLEN -# define MAXHDRSLEN (32 * 1024) /* max size of message headers */ -# endif - -/********************************************************************** -** Compilation options. -** #define these to 1 if they are available; -** #define them to 0 otherwise. -** All can be overridden from Makefile. -**********************************************************************/ - -# ifndef NETINET -# define NETINET 1 /* include internet support */ -# endif - -# ifndef NETISO -# define NETISO 0 /* do not include ISO socket support */ -# endif - -# ifndef NAMED_BIND -# define NAMED_BIND 1 /* use Berkeley Internet Domain Server */ -# endif - -# ifndef XDEBUG -# define XDEBUG 1 /* enable extended debugging */ -# endif - -# ifndef MATCHGECOS -# define MATCHGECOS 1 /* match user names from gecos field */ -# endif - -# ifndef DSN -# define DSN 1 /* include delivery status notification code */ -# endif - -# if !defined(USERDB) && (defined(NEWDB) || defined(HESIOD)) -# define USERDB 1 /* look in user database */ -# endif - -# ifndef MIME8TO7 -# define MIME8TO7 1 /* 8->7 bit MIME conversions */ -# endif - -# ifndef MIME7TO8 -# define MIME7TO8 1 /* 7->8 bit MIME conversions */ -# endif - -/********************************************************************** -** "Hard" compilation options. -** #define these if they are available; comment them out otherwise. -** These cannot be overridden from the Makefile, and should really not -** be turned off unless absolutely necessary. -**********************************************************************/ - -# define LOG 1 /* enable logging -- don't turn off */ - -/********************************************************************** -** End of site-specific configuration. -**********************************************************************/ -/* -** General "standard C" defines. -** -** These may be undone later, to cope with systems that claim to -** be Standard C but aren't. Gcc is the biggest offender -- it -** doesn't realize that the library is part of the language. -** -** Life would be much easier if we could get rid of this sort -** of bozo problems. -*/ - -#ifdef __STDC__ -# define HASSETVBUF 1 /* we have setvbuf(3) in libc */ -#endif - -/* -** Assume you have standard calls; can be #undefed below if necessary. -*/ - -# define HASLSTAT 1 /* has lstat(2) call */ -/********************************************************************** -** Operating system configuration. -** -** Unless you are porting to a new OS, you shouldn't have to -** change these. -**********************************************************************/ - -/* -** HP-UX -- tested for 8.07, 9.00, and 9.01. -** -** If V4FS is defined, compile for HP-UX 10.0. -** 11.x support from Richard Allen <ra@hp.is>. -*/ - -#ifdef __hpux - /* common definitions for HP-UX 9.x and 10.x */ -# undef m_flags /* conflict between Berkeley DB 1.85 db.h & sys/sysmacros.h on HP 300 */ -# define SYSTEM5 1 /* include all the System V defines */ -# define HASINITGROUPS 1 /* has initgroups(3) call */ -# define HASFCHMOD 1 /* has fchmod(2) syscall */ -# define USESETEUID 1 /* has useable seteuid(2) call */ -# define BOGUS_O_EXCL 1 /* exclusive open follows symlinks */ -# define seteuid(e) setresuid(-1, e, -1) -# define IP_SRCROUTE 1 /* can check IP source routing */ -# define LA_TYPE LA_HPUX -# define SPT_TYPE SPT_PSTAT -# define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() implementation */ -# define GIDSET_T gid_t -# ifndef HASGETUSERSHELL -# define HASGETUSERSHELL 0 /* getusershell(3) causes core dumps */ -# endif -# ifndef HPUX11 -# define syslog hard_syslog -# endif -# define SAFENFSPATHCONF 1 /* pathconf(2) pessimizes on NFS filesystems */ - -# ifdef V4FS - /* HP-UX 10.x */ -# define _PATH_UNIX "/stand/vmunix" -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/etc/mail/sendmail.cf" -# endif -# ifndef _PATH_SENDMAILPID -# define _PATH_SENDMAILPID "/etc/mail/sendmail.pid" -# endif -# ifndef IDENTPROTO -# define IDENTPROTO 1 /* TCP/IP implementation fixed in 10.0 */ -# endif - -# else - /* HP-UX 9.x */ -# define _PATH_UNIX "/hp-ux" -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" -# endif -# ifndef IDENTPROTO -# define IDENTPROTO 0 /* TCP/IP implementation is broken */ -# endif -# ifdef __STDC__ -extern void hard_syslog(int, char *, ...); -# else -extern void hard_syslog(); -# endif -# define FDSET_CAST (int *) /* cast for fd_set parameters to select */ -# endif - -#endif - - -/* -** IBM AIX 4.x -*/ - -#ifdef _AIX4 -# define _AIX3 1 /* pull in AIX3 stuff */ -# define USESETEUID 1 /* seteuid(2) works */ -# define TZ_TYPE TZ_NAME /* use tzname[] vector */ -# define SOCKOPT_LEN_T size_t /* arg#5 to getsockopt */ -# if _AIX4 >= 40200 -# define HASSETREUID 1 /* setreuid(2) works as of AIX 4.2 */ -# define SOCKADDR_LEN_T size_t /* e.g., arg#3 to accept, getsockname */ -# endif -# if defined(_ILS_MACROS) /* IBM versions aren't side-effect clean */ -# undef isascii -# define isascii(c) !(c & ~0177) -# undef isdigit -# define isdigit(__a) (_IS(__a,_ISDIGIT)) -# undef isspace -# define isspace(__a) (_IS(__a,_ISSPACE)) -# endif -#endif - - -/* -** IBM AIX 3.x -- actually tested for 3.2.3 -*/ - -#ifdef _AIX3 -# include <paths.h> -# include <sys/machine.h> /* to get byte order */ -# include <sys/select.h> -# define HASINITGROUPS 1 /* has initgroups(3) call */ -# define HASUNAME 1 /* use System V uname(2) system call */ -# define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ -# define HASFCHMOD 1 /* has fchmod(2) syscall */ -# define IP_SRCROUTE 0 /* Something is broken with getsockopt() */ -# define GIDSET_T gid_t -# define SFS_TYPE SFS_STATFS /* use <sys/statfs.h> statfs() impl */ -# define SPT_PADCHAR '\0' /* pad process title with nulls */ -# define LA_TYPE LA_INT -# define FSHIFT 16 -# define LA_AVENRUN "avenrun" -#endif - - -/* -** IBM AIX 2.2.1 -- actually tested for osupdate level 2706+1773 -** -** From Mark Whetzel <markw@wg.waii.com>. -*/ - -#ifdef AIX /* AIX/RT compiler pre-defines this */ -# include <paths.h> -# include <sys/time.h> /* AIX/RT resource.h does NOT include this */ -# define HASINITGROUPS 1 /* has initgroups(3) call */ -# define HASUNAME 1 /* use System V uname(2) system call */ -# define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ -# define HASFCHMOD 0 /* does not have fchmod(2) syscall */ -# define HASSETREUID 1 /* use setreuid(2) -lbsd system call */ -# define HASSETVBUF 1 /* use setvbuf(2) system call */ -# define HASSETRLIMIT 0 /* does not have setrlimit call */ -# define HASFLOCK 0 /* does not have flock call - use fcntl */ -# define HASULIMIT 1 /* use ulimit instead of setrlimit call */ -# define NEEDGETOPT 1 /* Do we need theirs or ours */ -# define SYS5SETPGRP 1 /* don't have setpgid on AIX/RT */ -# define IP_SRCROUTE 0 /* Something is broken with getsockopt() */ -# define BSD4_3 1 /* NOT bsd 4.4 or posix signals */ -# define GIDSET_T int -# define SFS_TYPE SFS_STATFS /* use <sys/statfs.h> statfs() impl */ -# define SPT_PADCHAR '\0' /* pad process title with nulls */ -# define LA_TYPE LA_SUBR /* use our ported loadavgd daemon */ -# define TZ_TYPE TZ_TZNAME /* use tzname[] vector */ -# define ARBPTR_T int * -# define void int -typedef int pid_t; -/* RTisms for BSD compatibility, specified in the Makefile - define BSD 1 - define BSD_INCLUDES 1 - define BSD_REMAP_SIGNAL_TO_SIGVEC - RTisms needed above */ -/* make this sendmail in a completely different place */ -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/usr/local/newmail/sendmail.cf" -# endif -# ifndef _PATH_SENDMAILPID -# define _PATH_SENDMAILPID "/usr/local/newmail/sendmail.pid" -# endif -#endif - - -/* -** Silicon Graphics IRIX -** -** Compiles on 4.0.1. -** -** Use IRIX64 instead of IRIX for 64-bit IRIX (6.0). -** Use IRIX5 instead of IRIX for IRIX 5.x. -** -** This version tries to be adaptive using _MIPS_SIM: -** _MIPS_SIM == _ABIO32 (= 1) Abi: -32 on IRIX 6.2 -** _MIPS_SIM == _ABIN32 (= 2) Abi: -n32 on IRIX 6.2 -** _MIPS_SIM == _ABI64 (= 3) Abi: -64 on IRIX 6.2 -** -** _MIPS_SIM is 1 also on IRIX 5.3 -** -** IRIX64 changes from Mark R. Levinson <ml@cvdev.rochester.edu>. -** IRIX5 changes from Kari E. Hurtta <Kari.Hurtta@fmi.fi>. -** Adaptive changes from Kari E. Hurtta <Kari.Hurtta@fmi.fi>. -*/ - -#if defined(__sgi) -# ifndef IRIX -# define IRIX -# endif -# if _MIPS_SIM > 0 && !defined(IRIX5) -# define IRIX5 /* IRIX5 or IRIX6 */ -# endif -# if _MIPS_SIM > 1 && !defined(IRIX6) && !defined(IRIX64) -# define IRIX6 /* IRIX6 */ -# endif - -#endif - -#ifdef IRIX -# define SYSTEM5 1 /* this is a System-V derived system */ -# define HASSETREUID 1 /* has setreuid(2) call */ -# define HASINITGROUPS 1 /* has initgroups(3) call */ -# define HASFCHMOD 1 /* has fchmod(2) syscall */ -# define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ -# define IP_SRCROUTE 1 /* can check IP source routing */ -# define setpgid BSDsetpgrp -# define GIDSET_T gid_t -# define SFS_TYPE SFS_4ARGS /* four argument statfs() call */ -# define SFS_BAVAIL f_bfree /* alternate field name */ -# define SYSLOG_BUFSIZE 512 -# ifdef IRIX6 -# define STAT64 1 -# define QUAD_T unsigned long long -# define LA_TYPE LA_IRIX6 /* figure out at run time */ -# define SAFENFSPATHCONF 0 /* pathconf(2) lies on NFS filesystems */ -# else -# define LA_TYPE LA_INT - -# ifdef IRIX64 -# define STAT64 1 -# define QUAD_T unsigned long long -# define NAMELISTMASK 0x7fffffffffffffff /* mask for nlist() values */ -# else -# define STAT64 0 -# define NAMELISTMASK 0x7fffffff /* mask for nlist() values */ -# endif -# endif -# if defined(IRIX64) || defined(IRIX5) || defined(IRIX6) -# include <sys/cdefs.h> -# include <paths.h> -# define ARGV_T char *const * -# define HASSETRLIMIT 1 /* has setrlimit(2) syscall */ -# define HASGETDTABLESIZE 1 /* has getdtablesize(2) syscall */ -# define HASSTRERROR 1 /* has strerror(3) */ -# else -# define ARGV_T const char ** -# define WAITUNION 1 /* use "union wait" as wait argument type */ -# endif -#endif - - -/* -** SunOS and Solaris -** -** Tested on SunOS 4.1.x (a.k.a. Solaris 1.1.x) and -** Solaris 2.4 (a.k.a. SunOS 5.4). -*/ - -#if defined(sun) && !defined(BSD) - -# include <sys/time.h> -# define HASINITGROUPS 1 /* has initgroups(3) call */ -# define HASUNAME 1 /* use System V uname(2) system call */ -# define HASFCHMOD 1 /* has fchmod(2) syscall */ -# define IP_SRCROUTE 1 /* can check IP source routing */ -# define SAFENFSPATHCONF 1 /* pathconf(2) pessimizes on NFS filesystems */ - -# ifdef SOLARIS_2_3 -# define SOLARIS 20300 /* for back compat only -- use -DSOLARIS=20300 */ -# endif - -# if defined(NOT_SENDMAIL) && !defined(SOLARIS) && defined(sun) && (defined(__svr4__) || defined(__SVR4)) -# define SOLARIS 1 /* unknown Solaris version */ -# endif - -# ifdef SOLARIS - /* Solaris 2.x (a.k.a. SunOS 5.x) */ -# ifndef __svr4__ -# define __svr4__ /* use all System V Releae 4 defines below */ -# endif -# define GIDSET_T gid_t -# define USE_SA_SIGACTION 1 /* use sa_sigaction field */ -# ifndef _PATH_UNIX -# define _PATH_UNIX "/dev/ksyms" -# endif -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/etc/mail/sendmail.cf" -# endif -# ifndef _PATH_SENDMAILPID -# define _PATH_SENDMAILPID "/etc/mail/sendmail.pid" -# endif -# ifndef _PATH_HOSTS -# define _PATH_HOSTS "/etc/inet/hosts" -# endif -# ifndef SYSLOG_BUFSIZE -# define SYSLOG_BUFSIZE 1024 /* allow full size syslog buffer */ -# endif -# ifndef TZ_TYPE -# define TZ_TYPE TZ_TZNAME -# endif -# if SOLARIS >= 20300 || (SOLARIS < 10000 && SOLARIS >= 203) -# define USESETEUID 1 /* seteuid works as of 2.3 */ -# endif -# if SOLARIS >= 20500 || (SOLARIS < 10000 && SOLARIS >= 205) -# define HASSETREUID 1 /* setreuid works as of 2.5 */ -# if SOLARIS < 207 || (SOLARIS > 10000 && SOLARIS < 20700) -# ifndef LA_TYPE -# define LA_TYPE LA_KSTAT /* use kstat(3k) -- may work in < 2.5 */ -# endif -# endif -# endif -# if SOLARIS >= 20600 || (SOLARIS < 10000 && SOLARIS >= 206) -# define HASSNPRINTF 1 /* has snprintf starting in 2.6 */ -# endif -# if SOLARIS >= 20700 || (SOLARIS < 10000 && SOLARIS >= 207) -# ifndef LA_TYPE -# define LA_TYPE LA_SUBR /* getloadavg(3c) appears in 2.7 */ -# endif -# define HASGETUSERSHELL 1 /* getusershell(3c) bug fixed in 2.7 */ -# endif -# ifndef HASGETUSERSHELL -# define HASGETUSERSHELL 0 /* getusershell(3) causes core dumps pre-2.7 */ -# endif - -# else - /* SunOS 4.0.3 or 4.1.x */ -# define HASGETUSERSHELL 1 /* DOES have getusershell(3) call in libc */ -# define HASSETREUID 1 /* has setreuid(2) call */ -# ifndef HASFLOCK -# define HASFLOCK 1 /* has flock(2) call */ -# endif -# define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() implementation */ -# define TZ_TYPE TZ_TM_ZONE /* use tm->tm_zone */ -# include <memory.h> -# include <vfork.h> -# ifdef __GNUC__ -# define strtoul strtol /* gcc library bogosity */ -# endif - -# ifdef SUNOS403 - /* special tweaking for SunOS 4.0.3 */ -# include <malloc.h> -# define BSD4_3 1 /* 4.3 BSD-based */ -# define NEEDSTRSTR 1 /* need emulation of strstr(3) routine */ -# define WAITUNION 1 /* use "union wait" as wait argument type */ -# undef WIFEXITED -# undef WEXITSTATUS -# undef HASUNAME -# define setpgid setpgrp -# define MODE_T int -typedef int pid_t; -extern char *getenv(); - -# else - /* 4.1.x specifics */ -# define HASSETSID 1 /* has Posix setsid(2) call */ -# define HASSETVBUF 1 /* we have setvbuf(3) in libc */ - -# endif -# endif - -# ifndef LA_TYPE -# define LA_TYPE LA_INT -# endif - -#endif /* sun && !BSD */ - -/* -** DG/UX -** -** Tested on 5.4.2 and 5.4.3. Use DGUX_5_4_2 to get the -** older support. -** 5.4.3 changes from Mark T. Robinson <mtr@ornl.gov>. -*/ - -#ifdef DGUX_5_4_2 -# define DGUX 1 -#endif - -#ifdef DGUX -# define SYSTEM5 1 -# define LA_TYPE LA_DGUX -# define HASSETREUID 1 /* has setreuid(2) call */ -# define HASUNAME 1 /* use System V uname(2) system call */ -# define HASSETSID 1 /* has Posix setsid(2) call */ -# define HASINITGROUPS 1 /* has initgroups(3) call */ -# define IP_SRCROUTE 0 /* does not have <netinet/ip_var.h> */ -# define HASGETUSERSHELL 0 /* does not have getusershell(3) */ -# define HASSNPRINTF 1 /* has snprintf(3) */ -# ifndef IDENTPROTO -# define IDENTPROTO 0 /* TCP/IP implementation is broken */ -# endif -# define SPT_TYPE SPT_NONE /* don't use setproctitle */ -# define SFS_TYPE SFS_4ARGS /* four argument statfs() call */ - -/* these include files must be included early on DG/UX */ -# include <netinet/in.h> -# include <arpa/inet.h> - -/* compiler doesn't understand const? */ -# define const - -# ifdef DGUX_5_4_2 -# define inet_addr dgux_inet_addr -extern long dgux_inet_addr(); -# endif -#endif - - -/* -** Digital Ultrix 4.2A or 4.3 -** -** Apparently, fcntl locking is broken on 4.2A, in that locks are -** not dropped when the process exits. This causes major problems, -** so flock is the only alternative. -*/ - -#ifdef ultrix -# define HASSETREUID 1 /* has setreuid(2) call */ -# define HASUNSETENV 1 /* has unsetenv(3) call */ -# define HASINITGROUPS 1 /* has initgroups(3) call */ -# define HASUNAME 1 /* use System V uname(2) system call */ -# define HASFCHMOD 1 /* has fchmod(2) syscall */ -# ifndef HASFLOCK -# define HASFLOCK 1 /* has flock(2) call */ -# endif -# define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ -# ifndef BROKEN_RES_SEARCH -# define BROKEN_RES_SEARCH 1 /* res_search(unknown) returns h_errno=0 */ -# endif -# ifdef vax -# define LA_TYPE LA_FLOAT -# else -# define LA_TYPE LA_INT -# define LA_AVENRUN "avenrun" -# endif -# define SFS_TYPE SFS_MOUNT /* use <sys/mount.h> statfs() impl */ -# ifndef IDENTPROTO -# define IDENTPROTO 0 /* pre-4.4 TCP/IP implementation is broken */ -# endif -# define SYSLOG_BUFSIZE 256 -#endif - - -/* -** OSF/1 for KSR. -** -** Contributed by Todd C. Miller <Todd.Miller@cs.colorado.edu> -*/ - -#ifdef __ksr__ -# define __osf__ 1 /* get OSF/1 defines below */ -# ifndef TZ_TYPE -# define TZ_TYPE TZ_TZNAME /* use tzname[] vector */ -# endif -#endif - - -/* -** OSF/1 for Intel Paragon. -** -** Contributed by Jeff A. Earickson <jeff@ssd.intel.com> -** of Intel Scalable Systems Divison. -*/ - -#ifdef __PARAGON__ -# define __osf__ 1 /* get OSF/1 defines below */ -# ifndef TZ_TYPE -# define TZ_TYPE TZ_TZNAME /* use tzname[] vector */ -# endif -# define GIDSET_T gid_t -# define MAXNAMLEN NAME_MAX -#endif - - -/* -** OSF/1 (tested on Alpha) -- now known as Digital UNIX. -** -** Tested for 3.2 and 4.0. -*/ - -#ifdef __osf__ -# define HASUNSETENV 1 /* has unsetenv(3) call */ -# define USESETEUID 1 /* has useable seteuid(2) call */ -# define HASINITGROUPS 1 /* has initgroups(3) call */ -# define HASFCHMOD 1 /* has fchmod(2) syscall */ -# define IP_SRCROUTE 1 /* can check IP source routing */ -# define HAS_ST_GEN 1 /* has st_gen field in stat struct */ -# ifndef HASFLOCK -# define HASFLOCK 1 /* has flock(2) call */ -# endif -# define LA_TYPE LA_ALPHAOSF -# define SFS_TYPE SFS_STATVFS /* use <sys/statvfs.h> statfs() impl */ -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/var/adm/sendmail/sendmail.cf" -# endif -# ifndef _PATH_SENDMAILPID -# define _PATH_SENDMAILPID "/var/run/sendmail.pid" -# endif -# define bcopy(s, d, l) (memmove((d), (s), (l))) -# define bzero(d, l) (memset((d), '\0', (l))) -# define bcmp(s, d, l) (memcmp((s), (d), (l))) -#endif - - -/* -** NeXTstep -*/ - -#ifdef NeXT -# define HASINITGROUPS 1 /* has initgroups(3) call */ -# define NEEDPUTENV 2 /* need putenv(3) call; no setenv(3) call */ -# ifndef HASFLOCK -# define HASFLOCK 1 /* has flock(2) call */ -# endif -# define NEEDGETOPT 1 /* need a replacement for getopt(3) */ -# define WAITUNION 1 /* use "union wait" as wait argument type */ -# define UID_T int /* compiler gripes on uid_t */ -# define GID_T int /* ditto for gid_t */ -# define MODE_T int /* and mode_t */ -# define setpgid setpgrp -# ifndef NOT_SENDMAIL -# define sleep sleepX -# endif -# ifndef LA_TYPE -# define LA_TYPE LA_MACH -# endif -# define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() implementation */ -# ifndef _POSIX_SOURCE -typedef int pid_t; -# undef WEXITSTATUS -# undef WIFEXITED -# endif -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/etc/sendmail/sendmail.cf" -# endif -# ifndef _PATH_SENDMAILPID -# define _PATH_SENDMAILPID "/etc/sendmail/sendmail.pid" -# endif - -# ifdef TCPWRAPPERS -# ifndef HASUNSETENV -# define HASUNSETENV 1 -# endif -# undef NEEDPUTENV -# endif - -#endif - -/* -** Apple Rhapsody -** Contributed by Wilfredo Sanchez <wsanchez@apple.com> -*/ - -#ifdef __APPLE__ -# define HASFCHMOD 1 /* has fchmod(2) syscall */ -# define HASFLOCK 1 /* has flock(2) syscall */ -# define HASUNAME 1 /* has uname(2) syscall */ -# define HASUNSETENV 1 -# define HASSETSID 1 /* has the setsid(2) POSIX syscall */ -# define HASINITGROUPS 1 -# define HASSETVBUF 1 -# define HASSETREUID 1 -# define USESETEUID 1 /* has useable seteuid(2) call */ -# define HASLSTAT 1 -# define HASSETRLIMIT 1 -# define HASWAITPID 1 -# define HASSTRERROR 1 /* has strerror(3) */ -# define HASSNPRINTF 1 /* has snprintf(3) and vsnprintf(3) */ -# define USESTRERROR 1 /* has strerror(3) */ -# define HASGETDTABLESIZE 1 -# define HASGETUSERSHELL 1 -# define NEEDGETOPT 1 /* need a replacement for getopt(3) */ -# define BSD4_4_SOCKADDR /* has sa_len */ -# define NETLINK 1 /* supports AF_LINK */ -# define HAS_ST_GEN 1 /* has st_gen field in stat struct */ -# define GIDSET_T gid_t -# define LA_TYPE LA_SUBR /* use getloadavg(3) */ -# define SFS_TYPE SFS_MOUNT /* use <sys/mount.h> statfs() impl */ -# define SPT_TYPE SPT_PSSTRINGS -# define SPT_PADCHAR '\0' /* pad process title with nulls */ -# define ERRLIST_PREDEFINED /* don't declare sys_errlist */ -#endif - - -/* -** 4.4 BSD -** -** See also BSD defines. -*/ - -#if defined(BSD4_4) && !defined(__bsdi__) && !defined(__GNU__) -# include <paths.h> -# define HASUNSETENV 1 /* has unsetenv(3) call */ -# define USESETEUID 1 /* has useable seteuid(2) call */ -# define HASFCHMOD 1 /* has fchmod(2) syscall */ -# define HASSNPRINTF 1 /* has snprintf(3) and vsnprintf(3) */ -# define HASSTRERROR 1 /* has strerror(3) */ -# define HAS_ST_GEN 1 /* has st_gen field in stat struct */ -# include <sys/cdefs.h> -# define ERRLIST_PREDEFINED /* don't declare sys_errlist */ -# define BSD4_4_SOCKADDR /* has sa_len */ -# define NEED_PRINTF_PERCENTQ 1 /* doesn't have %lld */ -# define NETLINK 1 /* supports AF_LINK */ -# ifndef LA_TYPE -# define LA_TYPE LA_SUBR -# endif -# define SFS_TYPE SFS_MOUNT /* use <sys/mount.h> statfs() impl */ -# define SPT_TYPE SPT_PSSTRINGS /* use PS_STRINGS pointer */ -#endif - - -/* -** BSD/OS (was BSD/386) (all versions) -** From Tony Sanders, BSDI -*/ - -#ifdef __bsdi__ -# include <paths.h> -# define HASUNSETENV 1 /* has the unsetenv(3) call */ -# define HASSETSID 1 /* has the setsid(2) POSIX syscall */ -# define USESETEUID 1 /* has useable seteuid(2) call */ -# define HASFCHMOD 1 /* has fchmod(2) syscall */ -# define HASSNPRINTF 1 /* has snprintf(3) and vsnprintf(3) */ -# define HASUNAME 1 /* has uname(2) syscall */ -# define HASSTRERROR 1 /* has strerror(3) */ -# define HAS_ST_GEN 1 /* has st_gen field in stat struct */ -# include <sys/cdefs.h> -# define ERRLIST_PREDEFINED /* don't declare sys_errlist */ -# define BSD4_4_SOCKADDR /* has sa_len */ -# define NETLINK 1 /* supports AF_LINK */ -# define SFS_TYPE SFS_MOUNT /* use <sys/mount.h> statfs() impl */ -# ifndef LA_TYPE -# define LA_TYPE LA_SUBR -# endif -# define GIDSET_T gid_t -# define QUAD_T quad_t -# if defined(_BSDI_VERSION) && _BSDI_VERSION >= 199312 - /* version 1.1 or later */ -# undef SPT_TYPE -# define SPT_TYPE SPT_BUILTIN /* setproctitle is in libc */ -# else - /* version 1.0 or earlier */ -# define SPT_PADCHAR '\0' /* pad process title with nulls */ -# endif -# if defined(_BSDI_VERSION) && _BSDI_VERSION >= 199701 /* on 3.x */ -# define HASSETUSERCONTEXT 1 /* has setusercontext */ -# endif -#endif - - -/* -** QNX 4.2x -** Contributed by Glen McCready <glen@qnx.com>. -** -** Should work with all versions of QNX. -*/ - -#if defined(__QNX__) -# include <unix.h> -# include <sys/select.h> -# undef NGROUPS_MAX -# define HASSETSID 1 /* has the setsid(2) POSIX syscall */ -# define USESETEUID 1 /* has useable seteuid(2) call */ -# define HASFCHMOD 1 /* has fchmod(2) syscall */ -# define HASGETDTABLESIZE 1 /* has getdtablesize(2) call */ -# define HASSETREUID 1 /* has setreuid(2) call */ -# define HASSTRERROR 1 /* has strerror(3) */ -# define HASFLOCK 0 -# undef HASINITGROUPS /* has initgroups(3) call */ -# define NEEDGETOPT 1 /* use sendmail's getopt */ -# define IP_SRCROUTE 1 /* can check IP source routing */ -# define TZ_TYPE TZ_TMNAME /* use tmname variable */ -# define GIDSET_T gid_t -# define LA_TYPE LA_ZERO -# define SFS_TYPE SFS_NONE -# define SPT_TYPE SPT_REUSEARGV -# define SPT_PADCHAR '\0' /* pad process title with nulls */ -# define HASGETUSERSHELL 0 -# define E_PSEUDOBASE 512 -# define bcopy(s, d, l) (memmove((d), (s), (l))) -# define bzero(d, l) (memset((d), '\0', (l))) -# define bcmp(s, d, l) (memcmp((s), (d), (l))) -# define _FILE_H_INCLUDED -#endif - - -/* -** FreeBSD / NetBSD / OpenBSD (all architectures, all versions) -** -** 4.3BSD clone, closer to 4.4BSD for FreeBSD 1.x and NetBSD 0.9x -** 4.4BSD-Lite based for FreeBSD 2.x and NetBSD 1.x -** -** See also BSD defines. -*/ - -#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) -# include <paths.h> -# define HASUNSETENV 1 /* has unsetenv(3) call */ -# define HASSETSID 1 /* has the setsid(2) POSIX syscall */ -# define USESETEUID 1 /* has useable seteuid(2) call */ -# define HASFCHMOD 1 /* has fchmod(2) syscall */ -# define HASSNPRINTF 1 /* has snprintf(3) and vsnprintf(3) */ -# define HASUNAME 1 /* has uname(2) syscall */ -# define HASSTRERROR 1 /* has strerror(3) */ -# define HAS_ST_GEN 1 /* has st_gen field in stat struct */ -# define NEED_PRINTF_PERCENTQ 1 /* doesn't have %lld */ -# include <sys/cdefs.h> -# define ERRLIST_PREDEFINED /* don't declare sys_errlist */ -# define BSD4_4_SOCKADDR /* has sa_len */ -# define NETLINK 1 /* supports AF_LINK */ -# define SAFENFSPATHCONF 1 /* pathconf(2) pessimizes on NFS filesystems */ -# define GIDSET_T gid_t -# define QUAD_T unsigned long long -# ifndef LA_TYPE -# define LA_TYPE LA_SUBR -# endif -# define SFS_TYPE SFS_MOUNT /* use <sys/mount.h> statfs() impl */ -# if defined(__NetBSD__) && (NetBSD > 199307 || NetBSD0_9 > 1) -# undef SPT_TYPE -# define SPT_TYPE SPT_BUILTIN /* setproctitle is in libc */ -# endif -# if defined(__FreeBSD__) -# undef SPT_TYPE -# if __FreeBSD__ >= 2 -# include <osreldate.h> -# if __FreeBSD_version >= 199512 /* 2.2-current when it appeared */ -# include <libutil.h> -# define SPT_TYPE SPT_BUILTIN -# endif -# if __FreeBSD_version >= 222000 /* 2.2.2-release and later */ -# define HASSETUSERCONTEXT 1 /* BSDI-style login classes */ -# endif -# endif -# ifndef SPT_TYPE -# define SPT_TYPE SPT_REUSEARGV -# define SPT_PADCHAR '\0' /* pad process title with nulls */ -# endif -# endif -# if defined(__OpenBSD__) -# undef SPT_TYPE -# define SPT_TYPE SPT_BUILTIN /* setproctitle is in libc */ -# endif -#endif - - - -/* -** Mach386 -** -** For mt Xinu's Mach386 system. -*/ - -#if defined(MACH) && defined(i386) && !defined(__GNU__) -# define MACH386 1 -# define HASUNSETENV 1 /* has unsetenv(3) call */ -# define HASINITGROUPS 1 /* has initgroups(3) call */ -# ifndef HASFLOCK -# define HASFLOCK 1 /* has flock(2) call */ -# endif -# define NEEDGETOPT 1 /* need a replacement for getopt(3) */ -# define NEEDSTRTOL 1 /* need the strtol() function */ -# define setpgid setpgrp -# ifndef LA_TYPE -# define LA_TYPE LA_FLOAT -# endif -# define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() implementation */ -# undef HASSETVBUF /* don't actually have setvbuf(3) */ -# undef WEXITSTATUS -# undef WIFEXITED -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" -# endif -# ifndef _PATH_SENDMAILPID -# define _PATH_SENDMAILPID "/etc/sendmail.pid" -# endif -#endif - - - -/* -** GNU OS (hurd) -** Largely BSD & posix compatible. -** Port contributed by Miles Bader <miles@gnu.ai.mit.edu>. -*/ - -#ifdef __GNU_HURD__ -# define SIOCGIFCONF_IS_BROKEN 1 -# define IP_SRCROUTE 0 -# define HASFCHMOD 1 -# define HASFLOCK 1 -# define HASUNAME 1 -# define HASUNSETENV 1 -# define HASSETSID 1 -# define HASINITGROUPS 1 -# define HASSETVBUF 1 -# define HASSETREUID 1 -# define USESETEUID 1 -# define HASLSTAT 1 -# define HASSETRLIMIT 1 -# define HASWAITPID 1 -# define HASGETDTABLESIZE 1 -# define HASSTRERROR 1 -/* # define NEEDGETOPT 1 */ -# define HASGETUSERSHELL 1 -# define ERRLIST_PREDEFINED 1 -# define BSD4_4_SOCKADDR 1 -# define GIDSET_T gid_t -# define LA_TYPE LA_MACH - -/* GNU uses mach[34], which renames some rpcs from mach2.x. */ -# define host_self mach_host_self -# define SFS_TYPE SFS_STATFS -# define SPT_TYPE SPT_CHANGEARGV - -/* GNU has no MAXPATHLEN; ideally the code should be changed to not use it. */ -# define MAXPATHLEN 2048 - -/* Define device num frobbing macros. */ -# define major(x) ((x)>>8) -# define minor(x) ((x)&0xFF) -#endif /* GNU */ - -/* -** 4.3 BSD -- this is for very old systems -** -** Should work for mt Xinu MORE/BSD and Mips UMIPS-BSD 2.1. -** -** You'll also have to install a new resolver library. -** I don't guarantee that support for this environment is complete. -*/ - -#if defined(oldBSD43) || defined(MORE_BSD) || defined(umipsbsd) -# define NEEDVPRINTF 1 /* need a replacement for vprintf(3) */ -# define NEEDGETOPT 1 /* need a replacement for getopt(3) */ -# define ARBPTR_T char * -# define setpgid setpgrp -# ifndef LA_TYPE -# define LA_TYPE LA_FLOAT -# endif -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" -# endif -# ifndef IDENTPROTO -# define IDENTPROTO 0 /* TCP/IP implementation is broken */ -# endif -# undef WEXITSTATUS -# undef WIFEXITED -typedef short pid_t; -extern int errno; -#endif - - -/* -** SCO Unix -** -** This includes three parts: -** -** The first is for SCO OpenServer 5. -** (Contributed by Keith Reynolds <keithr@sco.COM>). -** -** SCO OpenServer 5 has a compiler version number macro, -** which we can use to figure out what version we're on. -** This may have to change in future releases. -** -** The second is for SCO UNIX 3.2v4.2/Open Desktop 3.0. -** (Contributed by Philippe Brand <phb@colombo.telesys-innov.fr>). -** -** The third is for SCO UNIX 3.2v4.0/Open Desktop 2.0 and earlier. -*/ - -/* SCO OpenServer 5 */ -#if _SCO_DS >= 1 -# include <paths.h> -# define SIOCGIFNUM_IS_BROKEN 1 /* SIOCGIFNUM returns bogus value */ -# define HASSNPRINTF 1 /* has snprintf(3) call */ -# define HASFCHMOD 1 /* has fchmod(2) call */ -# define HASSETRLIMIT 1 /* has setrlimit(2) call */ -# define USESETEUID 1 /* has seteuid(2) call */ -# define HASINITGROUPS 1 /* has initgroups(3) call */ -# define HASGETDTABLESIZE 1 /* has getdtablesize(2) call */ -# define RLIMIT_NEEDS_SYS_TIME_H 1 -# ifndef LA_TYPE -# define LA_TYPE LA_DEVSHORT -# endif -# define _PATH_AVENRUN "/dev/table/avenrun" -# ifndef _SCO_unix_4_2 -# define _SCO_unix_4_2 -# else -# define SOCKADDR_LEN_T size_t /* e.g., arg#3 to accept, getsockname */ -# define SOCKOPT_LEN_T size_t /* arg#5 to getsockopt */ -# endif -#endif - -/* SCO UNIX 3.2v4.2/Open Desktop 3.0 */ -#ifdef _SCO_unix_4_2 -# define _SCO_unix_ -# define HASSETREUID 1 /* has setreuid(2) call */ -#endif - -/* SCO UNIX 3.2v4.0 Open Desktop 2.0 and earlier */ -#ifdef _SCO_unix_ -# include <sys/stream.h> /* needed for IP_SRCROUTE */ -# define SYSTEM5 1 /* include all the System V defines */ -# define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ -# define NOFTRUNCATE 0 /* has (simulated) ftruncate call */ -# define USE_SIGLONGJMP 1 /* sigsetjmp needed for signal handling */ -# define MAXPATHLEN PATHSIZE -# define SFS_TYPE SFS_4ARGS /* use <sys/statfs.h> 4-arg impl */ -# define SFS_BAVAIL f_bfree /* alternate field name */ -# define SPT_TYPE SPT_SCO /* write kernel u. area */ -# define TZ_TYPE TZ_TM_NAME /* use tm->tm_name */ -# define UID_T uid_t -# define GID_T gid_t -# define GIDSET_T gid_t -# define _PATH_UNIX "/unix" -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" -# endif -# ifndef _PATH_SENDMAILPID -# define _PATH_SENDMAILPID "/etc/sendmail.pid" -# endif - -/* stuff fixed in later releases */ -# ifndef _SCO_unix_4_2 -# define SYS5SIGNALS 1 /* SysV signal semantics -- reset on each sig */ -# endif - -# ifndef _SCO_DS -# define ftruncate chsize /* use chsize(2) to emulate ftruncate */ -# define NEEDFSYNC 1 /* needs the fsync(2) call stub */ -# define NETUNIX 0 /* no unix domain socket support */ -# define LA_TYPE LA_SHORT -# endif - -#endif - - -/* -** ISC (SunSoft) Unix. -** -** Contributed by J.J. Bailey <jjb@jagware.bcc.com> -*/ - -#ifdef ISC_UNIX -# include <net/errno.h> -# include <sys/stream.h> /* needed for IP_SRCROUTE */ -# include <sys/bsdtypes.h> -# define SYSTEM5 1 /* include all the System V defines */ -# define SYS5SIGNALS 1 /* SysV signal semantics -- reset on each sig */ -# define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ -# define HASSETREUID 1 /* has setreuid(2) call */ -# define NEEDFSYNC 1 /* needs the fsync(2) call stub */ -# define NETUNIX 0 /* no unix domain socket support */ -# define MAXPATHLEN 1024 -# define LA_TYPE LA_SHORT -# define SFS_TYPE SFS_STATFS /* use <sys/statfs.h> statfs() impl */ -# define SFS_BAVAIL f_bfree /* alternate field name */ -# define _PATH_UNIX "/unix" -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" -# endif -# ifndef _PATH_SENDMAILPID -# define _PATH_SENDMAILPID "/etc/sendmail.pid" -# endif - -#endif - - -/* -** Altos System V (5.3.1) -** Contributed by Tim Rice <tim@trr.metro.net>. -*/ - -#ifdef ALTOS_SYSTEM_V -# include <sys/stream.h> -# include <limits.h> -# define SYSTEM5 1 /* include all the System V defines */ -# define SYS5SIGNALS 1 /* SysV signal semantics -- reset on each sig */ -# define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ -# define WAITUNION 1 /* use "union wait" as wait argument type */ -# define NEEDFSYNC 1 /* no fsync(2) in system library */ -# define NEEDSTRSTR 1 /* need emulation of the strstr(3) call */ -# define NOFTRUNCATE 1 /* do not have ftruncate(2) */ -# define MAXPATHLEN PATH_MAX -# define LA_TYPE LA_SHORT -# define SFS_TYPE SFS_STATFS /* use <sys/statfs.h> statfs() impl */ -# define SFS_BAVAIL f_bfree /* alternate field name */ -# define TZ_TYPE TZ_TZNAME /* use tzname[] vector */ -# define NETUNIX 0 /* no unix domain socket support */ -# undef WIFEXITED -# undef WEXITSTATUS -# define strtoul strtol /* gcc library bogosity */ - -typedef unsigned short uid_t; -typedef unsigned short gid_t; -typedef short pid_t; -typedef unsigned long mode_t; - -/* some stuff that should have been in the include files */ -# include <grp.h> -extern char *malloc(); -extern struct passwd *getpwent(); -extern struct passwd *getpwnam(); -extern struct passwd *getpwuid(); -extern char *getenv(); -extern struct group *getgrgid(); -extern struct group *getgrnam(); - -#endif - - -/* -** ConvexOS 11.0 and later -** -** "Todd C. Miller" <millert@mroe.cs.colorado.edu> claims this -** works on 9.1 as well. -** -** ConvexOS 11.5 and later, should work on 11.0 as defined. -** For pre-ConvexOOS 11.0, define NEEDGETOPT, undef IDENTPROTO -** -** Eric Schnoebelen (eric@cirr.com) For CONVEX Computer Corp. -** (now the CONVEX Technologies Center of Hewlett Packard) -*/ - -#ifdef _CONVEX_SOURCE -# define HASGETDTABLESIZE 1 /* has getdtablesize(2) */ -# define HASINITGROUPS 1 /* has initgroups(3) */ -# define HASUNAME 1 /* use System V uname(2) system call */ -# define HASSETSID 1 /* has POSIX setsid(2) call */ -# define HASUNSETENV 1 /* has unsetenv(3) */ -# define HASFLOCK 1 /* has flock(2) */ -# define HASSETRLIMIT 1 /* has setrlimit(2) */ -# define HASSETREUID 1 /* has setreuid(2) */ -# define BROKEN_RES_SEARCH 1 /* res_search(unknown) returns h_error=0 */ -# define NEEDPUTENV 1 /* needs putenv (written in terms of setenv) */ -# define NEEDGETOPT 0 /* need replacement for getopt(3) */ -# define IP_SRCROUTE 0 /* Something is broken with getsockopt() */ -# define LA_TYPE LA_FLOAT -# define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() implementation */ -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" -# endif -# ifndef S_IREAD -# define S_IREAD _S_IREAD -# define S_IWRITE _S_IWRITE -# define S_IEXEC _S_IEXEC -# define S_IFMT _S_IFMT -# define S_IFCHR _S_IFCHR -# define S_IFBLK _S_IFBLK -# endif -# ifndef TZ_TYPE -# define TZ_TYPE TZ_TIMEZONE -# endif -# ifndef IDENTPROTO -# define IDENTPROTO 1 -# endif -# ifndef SHARE_V1 -# define SHARE_V1 1 /* version 1 of the fair share scheduler */ -# endif -# if !defined(__GNUC__ ) -# define UID_T int /* GNUC gets it right, ConvexC botches */ -# define GID_T int /* GNUC gets it right, ConvexC botches */ -# endif -# if SECUREWARE -# define FORK fork /* SecureWare wants the real fork! */ -# else -# define FORK vfork /* the rest of the OS versions don't care */ -# endif -#endif - - -/* -** RISC/os 4.52 -** -** Gives a ton of warning messages, but otherwise compiles. -*/ - -#ifdef RISCOS - -# define HASUNSETENV 1 /* has unsetenv(3) call */ -# ifndef HASFLOCK -# define HASFLOCK 1 /* has flock(2) call */ -# endif -# define WAITUNION 1 /* use "union wait" as wait argument type */ -# define NEEDGETOPT 1 /* need a replacement for getopt(3) */ -# define NEEDPUTENV 1 /* need putenv(3) call */ -# define NEEDSTRSTR 1 /* need emulation of the strstr(3) call */ -# define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() implementation */ -# define LA_TYPE LA_INT -# define LA_AVENRUN "avenrun" -# define _PATH_UNIX "/unix" -# undef WIFEXITED - -# define setpgid setpgrp - -extern int errno; -typedef int pid_t; -# define SIGFUNC_DEFINED -# define SIGFUNC_RETURN (0) -# define SIGFUNC_DECL int -typedef int (*sigfunc_t)(); -extern char *getenv(); -extern void *malloc(); - -/* added for RISC/os 4.01...which is dumber than 4.50 */ -# ifdef RISCOS_4_0 -# ifndef ARBPTR_T -# define ARBPTR_T char * -# endif -# undef HASFLOCK -# define HASFLOCK 0 -# endif /* RISCOS_4_0 */ - -# include <sys/time.h> - -#endif - - -/* -** Linux 0.99pl10 and above... -** -** Thanks to, in reverse order of contact: -** -** John Kennedy <warlock@csuchico.edu> -** Andrew Pam <avatar@aus.xanadu.com> -** Florian La Roche <rzsfl@rz.uni-sb.de> -** Karl London <karl@borg.demon.co.uk> -** -** Last compiled against: [07/21/98 @ 11:47:34 AM (Tuesday)] -** sendmail 8.9.1 bind-8.1.2 db-2.4.14 -** gcc-2.8.1 glibc-2.0.94 linux-2.1.109 -** -** NOTE: Override HASFLOCK as you will but, as of 1.99.6, mixed-style -** file locking is no longer allowed. In particular, make sure -** your DBM library and sendmail are both using either flock(2) -** *or* fcntl(2) file locking, but not both. -*/ - -#ifdef __linux__ -# define BSD 1 /* include BSD defines */ -# define USESETEUID 0 /* Have it due to POSIX, but doesn't work */ -# define NEEDGETOPT 1 /* need a replacement for getopt(3) */ -# define HASUNAME 1 /* use System V uname(2) system call */ -# define HASUNSETENV 1 /* has unsetenv(3) call */ -# ifndef HASSNPRINTF -# define HASSNPRINTF 1 /* has snprintf(3) and vsnprintf(3) */ -# endif -# define ERRLIST_PREDEFINED /* don't declare sys_errlist */ -# define GIDSET_T gid_t /* from <linux/types.h> */ -# define HASGETUSERSHELL 0 /* getusershell(3) broken in Slackware 2.0 */ -# define IP_SRCROUTE 0 /* linux <= 1.2.8 doesn't support IP_OPTIONS */ -# define USE_SIGLONGJMP 1 /* sigsetjmp needed for signal handling */ -# ifndef HASFLOCK -# include <linux/version.h> -# if LINUX_VERSION_CODE < 66399 -# define HASFLOCK 0 /* flock(2) is broken after 0.99.13 */ -# else -# define HASFLOCK 1 /* flock(2) fixed after 1.3.95 */ -# endif -# endif -# ifndef LA_TYPE -# define LA_TYPE LA_PROCSTR -# endif -# define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() impl */ -# define SPT_PADCHAR '\0' /* pad process title with nulls */ -# ifndef TZ_TYPE -# define TZ_TYPE TZ_NONE /* no standard for Linux */ -# endif -# ifndef _PATH_SENDMAILPID -# define _PATH_SENDMAILPID "/var/run/sendmail.pid" -# endif -# include <sys/sysmacros.h> -# undef atol /* wounded in <stdlib.h> */ -#endif - - -/* -** DELL SVR4 Issue 2.2, and others -** From Kimmo Suominen <kim@grendel.lut.fi> -** -** It's on #ifdef DELL_SVR4 because Solaris also gets __svr4__ -** defined, and the definitions conflict. -** -** Peter Wemm <peter@perth.DIALix.oz.au> claims that the setreuid -** trick works on DELL 2.2 (SVR4.0/386 version 4.0) and ESIX 4.0.3A -** (SVR4.0/386 version 3.0). -*/ - -#ifdef DELL_SVR4 - /* no changes necessary */ - /* see general __svr4__ defines below */ -#endif - - -/* -** Apple A/UX 3.0 -*/ - -#ifdef _AUX_SOURCE -# include <sys/sysmacros.h> -# define BSD /* has BSD routines */ -# define HASSETRLIMIT 0 /* ... but not setrlimit(2) */ -# define BROKEN_RES_SEARCH 1 /* res_search(unknown) returns h_errno=0 */ -# define BOGUS_O_EXCL 1 /* exclusive open follows symlinks */ -# define HASUNAME 1 /* use System V uname(2) system call */ -# define HASFCHMOD 1 /* has fchmod(2) syscall */ -# define HASINITGROUPS 1 /* has initgroups(3) call */ -# define HASSETVBUF 1 /* has setvbuf(3) in libc */ -# define HASSTRERROR 1 /* has strerror(3) */ -# define SIGFUNC_DEFINED /* sigfunc_t already defined */ -# define SIGFUNC_RETURN /* POSIX-mode */ -# define SIGFUNC_DECL void /* POSIX-mode */ -# define ERRLIST_PREDEFINED 1 -# ifndef IDENTPROTO -# define IDENTPROTO 0 /* TCP/IP implementation is broken */ -# endif -# ifndef LA_TYPE -# define LA_TYPE LA_INT -# define FSHIFT 16 -# endif -# define LA_AVENRUN "avenrun" -# define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() implementation */ -# define TZ_TYPE TZ_TZNAME -# ifndef _PATH_UNIX -# define _PATH_UNIX "/unix" /* should be in <paths.h> */ -# endif -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" -# endif -# undef WIFEXITED -# undef WEXITSTATUS -#endif - - -/* -** Encore UMAX V -** -** Not extensively tested. -*/ - -#ifdef UMAXV -# define HASUNAME 1 /* use System V uname(2) system call */ -# define HASSETVBUF 1 /* we have setvbuf(3) in libc */ -# define HASINITGROUPS 1 /* has initgroups(3) call */ -# define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ -# define SYS5SIGNALS 1 /* SysV signal semantics -- reset on each sig */ -# define SYS5SETPGRP 1 /* use System V setpgrp(2) syscall */ -# define SFS_TYPE SFS_4ARGS /* four argument statfs() call */ -# define MAXPATHLEN PATH_MAX -extern struct passwd *getpwent(), *getpwnam(), *getpwuid(); -extern struct group *getgrent(), *getgrnam(), *getgrgid(); -# undef WIFEXITED -# undef WEXITSTATUS -#endif - - -/* -** Stardent Titan 3000 running TitanOS 4.2. -** -** Must be compiled in "cc -43" mode. -** -** From Kate Hedstrom <kate@ahab.rutgers.edu>. -** -** Note the tweaking below after the BSD defines are set. -*/ - -#ifdef titan -# define setpgid setpgrp -typedef int pid_t; -# undef WIFEXITED -# undef WEXITSTATUS -#endif - - -/* -** Sequent DYNIX 3.2.0 -** -** From Jim Davis <jdavis@cs.arizona.edu>. -*/ - -#ifdef sequent - -# define BSD 1 -# define HASUNSETENV 1 -# define BSD4_3 1 /* to get signal() in conf.c */ -# define WAITUNION 1 -# define LA_TYPE LA_FLOAT -# ifdef _POSIX_VERSION -# undef _POSIX_VERSION /* set in <unistd.h> */ -# endif -# undef HASSETVBUF /* don't actually have setvbuf(3) */ -# define setpgid setpgrp - -/* Have to redefine WIFEXITED to take an int, to work with waitfor() */ -# undef WIFEXITED -# define WIFEXITED(s) (((union wait*)&(s))->w_stopval != WSTOPPED && \ - ((union wait*)&(s))->w_termsig == 0) -# define WEXITSTATUS(s) (((union wait*)&(s))->w_retcode) -typedef int pid_t; -# define isgraph(c) (isprint(c) && (c != ' ')) - -# ifndef IDENTPROTO -# define IDENTPROTO 0 /* TCP/IP implementation is broken */ -# endif - -# ifndef _PATH_UNIX -# define _PATH_UNIX "/dynix" -# endif -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" -# endif -#endif - - -/* -** Sequent DYNIX/ptx v2.0 (and higher) -** -** For DYNIX/ptx v1.x, undefine HASSETREUID. -** -** From Tim Wright <timw@sequent.com>. -** Update from Jack Woolley <jwoolley@sctcorp.com>, 26 Dec 1995, -** for DYNIX/ptx 4.0.2. -*/ - -#ifdef _SEQUENT_ -# include <sys/stream.h> -# define SYSTEM5 1 /* include all the System V defines */ -# define HASSETSID 1 /* has POSIX setsid(2) call */ -# define HASINITGROUPS 1 /* has initgroups(3) call */ -# define HASSETREUID 1 /* has setreuid(2) call */ -# define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ -# define GIDSET_T gid_t -# define LA_TYPE LA_INT -# define SFS_TYPE SFS_STATFS /* use <sys/statfs.h> statfs() impl */ -# define SPT_TYPE SPT_NONE /* don't use setproctitle */ -# ifndef IDENTPROTO -# define IDENTPROTO 0 /* TCP/IP implementation is broken */ -# endif -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" -# endif -# ifndef _PATH_SENDMAILPID -# define _PATH_SENDMAILPID "/etc/sendmail.pid" -# endif -#endif - - -/* -** Cray Unicos -** -** Ported by David L. Kensiski, Sterling Sofware <kensiski@nas.nasa.gov> -*/ - -#ifdef UNICOS -# define SYSTEM5 1 /* include all the System V defines */ -# define SYS5SIGNALS 1 /* SysV signal semantics -- reset on each sig */ -# define MAXPATHLEN PATHSIZE -# define LA_TYPE LA_ZERO -# define SFS_TYPE SFS_4ARGS /* four argument statfs() call */ -# define SFS_BAVAIL f_bfree /* alternate field name */ -#endif - - -/* -** Apollo DomainOS -** -** From Todd Martin <tmartint@tus.ssi1.com> & Don Lewis <gdonl@gv.ssi1.com> -** -** 15 Jan 1994; updated 2 Aug 1995 -** -*/ - -#ifdef apollo -# define HASSETREUID 1 /* has setreuid(2) call */ -# define HASINITGROUPS 1 /* has initgroups(2) call */ -# define IP_SRCROUTE 0 /* does not have <netinet/ip_var.h> */ -# define SPT_TYPE SPT_NONE /* don't use setproctitle */ -# define LA_TYPE LA_SUBR /* use getloadavg.c */ -# define SFS_TYPE SFS_4ARGS /* four argument statfs() call */ -# define SFS_BAVAIL f_bfree /* alternate field name */ -# define TZ_TYPE TZ_TZNAME -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" -# endif -# ifndef _PATH_SENDMAILPID -# define _PATH_SENDMAILPID "/etc/sendmail.pid" -# endif -# undef S_IFSOCK /* S_IFSOCK and S_IFIFO are the same */ -# undef S_IFIFO -# define S_IFIFO 0010000 -# ifndef IDENTPROTO -# define IDENTPROTO 0 /* TCP/IP implementation is broken */ -# endif -# define RLIMIT_NEEDS_SYS_TIME_H 1 -# if defined(NGROUPS_MAX) && !NGROUPS_MAX -# undef NGROUPS_MAX -# endif -#endif - -/* -** System V Rel 5.x (a.k.a Unixware7 w/o BSD-Compatiblity Libs ie. native) -** -** Contributed by Paul Gampe <paulg@apnic.net> -*/ - -#ifdef __svr5__ -# include <sys/mkdev.h> -# define __svr4__ -# define SYS5SIGNALS 1 -# define HASSETSID 1 -# define HASSETREUID 1 -# define HASWAITPID 1 -# define HASGETDTABLESIZE 1 -# define GIDSET_T gid_t -# define SOCKADDR_LEN_T size_t -# define SOCKOPT_LEN_T size_t -# ifndef _PATH_UNIX -# define _PATH_UNIX "/stand/unix" -# endif -# define SPT_PADCHAR '\0' /* pad process title with nulls */ -# define SYSLOG_BUFSIZE 1024 /* unsure */ -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/etc/sendmail.cf" -# endif -# ifndef _PATH_SENDMAILPID -# define _PATH_SENDMAILPID "/etc/sendmail.pid" -# endif -#endif - -/* ###################################################################### */ - -/* -** UnixWare 2.x -*/ - -#ifdef UNIXWARE2 -# define UNIXWARE 1 -# define HASSNPRINTF 1 /* has snprintf(3) and vsnprintf(3) */ -# undef offsetof /* avoid stddefs.h, sys/sysmacros.h conflict */ -#endif - - -/* -** UnixWare 1.1.2. -** -** Updated by Petr Lampa <lampa@fee.vutbr.cz>. -** From Evan Champion <evanc@spatial.synapse.org>. -*/ - -#ifdef UNIXWARE -# include <sys/mkdev.h> -# define SYSTEM5 1 -# define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ -# define HASSETREUID 1 -# define HASSETSID 1 -# define HASINITGROUPS 1 -# define GIDSET_T gid_t -# define SLEEP_T unsigned -# define SFS_TYPE SFS_STATVFS -# define LA_TYPE LA_ZERO -# undef WIFEXITED -# undef WEXITSTATUS -# ifndef _PATH_UNIX -# define _PATH_UNIX "/unix" -# endif -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/usr/ucblib/sendmail.cf" -# endif -# ifndef _PATH_SENDMAILPID -# define _PATH_SENDMAILPID "/usr/ucblib/sendmail.pid" -# endif -# define SYSLOG_BUFSIZE 128 -#endif - - -/* -** Intergraph CLIX 3.1 -** -** From Paul Southworth <pauls@locust.cic.net> -*/ - -#ifdef CLIX -# define SYSTEM5 1 /* looks like System V */ -# ifndef HASGETUSERSHELL -# define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ -# endif -# define DEV_BSIZE 512 /* device block size not defined */ -# define GIDSET_T gid_t -# undef LOG /* syslog not available */ -# define NEEDFSYNC 1 /* no fsync in system library */ -# define GETSHORT _getshort -#endif - - -/* -** NCR MP-RAS 2.x (SysVr4) with Wollongong TCP/IP -** -** From Kevin Darcy <kevin@tech.mis.cfc.com>. -*/ - -#ifdef NCR_MP_RAS2 -# include <sys/sockio.h> -# define __svr4__ -# define IP_SRCROUTE 0 /* Something is broken with getsockopt() */ -# define SYSLOG_BUFSIZE 1024 -# define SPT_TYPE SPT_NONE -#endif - - -/* -** NCR MP-RAS 3.x (SysVr4) with STREAMware TCP/IP -** -** From Tom Moore <Tom.Moore@DaytonOH.NCR.COM> -*/ - -#ifdef NCR_MP_RAS3 -# define __svr4__ -# define SIOCGIFNUM_IS_BROKEN 1 /* SIOCGIFNUM has non-std interface */ -# define SYSLOG_BUFSIZE 1024 -# define SPT_TYPE SPT_NONE -#endif - - -/* -** Tandem NonStop-UX SVR4 -** -** From Rick McCarty <mccarty@mpd.tandem.com>. -*/ - -#ifdef NonStop_UX_BXX -# define __svr4__ -#endif - - -/* -** Hitachi 3050R & 3050RX Workstations running HI-UX/WE2. -** -** Tested for 1.04 and 1.03 -** From Akihiro Hashimoto ("Hash") <hash@dominic.ipc.chiba-u.ac.jp>. -*/ - -#ifdef __H3050R -# define SYSTEM5 1 /* include all the System V defines */ -# define HASINITGROUPS 1 /* has initgroups(3) call */ -# define setreuid(r, e) setresuid(r, e, -1) -# define LA_TYPE LA_FLOAT -# define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() implementation */ -# define HASSETVBUF /* HI-UX has no setlinebuf */ -# ifndef GIDSET_T -# define GIDSET_T gid_t -# endif -# ifndef _PATH_UNIX -# define _PATH_UNIX "/HI-UX" -# endif -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" -# endif -# ifndef IDENTPROTO -# define IDENTPROTO 0 /* TCP/IP implementation is broken */ -# endif -# ifndef HASGETUSERSHELL -# define HASGETUSERSHELL 0 /* getusershell(3) causes core dumps */ -# endif - -/* -** avoid m_flags conflict between Berkeley DB 1.85 db.h & sys/sysmacros.h -** on HIUX 3050 -*/ -# undef m_flags - -# ifdef __STDC__ -extern int syslog(int, char *, ...); -#else -extern int syslog(); -# endif - -#endif - - -/* -** Amdahl UTS System V 2.1.5 (SVr3-based) -** -** From: Janet Jackson <janet@dialix.oz.au>. -*/ - -#ifdef _UTS -# include <sys/sysmacros.h> -# undef HASLSTAT /* has symlinks, but they cause problems */ -# define NEEDFSYNC 1 /* system fsync(2) fails on non-EFS filesys */ -# define SYS5SIGNALS 1 /* System V signal semantics */ -# define SYS5SETPGRP 1 /* use System V setpgrp(2) syscall */ -# define HASUNAME 1 /* use System V uname(2) system call */ -# define HASINITGROUPS 1 /* has initgroups(3) function */ -# define HASSETVBUF 1 /* has setvbuf(3) function */ -# ifndef HASGETUSERSHELL -# define HASGETUSERSHELL 0 /* does not have getusershell(3) function */ -# endif -# define GIDSET_T gid_t /* type of 2nd arg to getgroups(2) isn't int */ -# define LA_TYPE LA_ZERO /* doesn't have load average */ -# define SFS_TYPE SFS_4ARGS /* use 4-arg statfs() */ -# define SFS_BAVAIL f_bfree /* alternate field name */ -# define _PATH_UNIX "/unix" -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" -# endif -#endif - -/* -** Cray Computer Corporation's CSOS -** -** From Scott Bolte <scott@craycos.com>. -*/ - -#ifdef _CRAYCOM -# define SYSTEM5 1 /* include all the System V defines */ -# define SYS5SIGNALS 1 /* SysV signal semantics -- reset on each sig */ -# define NEEDFSYNC 1 /* no fsync in system library */ -# define MAXPATHLEN PATHSIZE -# define LA_TYPE LA_ZERO -# define SFS_TYPE SFS_4ARGS /* four argument statfs() call */ -# define SFS_BAVAIL f_bfree /* alternate field name */ -# define _POSIX_CHOWN_RESTRICTED -1 -extern struct group *getgrent(), *getgrnam(), *getgrgid(); -#endif - - -/* -** Sony NEWS-OS 4.2.1R and 6.0.3 -** -** From Motonori NAKAMURA <motonori@cs.ritsumei.ac.jp>. -*/ - -#ifdef sony_news -# ifndef __svr4 - /* NEWS-OS 4.2.1R */ -# ifndef BSD -# define BSD /* has BSD routines */ -# endif -# define HASUNSETENV 1 /* has unsetenv(2) call */ -# undef HASSETVBUF /* don't actually have setvbuf(3) */ -# define WAITUNION 1 /* use "union wait" as wait argument type */ -# define LA_TYPE LA_INT -# define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() implementation */ -# ifndef HASFLOCK -# define HASFLOCK 1 /* has flock(2) call */ -# endif -# define setpgid setpgrp -# undef WIFEXITED -# undef WEXITSTATUS -# define MODE_T int /* system include files have no mode_t */ -typedef int pid_t; -typedef int (*sigfunc_t)(); -# define SIGFUNC_DEFINED -# define SIGFUNC_RETURN (0) -# define SIGFUNC_DECL int - -# else - /* NEWS-OS 6.0.3 with /bin/cc */ -# ifndef __svr4__ -# define __svr4__ /* use all System V Releae 4 defines below */ -# endif -# define HASSETSID 1 /* has Posix setsid(2) call */ -# define HASGETUSERSHELL 1 /* DOES have getusershell(3) call in libc */ -# define LA_TYPE LA_READKSYM /* use MIOC_READKSYM ioctl */ -# ifndef SPT_TYPE -# define SPT_TYPE SPT_SYSMIPS /* use sysmips() (OS 6.0.2 or later) */ -# endif -# define GIDSET_T gid_t -# undef WIFEXITED -# undef WEXITSTATUS -# ifndef SYSLOG_BUFSIZE -# define SYSLOG_BUFSIZE 1024 -# endif -# define _PATH_UNIX "/stand/unix" -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/etc/mail/sendmail.cf" -# endif -# ifndef _PATH_SENDMAILPID -# define _PATH_SENDMAILPID "/etc/mail/sendmail.pid" -# endif - -# endif -#endif - - -/* -** Omron LUNA/UNIOS-B 3.0, LUNA2/Mach and LUNA88K Mach -** -** From Motonori NAKAMURA <motonori@cs.ritsumei.ac.jp>. -*/ - -#ifdef luna -# ifndef IDENTPROTO -# define IDENTPROTO 0 /* TCP/IP implementation is broken */ -# endif -# define HASUNSETENV 1 /* has unsetenv(2) call */ -# define NEEDPUTENV 1 /* need putenv(3) call */ -# define NEEDGETOPT 1 /* need a replacement for getopt(3) */ -# define NEEDSTRSTR 1 /* need emulation of the strstr(3) call */ -# define WAITUNION 1 /* use "union wait" as wait argument type */ -# ifdef uniosb -# include <sys/time.h> -# define NEEDVPRINTF 1 /* need a replacement for vprintf(3) */ -# define LA_TYPE LA_INT -# define TZ_TYPE TZ_TM_ZONE /* use tm->tm_zone */ -# endif -# ifdef luna2 -# define LA_TYPE LA_SUBR -# define TZ_TYPE TZ_TM_ZONE /* use tm->tm_zone */ -# endif -# ifdef luna88k -# define HASSNPRINTF 1 /* has snprintf(3) and vsnprintf(3) */ -# define LA_TYPE LA_INT -# endif -# define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() implementation */ -# define setpgid setpgrp -# undef WIFEXITED -# undef WEXITSTATUS -typedef int pid_t; -typedef int (*sigfunc_t)(); -# define SIGFUNC_DEFINED -# define SIGFUNC_RETURN (0) -# define SIGFUNC_DECL int -extern char *getenv(); -extern int errno; -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" -# endif -#endif - - -/* -** NEC EWS-UX/V 4.2 (with /usr/ucb/cc) -** -** From Motonori NAKAMURA <motonori@cs.ritsumei.ac.jp>. -*/ - -#if defined(nec_ews_svr4) || defined(_nec_ews_svr4) -# ifndef __svr4__ -# define __svr4__ /* use all System V Releae 4 defines below */ -# endif -# define SYS5SIGNALS 1 /* SysV signal semantics -- reset on each sig */ -# define HASSETSID 1 /* has Posix setsid(2) call */ -# define LA_TYPE LA_READKSYM /* use MIOC_READSYM ioctl */ -# define SFS_TYPE SFS_USTAT /* use System V ustat(2) syscall */ -# define GIDSET_T gid_t -# undef WIFEXITED -# undef WEXITSTATUS -# define NAMELISTMASK 0x7fffffff /* mask for nlist() values */ -# ifndef SYSLOG_BUFSIZE -# define SYSLOG_BUFSIZE 1024 /* allow full size syslog buffer */ -# endif -#endif - - -/* -** Fujitsu/ICL UXP/DS (For the DS/90 Series) -** -** From Diego R. Lopez <drlopez@cica.es>. -** Additional changes from Fumio Moriya and Toshiaki Nomura of the -** Fujitsu Fresoftware gruop <dsfrsoft@oai6.yk.fujitsu.co.jp>. -*/ - -#ifdef __uxp__ -# include <arpa/nameser.h> -# include <sys/sysmacros.h> -# include <sys/mkdev.h> -# define __svr4__ -# define HASGETUSERSHELL 0 -# define HASFLOCK 0 -# if UXPDS == 10 -# define HASSNPRINTF 0 /* no snprintf(3) or vsnprintf(3) */ -# else -# define HASSNPRINTF 1 /* has snprintf(3) and vsnprintf(3) */ -# endif -# define _PATH_UNIX "/stand/unix" -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/usr/ucblib/sendmail.cf" -# endif -# ifndef _PATH_SENDMAILPID -# define _PATH_SENDMAILPID "/usr/ucblib/sendmail.pid" -# endif -#endif - -/* -** Pyramid DC/OSx -** -** From Earle Ake <akee@wpdiss1.wpafb.af.mil>. -*/ - -#ifdef DCOSx -# define GIDSET_T gid_t -# ifndef IDENTPROTO -# define IDENTPROTO 0 /* TCP/IP implementation is broken */ -# endif -#endif - -/* -** Concurrent Computer Corporation Maxion -** -** From Donald R. Laster Jr. <laster@access.digex.net>. -*/ - -#ifdef __MAXION__ - -# include <sys/stream.h> -# define __svr4__ 1 /* SVR4.2MP */ -# define HASSETREUID 1 /* have setreuid(2) */ -# define HASLSTAT 1 /* have lstat(2) */ -# define HASSETRLIMIT 1 /* have setrlimit(2) */ -# define HASGETDTABLESIZE 1 /* have getdtablesize(2) */ -# define HASSNPRINTF 1 /* have snprintf(3) */ -# define HASGETUSERSHELL 1 /* have getusershell(3) */ -# define NOFTRUNCATE 1 /* do not have ftruncate(2) */ -# define SLEEP_T unsigned -# define SFS_TYPE SFS_STATVFS -# define SFS_BAVAIL f_bavail -# ifndef SYSLOG_BUFSIZE -# define SYSLOG_BUFSIZE 256 /* Use 256 bytes */ -# endif - -# undef WUNTRACED -# undef WIFEXITED -# undef WIFSIGNALED -# undef WIFSTOPPED -# undef WEXITSTATUS -# undef WTERMSIG -# undef WSTOPSIG - -#endif - -/* -** Harris Nighthawk PowerUX (nh6000 box) -** -** Contributed by Bob Miorelli, Pratt & Whitney <miorelli@pweh.com> -*/ - -#ifdef _PowerUX -# ifndef __svr4__ -# define __svr4__ -# endif -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/etc/mail/sendmail.cf" -# endif -# ifndef _PATH_SENDMAILPID -# define _PATH_SENDMAILPID "/etc/mail/sendmail.pid" -# endif -# define SYSLOG_BUFSIZE 1024 -# define HASSNPRINTF 1 /* has snprintf(3) and vsnprintf(3) */ -# define LA_TYPE LA_ZERO -typedef struct msgb mblk_t; -# undef offsetof /* avoid stddefs.h and sys/sysmacros.h conflict */ -#endif - -/* -** Siemens Nixdorf Informationssysteme AG SINIX -** -** Contributed by Gerald Rinske <Gerald.Rinske@mch.sni.de> -** of Siemens Business Services VAS. -*/ -#ifdef sinix -# define SYSLOG_BUFSIZE 1024 -#endif - -/* -** CRAY T3E -** -** Contributed by Manu Mahonen <mailadm@csc.fi> -** of Center for Scientific Computing. -*/ -#ifdef _CRAY -# define GET_IPOPT_DST(dst) *(struct in_addr *)&(dst) -#endif - -/********************************************************************** -** End of Per-Operating System defines -**********************************************************************/ -/********************************************************************** -** More general defines -**********************************************************************/ - -/* general BSD defines */ -#ifdef BSD -# define HASGETDTABLESIZE 1 /* has getdtablesize(2) call */ -# define HASSETREUID 1 /* has setreuid(2) call */ -# define HASINITGROUPS 1 /* has initgroups(3) call */ -# ifndef IP_SRCROUTE -# define IP_SRCROUTE 1 /* can check IP source routing */ -# endif -# ifndef HASSETRLIMIT -# define HASSETRLIMIT 1 /* has setrlimit(2) call */ -# endif -# ifndef HASFLOCK -# define HASFLOCK 1 /* has flock(2) call */ -# endif -# ifndef TZ_TYPE -# define TZ_TYPE TZ_TM_ZONE /* use tm->tm_zone variable */ -# endif -#endif - -/* general System V Release 4 defines */ -#ifdef __svr4__ -# define SYSTEM5 1 -# define USESETEUID 1 /* has useable seteuid(2) call */ -# define HASINITGROUPS 1 /* has initgroups(3) call */ -# define BSD_COMP 1 /* get BSD ioctl calls */ -# ifndef HASSETRLIMIT -# define HASSETRLIMIT 1 /* has setrlimit(2) call */ -# endif -# ifndef HASGETUSERSHELL -# define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ -# endif -# ifndef HASFCHMOD -# define HASFCHMOD 1 /* most (all?) SVr4s seem to have fchmod(2) */ -# endif - -# ifndef _PATH_UNIX -# define _PATH_UNIX "/unix" -# endif -# ifndef _PATH_VENDOR_CF -# define _PATH_VENDOR_CF "/usr/ucblib/sendmail.cf" -# endif -# ifndef _PATH_SENDMAILPID -# define _PATH_SENDMAILPID "/usr/ucblib/sendmail.pid" -# endif -# ifndef SYSLOG_BUFSIZE -# define SYSLOG_BUFSIZE 128 -# endif -# ifndef SFS_TYPE -# define SFS_TYPE SFS_STATVFS -# endif - -# define USE_SIGLONGJMP 1 /* sigsetjmp needed for signal handling */ -#endif - -/* general System V defines */ -#ifdef SYSTEM5 -# include <sys/sysmacros.h> -# define HASUNAME 1 /* use System V uname(2) system call */ -# define SYS5SETPGRP 1 /* use System V setpgrp(2) syscall */ -# define HASSETVBUF 1 /* we have setvbuf(3) in libc */ -# ifndef HASULIMIT -# define HASULIMIT 1 /* has the ulimit(2) syscall */ -# endif -# ifndef LA_TYPE -# ifdef MIOC_READKSYM -# define LA_TYPE LA_READKSYM /* use MIOC_READKSYM ioctl */ -# else -# define LA_TYPE LA_INT /* assume integer load average */ -# endif -# endif -# ifndef SFS_TYPE -# define SFS_TYPE SFS_USTAT /* use System V ustat(2) syscall */ -# endif -# ifndef TZ_TYPE -# define TZ_TYPE TZ_TZNAME /* use tzname[] vector */ -# endif -# define bcopy(s, d, l) (memmove((d), (s), (l))) -# define bzero(d, l) (memset((d), '\0', (l))) -# define bcmp(s, d, l) (memcmp((s), (d), (l))) -#endif - -/* general POSIX defines */ -#ifdef _POSIX_VERSION -# define HASSETSID 1 /* has Posix setsid(2) call */ -# define HASWAITPID 1 /* has Posix waitpid(2) call */ -# if _POSIX_VERSION >= 199500 && !defined(USESETEUID) -# define USESETEUID 1 /* has useable seteuid(2) call */ -# endif -# ifndef bcopy -# define bcopy(s, d, l) (memmove((d), (s), (l))) -# define bzero(d, l) (memset((d), '\0', (l))) -# define bcmp(s, d, l) (memcmp((s), (d), (l))) -# endif -#endif -/* -** Tweaking for systems that (for example) claim to be BSD or POSIX -** but don't have all the standard BSD or POSIX routines (boo hiss). -*/ - -#ifdef titan -# undef HASINITGROUPS /* doesn't have initgroups(3) call */ -#endif - -#ifdef _CRAYCOM -# undef HASSETSID /* despite POSIX claim, doesn't have setsid */ -#endif - -#ifdef ISC_UNIX -# undef bcopy /* despite SystemV claim, uses BSD bcopy */ -#endif - -#ifdef ALTOS_SYSTEM_V -# undef bcopy /* despite SystemV claim, uses BSD bcopy */ -# undef bzero /* despite SystemV claim, uses BSD bzero */ -# undef bcmp /* despite SystemV claim, uses BSD bcmp */ -#endif - -#if defined(sun) && !defined(BSD) && !defined(SOLARIS) && !defined(__svr4__) && !defined(__SVR4) -# undef bcopy /* SunOS 4 doesn't have memmove() */ -#endif - - -/* -** Due to a "feature" in some operating systems such as Ultrix 4.3 and -** HPUX 8.0, if you receive a "No route to host" message (ICMP message -** ICMP_UNREACH_HOST) on _any_ connection, all connections to that host -** are closed. Some firewalls return this error if you try to connect -** to the IDENT port (113), so you can't receive email from these hosts -** on these systems. The firewall really should use a more specific -** message such as ICMP_UNREACH_PROTOCOL or _PORT or _FILTER_PROHIB. If -** not explicitly set to zero above, default it on. -*/ - -#ifndef IDENTPROTO -# define IDENTPROTO 1 /* use IDENT proto (RFC 1413) */ -#endif - -#ifndef IP_SRCROUTE -# define IP_SRCROUTE 1 /* Detect IP source routing */ -#endif - -#ifndef HASGETUSERSHELL -# define HASGETUSERSHELL 1 /* libc has getusershell(3) call */ -#endif - -#ifndef NETUNIX -# define NETUNIX 1 /* include unix domain support */ -#endif - -#ifndef HASFLOCK -# define HASFLOCK 0 /* assume no flock(2) support */ -#endif - -#ifndef HASSETREUID -# define HASSETREUID 0 /* assume no setreuid(2) call */ -#endif - -#ifndef HASFCHMOD -# define HASFCHMOD 0 /* assume no fchmod(2) syscall */ -#endif - -#ifndef USESETEUID -# define USESETEUID 0 /* assume no seteuid(2) call or no saved ids */ -#endif - -#ifndef HASSETRLIMIT -# define HASSETRLIMIT 0 /* assume no setrlimit(2) support */ -#endif - -#ifndef HASULIMIT -# define HASULIMIT 0 /* assume no ulimit(2) support */ -#endif - -#ifndef SECUREWARE -# define SECUREWARE 0 /* assume no SecureWare C2 auditing hooks */ -#endif - -#ifndef USE_SIGLONGJMP -# define USE_SIGLONGJMP 0 /* assume setjmp handles signals properly */ -#endif - -#ifndef FDSET_CAST -# define FDSET_CAST /* (empty) cast for fd_set arg to select */ -#endif - -/* -** If no type for argument two of getgroups call is defined, assume -** it's an integer -- unfortunately, there seem to be several choices -** here. -*/ - -#ifndef GIDSET_T -# define GIDSET_T int -#endif - -#ifndef UID_T -# define UID_T uid_t -#endif - -#ifndef GID_T -# define GID_T gid_t -#endif - -#ifndef SIZE_T -# define SIZE_T size_t -#endif - -#ifndef MODE_T -# define MODE_T mode_t -#endif - -#ifndef ARGV_T -# define ARGV_T char ** -#endif - -#ifndef SOCKADDR_LEN_T -# define SOCKADDR_LEN_T int -#endif - -#ifndef SOCKOPT_LEN_T -# define SOCKOPT_LEN_T int -#endif - -#ifndef QUAD_T -# define QUAD_T unsigned long -#endif -/********************************************************************** -** Remaining definitions should never have to be changed. They are -** primarily to provide back compatibility for older systems -- for -** example, it includes some POSIX compatibility definitions -**********************************************************************/ - -/* System 5 compatibility */ -#ifndef S_ISREG -# define S_ISREG(foo) ((foo & S_IFMT) == S_IFREG) -#endif -#ifndef S_ISDIR -# define S_ISDIR(foo) ((foo & S_IFMT) == S_IFDIR) -#endif -#if !defined(S_ISLNK) && defined(S_IFLNK) -# define S_ISLNK(foo) ((foo & S_IFMT) == S_IFLNK) -#endif -#ifndef S_IRUSR -# define S_IRUSR 0400 -#endif -#ifndef S_IWUSR -# define S_IWUSR 0200 -#endif -#ifndef S_IRGRP -# define S_IRGRP 0040 -#endif -#ifndef S_IWGRP -# define S_IWGRP 0020 -#endif -#ifndef S_IROTH -# define S_IROTH 0004 -#endif -#ifndef S_IWOTH -# define S_IWOTH 0002 -#endif - -/* -** Older systems don't have this error code -- it should be in -** /usr/include/sysexits.h. -*/ - -# ifndef EX_CONFIG -# define EX_CONFIG 78 /* configuration error */ -# endif - -/* pseudo-code used in server SMTP */ -# define EX_QUIT 22 /* drop out of server immediately */ - -/* pseudo-code used for mci_setstat */ -# define EX_NOTSTICKY -5 /* don't save persistent status */ - - -/* -** An "impossible" file mode to indicate that the file does not exist. -*/ - -#define ST_MODE_NOFILE 0171147 /* unlikely to occur */ - - -/* -** These are used in a few cases where we need some special -** error codes, but where the system doesn't provide something -** reasonable. They are printed in errstring. -*/ - -#ifndef E_PSEUDOBASE -# define E_PSEUDOBASE 256 -#endif - -#define E_SM_OPENTIMEOUT (E_PSEUDOBASE + 0) /* Timeout on file open */ -#define E_SM_NOSLINK (E_PSEUDOBASE + 1) /* Symbolic links not allowed */ -#define E_SM_NOHLINK (E_PSEUDOBASE + 2) /* Hard links not allowed */ -#define E_SM_REGONLY (E_PSEUDOBASE + 3) /* Regular files only */ -#define E_SM_ISEXEC (E_PSEUDOBASE + 4) /* Executable files not allowed */ -#define E_SM_WWDIR (E_PSEUDOBASE + 5) /* World writable directory */ -#define E_SM_GWDIR (E_PSEUDOBASE + 6) /* Group writable directory */ -#define E_SM_FILECHANGE (E_PSEUDOBASE + 7) /* File changed after open */ -#define E_SM_WWFILE (E_PSEUDOBASE + 8) /* World writable file */ -#define E_SM_GWFILE (E_PSEUDOBASE + 9) /* Group writable file */ -#define E_DNSBASE (E_PSEUDOBASE + 20) /* base for DNS h_errno */ - -/* type of arbitrary pointer */ -#ifndef ARBPTR_T -# define ARBPTR_T void * -#endif - -#ifndef __P -# include "cdefs.h" -#endif - -#if HESIOD && !defined(NAMED_BIND) -# define NAMED_BIND 1 /* not one without the other */ -#endif - -#if NAMED_BIND && !defined(__ksr__) && !defined(h_errno) -extern int h_errno; -#endif - -/* -** Do some required dependencies -*/ - -#if NETINET || NETISO -# ifndef SMTP -# define SMTP 1 /* enable user and server SMTP */ -# endif -# ifndef QUEUE -# define QUEUE 1 /* enable queueing */ -# endif -# ifndef DAEMON -# define DAEMON 1 /* include the daemon (requires IPC & SMTP) */ -# endif -#endif - - -/* -** Arrange to use either varargs or stdargs -*/ - -# ifdef __STDC__ - -# include <stdarg.h> - -# define VA_LOCAL_DECL va_list ap; -# define VA_START(f) va_start(ap, f) -# define VA_END va_end(ap) - -# else - -# include <varargs.h> - -# define VA_LOCAL_DECL va_list ap; -# define VA_START(f) va_start(ap) -# define VA_END va_end(ap) - -# endif - -#ifdef HASUNAME -# include <sys/utsname.h> -# ifdef newstr -# undef newstr -# endif -#else /* ! HASUNAME */ -# define NODE_LENGTH 32 -struct utsname -{ - char nodename[NODE_LENGTH+1]; -}; -#endif /* HASUNAME */ - -#if !defined(MAXHOSTNAMELEN) && !defined(_SCO_unix_) && !defined(NonStop_UX_BXX) && !defined(ALTOS_SYSTEM_V) -# define MAXHOSTNAMELEN 256 -#endif - -#if !defined(SIGCHLD) && defined(SIGCLD) -# define SIGCHLD SIGCLD -#endif - -#ifndef STDIN_FILENO -# define STDIN_FILENO 0 -#endif - -#ifndef STDOUT_FILENO -# define STDOUT_FILENO 1 -#endif - -#ifndef STDERR_FILENO -# define STDERR_FILENO 2 -#endif - -#ifndef LOCK_SH -# define LOCK_SH 0x01 /* shared lock */ -# define LOCK_EX 0x02 /* exclusive lock */ -# define LOCK_NB 0x04 /* non-blocking lock */ -# define LOCK_UN 0x08 /* unlock */ -#endif - -#ifndef S_IXOTH -# define S_IXOTH (S_IEXEC >> 6) -#endif - -#ifndef S_IXGRP -# define S_IXGRP (S_IEXEC >> 3) -#endif - -#ifndef S_IXUSR -# define S_IXUSR (S_IEXEC) -#endif - -#ifndef SEEK_SET -# define SEEK_SET 0 -# define SEEK_CUR 1 -# define SEEK_END 2 -#endif - -#ifndef SIG_ERR -# define SIG_ERR ((void (*)()) -1) -#endif - -#ifndef WEXITSTATUS -# define WEXITSTATUS(st) (((st) >> 8) & 0377) -#endif -#ifndef WIFEXITED -# define WIFEXITED(st) (((st) & 0377) == 0) -#endif - -#ifndef SIGFUNC_DEFINED -typedef void (*sigfunc_t) __P((int)); -#endif -#ifndef SIGFUNC_RETURN -# define SIGFUNC_RETURN -#endif -#ifndef SIGFUNC_DECL -# define SIGFUNC_DECL void -#endif - -/* size of syslog buffer */ -#ifndef SYSLOG_BUFSIZE -# define SYSLOG_BUFSIZE 1024 -#endif - -/* -** Size of prescan buffer. -** Despite comments in the _sendmail_ book, this probably should -** not be changed; there are some hard-to-define dependencies. -*/ - -# define PSBUFSIZE (MAXNAME + MAXATOM) /* size of prescan buffer */ - -/* fork routine -- set above using #ifdef _osname_ or in Makefile */ -# ifndef FORK -# define FORK fork /* function to call to fork mailer */ -# endif - -/* -** Default to using scanf in readcf. -*/ - -#ifndef SCANF -# define SCANF 1 -#endif - -/* -** SVr4 and similar systems use different routines for setjmp/longjmp -** with signal support -*/ - -#if USE_SIGLONGJMP -# ifdef jmp_buf -# undef jmp_buf -# endif -# define jmp_buf sigjmp_buf -# ifdef setjmp -# undef setjmp -# endif -# define setjmp(env) sigsetjmp(env, 1) -# ifdef longjmp -# undef longjmp -# endif -# define longjmp(env, val) siglongjmp(env, val) -#endif - -#if !defined(NGROUPS_MAX) && defined(NGROUPS) -# define NGROUPS_MAX NGROUPS /* POSIX naming convention */ -#endif - -/* -** If we don't have a system syslog, simulate it. -*/ - -#if !LOG -# define LOG_EMERG 0 /* system is unusable */ -# define LOG_ALERT 1 /* action must be taken immediately */ -# define LOG_CRIT 2 /* critical conditions */ -# define LOG_ERR 3 /* error conditions */ -# define LOG_WARNING 4 /* warning conditions */ -# define LOG_NOTICE 5 /* normal but significant condition */ -# define LOG_INFO 6 /* informational */ -# define LOG_DEBUG 7 /* debug-level messages */ -#endif diff --git a/src/control.c b/src/control.c deleted file mode 100644 index 415818c..0000000 --- a/src/control.c +++ /dev/null @@ -1,356 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)control.c 8.18 (Berkeley) 1/17/1999"; -#endif /* not lint */ - -#include "sendmail.h" - -int ControlSocket = -1; - -/* -** OPENCONTROLSOCKET -- create/open the daemon control named socket -** -** Creates and opens a named socket for external control over -** the sendmail daemon. -** -** Parameters: -** none. -** -** Returns: -** 0 if successful, -1 otherwise -*/ - -int -opencontrolsocket() -{ -#ifdef NETUNIX -# if _FFR_CONTROL_SOCKET - int rval; - int sff = SFF_SAFEDIRPATH|SFF_OPENASROOT|SFF_NOLINK|SFF_CREAT|SFF_MUSTOWN; - struct sockaddr_un controladdr; - - if (ControlSocketName == NULL) - return 0; - - if (strlen(ControlSocketName) >= sizeof controladdr.sun_path) - { - errno = ENAMETOOLONG; - return -1; - } - - rval = safefile(ControlSocketName, RunAsUid, RunAsGid, RunAsUserName, - sff, S_IRUSR|S_IWUSR, NULL); - - /* if not safe, don't create */ - if (rval != 0) - { - errno = rval; - return -1; - } - - ControlSocket = socket(AF_UNIX, SOCK_STREAM, 0); - if (ControlSocket < 0) - return -1; - - unlink(ControlSocketName); - bzero(&controladdr, sizeof controladdr); - controladdr.sun_family = AF_UNIX; - strcpy(controladdr.sun_path, ControlSocketName); - - if (bind(ControlSocket, (struct sockaddr *) &controladdr, - sizeof controladdr) < 0) - { - int save_errno = errno; - - clrcontrol(); - errno = save_errno; - return -1; - } - -# if _FFR_TRUSTED_USER - if (geteuid() == 0 && TrustedUid != 0) - { - if (chown(ControlSocketName, TrustedUid, -1) < 0) - { - int save_errno = errno; - - sm_syslog(LOG_ALERT, NOQID, - "ownership change on %s failed: %s", - ControlSocketName, errstring(save_errno)); - message("050 ownership change on %s failed: %s", - ControlSocketName, errstring(save_errno)); - closecontrolsocket(TRUE); - errno = save_errno; - return -1; - } - } -# endif - - if (chmod(ControlSocketName, S_IRUSR|S_IWUSR) < 0) - { - int save_errno = errno; - - closecontrolsocket(TRUE); - errno = save_errno; - return -1; - } - - if (listen(ControlSocket, 8) < 0) - { - int save_errno = errno; - - closecontrolsocket(TRUE); - errno = save_errno; - return -1; - } -# endif -#endif - return 0; -} -/* -** CLOSECONTROLSOCKET -- close the daemon control named socket -** -** Close a named socket. -** -** Parameters: -** fullclose -- if set, close the socket and remove it; -** otherwise, just remove it -** -** Returns: -** none. -*/ - -void -closecontrolsocket(fullclose) - bool fullclose; -{ -#ifdef NETUNIX -# if _FFR_CONTROL_SOCKET - int sff = SFF_SAFEDIRPATH|SFF_OPENASROOT|SFF_NOLINK|SFF_CREAT|SFF_MUSTOWN; - - if (ControlSocket >= 0) - { - int rval; - - if (fullclose) - { - (void) close(ControlSocket); - ControlSocket = -1; - } - - rval = safefile(ControlSocketName, RunAsUid, RunAsGid, RunAsUserName, - sff, S_IRUSR|S_IWUSR, NULL); - - /* if not safe, don't unlink */ - if (rval != 0) - return; - - if (unlink(ControlSocketName) < 0) - { - sm_syslog(LOG_WARNING, NOQID, - "Could not remove control socket: %s", - errstring(errno)); - return; - } - } -# endif -#endif - return; -} -/* -** CLRCONTROL -- reset the control connection -** -** Parameters: -** none. -** -** Returns: -** none. -** -** Side Effects: -** releases any resources used by the control interface. -*/ - -void -clrcontrol() -{ -#ifdef NETUNIX -# if _FFR_CONTROL_SOCKET - if (ControlSocket >= 0) - (void) close(ControlSocket); - ControlSocket = -1; -# endif -#endif -} - -#ifndef NOT_SENDMAIL - -/* -** CONTROL_COMMAND -- read and process command from named socket -** -** Read and process the command from the opened socket. -** Return the results down the same socket. -** -** Parameters: -** sock -- the opened socket from getrequests() -** e -- the current envelope -** -** Returns: -** none. -*/ - -struct cmd -{ - char *cmdname; /* command name */ - int cmdcode; /* internal code, see below */ -}; - -/* values for cmdcode */ -# define CMDERROR 0 /* bad command */ -# define CMDRESTART 1 /* restart daemon */ -# define CMDSHUTDOWN 2 /* end daemon */ -# define CMDHELP 3 /* help */ -# define CMDSTATUS 4 /* daemon status */ - -static struct cmd CmdTab[] = -{ - { "help", CMDHELP }, - { "restart", CMDRESTART }, - { "shutdown", CMDSHUTDOWN }, - { "status", CMDSTATUS }, - { NULL, CMDERROR } -}; - -void -control_command(sock, e) - int sock; - ENVELOPE *e; -{ - FILE *s; - FILE *traffic; - FILE *oldout; - char *cmd; - char *p; - struct cmd *c; - char cmdbuf[MAXLINE]; - char inp[MAXLINE]; - extern char **SaveArgv; - extern void help __P((char *)); - - sm_setproctitle(FALSE, "control cmd read"); - - s = fdopen(sock, "r+"); - if (s == NULL) - { - int save_errno = errno; - - close(sock); - errno = save_errno; - return; - } - setbuf(s, NULL); - - if (fgets(inp, sizeof inp, s) == NULL) - { - fclose(s); - return; - } - (void) fflush(s); - - /* clean up end of line */ - fixcrlf(inp, TRUE); - - sm_setproctitle(FALSE, "control: %s", inp); - - /* break off command */ - for (p = inp; isascii(*p) && isspace(*p); p++) - continue; - cmd = cmdbuf; - while (*p != '\0' && - !(isascii(*p) && isspace(*p)) && - cmd < &cmdbuf[sizeof cmdbuf - 2]) - *cmd++ = *p++; - *cmd = '\0'; - - /* throw away leading whitespace */ - while (isascii(*p) && isspace(*p)) - p++; - - /* decode command */ - for (c = CmdTab; c->cmdname != NULL; c++) - { - if (!strcasecmp(c->cmdname, cmdbuf)) - break; - } - - switch (c->cmdcode) - { - case CMDHELP: /* get help */ - traffic = TrafficLogFile; - TrafficLogFile = NULL; - oldout = OutChannel; - OutChannel = s; - help("control"); - TrafficLogFile = traffic; - OutChannel = oldout; - break; - - case CMDRESTART: /* restart the daemon */ - if (SaveArgv[0][0] != '/') - { - fprintf(s, "ERROR: could not restart: need full path\r\n"); - break; - } - if (LogLevel > 3) - sm_syslog(LOG_INFO, NOQID, - "restarting %s on due to control command", - SaveArgv[0]); - closecontrolsocket(FALSE); - if (drop_privileges(TRUE) != EX_OK) - { - if (LogLevel > 0) - sm_syslog(LOG_ALERT, NOQID, - "could not set[ug]id(%d, %d): %m", - RunAsUid, RunAsGid); - - fprintf(s, "ERROR: could not set[ug]id(%d, %d): %s, exiting...\r\n", - (int)RunAsUid, (int)RunAsGid, errstring(errno)); - finis(FALSE, EX_OSERR); - } - fprintf(s, "OK\r\n"); - clrcontrol(); - (void) fcntl(sock, F_SETFD, 1); - execve(SaveArgv[0], (ARGV_T) SaveArgv, (ARGV_T) ExternalEnviron); - if (LogLevel > 0) - sm_syslog(LOG_ALERT, NOQID, "could not exec %s: %m", - SaveArgv[0]); - fprintf(s, "ERROR: could not exec %s: %s, exiting...\r\n", - SaveArgv[0], errstring(errno)); - finis(FALSE, EX_OSFILE); - break; - - case CMDSHUTDOWN: /* kill the daemon */ - fprintf(s, "OK\r\n"); - finis(FALSE, EX_OK); - break; - - case CMDSTATUS: /* daemon status */ - proc_list_probe(); - fprintf(s, "%d/%d\r\n", CurChildren, MaxChildren); - proc_list_display(s); - break; - - case CMDERROR: /* unknown command */ - fprintf(s, "Bad command (%s)\r\n", cmdbuf); - break; - } - fclose(s); -} -#endif diff --git a/src/convtime.c b/src/convtime.c deleted file mode 100644 index ab8591d..0000000 --- a/src/convtime.c +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)convtime.c 8.14 (Berkeley) 5/19/1998"; -#endif /* not lint */ - -# include "sendmail.h" - -/* -** CONVTIME -- convert time -** -** Takes a time as an ascii string with a trailing character -** giving units: -** s -- seconds -** m -- minutes -** h -- hours -** d -- days (default) -** w -- weeks -** For example, "3d12h" is three and a half days. -** -** Parameters: -** p -- pointer to ascii time. -** units -- default units if none specified. -** -** Returns: -** time in seconds. -** -** Side Effects: -** none. -*/ - -time_t -convtime(p, units) - char *p; - char units; -{ - register time_t t, r; - register char c; - - r = 0; - while (*p != '\0') - { - t = 0; - while ((c = *p++) != '\0' && isascii(c) && isdigit(c)) - t = t * 10 + (c - '0'); - if (c == '\0') - { - c = units; - p--; - } - else if (strchr("wdhms", c) == NULL) - { - usrerr("Invalid time unit `%c'", c); - c = units; - } - switch (c) - { - case 'w': /* weeks */ - t *= 7; - - case 'd': /* days */ - default: - t *= 24; - - case 'h': /* hours */ - t *= 60; - - case 'm': /* minutes */ - t *= 60; - - case 's': /* seconds */ - break; - } - r += t; - } - - return (r); -} -/* -** PINTVL -- produce printable version of a time interval -** -** Parameters: -** intvl -- the interval to be converted -** brief -- if TRUE, print this in an extremely compact form -** (basically used for logging). -** -** Returns: -** A pointer to a string version of intvl suitable for -** printing or framing. -** -** Side Effects: -** none. -** -** Warning: -** The string returned is in a static buffer. -*/ - -# define PLURAL(n) ((n) == 1 ? "" : "s") - -char * -pintvl(intvl, brief) - time_t intvl; - bool brief; -{ - static char buf[256]; - register char *p; - int wk, dy, hr, mi, se; - - if (intvl == 0 && !brief) - return ("zero seconds"); - - /* decode the interval into weeks, days, hours, minutes, seconds */ - se = intvl % 60; - intvl /= 60; - mi = intvl % 60; - intvl /= 60; - hr = intvl % 24; - intvl /= 24; - if (brief) - { - dy = intvl; - wk = 0; - } - else - { - dy = intvl % 7; - intvl /= 7; - wk = intvl; - } - - /* now turn it into a sexy form */ - p = buf; - if (brief) - { - if (dy > 0) - { - (void) snprintf(p, SPACELEFT(buf, p), "%d+", dy); - p += strlen(p); - } - (void) snprintf(p, SPACELEFT(buf, p), "%02d:%02d:%02d", - hr, mi, se); - return (buf); - } - - /* use the verbose form */ - if (wk > 0) - { - (void) snprintf(p, SPACELEFT(buf, p), ", %d week%s", wk, PLURAL(wk)); - p += strlen(p); - } - if (dy > 0) - { - (void) snprintf(p, SPACELEFT(buf, p), ", %d day%s", dy, PLURAL(dy)); - p += strlen(p); - } - if (hr > 0) - { - (void) snprintf(p, SPACELEFT(buf, p), ", %d hour%s", hr, PLURAL(hr)); - p += strlen(p); - } - if (mi > 0) - { - (void) snprintf(p, SPACELEFT(buf, p), ", %d minute%s", mi, PLURAL(mi)); - p += strlen(p); - } - if (se > 0) - { - (void) snprintf(p, SPACELEFT(buf, p), ", %d second%s", se, PLURAL(se)); - p += strlen(p); - } - - return (buf + 2); -} diff --git a/src/daemon.c b/src/daemon.c deleted file mode 100644 index ae6b004..0000000 --- a/src/daemon.c +++ /dev/null @@ -1,2154 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#include <errno.h> -#include "sendmail.h" - -#ifndef lint -#ifdef DAEMON -static char sccsid[] = "@(#)daemon.c 8.236 (Berkeley) 1/25/1999 (with daemon mode)"; -#else -static char sccsid[] = "@(#)daemon.c 8.236 (Berkeley) 1/25/1999 (without daemon mode)"; -#endif -#endif /* not lint */ - -#if defined(SOCK_STREAM) || defined(__GNU_LIBRARY__) -# define USE_SOCK_STREAM 1 -#endif - -#if DAEMON || defined(USE_SOCK_STREAM) -# include <arpa/inet.h> -# if NAMED_BIND -# include <resolv.h> -# ifndef NO_DATA -# define NO_DATA NO_ADDRESS -# endif -# endif -#endif - -#if DAEMON - -# include <sys/time.h> - -# if IP_SRCROUTE -# include <netinet/in_systm.h> -# include <netinet/ip.h> -# include <netinet/ip_var.h> -# endif - -/* -** DAEMON.C -- routines to use when running as a daemon. -** -** This entire file is highly dependent on the 4.2 BSD -** interprocess communication primitives. No attempt has -** been made to make this file portable to Version 7, -** Version 6, MPX files, etc. If you should try such a -** thing yourself, I recommend chucking the entire file -** and starting from scratch. Basic semantics are: -** -** getrequests(e) -** Opens a port and initiates a connection. -** Returns in a child. Must set InChannel and -** OutChannel appropriately. -** clrdaemon() -** Close any open files associated with getting -** the connection; this is used when running the queue, -** etc., to avoid having extra file descriptors during -** the queue run and to avoid confusing the network -** code (if it cares). -** makeconnection(host, port, outfile, infile, e) -** Make a connection to the named host on the given -** port. Set *outfile and *infile to the files -** appropriate for communication. Returns zero on -** success, else an exit status describing the -** error. -** host_map_lookup(map, hbuf, avp, pstat) -** Convert the entry in hbuf into a canonical form. -*/ -/* -** GETREQUESTS -- open mail IPC port and get requests. -** -** Parameters: -** e -- the current envelope. -** -** Returns: -** none. -** -** Side Effects: -** Waits until some interesting activity occurs. When -** it does, a child is created to process it, and the -** parent waits for completion. Return from this -** routine is always in the child. The file pointers -** "InChannel" and "OutChannel" should be set to point -** to the communication channel. -*/ - -int DaemonSocket = -1; /* fd describing socket */ -SOCKADDR DaemonAddr; /* socket for incoming */ -int ListenQueueSize = 10; /* size of listen queue */ -int TcpRcvBufferSize = 0; /* size of TCP receive buffer */ -int TcpSndBufferSize = 0; /* size of TCP send buffer */ - -void -getrequests(e) - ENVELOPE *e; -{ - int t; - time_t refuse_connections_until = 0; - bool firsttime = TRUE; - FILE *pidf; - int sff; - int socksize; - u_short port; -#if XDEBUG - bool j_has_dot; -#endif - char status[MAXLINE]; - extern void reapchild __P((int)); -#ifdef NETUNIX - extern int ControlSocket; -#endif - extern int opendaemonsocket __P((bool)); - extern int opencontrolsocket __P((void)); - - /* - ** Set up the address for the mailer. - */ - - switch (DaemonAddr.sa.sa_family) - { - case AF_UNSPEC: - DaemonAddr.sa.sa_family = AF_INET; - /* fall through ... */ - - case AF_INET: - if (DaemonAddr.sin.sin_addr.s_addr == 0) - DaemonAddr.sin.sin_addr.s_addr = INADDR_ANY; - port = DaemonAddr.sin.sin_port; - break; - - default: - /* unknown protocol */ - port = 0; - break; - } - if (port == 0) - { - register struct servent *sp; - - sp = getservbyname("smtp", "tcp"); - if (sp == NULL) - { - syserr("554 service \"smtp\" unknown"); - port = htons(25); - } - else - port = sp->s_port; - } - - switch (DaemonAddr.sa.sa_family) - { - case AF_INET: - DaemonAddr.sin.sin_port = port; - break; - - default: - /* unknown protocol */ - break; - } - - /* - ** Try to actually open the connection. - */ - - if (tTd(15, 1)) - printf("getrequests: port 0x%x\n", port); - - /* get a socket for the SMTP connection */ - socksize = opendaemonsocket(TRUE); - - if (opencontrolsocket() < 0) - sm_syslog(LOG_WARNING, NOQID, - "daemon could not open control socket %s: %s", - ControlSocketName, errstring(errno)); - - (void) setsignal(SIGCHLD, reapchild); - - /* write the pid to the log file for posterity */ - sff = SFF_NOLINK|SFF_ROOTOK|SFF_REGONLY|SFF_CREAT; - if (TrustedUid != 0 && RealUid == TrustedUid) - sff |= SFF_OPENASROOT; - pidf = safefopen(PidFile, O_WRONLY|O_TRUNC, 0644, sff); - if (pidf == NULL) - { - sm_syslog(LOG_ERR, NOQID, "unable to write %s", PidFile); - } - else - { - extern char *CommandLineArgs; - - /* write the process id on line 1 */ - fprintf(pidf, "%ld\n", (long) getpid()); - - /* line 2 contains all command line flags */ - fprintf(pidf, "%s\n", CommandLineArgs); - - /* flush and close */ - fclose(pidf); - } - -#if XDEBUG - { - char jbuf[MAXHOSTNAMELEN]; - - expand("\201j", jbuf, sizeof jbuf, e); - j_has_dot = strchr(jbuf, '.') != NULL; - } -#endif - - /* Add parent process as first item */ - proc_list_add(getpid(), "Sendmail daemon"); - - if (tTd(15, 1)) - printf("getrequests: %d\n", DaemonSocket); - - for (;;) - { - register pid_t pid; - auto SOCKADDR_LEN_T lotherend; - bool timedout = FALSE; - bool control = FALSE; - int savederrno; - int pipefd[2]; - extern bool refuseconnections __P((int)); - - /* see if we are rejecting connections */ - (void) blocksignal(SIGALRM); - if (curtime() >= refuse_connections_until) - { - if (refuseconnections(ntohs(port))) - { - if (DaemonSocket >= 0) - { - /* close socket so peer fails quickly */ - (void) close(DaemonSocket); - DaemonSocket = -1; - } - - /* refuse connections for next 15 seconds */ - refuse_connections_until = curtime() + 15; - } - else if (DaemonSocket < 0 || firsttime) - { - /* arrange to (re)open the socket if needed */ - (void) opendaemonsocket(FALSE); - firsttime = FALSE; - } - } - -#if XDEBUG - /* check for disaster */ - { - char jbuf[MAXHOSTNAMELEN]; - extern void dumpstate __P((char *)); - - expand("\201j", jbuf, sizeof jbuf, e); - if (!wordinclass(jbuf, 'w')) - { - dumpstate("daemon lost $j"); - sm_syslog(LOG_ALERT, NOQID, - "daemon process doesn't have $j in $=w; see syslog"); - abort(); - } - else if (j_has_dot && strchr(jbuf, '.') == NULL) - { - dumpstate("daemon $j lost dot"); - sm_syslog(LOG_ALERT, NOQID, - "daemon process $j lost dot; see syslog"); - abort(); - } - } -#endif - -#if 0 - /* - ** Andrew Sun <asun@ieps-sun.ml.com> claims that this will - ** fix the SVr4 problem. But it seems to have gone away, - ** so is it worth doing this? - */ - - if (DaemonSocket >= 0 && - SetNonBlocking(DaemonSocket, FALSE) < 0) - log an error here; -#endif - (void) releasesignal(SIGALRM); - for (;;) - { - int highest = -1; - fd_set readfds; - struct timeval timeout; - - FD_ZERO(&readfds); - - /* wait for a connection */ - if (DaemonSocket >= 0) - { - sm_setproctitle(TRUE, - "accepting connections on port %d", - ntohs(port)); - if (DaemonSocket > highest) - highest = DaemonSocket; - FD_SET(DaemonSocket, &readfds); - } -#ifdef NETUNIX - if (ControlSocket >= 0) - { - if (ControlSocket > highest) - highest = ControlSocket; - FD_SET(ControlSocket, &readfds); - } -#endif - if (DaemonSocket >= 0) - timeout.tv_sec = 60; - else - timeout.tv_sec = 5; - timeout.tv_usec = 0; - - t = select(highest + 1, FDSET_CAST &readfds, - NULL, NULL, &timeout); - - if (DoQueueRun) - (void) runqueue(TRUE, FALSE); - if (t <= 0) - { - timedout = TRUE; - break; - } - - control = FALSE; - errno = 0; - if (DaemonSocket >= 0 && - FD_ISSET(DaemonSocket, &readfds)) - { - lotherend = socksize; - t = accept(DaemonSocket, - (struct sockaddr *)&RealHostAddr, - &lotherend); - } -#ifdef NETUNIX - else if (ControlSocket >= 0 && - FD_ISSET(ControlSocket, &readfds)) - { - struct sockaddr_un sa_un; - - lotherend = sizeof sa_un; - t = accept(ControlSocket, - (struct sockaddr *)&sa_un, - &lotherend); - control = TRUE; - } -#endif - if (t >= 0 || errno != EINTR) - break; - } - if (timedout) - { - timedout = FALSE; - continue; - } - if (control) - { - if (t >= 0) - { - extern void control_command __P((int, ENVELOPE *)); - - control_command(t, e); - } - else - syserr("getrequests: control accept"); - continue; - } - savederrno = errno; - (void) blocksignal(SIGALRM); - if (t < 0) - { - errno = savederrno; - syserr("getrequests: accept"); - - /* arrange to re-open the socket next time around */ - (void) close(DaemonSocket); - DaemonSocket = -1; - continue; - } - - /* - ** Create a subprocess to process the mail. - */ - - if (tTd(15, 2)) - printf("getrequests: forking (fd = %d)\n", t); - - /* - ** Create a pipe to keep the child from writing to the - ** socket until after the parent has closed it. Otherwise - ** the parent may hang if the child has closed it first. - */ - - if (pipe(pipefd) < 0) - pipefd[0] = pipefd[1] = -1; - - blocksignal(SIGCHLD); - pid = fork(); - if (pid < 0) - { - syserr("daemon: cannot fork"); - if (pipefd[0] != -1) - { - (void) close(pipefd[0]); - (void) close(pipefd[1]); - } - (void) releasesignal(SIGCHLD); - sleep(10); - (void) close(t); - continue; - } - - if (pid == 0) - { - char *p; - extern SIGFUNC_DECL intsig __P((int)); - FILE *inchannel, *outchannel; - - /* - ** CHILD -- return to caller. - ** Collect verified idea of sending host. - ** Verify calling user id if possible here. - */ - - (void) releasesignal(SIGALRM); - (void) releasesignal(SIGCHLD); - (void) setsignal(SIGCHLD, SIG_DFL); - (void) setsignal(SIGHUP, intsig); - (void) close(DaemonSocket); - clrcontrol(); - proc_list_clear(); - - /* Add parent process as first child item */ - proc_list_add(getpid(), "daemon child"); - - /* don't schedule queue runs if we are told to ETRN */ - QueueIntvl = 0; - - sm_setproctitle(TRUE, "startup with %s", - anynet_ntoa(&RealHostAddr)); - - if (pipefd[0] != -1) - { - auto char c; - - /* - ** Wait for the parent to close the write end - ** of the pipe, which we will see as an EOF. - ** This guarantees that we won't write to the - ** socket until after the parent has closed - ** the pipe. - */ - - /* close the write end of the pipe */ - (void) close(pipefd[1]); - - /* we shouldn't be interrupted, but ... */ - while (read(pipefd[0], &c, 1) < 0 && - errno == EINTR) - continue; - (void) close(pipefd[0]); - } - - /* determine host name */ - p = hostnamebyanyaddr(&RealHostAddr); - if (strlen(p) > (SIZE_T) MAXNAME) - p[MAXNAME] = '\0'; - RealHostName = newstr(p); - sm_setproctitle(TRUE, "startup with %s", p); - - if ((inchannel = fdopen(t, "r")) == NULL || - (t = dup(t)) < 0 || - (outchannel = fdopen(t, "w")) == NULL) - { - syserr("cannot open SMTP server channel, fd=%d", t); - finis(FALSE, EX_OK); - } - - InChannel = inchannel; - OutChannel = outchannel; - DisConnected = FALSE; - -#ifdef XLA - if (!xla_host_ok(RealHostName)) - { - message("421 Too many SMTP sessions for this host"); - finis(FALSE, EX_OK); - } -#endif - break; - } - - /* parent -- keep track of children */ - snprintf(status, sizeof status, "SMTP server child for %s", - anynet_ntoa(&RealHostAddr)); - proc_list_add(pid, status); - (void) releasesignal(SIGCHLD); - - /* close the read end of the synchronization pipe */ - if (pipefd[0] != -1) - (void) close(pipefd[0]); - - /* close the port so that others will hang (for a while) */ - (void) close(t); - - /* release the child by closing the read end of the sync pipe */ - if (pipefd[1] != -1) - (void) close(pipefd[1]); - } - if (tTd(15, 2)) - printf("getreq: returning\n"); - return; -} -/* -** OPENDAEMONSOCKET -- open the SMTP socket -** -** Deals with setting all appropriate options. DaemonAddr must -** be set up in advance. -** -** Parameters: -** firsttime -- set if this is the initial open. -** -** Returns: -** Size in bytes of the daemon socket addr. -** -** Side Effects: -** Leaves DaemonSocket set to the open socket. -** Exits if the socket cannot be created. -*/ - -#define MAXOPENTRIES 10 /* maximum number of tries to open connection */ - -int -opendaemonsocket(firsttime) - bool firsttime; -{ - int on = 1; - int socksize = 0; - int ntries = 0; - int saveerrno; - - if (tTd(15, 2)) - printf("opendaemonsocket()\n"); - - do - { - if (ntries > 0) - sleep(5); - if (firsttime || DaemonSocket < 0) - { - DaemonSocket = socket(DaemonAddr.sa.sa_family, SOCK_STREAM, 0); - if (DaemonSocket < 0) - { - saveerrno = errno; - syserr("opendaemonsocket: can't create server SMTP socket"); - severe: - if (LogLevel > 0) - sm_syslog(LOG_ALERT, NOQID, - "problem creating SMTP socket"); - DaemonSocket = -1; - continue; - } - - /* turn on network debugging? */ - if (tTd(15, 101)) - (void) setsockopt(DaemonSocket, SOL_SOCKET, - SO_DEBUG, (char *)&on, - sizeof on); - - (void) setsockopt(DaemonSocket, SOL_SOCKET, - SO_REUSEADDR, (char *)&on, sizeof on); - (void) setsockopt(DaemonSocket, SOL_SOCKET, - SO_KEEPALIVE, (char *)&on, sizeof on); - -#ifdef SO_RCVBUF - if (TcpRcvBufferSize > 0) - { - if (setsockopt(DaemonSocket, SOL_SOCKET, - SO_RCVBUF, - (char *) &TcpRcvBufferSize, - sizeof(TcpRcvBufferSize)) < 0) - syserr("opendaemonsocket: setsockopt(SO_RCVBUF)"); - } -#endif - - switch (DaemonAddr.sa.sa_family) - { -# if NETINET - case AF_INET: - socksize = sizeof DaemonAddr.sin; - break; -# endif - -# if NETISO - case AF_ISO: - socksize = sizeof DaemonAddr.siso; - break; -# endif - - default: - socksize = sizeof DaemonAddr; - break; - } - - if (bind(DaemonSocket, &DaemonAddr.sa, socksize) < 0) - { - /* probably another daemon already */ - saveerrno = errno; - syserr("opendaemonsocket: cannot bind"); - (void) close(DaemonSocket); - goto severe; - } - } - if (!firsttime && listen(DaemonSocket, ListenQueueSize) < 0) - { - saveerrno = errno; - syserr("opendaemonsocket: cannot listen"); - (void) close(DaemonSocket); - goto severe; - } - return socksize; - } while (ntries++ < MAXOPENTRIES && transienterror(saveerrno)); - syserr("!opendaemonsocket: server SMTP socket wedged: exiting"); - /*NOTREACHED*/ - return -1; /* avoid compiler warning on IRIX */ -} -/* -** CLRDAEMON -- reset the daemon connection -** -** Parameters: -** none. -** -** Returns: -** none. -** -** Side Effects: -** releases any resources used by the passive daemon. -*/ - -void -clrdaemon() -{ - if (DaemonSocket >= 0) - (void) close(DaemonSocket); - DaemonSocket = -1; -} -/* -** SETDAEMONOPTIONS -- set options for running the daemon -** -** Parameters: -** p -- the options line. -** -** Returns: -** none. -*/ - -void -setdaemonoptions(p) - register char *p; -{ - if (DaemonAddr.sa.sa_family == AF_UNSPEC) - DaemonAddr.sa.sa_family = AF_INET; - - while (p != NULL) - { - register char *f; - register char *v; - - while (isascii(*p) && isspace(*p)) - p++; - if (*p == '\0') - break; - f = p; - p = strchr(p, ','); - if (p != NULL) - *p++ = '\0'; - v = strchr(f, '='); - if (v == NULL) - continue; - while (isascii(*++v) && isspace(*v)) - continue; - if (isascii(*f) && islower(*f)) - *f = toupper(*f); - - switch (*f) - { - case 'F': /* address family */ - if (isascii(*v) && isdigit(*v)) - DaemonAddr.sa.sa_family = atoi(v); -#if NETINET - else if (strcasecmp(v, "inet") == 0) - DaemonAddr.sa.sa_family = AF_INET; -#endif -#if NETISO - else if (strcasecmp(v, "iso") == 0) - DaemonAddr.sa.sa_family = AF_ISO; -#endif -#if NETNS - else if (strcasecmp(v, "ns") == 0) - DaemonAddr.sa.sa_family = AF_NS; -#endif -#if NETX25 - else if (strcasecmp(v, "x.25") == 0) - DaemonAddr.sa.sa_family = AF_CCITT; -#endif - else - syserr("554 Unknown address family %s in Family=option", v); - break; - - case 'A': /* address */ - switch (DaemonAddr.sa.sa_family) - { -#if NETINET - case AF_INET: - if (isascii(*v) && isdigit(*v)) - DaemonAddr.sin.sin_addr.s_addr = inet_addr(v); - else - { - register struct hostent *hp; - - hp = sm_gethostbyname(v); - if (hp == NULL) - syserr("554 host \"%s\" unknown", v); - else - bcopy(hp->h_addr, &DaemonAddr.sin.sin_addr, INADDRSZ); - } - break; -#endif - - default: - syserr("554 Address= option unsupported for family %d", - DaemonAddr.sa.sa_family); - break; - } - break; - - case 'P': /* port */ - switch (DaemonAddr.sa.sa_family) - { -#if NETISO - short port; -#endif - -#if NETINET - case AF_INET: - if (isascii(*v) && isdigit(*v)) - DaemonAddr.sin.sin_port = htons(atoi(v)); - else - { - register struct servent *sp; - - sp = getservbyname(v, "tcp"); - if (sp == NULL) - syserr("554 service \"%s\" unknown", v); - else - DaemonAddr.sin.sin_port = sp->s_port; - } - break; -#endif - -#if NETISO - case AF_ISO: - /* assume two byte transport selector */ - if (isascii(*v) && isdigit(*v)) - port = htons(atoi(v)); - else - { - register struct servent *sp; - - sp = getservbyname(v, "tcp"); - if (sp == NULL) - syserr("554 service \"%s\" unknown", v); - else - port = sp->s_port; - } - bcopy((char *) &port, TSEL(&DaemonAddr.siso), 2); - break; -#endif - - default: - syserr("554 Port= option unsupported for family %d", - DaemonAddr.sa.sa_family); - break; - } - break; - - case 'L': /* listen queue size */ - ListenQueueSize = atoi(v); - break; - - case 'S': /* send buffer size */ - TcpSndBufferSize = atoi(v); - break; - - case 'R': /* receive buffer size */ - TcpRcvBufferSize = atoi(v); - break; - - default: - syserr("554 DaemonPortOptions parameter \"%s\" unknown", f); - } - } -} -/* -** MAKECONNECTION -- make a connection to an SMTP socket on another machine. -** -** Parameters: -** host -- the name of the host. -** port -- the port number to connect to. -** mci -- a pointer to the mail connection information -** structure to be filled in. -** e -- the current envelope. -** -** Returns: -** An exit code telling whether the connection could be -** made and if not why not. -** -** Side Effects: -** none. -*/ - -static jmp_buf CtxConnectTimeout; - -static void -connecttimeout() -{ - errno = ETIMEDOUT; - longjmp(CtxConnectTimeout, 1); -} - -SOCKADDR CurHostAddr; /* address of current host */ - -int -makeconnection(host, port, mci, e) - char *host; - u_short port; - register MCI *mci; - ENVELOPE *e; -{ - register volatile int addrno = 0; - register volatile int s; - register struct hostent *volatile hp = (struct hostent *)NULL; - SOCKADDR addr; - int sav_errno; - volatile int addrlen; - volatile bool firstconnect; - EVENT *volatile ev = NULL; - - /* - ** Set up the address for the mailer. - ** Accept "[a.b.c.d]" syntax for host name. - */ - -#if NAMED_BIND - h_errno = 0; -#endif - errno = 0; - bzero(&CurHostAddr, sizeof CurHostAddr); - SmtpPhase = mci->mci_phase = "initial connection"; - CurHostName = host; - - if (host[0] == '[') - { -#if NETINET - unsigned long hid = INADDR_NONE; -#endif - register char *p = strchr(host, ']'); - - if (p != NULL) - { - *p = '\0'; -#if NETINET - hid = inet_addr(&host[1]); - if (hid == INADDR_NONE) -#endif - { - /* try it as a host name (avoid MX lookup) */ - hp = sm_gethostbyname(&host[1]); - if (hp == NULL && p[-1] == '.') - { -#if NAMED_BIND - int oldopts = _res.options; - - _res.options &= ~(RES_DEFNAMES|RES_DNSRCH); -#endif - p[-1] = '\0'; - hp = sm_gethostbyname(&host[1]); - p[-1] = '.'; -#if NAMED_BIND - _res.options = oldopts; -#endif - } - *p = ']'; - goto gothostent; - } - *p = ']'; - } - if (p == NULL) - { - extern char MsgBuf[]; - - usrerr("553 Invalid numeric domain spec \"%s\"", host); - mci_setstat(mci, EX_NOHOST, "5.1.2", MsgBuf); - return EX_NOHOST; - } -#if NETINET - addr.sin.sin_family = AF_INET; /*XXX*/ - addr.sin.sin_addr.s_addr = hid; -#endif - } - else - { - /* contortion to get around SGI cc complaints */ - { - register char *p = &host[strlen(host) - 1]; - - hp = sm_gethostbyname(host); - if (hp == NULL && *p == '.') - { -#if NAMED_BIND - int oldopts = _res.options; - - _res.options &= ~(RES_DEFNAMES|RES_DNSRCH); -#endif - *p = '\0'; - hp = sm_gethostbyname(host); - *p = '.'; -#if NAMED_BIND - _res.options = oldopts; -#endif - } - } -gothostent: - if (hp == NULL) - { -#if NAMED_BIND - /* check for name server timeouts */ - if (errno == ETIMEDOUT || h_errno == TRY_AGAIN || - (errno == ECONNREFUSED && UseNameServer)) - { - mci_setstat(mci, EX_TEMPFAIL, "4.4.3", NULL); - return EX_TEMPFAIL; - } -#endif - mci_setstat(mci, EX_NOHOST, "5.1.2", NULL); - return (EX_NOHOST); - } - addr.sa.sa_family = hp->h_addrtype; - switch (hp->h_addrtype) - { -#if NETINET - case AF_INET: - bcopy(hp->h_addr, - &addr.sin.sin_addr, - INADDRSZ); - break; -#endif - - default: - if (hp->h_length > sizeof addr.sa.sa_data) - { - syserr("makeconnection: long sa_data: family %d len %d", - hp->h_addrtype, hp->h_length); - mci_setstat(mci, EX_NOHOST, "5.1.2", NULL); - return EX_NOHOST; - } - bcopy(hp->h_addr, - addr.sa.sa_data, - hp->h_length); - break; - } - addrno = 1; - } - - /* - ** Determine the port number. - */ - - if (port == 0) - { - register struct servent *sp = getservbyname("smtp", "tcp"); - - if (sp == NULL) - { - if (LogLevel > 2) - sm_syslog(LOG_ERR, NOQID, - "makeconnection: service \"smtp\" unknown"); - port = htons(25); - } - else - port = sp->s_port; - } - - switch (addr.sa.sa_family) - { -#if NETINET - case AF_INET: - addr.sin.sin_port = port; - addrlen = sizeof (struct sockaddr_in); - break; -#endif - -#if NETISO - case AF_ISO: - /* assume two byte transport selector */ - bcopy((char *) &port, TSEL((struct sockaddr_iso *) &addr), 2); - addrlen = sizeof (struct sockaddr_iso); - break; -#endif - - default: - syserr("Can't connect to address family %d", addr.sa.sa_family); - mci_setstat(mci, EX_NOHOST, "5.1.2", NULL); - return (EX_NOHOST); - } - - /* - ** Try to actually open the connection. - */ - -#ifdef XLA - /* if too many connections, don't bother trying */ - if (!xla_noqueue_ok(host)) - return EX_TEMPFAIL; -#endif - - firstconnect = TRUE; - for (;;) - { - if (tTd(16, 1)) - printf("makeconnection (%s [%s])\n", - host, anynet_ntoa(&addr)); - - /* save for logging */ - CurHostAddr = addr; - - if (bitnset(M_SECURE_PORT, mci->mci_mailer->m_flags)) - { - int rport = IPPORT_RESERVED - 1; - - s = rresvport(&rport); - } - else - { - s = socket(addr.sa.sa_family, SOCK_STREAM, 0); - } - if (s < 0) - { - sav_errno = errno; - syserr("makeconnection: cannot create socket"); -#ifdef XLA - xla_host_end(host); -#endif - mci_setstat(mci, EX_TEMPFAIL, "4.4.5", NULL); - return EX_TEMPFAIL; - } - -#ifdef SO_SNDBUF - if (TcpSndBufferSize > 0) - { - if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, - (char *) &TcpSndBufferSize, - sizeof(TcpSndBufferSize)) < 0) - syserr("makeconnection: setsockopt(SO_SNDBUF)"); - } -#endif - - if (tTd(16, 1)) - printf("makeconnection: fd=%d\n", s); - - /* turn on network debugging? */ - if (tTd(16, 101)) - { - int on = 1; - (void) setsockopt(s, SOL_SOCKET, SO_DEBUG, - (char *)&on, sizeof on); - } - if (e->e_xfp != NULL) - (void) fflush(e->e_xfp); /* for debugging */ - errno = 0; /* for debugging */ - - /* - ** Linux seems to hang in connect for 90 minutes (!!!). - ** Time out the connect to avoid this problem. - */ - - if (setjmp(CtxConnectTimeout) == 0) - { - int i; - - if (e->e_ntries <= 0 && TimeOuts.to_iconnect != 0) - ev = setevent(TimeOuts.to_iconnect, connecttimeout, 0); - else if (TimeOuts.to_connect != 0) - ev = setevent(TimeOuts.to_connect, connecttimeout, 0); - else - ev = NULL; - -#if _FFR_CONNECTONLYTO_OPTION - /* for testing */ - if (ConnectOnlyTo != 0) - addr.sin.sin_addr.s_addr = ConnectOnlyTo; -#endif - i = connect(s, (struct sockaddr *) &addr, addrlen); - sav_errno = errno; - if (ev != NULL) - clrevent(ev); - if (i >= 0) - break; - } - else - sav_errno = errno; - - /* if running demand-dialed connection, try again */ - if (DialDelay > 0 && firstconnect) - { - if (tTd(16, 1)) - printf("Connect failed (%s); trying again...\n", - errstring(sav_errno)); - firstconnect = FALSE; - sleep(DialDelay); - continue; - } - - /* couldn't connect.... figure out why */ - (void) close(s); - - if (LogLevel >= 14) - sm_syslog(LOG_INFO, e->e_id, - "makeconnection (%s [%s]) failed: %s", - host, anynet_ntoa(&addr), - errstring(sav_errno)); - - if (hp != NULL && hp->h_addr_list[addrno] != NULL) - { - if (tTd(16, 1)) - printf("Connect failed (%s); trying new address....\n", - errstring(sav_errno)); - switch (addr.sa.sa_family) - { -#if NETINET - case AF_INET: - bcopy(hp->h_addr_list[addrno++], - &addr.sin.sin_addr, - INADDRSZ); - break; -#endif - - default: - bcopy(hp->h_addr_list[addrno++], - addr.sa.sa_data, - hp->h_length); - break; - } - continue; - } - - /* couldn't open connection */ -#ifdef XLA - xla_host_end(host); -#endif - mci_setstat(mci, EX_TEMPFAIL, "4.4.1", NULL); - return EX_TEMPFAIL; - } - - /* connection ok, put it into canonical form */ - if ((mci->mci_out = fdopen(s, "w")) == NULL || - (s = dup(s)) < 0 || - (mci->mci_in = fdopen(s, "r")) == NULL) - { - syserr("cannot open SMTP client channel, fd=%d", s); - mci_setstat(mci, EX_TEMPFAIL, "4.4.5", NULL); - return EX_TEMPFAIL; - } - - mci_setstat(mci, EX_OK, NULL, NULL); - return (EX_OK); -} -/* -** MYHOSTNAME -- return the name of this host. -** -** Parameters: -** hostbuf -- a place to return the name of this host. -** size -- the size of hostbuf. -** -** Returns: -** A list of aliases for this host. -** -** Side Effects: -** Adds numeric codes to $=w. -*/ - -struct hostent * -myhostname(hostbuf, size) - char hostbuf[]; - int size; -{ - register struct hostent *hp; - - if (gethostname(hostbuf, size) < 0) - { - (void) strcpy(hostbuf, "localhost"); - } - hp = sm_gethostbyname(hostbuf); - if (hp == NULL) - return NULL; - if (strchr(hp->h_name, '.') != NULL || strchr(hostbuf, '.') == NULL) - { - (void) strncpy(hostbuf, hp->h_name, size - 1); - hostbuf[size - 1] = '\0'; - } - - /* - ** If there is still no dot in the name, try looking for a - ** dotted alias. - */ - - if (strchr(hostbuf, '.') == NULL) - { - char **ha; - - for (ha = hp->h_aliases; *ha != NULL; ha++) - { - if (strchr(*ha, '.') != NULL) - { - (void) strncpy(hostbuf, *ha, size - 1); - hostbuf[size - 1] = '\0'; - break; - } - } - } - - /* - ** If _still_ no dot, wait for a while and try again -- it is - ** possible that some service is starting up. This can result - ** in excessive delays if the system is badly configured, but - ** there really isn't a way around that, particularly given that - ** the config file hasn't been read at this point. - ** All in all, a bit of a mess. - */ - - if (strchr(hostbuf, '.') == NULL && - !getcanonname(hostbuf, size, TRUE)) - { - sm_syslog(LOG_CRIT, NOQID, - "My unqualified host name (%s) unknown; sleeping for retry", - hostbuf); - message("My unqualified host name (%s) unknown; sleeping for retry", - hostbuf); - sleep(60); - if (!getcanonname(hostbuf, size, TRUE)) - { - sm_syslog(LOG_ALERT, NOQID, - "unable to qualify my own domain name (%s) -- using short name", - hostbuf); - message("WARNING: unable to qualify my own domain name (%s) -- using short name", - hostbuf); - } - } - return (hp); -} -/* -** ADDRCMP -- compare two host addresses -** -** Parameters: -** hp -- hostent structure for the first address -** ha -- actual first address -** sa -- second address -** -** Returns: -** 0 -- if ha and sa match -** else -- they don't match -*/ - -int -addrcmp(hp, ha, sa) - struct hostent *hp; - char *ha; - SOCKADDR *sa; -{ - switch (sa->sa.sa_family) - { - case AF_INET: - if (hp->h_addrtype == AF_INET) - return bcmp(ha, (char *) &sa->sin.sin_addr, hp->h_length); - break; - - } - return -1; -} -/* -** GETAUTHINFO -- get the real host name asociated with a file descriptor -** -** Uses RFC1413 protocol to try to get info from the other end. -** -** Parameters: -** fd -- the descriptor -** may_be_forged -- an outage that is set to TRUE if the -** forward lookup of RealHostName does not match -** RealHostAddr; set to FALSE if they do match. -** -** Returns: -** The user@host information associated with this descriptor. -*/ - -static jmp_buf CtxAuthTimeout; - -static void -authtimeout() -{ - longjmp(CtxAuthTimeout, 1); -} - -char * -getauthinfo(fd, may_be_forged) - int fd; - bool *may_be_forged; -{ - SOCKADDR_LEN_T falen; - register char *volatile p = NULL; - SOCKADDR la; - SOCKADDR_LEN_T lalen; - register struct servent *sp; - volatile int s; - int i = 0; - EVENT *ev; - int nleft; - struct hostent *hp; - char *ostype = NULL; - char **ha; - char ibuf[MAXNAME + 1]; - static char hbuf[MAXNAME * 2 + 11]; - - *may_be_forged = FALSE; - falen = sizeof RealHostAddr; - if (isatty(fd) || (i = getpeername(fd, &RealHostAddr.sa, &falen)) < 0 || - falen <= 0 || RealHostAddr.sa.sa_family == 0) - { - if (i < 0 && errno != ENOTSOCK) - return NULL; - (void) snprintf(hbuf, sizeof hbuf, "%s@localhost", - RealUserName); - if (tTd(9, 1)) - printf("getauthinfo: %s\n", hbuf); - return hbuf; - } - - if (RealHostName == NULL) - { - /* translate that to a host name */ - RealHostName = newstr(hostnamebyanyaddr(&RealHostAddr)); - if (strlen(RealHostName) > MAXNAME) - RealHostName[MAXNAME] = '\0'; - } - - /* cross check RealHostName with forward DNS lookup */ - if (anynet_ntoa(&RealHostAddr)[0] == '[' || - RealHostName[0] == '[') - { - /* - ** address is not a socket or have an - ** IP address with no forward lookup - */ - *may_be_forged = FALSE; - } - else - { - /* try to match the reverse against the forward lookup */ - hp = sm_gethostbyname(RealHostName); - - if (hp == NULL) - *may_be_forged = TRUE; - else - { - for (ha = hp->h_addr_list; *ha != NULL; ha++) - if (addrcmp(hp, *ha, &RealHostAddr) == 0) - break; - *may_be_forged = *ha == NULL; - } - } - - if (TimeOuts.to_ident == 0) - goto noident; - - lalen = sizeof la; - if (RealHostAddr.sa.sa_family != AF_INET || - getsockname(fd, &la.sa, &lalen) < 0 || lalen <= 0 || - la.sa.sa_family != AF_INET) - { - /* no ident info */ - goto noident; - } - - /* create ident query */ - (void) snprintf(ibuf, sizeof ibuf, "%d,%d\r\n", - ntohs(RealHostAddr.sin.sin_port), ntohs(la.sin.sin_port)); - - /* create local address */ - la.sin.sin_port = 0; - - /* create foreign address */ - sp = getservbyname("auth", "tcp"); - if (sp != NULL) - RealHostAddr.sin.sin_port = sp->s_port; - else - RealHostAddr.sin.sin_port = htons(113); - - s = -1; - if (setjmp(CtxAuthTimeout) != 0) - { - if (s >= 0) - (void) close(s); - goto noident; - } - - /* put a timeout around the whole thing */ - ev = setevent(TimeOuts.to_ident, authtimeout, 0); - - /* connect to foreign IDENT server using same address as SMTP socket */ - s = socket(AF_INET, SOCK_STREAM, 0); - if (s < 0) - { - clrevent(ev); - goto noident; - } - if (bind(s, &la.sa, sizeof la.sin) < 0 || - connect(s, &RealHostAddr.sa, sizeof RealHostAddr.sin) < 0) - { - goto closeident; - } - - if (tTd(9, 10)) - printf("getauthinfo: sent %s", ibuf); - - /* send query */ - if (write(s, ibuf, strlen(ibuf)) < 0) - goto closeident; - - /* get result */ - p = &ibuf[0]; - nleft = sizeof ibuf - 1; - while ((i = read(s, p, nleft)) > 0) - { - p += i; - nleft -= i; - *p = '\0'; - if (strchr(ibuf, '\n') != NULL) - break; - } - (void) close(s); - clrevent(ev); - if (i < 0 || p == &ibuf[0]) - goto noident; - - if (*--p == '\n' && *--p == '\r') - p--; - *++p = '\0'; - - if (tTd(9, 3)) - printf("getauthinfo: got %s\n", ibuf); - - /* parse result */ - p = strchr(ibuf, ':'); - if (p == NULL) - { - /* malformed response */ - goto noident; - } - while (isascii(*++p) && isspace(*p)) - continue; - if (strncasecmp(p, "userid", 6) != 0) - { - /* presumably an error string */ - goto noident; - } - p += 6; - while (isascii(*p) && isspace(*p)) - p++; - if (*p++ != ':') - { - /* either useridxx or malformed response */ - goto noident; - } - - /* p now points to the OSTYPE field */ - while (isascii(*p) && isspace(*p)) - p++; - ostype = p; - p = strchr(p, ':'); - if (p == NULL) - { - /* malformed response */ - goto noident; - } - else - { - char *charset; - - *p = '\0'; - charset = strchr(ostype, ','); - if (charset != NULL) - *charset = '\0'; - } - - /* 1413 says don't do this -- but it's broken otherwise */ - while (isascii(*++p) && isspace(*p)) - continue; - - /* p now points to the authenticated name -- copy carefully */ - if (strncasecmp(ostype, "other", 5) == 0 && - (ostype[5] == ' ' || ostype[5] == '\0')) - { - snprintf(hbuf, sizeof hbuf, "IDENT:"); - cleanstrcpy(&hbuf[6], p, MAXNAME); - } - else - cleanstrcpy(hbuf, p, MAXNAME); - i = strlen(hbuf); - snprintf(&hbuf[i], sizeof hbuf - i, "@%s", - RealHostName == NULL ? "localhost" : RealHostName); - goto postident; - -closeident: - (void) close(s); - clrevent(ev); - -noident: - if (RealHostName == NULL) - { - if (tTd(9, 1)) - printf("getauthinfo: NULL\n"); - return NULL; - } - snprintf(hbuf, sizeof hbuf, "%s", RealHostName); - -postident: -#if IP_SRCROUTE -# ifndef GET_IPOPT_DST -# define GET_IPOPT_DST(dst) (dst) -# endif - /* - ** Extract IP source routing information. - ** - ** Format of output for a connection from site a through b - ** through c to d: - ** loose: @site-c@site-b:site-a - ** strict: !@site-c@site-b:site-a - ** - ** o - pointer within ipopt_list structure. - ** q - pointer within ls/ss rr route data - ** p - pointer to hbuf - */ - - if (RealHostAddr.sa.sa_family == AF_INET) - { - SOCKOPT_LEN_T ipoptlen; - int j; - u_char *q; - u_char *o; - int l; - struct in_addr addr; - struct ipoption ipopt; - - ipoptlen = sizeof ipopt; - if (getsockopt(fd, IPPROTO_IP, IP_OPTIONS, - (char *) &ipopt, &ipoptlen) < 0) - goto noipsr; - if (ipoptlen == 0) - goto noipsr; - o = (u_char *) ipopt.ipopt_list; - while (o != NULL && o < (u_char *) &ipopt + ipoptlen) - { - switch (*o) - { - case IPOPT_EOL: - o = NULL; - break; - - case IPOPT_NOP: - o++; - break; - - case IPOPT_SSRR: - case IPOPT_LSRR: - /* - ** Source routing. - ** o[0] is the option type (loose/strict). - ** o[1] is the length of this option, - ** including option type and - ** length. - ** o[2] is the pointer into the route - ** data. - ** o[3] begins the route data. - */ - - p = &hbuf[strlen(hbuf)]; - l = sizeof hbuf - (hbuf - p) - 6; - snprintf(p, SPACELEFT(hbuf, p), " [%s@%.*s", - *o == IPOPT_SSRR ? "!" : "", - l > 240 ? 120 : l / 2, - inet_ntoa(GET_IPOPT_DST(ipopt.ipopt_dst))); - i = strlen(p); - p += i; - l -= strlen(p); - - j = o[1] / sizeof(struct in_addr) - 1; - - /* q skips length and router pointer to data */ - q = &o[3]; - for ( ; j >= 0; j--) - { - memcpy(&addr, q, sizeof(addr)); - snprintf(p, SPACELEFT(hbuf, p), - "%c%.*s", - j != 0 ? '@' : ':', - l > 240 ? 120 : - j == 0 ? l : l / 2, - inet_ntoa(addr)); - i = strlen(p); - p += i; - l -= i + 1; - q += sizeof(struct in_addr); - } - o += o[1]; - break; - - default: - /* Skip over option */ - o += o[1]; - break; - } - } - snprintf(p, SPACELEFT(hbuf, p), "]"); - goto postipsr; - } - -noipsr: -#endif - if (RealHostName != NULL && RealHostName[0] != '[') - { - p = &hbuf[strlen(hbuf)]; - (void) snprintf(p, SPACELEFT(hbuf, p), " [%.100s]", - anynet_ntoa(&RealHostAddr)); - } - if (*may_be_forged) - { - p = &hbuf[strlen(hbuf)]; - (void) snprintf(p, SPACELEFT(hbuf, p), " (may be forged)"); - } - -#if IP_SRCROUTE -postipsr: -#endif - if (tTd(9, 1)) - printf("getauthinfo: %s\n", hbuf); - return hbuf; -} -/* -** HOST_MAP_LOOKUP -- turn a hostname into canonical form -** -** Parameters: -** map -- a pointer to this map. -** name -- the (presumably unqualified) hostname. -** av -- unused -- for compatibility with other mapping -** functions. -** statp -- an exit status (out parameter) -- set to -** EX_TEMPFAIL if the name server is unavailable. -** -** Returns: -** The mapping, if found. -** NULL if no mapping found. -** -** Side Effects: -** Looks up the host specified in hbuf. If it is not -** the canonical name for that host, return the canonical -** name (unless MF_MATCHONLY is set, which will cause the -** status only to be returned). -*/ - -char * -host_map_lookup(map, name, av, statp) - MAP *map; - char *name; - char **av; - int *statp; -{ - register struct hostent *hp; - struct in_addr in_addr; - char *cp; - register STAB *s; - char hbuf[MAXNAME + 1]; - - /* - ** See if we have already looked up this name. If so, just - ** return it. - */ - - s = stab(name, ST_NAMECANON, ST_ENTER); - if (bitset(NCF_VALID, s->s_namecanon.nc_flags)) - { - if (tTd(9, 1)) - printf("host_map_lookup(%s) => CACHE %s\n", - name, - s->s_namecanon.nc_cname == NULL - ? "NULL" - : s->s_namecanon.nc_cname); - errno = s->s_namecanon.nc_errno; -#if NAMED_BIND - h_errno = s->s_namecanon.nc_herrno; -#endif - *statp = s->s_namecanon.nc_stat; - if (*statp == EX_TEMPFAIL) - { - CurEnv->e_status = "4.4.3"; - message("851 %s: Name server timeout", - shortenstring(name, 33)); - } - if (*statp != EX_OK) - return NULL; - if (s->s_namecanon.nc_cname == NULL) - { - syserr("host_map_lookup(%s): bogus NULL cache entry, errno = %d, h_errno = %d", - name, - s->s_namecanon.nc_errno, - s->s_namecanon.nc_herrno); - return NULL; - } - if (bitset(MF_MATCHONLY, map->map_mflags)) - cp = map_rewrite(map, name, strlen(name), NULL); - else - cp = map_rewrite(map, - s->s_namecanon.nc_cname, - strlen(s->s_namecanon.nc_cname), - av); - return cp; - } - - /* - ** If we are running without a regular network connection (usually - ** dial-on-demand) and we are just queueing, we want to avoid DNS - ** lookups because those could try to connect to a server. - */ - - if (CurEnv->e_sendmode == SM_DEFER) - { - if (tTd(9, 1)) - printf("host_map_lookup(%s) => DEFERRED\n", name); - *statp = EX_TEMPFAIL; - return NULL; - } - - /* - ** If first character is a bracket, then it is an address - ** lookup. Address is copied into a temporary buffer to - ** strip the brackets and to preserve name if address is - ** unknown. - */ - - if (*name != '[') - { - if (tTd(9, 1)) - printf("host_map_lookup(%s) => ", name); - s->s_namecanon.nc_flags |= NCF_VALID; /* will be soon */ - snprintf(hbuf, sizeof hbuf, "%s", name); - if (getcanonname(hbuf, sizeof hbuf - 1, !HasWildcardMX)) - { - if (tTd(9, 1)) - printf("%s\n", hbuf); - s->s_namecanon.nc_stat = EX_OK; - s->s_namecanon.nc_cname = newstr(hbuf); - if (bitset(MF_MATCHONLY, map->map_mflags)) - cp = map_rewrite(map, name, strlen(name), NULL); - else - cp = map_rewrite(map, hbuf, strlen(hbuf), av); - return cp; - } - else - { - s->s_namecanon.nc_errno = errno; -#if NAMED_BIND - s->s_namecanon.nc_herrno = h_errno; - if (tTd(9, 1)) - printf("FAIL (%d)\n", h_errno); - switch (h_errno) - { - case TRY_AGAIN: - if (UseNameServer) - { - CurEnv->e_status = "4.4.3"; - message("851 %s: Name server timeout", - shortenstring(name, 33)); - } - *statp = EX_TEMPFAIL; - break; - - case HOST_NOT_FOUND: - case NO_DATA: - *statp = EX_NOHOST; - break; - - case NO_RECOVERY: - *statp = EX_SOFTWARE; - break; - - default: - *statp = EX_UNAVAILABLE; - break; - } -#else - if (tTd(9, 1)) - printf("FAIL\n"); - *statp = EX_NOHOST; -#endif - s->s_namecanon.nc_stat = *statp; - return NULL; - } - } - if ((cp = strchr(name, ']')) == NULL) - return (NULL); - *cp = '\0'; - in_addr.s_addr = inet_addr(&name[1]); - *cp = ']'; - - /* nope -- ask the name server */ - hp = sm_gethostbyaddr((char *)&in_addr, INADDRSZ, AF_INET); - s->s_namecanon.nc_errno = errno; -#if NAMED_BIND - s->s_namecanon.nc_herrno = h_errno; -#endif - s->s_namecanon.nc_flags |= NCF_VALID; /* will be soon */ - if (hp == NULL) - { - s->s_namecanon.nc_stat = *statp = EX_NOHOST; - return (NULL); - } - - /* found a match -- copy out */ - hp->h_name = denlstring((char *) hp->h_name, TRUE, TRUE); - s->s_namecanon.nc_stat = *statp = EX_OK; - s->s_namecanon.nc_cname = newstr(hp->h_name); - if (bitset(MF_MATCHONLY, map->map_mflags)) - cp = map_rewrite(map, name, strlen(name), NULL); - else - cp = map_rewrite(map, hp->h_name, strlen(hp->h_name), av); - return cp; -} - -# else /* DAEMON */ -/* code for systems without sophisticated networking */ - -/* -** MYHOSTNAME -- stub version for case of no daemon code. -** -** Can't convert to upper case here because might be a UUCP name. -** -** Mark, you can change this to be anything you want...... -*/ - -char ** -myhostname(hostbuf, size) - char hostbuf[]; - int size; -{ - register FILE *f; - - hostbuf[0] = '\0'; - f = fopen("/usr/include/whoami", "r"); - if (f != NULL) - { - (void) fgets(hostbuf, size, f); - fixcrlf(hostbuf, TRUE); - (void) fclose(f); - } - return (NULL); -} -/* -** GETAUTHINFO -- get the real host name asociated with a file descriptor -** -** Parameters: -** fd -- the descriptor -** may_be_forged -- an outage that is set to TRUE if the -** forward lookup of RealHostName does not match -** RealHostAddr; set to FALSE if they do match. -** -** Returns: -** The host name associated with this descriptor, if it can -** be determined. -** NULL otherwise. -** -** Side Effects: -** none -*/ - -char * -getauthinfo(fd, may_be_forged) - int fd; - bool *may_be_forged; -{ - *may_be_forged = FALSE; - return NULL; -} -/* -** MAPHOSTNAME -- turn a hostname into canonical form -** -** Parameters: -** map -- a pointer to the database map. -** name -- a buffer containing a hostname. -** avp -- a pointer to a (cf file defined) argument vector. -** statp -- an exit status (out parameter). -** -** Returns: -** mapped host name -** FALSE otherwise. -** -** Side Effects: -** Looks up the host specified in name. If it is not -** the canonical name for that host, replace it with -** the canonical name. If the name is unknown, or it -** is already the canonical name, leave it unchanged. -*/ - -/*ARGSUSED*/ -char * -host_map_lookup(map, name, avp, statp) - MAP *map; - char *name; - char **avp; - char *statp; -{ - register struct hostent *hp; - char *cp; - - hp = sm_gethostbyname(name); - if (hp == NULL) - { - *statp = EX_NOHOST; - return NULL; - } - if (bitset(MF_MATCHONLY, map->map_mflags)) - cp = map_rewrite(map, name, strlen(name), NULL); - else - cp = map_rewrite(map, hp->h_name, strlen(hp->h_name), avp); - return cp; -} - -#endif /* DAEMON */ -/* -** HOST_MAP_INIT -- initialize host class structures -*/ - -bool -host_map_init(map, args) - MAP *map; - char *args; -{ - register char *p = args; - - for (;;) - { - while (isascii(*p) && isspace(*p)) - p++; - if (*p != '-') - break; - switch (*++p) - { - case 'a': - map->map_app = ++p; - break; - - case 'T': - map->map_tapp = ++p; - break; - - case 'm': - map->map_mflags |= MF_MATCHONLY; - break; - - case 't': - map->map_mflags |= MF_NODEFER; - break; - } - while (*p != '\0' && !(isascii(*p) && isspace(*p))) - p++; - if (*p != '\0') - *p++ = '\0'; - } - if (map->map_app != NULL) - map->map_app = newstr(map->map_app); - if (map->map_tapp != NULL) - map->map_tapp = newstr(map->map_tapp); - return TRUE; -} -/* -** ANYNET_NTOA -- convert a network address to printable form. -** -** Parameters: -** sap -- a pointer to a sockaddr structure. -** -** Returns: -** A printable version of that sockaddr. -*/ - -#ifdef USE_SOCK_STREAM - -#if NETLINK -# include <net/if_dl.h> -#endif - -char * -anynet_ntoa(sap) - register SOCKADDR *sap; -{ - register char *bp; - register char *ap; - int l; - static char buf[100]; - - /* check for null/zero family */ - if (sap == NULL) - return "NULLADDR"; - if (sap->sa.sa_family == 0) - return "0"; - - switch (sap->sa.sa_family) - { -#if NETUNIX - case AF_UNIX: - if (sap->sunix.sun_path[0] != '\0') - snprintf(buf, sizeof buf, "[UNIX: %.64s]", - sap->sunix.sun_path); - else - snprintf(buf, sizeof buf, "[UNIX: localhost]"); - return buf; -#endif - -#if NETINET - case AF_INET: - return inet_ntoa(sap->sin.sin_addr); -#endif - -#if NETLINK - case AF_LINK: - snprintf(buf, sizeof buf, "[LINK: %s]", - link_ntoa((struct sockaddr_dl *) &sap->sa)); - return buf; -#endif - default: - /* this case is needed when nothing is #defined */ - /* in order to keep the switch syntactically correct */ - break; - } - - /* unknown family -- just dump bytes */ - (void) snprintf(buf, sizeof buf, "Family %d: ", sap->sa.sa_family); - bp = &buf[strlen(buf)]; - ap = sap->sa.sa_data; - for (l = sizeof sap->sa.sa_data; --l >= 0; ) - { - (void) snprintf(bp, SPACELEFT(buf, bp), "%02x:", *ap++ & 0377); - bp += 3; - } - *--bp = '\0'; - return buf; -} -/* -** HOSTNAMEBYANYADDR -- return name of host based on address -** -** Parameters: -** sap -- SOCKADDR pointer -** -** Returns: -** text representation of host name. -** -** Side Effects: -** none. -*/ - -char * -hostnamebyanyaddr(sap) - register SOCKADDR *sap; -{ - register struct hostent *hp; - int saveretry; - -#if NAMED_BIND - /* shorten name server timeout to avoid higher level timeouts */ - saveretry = _res.retry; - _res.retry = 3; -#endif /* NAMED_BIND */ - - switch (sap->sa.sa_family) - { -#if NETINET - case AF_INET: - hp = sm_gethostbyaddr((char *) &sap->sin.sin_addr, - INADDRSZ, - AF_INET); - break; -#endif - -#if NETISO - case AF_ISO: - hp = sm_gethostbyaddr((char *) &sap->siso.siso_addr, - sizeof sap->siso.siso_addr, - AF_ISO); - break; -#endif - -#if NETUNIX - case AF_UNIX: - hp = NULL; - break; -#endif - - default: - hp = sm_gethostbyaddr(sap->sa.sa_data, - sizeof sap->sa.sa_data, - sap->sa.sa_family); - break; - } - -#if NAMED_BIND - _res.retry = saveretry; -#endif /* NAMED_BIND */ - - if (hp != NULL && hp->h_name[0] != '[' && - inet_addr(hp->h_name) == INADDR_NONE) - return denlstring((char *) hp->h_name, TRUE, TRUE); -#if NETUNIX - else if (sap->sa.sa_family == AF_UNIX && sap->sunix.sun_path[0] == '\0') - return "localhost"; -#endif - else - { - /* produce a dotted quad */ - static char buf[203]; - - (void) snprintf(buf, sizeof buf, "[%.200s]", anynet_ntoa(sap)); - return buf; - } -} - -#endif /* SOCK_STREAM */ diff --git a/src/deliver.c b/src/deliver.c deleted file mode 100644 index ed03328..0000000 --- a/src/deliver.c +++ /dev/null @@ -1,3758 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)deliver.c 8.367 (Berkeley) 1/18/1999"; -#endif /* not lint */ - -#include "sendmail.h" -#include <errno.h> -#include <grp.h> -#if NAMED_BIND -#include <resolv.h> -#endif - -#if HASSETUSERCONTEXT -# include <login_cap.h> -#endif - -#if SMTP -extern char SmtpError[]; -#endif - -/* -** SENDALL -- actually send all the messages. -** -** Parameters: -** e -- the envelope to send. -** mode -- the delivery mode to use. If SM_DEFAULT, use -** the current e->e_sendmode. -** -** Returns: -** none. -** -** Side Effects: -** Scans the send lists and sends everything it finds. -** Delivers any appropriate error messages. -** If we are running in a non-interactive mode, takes the -** appropriate action. -*/ - -void -sendall(e, mode) - ENVELOPE *e; - int mode; -{ - register ADDRESS *q; - char *owner; - int otherowners; - register ENVELOPE *ee; - ENVELOPE *splitenv = NULL; - int oldverbose = Verbose; - bool somedeliveries = FALSE, expensive = FALSE; - pid_t pid; - void sendenvelope __P((ENVELOPE *, int)); - - /* - ** If this message is to be discarded, don't bother sending - ** the message at all. - */ - - if (bitset(EF_DISCARD, e->e_flags)) - { - if (tTd(13, 1)) - printf("sendall: discarding id %s\n", e->e_id); - e->e_flags |= EF_CLRQUEUE; - if (LogLevel > 4) - sm_syslog(LOG_INFO, e->e_id, "discarded"); - markstats(e, NULL, TRUE); - return; - } - - /* - ** If we have had global, fatal errors, don't bother sending - ** the message at all if we are in SMTP mode. Local errors - ** (e.g., a single address failing) will still cause the other - ** addresses to be sent. - */ - - if (bitset(EF_FATALERRS, e->e_flags) && - (OpMode == MD_SMTP || OpMode == MD_DAEMON)) - { - e->e_flags |= EF_CLRQUEUE; - return; - } - - /* determine actual delivery mode */ - if (mode == SM_DEFAULT) - { - mode = e->e_sendmode; - if (mode != SM_VERIFY && mode != SM_DEFER && - shouldqueue(e->e_msgpriority, e->e_ctime)) - mode = SM_QUEUE; - } - - if (tTd(13, 1)) - { - extern void printenvflags __P((ENVELOPE *)); - - printf("\n===== SENDALL: mode %c, id %s, e_from ", - mode, e->e_id); - printaddr(&e->e_from, FALSE); - printf("\te_flags = "); - printenvflags(e); - printf("sendqueue:\n"); - printaddr(e->e_sendqueue, TRUE); - } - - /* - ** Do any preprocessing necessary for the mode we are running. - ** Check to make sure the hop count is reasonable. - ** Delete sends to the sender in mailing lists. - */ - - CurEnv = e; - if (tTd(62, 1)) - checkfds(NULL); - - if (e->e_hopcount > MaxHopCount) - { - errno = 0; -#if QUEUE - queueup(e, mode == SM_QUEUE || mode == SM_DEFER); -#endif - e->e_flags |= EF_FATALERRS|EF_PM_NOTIFY|EF_CLRQUEUE; - syserr("554 Too many hops %d (%d max): from %s via %s, to %s", - e->e_hopcount, MaxHopCount, e->e_from.q_paddr, - RealHostName == NULL ? "localhost" : RealHostName, - e->e_sendqueue->q_paddr); - e->e_sendqueue->q_status = "5.4.6"; - return; - } - - /* - ** Do sender deletion. - ** - ** If the sender has the QQUEUEUP flag set, skip this. - ** This can happen if the name server is hosed when you - ** are trying to send mail. The result is that the sender - ** is instantiated in the queue as a recipient. - */ - - if (!bitset(EF_METOO, e->e_flags) && - !bitset(QQUEUEUP, e->e_from.q_flags)) - { - if (tTd(13, 5)) - { - printf("sendall: QDONTSEND "); - printaddr(&e->e_from, FALSE); - } - e->e_from.q_flags |= QDONTSEND; - (void) recipient(&e->e_from, &e->e_sendqueue, 0, e); - } - - /* - ** Handle alias owners. - ** - ** We scan up the q_alias chain looking for owners. - ** We discard owners that are the same as the return path. - */ - - for (q = e->e_sendqueue; q != NULL; q = q->q_next) - { - register struct address *a; - - for (a = q; a != NULL && a->q_owner == NULL; a = a->q_alias) - continue; - if (a != NULL) - q->q_owner = a->q_owner; - - if (q->q_owner != NULL && - !bitset(QDONTSEND, q->q_flags) && - strcmp(q->q_owner, e->e_from.q_paddr) == 0) - q->q_owner = NULL; - } - - if (tTd(13, 25)) - { - printf("\nAfter first owner pass, sendq =\n"); - printaddr(e->e_sendqueue, TRUE); - } - - owner = ""; - otherowners = 1; - while (owner != NULL && otherowners > 0) - { - if (tTd(13, 28)) - printf("owner = \"%s\", otherowners = %d\n", - owner, otherowners); - owner = NULL; - otherowners = bitset(EF_SENDRECEIPT, e->e_flags) ? 1 : 0; - - for (q = e->e_sendqueue; q != NULL; q = q->q_next) - { - if (tTd(13, 30)) - { - printf("Checking "); - printaddr(q, FALSE); - } - if (bitset(QDONTSEND, q->q_flags)) - { - if (tTd(13, 30)) - printf(" ... QDONTSEND\n"); - continue; - } - if (tTd(13, 29) && !tTd(13, 30)) - { - printf("Checking "); - printaddr(q, FALSE); - } - - if (q->q_owner != NULL) - { - if (owner == NULL) - { - if (tTd(13, 40)) - printf(" ... First owner = \"%s\"\n", - q->q_owner); - owner = q->q_owner; - } - else if (owner != q->q_owner) - { - if (strcmp(owner, q->q_owner) == 0) - { - if (tTd(13, 40)) - printf(" ... Same owner = \"%s\"\n", - owner); - - /* make future comparisons cheap */ - q->q_owner = owner; - } - else - { - if (tTd(13, 40)) - printf(" ... Another owner \"%s\"\n", - q->q_owner); - otherowners++; - } - owner = q->q_owner; - } - else if (tTd(13, 40)) - printf(" ... Same owner = \"%s\"\n", - owner); - } - else - { - if (tTd(13, 40)) - printf(" ... Null owner\n"); - otherowners++; - } - - /* - ** If this mailer is expensive, and if we don't - ** want to make connections now, just mark these - ** addresses and return. This is useful if we - ** want to batch connections to reduce load. This - ** will cause the messages to be queued up, and a - ** daemon will come along to send the messages later. - */ - - if (bitset(QBADADDR|QQUEUEUP, q->q_flags)) - { - if (tTd(13, 30)) - printf(" ... QBADADDR|QQUEUEUP\n"); - continue; - } - if (NoConnect && !Verbose && - bitnset(M_EXPENSIVE, q->q_mailer->m_flags)) - { - if (tTd(13, 30)) - printf(" ... expensive\n"); - q->q_flags |= QQUEUEUP; - expensive = TRUE; - } - else - { - if (tTd(13, 30)) - printf(" ... deliverable\n"); - somedeliveries = TRUE; - } - } - - if (owner != NULL && otherowners > 0) - { - extern HDR *copyheader __P((HDR *)); - extern ADDRESS *copyqueue __P((ADDRESS *)); - extern void dup_queue_file __P((ENVELOPE *, ENVELOPE *, int)); - - /* - ** Split this envelope into two. - */ - - ee = (ENVELOPE *) xalloc(sizeof(ENVELOPE)); - *ee = *e; - ee->e_id = NULL; - (void) queuename(ee, '\0'); - - if (tTd(13, 1)) - printf("sendall: split %s into %s, owner = \"%s\", otherowners = %d\n", - e->e_id, ee->e_id, owner, otherowners); - - ee->e_header = copyheader(e->e_header); - ee->e_sendqueue = copyqueue(e->e_sendqueue); - ee->e_errorqueue = copyqueue(e->e_errorqueue); - ee->e_flags = e->e_flags & ~(EF_INQUEUE|EF_CLRQUEUE|EF_FATALERRS|EF_SENDRECEIPT|EF_RET_PARAM); - ee->e_flags |= EF_NORECEIPT; - setsender(owner, ee, NULL, '\0', TRUE); - if (tTd(13, 5)) - { - printf("sendall(split): QDONTSEND "); - printaddr(&ee->e_from, FALSE); - } - ee->e_from.q_flags |= QDONTSEND; - ee->e_dfp = NULL; - ee->e_xfp = NULL; - ee->e_errormode = EM_MAIL; - ee->e_sibling = splitenv; - splitenv = ee; - - for (q = e->e_sendqueue; q != NULL; q = q->q_next) - { - if (q->q_owner == owner) - { - q->q_flags |= QDONTSEND; - q->q_flags &= ~(QQUEUEUP|QBADADDR); - if (tTd(13, 6)) - printf("\t... stripping %s from original envelope\n", - q->q_paddr); - } - } - for (q = ee->e_sendqueue; q != NULL; q = q->q_next) - { - if (q->q_owner != owner) - { - q->q_flags |= QDONTSEND; - q->q_flags &= ~(QQUEUEUP|QBADADDR); - if (tTd(13, 6)) - printf("\t... dropping %s from cloned envelope\n", - q->q_paddr); - } - else - { - /* clear DSN parameters */ - q->q_flags &= ~(QHASNOTIFY|Q_PINGFLAGS); - q->q_flags |= DefaultNotify & ~QPINGONSUCCESS; - if (tTd(13, 6)) - printf("\t... moving %s to cloned envelope\n", - q->q_paddr); - } - } - - if (mode != SM_VERIFY && bitset(EF_HAS_DF, e->e_flags)) - dup_queue_file(e, ee, 'd'); - openxscript(ee); - if (mode != SM_VERIFY && LogLevel > 4) - sm_syslog(LOG_INFO, ee->e_id, - "clone %s, owner=%s", - e->e_id, owner); - } - } - - if (owner != NULL) - { - setsender(owner, e, NULL, '\0', TRUE); - if (tTd(13, 5)) - { - printf("sendall(owner): QDONTSEND "); - printaddr(&e->e_from, FALSE); - } - e->e_from.q_flags |= QDONTSEND; - e->e_errormode = EM_MAIL; - e->e_flags |= EF_NORECEIPT; - e->e_flags &= ~EF_FATALERRS; - } - - /* if nothing to be delivered, just queue up everything */ - if (!somedeliveries && mode != SM_QUEUE && mode != SM_DEFER && - mode != SM_VERIFY) - { - if (tTd(13, 29)) - printf("No deliveries: auto-queuing\n"); - mode = SM_QUEUE; - - /* treat this as a delivery in terms of counting tries */ - e->e_dtime = curtime(); - if (!expensive) - e->e_ntries++; - for (ee = splitenv; ee != NULL; ee = ee->e_sibling) - { - ee->e_dtime = curtime(); - if (!expensive) - ee->e_ntries++; - } - } - -# if QUEUE - if ((mode == SM_QUEUE || mode == SM_DEFER || mode == SM_FORK || - (mode != SM_VERIFY && SuperSafe)) && - (!bitset(EF_INQUEUE, e->e_flags) || splitenv != NULL)) - { - /* be sure everything is instantiated in the queue */ - queueup(e, mode == SM_QUEUE || mode == SM_DEFER); - for (ee = splitenv; ee != NULL; ee = ee->e_sibling) - queueup(ee, mode == SM_QUEUE || mode == SM_DEFER); - } -#endif /* QUEUE */ - - if (tTd(62, 10)) - checkfds("after envelope splitting"); - - /* - ** If we belong in background, fork now. - */ - - if (tTd(13, 20)) - { - printf("sendall: final mode = %c\n", mode); - if (tTd(13, 21)) - { - printf("\n================ Final Send Queue(s) =====================\n"); - printf("\n *** Envelope %s, e_from=%s ***\n", - e->e_id, e->e_from.q_paddr); - printaddr(e->e_sendqueue, TRUE); - for (ee = splitenv; ee != NULL; ee = ee->e_sibling) - { - printf("\n *** Envelope %s, e_from=%s ***\n", - ee->e_id, ee->e_from.q_paddr); - printaddr(ee->e_sendqueue, TRUE); - } - printf("==========================================================\n\n"); - } - } - switch (mode) - { - case SM_VERIFY: - Verbose = 2; - break; - - case SM_QUEUE: - case SM_DEFER: -# if HASFLOCK - queueonly: -# endif - if (e->e_nrcpts > 0) - e->e_flags |= EF_INQUEUE; - dropenvelope(e, splitenv != NULL); - for (ee = splitenv; ee != NULL; ee = ee->e_sibling) - { - if (ee->e_nrcpts > 0) - ee->e_flags |= EF_INQUEUE; - dropenvelope(ee, FALSE); - } - return; - - case SM_FORK: - if (e->e_xfp != NULL) - (void) fflush(e->e_xfp); - -# if !HASFLOCK - /* - ** Since fcntl locking has the interesting semantic that - ** the lock is owned by a process, not by an open file - ** descriptor, we have to flush this to the queue, and - ** then restart from scratch in the child. - */ - - { - /* save id for future use */ - char *qid = e->e_id; - - /* now drop the envelope in the parent */ - e->e_flags |= EF_INQUEUE; - dropenvelope(e, splitenv != NULL); - - /* arrange to reacquire lock after fork */ - e->e_id = qid; - } - - for (ee = splitenv; ee != NULL; ee = ee->e_sibling) - { - /* save id for future use */ - char *qid = ee->e_id; - - /* drop envelope in parent */ - ee->e_flags |= EF_INQUEUE; - dropenvelope(ee, FALSE); - - /* and save qid for reacquisition */ - ee->e_id = qid; - } - -# endif /* !HASFLOCK */ - - pid = fork(); - if (pid < 0) - { -# if HASFLOCK - goto queueonly; -# else - e->e_id = NULL; - for (ee = splitenv; ee != NULL; ee = ee->e_sibling) - ee->e_id = NULL; - return; -# endif /* HASFLOCK */ - } - else if (pid > 0) - { -# if HASFLOCK - /* be sure we leave the temp files to our child */ - /* close any random open files in the envelope */ - closexscript(e); - if (e->e_dfp != NULL) - (void) xfclose(e->e_dfp, "sendenvelope dfp", e->e_id); - e->e_dfp = NULL; - e->e_flags &= ~EF_HAS_DF; - - /* can't call unlockqueue to avoid unlink of xfp */ - if (e->e_lockfp != NULL) - (void) xfclose(e->e_lockfp, "sendenvelope lockfp", e->e_id); - e->e_lockfp = NULL; -# endif - - /* make sure the parent doesn't own the envelope */ - e->e_id = NULL; - - /* catch intermediate zombie */ - (void) waitfor(pid); - return; - } - - /* double fork to avoid zombies */ - pid = fork(); - if (pid > 0) - exit(EX_OK); - - /* be sure we are immune from the terminal */ - disconnect(2, e); - - /* prevent parent from waiting if there was an error */ - if (pid < 0) - { -# if HASFLOCK - e->e_flags |= EF_INQUEUE; -# else - e->e_id = NULL; -# endif /* HASFLOCK */ - finis(TRUE, ExitStat); - } - - /* be sure to give error messages in child */ - QuickAbort = FALSE; - - /* - ** Close any cached connections. - ** - ** We don't send the QUIT protocol because the parent - ** still knows about the connection. - ** - ** This should only happen when delivering an error - ** message. - */ - - mci_flush(FALSE, NULL); - - /* - ** Since the delivery may happen in a child and the parent - ** does not wait, the parent may close the maps thereby - ** removing any shared memory used by the map. Therefore, - ** open a copy of the maps for the delivery process. - */ - - initmaps(FALSE, e); - -# if HASFLOCK - break; -# else - - /* - ** Now reacquire and run the various queue files. - */ - - for (ee = splitenv; ee != NULL; ee = ee->e_sibling) - { - ENVELOPE *sibling = ee->e_sibling; - - (void) dowork(ee->e_id, FALSE, FALSE, ee); - ee->e_sibling = sibling; - } - (void) dowork(e->e_id, FALSE, FALSE, e); - finis(TRUE, ExitStat); -# endif /* !HASFLOCK */ - } - - sendenvelope(e, mode); - dropenvelope(e, TRUE); - for (ee = splitenv; ee != NULL; ee = ee->e_sibling) - { - CurEnv = ee; - if (mode != SM_VERIFY) - openxscript(ee); - sendenvelope(ee, mode); - dropenvelope(ee, TRUE); - } - CurEnv = e; - - Verbose = oldverbose; - if (mode == SM_FORK) - finis(TRUE, ExitStat); -} - -void -sendenvelope(e, mode) - register ENVELOPE *e; - int mode; -{ - register ADDRESS *q; - bool didany; - - if (tTd(13, 10)) - printf("sendenvelope(%s) e_flags=0x%lx\n", - e->e_id == NULL ? "[NOQUEUE]" : e->e_id, - e->e_flags); - if (LogLevel > 80) - sm_syslog(LOG_DEBUG, e->e_id, - "sendenvelope, flags=0x%x", - e->e_flags); - - /* - ** If we have had global, fatal errors, don't bother sending - ** the message at all if we are in SMTP mode. Local errors - ** (e.g., a single address failing) will still cause the other - ** addresses to be sent. - */ - - if (bitset(EF_FATALERRS, e->e_flags) && - (OpMode == MD_SMTP || OpMode == MD_DAEMON)) - { - e->e_flags |= EF_CLRQUEUE; - return; - } - - /* - ** Run through the list and send everything. - ** - ** Set EF_GLOBALERRS so that error messages during delivery - ** result in returned mail. - */ - - e->e_nsent = 0; - e->e_flags |= EF_GLOBALERRS; - define(macid("{envid}", NULL), e->e_envid, e); - define(macid("{bodytype}", NULL), e->e_bodytype, e); - didany = FALSE; - - /* now run through the queue */ - for (q = e->e_sendqueue; q != NULL; q = q->q_next) - { -#if XDEBUG - char wbuf[MAXNAME + 20]; - - (void) snprintf(wbuf, sizeof wbuf, "sendall(%.*s)", - MAXNAME, q->q_paddr); - checkfd012(wbuf); -#endif - if (mode == SM_VERIFY) - { - e->e_to = q->q_paddr; - if (!bitset(QDONTSEND|QBADADDR, q->q_flags)) - { - if (q->q_host != NULL && q->q_host[0] != '\0') - message("deliverable: mailer %s, host %s, user %s", - q->q_mailer->m_name, - q->q_host, - q->q_user); - else - message("deliverable: mailer %s, user %s", - q->q_mailer->m_name, - q->q_user); - } - } - else if (!bitset(QDONTSEND|QBADADDR, q->q_flags)) - { - extern int deliver __P((ENVELOPE *, ADDRESS *)); - -# if QUEUE - /* - ** Checkpoint the send list every few addresses - */ - - if (e->e_nsent >= CheckpointInterval) - { - queueup(e, FALSE); - e->e_nsent = 0; - } -# endif /* QUEUE */ - (void) deliver(e, q); - didany = TRUE; - } - } - if (didany) - { - e->e_dtime = curtime(); - e->e_ntries++; - } - -#if XDEBUG - checkfd012("end of sendenvelope"); -#endif -} -/* -** DUP_QUEUE_FILE -- duplicate a queue file into a split queue -** -** Parameters: -** e -- the existing envelope -** ee -- the new envelope -** type -- the queue file type (e.g., 'd') -** -** Returns: -** none -*/ - -void -dup_queue_file(e, ee, type) - struct envelope *e, *ee; - int type; -{ - char f1buf[MAXQFNAME], f2buf[MAXQFNAME]; - - ee->e_dfp = NULL; - ee->e_xfp = NULL; - snprintf(f1buf, sizeof f1buf, "%s", queuename(e, type)); - snprintf(f2buf, sizeof f2buf, "%s", queuename(ee, type)); - if (link(f1buf, f2buf) < 0) - { - int saverrno = errno; - - syserr("sendall: link(%s, %s)", f1buf, f2buf); - if (saverrno == EEXIST) - { - if (unlink(f2buf) < 0) - { - syserr("!sendall: unlink(%s): permanent", - f2buf); - /*NOTREACHED*/ - } - if (link(f1buf, f2buf) < 0) - { - syserr("!sendall: link(%s, %s): permanent", - f1buf, f2buf); - /*NOTREACHED*/ - } - } - } -} -/* -** DOFORK -- do a fork, retrying a couple of times on failure. -** -** This MUST be a macro, since after a vfork we are running -** two processes on the same stack!!! -** -** Parameters: -** none. -** -** Returns: -** From a macro??? You've got to be kidding! -** -** Side Effects: -** Modifies the ==> LOCAL <== variable 'pid', leaving: -** pid of child in parent, zero in child. -** -1 on unrecoverable error. -** -** Notes: -** I'm awfully sorry this looks so awful. That's -** vfork for you..... -*/ - -# define NFORKTRIES 5 - -# ifndef FORK -# define FORK fork -# endif - -# define DOFORK(fORKfN) \ -{\ - register int i;\ -\ - for (i = NFORKTRIES; --i >= 0; )\ - {\ - pid = fORKfN();\ - if (pid >= 0)\ - break;\ - if (i > 0)\ - sleep((unsigned) NFORKTRIES - i);\ - }\ -} -/* -** DOFORK -- simple fork interface to DOFORK. -** -** Parameters: -** none. -** -** Returns: -** pid of child in parent. -** zero in child. -** -1 on error. -** -** Side Effects: -** returns twice, once in parent and once in child. -*/ - -int -dofork() -{ - register pid_t pid = -1; - - DOFORK(fork); - return (pid); -} -/* -** DELIVER -- Deliver a message to a list of addresses. -** -** This routine delivers to everyone on the same host as the -** user on the head of the list. It is clever about mailers -** that don't handle multiple users. It is NOT guaranteed -** that it will deliver to all these addresses however -- so -** deliver should be called once for each address on the -** list. -** -** Parameters: -** e -- the envelope to deliver. -** firstto -- head of the address list to deliver to. -** -** Returns: -** zero -- successfully delivered. -** else -- some failure, see ExitStat for more info. -** -** Side Effects: -** The standard input is passed off to someone. -*/ - -#ifndef NO_UID -# define NO_UID -1 -#endif -#ifndef NO_GID -# define NO_GID -1 -#endif - -int -deliver(e, firstto) - register ENVELOPE *e; - ADDRESS *firstto; -{ - char *host; /* host being sent to */ - char *user; /* user being sent to */ - char **pvp; - register char **mvp; - register char *p; - register MAILER *m; /* mailer for this recipient */ - ADDRESS *volatile ctladdr; - ADDRESS *volatile contextaddr = NULL; - register MCI *volatile mci; - register ADDRESS *to = firstto; - volatile bool clever = FALSE; /* running user smtp to this mailer */ - ADDRESS *volatile tochain = NULL; /* users chain in this mailer call */ - int rcode; /* response code */ - int lmtp_rcode = EX_OK; - char *firstsig; /* signature of firstto */ - pid_t pid = -1; - char *volatile curhost; - register u_short port = 0; - time_t xstart; - bool suidwarn; - bool anyok; /* at least one address was OK */ - bool goodmxfound = FALSE; /* at least one MX was OK */ - int mpvect[2]; - int rpvect[2]; - char *pv[MAXPV+1]; - char tobuf[TOBUFSIZE]; /* text line of to people */ - char buf[MAXNAME + 1]; - char rpathbuf[MAXNAME + 1]; /* translated return path */ - extern int checkcompat __P((ADDRESS *, ENVELOPE *)); - extern void markfailure __P((ENVELOPE *, ADDRESS *, MCI *, int)); - - errno = 0; - if (bitset(QDONTSEND|QBADADDR|QQUEUEUP, to->q_flags)) - return (0); - - suidwarn = geteuid() == 0; - -#if NAMED_BIND - /* unless interactive, try twice, over a minute */ - if (OpMode == MD_DAEMON || OpMode == MD_SMTP) - { - _res.retrans = 30; - _res.retry = 2; - } -#endif - - m = to->q_mailer; - host = to->q_host; - CurEnv = e; /* just in case */ - e->e_statmsg = NULL; -#if SMTP - SmtpError[0] = '\0'; -#endif - xstart = curtime(); - - if (tTd(10, 1)) - printf("\n--deliver, id=%s, mailer=%s, host=`%s', first user=`%s'\n", - e->e_id, m->m_name, host, to->q_user); - if (tTd(10, 100)) - printopenfds(FALSE); - - /* - ** Clear $&{client_*} macros if this is a bounce message to - ** prevent rejection by check_compat ruleset. - */ - - if (bitset(EF_RESPONSE, e->e_flags)) - { - define(macid("{client_name}", NULL), "", e); - define(macid("{client_addr}", NULL), "", e); - define(macid("{client_port}", NULL), "", e); - } - - /* - ** Do initial argv setup. - ** Insert the mailer name. Notice that $x expansion is - ** NOT done on the mailer name. Then, if the mailer has - ** a picky -f flag, we insert it as appropriate. This - ** code does not check for 'pv' overflow; this places a - ** manifest lower limit of 4 for MAXPV. - ** The from address rewrite is expected to make - ** the address relative to the other end. - */ - - /* rewrite from address, using rewriting rules */ - rcode = EX_OK; - if (bitnset(M_UDBENVELOPE, e->e_from.q_mailer->m_flags)) - p = e->e_sender; - else - p = e->e_from.q_paddr; - p = remotename(p, m, RF_SENDERADDR|RF_CANONICAL, &rcode, e); - if (strlen(p) >= (SIZE_T) sizeof rpathbuf) - { - p = shortenstring(p, MAXSHORTSTR); - syserr("remotename: huge return %s", p); - } - snprintf(rpathbuf, sizeof rpathbuf, "%s", p); - define('g', rpathbuf, e); /* translated return path */ - define('h', host, e); /* to host */ - Errors = 0; - pvp = pv; - *pvp++ = m->m_argv[0]; - - /* insert -f or -r flag as appropriate */ - if (FromFlag && (bitnset(M_FOPT, m->m_flags) || bitnset(M_ROPT, m->m_flags))) - { - if (bitnset(M_FOPT, m->m_flags)) - *pvp++ = "-f"; - else - *pvp++ = "-r"; - *pvp++ = newstr(rpathbuf); - } - - /* - ** Append the other fixed parts of the argv. These run - ** up to the first entry containing "$u". There can only - ** be one of these, and there are only a few more slots - ** in the pv after it. - */ - - for (mvp = m->m_argv; (p = *++mvp) != NULL; ) - { - /* can't use strchr here because of sign extension problems */ - while (*p != '\0') - { - if ((*p++ & 0377) == MACROEXPAND) - { - if (*p == 'u') - break; - } - } - - if (*p != '\0') - break; - - /* this entry is safe -- go ahead and process it */ - expand(*mvp, buf, sizeof buf, e); - *pvp++ = newstr(buf); - if (pvp >= &pv[MAXPV - 3]) - { - syserr("554 Too many parameters to %s before $u", pv[0]); - return (-1); - } - } - - /* - ** If we have no substitution for the user name in the argument - ** list, we know that we must supply the names otherwise -- and - ** SMTP is the answer!! - */ - - if (*mvp == NULL) - { - /* running SMTP */ -# if SMTP - clever = TRUE; - *pvp = NULL; -# else /* SMTP */ - /* oops! we don't implement SMTP */ - syserr("554 SMTP style mailer not implemented"); - return (EX_SOFTWARE); -# endif /* SMTP */ - } - - /* - ** At this point *mvp points to the argument with $u. We - ** run through our address list and append all the addresses - ** we can. If we run out of space, do not fret! We can - ** always send another copy later. - */ - - tobuf[0] = '\0'; - e->e_to = tobuf; - ctladdr = NULL; - firstsig = hostsignature(firstto->q_mailer, firstto->q_host, e); - for (; to != NULL; to = to->q_next) - { - /* avoid sending multiple recipients to dumb mailers */ - if (tobuf[0] != '\0' && !bitnset(M_MUSER, m->m_flags)) - break; - - /* if already sent or not for this host, don't send */ - if (bitset(QDONTSEND|QBADADDR|QQUEUEUP, to->q_flags) || - to->q_mailer != firstto->q_mailer || - strcmp(hostsignature(to->q_mailer, to->q_host, e), firstsig) != 0) - continue; - - /* avoid overflowing tobuf */ - if (sizeof tobuf < (strlen(to->q_paddr) + strlen(tobuf) + 2)) - break; - - if (tTd(10, 1)) - { - printf("\nsend to "); - printaddr(to, FALSE); - } - - /* compute effective uid/gid when sending */ - if (bitnset(M_RUNASRCPT, to->q_mailer->m_flags)) - contextaddr = ctladdr = getctladdr(to); - - if (tTd(10, 2)) - { - printf("ctladdr="); - printaddr(ctladdr, FALSE); - } - - user = to->q_user; - e->e_to = to->q_paddr; - if (tTd(10, 5)) - { - printf("deliver: QDONTSEND "); - printaddr(to, FALSE); - } - to->q_flags |= QDONTSEND; - - /* - ** Check to see that these people are allowed to - ** talk to each other. - */ - - if (m->m_maxsize != 0 && e->e_msgsize > m->m_maxsize) - { - e->e_flags |= EF_NO_BODY_RETN; - if (bitnset(M_LOCALMAILER, to->q_mailer->m_flags)) - to->q_status = "5.2.3"; - else - to->q_status = "5.3.4"; - usrerr("552 Message is too large; %ld bytes max", m->m_maxsize); - markfailure(e, to, NULL, EX_UNAVAILABLE); - giveresponse(EX_UNAVAILABLE, m, NULL, ctladdr, xstart, e); - continue; - } -#if NAMED_BIND - h_errno = 0; -#endif - - /* do config file checking of compatibility */ - rcode = rscheck("check_compat", - e->e_from.q_paddr, to->q_paddr, e); - if (rcode == EX_OK) - { - /* do in-code checking if not discarding */ - if (!bitset(EF_DISCARD, e->e_flags)) - rcode = checkcompat(to, e); - } - if (rcode != EX_OK) - { - markfailure(e, to, NULL, rcode); - giveresponse(rcode, m, NULL, ctladdr, xstart, e); - continue; - } - if (bitset(EF_DISCARD, e->e_flags)) - { - if (tTd(10, 5)) - { - printf("deliver: discarding recipient "); - printaddr(to, FALSE); - } - - /* - ** Remove discard bit to prevent discard of - ** future recipients - */ - e->e_flags &= ~EF_DISCARD; - - continue; - } - - /* - ** Strip quote bits from names if the mailer is dumb - ** about them. - */ - - if (bitnset(M_STRIPQ, m->m_flags)) - { - stripquotes(user); - stripquotes(host); - } - - /* hack attack -- delivermail compatibility */ - if (m == ProgMailer && *user == '|') - user++; - - /* - ** If an error message has already been given, don't - ** bother to send to this address. - ** - ** >>>>>>>>>> This clause assumes that the local mailer - ** >> NOTE >> cannot do any further aliasing; that - ** >>>>>>>>>> function is subsumed by sendmail. - */ - - if (bitset(QBADADDR|QQUEUEUP, to->q_flags)) - continue; - - /* - ** See if this user name is "special". - ** If the user name has a slash in it, assume that this - ** is a file -- send it off without further ado. Note - ** that this type of addresses is not processed along - ** with the others, so we fudge on the To person. - */ - - if (strcmp(m->m_mailer, "[FILE]") == 0) - { - define('u', user, e); /* to user */ - p = to->q_home; - if (p == NULL && ctladdr != NULL) - p = ctladdr->q_home; - define('z', p, e); /* user's home */ - expand(m->m_argv[1], buf, sizeof buf, e); - if (strlen(buf) > 0) - rcode = mailfile(buf, m, ctladdr, SFF_CREAT, e); - else - { - syserr("empty filename specification for mailer %s", - m->m_name); - rcode = EX_CONFIG; - } - giveresponse(rcode, m, NULL, ctladdr, xstart, e); - markfailure(e, to, NULL, rcode); - e->e_nsent++; - if (rcode == EX_OK) - { - to->q_flags |= QSENT; - if (bitnset(M_LOCALMAILER, m->m_flags) && - bitset(QPINGONSUCCESS, to->q_flags)) - { - to->q_flags |= QDELIVERED; - to->q_status = "2.1.5"; - fprintf(e->e_xfp, "%s... Successfully delivered\n", - to->q_paddr); - } - } - to->q_statdate = curtime(); - markstats(e, to, FALSE); - continue; - } - - /* - ** Address is verified -- add this user to mailer - ** argv, and add it to the print list of recipients. - */ - - /* link together the chain of recipients */ - to->q_tchain = tochain; - tochain = to; - - /* create list of users for error messages */ - (void) strcat(tobuf, ","); - (void) strcat(tobuf, to->q_paddr); - define('u', user, e); /* to user */ - p = to->q_home; - if (p == NULL && ctladdr != NULL) - p = ctladdr->q_home; - define('z', p, e); /* user's home */ - - /* - ** Expand out this user into argument list. - */ - - if (!clever) - { - expand(*mvp, buf, sizeof buf, e); - *pvp++ = newstr(buf); - if (pvp >= &pv[MAXPV - 2]) - { - /* allow some space for trailing parms */ - break; - } - } - } - - /* see if any addresses still exist */ - if (tobuf[0] == '\0') - { - define('g', (char *) NULL, e); - return (0); - } - - /* print out messages as full list */ - e->e_to = tobuf + 1; - - /* - ** Fill out any parameters after the $u parameter. - */ - - while (!clever && *++mvp != NULL) - { - expand(*mvp, buf, sizeof buf, e); - *pvp++ = newstr(buf); - if (pvp >= &pv[MAXPV]) - syserr("554 deliver: pv overflow after $u for %s", pv[0]); - } - *pvp++ = NULL; - - /* - ** Call the mailer. - ** The argument vector gets built, pipes - ** are created as necessary, and we fork & exec as - ** appropriate. - ** If we are running SMTP, we just need to clean up. - */ - - /*XXX this seems a bit wierd */ - if (ctladdr == NULL && m != ProgMailer && m != FileMailer && - bitset(QGOODUID, e->e_from.q_flags)) - ctladdr = &e->e_from; - -#if NAMED_BIND - if (ConfigLevel < 2) - _res.options &= ~(RES_DEFNAMES | RES_DNSRCH); /* XXX */ -#endif - - if (tTd(11, 1)) - { - printf("openmailer:"); - printav(pv); - } - errno = 0; -#if NAMED_BIND - h_errno = 0; -#endif - - CurHostName = NULL; - - /* - ** Deal with the special case of mail handled through an IPC - ** connection. - ** In this case we don't actually fork. We must be - ** running SMTP for this to work. We will return a - ** zero pid to indicate that we are running IPC. - ** We also handle a debug version that just talks to stdin/out. - */ - - curhost = NULL; - SmtpPhase = NULL; - mci = NULL; - -#if XDEBUG - { - char wbuf[MAXLINE]; - - /* make absolutely certain 0, 1, and 2 are in use */ - snprintf(wbuf, sizeof wbuf, "%s... openmailer(%s)", - shortenstring(e->e_to, MAXSHORTSTR), m->m_name); - checkfd012(wbuf); - } -#endif - - /* check for 8-bit available */ - if (bitset(EF_HAS8BIT, e->e_flags) && - bitnset(M_7BITS, m->m_flags) && - (bitset(EF_DONT_MIME, e->e_flags) || - !(bitset(MM_MIME8BIT, MimeMode) || - (bitset(EF_IS_MIME, e->e_flags) && - bitset(MM_CVTMIME, MimeMode))))) - { - usrerr("554 Cannot send 8-bit data to 7-bit destination"); - rcode = EX_DATAERR; - e->e_status = "5.6.3"; - goto give_up; - } - - if (tTd(62, 8)) - checkfds("before delivery"); - - /* check for Local Person Communication -- not for mortals!!! */ - if (strcmp(m->m_mailer, "[LPC]") == 0) - { - mci = (MCI *) xalloc(sizeof *mci); - bzero((char *) mci, sizeof *mci); - mci->mci_in = stdin; - mci->mci_out = stdout; - mci->mci_state = clever ? MCIS_OPENING : MCIS_OPEN; - mci->mci_mailer = m; - } - else if (strcmp(m->m_mailer, "[IPC]") == 0 || - strcmp(m->m_mailer, "[TCP]") == 0) - { -#if DAEMON - register int i; - - if (pv[0] == NULL || pv[1] == NULL || pv[1][0] == '\0') - { - syserr("null host name for %s mailer", m->m_mailer); - rcode = EX_CONFIG; - goto give_up; - } - - CurHostName = pv[1]; - curhost = hostsignature(m, pv[1], e); - - if (curhost == NULL || curhost[0] == '\0') - { - syserr("null host signature for %s", pv[1]); - rcode = EX_CONFIG; - goto give_up; - } - - if (!clever) - { - syserr("554 non-clever IPC"); - rcode = EX_CONFIG; - goto give_up; - } - if (pv[2] != NULL) - { - port = htons(atoi(pv[2])); - if (port == 0) - { - struct servent *sp = getservbyname(pv[2], "tcp"); - - if (sp == NULL) - syserr("Service %s unknown", pv[2]); - else - port = sp->s_port; - } - } -tryhost: - while (*curhost != '\0') - { - static char hostbuf[MAXNAME + 1]; - extern int makeconnection __P((char *, u_short, MCI *, ENVELOPE *)); - - /* pull the next host from the signature */ - p = strchr(curhost, ':'); - if (p == NULL) - p = (char *) &curhost[strlen(curhost)]; - if (p == curhost) - { - syserr("deliver: null host name in signature"); - curhost++; - continue; - } - i = p - curhost; - if (i >= sizeof hostbuf) - i = sizeof hostbuf - 1; - strncpy(hostbuf, curhost, i); - hostbuf[i] = '\0'; - if (*p != '\0') - p++; - curhost = p; - - /* see if we already know that this host is fried */ - CurHostName = hostbuf; - mci = mci_get(hostbuf, m); - if (mci->mci_state != MCIS_CLOSED) - { - if (tTd(11, 1)) - { - printf("openmailer: "); - mci_dump(mci, FALSE); - } - CurHostName = mci->mci_host; - message("Using cached %sSMTP connection to %s via %s...", - bitset(MCIF_ESMTP, mci->mci_flags) ? "E" : "", - hostbuf, m->m_name); - break; - } - mci->mci_mailer = m; - if (mci->mci_exitstat != EX_OK) - { - if (mci->mci_exitstat == EX_TEMPFAIL) - goodmxfound = TRUE; - continue; - } - - if (mci_lock_host(mci) != EX_OK) - { - mci_setstat(mci, EX_TEMPFAIL, "4.4.5", NULL); - goodmxfound = TRUE; - continue; - } - - /* try the connection */ - sm_setproctitle(TRUE, "%s %s: %s", e->e_id, hostbuf, "user open"); - if (port == 0) - message("Connecting to %s via %s...", - hostbuf, m->m_name); - else - message("Connecting to %s port %d via %s...", - hostbuf, ntohs(port), m->m_name); - i = makeconnection(hostbuf, port, mci, e); - mci->mci_lastuse = curtime(); - mci->mci_exitstat = i; - mci->mci_errno = errno; -#if NAMED_BIND - mci->mci_herrno = h_errno; -#endif - if (i == EX_OK) - { - goodmxfound = TRUE; - mci->mci_state = MCIS_OPENING; - mci_cache(mci); - if (TrafficLogFile != NULL) - fprintf(TrafficLogFile, "%05d === CONNECT %s\n", - (int) getpid(), hostbuf); - break; - } - else - { - if (tTd(11, 1)) - printf("openmailer: makeconnection => stat=%d, errno=%d\n", - i, errno); - if (i == EX_TEMPFAIL) - goodmxfound = TRUE; - mci_unlock_host(mci); - } - - /* enter status of this host */ - setstat(i); - - /* should print some message here for -v mode */ - } - if (mci == NULL) - { - syserr("deliver: no host name"); - rcode = EX_SOFTWARE; - goto give_up; - } - mci->mci_pid = 0; -#else /* no DAEMON */ - syserr("554 openmailer: no IPC"); - if (tTd(11, 1)) - printf("openmailer: NULL\n"); - rcode = EX_UNAVAILABLE; - goto give_up; -#endif /* DAEMON */ - } - else - { - /* flush any expired connections */ - (void) mci_scan(NULL); - mci = NULL; - -#if SMTP - if (bitnset(M_LMTP, m->m_flags)) - { - /* try to get a cached connection */ - mci = mci_get(m->m_name, m); - if (mci->mci_host == NULL) - mci->mci_host = m->m_name; - CurHostName = mci->mci_host; - if (mci->mci_state != MCIS_CLOSED) - { - message("Using cached LMTP connection for %s...", - m->m_name); - goto do_transfer; - } - } -#endif - - /* announce the connection to verbose listeners */ - if (host == NULL || host[0] == '\0') - message("Connecting to %s...", m->m_name); - else - message("Connecting to %s via %s...", host, m->m_name); - if (TrafficLogFile != NULL) - { - char **av; - - fprintf(TrafficLogFile, "%05d === EXEC", (int) getpid()); - for (av = pv; *av != NULL; av++) - fprintf(TrafficLogFile, " %s", *av); - fprintf(TrafficLogFile, "\n"); - } - -#if XDEBUG - checkfd012("before creating mail pipe"); -#endif - - /* create a pipe to shove the mail through */ - if (pipe(mpvect) < 0) - { - syserr("%s... openmailer(%s): pipe (to mailer)", - shortenstring(e->e_to, MAXSHORTSTR), m->m_name); - if (tTd(11, 1)) - printf("openmailer: NULL\n"); - rcode = EX_OSERR; - goto give_up; - } - -#if XDEBUG - /* make sure we didn't get one of the standard I/O files */ - if (mpvect[0] < 3 || mpvect[1] < 3) - { - syserr("%s... openmailer(%s): bogus mpvect %d %d", - shortenstring(e->e_to, MAXSHORTSTR), m->m_name, - mpvect[0], mpvect[1]); - printopenfds(TRUE); - if (tTd(11, 1)) - printf("openmailer: NULL\n"); - rcode = EX_OSERR; - goto give_up; - } - - /* make sure system call isn't dead meat */ - checkfdopen(mpvect[0], "mpvect[0]"); - checkfdopen(mpvect[1], "mpvect[1]"); - if (mpvect[0] == mpvect[1] || - (e->e_lockfp != NULL && - (mpvect[0] == fileno(e->e_lockfp) || - mpvect[1] == fileno(e->e_lockfp)))) - { - if (e->e_lockfp == NULL) - syserr("%s... openmailer(%s): overlapping mpvect %d %d", - shortenstring(e->e_to, MAXSHORTSTR), - m->m_name, mpvect[0], mpvect[1]); - else - syserr("%s... openmailer(%s): overlapping mpvect %d %d, lockfp = %d", - shortenstring(e->e_to, MAXSHORTSTR), - m->m_name, mpvect[0], mpvect[1], - fileno(e->e_lockfp)); - } -#endif - - /* if this mailer speaks smtp, create a return pipe */ -#if SMTP - if (clever) - { - if (pipe(rpvect) < 0) - { - syserr("%s... openmailer(%s): pipe (from mailer)", - shortenstring(e->e_to, MAXSHORTSTR), - m->m_name); - (void) close(mpvect[0]); - (void) close(mpvect[1]); - if (tTd(11, 1)) - printf("openmailer: NULL\n"); - rcode = EX_OSERR; - goto give_up; - } -# if XDEBUG - checkfdopen(rpvect[0], "rpvect[0]"); - checkfdopen(rpvect[1], "rpvect[1]"); -# endif - } -#endif - - /* - ** Actually fork the mailer process. - ** DOFORK is clever about retrying. - ** - ** Dispose of SIGCHLD signal catchers that may be laying - ** around so that endmail will get it. - */ - - if (e->e_xfp != NULL) - (void) fflush(e->e_xfp); /* for debugging */ - (void) fflush(stdout); - (void) setsignal(SIGCHLD, SIG_DFL); - DOFORK(FORK); - /* pid is set by DOFORK */ - if (pid < 0) - { - /* failure */ - syserr("%s... openmailer(%s): cannot fork", - shortenstring(e->e_to, MAXSHORTSTR), m->m_name); - (void) close(mpvect[0]); - (void) close(mpvect[1]); -#if SMTP - if (clever) - { - (void) close(rpvect[0]); - (void) close(rpvect[1]); - } -#endif - if (tTd(11, 1)) - printf("openmailer: NULL\n"); - rcode = EX_OSERR; - goto give_up; - } - else if (pid == 0) - { - int i; - int saveerrno; - int new_euid = NO_UID; - int new_ruid = NO_UID; - int new_gid = NO_GID; - struct stat stb; - extern int DtableSize; - - if (e->e_lockfp != NULL) - (void) close(fileno(e->e_lockfp)); - - /* child -- set up input & exec mailer */ - (void) setsignal(SIGINT, SIG_IGN); - (void) setsignal(SIGHUP, SIG_IGN); - (void) setsignal(SIGTERM, SIG_DFL); - - if (m != FileMailer || stat(tochain->q_user, &stb) < 0) - stb.st_mode = 0; - -#if HASSETUSERCONTEXT - /* - ** Set user resources. - */ - - if (contextaddr != NULL) - { - struct passwd *pwd; - - if (contextaddr->q_ruser != NULL) - pwd = sm_getpwnam(contextaddr->q_ruser); - else - pwd = sm_getpwnam(contextaddr->q_user); - if (pwd != NULL) - (void) setusercontext(NULL, - pwd, pwd->pw_uid, - LOGIN_SETRESOURCES|LOGIN_SETPRIORITY); - } -#endif - - /* tweak niceness */ - if (m->m_nice != 0) - nice(m->m_nice); - - /* reset group id */ - if (bitnset(M_SPECIFIC_UID, m->m_flags)) - new_gid = m->m_gid; - else if (bitset(S_ISGID, stb.st_mode)) - new_gid = stb.st_gid; - else if (ctladdr != NULL && ctladdr->q_gid != 0) - { - if (!DontInitGroups) - { - char *u = ctladdr->q_ruser; - - if (u == NULL) - u = ctladdr->q_user; - - if (initgroups(u, ctladdr->q_gid) == -1 && suidwarn) - syserr("openmailer: initgroups(%s, %d) failed", - u, ctladdr->q_gid); - } - else - { - GIDSET_T gidset[1]; - - gidset[0] = ctladdr->q_gid; - if (setgroups(1, gidset) == -1 && suidwarn) - syserr("openmailer: setgroups() failed"); - } - new_gid = ctladdr->q_gid; - } - else - { - if (!DontInitGroups) - { - if (initgroups(DefUser, DefGid) == -1 && suidwarn) - syserr("openmailer: initgroups(%s, %d) failed", - DefUser, DefGid); - } - else - { - GIDSET_T gidset[1]; - - gidset[0] = DefGid; - if (setgroups(1, gidset) == -1 && suidwarn) - syserr("openmailer: setgroups() failed"); - } - if (m->m_gid == 0) - new_gid = DefGid; - else - new_gid = m->m_gid; - } - if (new_gid != NO_GID && setgid(new_gid) < 0 && suidwarn) - syserr("openmailer: setgid(%ld) failed", - (long) new_gid); - - /* reset user id */ - endpwent(); - if (bitnset(M_SPECIFIC_UID, m->m_flags)) - new_euid = m->m_uid; - else if (bitset(S_ISUID, stb.st_mode)) - new_ruid = stb.st_uid; - else if (ctladdr != NULL && ctladdr->q_uid != 0) - new_ruid = ctladdr->q_uid; - else if (m->m_uid != 0) - new_ruid = m->m_uid; - else - new_ruid = DefUid; - if (new_euid != NO_UID) - { - vendor_set_uid(new_euid); -#if USESETEUID - if (seteuid(new_euid) < 0 && suidwarn) - syserr("openmailer: seteuid(%ld) failed", - (long) new_euid); -#else -# if HASSETREUID - if (setreuid(new_ruid, new_euid) < 0 && suidwarn) - syserr("openmailer: setreuid(%ld, %ld) failed", - (long) new_ruid, (long) new_euid); -# else - if (new_euid != geteuid() && setuid(new_euid) < 0 && suidwarn) - syserr("openmailer: setuid(%ld) failed", - (long) new_euid); -# endif -#endif - } - else if (new_ruid != NO_UID) - { - vendor_set_uid(new_ruid); - if (setuid(new_ruid) < 0 && suidwarn) - syserr("openmailer: setuid(%ld) failed", - (long) new_ruid); - } - - if (tTd(11, 2)) - printf("openmailer: running as r/euid=%d/%d\n", - (int) getuid(), (int) geteuid()); - - /* move into some "safe" directory */ - if (m->m_execdir != NULL) - { - char *q; - char buf[MAXLINE + 1]; - - for (p = m->m_execdir; p != NULL; p = q) - { - q = strchr(p, ':'); - if (q != NULL) - *q = '\0'; - expand(p, buf, sizeof buf, e); - if (q != NULL) - *q++ = ':'; - if (tTd(11, 20)) - printf("openmailer: trydir %s\n", - buf); - if (buf[0] != '\0' && chdir(buf) >= 0) - break; - } - } - - /* arrange to filter std & diag output of command */ -#if SMTP - if (clever) - { - (void) close(rpvect[0]); - if (dup2(rpvect[1], STDOUT_FILENO) < 0) - { - syserr("%s... openmailer(%s): cannot dup pipe %d for stdout", - shortenstring(e->e_to, MAXSHORTSTR), - m->m_name, rpvect[1]); - _exit(EX_OSERR); - } - (void) close(rpvect[1]); - } - else - { - /* put mailer output in transcript */ - if (dup2(fileno(e->e_xfp), STDOUT_FILENO) < 0) - { - syserr("%s... openmailer(%s): cannot dup xscript %d for stdout", - shortenstring(e->e_to, MAXSHORTSTR), - m->m_name, fileno(e->e_xfp)); - _exit(EX_OSERR); - } - } -#endif - if (dup2(STDOUT_FILENO, STDERR_FILENO) < 0) - { - syserr("%s... openmailer(%s): cannot dup stdout for stderr", - shortenstring(e->e_to, MAXSHORTSTR), - m->m_name); - _exit(EX_OSERR); - } - - /* arrange to get standard input */ - (void) close(mpvect[1]); - if (dup2(mpvect[0], STDIN_FILENO) < 0) - { - syserr("%s... openmailer(%s): cannot dup pipe %d for stdin", - shortenstring(e->e_to, MAXSHORTSTR), - m->m_name, mpvect[0]); - _exit(EX_OSERR); - } - (void) close(mpvect[0]); - - /* arrange for all the files to be closed */ - for (i = 3; i < DtableSize; i++) - { - register int j; - - if ((j = fcntl(i, F_GETFD, 0)) != -1) - (void) fcntl(i, F_SETFD, j | 1); - } - - /* run disconnected from terminal */ - (void) setsid(); - - /* try to execute the mailer */ - execve(m->m_mailer, (ARGV_T) pv, (ARGV_T) UserEnviron); - saveerrno = errno; - syserr("Cannot exec %s", m->m_mailer); - if (bitnset(M_LOCALMAILER, m->m_flags) || - transienterror(saveerrno)) - _exit(EX_OSERR); - _exit(EX_UNAVAILABLE); - } - - /* - ** Set up return value. - */ - - if (mci == NULL) - { - mci = (MCI *) xalloc(sizeof *mci); - bzero((char *) mci, sizeof *mci); - } - mci->mci_mailer = m; - if (clever) - { - mci->mci_state = MCIS_OPENING; - mci_cache(mci); - } - else - { - mci->mci_state = MCIS_OPEN; - } - mci->mci_pid = pid; - (void) close(mpvect[0]); - mci->mci_out = fdopen(mpvect[1], "w"); - if (mci->mci_out == NULL) - { - syserr("deliver: cannot create mailer output channel, fd=%d", - mpvect[1]); - (void) close(mpvect[1]); -#if SMTP - if (clever) - { - (void) close(rpvect[0]); - (void) close(rpvect[1]); - } -#endif - rcode = EX_OSERR; - goto give_up; - } -#if SMTP - if (clever) - { - (void) close(rpvect[1]); - mci->mci_in = fdopen(rpvect[0], "r"); - if (mci->mci_in == NULL) - { - syserr("deliver: cannot create mailer input channel, fd=%d", - mpvect[1]); - (void) close(rpvect[0]); - fclose(mci->mci_out); - mci->mci_out = NULL; - rcode = EX_OSERR; - goto give_up; - } - } - else -#endif - { - mci->mci_flags |= MCIF_TEMP; - mci->mci_in = NULL; - } - } - - /* - ** If we are in SMTP opening state, send initial protocol. - */ - - if (bitnset(M_7BITS, m->m_flags) && - (!clever || mci->mci_state == MCIS_OPENING)) - mci->mci_flags |= MCIF_7BIT; -#if SMTP - if (clever && mci->mci_state != MCIS_CLOSED) - { - extern void smtpinit __P((MAILER *, MCI *, ENVELOPE *)); - - smtpinit(m, mci, e); - } -#endif - -do_transfer: - /* clear out per-message flags from connection structure */ - mci->mci_flags &= ~(MCIF_CVT7TO8|MCIF_CVT8TO7); - - if (bitset(EF_HAS8BIT, e->e_flags) && - !bitset(EF_DONT_MIME, e->e_flags) && - bitnset(M_7BITS, m->m_flags)) - mci->mci_flags |= MCIF_CVT8TO7; - -#if MIME7TO8 - if (bitnset(M_MAKE8BIT, m->m_flags) && - !bitset(MCIF_7BIT, mci->mci_flags) && - (p = hvalue("Content-Transfer-Encoding", e->e_header)) != NULL && - (strcasecmp(p, "quoted-printable") == 0 || - strcasecmp(p, "base64") == 0) && - (p = hvalue("Content-Type", e->e_header)) != NULL) - { - /* may want to convert 7 -> 8 */ - /* XXX should really parse it here -- and use a class XXX */ - if (strncasecmp(p, "text/plain", 10) == 0 && - (p[10] == '\0' || p[10] == ' ' || p[10] == ';')) - mci->mci_flags |= MCIF_CVT7TO8; - } -#endif - - if (tTd(11, 1)) - { - printf("openmailer: "); - mci_dump(mci, FALSE); - } - - if (mci->mci_state != MCIS_OPEN) - { - /* couldn't open the mailer */ - rcode = mci->mci_exitstat; - errno = mci->mci_errno; -#if NAMED_BIND - h_errno = mci->mci_herrno; -#endif - if (rcode == EX_OK) - { - /* shouldn't happen */ - syserr("554 deliver: mci=%lx rcode=%d errno=%d state=%d sig=%s", - (long) mci, rcode, errno, mci->mci_state, - firstsig); - mci_dump_all(TRUE); - rcode = EX_SOFTWARE; - } -#if DAEMON - else if (curhost != NULL && *curhost != '\0') - { - /* try next MX site */ - goto tryhost; - } -#endif - } - else if (!clever) - { - /* - ** Format and send message. - */ - - mci->mci_contentlen = 0; - putfromline(mci, e); - (*e->e_puthdr)(mci, e->e_header, e, M87F_OUTER); - (*e->e_putbody)(mci, e, NULL); - - /* get the exit status */ - rcode = endmailer(mci, e, pv); - } - else -#if SMTP - { - extern int smtpmailfrom __P((MAILER *, MCI *, ENVELOPE *)); - extern int smtprcpt __P((ADDRESS *, MAILER *, MCI *, ENVELOPE *)); - extern int smtpdata __P((MAILER *, MCI *, ENVELOPE *)); - - /* - ** Send the MAIL FROM: protocol - */ - - rcode = smtpmailfrom(m, mci, e); - if (rcode == EX_OK) - { - register char *t = tobuf; - register int i; - - /* send the recipient list */ - tobuf[0] = '\0'; - for (to = tochain; to != NULL; to = to->q_tchain) - { - e->e_to = to->q_paddr; - if (strlen(to->q_paddr) + (t - tobuf) + 2 > sizeof tobuf) - { - /* not enough room */ - continue; - } - else if ((i = smtprcpt(to, m, mci, e)) != EX_OK) - { - markfailure(e, to, mci, i); - giveresponse(i, m, mci, ctladdr, xstart, e); - } - else - { - *t++ = ','; - for (p = to->q_paddr; *p; *t++ = *p++) - continue; - *t = '\0'; - } - } - - /* now send the data */ - if (tobuf[0] == '\0') - { - rcode = EX_OK; - e->e_to = NULL; - if (bitset(MCIF_CACHED, mci->mci_flags)) - smtprset(m, mci, e); - } - else - { - e->e_to = tobuf + 1; - rcode = smtpdata(m, mci, e); - } - } -# if DAEMON - if (rcode == EX_TEMPFAIL && curhost != NULL && *curhost != '\0') - { - /* try next MX site */ - goto tryhost; - } -# endif - } -#else /* not SMTP */ - { - syserr("554 deliver: need SMTP compiled to use clever mailer"); - rcode = EX_CONFIG; - goto give_up; - } -#endif /* SMTP */ -#if NAMED_BIND - if (ConfigLevel < 2) - _res.options |= RES_DEFNAMES | RES_DNSRCH; /* XXX */ -#endif - - if (tTd(62, 1)) - checkfds("after delivery"); - - /* - ** Do final status disposal. - ** We check for something in tobuf for the SMTP case. - ** If we got a temporary failure, arrange to queue the - ** addressees. - */ - - give_up: -#if SMTP - if (bitnset(M_LMTP, m->m_flags)) - { - lmtp_rcode = rcode; - tobuf[0] = '\0'; - anyok = FALSE; - } - else -#endif - anyok = rcode == EX_OK; - - for (to = tochain; to != NULL; to = to->q_tchain) - { - /* see if address already marked */ - if (bitset(QBADADDR|QQUEUEUP, to->q_flags)) - continue; - -#if SMTP - /* if running LMTP, get the status for each address */ - if (bitnset(M_LMTP, m->m_flags)) - { - extern int smtpgetstat __P((MAILER *, MCI *, ENVELOPE *)); - - if (lmtp_rcode == EX_OK) - rcode = smtpgetstat(m, mci, e); - if (rcode == EX_OK) - { - if (strlen(to->q_paddr) + strlen(tobuf) + 2 > sizeof tobuf) - { - syserr("LMTP tobuf overflow"); - } - else - { - strcat(tobuf, ","); - strcat(tobuf, to->q_paddr); - } - anyok = TRUE; - } - else - { - e->e_to = to->q_paddr; - markfailure(e, to, mci, rcode); - giveresponse(rcode, m, mci, ctladdr, xstart, e); - e->e_to = tobuf + 1; - continue; - } - } - else -#endif - { - /* mark bad addresses */ - if (rcode != EX_OK) - { - if (goodmxfound && rcode == EX_NOHOST) - rcode = EX_TEMPFAIL; - markfailure(e, to, mci, rcode); - continue; - } - } - - /* successful delivery */ - to->q_flags |= QSENT; - to->q_statdate = curtime(); - e->e_nsent++; - if (bitnset(M_LOCALMAILER, m->m_flags) && - bitset(QPINGONSUCCESS, to->q_flags)) - { - to->q_flags |= QDELIVERED; - to->q_status = "2.1.5"; - fprintf(e->e_xfp, "%s... Successfully delivered\n", - to->q_paddr); - } - else if (bitset(QPINGONSUCCESS, to->q_flags) && - bitset(QPRIMARY, to->q_flags) && - !bitset(MCIF_DSN, mci->mci_flags)) - { - to->q_flags |= QRELAYED; - fprintf(e->e_xfp, "%s... relayed; expect no further notifications\n", - to->q_paddr); - } - } - -#if SMTP - if (bitnset(M_LMTP, m->m_flags)) - { - /* - ** Global information applies to the last recipient only; - ** clear it out to avoid bogus errors. - */ - - rcode = EX_OK; - e->e_statmsg = NULL; - - /* reset the mci state for the next transaction */ - if (mci != NULL && mci->mci_state == MCIS_ACTIVE) - mci->mci_state = MCIS_OPEN; - } -#endif - - if (tobuf[0] != '\0') - giveresponse(rcode, m, mci, ctladdr, xstart, e); - if (anyok) - markstats(e, tochain, FALSE); - mci_store_persistent(mci); - -#if SMTP - /* now close the connection */ - if (clever && mci != NULL && mci->mci_state != MCIS_CLOSED && - !bitset(MCIF_CACHED, mci->mci_flags)) - smtpquit(m, mci, e); -#endif - - /* - ** Restore state and return. - */ - -#if XDEBUG - { - char wbuf[MAXLINE]; - - /* make absolutely certain 0, 1, and 2 are in use */ - snprintf(wbuf, sizeof wbuf, "%s... end of deliver(%s)", - e->e_to == NULL ? "NO-TO-LIST" - : shortenstring(e->e_to, MAXSHORTSTR), - m->m_name); - checkfd012(wbuf); - } -#endif - - errno = 0; - define('g', (char *) NULL, e); - return (rcode); -} -/* -** MARKFAILURE -- mark a failure on a specific address. -** -** Parameters: -** e -- the envelope we are sending. -** q -- the address to mark. -** mci -- mailer connection information. -** rcode -- the code signifying the particular failure. -** -** Returns: -** none. -** -** Side Effects: -** marks the address (and possibly the envelope) with the -** failure so that an error will be returned or -** the message will be queued, as appropriate. -*/ - -void -markfailure(e, q, mci, rcode) - register ENVELOPE *e; - register ADDRESS *q; - register MCI *mci; - int rcode; -{ - char *stat = NULL; - - switch (rcode) - { - case EX_OK: - break; - - case EX_TEMPFAIL: - case EX_IOERR: - case EX_OSERR: - q->q_flags |= QQUEUEUP; - q->q_flags &= ~QDONTSEND; - break; - - default: - q->q_flags |= QBADADDR; - break; - } - - /* find most specific error code possible */ - if (mci != NULL && mci->mci_status != NULL) - { - q->q_status = mci->mci_status; - if (mci->mci_rstatus != NULL) - q->q_rstatus = newstr(mci->mci_rstatus); - else - q->q_rstatus = NULL; - } - else if (e->e_status != NULL) - { - q->q_status = e->e_status; - q->q_rstatus = NULL; - } - else - { - switch (rcode) - { - case EX_USAGE: - stat = "5.5.4"; - break; - - case EX_DATAERR: - stat = "5.5.2"; - break; - - case EX_NOUSER: - stat = "5.1.1"; - break; - - case EX_NOHOST: - stat = "5.1.2"; - break; - - case EX_NOINPUT: - case EX_CANTCREAT: - case EX_NOPERM: - stat = "5.3.0"; - break; - - case EX_UNAVAILABLE: - case EX_SOFTWARE: - case EX_OSFILE: - case EX_PROTOCOL: - case EX_CONFIG: - stat = "5.5.0"; - break; - - case EX_OSERR: - case EX_IOERR: - stat = "4.5.0"; - break; - - case EX_TEMPFAIL: - stat = "4.2.0"; - break; - } - if (stat != NULL) - q->q_status = stat; - } - - q->q_statdate = curtime(); - if (CurHostName != NULL && CurHostName[0] != '\0') - q->q_statmta = newstr(CurHostName); - if (rcode != EX_OK && q->q_rstatus == NULL && - q->q_mailer != NULL && q->q_mailer->m_diagtype != NULL && - strcasecmp(q->q_mailer->m_diagtype, "UNIX") == 0) - { - char buf[30]; - - (void) snprintf(buf, sizeof buf, "%d", rcode); - q->q_rstatus = newstr(buf); - } -} -/* -** ENDMAILER -- Wait for mailer to terminate. -** -** We should never get fatal errors (e.g., segmentation -** violation), so we report those specially. For other -** errors, we choose a status message (into statmsg), -** and if it represents an error, we print it. -** -** Parameters: -** pid -- pid of mailer. -** e -- the current envelope. -** pv -- the parameter vector that invoked the mailer -** (for error messages). -** -** Returns: -** exit code of mailer. -** -** Side Effects: -** none. -*/ - -int -endmailer(mci, e, pv) - register MCI *mci; - register ENVELOPE *e; - char **pv; -{ - int st; - - mci_unlock_host(mci); - - /* close any connections */ - if (mci->mci_in != NULL) - (void) xfclose(mci->mci_in, mci->mci_mailer->m_name, "mci_in"); - if (mci->mci_out != NULL) - (void) xfclose(mci->mci_out, mci->mci_mailer->m_name, "mci_out"); - mci->mci_in = mci->mci_out = NULL; - mci->mci_state = MCIS_CLOSED; - - /* in the IPC case there is nothing to wait for */ - if (mci->mci_pid == 0) - return (EX_OK); - -#if _FFR_TIMEOUT_WAIT - put a timeout around the wait -#endif - - /* wait for the mailer process to die and collect status */ - st = waitfor(mci->mci_pid); - if (st == -1) - { - syserr("endmailer %s: wait", mci->mci_mailer->m_name); - return (EX_SOFTWARE); - } - - if (WIFEXITED(st)) - { - /* normal death -- return status */ - return (WEXITSTATUS(st)); - } - - /* it died a horrid death */ - syserr("451 mailer %s died with signal %o", - mci->mci_mailer->m_name, st); - - /* log the arguments */ - if (pv != NULL && e->e_xfp != NULL) - { - register char **av; - - fprintf(e->e_xfp, "Arguments:"); - for (av = pv; *av != NULL; av++) - fprintf(e->e_xfp, " %s", *av); - fprintf(e->e_xfp, "\n"); - } - - ExitStat = EX_TEMPFAIL; - return (EX_TEMPFAIL); -} -/* -** GIVERESPONSE -- Interpret an error response from a mailer -** -** Parameters: -** stat -- the status code from the mailer (high byte -** only; core dumps must have been taken care of -** already). -** m -- the mailer info for this mailer. -** mci -- the mailer connection info -- can be NULL if the -** response is given before the connection is made. -** ctladdr -- the controlling address for the recipient -** address(es). -** xstart -- the transaction start time, for computing -** transaction delays. -** e -- the current envelope. -** -** Returns: -** none. -** -** Side Effects: -** Errors may be incremented. -** ExitStat may be set. -*/ - -void -giveresponse(stat, m, mci, ctladdr, xstart, e) - int stat; - register MAILER *m; - register MCI *mci; - ADDRESS *ctladdr; - time_t xstart; - ENVELOPE *e; -{ - register const char *statmsg; - extern char *SysExMsg[]; - register int i; - extern int N_SysEx; - char buf[MAXLINE]; - - if (e == NULL) - syserr("giveresponse: null envelope"); - - /* - ** Compute status message from code. - */ - - i = stat - EX__BASE; - if (stat == 0) - { - statmsg = "250 Sent"; - if (e->e_statmsg != NULL) - { - (void) snprintf(buf, sizeof buf, "%s (%s)", - statmsg, shortenstring(e->e_statmsg, 403)); - statmsg = buf; - } - } - else if (i < 0 || i >= N_SysEx) - { - (void) snprintf(buf, sizeof buf, "554 unknown mailer error %d", - stat); - stat = EX_UNAVAILABLE; - statmsg = buf; - } - else if (stat == EX_TEMPFAIL) - { - char *bp = buf; - - snprintf(bp, SPACELEFT(buf, bp), "%s", SysExMsg[i] + 1); - bp += strlen(bp); -#if NAMED_BIND - if (h_errno == TRY_AGAIN) - statmsg = errstring(h_errno+E_DNSBASE); - else -#endif - { - if (errno != 0) - statmsg = errstring(errno); - else - { -#if SMTP - statmsg = SmtpError; -#else /* SMTP */ - statmsg = NULL; -#endif /* SMTP */ - } - } - if (statmsg != NULL && statmsg[0] != '\0') - snprintf(bp, SPACELEFT(buf, bp), ": %s", statmsg); - statmsg = buf; - } -#if NAMED_BIND - else if (stat == EX_NOHOST && h_errno != 0) - { - statmsg = errstring(h_errno + E_DNSBASE); - (void) snprintf(buf, sizeof buf, "%s (%s)", - SysExMsg[i] + 1, statmsg); - statmsg = buf; - } -#endif - else - { - statmsg = SysExMsg[i]; - if (*statmsg++ == ':' && errno != 0) - { - (void) snprintf(buf, sizeof buf, "%s: %s", - statmsg, errstring(errno)); - statmsg = buf; - } - } - - /* - ** Print the message as appropriate - */ - - if (stat == EX_OK || stat == EX_TEMPFAIL) - { - extern char MsgBuf[]; - - message("%s", &statmsg[4]); - if (stat == EX_TEMPFAIL && e->e_xfp != NULL) - fprintf(e->e_xfp, "%s\n", &MsgBuf[4]); - } - else - { - char mbuf[8]; - - Errors++; - snprintf(mbuf, sizeof mbuf, "%.3s %%s", statmsg); - usrerr(mbuf, &statmsg[4]); - } - - /* - ** Final cleanup. - ** Log a record of the transaction. Compute the new - ** ExitStat -- if we already had an error, stick with - ** that. - */ - - if (OpMode != MD_VERIFY && !bitset(EF_VRFYONLY, e->e_flags) && - LogLevel > ((stat == EX_TEMPFAIL) ? 8 : (stat == EX_OK) ? 7 : 6)) - logdelivery(m, mci, &statmsg[4], ctladdr, xstart, e); - - if (tTd(11, 2)) - printf("giveresponse: stat=%d, e->e_message=%s\n", - stat, e->e_message == NULL ? "<NULL>" : e->e_message); - - if (stat != EX_TEMPFAIL) - setstat(stat); - if (stat != EX_OK && (stat != EX_TEMPFAIL || e->e_message == NULL)) - { - if (e->e_message != NULL) - free(e->e_message); - e->e_message = newstr(&statmsg[4]); - } - errno = 0; -#if NAMED_BIND - h_errno = 0; -#endif -} -/* -** LOGDELIVERY -- log the delivery in the system log -** -** Care is taken to avoid logging lines that are too long, because -** some versions of syslog have an unfortunate proclivity for core -** dumping. This is a hack, to be sure, that is at best empirical. -** -** Parameters: -** m -- the mailer info. Can be NULL for initial queue. -** mci -- the mailer connection info -- can be NULL if the -** log is occuring when no connection is active. -** stat -- the message to print for the status. -** ctladdr -- the controlling address for the to list. -** xstart -- the transaction start time, used for -** computing transaction delay. -** e -- the current envelope. -** -** Returns: -** none -** -** Side Effects: -** none -*/ - -void -logdelivery(m, mci, stat, ctladdr, xstart, e) - MAILER *m; - register MCI *mci; - const char *stat; - ADDRESS *ctladdr; - time_t xstart; - register ENVELOPE *e; -{ - register char *bp; - register char *p; - int l; - char buf[1024]; - -# if (SYSLOG_BUFSIZE) >= 256 - /* ctladdr: max 106 bytes */ - bp = buf; - if (ctladdr != NULL) - { - snprintf(bp, SPACELEFT(buf, bp), ", ctladdr=%s", - shortenstring(ctladdr->q_paddr, 83)); - bp += strlen(bp); - if (bitset(QGOODUID, ctladdr->q_flags)) - { - (void) snprintf(bp, SPACELEFT(buf, bp), " (%d/%d)", - ctladdr->q_uid, ctladdr->q_gid); - bp += strlen(bp); - } - } - - /* delay & xdelay: max 41 bytes */ - snprintf(bp, SPACELEFT(buf, bp), ", delay=%s", - pintvl(curtime() - e->e_ctime, TRUE)); - bp += strlen(bp); - - if (xstart != (time_t) 0) - { - snprintf(bp, SPACELEFT(buf, bp), ", xdelay=%s", - pintvl(curtime() - xstart, TRUE)); - bp += strlen(bp); - } - - /* mailer: assume about 19 bytes (max 10 byte mailer name) */ - if (m != NULL) - { - snprintf(bp, SPACELEFT(buf, bp), ", mailer=%s", m->m_name); - bp += strlen(bp); - } - - /* relay: max 66 bytes for IPv4 addresses */ - if (mci != NULL && mci->mci_host != NULL) - { -# if DAEMON - extern SOCKADDR CurHostAddr; -# endif - - snprintf(bp, SPACELEFT(buf, bp), ", relay=%s", - shortenstring(mci->mci_host, 40)); - bp += strlen(bp); - -# if DAEMON - if (CurHostAddr.sa.sa_family != 0) - { - snprintf(bp, SPACELEFT(buf, bp), " [%s]", - anynet_ntoa(&CurHostAddr)); - } -# endif - } - else if (strcmp(stat, "queued") != 0) - { - p = macvalue('h', e); - if (p != NULL && p[0] != '\0') - { - snprintf(bp, SPACELEFT(buf, bp), ", relay=%s", - shortenstring(p, 40)); - } - } - bp += strlen(bp); - -#define STATLEN (((SYSLOG_BUFSIZE) - 100) / 4) -#if (STATLEN) < 63 -# undef STATLEN -# define STATLEN 63 -#endif -#if (STATLEN) > 203 -# undef STATLEN -# define STATLEN 203 -#endif - - /* stat: max 210 bytes */ - if ((bp - buf) > (sizeof buf - ((STATLEN) + 20))) - { - /* desperation move -- truncate data */ - bp = buf + sizeof buf - ((STATLEN) + 17); - strcpy(bp, "..."); - bp += 3; - } - - (void) strcpy(bp, ", stat="); - bp += strlen(bp); - - (void) strcpy(bp, shortenstring(stat, (STATLEN))); - - /* id, to: max 13 + TOBUFSIZE bytes */ - l = SYSLOG_BUFSIZE - 100 - strlen(buf); - p = e->e_to; - while (strlen(p) >= (SIZE_T) l) - { - register char *q = strchr(p + l, ','); - - if (q == NULL) - break; - sm_syslog(LOG_INFO, e->e_id, - "to=%.*s [more]%s", - ++q - p, p, buf); - p = q; - } - sm_syslog(LOG_INFO, e->e_id, "to=%s%s", p, buf); - -# else /* we have a very short log buffer size */ - - l = SYSLOG_BUFSIZE - 85; - p = e->e_to; - while (strlen(p) >= (SIZE_T) l) - { - register char *q = strchr(p + l, ','); - - if (q == NULL) - break; - sm_syslog(LOG_INFO, e->e_id, - "to=%.*s [more]", - ++q - p, p); - p = q; - } - sm_syslog(LOG_INFO, e->e_id, "to=%s", p); - - if (ctladdr != NULL) - { - bp = buf; - snprintf(bp, SPACELEFT(buf, bp), "ctladdr=%s", - shortenstring(ctladdr->q_paddr, 83)); - bp += strlen(bp); - if (bitset(QGOODUID, ctladdr->q_flags)) - { - (void) snprintf(bp, SPACELEFT(buf, bp), " (%d/%d)", - ctladdr->q_uid, ctladdr->q_gid); - bp += strlen(bp); - } - sm_syslog(LOG_INFO, e->e_id, "%s", buf); - } - bp = buf; - snprintf(bp, SPACELEFT(buf, bp), "delay=%s", - pintvl(curtime() - e->e_ctime, TRUE)); - bp += strlen(bp); - if (xstart != (time_t) 0) - { - snprintf(bp, SPACELEFT(buf, bp), ", xdelay=%s", - pintvl(curtime() - xstart, TRUE)); - bp += strlen(bp); - } - - if (m != NULL) - { - snprintf(bp, SPACELEFT(buf, bp), ", mailer=%s", m->m_name); - bp += strlen(bp); - } - sm_syslog(LOG_INFO, e->e_id, "%.1000s", buf); - - buf[0] = '\0'; - bp = buf; - if (mci != NULL && mci->mci_host != NULL) - { -# if DAEMON - extern SOCKADDR CurHostAddr; -# endif - - snprintf(bp, SPACELEFT(buf, bp), "relay=%.100s", mci->mci_host); - bp += strlen(bp); - -# if DAEMON - if (CurHostAddr.sa.sa_family != 0) - snprintf(bp, SPACELEFT(buf, bp), " [%.100s]", - anynet_ntoa(&CurHostAddr)); -# endif - } - else if (strcmp(stat, "queued") != 0) - { - p = macvalue('h', e); - if (p != NULL && p[0] != '\0') - snprintf(buf, sizeof buf, "relay=%.100s", p); - } - if (buf[0] != '\0') - sm_syslog(LOG_INFO, e->e_id, "%.1000s", buf); - - sm_syslog(LOG_INFO, e->e_id, "stat=%s", shortenstring(stat, 63)); -# endif /* short log buffer */ -} -/* -** PUTFROMLINE -- output a UNIX-style from line (or whatever) -** -** This can be made an arbitrary message separator by changing $l -** -** One of the ugliest hacks seen by human eyes is contained herein: -** UUCP wants those stupid "remote from <host>" lines. Why oh why -** does a well-meaning programmer such as myself have to deal with -** this kind of antique garbage???? -** -** Parameters: -** mci -- the connection information. -** e -- the envelope. -** -** Returns: -** none -** -** Side Effects: -** outputs some text to fp. -*/ - -void -putfromline(mci, e) - register MCI *mci; - ENVELOPE *e; -{ - char *template = UnixFromLine; - char buf[MAXLINE]; - char xbuf[MAXLINE]; - - if (bitnset(M_NHDR, mci->mci_mailer->m_flags)) - return; - - mci->mci_flags |= MCIF_INHEADER; - - if (bitnset(M_UGLYUUCP, mci->mci_mailer->m_flags)) - { - char *bang; - - expand("\201g", buf, sizeof buf, e); - bang = strchr(buf, '!'); - if (bang == NULL) - { - char *at; - char hname[MAXNAME]; - - /* - ** If we can construct a UUCP path, do so - */ - - at = strrchr(buf, '@'); - if (at == NULL) - { - expand( "\201k", hname, sizeof hname, e); - at = hname; - } - else - *at++ = '\0'; - (void) snprintf(xbuf, sizeof xbuf, - "From %.800s \201d remote from %.100s\n", - buf, at); - } - else - { - *bang++ = '\0'; - (void) snprintf(xbuf, sizeof xbuf, - "From %.800s \201d remote from %.100s\n", - bang, buf); - template = xbuf; - } - } - expand(template, buf, sizeof buf, e); - putxline(buf, strlen(buf), mci, PXLF_HEADER); -} -/* -** PUTBODY -- put the body of a message. -** -** Parameters: -** mci -- the connection information. -** e -- the envelope to put out. -** separator -- if non-NULL, a message separator that must -** not be permitted in the resulting message. -** -** Returns: -** none. -** -** Side Effects: -** The message is written onto fp. -*/ - -/* values for output state variable */ -#define OS_HEAD 0 /* at beginning of line */ -#define OS_CR 1 /* read a carriage return */ -#define OS_INLINE 2 /* putting rest of line */ - -void -putbody(mci, e, separator) - register MCI *mci; - register ENVELOPE *e; - char *separator; -{ - char buf[MAXLINE]; - char *boundaries[MAXMIMENESTING + 1]; - - /* - ** Output the body of the message - */ - - if (e->e_dfp == NULL && bitset(EF_HAS_DF, e->e_flags)) - { - char *df = queuename(e, 'd'); - - e->e_dfp = fopen(df, "r"); - if (e->e_dfp == NULL) - syserr("putbody: Cannot open %s for %s from %s", - df, e->e_to, e->e_from.q_paddr); - } - if (e->e_dfp == NULL) - { - if (bitset(MCIF_INHEADER, mci->mci_flags)) - { - putline("", mci); - mci->mci_flags &= ~MCIF_INHEADER; - } - putline("<<< No Message Collected >>>", mci); - goto endofmessage; - } - if (e->e_dfino == (ino_t) 0) - { - struct stat stbuf; - - if (fstat(fileno(e->e_dfp), &stbuf) < 0) - e->e_dfino = -1; - else - { - e->e_dfdev = stbuf.st_dev; - e->e_dfino = stbuf.st_ino; - } - } - rewind(e->e_dfp); - -#if MIME8TO7 - if (bitset(MCIF_CVT8TO7, mci->mci_flags)) - { - /* - ** Do 8 to 7 bit MIME conversion. - */ - - /* make sure it looks like a MIME message */ - if (hvalue("MIME-Version", e->e_header) == NULL) - putline("MIME-Version: 1.0", mci); - - if (hvalue("Content-Type", e->e_header) == NULL) - { - snprintf(buf, sizeof buf, - "Content-Type: text/plain; charset=%s", - defcharset(e)); - putline(buf, mci); - } - - /* now do the hard work */ - boundaries[0] = NULL; - mci->mci_flags |= MCIF_INHEADER; - mime8to7(mci, e->e_header, e, boundaries, M87F_OUTER); - } -# if MIME7TO8 - else if (bitset(MCIF_CVT7TO8, mci->mci_flags)) - { - mime7to8(mci, e->e_header, e); - } -# endif - else if (MaxMimeHeaderLength > 0 || MaxMimeFieldLength > 0) - { - /* Use mime8to7 to check multipart for MIME header overflows */ - boundaries[0] = NULL; - mci->mci_flags |= MCIF_INHEADER; - mime8to7(mci, e->e_header, e, boundaries, M87F_OUTER|M87F_NO8TO7); - } - else -#endif - { - int ostate; - register char *bp; - register char *pbp; - register int c; - register char *xp; - int padc; - char *buflim; - int pos = 0; - size_t eol_len; - char peekbuf[10]; - - if (bitset(MCIF_INHEADER, mci->mci_flags)) - { - putline("", mci); - mci->mci_flags &= ~MCIF_INHEADER; - } - - /* determine end of buffer; allow for short mailer lines */ - buflim = &buf[sizeof buf - 1]; - if (mci->mci_mailer->m_linelimit > 0 && - mci->mci_mailer->m_linelimit < sizeof buf - 1) - buflim = &buf[mci->mci_mailer->m_linelimit - 1]; - eol_len = strlen(mci->mci_mailer->m_eol); - - /* copy temp file to output with mapping */ - ostate = OS_HEAD; - bp = buf; - pbp = peekbuf; - while (!ferror(mci->mci_out)) - { - if (pbp > peekbuf) - c = *--pbp; - else if ((c = getc(e->e_dfp)) == EOF) - break; - if (bitset(MCIF_7BIT, mci->mci_flags)) - c &= 0x7f; - switch (ostate) - { - case OS_HEAD: -#if _FFR_NONULLS - if (c == '\0' && - bitnset(M_NONULLS, mci->mci_mailer->m_flags)) - break; -#endif - if (c != '\r' && c != '\n' && bp < buflim) - { - *bp++ = c; - break; - } - - /* check beginning of line for special cases */ - *bp = '\0'; - pos = 0; - padc = EOF; - if (buf[0] == 'F' && - bitnset(M_ESCFROM, mci->mci_mailer->m_flags) && - strncmp(buf, "From ", 5) == 0) - { - padc = '>'; - } - if (buf[0] == '-' && buf[1] == '-' && - separator != NULL) - { - /* possible separator */ - int sl = strlen(separator); - - if (strncmp(&buf[2], separator, sl) == 0) - padc = ' '; - } - if (buf[0] == '.' && - bitnset(M_XDOT, mci->mci_mailer->m_flags)) - { - padc = '.'; - } - - /* now copy out saved line */ - if (TrafficLogFile != NULL) - { - fprintf(TrafficLogFile, "%05d >>> ", - (int) getpid()); - if (padc != EOF) - putc(padc, TrafficLogFile); - for (xp = buf; xp < bp; xp++) - putc(*xp, TrafficLogFile); - if (c == '\n') - fputs(mci->mci_mailer->m_eol, - TrafficLogFile); - } - if (padc != EOF) - { - putc(padc, mci->mci_out); - mci->mci_contentlen++; - pos++; - } - for (xp = buf; xp < bp; xp++) - { - putc(*xp, mci->mci_out); - mci->mci_contentlen++; - } - if (c == '\n') - { - fputs(mci->mci_mailer->m_eol, - mci->mci_out); - mci->mci_contentlen += eol_len; - pos = 0; - } - else - { - pos += bp - buf; - if (c != '\r') - *pbp++ = c; - } - bp = buf; - - /* determine next state */ - if (c == '\n') - ostate = OS_HEAD; - else if (c == '\r') - ostate = OS_CR; - else - ostate = OS_INLINE; - continue; - - case OS_CR: - if (c == '\n') - { - /* got CRLF */ - fputs(mci->mci_mailer->m_eol, mci->mci_out); - mci->mci_contentlen += eol_len; - if (TrafficLogFile != NULL) - { - fputs(mci->mci_mailer->m_eol, - TrafficLogFile); - } - ostate = OS_HEAD; - continue; - } - - /* had a naked carriage return */ - *pbp++ = c; - c = '\r'; - ostate = OS_INLINE; - goto putch; - - case OS_INLINE: - if (c == '\r') - { - ostate = OS_CR; - continue; - } -#if _FFR_NONULLS - if (c == '\0' && - bitnset(M_NONULLS, mci->mci_mailer->m_flags)) - break; -#endif -putch: - if (mci->mci_mailer->m_linelimit > 0 && - pos > mci->mci_mailer->m_linelimit && - c != '\n') - { - putc('!', mci->mci_out); - mci->mci_contentlen++; - fputs(mci->mci_mailer->m_eol, mci->mci_out); - mci->mci_contentlen += eol_len; - if (TrafficLogFile != NULL) - { - fprintf(TrafficLogFile, "!%s", - mci->mci_mailer->m_eol); - } - ostate = OS_HEAD; - *pbp++ = c; - continue; - } - if (c == '\n') - { - if (TrafficLogFile != NULL) - fputs(mci->mci_mailer->m_eol, - TrafficLogFile); - fputs(mci->mci_mailer->m_eol, mci->mci_out); - mci->mci_contentlen += eol_len; - pos = 0; - ostate = OS_HEAD; - } - else - { - if (TrafficLogFile != NULL) - putc(c, TrafficLogFile); - putc(c, mci->mci_out); - mci->mci_contentlen++; - pos++; - ostate = OS_INLINE; - } - break; - } - } - - /* make sure we are at the beginning of a line */ - if (bp > buf) - { - if (TrafficLogFile != NULL) - { - for (xp = buf; xp < bp; xp++) - putc(*xp, TrafficLogFile); - } - for (xp = buf; xp < bp; xp++) - { - putc(*xp, mci->mci_out); - mci->mci_contentlen++; - } - pos += bp - buf; - } - if (pos > 0) - { - if (TrafficLogFile != NULL) - fputs(mci->mci_mailer->m_eol, TrafficLogFile); - fputs(mci->mci_mailer->m_eol, mci->mci_out); - mci->mci_contentlen += eol_len; - } - } - - if (ferror(e->e_dfp)) - { - syserr("putbody: df%s: read error", e->e_id); - ExitStat = EX_IOERR; - } - -endofmessage: - /* some mailers want extra blank line at end of message */ - if (bitnset(M_BLANKEND, mci->mci_mailer->m_flags) && - buf[0] != '\0' && buf[0] != '\n') - putline("", mci); - - (void) fflush(mci->mci_out); - if (ferror(mci->mci_out) && errno != EPIPE) - { - syserr("putbody: write error"); - ExitStat = EX_IOERR; - } - errno = 0; -} -/* -** MAILFILE -- Send a message to a file. -** -** If the file has the setuid/setgid bits set, but NO execute -** bits, sendmail will try to become the owner of that file -** rather than the real user. Obviously, this only works if -** sendmail runs as root. -** -** This could be done as a subordinate mailer, except that it -** is used implicitly to save messages in ~/dead.letter. We -** view this as being sufficiently important as to include it -** here. For example, if the system is dying, we shouldn't have -** to create another process plus some pipes to save the message. -** -** Parameters: -** filename -- the name of the file to send to. -** mailer -- mailer definition for recipient -- if NULL, -** use FileMailer. -** ctladdr -- the controlling address header -- includes -** the userid/groupid to be when sending. -** sfflags -- flags for opening. -** e -- the current envelope. -** -** Returns: -** The exit code associated with the operation. -** -** Side Effects: -** none. -*/ - -static jmp_buf CtxMailfileTimeout; -static void mailfiletimeout __P((void)); - -int -mailfile(filename, mailer, ctladdr, sfflags, e) - char *volatile filename; - MAILER *volatile mailer; - ADDRESS *ctladdr; - volatile int sfflags; - register ENVELOPE *e; -{ - register FILE *f; - register pid_t pid = -1; - volatile int mode = ST_MODE_NOFILE; - bool suidwarn = geteuid() == 0; - char *p; - EVENT *ev; - - if (tTd(11, 1)) - { - printf("mailfile %s\n ctladdr=", filename); - printaddr(ctladdr, FALSE); - } - - if (mailer == NULL) - mailer = FileMailer; - - if (e->e_xfp != NULL) - fflush(e->e_xfp); - - /* - ** Special case /dev/null. This allows us to restrict file - ** delivery to regular files only. - */ - - if (strcmp(filename, "/dev/null") == 0) - return EX_OK; - - /* check for 8-bit available */ - if (bitset(EF_HAS8BIT, e->e_flags) && - bitnset(M_7BITS, mailer->m_flags) && - (bitset(EF_DONT_MIME, e->e_flags) || - !(bitset(MM_MIME8BIT, MimeMode) || - (bitset(EF_IS_MIME, e->e_flags) && - bitset(MM_CVTMIME, MimeMode))))) - { - usrerr("554 Cannot send 8-bit data to 7-bit destination"); - e->e_status = "5.6.3"; - return(EX_DATAERR); - } - - /* - ** Fork so we can change permissions here. - ** Note that we MUST use fork, not vfork, because of - ** the complications of calling subroutines, etc. - */ - - DOFORK(fork); - - if (pid < 0) - return (EX_OSERR); - else if (pid == 0) - { - /* child -- actually write to file */ - struct stat stb; - MCI mcibuf; - int err; - volatile int oflags = O_WRONLY|O_APPEND; - - if (e->e_lockfp != NULL) - (void) close(fileno(e->e_lockfp)); - - (void) setsignal(SIGINT, SIG_DFL); - (void) setsignal(SIGHUP, SIG_DFL); - (void) setsignal(SIGTERM, SIG_DFL); - (void) umask(OldUmask); - e->e_to = filename; - ExitStat = EX_OK; - - if (setjmp(CtxMailfileTimeout) != 0) - { - exit(EX_TEMPFAIL); - } - - if (TimeOuts.to_fileopen > 0) - ev = setevent(TimeOuts.to_fileopen, mailfiletimeout, 0); - else - ev = NULL; - -#ifdef HASLSTAT - if (bitset(DBS_FILEDELIVERYTOSYMLINK, DontBlameSendmail)) - err = stat(filename, &stb); - else - err = lstat(filename, &stb); - if (err < 0) -#else - if (stat(filename, &stb) < 0) -#endif - { - stb.st_mode = ST_MODE_NOFILE; - mode = FileMode; - oflags |= O_CREAT|O_EXCL; - } - else if (bitset(S_IXUSR|S_IXGRP|S_IXOTH, stb.st_mode) || - (!bitset(DBS_FILEDELIVERYTOHARDLINK, DontBlameSendmail) && - stb.st_nlink != 1) || - (SafeFileEnv != NULL && !S_ISREG(stb.st_mode))) - exit(EX_CANTCREAT); - if (mode == ST_MODE_NOFILE) - mode = stb.st_mode; - - /* limit the errors to those actually caused in the child */ - errno = 0; - ExitStat = EX_OK; - - if (ctladdr != NULL || bitset(SFF_RUNASREALUID, sfflags)) - { - /* ignore setuid and setgid bits */ - mode &= ~(S_ISGID|S_ISUID); - } - - /* we have to open the dfile BEFORE setuid */ - if (e->e_dfp == NULL && bitset(EF_HAS_DF, e->e_flags)) - { - char *df = queuename(e, 'd'); - - e->e_dfp = fopen(df, "r"); - if (e->e_dfp == NULL) - { - syserr("mailfile: Cannot open %s for %s from %s", - df, e->e_to, e->e_from.q_paddr); - } - } - - /* select a new user to run as */ - if (!bitset(SFF_RUNASREALUID, sfflags)) - { - if (bitnset(M_SPECIFIC_UID, mailer->m_flags)) - { - RealUserName = NULL; - RealUid = mailer->m_uid; - } - else if (bitset(S_ISUID, mode)) - { - RealUserName = NULL; - RealUid = stb.st_uid; - } - else if (ctladdr != NULL && ctladdr->q_uid != 0) - { - if (ctladdr->q_ruser != NULL) - RealUserName = ctladdr->q_ruser; - else - RealUserName = ctladdr->q_user; - RealUid = ctladdr->q_uid; - } - else if (mailer != NULL && mailer->m_uid != 0) - { - RealUserName = DefUser; - RealUid = mailer->m_uid; - } - else - { - RealUserName = DefUser; - RealUid = DefUid; - } - - /* select a new group to run as */ - if (bitnset(M_SPECIFIC_UID, mailer->m_flags)) - RealGid = mailer->m_gid; - else if (bitset(S_ISGID, mode)) - RealGid = stb.st_gid; - else if (ctladdr != NULL && ctladdr->q_uid != 0) - RealGid = ctladdr->q_gid; - else if (mailer != NULL && mailer->m_gid != 0) - RealGid = mailer->m_gid; - else - RealGid = DefGid; - } - - /* last ditch */ - if (!bitset(SFF_ROOTOK, sfflags)) - { - if (RealUid == 0) - RealUid = DefUid; - if (RealGid == 0) - RealGid = DefGid; - } - - /* set group id list (needs /etc/group access) */ - if (RealUserName != NULL && !DontInitGroups) - { - if (initgroups(RealUserName, RealGid) == -1 && suidwarn) - syserr("mailfile: initgroups(%s, %d) failed", - RealUserName, RealGid); - } - else - { - GIDSET_T gidset[1]; - - gidset[0] = RealGid; - if (setgroups(1, gidset) == -1 && suidwarn) - syserr("mailfile: setgroups() failed"); - } - - /* if you have a safe environment, go into it */ - if (SafeFileEnv != NULL && SafeFileEnv[0] != '\0') - { - int i; - - if (chroot(SafeFileEnv) < 0) - { - syserr("mailfile: Cannot chroot(%s)", - SafeFileEnv); - exit(EX_CANTCREAT); - } - i = strlen(SafeFileEnv); - if (strncmp(SafeFileEnv, filename, i) == 0) - filename += i; - } - if (chdir("/") < 0) - syserr("mailfile: cannot chdir(/)"); - - /* now reset the group and user ids */ - endpwent(); - if (setgid(RealGid) < 0 && suidwarn) - syserr("mailfile: setgid(%ld) failed", (long) RealGid); - vendor_set_uid(RealUid); - if (setuid(RealUid) < 0 && suidwarn) - syserr("mailfile: setuid(%ld) failed", (long) RealUid); - - /* move into some "safe" directory */ - if (mailer->m_execdir != NULL) - { - char *q; - char buf[MAXLINE + 1]; - - for (p = mailer->m_execdir; p != NULL; p = q) - { - q = strchr(p, ':'); - if (q != NULL) - *q = '\0'; - expand(p, buf, sizeof buf, e); - if (q != NULL) - *q++ = ':'; - if (tTd(11, 20)) - printf("mailfile: trydir %s\n", - buf); - if (buf[0] != '\0' && chdir(buf) >= 0) - break; - } - } - - sfflags |= SFF_NOPATHCHECK; - if (!bitset(DBS_FILEDELIVERYTOSYMLINK, DontBlameSendmail)) - sfflags |= SFF_NOSLINK; - if (!bitset(DBS_FILEDELIVERYTOHARDLINK, DontBlameSendmail)) - sfflags |= SFF_NOHLINK; - sfflags &= ~SFF_OPENASROOT; - f = safefopen(filename, oflags, FileMode, sfflags); - if (f == NULL) - { - message("554 cannot open %s: %s", - shortenstring(filename, MAXSHORTSTR), - errstring(errno)); - exit(EX_CANTCREAT); - } - if (filechanged(filename, fileno(f), &stb)) - { - message("554 file changed after open"); - exit(EX_CANTCREAT); - } - if (fstat(fileno(f), &stb) < 0) - { - message("554 cannot fstat %s", errstring(errno)); - exit(EX_CANTCREAT); - } - - if (ev != NULL) - clrevent(ev); - - bzero(&mcibuf, sizeof mcibuf); - mcibuf.mci_mailer = mailer; - mcibuf.mci_out = f; - mcibuf.mci_contentlen = 0; - if (bitnset(M_7BITS, mailer->m_flags)) - mcibuf.mci_flags |= MCIF_7BIT; - - /* clear out per-message flags from connection structure */ - mcibuf.mci_flags &= ~(MCIF_CVT7TO8|MCIF_CVT8TO7); - - if (bitset(EF_HAS8BIT, e->e_flags) && - !bitset(EF_DONT_MIME, e->e_flags) && - bitnset(M_7BITS, mailer->m_flags)) - mcibuf.mci_flags |= MCIF_CVT8TO7; - -#if MIME7TO8 - if (bitnset(M_MAKE8BIT, mailer->m_flags) && - !bitset(MCIF_7BIT, mcibuf.mci_flags) && - (p = hvalue("Content-Transfer-Encoding", e->e_header)) != NULL && - (strcasecmp(p, "quoted-printable") == 0 || - strcasecmp(p, "base64") == 0) && - (p = hvalue("Content-Type", e->e_header)) != NULL) - { - /* may want to convert 7 -> 8 */ - /* XXX should really parse it here -- and use a class XXX */ - if (strncasecmp(p, "text/plain", 10) == 0 && - (p[10] == '\0' || p[10] == ' ' || p[10] == ';')) - mcibuf.mci_flags |= MCIF_CVT7TO8; - } -#endif - - putfromline(&mcibuf, e); - (*e->e_puthdr)(&mcibuf, e->e_header, e, M87F_OUTER); - (*e->e_putbody)(&mcibuf, e, NULL); - putline("\n", &mcibuf); - if (fflush(f) < 0 || ferror(f)) - { - message("451 I/O error: %s", errstring(errno)); - setstat(EX_IOERR); - } - - /* reset ISUID & ISGID bits for paranoid systems */ -#if HASFCHMOD - (void) fchmod(fileno(f), (MODE_T) stb.st_mode); -#else - (void) chmod(filename, (MODE_T) stb.st_mode); -#endif - (void) xfclose(f, "mailfile", filename); - (void) fflush(stdout); - setuid(RealUid); - exit(ExitStat); - /*NOTREACHED*/ - } - else - { - /* parent -- wait for exit status */ - int st; - - st = waitfor(pid); - if (st == -1) - { - syserr("mailfile: %s: wait", mailer->m_name); - return (EX_SOFTWARE); - } - if (WIFEXITED(st)) - return (WEXITSTATUS(st)); - else - { - syserr("mailfile: %s: child died on signal %d", - mailer->m_name, st); - return (EX_UNAVAILABLE); - } - /*NOTREACHED*/ - } - return EX_UNAVAILABLE; /* avoid compiler warning on IRIX */ -} - -static void -mailfiletimeout() -{ - longjmp(CtxMailfileTimeout, 1); -} -/* -** HOSTSIGNATURE -- return the "signature" for a host. -** -** The signature describes how we are going to send this -- it -** can be just the hostname (for non-Internet hosts) or can be -** an ordered list of MX hosts. -** -** Parameters: -** m -- the mailer describing this host. -** host -- the host name. -** e -- the current envelope. -** -** Returns: -** The signature for this host. -** -** Side Effects: -** Can tweak the symbol table. -*/ - -char * -hostsignature(m, host, e) - register MAILER *m; - char *host; - ENVELOPE *e; -{ - register char *p; - register STAB *s; - int i; - int len; -#if NAMED_BIND - int nmx; - char *hp; - char *endp; - int oldoptions = _res.options; - char *mxhosts[MAXMXHOSTS + 1]; -#endif - - /* - ** Check to see if this uses IPC -- if not, it can't have MX records. - */ - - p = m->m_mailer; - if (strcmp(p, "[IPC]") != 0 && strcmp(p, "[TCP]") != 0) - { - /* just an ordinary mailer */ - return host; - } - - /* - ** Look it up in the symbol table. - */ - - s = stab(host, ST_HOSTSIG, ST_ENTER); - if (s->s_hostsig != NULL) - return s->s_hostsig; - - /* - ** Not already there -- create a signature. - */ - -#if NAMED_BIND - if (ConfigLevel < 2) - _res.options &= ~(RES_DEFNAMES | RES_DNSRCH); /* XXX */ - - for (hp = host; hp != NULL; hp = endp) - { - endp = strchr(hp, ':'); - if (endp != NULL) - *endp = '\0'; - - if (bitnset(M_NOMX, m->m_flags)) - { - /* skip MX lookups */ - nmx = 1; - mxhosts[0] = hp; - } - else - { - auto int rcode; - - nmx = getmxrr(hp, mxhosts, TRUE, &rcode); - if (nmx <= 0) - { - register MCI *mci; - - /* update the connection info for this host */ - mci = mci_get(hp, m); - mci->mci_errno = errno; - mci->mci_herrno = h_errno; - mci->mci_lastuse = curtime(); - mci_setstat(mci, rcode, NULL, NULL); - - /* use the original host name as signature */ - nmx = 1; - mxhosts[0] = hp; - } - } - - len = 0; - for (i = 0; i < nmx; i++) - { - len += strlen(mxhosts[i]) + 1; - } - if (s->s_hostsig != NULL) - len += strlen(s->s_hostsig) + 1; - p = xalloc(len); - if (s->s_hostsig != NULL) - { - (void) strcpy(p, s->s_hostsig); - free(s->s_hostsig); - s->s_hostsig = p; - p += strlen(p); - *p++ = ':'; - } - else - s->s_hostsig = p; - for (i = 0; i < nmx; i++) - { - if (i != 0) - *p++ = ':'; - strcpy(p, mxhosts[i]); - p += strlen(p); - } - if (endp != NULL) - *endp++ = ':'; - } - makelower(s->s_hostsig); - if (ConfigLevel < 2) - _res.options = oldoptions; -#else - /* not using BIND -- the signature is just the host name */ - s->s_hostsig = host; -#endif - if (tTd(17, 1)) - printf("hostsignature(%s) = %s\n", host, s->s_hostsig); - return s->s_hostsig; -} diff --git a/src/domain.c b/src/domain.c deleted file mode 100644 index ec79be8..0000000 --- a/src/domain.c +++ /dev/null @@ -1,912 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1986, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#include "sendmail.h" - -#ifndef lint -#if NAMED_BIND -static char sccsid[] = "@(#)domain.c 8.81 (Berkeley) 1/21/1999 (with name server)"; -#else -static char sccsid[] = "@(#)domain.c 8.81 (Berkeley) 1/21/1999 (without name server)"; -#endif -#endif /* not lint */ - -#if NAMED_BIND - -#include <errno.h> -#include <resolv.h> -#include <arpa/inet.h> - -/* -** The standard udp packet size PACKETSZ (512) is not sufficient for some -** nameserver answers containing very many resource records. The resolver -** may switch to tcp and retry if it detects udp packet overflow. -** Also note that the resolver routines res_query and res_search return -** the size of the *un*truncated answer in case the supplied answer buffer -** it not big enough to accommodate the entire answer. -*/ - -#ifndef MAXPACKET -# define MAXPACKET 8192 /* max packet size used internally by BIND */ -#endif - -typedef union -{ - HEADER qb1; - u_char qb2[MAXPACKET]; -} querybuf; - -#ifndef MXHOSTBUFSIZE -# define MXHOSTBUFSIZE (128 * MAXMXHOSTS) -#endif - -static char MXHostBuf[MXHOSTBUFSIZE]; - -#ifndef MAXDNSRCH -# define MAXDNSRCH 6 /* number of possible domains to search */ -#endif - -#ifndef MAX -# define MAX(a, b) ((a) > (b) ? (a) : (b)) -#endif - -#ifndef NO_DATA -# define NO_DATA NO_ADDRESS -#endif - -#ifndef HFIXEDSZ -# define HFIXEDSZ 12 /* sizeof(HEADER) */ -#endif - -#define MAXCNAMEDEPTH 10 /* maximum depth of CNAME recursion */ - -#if defined(__RES) && (__RES >= 19940415) -# define RES_UNC_T char * -#else -# define RES_UNC_T u_char * -#endif -/* -** GETMXRR -- get MX resource records for a domain -** -** Parameters: -** host -- the name of the host to MX. -** mxhosts -- a pointer to a return buffer of MX records. -** droplocalhost -- If TRUE, all MX records less preferred -** than the local host (as determined by $=w) will -** be discarded. -** rcode -- a pointer to an EX_ status code. -** -** Returns: -** The number of MX records found. -** -1 if there is an internal failure. -** If no MX records are found, mxhosts[0] is set to host -** and 1 is returned. -*/ - -int -getmxrr(host, mxhosts, droplocalhost, rcode) - char *host; - char **mxhosts; - bool droplocalhost; - int *rcode; -{ - register u_char *eom, *cp; - register int i, j, n; - int nmx = 0; - register char *bp; - HEADER *hp; - querybuf answer; - int ancount, qdcount, buflen; - bool seenlocal = FALSE; - u_short pref, type; - u_short localpref = 256; - char *fallbackMX = FallBackMX; - bool trycanon = FALSE; - int (*resfunc)(); - extern int res_query(), res_search(); - u_short prefer[MAXMXHOSTS]; - int weight[MAXMXHOSTS]; - extern int mxrand __P((char *)); - - if (tTd(8, 2)) - printf("getmxrr(%s, droplocalhost=%d)\n", host, droplocalhost); - - if (fallbackMX != NULL && droplocalhost && - wordinclass(fallbackMX, 'w')) - { - /* don't use fallback for this pass */ - fallbackMX = NULL; - } - - *rcode = EX_OK; - - /* efficiency hack -- numeric or non-MX lookups */ - if (host[0] == '[') - goto punt; - - /* - ** If we don't have MX records in our host switch, don't - ** try for MX records. Note that this really isn't "right", - ** since we might be set up to try NIS first and then DNS; - ** if the host is found in NIS we really shouldn't be doing - ** MX lookups. However, that should be a degenerate case. - */ - - if (!UseNameServer) - goto punt; - if (HasWildcardMX && ConfigLevel >= 6) - resfunc = res_query; - else - resfunc = res_search; - - errno = 0; - n = (*resfunc)(host, C_IN, T_MX, (u_char *) &answer, sizeof(answer)); - if (n < 0) - { - if (tTd(8, 1)) - printf("getmxrr: res_search(%s) failed (errno=%d, h_errno=%d)\n", - (host == NULL) ? "<NULL>" : host, errno, h_errno); - switch (h_errno) - { - case NO_DATA: - trycanon = TRUE; - /* fall through */ - - case NO_RECOVERY: - /* no MX data on this host */ - goto punt; - - case HOST_NOT_FOUND: -#if BROKEN_RES_SEARCH - case 0: /* Ultrix resolver retns failure w/ h_errno=0 */ -#endif - /* host doesn't exist in DNS; might be in /etc/hosts */ - trycanon = TRUE; - *rcode = EX_NOHOST; - goto punt; - - case TRY_AGAIN: - case -1: - /* couldn't connect to the name server */ - if (fallbackMX != NULL) - { - /* name server is hosed -- push to fallback */ - mxhosts[nmx++] = fallbackMX; - return nmx; - } - /* it might come up later; better queue it up */ - *rcode = EX_TEMPFAIL; - break; - - default: - syserr("getmxrr: res_search (%s) failed with impossible h_errno (%d)\n", - host, h_errno); - *rcode = EX_OSERR; - break; - } - - /* irreconcilable differences */ - return (-1); - } - - /* avoid problems after truncation in tcp packets */ - if (n > sizeof(answer)) - n = sizeof(answer); - - /* find first satisfactory answer */ - hp = (HEADER *)&answer; - cp = (u_char *)&answer + HFIXEDSZ; - eom = (u_char *)&answer + n; - for (qdcount = ntohs(hp->qdcount); qdcount--; cp += n + QFIXEDSZ) - if ((n = dn_skipname(cp, eom)) < 0) - goto punt; - buflen = sizeof(MXHostBuf) - 1; - bp = MXHostBuf; - ancount = ntohs(hp->ancount); - while (--ancount >= 0 && cp < eom && nmx < MAXMXHOSTS - 1) - { - if ((n = dn_expand((u_char *)&answer, - eom, cp, (RES_UNC_T) bp, buflen)) < 0) - break; - cp += n; - GETSHORT(type, cp); - cp += INT16SZ + INT32SZ; - GETSHORT(n, cp); - if (type != T_MX) - { - if (tTd(8, 8) || _res.options & RES_DEBUG) - printf("unexpected answer type %d, size %d\n", - type, n); - cp += n; - continue; - } - GETSHORT(pref, cp); - if ((n = dn_expand((u_char *)&answer, eom, cp, - (RES_UNC_T) bp, buflen)) < 0) - break; - cp += n; - if (wordinclass(bp, 'w')) - { - if (tTd(8, 3)) - printf("found localhost (%s) in MX list, pref=%d\n", - bp, pref); - if (droplocalhost) - { - if (!seenlocal || pref < localpref) - localpref = pref; - seenlocal = TRUE; - continue; - } - weight[nmx] = 0; - } - else - weight[nmx] = mxrand(bp); - prefer[nmx] = pref; - mxhosts[nmx++] = bp; - n = strlen(bp); - bp += n; - if (bp[-1] != '.') - { - *bp++ = '.'; - n++; - } - *bp++ = '\0'; - buflen -= n + 1; - } - - /* sort the records */ - for (i = 0; i < nmx; i++) - { - for (j = i + 1; j < nmx; j++) - { - if (prefer[i] > prefer[j] || - (prefer[i] == prefer[j] && weight[i] > weight[j])) - { - register int temp; - register char *temp1; - - temp = prefer[i]; - prefer[i] = prefer[j]; - prefer[j] = temp; - temp1 = mxhosts[i]; - mxhosts[i] = mxhosts[j]; - mxhosts[j] = temp1; - temp = weight[i]; - weight[i] = weight[j]; - weight[j] = temp; - } - } - if (seenlocal && prefer[i] >= localpref) - { - /* truncate higher preference part of list */ - nmx = i; - } - } - - /* delete duplicates from list (yes, some bozos have duplicates) */ - for (i = 0; i < nmx - 1; ) - { - if (strcasecmp(mxhosts[i], mxhosts[i + 1]) != 0) - i++; - else - { - /* compress out duplicate */ - for (j = i + 1; j < nmx; j++) - mxhosts[j] = mxhosts[j + 1]; - nmx--; - } - } - - if (nmx == 0) - { -punt: - if (seenlocal && - (!TryNullMXList || sm_gethostbyname(host) == NULL)) - { - /* - ** If we have deleted all MX entries, this is - ** an error -- we should NEVER send to a host that - ** has an MX, and this should have been caught - ** earlier in the config file. - ** - ** Some sites prefer to go ahead and try the - ** A record anyway; that case is handled by - ** setting TryNullMXList. I believe this is a - ** bad idea, but it's up to you.... - */ - - *rcode = EX_CONFIG; - syserr("MX list for %s points back to %s", - host, MyHostName); - return -1; - } - if (strlen(host) >= (SIZE_T) sizeof MXHostBuf) - { - *rcode = EX_CONFIG; - syserr("Host name %s too long", - shortenstring(host, MAXSHORTSTR)); - return -1; - } - snprintf(MXHostBuf, sizeof MXHostBuf, "%s", host); - mxhosts[0] = MXHostBuf; - if (host[0] == '[') - { - register char *p; - - /* this may be an MX suppression-style address */ - p = strchr(MXHostBuf, ']'); - if (p != NULL) - { - *p = '\0'; - if (inet_addr(&MXHostBuf[1]) != INADDR_NONE) - { - nmx++; - *p = ']'; - } - else - { - trycanon = TRUE; - mxhosts[0]++; - } - } - } - if (trycanon && - getcanonname(mxhosts[0], sizeof MXHostBuf - 2, FALSE)) - { - bp = &MXHostBuf[strlen(MXHostBuf)]; - if (bp[-1] != '.') - { - *bp++ = '.'; - *bp = '\0'; - } - nmx = 1; - } - } - - /* if we have a default lowest preference, include that */ - if (fallbackMX != NULL && !seenlocal) - mxhosts[nmx++] = fallbackMX; - - return (nmx); -} -/* -** MXRAND -- create a randomizer for equal MX preferences -** -** If two MX hosts have equal preferences we want to randomize -** the selection. But in order for signatures to be the same, -** we need to randomize the same way each time. This function -** computes a pseudo-random hash function from the host name. -** -** Parameters: -** host -- the name of the host. -** -** Returns: -** A random but repeatable value based on the host name. -** -** Side Effects: -** none. -*/ - -int -mxrand(host) - register char *host; -{ - int hfunc; - static unsigned int seed; - - if (seed == 0) - { - seed = (int) curtime() & 0xffff; - if (seed == 0) - seed++; - } - - if (tTd(17, 9)) - printf("mxrand(%s)", host); - - hfunc = seed; - while (*host != '\0') - { - int c = *host++; - - if (isascii(c) && isupper(c)) - c = tolower(c); - hfunc = ((hfunc << 1) ^ c) % 2003; - } - - hfunc &= 0xff; - hfunc++; - - if (tTd(17, 9)) - printf(" = %d\n", hfunc); - return hfunc; -} -/* -** BESTMX -- find the best MX for a name -** -** This is really a hack, but I don't see any obvious way -** to generalize it at the moment. -*/ - -/* ARGSUSED3 */ -char * -bestmx_map_lookup(map, name, av, statp) - MAP *map; - char *name; - char **av; - int *statp; -{ - int nmx; - int saveopts = _res.options; - int i, len = 0; - char *p; - char *mxhosts[MAXMXHOSTS + 1]; - char buf[PSBUFSIZE / 2]; - - _res.options &= ~(RES_DNSRCH|RES_DEFNAMES); - nmx = getmxrr(name, mxhosts, FALSE, statp); - _res.options = saveopts; - if (nmx <= 0) - return NULL; - if (bitset(MF_MATCHONLY, map->map_mflags)) - return map_rewrite(map, name, strlen(name), NULL); - if ((map->map_coldelim == '\0') || (nmx == 1)) - return map_rewrite(map, mxhosts[0], strlen(mxhosts[0]), av); - - /* - ** We were given a -z flag (return all MXs) and there are multiple - ** ones. We need to build them all into a list. - */ - p = buf; - for (i = 0; i < nmx; i++) - { - int slen; - - if (strchr(mxhosts[i], map->map_coldelim) != NULL) - { - syserr("bestmx_map_lookup: MX host %.64s includes map delimiter character 0x%02X", - mxhosts[i], map->map_coldelim); - return NULL; - } - slen = strlen(mxhosts[i]); - if (len + slen + 2 > sizeof buf) - break; - if (i > 0) - { - *p++ = map->map_coldelim; - len++; - } - strcpy(p, mxhosts[i]); - p += slen; - len += slen; - } - return map_rewrite(map, buf, len, av); -} -/* -** DNS_GETCANONNAME -- get the canonical name for named host using DNS -** -** This algorithm tries to be smart about wildcard MX records. -** This is hard to do because DNS doesn't tell is if we matched -** against a wildcard or a specific MX. -** -** We always prefer A & CNAME records, since these are presumed -** to be specific. -** -** If we match an MX in one pass and lose it in the next, we use -** the old one. For example, consider an MX matching *.FOO.BAR.COM. -** A hostname bletch.foo.bar.com will match against this MX, but -** will stop matching when we try bletch.bar.com -- so we know -** that bletch.foo.bar.com must have been right. This fails if -** there was also an MX record matching *.BAR.COM, but there are -** some things that just can't be fixed. -** -** Parameters: -** host -- a buffer containing the name of the host. -** This is a value-result parameter. -** hbsize -- the size of the host buffer. -** trymx -- if set, try MX records as well as A and CNAME. -** statp -- pointer to place to store status. -** -** Returns: -** TRUE -- if the host matched. -** FALSE -- otherwise. -*/ - -bool -dns_getcanonname(host, hbsize, trymx, statp) - char *host; - int hbsize; - bool trymx; - int *statp; -{ - register u_char *eom, *ap; - register char *cp; - register int n; - HEADER *hp; - querybuf answer; - int ancount, qdcount; - int ret; - char **domain; - int type; - char **dp; - char *mxmatch; - bool amatch; - bool gotmx = FALSE; - int qtype; - int loopcnt; - char *xp; - char nbuf[MAX(MAXPACKET, MAXDNAME*2+2)]; - char *searchlist[MAXDNSRCH+2]; - extern char *gethostalias __P((char *)); - - if (tTd(8, 2)) - printf("dns_getcanonname(%s, trymx=%d)\n", host, trymx); - - if ((_res.options & RES_INIT) == 0 && res_init() == -1) - { - *statp = EX_UNAVAILABLE; - return FALSE; - } - - /* - ** Initialize domain search list. If there is at least one - ** dot in the name, search the unmodified name first so we - ** find "vse.CS" in Czechoslovakia instead of in the local - ** domain (e.g., vse.CS.Berkeley.EDU). - ** - ** Older versions of the resolver could create this - ** list by tearing apart the host name. - */ - - loopcnt = 0; -cnameloop: - /* Check for dots in the name */ - for (cp = host, n = 0; *cp != '\0'; cp++) - if (*cp == '.') - n++; - - /* - ** If this is a simple name, determine whether it matches an - ** alias in the file defined by the environment variable HOSTALIASES. - */ - if (n == 0 && (xp = gethostalias(host)) != NULL) - { - if (loopcnt++ > MAXCNAMEDEPTH) - { - syserr("loop in ${HOSTALIASES} file"); - } - else - { - strncpy(host, xp, hbsize); - host[hbsize - 1] = '\0'; - goto cnameloop; - } - } - - /* - ** Build the search list. - ** If there is at least one dot in name, start with a null - ** domain to search the unmodified name first. - ** If name does not end with a dot and search up local domain - ** tree desired, append each local domain component to the - ** search list; if name contains no dots and default domain - ** name is desired, append default domain name to search list; - ** else if name ends in a dot, remove that dot. - */ - - dp = searchlist; - if (n > 0) - *dp++ = ""; - if (n >= 0 && *--cp != '.' && bitset(RES_DNSRCH, _res.options)) - { - for (domain = _res.dnsrch; *domain != NULL; ) - *dp++ = *domain++; - } - else if (n == 0 && bitset(RES_DEFNAMES, _res.options)) - { - *dp++ = _res.defdname; - } - else if (*cp == '.') - { - *cp = '\0'; - } - *dp = NULL; - - /* - ** Now loop through the search list, appending each domain in turn - ** name and searching for a match. - */ - - mxmatch = NULL; - qtype = T_ANY; - - for (dp = searchlist; *dp != NULL; ) - { - if (qtype == T_ANY) - gotmx = FALSE; - if (tTd(8, 5)) - printf("dns_getcanonname: trying %s.%s (%s)\n", - host, *dp, - qtype == T_ANY ? "ANY" : qtype == T_A ? "A" : - qtype == T_MX ? "MX" : "???"); - ret = res_querydomain(host, *dp, C_IN, qtype, - answer.qb2, sizeof(answer.qb2)); - if (ret <= 0) - { - if (tTd(8, 7)) - printf("\tNO: errno=%d, h_errno=%d\n", - errno, h_errno); - - if (errno == ECONNREFUSED || h_errno == TRY_AGAIN) - { - /* the name server seems to be down */ - h_errno = TRY_AGAIN; - *statp = EX_TEMPFAIL; - return FALSE; - } - - if (h_errno != HOST_NOT_FOUND) - { - /* might have another type of interest */ - if (qtype == T_ANY) - { - qtype = T_A; - continue; - } - else if (qtype == T_A && !gotmx && (trymx || **dp == '\0')) - { - qtype = T_MX; - continue; - } - } - - /* definite no -- try the next domain */ - dp++; - qtype = T_ANY; - continue; - } - else if (tTd(8, 7)) - printf("\tYES\n"); - - /* avoid problems after truncation in tcp packets */ - if (ret > sizeof(answer)) - ret = sizeof(answer); - - /* - ** Appear to have a match. Confirm it by searching for A or - ** CNAME records. If we don't have a local domain - ** wild card MX record, we will accept MX as well. - */ - - hp = (HEADER *) &answer; - ap = (u_char *) &answer + HFIXEDSZ; - eom = (u_char *) &answer + ret; - - /* skip question part of response -- we know what we asked */ - for (qdcount = ntohs(hp->qdcount); qdcount--; ap += ret + QFIXEDSZ) - { - if ((ret = dn_skipname(ap, eom)) < 0) - { - if (tTd(8, 20)) - printf("qdcount failure (%d)\n", - ntohs(hp->qdcount)); - *statp = EX_SOFTWARE; - return FALSE; /* ???XXX??? */ - } - } - - amatch = FALSE; - for (ancount = ntohs(hp->ancount); --ancount >= 0 && ap < eom; - ap += n) - { - n = dn_expand((u_char *) &answer, eom, ap, - (RES_UNC_T) nbuf, sizeof nbuf); - if (n < 0) - break; - ap += n; - GETSHORT(type, ap); - ap += INT16SZ + INT32SZ; - GETSHORT(n, ap); - switch (type) - { - case T_MX: - gotmx = TRUE; - if (**dp != '\0' && HasWildcardMX) - { - /* - ** If we are using MX matches and have - ** not yet gotten one, save this one - ** but keep searching for an A or - ** CNAME match. - */ - - if (trymx && mxmatch == NULL) - mxmatch = *dp; - continue; - } - - /* - ** If we did not append a domain name, this - ** must have been a canonical name to start - ** with. Even if we did append a domain name, - ** in the absence of a wildcard MX this must - ** still be a real MX match. - ** Such MX matches are as good as an A match, - ** fall through. - */ - - case T_A: - /* Flag that a good match was found */ - amatch = TRUE; - - /* continue in case a CNAME also exists */ - continue; - - case T_CNAME: - if (DontExpandCnames) - { - /* got CNAME -- guaranteed canonical */ - amatch = TRUE; - break; - } - - if (loopcnt++ > MAXCNAMEDEPTH) - { - /*XXX should notify postmaster XXX*/ - message("DNS failure: CNAME loop for %s", - host); - if (CurEnv->e_message == NULL) - { - char ebuf[MAXLINE]; - - snprintf(ebuf, sizeof ebuf, - "Deferred: DNS failure: CNAME loop for %.100s", - host); - CurEnv->e_message = newstr(ebuf); - } - h_errno = NO_RECOVERY; - *statp = EX_CONFIG; - return FALSE; - } - - /* value points at name */ - if ((ret = dn_expand((u_char *)&answer, - eom, ap, (RES_UNC_T) nbuf, sizeof(nbuf))) < 0) - break; - (void)strncpy(host, nbuf, hbsize); /* XXX */ - host[hbsize - 1] = '\0'; - - /* - ** RFC 1034 section 3.6 specifies that CNAME - ** should point at the canonical name -- but - ** urges software to try again anyway. - */ - - goto cnameloop; - - default: - /* not a record of interest */ - continue; - } - } - - if (amatch) - { - /* - ** Got a good match -- either an A, CNAME, or an - ** exact MX record. Save it and get out of here. - */ - - mxmatch = *dp; - break; - } - - /* - ** Nothing definitive yet. - ** If this was a T_ANY query, we don't really know what - ** was returned -- it might have been a T_NS, - ** for example. Try T_A to be more specific - ** during the next pass. - ** If this was a T_A query and we haven't yet found a MX - ** match, try T_MX if allowed to do so. - ** Otherwise, try the next domain. - */ - - if (qtype == T_ANY) - qtype = T_A; - else if (qtype == T_A && !gotmx && (trymx || **dp == '\0')) - qtype = T_MX; - else - { - qtype = T_ANY; - dp++; - } - } - - /* if nothing was found, we are done */ - if (mxmatch == NULL) - { - *statp = EX_NOHOST; - return FALSE; - } - - /* - ** Create canonical name and return. - ** If saved domain name is null, name was already canonical. - ** Otherwise append the saved domain name. - */ - - (void) snprintf(nbuf, sizeof nbuf, "%.*s%s%.*s", MAXDNAME, host, - *mxmatch == '\0' ? "" : ".", - MAXDNAME, mxmatch); - strncpy(host, nbuf, hbsize); - host[hbsize - 1] = '\0'; - if (tTd(8, 5)) - printf("dns_getcanonname: %s\n", host); - *statp = EX_OK; - return TRUE; -} - - - -char * -gethostalias(host) - char *host; -{ - char *fname; - FILE *fp; - register char *p = NULL; - int sff = SFF_REGONLY; - char buf[MAXLINE]; - static char hbuf[MAXDNAME]; - - if (DontLockReadFiles) - sff |= SFF_NOLOCK; - fname = getenv("HOSTALIASES"); - if (fname == NULL || - (fp = safefopen(fname, O_RDONLY, 0, sff)) == NULL) - return NULL; - while (fgets(buf, sizeof buf, fp) != NULL) - { - for (p = buf; p != '\0' && !(isascii(*p) && isspace(*p)); p++) - continue; - if (*p == 0) - { - /* syntax error */ - continue; - } - *p++ = '\0'; - if (strcasecmp(buf, host) == 0) - break; - } - - if (feof(fp)) - { - /* no match */ - fclose(fp); - return NULL; - } - fclose(fp); - - /* got a match; extract the equivalent name */ - while (*p != '\0' && isascii(*p) && isspace(*p)) - p++; - host = p; - while (*p != '\0' && !(isascii(*p) && isspace(*p))) - p++; - *p = '\0'; - strncpy(hbuf, host, sizeof hbuf - 1); - hbuf[sizeof hbuf - 1] = '\0'; - return hbuf; -} - -#endif /* NAMED_BIND */ diff --git a/src/envelope.c b/src/envelope.c deleted file mode 100644 index 2cc90d6..0000000 --- a/src/envelope.c +++ /dev/null @@ -1,938 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)envelope.c 8.122 (Berkeley) 1/25/1999"; -#endif /* not lint */ - -#include "sendmail.h" - -/* -** NEWENVELOPE -- allocate a new envelope -** -** Supports inheritance. -** -** Parameters: -** e -- the new envelope to fill in. -** parent -- the envelope to be the parent of e. -** -** Returns: -** e. -** -** Side Effects: -** none. -*/ - -ENVELOPE * -newenvelope(e, parent) - register ENVELOPE *e; - register ENVELOPE *parent; -{ - if (e == parent && e->e_parent != NULL) - parent = e->e_parent; - clearenvelope(e, TRUE); - if (e == CurEnv) - bcopy((char *) &NullAddress, (char *) &e->e_from, sizeof e->e_from); - else - bcopy((char *) &CurEnv->e_from, (char *) &e->e_from, sizeof e->e_from); - e->e_parent = parent; - e->e_ctime = curtime(); - if (parent != NULL) - e->e_msgpriority = parent->e_msgsize; - e->e_puthdr = putheader; - e->e_putbody = putbody; - if (CurEnv->e_xfp != NULL) - (void) fflush(CurEnv->e_xfp); - - return (e); -} -/* -** DROPENVELOPE -- deallocate an envelope. -** -** Parameters: -** e -- the envelope to deallocate. -** fulldrop -- if set, do return receipts. -** -** Returns: -** none. -** -** Side Effects: -** housekeeping necessary to dispose of an envelope. -** Unlocks this queue file. -*/ - -void -dropenvelope(e, fulldrop) - register ENVELOPE *e; - bool fulldrop; -{ - bool queueit = FALSE; - bool message_timeout = FALSE; - bool failure_return = FALSE; - bool delay_return = FALSE; - bool success_return = FALSE; - register ADDRESS *q; - char *id = e->e_id; - char buf[MAXLINE]; - - if (tTd(50, 1)) - { - extern void printenvflags __P((ENVELOPE *)); - - printf("dropenvelope %lx: id=", (u_long) e); - xputs(e->e_id); - printf(", flags="); - printenvflags(e); - if (tTd(50, 10)) - { - printf("sendq="); - printaddr(e->e_sendqueue, TRUE); - } - } - - if (LogLevel > 84) - sm_syslog(LOG_DEBUG, id, - "dropenvelope, e_flags=0x%x, OpMode=%c, pid=%d", - e->e_flags, OpMode, getpid()); - - /* we must have an id to remove disk files */ - if (id == NULL) - return; - - /* if verify-only mode, we can skip most of this */ - if (OpMode == MD_VERIFY) - goto simpledrop; - - if (LogLevel > 4 && bitset(EF_LOGSENDER, e->e_flags)) - logsender(e, NULL); - e->e_flags &= ~EF_LOGSENDER; - - /* post statistics */ - poststats(StatFile); - - /* - ** Extract state information from dregs of send list. - */ - - if (curtime() > e->e_ctime + TimeOuts.to_q_return[e->e_timeoutclass]) - message_timeout = TRUE; - - e->e_flags &= ~EF_QUEUERUN; - for (q = e->e_sendqueue; q != NULL; q = q->q_next) - { - if (bitset(QQUEUEUP, q->q_flags) && - bitset(QDONTSEND, q->q_flags)) - { - /* I'm not sure how this happens..... */ - if (tTd(50, 2)) - { - printf("Bogus flags: "); - printaddr(q, FALSE); - } - q->q_flags &= ~QDONTSEND; - } - if (!bitset(QBADADDR|QDONTSEND|QSENT, q->q_flags)) - queueit = TRUE; -#if XDEBUG - else if (bitset(QQUEUEUP, q->q_flags)) - sm_syslog(LOG_DEBUG, e->e_id, - "dropenvelope: q_flags = %x, paddr = %s", - q->q_flags, q->q_paddr); -#endif - - /* see if a notification is needed */ - if (bitset(QPINGONFAILURE, q->q_flags) && - ((message_timeout && bitset(QQUEUEUP, q->q_flags)) || - bitset(QBADADDR, q->q_flags))) - { - failure_return = TRUE; - if (q->q_owner == NULL && !emptyaddr(&e->e_from)) - (void) sendtolist(e->e_from.q_paddr, NULLADDR, - &e->e_errorqueue, 0, e); - } - else if (bitset(QPINGONSUCCESS, q->q_flags) && - ((bitset(QSENT, q->q_flags) && - bitnset(M_LOCALMAILER, q->q_mailer->m_flags)) || - bitset(QRELAYED|QEXPANDED|QDELIVERED, q->q_flags))) - { - success_return = TRUE; - } - } - - if (e->e_class < 0) - e->e_flags |= EF_NO_BODY_RETN; - - /* - ** See if the message timed out. - */ - - if (!queueit) - /* nothing to do */ ; - else if (message_timeout) - { - if (failure_return) - { - (void) snprintf(buf, sizeof buf, - "Cannot send message within %s", - pintvl(TimeOuts.to_q_return[e->e_timeoutclass], FALSE)); - if (e->e_message != NULL) - free(e->e_message); - e->e_message = newstr(buf); - message(buf); - e->e_flags |= EF_CLRQUEUE; - } - fprintf(e->e_xfp, "Message could not be delivered for %s\n", - pintvl(TimeOuts.to_q_return[e->e_timeoutclass], FALSE)); - fprintf(e->e_xfp, "Message will be deleted from queue\n"); - for (q = e->e_sendqueue; q != NULL; q = q->q_next) - { - if (!bitset(QBADADDR|QDONTSEND|QSENT, q->q_flags)) - { - q->q_flags |= QBADADDR; - q->q_status = "4.4.7"; - } - } - } - else if (TimeOuts.to_q_warning[e->e_timeoutclass] > 0 && - curtime() > e->e_ctime + TimeOuts.to_q_warning[e->e_timeoutclass]) - { - if (!bitset(EF_WARNING|EF_RESPONSE, e->e_flags) && - e->e_class >= 0 && - e->e_from.q_paddr != NULL && - strcmp(e->e_from.q_paddr, "<>") != 0 && - strncasecmp(e->e_from.q_paddr, "owner-", 6) != 0 && - (strlen(e->e_from.q_paddr) <= (SIZE_T) 8 || - strcasecmp(&e->e_from.q_paddr[strlen(e->e_from.q_paddr) - 8], "-request") != 0)) - { - for (q = e->e_sendqueue; q != NULL; q = q->q_next) - { - if (bitset(QQUEUEUP, q->q_flags) && - bitset(QPINGONDELAY, q->q_flags)) - { - q->q_flags |= QDELAYED; - delay_return = TRUE; - } - } - } - if (delay_return) - { - (void) snprintf(buf, sizeof buf, - "Warning: could not send message for past %s", - pintvl(TimeOuts.to_q_warning[e->e_timeoutclass], FALSE)); - if (e->e_message != NULL) - free(e->e_message); - e->e_message = newstr(buf); - message(buf); - e->e_flags |= EF_WARNING; - } - fprintf(e->e_xfp, - "Warning: message still undelivered after %s\n", - pintvl(TimeOuts.to_q_warning[e->e_timeoutclass], FALSE)); - fprintf(e->e_xfp, "Will keep trying until message is %s old\n", - pintvl(TimeOuts.to_q_return[e->e_timeoutclass], FALSE)); - } - - if (tTd(50, 2)) - printf("failure_return=%d delay_return=%d success_return=%d queueit=%d\n", - failure_return, delay_return, success_return, queueit); - - /* - ** If we had some fatal error, but no addresses are marked as - ** bad, mark them _all_ as bad. - */ - - if (bitset(EF_FATALERRS, e->e_flags) && !failure_return) - { - for (q = e->e_sendqueue; q != NULL; q = q->q_next) - { - if (!bitset(QDONTSEND, q->q_flags) && - bitset(QPINGONFAILURE, q->q_flags)) - { - failure_return = TRUE; - q->q_flags |= QBADADDR; - } - } - } - - /* - ** Send back return receipts as requested. - */ - - if (success_return && !failure_return && !delay_return && fulldrop && - !bitset(PRIV_NORECEIPTS, PrivacyFlags) && - strcmp(e->e_from.q_paddr, "<>") != 0) - { - auto ADDRESS *rlist = NULL; - - if (tTd(50, 8)) - printf("dropenvelope(%s): sending return receipt\n", id); - e->e_flags |= EF_SENDRECEIPT; - (void) sendtolist(e->e_from.q_paddr, NULLADDR, &rlist, 0, e); - (void) returntosender("Return receipt", rlist, RTSF_NO_BODY, e); - } - e->e_flags &= ~EF_SENDRECEIPT; - - /* - ** Arrange to send error messages if there are fatal errors. - */ - - if ((failure_return || delay_return) && e->e_errormode != EM_QUIET) - { - extern void savemail __P((ENVELOPE *, bool)); - - if (tTd(50, 8)) - printf("dropenvelope(%s): saving mail\n", id); - savemail(e, !bitset(EF_NO_BODY_RETN, e->e_flags)); - } - - /* - ** Arrange to send warning messages to postmaster as requested. - */ - - if ((failure_return || bitset(EF_PM_NOTIFY, e->e_flags)) && - PostMasterCopy != NULL && - !bitset(EF_RESPONSE, e->e_flags) && e->e_class >= 0) - { - auto ADDRESS *rlist = NULL; - - if (tTd(50, 8)) - printf("dropenvelope(%s): sending postmaster copy\n", id); - (void) sendtolist(PostMasterCopy, NULLADDR, &rlist, 0, e); - (void) returntosender(e->e_message, rlist, RTSF_PM_BOUNCE, e); - } - - /* - ** Instantiate or deinstantiate the queue. - */ - -simpledrop: - if (tTd(50, 8)) - printf("dropenvelope(%s): at simpledrop, queueit=%d\n", - id, queueit); - if (!queueit || bitset(EF_CLRQUEUE, e->e_flags)) - { - if (tTd(50, 1)) - { - extern void printenvflags __P((ENVELOPE *)); - - printf("\n===== Dropping [dq]f%s... queueit=%d, e_flags=", - e->e_id, queueit); - printenvflags(e); - } - xunlink(queuename(e, 'd')); - xunlink(queuename(e, 'q')); - - if (LogLevel > 10) - sm_syslog(LOG_INFO, id, "done"); - } - else if (queueit || !bitset(EF_INQUEUE, e->e_flags)) - { -#if QUEUE - queueup(e, FALSE); -#else /* QUEUE */ - syserr("554 dropenvelope: queueup"); -#endif /* QUEUE */ - } - - /* now unlock the job */ - if (tTd(50, 8)) - printf("dropenvelope(%s): unlocking job\n", id); - closexscript(e); - unlockqueue(e); - - /* make sure that this envelope is marked unused */ - if (e->e_dfp != NULL) - (void) xfclose(e->e_dfp, "dropenvelope df", e->e_id); - e->e_dfp = NULL; - e->e_id = NULL; - e->e_flags &= ~EF_HAS_DF; -} -/* -** CLEARENVELOPE -- clear an envelope without unlocking -** -** This is normally used by a child process to get a clean -** envelope without disturbing the parent. -** -** Parameters: -** e -- the envelope to clear. -** fullclear - if set, the current envelope is total -** garbage and should be ignored; otherwise, -** release any resources it may indicate. -** -** Returns: -** none. -** -** Side Effects: -** Closes files associated with the envelope. -** Marks the envelope as unallocated. -*/ - -void -clearenvelope(e, fullclear) - register ENVELOPE *e; - bool fullclear; -{ - register HDR *bh; - register HDR **nhp; - extern ENVELOPE BlankEnvelope; - - if (!fullclear) - { - /* clear out any file information */ - if (e->e_xfp != NULL) - (void) xfclose(e->e_xfp, "clearenvelope xfp", e->e_id); - if (e->e_dfp != NULL) - (void) xfclose(e->e_dfp, "clearenvelope dfp", e->e_id); - e->e_xfp = e->e_dfp = NULL; - } - - /* now clear out the data */ - STRUCTCOPY(BlankEnvelope, *e); - e->e_message = NULL; - if (Verbose) - e->e_sendmode = SM_DELIVER; - bh = BlankEnvelope.e_header; - nhp = &e->e_header; - while (bh != NULL) - { - *nhp = (HDR *) xalloc(sizeof *bh); - bcopy((char *) bh, (char *) *nhp, sizeof *bh); - bh = bh->h_link; - nhp = &(*nhp)->h_link; - } -} -/* -** INITSYS -- initialize instantiation of system -** -** In Daemon mode, this is done in the child. -** -** Parameters: -** none. -** -** Returns: -** none. -** -** Side Effects: -** Initializes the system macros, some global variables, -** etc. In particular, the current time in various -** forms is set. -*/ - -void -initsys(e) - register ENVELOPE *e; -{ - char cbuf[5]; /* holds hop count */ - char pbuf[10]; /* holds pid */ -#ifdef TTYNAME - static char ybuf[60]; /* holds tty id */ - register char *p; - extern char *ttyname(); -#endif /* TTYNAME */ - extern void settime __P((ENVELOPE *)); - - /* - ** Give this envelope a reality. - ** I.e., an id, a transcript, and a creation time. - */ - - openxscript(e); - e->e_ctime = curtime(); - - /* - ** Set OutChannel to something useful if stdout isn't it. - ** This arranges that any extra stuff the mailer produces - ** gets sent back to the user on error (because it is - ** tucked away in the transcript). - */ - - if (OpMode == MD_DAEMON && bitset(EF_QUEUERUN, e->e_flags) && - e->e_xfp != NULL) - OutChannel = e->e_xfp; - - /* - ** Set up some basic system macros. - */ - - /* process id */ - (void) snprintf(pbuf, sizeof pbuf, "%d", getpid()); - define('p', newstr(pbuf), e); - - /* hop count */ - (void) snprintf(cbuf, sizeof cbuf, "%d", e->e_hopcount); - define('c', newstr(cbuf), e); - - /* time as integer, unix time, arpa time */ - settime(e); - -#ifdef TTYNAME - /* tty name */ - if (macvalue('y', e) == NULL) - { - p = ttyname(2); - if (p != NULL) - { - if (strrchr(p, '/') != NULL) - p = strrchr(p, '/') + 1; - snprintf(ybuf, sizeof ybuf, "%s", p); - define('y', ybuf, e); - } - } -#endif /* TTYNAME */ -} -/* -** SETTIME -- set the current time. -** -** Parameters: -** none. -** -** Returns: -** none. -** -** Side Effects: -** Sets the various time macros -- $a, $b, $d, $t. -*/ - -void -settime(e) - register ENVELOPE *e; -{ - register char *p; - auto time_t now; - char tbuf[20]; /* holds "current" time */ - char dbuf[30]; /* holds ctime(tbuf) */ - register struct tm *tm; - extern struct tm *gmtime(); - - now = curtime(); - tm = gmtime(&now); - (void) snprintf(tbuf, sizeof tbuf, "%04d%02d%02d%02d%02d", tm->tm_year + 1900, - tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min); - define('t', newstr(tbuf), e); - (void) strcpy(dbuf, ctime(&now)); - p = strchr(dbuf, '\n'); - if (p != NULL) - *p = '\0'; - define('d', newstr(dbuf), e); - p = arpadate(dbuf); - p = newstr(p); - if (macvalue('a', e) == NULL) - define('a', p, e); - define('b', p, e); -} -/* -** OPENXSCRIPT -- Open transcript file -** -** Creates a transcript file for possible eventual mailing or -** sending back. -** -** Parameters: -** e -- the envelope to create the transcript in/for. -** -** Returns: -** none -** -** Side Effects: -** Creates the transcript file. -*/ - -#ifndef O_APPEND -#define O_APPEND 0 -#endif - -void -openxscript(e) - register ENVELOPE *e; -{ - register char *p; - int fd; - - if (e->e_xfp != NULL) - return; - p = queuename(e, 'x'); - fd = open(p, O_WRONLY|O_CREAT|O_APPEND, FileMode); - if (fd < 0) - { - syserr("Can't create transcript file %s", p); - fd = open("/dev/null", O_WRONLY, 0644); - if (fd < 0) - syserr("!Can't open /dev/null"); - } - e->e_xfp = fdopen(fd, "a"); - if (e->e_xfp == NULL) - syserr("!Can't create transcript stream %s", p); -#ifdef HASSETVBUF - setvbuf(e->e_xfp, NULL, _IOLBF, 0); -#else - setlinebuf(e->e_xfp); -#endif - if (tTd(46, 9)) - { - printf("openxscript(%s):\n ", p); - dumpfd(fileno(e->e_xfp), TRUE, FALSE); - } -} -/* -** CLOSEXSCRIPT -- close the transcript file. -** -** Parameters: -** e -- the envelope containing the transcript to close. -** -** Returns: -** none. -** -** Side Effects: -** none. -*/ - -void -closexscript(e) - register ENVELOPE *e; -{ - if (e->e_xfp == NULL) - return; - (void) xfclose(e->e_xfp, "closexscript", e->e_id); - e->e_xfp = NULL; -} -/* -** SETSENDER -- set the person who this message is from -** -** Under certain circumstances allow the user to say who -** s/he is (using -f or -r). These are: -** 1. The user's uid is zero (root). -** 2. The user's login name is in an approved list (typically -** from a network server). -** 3. The address the user is trying to claim has a -** "!" character in it (since #2 doesn't do it for -** us if we are dialing out for UUCP). -** A better check to replace #3 would be if the -** effective uid is "UUCP" -- this would require me -** to rewrite getpwent to "grab" uucp as it went by, -** make getname more nasty, do another passwd file -** scan, or compile the UID of "UUCP" into the code, -** all of which are reprehensible. -** -** Assuming all of these fail, we figure out something -** ourselves. -** -** Parameters: -** from -- the person we would like to believe this message -** is from, as specified on the command line. -** e -- the envelope in which we would like the sender set. -** delimptr -- if non-NULL, set to the location of the -** trailing delimiter. -** delimchar -- the character that will delimit the sender -** address. -** internal -- set if this address is coming from an internal -** source such as an owner alias. -** -** Returns: -** none. -** -** Side Effects: -** sets sendmail's notion of who the from person is. -*/ - -void -setsender(from, e, delimptr, delimchar, internal) - char *from; - register ENVELOPE *e; - char **delimptr; - int delimchar; - bool internal; -{ - register char **pvp; - char *realname = NULL; - register struct passwd *pw; - char *bp; - char buf[MAXNAME + 2]; - char pvpbuf[PSBUFSIZE]; - extern char *FullName; - - if (tTd(45, 1)) - printf("setsender(%s)\n", from == NULL ? "" : from); - - /* - ** Figure out the real user executing us. - ** Username can return errno != 0 on non-errors. - */ - - if (bitset(EF_QUEUERUN, e->e_flags) || OpMode == MD_SMTP || - OpMode == MD_ARPAFTP || OpMode == MD_DAEMON) - realname = from; - if (realname == NULL || realname[0] == '\0') - realname = username(); - - if (ConfigLevel < 2) - SuprErrs = TRUE; - - e->e_from.q_flags = QBADADDR; - if (from == NULL || - parseaddr(from, &e->e_from, RF_COPYALL|RF_SENDERADDR, - delimchar, delimptr, e) == NULL || - bitset(QBADADDR, e->e_from.q_flags) || - e->e_from.q_mailer == ProgMailer || - e->e_from.q_mailer == FileMailer || - e->e_from.q_mailer == InclMailer) - { - /* log garbage addresses for traceback */ - if (from != NULL && LogLevel > 2) - { - char *p; - char ebuf[MAXNAME * 2 + 2]; - - p = macvalue('_', e); - if (p == NULL) - { - char *host = RealHostName; - - if (host == NULL) - host = MyHostName; - (void) snprintf(ebuf, sizeof ebuf, "%.*s@%.*s", - MAXNAME, realname, - MAXNAME, host); - p = ebuf; - } - sm_syslog(LOG_NOTICE, e->e_id, - "setsender: %s: invalid or unparseable, received from %s", - shortenstring(from, 83), p); - } - if (from != NULL) - { - if (!bitset(QBADADDR, e->e_from.q_flags)) - { - /* it was a bogus mailer in the from addr */ - e->e_status = "5.1.7"; - usrerr("553 Invalid sender address"); - } - SuprErrs = TRUE; - } - if (from == realname || - parseaddr(from = newstr(realname), &e->e_from, - RF_COPYALL|RF_SENDERADDR, ' ', NULL, e) == NULL) - { - char nbuf[100]; - - SuprErrs = TRUE; - expand("\201n", nbuf, sizeof nbuf, e); - if (parseaddr(from = newstr(nbuf), &e->e_from, - RF_COPYALL, ' ', NULL, e) == NULL && - parseaddr(from = "postmaster", &e->e_from, - RF_COPYALL, ' ', NULL, e) == NULL) - syserr("553 setsender: can't even parse postmaster!"); - } - } - else - FromFlag = TRUE; - e->e_from.q_flags |= QDONTSEND; - if (tTd(45, 5)) - { - printf("setsender: QDONTSEND "); - printaddr(&e->e_from, FALSE); - } - SuprErrs = FALSE; - -# if USERDB - if (bitnset(M_CHECKUDB, e->e_from.q_mailer->m_flags)) - { - register char *p; - extern char *udbsender __P((char *)); - - p = udbsender(e->e_from.q_user); - if (p != NULL) - from = p; - } -# endif /* USERDB */ - - if (bitnset(M_HASPWENT, e->e_from.q_mailer->m_flags)) - { - if (!internal) - { - /* if the user already given fullname don't redefine */ - if (FullName == NULL) - FullName = macvalue('x', e); - if (FullName != NULL && FullName[0] == '\0') - FullName = NULL; - } - - if (e->e_from.q_user[0] != '\0' && - (pw = sm_getpwnam(e->e_from.q_user)) != NULL) - { - /* - ** Process passwd file entry. - */ - - /* extract home directory */ - if (strcmp(pw->pw_dir, "/") == 0) - e->e_from.q_home = newstr(""); - else - e->e_from.q_home = newstr(pw->pw_dir); - define('z', e->e_from.q_home, e); - - /* extract user and group id */ - e->e_from.q_uid = pw->pw_uid; - e->e_from.q_gid = pw->pw_gid; - e->e_from.q_flags |= QGOODUID; - - /* extract full name from passwd file */ - if (FullName == NULL && pw->pw_gecos != NULL && - strcmp(pw->pw_name, e->e_from.q_user) == 0 && - !internal) - { - buildfname(pw->pw_gecos, e->e_from.q_user, buf, sizeof buf); - if (buf[0] != '\0') - FullName = newstr(buf); - } - } - else - { - e->e_from.q_home = "/no/such/directory"; - } - if (FullName != NULL && !internal) - define('x', FullName, e); - } - else if (!internal && OpMode != MD_DAEMON && OpMode != MD_SMTP) - { - if (e->e_from.q_home == NULL) - { - e->e_from.q_home = getenv("HOME"); - if (e->e_from.q_home != NULL && - strcmp(e->e_from.q_home, "/") == 0) - e->e_from.q_home++; - } - e->e_from.q_uid = RealUid; - e->e_from.q_gid = RealGid; - e->e_from.q_flags |= QGOODUID; - } - - /* - ** Rewrite the from person to dispose of possible implicit - ** links in the net. - */ - - pvp = prescan(from, delimchar, pvpbuf, sizeof pvpbuf, NULL, NULL); - if (pvp == NULL) - { - /* don't need to give error -- prescan did that already */ - if (LogLevel > 2) - sm_syslog(LOG_NOTICE, e->e_id, - "cannot prescan from (%s)", - shortenstring(from, MAXSHORTSTR)); - finis(TRUE, ExitStat); - } - (void) rewrite(pvp, 3, 0, e); - (void) rewrite(pvp, 1, 0, e); - (void) rewrite(pvp, 4, 0, e); - bp = buf + 1; - cataddr(pvp, NULL, bp, sizeof buf - 2, '\0'); - if (*bp == '@' && !bitnset(M_NOBRACKET, e->e_from.q_mailer->m_flags)) - { - /* heuristic: route-addr: add angle brackets */ - strcat(bp, ">"); - *--bp = '<'; - } - e->e_sender = newstr(bp); - define('f', e->e_sender, e); - - /* save the domain spec if this mailer wants it */ - if (e->e_from.q_mailer != NULL && - bitnset(M_CANONICAL, e->e_from.q_mailer->m_flags)) - { - char **lastat; - extern char **copyplist __P((char **, bool)); - - /* get rid of any pesky angle brackets */ - (void) rewrite(pvp, 3, 0, e); - (void) rewrite(pvp, 1, 0, e); - (void) rewrite(pvp, 4, 0, e); - - /* strip off to the last "@" sign */ - for (lastat = NULL; *pvp != NULL; pvp++) - if (strcmp(*pvp, "@") == 0) - lastat = pvp; - if (lastat != NULL) - { - e->e_fromdomain = copyplist(lastat, TRUE); - if (tTd(45, 3)) - { - printf("Saving from domain: "); - printav(e->e_fromdomain); - } - } - } -} -/* -** PRINTENVFLAGS -- print envelope flags for debugging -** -** Parameters: -** e -- the envelope with the flags to be printed. -** -** Returns: -** none. -*/ - -struct eflags -{ - char *ef_name; - u_long ef_bit; -}; - -struct eflags EnvelopeFlags[] = -{ - { "OLDSTYLE", EF_OLDSTYLE }, - { "INQUEUE", EF_INQUEUE }, - { "NO_BODY_RETN", EF_NO_BODY_RETN }, - { "CLRQUEUE", EF_CLRQUEUE }, - { "SENDRECEIPT", EF_SENDRECEIPT }, - { "FATALERRS", EF_FATALERRS }, - { "DELETE_BCC", EF_DELETE_BCC }, - { "RESPONSE", EF_RESPONSE }, - { "RESENT", EF_RESENT }, - { "VRFYONLY", EF_VRFYONLY }, - { "WARNING", EF_WARNING }, - { "QUEUERUN", EF_QUEUERUN }, - { "GLOBALERRS", EF_GLOBALERRS }, - { "PM_NOTIFY", EF_PM_NOTIFY }, - { "METOO", EF_METOO }, - { "LOGSENDER", EF_LOGSENDER }, - { "NORECEIPT", EF_NORECEIPT }, - { "HAS8BIT", EF_HAS8BIT }, - { "NL_NOT_EOL", EF_NL_NOT_EOL }, - { "CRLF_NOT_EOL", EF_CRLF_NOT_EOL }, - { "RET_PARAM", EF_RET_PARAM }, - { "HAS_DF", EF_HAS_DF }, - { "IS_MIME", EF_IS_MIME }, - { "DONT_MIME", EF_DONT_MIME }, - { NULL } -}; - -void -printenvflags(e) - register ENVELOPE *e; -{ - register struct eflags *ef; - bool first = TRUE; - - printf("%lx", e->e_flags); - for (ef = EnvelopeFlags; ef->ef_name != NULL; ef++) - { - if (!bitset(ef->ef_bit, e->e_flags)) - continue; - if (first) - printf("<%s", ef->ef_name); - else - printf(",%s", ef->ef_name); - first = FALSE; - } - if (!first) - printf(">\n"); -} diff --git a/src/err.c b/src/err.c deleted file mode 100644 index 1a875a2..0000000 --- a/src/err.c +++ /dev/null @@ -1,767 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)err.c 8.74 (Berkeley) 6/4/1998"; -#endif /* not lint */ - -# include "sendmail.h" -# include <errno.h> - -/* -** SYSERR -- Print error message. -** -** Prints an error message via printf to the diagnostic output. -** -** If the first character of the syserr message is `!' it will -** log this as an ALERT message and exit immediately. This can -** leave queue files in an indeterminate state, so it should not -** be used lightly. -** -** Parameters: -** fmt -- the format string. If it does not begin with -** a three-digit SMTP reply code, either 554 or -** 451 is assumed depending on whether errno -** is set. -** (others) -- parameters -** -** Returns: -** none -** Through TopFrame if QuickAbort is set. -** -** Side Effects: -** increments Errors. -** sets ExitStat. -*/ - -char MsgBuf[BUFSIZ*2]; /* text of most recent message */ -char HeldMessageBuf[sizeof MsgBuf]; /* for held messages */ - -extern void putoutmsg __P((char *, bool, bool)); -extern void puterrmsg __P((char *)); -static void fmtmsg __P((char *, const char *, const char *, int, const char *, va_list)); - -#if NAMED_BIND && !defined(NO_DATA) -# define NO_DATA NO_ADDRESS -#endif - -void -/*VARARGS1*/ -#ifdef __STDC__ -syserr(const char *fmt, ...) -#else -syserr(fmt, va_alist) - const char *fmt; - va_dcl -#endif -{ - register char *p; - int olderrno = errno; - bool panic; - char *uname; - struct passwd *pw; - char ubuf[80]; - VA_LOCAL_DECL - - panic = *fmt == '!'; - if (panic) - { - fmt++; - HoldErrs = FALSE; - } - - /* format and output the error message */ - if (olderrno == 0) - p = "554"; - else - p = "451"; - VA_START(fmt); - fmtmsg(MsgBuf, (char *) NULL, p, olderrno, fmt, ap); - VA_END; - puterrmsg(MsgBuf); - - /* save this message for mailq printing */ - if (!panic && CurEnv != NULL) - { - if (CurEnv->e_message != NULL) - free(CurEnv->e_message); - CurEnv->e_message = newstr(MsgBuf + 4); - } - - /* determine exit status if not already set */ - if (ExitStat == EX_OK) - { - if (olderrno == 0) - ExitStat = EX_SOFTWARE; - else - ExitStat = EX_OSERR; - if (tTd(54, 1)) - printf("syserr: ExitStat = %d\n", ExitStat); - } - - pw = sm_getpwuid(getuid()); - if (pw != NULL) - uname = pw->pw_name; - else - { - uname = ubuf; - snprintf(ubuf, sizeof ubuf, "UID%d", getuid()); - } - - if (LogLevel > 0) - sm_syslog(panic ? LOG_ALERT : LOG_CRIT, - CurEnv == NULL ? NOQID : CurEnv->e_id, - "SYSERR(%s): %.900s", - uname, &MsgBuf[4]); - switch (olderrno) - { - case EBADF: - case ENFILE: - case EMFILE: - case ENOTTY: -#ifdef EFBIG - case EFBIG: -#endif -#ifdef ESPIPE - case ESPIPE: -#endif -#ifdef EPIPE - case EPIPE: -#endif -#ifdef ENOBUFS - case ENOBUFS: -#endif -#ifdef ESTALE - case ESTALE: -#endif - printopenfds(TRUE); - mci_dump_all(TRUE); - break; - } - if (panic) - { -#ifdef XLA - xla_all_end(); -#endif - if (tTd(0, 1)) - abort(); - exit(EX_OSERR); - } - errno = 0; - if (QuickAbort) - longjmp(TopFrame, 2); -} -/* -** USRERR -- Signal user error. -** -** This is much like syserr except it is for user errors. -** -** Parameters: -** fmt -- the format string. If it does not begin with -** a three-digit SMTP reply code, 501 is assumed. -** (others) -- printf strings -** -** Returns: -** none -** Through TopFrame if QuickAbort is set. -** -** Side Effects: -** increments Errors. -*/ - -/*VARARGS1*/ -void -#ifdef __STDC__ -usrerr(const char *fmt, ...) -#else -usrerr(fmt, va_alist) - const char *fmt; - va_dcl -#endif -{ - VA_LOCAL_DECL - - if (SuprErrs) - return; - - VA_START(fmt); - fmtmsg(MsgBuf, CurEnv->e_to, "501", 0, fmt, ap); - VA_END; - - /* save this message for mailq printing */ - switch (MsgBuf[0]) - { - case '4': - case '8': - if (CurEnv->e_message != NULL) - break; - - /* fall through.... */ - - case '5': - case '6': - if (CurEnv->e_message != NULL) - free(CurEnv->e_message); - if (MsgBuf[0] == '6') - { - char buf[MAXLINE]; - - snprintf(buf, sizeof buf, "Postmaster warning: %.*s", - sizeof buf - 22, MsgBuf + 4); - CurEnv->e_message = newstr(buf); - } - else - { - CurEnv->e_message = newstr(MsgBuf + 4); - } - break; - } - - puterrmsg(MsgBuf); - - if (LogLevel > 3 && LogUsrErrs) - sm_syslog(LOG_NOTICE, CurEnv->e_id, - "%.900s", - &MsgBuf[4]); - - if (QuickAbort) - longjmp(TopFrame, 1); -} -/* -** MESSAGE -- print message (not necessarily an error) -** -** Parameters: -** msg -- the message (printf fmt) -- it can begin with -** an SMTP reply code. If not, 050 is assumed. -** (others) -- printf arguments -** -** Returns: -** none -** -** Side Effects: -** none. -*/ - -/*VARARGS1*/ -void -#ifdef __STDC__ -message(const char *msg, ...) -#else -message(msg, va_alist) - const char *msg; - va_dcl -#endif -{ - VA_LOCAL_DECL - - errno = 0; - VA_START(msg); - fmtmsg(MsgBuf, CurEnv->e_to, "050", 0, msg, ap); - VA_END; - putoutmsg(MsgBuf, FALSE, FALSE); - - /* save this message for mailq printing */ - switch (MsgBuf[0]) - { - case '4': - case '8': - if (CurEnv->e_message != NULL) - break; - /* fall through.... */ - - case '5': - if (CurEnv->e_message != NULL) - free(CurEnv->e_message); - CurEnv->e_message = newstr(MsgBuf + 4); - break; - } -} -/* -** NMESSAGE -- print message (not necessarily an error) -** -** Just like "message" except it never puts the to... tag on. -** -** Parameters: -** msg -- the message (printf fmt) -- if it begins -** with a three digit SMTP reply code, that is used, -** otherwise 050 is assumed. -** (others) -- printf arguments -** -** Returns: -** none -** -** Side Effects: -** none. -*/ - -/*VARARGS1*/ -void -#ifdef __STDC__ -nmessage(const char *msg, ...) -#else -nmessage(msg, va_alist) - const char *msg; - va_dcl -#endif -{ - VA_LOCAL_DECL - - errno = 0; - VA_START(msg); - fmtmsg(MsgBuf, (char *) NULL, "050", 0, msg, ap); - VA_END; - putoutmsg(MsgBuf, FALSE, FALSE); - - /* save this message for mailq printing */ - switch (MsgBuf[0]) - { - case '4': - case '8': - if (CurEnv->e_message != NULL) - break; - /* fall through.... */ - - case '5': - if (CurEnv->e_message != NULL) - free(CurEnv->e_message); - CurEnv->e_message = newstr(MsgBuf + 4); - break; - } -} -/* -** PUTOUTMSG -- output error message to transcript and channel -** -** Parameters: -** msg -- message to output (in SMTP format). -** holdmsg -- if TRUE, don't output a copy of the message to -** our output channel. -** heldmsg -- if TRUE, this is a previously held message; -** don't log it to the transcript file. -** -** Returns: -** none. -** -** Side Effects: -** Outputs msg to the transcript. -** If appropriate, outputs it to the channel. -** Deletes SMTP reply code number as appropriate. -*/ - -void -putoutmsg(msg, holdmsg, heldmsg) - char *msg; - bool holdmsg; - bool heldmsg; -{ - char msgcode = msg[0]; - - /* display for debugging */ - if (tTd(54, 8)) - printf("--- %s%s%s\n", msg, holdmsg ? " (hold)" : "", - heldmsg ? " (held)" : ""); - - /* map warnings to something SMTP can handle */ - if (msgcode == '6') - msg[0] = '5'; - else if (msgcode == '8') - msg[0] = '4'; - - /* output to transcript if serious */ - if (!heldmsg && CurEnv != NULL && CurEnv->e_xfp != NULL && - strchr("45", msg[0]) != NULL) - fprintf(CurEnv->e_xfp, "%s\n", msg); - - if (LogLevel >= 15 && (OpMode == MD_SMTP || OpMode == MD_DAEMON)) - sm_syslog(LOG_INFO, CurEnv->e_id, - "--> %s%s", - msg, holdmsg ? " (held)" : ""); - - if (msgcode == '8') - msg[0] = '0'; - - /* output to channel if appropriate */ - if (!Verbose && msg[0] == '0') - return; - if (holdmsg) - { - /* save for possible future display */ - msg[0] = msgcode; - snprintf(HeldMessageBuf, sizeof HeldMessageBuf, "%s", msg); - return; - } - - (void) fflush(stdout); - - if (OutChannel == NULL) - return; - - /* if DisConnected, OutChannel now points to the transcript */ - if (!DisConnected && - (OpMode == MD_SMTP || OpMode == MD_DAEMON || OpMode == MD_ARPAFTP)) - fprintf(OutChannel, "%s\r\n", msg); - else - fprintf(OutChannel, "%s\n", &msg[4]); - if (TrafficLogFile != NULL) - fprintf(TrafficLogFile, "%05d >>> %s\n", (int) getpid(), - (OpMode == MD_SMTP || OpMode == MD_DAEMON) ? msg : &msg[4]); - if (msg[3] == ' ') - (void) fflush(OutChannel); - if (!ferror(OutChannel) || DisConnected) - return; - - /* - ** Error on output -- if reporting lost channel, just ignore it. - ** Also, ignore errors from QUIT response (221 message) -- some - ** rude servers don't read result. - */ - - if (InChannel == NULL || feof(InChannel) || ferror(InChannel) || - strncmp(msg, "221", 3) == 0) - return; - - /* can't call syserr, 'cause we are using MsgBuf */ - HoldErrs = TRUE; - if (LogLevel > 0) - sm_syslog(LOG_CRIT, CurEnv->e_id, - "SYSERR: putoutmsg (%s): error on output channel sending \"%s\": %s", - CurHostName == NULL ? "NO-HOST" : CurHostName, - shortenstring(msg, MAXSHORTSTR), errstring(errno)); -} -/* -** PUTERRMSG -- like putoutmsg, but does special processing for error messages -** -** Parameters: -** msg -- the message to output. -** -** Returns: -** none. -** -** Side Effects: -** Sets the fatal error bit in the envelope as appropriate. -*/ - -void -puterrmsg(msg) - char *msg; -{ - char msgcode = msg[0]; - - /* output the message as usual */ - putoutmsg(msg, HoldErrs, FALSE); - - /* be careful about multiple error messages */ - if (OnlyOneError) - HoldErrs = TRUE; - - /* signal the error */ - Errors++; - - if (CurEnv == NULL) - return; - - if (msgcode == '6') - { - /* notify the postmaster */ - CurEnv->e_flags |= EF_PM_NOTIFY; - } - else if (msgcode == '5' && bitset(EF_GLOBALERRS, CurEnv->e_flags)) - { - /* mark long-term fatal errors */ - CurEnv->e_flags |= EF_FATALERRS; - } -} -/* -** FMTMSG -- format a message into buffer. -** -** Parameters: -** eb -- error buffer to get result. -** to -- the recipient tag for this message. -** num -- arpanet error number. -** en -- the error number to display. -** fmt -- format of string. -** a, b, c, d, e -- arguments. -** -** Returns: -** none. -** -** Side Effects: -** none. -*/ - -static void -fmtmsg(eb, to, num, eno, fmt, ap) - register char *eb; - const char *to; - const char *num; - int eno; - const char *fmt; - va_list ap; -{ - char del; - int l; - int spaceleft = sizeof MsgBuf; - - /* output the reply code */ - if (isascii(fmt[0]) && isdigit(fmt[0]) && - isascii(fmt[1]) && isdigit(fmt[1]) && - isascii(fmt[2]) && isdigit(fmt[2])) - { - num = fmt; - fmt += 4; - } - if (num[3] == '-') - del = '-'; - else - del = ' '; - (void) snprintf(eb, spaceleft, "%3.3s%c", num, del); - eb += 4; - spaceleft -= 4; - - /* output the file name and line number */ - if (FileName != NULL) - { - (void) snprintf(eb, spaceleft, "%s: line %d: ", - shortenstring(FileName, 83), LineNumber); - eb += (l = strlen(eb)); - spaceleft -= l; - } - - /* output the "to" person */ - if (to != NULL && to[0] != '\0' && - strncmp(num, "551", 3) != 0 && - strncmp(num, "251", 3) != 0) - { - (void) snprintf(eb, spaceleft, "%s... ", - shortenstring(to, MAXSHORTSTR)); - spaceleft -= strlen(eb); - while (*eb != '\0') - *eb++ &= 0177; - } - - /* output the message */ - (void) vsnprintf(eb, spaceleft, fmt, ap); - spaceleft -= strlen(eb); - while (*eb != '\0') - *eb++ &= 0177; - - /* output the error code, if any */ - if (eno != 0) - (void) snprintf(eb, spaceleft, ": %s", errstring(eno)); -} -/* -** BUFFER_ERRORS -- arrange to buffer future error messages -** -** Parameters: -** none -** -** Returns: -** none. -*/ - -void -buffer_errors() -{ - HeldMessageBuf[0] = '\0'; - HoldErrs = TRUE; -} -/* -** FLUSH_ERRORS -- flush the held error message buffer -** -** Parameters: -** print -- if set, print the message, otherwise just -** delete it. -** -** Returns: -** none. -*/ - -void -flush_errors(print) - bool print; -{ - if (print && HeldMessageBuf[0] != '\0') - putoutmsg(HeldMessageBuf, FALSE, TRUE); - HeldMessageBuf[0] = '\0'; - HoldErrs = FALSE; -} -/* -** ERRSTRING -- return string description of error code -** -** Parameters: -** errnum -- the error number to translate -** -** Returns: -** A string description of errnum. -** -** Side Effects: -** none. -*/ - -const char * -errstring(errnum) - int errnum; -{ - char *dnsmsg; - char *bp; - static char buf[MAXLINE]; -# if !HASSTRERROR && !defined(ERRLIST_PREDEFINED) - extern char *sys_errlist[]; - extern int sys_nerr; -# endif -# if SMTP - extern char *SmtpPhase; -# endif /* SMTP */ - - /* - ** Handle special network error codes. - ** - ** These are 4.2/4.3bsd specific; they should be in daemon.c. - */ - - dnsmsg = NULL; - switch (errnum) - { -# if defined(DAEMON) && defined(ETIMEDOUT) - case ETIMEDOUT: - case ECONNRESET: - bp = buf; -#if HASSTRERROR - snprintf(bp, SPACELEFT(buf, bp), "%s", strerror(errnum)); -#else - if (errnum >= 0 && errnum < sys_nerr) - snprintf(bp, SPACELEFT(buf, bp), "%s", sys_errlist[errnum]); - else - snprintf(bp, SPACELEFT(buf, bp), "Error %d", errnum); -#endif - bp += strlen(bp); - if (CurHostName != NULL) - { - if (errnum == ETIMEDOUT) - { - snprintf(bp, SPACELEFT(buf, bp), " with "); - bp += strlen(bp); - } - else - { - bp = buf; - snprintf(bp, SPACELEFT(buf, bp), - "Connection reset by "); - bp += strlen(bp); - } - snprintf(bp, SPACELEFT(buf, bp), "%s", - shortenstring(CurHostName, MAXSHORTSTR)); - bp += strlen(buf); - } - if (SmtpPhase != NULL) - { - snprintf(bp, SPACELEFT(buf, bp), " during %s", - SmtpPhase); - } - return (buf); - - case EHOSTDOWN: - if (CurHostName == NULL) - break; - (void) snprintf(buf, sizeof buf, "Host %s is down", - shortenstring(CurHostName, MAXSHORTSTR)); - return (buf); - - case ECONNREFUSED: - if (CurHostName == NULL) - break; - (void) snprintf(buf, sizeof buf, "Connection refused by %s", - shortenstring(CurHostName, MAXSHORTSTR)); - return (buf); -# endif - -# if NAMED_BIND - case HOST_NOT_FOUND + E_DNSBASE: - dnsmsg = "host not found"; - break; - - case TRY_AGAIN + E_DNSBASE: - dnsmsg = "host name lookup failure"; - break; - - case NO_RECOVERY + E_DNSBASE: - dnsmsg = "non-recoverable error"; - break; - - case NO_DATA + E_DNSBASE: - dnsmsg = "no data known"; - break; -# endif - - case EPERM: - /* SunOS gives "Not owner" -- this is the POSIX message */ - return "Operation not permitted"; - - /* - ** Error messages used internally in sendmail. - */ - - case E_SM_OPENTIMEOUT: - return "Timeout on file open"; - - case E_SM_NOSLINK: - return "Symbolic links not allowed"; - - case E_SM_NOHLINK: - return "Hard links not allowed"; - - case E_SM_REGONLY: - return "Regular files only"; - - case E_SM_ISEXEC: - return "Executable files not allowed"; - - case E_SM_WWDIR: - return "World writable directory"; - - case E_SM_GWDIR: - return "Group writable directory"; - - case E_SM_FILECHANGE: - return "File changed after open"; - - case E_SM_WWFILE: - return "World writable file"; - - case E_SM_GWFILE: - return "Group writable file"; - } - - if (dnsmsg != NULL) - { - bp = buf; - strcpy(bp, "Name server: "); - bp += strlen(bp); - if (CurHostName != NULL) - { - snprintf(bp, SPACELEFT(buf, bp), "%s: ", - shortenstring(CurHostName, MAXSHORTSTR)); - bp += strlen(bp); - } - snprintf(bp, SPACELEFT(buf, bp), "%s", dnsmsg); - return buf; - } - -#if HASSTRERROR - return strerror(errnum); -#else - if (errnum > 0 && errnum < sys_nerr) - return (sys_errlist[errnum]); - - (void) snprintf(buf, sizeof buf, "Error %d", errnum); - return (buf); -#endif -} diff --git a/src/headers.c b/src/headers.c deleted file mode 100644 index 6c43dcb..0000000 --- a/src/headers.c +++ /dev/null @@ -1,1710 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)headers.c 8.136 (Berkeley) 1/26/1999"; -#endif /* not lint */ - -# include <errno.h> -# include "sendmail.h" - -/* -** SETUPHEADERS -- initialize headers in symbol table -** -** Parameters: -** none -** -** Returns: -** none -*/ - -void -setupheaders() -{ - struct hdrinfo *hi; - STAB *s; - - for (hi = HdrInfo; hi->hi_field != NULL; hi++) - { - s = stab(hi->hi_field, ST_HEADER, ST_ENTER); - s->s_header.hi_flags = hi->hi_flags; - s->s_header.hi_ruleset = NULL; - } -} -/* -** CHOMPHEADER -- process and save a header line. -** -** Called by collect and by readcf to deal with header lines. -** -** Parameters: -** line -- header as a text line. -** def -- if set, this is a default value. -** hdrp -- a pointer to the place to save the header. -** e -- the envelope including this header. -** -** Returns: -** flags for this header. -** -** Side Effects: -** The header is saved on the header list. -** Contents of 'line' are destroyed. -*/ - -struct hdrinfo NormalHeader = { NULL, 0, NULL }; - -int -chompheader(line, def, hdrp, e) - char *line; - bool def; - HDR **hdrp; - register ENVELOPE *e; -{ - register char *p; - register HDR *h; - HDR **hp; - char *fname; - char *fvalue; - bool cond = FALSE; - bool headeronly; - STAB *s; - struct hdrinfo *hi; - bool nullheader = FALSE; - BITMAP mopts; - - if (tTd(31, 6)) - { - printf("chompheader: "); - xputs(line); - printf("\n"); - } - - headeronly = hdrp != NULL; - if (!headeronly) - hdrp = &e->e_header; - - /* strip off options */ - clrbitmap(mopts); - p = line; - if (*p == '?') - { - /* have some */ - register char *q = strchr(p + 1, *p); - - if (q != NULL) - { - *q++ = '\0'; - while (*++p != '\0') - setbitn(*p, mopts); - p = q; - } - else - syserr("553 header syntax error, line \"%s\"", line); - cond = TRUE; - } - - /* find canonical name */ - fname = p; - while (isascii(*p) && isgraph(*p) && *p != ':') - p++; - fvalue = p; - while (isascii(*p) && isspace(*p)) - p++; - if (*p++ != ':' || fname == fvalue) - { - syserr("553 header syntax error, line \"%s\"", line); - return 0; - } - *fvalue = '\0'; - - /* strip field value on front */ - if (*p == ' ') - p++; - fvalue = p; - - /* if the field is null, go ahead and use the default */ - while (isascii(*p) && isspace(*p)) - p++; - if (*p == '\0') - nullheader = TRUE; - - /* security scan: long field names are end-of-header */ - if (strlen(fname) > 100) - return H_EOH; - - /* check to see if it represents a ruleset call */ - if (def) - { - char hbuf[50]; - - (void) expand(fvalue, hbuf, sizeof hbuf, e); - for (p = hbuf; isascii(*p) && isspace(*p); ) - p++; - if ((*p++ & 0377) == CALLSUBR) - { - auto char *endp; - - if (strtorwset(p, &endp, ST_ENTER) > 0) - { - *endp = '\0'; - s = stab(fname, ST_HEADER, ST_ENTER); - s->s_header.hi_ruleset = newstr(p); - } - return 0; - } - } - - /* see if it is a known type */ - s = stab(fname, ST_HEADER, ST_FIND); - if (s != NULL) - hi = &s->s_header; - else - hi = &NormalHeader; - - if (tTd(31, 9)) - { - if (s == NULL) - printf("no header flags match\n"); - else - printf("header match, flags=%x, ruleset=%s\n", - hi->hi_flags, - hi->hi_ruleset == NULL ? "<NULL>" : hi->hi_ruleset); - } - - /* see if this is a resent message */ - if (!def && !headeronly && bitset(H_RESENT, hi->hi_flags)) - e->e_flags |= EF_RESENT; - - /* if this is an Errors-To: header keep track of it now */ - if (UseErrorsTo && !def && !headeronly && - bitset(H_ERRORSTO, hi->hi_flags)) - (void) sendtolist(fvalue, NULLADDR, &e->e_errorqueue, 0, e); - - /* if this means "end of header" quit now */ - if (!headeronly && bitset(H_EOH, hi->hi_flags)) - return hi->hi_flags; - - /* - ** Horrible hack to work around problem with Lotus Notes SMTP - ** mail gateway, which generates From: headers with newlines in - ** them and the <address> on the second line. Although this is - ** legal RFC 822, many MUAs don't handle this properly and thus - ** never find the actual address. - */ - - if (bitset(H_FROM, hi->hi_flags) && SingleLineFromHeader) - { - while ((p = strchr(fvalue, '\n')) != NULL) - *p = ' '; - } - - /* - ** If there is a check ruleset, verify it against the header. - */ - - if (!def && hi->hi_ruleset != NULL) - (void) rscheck(hi->hi_ruleset, fvalue, NULL, e); - - /* - ** Drop explicit From: if same as what we would generate. - ** This is to make MH (which doesn't always give a full name) - ** insert the full name information in all circumstances. - */ - - p = "resent-from"; - if (!bitset(EF_RESENT, e->e_flags)) - p += 7; - if (!def && !headeronly && !bitset(EF_QUEUERUN, e->e_flags) && - strcasecmp(fname, p) == 0) - { - if (tTd(31, 2)) - { - printf("comparing header from (%s) against default (%s or %s)\n", - fvalue, e->e_from.q_paddr, e->e_from.q_user); - } - if (e->e_from.q_paddr != NULL && - (strcmp(fvalue, e->e_from.q_paddr) == 0 || - strcmp(fvalue, e->e_from.q_user) == 0)) - return hi->hi_flags; - } - - /* delete default value for this header */ - for (hp = hdrp; (h = *hp) != NULL; hp = &h->h_link) - { - if (strcasecmp(fname, h->h_field) == 0 && - bitset(H_DEFAULT, h->h_flags) && - !bitset(H_FORCE, h->h_flags)) - { - if (nullheader) - { - /* user-supplied value was null */ - return 0; - } - h->h_value = NULL; - if (!cond) - { - /* copy conditions from default case */ - bcopy((char *)h->h_mflags, (char *)mopts, - sizeof mopts); - } - } - } - - /* create a new node */ - h = (HDR *) xalloc(sizeof *h); - h->h_field = newstr(fname); - h->h_value = newstr(fvalue); - h->h_link = NULL; - bcopy((char *) mopts, (char *) h->h_mflags, sizeof mopts); - *hp = h; - h->h_flags = hi->hi_flags; - - /* strip EOH flag if parsing MIME headers */ - if (headeronly) - h->h_flags &= ~H_EOH; - if (def) - h->h_flags |= H_DEFAULT; - if (cond) - h->h_flags |= H_CHECK; - - /* hack to see if this is a new format message */ - if (!def && !headeronly && bitset(H_RCPT|H_FROM, h->h_flags) && - (strchr(fvalue, ',') != NULL || strchr(fvalue, '(') != NULL || - strchr(fvalue, '<') != NULL || strchr(fvalue, ';') != NULL)) - { - e->e_flags &= ~EF_OLDSTYLE; - } - - return h->h_flags; -} -/* -** ADDHEADER -- add a header entry to the end of the queue. -** -** This bypasses the special checking of chompheader. -** -** Parameters: -** field -- the name of the header field. -** value -- the value of the field. -** hp -- an indirect pointer to the header structure list. -** -** Returns: -** none. -** -** Side Effects: -** adds the field on the list of headers for this envelope. -*/ - -void -addheader(field, value, hdrlist) - char *field; - char *value; - HDR **hdrlist; -{ - register HDR *h; - STAB *s; - HDR **hp; - - /* find info struct */ - s = stab(field, ST_HEADER, ST_FIND); - - /* find current place in list -- keep back pointer? */ - for (hp = hdrlist; (h = *hp) != NULL; hp = &h->h_link) - { - if (strcasecmp(field, h->h_field) == 0) - break; - } - - /* allocate space for new header */ - h = (HDR *) xalloc(sizeof *h); - h->h_field = field; - h->h_value = newstr(value); - h->h_link = *hp; - h->h_flags = H_DEFAULT; - if (s != NULL) - h->h_flags |= s->s_header.hi_flags; - clrbitmap(h->h_mflags); - *hp = h; -} -/* -** HVALUE -- return value of a header. -** -** Only "real" fields (i.e., ones that have not been supplied -** as a default) are used. -** -** Parameters: -** field -- the field name. -** header -- the header list. -** -** Returns: -** pointer to the value part. -** NULL if not found. -** -** Side Effects: -** none. -*/ - -char * -hvalue(field, header) - char *field; - HDR *header; -{ - register HDR *h; - - for (h = header; h != NULL; h = h->h_link) - { - if (!bitset(H_DEFAULT, h->h_flags) && - strcasecmp(h->h_field, field) == 0) - return (h->h_value); - } - return (NULL); -} -/* -** ISHEADER -- predicate telling if argument is a header. -** -** A line is a header if it has a single word followed by -** optional white space followed by a colon. -** -** Header fields beginning with two dashes, although technically -** permitted by RFC822, are automatically rejected in order -** to make MIME work out. Without this we could have a technically -** legal header such as ``--"foo:bar"'' that would also be a legal -** MIME separator. -** -** Parameters: -** h -- string to check for possible headerness. -** -** Returns: -** TRUE if h is a header. -** FALSE otherwise. -** -** Side Effects: -** none. -*/ - -bool -isheader(h) - char *h; -{ - register char *s = h; - - if (s[0] == '-' && s[1] == '-') - return FALSE; - - while (*s > ' ' && *s != ':' && *s != '\0') - s++; - - if (h == s) - return FALSE; - - /* following technically violates RFC822 */ - while (isascii(*s) && isspace(*s)) - s++; - - return (*s == ':'); -} -/* -** EATHEADER -- run through the stored header and extract info. -** -** Parameters: -** e -- the envelope to process. -** full -- if set, do full processing (e.g., compute -** message priority). This should not be set -** when reading a queue file because some info -** needed to compute the priority is wrong. -** -** Returns: -** none. -** -** Side Effects: -** Sets a bunch of global variables from information -** in the collected header. -** Aborts the message if the hop count is exceeded. -*/ - -void -eatheader(e, full) - register ENVELOPE *e; - bool full; -{ - register HDR *h; - register char *p; - int hopcnt = 0; - char *msgid; - char buf[MAXLINE]; - extern int priencode __P((char *)); - - /* - ** Set up macros for possible expansion in headers. - */ - - define('f', e->e_sender, e); - define('g', e->e_sender, e); - if (e->e_origrcpt != NULL && *e->e_origrcpt != '\0') - define('u', e->e_origrcpt, e); - else - define('u', NULL, e); - - /* full name of from person */ - p = hvalue("full-name", e->e_header); - if (p != NULL) - { - extern bool rfc822_string __P((char *)); - - if (!rfc822_string(p)) - { - extern char *addquotes __P((char *)); - - /* - ** Quote a full name with special characters - ** as a comment so crackaddr() doesn't destroy - ** the name portion of the address. - */ - p = addquotes(p); - } - define('x', p, e); - } - - if (tTd(32, 1)) - printf("----- collected header -----\n"); - msgid = NULL; - for (h = e->e_header; h != NULL; h = h->h_link) - { - if (tTd(32, 1)) - printf("%s: ", h->h_field); - if (h->h_value == NULL) - { - if (tTd(32, 1)) - printf("<NULL>\n"); - continue; - } - - /* do early binding */ - if (bitset(H_DEFAULT, h->h_flags)) - { - if (tTd(32, 1)) - { - printf("("); - xputs(h->h_value); - printf(") "); - } - expand(h->h_value, buf, sizeof buf, e); - if (buf[0] != '\0') - { - if (bitset(H_FROM, h->h_flags)) - { - extern char *crackaddr __P((char *)); - - expand(crackaddr(buf), buf, sizeof buf, e); - } - h->h_value = newstr(buf); - h->h_flags &= ~H_DEFAULT; - } - } - - if (tTd(32, 1)) - { - xputs(h->h_value); - printf("\n"); - } - - /* count the number of times it has been processed */ - if (bitset(H_TRACE, h->h_flags)) - hopcnt++; - - /* send to this person if we so desire */ - if (GrabTo && bitset(H_RCPT, h->h_flags) && - !bitset(H_DEFAULT, h->h_flags) && - (!bitset(EF_RESENT, e->e_flags) || bitset(H_RESENT, h->h_flags))) - { -#if 0 - int saveflags = e->e_flags; -#endif - - (void) sendtolist(h->h_value, NULLADDR, - &e->e_sendqueue, 0, e); - -#if 0 - /* - ** Change functionality so a fatal error on an - ** address doesn't affect the entire envelope. - */ - - /* delete fatal errors generated by this address */ - if (!bitset(EF_FATALERRS, saveflags)) - e->e_flags &= ~EF_FATALERRS; -#endif - } - - /* save the message-id for logging */ - p = "resent-message-id"; - if (!bitset(EF_RESENT, e->e_flags)) - p += 7; - if (strcasecmp(h->h_field, p) == 0) - { - msgid = h->h_value; - while (isascii(*msgid) && isspace(*msgid)) - msgid++; - } - } - if (tTd(32, 1)) - printf("----------------------------\n"); - - /* if we are just verifying (that is, sendmail -t -bv), drop out now */ - if (OpMode == MD_VERIFY) - return; - - /* store hop count */ - if (hopcnt > e->e_hopcount) - e->e_hopcount = hopcnt; - - /* message priority */ - p = hvalue("precedence", e->e_header); - if (p != NULL) - e->e_class = priencode(p); - if (e->e_class < 0) - e->e_timeoutclass = TOC_NONURGENT; - else if (e->e_class > 0) - e->e_timeoutclass = TOC_URGENT; - if (full) - { - e->e_msgpriority = e->e_msgsize - - e->e_class * WkClassFact - + e->e_nrcpts * WkRecipFact; - } - - /* message timeout priority */ - p = hvalue("priority", e->e_header); - if (p != NULL) - { - /* (this should be in the configuration file) */ - if (strcasecmp(p, "urgent") == 0) - e->e_timeoutclass = TOC_URGENT; - else if (strcasecmp(p, "normal") == 0) - e->e_timeoutclass = TOC_NORMAL; - else if (strcasecmp(p, "non-urgent") == 0) - e->e_timeoutclass = TOC_NONURGENT; - } - - /* date message originated */ - p = hvalue("posted-date", e->e_header); - if (p == NULL) - p = hvalue("date", e->e_header); - if (p != NULL) - define('a', p, e); - - /* check to see if this is a MIME message */ - if ((e->e_bodytype != NULL && - strcasecmp(e->e_bodytype, "8BITMIME") == 0) || - hvalue("MIME-Version", e->e_header) != NULL) - { - e->e_flags |= EF_IS_MIME; - if (HasEightBits) - e->e_bodytype = "8BITMIME"; - } - else if ((p = hvalue("Content-Type", e->e_header)) != NULL) - { - /* this may be an RFC 1049 message */ - p = strpbrk(p, ";/"); - if (p == NULL || *p == ';') - { - /* yep, it is */ - e->e_flags |= EF_DONT_MIME; - } - } - - /* - ** From person in antiquated ARPANET mode - ** required by UK Grey Book e-mail gateways (sigh) - */ - - if (OpMode == MD_ARPAFTP) - { - register struct hdrinfo *hi; - - for (hi = HdrInfo; hi->hi_field != NULL; hi++) - { - if (bitset(H_FROM, hi->hi_flags) && - (!bitset(H_RESENT, hi->hi_flags) || - bitset(EF_RESENT, e->e_flags)) && - (p = hvalue(hi->hi_field, e->e_header)) != NULL) - break; - } - if (hi->hi_field != NULL) - { - if (tTd(32, 2)) - printf("eatheader: setsender(*%s == %s)\n", - hi->hi_field, p); - setsender(p, e, NULL, '\0', TRUE); - } - } - - /* - ** Log collection information. - */ - - if (bitset(EF_LOGSENDER, e->e_flags) && LogLevel > 4) - logsender(e, msgid); - e->e_flags &= ~EF_LOGSENDER; -} -/* -** LOGSENDER -- log sender information -** -** Parameters: -** e -- the envelope to log -** msgid -- the message id -** -** Returns: -** none -*/ - -void -logsender(e, msgid) - register ENVELOPE *e; - char *msgid; -{ - char *name; - register char *sbp; - register char *p; - int l; - char hbuf[MAXNAME + 1]; - char sbuf[MAXLINE + 1]; - char mbuf[MAXNAME + 1]; - - /* don't allow newlines in the message-id */ - if (msgid != NULL) - { - l = strlen(msgid); - if (l > sizeof mbuf - 1) - l = sizeof mbuf - 1; - bcopy(msgid, mbuf, l); - mbuf[l] = '\0'; - p = mbuf; - while ((p = strchr(p, '\n')) != NULL) - *p++ = ' '; - } - - if (bitset(EF_RESPONSE, e->e_flags)) - name = "[RESPONSE]"; - else if ((name = macvalue('_', e)) != NULL) - ; - else if (RealHostName == NULL) - name = "localhost"; - else if (RealHostName[0] == '[') - name = RealHostName; - else - { - name = hbuf; - (void) snprintf(hbuf, sizeof hbuf, "%.80s", RealHostName); - if (RealHostAddr.sa.sa_family != 0) - { - p = &hbuf[strlen(hbuf)]; - (void) snprintf(p, SPACELEFT(hbuf, p), " (%.100s)", - anynet_ntoa(&RealHostAddr)); - } - } - - /* some versions of syslog only take 5 printf args */ -# if (SYSLOG_BUFSIZE) >= 256 - sbp = sbuf; - snprintf(sbp, SPACELEFT(sbuf, sbp), - "from=%.200s, size=%ld, class=%d, pri=%ld, nrcpts=%d", - e->e_from.q_paddr == NULL ? "<NONE>" : e->e_from.q_paddr, - e->e_msgsize, e->e_class, e->e_msgpriority, e->e_nrcpts); - sbp += strlen(sbp); - if (msgid != NULL) - { - snprintf(sbp, SPACELEFT(sbuf, sbp), ", msgid=%.100s", mbuf); - sbp += strlen(sbp); - } - if (e->e_bodytype != NULL) - { - (void) snprintf(sbp, SPACELEFT(sbuf, sbp), ", bodytype=%.20s", - e->e_bodytype); - sbp += strlen(sbp); - } - p = macvalue('r', e); - if (p != NULL) - (void) snprintf(sbp, SPACELEFT(sbuf, sbp), ", proto=%.20s", p); - sm_syslog(LOG_INFO, e->e_id, - "%.850s, relay=%.100s", - sbuf, name); - -# else /* short syslog buffer */ - - sm_syslog(LOG_INFO, e->e_id, - "from=%s", - e->e_from.q_paddr == NULL ? "<NONE>" - : shortenstring(e->e_from.q_paddr, 83)); - sm_syslog(LOG_INFO, e->e_id, - "size=%ld, class=%ld, pri=%ld, nrcpts=%d", - e->e_msgsize, e->e_class, e->e_msgpriority, e->e_nrcpts); - if (msgid != NULL) - sm_syslog(LOG_INFO, e->e_id, - "msgid=%s", - shortenstring(mbuf, 83)); - sbp = sbuf; - *sbp = '\0'; - if (e->e_bodytype != NULL) - { - snprintf(sbp, SPACELEFT(sbuf, sbp), "bodytype=%.20s, ", e->e_bodytype); - sbp += strlen(sbp); - } - p = macvalue('r', e); - if (p != NULL) - { - snprintf(sbp, SPACELEFT(sbuf, sbp), "proto=%.20s, ", p); - sbp += strlen(sbp); - } - sm_syslog(LOG_INFO, e->e_id, - "%.400srelay=%.100s", sbuf, name); -# endif -} -/* -** PRIENCODE -- encode external priority names into internal values. -** -** Parameters: -** p -- priority in ascii. -** -** Returns: -** priority as a numeric level. -** -** Side Effects: -** none. -*/ - -int -priencode(p) - char *p; -{ - register int i; - - for (i = 0; i < NumPriorities; i++) - { - if (!strcasecmp(p, Priorities[i].pri_name)) - return (Priorities[i].pri_val); - } - - /* unknown priority */ - return (0); -} -/* -** CRACKADDR -- parse an address and turn it into a macro -** -** This doesn't actually parse the address -- it just extracts -** it and replaces it with "$g". The parse is totally ad hoc -** and isn't even guaranteed to leave something syntactically -** identical to what it started with. However, it does leave -** something semantically identical. -** -** This algorithm has been cleaned up to handle a wider range -** of cases -- notably quoted and backslash escaped strings. -** This modification makes it substantially better at preserving -** the original syntax. -** -** Parameters: -** addr -- the address to be cracked. -** -** Returns: -** a pointer to the new version. -** -** Side Effects: -** none. -** -** Warning: -** The return value is saved in local storage and should -** be copied if it is to be reused. -*/ - -char * -crackaddr(addr) - register char *addr; -{ - register char *p; - register char c; - int cmtlev; - int realcmtlev; - int anglelev, realanglelev; - int copylev; - int bracklev; - bool qmode; - bool realqmode; - bool skipping; - bool putgmac = FALSE; - bool quoteit = FALSE; - bool gotangle = FALSE; - bool gotcolon = FALSE; - register char *bp; - char *buflim; - char *bufhead; - char *addrhead; - static char buf[MAXNAME + 1]; - - if (tTd(33, 1)) - printf("crackaddr(%s)\n", addr); - - /* strip leading spaces */ - while (*addr != '\0' && isascii(*addr) && isspace(*addr)) - addr++; - - /* - ** Start by assuming we have no angle brackets. This will be - ** adjusted later if we find them. - */ - - bp = bufhead = buf; - buflim = &buf[sizeof buf - 7]; - p = addrhead = addr; - copylev = anglelev = realanglelev = cmtlev = realcmtlev = 0; - bracklev = 0; - qmode = realqmode = FALSE; - - while ((c = *p++) != '\0') - { - /* - ** If the buffer is overful, go into a special "skipping" - ** mode that tries to keep legal syntax but doesn't actually - ** output things. - */ - - skipping = bp >= buflim; - - if (copylev > 0 && !skipping) - *bp++ = c; - - /* check for backslash escapes */ - if (c == '\\') - { - /* arrange to quote the address */ - if (cmtlev <= 0 && !qmode) - quoteit = TRUE; - - if ((c = *p++) == '\0') - { - /* too far */ - p--; - goto putg; - } - if (copylev > 0 && !skipping) - *bp++ = c; - goto putg; - } - - /* check for quoted strings */ - if (c == '"' && cmtlev <= 0) - { - qmode = !qmode; - if (copylev > 0 && !skipping) - realqmode = !realqmode; - continue; - } - if (qmode) - goto putg; - - /* check for comments */ - if (c == '(') - { - cmtlev++; - - /* allow space for closing paren */ - if (!skipping) - { - buflim--; - realcmtlev++; - if (copylev++ <= 0) - { - if (bp != bufhead) - *bp++ = ' '; - *bp++ = c; - } - } - } - if (cmtlev > 0) - { - if (c == ')') - { - cmtlev--; - copylev--; - if (!skipping) - { - realcmtlev--; - buflim++; - } - } - continue; - } - else if (c == ')') - { - /* syntax error: unmatched ) */ - if (copylev > 0 && !skipping) - bp--; - } - - /* count nesting on [ ... ] (for IPv6 domain literals) */ - if (c == '[') - bracklev++; - else if (c == ']') - bracklev--; - - /* check for group: list; syntax */ - if (c == ':' && anglelev <= 0 && bracklev <= 0 && - !gotcolon && !ColonOkInAddr) - { - register char *q; - - /* - ** Check for DECnet phase IV ``::'' (host::user) - ** or ** DECnet phase V ``:.'' syntaxes. The latter - ** covers ``user@DEC:.tay.myhost'' and - ** ``DEC:.tay.myhost::user'' syntaxes (bletch). - */ - - if (*p == ':' || *p == '.') - { - if (cmtlev <= 0 && !qmode) - quoteit = TRUE; - if (copylev > 0 && !skipping) - { - *bp++ = c; - *bp++ = *p; - } - p++; - goto putg; - } - - gotcolon = TRUE; - - bp = bufhead; - if (quoteit) - { - *bp++ = '"'; - - /* back up over the ':' and any spaces */ - --p; - while (isascii(*--p) && isspace(*p)) - continue; - p++; - } - for (q = addrhead; q < p; ) - { - c = *q++; - if (bp < buflim) - { - if (quoteit && c == '"') - *bp++ = '\\'; - *bp++ = c; - } - } - if (quoteit) - { - if (bp == &bufhead[1]) - bp--; - else - *bp++ = '"'; - while ((c = *p++) != ':') - { - if (bp < buflim) - *bp++ = c; - } - *bp++ = c; - } - - /* any trailing white space is part of group: */ - while (isascii(*p) && isspace(*p) && bp < buflim) - *bp++ = *p++; - copylev = 0; - putgmac = quoteit = FALSE; - bufhead = bp; - addrhead = p; - continue; - } - - if (c == ';' && copylev <= 0 && !ColonOkInAddr) - { - if (bp < buflim) - *bp++ = c; - } - - /* check for characters that may have to be quoted */ - if (strchr(MustQuoteChars, c) != NULL) - { - /* - ** If these occur as the phrase part of a <> - ** construct, but are not inside of () or already - ** quoted, they will have to be quoted. Note that - ** now (but don't actually do the quoting). - */ - - if (cmtlev <= 0 && !qmode) - quoteit = TRUE; - } - - /* check for angle brackets */ - if (c == '<') - { - register char *q; - - /* assume first of two angles is bogus */ - if (gotangle) - quoteit = TRUE; - gotangle = TRUE; - - /* oops -- have to change our mind */ - anglelev = 1; - if (!skipping) - realanglelev = 1; - - bp = bufhead; - if (quoteit) - { - *bp++ = '"'; - - /* back up over the '<' and any spaces */ - --p; - while (isascii(*--p) && isspace(*p)) - continue; - p++; - } - for (q = addrhead; q < p; ) - { - c = *q++; - if (bp < buflim) - { - if (quoteit && c == '"') - *bp++ = '\\'; - *bp++ = c; - } - } - if (quoteit) - { - if (bp == &buf[1]) - bp--; - else - *bp++ = '"'; - while ((c = *p++) != '<') - { - if (bp < buflim) - *bp++ = c; - } - *bp++ = c; - } - copylev = 0; - putgmac = quoteit = FALSE; - continue; - } - - if (c == '>') - { - if (anglelev > 0) - { - anglelev--; - if (!skipping) - { - realanglelev--; - buflim++; - } - } - else if (!skipping) - { - /* syntax error: unmatched > */ - if (copylev > 0) - bp--; - quoteit = TRUE; - continue; - } - if (copylev++ <= 0) - *bp++ = c; - continue; - } - - /* must be a real address character */ - putg: - if (copylev <= 0 && !putgmac) - { - if (bp > bufhead && bp[-1] == ')') - *bp++ = ' '; - *bp++ = MACROEXPAND; - *bp++ = 'g'; - putgmac = TRUE; - } - } - - /* repair any syntactic damage */ - if (realqmode) - *bp++ = '"'; - while (realcmtlev-- > 0) - *bp++ = ')'; - while (realanglelev-- > 0) - *bp++ = '>'; - *bp++ = '\0'; - - if (tTd(33, 1)) - { - printf("crackaddr=>`"); - xputs(buf); - printf("'\n"); - } - - return (buf); -} -/* -** PUTHEADER -- put the header part of a message from the in-core copy -** -** Parameters: -** mci -- the connection information. -** h -- the header to put. -** e -- envelope to use. -** flags -- MIME conversion flags. -** -** Returns: -** none. -** -** Side Effects: -** none. -*/ - -/* - * Macro for fast max (not available in e.g. DG/UX, 386/ix). - */ -#ifndef MAX -# define MAX(a,b) (((a)>(b))?(a):(b)) -#endif - -void -putheader(mci, hdr, e, flags) - register MCI *mci; - HDR *hdr; - register ENVELOPE *e; - int flags; -{ - register HDR *h; - char buf[MAX(MAXLINE,BUFSIZ)]; - char obuf[MAXLINE]; - - if (tTd(34, 1)) - printf("--- putheader, mailer = %s ---\n", - mci->mci_mailer->m_name); - - /* - ** If we're in MIME mode, we're not really in the header of the - ** message, just the header of one of the parts of the body of - ** the message. Therefore MCIF_INHEADER should not be turned on. - */ - - if (!bitset(MCIF_INMIME, mci->mci_flags)) - mci->mci_flags |= MCIF_INHEADER; - - for (h = hdr; h != NULL; h = h->h_link) - { - register char *p = h->h_value; - extern bool bitintersect __P((BITMAP, BITMAP)); - - if (tTd(34, 11)) - { - printf(" %s: ", h->h_field); - xputs(p); - } - -#if _FFR_MAX_MIME_HEADER_LENGTH - /* heuristic shortening of MIME fields to avoid MUA overflows */ - if (MaxMimeFieldLength > 0 && - wordinclass(h->h_field, - macid("{checkMIMEFieldHeaders}", NULL))) - { - extern bool fix_mime_header __P((char *)); - - if (fix_mime_header(h->h_value)) - { - sm_syslog(LOG_ALERT, e->e_id, - "Truncated MIME %s header due to field size (possible attack)", - h->h_field); - if (tTd(34, 11)) - printf(" truncated MIME %s header due to field size (possible attack)\n", - h->h_field); - } - } - - if (MaxMimeHeaderLength > 0 && - wordinclass(h->h_field, - macid("{checkMIMETextHeaders}", NULL))) - { - if (strlen(h->h_value) > MaxMimeHeaderLength) - { - h->h_value[MaxMimeHeaderLength - 1] = '\0'; - sm_syslog(LOG_ALERT, e->e_id, - "Truncated long MIME %s header (possible attack)", - h->h_field); - if (tTd(34, 11)) - printf(" truncated long MIME %s header (possible attack)\n", - h->h_field); - } - } - - if (MaxMimeHeaderLength > 0 && - wordinclass(h->h_field, - macid("{checkMIMEHeaders}", NULL))) - { - extern bool shorten_rfc822_string __P((char *, int)); - - if (shorten_rfc822_string(h->h_value, MaxMimeHeaderLength)) - { - sm_syslog(LOG_ALERT, e->e_id, - "Truncated long MIME %s header (possible attack)", - h->h_field); - if (tTd(34, 11)) - printf(" truncated long MIME %s header (possible attack)\n", - h->h_field); - } - } -#endif - - /* - ** Suppress Content-Transfer-Encoding: if we are MIMEing - ** and we are potentially converting from 8 bit to 7 bit - ** MIME. If converting, add a new CTE header in - ** mime8to7(). - */ - if (bitset(H_CTE, h->h_flags) && - bitset(MCIF_CVT8TO7|MCIF_CVT7TO8|MCIF_INMIME, - mci->mci_flags) && - !bitset(M87F_NO8TO7, flags)) - { - if (tTd(34, 11)) - printf(" (skipped (content-transfer-encoding))\n"); - continue; - } - - if (bitset(MCIF_INMIME, mci->mci_flags)) - { - if (tTd(34, 11)) - printf("\n"); - put_vanilla_header(h, p, mci); - continue; - } - - if (bitset(H_CHECK|H_ACHECK, h->h_flags) && - !bitintersect(h->h_mflags, mci->mci_mailer->m_flags)) - { - if (tTd(34, 11)) - printf(" (skipped)\n"); - continue; - } - - /* handle Resent-... headers specially */ - if (bitset(H_RESENT, h->h_flags) && !bitset(EF_RESENT, e->e_flags)) - { - if (tTd(34, 11)) - printf(" (skipped (resent))\n"); - continue; - } - - /* suppress return receipts if requested */ - if (bitset(H_RECEIPTTO, h->h_flags) && -#if _FFR_DSN_RRT_OPTION - (RrtImpliesDsn || bitset(EF_NORECEIPT, e->e_flags))) -#else - bitset(EF_NORECEIPT, e->e_flags)) -#endif - { - if (tTd(34, 11)) - printf(" (skipped (receipt))\n"); - continue; - } - - /* macro expand value if generated internally */ - if (bitset(H_DEFAULT, h->h_flags)) - { - expand(p, buf, sizeof buf, e); - p = buf; - if (*p == '\0') - { - if (tTd(34, 11)) - printf(" (skipped -- null value)\n"); - continue; - } - } - - if (bitset(H_BCC, h->h_flags)) - { - /* Bcc: field -- either truncate or delete */ - if (bitset(EF_DELETE_BCC, e->e_flags)) - { - if (tTd(34, 11)) - printf(" (skipped -- bcc)\n"); - } - else - { - /* no other recipient headers: truncate value */ - (void) snprintf(obuf, sizeof obuf, "%s:", - h->h_field); - putline(obuf, mci); - } - continue; - } - - if (tTd(34, 11)) - printf("\n"); - - if (bitset(H_FROM|H_RCPT, h->h_flags)) - { - /* address field */ - bool oldstyle = bitset(EF_OLDSTYLE, e->e_flags); - - if (bitset(H_FROM, h->h_flags)) - oldstyle = FALSE; - commaize(h, p, oldstyle, mci, e); - } - else - { - put_vanilla_header(h, p, mci); - } - } - - /* - ** If we are converting this to a MIME message, add the - ** MIME headers. - */ - -#if MIME8TO7 - if (bitset(MM_MIME8BIT, MimeMode) && - bitset(EF_HAS8BIT, e->e_flags) && - !bitset(EF_DONT_MIME, e->e_flags) && - !bitnset(M_8BITS, mci->mci_mailer->m_flags) && - !bitset(MCIF_CVT8TO7|MCIF_CVT7TO8, mci->mci_flags)) - { - if (hvalue("MIME-Version", e->e_header) == NULL) - putline("MIME-Version: 1.0", mci); - if (hvalue("Content-Type", e->e_header) == NULL) - { - snprintf(obuf, sizeof obuf, - "Content-Type: text/plain; charset=%s", - defcharset(e)); - putline(obuf, mci); - } - if (hvalue("Content-Transfer-Encoding", e->e_header) == NULL) - putline("Content-Transfer-Encoding: 8bit", mci); - } -#endif -} -/* -** PUT_VANILLA_HEADER -- output a fairly ordinary header -** -** Parameters: -** h -- the structure describing this header -** v -- the value of this header -** mci -- the connection info for output -** -** Returns: -** none. -*/ - -void -put_vanilla_header(h, v, mci) - HDR *h; - char *v; - MCI *mci; -{ - register char *nlp; - register char *obp; - int putflags; - char obuf[MAXLINE]; - - putflags = PXLF_HEADER; -#if _FFR_7BITHDRS - if (bitnset(M_7BITHDRS, mci->mci_mailer->m_flags)) - putflags |= PXLF_STRIP8BIT; -#endif - (void) snprintf(obuf, sizeof obuf, "%.200s: ", h->h_field); - obp = obuf + strlen(obuf); - while ((nlp = strchr(v, '\n')) != NULL) - { - int l; - - l = nlp - v; - if (SPACELEFT(obuf, obp) - 1 < l) - l = SPACELEFT(obuf, obp) - 1; - - snprintf(obp, SPACELEFT(obuf, obp), "%.*s", l, v); - putxline(obuf, strlen(obuf), mci, putflags); - v += l + 1; - obp = obuf; - if (*v != ' ' && *v != '\t') - *obp++ = ' '; - } - snprintf(obp, SPACELEFT(obuf, obp), "%.*s", - sizeof obuf - (obp - obuf) - 1, v); - putxline(obuf, strlen(obuf), mci, putflags); -} -/* -** COMMAIZE -- output a header field, making a comma-translated list. -** -** Parameters: -** h -- the header field to output. -** p -- the value to put in it. -** oldstyle -- TRUE if this is an old style header. -** mci -- the connection information. -** e -- the envelope containing the message. -** -** Returns: -** none. -** -** Side Effects: -** outputs "p" to file "fp". -*/ - -void -commaize(h, p, oldstyle, mci, e) - register HDR *h; - register char *p; - bool oldstyle; - register MCI *mci; - register ENVELOPE *e; -{ - register char *obp; - int opos; - int omax; - bool firstone = TRUE; - int putflags = PXLF_HEADER; - char obuf[MAXLINE + 3]; - - /* - ** Output the address list translated by the - ** mailer and with commas. - */ - - if (tTd(14, 2)) - printf("commaize(%s: %s)\n", h->h_field, p); - -#if _FFR_7BITHDRS - if (bitnset(M_7BITHDRS, mci->mci_mailer->m_flags)) - putflags |= PXLF_STRIP8BIT; -#endif - - obp = obuf; - (void) snprintf(obp, SPACELEFT(obuf, obp), "%.200s: ", h->h_field); - opos = strlen(h->h_field) + 2; - if (opos > 202) - opos = 202; - obp += opos; - omax = mci->mci_mailer->m_linelimit - 2; - if (omax < 0 || omax > 78) - omax = 78; - - /* - ** Run through the list of values. - */ - - while (*p != '\0') - { - register char *name; - register int c; - char savechar; - int flags; - auto int stat; - - /* - ** Find the end of the name. New style names - ** end with a comma, old style names end with - ** a space character. However, spaces do not - ** necessarily delimit an old-style name -- at - ** signs mean keep going. - */ - - /* find end of name */ - while ((isascii(*p) && isspace(*p)) || *p == ',') - p++; - name = p; - for (;;) - { - auto char *oldp; - char pvpbuf[PSBUFSIZE]; - - (void) prescan(p, oldstyle ? ' ' : ',', pvpbuf, - sizeof pvpbuf, &oldp, NULL); - p = oldp; - - /* look to see if we have an at sign */ - while (*p != '\0' && isascii(*p) && isspace(*p)) - p++; - - if (*p != '@') - { - p = oldp; - break; - } - p += *p == '@' ? 1 : 2; - while (*p != '\0' && isascii(*p) && isspace(*p)) - p++; - } - /* at the end of one complete name */ - - /* strip off trailing white space */ - while (p >= name && - ((isascii(*p) && isspace(*p)) || *p == ',' || *p == '\0')) - p--; - if (++p == name) - continue; - savechar = *p; - *p = '\0'; - - /* translate the name to be relative */ - flags = RF_HEADERADDR|RF_ADDDOMAIN; - if (bitset(H_FROM, h->h_flags)) - flags |= RF_SENDERADDR; -#if USERDB - else if (e->e_from.q_mailer != NULL && - bitnset(M_UDBRECIPIENT, e->e_from.q_mailer->m_flags)) - { - extern char *udbsender __P((char *)); - char *q; - - q = udbsender(name); - if (q != NULL) - name = q; - } -#endif - stat = EX_OK; - name = remotename(name, mci->mci_mailer, flags, &stat, e); - if (*name == '\0') - { - *p = savechar; - continue; - } - name = denlstring(name, FALSE, TRUE); - - /* output the name with nice formatting */ - opos += strlen(name); - if (!firstone) - opos += 2; - if (opos > omax && !firstone) - { - snprintf(obp, SPACELEFT(obuf, obp), ",\n"); - putxline(obuf, strlen(obuf), mci, putflags); - obp = obuf; - (void) strcpy(obp, " "); - opos = strlen(obp); - obp += opos; - opos += strlen(name); - } - else if (!firstone) - { - snprintf(obp, SPACELEFT(obuf, obp), ", "); - obp += 2; - } - - while ((c = *name++) != '\0' && obp < &obuf[MAXLINE]) - *obp++ = c; - firstone = FALSE; - *p = savechar; - } - *obp = '\0'; - putxline(obuf, strlen(obuf), mci, putflags); -} -/* -** COPYHEADER -- copy header list -** -** This routine is the equivalent of newstr for header lists -** -** Parameters: -** header -- list of header structures to copy. -** -** Returns: -** a copy of 'header'. -** -** Side Effects: -** none. -*/ - -HDR * -copyheader(header) - register HDR *header; -{ - register HDR *newhdr; - HDR *ret; - register HDR **tail = &ret; - - while (header != NULL) - { - newhdr = (HDR *) xalloc(sizeof(HDR)); - STRUCTCOPY(*header, *newhdr); - *tail = newhdr; - tail = &newhdr->h_link; - header = header->h_link; - } - *tail = NULL; - - return ret; -} -/* -** FIX_MIME_HEADER -- possibly truncate/rebalance parameters in a MIME header -** -** Run through all of the parameters of a MIME header and -** possibly truncate and rebalance the parameter according -** to MaxMimeFieldLength. -** -** Parameters: -** string -- the full header -** -** Returns: -** TRUE if the header was modified, FALSE otherwise -** -** Side Effects: -** string modified in place -*/ - -bool -fix_mime_header(string) - char *string; -{ - bool modified = FALSE; - char *begin = string; - char *end; - extern char *find_character __P((char *, char)); - extern bool shorten_rfc822_string __P((char *, int)); - - if (string == NULL || *string == '\0') - return FALSE; - - /* Split on each ';' */ - while ((end = find_character(begin, ';')) != NULL) - { - char save = *end; - char *bp; - - *end = '\0'; - - /* Shorten individual parameter */ - if (shorten_rfc822_string(begin, MaxMimeFieldLength)) - modified = TRUE; - - /* Collapse the possibly shortened string with rest */ - bp = begin + strlen(begin); - if (bp != end) - { - char *ep = end; - - *end = save; - end = bp; - - /* copy character by character due to overlap */ - while (*ep != '\0') - *bp++ = *ep++; - *bp = '\0'; - } - else - *end = save; - if (*end == '\0') - break; - - /* Move past ';' */ - begin = end + 1; - } - return modified; -} diff --git a/src/ldap_map.h b/src/ldap_map.h deleted file mode 100644 index 7d40329..0000000 --- a/src/ldap_map.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -/* -** Support for LDAP. -** -** Contributed by Booker C. Bense <bbense+ldap@stanford.edu>. -** Please go to him for support -- since I (Eric) don't run LDAP, I -** can't help you at all. -** -** @(#)ldap_map.h 8.12 (Berkeley) 2/2/1999 -*/ - -#ifndef _LDAP_MAP_H -#define _LDAP_MAP_H - -#include <sys/time.h> - -struct ldap_map_struct -{ - /* needed for ldap_open */ - char *ldaphost; - int ldapport; - - /* Options set in ld struct before ldap_bind_s */ - int deref; - int timelimit; - int sizelimit; - int ldap_options; - - /* args for ldap_bind_s */ - LDAP *ld; - char *binddn; - char *passwd; - int method; - - /* args for ldap_search_st */ - char *base; - int scope; - char *filter; - char *attr[2]; - int attrsonly; - struct timeval timeout; - LDAPMessage *res; -}; - -typedef struct ldap_map_struct LDAP_MAP_STRUCT; - -#define DEFAULT_LDAP_MAP_PORT LDAP_PORT -#define DEFAULT_LDAP_MAP_SCOPE LDAP_SCOPE_SUBTREE -#define DEFAULT_LDAP_MAP_BINDDN NULL -#define DEFAULT_LDAP_MAP_PASSWD NULL -#define DEFAULT_LDAP_MAP_METHOD LDAP_AUTH_SIMPLE -#define DEFAULT_LDAP_MAP_TIMELIMIT 5 -#define DEFAULT_LDAP_MAP_DEREF LDAP_DEREF_NEVER -#define DEFAULT_LDAP_MAP_SIZELIMIT 0 -#define DEFAULT_LDAP_MAP_ATTRSONLY 0 -#define LDAP_MAP_MAX_FILTER 1024 -#ifdef LDAP_REFERRALS -# define DEFAULT_LDAP_MAP_LDAP_OPTIONS LDAP_OPT_REFERRALS -#else /* LDAP_REFERRALS */ -# define DEFAULT_LDAP_MAP_LDAP_OPTIONS 0 -#endif /* LDAP_REFERRALS */ - -/* -** ldap_init(3) is broken in Umich 3.x and OpenLDAP 1.0/1.1. -** Use the lack of LDAP_OPT_SIZELIMIT to detect old API implementations -** and assume (falsely) that all old API implementations are broken. -** (OpenLDAP 1.2 and later have a working ldap_init(), add -DUSE_LDAP_INIT) -*/ - -#if defined(LDAP_OPT_SIZELIMIT) && !defined(USE_LDAP_INIT) -# define USE_LDAP_INIT 1 -#endif - -/* -** LDAP_OPT_SIZELIMIT is not defined under Umich 3.x nor OpenLDAP 1.x, -** hence ldap_set_option() must not exist. -*/ - -#if defined(LDAP_OPT_SIZELIMIT) && !defined(USE_LDAP_SET_OPTION) -# define USE_LDAP_SET_OPTION 1 -#endif - -#endif /* _LDAP_MAP_H */ diff --git a/src/macro.c b/src/macro.c deleted file mode 100644 index d45a0c7..0000000 --- a/src/macro.c +++ /dev/null @@ -1,437 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)macro.c 8.26 (Berkeley) 11/8/1998"; -#endif /* not lint */ - -# include "sendmail.h" - -char *MacroName[256]; /* macro id to name table */ -int NextMacroId = 0240; /* codes for long named macros */ - - -/* -** EXPAND -- macro expand a string using $x escapes. -** -** Parameters: -** s -- the string to expand. -** buf -- the place to put the expansion. -** bufsize -- the size of the buffer. -** e -- envelope in which to work. -** -** Returns: -** none. -** -** Side Effects: -** none. -*/ - -void -expand(s, buf, bufsize, e) - register char *s; - register char *buf; - size_t bufsize; - register ENVELOPE *e; -{ - register char *xp; - register char *q; - bool skipping; /* set if conditionally skipping output */ - bool recurse = FALSE; /* set if recursion required */ - int i; - int skiplev; /* skipping nesting level */ - int iflev; /* if nesting level */ - char xbuf[MACBUFSIZE]; - static int explevel = 0; - - if (tTd(35, 24)) - { - printf("expand("); - xputs(s); - printf(")\n"); - } - - skipping = FALSE; - skiplev = 0; - iflev = 0; - if (s == NULL) - s = ""; - for (xp = xbuf; *s != '\0'; s++) - { - int c; - - /* - ** Check for non-ordinary (special?) character. - ** 'q' will be the interpolated quantity. - */ - - q = NULL; - c = *s; - switch (c & 0377) - { - case CONDIF: /* see if var set */ - iflev++; - c = *++s; - if (skipping) - skiplev++; - else - skipping = macvalue(c, e) == NULL; - continue; - - case CONDELSE: /* change state of skipping */ - if (iflev == 0) - break; - if (skiplev == 0) - skipping = !skipping; - continue; - - case CONDFI: /* stop skipping */ - if (iflev == 0) - break; - iflev--; - if (skiplev == 0) - skipping = FALSE; - if (skipping) - skiplev--; - continue; - - case MACROEXPAND: /* macro interpolation */ - c = *++s & 0377; - if (c != '\0') - q = macvalue(c, e); - else - { - s--; - q = NULL; - } - if (q == NULL) - continue; - break; - } - - /* - ** Interpolate q or output one character - */ - - if (skipping || xp >= &xbuf[sizeof xbuf - 1]) - continue; - if (q == NULL) - *xp++ = c; - else - { - /* copy to end of q or max space remaining in buf */ - while ((c = *q++) != '\0' && xp < &xbuf[sizeof xbuf - 1]) - { - /* check for any sendmail metacharacters */ - if ((c & 0340) == 0200) - recurse = TRUE; - *xp++ = c; - } - } - } - *xp = '\0'; - - if (tTd(35, 24)) - { - printf("expand ==> "); - xputs(xbuf); - printf("\n"); - } - - /* recurse as appropriate */ - if (recurse) - { - if (explevel < MaxMacroRecursion) - { - explevel++; - expand(xbuf, buf, bufsize, e); - explevel--; - return; - } - syserr("expand: recursion too deep (%d max)", - MaxMacroRecursion); - } - - /* copy results out */ - i = xp - xbuf; - if (i >= bufsize) - i = bufsize - 1; - bcopy(xbuf, buf, i); - buf[i] = '\0'; -} -/* -** DEFINE -- define a macro. -** -** this would be better done using a #define macro. -** -** Parameters: -** n -- the macro name. -** v -- the macro value. -** e -- the envelope to store the definition in. -** -** Returns: -** none. -** -** Side Effects: -** e->e_macro[n] is defined. -** -** Notes: -** There is one macro for each ASCII character, -** although they are not all used. The currently -** defined macros are: -** -** $a date in ARPANET format (preferring the Date: line -** of the message) -** $b the current date (as opposed to the date as found -** the message) in ARPANET format -** $c hop count -** $d (current) date in UNIX (ctime) format -** $e the SMTP entry message+ -** $f raw from address -** $g translated from address -** $h to host -** $i queue id -** $j official SMTP hostname, used in messages+ -** $k UUCP node name -** $l UNIX-style from line+ -** $m The domain part of our full name. -** $n name of sendmail ("MAILER-DAEMON" on local -** net typically)+ -** $o delimiters ("operators") for address tokens+ -** (set via OperatorChars option in V6 or later -** sendmail.cf files) -** $p my process id in decimal -** $q the string that becomes an address -- this is -** normally used to combine $g & $x. -** $r protocol used to talk to sender -** $s sender's host name -** $t the current time in seconds since 1/1/1970 -** $u to user -** $v version number of sendmail -** $w our host name (if it can be determined) -** $x signature (full name) of from person -** $y the tty id of our terminal -** $z home directory of to person -** $_ RFC1413 authenticated sender address -** -** Macros marked with + must be defined in the -** configuration file and are used internally, but -** are not set. -** -** There are also some macros that can be used -** arbitrarily to make the configuration file -** cleaner. In general all upper-case letters -** are available. -*/ - -void -define(n, v, e) - int n; - char *v; - register ENVELOPE *e; -{ - if (tTd(35, 9)) - { - printf("%sdefine(%s as ", - (e->e_macro[n & 0377] == NULL) ? "" : "re", macname(n)); - xputs(v); - printf(")\n"); - } - e->e_macro[n & 0377] = v; -} -/* -** MACVALUE -- return uninterpreted value of a macro. -** -** Parameters: -** n -- the name of the macro. -** -** Returns: -** The value of n. -** -** Side Effects: -** none. -*/ - -char * -macvalue(n, e) - int n; - register ENVELOPE *e; -{ - n &= 0377; - while (e != NULL) - { - register char *p = e->e_macro[n]; - - if (p != NULL) - return (p); - e = e->e_parent; - } - return (NULL); -} -/* -** MACNAME -- return the name of a macro given its internal id -** -** Parameter: -** n -- the id of the macro -** -** Returns: -** The name of n. -** -** Side Effects: -** none. -*/ - -char * -macname(n) - int n; -{ - static char mbuf[2]; - - n &= 0377; - if (bitset(0200, n)) - { - char *p = MacroName[n]; - - if (p != NULL) - return p; - return "***UNDEFINED MACRO***"; - } - mbuf[0] = n; - mbuf[1] = '\0'; - return mbuf; -} -/* -** MACID -- return id of macro identified by its name -** -** Parameters: -** p -- pointer to name string -- either a single -** character or {name}. -** ep -- filled in with the pointer to the byte -** after the name. -** -** Returns: -** The internal id code for this macro. This will -** fit into a single byte. -** -** Side Effects: -** If this is a new macro name, a new id is allocated. -*/ - -int -macid(p, ep) - register char *p; - char **ep; -{ - int mid; - register char *bp; - char mbuf[MAXMACNAMELEN + 1]; - - if (tTd(35, 14)) - { - printf("macid("); - xputs(p); - printf(") => "); - } - - if (*p == '\0' || (p[0] == '{' && p[1] == '}')) - { - syserr("Name required for macro/class"); - if (ep != NULL) - *ep = p; - if (tTd(35, 14)) - printf("NULL\n"); - return '\0'; - } - if (*p != '{') - { - /* the macro is its own code */ - if (ep != NULL) - *ep = p + 1; - if (tTd(35, 14)) - printf("%c\n", *p); - return *p; - } - bp = mbuf; - while (*++p != '\0' && *p != '}' && bp < &mbuf[sizeof mbuf - 1]) - { - if (isascii(*p) && (isalnum(*p) || *p == '_')) - *bp++ = *p; - else - syserr("Invalid macro/class character %c", *p); - } - *bp = '\0'; - mid = -1; - if (*p == '\0') - { - syserr("Unbalanced { on %s", mbuf); /* missing } */ - } - else if (*p != '}') - { - syserr("Macro/class name ({%s}) too long (%d chars max)", - mbuf, sizeof mbuf - 1); - } - else if (mbuf[1] == '\0') - { - /* ${x} == $x */ - mid = mbuf[0]; - p++; - } - else - { - register STAB *s; - - s = stab(mbuf, ST_MACRO, ST_ENTER); - if (s->s_macro != 0) - mid = s->s_macro; - else - { - if (NextMacroId > 0377) - { - syserr("Macro/class {%s}: too many long names", mbuf); - s->s_macro = -1; - } - else - { - MacroName[NextMacroId] = s->s_name; - s->s_macro = mid = NextMacroId++; - } - } - p++; - } - if (ep != NULL) - *ep = p; - if (tTd(35, 14)) - printf("0x%x\n", mid); - return mid; -} -/* -** WORDINCLASS -- tell if a word is in a specific class -** -** Parameters: -** str -- the name of the word to look up. -** cl -- the class name. -** -** Returns: -** TRUE if str can be found in cl. -** FALSE otherwise. -*/ - -bool -wordinclass(str, cl) - char *str; - int cl; -{ - register STAB *s; - - s = stab(str, ST_CLASS, ST_FIND); - return s != NULL && bitnset(cl & 0xff, s->s_class); -} diff --git a/src/mailq.0 b/src/mailq.0 deleted file mode 100644 index 0f6c376..0000000 --- a/src/mailq.0 +++ /dev/null @@ -1,41 +0,0 @@ -MAILQ(1) BSD Reference Manual MAILQ(1) - -NNAAMMEE - mmaaiillqq - print the mail queue - -SSYYNNOOPPSSIISS - mmaaiillqq [--vv] - -DDEESSCCRRIIPPTTIIOONN - MMaaiillqq prints a summary of the mail messages queued for future delivery. - - The first line printed for each message shows the internal identifier - used on this host for the message, the size of the message in bytes, the - date and time the message was accepted into the queue, and the envelope - sender of the message. The second line shows the error message that - caused this message to be retained in the queue; it will not be present - if the message is being processed for the first time. The following - lines show message recipients, one per line. - - MMaaiillqq is identical to ``sendmail -bp''. - - The options are as follows: - - --vv Print verbose information. This adds the priority of the message - and a single character indicator (``+'' or blank) indicating - whether a warning message has been sent on the first line of the - message. Additionally, extra lines may be intermixed with the - recipients indicating the ``controlling user'' information; this - shows who will own any programs that are executed on behalf of - this message and the name of the alias this command expanded - from, if any. - - The mmaaiillqq utility exits 0 on success, and >0 if an error occurs. - -SSEEEE AALLSSOO - sendmail(8) - -HHIISSTTOORRYY - The mmaaiillqq command appeared in 4.0BSD. - -4th Berkeley Distribution May 19, 1998 1 diff --git a/src/mailq.1 b/src/mailq.1 deleted file mode 100644 index 8b6e63a..0000000 --- a/src/mailq.1 +++ /dev/null @@ -1,67 +0,0 @@ -.\" Copyright (c) 1998 Sendmail, Inc. All rights reserved. -.\" Copyright (c) 1983, 1997 Eric P. Allman. All rights reserved. -.\" Copyright (c) 1985, 1990, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" By using this file, you agree to the terms and conditions set -.\" forth in the LICENSE file which can be found at the top level of -.\" the sendmail distribution. -.\" -.\" -.\" @(#)mailq.1 8.10 (Berkeley) 5/19/1998 -.\" -.Dd May 19, 1998 -.Dt MAILQ 1 -.Os BSD 4 -.Sh NAME -.Nm mailq -.Nd print the mail queue -.Sh SYNOPSIS -.Nm mailq -.Op Fl v -.Sh DESCRIPTION -.Nm Mailq -prints a summary of the mail messages queued for future delivery. -.Pp -The first line printed for each message -shows the internal identifier used on this host -for the message, -the size of the message in bytes, -the date and time the message was accepted into the queue, -and the envelope sender of the message. -The second line shows the error message that caused this message -to be retained in the queue; -it will not be present if the message is being processed -for the first time. -The following lines show message recipients, -one per line. -.Pp -.Nm Mailq -is identical to -.Dq Li "sendmail -bp" . -.Pp -The options are as follows: -.Bl -tag -width Ds -.It Fl v -Print verbose information. -This adds the priority of the message and -a single character indicator (``+'' or blank) -indicating whether a warning message has been sent -on the first line of the message. -Additionally, extra lines may be intermixed with the recipients -indicating the ``controlling user'' information; -this shows who will own any programs that are executed -on behalf of this message -and the name of the alias this command expanded from, if any. -.El -.Pp -The -.Nm mailq -utility exits 0 on success, and >0 if an error occurs. -.Sh SEE ALSO -.Xr sendmail 8 -.Sh HISTORY -The -.Nm mailq -command appeared in -.Bx 4.0 . diff --git a/src/mailstats.h b/src/mailstats.h deleted file mode 100644 index 86390b3..0000000 --- a/src/mailstats.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - * - * @(#)mailstats.h 8.8 (Berkeley) 5/19/1998 - */ - -#define STAT_VERSION 2 -#define STAT_MAGIC 0x1B1DE - -/* -** Statistics structure. -*/ - -struct statistics -{ - int stat_magic; /* magic number */ - int stat_version; /* stat file version */ - time_t stat_itime; /* file initialization time */ - short stat_size; /* size of this structure */ - long stat_nf[MAXMAILERS]; /* # msgs from each mailer */ - long stat_bf[MAXMAILERS]; /* kbytes from each mailer */ - long stat_nt[MAXMAILERS]; /* # msgs to each mailer */ - long stat_bt[MAXMAILERS]; /* kbytes to each mailer */ - long stat_nr[MAXMAILERS]; /* # rejects by each mailer */ - long stat_nd[MAXMAILERS]; /* # discards by each mailer */ -}; diff --git a/src/main.c b/src/main.c deleted file mode 100644 index cea9d15..0000000 --- a/src/main.c +++ /dev/null @@ -1,2748 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char copyright[] = -"@(#) Copyright (c) 1998 Sendmail, Inc. All rights reserved.\n\ - Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.\n\ - Copyright (c) 1988, 1993\n\ - The Regents of the University of California. All rights reserved.\n"; -#endif /* not lint */ - -#ifndef lint -static char sccsid[] = "@(#)main.c 8.322 (Berkeley) 12/18/1998"; -#endif /* not lint */ - -#define _DEFINE - -#include "sendmail.h" -#include <arpa/inet.h> -#include <grp.h> -#if NAMED_BIND -#include <resolv.h> -#endif - -/* -** SENDMAIL -- Post mail to a set of destinations. -** -** This is the basic mail router. All user mail programs should -** call this routine to actually deliver mail. Sendmail in -** turn calls a bunch of mail servers that do the real work of -** delivering the mail. -** -** Sendmail is driven by settings read in from /etc/sendmail.cf -** (read by readcf.c). -** -** Usage: -** /usr/lib/sendmail [flags] addr ... -** -** See the associated documentation for details. -** -** Author: -** Eric Allman, UCB/INGRES (until 10/81). -** Britton-Lee, Inc., purveyors of fine -** database computers (11/81 - 10/88). -** International Computer Science Institute -** (11/88 - 9/89). -** UCB/Mammoth Project (10/89 - 7/95). -** InReference, Inc. (8/95 - 1/97). -** Sendmail, Inc. (1/98 - present). -** The support of the my employers is gratefully acknowledged. -** Few of them (Britton-Lee in particular) have had -** anything to gain from my involvement in this project. -*/ - - -int NextMailer; /* "free" index into Mailer struct */ -char *FullName; /* sender's full name */ -ENVELOPE BlankEnvelope; /* a "blank" envelope */ -ENVELOPE MainEnvelope; /* the envelope around the basic letter */ -ADDRESS NullAddress = /* a null address */ - { "", "", NULL, "" }; -char *CommandLineArgs; /* command line args for pid file */ -bool Warn_Q_option = FALSE; /* warn about Q option use */ -char **SaveArgv; /* argument vector for re-execing */ -int MissingFds = 0; /* bit map of fds missing on startup */ - -#ifdef NGROUPS_MAX -GIDSET_T InitialGidSet[NGROUPS_MAX]; -#endif - -static void obsolete __P((char **)); -extern void printmailer __P((MAILER *)); -extern void tTflag __P((char *)); - -#if DAEMON && !SMTP -ERROR %%%% Cannot have DAEMON mode without SMTP %%%% ERROR -#endif /* DAEMON && !SMTP */ -#if SMTP && !QUEUE -ERROR %%%% Cannot have SMTP mode without QUEUE %%%% ERROR -#endif /* DAEMON && !SMTP */ - -#define MAXCONFIGLEVEL 8 /* highest config version level known */ - -int -main(argc, argv, envp) - int argc; - char **argv; - char **envp; -{ - register char *p; - char **av; - extern char Version[]; - char *ep, *from; - STAB *st; - register int i; - int j; - bool queuemode = FALSE; /* process queue requests */ - bool safecf = TRUE; - bool warn_C_flag = FALSE; - char warn_f_flag = '\0'; - bool run_in_foreground = FALSE; /* -bD mode */ - static bool reenter = FALSE; - struct passwd *pw; - struct hostent *hp; - char *nullserver = NULL; - bool forged; - char jbuf[MAXHOSTNAMELEN]; /* holds MyHostName */ - static char rnamebuf[MAXNAME]; /* holds RealUserName */ - char *emptyenviron[1]; - QUEUE_CHAR *new; - extern int DtableSize; - extern int optind; - extern int opterr; - extern char *optarg; - extern char **environ; - extern time_t convtime __P((char *, char)); - extern SIGFUNC_DECL intsig __P((int)); - extern struct hostent *myhostname __P((char *, int)); - extern char *getauthinfo __P((int, bool *)); - extern char *getcfname __P((void)); - extern SIGFUNC_DECL sigusr1 __P((int)); - extern SIGFUNC_DECL sighup __P((int)); - extern SIGFUNC_DECL quiesce __P((int)); - extern void initmacros __P((ENVELOPE *)); - extern void init_md __P((int, char **)); - extern int getdtsize __P((void)); - extern void tTsetup __P((u_char *, int, char *)); - extern void setdefaults __P((ENVELOPE *)); - extern void initsetproctitle __P((int, char **, char **)); - extern void init_vendor_macros __P((ENVELOPE *)); - extern void load_if_names __P((void)); - extern void vendor_pre_defaults __P((ENVELOPE *)); - extern void vendor_post_defaults __P((ENVELOPE *)); - extern void readcf __P((char *, bool, ENVELOPE *)); - extern void printqueue __P((void)); - extern void sendtoargv __P((char **, ENVELOPE *)); - extern void resetlimits __P((void)); -#ifndef HASUNSETENV - extern void unsetenv __P((char *)); -#endif - - /* - ** Check to see if we reentered. - ** This would normally happen if e_putheader or e_putbody - ** were NULL when invoked. - */ - - if (reenter) - { - syserr("main: reentered!"); - abort(); - } - reenter = TRUE; - - /* avoid null pointer dereferences */ - TermEscape.te_rv_on = TermEscape.te_rv_off = ""; - - /* do machine-dependent initializations */ - init_md(argc, argv); - - /* in 4.4BSD, the table can be huge; impose a reasonable limit */ - DtableSize = getdtsize(); - if (DtableSize > 256) - DtableSize = 256; - - /* - ** Be sure we have enough file descriptors. - ** But also be sure that 0, 1, & 2 are open. - */ - - fill_fd(STDIN_FILENO, NULL); - fill_fd(STDOUT_FILENO, NULL); - fill_fd(STDERR_FILENO, NULL); - - i = DtableSize; - while (--i > 0) - { - if (i != STDIN_FILENO && i != STDOUT_FILENO && i != STDERR_FILENO) - (void) close(i); - } - errno = 0; - -#if LOG -# ifdef LOG_MAIL - openlog("sendmail", LOG_PID, LOG_MAIL); -# else - openlog("sendmail", LOG_PID); -# endif -#endif - - if (MissingFds != 0) - { - char mbuf[MAXLINE]; - - mbuf[0] = '\0'; - if (bitset(1 << STDIN_FILENO, MissingFds)) - strcat(mbuf, ", stdin"); - if (bitset(1 << STDOUT_FILENO, MissingFds)) - strcat(mbuf, ", stdout"); - if (bitset(1 << STDERR_FILENO, MissingFds)) - strcat(mbuf, ", stderr"); - syserr("File descriptors missing on startup: %s", &mbuf[2]); - } - - /* reset status from syserr() calls for missing file descriptors */ - Errors = 0; - ExitStat = EX_OK; - -#if XDEBUG - checkfd012("after openlog"); -#endif - - tTsetup(tTdvect, sizeof tTdvect, "0-99.1"); - -#ifdef NGROUPS_MAX - /* save initial group set for future checks */ - i = getgroups(NGROUPS_MAX, InitialGidSet); - if (i == 0) - InitialGidSet[0] = (GID_T) -1; - while (i < NGROUPS_MAX) - InitialGidSet[i++] = InitialGidSet[0]; -#endif - - /* drop group id privileges (RunAsUser not yet set) */ - (void) drop_privileges(FALSE); - -#ifdef SIGUSR1 - /* arrange to dump state on user-1 signal */ - setsignal(SIGUSR1, sigusr1); -#endif - - /* initialize for setproctitle */ - initsetproctitle(argc, argv, envp); - - /* Handle any non-getoptable constructions. */ - obsolete(argv); - - /* - ** Do a quick prescan of the argument list. - */ - -#if defined(__osf__) || defined(_AIX3) -# define OPTIONS "B:b:C:cd:e:F:f:h:IiM:mN:nO:o:p:q:R:r:sTtUV:vX:x" -#endif -#if defined(sony_news) -# define OPTIONS "B:b:C:cd:E:e:F:f:h:IiJ:M:mN:nO:o:p:q:R:r:sTtUV:vX:" -#endif -#ifndef OPTIONS -# define OPTIONS "B:b:C:cd:e:F:f:h:IiM:mN:nO:o:p:q:R:r:sTtUV:vX:" -#endif - opterr = 0; - while ((j = getopt(argc, argv, OPTIONS)) != -1) - { - switch (j) - { - case 'd': - /* hack attack -- see if should use ANSI mode */ - if (strcmp(optarg, "ANSI") == 0) - { - TermEscape.te_rv_on = "\033[7m"; - TermEscape.te_rv_off = "\033[0m"; - break; - } - tTflag(optarg); - setbuf(stdout, (char *) NULL); - break; - } - } - opterr = 1; - - /* set up the blank envelope */ - BlankEnvelope.e_puthdr = putheader; - BlankEnvelope.e_putbody = putbody; - BlankEnvelope.e_xfp = NULL; - STRUCTCOPY(NullAddress, BlankEnvelope.e_from); - CurEnv = &BlankEnvelope; - STRUCTCOPY(NullAddress, MainEnvelope.e_from); - - /* - ** Set default values for variables. - ** These cannot be in initialized data space. - */ - - setdefaults(&BlankEnvelope); - - RealUid = getuid(); - RealGid = getgid(); - - pw = sm_getpwuid(RealUid); - if (pw != NULL) - (void) snprintf(rnamebuf, sizeof rnamebuf, "%s", pw->pw_name); - else - (void) snprintf(rnamebuf, sizeof rnamebuf, "Unknown UID %d", RealUid); - RealUserName = rnamebuf; - - if (tTd(0, 101)) - { - printf("Version %s\n", Version); - finis(FALSE, EX_OK); - } - - /* - ** if running non-setuid binary as non-root, pretend - ** we are the RunAsUid - */ - if (RealUid != 0 && geteuid() == RealUid) - { - if (tTd(47, 1)) - printf("Non-setuid binary: RunAsUid = RealUid = %d\n", - (int)RealUid); - RunAsUid = RealUid; - } - else if (geteuid() != 0) - RunAsUid = geteuid(); - - if (RealUid != 0 && getegid() == RealGid) - RunAsGid = RealGid; - - if (tTd(47, 5)) - { - printf("main: e/ruid = %d/%d e/rgid = %d/%d\n", - (int)geteuid(), (int)getuid(), (int)getegid(), (int)getgid()); - printf("main: RunAsUser = %d:%d\n", (int)RunAsUid, (int)RunAsGid); - } - - /* save command line arguments */ - i = 0; - for (av = argv; *av != NULL; ) - i += strlen(*av++) + 1; - SaveArgv = (char **) xalloc(sizeof (char *) * (argc + 1)); - CommandLineArgs = xalloc(i); - p = CommandLineArgs; - for (av = argv, i = 0; *av != NULL; ) - { - SaveArgv[i++] = newstr(*av); - if (av != argv) - *p++ = ' '; - strcpy(p, *av++); - p += strlen(p); - } - SaveArgv[i] = NULL; - - if (tTd(0, 1)) - { - int ll; - extern char *CompileOptions[]; - - printf("Version %s\n Compiled with:", Version); - av = CompileOptions; - ll = 7; - while (*av != NULL) - { - if (ll + strlen(*av) > 63) - { - putchar('\n'); - ll = 0; - } - if (ll == 0) - { - putchar('\t'); - putchar('\t'); - } - else - putchar(' '); - printf("%s", *av); - ll += strlen(*av++) + 1; - } - putchar('\n'); - } - if (tTd(0, 10)) - { - int ll; - extern char *OsCompileOptions[]; - - printf(" OS Defines:"); - av = OsCompileOptions; - ll = 7; - while (*av != NULL) - { - if (ll + strlen(*av) > 63) - { - putchar('\n'); - ll = 0; - } - if (ll == 0) - { - putchar('\t'); - putchar('\t'); - } - else - putchar(' '); - printf("%s", *av); - ll += strlen(*av++) + 1; - } - putchar('\n'); -#ifdef _PATH_UNIX - printf("Kernel symbols:\t%s\n", _PATH_UNIX); -#endif - printf(" Def Conf file:\t%s\n", getcfname()); - printf(" Pid file:\t%s\n", PidFile); - } - - InChannel = stdin; - OutChannel = stdout; - - /* clear sendmail's environment */ - ExternalEnviron = environ; - emptyenviron[0] = NULL; - environ = emptyenviron; - - /* - ** restore any original TZ setting until TimeZoneSpec has been - ** determined - or early log messages may get bogus time stamps - */ - if ((p = getextenv("TZ")) != NULL) - { - char *tz; - int tzlen; - - tzlen = strlen(p) + 4; - tz = xalloc(tzlen); - snprintf(tz, tzlen, "TZ=%s", p); - putenv(tz); - } - - /* prime the child environment */ - setuserenv("AGENT", "sendmail"); - - if (setsignal(SIGINT, SIG_IGN) != SIG_IGN) - (void) setsignal(SIGINT, intsig); - (void) setsignal(SIGTERM, intsig); - (void) setsignal(SIGPIPE, SIG_IGN); - OldUmask = umask(022); - OpMode = MD_DELIVER; - FullName = getextenv("NAME"); - - /* - ** Initialize name server if it is going to be used. - */ - -#if NAMED_BIND - if (!bitset(RES_INIT, _res.options)) - res_init(); - if (tTd(8, 8)) - _res.options |= RES_DEBUG; - else - _res.options &= ~RES_DEBUG; -# ifdef RES_NOALIASES - _res.options |= RES_NOALIASES; -# endif -#endif - - errno = 0; - from = NULL; - - /* initialize some macros, etc. */ - initmacros(CurEnv); - init_vendor_macros(CurEnv); - - /* version */ - define('v', Version, CurEnv); - - /* hostname */ - hp = myhostname(jbuf, sizeof jbuf); - if (jbuf[0] != '\0') - { - struct utsname utsname; - - if (tTd(0, 4)) - printf("canonical name: %s\n", jbuf); - define('w', newstr(jbuf), CurEnv); /* must be new string */ - define('j', newstr(jbuf), CurEnv); - setclass('w', jbuf); - - p = strchr(jbuf, '.'); - if (p != NULL) - { - if (p[1] != '\0') - { - define('m', newstr(&p[1]), CurEnv); - } - while (p != NULL && strchr(&p[1], '.') != NULL) - { - *p = '\0'; - if (tTd(0, 4)) - printf("\ta.k.a.: %s\n", jbuf); - setclass('w', jbuf); - *p++ = '.'; - p = strchr(p, '.'); - } - } - - if (uname(&utsname) >= 0) - p = utsname.nodename; - else - { - if (tTd(0, 22)) - printf("uname failed (%s)\n", errstring(errno)); - makelower(jbuf); - p = jbuf; - } - if (tTd(0, 4)) - printf(" UUCP nodename: %s\n", p); - p = newstr(p); - define('k', p, CurEnv); - setclass('k', p); - setclass('w', p); - } - if (hp != NULL) - { - for (av = hp->h_aliases; av != NULL && *av != NULL; av++) - { - if (tTd(0, 4)) - printf("\ta.k.a.: %s\n", *av); - setclass('w', *av); - } -#if NETINET - if (hp->h_addrtype == AF_INET && hp->h_length == INADDRSZ) - { - for (i = 0; hp->h_addr_list[i] != NULL; i++) - { - char ipbuf[103]; - - snprintf(ipbuf, sizeof ipbuf, "[%.100s]", - inet_ntoa(*((struct in_addr *) hp->h_addr_list[i]))); - if (tTd(0, 4)) - printf("\ta.k.a.: %s\n", ipbuf); - setclass('w', ipbuf); - } - } -#endif - } - - /* current time */ - define('b', arpadate((char *) NULL), CurEnv); - - QueueLimitRecipient = (QUEUE_CHAR *) NULL; - QueueLimitSender = (QUEUE_CHAR *) NULL; - QueueLimitId = (QUEUE_CHAR *) NULL; - - /* - ** Crack argv. - */ - - av = argv; - p = strrchr(*av, '/'); - if (p++ == NULL) - p = *av; - if (strcmp(p, "newaliases") == 0) - OpMode = MD_INITALIAS; - else if (strcmp(p, "mailq") == 0) - OpMode = MD_PRINT; - else if (strcmp(p, "smtpd") == 0) - OpMode = MD_DAEMON; - else if (strcmp(p, "hoststat") == 0) - OpMode = MD_HOSTSTAT; - else if (strcmp(p, "purgestat") == 0) - OpMode = MD_PURGESTAT; - - optind = 1; - while ((j = getopt(argc, argv, OPTIONS)) != -1) - { - switch (j) - { - case 'b': /* operations mode */ - switch (j = *optarg) - { - case MD_DAEMON: - case MD_FGDAEMON: -# if !DAEMON - usrerr("Daemon mode not implemented"); - ExitStat = EX_USAGE; - break; -# endif /* DAEMON */ - case MD_SMTP: -# if !SMTP - usrerr("I don't speak SMTP"); - ExitStat = EX_USAGE; - break; -# endif /* SMTP */ - - case MD_INITALIAS: - case MD_DELIVER: - case MD_VERIFY: - case MD_TEST: - case MD_PRINT: - case MD_HOSTSTAT: - case MD_PURGESTAT: - case MD_ARPAFTP: - OpMode = j; - break; - - case MD_FREEZE: - usrerr("Frozen configurations unsupported"); - ExitStat = EX_USAGE; - break; - - default: - usrerr("Invalid operation mode %c", j); - ExitStat = EX_USAGE; - break; - } - break; - - case 'B': /* body type */ - CurEnv->e_bodytype = optarg; - break; - - case 'C': /* select configuration file (already done) */ - if (RealUid != 0) - warn_C_flag = TRUE; - ConfFile = optarg; - (void) drop_privileges(TRUE); - safecf = FALSE; - break; - - case 'd': /* debugging -- already done */ - break; - - case 'f': /* from address */ - case 'r': /* obsolete -f flag */ - if (from != NULL) - { - usrerr("More than one \"from\" person"); - ExitStat = EX_USAGE; - break; - } - from = newstr(denlstring(optarg, TRUE, TRUE)); - if (strcmp(RealUserName, from) != 0) - warn_f_flag = j; - break; - - case 'F': /* set full name */ - FullName = newstr(optarg); - break; - - case 'h': /* hop count */ - CurEnv->e_hopcount = strtol(optarg, &ep, 10); - if (*ep) - { - usrerr("Bad hop count (%s)", optarg); - ExitStat = EX_USAGE; - } - break; - - case 'n': /* don't alias */ - NoAlias = TRUE; - break; - - case 'N': /* delivery status notifications */ - DefaultNotify |= QHASNOTIFY; - if (strcasecmp(optarg, "never") == 0) - break; - for (p = optarg; p != NULL; optarg = p) - { - p = strchr(p, ','); - if (p != NULL) - *p++ = '\0'; - if (strcasecmp(optarg, "success") == 0) - DefaultNotify |= QPINGONSUCCESS; - else if (strcasecmp(optarg, "failure") == 0) - DefaultNotify |= QPINGONFAILURE; - else if (strcasecmp(optarg, "delay") == 0) - DefaultNotify |= QPINGONDELAY; - else - { - usrerr("Invalid -N argument"); - ExitStat = EX_USAGE; - } - } - break; - - case 'o': /* set option */ - setoption(*optarg, optarg + 1, FALSE, TRUE, CurEnv); - break; - - case 'O': /* set option (long form) */ - setoption(' ', optarg, FALSE, TRUE, CurEnv); - break; - - case 'p': /* set protocol */ - p = strchr(optarg, ':'); - if (p != NULL) - { - *p++ = '\0'; - if (*p != '\0') - { - ep = xalloc(strlen(p) + 1); - cleanstrcpy(ep, p, MAXNAME); - define('s', ep, CurEnv); - } - } - if (*optarg != '\0') - { - ep = xalloc(strlen(optarg) + 1); - cleanstrcpy(ep, optarg, MAXNAME); - define('r', ep, CurEnv); - } - break; - - case 'q': /* run queue files at intervals */ -# if QUEUE - FullName = NULL; - queuemode = TRUE; - switch (optarg[0]) - { - case 'I': - if ((new = (QUEUE_CHAR *)malloc(sizeof(QUEUE_CHAR))) == NULL) - syserr("!Out of memory!!"); - new->queue_match = newstr(&optarg[1]); - new->queue_next = QueueLimitId; - QueueLimitId = new; - break; - - case 'R': - if ((new = (QUEUE_CHAR *)malloc(sizeof(QUEUE_CHAR))) == NULL) - syserr("!Out of memory!!"); - new->queue_match = newstr(&optarg[1]); - new->queue_next = QueueLimitRecipient; - QueueLimitRecipient = new; - break; - - case 'S': - if ((new = (QUEUE_CHAR *)malloc(sizeof(QUEUE_CHAR))) == NULL) - syserr("!Out of memory!!"); - new->queue_match = newstr(&optarg[1]); - new->queue_next = QueueLimitSender; - QueueLimitSender = new; - break; - - default: - QueueIntvl = convtime(optarg, 'm'); - break; - } -# else /* QUEUE */ - usrerr("I don't know about queues"); - ExitStat = EX_USAGE; -# endif /* QUEUE */ - break; - - case 'R': /* DSN RET: what to return */ - if (bitset(EF_RET_PARAM, CurEnv->e_flags)) - { - usrerr("Duplicate -R flag"); - ExitStat = EX_USAGE; - break; - } - CurEnv->e_flags |= EF_RET_PARAM; - if (strcasecmp(optarg, "hdrs") == 0) - CurEnv->e_flags |= EF_NO_BODY_RETN; - else if (strcasecmp(optarg, "full") != 0) - { - usrerr("Invalid -R value"); - ExitStat = EX_USAGE; - } - break; - - case 't': /* read recipients from message */ - GrabTo = TRUE; - break; - - case 'U': /* initial (user) submission */ - UserSubmission = TRUE; - break; - - case 'V': /* DSN ENVID: set "original" envelope id */ - if (!xtextok(optarg)) - { - usrerr("Invalid syntax in -V flag"); - ExitStat = EX_USAGE; - } - else - CurEnv->e_envid = newstr(optarg); - break; - - case 'X': /* traffic log file */ - (void) drop_privileges(TRUE); - TrafficLogFile = fopen(optarg, "a"); - if (TrafficLogFile == NULL) - { - syserr("cannot open %s", optarg); - ExitStat = EX_CANTCREAT; - break; - } -#ifdef HASSETVBUF - setvbuf(TrafficLogFile, NULL, _IOLBF, 0); -#else - setlinebuf(TrafficLogFile); -#endif - break; - - /* compatibility flags */ - case 'c': /* connect to non-local mailers */ - case 'i': /* don't let dot stop me */ - case 'm': /* send to me too */ - case 'T': /* set timeout interval */ - case 'v': /* give blow-by-blow description */ - setoption(j, "T", FALSE, TRUE, CurEnv); - break; - - case 'e': /* error message disposition */ - case 'M': /* define macro */ - setoption(j, optarg, FALSE, TRUE, CurEnv); - break; - - case 's': /* save From lines in headers */ - setoption('f', "T", FALSE, TRUE, CurEnv); - break; - -# ifdef DBM - case 'I': /* initialize alias DBM file */ - OpMode = MD_INITALIAS; - break; -# endif /* DBM */ - -# if defined(__osf__) || defined(_AIX3) - case 'x': /* random flag that OSF/1 & AIX mailx passes */ - break; -# endif -# if defined(sony_news) - case 'E': - case 'J': /* ignore flags for Japanese code conversion - impremented on Sony NEWS */ - break; -# endif - - default: - finis(TRUE, EX_USAGE); - break; - } - } - av += optind; - - /* - ** Do basic initialization. - ** Read system control file. - ** Extract special fields for local use. - */ - - /* set up ${opMode} for use in config file */ - { - char mbuf[2]; - - mbuf[0] = OpMode; - mbuf[1] = '\0'; - define(MID_OPMODE, newstr(mbuf), CurEnv); - } - -#if XDEBUG - checkfd012("before readcf"); -#endif - vendor_pre_defaults(CurEnv); - readcf(getcfname(), safecf, CurEnv); - ConfigFileRead = TRUE; - vendor_post_defaults(CurEnv); - - /* Enforce use of local time (null string overrides this) */ - if (TimeZoneSpec == NULL) - unsetenv("TZ"); - else if (TimeZoneSpec[0] != '\0') - setuserenv("TZ", TimeZoneSpec); - else - setuserenv("TZ", NULL); - tzset(); - - /* avoid denial-of-service attacks */ - resetlimits(); - - if (OpMode != MD_DAEMON && OpMode != MD_FGDAEMON) - { - /* drop privileges -- daemon mode done after socket/bind */ - (void) drop_privileges(FALSE); - } - - /* - ** Find our real host name for future logging. - */ - - p = getauthinfo(STDIN_FILENO, &forged); - define('_', p, CurEnv); - - /* suppress error printing if errors mailed back or whatever */ - if (CurEnv->e_errormode != EM_PRINT) - HoldErrs = TRUE; - - /* set up the $=m class now, after .cf has a chance to redefine $m */ - expand("\201m", jbuf, sizeof jbuf, CurEnv); - setclass('m', jbuf); - - /* probe interfaces and locate any additional names */ - if (!DontProbeInterfaces) - load_if_names(); - - if (tTd(0, 1)) - { - printf("\n============ SYSTEM IDENTITY (after readcf) ============"); - printf("\n (short domain name) $w = "); - xputs(macvalue('w', CurEnv)); - printf("\n (canonical domain name) $j = "); - xputs(macvalue('j', CurEnv)); - printf("\n (subdomain name) $m = "); - xputs(macvalue('m', CurEnv)); - printf("\n (node name) $k = "); - xputs(macvalue('k', CurEnv)); - printf("\n========================================================\n\n"); - } - - /* - ** Do more command line checking -- these are things that - ** have to modify the results of reading the config file. - */ - - /* process authorization warnings from command line */ - if (warn_C_flag) - auth_warning(CurEnv, "Processed by %s with -C %s", - RealUserName, ConfFile); - if (Warn_Q_option) - auth_warning(CurEnv, "Processed from queue %s", QueueDir); - - /* check body type for legality */ - if (CurEnv->e_bodytype == NULL) - /* nothing */ ; - else if (strcasecmp(CurEnv->e_bodytype, "7BIT") == 0) - SevenBitInput = TRUE; - else if (strcasecmp(CurEnv->e_bodytype, "8BITMIME") == 0) - SevenBitInput = FALSE; - else - { - usrerr("Illegal body type %s", CurEnv->e_bodytype); - CurEnv->e_bodytype = NULL; - } - - /* tweak default DSN notifications */ - if (DefaultNotify == 0) - DefaultNotify = QPINGONFAILURE|QPINGONDELAY; - - /* be sure we don't pick up bogus HOSTALIASES environment variable */ - if (queuemode && RealUid != 0) - (void) unsetenv("HOSTALIASES"); - - /* check for sane configuration level */ - if (ConfigLevel > MAXCONFIGLEVEL) - { - syserr("Warning: .cf version level (%d) exceeds sendmail version %s functionality (%d)", - ConfigLevel, Version, MAXCONFIGLEVEL); - } - - /* need MCI cache to have persistence */ - if (HostStatDir != NULL && MaxMciCache == 0) - { - HostStatDir = NULL; - printf("Warning: HostStatusDirectory disabled with ConnectionCacheSize = 0\n"); - } - - /* need HostStatusDir in order to have SingleThreadDelivery */ - if (SingleThreadDelivery && HostStatDir == NULL) - { - SingleThreadDelivery = FALSE; - printf("Warning: HostStatusDirectory required for SingleThreadDelivery\n"); - } - - /* check for permissions */ - if ((OpMode == MD_DAEMON || - OpMode == MD_FGDAEMON || - OpMode == MD_PURGESTAT) && - RealUid != 0 && - RealUid != TrustedUid) - { - if (LogLevel > 1) - sm_syslog(LOG_ALERT, NOQID, - "user %d attempted to %s", - RealUid, - OpMode != MD_PURGESTAT ? "run daemon" - : "purge host status"); - usrerr("Permission denied"); - finis(FALSE, EX_USAGE); - } - - if (MeToo) - BlankEnvelope.e_flags |= EF_METOO; - - switch (OpMode) - { - case MD_TEST: - /* don't have persistent host status in test mode */ - HostStatDir = NULL; - if (Verbose == 0) - Verbose = 2; - CurEnv->e_errormode = EM_PRINT; - HoldErrs = FALSE; - break; - - case MD_VERIFY: - CurEnv->e_errormode = EM_PRINT; - HoldErrs = FALSE; - /* arrange to exit cleanly on hangup signal */ - if (setsignal(SIGHUP, SIG_IGN) == (sigfunc_t) SIG_DFL) - setsignal(SIGHUP, intsig); - break; - - case MD_FGDAEMON: - run_in_foreground = TRUE; - OpMode = MD_DAEMON; - /* fall through ... */ - - case MD_DAEMON: - vendor_daemon_setup(CurEnv); - - /* remove things that don't make sense in daemon mode */ - FullName = NULL; - GrabTo = FALSE; - - /* arrange to restart on hangup signal */ - if (SaveArgv[0] == NULL || SaveArgv[0][0] != '/') - sm_syslog(LOG_WARNING, NOQID, - "daemon invoked without full pathname; kill -1 won't work"); - setsignal(SIGHUP, sighup); - - /* workaround: can't seem to release the signal in the parent */ - releasesignal(SIGHUP); - break; - - case MD_INITALIAS: - Verbose = 2; - CurEnv->e_errormode = EM_PRINT; - HoldErrs = FALSE; - /* fall through... */ - - case MD_PRINT: - /* to handle sendmail -bp -qSfoobar properly */ - queuemode = FALSE; - /* fall through... */ - - default: - /* arrange to exit cleanly on hangup signal */ - if (setsignal(SIGHUP, SIG_IGN) == (sigfunc_t) SIG_DFL) - setsignal(SIGHUP, intsig); - break; - } - - /* special considerations for FullName */ - if (FullName != NULL) - { - char *full = NULL; - extern bool rfc822_string __P((char *)); - - /* full names can't have newlines */ - if (strchr(FullName, '\n') != NULL) - { - FullName = full = newstr(denlstring(FullName, TRUE, TRUE)); - } - /* check for characters that may have to be quoted */ - if (!rfc822_string(FullName)) - { - extern char *addquotes __P((char *)); - - /* - ** Quote a full name with special characters - ** as a comment so crackaddr() doesn't destroy - ** the name portion of the address. - */ - FullName = addquotes(FullName); - if (full != NULL) - free(full); - } - } - - /* do heuristic mode adjustment */ - if (Verbose) - { - /* turn off noconnect option */ - setoption('c', "F", TRUE, FALSE, CurEnv); - - /* turn on interactive delivery */ - setoption('d', "", TRUE, FALSE, CurEnv); - } - -#ifdef VENDOR_CODE - /* check for vendor mismatch */ - if (VendorCode != VENDOR_CODE) - { - extern char *getvendor __P((int)); - - message("Warning: .cf file vendor code mismatch: sendmail expects vendor %s, .cf file vendor is %s", - getvendor(VENDOR_CODE), getvendor(VendorCode)); - } -#endif - - /* check for out of date configuration level */ - if (ConfigLevel < MAXCONFIGLEVEL) - { - message("Warning: .cf file is out of date: sendmail %s supports version %d, .cf file is version %d", - Version, MAXCONFIGLEVEL, ConfigLevel); - } - - if (ConfigLevel < 3) - { - UseErrorsTo = TRUE; - } - - /* set options that were previous macros */ - if (SmtpGreeting == NULL) - { - if (ConfigLevel < 7 && (p = macvalue('e', CurEnv)) != NULL) - SmtpGreeting = newstr(p); - else - SmtpGreeting = "\201j Sendmail \201v ready at \201b"; - } - if (UnixFromLine == NULL) - { - if (ConfigLevel < 7 && (p = macvalue('l', CurEnv)) != NULL) - UnixFromLine = newstr(p); - else - UnixFromLine = "From \201g \201d"; - } - - /* our name for SMTP codes */ - expand("\201j", jbuf, sizeof jbuf, CurEnv); - MyHostName = jbuf; - if (strchr(jbuf, '.') == NULL) - message("WARNING: local host name (%s) is not qualified; fix $j in config file", - jbuf); - - /* make certain that this name is part of the $=w class */ - setclass('w', MyHostName); - - /* the indices of built-in mailers */ - st = stab("local", ST_MAILER, ST_FIND); - if (st != NULL) - LocalMailer = st->s_mailer; - else if (OpMode != MD_TEST || !warn_C_flag) - syserr("No local mailer defined"); - - st = stab("prog", ST_MAILER, ST_FIND); - if (st == NULL) - syserr("No prog mailer defined"); - else - { - ProgMailer = st->s_mailer; - clrbitn(M_MUSER, ProgMailer->m_flags); - } - - st = stab("*file*", ST_MAILER, ST_FIND); - if (st == NULL) - syserr("No *file* mailer defined"); - else - { - FileMailer = st->s_mailer; - clrbitn(M_MUSER, FileMailer->m_flags); - } - - st = stab("*include*", ST_MAILER, ST_FIND); - if (st == NULL) - syserr("No *include* mailer defined"); - else - InclMailer = st->s_mailer; - - if (ConfigLevel < 6) - { - /* heuristic tweaking of local mailer for back compat */ - if (LocalMailer != NULL) - { - setbitn(M_ALIASABLE, LocalMailer->m_flags); - setbitn(M_HASPWENT, LocalMailer->m_flags); - setbitn(M_TRYRULESET5, LocalMailer->m_flags); - setbitn(M_CHECKINCLUDE, LocalMailer->m_flags); - setbitn(M_CHECKPROG, LocalMailer->m_flags); - setbitn(M_CHECKFILE, LocalMailer->m_flags); - setbitn(M_CHECKUDB, LocalMailer->m_flags); - } - if (ProgMailer != NULL) - setbitn(M_RUNASRCPT, ProgMailer->m_flags); - if (FileMailer != NULL) - setbitn(M_RUNASRCPT, FileMailer->m_flags); - } - if (ConfigLevel < 7) - { - if (LocalMailer != NULL) - setbitn(M_VRFY250, LocalMailer->m_flags); - if (ProgMailer != NULL) - setbitn(M_VRFY250, ProgMailer->m_flags); - if (FileMailer != NULL) - setbitn(M_VRFY250, FileMailer->m_flags); - } - - /* MIME Content-Types that cannot be transfer encoded */ - setclass('n', "multipart/signed"); - - /* MIME message/xxx subtypes that can be treated as messages */ - setclass('s', "rfc822"); - - /* MIME Content-Transfer-Encodings that can be encoded */ - setclass('e', "7bit"); - setclass('e', "8bit"); - setclass('e', "binary"); - -#ifdef USE_B_CLASS - /* MIME Content-Types that should be treated as binary */ - setclass('b', "image"); - setclass('b', "audio"); - setclass('b', "video"); - setclass('b', "application/octet-stream"); -#endif - -#if _FFR_MAX_MIME_HEADER_LENGTH - /* MIME headers which have fields to check for overflow */ - setclass(macid("{checkMIMEFieldHeaders}", NULL), "content-disposition"); - setclass(macid("{checkMIMEFieldHeaders}", NULL), "content-type"); - - /* MIME headers to check for length overflow */ - setclass(macid("{checkMIMETextHeaders}", NULL), "content-description"); - - /* MIME headers to check for overflow and rebalance */ - setclass(macid("{checkMIMEHeaders}", NULL), "content-disposition"); - setclass(macid("{checkMIMEHeaders}", NULL), "content-id"); - setclass(macid("{checkMIMEHeaders}", NULL), "content-transfer-encoding"); - setclass(macid("{checkMIMEHeaders}", NULL), "content-type"); - setclass(macid("{checkMIMEHeaders}", NULL), "mime-version"); -#endif - - /* operate in queue directory */ - if (QueueDir == NULL) - { - if (OpMode != MD_TEST) - { - syserr("QueueDirectory (Q) option must be set"); - ExitStat = EX_CONFIG; - } - } - else - { - /* test path to get warning messages */ - (void) safedirpath(QueueDir, (uid_t) 0, (gid_t) 0, NULL, SFF_ANYFILE); - if (OpMode != MD_TEST && chdir(QueueDir) < 0) - { - syserr("cannot chdir(%s)", QueueDir); - ExitStat = EX_CONFIG; - } - } - - /* check host status directory for validity */ - if (HostStatDir != NULL && !path_is_dir(HostStatDir, FALSE)) - { - /* cannot use this value */ - if (tTd(0, 2)) - printf("Cannot use HostStatusDirectory = %s: %s\n", - HostStatDir, errstring(errno)); - HostStatDir = NULL; - } - -# if QUEUE - if (queuemode && RealUid != 0 && bitset(PRIV_RESTRICTQRUN, PrivacyFlags)) - { - struct stat stbuf; - - /* check to see if we own the queue directory */ - if (stat(".", &stbuf) < 0) - syserr("main: cannot stat %s", QueueDir); - if (stbuf.st_uid != RealUid) - { - /* nope, really a botch */ - usrerr("You do not have permission to process the queue"); - finis(FALSE, EX_NOPERM); - } - } -# endif /* QUEUE */ - - /* if we've had errors so far, exit now */ - if (ExitStat != EX_OK && OpMode != MD_TEST) - finis(FALSE, ExitStat); - -#if XDEBUG - checkfd012("before main() initmaps"); -#endif - - /* - ** Do operation-mode-dependent initialization. - */ - - switch (OpMode) - { - case MD_PRINT: - /* print the queue */ -#if QUEUE - dropenvelope(CurEnv, TRUE); - signal(SIGPIPE, quiesce); - printqueue(); - finis(FALSE, EX_OK); -#else /* QUEUE */ - usrerr("No queue to print"); - finis(FALSE, ExitStat); -#endif /* QUEUE */ - break; - - case MD_HOSTSTAT: - signal(SIGPIPE, quiesce); - mci_traverse_persistent(mci_print_persistent, NULL); - finis(FALSE, EX_OK); - break; - - case MD_PURGESTAT: - mci_traverse_persistent(mci_purge_persistent, NULL); - finis(FALSE, EX_OK); - break; - - case MD_INITALIAS: - /* initialize maps */ - initmaps(TRUE, CurEnv); - finis(FALSE, ExitStat); - break; - - case MD_SMTP: - case MD_DAEMON: - /* reset DSN parameters */ - DefaultNotify = QPINGONFAILURE|QPINGONDELAY; - CurEnv->e_envid = NULL; - CurEnv->e_flags &= ~(EF_RET_PARAM|EF_NO_BODY_RETN); - - /* don't open maps for daemon -- done below in child */ - break; - - default: - /* open the maps */ - initmaps(FALSE, CurEnv); - break; - } - - if (tTd(0, 15)) - { - extern void printrules __P((void)); - - /* print configuration table (or at least part of it) */ - if (tTd(0, 90)) - printrules(); - for (i = 0; i < MAXMAILERS; i++) - { - if (Mailer[i] != NULL) - printmailer(Mailer[i]); - } - } - - /* - ** Switch to the main envelope. - */ - - CurEnv = newenvelope(&MainEnvelope, CurEnv); - MainEnvelope.e_flags = BlankEnvelope.e_flags; - - /* - ** If test mode, read addresses from stdin and process. - */ - - if (OpMode == MD_TEST) - { - char buf[MAXLINE]; - SIGFUNC_DECL intindebug __P((int)); - - if (isatty(fileno(stdin))) - Verbose = 2; - - if (Verbose) - { - printf("ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)\n"); - printf("Enter <ruleset> <address>\n"); - } - if (setjmp(TopFrame) > 0) - printf("\n"); - (void) setsignal(SIGINT, intindebug); - for (;;) - { - extern void testmodeline __P((char *, ENVELOPE *)); - - if (Verbose == 2) - printf("> "); - (void) fflush(stdout); - if (fgets(buf, sizeof buf, stdin) == NULL) - finis(TRUE, ExitStat); - p = strchr(buf, '\n'); - if (p != NULL) - *p = '\0'; - if (Verbose < 2) - printf("> %s\n", buf); - testmodeline(buf, CurEnv); - } - } - -# if QUEUE - /* - ** If collecting stuff from the queue, go start doing that. - */ - - if (queuemode && OpMode != MD_DAEMON && QueueIntvl == 0) - { - (void) runqueue(FALSE, Verbose); - finis(TRUE, ExitStat); - } -# endif /* QUEUE */ - - /* - ** If a daemon, wait for a request. - ** getrequests will always return in a child. - ** If we should also be processing the queue, start - ** doing it in background. - ** We check for any errors that might have happened - ** during startup. - */ - - if (OpMode == MD_DAEMON || QueueIntvl != 0) - { - char dtype[200]; - extern void getrequests __P((ENVELOPE *)); - - if (!run_in_foreground && !tTd(99, 100)) - { - /* put us in background */ - i = fork(); - if (i < 0) - syserr("daemon: cannot fork"); - if (i != 0) - finis(FALSE, EX_OK); - - /* disconnect from our controlling tty */ - disconnect(2, CurEnv); - } - - dtype[0] = '\0'; - if (OpMode == MD_DAEMON) - strcat(dtype, "+SMTP"); - if (QueueIntvl != 0) - { - strcat(dtype, "+queueing@"); - strcat(dtype, pintvl(QueueIntvl, TRUE)); - } - if (tTd(0, 1)) - strcat(dtype, "+debugging"); - - sm_syslog(LOG_INFO, NOQID, - "starting daemon (%s): %s", Version, dtype + 1); -#ifdef XLA - xla_create_file(); -#endif - -# if QUEUE - if (queuemode) - { - (void) runqueue(TRUE, FALSE); - if (OpMode != MD_DAEMON) - { - for (;;) - { - pause(); - if (DoQueueRun) - (void) runqueue(TRUE, FALSE); - } - } - } -# endif /* QUEUE */ - dropenvelope(CurEnv, TRUE); - -#if DAEMON - getrequests(CurEnv); - - /* drop privileges */ - (void) drop_privileges(FALSE); - - /* at this point we are in a child: reset state */ - (void) newenvelope(CurEnv, CurEnv); - - /* - ** Get authentication data - */ - - p = getauthinfo(fileno(InChannel), &forged); - define('_', p, &BlankEnvelope); -#endif /* DAEMON */ - } - -# if SMTP - /* - ** If running SMTP protocol, start collecting and executing - ** commands. This will never return. - */ - - if (OpMode == MD_SMTP || OpMode == MD_DAEMON) - { - char pbuf[20]; - extern void smtp __P((char *, ENVELOPE *)); - - /* - ** Save some macros for check_* rulesets. - */ - - if (forged) - { - char ipbuf[103]; - - snprintf(ipbuf, sizeof ipbuf, "[%.100s]", - inet_ntoa(RealHostAddr.sin.sin_addr)); - - define(macid("{client_name}", NULL), - newstr(ipbuf), &BlankEnvelope); - } - else - define(macid("{client_name}", NULL), RealHostName, &BlankEnvelope); - define(macid("{client_addr}", NULL), - newstr(anynet_ntoa(&RealHostAddr)), &BlankEnvelope); - if (RealHostAddr.sa.sa_family == AF_INET) - snprintf(pbuf, sizeof pbuf, "%d", RealHostAddr.sin.sin_port); - else - snprintf(pbuf, sizeof pbuf, "0"); - define(macid("{client_port}", NULL), newstr(pbuf), &BlankEnvelope); - - /* initialize maps now for check_relay ruleset */ - initmaps(FALSE, CurEnv); - - if (OpMode == MD_DAEMON) - { - /* validate the connection */ - HoldErrs = TRUE; - nullserver = validate_connection(&RealHostAddr, - RealHostName, CurEnv); - HoldErrs = FALSE; - } - smtp(nullserver, CurEnv); - } -# endif /* SMTP */ - - clearenvelope(CurEnv, FALSE); - if (OpMode == MD_VERIFY) - { - CurEnv->e_sendmode = SM_VERIFY; - PostMasterCopy = NULL; - } - else - { - /* interactive -- all errors are global */ - CurEnv->e_flags |= EF_GLOBALERRS|EF_LOGSENDER; - } - - /* - ** Do basic system initialization and set the sender - */ - - initsys(CurEnv); - if (warn_f_flag != '\0' && !wordinclass(RealUserName, 't')) - auth_warning(CurEnv, "%s set sender to %s using -%c", - RealUserName, from, warn_f_flag); - setsender(from, CurEnv, NULL, '\0', FALSE); - if (macvalue('s', CurEnv) == NULL) - define('s', RealHostName, CurEnv); - - if (*av == NULL && !GrabTo) - { - CurEnv->e_flags |= EF_GLOBALERRS; - usrerr("Recipient names must be specified"); - - /* collect body for UUCP return */ - if (OpMode != MD_VERIFY) - collect(InChannel, FALSE, NULL, CurEnv); - finis(TRUE, ExitStat); - } - - /* - ** Scan argv and deliver the message to everyone. - */ - - sendtoargv(av, CurEnv); - - /* if we have had errors sofar, arrange a meaningful exit stat */ - if (Errors > 0 && ExitStat == EX_OK) - ExitStat = EX_USAGE; - -#if _FFR_FIX_DASHT - /* - ** If using -t, force not sending to argv recipients, even - ** if they are mentioned in the headers. - */ - - if (GrabTo) - { - ADDRESS *q; - - for (q = CurEnv->e_sendqueue; q != NULL; q = q->q_next) - q->q_flags |= QDONTSEND; - } -#endif - - /* - ** Read the input mail. - */ - - CurEnv->e_to = NULL; - if (OpMode != MD_VERIFY || GrabTo) - { - long savedflags = CurEnv->e_flags & EF_FATALERRS; - - CurEnv->e_flags |= EF_GLOBALERRS; - CurEnv->e_flags &= ~EF_FATALERRS; - collect(InChannel, FALSE, NULL, CurEnv); - - /* bail out if message too large */ - if (bitset(EF_CLRQUEUE, CurEnv->e_flags)) - { - finis(TRUE, ExitStat); - /*NOTREACHED*/ - return -1; - } - CurEnv->e_flags |= savedflags; - } - errno = 0; - - if (tTd(1, 1)) - printf("From person = \"%s\"\n", CurEnv->e_from.q_paddr); - - /* - ** Actually send everything. - ** If verifying, just ack. - */ - - CurEnv->e_from.q_flags |= QDONTSEND; - if (tTd(1, 5)) - { - printf("main: QDONTSEND "); - printaddr(&CurEnv->e_from, FALSE); - } - CurEnv->e_to = NULL; - CurrentLA = getla(); - GrabTo = FALSE; - sendall(CurEnv, SM_DEFAULT); - - /* - ** All done. - ** Don't send return error message if in VERIFY mode. - */ - - finis(TRUE, ExitStat); - /*NOTREACHED*/ - return -1; -} - -/* ARGSUSED */ -SIGFUNC_DECL -quiesce(sig) - int sig; -{ - finis(FALSE, EX_OK); -} - -/* ARGSUSED */ -SIGFUNC_DECL -intindebug(sig) - int sig; -{ - longjmp(TopFrame, 1); - return SIGFUNC_RETURN; -} - - -/* -** FINIS -- Clean up and exit. -** -** Parameters: -** drop -- whether or not to drop CurEnv envelope -** exitstat -- exit status to use for exit() call -** -** Returns: -** never -** -** Side Effects: -** exits sendmail -*/ - -void -finis(drop, exitstat) - bool drop; - volatile int exitstat; -{ - extern void closemaps __P((void)); -#ifdef USERDB - extern void _udbx_close __P((void)); -#endif - - if (tTd(2, 1)) - { - extern void printenvflags __P((ENVELOPE *)); - - printf("\n====finis: stat %d e_id=%s e_flags=", - exitstat, - CurEnv->e_id == NULL ? "NOQUEUE" : CurEnv->e_id); - printenvflags(CurEnv); - } - if (tTd(2, 9)) - printopenfds(FALSE); - - /* if we fail in finis(), just exit */ - if (setjmp(TopFrame) != 0) - { - /* failed -- just give it up */ - goto forceexit; - } - - /* clean up temp files */ - CurEnv->e_to = NULL; - if (drop && CurEnv->e_id != NULL) - dropenvelope(CurEnv, TRUE); - - /* flush any cached connections */ - mci_flush(TRUE, NULL); - - /* close maps belonging to this pid */ - closemaps(); - -#ifdef USERDB - /* close UserDatabase */ - _udbx_close(); -#endif - -# ifdef XLA - /* clean up extended load average stuff */ - xla_all_end(); -# endif - - /* and exit */ - forceexit: - if (LogLevel > 78) - sm_syslog(LOG_DEBUG, CurEnv->e_id, - "finis, pid=%d", - getpid()); - if (exitstat == EX_TEMPFAIL || CurEnv->e_errormode == EM_BERKNET) - exitstat = EX_OK; - - /* reset uid for process accounting */ - endpwent(); - setuid(RealUid); - - exit(exitstat); -} -/* -** INTSIG -- clean up on interrupt -** -** This just arranges to exit. It pessimises in that it -** may resend a message. -** -** Parameters: -** none. -** -** Returns: -** none. -** -** Side Effects: -** Unlocks the current job. -*/ - -/* ARGSUSED */ -SIGFUNC_DECL -intsig(sig) - int sig; -{ - if (LogLevel > 79) - sm_syslog(LOG_DEBUG, CurEnv->e_id, "interrupt"); - FileName = NULL; - unlockqueue(CurEnv); - closecontrolsocket(TRUE); -#ifdef XLA - xla_all_end(); -#endif - finis(FALSE, EX_OK); -} -/* -** INITMACROS -- initialize the macro system -** -** This just involves defining some macros that are actually -** used internally as metasymbols to be themselves. -** -** Parameters: -** none. -** -** Returns: -** none. -** -** Side Effects: -** initializes several macros to be themselves. -*/ - -struct metamac MetaMacros[] = -{ - /* LHS pattern matching characters */ - { '*', MATCHZANY }, { '+', MATCHANY }, { '-', MATCHONE }, - { '=', MATCHCLASS }, { '~', MATCHNCLASS }, - - /* these are RHS metasymbols */ - { '#', CANONNET }, { '@', CANONHOST }, { ':', CANONUSER }, - { '>', CALLSUBR }, - - /* the conditional operations */ - { '?', CONDIF }, { '|', CONDELSE }, { '.', CONDFI }, - - /* the hostname lookup characters */ - { '[', HOSTBEGIN }, { ']', HOSTEND }, - { '(', LOOKUPBEGIN }, { ')', LOOKUPEND }, - - /* miscellaneous control characters */ - { '&', MACRODEXPAND }, - - { '\0' } -}; - -#define MACBINDING(name, mid) \ - stab(name, ST_MACRO, ST_ENTER)->s_macro = mid; \ - MacroName[mid] = name; - -void -initmacros(e) - register ENVELOPE *e; -{ - register struct metamac *m; - register int c; - char buf[5]; - extern char *MacroName[256]; - - for (m = MetaMacros; m->metaname != '\0'; m++) - { - buf[0] = m->metaval; - buf[1] = '\0'; - define(m->metaname, newstr(buf), e); - } - buf[0] = MATCHREPL; - buf[2] = '\0'; - for (c = '0'; c <= '9'; c++) - { - buf[1] = c; - define(c, newstr(buf), e); - } - - /* set defaults for some macros sendmail will use later */ - define('n', "MAILER-DAEMON", e); - - /* set up external names for some internal macros */ - MACBINDING("opMode", MID_OPMODE); - /*XXX should probably add equivalents for all short macros here XXX*/ -} -/* -** DISCONNECT -- remove our connection with any foreground process -** -** Parameters: -** droplev -- how "deeply" we should drop the line. -** 0 -- ignore signals, mail back errors, make sure -** output goes to stdout. -** 1 -- also, make stdout go to transcript. -** 2 -- also, disconnect from controlling terminal -** (only for daemon mode). -** e -- the current envelope. -** -** Returns: -** none -** -** Side Effects: -** Trys to insure that we are immune to vagaries of -** the controlling tty. -*/ - -void -disconnect(droplev, e) - int droplev; - register ENVELOPE *e; -{ - int fd; - - if (tTd(52, 1)) - printf("disconnect: In %d Out %d, e=%lx\n", - fileno(InChannel), fileno(OutChannel), (u_long) e); - if (tTd(52, 100)) - { - printf("don't\n"); - return; - } - if (LogLevel > 93) - sm_syslog(LOG_DEBUG, e->e_id, - "disconnect level %d", - droplev); - - /* be sure we don't get nasty signals */ - (void) setsignal(SIGINT, SIG_IGN); - (void) setsignal(SIGQUIT, SIG_IGN); - - /* we can't communicate with our caller, so.... */ - HoldErrs = TRUE; - CurEnv->e_errormode = EM_MAIL; - Verbose = 0; - DisConnected = TRUE; - - /* all input from /dev/null */ - if (InChannel != stdin) - { - (void) fclose(InChannel); - InChannel = stdin; - } - if (freopen("/dev/null", "r", stdin) == NULL) - sm_syslog(LOG_ERR, e->e_id, - "disconnect: freopen(\"/dev/null\") failed: %s", - errstring(errno)); - - /* output to the transcript */ - if (OutChannel != stdout) - { - (void) fclose(OutChannel); - OutChannel = stdout; - } - if (droplev > 0) - { - if (e->e_xfp == NULL) - { - fd = open("/dev/null", O_WRONLY, 0666); - if (fd == -1) - sm_syslog(LOG_ERR, e->e_id, - "disconnect: open(\"/dev/null\") failed: %s", - errstring(errno)); - } - else - { - fd = fileno(e->e_xfp); - if (fd == -1) - sm_syslog(LOG_ERR, e->e_id, - "disconnect: fileno(e->e_xfp) failed: %s", - errstring(errno)); - } - (void) fflush(stdout); - dup2(fd, STDOUT_FILENO); - dup2(fd, STDERR_FILENO); - if (e->e_xfp == NULL) - close(fd); - } - - /* drop our controlling TTY completely if possible */ - if (droplev > 1) - { - (void) setsid(); - errno = 0; - } - -#if XDEBUG - checkfd012("disconnect"); -#endif - - if (LogLevel > 71) - sm_syslog(LOG_DEBUG, e->e_id, - "in background, pid=%d", - getpid()); - - errno = 0; -} - -static void -obsolete(argv) - char *argv[]; -{ - register char *ap; - register char *op; - - while ((ap = *++argv) != NULL) - { - /* Return if "--" or not an option of any form. */ - if (ap[0] != '-' || ap[1] == '-') - return; - - /* skip over options that do have a value */ - op = strchr(OPTIONS, ap[1]); - if (op != NULL && *++op == ':' && ap[2] == '\0' && - ap[1] != 'd' && -#if defined(sony_news) - ap[1] != 'E' && ap[1] != 'J' && -#endif - argv[1] != NULL && argv[1][0] != '-') - { - argv++; - continue; - } - - /* If -C doesn't have an argument, use sendmail.cf. */ -#define __DEFPATH "sendmail.cf" - if (ap[1] == 'C' && ap[2] == '\0') - { - *argv = xalloc(sizeof(__DEFPATH) + 2); - argv[0][0] = '-'; - argv[0][1] = 'C'; - (void)strcpy(&argv[0][2], __DEFPATH); - } - - /* If -q doesn't have an argument, run it once. */ - if (ap[1] == 'q' && ap[2] == '\0') - *argv = "-q0"; - - /* if -d doesn't have an argument, use 0-99.1 */ - if (ap[1] == 'd' && ap[2] == '\0') - *argv = "-d0-99.1"; - -# if defined(sony_news) - /* if -E doesn't have an argument, use -EC */ - if (ap[1] == 'E' && ap[2] == '\0') - *argv = "-EC"; - - /* if -J doesn't have an argument, use -JJ */ - if (ap[1] == 'J' && ap[2] == '\0') - *argv = "-JJ"; -# endif - } -} -/* -** AUTH_WARNING -- specify authorization warning -** -** Parameters: -** e -- the current envelope. -** msg -- the text of the message. -** args -- arguments to the message. -** -** Returns: -** none. -*/ - -void -#ifdef __STDC__ -auth_warning(register ENVELOPE *e, const char *msg, ...) -#else -auth_warning(e, msg, va_alist) - register ENVELOPE *e; - const char *msg; - va_dcl -#endif -{ - char buf[MAXLINE]; - VA_LOCAL_DECL - - if (bitset(PRIV_AUTHWARNINGS, PrivacyFlags)) - { - register char *p; - static char hostbuf[48]; - extern struct hostent *myhostname __P((char *, int)); - - if (hostbuf[0] == '\0') - (void) myhostname(hostbuf, sizeof hostbuf); - - (void) snprintf(buf, sizeof buf, "%s: ", hostbuf); - p = &buf[strlen(buf)]; - VA_START(msg); - vsnprintf(p, SPACELEFT(buf, p), msg, ap); - VA_END; - addheader("X-Authentication-Warning", buf, &e->e_header); - if (LogLevel > 3) - sm_syslog(LOG_INFO, e->e_id, - "Authentication-Warning: %.400s", - buf); - } -} -/* -** GETEXTENV -- get from external environment -** -** Parameters: -** envar -- the name of the variable to retrieve -** -** Returns: -** The value, if any. -*/ - -char * -getextenv(envar) - const char *envar; -{ - char **envp; - int l; - - l = strlen(envar); - for (envp = ExternalEnviron; *envp != NULL; envp++) - { - if (strncmp(*envp, envar, l) == 0 && (*envp)[l] == '=') - return &(*envp)[l + 1]; - } - return NULL; -} -/* -** SETUSERENV -- set an environment in the propogated environment -** -** Parameters: -** envar -- the name of the environment variable. -** value -- the value to which it should be set. If -** null, this is extracted from the incoming -** environment. If that is not set, the call -** to setuserenv is ignored. -** -** Returns: -** none. -*/ - -void -setuserenv(envar, value) - const char *envar; - const char *value; -{ - int i; - char **evp = UserEnviron; - char *p; - - if (value == NULL) - { - value = getextenv(envar); - if (value == NULL) - return; - } - - i = strlen(envar); - p = (char *) xalloc(strlen(value) + i + 2); - strcpy(p, envar); - p[i++] = '='; - strcpy(&p[i], value); - - while (*evp != NULL && strncmp(*evp, p, i) != 0) - evp++; - if (*evp != NULL) - { - *evp++ = p; - } - else if (evp < &UserEnviron[MAXUSERENVIRON]) - { - *evp++ = p; - *evp = NULL; - } - - /* make sure it is in our environment as well */ - if (putenv(p) < 0) - syserr("setuserenv: putenv(%s) failed", p); -} -/* -** DUMPSTATE -- dump state -** -** For debugging. -*/ - -void -dumpstate(when) - char *when; -{ - register char *j = macvalue('j', CurEnv); - int rs; - - sm_syslog(LOG_DEBUG, CurEnv->e_id, - "--- dumping state on %s: $j = %s ---", - when, - j == NULL ? "<NULL>" : j); - if (j != NULL) - { - if (!wordinclass(j, 'w')) - sm_syslog(LOG_DEBUG, CurEnv->e_id, - "*** $j not in $=w ***"); - } - sm_syslog(LOG_DEBUG, CurEnv->e_id, "CurChildren = %d", CurChildren); - sm_syslog(LOG_DEBUG, CurEnv->e_id, "--- open file descriptors: ---"); - printopenfds(TRUE); - sm_syslog(LOG_DEBUG, CurEnv->e_id, "--- connection cache: ---"); - mci_dump_all(TRUE); - rs = strtorwset("debug_dumpstate", NULL, ST_FIND); - if (rs > 0) - { - int stat; - register char **pvp; - char *pv[MAXATOM + 1]; - - pv[0] = NULL; - stat = rewrite(pv, rs, 0, CurEnv); - sm_syslog(LOG_DEBUG, CurEnv->e_id, - "--- ruleset debug_dumpstate returns stat %d, pv: ---", - stat); - for (pvp = pv; *pvp != NULL; pvp++) - sm_syslog(LOG_DEBUG, CurEnv->e_id, "%s", *pvp); - } - sm_syslog(LOG_DEBUG, CurEnv->e_id, "--- end of state dump ---"); -} - - -/* ARGSUSED */ -SIGFUNC_DECL -sigusr1(sig) - int sig; -{ - dumpstate("user signal"); - return SIGFUNC_RETURN; -} - - -/* ARGSUSED */ -SIGFUNC_DECL -sighup(sig) - int sig; -{ - if (SaveArgv[0][0] != '/') - { - if (LogLevel > 3) - sm_syslog(LOG_INFO, NOQID, "could not restart: need full path"); - finis(FALSE, EX_OSFILE); - } - if (LogLevel > 3) - sm_syslog(LOG_INFO, NOQID, "restarting %s on signal", SaveArgv[0]); - alarm(0); - releasesignal(SIGHUP); - closecontrolsocket(TRUE); - if (drop_privileges(TRUE) != EX_OK) - { - if (LogLevel > 0) - sm_syslog(LOG_ALERT, NOQID, "could not set[ug]id(%d, %d): %m", - RunAsUid, RunAsGid); - finis(FALSE, EX_OSERR); - } - execve(SaveArgv[0], (ARGV_T) SaveArgv, (ARGV_T) ExternalEnviron); - if (LogLevel > 0) - sm_syslog(LOG_ALERT, NOQID, "could not exec %s: %m", SaveArgv[0]); - finis(FALSE, EX_OSFILE); -} -/* -** DROP_PRIVILEGES -- reduce privileges to those of the RunAsUser option -** -** Parameters: -** to_real_uid -- if set, drop to the real uid instead -** of the RunAsUser. -** -** Returns: -** EX_OSERR if the setuid failed. -** EX_OK otherwise. -*/ - -int -drop_privileges(to_real_uid) - bool to_real_uid; -{ - int rval = EX_OK; - GIDSET_T emptygidset[1]; - - if (tTd(47, 1)) - printf("drop_privileges(%d): Real[UG]id=%d:%d, RunAs[UG]id=%d:%d\n", - (int)to_real_uid, (int)RealUid, (int)RealGid, (int)RunAsUid, (int)RunAsGid); - - if (to_real_uid) - { - RunAsUserName = RealUserName; - RunAsUid = RealUid; - RunAsGid = RealGid; - } - - /* make sure no one can grab open descriptors for secret files */ - endpwent(); - - /* reset group permissions; these can be set later */ - emptygidset[0] = (to_real_uid || RunAsGid != 0) ? RunAsGid : getegid(); - if (setgroups(1, emptygidset) == -1 && geteuid() == 0) - rval = EX_OSERR; - - /* reset primary group and user id */ - if ((to_real_uid || RunAsGid != 0) && setgid(RunAsGid) < 0) - rval = EX_OSERR; - if ((to_real_uid || RunAsUid != 0) && setuid(RunAsUid) < 0) - rval = EX_OSERR; - if (tTd(47, 5)) - { - printf("drop_privileges: e/ruid = %d/%d e/rgid = %d/%d\n", - (int)geteuid(), (int)getuid(), (int)getegid(), (int)getgid()); - printf("drop_privileges: RunAsUser = %d:%d\n", (int)RunAsUid, (int)RunAsGid); - } - return rval; -} -/* -** FILL_FD -- make sure a file descriptor has been properly allocated -** -** Used to make sure that stdin/out/err are allocated on startup -** -** Parameters: -** fd -- the file descriptor to be filled. -** where -- a string used for logging. If NULL, this is -** being called on startup, and logging should -** not be done. -** -** Returns: -** none -*/ - -void -fill_fd(fd, where) - int fd; - char *where; -{ - int i; - struct stat stbuf; - - if (fstat(fd, &stbuf) >= 0 || errno != EBADF) - return; - - if (where != NULL) - syserr("fill_fd: %s: fd %d not open", where, fd); - else - MissingFds |= 1 << fd; - i = open("/dev/null", fd == 0 ? O_RDONLY : O_WRONLY, 0666); - if (i < 0) - { - syserr("!fill_fd: %s: cannot open /dev/null", - where == NULL ? "startup" : where); - } - if (fd != i) - { - (void) dup2(i, fd); - (void) close(i); - } -} -/* -** TESTMODELINE -- process a test mode input line -** -** Parameters: -** line -- the input line. -** e -- the current environment. -** Syntax: -** # a comment -** .X process X as a configuration line -** =X dump a configuration item (such as mailers) -** $X dump a macro or class -** /X try an activity -** X normal process through rule set X -*/ - -void -testmodeline(line, e) - char *line; - ENVELOPE *e; -{ - register char *p; - char *q; - auto char *delimptr; - int mid; - int i, rs; - STAB *map; - char **s; - struct rewrite *rw; - ADDRESS a; - static int tryflags = RF_COPYNONE; - char exbuf[MAXLINE]; - extern bool invalidaddr __P((char *, char *)); - extern char *crackaddr __P((char *)); - extern void dump_class __P((STAB *, int)); - extern void translate_dollars __P((char *)); - extern void help __P((char *)); - - switch (line[0]) - { - case '#': - case 0: - return; - - case '?': - help("-bt"); - return; - - case '.': /* config-style settings */ - switch (line[1]) - { - case 'D': - mid = macid(&line[2], &delimptr); - if (mid == '\0') - return; - translate_dollars(delimptr); - define(mid, newstr(delimptr), e); - break; - - case 'C': - if (line[2] == '\0') /* not to call syserr() */ - return; - - mid = macid(&line[2], &delimptr); - if (mid == '\0') - return; - translate_dollars(delimptr); - expand(delimptr, exbuf, sizeof exbuf, e); - p = exbuf; - while (*p != '\0') - { - register char *wd; - char delim; - - while (*p != '\0' && isascii(*p) && isspace(*p)) - p++; - wd = p; - while (*p != '\0' && !(isascii(*p) && isspace(*p))) - p++; - delim = *p; - *p = '\0'; - if (wd[0] != '\0') - setclass(mid, wd); - *p = delim; - } - break; - - case '\0': - printf("Usage: .[DC]macro value(s)\n"); - break; - - default: - printf("Unknown \".\" command %s\n", line); - break; - } - return; - - case '=': /* config-style settings */ - switch (line[1]) - { - case 'S': /* dump rule set */ - rs = strtorwset(&line[2], NULL, ST_FIND); - if (rs < 0) - { - printf("Undefined ruleset %s\n", &line[2]); - return; - } - rw = RewriteRules[rs]; - if (rw == NULL) - return; - do - { - putchar('R'); - s = rw->r_lhs; - while (*s != NULL) - { - xputs(*s++); - putchar(' '); - } - putchar('\t'); - putchar('\t'); - s = rw->r_rhs; - while (*s != NULL) - { - xputs(*s++); - putchar(' '); - } - putchar('\n'); - } while ((rw = rw->r_next) != NULL); - break; - - case 'M': - for (i = 0; i < MAXMAILERS; i++) - { - if (Mailer[i] != NULL) - printmailer(Mailer[i]); - } - break; - - case '\0': - printf("Usage: =Sruleset or =M\n"); - break; - - default: - printf("Unknown \"=\" command %s\n", line); - break; - } - return; - - case '-': /* set command-line-like opts */ - switch (line[1]) - { - case 'd': - tTflag(&line[2]); - break; - - case '\0': - printf("Usage: -d{debug arguments}\n"); - break; - - default: - printf("Unknown \"-\" command %s\n", line); - break; - } - return; - - case '$': - if (line[1] == '=') - { - mid = macid(&line[2], NULL); - if (mid != '\0') - stabapply(dump_class, mid); - return; - } - mid = macid(&line[1], NULL); - if (mid == '\0') - return; - p = macvalue(mid, e); - if (p == NULL) - printf("Undefined\n"); - else - { - xputs(p); - printf("\n"); - } - return; - - case '/': /* miscellaneous commands */ - p = &line[strlen(line)]; - while (--p >= line && isascii(*p) && isspace(*p)) - *p = '\0'; - p = strpbrk(line, " \t"); - if (p != NULL) - { - while (isascii(*p) && isspace(*p)) - *p++ = '\0'; - } - else - p = ""; - if (line[1] == '\0') - { - printf("Usage: /[canon|map|mx|parse|try|tryflags]\n"); - return; - } - if (strcasecmp(&line[1], "mx") == 0) - { -#if NAMED_BIND - /* look up MX records */ - int nmx; - auto int rcode; - char *mxhosts[MAXMXHOSTS + 1]; - - if (*p == '\0') - { - printf("Usage: /mx address\n"); - return; - } - nmx = getmxrr(p, mxhosts, FALSE, &rcode); - printf("getmxrr(%s) returns %d value(s):\n", p, nmx); - for (i = 0; i < nmx; i++) - printf("\t%s\n", mxhosts[i]); -#else - printf("No MX code compiled in\n"); -#endif - } - else if (strcasecmp(&line[1], "canon") == 0) - { - char host[MAXHOSTNAMELEN]; - - if (*p == '\0') - { - printf("Usage: /canon address\n"); - return; - } - else if (strlen(p) >= sizeof host) - { - printf("Name too long\n"); - return; - } - strcpy(host, p); - (void) getcanonname(host, sizeof(host), HasWildcardMX); - printf("getcanonname(%s) returns %s\n", p, host); - } - else if (strcasecmp(&line[1], "map") == 0) - { - auto int rcode = EX_OK; - char *av[2]; - - if (*p == '\0') - { - printf("Usage: /map mapname key\n"); - return; - } - for (q = p; *q != '\0' && !(isascii(*q) && isspace(*q)); q++) - continue; - if (*q == '\0') - { - printf("No key specified\n"); - return; - } - *q++ = '\0'; - map = stab(p, ST_MAP, ST_FIND); - if (map == NULL) - { - printf("Map named \"%s\" not found\n", p); - return; - } - if (!bitset(MF_OPEN, map->s_map.map_mflags)) - { - printf("Map named \"%s\" not open\n", p); - return; - } - printf("map_lookup: %s (%s) ", p, q); - av[0] = q; - av[1] = NULL; - p = (*map->s_map.map_class->map_lookup) - (&map->s_map, q, av, &rcode); - if (p == NULL) - printf("no match (%d)\n", rcode); - else - printf("returns %s (%d)\n", p, rcode); - } - else if (strcasecmp(&line[1], "try") == 0) - { - MAILER *m; - STAB *s; - auto int rcode = EX_OK; - - q = strpbrk(p, " \t"); - if (q != NULL) - { - while (isascii(*q) && isspace(*q)) - *q++ = '\0'; - } - if (q == NULL || *q == '\0') - { - printf("Usage: /try mailer address\n"); - return; - } - s = stab(p, ST_MAILER, ST_FIND); - if (s == NULL) - { - printf("Unknown mailer %s\n", p); - return; - } - m = s->s_mailer; - printf("Trying %s %s address %s for mailer %s\n", - bitset(RF_HEADERADDR, tryflags) ? "header" : "envelope", - bitset(RF_SENDERADDR, tryflags) ? "sender" : "recipient", - q, p); - p = remotename(q, m, tryflags, &rcode, CurEnv); - printf("Rcode = %d, addr = %s\n", - rcode, p == NULL ? "<NULL>" : p); - e->e_to = NULL; - } - else if (strcasecmp(&line[1], "tryflags") == 0) - { - if (*p == '\0') - { - printf("Usage: /tryflags [Hh|Ee][Ss|Rr]\n"); - return; - } - for (; *p != '\0'; p++) - { - switch (*p) - { - case 'H': - case 'h': - tryflags |= RF_HEADERADDR; - break; - - case 'E': - case 'e': - tryflags &= ~RF_HEADERADDR; - break; - - case 'S': - case 's': - tryflags |= RF_SENDERADDR; - break; - - case 'R': - case 'r': - tryflags &= ~RF_SENDERADDR; - break; - } - } - } - else if (strcasecmp(&line[1], "parse") == 0) - { - if (*p == '\0') - { - printf("Usage: /parse address\n"); - return; - } - q = crackaddr(p); - printf("Cracked address = "); - xputs(q); - printf("\nParsing %s %s address\n", - bitset(RF_HEADERADDR, tryflags) ? "header" : "envelope", - bitset(RF_SENDERADDR, tryflags) ? "sender" : "recipient"); - if (parseaddr(p, &a, tryflags, '\0', NULL, e) == NULL) - printf("Cannot parse\n"); - else if (a.q_host != NULL && a.q_host[0] != '\0') - printf("mailer %s, host %s, user %s\n", - a.q_mailer->m_name, a.q_host, a.q_user); - else - printf("mailer %s, user %s\n", - a.q_mailer->m_name, a.q_user); - e->e_to = NULL; - } - else - { - printf("Unknown \"/\" command %s\n", line); - } - return; - } - - for (p = line; isascii(*p) && isspace(*p); p++) - continue; - q = p; - while (*p != '\0' && !(isascii(*p) && isspace(*p))) - p++; - if (*p == '\0') - { - printf("No address!\n"); - return; - } - *p = '\0'; - if (invalidaddr(p + 1, NULL)) - return; - do - { - register char **pvp; - char pvpbuf[PSBUFSIZE]; - - pvp = prescan(++p, ',', pvpbuf, sizeof pvpbuf, - &delimptr, NULL); - if (pvp == NULL) - continue; - p = q; - while (*p != '\0') - { - int stat; - - rs = strtorwset(p, NULL, ST_FIND); - if (rs < 0) - { - printf("Undefined ruleset %s\n", p); - break; - } - stat = rewrite(pvp, rs, 0, e); - if (stat != EX_OK) - printf("== Ruleset %s (%d) status %d\n", - p, rs, stat); - while (*p != '\0' && *p++ != ',') - continue; - } - } while (*(p = delimptr) != '\0'); -} - - -void -dump_class(s, id) - register STAB *s; - int id; -{ - if (s->s_type != ST_CLASS) - return; - if (bitnset(id & 0xff, s->s_class)) - printf("%s\n", s->s_name); -} diff --git a/src/makesendmail b/src/makesendmail deleted file mode 120000 index 6308dba..0000000 --- a/src/makesendmail +++ /dev/null @@ -1 +0,0 @@ -../BuildTools/bin/Build
\ No newline at end of file diff --git a/src/map.c b/src/map.c deleted file mode 100644 index 8fc3387..0000000 --- a/src/map.c +++ /dev/null @@ -1,5209 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1992, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)map.c 8.261 (Berkeley) 2/2/1999"; -#endif /* not lint */ - -#include "sendmail.h" - -#ifdef NDBM -# include <ndbm.h> -# ifdef R_FIRST - ERROR README: You are running the Berkeley DB version of ndbm.h. See - ERROR README: the README file about tweaking Berkeley DB so it can - ERROR README: coexist with NDBM, or delete -DNDBM from the Makefile - ERROR README: and use -DNEWDB instead. -# endif -#endif -#ifdef NEWDB -# include <db.h> -# ifndef DB_VERSION_MAJOR -# define DB_VERSION_MAJOR 1 -# endif -#endif -#ifdef NIS - struct dom_binding; /* forward reference needed on IRIX */ -# include <rpcsvc/ypclnt.h> -# ifdef NDBM -# define NDBM_YP_COMPAT /* create YP-compatible NDBM files */ -# endif -#endif - -/* -** MAP.C -- implementations for various map classes. -** -** Each map class implements a series of functions: -** -** bool map_parse(MAP *map, char *args) -** Parse the arguments from the config file. Return TRUE -** if they were ok, FALSE otherwise. Fill in map with the -** values. -** -** char *map_lookup(MAP *map, char *key, char **args, int *pstat) -** Look up the key in the given map. If found, do any -** rewriting the map wants (including "args" if desired) -** and return the value. Set *pstat to the appropriate status -** on error and return NULL. Args will be NULL if called -** from the alias routines, although this should probably -** not be relied upon. It is suggested you call map_rewrite -** to return the results -- it takes care of null termination -** and uses a dynamically expanded buffer as needed. -** -** void map_store(MAP *map, char *key, char *value) -** Store the key:value pair in the map. -** -** bool map_open(MAP *map, int mode) -** Open the map for the indicated mode. Mode should -** be either O_RDONLY or O_RDWR. Return TRUE if it -** was opened successfully, FALSE otherwise. If the open -** failed an the MF_OPTIONAL flag is not set, it should -** also print an error. If the MF_ALIAS bit is set -** and this map class understands the @:@ convention, it -** should call aliaswait() before returning. -** -** void map_close(MAP *map) -** Close the map. -** -** This file also includes the implementation for getcanonname. -** It is currently implemented in a pretty ad-hoc manner; it ought -** to be more properly integrated into the map structure. -*/ - -#define DBMMODE 0644 - -#ifndef EX_NOTFOUND -# define EX_NOTFOUND EX_NOHOST -#endif - -extern bool aliaswait __P((MAP *, char *, int)); -extern bool extract_canonname __P((char *, char *, char[], int)); - -#if O_EXLOCK && HASFLOCK && !BOGUS_O_EXCL -# define LOCK_ON_OPEN 1 /* we can open/create a locked file */ -#else -# define LOCK_ON_OPEN 0 /* no such luck -- bend over backwards */ -#endif - -#ifndef O_ACCMODE -# define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR) -#endif -/* -** MAP_PARSEARGS -- parse config line arguments for database lookup -** -** This is a generic version of the map_parse method. -** -** Parameters: -** map -- the map being initialized. -** ap -- a pointer to the args on the config line. -** -** Returns: -** TRUE -- if everything parsed OK. -** FALSE -- otherwise. -** -** Side Effects: -** null terminates the filename; stores it in map -*/ - -bool -map_parseargs(map, ap) - MAP *map; - char *ap; -{ - register char *p = ap; - - map->map_mflags |= MF_TRY0NULL | MF_TRY1NULL; - for (;;) - { - while (isascii(*p) && isspace(*p)) - p++; - if (*p != '-') - break; - switch (*++p) - { - case 'N': - map->map_mflags |= MF_INCLNULL; - map->map_mflags &= ~MF_TRY0NULL; - break; - - case 'O': - map->map_mflags &= ~MF_TRY1NULL; - break; - - case 'o': - map->map_mflags |= MF_OPTIONAL; - break; - - case 'f': - map->map_mflags |= MF_NOFOLDCASE; - break; - - case 'm': - map->map_mflags |= MF_MATCHONLY; - break; - - case 'A': - map->map_mflags |= MF_APPEND; - break; - - case 'q': - map->map_mflags |= MF_KEEPQUOTES; - break; - - case 'a': - map->map_app = ++p; - break; - - case 'T': - map->map_tapp = ++p; - break; - - case 'k': - while (isascii(*++p) && isspace(*p)) - continue; - map->map_keycolnm = p; - break; - - case 'v': - while (isascii(*++p) && isspace(*p)) - continue; - map->map_valcolnm = p; - break; - - case 'z': - if (*++p != '\\') - map->map_coldelim = *p; - else - { - switch (*++p) - { - case 'n': - map->map_coldelim = '\n'; - break; - - case 't': - map->map_coldelim = '\t'; - break; - - default: - map->map_coldelim = '\\'; - } - } - break; - - case 't': - map->map_mflags |= MF_NODEFER; - break; - -#ifdef RESERVED_FOR_SUN - case 'd': - map->map_mflags |= MF_DOMAIN_WIDE; - break; - - case 's': - /* info type */ - break; -#endif - } - while (*p != '\0' && !(isascii(*p) && isspace(*p))) - p++; - if (*p != '\0') - *p++ = '\0'; - } - if (map->map_app != NULL) - map->map_app = newstr(map->map_app); - if (map->map_tapp != NULL) - map->map_tapp = newstr(map->map_tapp); - if (map->map_keycolnm != NULL) - map->map_keycolnm = newstr(map->map_keycolnm); - if (map->map_valcolnm != NULL) - map->map_valcolnm = newstr(map->map_valcolnm); - - if (*p != '\0') - { - map->map_file = p; - while (*p != '\0' && !(isascii(*p) && isspace(*p))) - p++; - if (*p != '\0') - *p++ = '\0'; - map->map_file = newstr(map->map_file); - } - - while (*p != '\0' && isascii(*p) && isspace(*p)) - p++; - if (*p != '\0') - map->map_rebuild = newstr(p); - - if (map->map_file == NULL && - !bitset(MCF_OPTFILE, map->map_class->map_cflags)) - { - syserr("No file name for %s map %s", - map->map_class->map_cname, map->map_mname); - return FALSE; - } - return TRUE; -} -/* -** MAP_REWRITE -- rewrite a database key, interpolating %n indications. -** -** It also adds the map_app string. It can be used as a utility -** in the map_lookup method. -** -** Parameters: -** map -- the map that causes this. -** s -- the string to rewrite, NOT necessarily null terminated. -** slen -- the length of s. -** av -- arguments to interpolate into buf. -** -** Returns: -** Pointer to rewritten result. This is static data that -** should be copied if it is to be saved! -** -** Side Effects: -** none. -*/ - -char * -map_rewrite(map, s, slen, av) - register MAP *map; - register const char *s; - size_t slen; - char **av; -{ - register char *bp; - register char c; - char **avp; - register char *ap; - size_t l; - size_t len; - static size_t buflen = 0; - static char *buf = NULL; - - if (tTd(39, 1)) - { - printf("map_rewrite(%.*s), av =", (int)slen, s); - if (av == NULL) - printf(" (nullv)"); - else - { - for (avp = av; *avp != NULL; avp++) - printf("\n\t%s", *avp); - } - printf("\n"); - } - - /* count expected size of output (can safely overestimate) */ - l = len = slen; - if (av != NULL) - { - const char *sp = s; - - while (l-- > 0 && (c = *sp++) != '\0') - { - if (c != '%') - continue; - if (l-- <= 0) - break; - c = *sp++; - if (!(isascii(c) && isdigit(c))) - continue; - for (avp = av; --c >= '0' && *avp != NULL; avp++) - continue; - if (*avp == NULL) - continue; - len += strlen(*avp); - } - } - if (map->map_app != NULL) - len += strlen(map->map_app); - if (buflen < ++len) - { - /* need to malloc additional space */ - buflen = len; - if (buf != NULL) - free(buf); - buf = xalloc(buflen); - } - - bp = buf; - if (av == NULL) - { - bcopy(s, bp, slen); - bp += slen; - } - else - { - while (slen-- > 0 && (c = *s++) != '\0') - { - if (c != '%') - { - pushc: - *bp++ = c; - continue; - } - if (slen-- <= 0 || (c = *s++) == '\0') - c = '%'; - if (c == '%') - goto pushc; - if (!(isascii(c) && isdigit(c))) - { - *bp++ = '%'; - goto pushc; - } - for (avp = av; --c >= '0' && *avp != NULL; avp++) - continue; - if (*avp == NULL) - continue; - - /* transliterate argument into output string */ - for (ap = *avp; (c = *ap++) != '\0'; ) - *bp++ = c; - } - } - if (map->map_app != NULL) - strcpy(bp, map->map_app); - else - *bp = '\0'; - if (tTd(39, 1)) - printf("map_rewrite => %s\n", buf); - return buf; -} -/* -** INITMAPS -- initialize for aliasing -** -** Parameters: -** rebuild -- if TRUE, this rebuilds the cached versions. -** e -- current envelope. -** -** Returns: -** none. -** -** Side Effects: -** initializes aliases: -** if alias database: opens the database. -** if no database available: reads aliases into the symbol table. -*/ - -void -initmaps(rebuild, e) - bool rebuild; - register ENVELOPE *e; -{ - extern void map_init __P((STAB *, int)); - -#if XDEBUG - checkfd012("entering initmaps"); -#endif - CurEnv = e; - - stabapply(map_init, 0); - stabapply(map_init, rebuild ? 2 : 1); -#if XDEBUG - checkfd012("exiting initmaps"); -#endif -} - -void -map_init(s, pass) - register STAB *s; - int pass; -{ - bool rebuildable; - register MAP *map; - - /* has to be a map */ - if (s->s_type != ST_MAP) - return; - - map = &s->s_map; - if (!bitset(MF_VALID, map->map_mflags)) - return; - - if (tTd(38, 2)) - printf("map_init(%s:%s, %s, %d)\n", - map->map_class->map_cname == NULL ? "NULL" : - map->map_class->map_cname, - map->map_mname == NULL ? "NULL" : map->map_mname, - map->map_file == NULL ? "NULL" : map->map_file, - pass); - - /* - ** Pass 0 opens all non-rebuildable maps. - ** Pass 1 opens all rebuildable maps for read. - ** Pass 2 rebuilds all rebuildable maps. - */ - - rebuildable = (bitset(MF_ALIAS, map->map_mflags) && - bitset(MCF_REBUILDABLE, map->map_class->map_cflags)); - - if ((pass == 0 && rebuildable) || - ((pass == 1 || pass == 2) && !rebuildable)) - { - if (tTd(38, 3)) - printf("\twrong pass (pass = %d, rebuildable = %d)\n", - pass, rebuildable); - return; - } - - /* if already open, close it (for nested open) */ - if (bitset(MF_OPEN, map->map_mflags)) - { - map->map_class->map_close(map); - map->map_mflags &= ~(MF_OPEN|MF_WRITABLE); - } - - if (pass == 2) - { - (void) rebuildaliases(map, FALSE); - return; - } - - if (map->map_class->map_open(map, O_RDONLY)) - { - if (tTd(38, 4)) - printf("\t%s:%s %s: valid\n", - map->map_class->map_cname == NULL ? "NULL" : - map->map_class->map_cname, - map->map_mname == NULL ? "NULL" : - map->map_mname, - map->map_file == NULL ? "NULL" : - map->map_file); - map->map_mflags |= MF_OPEN; - map->map_pid = getpid(); - } - else - { - if (tTd(38, 4)) - printf("\t%s:%s %s: invalid: %s\n", - map->map_class->map_cname == NULL ? "NULL" : - map->map_class->map_cname, - map->map_mname == NULL ? "NULL" : - map->map_mname, - map->map_file == NULL ? "NULL" : - map->map_file, - errstring(errno)); - if (!bitset(MF_OPTIONAL, map->map_mflags)) - { - extern MAPCLASS BogusMapClass; - - map->map_class = &BogusMapClass; - map->map_mflags |= MF_OPEN; - map->map_pid = getpid(); - } - } -} -/* -** CLOSEMAPS -- close all open maps opened by the current pid. -** -** Parameters: -** none -** -** Returns: -** none. -*/ - -void -closemaps() -{ - extern void map_close __P((STAB *, int)); - - stabapply(map_close, 0); -} - -/* ARGSUSED1 */ -void -map_close(s, unused) - register STAB *s; - int unused; -{ - MAP *map; - - if (s->s_type != ST_MAP) - return; - - map = &s->s_map; - - if (!bitset(MF_VALID, map->map_mflags) || - !bitset(MF_OPEN, map->map_mflags) || - map->map_pid != getpid()) - return; - - if (tTd(38, 5)) - printf("closemaps: closing %s (%s)\n", - map->map_mname == NULL ? "NULL" : map->map_mname, - map->map_file == NULL ? "NULL" : map->map_file); - - map->map_class->map_close(map); - map->map_mflags &= ~(MF_OPEN|MF_WRITABLE); -} -/* -** GETCANONNAME -- look up name using service switch -** -** Parameters: -** host -- the host name to look up. -** hbsize -- the size of the host buffer. -** trymx -- if set, try MX records. -** -** Returns: -** TRUE -- if the host was found. -** FALSE -- otherwise. -*/ - -bool -getcanonname(host, hbsize, trymx) - char *host; - int hbsize; - bool trymx; -{ - int nmaps; - int mapno; - bool found = FALSE; - bool got_tempfail = FALSE; - auto int stat; - char *maptype[MAXMAPSTACK]; - short mapreturn[MAXMAPACTIONS]; - - nmaps = switch_map_find("hosts", maptype, mapreturn); - for (mapno = 0; mapno < nmaps; mapno++) - { - int i; - - if (tTd(38, 20)) - printf("getcanonname(%s), trying %s\n", - host, maptype[mapno]); - if (strcmp("files", maptype[mapno]) == 0) - { - extern bool text_getcanonname __P((char *, int, int *)); - - found = text_getcanonname(host, hbsize, &stat); - } -#ifdef NIS - else if (strcmp("nis", maptype[mapno]) == 0) - { - extern bool nis_getcanonname __P((char *, int, int *)); - - found = nis_getcanonname(host, hbsize, &stat); - } -#endif -#ifdef NISPLUS - else if (strcmp("nisplus", maptype[mapno]) == 0) - { - extern bool nisplus_getcanonname __P((char *, int, int *)); - - found = nisplus_getcanonname(host, hbsize, &stat); - } -#endif -#if NAMED_BIND - else if (strcmp("dns", maptype[mapno]) == 0) - { - extern bool dns_getcanonname __P((char *, int, bool, int *)); - - found = dns_getcanonname(host, hbsize, trymx, &stat); - } -#endif -#if NETINFO - else if (strcmp("netinfo", maptype[mapno]) == 0) - { - extern bool ni_getcanonname __P((char *, int, int *)); - - found = ni_getcanonname(host, hbsize, &stat); - } -#endif - else - { - found = FALSE; - stat = EX_UNAVAILABLE; - } - - /* - ** Heuristic: if $m is not set, we are running during system - ** startup. In this case, when a name is apparently found - ** but has no dot, treat is as not found. This avoids - ** problems if /etc/hosts has no FQDN but is listed first - ** in the service switch. - */ - - if (found && - (macvalue('m', CurEnv) != NULL || strchr(host, '.') != NULL)) - break; - - /* see if we should continue */ - if (stat == EX_TEMPFAIL) - { - i = MA_TRYAGAIN; - got_tempfail = TRUE; - } - else if (stat == EX_NOTFOUND) - i = MA_NOTFOUND; - else - i = MA_UNAVAIL; - if (bitset(1 << mapno, mapreturn[i])) - break; - } - - if (found) - { - char *d; - - if (tTd(38, 20)) - printf("getcanonname(%s), found\n", host); - - /* - ** If returned name is still single token, compensate - ** by tagging on $m. This is because some sites set - ** up their DNS or NIS databases wrong. - */ - - if ((d = strchr(host, '.')) == NULL || d[1] == '\0') - { - d = macvalue('m', CurEnv); - if (d != NULL && - hbsize > (int) (strlen(host) + strlen(d) + 1)) - { - if (host[strlen(host) - 1] != '.') - strcat(host, "."); - strcat(host, d); - } - else - { - return FALSE; - } - } - return TRUE; - } - - if (tTd(38, 20)) - printf("getcanonname(%s), failed, stat=%d\n", host, stat); - -#if NAMED_BIND - if (got_tempfail) - h_errno = TRY_AGAIN; - else - h_errno = HOST_NOT_FOUND; -#endif - - return FALSE; -} -/* -** EXTRACT_CANONNAME -- extract canonical name from /etc/hosts entry -** -** Parameters: -** name -- the name against which to match. -** line -- the /etc/hosts line. -** cbuf -- the location to store the result. -** cbuflen -- the size of cbuf. -** -** Returns: -** TRUE -- if the line matched the desired name. -** FALSE -- otherwise. -*/ - -bool -extract_canonname(name, line, cbuf, cbuflen) - char *name; - char *line; - char cbuf[]; - int cbuflen; -{ - int i; - char *p; - bool found = FALSE; - extern char *get_column __P((char *, int, char, char *, int)); - - cbuf[0] = '\0'; - if (line[0] == '#') - return FALSE; - - for (i = 1; ; i++) - { - char nbuf[MAXNAME + 1]; - - p = get_column(line, i, '\0', nbuf, sizeof nbuf); - if (p == NULL) - break; - if (*p == '\0') - continue; - if (cbuf[0] == '\0' || - (strchr(cbuf, '.') == NULL && strchr(p, '.') != NULL)) - { - snprintf(cbuf, cbuflen, "%s", p); - } - if (strcasecmp(name, p) == 0) - found = TRUE; - } - if (found && strchr(cbuf, '.') == NULL) - { - /* try to add a domain on the end of the name */ - char *domain = macvalue('m', CurEnv); - - if (domain != NULL && - strlen(domain) + strlen(cbuf) + 1 < cbuflen) - { - p = &cbuf[strlen(cbuf)]; - *p++ = '.'; - strcpy(p, domain); - } - } - return found; -} -/* -** NDBM modules -*/ - -#ifdef NDBM - -/* -** NDBM_MAP_OPEN -- DBM-style map open -*/ - -bool -ndbm_map_open(map, mode) - MAP *map; - int mode; -{ - register DBM *dbm; - struct stat st; - int dfd; - int pfd; - int sff; - int ret; - int smode = S_IREAD; - char dirfile[MAXNAME + 1]; - char pagfile[MAXNAME + 1]; - struct stat std, stp; - - if (tTd(38, 2)) - printf("ndbm_map_open(%s, %s, %d)\n", - map->map_mname, map->map_file, mode); - map->map_lockfd = -1; - mode &= O_ACCMODE; - - /* do initial file and directory checks */ - snprintf(dirfile, sizeof dirfile, "%s.dir", map->map_file); - snprintf(pagfile, sizeof pagfile, "%s.pag", map->map_file); - sff = SFF_ROOTOK|SFF_REGONLY; - if (mode == O_RDWR) - { - sff |= SFF_CREAT; - if (!bitset(DBS_WRITEMAPTOSYMLINK, DontBlameSendmail)) - sff |= SFF_NOSLINK; - if (!bitset(DBS_WRITEMAPTOHARDLINK, DontBlameSendmail)) - sff |= SFF_NOHLINK; - smode = S_IWRITE; - } - else - { - if (!bitset(DBS_LINKEDMAPINWRITABLEDIR, DontBlameSendmail)) - sff |= SFF_NOWLINK; - } - if (!bitset(DBS_MAPINUNSAFEDIRPATH, DontBlameSendmail)) - sff |= SFF_SAFEDIRPATH; - ret = safefile(dirfile, RunAsUid, RunAsGid, RunAsUserName, - sff, smode, &std); - if (ret == 0) - ret = safefile(pagfile, RunAsUid, RunAsGid, RunAsUserName, - sff, smode, &stp); - if (ret == ENOENT && AutoRebuild && - bitset(MCF_REBUILDABLE, map->map_class->map_cflags) && - (bitset(MF_IMPL_NDBM, map->map_mflags) || - bitset(MF_ALIAS, map->map_mflags)) && - mode == O_RDONLY) - { - bool impl = bitset(MF_IMPL_NDBM, map->map_mflags); - extern bool impl_map_open __P((MAP *, int)); - - /* may be able to rebuild */ - map->map_mflags &= ~MF_IMPL_NDBM; - if (!rebuildaliases(map, TRUE)) - return FALSE; - if (impl) - return impl_map_open(map, O_RDONLY); - else - return ndbm_map_open(map, O_RDONLY); - } - if (ret != 0) - { - char *prob = "unsafe"; - - /* cannot open this map */ - if (ret == ENOENT) - prob = "missing"; - if (tTd(38, 2)) - printf("\t%s map file: %d\n", prob, ret); - if (!bitset(MF_OPTIONAL, map->map_mflags)) - syserr("dbm map \"%s\": %s map file %s", - map->map_mname, prob, map->map_file); - return FALSE; - } - if (std.st_mode == ST_MODE_NOFILE) - mode |= O_CREAT|O_EXCL; - -#if LOCK_ON_OPEN - if (mode == O_RDONLY) - mode |= O_SHLOCK; - else - mode |= O_TRUNC|O_EXLOCK; -#else - if ((mode & O_ACCMODE) == O_RDWR) - { -# if NOFTRUNCATE - /* - ** Warning: race condition. Try to lock the file as - ** quickly as possible after opening it. - ** This may also have security problems on some systems, - ** but there isn't anything we can do about it. - */ - - mode |= O_TRUNC; -# else - /* - ** This ugly code opens the map without truncating it, - ** locks the file, then truncates it. Necessary to - ** avoid race conditions. - */ - - int dirfd; - int pagfd; - int sff = SFF_CREAT|SFF_OPENASROOT; - - if (!bitset(DBS_WRITEMAPTOSYMLINK, DontBlameSendmail)) - sff |= SFF_NOSLINK; - if (!bitset(DBS_WRITEMAPTOHARDLINK, DontBlameSendmail)) - sff |= SFF_NOHLINK; - - dirfd = safeopen(dirfile, mode, DBMMODE, sff); - pagfd = safeopen(pagfile, mode, DBMMODE, sff); - - if (dirfd < 0 || pagfd < 0) - { - int save_errno = errno; - - if (dirfd >= 0) - (void) close(dirfd); - if (pagfd >= 0) - (void) close(pagfd); - errno = save_errno; - syserr("ndbm_map_open: cannot create database %s", - map->map_file); - return FALSE; - } - if (ftruncate(dirfd, (off_t) 0) < 0 || - ftruncate(pagfd, (off_t) 0) < 0) - { - int save_errno = errno; - - (void) close(dirfd); - (void) close(pagfd); - errno = save_errno; - syserr("ndbm_map_open: cannot truncate %s.{dir,pag}", - map->map_file); - return FALSE; - } - - /* if new file, get "before" bits for later filechanged check */ - if (std.st_mode == ST_MODE_NOFILE && - (fstat(dirfd, &std) < 0 || fstat(pagfd, &stp) < 0)) - { - int save_errno = errno; - - (void) close(dirfd); - (void) close(pagfd); - errno = save_errno; - syserr("ndbm_map_open(%s.{dir,pag}): cannot fstat pre-opened file", - map->map_file); - return FALSE; - } - - /* have to save the lock for the duration (bletch) */ - map->map_lockfd = dirfd; - close(pagfd); - - /* twiddle bits for dbm_open */ - mode &= ~(O_CREAT|O_EXCL); -# endif - } -#endif - - /* open the database */ - dbm = dbm_open(map->map_file, mode, DBMMODE); - if (dbm == NULL) - { - int save_errno = errno; - - if (bitset(MF_ALIAS, map->map_mflags) && - aliaswait(map, ".pag", FALSE)) - return TRUE; -#if !LOCK_ON_OPEN && !NOFTRUNCATE - if (map->map_lockfd >= 0) - close(map->map_lockfd); -#endif - errno = save_errno; - if (!bitset(MF_OPTIONAL, map->map_mflags)) - syserr("Cannot open DBM database %s", map->map_file); - return FALSE; - } - dfd = dbm_dirfno(dbm); - pfd = dbm_pagfno(dbm); - if (dfd == pfd) - { - /* heuristic: if files are linked, this is actually gdbm */ - dbm_close(dbm); -#if !LOCK_ON_OPEN && !NOFTRUNCATE - if (map->map_lockfd >= 0) - close(map->map_lockfd); -#endif - errno = 0; - syserr("dbm map \"%s\": cannot support GDBM", - map->map_mname); - return FALSE; - } - - if (filechanged(dirfile, dfd, &std) || - filechanged(pagfile, pfd, &stp)) - { - int save_errno = errno; - - dbm_close(dbm); -#if !LOCK_ON_OPEN && !NOFTRUNCATE - if (map->map_lockfd >= 0) - close(map->map_lockfd); -#endif - errno = save_errno; - syserr("ndbm_map_open(%s): file changed after open", - map->map_file); - return FALSE; - } - - map->map_db1 = (ARBPTR_T) dbm; - if (mode == O_RDONLY) - { -#if LOCK_ON_OPEN - if (dfd >= 0) - (void) lockfile(dfd, map->map_file, ".dir", LOCK_UN); - if (pfd >= 0) - (void) lockfile(pfd, map->map_file, ".pag", LOCK_UN); -#endif - if (bitset(MF_ALIAS, map->map_mflags) && - !aliaswait(map, ".pag", TRUE)) - return FALSE; - } - else - { - map->map_mflags |= MF_LOCKED; -#if _FFR_TRUSTED_USER - if (geteuid() == 0 && TrustedUid != 0) - { - if (fchown(dfd, TrustedUid, -1) < 0 || - fchown(pfd, TrustedUid, -1) < 0) - { - int err = errno; - - sm_syslog(LOG_ALERT, NOQID, - "ownership change on %s failed: %s", - map->map_file, errstring(err)); - message("050 ownership change on %s failed: %s", - map->map_file, errstring(err)); - } - } -#endif - } - if (fstat(dfd, &st) >= 0) - map->map_mtime = st.st_mtime; - return TRUE; -} - - -/* -** NDBM_MAP_LOOKUP -- look up a datum in a DBM-type map -*/ - -char * -ndbm_map_lookup(map, name, av, statp) - MAP *map; - char *name; - char **av; - int *statp; -{ - datum key, val; - int fd; - char keybuf[MAXNAME + 1]; - struct stat stbuf; - - if (tTd(38, 20)) - printf("ndbm_map_lookup(%s, %s)\n", - map->map_mname, name); - - key.dptr = name; - key.dsize = strlen(name); - if (!bitset(MF_NOFOLDCASE, map->map_mflags)) - { - if (key.dsize > sizeof keybuf - 1) - key.dsize = sizeof keybuf - 1; - bcopy(key.dptr, keybuf, key.dsize); - keybuf[key.dsize] = '\0'; - makelower(keybuf); - key.dptr = keybuf; - } -lockdbm: - fd = dbm_dirfno((DBM *) map->map_db1); - if (fd >= 0 && !bitset(MF_LOCKED, map->map_mflags)) - (void) lockfile(fd, map->map_file, ".dir", LOCK_SH); - if (fd < 0 || fstat(fd, &stbuf) < 0 || stbuf.st_mtime > map->map_mtime) - { - /* Reopen the database to sync the cache */ - int omode = bitset(map->map_mflags, MF_WRITABLE) ? O_RDWR - : O_RDONLY; - - map->map_class->map_close(map); - map->map_mflags &= ~(MF_OPEN|MF_WRITABLE); - if (map->map_class->map_open(map, omode)) - { - map->map_mflags |= MF_OPEN; - map->map_pid = getpid(); - if ((omode && O_ACCMODE) == O_RDWR) - map->map_mflags |= MF_WRITABLE; - goto lockdbm; - } - else - { - if (!bitset(MF_OPTIONAL, map->map_mflags)) - { - extern MAPCLASS BogusMapClass; - - *statp = EX_TEMPFAIL; - map->map_class = &BogusMapClass; - map->map_mflags |= MF_OPEN; - map->map_pid = getpid(); - syserr("Cannot reopen NDBM database %s", - map->map_file); - } - return NULL; - } - } - val.dptr = NULL; - if (bitset(MF_TRY0NULL, map->map_mflags)) - { - val = dbm_fetch((DBM *) map->map_db1, key); - if (val.dptr != NULL) - map->map_mflags &= ~MF_TRY1NULL; - } - if (val.dptr == NULL && bitset(MF_TRY1NULL, map->map_mflags)) - { - key.dsize++; - val = dbm_fetch((DBM *) map->map_db1, key); - if (val.dptr != NULL) - map->map_mflags &= ~MF_TRY0NULL; - } - if (fd >= 0 && !bitset(MF_LOCKED, map->map_mflags)) - (void) lockfile(fd, map->map_file, ".dir", LOCK_UN); - if (val.dptr == NULL) - return NULL; - if (bitset(MF_MATCHONLY, map->map_mflags)) - return map_rewrite(map, name, strlen(name), NULL); - else - return map_rewrite(map, val.dptr, val.dsize, av); -} - - -/* -** NDBM_MAP_STORE -- store a datum in the database -*/ - -void -ndbm_map_store(map, lhs, rhs) - register MAP *map; - char *lhs; - char *rhs; -{ - datum key; - datum data; - int stat; - char keybuf[MAXNAME + 1]; - - if (tTd(38, 12)) - printf("ndbm_map_store(%s, %s, %s)\n", - map->map_mname, lhs, rhs); - - key.dsize = strlen(lhs); - key.dptr = lhs; - if (!bitset(MF_NOFOLDCASE, map->map_mflags)) - { - if (key.dsize > sizeof keybuf - 1) - key.dsize = sizeof keybuf - 1; - bcopy(key.dptr, keybuf, key.dsize); - keybuf[key.dsize] = '\0'; - makelower(keybuf); - key.dptr = keybuf; - } - - data.dsize = strlen(rhs); - data.dptr = rhs; - - if (bitset(MF_INCLNULL, map->map_mflags)) - { - key.dsize++; - data.dsize++; - } - - stat = dbm_store((DBM *) map->map_db1, key, data, DBM_INSERT); - if (stat > 0) - { - if (!bitset(MF_APPEND, map->map_mflags)) - message("050 Warning: duplicate alias name %s", lhs); - else - { - static char *buf = NULL; - static int bufsiz = 0; - auto int xstat; - datum old; - - old.dptr = ndbm_map_lookup(map, key.dptr, - (char **)NULL, &xstat); - if (old.dptr != NULL && *(char *) old.dptr != '\0') - { - old.dsize = strlen(old.dptr); - if (data.dsize + old.dsize + 2 > bufsiz) - { - if (buf != NULL) - (void) free(buf); - bufsiz = data.dsize + old.dsize + 2; - buf = xalloc(bufsiz); - } - snprintf(buf, bufsiz, "%s,%s", - data.dptr, old.dptr); - data.dsize = data.dsize + old.dsize + 1; - data.dptr = buf; - if (tTd(38, 9)) - printf("ndbm_map_store append=%s\n", data.dptr); - } - } - stat = dbm_store((DBM *) map->map_db1, key, data, DBM_REPLACE); - } - if (stat != 0) - syserr("readaliases: dbm put (%s)", lhs); -} - - -/* -** NDBM_MAP_CLOSE -- close the database -*/ - -void -ndbm_map_close(map) - register MAP *map; -{ - if (tTd(38, 9)) - printf("ndbm_map_close(%s, %s, %lx)\n", - map->map_mname, map->map_file, map->map_mflags); - - if (bitset(MF_WRITABLE, map->map_mflags)) - { -#ifdef NDBM_YP_COMPAT - bool inclnull; - char buf[MAXHOSTNAMELEN]; - - inclnull = bitset(MF_INCLNULL, map->map_mflags); - map->map_mflags &= ~MF_INCLNULL; - - if (strstr(map->map_file, "/yp/") != NULL) - { - long save_mflags = map->map_mflags; - - map->map_mflags |= MF_NOFOLDCASE; - - (void) snprintf(buf, sizeof buf, "%010ld", curtime()); - ndbm_map_store(map, "YP_LAST_MODIFIED", buf); - - (void) gethostname(buf, sizeof buf); - ndbm_map_store(map, "YP_MASTER_NAME", buf); - - map->map_mflags = save_mflags; - } - - if (inclnull) - map->map_mflags |= MF_INCLNULL; -#endif - - /* write out the distinguished alias */ - ndbm_map_store(map, "@", "@"); - } - dbm_close((DBM *) map->map_db1); - - /* release lock (if needed) */ -#if !LOCK_ON_OPEN - if (map->map_lockfd >= 0) - (void) close(map->map_lockfd); -#endif -} - -#endif -/* -** NEWDB (Hash and BTree) Modules -*/ - -#ifdef NEWDB - -/* -** BT_MAP_OPEN, HASH_MAP_OPEN -- database open primitives. -** -** These do rather bizarre locking. If you can lock on open, -** do that to avoid the condition of opening a database that -** is being rebuilt. If you don't, we'll try to fake it, but -** there will be a race condition. If opening for read-only, -** we immediately release the lock to avoid freezing things up. -** We really ought to hold the lock, but guarantee that we won't -** be pokey about it. That's hard to do. -*/ - -#if DB_VERSION_MAJOR < 2 -extern bool db_map_open __P((MAP *, int, char *, DBTYPE, const void *)); -#else -extern bool db_map_open __P((MAP *, int, char *, DBTYPE, DB_INFO *)); -#endif - -/* these should be K line arguments */ -#if DB_VERSION_MAJOR < 2 -# define db_cachesize cachesize -# define h_nelem nelem -# ifndef DB_CACHE_SIZE -# define DB_CACHE_SIZE (1024 * 1024) /* database memory cache size */ -# endif -# ifndef DB_HASH_NELEM -# define DB_HASH_NELEM 4096 /* (starting) size of hash table */ -# endif -#endif - -bool -bt_map_open(map, mode) - MAP *map; - int mode; -{ -#if DB_VERSION_MAJOR < 2 - BTREEINFO btinfo; -#else - DB_INFO btinfo; -#endif - - if (tTd(38, 2)) - printf("bt_map_open(%s, %s, %d)\n", - map->map_mname, map->map_file, mode); - - bzero(&btinfo, sizeof btinfo); -#ifdef DB_CACHE_SIZE - btinfo.db_cachesize = DB_CACHE_SIZE; -#endif - return db_map_open(map, mode, "btree", DB_BTREE, &btinfo); -} - -bool -hash_map_open(map, mode) - MAP *map; - int mode; -{ -#if DB_VERSION_MAJOR < 2 - HASHINFO hinfo; -#else - DB_INFO hinfo; -#endif - - if (tTd(38, 2)) - printf("hash_map_open(%s, %s, %d)\n", - map->map_mname, map->map_file, mode); - - bzero(&hinfo, sizeof hinfo); -#ifdef DB_HASH_NELEM - hinfo.h_nelem = DB_HASH_NELEM; -#endif -#ifdef DB_CACHE_SIZE - hinfo.db_cachesize = DB_CACHE_SIZE; -#endif - return db_map_open(map, mode, "hash", DB_HASH, &hinfo); -} - -bool -db_map_open(map, mode, mapclassname, dbtype, openinfo) - MAP *map; - int mode; - char *mapclassname; - DBTYPE dbtype; -#if DB_VERSION_MAJOR < 2 - const void *openinfo; -#else - DB_INFO *openinfo; -#endif -{ - DB *db = NULL; - int i; - int omode; - int smode = S_IREAD; - int fd; - int sff; - int saveerrno; - struct stat st; - char buf[MAXNAME + 1]; - - /* do initial file and directory checks */ - snprintf(buf, sizeof buf - 3, "%s", map->map_file); - i = strlen(buf); - if (i < 3 || strcmp(&buf[i - 3], ".db") != 0) - (void) strcat(buf, ".db"); - - mode &= O_ACCMODE; - omode = mode; - - sff = SFF_ROOTOK|SFF_REGONLY; - if (mode == O_RDWR) - { - sff |= SFF_CREAT; - if (!bitset(DBS_WRITEMAPTOSYMLINK, DontBlameSendmail)) - sff |= SFF_NOSLINK; - if (!bitset(DBS_WRITEMAPTOHARDLINK, DontBlameSendmail)) - sff |= SFF_NOHLINK; - smode = S_IWRITE; - } - else - { - if (!bitset(DBS_LINKEDMAPINWRITABLEDIR, DontBlameSendmail)) - sff |= SFF_NOWLINK; - } - if (!bitset(DBS_MAPINUNSAFEDIRPATH, DontBlameSendmail)) - sff |= SFF_SAFEDIRPATH; - i = safefile(buf, RunAsUid, RunAsGid, RunAsUserName, sff, smode, &st); - if (i == ENOENT && AutoRebuild && - bitset(MCF_REBUILDABLE, map->map_class->map_cflags) && - (bitset(MF_IMPL_HASH, map->map_mflags) || - bitset(MF_ALIAS, map->map_mflags)) && - mode == O_RDONLY) - { - bool impl = bitset(MF_IMPL_HASH, map->map_mflags); - extern bool impl_map_open __P((MAP *, int)); - - /* may be able to rebuild */ - map->map_mflags &= ~MF_IMPL_HASH; - if (!rebuildaliases(map, TRUE)) - return FALSE; - if (impl) - return impl_map_open(map, O_RDONLY); - else - return db_map_open(map, O_RDONLY, mapclassname, - dbtype, openinfo); - } - - if (i != 0) - { - char *prob = "unsafe"; - - /* cannot open this map */ - if (i == ENOENT) - prob = "missing"; - if (tTd(38, 2)) - printf("\t%s map file: %s\n", prob, errstring(i)); - errno = i; - if (!bitset(MF_OPTIONAL, map->map_mflags)) - syserr("%s map \"%s\": %s map file %s", - mapclassname, map->map_mname, prob, buf); - return FALSE; - } - if (st.st_mode == ST_MODE_NOFILE) - omode |= O_CREAT|O_EXCL; - - map->map_lockfd = -1; - -#if LOCK_ON_OPEN - if (mode == O_RDWR) - omode |= O_TRUNC|O_EXLOCK; - else - omode |= O_SHLOCK; -#else - /* - ** Pre-lock the file to avoid race conditions. In particular, - ** since dbopen returns NULL if the file is zero length, we - ** must have a locked instance around the dbopen. - */ - - fd = open(buf, omode, DBMMODE); - if (fd < 0) - { - if (!bitset(MF_OPTIONAL, map->map_mflags)) - syserr("db_map_open: cannot pre-open database %s", buf); - return FALSE; - } - - /* make sure no baddies slipped in just before the open... */ - if (filechanged(buf, fd, &st)) - { - int save_errno = errno; - - (void) close(fd); - errno = save_errno; - syserr("db_map_open(%s): file changed after pre-open", buf); - return FALSE; - } - - /* if new file, get the "before" bits for later filechanged check */ - if (st.st_mode == ST_MODE_NOFILE && fstat(fd, &st) < 0) - { - int save_errno = errno; - - (void) close(fd); - errno = save_errno; - syserr("db_map_open(%s): cannot fstat pre-opened file", - buf); - return FALSE; - } - - /* actually lock the pre-opened file */ - if (!lockfile(fd, buf, NULL, mode == O_RDONLY ? LOCK_SH : LOCK_EX)) - syserr("db_map_open: cannot lock %s", buf); - - /* set up mode bits for dbopen */ - if (mode == O_RDWR) - omode |= O_TRUNC; - omode &= ~(O_EXCL|O_CREAT); -#endif - -#if DB_VERSION_MAJOR < 2 - db = dbopen(buf, omode, DBMMODE, dbtype, openinfo); -#else - { - int flags = 0; - - if (mode == O_RDONLY) - flags |= DB_RDONLY; - if (bitset(O_CREAT, omode)) - flags |= DB_CREATE; - if (bitset(O_TRUNC, omode)) - flags |= DB_TRUNCATE; - - errno = db_open(buf, dbtype, flags, DBMMODE, - NULL, openinfo, &db); - } -#endif - saveerrno = errno; - -#if !LOCK_ON_OPEN - if (mode == O_RDWR) - map->map_lockfd = fd; - else - (void) close(fd); -#endif - - if (db == NULL) - { - if (mode == O_RDONLY && bitset(MF_ALIAS, map->map_mflags) && - aliaswait(map, ".db", FALSE)) - return TRUE; -#if !LOCK_ON_OPEN - if (map->map_lockfd >= 0) - (void) close(map->map_lockfd); -#endif - errno = saveerrno; - if (!bitset(MF_OPTIONAL, map->map_mflags)) - syserr("Cannot open %s database %s", - mapclassname, buf); - return FALSE; - } - -#if DB_VERSION_MAJOR < 2 - fd = db->fd(db); -#else - fd = -1; - errno = db->fd(db, &fd); -#endif - if (filechanged(buf, fd, &st)) - { - int save_errno = errno; - -#if DB_VERSION_MAJOR < 2 - db->close(db); -#else - errno = db->close(db, 0); -#endif -#if !LOCK_ON_OPEN - if (map->map_lockfd >= 0) - close(map->map_lockfd); -#endif - errno = save_errno; - syserr("db_map_open(%s): file changed after open", buf); - return FALSE; - } - - if (mode == O_RDWR) - map->map_mflags |= MF_LOCKED; -#if LOCK_ON_OPEN - if (fd >= 0 && mode == O_RDONLY) - { - (void) lockfile(fd, buf, NULL, LOCK_UN); - } -#endif - - /* try to make sure that at least the database header is on disk */ - if (mode == O_RDWR) - { - (void) db->sync(db, 0); -#if _FFR_TRUSTED_USER - if (geteuid() == 0 && TrustedUid != 0) - { - if (fchown(fd, TrustedUid, -1) < 0) - { - int err = errno; - - sm_syslog(LOG_ALERT, NOQID, - "ownership change on %s failed: %s", - buf, errstring(err)); - message("050 ownership change on %s failed: %s", - buf, errstring(err)); - } - } -#endif - } - - if (fd >= 0 && fstat(fd, &st) >= 0) - map->map_mtime = st.st_mtime; - - map->map_db2 = (ARBPTR_T) db; - if (mode == O_RDONLY && bitset(MF_ALIAS, map->map_mflags) && - !aliaswait(map, ".db", TRUE)) - return FALSE; - return TRUE; -} - - -/* -** DB_MAP_LOOKUP -- look up a datum in a BTREE- or HASH-type map -*/ - -char * -db_map_lookup(map, name, av, statp) - MAP *map; - char *name; - char **av; - int *statp; -{ - DBT key, val; - register DB *db = (DB *) map->map_db2; - int i; - int st; - int saveerrno; - int fd; - struct stat stbuf; - char keybuf[MAXNAME + 1]; - char buf[MAXNAME + 1]; - - bzero(&key, sizeof key); - bzero(&val, sizeof val); - - if (tTd(38, 20)) - printf("db_map_lookup(%s, %s)\n", - map->map_mname, name); - - i = strlen(map->map_file); - if (i > MAXNAME) - i = MAXNAME; - strncpy(buf, map->map_file, i); - buf[i] = '\0'; - if (i > 3 && strcmp(&buf[i - 3], ".db") == 0) - buf[i - 3] = '\0'; - - key.size = strlen(name); - if (key.size > sizeof keybuf - 1) - key.size = sizeof keybuf - 1; - key.data = keybuf; - bcopy(name, keybuf, key.size); - keybuf[key.size] = '\0'; - if (!bitset(MF_NOFOLDCASE, map->map_mflags)) - makelower(keybuf); - lockdb: -#if DB_VERSION_MAJOR < 2 - fd = db->fd(db); -#else - fd = -1; - errno = db->fd(db, &fd); -#endif - if (fd >= 0 && !bitset(MF_LOCKED, map->map_mflags)) - (void) lockfile(fd, buf, ".db", LOCK_SH); - if (fd < 0 || fstat(fd, &stbuf) < 0 || stbuf.st_mtime > map->map_mtime) - { - /* Reopen the database to sync the cache */ - int omode = bitset(map->map_mflags, MF_WRITABLE) ? O_RDWR - : O_RDONLY; - - map->map_class->map_close(map); - map->map_mflags &= ~(MF_OPEN|MF_WRITABLE); - if (map->map_class->map_open(map, omode)) - { - map->map_mflags |= MF_OPEN; - map->map_pid = getpid(); - if ((omode && O_ACCMODE) == O_RDWR) - map->map_mflags |= MF_WRITABLE; - db = (DB *) map->map_db2; - goto lockdb; - } - else - { - if (!bitset(MF_OPTIONAL, map->map_mflags)) - { - extern MAPCLASS BogusMapClass; - - *statp = EX_TEMPFAIL; - map->map_class = &BogusMapClass; - map->map_mflags |= MF_OPEN; - map->map_pid = getpid(); - syserr("Cannot reopen DB database %s", - map->map_file); - } - return NULL; - } - } - - st = 1; - if (bitset(MF_TRY0NULL, map->map_mflags)) - { -#if DB_VERSION_MAJOR < 2 - st = db->get(db, &key, &val, 0); -#else - errno = db->get(db, NULL, &key, &val, 0); - switch (errno) - { - case DB_NOTFOUND: - case DB_KEYEMPTY: - st = 1; - break; - - case 0: - st = 0; - break; - - default: - st = -1; - break; - } -#endif - if (st == 0) - map->map_mflags &= ~MF_TRY1NULL; - } - if (st != 0 && bitset(MF_TRY1NULL, map->map_mflags)) - { - key.size++; -#if DB_VERSION_MAJOR < 2 - st = db->get(db, &key, &val, 0); -#else - errno = db->get(db, NULL, &key, &val, 0); - switch (errno) - { - case DB_NOTFOUND: - case DB_KEYEMPTY: - st = 1; - break; - - case 0: - st = 0; - break; - - default: - st = -1; - break; - } -#endif - if (st == 0) - map->map_mflags &= ~MF_TRY0NULL; - } - saveerrno = errno; - if (fd >= 0 && !bitset(MF_LOCKED, map->map_mflags)) - (void) lockfile(fd, buf, ".db", LOCK_UN); - if (st != 0) - { - errno = saveerrno; - if (st < 0) - syserr("db_map_lookup: get (%s)", name); - return NULL; - } - if (bitset(MF_MATCHONLY, map->map_mflags)) - return map_rewrite(map, name, strlen(name), NULL); - else - return map_rewrite(map, val.data, val.size, av); -} - - -/* -** DB_MAP_STORE -- store a datum in the NEWDB database -*/ - -void -db_map_store(map, lhs, rhs) - register MAP *map; - char *lhs; - char *rhs; -{ - int stat; - DBT key; - DBT data; - register DB *db = map->map_db2; - char keybuf[MAXNAME + 1]; - - bzero(&key, sizeof key); - bzero(&data, sizeof data); - - if (tTd(38, 12)) - printf("db_map_store(%s, %s, %s)\n", - map->map_mname, lhs, rhs); - - key.size = strlen(lhs); - key.data = lhs; - if (!bitset(MF_NOFOLDCASE, map->map_mflags)) - { - if (key.size > sizeof keybuf - 1) - key.size = sizeof keybuf - 1; - bcopy(key.data, keybuf, key.size); - keybuf[key.size] = '\0'; - makelower(keybuf); - key.data = keybuf; - } - - data.size = strlen(rhs); - data.data = rhs; - - if (bitset(MF_INCLNULL, map->map_mflags)) - { - key.size++; - data.size++; - } - -#if DB_VERSION_MAJOR < 2 - stat = db->put(db, &key, &data, R_NOOVERWRITE); -#else - errno = db->put(db, NULL, &key, &data, DB_NOOVERWRITE); - switch (errno) - { - case DB_KEYEXIST: - stat = 1; - break; - - case 0: - stat = 0; - break; - - default: - stat = -1; - break; - } -#endif - if (stat > 0) - { - if (!bitset(MF_APPEND, map->map_mflags)) - message("050 Warning: duplicate alias name %s", lhs); - else - { - static char *buf = NULL; - static int bufsiz = 0; - DBT old; - - bzero(&old, sizeof old); - - old.data = db_map_lookup(map, key.data, - (char **)NULL, &stat); - if (old.data != NULL) - { - old.size = strlen(old.data); - if (data.size + old.size + 2 > bufsiz) - { - if (buf != NULL) - (void) free(buf); - bufsiz = data.size + old.size + 2; - buf = xalloc(bufsiz); - } - snprintf(buf, bufsiz, "%s,%s", - (char *) data.data, (char *) old.data); - data.size = data.size + old.size + 1; - data.data = buf; - if (tTd(38, 9)) - printf("db_map_store append=%s\n", - (char *) data.data); - } - } -#if DB_VERSION_MAJOR < 2 - stat = db->put(db, &key, &data, 0); -#else - stat = errno = db->put(db, NULL, &key, &data, 0); -#endif - } - if (stat != 0) - syserr("readaliases: db put (%s)", lhs); -} - - -/* -** DB_MAP_CLOSE -- add distinguished entries and close the database -*/ - -void -db_map_close(map) - MAP *map; -{ - register DB *db = map->map_db2; - - if (tTd(38, 9)) - printf("db_map_close(%s, %s, %lx)\n", - map->map_mname, map->map_file, map->map_mflags); - - if (bitset(MF_WRITABLE, map->map_mflags)) - { - /* write out the distinguished alias */ - db_map_store(map, "@", "@"); - } - - (void) db->sync(db, 0); - -#if !LOCK_ON_OPEN - if (map->map_lockfd >= 0) - (void) close(map->map_lockfd); -#endif - -#if DB_VERSION_MAJOR < 2 - if (db->close(db) != 0) -#else - /* - ** Berkeley DB can use internal shared memory - ** locking for its memory pool. Closing a map - ** opened by another process will interfere - ** with the shared memory and locks of the parent - ** process leaving things in a bad state. - */ - - /* - ** If this map was not opened by the current - ** process, do not close the map but recover - ** the file descriptor. - */ - if (map->map_pid != getpid()) - { - int fd = -1; - - errno = db->fd(db, &fd); - if (fd >= 0) - (void) close(fd); - return; - } - - if ((errno = db->close(db, 0)) != 0) -#endif - syserr("db_map_close(%s, %s, %lx): db close failure", - map->map_mname, map->map_file, map->map_mflags); -} - -#endif -/* -** NIS Modules -*/ - -# ifdef NIS - -# ifndef YPERR_BUSY -# define YPERR_BUSY 16 -# endif - -/* -** NIS_MAP_OPEN -- open DBM map -*/ - -bool -nis_map_open(map, mode) - MAP *map; - int mode; -{ - int yperr; - register char *p; - auto char *vp; - auto int vsize; - - if (tTd(38, 2)) - printf("nis_map_open(%s, %s, %d)\n", - map->map_mname, map->map_file, mode); - - mode &= O_ACCMODE; - if (mode != O_RDONLY) - { - /* issue a pseudo-error message */ -#ifdef ENOSYS - errno = ENOSYS; -#else -# ifdef EFTYPE - errno = EFTYPE; -# else - errno = ENXIO; -# endif -#endif - return FALSE; - } - - p = strchr(map->map_file, '@'); - if (p != NULL) - { - *p++ = '\0'; - if (*p != '\0') - map->map_domain = p; - } - - if (*map->map_file == '\0') - map->map_file = "mail.aliases"; - - if (map->map_domain == NULL) - { - yperr = yp_get_default_domain(&map->map_domain); - if (yperr != 0) - { - if (!bitset(MF_OPTIONAL, map->map_mflags)) - syserr("421 NIS map %s specified, but NIS not running", - map->map_file); - return FALSE; - } - } - - /* check to see if this map actually exists */ - yperr = yp_match(map->map_domain, map->map_file, "@", 1, - &vp, &vsize); - if (tTd(38, 10)) - printf("nis_map_open: yp_match(@, %s, %s) => %s\n", - map->map_domain, map->map_file, yperr_string(yperr)); - if (yperr == 0 || yperr == YPERR_KEY || yperr == YPERR_BUSY) - { - /* - ** We ought to be calling aliaswait() here if this is an - ** alias file, but powerful HP-UX NIS servers apparently - ** don't insert the @:@ token into the alias map when it - ** is rebuilt, so aliaswait() just hangs. I hate HP-UX. - */ - -#if 0 - if (!bitset(MF_ALIAS, map->map_mflags) || - aliaswait(map, NULL, TRUE)) -#endif - return TRUE; - } - - if (!bitset(MF_OPTIONAL, map->map_mflags)) - { - syserr("421 Cannot bind to map %s in domain %s: %s", - map->map_file, map->map_domain, yperr_string(yperr)); - } - - return FALSE; -} - - -/* -** NIS_MAP_LOOKUP -- look up a datum in a NIS map -*/ - -/* ARGSUSED3 */ -char * -nis_map_lookup(map, name, av, statp) - MAP *map; - char *name; - char **av; - int *statp; -{ - char *vp; - auto int vsize; - int buflen; - int yperr; - char keybuf[MAXNAME + 1]; - - if (tTd(38, 20)) - printf("nis_map_lookup(%s, %s)\n", - map->map_mname, name); - - buflen = strlen(name); - if (buflen > sizeof keybuf - 1) - buflen = sizeof keybuf - 1; - bcopy(name, keybuf, buflen); - keybuf[buflen] = '\0'; - if (!bitset(MF_NOFOLDCASE, map->map_mflags)) - makelower(keybuf); - yperr = YPERR_KEY; - if (bitset(MF_TRY0NULL, map->map_mflags)) - { - yperr = yp_match(map->map_domain, map->map_file, keybuf, buflen, - &vp, &vsize); - if (yperr == 0) - map->map_mflags &= ~MF_TRY1NULL; - } - if (yperr == YPERR_KEY && bitset(MF_TRY1NULL, map->map_mflags)) - { - buflen++; - yperr = yp_match(map->map_domain, map->map_file, keybuf, buflen, - &vp, &vsize); - if (yperr == 0) - map->map_mflags &= ~MF_TRY0NULL; - } - if (yperr != 0) - { - if (yperr != YPERR_KEY && yperr != YPERR_BUSY) - map->map_mflags &= ~(MF_VALID|MF_OPEN); - return NULL; - } - if (bitset(MF_MATCHONLY, map->map_mflags)) - return map_rewrite(map, name, strlen(name), NULL); - else - return map_rewrite(map, vp, vsize, av); -} - - -/* -** NIS_GETCANONNAME -- look up canonical name in NIS -*/ - -bool -nis_getcanonname(name, hbsize, statp) - char *name; - int hbsize; - int *statp; -{ - char *vp; - auto int vsize; - int keylen; - int yperr; - static bool try0null = TRUE; - static bool try1null = TRUE; - static char *yp_domain = NULL; - char host_record[MAXLINE]; - char cbuf[MAXNAME]; - char nbuf[MAXNAME + 1]; - - if (tTd(38, 20)) - printf("nis_getcanonname(%s)\n", name); - - if (strlen(name) >= sizeof nbuf) - { - *statp = EX_UNAVAILABLE; - return FALSE; - } - (void) strcpy(nbuf, name); - shorten_hostname(nbuf); - keylen = strlen(nbuf); - - if (yp_domain == NULL) - yp_get_default_domain(&yp_domain); - makelower(nbuf); - yperr = YPERR_KEY; - if (try0null) - { - yperr = yp_match(yp_domain, "hosts.byname", nbuf, keylen, - &vp, &vsize); - if (yperr == 0) - try1null = FALSE; - } - if (yperr == YPERR_KEY && try1null) - { - keylen++; - yperr = yp_match(yp_domain, "hosts.byname", nbuf, keylen, - &vp, &vsize); - if (yperr == 0) - try0null = FALSE; - } - if (yperr != 0) - { - if (yperr == YPERR_KEY) - *statp = EX_NOHOST; - else if (yperr == YPERR_BUSY) - *statp = EX_TEMPFAIL; - else - *statp = EX_UNAVAILABLE; - return FALSE; - } - if (vsize >= sizeof host_record) - vsize = sizeof host_record - 1; - strncpy(host_record, vp, vsize); - host_record[vsize] = '\0'; - if (tTd(38, 44)) - printf("got record `%s'\n", host_record); - if (!extract_canonname(nbuf, host_record, cbuf, sizeof cbuf)) - { - /* this should not happen, but.... */ - *statp = EX_NOHOST; - return FALSE; - } - if (hbsize < strlen(cbuf)) - { - *statp = EX_UNAVAILABLE; - return FALSE; - } - strcpy(name, cbuf); - *statp = EX_OK; - return TRUE; -} - -#endif -/* -** NISPLUS Modules -** -** This code donated by Sun Microsystems. -*/ - -#ifdef NISPLUS - -#undef NIS /* symbol conflict in nis.h */ -#undef T_UNSPEC /* symbol conflict in nis.h -> ... -> sys/tiuser.h */ -#include <rpcsvc/nis.h> -#include <rpcsvc/nislib.h> - -#define EN_col(col) zo_data.objdata_u.en_data.en_cols.en_cols_val[(col)].ec_value.ec_value_val -#define COL_NAME(res,i) ((res->objects.objects_val)->TA_data.ta_cols.ta_cols_val)[i].tc_name -#define COL_MAX(res) ((res->objects.objects_val)->TA_data.ta_cols.ta_cols_len) -#define PARTIAL_NAME(x) ((x)[strlen(x) - 1] != '.') - -/* -** NISPLUS_MAP_OPEN -- open nisplus table -*/ - -bool -nisplus_map_open(map, mode) - MAP *map; - int mode; -{ - nis_result *res = NULL; - int retry_cnt, max_col, i; - char qbuf[MAXLINE + NIS_MAXNAMELEN]; - - if (tTd(38, 2)) - printf("nisplus_map_open(%s, %s, %d)\n", - map->map_mname, map->map_file, mode); - - mode &= O_ACCMODE; - if (mode != O_RDONLY) - { - errno = EPERM; - return FALSE; - } - - if (*map->map_file == '\0') - map->map_file = "mail_aliases.org_dir"; - - if (PARTIAL_NAME(map->map_file) && map->map_domain == NULL) - { - /* set default NISPLUS Domain to $m */ - extern char *nisplus_default_domain __P((void)); - - map->map_domain = newstr(nisplus_default_domain()); - if (tTd(38, 2)) - printf("nisplus_map_open(%s): using domain %s\n", - map->map_file, map->map_domain); - } - if (!PARTIAL_NAME(map->map_file)) - { - map->map_domain = newstr(""); - snprintf(qbuf, sizeof qbuf, "%s", map->map_file); - } - else - { - /* check to see if this map actually exists */ - snprintf(qbuf, sizeof qbuf, "%s.%s", - map->map_file, map->map_domain); - } - - retry_cnt = 0; - while (res == NULL || res->status != NIS_SUCCESS) - { - res = nis_lookup(qbuf, FOLLOW_LINKS); - switch (res->status) - { - case NIS_SUCCESS: - break; - - case NIS_TRYAGAIN: - case NIS_RPCERROR: - case NIS_NAMEUNREACHABLE: - if (retry_cnt++ > 4) - { - errno = EAGAIN; - return FALSE; - } - /* try not to overwhelm hosed server */ - sleep(2); - break; - - default: /* all other nisplus errors */ -#if 0 - if (!bitset(MF_OPTIONAL, map->map_mflags)) - syserr("421 Cannot find table %s.%s: %s", - map->map_file, map->map_domain, - nis_sperrno(res->status)); -#endif - errno = EAGAIN; - return FALSE; - } - } - - if (NIS_RES_NUMOBJ(res) != 1 || - (NIS_RES_OBJECT(res)->zo_data.zo_type != TABLE_OBJ)) - { - if (tTd(38, 10)) - printf("nisplus_map_open: %s is not a table\n", qbuf); -#if 0 - if (!bitset(MF_OPTIONAL, map->map_mflags)) - syserr("421 %s.%s: %s is not a table", - map->map_file, map->map_domain, - nis_sperrno(res->status)); -#endif - errno = EBADF; - return FALSE; - } - /* default key column is column 0 */ - if (map->map_keycolnm == NULL) - map->map_keycolnm = newstr(COL_NAME(res,0)); - - max_col = COL_MAX(res); - - /* verify the key column exist */ - for (i=0; i< max_col; i++) - { - if (!strcmp(map->map_keycolnm, COL_NAME(res,i))) - break; - } - if (i == max_col) - { - if (tTd(38, 2)) - printf("nisplus_map_open(%s): can not find key column %s\n", - map->map_file, map->map_keycolnm); - errno = ENOENT; - return FALSE; - } - - /* default value column is the last column */ - if (map->map_valcolnm == NULL) - { - map->map_valcolno = max_col - 1; - return TRUE; - } - - for (i=0; i< max_col; i++) - { - if (strcmp(map->map_valcolnm, COL_NAME(res,i)) == 0) - { - map->map_valcolno = i; - return TRUE; - } - } - - if (tTd(38, 2)) - printf("nisplus_map_open(%s): can not find column %s\n", - map->map_file, map->map_keycolnm); - errno = ENOENT; - return FALSE; -} - - -/* -** NISPLUS_MAP_LOOKUP -- look up a datum in a NISPLUS table -*/ - -char * -nisplus_map_lookup(map, name, av, statp) - MAP *map; - char *name; - char **av; - int *statp; -{ - char *p; - auto int vsize; - char *skp; - int skleft; - char search_key[MAXNAME + 4]; - char qbuf[MAXLINE + NIS_MAXNAMELEN]; - nis_result *result; - - if (tTd(38, 20)) - printf("nisplus_map_lookup(%s, %s)\n", - map->map_mname, name); - - if (!bitset(MF_OPEN, map->map_mflags)) - { - if (nisplus_map_open(map, O_RDONLY)) - { - map->map_mflags |= MF_OPEN; - map->map_pid = getpid(); - } - else - { - *statp = EX_UNAVAILABLE; - return NULL; - } - } - - /* - ** Copy the name to the key buffer, escaping double quote characters - ** by doubling them and quoting "]" and "," to avoid having the - ** NIS+ parser choke on them. - */ - - skleft = sizeof search_key - 4; - skp = search_key; - for (p = name; *p != '\0' && skleft > 0; p++) - { - switch (*p) - { - case ']': - case ',': - /* quote the character */ - *skp++ = '"'; - *skp++ = *p; - *skp++ = '"'; - skleft -= 3; - break; - - case '"': - /* double the quote */ - *skp++ = '"'; - skleft--; - /* fall through... */ - - default: - *skp++ = *p; - skleft--; - break; - } - } - *skp = '\0'; - if (!bitset(MF_NOFOLDCASE, map->map_mflags)) - makelower(search_key); - - /* construct the query */ - if (PARTIAL_NAME(map->map_file)) - snprintf(qbuf, sizeof qbuf, "[%s=%s],%s.%s", - map->map_keycolnm, search_key, map->map_file, - map->map_domain); - else - snprintf(qbuf, sizeof qbuf, "[%s=%s],%s", - map->map_keycolnm, search_key, map->map_file); - - if (tTd(38, 20)) - printf("qbuf=%s\n", qbuf); - result = nis_list(qbuf, FOLLOW_LINKS | FOLLOW_PATH, NULL, NULL); - if (result->status == NIS_SUCCESS) - { - int count; - char *str; - - if ((count = NIS_RES_NUMOBJ(result)) != 1) - { - if (LogLevel > 10) - sm_syslog(LOG_WARNING, CurEnv->e_id, - "%s: lookup error, expected 1 entry, got %d", - map->map_file, count); - - /* ignore second entry */ - if (tTd(38, 20)) - printf("nisplus_map_lookup(%s), got %d entries, additional entries ignored\n", - name, count); - } - - p = ((NIS_RES_OBJECT(result))->EN_col(map->map_valcolno)); - /* set the length of the result */ - if (p == NULL) - p = ""; - vsize = strlen(p); - if (tTd(38, 20)) - printf("nisplus_map_lookup(%s), found %s\n", - name, p); - if (bitset(MF_MATCHONLY, map->map_mflags)) - str = map_rewrite(map, name, strlen(name), NULL); - else - str = map_rewrite(map, p, vsize, av); - nis_freeresult(result); - *statp = EX_OK; - return str; - } - else - { - if (result->status == NIS_NOTFOUND) - *statp = EX_NOTFOUND; - else if (result->status == NIS_TRYAGAIN) - *statp = EX_TEMPFAIL; - else - { - *statp = EX_UNAVAILABLE; - map->map_mflags &= ~(MF_VALID|MF_OPEN); - } - } - if (tTd(38, 20)) - printf("nisplus_map_lookup(%s), failed\n", name); - nis_freeresult(result); - return NULL; -} - - - -/* -** NISPLUS_GETCANONNAME -- look up canonical name in NIS+ -*/ - -bool -nisplus_getcanonname(name, hbsize, statp) - char *name; - int hbsize; - int *statp; -{ - char *vp; - auto int vsize; - nis_result *result; - char *p; - char nbuf[MAXNAME + 1]; - char qbuf[MAXLINE + NIS_MAXNAMELEN]; - - if (strlen(name) >= sizeof nbuf) - { - *statp = EX_UNAVAILABLE; - return FALSE; - } - (void) strcpy(nbuf, name); - shorten_hostname(nbuf); - - p = strchr(nbuf, '.'); - if (p == NULL) - { - /* single token */ - snprintf(qbuf, sizeof qbuf, "[name=%s],hosts.org_dir", nbuf); - } - else if (p[1] != '\0') - { - /* multi token -- take only first token in nbuf */ - *p = '\0'; - snprintf(qbuf, sizeof qbuf, "[name=%s],hosts.org_dir.%s", - nbuf, &p[1]); - } - else - { - *statp = EX_NOHOST; - return FALSE; - } - - if (tTd(38, 20)) - printf("\nnisplus_getcanoname(%s), qbuf=%s\n", - name, qbuf); - - result = nis_list(qbuf, EXPAND_NAME|FOLLOW_LINKS|FOLLOW_PATH, - NULL, NULL); - - if (result->status == NIS_SUCCESS) - { - int count; - char *domain; - - if ((count = NIS_RES_NUMOBJ(result)) != 1) - { - if (LogLevel > 10) - sm_syslog(LOG_WARNING, CurEnv->e_id, - "nisplus_getcanonname: lookup error, expected 1 entry, got %d", - count); - - /* ignore second entry */ - if (tTd(38, 20)) - printf("nisplus_getcanoname(%s), got %d entries, all but first ignored\n", - name, count); - } - - if (tTd(38, 20)) - printf("nisplus_getcanoname(%s), found in directory \"%s\"\n", - name, (NIS_RES_OBJECT(result))->zo_domain); - - - vp = ((NIS_RES_OBJECT(result))->EN_col(0)); - vsize = strlen(vp); - if (tTd(38, 20)) - printf("nisplus_getcanonname(%s), found %s\n", - name, vp); - if (strchr(vp, '.') != NULL) - { - domain = ""; - } - else - { - domain = macvalue('m', CurEnv); - if (domain == NULL) - domain = ""; - } - if (hbsize > vsize + (int) strlen(domain) + 1) - { - if (domain[0] == '\0') - strcpy(name, vp); - else - snprintf(name, hbsize, "%s.%s", vp, domain); - *statp = EX_OK; - } - else - *statp = EX_NOHOST; - nis_freeresult(result); - return TRUE; - } - else - { - if (result->status == NIS_NOTFOUND) - *statp = EX_NOHOST; - else if (result->status == NIS_TRYAGAIN) - *statp = EX_TEMPFAIL; - else - *statp = EX_UNAVAILABLE; - } - if (tTd(38, 20)) - printf("nisplus_getcanonname(%s), failed, status=%d, nsw_stat=%d\n", - name, result->status, *statp); - nis_freeresult(result); - return FALSE; -} - - -char * -nisplus_default_domain() -{ - static char default_domain[MAXNAME + 1] = ""; - char *p; - - if (default_domain[0] != '\0') - return(default_domain); - - p = nis_local_directory(); - snprintf(default_domain, sizeof default_domain, "%s", p); - return default_domain; -} - -#endif /* NISPLUS */ -/* -** LDAP Modules -** -** Contributed by Booker C. Bense <bbense@networking.stanford.edu>. -** Get your support from him. -*/ - -#ifdef LDAPMAP - -# undef NEEDGETOPT /* used for something else in LDAP */ - -# include <lber.h> -# include <ldap.h> -# include "ldap_map.h" - -/* -** LDAP_MAP_OPEN -- open LDAP map -** -** Since LDAP is TCP-based there is not much we can or should do -** here. It might be a good idea to attempt an open/close here. -*/ - -bool -ldap_map_open(map, mode) - MAP *map; - int mode; -{ - if (tTd(38, 2)) - printf("ldap_map_open(%s, %d)\n", map->map_mname, mode); - - mode &= O_ACCMODE; - if (mode != O_RDONLY) - { - /* issue a pseudo-error message */ -#ifdef ENOSYS - errno = ENOSYS; -#else -# ifdef EFTYPE - errno = EFTYPE; -# else - errno = ENXIO; -# endif -#endif - return FALSE; - } - return TRUE; -} - - -/* -** LDAP_MAP_START -- actually open LDAP map -** -** Caching should be investigated. -*/ - -static jmp_buf LDAPTimeout; - -static void -ldaptimeout(sig_no) - int sig_no; -{ - longjmp(LDAPTimeout, 1); -} - -bool -ldap_map_start(map) - MAP *map; -{ - LDAP_MAP_STRUCT *lmap; - LDAP *ld; - register EVENT *ev = NULL; - - if (tTd(38, 2)) - printf("ldap_map_start(%s)\n", map->map_mname); - - lmap = (LDAP_MAP_STRUCT *) map->map_db1; - - if (tTd(38,9)) - printf("ldap_open(%s, %d)\n", lmap->ldaphost, lmap->ldapport); - - /* Need to set an alarm here, ldap_open is hopelessly broken. */ - - /* set the timeout */ - if (lmap->timeout.tv_sec != 0) - { - if (setjmp(LDAPTimeout) != 0) - { - if (LogLevel > 1) - sm_syslog(LOG_NOTICE, CurEnv->e_id, - "timeout waiting for ldap_open to %.100s", - lmap->ldaphost); - return (FALSE); - } - ev = setevent(lmap->timeout.tv_sec, ldaptimeout, 0); - } - -#ifdef USE_LDAP_INIT - ld = ldap_init(lmap->ldaphost,lmap->ldapport); -#else - ld = ldap_open(lmap->ldaphost,lmap->ldapport); -#endif - - /* clear the event if it has not sprung */ - if (lmap->timeout.tv_sec != 0) - clrevent(ev); - - if (ld == NULL) - { - if (!bitset(MF_OPTIONAL, map->map_mflags)) - { - syserr("%sldapopen failed to %s in map %s", - bitset(MF_NODEFER, map->map_mflags) ? "" : "421 ", - lmap->ldaphost, map->map_mname); - } - return FALSE; - } - -#ifdef USE_LDAP_SET_OPTION - ldap_set_option(ld, LDAP_OPT_DEREF, &lmap->deref); - ldap_set_option(ld, LDAP_OPT_TIMELIMIT, &lmap->timelimit); - ldap_set_option(ld, LDAP_OPT_SIZELIMIT, &lmap->sizelimit); - ldap_set_option(ld, LDAP_OPT_REFERRALS, - bitset(LDAP_OPT_REFERRALS, lmap->ldap_options) ? - LDAP_OPT_ON : LDAP_OPT_OFF); -#else - /* From here on in we can use ldap internal timelimits */ - ld->ld_deref = lmap->deref; - ld->ld_timelimit = lmap->timelimit; - ld->ld_sizelimit = lmap->sizelimit; - ld->ld_options = lmap->ldap_options; -#endif - -#ifdef USE_LDAP_INIT - /* ld needs to be cast into the map struct */ - lmap->ld = ld; - return TRUE; -#else - if (ldap_bind_s(ld, lmap->binddn,lmap->passwd,lmap->method) != LDAP_SUCCESS) - { - if (!bitset(MF_OPTIONAL, map->map_mflags)) - { - syserr("421 Cannot bind to map %s in ldap server %s", - map->map_mname, lmap->ldaphost); - } - } - else - { - /* We need to cast ld into the map structure */ - lmap->ld = ld; - return TRUE; - } - - return FALSE; -#endif -} - - -/* -** LDAP_MAP_STOP -- close the ldap connection -*/ - -void -ldap_map_stop(map) - MAP *map; -{ - LDAP_MAP_STRUCT *lmap; - - lmap = (LDAP_MAP_STRUCT *) map->map_db1; - if (lmap->ld != NULL) - { - ldap_unbind(lmap->ld); - lmap->ld = NULL; - } -} - -/* -** LDAP_MAP_CLOSE -- close ldap map -*/ - -void -ldap_map_close(map) - MAP *map; -{ - ldap_map_stop(map); -} - -#ifdef SUNET_ID -/* -** SUNET_ID_HASH -- Convert a string to it's Sunet_id canonical form -** This only makes sense at Stanford University. -*/ - -char * -sunet_id_hash(str) - char *str; -{ - char *p, *p_last; - - p = str; - p_last = p; - while (*p != '\0') - { - if (islower(*p) || isdigit(*p)) - { - *p_last = *p; - p_last++; - } - else if (isupper(*p)) - { - *p_last = tolower(*p); - p_last++; - } - ++p; - } - if (*p_last != '\0') - *p_last = '\0'; - return (str); -} - - - -#endif /* SUNET_ID */ -/* -** LDAP_MAP_LOOKUP -- look up a datum in a LDAP map -*/ - -char * -ldap_map_lookup(map, name, av, statp) - MAP *map; - char *name; - char **av; - int *statp; -{ - LDAP_MAP_STRUCT *lmap = NULL; - LDAPMessage *entry; - char *vp; - auto int vsize; - char keybuf[MAXNAME + 1]; - char filter[LDAP_MAP_MAX_FILTER + 1]; - char **attr_values = NULL; - char *result; - int name_len; - char *fp, *p, *q; - - if (tTd(38, 20)) - printf("ldap_map_lookup(%s, %s)\n", map->map_mname, name); - - /* actually open the map */ - if (!ldap_map_start(map)) - { - result = NULL; - *statp = EX_TEMPFAIL; - goto quick_exit; - } - - /* Get ldap struct pointer from map */ - lmap = (LDAP_MAP_STRUCT *) map->map_db1; - - name_len = strlen(name); - if (name_len > MAXNAME) - name_len = MAXNAME; - strncpy(keybuf, name, name_len); - keybuf[name_len] = '\0'; - - if (!bitset(MF_NOFOLDCASE, map->map_mflags)) -#ifdef SUNET_ID - sunet_id_hash(keybuf); -#else - makelower(keybuf); -#endif /*SUNET_ID */ - - /* substitute keybuf into filter, perhaps multiple times */ - fp = filter; - p = lmap->filter; - while ((q = strchr(p, '%')) != NULL) - { - if (q[1] == 's') - { - snprintf(fp, SPACELEFT(filter, fp), "%.*s%s", - q - p, p, keybuf); - p = q + 2; - } - else - { - snprintf(fp, SPACELEFT(filter, fp), "%.*s", - q - p + 1, p); - p = q + (q[1] == '%' ? 2 : 1); - } - fp += strlen(fp); - } - snprintf(fp, SPACELEFT(filter, fp), "%s", p); - if (tTd(38, 20)) - printf("ldap search filter=%s\n", filter); - - if (ldap_search_st(lmap->ld, lmap->base,lmap->scope,filter, - lmap->attr, lmap->attrsonly, &(lmap->timeout), - &(lmap->res)) != LDAP_SUCCESS) - { - /* try stopping/starting map */ - ldap_map_stop(map); - if (!ldap_map_start(map)) - { - result = NULL; - *statp = EX_TEMPFAIL; - goto quick_exit; - } - if (ldap_search_st(lmap->ld, lmap->base, lmap->scope, filter, - lmap->attr, lmap->attrsonly, - &(lmap->timeout), &(lmap->res)) - != LDAP_SUCCESS) - { - if (!bitset(MF_OPTIONAL, map->map_mflags)) - { - syserr("%sError in ldap_search_st using %s in map %s", - bitset(MF_NODEFER, map->map_mflags) ? "" : "421 ", - filter, map->map_mname); - } - result = NULL; - *statp = EX_TEMPFAIL; - goto quick_exit; - } - } - - entry = ldap_first_entry(lmap->ld,lmap->res); - if (entry == NULL) - { - result = NULL; - *statp = EX_NOTFOUND; - goto quick_exit; - } - - /* Need to build the args for map_rewrite here */ - attr_values = ldap_get_values(lmap->ld,entry,lmap->attr[0]); - if (attr_values == NULL) - { - /* bad things happened */ - result = NULL; - *statp = EX_NOTFOUND; - goto quick_exit; - } - - *statp = EX_OK; - - /* If there is more that one use the first */ - vp = attr_values[0]; - vsize = strlen(vp); - - if (LogLevel > 9) - sm_syslog(LOG_INFO, CurEnv->e_id, - "ldap %.100s => %s", - name, vp); - if (bitset(MF_MATCHONLY, map->map_mflags)) - result = map_rewrite(map, name, strlen(name), NULL); - else - result = map_rewrite(map, vp, vsize, av); - - quick_exit: - if (attr_values != NULL) - ldap_value_free(attr_values); - if (lmap != NULL) - ldap_msgfree(lmap->res); - ldap_map_stop(map); - return result ; -} - - -/* -** LDAP_MAP_DEQUOTE - helper routine for ldap_map_parseargs -*/ - -char * -ldap_map_dequote(str) - char *str; -{ - char *p; - char *start; - p = str; - - if (*p == '"') - { - start = ++p; - /* Should probably swallow initial whitespace here */ - } - else - { - return(str); - } - while (*p != '"' && *p != '\0') - { - p++; - } - if (*p != '\0') - *p = '\0'; - return start; -} - -/* -** LDAP_MAP_PARSEARGS -- parse ldap map definition args. -*/ - -bool -ldap_map_parseargs(map,args) - MAP *map; - char *args; -{ - register char *p = args; - register int done; - LDAP_MAP_STRUCT *lmap; - - /* We need to alloc an LDAP_MAP_STRUCT struct */ - lmap = (LDAP_MAP_STRUCT *) xalloc(sizeof(LDAP_MAP_STRUCT)); - - /* Set default int's here , default strings below */ - lmap->ldapport = DEFAULT_LDAP_MAP_PORT; - lmap->deref = DEFAULT_LDAP_MAP_DEREF; - lmap->timelimit = DEFAULT_LDAP_MAP_TIMELIMIT; - lmap->sizelimit = DEFAULT_LDAP_MAP_SIZELIMIT; - lmap->ldap_options = DEFAULT_LDAP_MAP_LDAP_OPTIONS; - lmap->method = DEFAULT_LDAP_MAP_METHOD; - lmap->scope = DEFAULT_LDAP_MAP_SCOPE; - lmap->attrsonly = DEFAULT_LDAP_MAP_ATTRSONLY; - lmap->timeout.tv_sec = DEFAULT_LDAP_MAP_TIMELIMIT; - lmap->timeout.tv_usec = 0; - - /* Default char ptrs to NULL */ - lmap->binddn = NULL; - lmap->passwd = NULL; - lmap->base = NULL; - lmap->ldaphost = NULL; - - /* Default general ptrs to NULL */ - lmap->ld = NULL; - lmap->res = NULL; - - map->map_mflags |= MF_TRY0NULL | MF_TRY1NULL; - for (;;) - { - while (isascii(*p) && isspace(*p)) - p++; - if (*p != '-') - break; - switch (*++p) - { - case 'N': - map->map_mflags |= MF_INCLNULL; - map->map_mflags &= ~MF_TRY0NULL; - break; - - case 'O': - map->map_mflags &= ~MF_TRY1NULL; - break; - - case 'o': - map->map_mflags |= MF_OPTIONAL; - break; - - case 'f': - map->map_mflags |= MF_NOFOLDCASE; - break; - - case 'm': - map->map_mflags |= MF_MATCHONLY; - break; - - case 'A': - map->map_mflags |= MF_APPEND; - break; - - case 'q': - map->map_mflags |= MF_KEEPQUOTES; - break; - - case 't': - map->map_mflags |= MF_NODEFER; - break; - - case 'a': - map->map_app = ++p; - break; - - case 'T': - map->map_tapp = ++p; - break; - - /* Start of ldap_map specific args */ - case 'k': /* search field */ - while (isascii(*++p) && isspace(*p)) - continue; - lmap->filter = p; - break; - - case 'v': /* attr to return */ - while (isascii(*++p) && isspace(*p)) - continue; - lmap->attr[0] = p; - lmap->attr[1] = NULL; - break; - - /* args stolen from ldapsearch.c */ - case 'R': /* don't auto chase referrals */ -#ifdef LDAP_REFERRALS - lmap->ldap_options &= ~LDAP_OPT_REFERRALS; -#else /* LDAP_REFERRALS */ - syserr("compile with -DLDAP_REFERRALS for referral support\n"); -#endif /* LDAP_REFERRALS */ - break; - - case 'n': /* retrieve attribute names only -- no values */ - lmap->attrsonly += 1; - break; - - case 's': /* search scope */ - if (strncasecmp(++p, "base", 4) == 0) - { - lmap->scope = LDAP_SCOPE_BASE; - } - else if (strncasecmp(p, "one", 3) == 0) - { - lmap->scope = LDAP_SCOPE_ONELEVEL; - } - else if (strncasecmp(p, "sub", 3) == 0) - { - lmap->scope = LDAP_SCOPE_SUBTREE; - } - else - { /* bad config line */ - if (!bitset(MCF_OPTFILE, map->map_class->map_cflags)) - { - char *ptr; - - if ((ptr = strchr(p, ' ')) != NULL) - *ptr = '\0'; - syserr("Scope must be [base|one|sub] not %s in map %s", - p, map->map_mname); - if (ptr != NULL) - *ptr = ' '; - return FALSE; - } - } - break; - - case 'h': /* ldap host */ - while (isascii(*++p) && isspace(*p)) - continue; - map->map_domain = p; - lmap->ldaphost = p; - break; - - case 'b': /* search base */ - while (isascii(*++p) && isspace(*p)) - continue; - lmap->base = p; - break; - - case 'p': /* ldap port */ - while (isascii(*++p) && isspace(*p)) - continue; - lmap->ldapport = atoi(p); - break; - - case 'l': /* time limit */ - while (isascii(*++p) && isspace(*p)) - continue; - lmap->timelimit = atoi(p); - lmap->timeout.tv_sec = lmap->timelimit; - break; - - } - - /* need to account for quoted strings here arggg... */ - done = isascii(*p) && isspace(*p); - while (*p != '\0' && !done) - { - if (*p == '"') - { - while (*++p != '"' && *p != '\0') - { - continue; - } - if (*p != '\0') - p++; - } - else - { - p++; - } - done = isascii(*p) && isspace(*p); - } - - if (*p != '\0') - *p++ = '\0'; - } - - if (map->map_app != NULL) - map->map_app = newstr(ldap_map_dequote(map->map_app)); - if (map->map_tapp != NULL) - map->map_tapp = newstr(ldap_map_dequote(map->map_tapp)); - if (map->map_domain != NULL) - map->map_domain = newstr(ldap_map_dequote(map->map_domain)); - - /* - ** We need to swallow up all the stuff into a struct - ** and dump it into map->map_dbptr1 - */ - - if (lmap->ldaphost != NULL) - lmap->ldaphost = newstr(ldap_map_dequote(lmap->ldaphost)); - else - { - syserr("LDAP map: -h flag is required"); - return FALSE; - } - - if (lmap->binddn != NULL) - lmap->binddn = newstr(ldap_map_dequote(lmap->binddn)); - else - lmap->binddn = DEFAULT_LDAP_MAP_BINDDN; - - - if (lmap->passwd != NULL) - lmap->passwd = newstr(ldap_map_dequote(lmap->passwd)); - else - lmap->passwd = DEFAULT_LDAP_MAP_PASSWD; - - if (lmap->base != NULL) - lmap->base = newstr(ldap_map_dequote(lmap->base)); - else - { - syserr("LDAP map: -b flag is required"); - return FALSE; - } - - - if (lmap->filter != NULL) - lmap->filter = newstr(ldap_map_dequote(lmap->filter)); - else - { - if (!bitset(MCF_OPTFILE, map->map_class->map_cflags)) - { - syserr("No filter given in map %s", map->map_mname); - return FALSE; - } - } - if (lmap->attr[0] != NULL) - lmap->attr[0] = newstr(ldap_map_dequote(lmap->attr[0])); - else - { - if (!bitset(MCF_OPTFILE, map->map_class->map_cflags)) - { - syserr("No return attribute in %s", map->map_mname); - return FALSE; - } - } - - map->map_db1 = (ARBPTR_T) lmap; - return TRUE; -} - -#endif /* LDAP Modules */ -/* -** syslog map -*/ - -#if _FFR_MAP_SYSLOG - -#define map_prio map_lockfd /* overload field */ - -/* -** SYSLOG_MAP_PARSEARGS -- check for priority level to syslog messages. -*/ - -bool -syslog_map_parseargs(map, args) - MAP *map; - char *args; -{ - char *p = args; - char *priority = NULL; - - for (;;) - { - while (isascii(*p) && isspace(*p)) - p++; - if (*p != '-') - break; - if (*++p == 'L') - priority = ++p; - while (*p != '\0' && !(isascii(*p) && isspace(*p))) - p++; - if (*p != '\0') - *p++ = '\0'; - } - - if (priority == NULL) - map->map_prio = LOG_INFO; - else - { - if (strncasecmp("LOG_", priority, 4) == 0) - priority += 4; - -#ifdef LOG_EMERG - if (strcasecmp("EMERG", priority) == 0) - map->map_prio = LOG_EMERG; - else -#endif -#ifdef LOG_ALERT - if (strcasecmp("ALERT", priority) == 0) - map->map_prio = LOG_ALERT; - else -#endif -#ifdef LOG_CRIT - if (strcasecmp("CRIT", priority) == 0) - map->map_prio = LOG_CRIT; - else -#endif -#ifdef LOG_ERR - if (strcasecmp("ERR", priority) == 0) - map->map_prio = LOG_ERR; - else -#endif -#ifdef LOG_WARNING - if (strcasecmp("WARNING", priority) == 0) - map->map_prio = LOG_WARNING; - else -#endif -#ifdef LOG_NOTICE - if (strcasecmp("NOTICE", priority) == 0) - map->map_prio = LOG_NOTICE; - else -#endif -#ifdef LOG_INFO - if (strcasecmp("INFO", priority) == 0) - map->map_prio = LOG_INFO; - else -#endif -#ifdef LOG_DEBUG - if (strcasecmp("DEBUG", priority) == 0) - map->map_prio = LOG_DEBUG; - else -#endif - { - syserr("syslog_map_parseargs: Unknown priority %s\n", - priority); - return FALSE; - } - } - return TRUE; -} - -/* -** SYSLOG_MAP_LOOKUP -- rewrite and syslog message. Always return empty string -*/ - -char * -syslog_map_lookup(map, string, args, statp) - MAP *map; - char *string; - char **args; - int *statp; -{ - char *ptr = map_rewrite(map, string, strlen(string), args); - - if (ptr != NULL) - { - if (tTd(38, 20)) - printf("syslog_map_lookup(%s (priority %d): %s\n", - map->map_mname, map->map_prio, ptr); - - sm_syslog(map->map_prio, CurEnv->e_id, "%s", ptr); - } - - *statp = EX_OK; - return ""; -} - -#endif /* _FFR_MAP_SYSLOG */ -/* -** HESIOD Modules -*/ - -#ifdef HESIOD - -bool -hes_map_open(map, mode) - MAP *map; - int mode; -{ - if (tTd(38, 2)) - printf("hes_map_open(%s, %s, %d)\n", - map->map_mname, map->map_file, mode); - - if (mode != O_RDONLY) - { - /* issue a pseudo-error message */ -#ifdef ENOSYS - errno = ENOSYS; -#else -# ifdef EFTYPE - errno = EFTYPE; -# else - errno = ENXIO; -# endif -#endif - return FALSE; - } - -#ifdef HESIOD_INIT - if (HesiodContext != NULL || hesiod_init(&HesiodContext) == 0) - return TRUE; - - if (!bitset(MF_OPTIONAL, map->map_mflags)) - syserr("421 cannot initialize Hesiod map (%s)", - errstring(errno)); - return FALSE; -#else - if (hes_error() == HES_ER_UNINIT) - hes_init(); - switch (hes_error()) - { - case HES_ER_OK: - case HES_ER_NOTFOUND: - return TRUE; - } - - if (!bitset(MF_OPTIONAL, map->map_mflags)) - syserr("421 cannot initialize Hesiod map (%d)", hes_error()); - - return FALSE; -#endif /* HESIOD_INIT */ -} - -char * -hes_map_lookup(map, name, av, statp) - MAP *map; - char *name; - char **av; - int *statp; -{ - char **hp; - - if (tTd(38, 20)) - printf("hes_map_lookup(%s, %s)\n", map->map_file, name); - - if (name[0] == '\\') - { - char *np; - int nl; - char nbuf[MAXNAME]; - - nl = strlen(name); - if (nl < sizeof nbuf - 1) - np = nbuf; - else - np = xalloc(strlen(name) + 2); - np[0] = '\\'; - strcpy(&np[1], name); -#ifdef HESIOD_INIT - hp = hesiod_resolve(HesiodContext, np, map->map_file); -#else - hp = hes_resolve(np, map->map_file); -#endif /* HESIOD_INIT */ - if (np != nbuf) - free(np); - } - else - { -#ifdef HESIOD_INIT - hp = hesiod_resolve(HesiodContext, name, map->map_file); -#else - hp = hes_resolve(name, map->map_file); -#endif /* HESIOD_INIT */ - } -#ifdef HESIOD_INIT - if (hp == NULL) - return NULL; - if (*hp == NULL) - { - hesiod_free_list(HesiodContext, hp); - switch (errno) - { - case ENOENT: - *statp = EX_NOTFOUND; - break; - case ECONNREFUSED: - case EMSGSIZE: - *statp = EX_TEMPFAIL; - break; - case ENOMEM: - default: - *statp = EX_UNAVAILABLE; - break; - } - return NULL; - } -#else - if (hp == NULL || hp[0] == NULL) - { - switch (hes_error()) - { - case HES_ER_OK: - *statp = EX_OK; - break; - - case HES_ER_NOTFOUND: - *statp = EX_NOTFOUND; - break; - - case HES_ER_CONFIG: - *statp = EX_UNAVAILABLE; - break; - - case HES_ER_NET: - *statp = EX_TEMPFAIL; - break; - } - return NULL; - } -#endif /* HESIOD_INIT */ - - if (bitset(MF_MATCHONLY, map->map_mflags)) - return map_rewrite(map, name, strlen(name), NULL); - else - return map_rewrite(map, hp[0], strlen(hp[0]), av); -} - -#endif -/* -** NeXT NETINFO Modules -*/ - -#if NETINFO - -# define NETINFO_DEFAULT_DIR "/aliases" -# define NETINFO_DEFAULT_PROPERTY "members" - -extern char *ni_propval __P((char *, char *, char *, char *, int)); - - -/* -** NI_MAP_OPEN -- open NetInfo Aliases -*/ - -bool -ni_map_open(map, mode) - MAP *map; - int mode; -{ - if (tTd(38, 2)) - printf("ni_map_open(%s, %s, %d)\n", - map->map_mname, map->map_file, mode); - mode &= O_ACCMODE; - - if (*map->map_file == '\0') - map->map_file = NETINFO_DEFAULT_DIR; - - if (map->map_valcolnm == NULL) - map->map_valcolnm = NETINFO_DEFAULT_PROPERTY; - - if (map->map_coldelim == '\0' && bitset(MF_ALIAS, map->map_mflags)) - map->map_coldelim = ','; - - return TRUE; -} - - -/* -** NI_MAP_LOOKUP -- look up a datum in NetInfo -*/ - -char * -ni_map_lookup(map, name, av, statp) - MAP *map; - char *name; - char **av; - int *statp; -{ - char *res; - char *propval; - - if (tTd(38, 20)) - printf("ni_map_lookup(%s, %s)\n", map->map_mname, name); - - propval = ni_propval(map->map_file, map->map_keycolnm, name, - map->map_valcolnm, map->map_coldelim); - - if (propval == NULL) - return NULL; - - if (bitset(MF_MATCHONLY, map->map_mflags)) - res = map_rewrite(map, name, strlen(name), NULL); - else - res = map_rewrite(map, propval, strlen(propval), av); - free(propval); - return res; -} - - -bool -ni_getcanonname(name, hbsize, statp) - char *name; - int hbsize; - int *statp; -{ - char *vptr; - char *ptr; - char nbuf[MAXNAME + 1]; - - if (tTd(38, 20)) - printf("ni_getcanonname(%s)\n", name); - - if (strlen(name) >= sizeof nbuf) - { - *statp = EX_UNAVAILABLE; - return FALSE; - } - (void) strcpy(nbuf, name); - shorten_hostname(nbuf); - - /* we only accept single token search key */ - if (strchr(nbuf, '.')) - { - *statp = EX_NOHOST; - return FALSE; - } - - /* Do the search */ - vptr = ni_propval("/machines", NULL, nbuf, "name", '\n'); - - if (vptr == NULL) - { - *statp = EX_NOHOST; - return FALSE; - } - - /* Only want the first machine name */ - if ((ptr = strchr(vptr, '\n')) != NULL) - *ptr = '\0'; - - if (hbsize >= strlen(vptr)) - { - strcpy(name, vptr); - *statp = EX_OK; - return TRUE; - } - *statp = EX_UNAVAILABLE; - free(vptr); - return FALSE; -} - - -/* -** NI_PROPVAL -- NetInfo property value lookup routine -** -** Parameters: -** keydir -- the NetInfo directory name in which to search -** for the key. -** keyprop -- the name of the property in which to find the -** property we are interested. Defaults to "name". -** keyval -- the value for which we are really searching. -** valprop -- the property name for the value in which we -** are interested. -** sepchar -- if non-nil, this can be multiple-valued, and -** we should return a string separated by this -** character. -** -** Returns: -** NULL -- if: -** 1. the directory is not found -** 2. the property name is not found -** 3. the property contains multiple values -** 4. some error occured -** else -- the value of the lookup. -** -** Example: -** To search for an alias value, use: -** ni_propval("/aliases", "name", aliasname, "members", ',') -** -** Notes: -** Caller should free the return value of ni_proval -*/ - -# include <netinfo/ni.h> - -# define LOCAL_NETINFO_DOMAIN "." -# define PARENT_NETINFO_DOMAIN ".." -# define MAX_NI_LEVELS 256 - -char * -ni_propval(keydir, keyprop, keyval, valprop, sepchar) - char *keydir; - char *keyprop; - char *keyval; - char *valprop; - int sepchar; -{ - char *propval = NULL; - int i; - int j, alen; - void *ni = NULL; - void *lastni = NULL; - ni_status nis; - ni_id nid; - ni_namelist ninl; - register char *p; - char keybuf[1024]; - - /* - ** Create the full key from the two parts. - ** - ** Note that directory can end with, e.g., "name=" to specify - ** an alternate search property. - */ - - i = strlen(keydir) + strlen(keyval) + 2; - if (keyprop != NULL) - i += strlen(keyprop) + 1; - if (i > sizeof keybuf) - return NULL; - strcpy(keybuf, keydir); - strcat(keybuf, "/"); - if (keyprop != NULL) - { - strcat(keybuf, keyprop); - strcat(keybuf, "="); - } - strcat(keybuf, keyval); - - if (tTd(38, 21)) - printf("ni_propval(%s, %s, %s, %s, %d) keybuf='%s'\n", - keydir, keyprop, keyval, valprop, sepchar, keybuf); - /* - ** If the passed directory and property name are found - ** in one of netinfo domains we need to search (starting - ** from the local domain moving all the way back to the - ** root domain) set propval to the property's value - ** and return it. - */ - - for (i = 0; i < MAX_NI_LEVELS && propval == NULL; i++) - { - if (i == 0) - { - nis = ni_open(NULL, LOCAL_NETINFO_DOMAIN, &ni); - if (tTd(38, 20)) - printf("ni_open(LOCAL) = %d\n", nis); - } - else - { - if (lastni != NULL) - ni_free(lastni); - lastni = ni; - nis = ni_open(lastni, PARENT_NETINFO_DOMAIN, &ni); - if (tTd(38, 20)) - printf("ni_open(PARENT) = %d\n", nis); - } - - /* - ** Don't bother if we didn't get a handle on a - ** proper domain. This is not necessarily an error. - ** We would get a positive ni_status if, for instance - ** we never found the directory or property and tried - ** to open the parent of the root domain! - */ - - if (nis != 0) - break; - - /* - ** Find the path to the server information. - */ - - if (ni_pathsearch(ni, &nid, keybuf) != 0) - continue; - - /* - ** Find associated value information. - */ - - if (ni_lookupprop(ni, &nid, valprop, &ninl) != 0) - continue; - - if (tTd(38, 20)) - printf("ni_lookupprop: len=%d\n", ninl.ni_namelist_len); - /* - ** See if we have an acceptable number of values. - */ - - if (ninl.ni_namelist_len <= 0) - continue; - - if (sepchar == '\0' && ninl.ni_namelist_len > 1) - { - ni_namelist_free(&ninl); - continue; - } - - /* - ** Calculate number of bytes needed and build result - */ - - alen = 1; - for (j = 0; j < ninl.ni_namelist_len; j++) - alen += strlen(ninl.ni_namelist_val[j]) + 1; - propval = p = xalloc(alen); - for (j = 0; j < ninl.ni_namelist_len; j++) - { - strcpy(p, ninl.ni_namelist_val[j]); - p += strlen(p); - *p++ = sepchar; - } - *--p = '\0'; - - ni_namelist_free(&ninl); - } - - /* - ** Clean up. - */ - - if (ni != NULL) - ni_free(ni); - if (lastni != NULL && ni != lastni) - ni_free(lastni); - if (tTd(38, 20)) - printf("ni_propval returns: '%s'\n", propval); - - return propval; -} - -#endif /* NETINFO */ -/* -** TEXT (unindexed text file) Modules -** -** This code donated by Sun Microsystems. -*/ - -#define map_sff map_lockfd /* overload field */ - - -/* -** TEXT_MAP_OPEN -- open text table -*/ - -bool -text_map_open(map, mode) - MAP *map; - int mode; -{ - int sff; - int i; - - if (tTd(38, 2)) - printf("text_map_open(%s, %s, %d)\n", - map->map_mname, map->map_file, mode); - - mode &= O_ACCMODE; - if (mode != O_RDONLY) - { - errno = EPERM; - return FALSE; - } - - if (*map->map_file == '\0') - { - syserr("text map \"%s\": file name required", - map->map_mname); - return FALSE; - } - - if (map->map_file[0] != '/') - { - syserr("text map \"%s\": file name must be fully qualified", - map->map_mname); - return FALSE; - } - - sff = SFF_ROOTOK|SFF_REGONLY; - if (!bitset(DBS_LINKEDMAPINWRITABLEDIR, DontBlameSendmail)) - sff |= SFF_NOWLINK; - if (!bitset(DBS_MAPINUNSAFEDIRPATH, DontBlameSendmail)) - sff |= SFF_SAFEDIRPATH; - if ((i = safefile(map->map_file, RunAsUid, RunAsGid, RunAsUserName, - sff, S_IRUSR, NULL)) != 0) - { - /* cannot open this map */ - if (tTd(38, 2)) - printf("\tunsafe map file: %d\n", i); - if (!bitset(MF_OPTIONAL, map->map_mflags)) - syserr("text map \"%s\": unsafe map file %s", - map->map_mname, map->map_file); - return FALSE; - } - - if (map->map_keycolnm == NULL) - map->map_keycolno = 0; - else - { - if (!(isascii(*map->map_keycolnm) && isdigit(*map->map_keycolnm))) - { - syserr("text map \"%s\", file %s: -k should specify a number, not %s", - map->map_mname, map->map_file, - map->map_keycolnm); - return FALSE; - } - map->map_keycolno = atoi(map->map_keycolnm); - } - - if (map->map_valcolnm == NULL) - map->map_valcolno = 0; - else - { - if (!(isascii(*map->map_valcolnm) && isdigit(*map->map_valcolnm))) - { - syserr("text map \"%s\", file %s: -v should specify a number, not %s", - map->map_mname, map->map_file, - map->map_valcolnm); - return FALSE; - } - map->map_valcolno = atoi(map->map_valcolnm); - } - - if (tTd(38, 2)) - { - printf("text_map_open(%s, %s): delimiter = ", - map->map_mname, map->map_file); - if (map->map_coldelim == '\0') - printf("(white space)\n"); - else - printf("%c\n", map->map_coldelim); - } - - map->map_sff = sff; - return TRUE; -} - - -/* -** TEXT_MAP_LOOKUP -- look up a datum in a TEXT table -*/ - -char * -text_map_lookup(map, name, av, statp) - MAP *map; - char *name; - char **av; - int *statp; -{ - char *vp; - auto int vsize; - int buflen; - FILE *f; - char delim; - int key_idx; - bool found_it; - int sff = map->map_sff; - char search_key[MAXNAME + 1]; - char linebuf[MAXLINE]; - char buf[MAXNAME + 1]; - extern char *get_column __P((char *, int, char, char *, int)); - - found_it = FALSE; - if (tTd(38, 20)) - printf("text_map_lookup(%s, %s)\n", map->map_mname, name); - - buflen = strlen(name); - if (buflen > sizeof search_key - 1) - buflen = sizeof search_key - 1; - bcopy(name, search_key, buflen); - search_key[buflen] = '\0'; - if (!bitset(MF_NOFOLDCASE, map->map_mflags)) - makelower(search_key); - - f = safefopen(map->map_file, O_RDONLY, FileMode, sff); - if (f == NULL) - { - map->map_mflags &= ~(MF_VALID|MF_OPEN); - *statp = EX_UNAVAILABLE; - return NULL; - } - key_idx = map->map_keycolno; - delim = map->map_coldelim; - while (fgets(linebuf, MAXLINE, f) != NULL) - { - char *p; - - /* skip comment line */ - if (linebuf[0] == '#') - continue; - p = strchr(linebuf, '\n'); - if (p != NULL) - *p = '\0'; - p = get_column(linebuf, key_idx, delim, buf, sizeof buf); - if (p != NULL && strcasecmp(search_key, p) == 0) - { - found_it = TRUE; - break; - } - } - fclose(f); - if (!found_it) - { - *statp = EX_NOTFOUND; - return NULL; - } - vp = get_column(linebuf, map->map_valcolno, delim, buf, sizeof buf); - if (vp == NULL) - { - *statp = EX_NOTFOUND; - return NULL; - } - vsize = strlen(vp); - *statp = EX_OK; - if (bitset(MF_MATCHONLY, map->map_mflags)) - return map_rewrite(map, name, strlen(name), NULL); - else - return map_rewrite(map, vp, vsize, av); -} - - -/* -** TEXT_GETCANONNAME -- look up canonical name in hosts file -*/ - -bool -text_getcanonname(name, hbsize, statp) - char *name; - int hbsize; - int *statp; -{ - bool found; - FILE *f; - char linebuf[MAXLINE]; - char cbuf[MAXNAME + 1]; - char nbuf[MAXNAME + 1]; - - if (tTd(38, 20)) - printf("text_getcanonname(%s)\n", name); - - if (strlen(name) >= (SIZE_T) sizeof nbuf) - { - *statp = EX_UNAVAILABLE; - return FALSE; - } - (void) strcpy(nbuf, name); - shorten_hostname(nbuf); - - f = fopen(HostsFile, "r"); - if (f == NULL) - { - *statp = EX_UNAVAILABLE; - return FALSE; - } - found = FALSE; - while (!found && fgets(linebuf, MAXLINE, f) != NULL) - { - char *p = strpbrk(linebuf, "#\n"); - - if (p != NULL) - *p = '\0'; - if (linebuf[0] != '\0') - found = extract_canonname(nbuf, linebuf, cbuf, sizeof cbuf); - } - fclose(f); - if (!found) - { - *statp = EX_NOHOST; - return FALSE; - } - - if ((SIZE_T) hbsize >= strlen(cbuf)) - { - strcpy(name, cbuf); - *statp = EX_OK; - return TRUE; - } - *statp = EX_UNAVAILABLE; - return FALSE; -} -/* -** STAB (Symbol Table) Modules -*/ - - -/* -** STAB_MAP_LOOKUP -- look up alias in symbol table -*/ - -/* ARGSUSED2 */ -char * -stab_map_lookup(map, name, av, pstat) - register MAP *map; - char *name; - char **av; - int *pstat; -{ - register STAB *s; - - if (tTd(38, 20)) - printf("stab_lookup(%s, %s)\n", - map->map_mname, name); - - s = stab(name, ST_ALIAS, ST_FIND); - if (s != NULL) - return (s->s_alias); - return (NULL); -} - - -/* -** STAB_MAP_STORE -- store in symtab (actually using during init, not rebuild) -*/ - -void -stab_map_store(map, lhs, rhs) - register MAP *map; - char *lhs; - char *rhs; -{ - register STAB *s; - - s = stab(lhs, ST_ALIAS, ST_ENTER); - s->s_alias = newstr(rhs); -} - - -/* -** STAB_MAP_OPEN -- initialize (reads data file) -** -** This is a wierd case -- it is only intended as a fallback for -** aliases. For this reason, opens for write (only during a -** "newaliases") always fails, and opens for read open the -** actual underlying text file instead of the database. -*/ - -bool -stab_map_open(map, mode) - register MAP *map; - int mode; -{ - FILE *af; - int sff; - struct stat st; - - if (tTd(38, 2)) - printf("stab_map_open(%s, %s, %d)\n", - map->map_mname, map->map_file, mode); - - mode &= O_ACCMODE; - if (mode != O_RDONLY) - { - errno = EPERM; - return FALSE; - } - - sff = SFF_ROOTOK|SFF_REGONLY; - if (!bitset(DBS_LINKEDMAPINWRITABLEDIR, DontBlameSendmail)) - sff |= SFF_NOWLINK; - if (!bitset(DBS_MAPINUNSAFEDIRPATH, DontBlameSendmail)) - sff |= SFF_SAFEDIRPATH; - af = safefopen(map->map_file, O_RDONLY, 0444, sff); - if (af == NULL) - return FALSE; - readaliases(map, af, FALSE, FALSE); - - if (fstat(fileno(af), &st) >= 0) - map->map_mtime = st.st_mtime; - fclose(af); - - return TRUE; -} -/* -** Implicit Modules -** -** Tries several types. For back compatibility of aliases. -*/ - - -/* -** IMPL_MAP_LOOKUP -- lookup in best open database -*/ - -char * -impl_map_lookup(map, name, av, pstat) - MAP *map; - char *name; - char **av; - int *pstat; -{ - if (tTd(38, 20)) - printf("impl_map_lookup(%s, %s)\n", - map->map_mname, name); - -#ifdef NEWDB - if (bitset(MF_IMPL_HASH, map->map_mflags)) - return db_map_lookup(map, name, av, pstat); -#endif -#ifdef NDBM - if (bitset(MF_IMPL_NDBM, map->map_mflags)) - return ndbm_map_lookup(map, name, av, pstat); -#endif - return stab_map_lookup(map, name, av, pstat); -} - -/* -** IMPL_MAP_STORE -- store in open databases -*/ - -void -impl_map_store(map, lhs, rhs) - MAP *map; - char *lhs; - char *rhs; -{ - if (tTd(38, 12)) - printf("impl_map_store(%s, %s, %s)\n", - map->map_mname, lhs, rhs); -#ifdef NEWDB - if (bitset(MF_IMPL_HASH, map->map_mflags)) - db_map_store(map, lhs, rhs); -#endif -#ifdef NDBM - if (bitset(MF_IMPL_NDBM, map->map_mflags)) - ndbm_map_store(map, lhs, rhs); -#endif - stab_map_store(map, lhs, rhs); -} - -/* -** IMPL_MAP_OPEN -- implicit database open -*/ - -bool -impl_map_open(map, mode) - MAP *map; - int mode; -{ - if (tTd(38, 2)) - printf("impl_map_open(%s, %s, %d)\n", - map->map_mname, map->map_file, mode); - - mode &= O_ACCMODE; -#ifdef NEWDB - map->map_mflags |= MF_IMPL_HASH; - if (hash_map_open(map, mode)) - { -# ifdef NDBM_YP_COMPAT - if (mode == O_RDONLY || strstr(map->map_file, "/yp/") == NULL) -# endif - return TRUE; - } - else - map->map_mflags &= ~MF_IMPL_HASH; -#endif -#ifdef NDBM - map->map_mflags |= MF_IMPL_NDBM; - if (ndbm_map_open(map, mode)) - { - return TRUE; - } - else - map->map_mflags &= ~MF_IMPL_NDBM; -#endif - -#if defined(NEWDB) || defined(NDBM) - if (Verbose) - message("WARNING: cannot open alias database %s%s", - map->map_file, - mode == O_RDONLY ? "; reading text version" : ""); -#else - if (mode != O_RDONLY) - usrerr("Cannot rebuild aliases: no database format defined"); -#endif - - if (mode == O_RDONLY) - return stab_map_open(map, mode); - else - return FALSE; -} - - -/* -** IMPL_MAP_CLOSE -- close any open database(s) -*/ - -void -impl_map_close(map) - MAP *map; -{ - if (tTd(38, 9)) - printf("impl_map_close(%s, %s, %lx)\n", - map->map_mname, map->map_file, map->map_mflags); -#ifdef NEWDB - if (bitset(MF_IMPL_HASH, map->map_mflags)) - { - db_map_close(map); - map->map_mflags &= ~MF_IMPL_HASH; - } -#endif - -#ifdef NDBM - if (bitset(MF_IMPL_NDBM, map->map_mflags)) - { - ndbm_map_close(map); - map->map_mflags &= ~MF_IMPL_NDBM; - } -#endif -} -/* -** User map class. -** -** Provides access to the system password file. -*/ - -/* -** USER_MAP_OPEN -- open user map -** -** Really just binds field names to field numbers. -*/ - -bool -user_map_open(map, mode) - MAP *map; - int mode; -{ - if (tTd(38, 2)) - printf("user_map_open(%s, %d)\n", - map->map_mname, mode); - - mode &= O_ACCMODE; - if (mode != O_RDONLY) - { - /* issue a pseudo-error message */ -#ifdef ENOSYS - errno = ENOSYS; -#else -# ifdef EFTYPE - errno = EFTYPE; -# else - errno = ENXIO; -# endif -#endif - return FALSE; - } - if (map->map_valcolnm == NULL) - /* nothing */ ; - else if (strcasecmp(map->map_valcolnm, "name") == 0) - map->map_valcolno = 1; - else if (strcasecmp(map->map_valcolnm, "passwd") == 0) - map->map_valcolno = 2; - else if (strcasecmp(map->map_valcolnm, "uid") == 0) - map->map_valcolno = 3; - else if (strcasecmp(map->map_valcolnm, "gid") == 0) - map->map_valcolno = 4; - else if (strcasecmp(map->map_valcolnm, "gecos") == 0) - map->map_valcolno = 5; - else if (strcasecmp(map->map_valcolnm, "dir") == 0) - map->map_valcolno = 6; - else if (strcasecmp(map->map_valcolnm, "shell") == 0) - map->map_valcolno = 7; - else - { - syserr("User map %s: unknown column name %s", - map->map_mname, map->map_valcolnm); - return FALSE; - } - return TRUE; -} - - -/* -** USER_MAP_LOOKUP -- look up a user in the passwd file. -*/ - -/* ARGSUSED3 */ -char * -user_map_lookup(map, key, av, statp) - MAP *map; - char *key; - char **av; - int *statp; -{ - struct passwd *pw; - auto bool fuzzy; - - if (tTd(38, 20)) - printf("user_map_lookup(%s, %s)\n", - map->map_mname, key); - - pw = finduser(key, &fuzzy); - if (pw == NULL) - return NULL; - if (bitset(MF_MATCHONLY, map->map_mflags)) - return map_rewrite(map, key, strlen(key), NULL); - else - { - char *rwval = NULL; - char buf[30]; - - switch (map->map_valcolno) - { - case 0: - case 1: - rwval = pw->pw_name; - break; - - case 2: - rwval = pw->pw_passwd; - break; - - case 3: - snprintf(buf, sizeof buf, "%d", pw->pw_uid); - rwval = buf; - break; - - case 4: - snprintf(buf, sizeof buf, "%d", pw->pw_gid); - rwval = buf; - break; - - case 5: - rwval = pw->pw_gecos; - break; - - case 6: - rwval = pw->pw_dir; - break; - - case 7: - rwval = pw->pw_shell; - break; - } - return map_rewrite(map, rwval, strlen(rwval), av); - } -} -/* -** Program map type. -** -** This provides access to arbitrary programs. It should be used -** only very sparingly, since there is no way to bound the cost -** of invoking an arbitrary program. -*/ - -char * -prog_map_lookup(map, name, av, statp) - MAP *map; - char *name; - char **av; - int *statp; -{ - int i; - register char *p; - int fd; - auto pid_t pid; - char *rval; - int stat; - char *argv[MAXPV + 1]; - char buf[MAXLINE]; - - if (tTd(38, 20)) - printf("prog_map_lookup(%s, %s) %s\n", - map->map_mname, name, map->map_file); - - i = 0; - argv[i++] = map->map_file; - if (map->map_rebuild != NULL) - { - snprintf(buf, sizeof buf, "%s", map->map_rebuild); - for (p = strtok(buf, " \t"); p != NULL; p = strtok(NULL, " \t")) - { - if (i >= MAXPV - 1) - break; - argv[i++] = p; - } - } - argv[i++] = name; - argv[i] = NULL; - if (tTd(38, 21)) - { - printf("prog_open:"); - for (i = 0; argv[i] != NULL; i++) - printf(" %s", argv[i]); - printf("\n"); - } - (void) blocksignal(SIGCHLD); - pid = prog_open(argv, &fd, CurEnv); - if (pid < 0) - { - if (!bitset(MF_OPTIONAL, map->map_mflags)) - syserr("prog_map_lookup(%s) failed (%s) -- closing", - map->map_mname, errstring(errno)); - else if (tTd(38, 9)) - printf("prog_map_lookup(%s) failed (%s) -- closing", - map->map_mname, errstring(errno)); - map->map_mflags &= ~(MF_VALID|MF_OPEN); - *statp = EX_OSFILE; - return NULL; - } - i = read(fd, buf, sizeof buf - 1); - if (i < 0) - { - syserr("prog_map_lookup(%s): read error %s\n", - map->map_mname, errstring(errno)); - rval = NULL; - } - else if (i == 0) - { - if (tTd(38, 20)) - printf("prog_map_lookup(%s): empty answer\n", - map->map_mname); - rval = NULL; - } - else - { - buf[i] = '\0'; - p = strchr(buf, '\n'); - if (p != NULL) - *p = '\0'; - - /* collect the return value */ - if (bitset(MF_MATCHONLY, map->map_mflags)) - rval = map_rewrite(map, name, strlen(name), NULL); - else - rval = map_rewrite(map, buf, strlen(buf), NULL); - - /* now flush any additional output */ - while ((i = read(fd, buf, sizeof buf)) > 0) - continue; - } - - /* wait for the process to terminate */ - close(fd); - stat = waitfor(pid); - (void) releasesignal(SIGCHLD); - - if (stat == -1) - { - syserr("prog_map_lookup(%s): wait error %s\n", - map->map_mname, errstring(errno)); - *statp = EX_SOFTWARE; - rval = NULL; - } - else if (WIFEXITED(stat)) - { - if ((*statp = WEXITSTATUS(stat)) != EX_OK) - rval = NULL; - } - else - { - syserr("prog_map_lookup(%s): child died on signal %d", - map->map_mname, stat); - *statp = EX_UNAVAILABLE; - rval = NULL; - } - return rval; -} -/* -** Sequenced map type. -** -** Tries each map in order until something matches, much like -** implicit. Stores go to the first map in the list that can -** support storing. -** -** This is slightly unusual in that there are two interfaces. -** The "sequence" interface lets you stack maps arbitrarily. -** The "switch" interface builds a sequence map by looking -** at a system-dependent configuration file such as -** /etc/nsswitch.conf on Solaris or /etc/svc.conf on Ultrix. -** -** We don't need an explicit open, since all maps are -** opened during startup, including underlying maps. -*/ - -/* -** SEQ_MAP_PARSE -- Sequenced map parsing -*/ - -bool -seq_map_parse(map, ap) - MAP *map; - char *ap; -{ - int maxmap; - - if (tTd(38, 2)) - printf("seq_map_parse(%s, %s)\n", map->map_mname, ap); - maxmap = 0; - while (*ap != '\0') - { - register char *p; - STAB *s; - - /* find beginning of map name */ - while (isascii(*ap) && isspace(*ap)) - ap++; - for (p = ap; isascii(*p) && isalnum(*p); p++) - continue; - if (*p != '\0') - *p++ = '\0'; - while (*p != '\0' && (!isascii(*p) || !isalnum(*p))) - p++; - if (*ap == '\0') - { - ap = p; - continue; - } - s = stab(ap, ST_MAP, ST_FIND); - if (s == NULL) - { - syserr("Sequence map %s: unknown member map %s", - map->map_mname, ap); - } - else if (maxmap == MAXMAPSTACK) - { - syserr("Sequence map %s: too many member maps (%d max)", - map->map_mname, MAXMAPSTACK); - maxmap++; - } - else if (maxmap < MAXMAPSTACK) - { - map->map_stack[maxmap++] = &s->s_map; - } - ap = p; - } - return TRUE; -} - - -/* -** SWITCH_MAP_OPEN -- open a switched map -** -** This looks at the system-dependent configuration and builds -** a sequence map that does the same thing. -** -** Every system must define a switch_map_find routine in conf.c -** that will return the list of service types associated with a -** given service class. -*/ - -bool -switch_map_open(map, mode) - MAP *map; - int mode; -{ - int mapno; - int nmaps; - char *maptype[MAXMAPSTACK]; - - if (tTd(38, 2)) - printf("switch_map_open(%s, %s, %d)\n", - map->map_mname, map->map_file, mode); - - mode &= O_ACCMODE; - nmaps = switch_map_find(map->map_file, maptype, map->map_return); - if (tTd(38, 19)) - { - printf("\tswitch_map_find => %d\n", nmaps); - for (mapno = 0; mapno < nmaps; mapno++) - printf("\t\t%s\n", maptype[mapno]); - } - if (nmaps <= 0 || nmaps > MAXMAPSTACK) - return FALSE; - - for (mapno = 0; mapno < nmaps; mapno++) - { - register STAB *s; - char nbuf[MAXNAME + 1]; - - if (maptype[mapno] == NULL) - continue; - (void) snprintf(nbuf, sizeof nbuf, "%s.%s", - map->map_mname, maptype[mapno]); - s = stab(nbuf, ST_MAP, ST_FIND); - if (s == NULL) - { - syserr("Switch map %s: unknown member map %s", - map->map_mname, nbuf); - } - else - { - map->map_stack[mapno] = &s->s_map; - if (tTd(38, 4)) - printf("\tmap_stack[%d] = %s:%s\n", - mapno, s->s_map.map_class->map_cname, - nbuf); - } - } - return TRUE; -} - - -/* -** SEQ_MAP_CLOSE -- close all underlying maps -*/ - -void -seq_map_close(map) - MAP *map; -{ - int mapno; - - if (tTd(38, 9)) - printf("seq_map_close(%s)\n", map->map_mname); - - for (mapno = 0; mapno < MAXMAPSTACK; mapno++) - { - MAP *mm = map->map_stack[mapno]; - - if (mm == NULL || !bitset(MF_OPEN, mm->map_mflags)) - continue; - mm->map_class->map_close(mm); - mm->map_mflags &= ~(MF_OPEN|MF_WRITABLE); - } -} - - -/* -** SEQ_MAP_LOOKUP -- sequenced map lookup -*/ - -char * -seq_map_lookup(map, key, args, pstat) - MAP *map; - char *key; - char **args; - int *pstat; -{ - int mapno; - int mapbit = 0x01; - bool tempfail = FALSE; - - if (tTd(38, 20)) - printf("seq_map_lookup(%s, %s)\n", map->map_mname, key); - - for (mapno = 0; mapno < MAXMAPSTACK; mapbit <<= 1, mapno++) - { - MAP *mm = map->map_stack[mapno]; - char *rv; - - if (mm == NULL) - continue; - if (!bitset(MF_OPEN, mm->map_mflags)) - { - if (bitset(mapbit, map->map_return[MA_UNAVAIL])) - { - *pstat = EX_UNAVAILABLE; - return NULL; - } - continue; - } - *pstat = EX_OK; - rv = mm->map_class->map_lookup(mm, key, args, pstat); - if (rv != NULL) - return rv; - if (*pstat == EX_TEMPFAIL) - { - if (bitset(mapbit, map->map_return[MA_TRYAGAIN])) - return NULL; - tempfail = TRUE; - } - else if (bitset(mapbit, map->map_return[MA_NOTFOUND])) - break; - } - if (tempfail) - *pstat = EX_TEMPFAIL; - else if (*pstat == EX_OK) - *pstat = EX_NOTFOUND; - return NULL; -} - - -/* -** SEQ_MAP_STORE -- sequenced map store -*/ - -void -seq_map_store(map, key, val) - MAP *map; - char *key; - char *val; -{ - int mapno; - - if (tTd(38, 12)) - printf("seq_map_store(%s, %s, %s)\n", - map->map_mname, key, val); - - for (mapno = 0; mapno < MAXMAPSTACK; mapno++) - { - MAP *mm = map->map_stack[mapno]; - - if (mm == NULL || !bitset(MF_WRITABLE, mm->map_mflags)) - continue; - - mm->map_class->map_store(mm, key, val); - return; - } - syserr("seq_map_store(%s, %s, %s): no writable map", - map->map_mname, key, val); -} -/* -** NULL stubs -*/ - -/* ARGSUSED */ -bool -null_map_open(map, mode) - MAP *map; - int mode; -{ - return TRUE; -} - -/* ARGSUSED */ -void -null_map_close(map) - MAP *map; -{ - return; -} - -char * -null_map_lookup(map, key, args, pstat) - MAP *map; - char *key; - char **args; - int *pstat; -{ - *pstat = EX_NOTFOUND; - return NULL; -} - -/* ARGSUSED */ -void -null_map_store(map, key, val) - MAP *map; - char *key; - char *val; -{ - return; -} - - -/* -** BOGUS stubs -*/ - -char * -bogus_map_lookup(map, key, args, pstat) - MAP *map; - char *key; - char **args; - int *pstat; -{ - *pstat = EX_TEMPFAIL; - return NULL; -} - -MAPCLASS BogusMapClass = -{ - "bogus-map", NULL, 0, - NULL, bogus_map_lookup, null_map_store, - null_map_open, null_map_close, -}; -/* -** REGEX modules -*/ - -#ifdef MAP_REGEX - -# include <regex.h> - -# define DEFAULT_DELIM CONDELSE - -# define END_OF_FIELDS -1 - -# define ERRBUF_SIZE 80 -# define MAX_MATCH 32 - -# define xnalloc(s) memset(xalloc(s), 0, s); - -struct regex_map -{ - regex_t pattern_buf; /* xalloc it */ - int *regex_subfields; /* move to type MAP */ - char *delim; /* move to type MAP */ -}; - -static int -parse_fields(s, ibuf, blen, nr_substrings) - char *s; - int *ibuf; /* array */ - int blen; /* number of elements in ibuf */ - int nr_substrings; /* number of substrings in the pattern */ -{ - register char *cp; - int i = 0; - bool lastone = FALSE; - - blen--; /* for terminating END_OF_FIELDS */ - cp = s; - do - { - for (;; cp++) - { - if (*cp == ',') - { - *cp = '\0'; - break; - } - if (*cp == '\0') - { - lastone = TRUE; - break; - } - } - if (i < blen) - { - int val = atoi(s); - - if (val < 0 || val >= nr_substrings) - { - syserr("field (%d) out of range, only %d substrings in pattern", - val, nr_substrings); - return -1; - } - ibuf[i++] = val; - } - else - { - syserr("too many fields, %d max\n", blen); - return -1; - } - s = ++cp; - } while (!lastone); - ibuf[i] = END_OF_FIELDS; - return i; -} - -bool -regex_map_init(map, ap) - MAP *map; - char *ap; -{ - int regerr; - struct regex_map *map_p; - register char *p; - char *sub_param = NULL; - int pflags; - static char defdstr[] = { (char)DEFAULT_DELIM, '\0' }; - - if (tTd(38, 2)) - printf("regex_map_init: mapname '%s', args '%s'\n", - map->map_mname, ap); - - pflags = REG_ICASE | REG_EXTENDED | REG_NOSUB; - - p = ap; - - map_p = (struct regex_map *) xnalloc(sizeof(struct regex_map)); - - for (;;) - { - while (isascii(*p) && isspace(*p)) - p++; - if (*p != '-') - break; - switch (*++p) - { - case 'n': /* not */ - map->map_mflags |= MF_REGEX_NOT; - break; - - case 'f': /* case sensitive */ - map->map_mflags |= MF_NOFOLDCASE; - pflags &= ~REG_ICASE; - break; - - case 'b': /* basic regular expressions */ - pflags &= ~REG_EXTENDED; - break; - - case 's': /* substring match () syntax */ - sub_param = ++p; - pflags &= ~REG_NOSUB; - break; - - case 'd': /* delimiter */ - map_p->delim = ++p; - break; - - case 'a': /* map append */ - map->map_app = ++p; - break; - - case 'm': /* matchonly */ - map->map_mflags |= MF_MATCHONLY; - break; - - } - while (*p != '\0' && !(isascii(*p) && isspace(*p))) - p++; - if (*p != '\0') - *p++ = '\0'; - } - if (tTd(38, 3)) - printf("regex_map_init: compile '%s' 0x%x\n", p, pflags); - - if ((regerr = regcomp(&(map_p->pattern_buf), p, pflags)) != 0) - { - /* Errorhandling */ - char errbuf[ERRBUF_SIZE]; - - regerror(regerr, &(map_p->pattern_buf), errbuf, ERRBUF_SIZE); - syserr("pattern-compile-error: %s\n", errbuf); - free(map_p); - return FALSE; - } - - if (map->map_app != NULL) - map->map_app = newstr(map->map_app); - if (map_p->delim != NULL) - map_p->delim = newstr(map_p->delim); - else - map_p->delim = defdstr; - - if (!bitset(REG_NOSUB, pflags)) - { - /* substring matching */ - int substrings; - int *fields = (int *)xalloc(sizeof(int) * (MAX_MATCH + 1)); - - substrings = map_p->pattern_buf.re_nsub + 1; - - if (tTd(38, 3)) - printf("regex_map_init: nr of substrings %d\n", substrings); - - if (substrings >= MAX_MATCH) - { - syserr("too many substrings, %d max\n", MAX_MATCH); - free(map_p); - return FALSE; - } - if (sub_param != NULL && sub_param[0] != '\0') - { - /* optional parameter -sfields */ - if (parse_fields(sub_param, fields, - MAX_MATCH + 1, substrings) == -1) - return FALSE; - } - else - { - /* set default fields */ - int i; - - for (i = 0; i < substrings; i++) - fields[i] = i; - fields[i] = END_OF_FIELDS; - } - map_p->regex_subfields = fields; - if (tTd(38, 3)) - { - int *ip; - - printf("regex_map_init: subfields"); - for (ip = fields; *ip != END_OF_FIELDS; ip++) - printf(" %d", *ip); - printf("\n"); - } - } - map->map_db1 = (ARBPTR_T)map_p; /* dirty hack */ - - return TRUE; -} - -static char * -regex_map_rewrite(map, s, slen, av) - MAP *map; - const char *s; - size_t slen; - char **av; -{ - if (bitset(MF_MATCHONLY, map->map_mflags)) - return map_rewrite(map, av[0], strlen(av[0]), NULL); - else - return map_rewrite(map, s, slen, NULL); -} - -char * -regex_map_lookup(map, name, av, statp) - MAP *map; - char *name; - char **av; - int *statp; -{ - int reg_res; - struct regex_map *map_p; - regmatch_t pmatch[MAX_MATCH]; - - if (tTd(38, 20)) - { - char **cpp; - - printf("regex_map_lookup: key '%s'\n", name); - for (cpp = av; cpp && *cpp; cpp++) - printf("regex_map_lookup: arg '%s'\n", *cpp); - } - - map_p = (struct regex_map *)(map->map_db1); - reg_res = regexec(&(map_p->pattern_buf), name, MAX_MATCH, pmatch, 0); - - if (bitset(MF_REGEX_NOT, map->map_mflags)) - { - /* option -n */ - if (reg_res == REG_NOMATCH) - return regex_map_rewrite(map, "", (size_t)0, av); - else - return NULL; - } - if (reg_res == REG_NOMATCH) - return NULL; - - if (map_p->regex_subfields != NULL) - { - /* option -s */ - static char retbuf[MAXNAME]; - int fields[MAX_MATCH + 1]; - bool first = TRUE; - int anglecnt = 0, cmntcnt = 0, spacecnt = 0; - bool quotemode = FALSE, bslashmode = FALSE; - register char *dp, *sp; - char *endp, *ldp; - int *ip; - - dp = retbuf; - ldp = retbuf + sizeof(retbuf) - 1; - - if (av[1] != NULL) - { - if (parse_fields(av[1], fields, MAX_MATCH + 1, - (int) map_p->pattern_buf.re_nsub + 1) == -1) - { - *statp = EX_CONFIG; - return NULL; - } - ip = fields; - } - else - ip = map_p->regex_subfields; - - for ( ; *ip != END_OF_FIELDS; ip++) - { - if (!first) - { - for (sp = map_p->delim; *sp; sp++) - { - if (dp < ldp) - *dp++ = *sp; - } - } - else - first = FALSE; - - - if (pmatch[*ip].rm_so < 0 || pmatch[*ip].rm_eo < 0) - continue; - - sp = name + pmatch[*ip].rm_so; - endp = name + pmatch[*ip].rm_eo; - for (; endp > sp; sp++) - { - if (dp < ldp) - { - if(bslashmode) - { - *dp++ = *sp; - bslashmode = FALSE; - } - else if(quotemode && *sp != '"' && - *sp != '\\') - { - *dp++ = *sp; - } - else switch(*dp++ = *sp) - { - case '\\': - bslashmode = TRUE; - break; - - case '(': - cmntcnt++; - break; - - case ')': - cmntcnt--; - break; - - case '<': - anglecnt++; - break; - - case '>': - anglecnt--; - break; - - case ' ': - spacecnt++; - break; - - case '"': - quotemode = !quotemode; - break; - } - } - } - } - if (anglecnt != 0 || cmntcnt != 0 || quotemode || - bslashmode || spacecnt != 0) - { - sm_syslog(LOG_WARNING, NOQID, - "Warning: regex may cause prescan() failure map=%s lookup=%s", - map->map_mname, name); - return NULL; - } - - *dp = '\0'; - - return regex_map_rewrite(map, retbuf, strlen(retbuf), av); - } - return regex_map_rewrite(map, "", (size_t)0, av); -} -#endif /* MAP_REGEX */ diff --git a/src/mci.c b/src/mci.c deleted file mode 100644 index 41649a2..0000000 --- a/src/mci.c +++ /dev/null @@ -1,1293 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)mci.c 8.83 (Berkeley) 10/13/1998"; -#endif /* not lint */ - -#include "sendmail.h" -#include <arpa/inet.h> -#include <dirent.h> - -/* -** Mail Connection Information (MCI) Caching Module. -** -** There are actually two separate things cached. The first is -** the set of all open connections -- these are stored in a -** (small) list. The second is stored in the symbol table; it -** has the overall status for all hosts, whether or not there -** is a connection open currently. -** -** There should never be too many connections open (since this -** could flood the socket table), nor should a connection be -** allowed to sit idly for too long. -** -** MaxMciCache is the maximum number of open connections that -** will be supported. -** -** MciCacheTimeout is the time (in seconds) that a connection -** is permitted to survive without activity. -** -** We actually try any cached connections by sending a NOOP -** before we use them; if the NOOP fails we close down the -** connection and reopen it. Note that this means that a -** server SMTP that doesn't support NOOP will hose the -** algorithm -- but that doesn't seem too likely. -** -** The persistent MCI code is donated by Mark Lovell and Paul -** Vixie. It is based on the long term host status code in KJS -** written by Paul but has been adapted by Mark to fit into the -** MCI structure. -*/ - -MCI **MciCache; /* the open connection cache */ - -extern int mci_generate_persistent_path __P((const char *, char *, int, bool)); -extern bool mci_load_persistent __P((MCI *)); -extern void mci_uncache __P((MCI **, bool)); -/* -** MCI_CACHE -- enter a connection structure into the open connection cache -** -** This may cause something else to be flushed. -** -** Parameters: -** mci -- the connection to cache. -** -** Returns: -** none. -*/ - -void -mci_cache(mci) - register MCI *mci; -{ - register MCI **mcislot; - - /* - ** Find the best slot. This may cause expired connections - ** to be closed. - */ - - mcislot = mci_scan(mci); - if (mcislot == NULL) - { - /* we don't support caching */ - return; - } - - if (mci->mci_host == NULL) - return; - - /* if this is already cached, we are done */ - if (bitset(MCIF_CACHED, mci->mci_flags)) - return; - - /* otherwise we may have to clear the slot */ - if (*mcislot != NULL) - mci_uncache(mcislot, TRUE); - - if (tTd(42, 5)) - printf("mci_cache: caching %lx (%s) in slot %d\n", - (u_long) mci, mci->mci_host, (int)(mcislot - MciCache)); - if (tTd(91, 100)) - sm_syslog(LOG_DEBUG, CurEnv->e_id, - "mci_cache: caching %x (%.100s) in slot %d", - mci, mci->mci_host, mcislot - MciCache); - - *mcislot = mci; - mci->mci_flags |= MCIF_CACHED; -} -/* -** MCI_SCAN -- scan the cache, flush junk, and return best slot -** -** Parameters: -** savemci -- never flush this one. Can be null. -** -** Returns: -** The LRU (or empty) slot. -*/ - -MCI ** -mci_scan(savemci) - MCI *savemci; -{ - time_t now; - register MCI **bestmci; - register MCI *mci; - register int i; - - if (MaxMciCache <= 0) - { - /* we don't support caching */ - return NULL; - } - - if (MciCache == NULL) - { - /* first call */ - MciCache = (MCI **) xalloc(MaxMciCache * sizeof *MciCache); - bzero((char *) MciCache, MaxMciCache * sizeof *MciCache); - return (&MciCache[0]); - } - - now = curtime(); - bestmci = &MciCache[0]; - for (i = 0; i < MaxMciCache; i++) - { - mci = MciCache[i]; - if (mci == NULL || mci->mci_state == MCIS_CLOSED) - { - bestmci = &MciCache[i]; - continue; - } - if (mci->mci_lastuse + MciCacheTimeout < now && mci != savemci) - { - /* connection idle too long -- close it */ - bestmci = &MciCache[i]; - mci_uncache(bestmci, TRUE); - continue; - } - if (*bestmci == NULL) - continue; - if (mci->mci_lastuse < (*bestmci)->mci_lastuse) - bestmci = &MciCache[i]; - } - return bestmci; -} -/* -** MCI_UNCACHE -- remove a connection from a slot. -** -** May close a connection. -** -** Parameters: -** mcislot -- the slot to empty. -** doquit -- if TRUE, send QUIT protocol on this connection. -** if FALSE, we are assumed to be in a forked child; -** all we want to do is close the file(s). -** -** Returns: -** none. -*/ - -void -mci_uncache(mcislot, doquit) - register MCI **mcislot; - bool doquit; -{ - register MCI *mci; - extern ENVELOPE BlankEnvelope; - - mci = *mcislot; - if (mci == NULL) - return; - *mcislot = NULL; - if (mci->mci_host == NULL) - return; - - mci_unlock_host(mci); - - if (tTd(42, 5)) - printf("mci_uncache: uncaching %lx (%s) from slot %d (%d)\n", - (u_long) mci, mci->mci_host, - (int)(mcislot - MciCache), doquit); - if (tTd(91, 100)) - sm_syslog(LOG_DEBUG, CurEnv->e_id, - "mci_uncache: uncaching %x (%.100s) from slot %d (%d)", - mci, mci->mci_host, mcislot - MciCache, doquit); - -#if SMTP - if (doquit) - { - message("Closing connection to %s", mci->mci_host); - - mci->mci_flags &= ~MCIF_CACHED; - - /* only uses the envelope to flush the transcript file */ - if (mci->mci_state != MCIS_CLOSED) - smtpquit(mci->mci_mailer, mci, &BlankEnvelope); -#ifdef XLA - xla_host_end(mci->mci_host); -#endif - } - else -#endif - { - if (mci->mci_in != NULL) - xfclose(mci->mci_in, "mci_uncache", "mci_in"); - if (mci->mci_out != NULL) - xfclose(mci->mci_out, "mci_uncache", "mci_out"); - mci->mci_in = mci->mci_out = NULL; - mci->mci_state = MCIS_CLOSED; - mci->mci_exitstat = EX_OK; - mci->mci_errno = 0; - mci->mci_flags = 0; - } -} -/* -** MCI_FLUSH -- flush the entire cache -** -** Parameters: -** doquit -- if TRUE, send QUIT protocol. -** if FALSE, just close the connection. -** allbut -- but leave this one open. -** -** Returns: -** none. -*/ - -void -mci_flush(doquit, allbut) - bool doquit; - MCI *allbut; -{ - register int i; - - if (MciCache == NULL) - return; - - for (i = 0; i < MaxMciCache; i++) - if (allbut != MciCache[i]) - mci_uncache(&MciCache[i], doquit); -} -/* -** MCI_GET -- get information about a particular host -*/ - -MCI * -mci_get(host, m) - char *host; - MAILER *m; -{ - register MCI *mci; - register STAB *s; - -#if DAEMON - extern SOCKADDR CurHostAddr; - - /* clear CurHostAddr so we don't get a bogus address with this name */ - bzero(&CurHostAddr, sizeof CurHostAddr); -#endif - - /* clear out any expired connections */ - (void) mci_scan(NULL); - - if (m->m_mno < 0) - syserr("negative mno %d (%s)", m->m_mno, m->m_name); - s = stab(host, ST_MCI + m->m_mno, ST_ENTER); - mci = &s->s_mci; - mci->mci_host = s->s_name; - - if (!mci_load_persistent(mci)) - { - if (tTd(42, 2)) - printf("mci_get(%s %s): lock failed\n", host, m->m_name); - mci->mci_exitstat = EX_TEMPFAIL; - mci->mci_state = MCIS_CLOSED; - mci->mci_statfile = NULL; - return mci; - } - - if (tTd(42, 2)) - { - printf("mci_get(%s %s): mci_state=%d, _flags=%x, _exitstat=%d, _errno=%d\n", - host, m->m_name, mci->mci_state, mci->mci_flags, - mci->mci_exitstat, mci->mci_errno); - } - -#if SMTP - if (mci->mci_state == MCIS_OPEN) - { - extern int smtpprobe __P((MCI *)); - - /* poke the connection to see if it's still alive */ - (void) smtpprobe(mci); - - /* reset the stored state in the event of a timeout */ - if (mci->mci_state != MCIS_OPEN) - { - mci->mci_errno = 0; - mci->mci_exitstat = EX_OK; - mci->mci_state = MCIS_CLOSED; - } -# if DAEMON - else - { - /* get peer host address for logging reasons only */ - /* (this should really be in the mci struct) */ - SOCKADDR_LEN_T socklen = sizeof CurHostAddr; - - (void) getpeername(fileno(mci->mci_in), - (struct sockaddr *) &CurHostAddr, &socklen); - } -# endif - } -#endif - if (mci->mci_state == MCIS_CLOSED) - { - time_t now = curtime(); - - /* if this info is stale, ignore it */ - if (now > mci->mci_lastuse + MciInfoTimeout) - { - mci->mci_lastuse = now; - mci->mci_errno = 0; - mci->mci_exitstat = EX_OK; - } - } - - return mci; -} -/* -** MCI_SETSTAT -- set status codes in MCI structure. -** -** Parameters: -** mci -- the MCI structure to set. -** xstat -- the exit status code. -** dstat -- the DSN status code. -** rstat -- the SMTP status code. -** -** Returns: -** none. -*/ - -void -mci_setstat(mci, xstat, dstat, rstat) - MCI *mci; - int xstat; - char *dstat; - char *rstat; -{ - /* protocol errors should never be interpreted as sticky */ - if (xstat != EX_NOTSTICKY && xstat != EX_PROTOCOL) - mci->mci_exitstat = xstat; - - mci->mci_status = dstat; - if (mci->mci_rstatus != NULL) - free(mci->mci_rstatus); - if (rstat != NULL) - rstat = newstr(rstat); - mci->mci_rstatus = rstat; -} -/* -** MCI_DUMP -- dump the contents of an MCI structure. -** -** Parameters: -** mci -- the MCI structure to dump. -** -** Returns: -** none. -** -** Side Effects: -** none. -*/ - -struct mcifbits -{ - int mcif_bit; /* flag bit */ - char *mcif_name; /* flag name */ -}; -struct mcifbits MciFlags[] = -{ - { MCIF_VALID, "VALID" }, - { MCIF_TEMP, "TEMP" }, - { MCIF_CACHED, "CACHED" }, - { MCIF_ESMTP, "ESMTP" }, - { MCIF_EXPN, "EXPN" }, - { MCIF_SIZE, "SIZE" }, - { MCIF_8BITMIME, "8BITMIME" }, - { MCIF_7BIT, "7BIT" }, - { MCIF_MULTSTAT, "MULTSTAT" }, - { MCIF_INHEADER, "INHEADER" }, - { MCIF_CVT8TO7, "CVT8TO7" }, - { MCIF_DSN, "DSN" }, - { MCIF_8BITOK, "8BITOK" }, - { MCIF_CVT7TO8, "CVT7TO8" }, - { MCIF_INMIME, "INMIME" }, - { 0, NULL } -}; - - -void -mci_dump(mci, logit) - register MCI *mci; - bool logit; -{ - register char *p; - char *sep; - char buf[4000]; - extern char *ctime(); - - sep = logit ? " " : "\n\t"; - p = buf; - snprintf(p, SPACELEFT(buf, p), "MCI@%x: ", mci); - p += strlen(p); - if (mci == NULL) - { - snprintf(p, SPACELEFT(buf, p), "NULL"); - goto printit; - } - snprintf(p, SPACELEFT(buf, p), "flags=%x", mci->mci_flags); - p += strlen(p); - if (mci->mci_flags != 0) - { - struct mcifbits *f; - - *p++ = '<'; - for (f = MciFlags; f->mcif_bit != 0; f++) - { - if (!bitset(f->mcif_bit, mci->mci_flags)) - continue; - snprintf(p, SPACELEFT(buf, p), "%s,", f->mcif_name); - p += strlen(p); - } - p[-1] = '>'; - } - snprintf(p, SPACELEFT(buf, p), - ",%serrno=%d, herrno=%d, exitstat=%d, state=%d, pid=%d,%s", - sep, mci->mci_errno, mci->mci_herrno, - mci->mci_exitstat, mci->mci_state, mci->mci_pid, sep); - p += strlen(p); - snprintf(p, SPACELEFT(buf, p), - "maxsize=%ld, phase=%s, mailer=%s,%s", - mci->mci_maxsize, - mci->mci_phase == NULL ? "NULL" : mci->mci_phase, - mci->mci_mailer == NULL ? "NULL" : mci->mci_mailer->m_name, - sep); - p += strlen(p); - snprintf(p, SPACELEFT(buf, p), - "status=%s, rstatus=%s,%s", - mci->mci_status == NULL ? "NULL" : mci->mci_status, - mci->mci_rstatus == NULL ? "NULL" : mci->mci_rstatus, - sep); - p += strlen(p); - snprintf(p, SPACELEFT(buf, p), - "host=%s, lastuse=%s", - mci->mci_host == NULL ? "NULL" : mci->mci_host, - ctime(&mci->mci_lastuse)); -printit: - if (logit) - sm_syslog(LOG_DEBUG, CurEnv->e_id, "%.1000s", buf); - else - printf("%s\n", buf); -} -/* -** MCI_DUMP_ALL -- print the entire MCI cache -** -** Parameters: -** logit -- if set, log the result instead of printing -** to stdout. -** -** Returns: -** none. -*/ - -void -mci_dump_all(logit) - bool logit; -{ - register int i; - - if (MciCache == NULL) - return; - - for (i = 0; i < MaxMciCache; i++) - mci_dump(MciCache[i], logit); -} -/* -** MCI_LOCK_HOST -- Lock host while sending. -** -** If we are contacting a host, we'll need to -** update the status information in the host status -** file, and if we want to do that, we ought to have -** locked it. This has the (according to some) -** desirable effect of serializing connectivity with -** remote hosts -- i.e.: one connection to a give -** host at a time. -** -** Parameters: -** mci -- containing the host we want to lock. -** -** Returns: -** EX_OK -- got the lock. -** EX_TEMPFAIL -- didn't get the lock. -*/ - -int -mci_lock_host(mci) - MCI *mci; -{ - if (mci == NULL) - { - if (tTd(56, 1)) - printf("mci_lock_host: NULL mci\n"); - return EX_OK; - } - - if (!SingleThreadDelivery) - return EX_OK; - - return mci_lock_host_statfile(mci); -} - -int -mci_lock_host_statfile(mci) - MCI *mci; -{ - int savedErrno = errno; - int retVal = EX_OK; - char fname[MAXPATHLEN+1]; - - if (HostStatDir == NULL || mci->mci_host == NULL) - return EX_OK; - - if (tTd(56, 2)) - printf("mci_lock_host: attempting to lock %s\n", - mci->mci_host); - - if (mci_generate_persistent_path(mci->mci_host, fname, sizeof fname, TRUE) < 0) - { - /* of course this should never happen */ - if (tTd(56, 2)) - printf("mci_lock_host: Failed to generate host path for %s\n", - mci->mci_host); - - retVal = EX_TEMPFAIL; - goto cleanup; - } - - mci->mci_statfile = safefopen(fname, O_RDWR, FileMode, - SFF_NOLOCK|SFF_NOLINK|SFF_OPENASROOT|SFF_REGONLY|SFF_SAFEDIRPATH|SFF_CREAT); - - if (mci->mci_statfile == NULL) - { - syserr("mci_lock_host: cannot create host lock file %s", - fname); - goto cleanup; - } - - if (!lockfile(fileno(mci->mci_statfile), fname, "", LOCK_EX|LOCK_NB)) - { - if (tTd(56, 2)) - printf("mci_lock_host: couldn't get lock on %s\n", - fname); - fclose(mci->mci_statfile); - mci->mci_statfile = NULL; - retVal = EX_TEMPFAIL; - goto cleanup; - } - - if (tTd(56, 12) && mci->mci_statfile != NULL) - printf("mci_lock_host: Sanity check -- lock is good\n"); - -cleanup: - errno = savedErrno; - return retVal; -} -/* -** MCI_UNLOCK_HOST -- unlock host -** -** Clean up the lock on a host, close the file, let -** someone else use it. -** -** Parameters: -** mci -- us. -** -** Returns: -** nothing. -*/ - -void -mci_unlock_host(mci) - MCI *mci; -{ - int saveErrno = errno; - - if (mci == NULL) - { - if (tTd(56, 1)) - printf("mci_unlock_host: NULL mci\n"); - return; - } - - if (HostStatDir == NULL || mci->mci_host == NULL) - return; - - if (!SingleThreadDelivery && mci_lock_host_statfile(mci) == EX_TEMPFAIL) - { - if (tTd(56, 1)) - printf("mci_unlock_host: stat file already locked\n"); - } - else - { - if (tTd(56, 2)) - printf("mci_unlock_host: store prior to unlock\n"); - - mci_store_persistent(mci); - } - - if (mci->mci_statfile != NULL) - { - fclose(mci->mci_statfile); - mci->mci_statfile = NULL; - } - - errno = saveErrno; -} -/* -** MCI_LOAD_PERSISTENT -- load persistent host info -** -** Load information about host that is kept -** in common for all running sendmails. -** -** Parameters: -** mci -- the host/connection to load persistent info -** for. -** -** Returns: -** TRUE -- lock was successful -** FALSE -- lock failed -*/ - -bool -mci_load_persistent(mci) - MCI *mci; -{ - int saveErrno = errno; - bool locked = TRUE; - FILE *fp; - char fname[MAXPATHLEN+1]; - - if (mci == NULL) - { - if (tTd(56, 1)) - printf("mci_load_persistent: NULL mci\n"); - return TRUE; - } - - if (IgnoreHostStatus || HostStatDir == NULL || mci->mci_host == NULL) - return TRUE; - - /* Already have the persistent information in memory */ - if (SingleThreadDelivery && mci->mci_statfile != NULL) - return TRUE; - - if (tTd(56, 1)) - printf("mci_load_persistent: Attempting to load persistent information for %s\n", - mci->mci_host); - - if (mci_generate_persistent_path(mci->mci_host, fname, sizeof fname, FALSE) < 0) - { - /* Not much we can do if the file isn't there... */ - if (tTd(56, 1)) - printf("mci_load_persistent: Couldn't generate host path\n"); - goto cleanup; - } - - fp = safefopen(fname, O_RDONLY, FileMode, - SFF_NOLOCK|SFF_NOLINK|SFF_OPENASROOT|SFF_REGONLY|SFF_SAFEDIRPATH); - if (fp == NULL) - { - /* I can't think of any reason this should ever happen */ - if (tTd(56, 1)) - printf("mci_load_persistent: open(%s): %s\n", - fname, errstring(errno)); - goto cleanup; - } - - FileName = fname; - locked = lockfile(fileno(fp), fname, "", LOCK_SH|LOCK_NB); - (void) mci_read_persistent(fp, mci); - FileName = NULL; - if (locked) - lockfile(fileno(fp), fname, "", LOCK_UN); - fclose(fp); - -cleanup: - errno = saveErrno; - return locked; -} -/* -** MCI_READ_PERSISTENT -- read persistent host status file -** -** Parameters: -** fp -- the file pointer to read. -** mci -- the pointer to fill in. -** -** Returns: -** -1 -- if the file was corrupt. -** 0 -- otherwise. -** -** Warning: -** This code makes the assumption that this data -** will be read in an atomic fashion, and that the data -** was written in an atomic fashion. Any other functioning -** may lead to some form of insanity. This should be -** perfectly safe due to underlying stdio buffering. -*/ - -int -mci_read_persistent(fp, mci) - FILE *fp; - register MCI *mci; -{ - int ver; - register char *p; - int saveLineNumber = LineNumber; - char buf[MAXLINE]; - - if (fp == NULL) - syserr("mci_read_persistent: NULL fp"); - if (mci == NULL) - syserr("mci_read_persistent: NULL mci"); - if (tTd(56, 93)) - { - printf("mci_read_persistent: fp=%lx, mci=", (u_long) fp); - mci_dump(mci, FALSE); - } - - mci->mci_status = NULL; - if (mci->mci_rstatus != NULL) - free(mci->mci_rstatus); - mci->mci_rstatus = NULL; - - rewind(fp); - ver = -1; - LineNumber = 0; - while (fgets(buf, sizeof buf, fp) != NULL) - { - LineNumber++; - p = strchr(buf, '\n'); - if (p != NULL) - *p = '\0'; - switch (buf[0]) - { - case 'V': /* version stamp */ - ver = atoi(&buf[1]); - if (ver < 0 || ver > 0) - syserr("Unknown host status version %d: %d max", - ver, 0); - break; - - case 'E': /* UNIX error number */ - mci->mci_errno = atoi(&buf[1]); - break; - - case 'H': /* DNS error number */ - mci->mci_herrno = atoi(&buf[1]); - break; - - case 'S': /* UNIX exit status */ - mci->mci_exitstat = atoi(&buf[1]); - break; - - case 'D': /* DSN status */ - mci->mci_status = newstr(&buf[1]); - break; - - case 'R': /* SMTP status */ - mci->mci_rstatus = newstr(&buf[1]); - break; - - case 'U': /* last usage time */ - mci->mci_lastuse = atol(&buf[1]); - break; - - case '.': /* end of file */ - return 0; - - default: - sm_syslog(LOG_CRIT, NOQID, - "%s: line %d: Unknown host status line \"%s\"", - FileName == NULL ? mci->mci_host : FileName, - LineNumber, buf); - LineNumber = saveLineNumber; - return -1; - } - } - LineNumber = saveLineNumber; - if (ver < 0) - return -1; - return 0; -} -/* -** MCI_STORE_PERSISTENT -- Store persistent MCI information -** -** Store information about host that is kept -** in common for all running sendmails. -** -** Parameters: -** mci -- the host/connection to store persistent info for. -** -** Returns: -** none. -*/ - -void -mci_store_persistent(mci) - MCI *mci; -{ - int saveErrno = errno; - - if (mci == NULL) - { - if (tTd(56, 1)) - printf("mci_store_persistent: NULL mci\n"); - return; - } - - if (HostStatDir == NULL || mci->mci_host == NULL) - return; - - if (tTd(56, 1)) - printf("mci_store_persistent: Storing information for %s\n", - mci->mci_host); - - if (mci->mci_statfile == NULL) - { - if (tTd(56, 1)) - printf("mci_store_persistent: no statfile\n"); - return; - } - - rewind(mci->mci_statfile); -#if !NOFTRUNCATE - (void) ftruncate(fileno(mci->mci_statfile), (off_t) 0); -#endif - - fprintf(mci->mci_statfile, "V0\n"); - fprintf(mci->mci_statfile, "E%d\n", mci->mci_errno); - fprintf(mci->mci_statfile, "H%d\n", mci->mci_herrno); - fprintf(mci->mci_statfile, "S%d\n", mci->mci_exitstat); - if (mci->mci_status != NULL) - fprintf(mci->mci_statfile, "D%.80s\n", - denlstring(mci->mci_status, TRUE, FALSE)); - if (mci->mci_rstatus != NULL) - fprintf(mci->mci_statfile, "R%.80s\n", - denlstring(mci->mci_rstatus, TRUE, FALSE)); - fprintf(mci->mci_statfile, "U%ld\n", (long)(mci->mci_lastuse)); - fprintf(mci->mci_statfile, ".\n"); - - fflush(mci->mci_statfile); - - errno = saveErrno; - return; -} -/* -** MCI_TRAVERSE_PERSISTENT -- walk persistent status tree -** -** Recursively find all the mci host files in `pathname'. Default to -** main host status directory if no path is provided. -** Call (*action)(pathname, host) for each file found. -** -** Note: all information is collected in a list before it is processed. -** This may not be the best way to do it, but it seems safest, since -** the file system would be touched while we are attempting to traverse -** the directory tree otherwise (during purges). -** -** Parameters: -** action -- function to call on each node. If returns < 0, -** return immediately. -** pathname -- root of tree. If null, use main host status -** directory. -** -** Returns: -** < 0 -- if any action routine returns a negative value, that -** value is returned. -** 0 -- if we successfully went to completion. -*/ - -int -mci_traverse_persistent(action, pathname) - int (*action)(); - char *pathname; -{ - struct stat statbuf; - DIR *d; - int ret; - - if (pathname == NULL) - pathname = HostStatDir; - if (pathname == NULL) - return -1; - - if (tTd(56, 1)) - printf("mci_traverse: pathname is %s\n", pathname); - - ret = stat(pathname, &statbuf); - if (ret < 0) - { - if (tTd(56, 2)) - printf("mci_traverse: Failed to stat %s: %s\n", - pathname, errstring(errno)); - return ret; - } - if (S_ISDIR(statbuf.st_mode)) - { - struct dirent *e; - char *newptr; - char newpath[MAXPATHLEN+1]; - - if ((d = opendir(pathname)) == NULL) - { - if (tTd(56, 2)) - printf("mci_traverse: opendir %s: %s\n", - pathname, errstring(errno)); - return -1; - } - - if (strlen(pathname) >= sizeof newpath - MAXNAMLEN - 3) - { - if (tTd(56, 2)) - printf("mci_traverse: path \"%s\" too long", - pathname); - return -1; - } - strcpy(newpath, pathname); - newptr = newpath + strlen(newpath); - *newptr++ = '/'; - - while ((e = readdir(d)) != NULL) - { - if (e->d_name[0] == '.') - continue; - - strncpy(newptr, e->d_name, - sizeof newpath - (newptr - newpath) - 1); - newpath[sizeof newpath - 1] = '\0'; - - ret = mci_traverse_persistent(action, newpath); - if (ret < 0) - break; - - /* - ** The following appears to be - ** necessary during purges, since - ** we modify the directory structure - */ - - if (action == mci_purge_persistent) - rewinddir(d); - } - - /* purge (or whatever) the directory proper */ - *--newptr = '\0'; - ret = (*action)(newpath, NULL); - closedir(d); - } - else if (S_ISREG(statbuf.st_mode)) - { - char *end = pathname + strlen(pathname) - 1; - char *start; - char *scan; - char host[MAXHOSTNAMELEN]; - char *hostptr = host; - - /* - ** Reconstruct the host name from the path to the - ** persistent information. - */ - - do - { - if (hostptr != host) - *(hostptr++) = '.'; - start = end; - while (*(start - 1) != '/') - start--; - - if (*end == '.') - end--; - - for (scan = start; scan <= end; scan++) - *(hostptr++) = *scan; - - end = start - 2; - } while (*end == '.'); - - *hostptr = '\0'; - - /* - ** Do something with the file containing the persistent - ** information. - */ - ret = (*action)(pathname, host); - } - - return ret; -} -/* -** MCI_PRINT_PERSISTENT -- print persisten info -** -** Dump the persistent information in the file 'pathname' -** -** Parameters: -** pathname -- the pathname to the status file. -** hostname -- the corresponding host name. -** -** Returns: -** 0 -*/ - -int -mci_print_persistent(pathname, hostname) - char *pathname; - char *hostname; -{ - static int initflag = FALSE; - FILE *fp; - int width = Verbose ? 78 : 25; - bool locked; - MCI mcib; - - /* skip directories */ - if (hostname == NULL) - return 0; - - if (!initflag) - { - initflag = TRUE; - printf(" -------------- Hostname --------------- How long ago ---------Results---------\n"); - } - - fp = safefopen(pathname, O_RDWR, FileMode, - SFF_NOLOCK|SFF_NOLINK|SFF_OPENASROOT|SFF_REGONLY|SFF_SAFEDIRPATH); - - if (fp == NULL) - { - if (tTd(56, 1)) - printf("mci_print_persistent: cannot open %s: %s\n", - pathname, errstring(errno)); - return 0; - } - - FileName = pathname; - bzero(&mcib, sizeof mcib); - if (mci_read_persistent(fp, &mcib) < 0) - { - syserr("%s: could not read status file", pathname); - fclose(fp); - FileName = NULL; - return 0; - } - - locked = !lockfile(fileno(fp), pathname, "", LOCK_EX|LOCK_NB); - fclose(fp); - FileName = NULL; - - printf("%c%-39s %12s ", - locked ? '*' : ' ', hostname, - pintvl(curtime() - mcib.mci_lastuse, TRUE)); - if (mcib.mci_rstatus != NULL) - printf("%.*s\n", width, mcib.mci_rstatus); - else if (mcib.mci_exitstat == EX_TEMPFAIL && mcib.mci_errno != 0) - printf("Deferred: %.*s\n", width - 10, errstring(mcib.mci_errno)); - else if (mcib.mci_exitstat != 0) - { - int i = mcib.mci_exitstat - EX__BASE; - extern int N_SysEx; - extern char *SysExMsg[]; - - if (i < 0 || i >= N_SysEx) - { - char buf[80]; - - snprintf(buf, sizeof buf, "Unknown mailer error %d", - mcib.mci_exitstat); - printf("%.*s\n", width, buf); - } - else - printf("%.*s\n", width, &(SysExMsg[i])[5]); - } - else if (mcib.mci_errno == 0) - printf("OK\n"); - else - printf("OK: %.*s\n", width - 4, errstring(mcib.mci_errno)); - - return 0; -} -/* -** MCI_PURGE_PERSISTENT -- Remove a persistence status file. -** -** Parameters: -** pathname -- path to the status file. -** hostname -- name of host corresponding to that file. -** NULL if this is a directory (domain). -** -** Returns: -** 0 -*/ - -int -mci_purge_persistent(pathname, hostname) - char *pathname; - char *hostname; -{ - char *end = pathname + strlen(pathname) - 1; - - if (tTd(56, 1)) - printf("mci_purge_persistent: purging %s\n", pathname); - - if (hostname != NULL) - { - /* remove the file */ - if (unlink(pathname) < 0) - { - if (tTd(56, 2)) - printf("mci_purge_persistent: failed to unlink %s: %s\n", - pathname, errstring(errno)); - } - } - else - { - /* remove the directory */ - if (*end != '.') - return 0; - - if (tTd(56, 1)) - printf("mci_purge_persistent: dpurge %s\n", pathname); - - if (rmdir(pathname) < 0) - { - if (tTd(56, 2)) - printf("mci_purge_persistent: rmdir %s: %s\n", - pathname, errstring(errno)); - } - - } - - return 0; -} -/* -** MCI_GENERATE_PERSISTENT_PATH -- generate path from hostname -** -** Given `host', convert from a.b.c to $QueueDir/.hoststat/c./b./a, -** putting the result into `path'. if `createflag' is set, intervening -** directories will be created as needed. -** -** Parameters: -** host -- host name to convert from. -** path -- place to store result. -** pathlen -- length of path buffer. -** createflag -- if set, create intervening directories as -** needed. -** -** Returns: -** 0 -- success -** -1 -- failure -*/ - -int -mci_generate_persistent_path(host, path, pathlen, createflag) - const char *host; - char *path; - int pathlen; - bool createflag; -{ - char *elem, *p, *x, ch; - int ret = 0; - int len; - char t_host[MAXHOSTNAMELEN]; - - /* - ** Rationality check the arguments. - */ - - if (host == NULL) - { - syserr("mci_generate_persistent_path: null host"); - return -1; - } - if (path == NULL) - { - syserr("mci_generate_persistent_path: null path"); - return -1; - } - - if (tTd(56, 80)) - printf("mci_generate_persistent_path(%s): ", host); - - if (*host == '\0' || *host == '.') - return -1; - - /* make certain this is not a bracketed host number */ - if (strlen(host) > sizeof t_host - 1) - return -1; - if (host[0] == '[') - strcpy(t_host, host + 1); - else - strcpy(t_host, host); - - /* - ** Delete any trailing dots from the hostname. - ** Leave 'elem' pointing at the \0. - */ - - elem = t_host + strlen(t_host); - while (elem > t_host && - (elem[-1] == '.' || (host[0] == '[' && elem[-1] == ']'))) - *--elem = '\0'; - - /* check for bogus bracketed address */ - if (host[0] == '[' && inet_addr(t_host) == INADDR_NONE) - return -1; - - /* check for what will be the final length of the path */ - len = strlen(HostStatDir) + 2; - for (p = (char *) t_host; *p != '\0'; p++) - { - if (*p == '.') - len++; - len++; - if (p[0] == '.' && p[1] == '.') - return -1; - } - if (len > pathlen || len < 1) - return -1; - - strcpy(path, HostStatDir); - p = path + strlen(path); - - while (elem > t_host) - { - if (!path_is_dir(path, createflag)) - { - ret = -1; - break; - } - elem--; - while (elem >= t_host && *elem != '.') - elem--; - *p++ = '/'; - x = elem + 1; - while ((ch = *x++) != '\0' && ch != '.') - { - if (isascii(ch) && isupper(ch)) - ch = tolower(ch); - if (ch == '/') - ch = ':'; /* / -> : */ - *p++ = ch; - } - if (elem >= t_host) - *p++ = '.'; - *p = '\0'; - } - - if (tTd(56, 80)) - { - if (ret < 0) - printf("FAILURE %d\n", ret); - else - printf("SUCCESS %s\n", path); - } - - return (ret); -} diff --git a/src/mime.c b/src/mime.c deleted file mode 100644 index aea8f7e..0000000 --- a/src/mime.c +++ /dev/null @@ -1,1190 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1994, 1996-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1994 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -# include "sendmail.h" -# include <string.h> - -#ifndef lint -static char sccsid[] = "@(#)mime.c 8.71 (Berkeley) 1/18/1999"; -#endif /* not lint */ - -/* -** MIME support. -** -** I am indebted to John Beck of Hewlett-Packard, who contributed -** his code to me for inclusion. As it turns out, I did not use -** his code since he used a "minimum change" approach that used -** several temp files, and I wanted a "minimum impact" approach -** that would avoid copying. However, looking over his code -** helped me cement my understanding of the problem. -** -** I also looked at, but did not directly use, Nathaniel -** Borenstein's "code.c" module. Again, it functioned as -** a file-to-file translator, which did not fit within my -** design bounds, but it was a useful base for understanding -** the problem. -*/ - -#if MIME8TO7 - -/* character set for hex and base64 encoding */ -char Base16Code[] = "0123456789ABCDEF"; -char Base64Code[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -/* types of MIME boundaries */ -#define MBT_SYNTAX 0 /* syntax error */ -#define MBT_NOTSEP 1 /* not a boundary */ -#define MBT_INTERMED 2 /* intermediate boundary (no trailing --) */ -#define MBT_FINAL 3 /* final boundary (trailing -- included) */ - -static char *MimeBoundaryNames[] = -{ - "SYNTAX", "NOTSEP", "INTERMED", "FINAL" -}; - -bool MapNLtoCRLF; - -extern int mimeboundary __P((char *, char **)); -/* -** MIME8TO7 -- output 8 bit body in 7 bit format -** -** The header has already been output -- this has to do the -** 8 to 7 bit conversion. It would be easy if we didn't have -** to deal with nested formats (multipart/xxx and message/rfc822). -** -** We won't be called if we don't have to do a conversion, and -** appropriate MIME-Version: and Content-Type: fields have been -** output. Any Content-Transfer-Encoding: field has not been -** output, and we can add it here. -** -** Parameters: -** mci -- mailer connection information. -** header -- the header for this body part. -** e -- envelope. -** boundaries -- the currently pending message boundaries. -** NULL if we are processing the outer portion. -** flags -- to tweak processing. -** -** Returns: -** An indicator of what terminated the message part: -** MBT_FINAL -- the final boundary -** MBT_INTERMED -- an intermediate boundary -** MBT_NOTSEP -- an end of file -*/ - -struct args -{ - char *field; /* name of field */ - char *value; /* value of that field */ -}; - -int -mime8to7(mci, header, e, boundaries, flags) - register MCI *mci; - HDR *header; - register ENVELOPE *e; - char **boundaries; - int flags; -{ - register char *p; - int linelen; - int bt; - off_t offset; - size_t sectionsize, sectionhighbits; - int i; - char *type; - char *subtype; - char *cte; - char **pvp; - int argc = 0; - char *bp; - bool use_qp = FALSE; - struct args argv[MAXMIMEARGS]; - char bbuf[128]; - char buf[MAXLINE]; - char pvpbuf[MAXLINE]; - extern u_char MimeTokenTab[256]; - extern int mime_getchar __P((FILE *, char **, int *)); - extern int mime_getchar_crlf __P((FILE *, char **, int *)); - - if (tTd(43, 1)) - { - printf("mime8to7: flags = %x, boundaries =", flags); - if (boundaries[0] == NULL) - printf(" <none>"); - else - { - for (i = 0; boundaries[i] != NULL; i++) - printf(" %s", boundaries[i]); - } - printf("\n"); - } - MapNLtoCRLF = TRUE; - p = hvalue("Content-Transfer-Encoding", header); - if (p == NULL || - (pvp = prescan(p, '\0', pvpbuf, sizeof pvpbuf, NULL, - MimeTokenTab)) == NULL || - pvp[0] == NULL) - { - cte = NULL; - } - else - { - cataddr(pvp, NULL, buf, sizeof buf, '\0'); - cte = newstr(buf); - } - - type = subtype = NULL; - p = hvalue("Content-Type", header); - if (p == NULL) - { - if (bitset(M87F_DIGEST, flags)) - p = "message/rfc822"; - else - p = "text/plain"; - } - if (p != NULL && - (pvp = prescan(p, '\0', pvpbuf, sizeof pvpbuf, NULL, - MimeTokenTab)) != NULL && - pvp[0] != NULL) - { - if (tTd(43, 40)) - { - for (i = 0; pvp[i] != NULL; i++) - printf("pvp[%d] = \"%s\"\n", i, pvp[i]); - } - type = *pvp++; - if (*pvp != NULL && strcmp(*pvp, "/") == 0 && - *++pvp != NULL) - { - subtype = *pvp++; - } - - /* break out parameters */ - while (*pvp != NULL && argc < MAXMIMEARGS) - { - /* skip to semicolon separator */ - while (*pvp != NULL && strcmp(*pvp, ";") != 0) - pvp++; - if (*pvp++ == NULL || *pvp == NULL) - break; - - /* extract field name */ - argv[argc].field = *pvp++; - - /* see if there is a value */ - if (*pvp != NULL && strcmp(*pvp, "=") == 0 && - (*++pvp == NULL || strcmp(*pvp, ";") != 0)) - { - argv[argc].value = *pvp; - argc++; - } - } - } - - /* check for disaster cases */ - if (type == NULL) - type = "-none-"; - if (subtype == NULL) - subtype = "-none-"; - - /* don't propogate some flags more than one level into the message */ - flags &= ~M87F_DIGEST; - - /* - ** Check for cases that can not be encoded. - ** - ** For example, you can't encode certain kinds of types - ** or already-encoded messages. If we find this case, - ** just copy it through. - */ - - snprintf(buf, sizeof buf, "%.100s/%.100s", type, subtype); - if (wordinclass(buf, 'n') || (cte != NULL && !wordinclass(cte, 'e'))) - flags |= M87F_NO8BIT; - -#ifdef USE_B_CLASS - if (wordinclass(buf, 'b') || wordinclass(type, 'b')) - MapNLtoCRLF = FALSE; -#endif - if (wordinclass(buf, 'q') || wordinclass(type, 'q')) - use_qp = TRUE; - - /* - ** Multipart requires special processing. - ** - ** Do a recursive descent into the message. - */ - - if (strcasecmp(type, "multipart") == 0 && - (!bitset(M87F_NO8BIT, flags) || bitset(M87F_NO8TO7, flags))) - { - int blen; - - if (strcasecmp(subtype, "digest") == 0) - flags |= M87F_DIGEST; - - for (i = 0; i < argc; i++) - { - if (strcasecmp(argv[i].field, "boundary") == 0) - break; - } - if (i >= argc || argv[i].value == NULL) - { - syserr("mime8to7: Content-Type: \"%s\": %s boundary", - i >= argc ? "missing" : "bogus", p); - p = "---"; - - /* avoid bounce loops */ - e->e_flags |= EF_DONT_MIME; - } - else - { - p = argv[i].value; - stripquotes(p); - } - blen = strlen(p); - if (blen > sizeof bbuf - 1) - { - syserr("mime8to7: multipart boundary \"%s\" too long", - p); - blen = sizeof bbuf - 1; - - /* avoid bounce loops */ - e->e_flags |= EF_DONT_MIME; - } - strncpy(bbuf, p, blen); - bbuf[blen] = '\0'; - if (tTd(43, 1)) - printf("mime8to7: multipart boundary \"%s\"\n", bbuf); - for (i = 0; i < MAXMIMENESTING; i++) - if (boundaries[i] == NULL) - break; - if (i >= MAXMIMENESTING) - { - syserr("mime8to7: multipart nesting boundary too deep"); - - /* avoid bounce loops */ - e->e_flags |= EF_DONT_MIME; - } - else - { - boundaries[i] = bbuf; - boundaries[i + 1] = NULL; - } - mci->mci_flags |= MCIF_INMIME; - - /* skip the early "comment" prologue */ - putline("", mci); - mci->mci_flags &= ~MCIF_INHEADER; - while (fgets(buf, sizeof buf, e->e_dfp) != NULL) - { - bt = mimeboundary(buf, boundaries); - if (bt != MBT_NOTSEP) - break; - putxline(buf, strlen(buf), mci, PXLF_MAPFROM|PXLF_STRIP8BIT); - if (tTd(43, 99)) - printf(" ...%s", buf); - } - if (feof(e->e_dfp)) - bt = MBT_FINAL; - while (bt != MBT_FINAL) - { - auto HDR *hdr = NULL; - - snprintf(buf, sizeof buf, "--%s", bbuf); - putline(buf, mci); - if (tTd(43, 35)) - printf(" ...%s\n", buf); - collect(e->e_dfp, FALSE, &hdr, e); - if (tTd(43, 101)) - putline("+++after collect", mci); - putheader(mci, hdr, e, flags); - if (tTd(43, 101)) - putline("+++after putheader", mci); - bt = mime8to7(mci, hdr, e, boundaries, flags); - } - snprintf(buf, sizeof buf, "--%s--", bbuf); - putline(buf, mci); - if (tTd(43, 35)) - printf(" ...%s\n", buf); - boundaries[i] = NULL; - mci->mci_flags &= ~MCIF_INMIME; - - /* skip the late "comment" epilogue */ - while (fgets(buf, sizeof buf, e->e_dfp) != NULL) - { - bt = mimeboundary(buf, boundaries); - if (bt != MBT_NOTSEP) - break; - putxline(buf, strlen(buf), mci, PXLF_MAPFROM|PXLF_STRIP8BIT); - if (tTd(43, 99)) - printf(" ...%s", buf); - } - if (feof(e->e_dfp)) - bt = MBT_FINAL; - if (tTd(43, 3)) - printf("\t\t\tmime8to7=>%s (multipart)\n", - MimeBoundaryNames[bt]); - return bt; - } - - /* - ** Message/xxx types -- recurse exactly once. - ** - ** Class 's' is predefined to have "rfc822" only. - */ - - if (strcasecmp(type, "message") == 0) - { - if (!wordinclass(subtype, 's')) - { - flags |= M87F_NO8BIT; - } - else - { - auto HDR *hdr = NULL; - - putline("", mci); - - mci->mci_flags |= MCIF_INMIME; - collect(e->e_dfp, FALSE, &hdr, e); - if (tTd(43, 101)) - putline("+++after collect", mci); - putheader(mci, hdr, e, flags); - if (tTd(43, 101)) - putline("+++after putheader", mci); - if (hvalue("MIME-Version", hdr) == NULL) - putline("MIME-Version: 1.0", mci); - bt = mime8to7(mci, hdr, e, boundaries, flags); - mci->mci_flags &= ~MCIF_INMIME; - return bt; - } - } - - /* - ** Non-compound body type - ** - ** Compute the ratio of seven to eight bit characters; - ** use that as a heuristic to decide how to do the - ** encoding. - */ - - sectionsize = sectionhighbits = 0; - if (!bitset(M87F_NO8BIT|M87F_NO8TO7, flags)) - { - /* remember where we were */ - offset = ftell(e->e_dfp); - if (offset == -1) - syserr("mime8to7: cannot ftell on df%s", e->e_id); - - /* do a scan of this body type to count character types */ - while (fgets(buf, sizeof buf, e->e_dfp) != NULL) - { - if (mimeboundary(buf, boundaries) != MBT_NOTSEP) - break; - for (p = buf; *p != '\0'; p++) - { - /* count bytes with the high bit set */ - sectionsize++; - if (bitset(0200, *p)) - sectionhighbits++; - } - - /* - ** Heuristic: if 1/4 of the first 4K bytes are 8-bit, - ** assume base64. This heuristic avoids double-reading - ** large graphics or video files. - */ - - if (sectionsize >= 4096 && - sectionhighbits > sectionsize / 4) - break; - } - - /* return to the original offset for processing */ - /* XXX use relative seeks to handle >31 bit file sizes? */ - if (fseek(e->e_dfp, offset, SEEK_SET) < 0) - syserr("mime8to7: cannot fseek on df%s", e->e_id); - else - clearerr(e->e_dfp); - } - - /* - ** Heuristically determine encoding method. - ** If more than 1/8 of the total characters have the - ** eighth bit set, use base64; else use quoted-printable. - ** However, only encode binary encoded data as base64, - ** since otherwise the NL=>CRLF mapping will be a problem. - */ - - if (tTd(43, 8)) - { - printf("mime8to7: %ld high bit(s) in %ld byte(s), cte=%s, type=%s/%s\n", - (long) sectionhighbits, (long) sectionsize, - cte == NULL ? "[none]" : cte, - type == NULL ? "[none]" : type, - subtype == NULL ? "[none]" : subtype); - } - if (cte != NULL && strcasecmp(cte, "binary") == 0) - sectionsize = sectionhighbits; - linelen = 0; - bp = buf; - if (sectionhighbits == 0) - { - /* no encoding necessary */ - if (cte != NULL && - bitset(MCIF_INMIME, mci->mci_flags) && - !bitset(M87F_NO8TO7, flags)) - { - /* - ** Skip _unless_ in MIME mode and potentially - ** converting from 8 bit to 7 bit MIME. See - ** putheader() for the counterpart where the - ** CTE header is skipped in the opposite - ** situation. - */ - - snprintf(buf, sizeof buf, - "Content-Transfer-Encoding: %.200s", cte); - putline(buf, mci); - if (tTd(43, 36)) - printf(" ...%s\n", buf); - } - putline("", mci); - mci->mci_flags &= ~MCIF_INHEADER; - while (fgets(buf, sizeof buf, e->e_dfp) != NULL) - { - bt = mimeboundary(buf, boundaries); - if (bt != MBT_NOTSEP) - break; - putline(buf, mci); - } - if (feof(e->e_dfp)) - bt = MBT_FINAL; - } - else if (!MapNLtoCRLF || - (sectionsize / 8 < sectionhighbits && !use_qp)) - { - /* use base64 encoding */ - int c1, c2; - - if (tTd(43, 36)) - printf(" ...Content-Transfer-Encoding: base64\n"); - putline("Content-Transfer-Encoding: base64", mci); - snprintf(buf, sizeof buf, - "X-MIME-Autoconverted: from 8bit to base64 by %s id %s", - MyHostName, e->e_id); - putline(buf, mci); - putline("", mci); - mci->mci_flags &= ~MCIF_INHEADER; - while ((c1 = mime_getchar_crlf(e->e_dfp, boundaries, &bt)) != EOF) - { - if (linelen > 71) - { - *bp = '\0'; - putline(buf, mci); - linelen = 0; - bp = buf; - } - linelen += 4; - *bp++ = Base64Code[(c1 >> 2)]; - c1 = (c1 & 0x03) << 4; - c2 = mime_getchar_crlf(e->e_dfp, boundaries, &bt); - if (c2 == EOF) - { - *bp++ = Base64Code[c1]; - *bp++ = '='; - *bp++ = '='; - break; - } - c1 |= (c2 >> 4) & 0x0f; - *bp++ = Base64Code[c1]; - c1 = (c2 & 0x0f) << 2; - c2 = mime_getchar_crlf(e->e_dfp, boundaries, &bt); - if (c2 == EOF) - { - *bp++ = Base64Code[c1]; - *bp++ = '='; - break; - } - c1 |= (c2 >> 6) & 0x03; - *bp++ = Base64Code[c1]; - *bp++ = Base64Code[c2 & 0x3f]; - } - *bp = '\0'; - putline(buf, mci); - } - else - { - /* use quoted-printable encoding */ - int c1, c2; - int fromstate; - BITMAP badchars; - - /* set up map of characters that must be mapped */ - clrbitmap(badchars); - for (c1 = 0x00; c1 < 0x20; c1++) - setbitn(c1, badchars); - clrbitn('\t', badchars); - for (c1 = 0x7f; c1 < 0x100; c1++) - setbitn(c1, badchars); - setbitn('=', badchars); - if (bitnset(M_EBCDIC, mci->mci_mailer->m_flags)) - for (p = "!\"#$@[\\]^`{|}~"; *p != '\0'; p++) - setbitn(*p, badchars); - - if (tTd(43, 36)) - printf(" ...Content-Transfer-Encoding: quoted-printable\n"); - putline("Content-Transfer-Encoding: quoted-printable", mci); - snprintf(buf, sizeof buf, - "X-MIME-Autoconverted: from 8bit to quoted-printable by %s id %s", - MyHostName, e->e_id); - putline(buf, mci); - putline("", mci); - mci->mci_flags &= ~MCIF_INHEADER; - fromstate = 0; - c2 = '\n'; - while ((c1 = mime_getchar(e->e_dfp, boundaries, &bt)) != EOF) - { - if (c1 == '\n') - { - if (c2 == ' ' || c2 == '\t') - { - *bp++ = '='; - *bp++ = Base16Code[(c2 >> 4) & 0x0f]; - *bp++ = Base16Code[c2 & 0x0f]; - } - if (buf[0] == '.' && bp == &buf[1]) - { - buf[0] = '='; - *bp++ = Base16Code[('.' >> 4) & 0x0f]; - *bp++ = Base16Code['.' & 0x0f]; - } - *bp = '\0'; - putline(buf, mci); - linelen = fromstate = 0; - bp = buf; - c2 = c1; - continue; - } - if (c2 == ' ' && linelen == 4 && fromstate == 4 && - bitnset(M_ESCFROM, mci->mci_mailer->m_flags)) - { - *bp++ = '='; - *bp++ = '2'; - *bp++ = '0'; - linelen += 3; - } - else if (c2 == ' ' || c2 == '\t') - { - *bp++ = c2; - linelen++; - } - if (linelen > 72 && - (linelen > 75 || c1 != '.' || - (linelen > 73 && c2 == '.'))) - { - if (linelen > 73 && c2 == '.') - bp--; - else - c2 = '\n'; - *bp++ = '='; - *bp = '\0'; - putline(buf, mci); - linelen = fromstate = 0; - bp = buf; - if (c2 == '.') - { - *bp++ = '.'; - linelen++; - } - } - if (bitnset(c1 & 0xff, badchars)) - { - *bp++ = '='; - *bp++ = Base16Code[(c1 >> 4) & 0x0f]; - *bp++ = Base16Code[c1 & 0x0f]; - linelen += 3; - } - else if (c1 != ' ' && c1 != '\t') - { - if (linelen < 4 && c1 == "From"[linelen]) - fromstate++; - *bp++ = c1; - linelen++; - } - c2 = c1; - } - - /* output any saved character */ - if (c2 == ' ' || c2 == '\t') - { - *bp++ = '='; - *bp++ = Base16Code[(c2 >> 4) & 0x0f]; - *bp++ = Base16Code[c2 & 0x0f]; - linelen += 3; - } - - if (linelen > 0 || boundaries[0] != NULL) - { - *bp = '\0'; - putline(buf, mci); - } - - } - if (tTd(43, 3)) - printf("\t\t\tmime8to7=>%s (basic)\n", MimeBoundaryNames[bt]); - return bt; -} -/* -** MIME_GETCHAR -- get a character for MIME processing -** -** Treats boundaries as EOF. -** -** Parameters: -** fp -- the input file. -** boundaries -- the current MIME boundaries. -** btp -- if the return value is EOF, *btp is set to -** the type of the boundary. -** -** Returns: -** The next character in the input stream. -*/ - -int -mime_getchar(fp, boundaries, btp) - register FILE *fp; - char **boundaries; - int *btp; -{ - int c; - static u_char *bp = NULL; - static int buflen = 0; - static bool atbol = TRUE; /* at beginning of line */ - static int bt = MBT_SYNTAX; /* boundary type of next EOF */ - static u_char buf[128]; /* need not be a full line */ - int start = 0; /* indicates position of - in buffer */ - - if (buflen == 1 && *bp == '\n') - { - /* last \n in buffer may be part of next MIME boundary */ - c = *bp; - } - else if (buflen > 0) - { - buflen--; - return *bp++; - } - else - c = getc(fp); - bp = buf; - buflen = 0; - if (c == '\n') - { - /* might be part of a MIME boundary */ - *bp++ = c; - atbol = TRUE; - c = getc(fp); - if (c == '\n') - { - ungetc(c, fp); - return c; - } - start = 1; - } - if (c != EOF) - *bp++ = c; - else - bt = MBT_FINAL; - if (atbol && c == '-') - { - /* check for a message boundary */ - c = getc(fp); - if (c != '-') - { - if (c != EOF) - *bp++ = c; - else - bt = MBT_FINAL; - buflen = bp - buf - 1; - bp = buf; - return *bp++; - } - - /* got "--", now check for rest of separator */ - *bp++ = '-'; - while (bp < &buf[sizeof buf - 2] && - (c = getc(fp)) != EOF && c != '\n') - { - *bp++ = c; - } - *bp = '\0'; - bt = mimeboundary((char *) &buf[start], boundaries); - switch (bt) - { - case MBT_FINAL: - case MBT_INTERMED: - /* we have a message boundary */ - buflen = 0; - *btp = bt; - return EOF; - } - - atbol = c == '\n'; - if (c != EOF) - *bp++ = c; - } - - buflen = bp - buf - 1; - if (buflen < 0) - { - *btp = bt; - return EOF; - } - bp = buf; - return *bp++; -} -/* -** MIME_GETCHAR_CRLF -- do mime_getchar, but translate NL => CRLF -** -** Parameters: -** fp -- the input file. -** boundaries -- the current MIME boundaries. -** btp -- if the return value is EOF, *btp is set to -** the type of the boundary. -** -** Returns: -** The next character in the input stream. -*/ - -int -mime_getchar_crlf(fp, boundaries, btp) - register FILE *fp; - char **boundaries; - int *btp; -{ - static bool sendlf = FALSE; - int c; - - if (sendlf) - { - sendlf = FALSE; - return '\n'; - } - c = mime_getchar(fp, boundaries, btp); - if (c == '\n' && MapNLtoCRLF) - { - sendlf = TRUE; - return '\r'; - } - return c; -} -/* -** MIMEBOUNDARY -- determine if this line is a MIME boundary & its type -** -** Parameters: -** line -- the input line. -** boundaries -- the set of currently pending boundaries. -** -** Returns: -** MBT_NOTSEP -- if this is not a separator line -** MBT_INTERMED -- if this is an intermediate separator -** MBT_FINAL -- if this is a final boundary -** MBT_SYNTAX -- if this is a boundary for the wrong -** enclosure -- i.e., a syntax error. -*/ - -int -mimeboundary(line, boundaries) - register char *line; - char **boundaries; -{ - int type = MBT_NOTSEP; - int i; - int savec; - extern int isboundary __P((char *, char **)); - - if (line[0] != '-' || line[1] != '-' || boundaries == NULL) - return MBT_NOTSEP; - i = strlen(line); - if (line[i - 1] == '\n') - i--; - - /* strip off trailing whitespace */ - while (line[i - 1] == ' ' || line[i - 1] == '\t') - i--; - savec = line[i]; - line[i] = '\0'; - - if (tTd(43, 5)) - printf("mimeboundary: line=\"%s\"... ", line); - - /* check for this as an intermediate boundary */ - if (isboundary(&line[2], boundaries) >= 0) - type = MBT_INTERMED; - else if (i > 2 && strncmp(&line[i - 2], "--", 2) == 0) - { - /* check for a final boundary */ - line[i - 2] = '\0'; - if (isboundary(&line[2], boundaries) >= 0) - type = MBT_FINAL; - line[i - 2] = '-'; - } - - line[i] = savec; - if (tTd(43, 5)) - printf("%s\n", MimeBoundaryNames[type]); - return type; -} -/* -** DEFCHARSET -- return default character set for message -** -** The first choice for character set is for the mailer -** corresponding to the envelope sender. If neither that -** nor the global configuration file has a default character -** set defined, return "unknown-8bit" as recommended by -** RFC 1428 section 3. -** -** Parameters: -** e -- the envelope for this message. -** -** Returns: -** The default character set for that mailer. -*/ - -char * -defcharset(e) - register ENVELOPE *e; -{ - if (e != NULL && e->e_from.q_mailer != NULL && - e->e_from.q_mailer->m_defcharset != NULL) - return e->e_from.q_mailer->m_defcharset; - if (DefaultCharSet != NULL) - return DefaultCharSet; - return "unknown-8bit"; -} -/* -** ISBOUNDARY -- is a given string a currently valid boundary? -** -** Parameters: -** line -- the current input line. -** boundaries -- the list of valid boundaries. -** -** Returns: -** The index number in boundaries if the line is found. -** -1 -- otherwise. -** -*/ - -int -isboundary(line, boundaries) - char *line; - char **boundaries; -{ - register int i; - - for (i = 0; boundaries[i] != NULL; i++) - { - if (strcmp(line, boundaries[i]) == 0) - return i; - } - return -1; -} - -#endif /* MIME8TO7 */ - -#if MIME7TO8 - -/* -** MIME7TO8 -- output 7 bit encoded MIME body in 8 bit format -** -** This is a hack. Supports translating the two 7-bit body-encodings -** (quoted-printable and base64) to 8-bit coded bodies. -** -** There is not much point in supporting multipart here, as the UA -** will be able to deal with encoded MIME bodies if it can parse MIME -** multipart messages. -** -** Note also that we wont be called unless it is a text/plain MIME -** message, encoded base64 or QP and mailer flag '9' has been defined -** on mailer. -** -** Contributed by Marius Olaffson <marius@rhi.hi.is>. -** -** Parameters: -** mci -- mailer connection information. -** header -- the header for this body part. -** e -- envelope. -** -** Returns: -** none. -*/ - -extern int mime_fromqp __P((u_char *, u_char **, int, int)); - -static char index_64[128] = -{ - -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, - -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, - -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63, - 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1,-1,-1,-1, - -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, - 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1, - -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, - 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 -}; - -#define CHAR64(c) (((c) < 0 || (c) > 127) ? -1 : index_64[(c)]) - - -void -mime7to8(mci, header, e) - register MCI *mci; - HDR *header; - register ENVELOPE *e; -{ - register char *p; - char *cte; - char **pvp; - u_char *fbufp; - char buf[MAXLINE]; - u_char fbuf[MAXLINE + 1]; - char pvpbuf[MAXLINE]; - extern u_char MimeTokenTab[256]; - - p = hvalue("Content-Transfer-Encoding", header); - if (p == NULL || - (pvp = prescan(p, '\0', pvpbuf, sizeof pvpbuf, NULL, - MimeTokenTab)) == NULL || - pvp[0] == NULL) - { - /* "can't happen" -- upper level should have caught this */ - syserr("mime7to8: unparsable CTE %s", p == NULL ? "<NULL>" : p); - - /* avoid bounce loops */ - e->e_flags |= EF_DONT_MIME; - - /* cheap failsafe algorithm -- should work on text/plain */ - if (p != NULL) - { - snprintf(buf, sizeof buf, - "Content-Transfer-Encoding: %s", p); - putline(buf, mci); - } - putline("", mci); - mci->mci_flags &= ~MCIF_INHEADER; - while (fgets(buf, sizeof buf, e->e_dfp) != NULL) - putline(buf, mci); - return; - } - cataddr(pvp, NULL, buf, sizeof buf, '\0'); - cte = newstr(buf); - - mci->mci_flags |= MCIF_INHEADER; - putline("Content-Transfer-Encoding: 8bit", mci); - snprintf(buf, sizeof buf, - "X-MIME-Autoconverted: from %.200s to 8bit by %s id %s", - cte, MyHostName, e->e_id); - putline(buf, mci); - putline("", mci); - mci->mci_flags &= ~MCIF_INHEADER; - - /* - ** Translate body encoding to 8-bit. Supports two types of - ** encodings; "base64" and "quoted-printable". Assume qp if - ** it is not base64. - */ - - if (strcasecmp(cte, "base64") == 0) - { - int c1, c2, c3, c4; - - fbufp = fbuf; - while ((c1 = fgetc(e->e_dfp)) != EOF) - { - if (isascii(c1) && isspace(c1)) - continue; - - do - { - c2 = fgetc(e->e_dfp); - } while (isascii(c2) && isspace(c2)); - if (c2 == EOF) - break; - - do - { - c3 = fgetc(e->e_dfp); - } while (isascii(c3) && isspace(c3)); - if (c3 == EOF) - break; - - do - { - c4 = fgetc(e->e_dfp); - } while (isascii(c4) && isspace(c4)); - if (c4 == EOF) - break; - - if (c1 == '=' || c2 == '=') - continue; - c1 = CHAR64(c1); - c2 = CHAR64(c2); - - *fbufp = (c1 << 2) | ((c2 & 0x30) >> 4); - if (*fbufp++ == '\n' || fbufp >= &fbuf[MAXLINE]) - { - if (*--fbufp != '\n' || - (fbufp > fbuf && *--fbufp != '\r')) - fbufp++; - putxline((char *) fbuf, fbufp - fbuf, - mci, PXLF_MAPFROM); - fbufp = fbuf; - } - if (c3 == '=') - continue; - c3 = CHAR64(c3); - *fbufp = ((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2); - if (*fbufp++ == '\n' || fbufp >= &fbuf[MAXLINE]) - { - if (*--fbufp != '\n' || - (fbufp > fbuf && *--fbufp != '\r')) - fbufp++; - putxline((char *) fbuf, fbufp - fbuf, - mci, PXLF_MAPFROM); - fbufp = fbuf; - } - if (c4 == '=') - continue; - c4 = CHAR64(c4); - *fbufp = ((c3 & 0x03) << 6) | c4; - if (*fbufp++ == '\n' || fbufp >= &fbuf[MAXLINE]) - { - if (*--fbufp != '\n' || - (fbufp > fbuf && *--fbufp != '\r')) - fbufp++; - putxline((char *) fbuf, fbufp - fbuf, - mci, PXLF_MAPFROM); - fbufp = fbuf; - } - } - } - else - { - /* quoted-printable */ - fbufp = fbuf; - while (fgets(buf, sizeof buf, e->e_dfp) != NULL) - { - if (mime_fromqp((u_char *) buf, &fbufp, 0, - &fbuf[MAXLINE] - fbufp) == 0) - continue; - - if (fbufp - fbuf > 0) - putxline((char *) fbuf, fbufp - fbuf - 1, mci, - PXLF_MAPFROM); - fbufp = fbuf; - } - } - - /* force out partial last line */ - if (fbufp > fbuf) - { - *fbufp = '\0'; - putxline((char *) fbuf, fbufp - fbuf, mci, PXLF_MAPFROM); - } - if (tTd(43, 3)) - printf("\t\t\tmime7to8 => %s to 8bit done\n", cte); -} -/* -** The following is based on Borenstein's "codes.c" module, with simplifying -** changes as we do not deal with multipart, and to do the translation in-core, -** with an attempt to prevent overrun of output buffers. -** -** What is needed here are changes to defned this code better against -** bad encodings. Questionable to always return 0xFF for bad mappings. -*/ - -static char index_hex[128] = -{ - -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, - -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, - -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1, -1,-1,-1,-1, - -1,10,11,12, 13,14,15,-1, -1,-1,-1,-1, -1,-1,-1,-1, - -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, - -1,10,11,12, 13,14,15,-1, -1,-1,-1,-1, -1,-1,-1,-1, - -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1 -}; - -#define HEXCHAR(c) (((c) < 0 || (c) > 127) ? -1 : index_hex[(c)]) - -int -mime_fromqp(infile, outfile, state, maxlen) - u_char *infile; - u_char **outfile; - int state; /* Decoding body (0) or header (1) */ - int maxlen; /* Max # of chars allowed in outfile */ -{ - int c1, c2; - int nchar = 0; - - while ((c1 = *infile++) != '\0') - { - if (c1 == '=') - { - if ((c1 = *infile++) == 0) - break; - - if (c1 == '\n' || (c1 = HEXCHAR(c1)) == -1) - { - /* ignore it */ - if (state == 0) - return 0; - } - else - { - do - { - if ((c2 = *infile++) == '\0') - { - c2 = -1; - break; - } - } while ((c2 = HEXCHAR(c2)) == -1); - - if (c2 == -1 || ++nchar > maxlen) - break; - - *(*outfile)++ = c1 << 4 | c2; - } - } - else - { - if (state == 1 && c1 == '_') - c1 = ' '; - - if (++nchar > maxlen) - break; - - *(*outfile)++ = c1; - - if (c1 == '\n') - break; - } - } - *(*outfile)++ = '\0'; - return 1; -} - - -#endif /* MIME7TO8 */ diff --git a/src/newaliases.0 b/src/newaliases.0 deleted file mode 100644 index 25b0285..0000000 --- a/src/newaliases.0 +++ /dev/null @@ -1,27 +0,0 @@ -NEWALIASES(1) BSD Reference Manual NEWALIASES(1) - -NNAAMMEE - nneewwaalliiaasseess - rebuild the data base for the mail aliases file - -SSYYNNOOPPSSIISS - nneewwaalliiaasseess - -DDEESSCCRRIIPPTTIIOONN - NNeewwaalliiaasseess rebuilds the random access data base for the mail aliases file - _/_e_t_c_/_a_l_i_a_s_e_s. It must be run each time this file is changed in order for - the change to take effect. - - NNeewwaalliiaasseess is identical to ``sendmail -bi''. - - The nneewwaalliiaasseess utility exits 0 on success, and >0 if an error occurs. - -FFIILLEESS - /etc/aliases The mail aliases file - -SSEEEE AALLSSOO - aliases(5), sendmail(8) - -HHIISSTTOORRYY - The nneewwaalliiaasseess command appeared in 4.0BSD. - -4th Berkeley Distribution May 19, 1998 1 diff --git a/src/newaliases.1 b/src/newaliases.1 deleted file mode 100644 index b9673cd..0000000 --- a/src/newaliases.1 +++ /dev/null @@ -1,47 +0,0 @@ -.\" Copyright (c) 1998 Sendmail, Inc. All rights reserved. -.\" Copyright (c) 1983, 1997 Eric P. Allman. All rights reserved. -.\" Copyright (c) 1985, 1990, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" By using this file, you agree to the terms and conditions set -.\" forth in the LICENSE file which can be found at the top level of -.\" the sendmail distribution. -.\" -.\" -.\" @(#)newaliases.1 8.10 (Berkeley) 5/19/1998 -.\" -.Dd May 19, 1998 -.Dt NEWALIASES 1 -.Os BSD 4 -.Sh NAME -.Nm newaliases -.Nd rebuild the data base for the mail aliases file -.Sh SYNOPSIS -.Nm newaliases -.Sh DESCRIPTION -.Nm Newaliases -rebuilds the random access data base for the mail aliases file -.Pa /etc/aliases . -It must be run each time this file is changed in order -for the change to take effect. -.Pp -.Nm Newaliases -is identical to -.Dq Li "sendmail -bi" . -.Pp -The -.Nm newaliases -utility exits 0 on success, and >0 if an error occurs. -.Sh FILES -.Bl -tag -width /etc/aliases -compact -.It Pa /etc/aliases -The mail aliases file -.El -.Sh SEE ALSO -.Xr aliases 5 , -.Xr sendmail 8 -.Sh HISTORY -The -.Nm newaliases -command appeared in -.Bx 4.0 . diff --git a/src/parseaddr.c b/src/parseaddr.c deleted file mode 100644 index 86762fd..0000000 --- a/src/parseaddr.c +++ /dev/null @@ -1,2555 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)parseaddr.c 8.156 (Berkeley) 10/27/1998"; -#endif /* not lint */ - -# include "sendmail.h" - -/* -** PARSEADDR -- Parse an address -** -** Parses an address and breaks it up into three parts: a -** net to transmit the message on, the host to transmit it -** to, and a user on that host. These are loaded into an -** ADDRESS header with the values squirreled away if necessary. -** The "user" part may not be a real user; the process may -** just reoccur on that machine. For example, on a machine -** with an arpanet connection, the address -** csvax.bill@berkeley -** will break up to a "user" of 'csvax.bill' and a host -** of 'berkeley' -- to be transmitted over the arpanet. -** -** Parameters: -** addr -- the address to parse. -** a -- a pointer to the address descriptor buffer. -** If NULL, a header will be created. -** flags -- describe detail for parsing. See RF_ definitions -** in sendmail.h. -** delim -- the character to terminate the address, passed -** to prescan. -** delimptr -- if non-NULL, set to the location of the -** delim character that was found. -** e -- the envelope that will contain this address. -** -** Returns: -** A pointer to the address descriptor header (`a' if -** `a' is non-NULL). -** NULL on error. -** -** Side Effects: -** none -*/ - -/* following delimiters are inherent to the internal algorithms */ -# define DELIMCHARS "()<>,;\r\n" /* default word delimiters */ - -ADDRESS * -parseaddr(addr, a, flags, delim, delimptr, e) - char *addr; - register ADDRESS *a; - int flags; - int delim; - char **delimptr; - register ENVELOPE *e; -{ - register char **pvp; - auto char *delimptrbuf; - bool queueup; - char pvpbuf[PSBUFSIZE]; - extern bool invalidaddr __P((char *, char *)); - extern void allocaddr __P((ADDRESS *, int, char *)); - - /* - ** Initialize and prescan address. - */ - - e->e_to = addr; - if (tTd(20, 1)) - printf("\n--parseaddr(%s)\n", addr); - - if (delimptr == NULL) - delimptr = &delimptrbuf; - - pvp = prescan(addr, delim, pvpbuf, sizeof pvpbuf, delimptr, NULL); - if (pvp == NULL) - { - if (tTd(20, 1)) - printf("parseaddr-->NULL\n"); - return (NULL); - } - - if (invalidaddr(addr, delim == '\0' ? NULL : *delimptr)) - { - if (tTd(20, 1)) - printf("parseaddr-->bad address\n"); - return NULL; - } - - /* - ** Save addr if we are going to have to. - ** - ** We have to do this early because there is a chance that - ** the map lookups in the rewriting rules could clobber - ** static memory somewhere. - */ - - if (bitset(RF_COPYPADDR, flags) && addr != NULL) - { - char savec = **delimptr; - - if (savec != '\0') - **delimptr = '\0'; - e->e_to = addr = newstr(addr); - if (savec != '\0') - **delimptr = savec; - } - - /* - ** Apply rewriting rules. - ** Ruleset 0 does basic parsing. It must resolve. - */ - - queueup = FALSE; - if (rewrite(pvp, 3, 0, e) == EX_TEMPFAIL) - queueup = TRUE; - if (rewrite(pvp, 0, 0, e) == EX_TEMPFAIL) - queueup = TRUE; - - - /* - ** Build canonical address from pvp. - */ - - a = buildaddr(pvp, a, flags, e); - - /* - ** Make local copies of the host & user and then - ** transport them out. - */ - - allocaddr(a, flags, addr); - if (bitset(QBADADDR, a->q_flags)) - return a; - - /* - ** If there was a parsing failure, mark it for queueing. - */ - - if (queueup && OpMode != MD_INITALIAS) - { - char *msg = "Transient parse error -- message queued for future delivery"; - - if (e->e_sendmode == SM_DEFER) - msg = "Deferring message until queue run"; - if (tTd(20, 1)) - printf("parseaddr: queuing message\n"); - message(msg); - if (e->e_message == NULL && e->e_sendmode != SM_DEFER) - e->e_message = newstr(msg); - a->q_flags |= QQUEUEUP; - a->q_status = "4.4.3"; - } - - /* - ** Compute return value. - */ - - if (tTd(20, 1)) - { - printf("parseaddr-->"); - printaddr(a, FALSE); - } - - return (a); -} -/* -** INVALIDADDR -- check for address containing meta-characters -** -** Parameters: -** addr -- the address to check. -** -** Returns: -** TRUE -- if the address has any "wierd" characters -** FALSE -- otherwise. -*/ - -bool -invalidaddr(addr, delimptr) - register char *addr; - char *delimptr; -{ - char savedelim = '\0'; - - if (delimptr != NULL) - { - savedelim = *delimptr; - if (savedelim != '\0') - *delimptr = '\0'; - } - if (strlen(addr) > TOBUFSIZE - 2) - { - usrerr("553 Address too long (%d bytes max)", TOBUFSIZE - 2); - goto failure; - } - for (; *addr != '\0'; addr++) - { - if ((*addr & 0340) == 0200) - break; - } - if (*addr == '\0') - { - if (delimptr != NULL && savedelim != '\0') - *delimptr = savedelim; - return FALSE; - } - setstat(EX_USAGE); - usrerr("553 Address contained invalid control characters"); -failure: - if (delimptr != NULL && savedelim != '\0') - *delimptr = savedelim; - return TRUE; -} -/* -** ALLOCADDR -- do local allocations of address on demand. -** -** Also lowercases the host name if requested. -** -** Parameters: -** a -- the address to reallocate. -** flags -- the copy flag (see RF_ definitions in sendmail.h -** for a description). -** paddr -- the printname of the address. -** -** Returns: -** none. -** -** Side Effects: -** Copies portions of a into local buffers as requested. -*/ - -void -allocaddr(a, flags, paddr) - register ADDRESS *a; - int flags; - char *paddr; -{ - if (tTd(24, 4)) - printf("allocaddr(flags=%x, paddr=%s)\n", flags, paddr); - - a->q_paddr = paddr; - - if (a->q_user == NULL) - a->q_user = ""; - if (a->q_host == NULL) - a->q_host = ""; - - if (bitset(RF_COPYPARSE, flags)) - { - a->q_host = newstr(a->q_host); - if (a->q_user != a->q_paddr) - a->q_user = newstr(a->q_user); - } - - if (a->q_paddr == NULL) - a->q_paddr = a->q_user; -} -/* -** PRESCAN -- Prescan name and make it canonical -** -** Scans a name and turns it into a set of tokens. This process -** deletes blanks and comments (in parentheses). -** -** This routine knows about quoted strings and angle brackets. -** -** There are certain subtleties to this routine. The one that -** comes to mind now is that backslashes on the ends of names -** are silently stripped off; this is intentional. The problem -** is that some versions of sndmsg (like at LBL) set the kill -** character to something other than @ when reading addresses; -** so people type "csvax.eric\@berkeley" -- which screws up the -** berknet mailer. -** -** Parameters: -** addr -- the name to chomp. -** delim -- the delimiter for the address, normally -** '\0' or ','; \0 is accepted in any case. -** If '\t' then we are reading the .cf file. -** pvpbuf -- place to put the saved text -- note that -** the pointers are static. -** pvpbsize -- size of pvpbuf. -** delimptr -- if non-NULL, set to the location of the -** terminating delimiter. -** toktab -- if set, a token table to use for parsing. -** If NULL, use the default table. -** -** Returns: -** A pointer to a vector of tokens. -** NULL on error. -*/ - -/* states and character types */ -# define OPR 0 /* operator */ -# define ATM 1 /* atom */ -# define QST 2 /* in quoted string */ -# define SPC 3 /* chewing up spaces */ -# define ONE 4 /* pick up one character */ -# define ILL 5 /* illegal character */ - -# define NSTATES 6 /* number of states */ -# define TYPE 017 /* mask to select state type */ - -/* meta bits for table */ -# define M 020 /* meta character; don't pass through */ -# define B 040 /* cause a break */ -# define MB M|B /* meta-break */ - -static short StateTab[NSTATES][NSTATES] = -{ - /* oldst chtype> OPR ATM QST SPC ONE ILL */ - /*OPR*/ { OPR|B, ATM|B, QST|B, SPC|MB, ONE|B, ILL|MB }, - /*ATM*/ { OPR|B, ATM, QST|B, SPC|MB, ONE|B, ILL|MB }, - /*QST*/ { QST, QST, OPR, QST, QST, QST }, - /*SPC*/ { OPR, ATM, QST, SPC|M, ONE, ILL|MB }, - /*ONE*/ { OPR, OPR, OPR, OPR, OPR, ILL|MB }, - /*ILL*/ { OPR|B, ATM|B, QST|B, SPC|MB, ONE|B, ILL|M }, -}; - -/* token type table -- it gets modified with $o characters */ -static u_char TokTypeTab[256] = -{ - /* nul soh stx etx eot enq ack bel bs ht nl vt np cr so si */ - ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,SPC,SPC,SPC,SPC,SPC,ATM,ATM, - /* dle dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us */ - ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, - /* sp ! " # $ % & ' ( ) * + , - . / */ - SPC,ATM,QST,ATM,ATM,ATM,ATM,ATM, ATM,SPC,ATM,ATM,ATM,ATM,ATM,ATM, - /* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */ - ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, - /* @ A B C D E F G H I J K L M N O */ - ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, - /* P Q R S T U V W X Y Z [ \ ] ^ _ */ - ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, - /* ` a b c d e f g h i j k l m n o */ - ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, - /* p q r s t u v w x y z { | } ~ del */ - ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, - - /* nul soh stx etx eot enq ack bel bs ht nl vt np cr so si */ - OPR,OPR,ONE,OPR,OPR,OPR,OPR,OPR, OPR,OPR,OPR,OPR,OPR,OPR,OPR,OPR, - /* dle dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us */ - OPR,OPR,OPR,ONE,ONE,ONE,OPR,OPR, OPR,OPR,OPR,OPR,OPR,OPR,OPR,OPR, - /* sp ! " # $ % & ' ( ) * + , - . / */ - ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, - /* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */ - ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, - /* @ A B C D E F G H I J K L M N O */ - ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, - /* P Q R S T U V W X Y Z [ \ ] ^ _ */ - ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, - /* ` a b c d e f g h i j k l m n o */ - ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, - /* p q r s t u v w x y z { | } ~ del */ - ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, -}; - -/* token type table for MIME parsing */ -u_char MimeTokenTab[256] = -{ - /* nul soh stx etx eot enq ack bel bs ht nl vt np cr so si */ - ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, ILL,SPC,SPC,SPC,SPC,SPC,ILL,ILL, - /* dle dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us */ - ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, - /* sp ! " # $ % & ' ( ) * + , - . / */ - SPC,ATM,QST,ATM,ATM,ATM,ATM,ATM, ATM,SPC,ATM,ATM,OPR,ATM,ATM,OPR, - /* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */ - ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,OPR,OPR,OPR,OPR,OPR,OPR, - /* @ A B C D E F G H I J K L M N O */ - OPR,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, - /* P Q R S T U V W X Y Z [ \ ] ^ _ */ - ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,OPR,OPR,OPR,ATM,ATM, - /* ` a b c d e f g h i j k l m n o */ - ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, - /* p q r s t u v w x y z { | } ~ del */ - ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, - - /* nul soh stx etx eot enq ack bel bs ht nl vt np cr so si */ - ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, - /* dle dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us */ - ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, - /* sp ! " # $ % & ' ( ) * + , - . / */ - ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, - /* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */ - ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, - /* @ A B C D E F G H I J K L M N O */ - ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, - /* P Q R S T U V W X Y Z [ \ ] ^ _ */ - ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, - /* ` a b c d e f g h i j k l m n o */ - ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, - /* p q r s t u v w x y z { | } ~ del */ - ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, -}; - - -# define NOCHAR -1 /* signal nothing in lookahead token */ - -char ** -prescan(addr, delim, pvpbuf, pvpbsize, delimptr, toktab) - char *addr; - int delim; - char pvpbuf[]; - int pvpbsize; - char **delimptr; - u_char *toktab; -{ - register char *p; - register char *q; - register int c; - char **avp; - bool bslashmode; - bool route_syntax; - int cmntcnt; - int anglecnt; - char *tok; - int state; - int newstate; - char *saveto = CurEnv->e_to; - static char *av[MAXATOM+1]; - static char firsttime = TRUE; - extern int errno; - - if (firsttime) - { - /* initialize the token type table */ - char obuf[50]; - - firsttime = FALSE; - if (OperatorChars == NULL) - { - if (ConfigLevel < 7) - OperatorChars = macvalue('o', CurEnv); - if (OperatorChars == NULL) - OperatorChars = ".:@[]"; - } - expand(OperatorChars, obuf, sizeof obuf - sizeof DELIMCHARS, CurEnv); - strcat(obuf, DELIMCHARS); - for (p = obuf; *p != '\0'; p++) - { - if (TokTypeTab[*p & 0xff] == ATM) - TokTypeTab[*p & 0xff] = OPR; - } - } - if (toktab == NULL) - toktab = TokTypeTab; - - /* make sure error messages don't have garbage on them */ - errno = 0; - - q = pvpbuf; - bslashmode = FALSE; - route_syntax = FALSE; - cmntcnt = 0; - anglecnt = 0; - avp = av; - state = ATM; - c = NOCHAR; - p = addr; - CurEnv->e_to = p; - if (tTd(22, 11)) - { - printf("prescan: "); - xputs(p); - (void) putchar('\n'); - } - - do - { - /* read a token */ - tok = q; - for (;;) - { - /* store away any old lookahead character */ - if (c != NOCHAR && !bslashmode) - { - /* see if there is room */ - if (q >= &pvpbuf[pvpbsize - 5]) - { - usrerr("553 Address too long"); - if (strlen(addr) > (SIZE_T) MAXNAME) - addr[MAXNAME] = '\0'; - returnnull: - if (delimptr != NULL) - *delimptr = p; - CurEnv->e_to = saveto; - return (NULL); - } - - /* squirrel it away */ - *q++ = c; - } - - /* read a new input character */ - c = *p++; - if (c == '\0') - { - /* diagnose and patch up bad syntax */ - if (state == QST) - { - usrerr("653 Unbalanced '\"'"); - c = '"'; - } - else if (cmntcnt > 0) - { - usrerr("653 Unbalanced '('"); - c = ')'; - } - else if (anglecnt > 0) - { - c = '>'; - usrerr("653 Unbalanced '<'"); - } - else - break; - - p--; - } - else if (c == delim && cmntcnt <= 0 && state != QST) - { - if (anglecnt <= 0) - break; - - /* special case for better error management */ - if (delim == ',' && !route_syntax) - { - usrerr("653 Unbalanced '<'"); - c = '>'; - p--; - } - } - - if (tTd(22, 101)) - printf("c=%c, s=%d; ", c, state); - - /* chew up special characters */ - *q = '\0'; - if (bslashmode) - { - bslashmode = FALSE; - - /* kludge \! for naive users */ - if (cmntcnt > 0) - { - c = NOCHAR; - continue; - } - else if (c != '!' || state == QST) - { - *q++ = '\\'; - continue; - } - } - - if (c == '\\') - { - bslashmode = TRUE; - } - else if (state == QST) - { - /* do nothing, just avoid next clauses */ - } - else if (c == '(') - { - cmntcnt++; - c = NOCHAR; - } - else if (c == ')') - { - if (cmntcnt <= 0) - { - usrerr("653 Unbalanced ')'"); - c = NOCHAR; - } - else - cmntcnt--; - } - else if (cmntcnt > 0) - c = NOCHAR; - else if (c == '<') - { - char *q = p; - - anglecnt++; - while (isascii(*q) && isspace(*q)) - q++; - if (*q == '@') - route_syntax = TRUE; - } - else if (c == '>') - { - if (anglecnt <= 0) - { - usrerr("653 Unbalanced '>'"); - c = NOCHAR; - } - else - anglecnt--; - route_syntax = FALSE; - } - else if (delim == ' ' && isascii(c) && isspace(c)) - c = ' '; - - if (c == NOCHAR) - continue; - - /* see if this is end of input */ - if (c == delim && anglecnt <= 0 && state != QST) - break; - - newstate = StateTab[state][toktab[c & 0xff]]; - if (tTd(22, 101)) - printf("ns=%02o\n", newstate); - state = newstate & TYPE; - if (state == ILL) - { - if (isascii(c) && isprint(c)) - usrerr("653 Illegal character %c", c); - else - usrerr("653 Illegal character 0x%02x", c); - } - if (bitset(M, newstate)) - c = NOCHAR; - if (bitset(B, newstate)) - break; - } - - /* new token */ - if (tok != q) - { - *q++ = '\0'; - if (tTd(22, 36)) - { - printf("tok="); - xputs(tok); - (void) putchar('\n'); - } - if (avp >= &av[MAXATOM]) - { - usrerr("553 prescan: too many tokens"); - goto returnnull; - } - if (q - tok > MAXNAME) - { - usrerr("553 prescan: token too long"); - goto returnnull; - } - *avp++ = tok; - } - } while (c != '\0' && (c != delim || anglecnt > 0)); - *avp = NULL; - p--; - if (delimptr != NULL) - *delimptr = p; - if (tTd(22, 12)) - { - printf("prescan==>"); - printav(av); - } - CurEnv->e_to = saveto; - if (av[0] == NULL) - { - if (tTd(22, 1)) - printf("prescan: null leading token\n"); - return (NULL); - } - return (av); -} -/* -** REWRITE -- apply rewrite rules to token vector. -** -** This routine is an ordered production system. Each rewrite -** rule has a LHS (called the pattern) and a RHS (called the -** rewrite); 'rwr' points the the current rewrite rule. -** -** For each rewrite rule, 'avp' points the address vector we -** are trying to match against, and 'pvp' points to the pattern. -** If pvp points to a special match value (MATCHZANY, MATCHANY, -** MATCHONE, MATCHCLASS, MATCHNCLASS) then the address in avp -** matched is saved away in the match vector (pointed to by 'mvp'). -** -** When a match between avp & pvp does not match, we try to -** back out. If we back up over MATCHONE, MATCHCLASS, or MATCHNCLASS -** we must also back out the match in mvp. If we reach a -** MATCHANY or MATCHZANY we just extend the match and start -** over again. -** -** When we finally match, we rewrite the address vector -** and try over again. -** -** Parameters: -** pvp -- pointer to token vector. -** ruleset -- the ruleset to use for rewriting. -** reclevel -- recursion level (to catch loops). -** e -- the current envelope. -** -** Returns: -** A status code. If EX_TEMPFAIL, higher level code should -** attempt recovery. -** -** Side Effects: -** pvp is modified. -*/ - -struct match -{ - char **first; /* first token matched */ - char **last; /* last token matched */ - char **pattern; /* pointer to pattern */ -}; - -# define MAXMATCH 9 /* max params per rewrite */ - - -int -rewrite(pvp, ruleset, reclevel, e) - char **pvp; - int ruleset; - int reclevel; - register ENVELOPE *e; -{ - register char *ap; /* address pointer */ - register char *rp; /* rewrite pointer */ - register char **avp; /* address vector pointer */ - register char **rvp; /* rewrite vector pointer */ - register struct match *mlp; /* cur ptr into mlist */ - register struct rewrite *rwr; /* pointer to current rewrite rule */ - int ruleno; /* current rule number */ - int rstat = EX_OK; /* return status */ - int loopcount; - struct match mlist[MAXMATCH]; /* stores match on LHS */ - char *npvp[MAXATOM+1]; /* temporary space for rebuild */ - char buf[MAXLINE]; - extern int callsubr __P((char**, int, ENVELOPE *)); - extern int sm_strcasecmp __P((char *, char *)); - - if (OpMode == MD_TEST || tTd(21, 1)) - { - printf("rewrite: ruleset %3d input:", ruleset); - printav(pvp); - } - if (ruleset < 0 || ruleset >= MAXRWSETS) - { - syserr("554 rewrite: illegal ruleset number %d", ruleset); - return EX_CONFIG; - } - if (reclevel++ > MaxRuleRecursion) - { - syserr("rewrite: excessive recursion (max %d), ruleset %d", - MaxRuleRecursion, ruleset); - return EX_CONFIG; - } - if (pvp == NULL) - return EX_USAGE; - - /* - ** Run through the list of rewrite rules, applying - ** any that match. - */ - - ruleno = 1; - loopcount = 0; - for (rwr = RewriteRules[ruleset]; rwr != NULL; ) - { - int stat; - - /* if already canonical, quit now */ - if (pvp[0] != NULL && (pvp[0][0] & 0377) == CANONNET) - break; - - if (tTd(21, 12)) - { - printf("-----trying rule:"); - printav(rwr->r_lhs); - } - - /* try to match on this rule */ - mlp = mlist; - rvp = rwr->r_lhs; - avp = pvp; - if (++loopcount > 100) - { - syserr("554 Infinite loop in ruleset %d, rule %d", - ruleset, ruleno); - if (tTd(21, 1)) - { - printf("workspace: "); - printav(pvp); - } - break; - } - - while ((ap = *avp) != NULL || *rvp != NULL) - { - rp = *rvp; - if (tTd(21, 35)) - { - printf("ADVANCE rp="); - xputs(rp); - printf(", ap="); - xputs(ap); - printf("\n"); - } - if (rp == NULL) - { - /* end-of-pattern before end-of-address */ - goto backup; - } - if (ap == NULL && (*rp & 0377) != MATCHZANY && - (*rp & 0377) != MATCHZERO) - { - /* end-of-input with patterns left */ - goto backup; - } - - switch (*rp & 0377) - { - case MATCHCLASS: - /* match any phrase in a class */ - mlp->pattern = rvp; - mlp->first = avp; - extendclass: - ap = *avp; - if (ap == NULL) - goto backup; - mlp->last = avp++; - cataddr(mlp->first, mlp->last, buf, sizeof buf, '\0'); - if (!wordinclass(buf, rp[1])) - { - if (tTd(21, 36)) - { - printf("EXTEND rp="); - xputs(rp); - printf(", ap="); - xputs(ap); - printf("\n"); - } - goto extendclass; - } - if (tTd(21, 36)) - printf("CLMATCH\n"); - mlp++; - break; - - case MATCHNCLASS: - /* match any token not in a class */ - if (wordinclass(ap, rp[1])) - goto backup; - - /* fall through */ - - case MATCHONE: - case MATCHANY: - /* match exactly one token */ - mlp->pattern = rvp; - mlp->first = avp; - mlp->last = avp++; - mlp++; - break; - - case MATCHZANY: - /* match zero or more tokens */ - mlp->pattern = rvp; - mlp->first = avp; - mlp->last = avp - 1; - mlp++; - break; - - case MATCHZERO: - /* match zero tokens */ - break; - - case MACRODEXPAND: - /* - ** Match against run-time macro. - ** This algorithm is broken for the - ** general case (no recursive macros, - ** improper tokenization) but should - ** work for the usual cases. - */ - - ap = macvalue(rp[1], e); - mlp->first = avp; - if (tTd(21, 2)) - printf("rewrite: LHS $&%s => \"%s\"\n", - macname(rp[1]), - ap == NULL ? "(NULL)" : ap); - - if (ap == NULL) - break; - while (*ap != '\0') - { - if (*avp == NULL || - strncasecmp(ap, *avp, strlen(*avp)) != 0) - { - /* no match */ - avp = mlp->first; - goto backup; - } - ap += strlen(*avp++); - } - - /* match */ - break; - - default: - /* must have exact match */ - if (sm_strcasecmp(rp, ap)) - goto backup; - avp++; - break; - } - - /* successful match on this token */ - rvp++; - continue; - - backup: - /* match failed -- back up */ - while (--mlp >= mlist) - { - rvp = mlp->pattern; - rp = *rvp; - avp = mlp->last + 1; - ap = *avp; - - if (tTd(21, 36)) - { - printf("BACKUP rp="); - xputs(rp); - printf(", ap="); - xputs(ap); - printf("\n"); - } - - if (ap == NULL) - { - /* run off the end -- back up again */ - continue; - } - if ((*rp & 0377) == MATCHANY || - (*rp & 0377) == MATCHZANY) - { - /* extend binding and continue */ - mlp->last = avp++; - rvp++; - mlp++; - break; - } - if ((*rp & 0377) == MATCHCLASS) - { - /* extend binding and try again */ - mlp->last = avp; - goto extendclass; - } - } - - if (mlp < mlist) - { - /* total failure to match */ - break; - } - } - - /* - ** See if we successfully matched - */ - - if (mlp < mlist || *rvp != NULL) - { - if (tTd(21, 10)) - printf("----- rule fails\n"); - rwr = rwr->r_next; - ruleno++; - loopcount = 0; - continue; - } - - rvp = rwr->r_rhs; - if (tTd(21, 12)) - { - printf("-----rule matches:"); - printav(rvp); - } - - rp = *rvp; - if ((*rp & 0377) == CANONUSER) - { - rvp++; - rwr = rwr->r_next; - ruleno++; - loopcount = 0; - } - else if ((*rp & 0377) == CANONHOST) - { - rvp++; - rwr = NULL; - } - - /* substitute */ - for (avp = npvp; *rvp != NULL; rvp++) - { - register struct match *m; - register char **pp; - - rp = *rvp; - if ((*rp & 0377) == MATCHREPL) - { - /* substitute from LHS */ - m = &mlist[rp[1] - '1']; - if (m < mlist || m >= mlp) - { - syserr("554 rewrite: ruleset %d: replacement $%c out of bounds", - ruleset, rp[1]); - return EX_CONFIG; - } - if (tTd(21, 15)) - { - printf("$%c:", rp[1]); - pp = m->first; - while (pp <= m->last) - { - printf(" %lx=\"", (u_long) *pp); - (void) fflush(stdout); - printf("%s\"", *pp++); - } - printf("\n"); - } - pp = m->first; - while (pp <= m->last) - { - if (avp >= &npvp[MAXATOM]) - { - syserr("554 rewrite: expansion too long"); - return EX_DATAERR; - } - *avp++ = *pp++; - } - } - else - { - /* some sort of replacement */ - if (avp >= &npvp[MAXATOM]) - { - toolong: - syserr("554 rewrite: expansion too long"); - return EX_DATAERR; - } - if ((*rp & 0377) != MACRODEXPAND) - { - /* vanilla replacement */ - *avp++ = rp; - } - else - { - /* $&x replacement */ - char *mval = macvalue(rp[1], e); - char **xpvp; - int trsize = 0; - static size_t pvpb1_size = 0; - static char **pvpb1 = NULL; - char pvpbuf[PSBUFSIZE]; - - if (tTd(21, 2)) - printf("rewrite: RHS $&%s => \"%s\"\n", - macname(rp[1]), - mval == NULL ? "(NULL)" : mval); - if (mval == NULL || *mval == '\0') - continue; - - /* save the remainder of the input */ - for (xpvp = pvp; *xpvp != NULL; xpvp++) - trsize += sizeof *xpvp; - if (trsize > pvpb1_size) - { - if (pvpb1 != NULL) - free(pvpb1); - pvpb1 = (char **)xalloc(trsize); - pvpb1_size = trsize; - } - - bcopy((char *) pvp, (char *) pvpb1, trsize); - - /* scan the new replacement */ - xpvp = prescan(mval, '\0', pvpbuf, - sizeof pvpbuf, NULL, NULL); - if (xpvp == NULL) - { - /* prescan pre-printed error */ - return EX_DATAERR; - } - - /* insert it into the output stream */ - while (*xpvp != NULL) - { - if (tTd(21, 19)) - printf(" ... %s\n", *xpvp); - *avp++ = newstr(*xpvp); - if (avp >= &npvp[MAXATOM]) - goto toolong; - xpvp++; - } - if (tTd(21, 19)) - printf(" ... DONE\n"); - - /* restore the old trailing input */ - bcopy((char *) pvpb1, (char *) pvp, trsize); - } - } - } - *avp++ = NULL; - - /* - ** Check for any hostname/keyword lookups. - */ - - for (rvp = npvp; *rvp != NULL; rvp++) - { - char **hbrvp; - char **xpvp; - int trsize; - char *replac; - int endtoken; - STAB *map; - char *mapname; - char **key_rvp; - char **arg_rvp; - char **default_rvp; - char buf[MAXNAME + 1]; - char *pvpb1[MAXATOM + 1]; - char *argvect[10]; - char pvpbuf[PSBUFSIZE]; - char *nullpvp[1]; - extern char *map_lookup __P((STAB *, char *, char **, int *, ENVELOPE *)); - - if ((**rvp & 0377) != HOSTBEGIN && - (**rvp & 0377) != LOOKUPBEGIN) - continue; - - /* - ** Got a hostname/keyword lookup. - ** - ** This could be optimized fairly easily. - */ - - hbrvp = rvp; - if ((**rvp & 0377) == HOSTBEGIN) - { - endtoken = HOSTEND; - mapname = "host"; - } - else - { - endtoken = LOOKUPEND; - mapname = *++rvp; - } - map = stab(mapname, ST_MAP, ST_FIND); - if (map == NULL) - syserr("554 rewrite: map %s not found", mapname); - - /* extract the match part */ - key_rvp = ++rvp; - default_rvp = NULL; - arg_rvp = argvect; - xpvp = NULL; - replac = pvpbuf; - while (*rvp != NULL && (**rvp & 0377) != endtoken) - { - int nodetype = **rvp & 0377; - - if (nodetype != CANONHOST && nodetype != CANONUSER) - { - rvp++; - continue; - } - - *rvp++ = NULL; - - if (xpvp != NULL) - { - cataddr(xpvp, NULL, replac, - &pvpbuf[sizeof pvpbuf] - replac, - '\0'); - *++arg_rvp = replac; - replac += strlen(replac) + 1; - xpvp = NULL; - } - switch (nodetype) - { - case CANONHOST: - xpvp = rvp; - break; - - case CANONUSER: - default_rvp = rvp; - break; - } - } - if (*rvp != NULL) - *rvp++ = NULL; - if (xpvp != NULL) - { - cataddr(xpvp, NULL, replac, - &pvpbuf[sizeof pvpbuf] - replac, - '\0'); - *++arg_rvp = replac; - } - *++arg_rvp = NULL; - - /* save the remainder of the input string */ - trsize = (int) (avp - rvp + 1) * sizeof *rvp; - bcopy((char *) rvp, (char *) pvpb1, trsize); - - /* look it up */ - cataddr(key_rvp, NULL, buf, sizeof buf, '\0'); - argvect[0] = buf; - replac = map_lookup(map, buf, argvect, &rstat, e); - - /* if no replacement, use default */ - if (replac == NULL && default_rvp != NULL) - { - /* create the default */ - cataddr(default_rvp, NULL, buf, sizeof buf, '\0'); - replac = buf; - } - - if (replac == NULL) - { - xpvp = key_rvp; - } - else if (*replac == '\0') - { - /* null replacement */ - nullpvp[0] = NULL; - xpvp = nullpvp; - } - else - { - /* scan the new replacement */ - xpvp = prescan(replac, '\0', pvpbuf, - sizeof pvpbuf, NULL, NULL); - if (xpvp == NULL) - { - /* prescan already printed error */ - return EX_DATAERR; - } - } - - /* append it to the token list */ - for (avp = hbrvp; *xpvp != NULL; xpvp++) - { - *avp++ = newstr(*xpvp); - if (avp >= &npvp[MAXATOM]) - goto toolong; - } - - /* restore the old trailing information */ - rvp = avp - 1; - for (xpvp = pvpb1; (*avp++ = *xpvp++) != NULL; ) - if (avp >= &npvp[MAXATOM]) - goto toolong; - } - - /* - ** Check for subroutine calls. - */ - - stat = callsubr(npvp, reclevel, e); - if (rstat == EX_OK || stat == EX_TEMPFAIL) - rstat = stat; - - /* copy vector back into original space. */ - for (avp = npvp; *avp++ != NULL;) - continue; - bcopy((char *) npvp, (char *) pvp, - (int) (avp - npvp) * sizeof *avp); - - if (tTd(21, 4)) - { - printf("rewritten as:"); - printav(pvp); - } - } - - if (OpMode == MD_TEST || tTd(21, 1)) - { - printf("rewrite: ruleset %3d returns:", ruleset); - printav(pvp); - } - - return rstat; -} -/* -** CALLSUBR -- call subroutines in rewrite vector -** -** Parameters: -** pvp -- pointer to token vector. -** reclevel -- the current recursion level. -** e -- the current envelope. -** -** Returns: -** The status from the subroutine call. -** -** Side Effects: -** pvp is modified. -*/ - -int -callsubr(pvp, reclevel, e) - char **pvp; - int reclevel; - ENVELOPE *e; -{ - char **avp; - char **rvp; - register int i; - int subr; - int stat; - int rstat = EX_OK; - char *tpvp[MAXATOM + 1]; - - for (avp = pvp; *avp != NULL; avp++) - { - if ((**avp & 0377) == CALLSUBR && avp[1] != NULL) - { - stripquotes(avp[1]); - subr = strtorwset(avp[1], NULL, ST_FIND); - if (subr < 0) - { - syserr("Unknown ruleset %s", avp[1]); - return EX_CONFIG; - } - - if (tTd(21, 3)) - printf("-----callsubr %s (%d)\n", avp[1], subr); - - /* - ** Take care of possible inner calls first. - ** use a full size temporary buffer to avoid - ** overflows in rewrite, but strip off the - ** subroutine call. - */ - - for (i = 2; avp[i] != NULL; i++) - tpvp[i - 2] = avp[i]; - tpvp[i - 2] = NULL; - - stat = callsubr(tpvp, reclevel, e); - if (rstat == EX_OK || stat == EX_TEMPFAIL) - rstat = stat; - - /* - ** Now we need to call the ruleset specified for - ** the subroutine. we can do this with the - ** temporary buffer that we set up earlier, - ** since it has all the data we want to rewrite. - */ - - stat = rewrite(tpvp, subr, reclevel, e); - if (rstat == EX_OK || stat == EX_TEMPFAIL) - rstat = stat; - - /* - ** Find length of tpvp and current offset into - ** pvp, if the total is greater than MAXATOM, - ** then it would overflow the buffer if we copied - ** it back in to pvp, in which case we throw a - ** fit. - */ - - for (rvp = tpvp; *rvp != NULL; rvp++) - continue; - if (((rvp - tpvp) + (avp - pvp)) > MAXATOM) - { - syserr("554 callsubr: expansion too long"); - return EX_DATAERR; - } - - /* - ** Now we can copy the rewritten code over - ** the initial subroutine call in the buffer. - */ - - for (i = 0; tpvp[i] != NULL; i++) - avp[i] = tpvp[i]; - avp[i] = NULL; - - /* - ** If we got this far, we've processed the left - ** most subroutine, and recursively called ourselves - ** to handle any other subroutines. We're done. - */ - - break; - } - } - return rstat; -} -/* -** MAP_LOOKUP -- do lookup in map -** -** Parameters: -** map -- the map to use for the lookup. -** key -- the key to look up. -** argvect -- arguments to pass to the map lookup. -** pstat -- a pointer to an integer in which to store the -** status from the lookup. -** e -- the current envelope. -** -** Returns: -** The result of the lookup. -** NULL -- if there was no data for the given key. -*/ - -char * -map_lookup(map, key, argvect, pstat, e) - STAB *map; - char key[]; - char **argvect; - int *pstat; - ENVELOPE *e; -{ - auto int stat = EX_OK; - char *replac; - - if (e->e_sendmode == SM_DEFER) - { - /* don't do any map lookups */ - if (tTd(60, 1)) - printf("map_lookup(%s, %s) => DEFERRED\n", - map->s_name, key); - *pstat = EX_TEMPFAIL; - return NULL; - } - if (map == NULL || !bitset(MF_OPEN, map->s_map.map_mflags)) - return NULL; - - if (!bitset(MF_KEEPQUOTES, map->s_map.map_mflags)) - stripquotes(key); - - /* XXX should try to auto-open the map here */ - - if (tTd(60, 1)) - { - printf("map_lookup(%s, %s", map->s_name, key); - if (tTd(60, 5)) - { - int i; - - for (i = 0; argvect[i] != NULL; i++) - printf(", %%%d=%s", i, argvect[i]); - } - printf(") => "); - } - replac = (*map->s_map.map_class->map_lookup)(&map->s_map, - key, argvect, &stat); - if (tTd(60, 1)) - printf("%s (%d)\n", - replac != NULL ? replac : "NOT FOUND", - stat); - - /* should recover if stat == EX_TEMPFAIL */ - if (stat == EX_TEMPFAIL && !bitset(MF_NODEFER, map->s_map.map_mflags)) - { - *pstat = EX_TEMPFAIL; - if (tTd(60, 1)) - printf("map_lookup(%s, %s) tempfail: errno=%d\n", - map->s_name, key, errno); - if (e->e_message == NULL) - { - char mbuf[320]; - - snprintf(mbuf, sizeof mbuf, - "%.80s map: lookup (%s): deferred", - map->s_name, - shortenstring(key, MAXSHORTSTR)); - e->e_message = newstr(mbuf); - } - } - if (stat == EX_TEMPFAIL && map->s_map.map_tapp != NULL) - { - size_t i = strlen(key) + strlen(map->s_map.map_tapp) + 1; - static char *rwbuf = NULL; - static size_t rwbuflen = 0; - - if (i > rwbuflen) - { - if (rwbuf != NULL) - free(rwbuf); - rwbuflen = i; - rwbuf = (char *) xalloc(rwbuflen); - } - snprintf(rwbuf, rwbuflen, "%s%s", key, map->s_map.map_tapp); - if (tTd(60, 4)) - printf("map_lookup tempfail: returning \"%s\"\n", - rwbuf); - return rwbuf; - } - return replac; -} -/* -** BUILDADDR -- build address from token vector. -** -** Parameters: -** tv -- token vector. -** a -- pointer to address descriptor to fill. -** If NULL, one will be allocated. -** flags -- info regarding whether this is a sender or -** a recipient. -** e -- the current envelope. -** -** Returns: -** NULL if there was an error. -** 'a' otherwise. -** -** Side Effects: -** fills in 'a' -*/ - -struct errcodes -{ - char *ec_name; /* name of error code */ - int ec_code; /* numeric code */ -} ErrorCodes[] = -{ - { "usage", EX_USAGE }, - { "nouser", EX_NOUSER }, - { "nohost", EX_NOHOST }, - { "unavailable", EX_UNAVAILABLE }, - { "software", EX_SOFTWARE }, - { "tempfail", EX_TEMPFAIL }, - { "protocol", EX_PROTOCOL }, -#ifdef EX_CONFIG - { "config", EX_CONFIG }, -#endif - { NULL, EX_UNAVAILABLE } -}; - -ADDRESS * -buildaddr(tv, a, flags, e) - register char **tv; - register ADDRESS *a; - int flags; - register ENVELOPE *e; -{ - struct mailer **mp; - register struct mailer *m; - register char *p; - char *mname; - char **hostp; - char hbuf[MAXNAME + 1]; - static MAILER discardmailer; - static MAILER errormailer; - static char *discardargv[] = { "DISCARD", NULL }; - static char *errorargv[] = { "ERROR", NULL }; - static char ubuf[MAXNAME + 2]; - - if (tTd(24, 5)) - { - printf("buildaddr, flags=%x, tv=", flags); - printav(tv); - } - - if (a == NULL) - a = (ADDRESS *) xalloc(sizeof *a); - bzero((char *) a, sizeof *a); - - /* set up default error return flags */ - a->q_flags |= DefaultNotify; - - if (discardmailer.m_name == NULL) - { - /* initialize the discard mailer */ - discardmailer.m_name = "*discard*"; - discardmailer.m_mailer = "DISCARD"; - discardmailer.m_argv = discardargv; - } - - /* figure out what net/mailer to use */ - if (*tv == NULL || (**tv & 0377) != CANONNET) - { - syserr("554 buildaddr: no mailer in parsed address"); -badaddr: - a->q_flags |= QBADADDR; - a->q_mailer = &errormailer; - if (errormailer.m_name == NULL) - { - /* initialize the bogus mailer */ - errormailer.m_name = "*error*"; - errormailer.m_mailer = "ERROR"; - errormailer.m_argv = errorargv; - } - return a; - } - mname = *++tv; - - /* extract host and user portions */ - if (*++tv != NULL && (**tv & 0377) == CANONHOST) - hostp = ++tv; - else - hostp = NULL; - while (*tv != NULL && (**tv & 0377) != CANONUSER) - tv++; - if (*tv == NULL) - { - syserr("554 buildaddr: no user"); - goto badaddr; - } - if (tv == hostp) - hostp = NULL; - else if (hostp != NULL) - cataddr(hostp, tv - 1, hbuf, sizeof hbuf, '\0'); - cataddr(++tv, NULL, ubuf, sizeof ubuf, ' '); - - /* save away the host name */ - if (strcasecmp(mname, "error") == 0) - { - if (hostp != NULL) - { - register struct errcodes *ep; - - if (strchr(hbuf, '.') != NULL) - { - extern int dsntoexitstat __P((char *)); - - a->q_status = newstr(hbuf); - setstat(dsntoexitstat(hbuf)); - } - else if (isascii(hbuf[0]) && isdigit(hbuf[0])) - { - setstat(atoi(hbuf)); - } - else - { - for (ep = ErrorCodes; ep->ec_name != NULL; ep++) - if (strcasecmp(ep->ec_name, hbuf) == 0) - break; - setstat(ep->ec_code); - } - } - else - setstat(EX_UNAVAILABLE); - stripquotes(ubuf); - if (isascii(ubuf[0]) && isdigit(ubuf[0]) && - isascii(ubuf[1]) && isdigit(ubuf[1]) && - isascii(ubuf[2]) && isdigit(ubuf[2]) && - ubuf[3] == ' ') - { - char fmt[10]; - - strncpy(fmt, ubuf, 3); - strcpy(&fmt[3], " %s"); - usrerr(fmt, ubuf + 4); - - /* - ** If this is a 4xx code and we aren't running - ** SMTP on our input, bounce this message; - ** otherwise it disappears without a trace. - */ - - if (fmt[0] == '4' && OpMode != MD_SMTP && - OpMode != MD_DAEMON) - { - e->e_flags |= EF_FATALERRS; - } - } - else - { - usrerr("553 %s", ubuf); - } - goto badaddr; - } - - for (mp = Mailer; (m = *mp++) != NULL; ) - { - if (strcasecmp(m->m_name, mname) == 0) - break; - } - if (m == NULL) - { - syserr("554 buildaddr: unknown mailer %s", mname); - goto badaddr; - } - a->q_mailer = m; - - /* figure out what host (if any) */ - if (hostp == NULL) - { - if (!bitnset(M_LOCALMAILER, m->m_flags)) - { - syserr("554 buildaddr: no host"); - goto badaddr; - } - a->q_host = NULL; - } - else - a->q_host = newstr(hbuf); - - /* figure out the user */ - p = ubuf; - if (bitnset(M_CHECKUDB, m->m_flags) && *p == '@') - { - p++; - tv++; - a->q_flags |= QNOTREMOTE; - } - - /* do special mapping for local mailer */ - if (*p == '"') - p++; - if (*p == '|' && bitnset(M_CHECKPROG, m->m_flags)) - a->q_mailer = m = ProgMailer; - else if (*p == '/' && bitnset(M_CHECKFILE, m->m_flags)) - a->q_mailer = m = FileMailer; - else if (*p == ':' && bitnset(M_CHECKINCLUDE, m->m_flags)) - { - /* may be :include: */ - stripquotes(ubuf); - if (strncasecmp(ubuf, ":include:", 9) == 0) - { - /* if :include:, don't need further rewriting */ - a->q_mailer = m = InclMailer; - a->q_user = newstr(&ubuf[9]); - return a; - } - } - - /* rewrite according recipient mailer rewriting rules */ - define('h', a->q_host, e); - if (!bitset(RF_SENDERADDR|RF_HEADERADDR, flags)) - { - /* sender addresses done later */ - (void) rewrite(tv, 2, 0, e); - if (m->m_re_rwset > 0) - (void) rewrite(tv, m->m_re_rwset, 0, e); - } - (void) rewrite(tv, 4, 0, e); - - /* save the result for the command line/RCPT argument */ - cataddr(tv, NULL, ubuf, sizeof ubuf, '\0'); - a->q_user = ubuf; - - /* - ** Do mapping to lower case as requested by mailer - */ - - if (a->q_host != NULL && !bitnset(M_HST_UPPER, m->m_flags)) - makelower(a->q_host); - if (!bitnset(M_USR_UPPER, m->m_flags)) - makelower(a->q_user); - - if (tTd(24, 6)) - { - printf("buildaddr => "); - printaddr(a, FALSE); - } - return a; -} -/* -** CATADDR -- concatenate pieces of addresses (putting in <LWSP> subs) -** -** Parameters: -** pvp -- parameter vector to rebuild. -** evp -- last parameter to include. Can be NULL to -** use entire pvp. -** buf -- buffer to build the string into. -** sz -- size of buf. -** spacesub -- the space separator character; if null, -** use SpaceSub. -** -** Returns: -** none. -** -** Side Effects: -** Destroys buf. -*/ - -void -cataddr(pvp, evp, buf, sz, spacesub) - char **pvp; - char **evp; - char *buf; - register int sz; - int spacesub; -{ - bool oatomtok = FALSE; - bool natomtok = FALSE; - register int i; - register char *p; - - if (spacesub == '\0') - spacesub = SpaceSub; - - if (pvp == NULL) - { - (void) strcpy(buf, ""); - return; - } - p = buf; - sz -= 2; - while (*pvp != NULL && (i = strlen(*pvp)) < sz) - { - natomtok = (TokTypeTab[**pvp & 0xff] == ATM); - if (oatomtok && natomtok) - *p++ = spacesub; - (void) strcpy(p, *pvp); - oatomtok = natomtok; - p += i; - sz -= i + 1; - if (pvp++ == evp) - break; - } - *p = '\0'; -} -/* -** SAMEADDR -- Determine if two addresses are the same -** -** This is not just a straight comparison -- if the mailer doesn't -** care about the host we just ignore it, etc. -** -** Parameters: -** a, b -- pointers to the internal forms to compare. -** -** Returns: -** TRUE -- they represent the same mailbox. -** FALSE -- they don't. -** -** Side Effects: -** none. -*/ - -bool -sameaddr(a, b) - register ADDRESS *a; - register ADDRESS *b; -{ - register ADDRESS *ca, *cb; - - /* if they don't have the same mailer, forget it */ - if (a->q_mailer != b->q_mailer) - return (FALSE); - - /* if the user isn't the same, we can drop out */ - if (strcmp(a->q_user, b->q_user) != 0) - return (FALSE); - - /* if we have good uids for both but they differ, these are different */ - if (a->q_mailer == ProgMailer) - { - ca = getctladdr(a); - cb = getctladdr(b); - if (ca != NULL && cb != NULL && - bitset(QGOODUID, ca->q_flags & cb->q_flags) && - ca->q_uid != cb->q_uid) - return (FALSE); - } - - /* otherwise compare hosts (but be careful for NULL ptrs) */ - if (a->q_host == b->q_host) - { - /* probably both null pointers */ - return (TRUE); - } - if (a->q_host == NULL || b->q_host == NULL) - { - /* only one is a null pointer */ - return (FALSE); - } - if (strcmp(a->q_host, b->q_host) != 0) - return (FALSE); - - return (TRUE); -} -/* -** PRINTADDR -- print address (for debugging) -** -** Parameters: -** a -- the address to print -** follow -- follow the q_next chain. -** -** Returns: -** none. -** -** Side Effects: -** none. -*/ - -struct qflags -{ - char *qf_name; - u_long qf_bit; -}; - -struct qflags AddressFlags[] = -{ - { "QDONTSEND", QDONTSEND }, - { "QBADADDR", QBADADDR }, - { "QGOODUID", QGOODUID }, - { "QPRIMARY", QPRIMARY }, - { "QQUEUEUP", QQUEUEUP }, - { "QSENT", QSENT }, - { "QNOTREMOTE", QNOTREMOTE }, - { "QSELFREF", QSELFREF }, - { "QVERIFIED", QVERIFIED }, - { "QBOGUSSHELL", QBOGUSSHELL }, - { "QUNSAFEADDR", QUNSAFEADDR }, - { "QPINGONSUCCESS", QPINGONSUCCESS }, - { "QPINGONFAILURE", QPINGONFAILURE }, - { "QPINGONDELAY", QPINGONDELAY }, - { "QHASNOTIFY", QHASNOTIFY }, - { "QRELAYED", QRELAYED }, - { "QEXPANDED", QEXPANDED }, - { "QDELIVERED", QDELIVERED }, - { "QDELAYED", QDELAYED }, - { "QTHISPASS", QTHISPASS }, - { "QRCPTOK", QRCPTOK }, - { NULL } -}; - -void -printaddr(a, follow) - register ADDRESS *a; - bool follow; -{ - register MAILER *m; - MAILER pseudomailer; - register struct qflags *qfp; - bool firstone; - - if (a == NULL) - { - printf("[NULL]\n"); - return; - } - - while (a != NULL) - { - printf("%lx=", (u_long) a); - (void) fflush(stdout); - - /* find the mailer -- carefully */ - m = a->q_mailer; - if (m == NULL) - { - m = &pseudomailer; - m->m_mno = -1; - m->m_name = "NULL"; - } - - printf("%s:\n\tmailer %d (%s), host `%s'\n", - a->q_paddr == NULL ? "<null>" : a->q_paddr, - m->m_mno, m->m_name, - a->q_host == NULL ? "<null>" : a->q_host); - printf("\tuser `%s', ruser `%s'\n", - a->q_user, - a->q_ruser == NULL ? "<null>" : a->q_ruser); - printf("\tnext=%lx, alias %lx, uid %d, gid %d\n", - (u_long) a->q_next, (u_long) a->q_alias, - (int) a->q_uid, (int) a->q_gid); - printf("\tflags=%lx<", a->q_flags); - firstone = TRUE; - for (qfp = AddressFlags; qfp->qf_name != NULL; qfp++) - { - if (!bitset(qfp->qf_bit, a->q_flags)) - continue; - if (!firstone) - printf(","); - firstone = FALSE; - printf("%s", qfp->qf_name); - } - printf(">\n"); - printf("\towner=%s, home=\"%s\", fullname=\"%s\"\n", - a->q_owner == NULL ? "(none)" : a->q_owner, - a->q_home == NULL ? "(none)" : a->q_home, - a->q_fullname == NULL ? "(none)" : a->q_fullname); - printf("\torcpt=\"%s\", statmta=%s, status=%s\n", - a->q_orcpt == NULL ? "(none)" : a->q_orcpt, - a->q_statmta == NULL ? "(none)" : a->q_statmta, - a->q_status == NULL ? "(none)" : a->q_status); - printf("\trstatus=\"%s\"\n", - a->q_rstatus == NULL ? "(none)" : a->q_rstatus); - printf("\tspecificity=%d, statdate=%s\n", - a->q_specificity, ctime(&a->q_statdate)); - - if (!follow) - return; - a = a->q_next; - } -} -/* -** EMPTYADDR -- return TRUE if this address is empty (``<>'') -** -** Parameters: -** a -- pointer to the address -** -** Returns: -** TRUE -- if this address is "empty" (i.e., no one should -** ever generate replies to it. -** FALSE -- if it is a "regular" (read: replyable) address. -*/ - -bool -emptyaddr(a) - register ADDRESS *a; -{ - return a->q_paddr == NULL || strcmp(a->q_paddr, "<>") == 0 || - a->q_user == NULL || strcmp(a->q_user, "<>") == 0; -} -/* -** REMOTENAME -- return the name relative to the current mailer -** -** Parameters: -** name -- the name to translate. -** m -- the mailer that we want to do rewriting relative -** to. -** flags -- fine tune operations. -** pstat -- pointer to status word. -** e -- the current envelope. -** -** Returns: -** the text string representing this address relative to -** the receiving mailer. -** -** Side Effects: -** none. -** -** Warnings: -** The text string returned is tucked away locally; -** copy it if you intend to save it. -*/ - -char * -remotename(name, m, flags, pstat, e) - char *name; - struct mailer *m; - int flags; - int *pstat; - register ENVELOPE *e; -{ - register char **pvp; - char *fancy; - char *oldg = macvalue('g', e); - int rwset; - static char buf[MAXNAME + 1]; - char lbuf[MAXNAME + 1]; - char pvpbuf[PSBUFSIZE]; - extern char *crackaddr __P((char *)); - - if (tTd(12, 1)) - printf("remotename(%s)\n", name); - - /* don't do anything if we are tagging it as special */ - if (bitset(RF_SENDERADDR, flags)) - rwset = bitset(RF_HEADERADDR, flags) ? m->m_sh_rwset - : m->m_se_rwset; - else - rwset = bitset(RF_HEADERADDR, flags) ? m->m_rh_rwset - : m->m_re_rwset; - if (rwset < 0) - return (name); - - /* - ** Do a heuristic crack of this name to extract any comment info. - ** This will leave the name as a comment and a $g macro. - */ - - if (bitset(RF_CANONICAL, flags) || bitnset(M_NOCOMMENT, m->m_flags)) - fancy = "\201g"; - else - fancy = crackaddr(name); - - /* - ** Turn the name into canonical form. - ** Normally this will be RFC 822 style, i.e., "user@domain". - ** If this only resolves to "user", and the "C" flag is - ** specified in the sending mailer, then the sender's - ** domain will be appended. - */ - - pvp = prescan(name, '\0', pvpbuf, sizeof pvpbuf, NULL, NULL); - if (pvp == NULL) - return (name); - if (rewrite(pvp, 3, 0, e) == EX_TEMPFAIL) - *pstat = EX_TEMPFAIL; - if (bitset(RF_ADDDOMAIN, flags) && e->e_fromdomain != NULL) - { - /* append from domain to this address */ - register char **pxp = pvp; - - /* see if there is an "@domain" in the current name */ - while (*pxp != NULL && strcmp(*pxp, "@") != 0) - pxp++; - if (*pxp == NULL) - { - /* no.... append the "@domain" from the sender */ - register char **qxq = e->e_fromdomain; - - while ((*pxp++ = *qxq++) != NULL) - continue; - if (rewrite(pvp, 3, 0, e) == EX_TEMPFAIL) - *pstat = EX_TEMPFAIL; - } - } - - /* - ** Do more specific rewriting. - ** Rewrite using ruleset 1 or 2 depending on whether this is - ** a sender address or not. - ** Then run it through any receiving-mailer-specific rulesets. - */ - - if (bitset(RF_SENDERADDR, flags)) - { - if (rewrite(pvp, 1, 0, e) == EX_TEMPFAIL) - *pstat = EX_TEMPFAIL; - } - else - { - if (rewrite(pvp, 2, 0, e) == EX_TEMPFAIL) - *pstat = EX_TEMPFAIL; - } - if (rwset > 0) - { - if (rewrite(pvp, rwset, 0, e) == EX_TEMPFAIL) - *pstat = EX_TEMPFAIL; - } - - /* - ** Do any final sanitation the address may require. - ** This will normally be used to turn internal forms - ** (e.g., user@host.LOCAL) into external form. This - ** may be used as a default to the above rules. - */ - - if (rewrite(pvp, 4, 0, e) == EX_TEMPFAIL) - *pstat = EX_TEMPFAIL; - - /* - ** Now restore the comment information we had at the beginning. - */ - - cataddr(pvp, NULL, lbuf, sizeof lbuf, '\0'); - define('g', lbuf, e); - - /* need to make sure route-addrs have <angle brackets> */ - if (bitset(RF_CANONICAL, flags) && lbuf[0] == '@') - expand("<\201g>", buf, sizeof buf, e); - else - expand(fancy, buf, sizeof buf, e); - - define('g', oldg, e); - - if (tTd(12, 1)) - printf("remotename => `%s'\n", buf); - return (buf); -} -/* -** MAPLOCALUSER -- run local username through ruleset 5 for final redirection -** -** Parameters: -** a -- the address to map (but just the user name part). -** sendq -- the sendq in which to install any replacement -** addresses. -** aliaslevel -- the alias nesting depth. -** e -- the envelope. -** -** Returns: -** none. -*/ - -#define Q_COPYFLAGS (QPRIMARY|QBOGUSSHELL|QUNSAFEADDR|\ - Q_PINGFLAGS|QHASNOTIFY|\ - QRELAYED|QEXPANDED|QDELIVERED|QDELAYED) - -void -maplocaluser(a, sendq, aliaslevel, e) - register ADDRESS *a; - ADDRESS **sendq; - int aliaslevel; - ENVELOPE *e; -{ - register char **pvp; - register ADDRESS *a1 = NULL; - auto char *delimptr; - char pvpbuf[PSBUFSIZE]; - - if (tTd(29, 1)) - { - printf("maplocaluser: "); - printaddr(a, FALSE); - } - pvp = prescan(a->q_user, '\0', pvpbuf, sizeof pvpbuf, &delimptr, NULL); - if (pvp == NULL) - { - if (tTd(29, 9)) - printf("maplocaluser: cannot prescan %s\n", a->q_user); - return; - } - - define('h', a->q_host, e); - define('u', a->q_user, e); - define('z', a->q_home, e); - - if (rewrite(pvp, 5, 0, e) == EX_TEMPFAIL) - { - if (tTd(29, 9)) - printf("maplocaluser: rewrite tempfail\n"); - a->q_flags |= QQUEUEUP; - a->q_status = "4.4.3"; - return; - } - if (pvp[0] == NULL || (pvp[0][0] & 0377) != CANONNET) - { - if (tTd(29, 9)) - printf("maplocaluser: doesn't resolve\n"); - return; - } - - /* if non-null, mailer destination specified -- has it changed? */ - a1 = buildaddr(pvp, NULL, 0, e); - if (a1 == NULL || sameaddr(a, a1)) - { - if (tTd(29, 9)) - printf("maplocaluser: address unchanged\n"); - if (a1 != NULL) - free(a1); - return; - } - - /* make new address take on flags and print attributes of old */ - a1->q_flags &= ~Q_COPYFLAGS; - a1->q_flags |= a->q_flags & Q_COPYFLAGS; - a1->q_paddr = a->q_paddr; - - /* mark old address as dead; insert new address */ - a->q_flags |= QDONTSEND; - if (tTd(29, 5)) - { - printf("maplocaluser: QDONTSEND "); - printaddr(a, FALSE); - } - a1->q_alias = a; - allocaddr(a1, RF_COPYALL, a->q_paddr); - (void) recipient(a1, sendq, aliaslevel, e); -} -/* -** DEQUOTE_INIT -- initialize dequote map -** -** This is a no-op. -** -** Parameters: -** map -- the internal map structure. -** args -- arguments. -** -** Returns: -** TRUE. -*/ - -bool -dequote_init(map, args) - MAP *map; - char *args; -{ - register char *p = args; - - map->map_mflags |= MF_KEEPQUOTES; - for (;;) - { - while (isascii(*p) && isspace(*p)) - p++; - if (*p != '-') - break; - switch (*++p) - { - case 'a': - map->map_app = ++p; - break; - - case 's': - map->map_coldelim = *++p; - break; - } - while (*p != '\0' && !(isascii(*p) && isspace(*p))) - p++; - if (*p != '\0') - *p = '\0'; - } - if (map->map_app != NULL) - map->map_app = newstr(map->map_app); - - return TRUE; -} -/* -** DEQUOTE_MAP -- unquote an address -** -** Parameters: -** map -- the internal map structure (ignored). -** name -- the name to dequote. -** av -- arguments (ignored). -** statp -- pointer to status out-parameter. -** -** Returns: -** NULL -- if there were no quotes, or if the resulting -** unquoted buffer would not be acceptable to prescan. -** else -- The dequoted buffer. -*/ - -/* ARGSUSED2 */ -char * -dequote_map(map, name, av, statp) - MAP *map; - char *name; - char **av; - int *statp; -{ - register char *p; - register char *q; - register char c; - int anglecnt = 0; - int cmntcnt = 0; - int quotecnt = 0; - int spacecnt = 0; - bool quotemode = FALSE; - bool bslashmode = FALSE; - char spacesub = map->map_coldelim; - - for (p = q = name; (c = *p++) != '\0'; ) - { - if (bslashmode) - { - bslashmode = FALSE; - *q++ = c; - continue; - } - - if (c == ' ' && spacesub != '\0') - c = spacesub; - - switch (c) - { - case '\\': - bslashmode = TRUE; - break; - - case '(': - cmntcnt++; - break; - - case ')': - if (cmntcnt-- <= 0) - return NULL; - break; - - case ' ': - spacecnt++; - break; - } - - if (cmntcnt > 0) - { - *q++ = c; - continue; - } - - switch (c) - { - case '"': - quotemode = !quotemode; - quotecnt++; - continue; - - case '<': - anglecnt++; - break; - - case '>': - if (anglecnt-- <= 0) - return NULL; - break; - } - *q++ = c; - } - - if (anglecnt != 0 || cmntcnt != 0 || bslashmode || - quotemode || quotecnt <= 0 || spacecnt != 0) - return NULL; - *q++ = '\0'; - return map_rewrite(map, name, strlen(name), NULL); -} -/* -** RSCHECK -- check string(s) for validity using rewriting sets -** -** Parameters: -** rwset -- the rewriting set to use. -** p1 -- the first string to check. -** p2 -- the second string to check -- may be null. -** e -- the current envelope. -** -** Returns: -** EX_OK -- if the rwset doesn't resolve to $#error -** else -- the failure status (message printed) -*/ - -int -rscheck(rwset, p1, p2, e) - char *rwset; - char *p1; - char *p2; - ENVELOPE *e; -{ - char *buf; - int bufsize; - int saveexitstat; - int rstat = EX_OK; - char **pvp; - int rsno; - bool discard = FALSE; - auto ADDRESS a1; - bool saveQuickAbort = QuickAbort; - bool saveSuprErrs = SuprErrs; - char buf0[MAXLINE]; - char pvpbuf[PSBUFSIZE]; - extern char MsgBuf[]; - - if (tTd(48, 2)) - printf("rscheck(%s, %s, %s)\n", rwset, p1, - p2 == NULL ? "(NULL)" : p2); - - rsno = strtorwset(rwset, NULL, ST_FIND); - if (rsno < 0) - return EX_OK; - - if (p2 != NULL) - { - bufsize = strlen(p1) + strlen(p2) + 2; - if (bufsize > sizeof buf0) - buf = xalloc(bufsize); - else - { - buf = buf0; - bufsize = sizeof buf0; - } - (void) snprintf(buf, bufsize, "%s%c%s", p1, CONDELSE, p2); - } - else - { - bufsize = strlen(p1) + 1; - if (bufsize > sizeof buf0) - buf = xalloc(bufsize); - else - { - buf = buf0; - bufsize = sizeof buf0; - } - (void) snprintf(buf, bufsize, "%s", p1); - } - SuprErrs = TRUE; - QuickAbort = FALSE; - pvp = prescan(buf, '\0', pvpbuf, sizeof pvpbuf, NULL, NULL); - SuprErrs = saveSuprErrs; - if (pvp == NULL) - { - if (tTd(48, 2)) - printf("rscheck: cannot prescan input\n"); -/* - syserr("rscheck: cannot prescan input: \"%s\"", - shortenstring(buf, MAXSHORTSTR)); - rstat = EX_DATAERR; -*/ - goto finis; - } - (void) rewrite(pvp, rsno, 0, e); - if (pvp[0] == NULL || (pvp[0][0] & 0377) != CANONNET || - pvp[1] == NULL || (strcmp(pvp[1], "error") != 0 && - strcmp(pvp[1], "discard") != 0)) - { - goto finis; - } - - if (strcmp(pvp[1], "discard") == 0) - { - if (tTd(48, 2)) - printf("rscheck: discard mailer selected\n"); - e->e_flags |= EF_DISCARD; - discard = TRUE; - } - else - { - int savelogusrerrs = LogUsrErrs; - static bool logged = FALSE; - - /* got an error -- process it */ - saveexitstat = ExitStat; - LogUsrErrs = FALSE; - (void) buildaddr(pvp, &a1, 0, e); - LogUsrErrs = savelogusrerrs; - rstat = ExitStat; - ExitStat = saveexitstat; - if (!logged) - { - markstats(e, &a1, TRUE); - logged = TRUE; - } - } - - if (LogLevel >= 4) - { - char *relay; - char *p; - char lbuf[MAXLINE]; - - p = lbuf; - if (p2 != NULL) - { - snprintf(p, SPACELEFT(lbuf, p), - ", arg2=%s", - p2); - p += strlen(p); - } - if ((relay = macvalue('_', e)) != NULL) - { - snprintf(p, SPACELEFT(lbuf, p), - ", relay=%s", relay); - p += strlen(p); - } - *p = '\0'; - if (discard) - sm_syslog(LOG_NOTICE, e->e_id, - "ruleset=%s, arg1=%s%s, discard", - rwset, p1, lbuf); - else - sm_syslog(LOG_NOTICE, e->e_id, - "ruleset=%s, arg1=%s%s, reject=%s", - rwset, p1, lbuf, MsgBuf); - } - - finis: - /* clean up */ - QuickAbort = saveQuickAbort; - setstat(rstat); - if (buf != buf0) - free(buf); - - if (rstat != EX_OK && QuickAbort) - longjmp(TopFrame, 2); - return rstat; -} diff --git a/src/pathnames.h b/src/pathnames.h deleted file mode 100644 index 7a06b12..0000000 --- a/src/pathnames.h +++ /dev/null @@ -1,32 +0,0 @@ -/*- - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - * - * @(#)pathnames.h 8.8 (Berkeley) 5/19/1998 - */ - -#ifndef _PATH_SENDMAILCF -# if defined(USE_VENDOR_CF_PATH) && defined(_PATH_VENDOR_CF) -# define _PATH_SENDMAILCF _PATH_VENDOR_CF -# else -# define _PATH_SENDMAILCF "/etc/sendmail.cf" -# endif -#endif - -#ifndef _PATH_SENDMAILPID -# ifdef BSD4_4 -# define _PATH_SENDMAILPID "/var/run/sendmail.pid" -# else -# define _PATH_SENDMAILPID "/etc/sendmail.pid" -# endif -#endif - -#ifndef _PATH_HOSTS -# define _PATH_HOSTS "/etc/hosts" -#endif diff --git a/src/queue.c b/src/queue.c deleted file mode 100644 index b02fc08..0000000 --- a/src/queue.c +++ /dev/null @@ -1,2422 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -# include "sendmail.h" - -#ifndef lint -#if QUEUE -static char sccsid[] = "@(#)queue.c 8.211 (Berkeley) 1/25/1999 (with queueing)"; -#else -static char sccsid[] = "@(#)queue.c 8.211 (Berkeley) 1/25/1999 (without queueing)"; -#endif -#endif /* not lint */ - -# include <errno.h> -# include <dirent.h> - -# if QUEUE - -/* -** Work queue. -*/ - -struct work -{ - char *w_name; /* name of control file */ - char *w_host; /* name of recipient host */ - bool w_lock; /* is message locked? */ - bool w_tooyoung; /* is it too young to run? */ - long w_pri; /* priority of message, see below */ - time_t w_ctime; /* creation time of message */ - struct work *w_next; /* next in queue */ -}; - -typedef struct work WORK; - -WORK *WorkQ; /* queue of things to be done */ - -#define QF_VERSION 2 /* version number of this queue format */ - -extern int orderq __P((bool)); -/* -** QUEUEUP -- queue a message up for future transmission. -** -** Parameters: -** e -- the envelope to queue up. -** announce -- if TRUE, tell when you are queueing up. -** -** Returns: -** none. -** -** Side Effects: -** The current request are saved in a control file. -** The queue file is left locked. -*/ - -void -queueup(e, announce) - register ENVELOPE *e; - bool announce; -{ - char *qf; - register FILE *tfp; - register HDR *h; - register ADDRESS *q; - int fd; - int i; - bool newid; - register char *p; - MAILER nullmailer; - MCI mcibuf; - char tf[MAXQFNAME]; - char buf[MAXLINE]; - extern void printctladdr __P((ADDRESS *, FILE *)); - - /* - ** Create control file. - */ - - newid = (e->e_id == NULL) || !bitset(EF_INQUEUE, e->e_flags); - - /* if newid, queuename will create a locked qf file in e->lockfp */ - strcpy(tf, queuename(e, 't')); - tfp = e->e_lockfp; - if (tfp == NULL) - newid = FALSE; - - /* if newid, just write the qf file directly (instead of tf file) */ - if (!newid) - { - /* get a locked tf file */ - for (i = 0; i < 128; i++) - { - fd = open(tf, O_CREAT|O_WRONLY|O_EXCL, FileMode); - if (fd < 0) - { - if (errno != EEXIST) - break; - if (LogLevel > 0 && (i % 32) == 0) - sm_syslog(LOG_ALERT, e->e_id, - "queueup: cannot create %s, uid=%d: %s", - tf, geteuid(), errstring(errno)); - } - else - { - if (lockfile(fd, tf, NULL, LOCK_EX|LOCK_NB)) - break; - else if (LogLevel > 0 && (i % 32) == 0) - sm_syslog(LOG_ALERT, e->e_id, - "queueup: cannot lock %s: %s", - tf, errstring(errno)); - close(fd); - } - - if ((i % 32) == 31) - { - /* save the old temp file away */ - (void) rename(tf, queuename(e, 'T')); - } - else - sleep(i % 32); - } - if (fd < 0 || (tfp = fdopen(fd, "w")) == NULL) - { - printopenfds(TRUE); - syserr("!queueup: cannot create queue temp file %s, uid=%d", - tf, geteuid()); - } - } - - if (tTd(40, 1)) - printf("\n>>>>> queueing %s%s >>>>>\n", e->e_id, - newid ? " (new id)" : ""); - if (tTd(40, 3)) - { - extern void printenvflags __P((ENVELOPE *)); - - printf(" e_flags="); - printenvflags(e); - } - if (tTd(40, 32)) - { - printf(" sendq="); - printaddr(e->e_sendqueue, TRUE); - } - if (tTd(40, 9)) - { - printf(" tfp="); - dumpfd(fileno(tfp), TRUE, FALSE); - printf(" lockfp="); - if (e->e_lockfp == NULL) - printf("NULL\n"); - else - dumpfd(fileno(e->e_lockfp), TRUE, FALSE); - } - - /* - ** If there is no data file yet, create one. - */ - - if (!bitset(EF_HAS_DF, e->e_flags)) - { - register FILE *dfp = NULL; - char dfname[MAXQFNAME]; - struct stat stbuf; - - strcpy(dfname, queuename(e, 'd')); - fd = open(dfname, O_WRONLY|O_CREAT|O_TRUNC, FileMode); - if (fd < 0 || (dfp = fdopen(fd, "w")) == NULL) - syserr("!queueup: cannot create data temp file %s, uid=%d", - dfname, geteuid()); - if (fstat(fd, &stbuf) < 0) - e->e_dfino = -1; - else - { - e->e_dfdev = stbuf.st_dev; - e->e_dfino = stbuf.st_ino; - } - e->e_flags |= EF_HAS_DF; - bzero(&mcibuf, sizeof mcibuf); - mcibuf.mci_out = dfp; - mcibuf.mci_mailer = FileMailer; - (*e->e_putbody)(&mcibuf, e, NULL); - (void) xfclose(dfp, "queueup dfp", e->e_id); - e->e_putbody = putbody; - } - - /* - ** Output future work requests. - ** Priority and creation time should be first, since - ** they are required by orderq. - */ - - /* output queue version number (must be first!) */ - fprintf(tfp, "V%d\n", QF_VERSION); - - /* output creation time */ - fprintf(tfp, "T%ld\n", (long) e->e_ctime); - - /* output last delivery time */ - fprintf(tfp, "K%ld\n", (long) e->e_dtime); - - /* output number of delivery attempts */ - fprintf(tfp, "N%d\n", e->e_ntries); - - /* output message priority */ - fprintf(tfp, "P%ld\n", e->e_msgpriority); - - /* output inode number of data file */ - /* XXX should probably include device major/minor too */ - if (e->e_dfino != -1) - { - if (sizeof e->e_dfino > sizeof(long)) - fprintf(tfp, "I%d/%d/%s\n", - major(e->e_dfdev), minor(e->e_dfdev), - quad_to_string(e->e_dfino)); - else - fprintf(tfp, "I%d/%d/%lu\n", - major(e->e_dfdev), minor(e->e_dfdev), - (unsigned long) e->e_dfino); - } - - /* output body type */ - if (e->e_bodytype != NULL) - fprintf(tfp, "B%s\n", denlstring(e->e_bodytype, TRUE, FALSE)); - -#if _FFR_SAVE_CHARSET - if (e->e_charset != NULL) - fprintf(tfp, "X%s\n", denlstring(e->e_charset, TRUE, FALSE)); -#endif - - /* message from envelope, if it exists */ - if (e->e_message != NULL) - fprintf(tfp, "M%s\n", denlstring(e->e_message, TRUE, FALSE)); - - /* send various flag bits through */ - p = buf; - if (bitset(EF_WARNING, e->e_flags)) - *p++ = 'w'; - if (bitset(EF_RESPONSE, e->e_flags)) - *p++ = 'r'; - if (bitset(EF_HAS8BIT, e->e_flags)) - *p++ = '8'; - if (bitset(EF_DELETE_BCC, e->e_flags)) - *p++ = 'b'; - if (bitset(EF_RET_PARAM, e->e_flags)) - *p++ = 'd'; - if (bitset(EF_NO_BODY_RETN, e->e_flags)) - *p++ = 'n'; - *p++ = '\0'; - if (buf[0] != '\0') - fprintf(tfp, "F%s\n", buf); - - /* $r and $s and $_ macro values */ - if ((p = macvalue('r', e)) != NULL) - fprintf(tfp, "$r%s\n", denlstring(p, TRUE, FALSE)); - if ((p = macvalue('s', e)) != NULL) - fprintf(tfp, "$s%s\n", denlstring(p, TRUE, FALSE)); - if ((p = macvalue('_', e)) != NULL) - fprintf(tfp, "$_%s\n", denlstring(p, TRUE, FALSE)); - - /* output name of sender */ - if (bitnset(M_UDBENVELOPE, e->e_from.q_mailer->m_flags)) - p = e->e_sender; - else - p = e->e_from.q_paddr; - fprintf(tfp, "S%s\n", denlstring(p, TRUE, FALSE)); - - /* output ESMTP-supplied "original" information */ - if (e->e_envid != NULL) - fprintf(tfp, "Z%s\n", denlstring(e->e_envid, TRUE, FALSE)); - - /* output list of recipient addresses */ - printctladdr(NULL, NULL); - for (q = e->e_sendqueue; q != NULL; q = q->q_next) - { - if (bitset(QDONTSEND|QBADADDR|QSENT, q->q_flags)) - { -#if XDEBUG - if (bitset(QQUEUEUP, q->q_flags)) - sm_syslog(LOG_DEBUG, e->e_id, - "dropenvelope: q_flags = %x, paddr = %s", - q->q_flags, q->q_paddr); -#endif - continue; - } - printctladdr(q, tfp); - if (q->q_orcpt != NULL) - fprintf(tfp, "Q%s\n", - denlstring(q->q_orcpt, TRUE, FALSE)); - putc('R', tfp); - if (bitset(QPRIMARY, q->q_flags)) - putc('P', tfp); - if (bitset(QHASNOTIFY, q->q_flags)) - putc('N', tfp); - if (bitset(QPINGONSUCCESS, q->q_flags)) - putc('S', tfp); - if (bitset(QPINGONFAILURE, q->q_flags)) - putc('F', tfp); - if (bitset(QPINGONDELAY, q->q_flags)) - putc('D', tfp); - putc(':', tfp); - fprintf(tfp, "%s\n", denlstring(q->q_paddr, TRUE, FALSE)); - if (announce) - { - e->e_to = q->q_paddr; - message("queued"); - if (LogLevel > 8) - logdelivery(q->q_mailer, NULL, "queued", - NULL, (time_t) 0, e); - e->e_to = NULL; - } - if (tTd(40, 1)) - { - printf("queueing "); - printaddr(q, FALSE); - } - } - - /* - ** Output headers for this message. - ** Expand macros completely here. Queue run will deal with - ** everything as absolute headers. - ** All headers that must be relative to the recipient - ** can be cracked later. - ** We set up a "null mailer" -- i.e., a mailer that will have - ** no effect on the addresses as they are output. - */ - - bzero((char *) &nullmailer, sizeof nullmailer); - nullmailer.m_re_rwset = nullmailer.m_rh_rwset = - nullmailer.m_se_rwset = nullmailer.m_sh_rwset = -1; - nullmailer.m_eol = "\n"; - bzero(&mcibuf, sizeof mcibuf); - mcibuf.mci_mailer = &nullmailer; - mcibuf.mci_out = tfp; - - define('g', "\201f", e); - for (h = e->e_header; h != NULL; h = h->h_link) - { - extern bool bitzerop __P((BITMAP)); - - if (h->h_value == NULL) - continue; - - /* don't output resent headers on non-resent messages */ - if (bitset(H_RESENT, h->h_flags) && !bitset(EF_RESENT, e->e_flags)) - continue; - - /* expand macros; if null, don't output header at all */ - if (bitset(H_DEFAULT, h->h_flags)) - { - (void) expand(h->h_value, buf, sizeof buf, e); - if (buf[0] == '\0') - continue; - } - - /* output this header */ - fprintf(tfp, "H"); - - /* if conditional, output the set of conditions */ - if (!bitzerop(h->h_mflags) && bitset(H_CHECK|H_ACHECK, h->h_flags)) - { - int j; - - (void) putc('?', tfp); - for (j = '\0'; j <= '\177'; j++) - if (bitnset(j, h->h_mflags)) - (void) putc(j, tfp); - (void) putc('?', tfp); - } - - /* output the header: expand macros, convert addresses */ - if (bitset(H_DEFAULT, h->h_flags)) - { - fprintf(tfp, "%s: %s\n", - h->h_field, - denlstring(buf, FALSE, TRUE)); - } - else if (bitset(H_FROM|H_RCPT, h->h_flags)) - { - bool oldstyle = bitset(EF_OLDSTYLE, e->e_flags); - FILE *savetrace = TrafficLogFile; - - TrafficLogFile = NULL; - - if (bitset(H_FROM, h->h_flags)) - oldstyle = FALSE; - - commaize(h, h->h_value, oldstyle, &mcibuf, e); - - TrafficLogFile = savetrace; - } - else - { - fprintf(tfp, "%s: %s\n", - h->h_field, - denlstring(h->h_value, FALSE, TRUE)); - } - } - - /* - ** Clean up. - ** - ** Write a terminator record -- this is to prevent - ** scurrilous crackers from appending any data. - */ - - fprintf(tfp, ".\n"); - - if (fflush(tfp) < 0 || - (SuperSafe && fsync(fileno(tfp)) < 0) || - ferror(tfp)) - { - if (newid) - syserr("!552 Error writing control file %s", tf); - else - syserr("!452 Error writing control file %s", tf); - } - - if (!newid) - { - /* rename (locked) tf to be (locked) qf */ - qf = queuename(e, 'q'); - if (rename(tf, qf) < 0) - syserr("cannot rename(%s, %s), uid=%d", - tf, qf, geteuid()); - - /* close and unlock old (locked) qf */ - if (e->e_lockfp != NULL) - (void) xfclose(e->e_lockfp, "queueup lockfp", e->e_id); - e->e_lockfp = tfp; - } - else - qf = tf; - errno = 0; - e->e_flags |= EF_INQUEUE; - - /* save log info */ - if (LogLevel > 79) - sm_syslog(LOG_DEBUG, e->e_id, "queueup, qf=%s", qf); - - if (tTd(40, 1)) - printf("<<<<< done queueing %s <<<<<\n\n", e->e_id); - return; -} - -void -printctladdr(a, tfp) - register ADDRESS *a; - FILE *tfp; -{ - char *uname; - register ADDRESS *q; - uid_t uid; - gid_t gid; - static ADDRESS *lastctladdr = NULL; - static uid_t lastuid; - - /* initialization */ - if (a == NULL || a->q_alias == NULL || tfp == NULL) - { - if (lastctladdr != NULL && tfp != NULL) - fprintf(tfp, "C\n"); - lastctladdr = NULL; - lastuid = 0; - return; - } - - /* find the active uid */ - q = getctladdr(a); - if (q == NULL) - { - uname = NULL; - uid = 0; - gid = 0; - } - else - { - uname = q->q_ruser != NULL ? q->q_ruser : q->q_user; - uid = q->q_uid; - gid = q->q_gid; - } - a = a->q_alias; - - /* check to see if this is the same as last time */ - if (lastctladdr != NULL && uid == lastuid && - strcmp(lastctladdr->q_paddr, a->q_paddr) == 0) - return; - lastuid = uid; - lastctladdr = a; - - if (uid == 0 || uname == NULL || uname[0] == '\0') - fprintf(tfp, "C"); - else - fprintf(tfp, "C%s:%ld:%ld", - denlstring(uname, TRUE, FALSE), (long) uid, (long) gid); - fprintf(tfp, ":%s\n", denlstring(a->q_paddr, TRUE, FALSE)); -} -/* -** RUNQUEUE -- run the jobs in the queue. -** -** Gets the stuff out of the queue in some presumably logical -** order and processes them. -** -** Parameters: -** forkflag -- TRUE if the queue scanning should be done in -** a child process. We double-fork so it is not our -** child and we don't have to clean up after it. -** verbose -- if TRUE, print out status information. -** -** Returns: -** TRUE if the queue run successfully began. -** -** Side Effects: -** runs things in the mail queue. -*/ - -ENVELOPE QueueEnvelope; /* the queue run envelope */ -extern int get_num_procs_online __P((void)); - -bool -runqueue(forkflag, verbose) - bool forkflag; - bool verbose; -{ - register ENVELOPE *e; - int njobs; - int sequenceno = 0; - time_t current_la_time; - extern ENVELOPE BlankEnvelope; - extern void clrdaemon __P((void)); - extern void runqueueevent __P((void)); - - DoQueueRun = FALSE; - - /* - ** If no work will ever be selected, don't even bother reading - ** the queue. - */ - - CurrentLA = getla(); /* get load average */ - current_la_time = curtime(); - - if (shouldqueue(WkRecipFact, current_la_time)) - { - char *msg = "Skipping queue run -- load average too high"; - - if (verbose) - message("458 %s\n", msg); - if (LogLevel > 8) - sm_syslog(LOG_INFO, NOQID, - "runqueue: %s", - msg); - if (forkflag && QueueIntvl != 0) - (void) setevent(QueueIntvl, runqueueevent, 0); - return FALSE; - } - - /* - ** See if we already have too many children. - */ - - if (forkflag && QueueIntvl != 0 && - MaxChildren > 0 && CurChildren >= MaxChildren) - { - (void) setevent(QueueIntvl, runqueueevent, 0); - return FALSE; - } - - /* - ** See if we want to go off and do other useful work. - */ - - if (forkflag) - { - pid_t pid; - extern SIGFUNC_DECL intsig __P((int)); - extern SIGFUNC_DECL reapchild __P((int)); - - blocksignal(SIGCHLD); - (void) setsignal(SIGCHLD, reapchild); - - pid = dofork(); - if (pid == -1) - { - const char *msg = "Skipping queue run -- fork() failed"; - const char *err = errstring(errno); - - if (verbose) - message("458 %s: %s\n", msg, err); - if (LogLevel > 8) - sm_syslog(LOG_INFO, NOQID, - "runqueue: %s: %s", - msg, err); - if (QueueIntvl != 0) - (void) setevent(QueueIntvl, runqueueevent, 0); - (void) releasesignal(SIGCHLD); - return FALSE; - } - if (pid != 0) - { - /* parent -- pick up intermediate zombie */ - (void) blocksignal(SIGALRM); - proc_list_add(pid, "Queue runner"); - (void) releasesignal(SIGALRM); - releasesignal(SIGCHLD); - if (QueueIntvl != 0) - (void) setevent(QueueIntvl, runqueueevent, 0); - return TRUE; - } - /* child -- double fork and clean up signals */ - clrcontrol(); - proc_list_clear(); - - /* Add parent process as first child item */ - proc_list_add(getpid(), "Queue runner child process"); - releasesignal(SIGCHLD); - (void) setsignal(SIGCHLD, SIG_DFL); - (void) setsignal(SIGHUP, intsig); - } - - sm_setproctitle(TRUE, "running queue: %s", QueueDir); - - if (LogLevel > 69) - sm_syslog(LOG_DEBUG, NOQID, - "runqueue %s, pid=%d, forkflag=%d", - QueueDir, getpid(), forkflag); - - /* - ** Release any resources used by the daemon code. - */ - -# if DAEMON - clrdaemon(); -# endif /* DAEMON */ - - /* force it to run expensive jobs */ - NoConnect = FALSE; - - /* drop privileges */ - if (geteuid() == (uid_t) 0) - (void) drop_privileges(FALSE); - - /* - ** Create ourselves an envelope - */ - - CurEnv = &QueueEnvelope; - e = newenvelope(&QueueEnvelope, CurEnv); - e->e_flags = BlankEnvelope.e_flags; - - /* make sure we have disconnected from parent */ - if (forkflag) - { - disconnect(1, e); - QuickAbort = FALSE; - } - - /* - ** Make sure the alias database is open. - */ - - initmaps(FALSE, e); - - /* - ** If we are running part of the queue, always ignore stored - ** host status. - */ - - if (QueueLimitId != NULL || QueueLimitSender != NULL || - QueueLimitRecipient != NULL) - { - IgnoreHostStatus = TRUE; - MinQueueAge = 0; - } - - /* - ** Start making passes through the queue. - ** First, read and sort the entire queue. - ** Then, process the work in that order. - ** But if you take too long, start over. - */ - - /* order the existing work requests */ - njobs = orderq(FALSE); - - /* process them once at a time */ - while (WorkQ != NULL) - { - WORK *w = WorkQ; - - WorkQ = WorkQ->w_next; - e->e_to = NULL; - - /* - ** Ignore jobs that are too expensive for the moment. - ** - ** Get new load average every 30 seconds. - */ - - if (current_la_time < curtime() - 30) - { - CurrentLA = getla(); - current_la_time = curtime(); - } - if (shouldqueue(WkRecipFact, current_la_time)) - { - char *msg = "Aborting queue run: load average too high"; - - if (Verbose) - message("%s", msg); - if (LogLevel > 8) - sm_syslog(LOG_INFO, NOQID, - "runqueue: %s", - msg); - break; - } - sequenceno++; - if (shouldqueue(w->w_pri, w->w_ctime)) - { - if (Verbose) - message(""); - if (QueueSortOrder == QS_BYPRIORITY) - { - if (Verbose) - message("Skipping %s (sequence %d of %d) and flushing rest of queue", - w->w_name + 2, - sequenceno, - njobs); - if (LogLevel > 8) - sm_syslog(LOG_INFO, NOQID, - "runqueue: Flushing queue from %s (pri %ld, LA %d, %d of %d)", - w->w_name + 2, - w->w_pri, - CurrentLA, - sequenceno, - njobs); - break; - } - else if (Verbose) - message("Skipping %s (sequence %d of %d)", - w->w_name + 2, sequenceno, njobs); - } - else - { - pid_t pid; - - if (Verbose) - { - message(""); - message("Running %s (sequence %d of %d)", - w->w_name + 2, sequenceno, njobs); - } - pid = dowork(w->w_name + 2, ForkQueueRuns, FALSE, e); - errno = 0; - if (pid != 0) - (void) waitfor(pid); - } - free(w->w_name); - if (w->w_host) - free(w->w_host); - free((char *) w); - } - - /* exit without the usual cleanup */ - e->e_id = NULL; - finis(TRUE, ExitStat); - /*NOTREACHED*/ - return TRUE; -} - - -/* -** RUNQUEUEEVENT -- stub for use in setevent -*/ - -void -runqueueevent() -{ - DoQueueRun = TRUE; -} -/* -** ORDERQ -- order the work queue. -** -** Parameters: -** doall -- if set, include everything in the queue (even -** the jobs that cannot be run because the load -** average is too high). Otherwise, exclude those -** jobs. -** -** Returns: -** The number of request in the queue (not necessarily -** the number of requests in WorkQ however). -** -** Side Effects: -** Sets WorkQ to the queue of available work, in order. -*/ - -# define NEED_P 001 -# define NEED_T 002 -# define NEED_R 004 -# define NEED_S 010 - -static WORK *WorkList = NULL; -static int WorkListSize = 0; - -int -orderq(doall) - bool doall; -{ - register struct dirent *d; - register WORK *w; - register char *p; - DIR *f; - register int i; - int wn = -1; - int wc; - QUEUE_CHAR *check; - - if (tTd(41, 1)) - { - printf("orderq:\n"); - - check = QueueLimitId; - while (check != NULL) - { - printf("\tQueueLimitId = %s\n", - check->queue_match); - check = check->queue_next; - } - - check = QueueLimitSender; - while (check != NULL) - { - printf("\tQueueLimitSender = %s\n", - check->queue_match); - check = check->queue_next; - } - - check = QueueLimitRecipient; - while (check != NULL) - { - printf("\tQueueLimitRecipient = %s\n", - check->queue_match); - check = check->queue_next; - } - } - - /* clear out old WorkQ */ - for (w = WorkQ; w != NULL; ) - { - register WORK *nw = w->w_next; - - WorkQ = nw; - free(w->w_name); - if (w->w_host) - free(w->w_host); - free((char *) w); - w = nw; - } - - /* open the queue directory */ - f = opendir("."); - if (f == NULL) - { - syserr("orderq: cannot open \"%s\" as \".\"", QueueDir); - return (0); - } - - /* - ** Read the work directory. - */ - - while ((d = readdir(f)) != NULL) - { - FILE *cf; - int qfver = 0; - char lbuf[MAXNAME + 1]; - extern bool strcontainedin __P((char *, char *)); - - if (tTd(41, 50)) - printf("orderq: checking %s\n", d->d_name); - - /* is this an interesting entry? */ - if (d->d_name[0] != 'q' || d->d_name[1] != 'f') - continue; - - if (strlen(d->d_name) > MAXQFNAME) - { - if (Verbose) - printf("orderq: %s too long, %d max characters\n", - d->d_name, MAXQFNAME); - if (LogLevel > 0) - sm_syslog(LOG_ALERT, NOQID, - "orderq: %s too long, %d max characters", - d->d_name, MAXQFNAME); - continue; - } - - check = QueueLimitId; - while (check != NULL) - { - if (strcontainedin(check->queue_match, d->d_name)) - break; - else - check = check->queue_next; - } - if (QueueLimitId != NULL && check == NULL) - continue; - -#ifdef PICKY_QF_NAME_CHECK - /* - ** Check queue name for plausibility. This handles - ** both old and new type ids. - */ - - p = d->d_name + 2; - if (isupper(p[0]) && isupper(p[2])) - p += 3; - else if (isupper(p[1])) - p += 2; - else - p = d->d_name; - for (i = 0; isdigit(*p); p++) - i++; - if (i < 5 || *p != '\0') - { - if (Verbose) - printf("orderq: bogus qf name %s\n", d->d_name); - if (LogLevel > 0) - sm_syslog(LOG_ALERT, NOQID, - "orderq: bogus qf name %s", - d->d_name); - if (strlen(d->d_name) > (SIZE_T) MAXNAME) - d->d_name[MAXNAME] = '\0'; - strcpy(lbuf, d->d_name); - lbuf[0] = 'Q'; - (void) rename(d->d_name, lbuf); - continue; - } -#endif - - /* open control file (if not too many files) */ - if (++wn >= MaxQueueRun && MaxQueueRun > 0) - { - if (wn == MaxQueueRun && LogLevel > 0) - sm_syslog(LOG_ALERT, NOQID, - "WorkList for %s maxed out at %d", - QueueDir, MaxQueueRun); - continue; - } - if (wn >= WorkListSize) - { - extern void grow_wlist __P((void)); - - grow_wlist(); - if (wn >= WorkListSize) - continue; - } - - cf = fopen(d->d_name, "r"); - if (cf == NULL) - { - /* this may be some random person sending hir msgs */ - /* syserr("orderq: cannot open %s", cbuf); */ - if (tTd(41, 2)) - printf("orderq: cannot open %s: %s\n", - d->d_name, errstring(errno)); - errno = 0; - wn--; - continue; - } - w = &WorkList[wn]; - w->w_name = newstr(d->d_name); - w->w_host = NULL; - w->w_lock = !lockfile(fileno(cf), w->w_name, NULL, LOCK_SH|LOCK_NB); - w->w_tooyoung = FALSE; - - /* make sure jobs in creation don't clog queue */ - w->w_pri = 0x7fffffff; - w->w_ctime = 0; - - /* extract useful information */ - i = NEED_P | NEED_T; - if (QueueLimitSender != NULL) - i |= NEED_S; - if (QueueSortOrder == QS_BYHOST || QueueLimitRecipient != NULL) - i |= NEED_R; - while (i != 0 && fgets(lbuf, sizeof lbuf, cf) != NULL) - { - int c; - time_t age; - extern bool strcontainedin __P((char *, char *)); - - p = strchr(lbuf, '\n'); - if (p != NULL) - *p = '\0'; - else - { - /* flush rest of overly long line */ - while ((c = getc(cf)) != EOF && c != '\n') - continue; - } - - switch (lbuf[0]) - { - case 'V': - qfver = atoi(&lbuf[1]); - break; - - case 'P': - w->w_pri = atol(&lbuf[1]); - i &= ~NEED_P; - break; - - case 'T': - w->w_ctime = atol(&lbuf[1]); - i &= ~NEED_T; - break; - - case 'R': - if (w->w_host == NULL && - (p = strrchr(&lbuf[1], '@')) != NULL) - w->w_host = newstr(&p[1]); - if (QueueLimitRecipient == NULL) - { - i &= ~NEED_R; - break; - } - if (qfver > 0) - { - p = strchr(&lbuf[1], ':'); - if (p == NULL) - p = &lbuf[1]; - } - else - p = &lbuf[1]; - check = QueueLimitRecipient; - while (check != NULL) - { - if (strcontainedin(check->queue_match, - p)) - break; - else - check = check->queue_next; - } - if (check != NULL) - i &= ~NEED_R; - break; - - case 'S': - check = QueueLimitSender; - while (check != NULL) - { - if (strcontainedin(check->queue_match, - &lbuf[1])) - break; - else - check = check->queue_next; - } - if (check != NULL) - i &= ~NEED_S; - break; - - case 'K': - age = curtime() - (time_t) atol(&lbuf[1]); - if (age >= 0 && MinQueueAge > 0 && - age < MinQueueAge) - w->w_tooyoung = TRUE; - break; - - case 'N': - if (atol(&lbuf[1]) == 0) - w->w_tooyoung = FALSE; - break; - } - } - (void) fclose(cf); - - if ((!doall && shouldqueue(w->w_pri, w->w_ctime)) || - bitset(NEED_R|NEED_S, i)) - { - /* don't even bother sorting this job in */ - if (tTd(41, 49)) - printf("skipping %s (%x)\n", w->w_name, i); - free(w->w_name); - if (w->w_host) - free(w->w_host); - wn--; - } - } - (void) closedir(f); - wn++; - - wc = min(wn, WorkListSize); - if (wc > MaxQueueRun && MaxQueueRun > 0) - wc = MaxQueueRun; - - if (QueueSortOrder == QS_BYHOST) - { - extern int workcmpf1(); - extern int workcmpf2(); - - /* - ** Sort the work directory for the first time, - ** based on host name, lock status, and priority. - */ - - qsort((char *) WorkList, wc, sizeof *WorkList, workcmpf1); - - /* - ** If one message to host is locked, "lock" all messages - ** to that host. - */ - - i = 0; - while (i < wc) - { - if (!WorkList[i].w_lock) - { - i++; - continue; - } - w = &WorkList[i]; - while (++i < wc) - { - extern int sm_strcasecmp __P((char *, char *)); - - if (WorkList[i].w_host == NULL && - w->w_host == NULL) - WorkList[i].w_lock = TRUE; - else if (WorkList[i].w_host != NULL && - w->w_host != NULL && - sm_strcasecmp(WorkList[i].w_host, w->w_host) == 0) - WorkList[i].w_lock = TRUE; - else - break; - } - } - - /* - ** Sort the work directory for the second time, - ** based on lock status, host name, and priority. - */ - - qsort((char *) WorkList, wc, sizeof *WorkList, workcmpf2); - } - else if (QueueSortOrder == QS_BYTIME) - { - extern int workcmpf3(); - - /* - ** Simple sort based on submission time only. - */ - - qsort((char *) WorkList, wc, sizeof *WorkList, workcmpf3); - } - else - { - extern int workcmpf0(); - - /* - ** Simple sort based on queue priority only. - */ - - qsort((char *) WorkList, wc, sizeof *WorkList, workcmpf0); - } - - /* - ** Convert the work list into canonical form. - ** Should be turning it into a list of envelopes here perhaps. - */ - - WorkQ = NULL; - for (i = wc; --i >= 0; ) - { - w = (WORK *) xalloc(sizeof *w); - w->w_name = WorkList[i].w_name; - w->w_host = WorkList[i].w_host; - w->w_lock = WorkList[i].w_lock; - w->w_tooyoung = WorkList[i].w_tooyoung; - w->w_pri = WorkList[i].w_pri; - w->w_ctime = WorkList[i].w_ctime; - w->w_next = WorkQ; - WorkQ = w; - } - if (WorkList != NULL) - free(WorkList); - WorkList = NULL; - WorkListSize = 0; - - if (tTd(40, 1)) - { - for (w = WorkQ; w != NULL; w = w->w_next) - printf("%32s: pri=%ld\n", w->w_name, w->w_pri); - } - - return (wn); -} -/* -** GROW_WLIST -- make the work list larger -** -** Parameters: -** none. -** -** Returns: -** none. -** -** Side Effects: -** Adds another QUEUESEGSIZE entries to WorkList if possible. -** It can fail if there isn't enough memory, so WorkListSize -** should be checked again upon return. -*/ - -void -grow_wlist() -{ - if (tTd(41, 1)) - printf("grow_wlist: WorkListSize=%d\n", WorkListSize); - if (WorkList == NULL) - { - WorkList = (WORK *) xalloc(sizeof(WORK) * (QUEUESEGSIZE + 1)); - WorkListSize = QUEUESEGSIZE; - } - else - { - int newsize = WorkListSize + QUEUESEGSIZE; - WORK *newlist = (WORK *) realloc((char *)WorkList, - (unsigned)sizeof(WORK) * (newsize + 1)); - - if (newlist != NULL) - { - WorkListSize = newsize; - WorkList = newlist; - if (LogLevel > 1) - { - sm_syslog(LOG_NOTICE, NOQID, - "grew WorkList for %s to %d", - QueueDir, WorkListSize); - } - } - else if (LogLevel > 0) - { - sm_syslog(LOG_ALERT, NOQID, - "FAILED to grow WorkList for %s to %d", - QueueDir, newsize); - } - } - if (tTd(41, 1)) - printf("grow_wlist: WorkListSize now %d\n", WorkListSize); -} -/* -** WORKCMPF0 -- simple priority-only compare function. -** -** Parameters: -** a -- the first argument. -** b -- the second argument. -** -** Returns: -** -1 if a < b -** 0 if a == b -** +1 if a > b -** -** Side Effects: -** none. -*/ - -int -workcmpf0(a, b) - register WORK *a; - register WORK *b; -{ - long pa = a->w_pri; - long pb = b->w_pri; - - if (pa == pb) - return 0; - else if (pa > pb) - return 1; - else - return -1; -} -/* -** WORKCMPF1 -- first compare function for ordering work based on host name. -** -** Sorts on host name, lock status, and priority in that order. -** -** Parameters: -** a -- the first argument. -** b -- the second argument. -** -** Returns: -** <0 if a < b -** 0 if a == b -** >0 if a > b -** -** Side Effects: -** none. -*/ - -int -workcmpf1(a, b) - register WORK *a; - register WORK *b; -{ - int i; - extern int sm_strcasecmp __P((char *, char *)); - - /* host name */ - if (a->w_host != NULL && b->w_host == NULL) - return 1; - else if (a->w_host == NULL && b->w_host != NULL) - return -1; - if (a->w_host != NULL && b->w_host != NULL && - (i = sm_strcasecmp(a->w_host, b->w_host)) != 0) - return i; - - /* lock status */ - if (a->w_lock != b->w_lock) - return b->w_lock - a->w_lock; - - /* job priority */ - return a->w_pri - b->w_pri; -} -/* -** WORKCMPF2 -- second compare function for ordering work based on host name. -** -** Sorts on lock status, host name, and priority in that order. -** -** Parameters: -** a -- the first argument. -** b -- the second argument. -** -** Returns: -** <0 if a < b -** 0 if a == b -** >0 if a > b -** -** Side Effects: -** none. -*/ - -int -workcmpf2(a, b) - register WORK *a; - register WORK *b; -{ - int i; - extern int sm_strcasecmp __P((char *, char *)); - - /* lock status */ - if (a->w_lock != b->w_lock) - return a->w_lock - b->w_lock; - - /* host name */ - if (a->w_host != NULL && b->w_host == NULL) - return 1; - else if (a->w_host == NULL && b->w_host != NULL) - return -1; - if (a->w_host != NULL && b->w_host != NULL && - (i = sm_strcasecmp(a->w_host, b->w_host)) != 0) - return i; - - /* job priority */ - return a->w_pri - b->w_pri; -} -/* -** WORKCMPF3 -- simple submission-time-only compare function. -** -** Parameters: -** a -- the first argument. -** b -- the second argument. -** -** Returns: -** -1 if a < b -** 0 if a == b -** +1 if a > b -** -** Side Effects: -** none. -*/ - -int -workcmpf3(a, b) - register WORK *a; - register WORK *b; -{ - if (a->w_ctime > b->w_ctime) - return 1; - else if (a->w_ctime < b->w_ctime) - return -1; - else - return 0; -} -/* -** DOWORK -- do a work request. -** -** Parameters: -** id -- the ID of the job to run. -** forkflag -- if set, run this in background. -** requeueflag -- if set, reinstantiate the queue quickly. -** This is used when expanding aliases in the queue. -** If forkflag is also set, it doesn't wait for the -** child. -** e - the envelope in which to run it. -** -** Returns: -** process id of process that is running the queue job. -** -** Side Effects: -** The work request is satisfied if possible. -*/ - -pid_t -dowork(id, forkflag, requeueflag, e) - char *id; - bool forkflag; - bool requeueflag; - register ENVELOPE *e; -{ - register pid_t pid; - extern bool readqf __P((ENVELOPE *)); - - if (tTd(40, 1)) - printf("dowork(%s)\n", id); - - /* - ** Fork for work. - */ - - if (forkflag) - { - pid = fork(); - if (pid < 0) - { - syserr("dowork: cannot fork"); - return 0; - } - else if (pid > 0) - { - /* parent -- clean out connection cache */ - mci_flush(FALSE, NULL); - } - else - { - /* child -- error messages to the transcript */ - QuickAbort = OnlyOneError = FALSE; - - /* - ** Since the delivery may happen in a child and the - ** parent does not wait, the parent may close the - ** maps thereby removing any shared memory used by - ** the map. Therefore, open a copy of the maps for - ** the delivery process. - */ - - initmaps(FALSE, e); - } - } - else - { - pid = 0; - } - - if (pid == 0) - { - /* - ** CHILD - ** Lock the control file to avoid duplicate deliveries. - ** Then run the file as though we had just read it. - ** We save an idea of the temporary name so we - ** can recover on interrupt. - */ - - /* set basic modes, etc. */ - (void) alarm(0); - clearenvelope(e, FALSE); - e->e_flags |= EF_QUEUERUN|EF_GLOBALERRS; - e->e_sendmode = SM_DELIVER; - e->e_errormode = EM_MAIL; - e->e_id = id; - GrabTo = UseErrorsTo = FALSE; - ExitStat = EX_OK; - if (forkflag) - { - disconnect(1, e); - OpMode = MD_DELIVER; - } - sm_setproctitle(TRUE, "%s: from queue", id); - if (LogLevel > 76) - sm_syslog(LOG_DEBUG, e->e_id, - "dowork, pid=%d", - getpid()); - - /* don't use the headers from sendmail.cf... */ - e->e_header = NULL; - - /* read the queue control file -- return if locked */ - if (!readqf(e)) - { - if (tTd(40, 4) && e->e_id != NULL) - printf("readqf(%s) failed\n", e->e_id); - e->e_id = NULL; - if (forkflag) - finis(FALSE, EX_OK); - else - return 0; - } - - e->e_flags |= EF_INQUEUE; - eatheader(e, requeueflag); - - if (requeueflag) - queueup(e, FALSE); - - /* do the delivery */ - sendall(e, SM_DELIVER); - - /* finish up and exit */ - if (forkflag) - finis(TRUE, ExitStat); - else - dropenvelope(e, TRUE); - } - e->e_id = NULL; - return pid; -} -/* -** READQF -- read queue file and set up environment. -** -** Parameters: -** e -- the envelope of the job to run. -** -** Returns: -** TRUE if it successfully read the queue file. -** FALSE otherwise. -** -** Side Effects: -** The queue file is returned locked. -*/ - -bool -readqf(e) - register ENVELOPE *e; -{ - register FILE *qfp; - ADDRESS *ctladdr; - struct stat st; - char *bp; - int qfver = 0; - long hdrsize = 0; - register char *p; - char *orcpt = NULL; - bool nomore = FALSE; - char qf[MAXQFNAME]; - char buf[MAXLINE]; - extern ADDRESS *setctluser __P((char *, int)); - - /* - ** Read and process the file. - */ - - strcpy(qf, queuename(e, 'q')); - qfp = fopen(qf, "r+"); - if (qfp == NULL) - { - if (tTd(40, 8)) - printf("readqf(%s): fopen failure (%s)\n", - qf, errstring(errno)); - if (errno != ENOENT) - syserr("readqf: no control file %s", qf); - return FALSE; - } - - if (!lockfile(fileno(qfp), qf, NULL, LOCK_EX|LOCK_NB)) - { - /* being processed by another queuer */ - if (Verbose || tTd(40, 8)) - printf("%s: locked\n", e->e_id); - if (LogLevel > 19) - sm_syslog(LOG_DEBUG, e->e_id, "locked"); - (void) fclose(qfp); - return FALSE; - } - - /* - ** Check the queue file for plausibility to avoid attacks. - */ - - if (fstat(fileno(qfp), &st) < 0) - { - /* must have been being processed by someone else */ - if (tTd(40, 8)) - printf("readqf(%s): fstat failure (%s)\n", - qf, errstring(errno)); - fclose(qfp); - return FALSE; - } - - if ((st.st_uid != geteuid() && geteuid() != RealUid) || - bitset(S_IWOTH|S_IWGRP, st.st_mode)) - { - if (LogLevel > 0) - { - sm_syslog(LOG_ALERT, e->e_id, - "bogus queue file, uid=%d, mode=%o", - st.st_uid, st.st_mode); - } - if (tTd(40, 8)) - printf("readqf(%s): bogus file\n", qf); - loseqfile(e, "bogus file uid in mqueue"); - fclose(qfp); - return FALSE; - } - - if (st.st_size == 0) - { - /* must be a bogus file -- if also old, just remove it */ - if (st.st_ctime + 10 * 60 < curtime()) - { - qf[0] = 'd'; - (void) unlink(qf); - qf[0] = 'q'; - (void) unlink(qf); - } - fclose(qfp); - return FALSE; - } - - if (st.st_nlink == 0) - { - /* - ** Race condition -- we got a file just as it was being - ** unlinked. Just assume it is zero length. - */ - - fclose(qfp); - return FALSE; - } - - /* good file -- save this lock */ - e->e_lockfp = qfp; - - /* do basic system initialization */ - initsys(e); - define('i', e->e_id, e); - - LineNumber = 0; - e->e_flags |= EF_GLOBALERRS; - OpMode = MD_DELIVER; - ctladdr = NULL; - e->e_dfino = -1; - e->e_msgsize = -1; - while ((bp = fgetfolded(buf, sizeof buf, qfp)) != NULL) - { - register char *p; - u_long qflags; - ADDRESS *q; - int mid; - auto char *ep; - - if (tTd(40, 4)) - printf("+++++ %s\n", bp); - if (nomore) - { - /* hack attack */ - syserr("SECURITY ALERT: extra data in qf: %s", bp); - fclose(qfp); - loseqfile(e, "bogus queue line"); - return FALSE; - } - switch (bp[0]) - { - case 'V': /* queue file version number */ - qfver = atoi(&bp[1]); - if (qfver <= QF_VERSION) - break; - syserr("Version number in qf (%d) greater than max (%d)", - qfver, QF_VERSION); - fclose(qfp); - loseqfile(e, "unsupported qf file version"); - return FALSE; - - case 'C': /* specify controlling user */ - ctladdr = setctluser(&bp[1], qfver); - break; - - case 'Q': /* original recipient */ - orcpt = newstr(&bp[1]); - break; - - case 'R': /* specify recipient */ - p = bp; - qflags = 0; - if (qfver >= 1) - { - /* get flag bits */ - while (*++p != '\0' && *p != ':') - { - switch (*p) - { - case 'N': - qflags |= QHASNOTIFY; - break; - - case 'S': - qflags |= QPINGONSUCCESS; - break; - - case 'F': - qflags |= QPINGONFAILURE; - break; - - case 'D': - qflags |= QPINGONDELAY; - break; - - case 'P': - qflags |= QPRIMARY; - break; - } - } - } - else - qflags |= QPRIMARY; - q = parseaddr(++p, NULLADDR, RF_COPYALL, '\0', NULL, e); - if (q != NULL) - { - q->q_alias = ctladdr; - if (qfver >= 1) - q->q_flags &= ~Q_PINGFLAGS; - q->q_flags |= qflags; - q->q_orcpt = orcpt; - (void) recipient(q, &e->e_sendqueue, 0, e); - } - orcpt = NULL; - break; - - case 'E': /* specify error recipient */ - /* no longer used */ - break; - - case 'H': /* header */ - (void) chompheader(&bp[1], FALSE, NULL, e); - hdrsize += strlen(&bp[1]); - break; - - case 'L': /* Solaris Content-Length: */ - case 'M': /* message */ - /* ignore this; we want a new message next time */ - break; - - case 'S': /* sender */ - setsender(newstr(&bp[1]), e, NULL, '\0', TRUE); - break; - - case 'B': /* body type */ - e->e_bodytype = newstr(&bp[1]); - break; - -#if _FFR_SAVE_CHARSET - case 'X': /* character set */ - e->e_charset = newstr(&bp[1]); - break; -#endif - - case 'D': /* data file name */ - /* obsolete -- ignore */ - break; - - case 'T': /* init time */ - e->e_ctime = atol(&bp[1]); - break; - - case 'I': /* data file's inode number */ - /* regenerated below */ - break; - - case 'K': /* time of last deliver attempt */ - e->e_dtime = atol(&buf[1]); - break; - - case 'N': /* number of delivery attempts */ - e->e_ntries = atoi(&buf[1]); - - /* if this has been tried recently, let it be */ - if (e->e_ntries > 0 && - MinQueueAge > 0 && e->e_dtime <= curtime() && - curtime() < e->e_dtime + MinQueueAge) - { - char *howlong = pintvl(curtime() - e->e_dtime, TRUE); - - if (Verbose || tTd(40, 8)) - printf("%s: too young (%s)\n", - e->e_id, howlong); - if (LogLevel > 19) - sm_syslog(LOG_DEBUG, e->e_id, - "too young (%s)", - howlong); - e->e_id = NULL; - unlockqueue(e); - return FALSE; - } - break; - - case 'P': /* message priority */ - e->e_msgpriority = atol(&bp[1]) + WkTimeFact; - break; - - case 'F': /* flag bits */ - if (strncmp(bp, "From ", 5) == 0) - { - /* we are being spoofed! */ - syserr("SECURITY ALERT: bogus qf line %s", bp); - fclose(qfp); - loseqfile(e, "bogus queue line"); - return FALSE; - } - for (p = &bp[1]; *p != '\0'; p++) - { - switch (*p) - { - case 'w': /* warning sent */ - e->e_flags |= EF_WARNING; - break; - - case 'r': /* response */ - e->e_flags |= EF_RESPONSE; - break; - - case '8': /* has 8 bit data */ - e->e_flags |= EF_HAS8BIT; - break; - - case 'b': /* delete Bcc: header */ - e->e_flags |= EF_DELETE_BCC; - break; - - case 'd': /* envelope has DSN RET= */ - e->e_flags |= EF_RET_PARAM; - break; - - case 'n': /* don't return body */ - e->e_flags |= EF_NO_BODY_RETN; - break; - } - } - break; - - case 'Z': /* original envelope id from ESMTP */ - e->e_envid = newstr(&bp[1]); - break; - - case '$': /* define macro */ - mid = macid(&bp[1], &ep); - define(mid, newstr(ep), e); - break; - - case '.': /* terminate file */ - nomore = TRUE; - break; - - default: - syserr("readqf: %s: line %d: bad line \"%s\"", - qf, LineNumber, shortenstring(bp, MAXSHORTSTR)); - fclose(qfp); - loseqfile(e, "unrecognized line"); - return FALSE; - } - - if (bp != buf) - free(bp); - } - - /* - ** If we haven't read any lines, this queue file is empty. - ** Arrange to remove it without referencing any null pointers. - */ - - if (LineNumber == 0) - { - errno = 0; - e->e_flags |= EF_CLRQUEUE | EF_FATALERRS | EF_RESPONSE; - return TRUE; - } - - /* - ** Arrange to read the data file. - */ - - p = queuename(e, 'd'); - e->e_dfp = fopen(p, "r"); - if (e->e_dfp == NULL) - { - syserr("readqf: cannot open %s", p); - } - else - { - e->e_flags |= EF_HAS_DF; - if (fstat(fileno(e->e_dfp), &st) >= 0) - { - e->e_msgsize = st.st_size + hdrsize; - e->e_dfdev = st.st_dev; - e->e_dfino = st.st_ino; - } - } - - return TRUE; -} -/* -** PRINTQUEUE -- print out a representation of the mail queue -** -** Parameters: -** none. -** -** Returns: -** none. -** -** Side Effects: -** Prints a listing of the mail queue on the standard output. -*/ - -void -printqueue() -{ - register WORK *w; - FILE *f; - int nrequests; - char buf[MAXLINE]; - - /* - ** Check for permission to print the queue - */ - - if (bitset(PRIV_RESTRICTMAILQ, PrivacyFlags) && RealUid != 0) - { - struct stat st; -# ifdef NGROUPS_MAX - int n; - extern GIDSET_T InitialGidSet[NGROUPS_MAX]; -# endif - - if (stat(QueueDir, &st) < 0) - { - syserr("Cannot stat %s", QueueDir); - return; - } -# ifdef NGROUPS_MAX - n = NGROUPS_MAX; - while (--n >= 0) - { - if (InitialGidSet[n] == st.st_gid) - break; - } - if (n < 0 && RealGid != st.st_gid) -# else - if (RealGid != st.st_gid) -# endif - { - usrerr("510 You are not permitted to see the queue"); - setstat(EX_NOPERM); - return; - } - } - - /* - ** Read and order the queue. - */ - - nrequests = orderq(TRUE); - - /* - ** Print the work list that we have read. - */ - - /* first see if there is anything */ - if (nrequests <= 0) - { - printf("Mail queue is empty\n"); - return; - } - - CurrentLA = getla(); /* get load average */ - - printf("\t\tMail Queue (%d request%s", nrequests, nrequests == 1 ? "" : "s"); - if (MaxQueueRun > 0 && nrequests > MaxQueueRun) - printf(", only %d printed", MaxQueueRun); - if (Verbose) - printf(")\n--Q-ID-- --Size-- -Priority- ---Q-Time--- -----------Sender/Recipient-----------\n"); - else - printf(")\n--Q-ID-- --Size-- -----Q-Time----- ------------Sender/Recipient------------\n"); - for (w = WorkQ; w != NULL; w = w->w_next) - { - struct stat st; - auto time_t submittime = 0; - long dfsize; - int flags = 0; - int qfver; - char statmsg[MAXLINE]; - char bodytype[MAXNAME + 1]; - - printf("%8s", w->w_name + 2); - f = fopen(w->w_name, "r"); - if (f == NULL) - { - printf(" (job completed)\n"); - errno = 0; - continue; - } - w->w_name[0] = 'd'; - if (stat(w->w_name, &st) >= 0) - dfsize = st.st_size; - else - dfsize = -1; - if (w->w_lock) - printf("*"); - else if (w->w_tooyoung) - printf("-"); - else if (shouldqueue(w->w_pri, w->w_ctime)) - printf("X"); - else - printf(" "); - errno = 0; - - statmsg[0] = bodytype[0] = '\0'; - qfver = 0; - while (fgets(buf, sizeof buf, f) != NULL) - { - register int i; - register char *p; - - fixcrlf(buf, TRUE); - switch (buf[0]) - { - case 'V': /* queue file version */ - qfver = atoi(&buf[1]); - break; - - case 'M': /* error message */ - if ((i = strlen(&buf[1])) >= sizeof statmsg) - i = sizeof statmsg - 1; - bcopy(&buf[1], statmsg, i); - statmsg[i] = '\0'; - break; - - case 'B': /* body type */ - if ((i = strlen(&buf[1])) >= sizeof bodytype) - i = sizeof bodytype - 1; - bcopy(&buf[1], bodytype, i); - bodytype[i] = '\0'; - break; - - case 'S': /* sender name */ - if (Verbose) - printf("%8ld %10ld%c%.12s %.78s", - dfsize, - w->w_pri, - bitset(EF_WARNING, flags) ? '+' : ' ', - ctime(&submittime) + 4, - &buf[1]); - else - printf("%8ld %.16s %.45s", dfsize, - ctime(&submittime), &buf[1]); - if (statmsg[0] != '\0' || bodytype[0] != '\0') - { - printf("\n %10.10s", bodytype); - if (statmsg[0] != '\0') - printf(" (%.*s)", - Verbose ? 100 : 60, - statmsg); - } - break; - - case 'C': /* controlling user */ - if (Verbose) - printf("\n\t\t\t\t (---%.74s---)", - &buf[1]); - break; - - case 'R': /* recipient name */ - p = &buf[1]; - if (qfver >= 1) - { - p = strchr(p, ':'); - if (p == NULL) - break; - p++; - } - if (Verbose) - printf("\n\t\t\t\t\t %.78s", p); - else - printf("\n\t\t\t\t %.45s", p); - break; - - case 'T': /* creation time */ - submittime = atol(&buf[1]); - break; - - case 'F': /* flag bits */ - for (p = &buf[1]; *p != '\0'; p++) - { - switch (*p) - { - case 'w': - flags |= EF_WARNING; - break; - } - } - } - } - if (submittime == (time_t) 0) - printf(" (no control file)"); - printf("\n"); - (void) fclose(f); - } -} - -# endif /* QUEUE */ -/* -** QUEUENAME -- build a file name in the queue directory for this envelope. -** -** Assigns an id code if one does not already exist. -** This code is very careful to avoid trashing existing files -** under any circumstances. -** -** Parameters: -** e -- envelope to build it in/from. -** type -- the file type, used as the first character -** of the file name. -** -** Returns: -** a pointer to the new file name (in a static buffer). -** -** Side Effects: -** If no id code is already assigned, queuename will -** assign an id code, create a qf file, and leave a -** locked, open-for-write file pointer in the envelope. -*/ - -#ifndef ENOLCK -# define ENOLCK -1 -#endif -#ifndef ENOSPC -# define ENOSPC -1 -#endif - -char * -queuename(e, type) - register ENVELOPE *e; - int type; -{ - static pid_t pid = -1; - static char c0; - static char c1; - static char c2; - time_t now; - struct tm *tm; - static char buf[MAXNAME + 1]; - - if (e->e_id == NULL) - { - char qf[MAXQFNAME]; - - /* find a unique id */ - if (pid != getpid()) - { - /* new process -- start back at "AA" */ - pid = getpid(); - now = curtime(); - tm = localtime(&now); - c0 = 'A' + tm->tm_hour; - c1 = 'A'; - c2 = 'A' - 1; - } - (void) snprintf(qf, sizeof qf, "qf%cAA%05d", c0, pid); - - while (c1 < '~' || c2 < 'Z') - { - int i; - int attempts = 0; - - if (c2 >= 'Z') - { - c1++; - c2 = 'A' - 1; - } - qf[3] = c1; - qf[4] = ++c2; - if (tTd(7, 20)) - printf("queuename: trying \"%s\"\n", qf); - - i = open(qf, O_WRONLY|O_CREAT|O_EXCL, FileMode); - if (i < 0) - { - if (errno == EEXIST) - continue; - syserr("queuename: Cannot create \"%s\" in \"%s\" (euid=%d)", - qf, QueueDir, geteuid()); - finis(FALSE, EX_UNAVAILABLE); - } - do - { - if (attempts > 0) - sleep(attempts); - e->e_lockfp = 0; - if (lockfile(i, qf, NULL, LOCK_EX|LOCK_NB)) - { - e->e_lockfp = fdopen(i, "w"); - break; - } - } while ((errno == ENOLCK || errno == ENOSPC) && - attempts++ < 4); - - /* Successful lock */ - if (e->e_lockfp != 0) - break; - -#if !HASFLOCK - if (errno != EAGAIN && errno != EACCES) -#else - if (errno != EWOULDBLOCK) -#endif - { - syserr("queuename: Cannot lock \"%s\" in \"%s\" (euid=%d)", - qf, QueueDir, geteuid()); - finis(FALSE, EX_OSERR); - } - - /* a reader got the file; abandon it and try again */ - (void) close(i); - } - if (c1 >= '~' && c2 >= 'Z') - { - syserr("queuename: Cannot create \"%s\" in \"%s\" (euid=%d)", - qf, QueueDir, geteuid()); - finis(FALSE, EX_OSERR); - } - e->e_id = newstr(&qf[2]); - define('i', e->e_id, e); - if (tTd(7, 1)) - printf("queuename: assigned id %s, env=%lx\n", - e->e_id, (u_long) e); - if (tTd(7, 9)) - { - printf(" lockfd="); - dumpfd(fileno(e->e_lockfp), TRUE, FALSE); - } - if (LogLevel > 93) - sm_syslog(LOG_DEBUG, e->e_id, "assigned id"); - } - - if (type == '\0') - return (NULL); - (void) snprintf(buf, sizeof buf, "%cf%s", type, e->e_id); - if (tTd(7, 2)) - printf("queuename: %s\n", buf); - return (buf); -} -/* -** UNLOCKQUEUE -- unlock the queue entry for a specified envelope -** -** Parameters: -** e -- the envelope to unlock. -** -** Returns: -** none -** -** Side Effects: -** unlocks the queue for `e'. -*/ - -void -unlockqueue(e) - ENVELOPE *e; -{ - if (tTd(51, 4)) - printf("unlockqueue(%s)\n", - e->e_id == NULL ? "NOQUEUE" : e->e_id); - - /* if there is a lock file in the envelope, close it */ - if (e->e_lockfp != NULL) - xfclose(e->e_lockfp, "unlockqueue", e->e_id); - e->e_lockfp = NULL; - - /* don't create a queue id if we don't already have one */ - if (e->e_id == NULL) - return; - - /* remove the transcript */ - if (LogLevel > 87) - sm_syslog(LOG_DEBUG, e->e_id, "unlock"); - if (!tTd(51, 104)) - xunlink(queuename(e, 'x')); - -} -/* -** SETCTLUSER -- create a controlling address -** -** Create a fake "address" given only a local login name; this is -** used as a "controlling user" for future recipient addresses. -** -** Parameters: -** user -- the user name of the controlling user. -** qfver -- the version stamp of this qf file. -** -** Returns: -** An address descriptor for the controlling user. -** -** Side Effects: -** none. -*/ - -ADDRESS * -setctluser(user, qfver) - char *user; - int qfver; -{ - register ADDRESS *a; - struct passwd *pw; - char *p; - - /* - ** See if this clears our concept of controlling user. - */ - - if (user == NULL || *user == '\0') - return NULL; - - /* - ** Set up addr fields for controlling user. - */ - - a = (ADDRESS *) xalloc(sizeof *a); - bzero((char *) a, sizeof *a); - - if (*user == '\0') - { - p = NULL; - a->q_user = newstr(DefUser); - } - else if (*user == ':') - { - p = &user[1]; - a->q_user = newstr(p); - } - else - { - p = strtok(user, ":"); - a->q_user = newstr(user); - if (qfver >= 2) - { - if ((p = strtok(NULL, ":")) != NULL) - a->q_uid = atoi(p); - if ((p = strtok(NULL, ":")) != NULL) - a->q_gid = atoi(p); - if ((p = strtok(NULL, ":")) != NULL) - a->q_flags |= QGOODUID; - } - else if ((pw = sm_getpwnam(user)) != NULL) - { - if (strcmp(pw->pw_dir, "/") == 0) - a->q_home = ""; - else - a->q_home = newstr(pw->pw_dir); - a->q_uid = pw->pw_uid; - a->q_gid = pw->pw_gid; - a->q_flags |= QGOODUID; - } - } - - a->q_flags |= QPRIMARY; /* flag as a "ctladdr" */ - a->q_mailer = LocalMailer; - if (p == NULL) - a->q_paddr = a->q_user; - else - a->q_paddr = newstr(p); - return a; -} -/* -** LOSEQFILE -- save the qf as Qf and try to let someone know -** -** Parameters: -** e -- the envelope (e->e_id will be used). -** why -- reported to whomever can hear. -** -** Returns: -** none. -*/ - -void -loseqfile(e, why) - register ENVELOPE *e; - char *why; -{ - char *p; - char buf[MAXQFNAME + 1]; - - if (e == NULL || e->e_id == NULL) - return; - p = queuename(e, 'q'); - if (strlen(p) > MAXQFNAME) - { - syserr("loseqfile: queuename (%s) too long", p); - return; - } - strcpy(buf, p); - p = queuename(e, 'Q'); - if (rename(buf, p) < 0) - syserr("cannot rename(%s, %s), uid=%d", buf, p, geteuid()); - else if (LogLevel > 0) - sm_syslog(LOG_ALERT, e->e_id, - "Losing %s: %s", buf, why); -} diff --git a/src/readcf.c b/src/readcf.c deleted file mode 100644 index df40097..0000000 --- a/src/readcf.c +++ /dev/null @@ -1,2920 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)readcf.c 8.238 (Berkeley) 1/28/1999"; -#endif /* not lint */ - -# include "sendmail.h" -# include <grp.h> -#if NAMED_BIND -# include <resolv.h> -#endif - -/* -** READCF -- read configuration file. -** -** This routine reads the configuration file and builds the internal -** form. -** -** The file is formatted as a sequence of lines, each taken -** atomically. The first character of each line describes how -** the line is to be interpreted. The lines are: -** Dxval Define macro x to have value val. -** Cxword Put word into class x. -** Fxfile [fmt] Read file for lines to put into -** class x. Use scanf string 'fmt' -** or "%s" if not present. Fmt should -** only produce one string-valued result. -** Hname: value Define header with field-name 'name' -** and value as specified; this will be -** macro expanded immediately before -** use. -** Sn Use rewriting set n. -** Rlhs rhs Rewrite addresses that match lhs to -** be rhs. -** Mn arg=val... Define mailer. n is the internal name. -** Args specify mailer parameters. -** Oxvalue Set option x to value. -** Pname=value Set precedence name to value. -** Vversioncode[/vendorcode] -** Version level/vendor name of -** configuration syntax. -** Kmapname mapclass arguments.... -** Define keyed lookup of a given class. -** Arguments are class dependent. -** Eenvar=value Set the environment value to the given value. -** -** Parameters: -** cfname -- configuration file name. -** safe -- TRUE if this is the system config file; -** FALSE otherwise. -** e -- the main envelope. -** -** Returns: -** none. -** -** Side Effects: -** Builds several internal tables. -*/ - -void -readcf(cfname, safe, e) - char *cfname; - bool safe; - register ENVELOPE *e; -{ - FILE *cf; - int ruleset = 0; - char *q; - struct rewrite *rwp = NULL; - char *bp; - auto char *ep; - int nfuzzy; - char *file; - bool optional; - int mid; - register char *p; - int sff = SFF_OPENASROOT; - struct stat statb; - char buf[MAXLINE]; - char exbuf[MAXLINE]; - char pvpbuf[MAXLINE + MAXATOM]; - static char *null_list[1] = { NULL }; - extern char **copyplist __P((char **, bool)); - extern char *munchstring __P((char *, char **, int)); - extern void fileclass __P((int, char *, char *, bool, bool)); - extern void toomany __P((int, int)); - extern void translate_dollars __P((char *)); - extern void inithostmaps __P((void)); - - FileName = cfname; - LineNumber = 0; - - if (DontLockReadFiles) - sff |= SFF_NOLOCK; - cf = safefopen(cfname, O_RDONLY, 0444, sff); - if (cf == NULL) - { - syserr("cannot open"); - finis(FALSE, EX_OSFILE); - } - - if (fstat(fileno(cf), &statb) < 0) - { - syserr("cannot fstat"); - finis(FALSE, EX_OSFILE); - } - - if (!S_ISREG(statb.st_mode)) - { - syserr("not a plain file"); - finis(FALSE, EX_OSFILE); - } - - if (OpMode != MD_TEST && bitset(S_IWGRP|S_IWOTH, statb.st_mode)) - { - if (OpMode == MD_DAEMON || OpMode == MD_INITALIAS) - fprintf(stderr, "%s: WARNING: dangerous write permissions\n", - FileName); - if (LogLevel > 0) - sm_syslog(LOG_CRIT, NOQID, - "%s: WARNING: dangerous write permissions", - FileName); - } - -#ifdef XLA - xla_zero(); -#endif - - while ((bp = fgetfolded(buf, sizeof buf, cf)) != NULL) - { - if (bp[0] == '#') - { - if (bp != buf) - free(bp); - continue; - } - - /* do macro expansion mappings */ - translate_dollars(bp); - - /* interpret this line */ - errno = 0; - switch (bp[0]) - { - case '\0': - case '#': /* comment */ - break; - - case 'R': /* rewriting rule */ - for (p = &bp[1]; *p != '\0' && *p != '\t'; p++) - continue; - - if (*p == '\0') - { - syserr("invalid rewrite line \"%s\" (tab expected)", bp); - break; - } - - /* allocate space for the rule header */ - if (rwp == NULL) - { - RewriteRules[ruleset] = rwp = - (struct rewrite *) xalloc(sizeof *rwp); - } - else - { - rwp->r_next = (struct rewrite *) xalloc(sizeof *rwp); - rwp = rwp->r_next; - } - rwp->r_next = NULL; - - /* expand and save the LHS */ - *p = '\0'; - expand(&bp[1], exbuf, sizeof exbuf, e); - rwp->r_lhs = prescan(exbuf, '\t', pvpbuf, - sizeof pvpbuf, NULL, NULL); - nfuzzy = 0; - if (rwp->r_lhs != NULL) - { - register char **ap; - - rwp->r_lhs = copyplist(rwp->r_lhs, TRUE); - - /* count the number of fuzzy matches in LHS */ - for (ap = rwp->r_lhs; *ap != NULL; ap++) - { - char *botch; - - botch = NULL; - switch (**ap & 0377) - { - case MATCHZANY: - case MATCHANY: - case MATCHONE: - case MATCHCLASS: - case MATCHNCLASS: - nfuzzy++; - break; - - case MATCHREPL: - botch = "$0-$9"; - break; - - case CANONUSER: - botch = "$:"; - break; - - case CALLSUBR: - botch = "$>"; - break; - - case CONDIF: - botch = "$?"; - break; - - case CONDFI: - botch = "$."; - break; - - case HOSTBEGIN: - botch = "$["; - break; - - case HOSTEND: - botch = "$]"; - break; - - case LOOKUPBEGIN: - botch = "$("; - break; - - case LOOKUPEND: - botch = "$)"; - break; - } - if (botch != NULL) - syserr("Inappropriate use of %s on LHS", - botch); - } - } - else - { - syserr("R line: null LHS"); - rwp->r_lhs = null_list; - } - - /* expand and save the RHS */ - while (*++p == '\t') - continue; - q = p; - while (*p != '\0' && *p != '\t') - p++; - *p = '\0'; - expand(q, exbuf, sizeof exbuf, e); - rwp->r_rhs = prescan(exbuf, '\t', pvpbuf, - sizeof pvpbuf, NULL, NULL); - if (rwp->r_rhs != NULL) - { - register char **ap; - - rwp->r_rhs = copyplist(rwp->r_rhs, TRUE); - - /* check no out-of-bounds replacements */ - nfuzzy += '0'; - for (ap = rwp->r_rhs; *ap != NULL; ap++) - { - char *botch; - - botch = NULL; - switch (**ap & 0377) - { - case MATCHREPL: - if ((*ap)[1] <= '0' || (*ap)[1] > nfuzzy) - { - syserr("replacement $%c out of bounds", - (*ap)[1]); - } - break; - - case MATCHZANY: - botch = "$*"; - break; - - case MATCHANY: - botch = "$+"; - break; - - case MATCHONE: - botch = "$-"; - break; - - case MATCHCLASS: - botch = "$="; - break; - - case MATCHNCLASS: - botch = "$~"; - break; - } - if (botch != NULL) - syserr("Inappropriate use of %s on RHS", - botch); - } - } - else - { - syserr("R line: null RHS"); - rwp->r_rhs = null_list; - } - break; - - case 'S': /* select rewriting set */ - expand(&bp[1], exbuf, sizeof exbuf, e); - ruleset = strtorwset(exbuf, NULL, ST_ENTER); - if (ruleset < 0) - break; - rwp = RewriteRules[ruleset]; - if (rwp != NULL) - { - if (OpMode == MD_TEST || tTd(37, 1)) - printf("WARNING: Ruleset %s has multiple definitions\n", - &bp[1]); - while (rwp->r_next != NULL) - rwp = rwp->r_next; - } - break; - - case 'D': /* macro definition */ - mid = macid(&bp[1], &ep); - p = munchstring(ep, NULL, '\0'); - define(mid, newstr(p), e); - break; - - case 'H': /* required header line */ - (void) chompheader(&bp[1], TRUE, NULL, e); - break; - - case 'C': /* word class */ - case 'T': /* trusted user (set class `t') */ - if (bp[0] == 'C') - { - mid = macid(&bp[1], &ep); - expand(ep, exbuf, sizeof exbuf, e); - p = exbuf; - } - else - { - mid = 't'; - p = &bp[1]; - } - while (*p != '\0') - { - register char *wd; - char delim; - - while (*p != '\0' && isascii(*p) && isspace(*p)) - p++; - wd = p; - while (*p != '\0' && !(isascii(*p) && isspace(*p))) - p++; - delim = *p; - *p = '\0'; - if (wd[0] != '\0') - setclass(mid, wd); - *p = delim; - } - break; - - case 'F': /* word class from file */ - mid = macid(&bp[1], &ep); - for (p = ep; isascii(*p) && isspace(*p); ) - p++; - if (p[0] == '-' && p[1] == 'o') - { - optional = TRUE; - while (*p != '\0' && !(isascii(*p) && isspace(*p))) - p++; - while (isascii(*p) && isspace(*p)) - p++; - } - else - optional = FALSE; - file = p; - if (*file == '|') - p = "%s"; - else - { - while (*p != '\0' && !(isascii(*p) && isspace(*p))) - p++; - if (*p == '\0') - p = "%s"; - else - { - *p = '\0'; - while (isascii(*++p) && isspace(*p)) - continue; - } - } - fileclass(mid, file, p, safe, optional); - break; - -#ifdef XLA - case 'L': /* extended load average description */ - xla_init(&bp[1]); - break; -#endif - -#if defined(SUN_EXTENSIONS) && defined(SUN_LOOKUP_MACRO) - case 'L': /* lookup macro */ - case 'G': /* lookup class */ - /* reserved for Sun -- NIS+ database lookup */ - if (VendorCode != VENDOR_SUN) - goto badline; - sun_lg_config_line(bp, e); - break; -#endif - - case 'M': /* define mailer */ - makemailer(&bp[1]); - break; - - case 'O': /* set option */ - setoption(bp[1], &bp[2], safe, FALSE, e); - break; - - case 'P': /* set precedence */ - if (NumPriorities >= MAXPRIORITIES) - { - toomany('P', MAXPRIORITIES); - break; - } - for (p = &bp[1]; *p != '\0' && *p != '='; p++) - continue; - if (*p == '\0') - goto badline; - *p = '\0'; - Priorities[NumPriorities].pri_name = newstr(&bp[1]); - Priorities[NumPriorities].pri_val = atoi(++p); - NumPriorities++; - break; - - case 'V': /* configuration syntax version */ - for (p = &bp[1]; isascii(*p) && isspace(*p); p++) - continue; - if (!isascii(*p) || !isdigit(*p)) - { - syserr("invalid argument to V line: \"%.20s\"", - &bp[1]); - break; - } - ConfigLevel = strtol(p, &ep, 10); - - /* - ** Do heuristic tweaking for back compatibility. - */ - - if (ConfigLevel >= 5) - { - /* level 5 configs have short name in $w */ - p = macvalue('w', e); - if (p != NULL && (p = strchr(p, '.')) != NULL) - *p = '\0'; - define('w', macvalue('w', e), e); - } - if (ConfigLevel >= 6) - { - ColonOkInAddr = FALSE; - } - - /* - ** Look for vendor code. - */ - - if (*ep++ == '/') - { - extern bool setvendor __P((char *)); - - /* extract vendor code */ - for (p = ep; isascii(*p) && isalpha(*p); ) - p++; - *p = '\0'; - - if (!setvendor(ep)) - syserr("invalid V line vendor code: \"%s\"", - ep); - } - break; - - case 'K': - expand(&bp[1], exbuf, sizeof exbuf, e); - (void) makemapentry(exbuf); - break; - - case 'E': - p = strchr(bp, '='); - if (p != NULL) - *p++ = '\0'; - setuserenv(&bp[1], p); - break; - - default: - badline: - syserr("unknown configuration line \"%s\"", bp); - } - if (bp != buf) - free(bp); - } - if (ferror(cf)) - { - syserr("I/O read error"); - finis(FALSE, EX_OSFILE); - } - fclose(cf); - FileName = NULL; - - /* initialize host maps from local service tables */ - inithostmaps(); - - /* determine if we need to do special name-server frotz */ - { - int nmaps; - char *maptype[MAXMAPSTACK]; - short mapreturn[MAXMAPACTIONS]; - - nmaps = switch_map_find("hosts", maptype, mapreturn); - UseNameServer = FALSE; - if (nmaps > 0 && nmaps <= MAXMAPSTACK) - { - register int mapno; - - for (mapno = 0; mapno < nmaps && !UseNameServer; mapno++) - { - if (strcmp(maptype[mapno], "dns") == 0) - UseNameServer = TRUE; - } - } - -#ifdef HESIOD - nmaps = switch_map_find("passwd", maptype, mapreturn); - UseHesiod = FALSE; - if (nmaps > 0 && nmaps <= MAXMAPSTACK) - { - register int mapno; - - for (mapno = 0; mapno < nmaps && !UseHesiod; mapno++) - { - if (strcmp(maptype[mapno], "hesiod") == 0) - UseHesiod = TRUE; - } - } -#endif - } -} -/* -** TRANSLATE_DOLLARS -- convert $x into internal form -** -** Actually does all appropriate pre-processing of a config line -** to turn it into internal form. -** -** Parameters: -** bp -- the buffer to translate. -** -** Returns: -** None. The buffer is translated in place. Since the -** translations always make the buffer shorter, this is -** safe without a size parameter. -*/ - -void -translate_dollars(bp) - char *bp; -{ - register char *p; - auto char *ep; - - for (p = bp; *p != '\0'; p++) - { - if (*p == '#' && p > bp && ConfigLevel >= 3) - { - /* this is an on-line comment */ - register char *e; - - switch (*--p & 0377) - { - case MACROEXPAND: - /* it's from $# -- let it go through */ - p++; - break; - - case '\\': - /* it's backslash escaped */ - (void) strcpy(p, p + 1); - break; - - default: - /* delete preceeding white space */ - while (isascii(*p) && isspace(*p) && - *p != '\n' && p > bp) - p--; - if ((e = strchr(++p, '\n')) != NULL) - (void) strcpy(p, e); - else - *p-- = '\0'; - break; - } - continue; - } - - if (*p != '$' || p[1] == '\0') - continue; - - if (p[1] == '$') - { - /* actual dollar sign.... */ - (void) strcpy(p, p + 1); - continue; - } - - /* convert to macro expansion character */ - *p++ = MACROEXPAND; - - /* special handling for $=, $~, $&, and $? */ - if (*p == '=' || *p == '~' || *p == '&' || *p == '?') - p++; - - /* convert macro name to code */ - *p = macid(p, &ep); - if (ep != p) - strcpy(p + 1, ep); - } - - /* strip trailing white space from the line */ - while (--p > bp && isascii(*p) && isspace(*p)) - *p = '\0'; -} -/* -** TOOMANY -- signal too many of some option -** -** Parameters: -** id -- the id of the error line -** maxcnt -- the maximum possible values -** -** Returns: -** none. -** -** Side Effects: -** gives a syserr. -*/ - -void -toomany(id, maxcnt) - int id; - int maxcnt; -{ - syserr("too many %c lines, %d max", id, maxcnt); -} -/* -** FILECLASS -- read members of a class from a file -** -** Parameters: -** class -- class to define. -** filename -- name of file to read. -** fmt -- scanf string to use for match. -** safe -- if set, this is a safe read. -** optional -- if set, it is not an error for the file to -** not exist. -** -** Returns: -** none -** -** Side Effects: -** -** puts all lines in filename that match a scanf into -** the named class. -*/ - -void -fileclass(class, filename, fmt, safe, optional) - int class; - char *filename; - char *fmt; - bool safe; - bool optional; -{ - FILE *f; - int sff; - pid_t pid; - register char *p; - char buf[MAXLINE]; - - if (tTd(37, 2)) - printf("fileclass(%s, fmt=%s)\n", filename, fmt); - - if (filename[0] == '|') - { - auto int fd; - int i; - char *argv[MAXPV + 1]; - - i = 0; - for (p = strtok(&filename[1], " \t"); p != NULL; p = strtok(NULL, " \t")) - { - if (i >= MAXPV) - break; - argv[i++] = p; - } - argv[i] = NULL; - pid = prog_open(argv, &fd, CurEnv); - if (pid < 0) - f = NULL; - else - f = fdopen(fd, "r"); - } - else - { - pid = -1; - sff = SFF_REGONLY; - if (!bitset(DBS_CLASSFILEINUNSAFEDIRPATH, DontBlameSendmail)) - sff |= SFF_SAFEDIRPATH; - if (!bitset(DBS_LINKEDCLASSFILEINWRITABLEDIR, DontBlameSendmail)) - sff |= SFF_NOWLINK; - if (safe) - sff |= SFF_OPENASROOT; - if (DontLockReadFiles) - sff |= SFF_NOLOCK; - f = safefopen(filename, O_RDONLY, 0, sff); - } - if (f == NULL) - { - if (!optional) - syserr("fileclass: cannot open %s", filename); - return; - } - - while (fgets(buf, sizeof buf, f) != NULL) - { - register char *p; -# if SCANF - char wordbuf[MAXLINE + 1]; -# endif - - if (buf[0] == '#') - continue; -# if SCANF - if (sscanf(buf, fmt, wordbuf) != 1) - continue; - p = wordbuf; -# else /* SCANF */ - p = buf; -# endif /* SCANF */ - - /* - ** Break up the match into words. - */ - - while (*p != '\0') - { - register char *q; - - /* strip leading spaces */ - while (isascii(*p) && isspace(*p)) - p++; - if (*p == '\0') - break; - - /* find the end of the word */ - q = p; - while (*p != '\0' && !(isascii(*p) && isspace(*p))) - p++; - if (*p != '\0') - *p++ = '\0'; - - /* enter the word in the symbol table */ - setclass(class, q); - } - } - - (void) fclose(f); - if (pid > 0) - (void) waitfor(pid); -} -/* -** MAKEMAILER -- define a new mailer. -** -** Parameters: -** line -- description of mailer. This is in labeled -** fields. The fields are: -** A -- the argv for this mailer -** C -- the character set for MIME conversions -** D -- the directory to run in -** E -- the eol string -** F -- the flags associated with the mailer -** L -- the maximum line length -** M -- the maximum message size -** N -- the niceness at which to run -** P -- the path to the mailer -** R -- the recipient rewriting set -** S -- the sender rewriting set -** T -- the mailer type (for DSNs) -** U -- the uid to run as -** The first word is the canonical name of the mailer. -** -** Returns: -** none. -** -** Side Effects: -** enters the mailer into the mailer table. -*/ - -void -makemailer(line) - char *line; -{ - register char *p; - register struct mailer *m; - register STAB *s; - int i; - char fcode; - auto char *endp; - extern int NextMailer; - extern char **makeargv __P((char *)); - extern char *munchstring __P((char *, char **, int)); - - /* allocate a mailer and set up defaults */ - m = (struct mailer *) xalloc(sizeof *m); - bzero((char *) m, sizeof *m); - - /* collect the mailer name */ - for (p = line; *p != '\0' && *p != ',' && !(isascii(*p) && isspace(*p)); p++) - continue; - if (*p != '\0') - *p++ = '\0'; - if (line[0] == '\0') - syserr("name required for mailer"); - m->m_name = newstr(line); - - /* now scan through and assign info from the fields */ - while (*p != '\0') - { - auto char *delimptr; - - while (*p != '\0' && (*p == ',' || (isascii(*p) && isspace(*p)))) - p++; - - /* p now points to field code */ - fcode = *p; - while (*p != '\0' && *p != '=' && *p != ',') - p++; - if (*p++ != '=') - { - syserr("mailer %s: `=' expected", m->m_name); - return; - } - while (isascii(*p) && isspace(*p)) - p++; - - /* p now points to the field body */ - p = munchstring(p, &delimptr, ','); - - /* install the field into the mailer struct */ - switch (fcode) - { - case 'P': /* pathname */ - if (*p == '\0') - syserr("mailer %s: empty path name", m->m_name); - m->m_mailer = newstr(p); - break; - - case 'F': /* flags */ - for (; *p != '\0'; p++) - if (!(isascii(*p) && isspace(*p))) - setbitn(*p, m->m_flags); - break; - - case 'S': /* sender rewriting ruleset */ - case 'R': /* recipient rewriting ruleset */ - i = strtorwset(p, &endp, ST_ENTER); - if (i < 0) - return; - if (fcode == 'S') - m->m_sh_rwset = m->m_se_rwset = i; - else - m->m_rh_rwset = m->m_re_rwset = i; - - p = endp; - if (*p++ == '/') - { - i = strtorwset(p, NULL, ST_ENTER); - if (i < 0) - return; - if (fcode == 'S') - m->m_sh_rwset = i; - else - m->m_rh_rwset = i; - } - break; - - case 'E': /* end of line string */ - if (*p == '\0') - syserr("mailer %s: null end-of-line string", - m->m_name); - m->m_eol = newstr(p); - break; - - case 'A': /* argument vector */ - if (*p == '\0') - syserr("mailer %s: null argument vector", - m->m_name); - m->m_argv = makeargv(p); - break; - - case 'M': /* maximum message size */ - m->m_maxsize = atol(p); - break; - - case 'L': /* maximum line length */ - m->m_linelimit = atoi(p); - if (m->m_linelimit < 0) - m->m_linelimit = 0; - break; - - case 'N': /* run niceness */ - m->m_nice = atoi(p); - break; - - case 'D': /* working directory */ - if (*p == '\0') - syserr("mailer %s: null working directory", - m->m_name); - m->m_execdir = newstr(p); - break; - - case 'C': /* default charset */ - if (*p == '\0') - syserr("mailer %s: null charset", m->m_name); - m->m_defcharset = newstr(p); - break; - - case 'T': /* MTA-Name/Address/Diagnostic types */ - /* extract MTA name type; default to "dns" */ - m->m_mtatype = newstr(p); - p = strchr(m->m_mtatype, '/'); - if (p != NULL) - { - *p++ = '\0'; - if (*p == '\0') - p = NULL; - } - if (*m->m_mtatype == '\0') - m->m_mtatype = "dns"; - - /* extract address type; default to "rfc822" */ - m->m_addrtype = p; - if (p != NULL) - p = strchr(p, '/'); - if (p != NULL) - { - *p++ = '\0'; - if (*p == '\0') - p = NULL; - } - if (m->m_addrtype == NULL || *m->m_addrtype == '\0') - m->m_addrtype = "rfc822"; - - /* extract diagnostic type; default to "smtp" */ - m->m_diagtype = p; - if (m->m_diagtype == NULL || *m->m_diagtype == '\0') - m->m_diagtype = "smtp"; - break; - - case 'U': /* user id */ - if (isascii(*p) && !isdigit(*p)) - { - char *q = p; - struct passwd *pw; - - while (*p != '\0' && isascii(*p) && - (isalnum(*p) || strchr("-_", *p) != NULL)) - p++; - while (isascii(*p) && isspace(*p)) - *p++ = '\0'; - if (*p != '\0') - *p++ = '\0'; - if (*q == '\0') - syserr("mailer %s: null user name", - m->m_name); - pw = sm_getpwnam(q); - if (pw == NULL) - syserr("readcf: mailer U= flag: unknown user %s", q); - else - { - m->m_uid = pw->pw_uid; - m->m_gid = pw->pw_gid; - } - } - else - { - auto char *q; - - m->m_uid = strtol(p, &q, 0); - p = q; - while (isascii(*p) && isspace(*p)) - p++; - if (*p != '\0') - p++; - } - while (isascii(*p) && isspace(*p)) - p++; - if (*p == '\0') - break; - if (isascii(*p) && !isdigit(*p)) - { - char *q = p; - struct group *gr; - - while (isascii(*p) && isalnum(*p)) - p++; - *p++ = '\0'; - if (*q == '\0') - syserr("mailer %s: null group name", - m->m_name); - gr = getgrnam(q); - if (gr == NULL) - syserr("readcf: mailer U= flag: unknown group %s", q); - else - m->m_gid = gr->gr_gid; - } - else - { - m->m_gid = strtol(p, NULL, 0); - } - break; - } - - p = delimptr; - } - - /* do some rationality checking */ - if (m->m_argv == NULL) - { - syserr("M%s: A= argument required", m->m_name); - return; - } - if (m->m_mailer == NULL) - { - syserr("M%s: P= argument required", m->m_name); - return; - } - - if (NextMailer >= MAXMAILERS) - { - syserr("too many mailers defined (%d max)", MAXMAILERS); - return; - } - - /* do some heuristic cleanup for back compatibility */ - if (bitnset(M_LIMITS, m->m_flags)) - { - if (m->m_linelimit == 0) - m->m_linelimit = SMTPLINELIM; - if (ConfigLevel < 2) - setbitn(M_7BITS, m->m_flags); - } - - if (strcmp(m->m_mailer, "[IPC]") == 0 || - strcmp(m->m_mailer, "[TCP]") == 0) - { - if (m->m_mtatype == NULL) - m->m_mtatype = "dns"; - if (m->m_addrtype == NULL) - m->m_addrtype = "rfc822"; - if (m->m_diagtype == NULL) - m->m_diagtype = "smtp"; - } - - if (strcmp(m->m_mailer, "[FILE]") == 0) - { - /* Use the second argument for filename */ - if (m->m_argv[0] == NULL || m->m_argv[1] == NULL || - m->m_argv[2] != NULL) - { - syserr("M%s: too %s parameters for [FILE] mailer", - m->m_name, - (m->m_argv[0] == NULL || - m->m_argv[1] == NULL) ? "few" : "many"); - } - else if (strcmp(m->m_argv[0], "FILE") != 0) - { - syserr("M%s: first argument in [FILE] mailer must be FILE", - m->m_name); - } - } - - if (m->m_eol == NULL) - { - char **pp; - - /* default for SMTP is \r\n; use \n for local delivery */ - for (pp = m->m_argv; *pp != NULL; pp++) - { - char *p; - - for (p = *pp; *p != '\0'; ) - { - if ((*p++ & 0377) == MACROEXPAND && *p == 'u') - break; - } - if (*p != '\0') - break; - } - if (*pp == NULL) - m->m_eol = "\r\n"; - else - m->m_eol = "\n"; - } - - /* enter the mailer into the symbol table */ - s = stab(m->m_name, ST_MAILER, ST_ENTER); - if (s->s_mailer != NULL) - { - i = s->s_mailer->m_mno; - free(s->s_mailer); - } - else - { - i = NextMailer++; - } - Mailer[i] = s->s_mailer = m; - m->m_mno = i; -} -/* -** MUNCHSTRING -- translate a string into internal form. -** -** Parameters: -** p -- the string to munch. -** delimptr -- if non-NULL, set to the pointer of the -** field delimiter character. -** delim -- the delimiter for the field. -** -** Returns: -** the munched string. -*/ - -char * -munchstring(p, delimptr, delim) - register char *p; - char **delimptr; - int delim; -{ - register char *q; - bool backslash = FALSE; - bool quotemode = FALSE; - static char buf[MAXLINE]; - - for (q = buf; *p != '\0' && q < &buf[sizeof buf - 1]; p++) - { - if (backslash) - { - /* everything is roughly literal */ - backslash = FALSE; - switch (*p) - { - case 'r': /* carriage return */ - *q++ = '\r'; - continue; - - case 'n': /* newline */ - *q++ = '\n'; - continue; - - case 'f': /* form feed */ - *q++ = '\f'; - continue; - - case 'b': /* backspace */ - *q++ = '\b'; - continue; - } - *q++ = *p; - } - else - { - if (*p == '\\') - backslash = TRUE; - else if (*p == '"') - quotemode = !quotemode; - else if (quotemode || *p != delim) - *q++ = *p; - else - break; - } - } - - if (delimptr != NULL) - *delimptr = p; - *q++ = '\0'; - return (buf); -} -/* -** MAKEARGV -- break up a string into words -** -** Parameters: -** p -- the string to break up. -** -** Returns: -** a char **argv (dynamically allocated) -** -** Side Effects: -** munges p. -*/ - -char ** -makeargv(p) - register char *p; -{ - char *q; - int i; - char **avp; - char *argv[MAXPV + 1]; - - /* take apart the words */ - i = 0; - while (*p != '\0' && i < MAXPV) - { - q = p; - while (*p != '\0' && !(isascii(*p) && isspace(*p))) - p++; - while (isascii(*p) && isspace(*p)) - *p++ = '\0'; - argv[i++] = newstr(q); - } - argv[i++] = NULL; - - /* now make a copy of the argv */ - avp = (char **) xalloc(sizeof *avp * i); - bcopy((char *) argv, (char *) avp, sizeof *avp * i); - - return (avp); -} -/* -** PRINTRULES -- print rewrite rules (for debugging) -** -** Parameters: -** none. -** -** Returns: -** none. -** -** Side Effects: -** prints rewrite rules. -*/ - -void -printrules() -{ - register struct rewrite *rwp; - register int ruleset; - - for (ruleset = 0; ruleset < 10; ruleset++) - { - if (RewriteRules[ruleset] == NULL) - continue; - printf("\n----Rule Set %d:", ruleset); - - for (rwp = RewriteRules[ruleset]; rwp != NULL; rwp = rwp->r_next) - { - printf("\nLHS:"); - printav(rwp->r_lhs); - printf("RHS:"); - printav(rwp->r_rhs); - } - } -} -/* -** PRINTMAILER -- print mailer structure (for debugging) -** -** Parameters: -** m -- the mailer to print -** -** Returns: -** none. -*/ - -void -printmailer(m) - register MAILER *m; -{ - int j; - - printf("mailer %d (%s): P=%s S=%d/%d R=%d/%d M=%ld U=%d:%d F=", - m->m_mno, m->m_name, - m->m_mailer, m->m_se_rwset, m->m_sh_rwset, - m->m_re_rwset, m->m_rh_rwset, m->m_maxsize, - (int) m->m_uid, (int) m->m_gid); - for (j = '\0'; j <= '\177'; j++) - if (bitnset(j, m->m_flags)) - (void) putchar(j); - printf(" L=%d E=", m->m_linelimit); - xputs(m->m_eol); - if (m->m_defcharset != NULL) - printf(" C=%s", m->m_defcharset); - printf(" T=%s/%s/%s", - m->m_mtatype == NULL ? "<undefined>" : m->m_mtatype, - m->m_addrtype == NULL ? "<undefined>" : m->m_addrtype, - m->m_diagtype == NULL ? "<undefined>" : m->m_diagtype); - if (m->m_argv != NULL) - { - char **a = m->m_argv; - - printf(" A="); - while (*a != NULL) - { - if (a != m->m_argv) - printf(" "); - xputs(*a++); - } - } - printf("\n"); -} -/* -** SETOPTION -- set global processing option -** -** Parameters: -** opt -- option name. -** val -- option value (as a text string). -** safe -- set if this came from a configuration file. -** Some options (if set from the command line) will -** reset the user id to avoid security problems. -** sticky -- if set, don't let other setoptions override -** this value. -** e -- the main envelope. -** -** Returns: -** none. -** -** Side Effects: -** Sets options as implied by the arguments. -*/ - -static BITMAP StickyOpt; /* set if option is stuck */ -extern void settimeout __P((char *, char *)); - - -#if NAMED_BIND - -struct resolverflags -{ - char *rf_name; /* name of the flag */ - long rf_bits; /* bits to set/clear */ -} ResolverFlags[] = -{ - { "debug", RES_DEBUG }, - { "aaonly", RES_AAONLY }, - { "usevc", RES_USEVC }, - { "primary", RES_PRIMARY }, - { "igntc", RES_IGNTC }, - { "recurse", RES_RECURSE }, - { "defnames", RES_DEFNAMES }, - { "stayopen", RES_STAYOPEN }, - { "dnsrch", RES_DNSRCH }, - { "true", 0 }, /* avoid error on old syntax */ - { NULL, 0 } -}; - -#endif - -struct optioninfo -{ - char *o_name; /* long name of option */ - u_char o_code; /* short name of option */ - bool o_safe; /* safe for random people to use */ -} OptionTab[] = -{ - { "SevenBitInput", '7', TRUE }, -#if MIME8TO7 - { "EightBitMode", '8', TRUE }, -#endif - { "AliasFile", 'A', FALSE }, - { "AliasWait", 'a', FALSE }, - { "BlankSub", 'B', FALSE }, - { "MinFreeBlocks", 'b', TRUE }, - { "CheckpointInterval", 'C', TRUE }, - { "HoldExpensive", 'c', FALSE }, - { "AutoRebuildAliases", 'D', FALSE }, - { "DeliveryMode", 'd', TRUE }, - { "ErrorHeader", 'E', FALSE }, - { "ErrorMode", 'e', TRUE }, - { "TempFileMode", 'F', FALSE }, - { "SaveFromLine", 'f', FALSE }, - { "MatchGECOS", 'G', FALSE }, - { "HelpFile", 'H', FALSE }, - { "MaxHopCount", 'h', FALSE }, - { "ResolverOptions", 'I', FALSE }, - { "IgnoreDots", 'i', TRUE }, - { "ForwardPath", 'J', FALSE }, - { "SendMimeErrors", 'j', TRUE }, - { "ConnectionCacheSize", 'k', FALSE }, - { "ConnectionCacheTimeout", 'K', FALSE }, - { "UseErrorsTo", 'l', FALSE }, - { "LogLevel", 'L', TRUE }, - { "MeToo", 'm', TRUE }, - { "CheckAliases", 'n', FALSE }, - { "OldStyleHeaders", 'o', TRUE }, - { "DaemonPortOptions", 'O', FALSE }, - { "PrivacyOptions", 'p', TRUE }, - { "PostmasterCopy", 'P', FALSE }, - { "QueueFactor", 'q', FALSE }, - { "QueueDirectory", 'Q', FALSE }, - { "DontPruneRoutes", 'R', FALSE }, - { "Timeout", 'r', FALSE }, - { "StatusFile", 'S', FALSE }, - { "SuperSafe", 's', TRUE }, - { "QueueTimeout", 'T', FALSE }, - { "TimeZoneSpec", 't', FALSE }, - { "UserDatabaseSpec", 'U', FALSE }, - { "DefaultUser", 'u', FALSE }, - { "FallbackMXhost", 'V', FALSE }, - { "Verbose", 'v', TRUE }, - { "TryNullMXList", 'w', FALSE }, - { "QueueLA", 'x', FALSE }, - { "RefuseLA", 'X', FALSE }, - { "RecipientFactor", 'y', FALSE }, - { "ForkEachJob", 'Y', FALSE }, - { "ClassFactor", 'z', FALSE }, - { "RetryFactor", 'Z', FALSE }, -#define O_QUEUESORTORD 0x81 - { "QueueSortOrder", O_QUEUESORTORD, TRUE }, -#define O_HOSTSFILE 0x82 - { "HostsFile", O_HOSTSFILE, FALSE }, -#define O_MQA 0x83 - { "MinQueueAge", O_MQA, TRUE }, -#define O_DEFCHARSET 0x85 - { "DefaultCharSet", O_DEFCHARSET, TRUE }, -#define O_SSFILE 0x86 - { "ServiceSwitchFile", O_SSFILE, FALSE }, -#define O_DIALDELAY 0x87 - { "DialDelay", O_DIALDELAY, TRUE }, -#define O_NORCPTACTION 0x88 - { "NoRecipientAction", O_NORCPTACTION, TRUE }, -#define O_SAFEFILEENV 0x89 - { "SafeFileEnvironment", O_SAFEFILEENV, FALSE }, -#define O_MAXMSGSIZE 0x8a - { "MaxMessageSize", O_MAXMSGSIZE, FALSE }, -#define O_COLONOKINADDR 0x8b - { "ColonOkInAddr", O_COLONOKINADDR, TRUE }, -#define O_MAXQUEUERUN 0x8c - { "MaxQueueRunSize", O_MAXQUEUERUN, TRUE }, -#define O_MAXCHILDREN 0x8d - { "MaxDaemonChildren", O_MAXCHILDREN, FALSE }, -#define O_KEEPCNAMES 0x8e - { "DontExpandCnames", O_KEEPCNAMES, FALSE }, -#define O_MUSTQUOTE 0x8f - { "MustQuoteChars", O_MUSTQUOTE, FALSE }, -#define O_SMTPGREETING 0x90 - { "SmtpGreetingMessage", O_SMTPGREETING, FALSE }, -#define O_UNIXFROM 0x91 - { "UnixFromLine", O_UNIXFROM, FALSE }, -#define O_OPCHARS 0x92 - { "OperatorChars", O_OPCHARS, FALSE }, -#define O_DONTINITGRPS 0x93 - { "DontInitGroups", O_DONTINITGRPS, FALSE }, -#define O_SLFH 0x94 - { "SingleLineFromHeader", O_SLFH, TRUE }, -#define O_ABH 0x95 - { "AllowBogusHELO", O_ABH, TRUE }, -#define O_CONNTHROT 0x97 - { "ConnectionRateThrottle", O_CONNTHROT, FALSE }, -#define O_UGW 0x99 - { "UnsafeGroupWrites", O_UGW, FALSE }, -#define O_DBLBOUNCE 0x9a - { "DoubleBounceAddress", O_DBLBOUNCE, FALSE }, -#define O_HSDIR 0x9b - { "HostStatusDirectory", O_HSDIR, FALSE }, -#define O_SINGTHREAD 0x9c - { "SingleThreadDelivery", O_SINGTHREAD, FALSE }, -#define O_RUNASUSER 0x9d - { "RunAsUser", O_RUNASUSER, FALSE }, -#if _FFR_DSN_RRT_OPTION -#define O_DSN_RRT 0x9e - { "RrtImpliesDsn", O_DSN_RRT, FALSE }, -#endif -#if _FFR_PIDFILE_OPTION -#define O_PIDFILE 0x9f - { "PidFile", O_PIDFILE, FALSE }, -#endif -#define O_DONTBLAMESENDMAIL 0xa0 - { "DontBlameSendmail", O_DONTBLAMESENDMAIL, FALSE }, -#define O_DPI 0xa1 - { "DontProbeInterfaces", O_DPI, FALSE }, -#define O_MAXRCPT 0xa2 - { "MaxRecipientsPerMessage", O_MAXRCPT, FALSE }, -#if _FFR_DEADLETTERDROP_OPTION -#define O_DEADLETTER 0xa3 - { "DeadLetterDrop", O_DEADLETTER, FALSE }, -#endif -#if _FFR_DONTLOCKFILESFORREAD_OPTION -#define O_DONTLOCK 0xa4 - { "DontLockFilesForRead", O_DONTLOCK, FALSE }, -#endif -#if _FFR_MAXALIASRECURSION_OPTION -#define O_MAXALIASRCSN 0xa5 - { "MaxAliasRecursion", O_MAXALIASRCSN, FALSE }, -#endif -#if _FFR_CONNECTONLYTO_OPTION -#define O_CNCTONLYTO 0xa6 - { "ConnectOnlyTo", O_CNCTONLYTO, FALSE }, -#endif -#if _FFR_TRUSTED_USER -#define O_TRUSTUSER 0xa7 - { "TrustedUser", O_TRUSTUSER, FALSE }, -#endif -#if _FFR_MAX_MIME_HEADER_LENGTH -#define O_MAXMIMEHDRLEN 0xa8 - { "MaxMimeHeaderLength", O_MAXMIMEHDRLEN, FALSE }, -#endif -#if _FFR_CONTROL_SOCKET -#define O_CONTROLSOCKET 0xa9 - { "ControlSocketName", O_CONTROLSOCKET, FALSE }, -#endif -#if _FFR_MAX_HEADERS_LENGTH -#define O_MAXHDRSLEN 0xaa - { "MaxHeadersLength", O_MAXHDRSLEN, FALSE }, -#endif - { NULL, '\0', FALSE } -}; - - - -void -setoption(opt, val, safe, sticky, e) - int opt; - char *val; - bool safe; - bool sticky; - register ENVELOPE *e; -{ - register char *p; - register struct optioninfo *o; - char *subopt; - int mid; - bool can_setuid = RunAsUid == 0; - auto char *ep; - char buf[50]; - extern bool atobool __P((char *)); - extern time_t convtime __P((char *, char)); - extern int QueueLA; - extern int RefuseLA; - extern bool Warn_Q_option; - extern void setalias __P((char *)); - extern int atooct __P((char *)); - extern void setdefuser __P((void)); - extern void setdaemonoptions __P((char *)); - - errno = 0; - if (opt == ' ') - { - /* full word options */ - struct optioninfo *sel; - - p = strchr(val, '='); - if (p == NULL) - p = &val[strlen(val)]; - while (*--p == ' ') - continue; - while (*++p == ' ') - *p = '\0'; - if (p == val) - { - syserr("readcf: null option name"); - return; - } - if (*p == '=') - *p++ = '\0'; - while (*p == ' ') - p++; - subopt = strchr(val, '.'); - if (subopt != NULL) - *subopt++ = '\0'; - sel = NULL; - for (o = OptionTab; o->o_name != NULL; o++) - { - if (strncasecmp(o->o_name, val, strlen(val)) != 0) - continue; - if (strlen(o->o_name) == strlen(val)) - { - /* completely specified -- this must be it */ - sel = NULL; - break; - } - if (sel != NULL) - break; - sel = o; - } - if (sel != NULL && o->o_name == NULL) - o = sel; - else if (o->o_name == NULL) - { - syserr("readcf: unknown option name %s", val); - return; - } - else if (sel != NULL) - { - syserr("readcf: ambiguous option name %s (matches %s and %s)", - val, sel->o_name, o->o_name); - return; - } - if (strlen(val) != strlen(o->o_name)) - { - int oldVerbose = Verbose; - - Verbose = 1; - message("Option %s used as abbreviation for %s", - val, o->o_name); - Verbose = oldVerbose; - } - opt = o->o_code; - val = p; - } - else - { - for (o = OptionTab; o->o_name != NULL; o++) - { - if (o->o_code == opt) - break; - } - subopt = NULL; - } - - if (tTd(37, 1)) - { - printf(isascii(opt) && isprint(opt) ? - "setoption %s (%c).%s=" : - "setoption %s (0x%x).%s=", - o->o_name == NULL ? "<unknown>" : o->o_name, - opt, - subopt == NULL ? "" : subopt); - xputs(val); - } - - /* - ** See if this option is preset for us. - */ - - if (!sticky && bitnset(opt, StickyOpt)) - { - if (tTd(37, 1)) - printf(" (ignored)\n"); - return; - } - - /* - ** Check to see if this option can be specified by this user. - */ - - if (!safe && RealUid == 0) - safe = TRUE; - if (!safe && !o->o_safe) - { - if (opt != 'M' || (val[0] != 'r' && val[0] != 's')) - { - if (tTd(37, 1)) - printf(" (unsafe)"); - (void) drop_privileges(TRUE); - } - } - if (tTd(37, 1)) - printf("\n"); - - switch (opt & 0xff) - { - case '7': /* force seven-bit input */ - SevenBitInput = atobool(val); - break; - -#if MIME8TO7 - case '8': /* handling of 8-bit input */ - switch (*val) - { - case 'm': /* convert 8-bit, convert MIME */ - MimeMode = MM_CVTMIME|MM_MIME8BIT; - break; - - case 'p': /* pass 8 bit, convert MIME */ - MimeMode = MM_CVTMIME|MM_PASS8BIT; - break; - - case 's': /* strict adherence */ - MimeMode = MM_CVTMIME; - break; - -#if 0 - case 'r': /* reject 8-bit, don't convert MIME */ - MimeMode = 0; - break; - - case 'j': /* "just send 8" */ - MimeMode = MM_PASS8BIT; - break; - - case 'a': /* encode 8 bit if available */ - MimeMode = MM_MIME8BIT|MM_PASS8BIT|MM_CVTMIME; - break; - - case 'c': /* convert 8 bit to MIME, never 7 bit */ - MimeMode = MM_MIME8BIT; - break; -#endif - - default: - syserr("Unknown 8-bit mode %c", *val); - finis(FALSE, EX_USAGE); - } - break; -#endif - - case 'A': /* set default alias file */ - if (val[0] == '\0') - setalias("aliases"); - else - setalias(val); - break; - - case 'a': /* look N minutes for "@:@" in alias file */ - if (val[0] == '\0') - SafeAlias = 5 * 60; /* five minutes */ - else - SafeAlias = convtime(val, 'm'); - break; - - case 'B': /* substitution for blank character */ - SpaceSub = val[0]; - if (SpaceSub == '\0') - SpaceSub = ' '; - break; - - case 'b': /* min blocks free on queue fs/max msg size */ - p = strchr(val, '/'); - if (p != NULL) - { - *p++ = '\0'; - MaxMessageSize = atol(p); - } - MinBlocksFree = atol(val); - break; - - case 'c': /* don't connect to "expensive" mailers */ - NoConnect = atobool(val); - break; - - case 'C': /* checkpoint every N addresses */ - CheckpointInterval = atoi(val); - break; - - case 'd': /* delivery mode */ - switch (*val) - { - case '\0': - e->e_sendmode = SM_DELIVER; - break; - - case SM_QUEUE: /* queue only */ - case SM_DEFER: /* queue only and defer map lookups */ -#if !QUEUE - syserr("need QUEUE to set -odqueue or -oddefer"); -#endif /* QUEUE */ - /* fall through..... */ - - case SM_DELIVER: /* do everything */ - case SM_FORK: /* fork after verification */ - e->e_sendmode = *val; - break; - - default: - syserr("Unknown delivery mode %c", *val); - finis(FALSE, EX_USAGE); - } - buf[0] = (char)e->e_sendmode; - buf[1] = '\0'; - define(macid("{deliveryMode}", NULL), newstr(buf), e); - break; - - case 'D': /* rebuild alias database as needed */ - AutoRebuild = atobool(val); - break; - - case 'E': /* error message header/header file */ - if (*val != '\0') - ErrMsgFile = newstr(val); - break; - - case 'e': /* set error processing mode */ - switch (*val) - { - case EM_QUIET: /* be silent about it */ - case EM_MAIL: /* mail back */ - case EM_BERKNET: /* do berknet error processing */ - case EM_WRITE: /* write back (or mail) */ - case EM_PRINT: /* print errors normally (default) */ - e->e_errormode = *val; - break; - } - break; - - case 'F': /* file mode */ - FileMode = atooct(val) & 0777; - break; - - case 'f': /* save Unix-style From lines on front */ - SaveFrom = atobool(val); - break; - - case 'G': /* match recipients against GECOS field */ - MatchGecos = atobool(val); - break; - - case 'g': /* default gid */ - g_opt: - if (isascii(*val) && isdigit(*val)) - DefGid = atoi(val); - else - { - register struct group *gr; - - DefGid = -1; - gr = getgrnam(val); - if (gr == NULL) - syserr("readcf: option %c: unknown group %s", - opt, val); - else - DefGid = gr->gr_gid; - } - break; - - case 'H': /* help file */ - if (val[0] == '\0') - HelpFile = "sendmail.hf"; - else - HelpFile = newstr(val); - break; - - case 'h': /* maximum hop count */ - MaxHopCount = atoi(val); - break; - - case 'I': /* use internet domain name server */ -#if NAMED_BIND - for (p = val; *p != 0; ) - { - bool clearmode; - char *q; - struct resolverflags *rfp; - - while (*p == ' ') - p++; - if (*p == '\0') - break; - clearmode = FALSE; - if (*p == '-') - clearmode = TRUE; - else if (*p != '+') - p--; - p++; - q = p; - while (*p != '\0' && !(isascii(*p) && isspace(*p))) - p++; - if (*p != '\0') - *p++ = '\0'; - if (strcasecmp(q, "HasWildcardMX") == 0) - { - HasWildcardMX = !clearmode; - continue; - } - for (rfp = ResolverFlags; rfp->rf_name != NULL; rfp++) - { - if (strcasecmp(q, rfp->rf_name) == 0) - break; - } - if (rfp->rf_name == NULL) - syserr("readcf: I option value %s unrecognized", q); - else if (clearmode) - _res.options &= ~rfp->rf_bits; - else - _res.options |= rfp->rf_bits; - } - if (tTd(8, 2)) - printf("_res.options = %x, HasWildcardMX = %d\n", - (u_int) _res.options, HasWildcardMX); -#else - usrerr("name server (I option) specified but BIND not compiled in"); -#endif - break; - - case 'i': /* ignore dot lines in message */ - IgnrDot = atobool(val); - break; - - case 'j': /* send errors in MIME (RFC 1341) format */ - SendMIMEErrors = atobool(val); - break; - - case 'J': /* .forward search path */ - ForwardPath = newstr(val); - break; - - case 'k': /* connection cache size */ - MaxMciCache = atoi(val); - if (MaxMciCache < 0) - MaxMciCache = 0; - break; - - case 'K': /* connection cache timeout */ - MciCacheTimeout = convtime(val, 'm'); - break; - - case 'l': /* use Errors-To: header */ - UseErrorsTo = atobool(val); - break; - - case 'L': /* log level */ - if (safe || LogLevel < atoi(val)) - LogLevel = atoi(val); - break; - - case 'M': /* define macro */ - mid = macid(val, &ep); - p = newstr(ep); - if (!safe) - cleanstrcpy(p, p, MAXNAME); - define(mid, p, CurEnv); - sticky = FALSE; - break; - - case 'm': /* send to me too */ - MeToo = atobool(val); - break; - - case 'n': /* validate RHS in newaliases */ - CheckAliases = atobool(val); - break; - - /* 'N' available -- was "net name" */ - - case 'O': /* daemon options */ -#if DAEMON - setdaemonoptions(val); -#else - syserr("DaemonPortOptions (O option) set but DAEMON not compiled in"); -#endif - break; - - case 'o': /* assume old style headers */ - if (atobool(val)) - CurEnv->e_flags |= EF_OLDSTYLE; - else - CurEnv->e_flags &= ~EF_OLDSTYLE; - break; - - case 'p': /* select privacy level */ - p = val; - for (;;) - { - register struct prival *pv; - extern struct prival PrivacyValues[]; - - while (isascii(*p) && (isspace(*p) || ispunct(*p))) - p++; - if (*p == '\0') - break; - val = p; - while (isascii(*p) && isalnum(*p)) - p++; - if (*p != '\0') - *p++ = '\0'; - - for (pv = PrivacyValues; pv->pv_name != NULL; pv++) - { - if (strcasecmp(val, pv->pv_name) == 0) - break; - } - if (pv->pv_name == NULL) - syserr("readcf: Op line: %s unrecognized", val); - PrivacyFlags |= pv->pv_flag; - } - sticky = FALSE; - break; - - case 'P': /* postmaster copy address for returned mail */ - PostMasterCopy = newstr(val); - break; - - case 'q': /* slope of queue only function */ - QueueFactor = atoi(val); - break; - - case 'Q': /* queue directory */ - if (val[0] == '\0') - QueueDir = "mqueue"; - else - QueueDir = newstr(val); - if (RealUid != 0 && !safe) - Warn_Q_option = TRUE; - break; - - case 'R': /* don't prune routes */ - DontPruneRoutes = atobool(val); - break; - - case 'r': /* read timeout */ - if (subopt == NULL) - inittimeouts(val); - else - settimeout(subopt, val); - break; - - case 'S': /* status file */ - if (val[0] == '\0') - StatFile = "sendmail.st"; - else - StatFile = newstr(val); - break; - - case 's': /* be super safe, even if expensive */ - SuperSafe = atobool(val); - break; - - case 'T': /* queue timeout */ - p = strchr(val, '/'); - if (p != NULL) - { - *p++ = '\0'; - settimeout("queuewarn", p); - } - settimeout("queuereturn", val); - break; - - case 't': /* time zone name */ - TimeZoneSpec = newstr(val); - break; - - case 'U': /* location of user database */ - UdbSpec = newstr(val); - break; - - case 'u': /* set default uid */ - for (p = val; *p != '\0'; p++) - { - if (*p == '.' || *p == '/' || *p == ':') - { - *p++ = '\0'; - break; - } - } - if (isascii(*val) && isdigit(*val)) - { - DefUid = atoi(val); - setdefuser(); - } - else - { - register struct passwd *pw; - - DefUid = -1; - pw = sm_getpwnam(val); - if (pw == NULL) - syserr("readcf: option u: unknown user %s", val); - else - { - DefUid = pw->pw_uid; - DefGid = pw->pw_gid; - DefUser = newstr(pw->pw_name); - } - } - -#ifdef UID_MAX - if (DefUid > UID_MAX) - { - syserr("readcf: option u: uid value (%ld) > UID_MAX (%ld); ignored", - DefUid, UID_MAX); - } -#endif - - /* handle the group if it is there */ - if (*p == '\0') - break; - val = p; - goto g_opt; - - case 'V': /* fallback MX host */ - if (val[0] != '\0') - FallBackMX = newstr(val); - break; - - case 'v': /* run in verbose mode */ - Verbose = atobool(val) ? 1 : 0; - break; - - case 'w': /* if we are best MX, try host directly */ - TryNullMXList = atobool(val); - break; - - /* 'W' available -- was wizard password */ - - case 'x': /* load avg at which to auto-queue msgs */ - QueueLA = atoi(val); - break; - - case 'X': /* load avg at which to auto-reject connections */ - RefuseLA = atoi(val); - break; - - case 'y': /* work recipient factor */ - WkRecipFact = atoi(val); - break; - - case 'Y': /* fork jobs during queue runs */ - ForkQueueRuns = atobool(val); - break; - - case 'z': /* work message class factor */ - WkClassFact = atoi(val); - break; - - case 'Z': /* work time factor */ - WkTimeFact = atoi(val); - break; - - case O_QUEUESORTORD: /* queue sorting order */ - switch (*val) - { - case 'h': /* Host first */ - case 'H': - QueueSortOrder = QS_BYHOST; - break; - - case 'p': /* Priority order */ - case 'P': - QueueSortOrder = QS_BYPRIORITY; - break; - - case 't': /* Submission time */ - case 'T': - QueueSortOrder = QS_BYTIME; - break; - - default: - syserr("Invalid queue sort order \"%s\"", val); - } - break; - - case O_HOSTSFILE: /* pathname of /etc/hosts file */ - HostsFile = newstr(val); - break; - - case O_MQA: /* minimum queue age between deliveries */ - MinQueueAge = convtime(val, 'm'); - break; - - case O_DEFCHARSET: /* default character set for mimefying */ - DefaultCharSet = newstr(denlstring(val, TRUE, TRUE)); - break; - - case O_SSFILE: /* service switch file */ - ServiceSwitchFile = newstr(val); - break; - - case O_DIALDELAY: /* delay for dial-on-demand operation */ - DialDelay = convtime(val, 's'); - break; - - case O_NORCPTACTION: /* what to do if no recipient */ - if (strcasecmp(val, "none") == 0) - NoRecipientAction = NRA_NO_ACTION; - else if (strcasecmp(val, "add-to") == 0) - NoRecipientAction = NRA_ADD_TO; - else if (strcasecmp(val, "add-apparently-to") == 0) - NoRecipientAction = NRA_ADD_APPARENTLY_TO; - else if (strcasecmp(val, "add-bcc") == 0) - NoRecipientAction = NRA_ADD_BCC; - else if (strcasecmp(val, "add-to-undisclosed") == 0) - NoRecipientAction = NRA_ADD_TO_UNDISCLOSED; - else - syserr("Invalid NoRecipientAction: %s", val); - break; - - case O_SAFEFILEENV: /* chroot() environ for writing to files */ - SafeFileEnv = newstr(val); - break; - - case O_MAXMSGSIZE: /* maximum message size */ - MaxMessageSize = atol(val); - break; - - case O_COLONOKINADDR: /* old style handling of colon addresses */ - ColonOkInAddr = atobool(val); - break; - - case O_MAXQUEUERUN: /* max # of jobs in a single queue run */ - MaxQueueRun = atol(val); - break; - - case O_MAXCHILDREN: /* max # of children of daemon */ - MaxChildren = atoi(val); - break; - - case O_KEEPCNAMES: /* don't expand CNAME records */ - DontExpandCnames = atobool(val); - break; - - case O_MUSTQUOTE: /* must quote these characters in phrases */ - strcpy(buf, "@,;:\\()[]"); - if (strlen(val) < (SIZE_T) sizeof buf - 10) - strcat(buf, val); - MustQuoteChars = newstr(buf); - break; - - case O_SMTPGREETING: /* SMTP greeting message (old $e macro) */ - SmtpGreeting = newstr(munchstring(val, NULL, '\0')); - break; - - case O_UNIXFROM: /* UNIX From_ line (old $l macro) */ - UnixFromLine = newstr(munchstring(val, NULL, '\0')); - break; - - case O_OPCHARS: /* operator characters (old $o macro) */ - OperatorChars = newstr(munchstring(val, NULL, '\0')); - break; - - case O_DONTINITGRPS: /* don't call initgroups(3) */ - DontInitGroups = atobool(val); - break; - - case O_SLFH: /* make sure from fits on one line */ - SingleLineFromHeader = atobool(val); - break; - - case O_ABH: /* allow HELO commands with syntax errors */ - AllowBogusHELO = atobool(val); - break; - - case O_CONNTHROT: /* connection rate throttle */ - ConnRateThrottle = atoi(val); - break; - - case O_UGW: /* group writable files are unsafe */ - if (!atobool(val)) - DontBlameSendmail |= DBS_GROUPWRITABLEFORWARDFILESAFE|DBS_GROUPWRITABLEINCLUDEFILESAFE; - break; - - case O_DBLBOUNCE: /* address to which to send double bounces */ - if (val[0] != '\0') - DoubleBounceAddr = newstr(val); - else - syserr("readcf: option DoubleBounceAddress: value required"); - break; - - case O_HSDIR: /* persistent host status directory */ - if (val[0] != '\0') - HostStatDir = newstr(val); - break; - - case O_SINGTHREAD: /* single thread deliveries (requires hsdir) */ - SingleThreadDelivery = atobool(val); - break; - - case O_RUNASUSER: /* run bulk of code as this user */ - for (p = val; *p != '\0'; p++) - { - if (*p == '.' || *p == '/' || *p == ':') - { - *p++ = '\0'; - break; - } - } - if (isascii(*val) && isdigit(*val)) - { - if (can_setuid) - RunAsUid = atoi(val); - } - else - { - register struct passwd *pw; - - pw = sm_getpwnam(val); - if (pw == NULL) - syserr("readcf: option RunAsUser: unknown user %s", val); - else if (can_setuid) - { - if (*p == '\0') - RunAsUserName = newstr(val); - RunAsUid = pw->pw_uid; - RunAsGid = pw->pw_gid; - } - } -#ifdef UID_MAX - if (RunAsUid > UID_MAX) - { - syserr("readcf: option RunAsUser: uid value (%ld) > UID_MAX (%ld); ignored", - RunAsUid, UID_MAX); - } -#endif - if (*p != '\0') - { - if (isascii(*p) && isdigit(*p)) - { - if (can_setuid) - RunAsGid = atoi(p); - } - else - { - register struct group *gr; - - gr = getgrnam(p); - if (gr == NULL) - syserr("readcf: option RunAsUser: unknown group %s", - p); - else if (can_setuid) - RunAsGid = gr->gr_gid; - } - } - if (tTd(47, 5)) - printf("readcf: RunAsUser = %d:%d\n", (int)RunAsUid, (int)RunAsGid); - break; - -#if _FFR_DSN_RRT_OPTION - case O_DSN_RRT: - RrtImpliesDsn = atobool(val); - break; -#endif - -#if _FFR_PIDFILE_OPTION - case O_PIDFILE: - free(PidFile); - PidFile = newstr(val); - break; -#endif - - case O_DONTBLAMESENDMAIL: - p = val; - for (;;) - { - register struct dbsval *dbs; - extern struct dbsval DontBlameSendmailValues[]; - - while (isascii(*p) && (isspace(*p) || ispunct(*p))) - p++; - if (*p == '\0') - break; - val = p; - while (isascii(*p) && isalnum(*p)) - p++; - if (*p != '\0') - *p++ = '\0'; - - for (dbs = DontBlameSendmailValues; - dbs->dbs_name != NULL; dbs++) - { - if (strcasecmp(val, dbs->dbs_name) == 0) - break; - } - if (dbs->dbs_name == NULL) - syserr("readcf: DontBlameSendmail option: %s unrecognized", val); - else if (dbs->dbs_flag == DBS_SAFE) - DontBlameSendmail = DBS_SAFE; - else - DontBlameSendmail |= dbs->dbs_flag; - } - sticky = FALSE; - break; - - case O_DPI: - DontProbeInterfaces = atobool(val); - break; - - case O_MAXRCPT: - MaxRcptPerMsg = atoi(val); - break; - -#if _FFR_DEADLETTERDROP_OPTION - case O_DEADLETTER: - if (DeadLetterDrop != NULL) - free(DeadLetterDrop); - DeadLetterDrop = newstr(val); - break; -#endif - -#if _FFR_DONTLOCKFILESFORREAD_OPTION - case O_DONTLOCK: - DontLockReadFiles = atobool(val); - break; -#endif - -#if _FFR_MAXALIASRECURSION_OPTION - case O_MAXALIASRCSN: - MaxAliasRecursion = atoi(val); - break; -#endif - -#if _FFR_CONNECTONLYTO_OPTION - case O_CNCTONLYTO: - /* XXX should probably use gethostbyname */ - ConnectOnlyTo = inet_addr(val); - break; -#endif - -#if _FFR_TRUSTED_USER - case O_TRUSTUSER: - if (isascii(*val) && isdigit(*val)) - TrustedUid = atoi(val); - else - { - register struct passwd *pw; - - TrustedUid = 0; - pw = sm_getpwnam(val); - if (pw == NULL) - syserr("readcf: option TrustedUser: unknown user %s", val); - else - TrustedUid = pw->pw_uid; - } - -#ifdef UID_MAX - if (TrustedUid > UID_MAX) - { - syserr("readcf: option TrustedUser: uid value (%ld) > UID_MAX (%ld)", - TrustedUid, UID_MAX); - TrustedUid = 0; - } -#endif - break; -#endif - -#if _FFR_MAX_MIME_HEADER_LENGTH - case O_MAXMIMEHDRLEN: - p = strchr(val, '/'); - if (p != NULL) - *p++ = '\0'; - MaxMimeHeaderLength = atoi(val); - if (p != NULL && *p != '\0') - MaxMimeFieldLength = atoi(p); - else - MaxMimeFieldLength = MaxMimeHeaderLength / 2; - - if (MaxMimeHeaderLength < 0) - MaxMimeHeaderLength = 0; - else if (MaxMimeHeaderLength < 128) - printf("Warning: MaxMimeHeaderLength: header length limit set lower than 128\n"); - - if (MaxMimeFieldLength < 0) - MaxMimeFieldLength = 0; - else if (MaxMimeFieldLength < 40) - printf("Warning: MaxMimeHeaderLength: field length limit set lower than 40\n"); - break; -#endif - -#if _FFR_CONTROL_SOCKET - case O_CONTROLSOCKET: - if (ControlSocketName != NULL) - free(ControlSocketName); - ControlSocketName = newstr(val); - break; -#endif - -#if _FFR_MAX_HEADERS_LENGTH - case O_MAXHDRSLEN: - MaxHeadersLength = atoi(val); - - if (MaxHeadersLength > 0 && - MaxHeadersLength < (MAXHDRSLEN / 2)) - printf("Warning: MaxHeadersLength: headers length limit set lower than %d\n", MAXHDRSLEN); - break; -#endif - - default: - if (tTd(37, 1)) - { - if (isascii(opt) && isprint(opt)) - printf("Warning: option %c unknown\n", opt); - else - printf("Warning: option 0x%x unknown\n", opt); - } - break; - } - if (sticky) - setbitn(opt, StickyOpt); -} -/* -** SETCLASS -- set a string into a class -** -** Parameters: -** class -- the class to put the string in. -** str -- the string to enter -** -** Returns: -** none. -** -** Side Effects: -** puts the word into the symbol table. -*/ - -void -setclass(class, str) - int class; - char *str; -{ - register STAB *s; - - if (tTd(37, 8)) - printf("setclass(%s, %s)\n", macname(class), str); - s = stab(str, ST_CLASS, ST_ENTER); - setbitn(class, s->s_class); -} -/* -** MAKEMAPENTRY -- create a map entry -** -** Parameters: -** line -- the config file line -** -** Returns: -** A pointer to the map that has been created. -** NULL if there was a syntax error. -** -** Side Effects: -** Enters the map into the dictionary. -*/ - -MAP * -makemapentry(line) - char *line; -{ - register char *p; - char *mapname; - char *classname; - register STAB *s; - STAB *class; - - for (p = line; isascii(*p) && isspace(*p); p++) - continue; - if (!(isascii(*p) && isalnum(*p))) - { - syserr("readcf: config K line: no map name"); - return NULL; - } - - mapname = p; - while ((isascii(*++p) && isalnum(*p)) || *p == '_' || *p == '.') - continue; - if (*p != '\0') - *p++ = '\0'; - while (isascii(*p) && isspace(*p)) - p++; - if (!(isascii(*p) && isalnum(*p))) - { - syserr("readcf: config K line, map %s: no map class", mapname); - return NULL; - } - classname = p; - while (isascii(*++p) && isalnum(*p)) - continue; - if (*p != '\0') - *p++ = '\0'; - while (isascii(*p) && isspace(*p)) - p++; - - /* look up the class */ - class = stab(classname, ST_MAPCLASS, ST_FIND); - if (class == NULL) - { - syserr("readcf: map %s: class %s not available", mapname, classname); - return NULL; - } - - /* enter the map */ - s = stab(mapname, ST_MAP, ST_ENTER); - s->s_map.map_class = &class->s_mapclass; - s->s_map.map_mname = newstr(mapname); - - if (class->s_mapclass.map_parse(&s->s_map, p)) - s->s_map.map_mflags |= MF_VALID; - - if (tTd(37, 5)) - { - printf("map %s, class %s, flags %lx, file %s,\n", - s->s_map.map_mname, s->s_map.map_class->map_cname, - s->s_map.map_mflags, - s->s_map.map_file == NULL ? "(null)" : s->s_map.map_file); - printf("\tapp %s, domain %s, rebuild %s\n", - s->s_map.map_app == NULL ? "(null)" : s->s_map.map_app, - s->s_map.map_domain == NULL ? "(null)" : s->s_map.map_domain, - s->s_map.map_rebuild == NULL ? "(null)" : s->s_map.map_rebuild); - } - - return &s->s_map; -} -/* -** STRTORWSET -- convert string to rewriting set number -** -** Parameters: -** p -- the pointer to the string to decode. -** endp -- if set, store the trailing delimiter here. -** stabmode -- ST_ENTER to create this entry, ST_FIND if -** it must already exist. -** -** Returns: -** The appropriate ruleset number. -** -1 if it is not valid (error already printed) -*/ - -int -strtorwset(p, endp, stabmode) - char *p; - char **endp; - int stabmode; -{ - int ruleset; - static int nextruleset = MAXRWSETS; - - while (isascii(*p) && isspace(*p)) - p++; - if (!isascii(*p)) - { - syserr("invalid ruleset name: \"%.20s\"", p); - return -1; - } - if (isdigit(*p)) - { - ruleset = strtol(p, endp, 10); - if (ruleset >= MAXRWSETS / 2 || ruleset < 0) - { - syserr("bad ruleset %d (%d max)", - ruleset, MAXRWSETS / 2); - ruleset = -1; - } - } - else - { - STAB *s; - char delim; - char *q; - - q = p; - while (*p != '\0' && isascii(*p) && - (isalnum(*p) || *p == '_')) - p++; - if (q == p || !(isascii(*q) && isalpha(*q))) - { - /* no valid characters */ - syserr("invalid ruleset name: \"%.20s\"", q); - return -1; - } - while (isascii(*p) && isspace(*p)) - *p++ = '\0'; - delim = *p; - if (delim != '\0') - *p = '\0'; - s = stab(q, ST_RULESET, stabmode); - if (delim != '\0') - *p = delim; - - if (s == NULL) - return -1; - - if (stabmode == ST_ENTER && delim == '=') - { - while (isascii(*++p) && isspace(*p)) - continue; - if (!(isascii(*p) && isdigit(*p))) - { - syserr("bad ruleset definition \"%s\" (number required after `=')", q); - ruleset = -1; - } - else - { - ruleset = strtol(p, endp, 10); - if (ruleset >= MAXRWSETS / 2 || ruleset < 0) - { - syserr("bad ruleset number %d in \"%s\" (%d max)", - ruleset, q, MAXRWSETS / 2); - ruleset = -1; - } - } - } - else - { - if (endp != NULL) - *endp = p; - if (s->s_ruleset > 0) - ruleset = s->s_ruleset; - else if ((ruleset = --nextruleset) < MAXRWSETS / 2) - { - syserr("%s: too many named rulesets (%d max)", - q, MAXRWSETS / 2); - ruleset = -1; - } - } - if (s->s_ruleset > 0 && ruleset >= 0 && ruleset != s->s_ruleset) - { - syserr("%s: ruleset changed value (old %d, new %d)", - q, s->s_ruleset, ruleset); - ruleset = s->s_ruleset; - } - else if (ruleset > 0) - { - s->s_ruleset = ruleset; - } - } - return ruleset; -} -/* -** INITTIMEOUTS -- parse and set timeout values -** -** Parameters: -** val -- a pointer to the values. If NULL, do initial -** settings. -** -** Returns: -** none. -** -** Side Effects: -** Initializes the TimeOuts structure -*/ - -#define SECONDS -#define MINUTES * 60 -#define HOUR * 3600 - -void -inittimeouts(val) - register char *val; -{ - register char *p; - extern time_t convtime __P((char *, char)); - - if (tTd(37, 2)) - printf("inittimeouts(%s)\n", val == NULL ? "<NULL>" : val); - if (val == NULL) - { - TimeOuts.to_connect = (time_t) 0 SECONDS; - TimeOuts.to_initial = (time_t) 5 MINUTES; - TimeOuts.to_helo = (time_t) 5 MINUTES; - TimeOuts.to_mail = (time_t) 10 MINUTES; - TimeOuts.to_rcpt = (time_t) 1 HOUR; - TimeOuts.to_datainit = (time_t) 5 MINUTES; - TimeOuts.to_datablock = (time_t) 1 HOUR; - TimeOuts.to_datafinal = (time_t) 1 HOUR; - TimeOuts.to_rset = (time_t) 5 MINUTES; - TimeOuts.to_quit = (time_t) 2 MINUTES; - TimeOuts.to_nextcommand = (time_t) 1 HOUR; - TimeOuts.to_miscshort = (time_t) 2 MINUTES; -#if IDENTPROTO - TimeOuts.to_ident = (time_t) 30 SECONDS; -#else - TimeOuts.to_ident = (time_t) 0 SECONDS; -#endif - TimeOuts.to_fileopen = (time_t) 60 SECONDS; - if (tTd(37, 5)) - { - printf("Timeouts:\n"); - printf(" connect = %ld\n", (long)TimeOuts.to_connect); - printf(" initial = %ld\n", (long)TimeOuts.to_initial); - printf(" helo = %ld\n", (long)TimeOuts.to_helo); - printf(" mail = %ld\n", (long)TimeOuts.to_mail); - printf(" rcpt = %ld\n", (long)TimeOuts.to_rcpt); - printf(" datainit = %ld\n", (long)TimeOuts.to_datainit); - printf(" datablock = %ld\n", (long)TimeOuts.to_datablock); - printf(" datafinal = %ld\n", (long)TimeOuts.to_datafinal); - printf(" rset = %ld\n", (long)TimeOuts.to_rset); - printf(" quit = %ld\n", (long)TimeOuts.to_quit); - printf(" nextcommand = %ld\n", (long)TimeOuts.to_nextcommand); - printf(" miscshort = %ld\n", (long)TimeOuts.to_miscshort); - printf(" ident = %ld\n", (long)TimeOuts.to_ident); - printf(" fileopen = %ld\n", (long)TimeOuts.to_fileopen); - } - return; - } - - for (;; val = p) - { - while (isascii(*val) && isspace(*val)) - val++; - if (*val == '\0') - break; - for (p = val; *p != '\0' && *p != ','; p++) - continue; - if (*p != '\0') - *p++ = '\0'; - - if (isascii(*val) && isdigit(*val)) - { - /* old syntax -- set everything */ - TimeOuts.to_mail = convtime(val, 'm'); - TimeOuts.to_rcpt = TimeOuts.to_mail; - TimeOuts.to_datainit = TimeOuts.to_mail; - TimeOuts.to_datablock = TimeOuts.to_mail; - TimeOuts.to_datafinal = TimeOuts.to_mail; - TimeOuts.to_nextcommand = TimeOuts.to_mail; - continue; - } - else - { - register char *q = strchr(val, ':'); - - if (q == NULL && (q = strchr(val, '=')) == NULL) - { - /* syntax error */ - continue; - } - *q++ = '\0'; - settimeout(val, q); - } - } -} -/* -** SETTIMEOUT -- set an individual timeout -** -** Parameters: -** name -- the name of the timeout. -** val -- the value of the timeout. -** -** Returns: -** none. -*/ - -void -settimeout(name, val) - char *name; - char *val; -{ - register char *p; - time_t to; - extern time_t convtime __P((char *, char)); - - if (tTd(37, 2)) - printf("settimeout(%s = %s)\n", name, val); - - to = convtime(val, 'm'); - p = strchr(name, '.'); - if (p != NULL) - *p++ = '\0'; - - if (strcasecmp(name, "initial") == 0) - TimeOuts.to_initial = to; - else if (strcasecmp(name, "mail") == 0) - TimeOuts.to_mail = to; - else if (strcasecmp(name, "rcpt") == 0) - TimeOuts.to_rcpt = to; - else if (strcasecmp(name, "datainit") == 0) - TimeOuts.to_datainit = to; - else if (strcasecmp(name, "datablock") == 0) - TimeOuts.to_datablock = to; - else if (strcasecmp(name, "datafinal") == 0) - TimeOuts.to_datafinal = to; - else if (strcasecmp(name, "command") == 0) - TimeOuts.to_nextcommand = to; - else if (strcasecmp(name, "rset") == 0) - TimeOuts.to_rset = to; - else if (strcasecmp(name, "helo") == 0) - TimeOuts.to_helo = to; - else if (strcasecmp(name, "quit") == 0) - TimeOuts.to_quit = to; - else if (strcasecmp(name, "misc") == 0) - TimeOuts.to_miscshort = to; - else if (strcasecmp(name, "ident") == 0) - TimeOuts.to_ident = to; - else if (strcasecmp(name, "fileopen") == 0) - TimeOuts.to_fileopen = to; - else if (strcasecmp(name, "connect") == 0) - TimeOuts.to_connect = to; - else if (strcasecmp(name, "iconnect") == 0) - TimeOuts.to_iconnect = to; - else if (strcasecmp(name, "queuewarn") == 0) - { - to = convtime(val, 'h'); - if (p == NULL || strcmp(p, "*") == 0) - { - TimeOuts.to_q_warning[TOC_NORMAL] = to; - TimeOuts.to_q_warning[TOC_URGENT] = to; - TimeOuts.to_q_warning[TOC_NONURGENT] = to; - } - else if (strcasecmp(p, "normal") == 0) - TimeOuts.to_q_warning[TOC_NORMAL] = to; - else if (strcasecmp(p, "urgent") == 0) - TimeOuts.to_q_warning[TOC_URGENT] = to; - else if (strcasecmp(p, "non-urgent") == 0) - TimeOuts.to_q_warning[TOC_NONURGENT] = to; - else - syserr("settimeout: invalid queuewarn subtimeout %s", p); - } - else if (strcasecmp(name, "queuereturn") == 0) - { - to = convtime(val, 'd'); - if (p == NULL || strcmp(p, "*") == 0) - { - TimeOuts.to_q_return[TOC_NORMAL] = to; - TimeOuts.to_q_return[TOC_URGENT] = to; - TimeOuts.to_q_return[TOC_NONURGENT] = to; - } - else if (strcasecmp(p, "normal") == 0) - TimeOuts.to_q_return[TOC_NORMAL] = to; - else if (strcasecmp(p, "urgent") == 0) - TimeOuts.to_q_return[TOC_URGENT] = to; - else if (strcasecmp(p, "non-urgent") == 0) - TimeOuts.to_q_return[TOC_NONURGENT] = to; - else - syserr("settimeout: invalid queuereturn subtimeout %s", p); - } - else if (strcasecmp(name, "hoststatus") == 0) - MciInfoTimeout = convtime(val, 'm'); - else - syserr("settimeout: invalid timeout %s", name); -} diff --git a/src/recipient.c b/src/recipient.c deleted file mode 100644 index f7e221f..0000000 --- a/src/recipient.c +++ /dev/null @@ -1,1456 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)recipient.c 8.163 (Berkeley) 1/23/1999"; -#endif /* not lint */ - -# include "sendmail.h" -# include <grp.h> - -/* -** SENDTOLIST -- Designate a send list. -** -** The parameter is a comma-separated list of people to send to. -** This routine arranges to send to all of them. -** -** Parameters: -** list -- the send list. -** ctladdr -- the address template for the person to -** send to -- effective uid/gid are important. -** This is typically the alias that caused this -** expansion. -** sendq -- a pointer to the head of a queue to put -** these people into. -** aliaslevel -- the current alias nesting depth -- to -** diagnose loops. -** e -- the envelope in which to add these recipients. -** -** Returns: -** The number of addresses actually on the list. -** -** Side Effects: -** none. -*/ - -/* q_flags bits inherited from ctladdr */ -#define QINHERITEDBITS (QPINGONSUCCESS|QPINGONFAILURE|QPINGONDELAY|QHASNOTIFY) - -int -sendtolist(list, ctladdr, sendq, aliaslevel, e) - char *list; - ADDRESS *ctladdr; - ADDRESS **sendq; - int aliaslevel; - register ENVELOPE *e; -{ - register char *p; - register ADDRESS *al; /* list of addresses to send to */ - char delimiter; /* the address delimiter */ - int naddrs; - int i; - char *oldto = e->e_to; - char *bufp; - char buf[MAXNAME + 1]; - - if (list == NULL) - { - syserr("sendtolist: null list"); - return 0; - } - - if (tTd(25, 1)) - { - printf("sendto: %s\n ctladdr=", list); - printaddr(ctladdr, FALSE); - } - - /* heuristic to determine old versus new style addresses */ - if (ctladdr == NULL && - (strchr(list, ',') != NULL || strchr(list, ';') != NULL || - strchr(list, '<') != NULL || strchr(list, '(') != NULL)) - e->e_flags &= ~EF_OLDSTYLE; - delimiter = ' '; - if (!bitset(EF_OLDSTYLE, e->e_flags) || ctladdr != NULL) - delimiter = ','; - - al = NULL; - naddrs = 0; - - /* make sure we have enough space to copy the string */ - i = strlen(list) + 1; - if (i <= sizeof buf) - bufp = buf; - else - bufp = xalloc(i); - strcpy(bufp, denlstring(list, FALSE, TRUE)); - - for (p = bufp; *p != '\0'; ) - { - auto char *delimptr; - register ADDRESS *a; - - /* parse the address */ - while ((isascii(*p) && isspace(*p)) || *p == ',') - p++; - a = parseaddr(p, NULLADDR, RF_COPYALL, delimiter, &delimptr, e); - p = delimptr; - if (a == NULL) - continue; - a->q_next = al; - a->q_alias = ctladdr; - - /* arrange to inherit attributes from parent */ - if (ctladdr != NULL) - { - ADDRESS *b; - extern ADDRESS *self_reference __P((ADDRESS *, ENVELOPE *)); - - /* self reference test */ - if (sameaddr(ctladdr, a)) - { - if (tTd(27, 5)) - { - printf("sendtolist: QSELFREF "); - printaddr(ctladdr, FALSE); - } - ctladdr->q_flags |= QSELFREF; - } - - /* check for address loops */ - b = self_reference(a, e); - if (b != NULL) - { - b->q_flags |= QSELFREF; - if (tTd(27, 5)) - { - printf("sendtolist: QSELFREF "); - printaddr(b, FALSE); - } - if (a != b) - { - if (tTd(27, 5)) - { - printf("sendtolist: QDONTSEND "); - printaddr(a, FALSE); - } - a->q_flags |= QDONTSEND; - b->q_flags |= a->q_flags & QNOTREMOTE; - continue; - } - } - - /* full name */ - if (a->q_fullname == NULL) - a->q_fullname = ctladdr->q_fullname; - - /* various flag bits */ - a->q_flags &= ~QINHERITEDBITS; - a->q_flags |= ctladdr->q_flags & QINHERITEDBITS; - - /* original recipient information */ - a->q_orcpt = ctladdr->q_orcpt; - } - - al = a; - } - - /* arrange to send to everyone on the local send list */ - while (al != NULL) - { - register ADDRESS *a = al; - - al = a->q_next; - a = recipient(a, sendq, aliaslevel, e); - naddrs++; - } - - e->e_to = oldto; - if (bufp != buf) - free(bufp); - return (naddrs); -} -/* -** RECIPIENT -- Designate a message recipient -** -** Saves the named person for future mailing. -** -** Parameters: -** a -- the (preparsed) address header for the recipient. -** sendq -- a pointer to the head of a queue to put the -** recipient in. Duplicate supression is done -** in this queue. -** aliaslevel -- the current alias nesting depth. -** e -- the current envelope. -** -** Returns: -** The actual address in the queue. This will be "a" if -** the address is not a duplicate, else the original address. -** -** Side Effects: -** none. -*/ - -ADDRESS * -recipient(a, sendq, aliaslevel, e) - register ADDRESS *a; - register ADDRESS **sendq; - int aliaslevel; - register ENVELOPE *e; -{ - register ADDRESS *q; - ADDRESS **pq; - register struct mailer *m; - register char *p; - bool quoted = FALSE; /* set if the addr has a quote bit */ - int findusercount = 0; - bool initialdontsend = bitset(QDONTSEND, a->q_flags); - int i; - char *buf; - char buf0[MAXNAME + 1]; /* unquoted image of the user name */ - extern void alias __P((ADDRESS *, ADDRESS **, int, ENVELOPE *)); - - e->e_to = a->q_paddr; - m = a->q_mailer; - errno = 0; - if (aliaslevel == 0) - a->q_flags |= QPRIMARY; - if (tTd(26, 1)) - { - printf("\nrecipient (%d): ", aliaslevel); - printaddr(a, FALSE); - } - - /* if this is primary, add it to the original recipient list */ - if (a->q_alias == NULL) - { - if (e->e_origrcpt == NULL) - e->e_origrcpt = a->q_paddr; - else if (e->e_origrcpt != a->q_paddr) - e->e_origrcpt = ""; - } - - /* break aliasing loops */ - if (aliaslevel > MaxAliasRecursion) - { - a->q_flags |= QBADADDR; - a->q_status = "5.4.6"; - usrerr("554 aliasing/forwarding loop broken (%d aliases deep; %d max)", - aliaslevel, MaxAliasRecursion); - return (a); - } - - /* - ** Finish setting up address structure. - */ - - /* get unquoted user for file, program or user.name check */ - i = strlen(a->q_user); - if (i >= sizeof buf0) - buf = xalloc(i + 1); - else - buf = buf0; - (void) strcpy(buf, a->q_user); - for (p = buf; *p != '\0' && !quoted; p++) - { - if (*p == '\\') - quoted = TRUE; - } - stripquotes(buf); - - /* check for direct mailing to restricted mailers */ - if (m == ProgMailer) - { - if (a->q_alias == NULL) - { - a->q_flags |= QBADADDR; - a->q_status = "5.7.1"; - usrerr("550 Cannot mail directly to programs"); - } - else if (bitset(QBOGUSSHELL, a->q_alias->q_flags)) - { - a->q_flags |= QBADADDR; - a->q_status = "5.7.1"; - if (a->q_alias->q_ruser == NULL) - usrerr("550 UID %d is an unknown user: cannot mail to programs", - a->q_alias->q_uid); - else - usrerr("550 User %s@%s doesn't have a valid shell for mailing to programs", - a->q_alias->q_ruser, MyHostName); - } - else if (bitset(QUNSAFEADDR, a->q_alias->q_flags)) - { - a->q_flags |= QBADADDR; - a->q_status = "5.7.1"; - a->q_rstatus = newstr("Unsafe for mailing to programs"); - usrerr("550 Address %s is unsafe for mailing to programs", - a->q_alias->q_paddr); - } - } - - /* - ** Look up this person in the recipient list. - ** If they are there already, return, otherwise continue. - ** If the list is empty, just add it. Notice the cute - ** hack to make from addresses suppress things correctly: - ** the QDONTSEND bit will be set in the send list. - ** [Please note: the emphasis is on "hack."] - */ - - for (pq = sendq; (q = *pq) != NULL; pq = &q->q_next) - { - if (sameaddr(q, a) && - (bitset(QRCPTOK, q->q_flags) || - !bitset(QPRIMARY, q->q_flags))) - { - if (tTd(26, 1)) - { - printf("%s in sendq: ", a->q_paddr); - printaddr(q, FALSE); - } - if (!bitset(QPRIMARY, q->q_flags)) - { - if (!bitset(QDONTSEND, a->q_flags)) - message("duplicate suppressed"); - q->q_flags |= a->q_flags; - } - else if (bitset(QSELFREF, q->q_flags)) - q->q_flags |= a->q_flags & ~QDONTSEND; - a = q; - goto done; - } - } - - /* add address on list */ - if (pq != NULL) - { - *pq = a; - a->q_next = NULL; - } - - /* - ** Alias the name and handle special mailer types. - */ - - trylocaluser: - if (tTd(29, 7)) - { - printf("at trylocaluser: "); - printaddr(a, FALSE); - } - - if (bitset(QDONTSEND|QBADADDR|QVERIFIED, a->q_flags)) - goto testselfdestruct; - - if (m == InclMailer) - { - a->q_flags |= QDONTSEND; - if (a->q_alias == NULL) - { - a->q_flags |= QBADADDR; - a->q_status = "5.7.1"; - usrerr("550 Cannot mail directly to :include:s"); - } - else - { - int ret; - - message("including file %s", a->q_user); - ret = include(a->q_user, FALSE, a, sendq, aliaslevel, e); - if (transienterror(ret)) - { - if (LogLevel > 2) - sm_syslog(LOG_ERR, e->e_id, - "include %s: transient error: %s", - shortenstring(a->q_user, MAXSHORTSTR), - errstring(ret)); - a->q_flags |= QQUEUEUP; - a->q_flags &= ~QDONTSEND; - usrerr("451 Cannot open %s: %s", - shortenstring(a->q_user, MAXSHORTSTR), - errstring(ret)); - } - else if (ret != 0) - { - a->q_flags |= QBADADDR; - a->q_status = "5.2.4"; - usrerr("550 Cannot open %s: %s", - shortenstring(a->q_user, MAXSHORTSTR), - errstring(ret)); - } - } - } - else if (m == FileMailer) - { - extern bool writable __P((char *, ADDRESS *, int)); - - /* check if writable or creatable */ - if (a->q_alias == NULL) - { - a->q_flags |= QBADADDR; - a->q_status = "5.7.1"; - usrerr("550 Cannot mail directly to files"); - } - else if (bitset(QBOGUSSHELL, a->q_alias->q_flags)) - { - a->q_flags |= QBADADDR; - a->q_status = "5.7.1"; - if (a->q_alias->q_ruser == NULL) - usrerr("550 UID %d is an unknown user: cannot mail to files", - a->q_alias->q_uid); - else - usrerr("550 User %s@%s doesn't have a valid shell for mailing to files", - a->q_alias->q_ruser, MyHostName); - } - else if (bitset(QUNSAFEADDR, a->q_alias->q_flags)) - { - a->q_flags |= QBADADDR; - a->q_status = "5.7.1"; - a->q_rstatus = newstr("Unsafe for mailing to files"); - usrerr("550 Address %s is unsafe for mailing to files", - a->q_alias->q_paddr); - } - else if (strcmp(buf, "/dev/null") == 0) - { - /* /dev/null is always accepted */ - } - else if (!writable(buf, a->q_alias, SFF_CREAT)) - { - a->q_flags |= QBADADDR; - giveresponse(EX_CANTCREAT, m, NULL, a->q_alias, - (time_t) 0, e); - } - } - - /* try aliasing */ - if (!quoted && !bitset(QDONTSEND, a->q_flags) && - bitnset(M_ALIASABLE, m->m_flags)) - alias(a, sendq, aliaslevel, e); - -# if USERDB - /* if not aliased, look it up in the user database */ - if (!bitset(QDONTSEND|QNOTREMOTE|QVERIFIED, a->q_flags) && - bitnset(M_CHECKUDB, m->m_flags)) - { - extern int udbexpand __P((ADDRESS *, ADDRESS **, int, ENVELOPE *)); - - if (udbexpand(a, sendq, aliaslevel, e) == EX_TEMPFAIL) - { - a->q_flags |= QQUEUEUP; - if (e->e_message == NULL) - e->e_message = newstr("Deferred: user database error"); - if (LogLevel > 8) - sm_syslog(LOG_INFO, e->e_id, - "deferred: udbexpand: %s", - errstring(errno)); - message("queued (user database error): %s", - errstring(errno)); - e->e_nrcpts++; - goto testselfdestruct; - } - } -# endif - - /* - ** If we have a level two config file, then pass the name through - ** Ruleset 5 before sending it off. Ruleset 5 has the right - ** to send rewrite it to another mailer. This gives us a hook - ** after local aliasing has been done. - */ - - if (tTd(29, 5)) - { - printf("recipient: testing local? cl=%d, rr5=%lx\n\t", - ConfigLevel, (u_long) RewriteRules[5]); - printaddr(a, FALSE); - } - if (!bitset(QNOTREMOTE|QDONTSEND|QQUEUEUP|QVERIFIED, a->q_flags) && - ConfigLevel >= 2 && RewriteRules[5] != NULL && - bitnset(M_TRYRULESET5, m->m_flags)) - { - extern void maplocaluser __P((ADDRESS *, ADDRESS **, int, ENVELOPE *)); - - maplocaluser(a, sendq, aliaslevel + 1, e); - } - - /* - ** If it didn't get rewritten to another mailer, go ahead - ** and deliver it. - */ - - if (!bitset(QDONTSEND|QQUEUEUP|QVERIFIED, a->q_flags) && - bitnset(M_HASPWENT, m->m_flags)) - { - auto bool fuzzy; - register struct passwd *pw; - extern void forward __P((ADDRESS *, ADDRESS **, int, ENVELOPE *)); - - /* warning -- finduser may trash buf */ - pw = finduser(buf, &fuzzy); - if (pw == NULL || strlen(pw->pw_name) > MAXNAME) - { - a->q_flags |= QBADADDR; - a->q_status = "5.1.1"; - giveresponse(EX_NOUSER, m, NULL, a->q_alias, - (time_t) 0, e); - } - else - { - char nbuf[MAXNAME + 1]; - - if (fuzzy) - { - /* name was a fuzzy match */ - a->q_user = newstr(pw->pw_name); - if (findusercount++ > 3) - { - a->q_flags |= QBADADDR; - a->q_status = "5.4.6"; - usrerr("554 aliasing/forwarding loop for %s broken", - pw->pw_name); - goto done; - } - - /* see if it aliases */ - (void) strcpy(buf, pw->pw_name); - goto trylocaluser; - } - if (strcmp(pw->pw_dir, "/") == 0) - a->q_home = ""; - else - a->q_home = newstr(pw->pw_dir); - a->q_uid = pw->pw_uid; - a->q_gid = pw->pw_gid; - a->q_ruser = newstr(pw->pw_name); - a->q_flags |= QGOODUID; - buildfname(pw->pw_gecos, pw->pw_name, nbuf, sizeof nbuf); - if (nbuf[0] != '\0') - a->q_fullname = newstr(nbuf); - if (!usershellok(pw->pw_name, pw->pw_shell)) - { - a->q_flags |= QBOGUSSHELL; - } - if (bitset(EF_VRFYONLY, e->e_flags)) - { - /* don't do any more now */ - a->q_flags |= QVERIFIED; - } - else if (!quoted) - forward(a, sendq, aliaslevel, e); - } - } - if (!bitset(QDONTSEND, a->q_flags)) - e->e_nrcpts++; - - testselfdestruct: - a->q_flags |= QTHISPASS; - if (tTd(26, 8)) - { - printf("testselfdestruct: "); - printaddr(a, FALSE); - if (tTd(26, 10)) - { - printf("SENDQ:\n"); - printaddr(*sendq, TRUE); - printf("----\n"); - } - } - if (a->q_alias == NULL && a != &e->e_from && - bitset(QDONTSEND, a->q_flags)) - { - for (q = *sendq; q != NULL; q = q->q_next) - { - if (!bitset(QDONTSEND, q->q_flags)) - break; - } - if (q == NULL) - { - a->q_flags |= QBADADDR; - a->q_status = "5.4.6"; - usrerr("554 aliasing/forwarding loop broken"); - } - } - - done: - a->q_flags |= QTHISPASS; - if (buf != buf0) - free(buf); - - /* - ** If we are at the top level, check to see if this has - ** expanded to exactly one address. If so, it can inherit - ** the primaryness of the address. - ** - ** While we're at it, clear the QTHISPASS bits. - */ - - if (aliaslevel == 0) - { - int nrcpts = 0; - ADDRESS *only = NULL; - - for (q = *sendq; q != NULL; q = q->q_next) - { - if (bitset(QTHISPASS, q->q_flags) && - !bitset(QDONTSEND|QBADADDR, q->q_flags)) - { - nrcpts++; - only = q; - } - q->q_flags &= ~QTHISPASS; - } - if (nrcpts == 1) - { - /* check to see if this actually got a new owner */ - q = only; - while ((q = q->q_alias) != NULL) - { - if (q->q_owner != NULL) - break; - } - if (q == NULL) - only->q_flags |= QPRIMARY; - } - else if (!initialdontsend && nrcpts > 0) - { - /* arrange for return receipt */ - e->e_flags |= EF_SENDRECEIPT; - a->q_flags |= QEXPANDED; - if (e->e_xfp != NULL && bitset(QPINGONSUCCESS, a->q_flags)) - fprintf(e->e_xfp, - "%s... expanded to multiple addresses\n", - a->q_paddr); - } - } - a->q_flags |= QRCPTOK; - return (a); -} -/* -** FINDUSER -- find the password entry for a user. -** -** This looks a lot like getpwnam, except that it may want to -** do some fancier pattern matching in /etc/passwd. -** -** This routine contains most of the time of many sendmail runs. -** It deserves to be optimized. -** -** Parameters: -** name -- the name to match against. -** fuzzyp -- an outarg that is set to TRUE if this entry -** was found using the fuzzy matching algorithm; -** set to FALSE otherwise. -** -** Returns: -** A pointer to a pw struct. -** NULL if name is unknown or ambiguous. -** -** Side Effects: -** may modify name. -*/ - -struct passwd * -finduser(name, fuzzyp) - char *name; - bool *fuzzyp; -{ - register struct passwd *pw; - register char *p; - bool tryagain; - - if (tTd(29, 4)) - printf("finduser(%s): ", name); - - *fuzzyp = FALSE; - -#ifdef HESIOD - /* DEC Hesiod getpwnam accepts numeric strings -- short circuit it */ - for (p = name; *p != '\0'; p++) - if (!isascii(*p) || !isdigit(*p)) - break; - if (*p == '\0') - { - if (tTd(29, 4)) - printf("failed (numeric input)\n"); - return NULL; - } -#endif - - /* look up this login name using fast path */ - if ((pw = sm_getpwnam(name)) != NULL) - { - if (tTd(29, 4)) - printf("found (non-fuzzy)\n"); - return (pw); - } - - /* try mapping it to lower case */ - tryagain = FALSE; - for (p = name; *p != '\0'; p++) - { - if (isascii(*p) && isupper(*p)) - { - *p = tolower(*p); - tryagain = TRUE; - } - } - if (tryagain && (pw = sm_getpwnam(name)) != NULL) - { - if (tTd(29, 4)) - printf("found (lower case)\n"); - *fuzzyp = TRUE; - return pw; - } - -#if MATCHGECOS - /* see if fuzzy matching allowed */ - if (!MatchGecos) - { - if (tTd(29, 4)) - printf("not found (fuzzy disabled)\n"); - return NULL; - } - - /* search for a matching full name instead */ - for (p = name; *p != '\0'; p++) - { - if (*p == (SpaceSub & 0177) || *p == '_') - *p = ' '; - } - (void) setpwent(); - while ((pw = getpwent()) != NULL) - { - char buf[MAXNAME + 1]; - -# if 0 - if (strcasecmp(pw->pw_name, name) == 0) - { - if (tTd(29, 4)) - printf("found (case wrapped)\n"); - break; - } -# endif - - buildfname(pw->pw_gecos, pw->pw_name, buf, sizeof buf); - if (strchr(buf, ' ') != NULL && !strcasecmp(buf, name)) - { - if (tTd(29, 4)) - printf("fuzzy matches %s\n", pw->pw_name); - message("sending to login name %s", pw->pw_name); - break; - } - } - if (pw != NULL) - *fuzzyp = TRUE; - else if (tTd(29, 4)) - printf("no fuzzy match found\n"); -# if DEC_OSF_BROKEN_GETPWENT /* DEC OSF/1 3.2 or earlier */ - endpwent(); -# endif - return pw; -#else - if (tTd(29, 4)) - printf("not found (fuzzy disabled)\n"); - return NULL; -#endif -} -/* -** WRITABLE -- predicate returning if the file is writable. -** -** This routine must duplicate the algorithm in sys/fio.c. -** Unfortunately, we cannot use the access call since we -** won't necessarily be the real uid when we try to -** actually open the file. -** -** Notice that ANY file with ANY execute bit is automatically -** not writable. This is also enforced by mailfile. -** -** Parameters: -** filename -- the file name to check. -** ctladdr -- the controlling address for this file. -** flags -- SFF_* flags to control the function. -** -** Returns: -** TRUE -- if we will be able to write this file. -** FALSE -- if we cannot write this file. -** -** Side Effects: -** none. -*/ - -bool -writable(filename, ctladdr, flags) - char *filename; - ADDRESS *ctladdr; - int flags; -{ - uid_t euid; - gid_t egid; - char *uname; - - if (tTd(44, 5)) - printf("writable(%s, 0x%x)\n", filename, flags); - - /* - ** File does exist -- check that it is writable. - */ - - if (geteuid() != 0) - { - euid = geteuid(); - egid = getegid(); - uname = NULL; - } - else if (ctladdr != NULL) - { - euid = ctladdr->q_uid; - egid = ctladdr->q_gid; - uname = ctladdr->q_user; - } - else if (bitset(SFF_RUNASREALUID, flags)) - { - euid = RealUid; - egid = RealGid; - uname = RealUserName; - } - else if (FileMailer != NULL && !bitset(SFF_ROOTOK, flags)) - { - euid = FileMailer->m_uid; - egid = FileMailer->m_gid; - uname = NULL; - } - else - { - euid = egid = 0; - uname = NULL; - } - if (!bitset(SFF_ROOTOK, flags)) - { - if (euid == 0) - { - euid = DefUid; - uname = DefUser; - } - if (egid == 0) - egid = DefGid; - } - if (geteuid() == 0 && - (ctladdr == NULL || !bitset(QGOODUID, ctladdr->q_flags))) - flags |= SFF_SETUIDOK; - - if (!bitset(DBS_FILEDELIVERYTOSYMLINK, DontBlameSendmail)) - flags |= SFF_NOSLINK; - if (!bitset(DBS_FILEDELIVERYTOHARDLINK, DontBlameSendmail)) - flags |= SFF_NOHLINK; - - errno = safefile(filename, euid, egid, uname, flags, S_IWRITE, NULL); - return errno == 0; -} -/* -** INCLUDE -- handle :include: specification. -** -** Parameters: -** fname -- filename to include. -** forwarding -- if TRUE, we are reading a .forward file. -** if FALSE, it's a :include: file. -** ctladdr -- address template to use to fill in these -** addresses -- effective user/group id are -** the important things. -** sendq -- a pointer to the head of the send queue -** to put these addresses in. -** aliaslevel -- the alias nesting depth. -** e -- the current envelope. -** -** Returns: -** open error status -** -** Side Effects: -** reads the :include: file and sends to everyone -** listed in that file. -** -** Security Note: -** If you have restricted chown (that is, you can't -** give a file away), it is reasonable to allow programs -** and files called from this :include: file to be to be -** run as the owner of the :include: file. This is bogus -** if there is any chance of someone giving away a file. -** We assume that pre-POSIX systems can give away files. -** -** There is an additional restriction that if you -** forward to a :include: file, it will not take on -** the ownership of the :include: file. This may not -** be necessary, but shouldn't hurt. -*/ - -static jmp_buf CtxIncludeTimeout; -static void includetimeout __P((void)); - -int -include(fname, forwarding, ctladdr, sendq, aliaslevel, e) - char *fname; - bool forwarding; - ADDRESS *ctladdr; - ADDRESS **sendq; - int aliaslevel; - ENVELOPE *e; -{ - FILE *volatile fp = NULL; - char *oldto = e->e_to; - char *oldfilename = FileName; - int oldlinenumber = LineNumber; - register EVENT *ev = NULL; - int nincludes; - int mode; - register ADDRESS *ca; - volatile uid_t saveduid, uid; - volatile gid_t savedgid, gid; - char *volatile uname; - int rval = 0; - volatile int sfflags = SFF_REGONLY; - register char *p; - bool safechown = FALSE; - volatile bool safedir = FALSE; - struct stat st; - char buf[MAXLINE]; - extern bool chownsafe __P((int, bool)); - - if (tTd(27, 2)) - printf("include(%s)\n", fname); - if (tTd(27, 4)) - printf(" ruid=%d euid=%d\n", (int) getuid(), (int) geteuid()); - if (tTd(27, 14)) - { - printf("ctladdr "); - printaddr(ctladdr, FALSE); - } - - if (tTd(27, 9)) - printf("include: old uid = %d/%d\n", - (int) getuid(), (int) geteuid()); - - if (forwarding) - sfflags |= SFF_MUSTOWN|SFF_ROOTOK|SFF_NOWLINK; - - ca = getctladdr(ctladdr); - if (ca == NULL) - { - uid = DefUid; - gid = DefGid; - uname = DefUser; - } - else - { - uid = ca->q_uid; - gid = ca->q_gid; - uname = ca->q_user; - } -#if HASSETREUID || USESETEUID - saveduid = geteuid(); - savedgid = getegid(); - if (saveduid == 0) - { - if (!DontInitGroups) - { - if (initgroups(uname, gid) == -1) - syserr("include: initgroups(%s, %d) failed", - uname, gid); - } - else - { - GIDSET_T gidset[1]; - - gidset[0] = gid; - if (setgroups(1, gidset) == -1) - syserr("include: setgroups() failed"); - } - - if (gid != 0 && setgid(gid) < -1) - syserr("setgid(%d) failure", gid); - if (uid != 0) - { -# if USESETEUID - if (seteuid(uid) < 0) - syserr("seteuid(%d) failure (real=%d, eff=%d)", - uid, getuid(), geteuid()); -# else - if (setreuid(0, uid) < 0) - syserr("setreuid(0, %d) failure (real=%d, eff=%d)", - uid, getuid(), geteuid()); -# endif - } - } -#endif - - if (tTd(27, 9)) - printf("include: new uid = %d/%d\n", - (int) getuid(), (int) geteuid()); - - /* - ** If home directory is remote mounted but server is down, - ** this can hang or give errors; use a timeout to avoid this - */ - - if (setjmp(CtxIncludeTimeout) != 0) - { - ctladdr->q_flags |= QQUEUEUP; - errno = 0; - - /* return pseudo-error code */ - rval = E_SM_OPENTIMEOUT; - goto resetuid; - } - if (TimeOuts.to_fileopen > 0) - ev = setevent(TimeOuts.to_fileopen, includetimeout, 0); - else - ev = NULL; - - /* check for writable parent directory */ - p = strrchr(fname, '/'); - if (p != NULL) - { - int ret; - - *p = '\0'; - ret = safedirpath(fname, uid, gid, uname, sfflags|SFF_SAFEDIRPATH); - if (ret == 0) - { - /* in safe directory: relax chown & link rules */ - safedir = TRUE; - sfflags |= SFF_NOPATHCHECK; - } - else - { - if (bitset((forwarding ? - DBS_FORWARDFILEINUNSAFEDIRPATH : - DBS_INCLUDEFILEINUNSAFEDIRPATH), - DontBlameSendmail)) - sfflags |= SFF_NOPATHCHECK; - else if (bitset((forwarding ? - DBS_FORWARDFILEINGROUPWRITABLEDIRPATH : - DBS_INCLUDEFILEINGROUPWRITABLEDIRPATH), - DontBlameSendmail) && - ret == E_SM_GWDIR) - { - DontBlameSendmail |= DBS_GROUPWRITABLEDIRPATHSAFE; - ret = safedirpath(fname, uid, - gid, uname, - sfflags|SFF_SAFEDIRPATH); - DontBlameSendmail &= ~DBS_GROUPWRITABLEDIRPATHSAFE; - if (ret == 0) - sfflags |= SFF_NOPATHCHECK; - else - sfflags |= SFF_SAFEDIRPATH; - } - else - sfflags |= SFF_SAFEDIRPATH; - if (ret > E_PSEUDOBASE && - !bitset((forwarding ? - DBS_FORWARDFILEINUNSAFEDIRPATHSAFE : - DBS_INCLUDEFILEINUNSAFEDIRPATHSAFE), - DontBlameSendmail)) - { - if (LogLevel >= 12) - sm_syslog(LOG_INFO, e->e_id, - "%s: unsafe directory path, marked unsafe", - shortenstring(fname, MAXSHORTSTR)); - ctladdr->q_flags |= QUNSAFEADDR; - } - } - *p = '/'; - } - - /* allow links only in unwritable directories */ - if (!safedir && - !bitset((forwarding ? - DBS_LINKEDFORWARDFILEINWRITABLEDIR : - DBS_LINKEDINCLUDEFILEINWRITABLEDIR), - DontBlameSendmail)) - sfflags |= SFF_NOLINK; - - rval = safefile(fname, uid, gid, uname, sfflags, S_IREAD, &st); - if (rval != 0) - { - /* don't use this :include: file */ - if (tTd(27, 4)) - printf("include: not safe (uid=%d): %s\n", - (int) uid, errstring(rval)); - } - else if ((fp = fopen(fname, "r")) == NULL) - { - rval = errno; - if (tTd(27, 4)) - printf("include: open: %s\n", errstring(rval)); - } - else if (filechanged(fname, fileno(fp), &st)) - { - rval = E_SM_FILECHANGE; - if (tTd(27, 4)) - printf("include: file changed after open\n"); - } - if (ev != NULL) - clrevent(ev); - -resetuid: - -#if HASSETREUID || USESETEUID - if (saveduid == 0) - { - if (uid != 0) - { -# if USESETEUID - if (seteuid(0) < 0) - syserr("seteuid(0) failure (real=%d, eff=%d)", - getuid(), geteuid()); -# else - if (setreuid(-1, 0) < 0) - syserr("setreuid(-1, 0) failure (real=%d, eff=%d)", - getuid(), geteuid()); - if (setreuid(RealUid, 0) < 0) - syserr("setreuid(%d, 0) failure (real=%d, eff=%d)", - RealUid, getuid(), geteuid()); -# endif - } - setgid(savedgid); - } -#endif - - if (tTd(27, 9)) - printf("include: reset uid = %d/%d\n", - (int) getuid(), (int) geteuid()); - - if (rval == E_SM_OPENTIMEOUT) - usrerr("451 open timeout on %s", fname); - - if (fp == NULL) - return rval; - - if (fstat(fileno(fp), &st) < 0) - { - rval = errno; - syserr("Cannot fstat %s!", fname); - return rval; - } - - /* if path was writable, check to avoid file giveaway tricks */ - safechown = chownsafe(fileno(fp), safedir); - if (tTd(27, 6)) - printf("include: parent of %s is %s, chown is %ssafe\n", - fname, - safedir ? "safe" : "dangerous", - safechown ? "" : "un"); - - if (ca == NULL && safechown) - { - ctladdr->q_uid = st.st_uid; - ctladdr->q_gid = st.st_gid; - ctladdr->q_flags |= QGOODUID; - } - if (ca != NULL && ca->q_uid == st.st_uid) - { - /* optimization -- avoid getpwuid if we already have info */ - ctladdr->q_flags |= ca->q_flags & QBOGUSSHELL; - ctladdr->q_ruser = ca->q_ruser; - } - else if (!forwarding) - { - register struct passwd *pw; - - pw = sm_getpwuid(st.st_uid); - if (pw == NULL) - ctladdr->q_flags |= QBOGUSSHELL; - else - { - char *sh; - - ctladdr->q_ruser = newstr(pw->pw_name); - if (safechown) - sh = pw->pw_shell; - else - sh = "/SENDMAIL/ANY/SHELL/"; - if (!usershellok(pw->pw_name, sh)) - { - if (LogLevel >= 12) - sm_syslog(LOG_INFO, e->e_id, - "%s: user %s has bad shell %s, marked %s", - shortenstring(fname, MAXSHORTSTR), - pw->pw_name, sh, - safechown ? "bogus" : "unsafe"); - if (safechown) - ctladdr->q_flags |= QBOGUSSHELL; - else - ctladdr->q_flags |= QUNSAFEADDR; - } - } - } - - if (bitset(EF_VRFYONLY, e->e_flags)) - { - /* don't do any more now */ - ctladdr->q_flags |= QVERIFIED; - ctladdr->q_flags &= ~QDONTSEND; - e->e_nrcpts++; - xfclose(fp, "include", fname); - return rval; - } - - /* - ** Check to see if some bad guy can write this file - ** - ** Group write checking could be more clever, e.g., - ** guessing as to which groups are actually safe ("sys" - ** may be; "user" probably is not). - */ - - mode = S_IWOTH; - if (!bitset((forwarding ? - DBS_GROUPWRITABLEFORWARDFILESAFE : - DBS_GROUPWRITABLEINCLUDEFILESAFE), - DontBlameSendmail)) - mode |= S_IWGRP; - - if (bitset(mode, st.st_mode)) - { - if (tTd(27, 6)) - printf("include: %s is %s writable, marked unsafe\n", - shortenstring(fname, MAXSHORTSTR), - bitset(S_IWOTH, st.st_mode) ? "world" : "group"); - if (LogLevel >= 12) - sm_syslog(LOG_INFO, e->e_id, - "%s: %s writable %s file, marked unsafe", - shortenstring(fname, MAXSHORTSTR), - bitset(S_IWOTH, st.st_mode) ? "world" : "group", - forwarding ? "forward" : ":include:"); - ctladdr->q_flags |= QUNSAFEADDR; - } - - /* read the file -- each line is a comma-separated list. */ - FileName = fname; - LineNumber = 0; - ctladdr->q_flags &= ~QSELFREF; - nincludes = 0; - while (fgets(buf, sizeof buf, fp) != NULL) - { - register char *p = strchr(buf, '\n'); - - LineNumber++; - if (p != NULL) - *p = '\0'; - if (buf[0] == '#' || buf[0] == '\0') - continue; - - /* <sp>#@# introduces a comment anywhere */ - /* for Japanese character sets */ - for (p = buf; (p = strchr(++p, '#')) != NULL; ) - { - if (p[1] == '@' && p[2] == '#' && - isascii(p[-1]) && isspace(p[-1]) && - (p[3] == '\0' || (isascii(p[3]) && isspace(p[3])))) - { - p[-1] = '\0'; - break; - } - } - if (buf[0] == '\0') - continue; - - e->e_to = NULL; - message("%s to %s", - forwarding ? "forwarding" : "sending", buf); - if (forwarding && LogLevel > 9) - sm_syslog(LOG_INFO, e->e_id, - "forward %.200s => %s", - oldto, shortenstring(buf, MAXSHORTSTR)); - - nincludes += sendtolist(buf, ctladdr, sendq, aliaslevel + 1, e); - } - - if (ferror(fp) && tTd(27, 3)) - printf("include: read error: %s\n", errstring(errno)); - if (nincludes > 0 && !bitset(QSELFREF, ctladdr->q_flags)) - { - if (tTd(27, 5)) - { - printf("include: QDONTSEND "); - printaddr(ctladdr, FALSE); - } - ctladdr->q_flags |= QDONTSEND; - } - - (void) xfclose(fp, "include", fname); - FileName = oldfilename; - LineNumber = oldlinenumber; - e->e_to = oldto; - return rval; -} - -static void -includetimeout() -{ - longjmp(CtxIncludeTimeout, 1); -} -/* -** SENDTOARGV -- send to an argument vector. -** -** Parameters: -** argv -- argument vector to send to. -** e -- the current envelope. -** -** Returns: -** none. -** -** Side Effects: -** puts all addresses on the argument vector onto the -** send queue. -*/ - -void -sendtoargv(argv, e) - register char **argv; - register ENVELOPE *e; -{ - register char *p; - - while ((p = *argv++) != NULL) - { - (void) sendtolist(p, NULLADDR, &e->e_sendqueue, 0, e); - } -} -/* -** GETCTLADDR -- get controlling address from an address header. -** -** If none, get one corresponding to the effective userid. -** -** Parameters: -** a -- the address to find the controller of. -** -** Returns: -** the controlling address. -** -** Side Effects: -** none. -*/ - -ADDRESS * -getctladdr(a) - register ADDRESS *a; -{ - while (a != NULL && !bitset(QGOODUID, a->q_flags)) - a = a->q_alias; - return (a); -} -/* -** SELF_REFERENCE -- check to see if an address references itself -** -** The check is done through a chain of aliases. If it is part of -** a loop, break the loop at the "best" address, that is, the one -** that exists as a real user. -** -** This is to handle the case of: -** awc: Andrew.Chang -** Andrew.Chang: awc@mail.server -** which is a problem only on mail.server. -** -** Parameters: -** a -- the address to check. -** e -- the current envelope. -** -** Returns: -** The address that should be retained. -*/ - -ADDRESS * -self_reference(a, e) - ADDRESS *a; - ENVELOPE *e; -{ - ADDRESS *b; /* top entry in self ref loop */ - ADDRESS *c; /* entry that point to a real mail box */ - - if (tTd(27, 1)) - printf("self_reference(%s)\n", a->q_paddr); - - for (b = a->q_alias; b != NULL; b = b->q_alias) - { - if (sameaddr(a, b)) - break; - } - - if (b == NULL) - { - if (tTd(27, 1)) - printf("\t... no self ref\n"); - return NULL; - } - - /* - ** Pick the first address that resolved to a real mail box - ** i.e has a pw entry. The returned value will be marked - ** QSELFREF in recipient(), which in turn will disable alias() - ** from marking it QDONTSEND, which mean it will be used - ** as a deliverable address. - ** - ** The 2 key thing to note here are: - ** 1) we are in a recursive call sequence: - ** alias->sentolist->recipient->alias - ** 2) normally, when we return back to alias(), the address - ** will be marked QDONTSEND, since alias() assumes the - ** expanded form will be used instead of the current address. - ** This behaviour is turned off if the address is marked - ** QSELFREF We set QSELFREF when we return to recipient(). - */ - - c = a; - while (c != NULL) - { - if (tTd(27, 10)) - printf(" %s", c->q_user); - if (bitnset(M_HASPWENT, c->q_mailer->m_flags)) - { - if (tTd(27, 2)) - printf("\t... getpwnam(%s)... ", c->q_user); - if (sm_getpwnam(c->q_user) != NULL) - { - if (tTd(27, 2)) - printf("found\n"); - - /* ought to cache results here */ - if (sameaddr(b, c)) - return b; - else - return c; - } - if (tTd(27, 2)) - printf("failed\n"); - } - else - { - /* if local delivery, compare usernames */ - if (bitnset(M_LOCALMAILER, c->q_mailer->m_flags) && - b->q_mailer == c->q_mailer) - { - if (tTd(27, 2)) - printf("\t... local match (%s)\n", c->q_user); - if (sameaddr(b, c)) - return b; - else - return c; - } - } - if (tTd(27, 10)) - printf("\n"); - c = c->q_alias; - } - - if (tTd(27, 1)) - printf("\t... cannot break loop for \"%s\"\n", a->q_paddr); - - return NULL; -} diff --git a/src/safefile.c b/src/safefile.c deleted file mode 100644 index ff94b3d..0000000 --- a/src/safefile.c +++ /dev/null @@ -1,751 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)safefile.c 8.43 (Berkeley) 10/13/1998"; -#endif /* not lint */ - -# include "sendmail.h" -/* -** SAFEFILE -- return true if a file exists and is safe for a user. -** -** Parameters: -** fn -- filename to check. -** uid -- user id to compare against. -** gid -- group id to compare against. -** uname -- user name to compare against (used for group -** sets). -** flags -- modifiers: -** SFF_MUSTOWN -- "uid" must own this file. -** SFF_NOSLINK -- file cannot be a symbolic link. -** mode -- mode bits that must match. -** st -- if set, points to a stat structure that will -** get the stat info for the file. -** -** Returns: -** 0 if fn exists, is owned by uid, and matches mode. -** An errno otherwise. The actual errno is cleared. -** -** Side Effects: -** none. -*/ - -#include <grp.h> - -int -safefile(fn, uid, gid, uname, flags, mode, st) - char *fn; - UID_T uid; - GID_T gid; - char *uname; - int flags; - int mode; - struct stat *st; -{ - register char *p; - register struct group *gr = NULL; - int file_errno = 0; - bool checkpath; - struct stat stbuf; - struct stat fstbuf; - char fbuf[MAXPATHLEN + 1]; - - if (tTd(44, 4)) - printf("safefile(%s, uid=%d, gid=%d, flags=%x, mode=%o):\n", - fn, (int) uid, (int) gid, flags, mode); - errno = 0; - if (st == NULL) - st = &fstbuf; - if (strlen(fn) > sizeof fbuf - 1) - { - if (tTd(44, 4)) - printf("\tpathname too long\n"); - return ENAMETOOLONG; - } - strcpy(fbuf, fn); - fn = fbuf; - - /* ignore SFF_SAFEDIRPATH if we are debugging */ - if (RealUid != 0 && RunAsUid == RealUid) - flags &= ~SFF_SAFEDIRPATH; - - /* first check to see if the file exists at all */ -#ifdef HASLSTAT - if ((bitset(SFF_NOSLINK, flags) ? lstat(fn, st) - : stat(fn, st)) < 0) -#else - if (stat(fn, st) < 0) -#endif - { - file_errno = errno; - } - else if (bitset(SFF_SETUIDOK, flags) && - !bitset(S_IXUSR|S_IXGRP|S_IXOTH, st->st_mode) && - S_ISREG(st->st_mode)) - { - /* - ** If final file is setuid, run as the owner of that - ** file. Gotta be careful not to reveal anything too - ** soon here! - */ - -#ifdef SUID_ROOT_FILES_OK - if (bitset(S_ISUID, st->st_mode)) -#else - if (bitset(S_ISUID, st->st_mode) && st->st_uid != 0 && - st->st_uid != TrustedUid) -#endif - { - uid = st->st_uid; - uname = NULL; - } -#ifdef SUID_ROOT_FILES_OK - if (bitset(S_ISGID, st->st_mode)) -#else - if (bitset(S_ISGID, st->st_mode) && st->st_gid != 0) -#endif - gid = st->st_gid; - } - - checkpath = !bitset(SFF_NOPATHCHECK, flags) || - (uid == 0 && !bitset(SFF_ROOTOK|SFF_OPENASROOT, flags)); - if (bitset(SFF_NOWLINK, flags) && !bitset(SFF_SAFEDIRPATH, flags)) - { - int ret; - - /* check the directory */ - p = strrchr(fn, '/'); - if (p == NULL) - { - ret = safedirpath(".", uid, gid, uname, flags|SFF_SAFEDIRPATH); - } - else - { - *p = '\0'; - ret = safedirpath(fn, uid, gid, uname, flags|SFF_SAFEDIRPATH); - *p = '/'; - } - if (ret == 0) - { - /* directory is safe */ - checkpath = FALSE; - } - else - { -#ifdef HASLSTAT - /* Need lstat() information if called stat() before */ - if (!bitset(SFF_NOSLINK, flags) && lstat(fn, st) < 0) - { - ret = errno; - if (tTd(44, 4)) - printf("\t%s\n", errstring(ret)); - return ret; - } -#endif - /* directory is writable: disallow links */ - flags |= SFF_NOLINK; - } - } - - if (checkpath) - { - int ret; - - p = strrchr(fn, '/'); - if (p == NULL) - { - ret = safedirpath(".", uid, gid, uname, flags); - } - else - { - *p = '\0'; - ret = safedirpath(fn, uid, gid, uname, flags); - *p = '/'; - } - if (ret != 0) - return ret; - } - - /* - ** If the target file doesn't exist, check the directory to - ** ensure that it is writable by this user. - */ - - if (file_errno != 0) - { - int ret = file_errno; - char *dir = fn; - - if (tTd(44, 4)) - printf("\t%s\n", errstring(ret)); - - errno = 0; - if (!bitset(SFF_CREAT, flags) || file_errno != ENOENT) - return ret; - - /* check to see if legal to create the file */ - p = strrchr(dir, '/'); - if (p == NULL) - dir = "."; - else if (p == dir) - dir = "/"; - else - *p = '\0'; - if (stat(dir, &stbuf) >= 0) - { - int md = S_IWRITE|S_IEXEC; - - if (stbuf.st_uid == uid) - ; - else if (uid == 0 && stbuf.st_uid == TrustedUid) - ; - else - { - md >>= 3; - if (stbuf.st_gid == gid) - ; -#ifndef NO_GROUP_SET - else if (uname != NULL && !DontInitGroups && - ((gr != NULL && - gr->gr_gid == stbuf.st_gid) || - (gr = getgrgid(stbuf.st_gid)) != NULL)) - { - register char **gp; - - for (gp = gr->gr_mem; *gp != NULL; gp++) - if (strcmp(*gp, uname) == 0) - break; - if (*gp == NULL) - md >>= 3; - } -#endif - else - md >>= 3; - } - if ((stbuf.st_mode & md) != md) - errno = EACCES; - } - ret = errno; - if (tTd(44, 4)) - printf("\t[final dir %s uid %d mode %lo] %s\n", - dir, (int) stbuf.st_uid, (u_long) stbuf.st_mode, - errstring(ret)); - if (p != NULL) - *p = '/'; - st->st_mode = ST_MODE_NOFILE; - return ret; - } - -#ifdef S_ISLNK - if (bitset(SFF_NOSLINK, flags) && S_ISLNK(st->st_mode)) - { - if (tTd(44, 4)) - printf("\t[slink mode %lo]\tE_SM_NOSLINK\n", - (u_long) st->st_mode); - return E_SM_NOSLINK; - } -#endif - if (bitset(SFF_REGONLY, flags) && !S_ISREG(st->st_mode)) - { - if (tTd(44, 4)) - printf("\t[non-reg mode %lo]\tE_SM_REGONLY\n", - (u_long) st->st_mode); - return E_SM_REGONLY; - } - if (bitset(SFF_NOGWFILES, flags) && - bitset(S_IWGRP, st->st_mode)) - { - if (tTd(44, 4)) - printf("\t[write bits %lo]\tE_SM_GWFILE\n", - (u_long) st->st_mode); - return E_SM_GWFILE; - } - if (bitset(SFF_NOWWFILES, flags) && - bitset(S_IWOTH, st->st_mode)) - { - if (tTd(44, 4)) - printf("\t[write bits %lo]\tE_SM_WWFILE\n", - (u_long) st->st_mode); - return E_SM_WWFILE; - } - if (bitset(S_IWUSR|S_IWGRP|S_IWOTH, mode) && - bitset(S_IXUSR|S_IXGRP|S_IXOTH, st->st_mode)) - { - if (tTd(44, 4)) - printf("\t[exec bits %lo]\tE_SM_ISEXEC]\n", - (u_long) st->st_mode); - return E_SM_ISEXEC; - } - if (bitset(SFF_NOHLINK, flags) && st->st_nlink != 1) - { - if (tTd(44, 4)) - printf("\t[link count %d]\tE_SM_NOHLINK\n", - (int) st->st_nlink); - return E_SM_NOHLINK; - } - - if (uid == 0 && bitset(SFF_OPENASROOT, flags)) - ; - else if (uid == 0 && !bitset(SFF_ROOTOK, flags)) - mode >>= 6; - else if (st->st_uid == uid) - ; - else if (uid == 0 && st->st_uid == TrustedUid) - ; - else - { - mode >>= 3; - if (st->st_gid == gid) - ; -#ifndef NO_GROUP_SET - else if (uname != NULL && !DontInitGroups && - ((gr != NULL && gr->gr_gid == st->st_gid) || - (gr = getgrgid(st->st_gid)) != NULL)) - { - register char **gp; - - for (gp = gr->gr_mem; *gp != NULL; gp++) - if (strcmp(*gp, uname) == 0) - break; - if (*gp == NULL) - mode >>= 3; - } -#endif - else - mode >>= 3; - } - if (tTd(44, 4)) - printf("\t[uid %d, nlink %d, stat %lo, mode %lo] ", - (int) st->st_uid, (int) st->st_nlink, - (u_long) st->st_mode, (u_long) mode); - if ((st->st_uid == uid || st->st_uid == 0 || - st->st_uid == TrustedUid || - !bitset(SFF_MUSTOWN, flags)) && - (st->st_mode & mode) == mode) - { - if (tTd(44, 4)) - printf("\tOK\n"); - return 0; - } - if (tTd(44, 4)) - printf("\tEACCES\n"); - return EACCES; -} -/* -** SAFEDIRPATH -- check to make sure a path to a directory is safe -** -** Safe means not writable and owned by the right folks. -** -** Parameters: -** fn -- filename to check. -** uid -- user id to compare against. -** gid -- group id to compare against. -** uname -- user name to compare against (used for group -** sets). -** flags -- modifiers: -** SFF_ROOTOK -- ok to use root permissions to open. -** SFF_SAFEDIRPATH -- writable directories are considered -** to be fatal errors. -** -** Returns: -** 0 -- if the directory path is "safe". -** else -- an error number associated with the path. -*/ - -int -safedirpath(fn, uid, gid, uname, flags) - char *fn; - UID_T uid; - GID_T gid; - char *uname; - int flags; -{ - char *p; - register struct group *gr = NULL; - int ret = 0; - int mode = S_IWOTH; - struct stat stbuf; - - /* special case root directory */ - if (*fn == '\0') - fn = "/"; - - if (tTd(44, 4)) - printf("safedirpath(%s, uid=%ld, gid=%ld, flags=%x):\n", - fn, (long) uid, (long) gid, flags); - - if (!bitset(DBS_GROUPWRITABLEDIRPATHSAFE, DontBlameSendmail)) - mode |= S_IWGRP; - - p = fn; - do - { - if (*p == '\0') - *p = '/'; - p = strchr(++p, '/'); - if (p != NULL) - *p = '\0'; - if (stat(fn, &stbuf) < 0) - { - ret = errno; - break; - } - if ((uid == 0 || bitset(SFF_SAFEDIRPATH, flags)) && - bitset(mode, stbuf.st_mode)) - { - if (tTd(44, 4)) - printf("\t[dir %s] mode %lo\n", - fn, (u_long) stbuf.st_mode); - if (bitset(SFF_SAFEDIRPATH, flags)) - { - if (bitset(S_IWOTH, stbuf.st_mode)) - ret = E_SM_WWDIR; - else - ret = E_SM_GWDIR; - break; - } - if (Verbose > 1) - message("051 WARNING: %s writable directory %s", - bitset(S_IWOTH, stbuf.st_mode) - ? "World" - : "Group", - fn); - } - if (uid == 0 && !bitset(SFF_ROOTOK|SFF_OPENASROOT, flags)) - { - if (bitset(S_IXOTH, stbuf.st_mode)) - continue; - ret = EACCES; - break; - } - - /* - ** Let OS determine access to file if we are not - ** running as a privileged user. This allows ACLs - ** to work. - */ - if (geteuid() != 0) - continue; - - if (stbuf.st_uid == uid && - bitset(S_IXUSR, stbuf.st_mode)) - continue; - if (stbuf.st_gid == gid && - bitset(S_IXGRP, stbuf.st_mode)) - continue; -#ifndef NO_GROUP_SET - if (uname != NULL && !DontInitGroups && - ((gr != NULL && gr->gr_gid == stbuf.st_gid) || - (gr = getgrgid(stbuf.st_gid)) != NULL)) - { - register char **gp; - - for (gp = gr->gr_mem; gp != NULL && *gp != NULL; gp++) - if (strcmp(*gp, uname) == 0) - break; - if (gp != NULL && *gp != NULL && - bitset(S_IXGRP, stbuf.st_mode)) - continue; - } -#endif - if (!bitset(S_IXOTH, stbuf.st_mode)) - { - ret = EACCES; - break; - } - } while (p != NULL); - if (ret != 0 && tTd(44, 4)) - printf("\t[dir %s] %s\n", fn, errstring(ret)); - if (p != NULL) - *p = '/'; - return ret; -} -/* -** SAFEOPEN -- do a file open with extra checking -** -** Parameters: -** fn -- the file name to open. -** omode -- the open-style mode flags. -** cmode -- the create-style mode flags. -** sff -- safefile flags. -** -** Returns: -** Same as open. -*/ - -#ifndef O_ACCMODE -# define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR) -#endif - -int -safeopen(fn, omode, cmode, sff) - char *fn; - int omode; - int cmode; - int sff; -{ - int rval; - int fd; - int smode; - struct stat stb; - - if (bitset(O_CREAT, omode)) - sff |= SFF_CREAT; - omode &= ~O_CREAT; - smode = 0; - switch (omode & O_ACCMODE) - { - case O_RDONLY: - smode = S_IREAD; - break; - - case O_WRONLY: - smode = S_IWRITE; - break; - - case O_RDWR: - smode = S_IREAD|S_IWRITE; - break; - - default: - smode = 0; - break; - } - if (bitset(SFF_OPENASROOT, sff)) - rval = safefile(fn, RunAsUid, RunAsGid, RunAsUserName, - sff, smode, &stb); - else - rval = safefile(fn, RealUid, RealGid, RealUserName, - sff, smode, &stb); - if (rval != 0) - { - errno = rval; - return -1; - } - if (stb.st_mode == ST_MODE_NOFILE && bitset(SFF_CREAT, sff)) - omode |= O_EXCL|O_CREAT; - - fd = dfopen(fn, omode, cmode, sff); - if (fd < 0) - return fd; - if (filechanged(fn, fd, &stb)) - { - syserr("554 cannot open: file %s changed after open", fn); - close(fd); - errno = E_SM_FILECHANGE; - return -1; - } - return fd; -} -/* -** SAFEFOPEN -- do a file open with extra checking -** -** Parameters: -** fn -- the file name to open. -** omode -- the open-style mode flags. -** cmode -- the create-style mode flags. -** sff -- safefile flags. -** -** Returns: -** Same as fopen. -*/ - -FILE * -safefopen(fn, omode, cmode, sff) - char *fn; - int omode; - int cmode; - int sff; -{ - int fd; - FILE *fp; - char *fmode; - - switch (omode & O_ACCMODE) - { - case O_RDONLY: - fmode = "r"; - break; - - case O_WRONLY: - if (bitset(O_APPEND, omode)) - fmode = "a"; - else - fmode = "w"; - break; - - case O_RDWR: - if (bitset(O_TRUNC, omode)) - fmode = "w+"; - else if (bitset(O_APPEND, omode)) - fmode = "a+"; - else - fmode = "r+"; - break; - - default: - syserr("safefopen: unknown omode %o", omode); - fmode = "x"; - } - fd = safeopen(fn, omode, cmode, sff); - if (fd < 0) - { - if (tTd(44, 10)) - printf("safefopen: safeopen failed: %s\n", - errstring(errno)); - return NULL; - } - fp = fdopen(fd, fmode); - if (fp != NULL) - return fp; - - if (tTd(44, 10)) - { - printf("safefopen: fdopen(%s, %s) failed: omode=%x, sff=%x, err=%s\n", - fn, fmode, omode, sff, errstring(errno)); -#ifndef NOT_SENDMAIL - dumpfd(fd, TRUE, FALSE); -#endif - } - (void) close(fd); - return NULL; -} -/* -** FILECHANGED -- check to see if file changed after being opened -** -** Parameters: -** fn -- pathname of file to check. -** fd -- file descriptor to check. -** stb -- stat structure from before open. -** -** Returns: -** TRUE -- if a problem was detected. -** FALSE -- if this file is still the same. -*/ - -bool -filechanged(fn, fd, stb) - char *fn; - int fd; - struct stat *stb; -{ - struct stat sta; - - if (stb->st_mode == ST_MODE_NOFILE) - { -#if HASLSTAT && BOGUS_O_EXCL - /* only necessary if exclusive open follows symbolic links */ - if (lstat(fn, stb) < 0 || stb->st_nlink != 1) - return TRUE; -#else - return FALSE; -#endif - } - if (fstat(fd, &sta) < 0) - return TRUE; - - if (sta.st_nlink != stb->st_nlink || - sta.st_dev != stb->st_dev || - sta.st_ino != stb->st_ino || -#if HAS_ST_GEN && 0 /* AFS returns garbage in st_gen */ - sta.st_gen != stb->st_gen || -#endif - sta.st_uid != stb->st_uid || - sta.st_gid != stb->st_gid) - { - if (tTd(44, 8)) - { - printf("File changed after opening:\n"); - printf(" nlink = %ld/%ld\n", - (long) stb->st_nlink, (long) sta.st_nlink); - printf(" dev = %ld/%ld\n", - (long) stb->st_dev, (long) sta.st_dev); - if (sizeof sta.st_ino > sizeof (long)) - { - printf(" ino = %s/", - quad_to_string(stb->st_ino)); - printf("%s\n", - quad_to_string(sta.st_ino)); - } - else - printf(" ino = %lu/%lu\n", - (unsigned long) stb->st_ino, - (unsigned long) sta.st_ino); -#if HAS_ST_GEN - printf(" gen = %ld/%ld\n", - (long) stb->st_gen, (long) sta.st_gen); -#endif - printf(" uid = %ld/%ld\n", - (long) stb->st_uid, (long) sta.st_uid); - printf(" gid = %ld/%ld\n", - (long) stb->st_gid, (long) sta.st_gid); - } - return TRUE; - } - - return FALSE; -} -/* -** DFOPEN -- determined file open -** -** This routine has the semantics of open, except that it will -** keep trying a few times to make this happen. The idea is that -** on very loaded systems, we may run out of resources (inodes, -** whatever), so this tries to get around it. -*/ - -int -dfopen(filename, omode, cmode, sff) - char *filename; - int omode; - int cmode; - int sff; -{ - register int tries; - int fd; - struct stat st; - - for (tries = 0; tries < 10; tries++) - { - sleep((unsigned) (10 * tries)); - errno = 0; - fd = open(filename, omode, cmode); - if (fd >= 0) - break; - switch (errno) - { - case ENFILE: /* system file table full */ - case EINTR: /* interrupted syscall */ -#ifdef ETXTBSY - case ETXTBSY: /* Apollo: net file locked */ -#endif - continue; - } - break; - } - if (!bitset(SFF_NOLOCK, sff) && - fd >= 0 && - fstat(fd, &st) >= 0 && - S_ISREG(st.st_mode)) - { - int locktype; - - /* lock the file to avoid accidental conflicts */ - if ((omode & O_ACCMODE) != O_RDONLY) - locktype = LOCK_EX; - else - locktype = LOCK_SH; - (void) lockfile(fd, filename, NULL, locktype); - errno = 0; - } - return fd; -} diff --git a/src/savemail.c b/src/savemail.c deleted file mode 100644 index 6a18ee6..0000000 --- a/src/savemail.c +++ /dev/null @@ -1,1486 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)savemail.c 8.140 (Berkeley) 1/18/1999"; -#endif /* not lint */ - -# include "sendmail.h" - -/* -** SAVEMAIL -- Save mail on error -** -** If mailing back errors, mail it back to the originator -** together with an error message; otherwise, just put it in -** dead.letter in the user's home directory (if he exists on -** this machine). -** -** Parameters: -** e -- the envelope containing the message in error. -** sendbody -- if TRUE, also send back the body of the -** message; otherwise just send the header. -** -** Returns: -** none -** -** Side Effects: -** Saves the letter, by writing or mailing it back to the -** sender, or by putting it in dead.letter in her home -** directory. -*/ - -/* defines for state machine */ -# define ESM_REPORT 0 /* report to sender's terminal */ -# define ESM_MAIL 1 /* mail back to sender */ -# define ESM_QUIET 2 /* messages have already been returned */ -# define ESM_DEADLETTER 3 /* save in ~/dead.letter */ -# define ESM_POSTMASTER 4 /* return to postmaster */ -# define ESM_USRTMP 5 /* save in /usr/tmp/dead.letter */ -# define ESM_PANIC 6 /* leave the locked queue/transcript files */ -# define ESM_DONE 7 /* the message is successfully delivered */ - - -void -savemail(e, sendbody) - register ENVELOPE *e; - bool sendbody; -{ - register struct passwd *pw; - register FILE *fp; - int state; - auto ADDRESS *q = NULL; - register char *p; - MCI mcibuf; - int flags; - char buf[MAXLINE+1]; - extern char *ttypath __P((void)); - extern bool writable __P((char *, ADDRESS *, int)); - - if (tTd(6, 1)) - { - printf("\nsavemail, errormode = %c, id = %s, ExitStat = %d\n e_from=", - e->e_errormode, e->e_id == NULL ? "NONE" : e->e_id, - ExitStat); - printaddr(&e->e_from, FALSE); - } - - if (e->e_id == NULL) - { - /* can't return a message with no id */ - return; - } - - /* - ** In the unhappy event we don't know who to return the mail - ** to, make someone up. - */ - - if (e->e_from.q_paddr == NULL) - { - e->e_sender = "Postmaster"; - if (parseaddr(e->e_sender, &e->e_from, - RF_COPYPARSE|RF_SENDERADDR, '\0', NULL, e) == NULL) - { - syserr("553 Cannot parse Postmaster!"); - finis(TRUE, EX_SOFTWARE); - } - } - e->e_to = NULL; - - /* - ** Basic state machine. - ** - ** This machine runs through the following states: - ** - ** ESM_QUIET Errors have already been printed iff the - ** sender is local. - ** ESM_REPORT Report directly to the sender's terminal. - ** ESM_MAIL Mail response to the sender. - ** ESM_DEADLETTER Save response in ~/dead.letter. - ** ESM_POSTMASTER Mail response to the postmaster. - ** ESM_PANIC Save response anywhere possible. - */ - - /* determine starting state */ - switch (e->e_errormode) - { - case EM_WRITE: - state = ESM_REPORT; - break; - - case EM_BERKNET: - case EM_MAIL: - state = ESM_MAIL; - break; - - case EM_PRINT: - case '\0': - state = ESM_QUIET; - break; - - case EM_QUIET: - /* no need to return anything at all */ - return; - - default: - syserr("554 savemail: bogus errormode x%x\n", e->e_errormode); - state = ESM_MAIL; - break; - } - - /* if this is already an error response, send to postmaster */ - if (bitset(EF_RESPONSE, e->e_flags)) - { - if (e->e_parent != NULL && - bitset(EF_RESPONSE, e->e_parent->e_flags)) - { - /* got an error sending a response -- can it */ - return; - } - state = ESM_POSTMASTER; - } - - while (state != ESM_DONE) - { - if (tTd(6, 5)) - printf(" state %d\n", state); - - switch (state) - { - case ESM_QUIET: - if (bitnset(M_LOCALMAILER, e->e_from.q_mailer->m_flags)) - state = ESM_DEADLETTER; - else - state = ESM_MAIL; - break; - - case ESM_REPORT: - - /* - ** If the user is still logged in on the same terminal, - ** then write the error messages back to hir (sic). - */ - - p = ttypath(); - if (p == NULL || freopen(p, "w", stdout) == NULL) - { - state = ESM_MAIL; - break; - } - - expand("\201n", buf, sizeof buf, e); - printf("\r\nMessage from %s...\r\n", buf); - printf("Errors occurred while sending mail.\r\n"); - if (e->e_xfp != NULL) - { - (void) fflush(e->e_xfp); - fp = fopen(queuename(e, 'x'), "r"); - } - else - fp = NULL; - if (fp == NULL) - { - syserr("Cannot open %s", queuename(e, 'x')); - printf("Transcript of session is unavailable.\r\n"); - } - else - { - printf("Transcript follows:\r\n"); - while (fgets(buf, sizeof buf, fp) != NULL && - !ferror(stdout)) - fputs(buf, stdout); - (void) xfclose(fp, "savemail transcript", e->e_id); - } - printf("Original message will be saved in dead.letter.\r\n"); - state = ESM_DEADLETTER; - break; - - case ESM_MAIL: - /* - ** If mailing back, do it. - ** Throw away all further output. Don't alias, - ** since this could cause loops, e.g., if joe - ** mails to joe@x, and for some reason the network - ** for @x is down, then the response gets sent to - ** joe@x, which gives a response, etc. Also force - ** the mail to be delivered even if a version of - ** it has already been sent to the sender. - ** - ** If this is a configuration or local software - ** error, send to the local postmaster as well, - ** since the originator can't do anything - ** about it anyway. Note that this is a full - ** copy of the message (intentionally) so that - ** the Postmaster can forward things along. - */ - - if (ExitStat == EX_CONFIG || ExitStat == EX_SOFTWARE) - { - (void) sendtolist("postmaster", - NULLADDR, &e->e_errorqueue, 0, e); - } - if (!emptyaddr(&e->e_from)) - { - char from[TOBUFSIZE]; - extern bool pruneroute __P((char *)); - - if (strlen(e->e_from.q_paddr) + 1 > sizeof from) - { - state = ESM_POSTMASTER; - break; - } - strcpy(from, e->e_from.q_paddr); - - if (!DontPruneRoutes && pruneroute(from)) - { - ADDRESS *a; - - for (a = e->e_errorqueue; a != NULL; - a = a->q_next) - { - if (sameaddr(a, &e->e_from)) - a->q_flags |= QDONTSEND; - } - } - (void) sendtolist(from, NULLADDR, - &e->e_errorqueue, 0, e); - } - - /* - ** Deliver a non-delivery report to the - ** Postmaster-designate (not necessarily - ** Postmaster). This does not include the - ** body of the message, for privacy reasons. - ** You really shouldn't need this. - */ - - e->e_flags |= EF_PM_NOTIFY; - - /* check to see if there are any good addresses */ - for (q = e->e_errorqueue; q != NULL; q = q->q_next) - if (!bitset(QBADADDR|QDONTSEND, q->q_flags)) - break; - if (q == NULL) - { - /* this is an error-error */ - state = ESM_POSTMASTER; - break; - } - if (returntosender(e->e_message, e->e_errorqueue, - sendbody ? RTSF_SEND_BODY - : RTSF_NO_BODY, - e) == 0) - { - state = ESM_DONE; - break; - } - - /* didn't work -- return to postmaster */ - state = ESM_POSTMASTER; - break; - - case ESM_POSTMASTER: - /* - ** Similar to previous case, but to system postmaster. - */ - - q = NULL; - if (sendtolist(DoubleBounceAddr, - NULLADDR, &q, 0, e) <= 0) - { - syserr("553 cannot parse %s!", DoubleBounceAddr); - ExitStat = EX_SOFTWARE; - state = ESM_USRTMP; - break; - } - flags = RTSF_PM_BOUNCE; - if (sendbody) - flags |= RTSF_SEND_BODY; - if (returntosender(e->e_message, q, flags, e) == 0) - { - state = ESM_DONE; - break; - } - - /* didn't work -- last resort */ - state = ESM_USRTMP; - break; - - case ESM_DEADLETTER: - /* - ** Save the message in dead.letter. - ** If we weren't mailing back, and the user is - ** local, we should save the message in - ** ~/dead.letter so that the poor person doesn't - ** have to type it over again -- and we all know - ** what poor typists UNIX users are. - */ - - p = NULL; - if (bitnset(M_HASPWENT, e->e_from.q_mailer->m_flags)) - { - if (e->e_from.q_home != NULL) - p = e->e_from.q_home; - else if ((pw = sm_getpwnam(e->e_from.q_user)) != NULL) - p = pw->pw_dir; - } - if (p == NULL || e->e_dfp == NULL) - { - /* no local directory or no data file */ - state = ESM_MAIL; - break; - } - - /* we have a home directory; write dead.letter */ - define('z', p, e); - expand("\201z/dead.letter", buf, sizeof buf, e); - flags = SFF_CREAT|SFF_REGONLY|SFF_RUNASREALUID; - if (RealUid == 0) - flags |= SFF_ROOTOK; - e->e_to = buf; - if (mailfile(buf, FileMailer, NULL, flags, e) == EX_OK) - { - int oldverb = Verbose; - - Verbose = 1; - message("Saved message in %s", buf); - Verbose = oldverb; - state = ESM_DONE; - break; - } - state = ESM_MAIL; - break; - - case ESM_USRTMP: - /* - ** Log the mail in /usr/tmp/dead.letter. - */ - - if (e->e_class < 0) - { - state = ESM_DONE; - break; - } - - if ((SafeFileEnv != NULL && SafeFileEnv[0] != '\0') || - DeadLetterDrop == NULL || DeadLetterDrop[0] == '\0') - { - state = ESM_PANIC; - break; - } - - flags = SFF_CREAT|SFF_REGONLY|SFF_ROOTOK|SFF_OPENASROOT|SFF_MUSTOWN; - if (!writable(DeadLetterDrop, NULL, flags) || - (fp = safefopen(DeadLetterDrop, O_WRONLY|O_APPEND, - FileMode, flags)) == NULL) - { - state = ESM_PANIC; - break; - } - - bzero(&mcibuf, sizeof mcibuf); - mcibuf.mci_out = fp; - mcibuf.mci_mailer = FileMailer; - if (bitnset(M_7BITS, FileMailer->m_flags)) - mcibuf.mci_flags |= MCIF_7BIT; - mcibuf.mci_contentlen = 0; - - putfromline(&mcibuf, e); - (*e->e_puthdr)(&mcibuf, e->e_header, e, M87F_OUTER); - (*e->e_putbody)(&mcibuf, e, NULL); - putline("\n", &mcibuf); - (void) fflush(fp); - if (ferror(fp)) - state = ESM_PANIC; - else - { - int oldverb = Verbose; - - Verbose = 1; - message("Saved message in %s", DeadLetterDrop); - Verbose = oldverb; - if (LogLevel > 3) - sm_syslog(LOG_NOTICE, e->e_id, - "Saved message in %s", - DeadLetterDrop); - state = ESM_DONE; - } - (void) xfclose(fp, "savemail", DeadLetterDrop); - break; - - default: - syserr("554 savemail: unknown state %d", state); - - /* fall through ... */ - - case ESM_PANIC: - /* leave the locked queue & transcript files around */ - loseqfile(e, "savemail panic"); - syserr("!554 savemail: cannot save rejected email anywhere"); - } - } -} -/* -** RETURNTOSENDER -- return a message to the sender with an error. -** -** Parameters: -** msg -- the explanatory message. -** returnq -- the queue of people to send the message to. -** flags -- flags tweaking the operation: -** RTSF_SENDBODY -- include body of message (otherwise -** just send the header). -** RTSF_PMBOUNCE -- this is a postmaster bounce. -** e -- the current envelope. -** -** Returns: -** zero -- if everything went ok. -** else -- some error. -** -** Side Effects: -** Returns the current message to the sender via -** mail. -*/ - -#define MAXRETURNS 6 /* max depth of returning messages */ -#define ERRORFUDGE 100 /* nominal size of error message text */ - -int -returntosender(msg, returnq, flags, e) - char *msg; - ADDRESS *returnq; - int flags; - register ENVELOPE *e; -{ - register ENVELOPE *ee; - ENVELOPE *oldcur = CurEnv; - ENVELOPE errenvelope; - static int returndepth = 0; - register ADDRESS *q; - char *p; - char buf[MAXNAME + 1]; - extern void errbody __P((MCI *, ENVELOPE *, char *)); - - if (returnq == NULL) - return (-1); - - if (msg == NULL) - msg = "Unable to deliver mail"; - - if (tTd(6, 1)) - { - printf("\n*** Return To Sender: msg=\"%s\", depth=%d, e=%lx, returnq=", - msg, returndepth, (u_long) e); - printaddr(returnq, TRUE); - if (tTd(6, 20)) - { - printf("Sendq="); - printaddr(e->e_sendqueue, TRUE); - } - } - - if (++returndepth >= MAXRETURNS) - { - if (returndepth != MAXRETURNS) - syserr("554 returntosender: infinite recursion on %s", returnq->q_paddr); - /* don't "unrecurse" and fake a clean exit */ - /* returndepth--; */ - return (0); - } - - define('g', e->e_from.q_paddr, e); - define('u', NULL, e); - - /* initialize error envelope */ - ee = newenvelope(&errenvelope, e); - define('a', "\201b", ee); - define('r', "internal", ee); - define('s', "localhost", ee); - define('_', "localhost", ee); - ee->e_puthdr = putheader; - ee->e_putbody = errbody; - ee->e_flags |= EF_RESPONSE|EF_METOO; - if (!bitset(EF_OLDSTYLE, e->e_flags)) - ee->e_flags &= ~EF_OLDSTYLE; - ee->e_sendqueue = returnq; - ee->e_msgsize = ERRORFUDGE; - if (bitset(RTSF_SEND_BODY, flags)) - ee->e_msgsize += e->e_msgsize; - else - ee->e_flags |= EF_NO_BODY_RETN; - initsys(ee); - for (q = returnq; q != NULL; q = q->q_next) - { - if (bitset(QBADADDR, q->q_flags)) - continue; - - q->q_flags &= ~(QHASNOTIFY|Q_PINGFLAGS); - q->q_flags |= QPINGONFAILURE; - - if (!bitset(QDONTSEND, q->q_flags)) - ee->e_nrcpts++; - - if (q->q_alias == NULL) - addheader("To", q->q_paddr, &ee->e_header); - } - - if (LogLevel > 5) - { - if (bitset(EF_RESPONSE|EF_WARNING, e->e_flags)) - p = "return to sender"; - else if (bitset(RTSF_PM_BOUNCE, flags)) - p = "postmaster notify"; - else - p = "DSN"; - sm_syslog(LOG_INFO, e->e_id, - "%s: %s: %s", - ee->e_id, p, shortenstring(msg, MAXSHORTSTR)); - } - - if (SendMIMEErrors) - { - addheader("MIME-Version", "1.0", &ee->e_header); - - (void) snprintf(buf, sizeof buf, "%s.%ld/%.100s", - ee->e_id, curtime(), MyHostName); - ee->e_msgboundary = newstr(buf); - (void) snprintf(buf, sizeof buf, -#if DSN - "multipart/report; report-type=delivery-status;\n\tboundary=\"%s\"", -#else - "multipart/mixed; boundary=\"%s\"", -#endif - ee->e_msgboundary); - addheader("Content-Type", buf, &ee->e_header); - - p = hvalue("Content-Transfer-Encoding", e->e_header); - if (p != NULL && strcasecmp(p, "binary") != 0) - p = NULL; - if (p == NULL && bitset(EF_HAS8BIT, e->e_flags)) - p = "8bit"; - if (p != NULL) - addheader("Content-Transfer-Encoding", p, &ee->e_header); - } - if (strncmp(msg, "Warning:", 8) == 0) - { - addheader("Subject", msg, &ee->e_header); - p = "warning-timeout"; - } - else if (strncmp(msg, "Postmaster warning:", 19) == 0) - { - addheader("Subject", msg, &ee->e_header); - p = "postmaster-warning"; - } - else if (strcmp(msg, "Return receipt") == 0) - { - addheader("Subject", msg, &ee->e_header); - p = "return-receipt"; - } - else if (bitset(RTSF_PM_BOUNCE, flags)) - { - snprintf(buf, sizeof buf, "Postmaster notify: %.*s", - sizeof buf - 20, msg); - addheader("Subject", buf, &ee->e_header); - p = "postmaster-notification"; - } - else - { - snprintf(buf, sizeof buf, "Returned mail: %.*s", - sizeof buf - 20, msg); - addheader("Subject", buf, &ee->e_header); - p = "failure"; - } - (void) snprintf(buf, sizeof buf, "auto-generated (%s)", p); - addheader("Auto-Submitted", buf, &ee->e_header); - - /* fake up an address header for the from person */ - expand("\201n", buf, sizeof buf, e); - if (parseaddr(buf, &ee->e_from, RF_COPYALL|RF_SENDERADDR, '\0', NULL, e) == NULL) - { - syserr("553 Can't parse myself!"); - ExitStat = EX_SOFTWARE; - returndepth--; - return (-1); - } - ee->e_from.q_flags &= ~(QHASNOTIFY|Q_PINGFLAGS); - ee->e_from.q_flags |= QPINGONFAILURE; - ee->e_sender = ee->e_from.q_paddr; - - /* push state into submessage */ - CurEnv = ee; - define('f', "\201n", ee); - define('x', "Mail Delivery Subsystem", ee); - eatheader(ee, TRUE); - - /* mark statistics */ - markstats(ee, NULLADDR, FALSE); - - /* actually deliver the error message */ - sendall(ee, SM_DELIVER); - - /* restore state */ - dropenvelope(ee, TRUE); - CurEnv = oldcur; - returndepth--; - - /* check for delivery errors */ - if (ee->e_parent == NULL || !bitset(EF_RESPONSE, ee->e_parent->e_flags)) - return 0; - for (q = ee->e_sendqueue; q != NULL; q = q->q_next) - { - if (bitset(QQUEUEUP|QSENT, q->q_flags)) - return 0; - } - return -1; -} -/* -** ERRBODY -- output the body of an error message. -** -** Typically this is a copy of the transcript plus a copy of the -** original offending message. -** -** Parameters: -** mci -- the mailer connection information. -** e -- the envelope we are working in. -** separator -- any possible MIME separator. -** -** Returns: -** none -** -** Side Effects: -** Outputs the body of an error message. -*/ - -void -errbody(mci, e, separator) - register MCI *mci; - register ENVELOPE *e; - char *separator; -{ - register FILE *xfile; - char *p; - register ADDRESS *q = NULL; - bool printheader; - bool sendbody; - bool pm_notify; - char buf[MAXLINE]; - - if (bitset(MCIF_INHEADER, mci->mci_flags)) - { - putline("", mci); - mci->mci_flags &= ~MCIF_INHEADER; - } - if (e->e_parent == NULL) - { - syserr("errbody: null parent"); - putline(" ----- Original message lost -----\n", mci); - return; - } - - /* - ** Output MIME header. - */ - - if (e->e_msgboundary != NULL) - { - putline("This is a MIME-encapsulated message", mci); - putline("", mci); - (void) snprintf(buf, sizeof buf, "--%s", e->e_msgboundary); - putline(buf, mci); - putline("", mci); - } - - /* - ** Output introductory information. - */ - - pm_notify = FALSE; - p = hvalue("subject", e->e_header); - if (p != NULL && strncmp(p, "Postmaster ", 11) == 0) - pm_notify = TRUE; - else - { - for (q = e->e_parent->e_sendqueue; q != NULL; q = q->q_next) - if (bitset(QBADADDR, q->q_flags)) - break; - } - if (!pm_notify && q == NULL && - !bitset(EF_FATALERRS|EF_SENDRECEIPT, e->e_parent->e_flags)) - { - putline(" **********************************************", - mci); - putline(" ** THIS IS A WARNING MESSAGE ONLY **", - mci); - putline(" ** YOU DO NOT NEED TO RESEND YOUR MESSAGE **", - mci); - putline(" **********************************************", - mci); - putline("", mci); - } - snprintf(buf, sizeof buf, "The original message was received at %s", - arpadate(ctime(&e->e_parent->e_ctime))); - putline(buf, mci); - expand("from \201_", buf, sizeof buf, e->e_parent); - putline(buf, mci); - putline("", mci); - - /* - ** Output error message header (if specified and available). - */ - - if (ErrMsgFile != NULL && !bitset(EF_SENDRECEIPT, e->e_parent->e_flags)) - { - if (*ErrMsgFile == '/') - { - int sff = SFF_ROOTOK|SFF_REGONLY; - - if (DontLockReadFiles) - sff |= SFF_NOLOCK; - if (!bitset(DBS_ERRORHEADERINUNSAFEDIRPATH, DontBlameSendmail)) - sff |= SFF_SAFEDIRPATH; - xfile = safefopen(ErrMsgFile, O_RDONLY, 0444, sff); - if (xfile != NULL) - { - while (fgets(buf, sizeof buf, xfile) != NULL) - { - extern void translate_dollars __P((char *)); - - translate_dollars(buf); - expand(buf, buf, sizeof buf, e); - putline(buf, mci); - } - (void) fclose(xfile); - putline("\n", mci); - } - } - else - { - expand(ErrMsgFile, buf, sizeof buf, e); - putline(buf, mci); - putline("", mci); - } - } - - /* - ** Output message introduction - */ - - printheader = TRUE; - for (q = e->e_parent->e_sendqueue; q != NULL; q = q->q_next) - { - if (!bitset(QBADADDR, q->q_flags) || - !bitset(QPINGONFAILURE, q->q_flags)) - continue; - - if (printheader) - { - putline(" ----- The following addresses had permanent fatal errors -----", - mci); - printheader = FALSE; - } - - snprintf(buf, sizeof buf, "%s", - shortenstring(q->q_paddr, MAXSHORTSTR)); - putline(buf, mci); - if (q->q_alias != NULL) - { - snprintf(buf, sizeof buf, " (expanded from: %s)", - shortenstring(q->q_alias->q_paddr, MAXSHORTSTR)); - putline(buf, mci); - } - } - if (!printheader) - putline("", mci); - - printheader = TRUE; - for (q = e->e_parent->e_sendqueue; q != NULL; q = q->q_next) - { - if (bitset(QBADADDR, q->q_flags) || - !bitset(QPRIMARY, q->q_flags) || - !bitset(QDELAYED, q->q_flags)) - continue; - - if (printheader) - { - putline(" ----- The following addresses had transient non-fatal errors -----", - mci); - printheader = FALSE; - } - - snprintf(buf, sizeof buf, "%s", - shortenstring(q->q_paddr, MAXSHORTSTR)); - putline(buf, mci); - if (q->q_alias != NULL) - { - snprintf(buf, sizeof buf, " (expanded from: %s)", - shortenstring(q->q_alias->q_paddr, MAXSHORTSTR)); - putline(buf, mci); - } - } - if (!printheader) - putline("", mci); - - printheader = TRUE; - for (q = e->e_parent->e_sendqueue; q != NULL; q = q->q_next) - { - if (bitset(QBADADDR, q->q_flags) || - !bitset(QPRIMARY, q->q_flags) || - bitset(QDELAYED, q->q_flags)) - continue; - else if (!bitset(QPINGONSUCCESS, q->q_flags)) - continue; - else if (bitset(QRELAYED, q->q_flags)) - p = "relayed to non-DSN-aware mailer"; - else if (bitset(QDELIVERED, q->q_flags)) - { - if (bitset(QEXPANDED, q->q_flags)) - p = "successfully delivered to mailing list"; - else - p = "successfully delivered to mailbox"; - } - else if (bitset(QEXPANDED, q->q_flags)) - p = "expanded by alias"; - else - continue; - - if (printheader) - { - putline(" ----- The following addresses had successful delivery notifications -----", - mci); - printheader = FALSE; - } - - snprintf(buf, sizeof buf, "%s (%s)", - shortenstring(q->q_paddr, MAXSHORTSTR), p); - putline(buf, mci); - if (q->q_alias != NULL) - { - snprintf(buf, sizeof buf, " (expanded from: %s)", - shortenstring(q->q_alias->q_paddr, MAXSHORTSTR)); - putline(buf, mci); - } - } - if (!printheader) - putline("", mci); - - /* - ** Output transcript of errors - */ - - (void) fflush(stdout); - p = queuename(e->e_parent, 'x'); - if ((xfile = fopen(p, "r")) == NULL) - { - syserr("Cannot open %s", p); - putline(" ----- Transcript of session is unavailable -----\n", mci); - } - else - { - printheader = TRUE; - if (e->e_xfp != NULL) - (void) fflush(e->e_xfp); - while (fgets(buf, sizeof buf, xfile) != NULL) - { - if (printheader) - putline(" ----- Transcript of session follows -----\n", mci); - printheader = FALSE; - putline(buf, mci); - } - (void) xfclose(xfile, "errbody xscript", p); - } - errno = 0; - -#if DSN - /* - ** Output machine-readable version. - */ - - if (e->e_msgboundary != NULL) - { - putline("", mci); - (void) snprintf(buf, sizeof buf, "--%s", e->e_msgboundary); - putline(buf, mci); - putline("Content-Type: message/delivery-status", mci); - putline("", mci); - - /* - ** Output per-message information. - */ - - /* original envelope id from MAIL FROM: line */ - if (e->e_parent->e_envid != NULL) - { - (void) snprintf(buf, sizeof buf, "Original-Envelope-Id: %.800s", - xuntextify(e->e_parent->e_envid)); - putline(buf, mci); - } - - /* Reporting-MTA: is us (required) */ - (void) snprintf(buf, sizeof buf, "Reporting-MTA: dns; %.800s", MyHostName); - putline(buf, mci); - - /* DSN-Gateway: not relevant since we are not translating */ - - /* Received-From-MTA: shows where we got this message from */ - if (RealHostName != NULL) - { - /* XXX use $s for type? */ - if (e->e_parent->e_from.q_mailer == NULL || - (p = e->e_parent->e_from.q_mailer->m_mtatype) == NULL) - p = "dns"; - (void) snprintf(buf, sizeof buf, "Received-From-MTA: %s; %.800s", - p, RealHostName); - putline(buf, mci); - } - - /* Arrival-Date: -- when it arrived here */ - (void) snprintf(buf, sizeof buf, "Arrival-Date: %s", - arpadate(ctime(&e->e_parent->e_ctime))); - putline(buf, mci); - - /* - ** Output per-address information. - */ - - for (q = e->e_parent->e_sendqueue; q != NULL; q = q->q_next) - { - register ADDRESS *r; - char *action; - - if (bitset(QBADADDR, q->q_flags)) - action = "failed"; - else if (!bitset(QPRIMARY, q->q_flags)) - continue; - else if (bitset(QDELIVERED, q->q_flags)) - { - if (bitset(QEXPANDED, q->q_flags)) - action = "delivered (to mailing list)"; - else - action = "delivered (to mailbox)"; - } - else if (bitset(QRELAYED, q->q_flags)) - action = "relayed (to non-DSN-aware mailer)"; - else if (bitset(QEXPANDED, q->q_flags)) - action = "expanded (to multi-recipient alias)"; - else if (bitset(QDELAYED, q->q_flags)) - action = "delayed"; - else - continue; - - putline("", mci); - - /* Original-Recipient: -- passed from on high */ - if (q->q_orcpt != NULL) - { - (void) snprintf(buf, sizeof buf, "Original-Recipient: %.800s", - q->q_orcpt); - putline(buf, mci); - } - - /* Final-Recipient: -- the name from the RCPT command */ - p = e->e_parent->e_from.q_mailer->m_addrtype; - if (p == NULL) - p = "rfc822"; - for (r = q; r->q_alias != NULL; r = r->q_alias) - continue; - if (strchr(r->q_user, '@') != NULL) - { - (void) snprintf(buf, sizeof buf, - "Final-Recipient: %s; %.800s", - p, r->q_user); - } - else if (strchr(r->q_paddr, '@') != NULL) - { - (void) snprintf(buf, sizeof buf, - "Final-Recipient: %s; %.800s", - p, r->q_paddr); - } - else - { - (void) snprintf(buf, sizeof buf, - "Final-Recipient: %s; %.700s@%.100s", - p, r->q_user, MyHostName); - } - putline(buf, mci); - - /* X-Actual-Recipient: -- the real problem address */ - if (r != q && q->q_user[0] != '\0') - { - if (strchr(q->q_user, '@') == NULL) - { - (void) snprintf(buf, sizeof buf, - "X-Actual-Recipient: %s; %.700s@%.100s", - p, q->q_user, MyHostName); - } - else - { - (void) snprintf(buf, sizeof buf, - "X-Actual-Recipient: %s; %.800s", - p, q->q_user); - } - putline(buf, mci); - } - - /* Action: -- what happened? */ - snprintf(buf, sizeof buf, "Action: %s", action); - putline(buf, mci); - - /* Status: -- what _really_ happened? */ - if (q->q_status != NULL) - p = q->q_status; - else if (bitset(QBADADDR, q->q_flags)) - p = "5.0.0"; - else if (bitset(QQUEUEUP, q->q_flags)) - p = "4.0.0"; - else - p = "2.0.0"; - snprintf(buf, sizeof buf, "Status: %s", p); - putline(buf, mci); - - /* Remote-MTA: -- who was I talking to? */ - if (q->q_statmta != NULL) - { - if (q->q_mailer == NULL || - (p = q->q_mailer->m_mtatype) == NULL) - p = "dns"; - (void) snprintf(buf, sizeof buf, - "Remote-MTA: %s; %.800s", - p, q->q_statmta); - p = &buf[strlen(buf) - 1]; - if (*p == '.') - *p = '\0'; - putline(buf, mci); - } - - /* Diagnostic-Code: -- actual result from other end */ - if (q->q_rstatus != NULL) - { - p = q->q_mailer->m_diagtype; - if (p == NULL) - p = "smtp"; - (void) snprintf(buf, sizeof buf, - "Diagnostic-Code: %s; %.800s", - p, q->q_rstatus); - putline(buf, mci); - } - - /* Last-Attempt-Date: -- fine granularity */ - if (q->q_statdate == (time_t) 0L) - q->q_statdate = curtime(); - (void) snprintf(buf, sizeof buf, - "Last-Attempt-Date: %s", - arpadate(ctime(&q->q_statdate))); - putline(buf, mci); - - /* Will-Retry-Until: -- for delayed messages only */ - if (bitset(QQUEUEUP, q->q_flags) && - !bitset(QBADADDR, q->q_flags)) - { - time_t xdate; - - xdate = e->e_parent->e_ctime + - TimeOuts.to_q_return[e->e_parent->e_timeoutclass]; - snprintf(buf, sizeof buf, - "Will-Retry-Until: %s", - arpadate(ctime(&xdate))); - putline(buf, mci); - } - } - } -#endif - - /* - ** Output text of original message - */ - - putline("", mci); - if (bitset(EF_HAS_DF, e->e_parent->e_flags)) - { - sendbody = !bitset(EF_NO_BODY_RETN, e->e_parent->e_flags) && - !bitset(EF_NO_BODY_RETN, e->e_flags); - - if (e->e_msgboundary == NULL) - { - if (sendbody) - putline(" ----- Original message follows -----\n", mci); - else - putline(" ----- Message header follows -----\n", mci); - (void) fflush(mci->mci_out); - } - else - { - (void) snprintf(buf, sizeof buf, "--%s", - e->e_msgboundary); - - putline(buf, mci); - (void) snprintf(buf, sizeof buf, "Content-Type: %s", - sendbody ? "message/rfc822" - : "text/rfc822-headers"); - putline(buf, mci); - - p = hvalue("Content-Transfer-Encoding", e->e_parent->e_header); - if (p != NULL && strcasecmp(p, "binary") != 0) - p = NULL; - if (p == NULL && bitset(EF_HAS8BIT, e->e_parent->e_flags)) - p = "8bit"; - if (p != NULL) - { - (void) snprintf(buf, sizeof buf, "Content-Transfer-Encoding: %s", - p); - putline(buf, mci); - } - } - putline("", mci); - putheader(mci, e->e_parent->e_header, e->e_parent, M87F_OUTER); - if (sendbody) - putbody(mci, e->e_parent, e->e_msgboundary); - else if (e->e_msgboundary == NULL) - { - putline("", mci); - putline(" ----- Message body suppressed -----", mci); - } - } - else if (e->e_msgboundary == NULL) - { - putline(" ----- No message was collected -----\n", mci); - } - - if (e->e_msgboundary != NULL) - { - putline("", mci); - (void) snprintf(buf, sizeof buf, "--%s--", e->e_msgboundary); - putline(buf, mci); - } - putline("", mci); - - /* - ** Cleanup and exit - */ - - if (errno != 0) - syserr("errbody: I/O error"); -} -/* -** SMTPTODSN -- convert SMTP to DSN status code -** -** Parameters: -** smtpstat -- the smtp status code (e.g., 550). -** -** Returns: -** The DSN version of the status code. -*/ - -char * -smtptodsn(smtpstat) - int smtpstat; -{ - if (smtpstat < 0) - return "4.4.2"; - - switch (smtpstat) - { - case 450: /* Req mail action not taken: mailbox unavailable */ - return "4.2.0"; - - case 451: /* Req action aborted: local error in processing */ - return "4.3.0"; - - case 452: /* Req action not taken: insufficient sys storage */ - return "4.3.1"; - - case 500: /* Syntax error, command unrecognized */ - return "5.5.2"; - - case 501: /* Syntax error in parameters or arguments */ - return "5.5.4"; - - case 502: /* Command not implemented */ - return "5.5.1"; - - case 503: /* Bad sequence of commands */ - return "5.5.1"; - - case 504: /* Command parameter not implemented */ - return "5.5.4"; - - case 550: /* Req mail action not taken: mailbox unavailable */ - return "5.2.0"; - - case 551: /* User not local; please try <...> */ - return "5.1.6"; - - case 552: /* Req mail action aborted: exceeded storage alloc */ - return "5.2.2"; - - case 553: /* Req action not taken: mailbox name not allowed */ - return "5.1.0"; - - case 554: /* Transaction failed */ - return "5.0.0"; - } - - if ((smtpstat / 100) == 2) - return "2.0.0"; - if ((smtpstat / 100) == 4) - return "4.0.0"; - return "5.0.0"; -} -/* -** XTEXTIFY -- take regular text and turn it into DSN-style xtext -** -** Parameters: -** t -- the text to convert. -** taboo -- additional characters that must be encoded. -** -** Returns: -** The xtext-ified version of the same string. -*/ - -char * -xtextify(t, taboo) - register char *t; - char *taboo; -{ - register char *p; - int l; - int nbogus; - static char *bp = NULL; - static int bplen = 0; - - if (taboo == NULL) - taboo = ""; - - /* figure out how long this xtext will have to be */ - nbogus = l = 0; - for (p = t; *p != '\0'; p++) - { - register int c = (*p & 0xff); - - /* ASCII dependence here -- this is the way the spec words it */ - if (c < '!' || c > '~' || c == '+' || c == '\\' || c == '(' || - strchr(taboo, c) != NULL) - nbogus++; - l++; - } - if (nbogus == 0) - return t; - l += nbogus * 2 + 1; - - /* now allocate space if necessary for the new string */ - if (l > bplen) - { - if (bp != NULL) - free(bp); - bp = xalloc(l); - bplen = l; - } - - /* ok, copy the text with byte expansion */ - for (p = bp; *t != '\0'; ) - { - register int c = (*t++ & 0xff); - - /* ASCII dependence here -- this is the way the spec words it */ - if (c < '!' || c > '~' || c == '+' || c == '\\' || c == '(' || - strchr(taboo, c) != NULL) - { - *p++ = '+'; - *p++ = "0123456789abcdef"[c >> 4]; - *p++ = "0123456789abcdef"[c & 0xf]; - } - else - *p++ = c; - } - *p = '\0'; - return bp; -} -/* -** XUNTEXTIFY -- take xtext and turn it into plain text -** -** Parameters: -** t -- the xtextified text. -** -** Returns: -** The decoded text. No attempt is made to deal with -** null strings in the resulting text. -*/ - -char * -xuntextify(t) - register char *t; -{ - register char *p; - int l; - static char *bp = NULL; - static int bplen = 0; - - /* heuristic -- if no plus sign, just return the input */ - if (strchr(t, '+') == NULL) - return t; - - /* xtext is always longer than decoded text */ - l = strlen(t); - if (l > bplen) - { - if (bp != NULL) - free(bp); - bp = xalloc(l); - bplen = l; - } - - /* ok, copy the text with byte compression */ - for (p = bp; *t != '\0'; t++) - { - register int c = *t & 0xff; - - if (c != '+') - { - *p++ = c; - continue; - } - - c = *++t & 0xff; - if (!isascii(c) || !isxdigit(c)) - { - /* error -- first digit is not hex */ - usrerr("bogus xtext: +%c", c); - t--; - continue; - } - if (isdigit(c)) - c -= '0'; - else if (isupper(c)) - c -= 'A' - 10; - else - c -= 'a' - 10; - *p = c << 4; - - c = *++t & 0xff; - if (!isascii(c) || !isxdigit(c)) - { - /* error -- second digit is not hex */ - usrerr("bogus xtext: +%x%c", *p >> 4, c); - t--; - continue; - } - if (isdigit(c)) - c -= '0'; - else if (isupper(c)) - c -= 'A' - 10; - else - c -= 'a' - 10; - *p++ |= c; - } - *p = '\0'; - return bp; -} -/* -** XTEXTOK -- check if a string is legal xtext -** -** Xtext is used in Delivery Status Notifications. The spec was -** taken from RFC 1891, ``SMTP Service Extension for Delivery -** Status Notifications''. -** -** Parameters: -** s -- the string to check. -** -** Returns: -** TRUE -- if 's' is legal xtext. -** FALSE -- if it has any illegal characters in it. -*/ - -bool -xtextok(s) - char *s; -{ - int c; - - while ((c = *s++) != '\0') - { - if (c == '+') - { - c = *s++; - if (!isascii(c) || !isxdigit(c)) - return FALSE; - c = *s++; - if (!isascii(c) || !isxdigit(c)) - return FALSE; - } - else if (c < '!' || c > '~' || c == '=') - return FALSE; - } - return TRUE; -} -/* -** PRUNEROUTE -- prune an RFC-822 source route -** -** Trims down a source route to the last internet-registered hop. -** This is encouraged by RFC 1123 section 5.3.3. -** -** Parameters: -** addr -- the address -** -** Returns: -** TRUE -- address was modified -** FALSE -- address could not be pruned -** -** Side Effects: -** modifies addr in-place -*/ - -bool -pruneroute(addr) - char *addr; -{ -#if NAMED_BIND - char *start, *at, *comma; - char c; - int rcode; - int i; - char hostbuf[BUFSIZ]; - char *mxhosts[MAXMXHOSTS + 1]; - - /* check to see if this is really a route-addr */ - if (*addr != '<' || addr[1] != '@' || addr[strlen(addr) - 1] != '>') - return FALSE; - start = strchr(addr, ':'); - at = strrchr(addr, '@'); - if (start == NULL || at == NULL || at < start) - return FALSE; - - /* slice off the angle brackets */ - i = strlen(at + 1); - if (i >= (SIZE_T) sizeof hostbuf) - return FALSE; - strcpy(hostbuf, at + 1); - hostbuf[i - 1] = '\0'; - - while (start) - { - if (getmxrr(hostbuf, mxhosts, FALSE, &rcode) > 0) - { - strcpy(addr + 1, start + 1); - return TRUE; - } - c = *start; - *start = '\0'; - comma = strrchr(addr, ','); - if (comma != NULL && comma[1] == '@' && - strlen(comma + 2) < (SIZE_T) sizeof hostbuf) - strcpy(hostbuf, comma + 2); - else - comma = NULL; - *start = c; - start = comma; - } -#endif - return FALSE; -} diff --git a/src/sendmail.0 b/src/sendmail.0 deleted file mode 100644 index 0046bd3..0000000 --- a/src/sendmail.0 +++ /dev/null @@ -1,356 +0,0 @@ -SENDMAIL(8) BSD System Manager's Manual SENDMAIL(8) - -NNAAMMEE - sseennddmmaaiill - an electronic mail transport agent - -SSYYNNOOPPSSIISS - sseennddmmaaiill [_f_l_a_g_s] [_a_d_d_r_e_s_s _._._.] - nneewwaalliiaasseess - mmaaiillqq [--vv] - -DDEESSCCRRIIPPTTIIOONN - SSeennddmmaaiill sends a message to one or more _r_e_c_i_p_i_e_n_t_s, routing the message - over whatever networks are necessary. SSeennddmmaaiill does internetwork for- - warding as necessary to deliver the message to the correct place. - - SSeennddmmaaiill is not intended as a user interface routine; other programs pro- - vide user-friendly front ends; sseennddmmaaiill is used only to deliver pre-for- - matted messages. - - With no flags, sseennddmmaaiill reads its standard input up to an end-of-file or - a line consisting only of a single dot and sends a copy of the message - found there to all of the addresses listed. It determines the network(s) - to use based on the syntax and contents of the addresses. - - Local addresses are looked up in a file and aliased appropriately. - Aliasing can be prevented by preceding the address with a backslash. - Normally the sender is not included in any alias expansions, e.g., if - `john' sends to `group', and `group' includes `john' in the expansion, - then the letter will not be delivered to `john'. - - PPaarraammeetteerrss - - --BB_t_y_p_e Set the body type to _t_y_p_e. Current legal values 7BIT or - 8BITMIME. - - --bbaa Go into ARPANET mode. All input lines must end with a CR-LF, - and all messages will be generated with a CR-LF at the end. - Also, the ``From:'' and ``Sender:'' fields are examined for - the name of the sender. - - --bbdd Run as a daemon. This requires Berkeley IPC. SSeennddmmaaiill will - fork and run in background listening on socket 25 for incom- - ing SMTP connections. This is normally run from _/_e_t_c_/_r_c. - - --bbDD Same as --bbdd except runs in foreground. - - --bbhh Print the persistent host status database. - - --bbHH Purge the persistent host status database. - - --bbii Initialize the alias database. - - --bbmm Deliver mail in the usual way (default). - - --bbpp Print a listing of the queue. - - --bbss Use the SMTP protocol as described in RFC821 on standard in- - put and output. This flag implies all the operations of the - --bbaa flag that are compatible with SMTP. - - --bbtt Run in address test mode. This mode reads addresses and - shows the steps in parsing; it is used for debugging configu- - ration tables. - - --bbvv Verify names only - do not try to collect or deliver a mes- - sage. Verify mode is normally used for validating users or - mailing lists. - - --CC_f_i_l_e Use alternate configuration file. SSeennddmmaaiill refuses to run as - root if an alternate configuration file is specified. - - --dd_X Set debugging value to _X. - - --FF_f_u_l_l_n_a_m_e Set the full name of the sender. - - --ff_n_a_m_e Sets the name of the ``from'' person (i.e., the sender of the - mail). --ff can only be used by ``trusted'' users (normally - _r_o_o_t, _d_a_e_m_o_n, and _n_e_t_w_o_r_k) or if the person you are trying to - become is the same as the person you are. - - --hh_N Set the hop count to _N. The hop count is incremented every - time the mail is processed. When it reaches a limit, the - mail is returned with an error message, the victim of an - aliasing loop. If not specified, ``Received:'' lines in the - message are counted. - - --ii Ignore dots alone on lines by themselves in incoming mes- - sages. This should be set if you are reading data from a - file. - - --NN _d_s_n Set delivery status notification conditions to _d_s_n_, which can - be `never' for no notifications or a comma separated list of - the values `failure' to be notified if delivery failed, - `delay' to be notified if delivery is delayed, and `success' - to be notified when the message is successfully delivered. - - --nn Don't do aliasing. - - --OO _o_p_t_i_o_n=_v_a_l_u_e - Set option _o_p_t_i_o_n to the specified _v_a_l_u_e. This form uses long - names. See below for more details. - - --oo_x _v_a_l_u_e Set option _x to the specified _v_a_l_u_e. This form uses single - character names only. The short names are not described in - this manual page; see the _S_e_n_d_m_a_i_l _I_n_s_t_a_l_l_a_t_i_o_n _a_n_d _O_p_e_r_a_t_i_o_n - _G_u_i_d_e for details. - - --pp_p_r_o_t_o_c_o_l Set the name of the protocol used to receive the message. - This can be a simple protocol name such as ``UUCP'' or a pro- - tocol and hostname, such as ``UUCP:ucbvax''. - - --qq[_t_i_m_e] Processed saved messages in the queue at given intervals. If - _t_i_m_e is omitted, process the queue once. Time is given as a - tagged number, with `s' being seconds, `m' being minutes, `h' - being hours, `d' being days, and `w' being weeks. For exam- - ple, `-q1h30m' or `-q90m' would both set the timeout to one - hour thirty minutes. If _t_i_m_e is specified, sseennddmmaaiill will run - in background. This option can be used safely with --bbdd. - - --qqII_s_u_b_s_t_r Limit processed jobs to those containing _s_u_b_s_t_r as a sub- - string of the queue id. - - --qqRR_s_u_b_s_t_r Limit processed jobs to those containing _s_u_b_s_t_r as a sub- - string of one of the recipients. - - --qqSS_s_u_b_s_t_r Limit processed jobs to those containing _s_u_b_s_t_r as a sub- - string of the sender. - - --RR _r_e_t_u_r_n Set the amount of the message to be returned if the message - bounces. The _r_e_t_u_r_n parameter can be `full' to return the - - entire message or `hdrs' to return only the headers. - - --rr_n_a_m_e An alternate and obsolete form of the --ff flag. - - --tt Read message for recipients. To:, Cc:, and Bcc: lines will - be scanned for recipient addresses. The Bcc: line will be - deleted before transmission. - - --UU Initial (user) submission. This should _a_l_w_a_y_s be set when - called from a user agent such as MMaaiill or eexxmmhh and _n_e_v_e_r be - set when called by a network delivery agent such as rrmmaaiill. - - --VV _e_n_v_i_d Set the original envelope id. This is propagated across SMTP - to servers that support DSNs and is returned in DSN-compliant - error messages. - - --vv Go into verbose mode. Alias expansions will be announced, - etc. - - --XX _l_o_g_f_i_l_e Log all traffic in and out of mailers in the indicated log - file. This should only be used as a last resort for debug- - ging mailer bugs. It will log a lot of data very quickly. - - ---- Stop processing command flags and use the rest of the argu- - ments as addresses. - - OOppttiioonnss - There are also a number of processing options that may be set. Normally - these will only be used by a system administrator. Options may be set - either on the command line using the --oo flag (for short names), the --OO - flag (for long names), or in the configuration file. This is a partial - list limited to those options that are likely to be useful on the command - line and only shows the long names; for a complete list (and details), - consult the _S_e_n_d_m_a_i_l _I_n_s_t_a_l_l_a_t_i_o_n _a_n_d _O_p_e_r_a_t_i_o_n _G_u_i_d_e. The options are: - - AliasFile=_f_i_l_e - Use alternate alias file. - - HoldExpensive - On mailers that are considered ``expensive'' to connect to, - don't initiate immediate connection. This requires queueing. - - CheckpointInterval=_N - Checkpoint the queue file after every _N successful deliveries - (default 10). This avoids excessive duplicate deliveries - when sending to long mailing lists interrupted by system - crashes. - - DeliveryMode=_x - Set the delivery mode to _x. Delivery modes are `i' for inter- - active (synchronous) delivery, `b' for background (asyn- - chronous) delivery, `q' for queue only - i.e., actual deliv- - ery is done the next time the queue is run, and `d' for de- - ferred - the same as `q' except that database lookups (no- - tably DNS and NIS lookups) are avoided. - - ErrorMode=_x - Set error processing to mode _x. Valid modes are `m' to mail - back the error message, `w' to ``write'' back the error mes- - sage (or mail it back if the sender is not logged in), `p' to - print the errors on the terminal (default), `q' to throw away - error messages (only exit status is returned), and `e' to do - special processing for the BerkNet. If the text of the mes- - sage is not mailed back by modes `m' or `w' and if the sender - is local to this machine, a copy of the message is appended - - to the file _d_e_a_d_._l_e_t_t_e_r in the sender's home directory. - - SaveFromLine - Save UNIX-style From lines at the front of messages. - - MaxHopCount= _N - The maximum number of times a message is allowed to ``hop'' - before we decide it is in a loop. - - IgnoreDots Do not take dots on a line by themselves as a message termi- - nator. - - SendMimeErrors - Send error messages in MIME format. If not set, the DSN (De- - livery Status Notification) SMTP extension is disabled. - - ConnectionCacheTimeout=_t_i_m_e_o_u_t - Set connection cache timeout. - - ConnectionCacheSize=_N - Set connection cache size. - - LogLevel=_n The log level. - - MeToo Send to ``me'' (the sender) also if I am in an alias expan- - sion. - - CheckAliases - Validate the right hand side of aliases during a newalias- - es(1) command. - - OldStyleHeaders - If set, this message may have old style headers. If not set, - this message is guaranteed to have new style headers (i.e., - commas instead of spaces between addresses). If set, an - adaptive algorithm is used that will correctly determine the - header format in most cases. - - QueueDirectory=_q_u_e_u_e_d_i_r - Select the directory in which to queue messages. - - StatusFile=_f_i_l_e - Save statistics in the named file. - - Timeout.queuereturn=_t_i_m_e - Set the timeout on undelivered messages in the queue to the - specified time. After delivery has failed (e.g., because of - a host being down) for this amount of time, failed messages - will be returned to the sender. The default is five days. - - UserDatabaseSpec=_u_s_e_r_d_a_t_a_b_a_s_e - If set, a user database is consulted to get forwarding infor- - mation. You can consider this an adjunct to the aliasing - mechanism, except that the database is intended to be dis- - tributed; aliases are local to a particular host. This may - not be available if your sendmail does not have the USERDB - option compiled in. - - ForkEachJob - Fork each job during queue runs. May be convenient on memo- - ry-poor machines. - - SevenBitInput - Strip incoming messages to seven bits. - - EightBitMode=_m_o_d_e - Set the handling of eight bit input to seven bit destinations - to _m_o_d_e: m (mimefy) will convert to seven-bit MIME format, p - (pass) will pass it as eight bits (but violates protocols), - and s (strict) will bounce the message. - - MinQueueAge=_t_i_m_e_o_u_t - Sets how long a job must ferment in the queue between at- - tempts to send it. - - DefaultCharSet=_c_h_a_r_s_e_t - Sets the default character set used to label 8-bit data that - is not otherwise labelled. - - DialDelay=_s_l_e_e_p_t_i_m_e - If opening a connection fails, sleep for _s_l_e_e_p_t_i_m_e seconds - and try again. Useful on dial-on-demand sites. - - NoRecipientAction=_a_c_t_i_o_n - Set the behaviour when there are no recipient headers (To:, - Cc: or Bcc:) in the message to _a_c_t_i_o_n: none leaves the mes- - sage unchanged, add-to adds a To: header with the envelope - recipients, add-apparently-to adds an Apparently-To: header - with the envelope recipients, add-bcc adds an empty Bcc: - header, and add-to-undisclosed adds a header reading `To: - undisclosed-recipients:;'. - - MaxDaemonChildren=_N - Sets the maximum number of children that an incoming SMTP - daemon will allow to spawn at any time to _N. - - ConnectionRateThrottle=_N - Sets the maximum number of connections per second to the SMTP - port to _N. - - In aliases, the first character of a name may be a vertical bar to cause - interpretation of the rest of the name as a command to pipe the mail to. - It may be necessary to quote the name to keep sseennddmmaaiill from suppressing - the blanks from between arguments. For example, a common alias is: - - msgs: "|/usr/bin/msgs -s" - - Aliases may also have the syntax ``:include:_f_i_l_e_n_a_m_e'' to ask sendmail to - read the named file for a list of recipients. For example, an alias such - as: - - poets: ":include:/usr/local/lib/poets.list" - - would read _/_u_s_r_/_l_o_c_a_l_/_l_i_b_/_p_o_e_t_s_._l_i_s_t for the list of addresses making up - the group. - - SSeennddmmaaiill returns an exit status describing what it did. The codes are - defined in <_s_y_s_e_x_i_t_s_._h>: - EX_OK Successful completion on all addresses. - EX_NOUSER User name not recognized. - EX_UNAVAILABLE Catchall meaning necessary resources were not - available. - EX_SYNTAX Syntax error in address. - EX_SOFTWARE Internal software error, including bad arguments. - EX_OSERR Temporary operating system error, such as ``cannot - fork''. - EX_NOHOST Host name not recognized. - EX_TEMPFAIL Message could not be sent immediately, but was - queued. - - If invoked as nneewwaalliiaasseess, sseennddmmaaiill will rebuild the alias database. If - invoked as mmaaiillqq, sseennddmmaaiill will print the contents of the mail queue. - -FFIILLEESS - Except for the file _/_e_t_c_/_s_e_n_d_m_a_i_l_._c_f itself and the daemon process ID - file, the following pathnames are all specified in _/_e_t_c_/_s_e_n_d_m_a_i_l_._c_f_. - Thus, these values are only approximations. - - /etc/aliases raw data for alias names - /etc/aliases.db data base of alias names - /etc/sendmail.cf configuration file - /etc/sendmail.hf help file - /var/log/sendmail.st collected statistics - /var/spool/mqueue/* temp files - -SSEEEE AALLSSOO - binmail(1), mail(1), rmail(1), syslog(3), aliases(5), mailaddr(7), - rc(8); - - DARPA Internet Request For Comments _R_F_C_8_1_9, _R_F_C_8_2_1, _R_F_C_8_2_2. - - _S_e_n_d_m_a_i_l _- _A_n _I_n_t_e_r_n_e_t_w_o_r_k _M_a_i_l _R_o_u_t_e_r, No. 9, SMM. - - _S_e_n_d_m_a_i_l _I_n_s_t_a_l_l_a_t_i_o_n _a_n_d _O_p_e_r_a_t_i_o_n _G_u_i_d_e, No. 8, SMM. - -HHIISSTTOORRYY - The sseennddmmaaiill command appeared in 4.2BSD. - -4th Berkeley Distribution August 2, 1998 6 diff --git a/src/sendmail.8 b/src/sendmail.8 deleted file mode 100644 index 093b6e6..0000000 --- a/src/sendmail.8 +++ /dev/null @@ -1,580 +0,0 @@ -.\" Copyright (c) 1998 Sendmail, Inc. All rights reserved. -.\" Copyright (c) 1983, 1997 Eric P. Allman. All rights reserved. -.\" Copyright (c) 1988, 1991, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" By using this file, you agree to the terms and conditions set -.\" forth in the LICENSE file which can be found at the top level of -.\" the sendmail distribution. -.\" -.\" -.\" @(#)sendmail.8 8.20 (Berkeley) 8/2/1998 -.\" -.Dd August 2, 1998 -.Dt SENDMAIL 8 -.Os BSD 4 -.Sh NAME -.Nm sendmail -.Nd an electronic mail transport agent -.Sh SYNOPSIS -.Nm sendmail -.Op Ar flags -.Op Ar address ... -.Nm newaliases -.Nm mailq -.Op Fl v -.Sh DESCRIPTION -.Nm Sendmail -sends a message to one or more -.Em recipients , -routing the message over whatever networks -are necessary. -.Nm Sendmail -does internetwork forwarding as necessary -to deliver the message to the correct place. -.Pp -.Nm Sendmail -is not intended as a user interface routine; -other programs provide user-friendly -front ends; -.Nm sendmail -is used only to deliver pre-formatted messages. -.Pp -With no flags, -.Nm sendmail -reads its standard input -up to an end-of-file -or a line consisting only of a single dot -and sends a copy of the message found there -to all of the addresses listed. -It determines the network(s) to use -based on the syntax and contents of the addresses. -.Pp -Local addresses are looked up in a file -and aliased appropriately. -Aliasing can be prevented by preceding the address -with a backslash. -Normally the sender is not included in any alias -expansions, e.g., -if `john' sends to `group', -and `group' includes `john' in the expansion, -then the letter will not be delivered to `john'. -.Ss Parameters -.Bl -tag -width Fl -.It Fl B Ns Ar type -Set the body type to -.Ar type . -Current legal values -.Li 7BIT -or -.Li 8BITMIME . -.It Fl ba -Go into -.Tn ARPANET -mode. -All input lines must end with a CR-LF, -and all messages will be generated with a CR-LF at the end. -Also, -the ``From:'' and ``Sender:'' -fields are examined for the name of the sender. -.It Fl bd -Run as a daemon. This requires Berkeley -.Tn IPC . -.Nm Sendmail -will fork and run in background -listening on socket 25 for incoming -.Tn SMTP -connections. -This is normally run from -.Pa /etc/rc . -.It Fl bD -Same as -.Fl bd -except runs in foreground. -.It Fl bh -Print the persistent host status database. -.It Fl bH -Purge the persistent host status database. -.It Fl bi -Initialize the alias database. -.It Fl bm -Deliver mail in the usual way (default). -.It Fl bp -Print a listing of the queue. -.It Fl bs -Use the -.Tn SMTP -protocol as described in -.Tn RFC821 -on standard input and output. -This flag implies all the operations of the -.Fl ba -flag that are compatible with -.Tn SMTP . -.It Fl bt -Run in address test mode. -This mode reads addresses and shows the steps in parsing; -it is used for debugging configuration tables. -.It Fl bv -Verify names only \- do not try to collect or deliver a message. -Verify mode is normally used for validating -users or mailing lists. -.It Fl C Ns Ar file -Use alternate configuration file. -.Nm Sendmail -refuses to run as root if an alternate configuration file is specified. -.It Fl d Ns Ar X -Set debugging value to -.Ar X . -.ne 1i -.It Fl F Ns Ar fullname -Set the full name of the sender. -.It Fl f Ns Ar name -Sets the name of the ``from'' person -(i.e., the sender of the mail). -.Fl f -can only be used -by ``trusted'' users -(normally -.Em root , -.Em daemon , -and -.Em network ) -or if the person you are trying to become -is the same as the person you are. -.It Fl h Ns Ar N -Set the hop count to -.Ar N . -The hop count is incremented every time the mail is -processed. -When it reaches a limit, -the mail is returned with an error message, -the victim of an aliasing loop. -If not specified, -``Received:'' lines in the message are counted. -.It Fl i -Ignore dots alone on lines by themselves in incoming messages. -This should be set if you are reading data from a file. -.It Fl N Ar dsn -Set delivery status notification conditions to -.Ar dsn, -which can be -.Ql never -for no notifications -or a comma separated list of the values -.Ql failure -to be notified if delivery failed, -.Ql delay -to be notified if delivery is delayed, and -.Ql success -to be notified when the message is successfully delivered. -.It Fl n -Don't do aliasing. -.It Fl O Ar option Ns = Ns Em value -Set option -.Ar option -to the specified -.Em value . -This form uses long names. -See below for more details. -.It Fl o Ns Ar x Em value -Set option -.Ar x -to the specified -.Em value . -This form uses single character names only. -The short names are not described in this manual page; -see the -.%T "Sendmail Installation and Operation Guide" -for details. -.It Fl p Ns Ar protocol -Set the name of the protocol used to receive the message. -This can be a simple protocol name such as ``UUCP'' -or a protocol and hostname, such as ``UUCP:ucbvax''. -.It Fl q Ns Bq Ar time -Processed saved messages in the queue at given intervals. -If -.Ar time -is omitted, -process the queue once. -.Xr Time -is given as a tagged number, -with -.Ql s -being seconds, -.Ql m -being minutes, -.Ql h -being hours, -.Ql d -being days, -and -.Ql w -being weeks. -For example, -.Ql \-q1h30m -or -.Ql \-q90m -would both set the timeout to one hour thirty minutes. -If -.Ar time -is specified, -.Nm sendmail -will run in background. -This option can be used safely with -.Fl bd . -.It Fl qI Ns Ar substr -Limit processed jobs to those containing -.Ar substr -as a substring of the queue id. -.It Fl qR Ns Ar substr -Limit processed jobs to those containing -.Ar substr -as a substring of one of the recipients. -.It Fl qS Ns Ar substr -Limit processed jobs to those containing -.Ar substr -as a substring of the sender. -.It Fl R Ar return -Set the amount of the message to be returned -if the message bounces. -The -.Ar return -parameter can be -.Ql full -to return the entire message or -.Ql hdrs -to return only the headers. -.It Fl r Ns Ar name -An alternate and obsolete form of the -.Fl f -flag. -.It Fl t -Read message for recipients. -To:, Cc:, and Bcc: lines will be scanned for recipient addresses. -The Bcc: line will be deleted before transmission. -.It Fl U -Initial (user) submission. -This should -.Em always -be set when called from a user agent such as -.Nm Mail -or -.Nm exmh -and -.Em never -be set when called by a network delivery agent such as -.Nm rmail . -.It Fl V Ar envid -Set the original envelope id. -This is propagated across SMTP to servers that support DSNs -and is returned in DSN-compliant error messages. -.It Fl v -Go into verbose mode. -Alias expansions will be announced, etc. -.It Fl X Ar logfile -Log all traffic in and out of mailers in the indicated log file. -This should only be used as a last resort -for debugging mailer bugs. -It will log a lot of data very quickly. -.It Fl - -Stop processing command flags and use the rest of the arguments -as addresses. -.El -.Ss Options -There are also a number of processing options that may be set. -Normally these will only be used by a system administrator. -Options may be set either on the command line -using the -.Fl o -flag (for short names), -the -.Fl O -flag (for long names), -or in the configuration file. -This is a partial list limited to those options that are likely to be useful -on the command line -and only shows the long names; -for a complete list (and details), consult the -.%T "Sendmail Installation and Operation Guide" . -The options are: -.Bl -tag -width Fl -.It Li AliasFile= Ns Ar file -Use alternate alias file. -.It Li HoldExpensive -On mailers that are considered ``expensive'' to connect to, -don't initiate immediate connection. -This requires queueing. -.It Li CheckpointInterval= Ns Ar N -Checkpoint the queue file after every -.Ar N -successful deliveries (default 10). -This avoids excessive duplicate deliveries -when sending to long mailing lists -interrupted by system crashes. -.ne 1i -.It Li DeliveryMode= Ns Ar x -Set the delivery mode to -.Ar x . -Delivery modes are -.Ql i -for interactive (synchronous) delivery, -.Ql b -for background (asynchronous) delivery, -.Ql q -for queue only \- i.e., -actual delivery is done the next time the queue is run, and -.Ql d -for deferred \- the same as -.Ql q -except that database lookups (notably DNS and NIS lookups) are avoided. -.It Li ErrorMode= Ns Ar x -Set error processing to mode -.Ar x . -Valid modes are -.Ql m -to mail back the error message, -.Ql w -to ``write'' back the error message -(or mail it back if the sender is not logged in), -.Ql p -to print the errors on the terminal -(default), -.Ql q -to throw away error messages -(only exit status is returned), -and -.Ql e -to do special processing for the BerkNet. -If the text of the message is not mailed back -by -modes -.Ql m -or -.Ql w -and if the sender is local to this machine, -a copy of the message is appended to the file -.Pa dead.letter -in the sender's home directory. -.It Li SaveFromLine -Save -.Tn UNIX Ns \-style -From lines at the front of messages. -.It Li MaxHopCount= Ar N -The maximum number of times a message is allowed to ``hop'' -before we decide it is in a loop. -.It Li IgnoreDots -Do not take dots on a line by themselves -as a message terminator. -.It Li SendMimeErrors -Send error messages in MIME format. -If not set, the DSN (Delivery Status Notification) SMTP extension -is disabled. -.It Li ConnectionCacheTimeout= Ns Ar timeout -Set connection cache timeout. -.It Li ConnectionCacheSize= Ns Ar N -Set connection cache size. -.It Li LogLevel= Ns Ar n -The log level. -.It Li MeToo -Send to ``me'' (the sender) also if I am in an alias expansion. -.It Li CheckAliases -Validate the right hand side of aliases during a -.Xr newaliases 1 -command. -.It Li OldStyleHeaders -If set, this message may have -old style headers. -If not set, -this message is guaranteed to have new style headers -(i.e., commas instead of spaces between addresses). -If set, an adaptive algorithm is used that will correctly -determine the header format in most cases. -.It Li QueueDirectory= Ns Ar queuedir -Select the directory in which to queue messages. -.It Li StatusFile= Ns Ar file -Save statistics in the named file. -.It Li Timeout.queuereturn= Ns Ar time -Set the timeout on undelivered messages in the queue to the specified time. -After delivery has failed -(e.g., because of a host being down) -for this amount of time, -failed messages will be returned to the sender. -The default is five days. -.It Li UserDatabaseSpec= Ns Ar userdatabase -If set, a user database is consulted to get forwarding information. -You can consider this an adjunct to the aliasing mechanism, -except that the database is intended to be distributed; -aliases are local to a particular host. -This may not be available if your sendmail does not have the -.Dv USERDB -option compiled in. -.It Li ForkEachJob -Fork each job during queue runs. -May be convenient on memory-poor machines. -.It Li SevenBitInput -Strip incoming messages to seven bits. -.It Li EightBitMode= Ns Ar mode -Set the handling of eight bit input to seven bit destinations to -.Ar mode : -.Li m -(mimefy) will convert to seven-bit MIME format, -.Li p -(pass) will pass it as eight bits (but violates protocols), -and -.Li s -(strict) will bounce the message. -.It Li MinQueueAge= Ns Ar timeout -Sets how long a job must ferment in the queue between attempts to send it. -.It Li DefaultCharSet= Ns Ar charset -Sets the default character set used to label 8-bit data -that is not otherwise labelled. -.It Li DialDelay= Ns Ar sleeptime -If opening a connection fails, -sleep for -.Ar sleeptime -seconds and try again. -Useful on dial-on-demand sites. -.It Li NoRecipientAction= Ns Ar action -Set the behaviour when there are no recipient headers (To:, Cc: or Bcc:) -in the message to -.Ar action : -.Li none -leaves the message unchanged, -.Li add-to -adds a To: header with the envelope recipients, -.Li add-apparently-to -adds an Apparently-To: header with the envelope recipients, -.Li add-bcc -adds an empty Bcc: header, and -.Li add-to-undisclosed -adds a header reading -.Ql "To: undisclosed-recipients:;" . -.It Li MaxDaemonChildren= Ns Ar N -Sets the maximum number of children that an incoming SMTP daemon -will allow to spawn at any time to -.Ar N . -.It Li ConnectionRateThrottle= Ns Ar N -Sets the maximum number of connections per second to the SMTP port to -.Ar N . -.El -.Pp -In aliases, -the first character of a name may be -a vertical bar to cause interpretation of -the rest of the name as a command -to pipe the mail to. -It may be necessary to quote the name -to keep -.Nm sendmail -from suppressing the blanks from between arguments. -For example, a common alias is: -.Pp -.Bd -literal -offset indent -compact -msgs: "|/usr/bin/msgs -s" -.Ed -.Pp -Aliases may also have the syntax -.Dq :include: Ns Ar filename -to ask -.Xr sendmail -to read the named file for a list of recipients. -For example, an alias such as: -.Pp -.Bd -literal -offset indent -compact -poets: ":include:/usr/local/lib/poets.list" -.Ed -.Pp -would read -.Pa /usr/local/lib/poets.list -for the list of addresses making up the group. -.Pp -.Nm Sendmail -returns an exit status -describing what it did. -The codes are defined in -.Aq Pa sysexits.h : -.Bl -tag -width EX_UNAVAILABLE -compact -offset indent -.It Dv EX_OK -Successful completion on all addresses. -.It Dv EX_NOUSER -User name not recognized. -.It Dv EX_UNAVAILABLE -Catchall meaning necessary resources -were not available. -.It Dv EX_SYNTAX -Syntax error in address. -.It Dv EX_SOFTWARE -Internal software error, -including bad arguments. -.It Dv EX_OSERR -Temporary operating system error, -such as -.Dq cannot fork . -.It Dv EX_NOHOST -Host name not recognized. -.It Dv EX_TEMPFAIL -Message could not be sent immediately, -but was queued. -.El -.Pp -If invoked as -.Nm newaliases , -.Nm sendmail -will rebuild the alias database. -If invoked as -.Nm mailq , -.Nm sendmail -will print the contents of the mail queue. -.Sh FILES -Except for the file -.Pa /etc/sendmail.cf -itself and the daemon process ID file, -the following pathnames are all specified in -.Pa /etc/sendmail.cf. -Thus, -these values are only approximations. -.Pp -.Bl -tag -width /usr/lib/sendmail.fc -compact -.It Pa /etc/aliases -raw data for alias names -.It Pa /etc/aliases.db -data base of alias names -.It Pa /etc/sendmail.cf -configuration file -.It Pa /etc/sendmail.hf -help file -.It Pa /var/log/sendmail.st -collected statistics -.It Pa /var/spool/mqueue/* -temp files -.El -.Sh SEE ALSO -.Xr binmail 1 , -.Xr mail 1 , -.Xr rmail 1 , -.Xr syslog 3 , -.Xr aliases 5 , -.Xr mailaddr 7 , -.Xr rc 8 ; -.Pp -DARPA -Internet Request For Comments -.%T RFC819 , -.%T RFC821 , -.%T RFC822 . -.Rs -.%T "Sendmail \- An Internetwork Mail Router" -.%V SMM -.%N \&No. 9 -.Re -.Rs -.%T "Sendmail Installation and Operation Guide" -.%V SMM -.%N \&No. 8 -.Re -.Sh HISTORY -The -.Nm -command appeared in -.Bx 4.2 . diff --git a/src/sendmail.h b/src/sendmail.h deleted file mode 100644 index ff2697e..0000000 --- a/src/sendmail.h +++ /dev/null @@ -1,1514 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - * - * @(#)sendmail.h 8.295 (Berkeley) 1/26/1999 - */ - -/* -** SENDMAIL.H -- Global definitions for sendmail. -*/ - -# ifdef _DEFINE -# define EXTERN -# ifndef lint -static char SmailSccsId[] = "@(#)sendmail.h 8.295 1/26/1999"; -# endif -# else /* _DEFINE */ -# define EXTERN extern -# endif /* _DEFINE */ - -# include <unistd.h> -# include <stddef.h> -# include <stdlib.h> -# include <stdio.h> -# include <ctype.h> -# include <setjmp.h> -# include <string.h> -# include <time.h> -# include <errno.h> -# ifdef EX_OK -# undef EX_OK /* for SVr4.2 SMP */ -# endif -# include <sysexits.h> - -# include "conf.h" -# include "useful.h" - -# ifdef LOG -# include <syslog.h> -# endif /* LOG */ - -# if NETINET || NETUNIX || NETISO || NETNS || NETX25 -# include <sys/socket.h> -# endif -# if NETUNIX -# include <sys/un.h> -# endif -# if NETINET -# include <netinet/in.h> -# endif -# if NETISO -# include <netiso/iso.h> -# endif -# if NETNS -# include <netns/ns.h> -# endif -# if NETX25 -# include <netccitt/x25.h> -# endif - -#if NAMED_BIND -# include <arpa/nameser.h> -# ifdef NOERROR -# undef NOERROR /* avoid <sys/streams.h> conflict */ -# endif -#endif - -#ifdef HESIOD -# include <hesiod.h> -# if !defined(HES_ER_OK) || defined(HESIOD_INTERFACES) -# define HESIOD_INIT /* support for the new interface */ -EXTERN void *HesiodContext; -# endif -#endif - -/* -** Following are "sort of" configuration constants, but they should -** be pretty solid on most architectures today. They have to be -** defined after <arpa/nameser.h> because some versions of that -** file also define them. In all cases, we can't use sizeof because -** some systems (e.g., Crays) always treat everything as being at -** least 64 bits. -*/ - -#ifndef INADDRSZ -# define INADDRSZ 4 /* size of an IPv4 address in bytes */ -#endif -#ifndef INT16SZ -# define INT16SZ 2 /* size of a 16 bit integer in bytes */ -#endif -#ifndef INT32SZ -# define INT32SZ 4 /* size of a 32 bit integer in bytes */ -#endif - - - -/* forward references for prototypes */ -typedef struct envelope ENVELOPE; -typedef struct mailer MAILER; - - -/* -** Data structure for bit maps. -** -** Each bit in this map can be referenced by an ascii character. -** This is 256 possible bits, or 32 8-bit bytes. -*/ - -#define BITMAPBYTES 32 /* number of bytes in a bit map */ -#define BYTEBITS 8 /* number of bits in a byte */ - -/* internal macros */ -#define _BITWORD(bit) ((bit) / (BYTEBITS * sizeof (int))) -#define _BITBIT(bit) (1 << ((bit) % (BYTEBITS * sizeof (int)))) - -typedef int BITMAP[BITMAPBYTES / sizeof (int)]; - -/* test bit number N */ -#define bitnset(bit, map) ((map)[_BITWORD(bit)] & _BITBIT(bit)) - -/* set bit number N */ -#define setbitn(bit, map) (map)[_BITWORD(bit)] |= _BITBIT(bit) - -/* clear bit number N */ -#define clrbitn(bit, map) (map)[_BITWORD(bit)] &= ~_BITBIT(bit) - -/* clear an entire bit map */ -#define clrbitmap(map) bzero((char *) map, BITMAPBYTES) - - -/* -** Utility macros -*/ - -/* return number of bytes left in a buffer */ -#define SPACELEFT(buf, ptr) (sizeof buf - ((ptr) - buf)) -/* -** Address structure. -** Addresses are stored internally in this structure. -*/ - -struct address -{ - char *q_paddr; /* the printname for the address */ - char *q_user; /* user name */ - char *q_ruser; /* real user name, or NULL if q_user */ - char *q_host; /* host name */ - struct mailer *q_mailer; /* mailer to use */ - u_long q_flags; /* status flags, see below */ - uid_t q_uid; /* user-id of receiver (if known) */ - gid_t q_gid; /* group-id of receiver (if known) */ - char *q_home; /* home dir (local mailer only) */ - char *q_fullname; /* full name if known */ - struct address *q_next; /* chain */ - struct address *q_alias; /* address this results from */ - char *q_owner; /* owner of q_alias */ - struct address *q_tchain; /* temporary use chain */ - char *q_orcpt; /* ORCPT parameter from RCPT TO: line */ - char *q_status; /* status code for DSNs */ - char *q_rstatus; /* remote status message for DSNs */ - time_t q_statdate; /* date of status messages */ - char *q_statmta; /* MTA generating q_rstatus */ - short q_specificity; /* how "specific" this address is */ -}; - -typedef struct address ADDRESS; - -# define QDONTSEND 0x00000001 /* don't send to this address */ -# define QBADADDR 0x00000002 /* this address is verified bad */ -# define QGOODUID 0x00000004 /* the q_uid q_gid fields are good */ -# define QPRIMARY 0x00000008 /* set from RCPT or argv */ -# define QQUEUEUP 0x00000010 /* queue for later transmission */ -# define QSENT 0x00000020 /* has been successfully delivered */ -# define QNOTREMOTE 0x00000040 /* address not for remote forwarding */ -# define QSELFREF 0x00000080 /* this address references itself */ -# define QVERIFIED 0x00000100 /* verified, but not expanded */ -# define QBOGUSSHELL 0x00000400 /* user has no valid shell listed */ -# define QUNSAFEADDR 0x00000800 /* address aquired via unsafe path */ -# define QPINGONSUCCESS 0x00001000 /* give return on successful delivery */ -# define QPINGONFAILURE 0x00002000 /* give return on failure */ -# define QPINGONDELAY 0x00004000 /* give return on message delay */ -# define QHASNOTIFY 0x00008000 /* propogate notify parameter */ -# define QRELAYED 0x00010000 /* DSN: relayed to non-DSN aware sys */ -# define QEXPANDED 0x00020000 /* DSN: undergone list expansion */ -# define QDELIVERED 0x00040000 /* DSN: successful final delivery */ -# define QDELAYED 0x00080000 /* DSN: message delayed */ -# define QTHISPASS 0x40000000 /* temp: address set this pass */ -# define QRCPTOK 0x80000000 /* recipient() processed address */ - -# define Q_PINGFLAGS (QPINGONSUCCESS|QPINGONFAILURE|QPINGONDELAY) - -# define NULLADDR ((ADDRESS *) NULL) - -/* functions */ -extern ADDRESS *parseaddr __P((char *, ADDRESS *, int, int, char **, ENVELOPE *)); -extern ADDRESS *buildaddr __P((char **, ADDRESS *, int, ENVELOPE *)); -extern ADDRESS *recipient __P((ADDRESS *, ADDRESS **, int, ENVELOPE *)); -extern char **prescan __P((char *, int, char[], int, char **, u_char *)); -extern int rewrite __P((char **, int, int, ENVELOPE *)); -extern char *remotename __P((char *, MAILER *, int, int *, ENVELOPE *)); -extern ADDRESS *getctladdr __P((ADDRESS *)); -extern bool sameaddr __P((ADDRESS *, ADDRESS *)); -extern bool emptyaddr __P((ADDRESS *)); -extern void printaddr __P((ADDRESS *, bool)); -extern void cataddr __P((char **, char **, char *, int, int)); -extern int sendtolist __P((char *, ADDRESS *, ADDRESS **, int, ENVELOPE *)); -/* -** Mailer definition structure. -** Every mailer known to the system is declared in this -** structure. It defines the pathname of the mailer, some -** flags associated with it, and the argument vector to -** pass to it. The flags are defined in conf.c -** -** The argument vector is expanded before actual use. All -** words except the first are passed through the macro -** processor. -*/ - -struct mailer -{ - char *m_name; /* symbolic name of this mailer */ - char *m_mailer; /* pathname of the mailer to use */ - char *m_mtatype; /* type of this MTA */ - char *m_addrtype; /* type for addresses */ - char *m_diagtype; /* type for diagnostics */ - BITMAP m_flags; /* status flags, see below */ - short m_mno; /* mailer number internally */ - short m_nice; /* niceness to run at (mostly for prog) */ - char **m_argv; /* template argument vector */ - short m_sh_rwset; /* rewrite set: sender header addresses */ - short m_se_rwset; /* rewrite set: sender envelope addresses */ - short m_rh_rwset; /* rewrite set: recipient header addresses */ - short m_re_rwset; /* rewrite set: recipient envelope addresses */ - char *m_eol; /* end of line string */ - long m_maxsize; /* size limit on message to this mailer */ - int m_linelimit; /* max # characters per line */ - char *m_execdir; /* directory to chdir to before execv */ - uid_t m_uid; /* UID to run as */ - gid_t m_gid; /* GID to run as */ - char *m_defcharset; /* default character set */ -}; - -/* bits for m_flags */ -# define M_ESMTP 'a' /* run Extended SMTP protocol */ -# define M_ALIASABLE 'A' /* user can be LHS of an alias */ -# define M_BLANKEND 'b' /* ensure blank line at end of message */ -# define M_NOCOMMENT 'c' /* don't include comment part of address */ -# define M_CANONICAL 'C' /* make addresses canonical "u@dom" */ -# define M_NOBRACKET 'd' /* never angle bracket envelope route-addrs */ - /* 'D' CF: include Date: */ -# define M_EXPENSIVE 'e' /* it costs to use this mailer.... */ -# define M_ESCFROM 'E' /* escape From lines to >From */ -# define M_FOPT 'f' /* mailer takes picky -f flag */ - /* 'F' CF: include From: or Resent-From: */ -# define M_NO_NULL_FROM 'g' /* sender of errors should be $g */ -# define M_HST_UPPER 'h' /* preserve host case distinction */ -# define M_PREHEAD 'H' /* MAIL11V3: preview headers */ -# define M_UDBENVELOPE 'i' /* do udbsender rewriting on envelope */ -# define M_INTERNAL 'I' /* SMTP to another sendmail site */ -# define M_UDBRECIPIENT 'j' /* do udbsender rewriting on recipient lines */ -# define M_NOLOOPCHECK 'k' /* don't check for loops in HELO command */ -# define M_CHUNKING 'K' /* CHUNKING: reserved for future use */ -# define M_LOCALMAILER 'l' /* delivery is to this host */ -# define M_LIMITS 'L' /* must enforce SMTP line limits */ -# define M_MUSER 'm' /* can handle multiple users at once */ - /* 'M' CF: include Message-Id: */ -# define M_NHDR 'n' /* don't insert From line */ -# define M_MANYSTATUS 'N' /* MAIL11V3: DATA returns multi-status */ -# define M_RUNASRCPT 'o' /* always run mailer as recipient */ -# define M_FROMPATH 'p' /* use reverse-path in MAIL FROM: */ - /* 'P' CF: include Return-Path: */ -# define M_VRFY250 'q' /* VRFY command returns 250 instead of 252 */ -# define M_ROPT 'r' /* mailer takes picky -r flag */ -# define M_SECURE_PORT 'R' /* try to send on a reserved TCP port */ -# define M_STRIPQ 's' /* strip quote chars from user/host */ -# define M_SPECIFIC_UID 'S' /* run as specific uid/gid */ -# define M_USR_UPPER 'u' /* preserve user case distinction */ -# define M_UGLYUUCP 'U' /* this wants an ugly UUCP from line */ -# define M_CONTENT_LEN 'v' /* add Content-Length: header (SVr4) */ - /* 'V' UIUC: !-relativize all addresses */ -# define M_HASPWENT 'w' /* check for /etc/passwd entry */ - /* 'x' CF: include Full-Name: */ -# define M_XDOT 'X' /* use hidden-dot algorithm */ -# define M_LMTP 'z' /* run Local Mail Transport Protocol */ -# define M_NOMX '0' /* turn off MX lookups */ -# define M_NONULLS '1' /* don't send null bytes */ -# define M_EBCDIC '3' /* extend Q-P encoding for EBCDIC */ -# define M_TRYRULESET5 '5' /* use ruleset 5 after local aliasing */ -# define M_7BITHDRS '6' /* strip headers to 7 bits even in 8 bit path */ -# define M_7BITS '7' /* use 7-bit path */ -# define M_8BITS '8' /* force "just send 8" behaviour */ -# define M_MAKE8BIT '9' /* convert 7 -> 8 bit if appropriate */ -# define M_CHECKINCLUDE ':' /* check for :include: files */ -# define M_CHECKPROG '|' /* check for |program addresses */ -# define M_CHECKFILE '/' /* check for /file addresses */ -# define M_CHECKUDB '@' /* user can be user database key */ -# define M_CHECKHDIR '~' /* SGI: check for valid home directory */ - -EXTERN MAILER *Mailer[MAXMAILERS+1]; - -EXTERN MAILER *LocalMailer; /* ptr to local mailer */ -EXTERN MAILER *ProgMailer; /* ptr to program mailer */ -EXTERN MAILER *FileMailer; /* ptr to *file* mailer */ -EXTERN MAILER *InclMailer; /* ptr to *include* mailer */ -/* -** Information about currently open connections to mailers, or to -** hosts that we have looked up recently. -*/ - -# define MCI struct mailer_con_info - -MCI -{ - short mci_flags; /* flag bits, see below */ - short mci_errno; /* error number on last connection */ - short mci_herrno; /* h_errno from last DNS lookup */ - short mci_exitstat; /* exit status from last connection */ - short mci_state; /* SMTP state */ - off_t mci_contentlen; /* body length for Content-Length: */ - long mci_maxsize; /* max size this server will accept */ - FILE *mci_in; /* input side of connection */ - FILE *mci_out; /* output side of connection */ - pid_t mci_pid; /* process id of subordinate proc */ - char *mci_phase; /* SMTP phase string */ - struct mailer *mci_mailer; /* ptr to the mailer for this conn */ - char *mci_host; /* host name */ - char *mci_status; /* DSN status to be copied to addrs */ - char *mci_rstatus; /* SMTP status to be copied to addrs */ - time_t mci_lastuse; /* last usage time */ - FILE *mci_statfile; /* long term status file */ -}; - - -/* flag bits */ -#define MCIF_VALID 0x0001 /* this entry is valid */ -#define MCIF_TEMP 0x0002 /* don't cache this connection */ -#define MCIF_CACHED 0x0004 /* currently in open cache */ -#define MCIF_ESMTP 0x0008 /* this host speaks ESMTP */ -#define MCIF_EXPN 0x0010 /* EXPN command supported */ -#define MCIF_SIZE 0x0020 /* SIZE option supported */ -#define MCIF_8BITMIME 0x0040 /* BODY=8BITMIME supported */ -#define MCIF_7BIT 0x0080 /* strip this message to 7 bits */ -#define MCIF_MULTSTAT 0x0100 /* MAIL11V3: handles MULT status */ -#define MCIF_INHEADER 0x0200 /* currently outputing header */ -#define MCIF_CVT8TO7 0x0400 /* convert from 8 to 7 bits */ -#define MCIF_DSN 0x0800 /* DSN extension supported */ -#define MCIF_8BITOK 0x1000 /* OK to send 8 bit characters */ -#define MCIF_CVT7TO8 0x2000 /* convert from 7 to 8 bits */ -#define MCIF_INMIME 0x4000 /* currently reading MIME header */ - -/* states */ -#define MCIS_CLOSED 0 /* no traffic on this connection */ -#define MCIS_OPENING 1 /* sending initial protocol */ -#define MCIS_OPEN 2 /* open, initial protocol sent */ -#define MCIS_ACTIVE 3 /* message being sent */ -#define MCIS_QUITING 4 /* running quit protocol */ -#define MCIS_SSD 5 /* service shutting down */ -#define MCIS_ERROR 6 /* I/O error on connection */ - -/* functions */ -extern MCI *mci_get __P((char *, MAILER *)); -extern void mci_cache __P((MCI *)); -extern void mci_flush __P((bool, MCI *)); -extern void mci_dump __P((MCI *, bool)); -extern void mci_dump_all __P((bool)); -extern MCI **mci_scan __P((MCI *)); -extern int mci_traverse_persistent __P((int (*)(), char *)); -extern int mci_print_persistent __P((char *, char *)); -extern int mci_purge_persistent __P((char *, char *)); -extern int mci_lock_host __P((MCI *)); -extern void mci_unlock_host __P((MCI *)); -extern int mci_lock_host_statfile __P((MCI *)); -extern void mci_store_persistent __P((MCI *)); -extern int mci_read_persistent __P((FILE *, MCI *)); -/* -** Header structure. -** This structure is used internally to store header items. -*/ - -struct header -{ - char *h_field; /* the name of the field */ - char *h_value; /* the value of that field */ - struct header *h_link; /* the next header */ - u_short h_flags; /* status bits, see below */ - BITMAP h_mflags; /* m_flags bits needed */ -}; - -typedef struct header HDR; - -/* -** Header information structure. -** Defined in conf.c, this struct declares the header fields -** that have some magic meaning. -*/ - -struct hdrinfo -{ - char *hi_field; /* the name of the field */ - u_short hi_flags; /* status bits, see below */ - char *hi_ruleset; /* validity check ruleset */ -}; - -extern struct hdrinfo HdrInfo[]; - -/* bits for h_flags and hi_flags */ -# define H_EOH 0x0001 /* this field terminates header */ -# define H_RCPT 0x0002 /* contains recipient addresses */ -# define H_DEFAULT 0x0004 /* if another value is found, drop this */ -# define H_RESENT 0x0008 /* this address is a "Resent-..." address */ -# define H_CHECK 0x0010 /* check h_mflags against m_flags */ -# define H_ACHECK 0x0020 /* ditto, but always (not just default) */ -# define H_FORCE 0x0040 /* force this field, even if default */ -# define H_TRACE 0x0080 /* this field contains trace information */ -# define H_FROM 0x0100 /* this is a from-type field */ -# define H_VALID 0x0200 /* this field has a validated value */ -# define H_RECEIPTTO 0x0400 /* this field has return receipt info */ -# define H_ERRORSTO 0x0800 /* this field has error address info */ -# define H_CTE 0x1000 /* this field is a content-transfer-encoding */ -# define H_CTYPE 0x2000 /* this is a content-type field */ -# define H_BCC 0x4000 /* Bcc: header: strip value or delete */ -# define H_ENCODABLE 0x8000 /* field can be RFC 1522 encoded */ - -/* functions */ -extern void addheader __P((char *, char *, HDR **)); -extern char *hvalue __P((char *, HDR *)); -extern void commaize __P((HDR *, char *, bool, MCI *, ENVELOPE *)); -extern void put_vanilla_header __P((HDR *, char *, MCI *)); -extern void eatheader __P((ENVELOPE *, bool)); -extern int chompheader __P((char *, bool, HDR **, ENVELOPE *)); -/* -** Envelope structure. -** This structure defines the message itself. There is usually -** only one of these -- for the message that we originally read -** and which is our primary interest -- but other envelopes can -** be generated during processing. For example, error messages -** will have their own envelope. -*/ - -struct envelope -{ - HDR *e_header; /* head of header list */ - long e_msgpriority; /* adjusted priority of this message */ - time_t e_ctime; /* time message appeared in the queue */ - char *e_to; /* the target person */ - ADDRESS e_from; /* the person it is from */ - char *e_sender; /* e_from.q_paddr w comments stripped */ - char **e_fromdomain; /* the domain part of the sender */ - ADDRESS *e_sendqueue; /* list of message recipients */ - ADDRESS *e_errorqueue; /* the queue for error responses */ - long e_msgsize; /* size of the message in bytes */ - long e_flags; /* flags, see below */ - int e_nrcpts; /* number of recipients */ - short e_class; /* msg class (priority, junk, etc.) */ - short e_hopcount; /* number of times processed */ - short e_nsent; /* number of sends since checkpoint */ - short e_sendmode; /* message send mode */ - short e_errormode; /* error return mode */ - short e_timeoutclass; /* message timeout class */ - void (*e_puthdr)__P((MCI *, HDR *, ENVELOPE *, int)); - /* function to put header of message */ - void (*e_putbody)__P((MCI *, ENVELOPE *, char *)); - /* function to put body of message */ - struct envelope *e_parent; /* the message this one encloses */ - struct envelope *e_sibling; /* the next envelope of interest */ - char *e_bodytype; /* type of message body */ - FILE *e_dfp; /* temporary file */ - char *e_id; /* code for this entry in queue */ - FILE *e_xfp; /* transcript file */ - FILE *e_lockfp; /* the lock file for this message */ - char *e_message; /* error message */ - char *e_statmsg; /* stat msg (changes per delivery) */ - char *e_msgboundary; /* MIME-style message part boundary */ - char *e_origrcpt; /* original recipient (one only) */ - char *e_envid; /* envelope id from MAIL FROM: line */ - char *e_status; /* DSN status for this message */ - time_t e_dtime; /* time of last delivery attempt */ - int e_ntries; /* number of delivery attempts */ - dev_t e_dfdev; /* df file's device, for crash recov */ - ino_t e_dfino; /* df file's ino, for crash recovery */ - char *e_macro[256]; /* macro definitions */ -}; - -/* values for e_flags */ -#define EF_OLDSTYLE 0x0000001 /* use spaces (not commas) in hdrs */ -#define EF_INQUEUE 0x0000002 /* this message is fully queued */ -#define EF_NO_BODY_RETN 0x0000004 /* omit message body on error */ -#define EF_CLRQUEUE 0x0000008 /* disk copy is no longer needed */ -#define EF_SENDRECEIPT 0x0000010 /* send a return receipt */ -#define EF_FATALERRS 0x0000020 /* fatal errors occured */ -#define EF_DELETE_BCC 0x0000040 /* delete Bcc: headers entirely */ -#define EF_RESPONSE 0x0000080 /* this is an error or return receipt */ -#define EF_RESENT 0x0000100 /* this message is being forwarded */ -#define EF_VRFYONLY 0x0000200 /* verify only (don't expand aliases) */ -#define EF_WARNING 0x0000400 /* warning message has been sent */ -#define EF_QUEUERUN 0x0000800 /* this envelope is from queue */ -#define EF_GLOBALERRS 0x0001000 /* treat errors as global */ -#define EF_PM_NOTIFY 0x0002000 /* send return mail to postmaster */ -#define EF_METOO 0x0004000 /* send to me too */ -#define EF_LOGSENDER 0x0008000 /* need to log the sender */ -#define EF_NORECEIPT 0x0010000 /* suppress all return-receipts */ -#define EF_HAS8BIT 0x0020000 /* at least one 8-bit char in body */ -#define EF_NL_NOT_EOL 0x0040000 /* don't accept raw NL as EOLine */ -#define EF_CRLF_NOT_EOL 0x0080000 /* don't accept CR-LF as EOLine */ -#define EF_RET_PARAM 0x0100000 /* RCPT command had RET argument */ -#define EF_HAS_DF 0x0200000 /* set when df file is instantiated */ -#define EF_IS_MIME 0x0400000 /* really is a MIME message */ -#define EF_DONT_MIME 0x0800000 /* never MIME this message */ -#define EF_DISCARD 0x1000000 /* discard the message */ - -EXTERN ENVELOPE *CurEnv; /* envelope currently being processed */ - -/* functions */ -extern ENVELOPE *newenvelope __P((ENVELOPE *, ENVELOPE *)); -extern void dropenvelope __P((ENVELOPE *, bool)); -extern void clearenvelope __P((ENVELOPE *, bool)); - -extern void putheader __P((MCI *, HDR *, ENVELOPE *, int)); -extern void putbody __P((MCI *, ENVELOPE *, char *)); -/* -** Message priority classes. -** -** The message class is read directly from the Priority: header -** field in the message. -** -** CurEnv->e_msgpriority is the number of bytes in the message plus -** the creation time (so that jobs ``tend'' to be ordered correctly), -** adjusted by the message class, the number of recipients, and the -** amount of time the message has been sitting around. This number -** is used to order the queue. Higher values mean LOWER priority. -** -** Each priority class point is worth WkClassFact priority points; -** each recipient is worth WkRecipFact priority points. Each time -** we reprocess a message the priority is adjusted by WkTimeFact. -** WkTimeFact should normally decrease the priority so that jobs -** that have historically failed will be run later; thanks go to -** Jay Lepreau at Utah for pointing out the error in my thinking. -** -** The "class" is this number, unadjusted by the age or size of -** this message. Classes with negative representations will have -** error messages thrown away if they are not local. -*/ - -struct priority -{ - char *pri_name; /* external name of priority */ - int pri_val; /* internal value for same */ -}; - -EXTERN struct priority Priorities[MAXPRIORITIES]; -EXTERN int NumPriorities; /* pointer into Priorities */ -/* -** Rewrite rules. -*/ - -struct rewrite -{ - char **r_lhs; /* pattern match */ - char **r_rhs; /* substitution value */ - struct rewrite *r_next;/* next in chain */ -}; - -EXTERN struct rewrite *RewriteRules[MAXRWSETS]; - -/* -** Special characters in rewriting rules. -** These are used internally only. -** The COND* rules are actually used in macros rather than in -** rewriting rules, but are given here because they -** cannot conflict. -*/ - -/* left hand side items */ -# define MATCHZANY ((u_char)0220) /* match zero or more tokens */ -# define MATCHANY ((u_char)0221) /* match one or more tokens */ -# define MATCHONE ((u_char)0222) /* match exactly one token */ -# define MATCHCLASS ((u_char)0223) /* match one token in a class */ -# define MATCHNCLASS ((u_char)0224) /* match anything not in class */ -# define MATCHREPL ((u_char)0225) /* replacement on RHS for above */ - -/* right hand side items */ -# define CANONNET ((u_char)0226) /* canonical net, next token */ -# define CANONHOST ((u_char)0227) /* canonical host, next token */ -# define CANONUSER ((u_char)0230) /* canonical user, next N tokens */ -# define CALLSUBR ((u_char)0231) /* call another rewriting set */ - -/* conditionals in macros */ -# define CONDIF ((u_char)0232) /* conditional if-then */ -# define CONDELSE ((u_char)0233) /* conditional else */ -# define CONDFI ((u_char)0234) /* conditional fi */ - -/* bracket characters for host name lookup */ -# define HOSTBEGIN ((u_char)0235) /* hostname lookup begin */ -# define HOSTEND ((u_char)0236) /* hostname lookup end */ - -/* bracket characters for generalized lookup */ -# define LOOKUPBEGIN ((u_char)0205) /* generalized lookup begin */ -# define LOOKUPEND ((u_char)0206) /* generalized lookup end */ - -/* macro substitution character */ -# define MACROEXPAND ((u_char)0201) /* macro expansion */ -# define MACRODEXPAND ((u_char)0202) /* deferred macro expansion */ - -/* to make the code clearer */ -# define MATCHZERO CANONHOST - -/* external <==> internal mapping table */ -struct metamac -{ - char metaname; /* external code (after $) */ - u_char metaval; /* internal code (as above) */ -}; - -/* values for macros with external names only */ -# define MID_OPMODE 0202 /* operation mode */ - -/* functions */ -extern void expand __P((char *, char *, size_t, ENVELOPE *)); -extern void define __P((int, char *, ENVELOPE *)); -extern char *macvalue __P((int, ENVELOPE *)); -extern char *macname __P((int)); -extern int macid __P((char *, char **)); -/* -** Name canonification short circuit. -** -** If the name server for a host is down, the process of trying to -** canonify the name can hang. This is similar to (but alas, not -** identical to) looking up the name for delivery. This stab type -** caches the result of the name server lookup so we don't hang -** multiple times. -*/ - -#define NAMECANON struct _namecanon - -NAMECANON -{ - short nc_errno; /* cached errno */ - short nc_herrno; /* cached h_errno */ - short nc_stat; /* cached exit status code */ - short nc_flags; /* flag bits */ - char *nc_cname; /* the canonical name */ -}; - -/* values for nc_flags */ -#define NCF_VALID 0x0001 /* entry valid */ -/* -** Mapping functions -** -** These allow arbitrary mappings in the config file. The idea -** (albeit not the implementation) comes from IDA sendmail. -*/ - -# define MAPCLASS struct _mapclass -# define MAP struct _map -# define MAXMAPACTIONS 3 /* size of map_actions array */ - - -/* -** An actual map. -*/ - -MAP -{ - MAPCLASS *map_class; /* the class of this map */ - char *map_mname; /* name of this map */ - long map_mflags; /* flags, see below */ - char *map_file; /* the (nominal) filename */ - ARBPTR_T map_db1; /* the open database ptr */ - ARBPTR_T map_db2; /* an "extra" database pointer */ - char *map_keycolnm; /* key column name */ - char *map_valcolnm; /* value column name */ - u_char map_keycolno; /* key column number */ - u_char map_valcolno; /* value column number */ - char map_coldelim; /* column delimiter */ - char *map_app; /* to append to successful matches */ - char *map_tapp; /* to append to "tempfail" matches */ - char *map_domain; /* the (nominal) NIS domain */ - char *map_rebuild; /* program to run to do auto-rebuild */ - time_t map_mtime; /* last database modification time */ - pid_t map_pid; /* PID of process which opened map */ - int map_lockfd; /* auxiliary lock file descriptor */ - short map_specificity; /* specificity of aliases */ - MAP *map_stack[MAXMAPSTACK]; /* list for stacked maps */ - short map_return[MAXMAPACTIONS]; /* return bitmaps for stacked maps */ -}; - -/* bit values for map_mflags */ -# define MF_VALID 0x00000001 /* this entry is valid */ -# define MF_INCLNULL 0x00000002 /* include null byte in key */ -# define MF_OPTIONAL 0x00000004 /* don't complain if map not found */ -# define MF_NOFOLDCASE 0x00000008 /* don't fold case in keys */ -# define MF_MATCHONLY 0x00000010 /* don't use the map value */ -# define MF_OPEN 0x00000020 /* this entry is open */ -# define MF_WRITABLE 0x00000040 /* open for writing */ -# define MF_ALIAS 0x00000080 /* this is an alias file */ -# define MF_TRY0NULL 0x00000100 /* try with no null byte */ -# define MF_TRY1NULL 0x00000200 /* try with the null byte */ -# define MF_LOCKED 0x00000400 /* this map is currently locked */ -# define MF_ALIASWAIT 0x00000800 /* alias map in aliaswait state */ -# define MF_IMPL_HASH 0x00001000 /* implicit: underlying hash database */ -# define MF_IMPL_NDBM 0x00002000 /* implicit: underlying NDBM database */ -# define MF_UNSAFEDB 0x00004000 /* this map is world writable */ -# define MF_APPEND 0x00008000 /* append new entry on rebuiled */ -# define MF_KEEPQUOTES 0x00010000 /* don't dequote key before lookup */ -# define MF_NODEFER 0x00020000 /* don't defer if map lookup fails */ -# define MF_REGEX_NOT 0x00040000 /* regular expression negation */ - -/* indices for map_actions */ -# define MA_NOTFOUND 0 /* member map returned "not found" */ -# define MA_UNAVAIL 1 /* member map is not available */ -# define MA_TRYAGAIN 2 /* member map returns temp failure */ - -/* -** The class of a map -- essentially the functions to call -*/ - -MAPCLASS -{ - char *map_cname; /* name of this map class */ - char *map_ext; /* extension for database file */ - short map_cflags; /* flag bits, see below */ - bool (*map_parse)__P((MAP *, char *)); - /* argument parsing function */ - char *(*map_lookup)__P((MAP *, char *, char **, int *)); - /* lookup function */ - void (*map_store)__P((MAP *, char *, char *)); - /* store function */ - bool (*map_open)__P((MAP *, int)); - /* open function */ - void (*map_close)__P((MAP *)); - /* close function */ -}; - -/* bit values for map_cflags */ -#define MCF_ALIASOK 0x0001 /* can be used for aliases */ -#define MCF_ALIASONLY 0x0002 /* usable only for aliases */ -#define MCF_REBUILDABLE 0x0004 /* can rebuild alias files */ -#define MCF_OPTFILE 0x0008 /* file name is optional */ - -/* functions */ -extern char *map_rewrite __P((MAP *, const char *, size_t, char **)); -extern MAP *makemapentry __P((char *)); -extern void initmaps __P((bool, ENVELOPE *)); -/* -** Symbol table definitions -*/ - -struct symtab -{ - char *s_name; /* name to be entered */ - short s_type; /* general type (see below) */ - short s_len; /* length of this entry */ - struct symtab *s_next; /* pointer to next in chain */ - union - { - BITMAP sv_class; /* bit-map of word classes */ - ADDRESS *sv_addr; /* pointer to address header */ - MAILER *sv_mailer; /* pointer to mailer */ - char *sv_alias; /* alias */ - MAPCLASS sv_mapclass; /* mapping function class */ - MAP sv_map; /* mapping function */ - char *sv_hostsig; /* host signature */ - MCI sv_mci; /* mailer connection info */ - NAMECANON sv_namecanon; /* canonical name cache */ - int sv_macro; /* macro name => id mapping */ - int sv_ruleset; /* ruleset index */ - struct hdrinfo sv_header; /* header metainfo */ - char *sv_service[MAXMAPSTACK]; /* service switch */ - } s_value; -}; - -typedef struct symtab STAB; - -/* symbol types */ -# define ST_UNDEF 0 /* undefined type */ -# define ST_CLASS 1 /* class map */ -# define ST_ADDRESS 2 /* an address in parsed format */ -# define ST_MAILER 3 /* a mailer header */ -# define ST_ALIAS 4 /* an alias */ -# define ST_MAPCLASS 5 /* mapping function class */ -# define ST_MAP 6 /* mapping function */ -# define ST_HOSTSIG 7 /* host signature */ -# define ST_NAMECANON 8 /* cached canonical name */ -# define ST_MACRO 9 /* macro name to id mapping */ -# define ST_RULESET 10 /* ruleset index */ -# define ST_SERVICE 11 /* service switch entry */ -# define ST_HEADER 12 /* special header flags */ -# define ST_MCI 16 /* mailer connection info (offset) */ - -# define s_class s_value.sv_class -# define s_address s_value.sv_addr -# define s_mailer s_value.sv_mailer -# define s_alias s_value.sv_alias -# define s_mci s_value.sv_mci -# define s_mapclass s_value.sv_mapclass -# define s_hostsig s_value.sv_hostsig -# define s_map s_value.sv_map -# define s_namecanon s_value.sv_namecanon -# define s_macro s_value.sv_macro -# define s_ruleset s_value.sv_ruleset -# define s_service s_value.sv_service -# define s_header s_value.sv_header - -extern STAB *stab __P((char *, int, int)); -extern void stabapply __P((void (*)(STAB *, int), int)); - -/* opcodes to stab */ -# define ST_FIND 0 /* find entry */ -# define ST_ENTER 1 /* enter if not there */ -/* -** STRUCT EVENT -- event queue. -** -** Maintained in sorted order. -** -** We store the pid of the process that set this event to insure -** that when we fork we will not take events intended for the parent. -*/ - -struct event -{ - time_t ev_time; /* time of the function call */ - void (*ev_func)__P((int)); - /* function to call */ - int ev_arg; /* argument to ev_func */ - int ev_pid; /* pid that set this event */ - struct event *ev_link; /* link to next item */ -}; - -typedef struct event EVENT; - -EXTERN EVENT *EventQueue; /* head of event queue */ - -/* functions */ -extern EVENT *setevent __P((time_t, void(*)(), int)); -extern void clrevent __P((EVENT *)); -/* -** Operation, send, error, and MIME modes -** -** The operation mode describes the basic operation of sendmail. -** This can be set from the command line, and is "send mail" by -** default. -** -** The send mode tells how to send mail. It can be set in the -** configuration file. It's setting determines how quickly the -** mail will be delivered versus the load on your system. If the -** -v (verbose) flag is given, it will be forced to SM_DELIVER -** mode. -** -** The error mode tells how to return errors. -*/ - -EXTERN char OpMode; /* operation mode, see below */ - -#define MD_DELIVER 'm' /* be a mail sender */ -#define MD_SMTP 's' /* run SMTP on standard input */ -#define MD_ARPAFTP 'a' /* obsolete ARPANET mode (Grey Book) */ -#define MD_DAEMON 'd' /* run as a daemon */ -#define MD_FGDAEMON 'D' /* run daemon in foreground */ -#define MD_VERIFY 'v' /* verify: don't collect or deliver */ -#define MD_TEST 't' /* test mode: resolve addrs only */ -#define MD_INITALIAS 'i' /* initialize alias database */ -#define MD_PRINT 'p' /* print the queue */ -#define MD_FREEZE 'z' /* freeze the configuration file */ -#define MD_HOSTSTAT 'h' /* print persistent host stat info */ -#define MD_PURGESTAT 'H' /* purge persistent host stat info */ - -/* values for e_sendmode -- send modes */ -#define SM_DELIVER 'i' /* interactive delivery */ -#define SM_FORK 'b' /* deliver in background */ -#define SM_QUEUE 'q' /* queue, don't deliver */ -#define SM_DEFER 'd' /* defer map lookups as well as queue */ -#define SM_VERIFY 'v' /* verify only (used internally) */ - -/* used only as a parameter to sendall */ -#define SM_DEFAULT '\0' /* unspecified, use SendMode */ - - -/* values for e_errormode -- error handling modes */ -#define EM_PRINT 'p' /* print errors */ -#define EM_MAIL 'm' /* mail back errors */ -#define EM_WRITE 'w' /* write back errors */ -#define EM_BERKNET 'e' /* special berknet processing */ -#define EM_QUIET 'q' /* don't print messages (stat only) */ - - -/* MIME processing mode */ -EXTERN int MimeMode; - -/* bit values for MimeMode */ -#define MM_CVTMIME 0x0001 /* convert 8 to 7 bit MIME */ -#define MM_PASS8BIT 0x0002 /* just send 8 bit data blind */ -#define MM_MIME8BIT 0x0004 /* convert 8-bit data to MIME */ - -/* queue sorting order algorithm */ -EXTERN int QueueSortOrder; - -#define QS_BYPRIORITY 0 /* sort by message priority */ -#define QS_BYHOST 1 /* sort by first host name */ -#define QS_BYTIME 2 /* sort by submission time */ - - -/* how to handle messages without any recipient addresses */ -EXTERN int NoRecipientAction; - -#define NRA_NO_ACTION 0 /* just leave it as is */ -#define NRA_ADD_TO 1 /* add To: header */ -#define NRA_ADD_APPARENTLY_TO 2 /* add Apparently-To: header */ -#define NRA_ADD_BCC 3 /* add empty Bcc: header */ -#define NRA_ADD_TO_UNDISCLOSED 4 /* add To: undisclosed:; header */ - - -/* flags to putxline */ -#define PXLF_NOTHINGSPECIAL 0 /* no special mapping */ -#define PXLF_MAPFROM 0x0001 /* map From_ to >From_ */ -#define PXLF_STRIP8BIT 0x0002 /* strip 8th bit */ -#define PXLF_HEADER 0x0004 /* map newlines in headers */ -/* -** Additional definitions -*/ - - -/* -** Privacy flags -** These are bit values for the PrivacyFlags word. -*/ - -#define PRIV_PUBLIC 0 /* what have I got to hide? */ -#define PRIV_NEEDMAILHELO 0x0001 /* insist on HELO for MAIL, at least */ -#define PRIV_NEEDEXPNHELO 0x0002 /* insist on HELO for EXPN */ -#define PRIV_NEEDVRFYHELO 0x0004 /* insist on HELO for VRFY */ -#define PRIV_NOEXPN 0x0008 /* disallow EXPN command entirely */ -#define PRIV_NOVRFY 0x0010 /* disallow VRFY command entirely */ -#define PRIV_AUTHWARNINGS 0x0020 /* flag possible authorization probs */ -#define PRIV_NORECEIPTS 0x0040 /* disallow return receipts */ -#define PRIV_NOETRN 0x0080 /* disallow ETRN command entirely */ -#define PRIV_NOVERB 0x0100 /* disallow VERB command entirely */ -#define PRIV_RESTRICTMAILQ 0x1000 /* restrict mailq command */ -#define PRIV_RESTRICTQRUN 0x2000 /* restrict queue run */ -#define PRIV_GOAWAY 0x0fff /* don't give no info, anyway, anyhow */ - -/* struct defining such things */ -struct prival -{ - char *pv_name; /* name of privacy flag */ - int pv_flag; /* numeric level */ -}; - - -/* -** Flags passed to remotename, parseaddr, allocaddr, and buildaddr. -*/ - -#define RF_SENDERADDR 0x001 /* this is a sender address */ -#define RF_HEADERADDR 0x002 /* this is a header address */ -#define RF_CANONICAL 0x004 /* strip comment information */ -#define RF_ADDDOMAIN 0x008 /* OK to do domain extension */ -#define RF_COPYPARSE 0x010 /* copy parsed user & host */ -#define RF_COPYPADDR 0x020 /* copy print address */ -#define RF_COPYALL (RF_COPYPARSE|RF_COPYPADDR) -#define RF_COPYNONE 0 - - -/* -** Flags passed to safefile/safedirpath. -*/ - -#define SFF_ANYFILE 0 /* no special restrictions */ -#define SFF_MUSTOWN 0x0001 /* user must own this file */ -#define SFF_NOSLINK 0x0002 /* file cannot be a symbolic link */ -#define SFF_ROOTOK 0x0004 /* ok for root to own this file */ -#define SFF_RUNASREALUID 0x0008 /* if no ctladdr, run as real uid */ -#define SFF_NOPATHCHECK 0x0010 /* don't bother checking dir path */ -#define SFF_SETUIDOK 0x0020 /* setuid files are ok */ -#define SFF_CREAT 0x0040 /* ok to create file if necessary */ -#define SFF_REGONLY 0x0080 /* regular files only */ -#define SFF_SAFEDIRPATH 0x0100 /* no writable directories allowed */ -#define SFF_NOHLINK 0x0200 /* file cannot have hard links */ -#define SFF_NOWLINK 0x0400 /* links only in non-writable dirs */ -#define SFF_NOGWFILES 0x0800 /* disallow world writable files */ -#define SFF_NOWWFILES 0x1000 /* disallow group writable files */ - -/* flags that are actually specific to safeopen/safefopen/dfopen */ -#define SFF_OPENASROOT 0x2000 /* open as root instead of real user */ -#define SFF_NOLOCK 0x4000 /* don't lock the file */ - -/* pseudo-flags */ -#define SFF_NOLINK (SFF_NOHLINK|SFF_NOSLINK) - -/* functions */ -extern int safefile __P((char *, UID_T, GID_T, char *, int, int, struct stat *)); -extern int safedirpath __P((char *, UID_T, GID_T, char *, int)); -extern int safeopen __P((char *, int, int, int)); -extern FILE *safefopen __P((char *, int, int, int)); -extern int dfopen __P((char *, int, int, int)); -extern bool filechanged __P((char *, int, struct stat *)); - - -/* -** Flags passed to mime8to7. -*/ - -#define M87F_OUTER 0 /* outer context */ -#define M87F_NO8BIT 0x0001 /* can't have 8-bit in this section */ -#define M87F_DIGEST 0x0002 /* processing multipart/digest */ -#define M87F_NO8TO7 0x0004 /* don't do 8->7 bit conversions */ - - -/* -** Flags passed to returntosender. -*/ - -#define RTSF_NO_BODY 0 /* send headers only */ -#define RTSF_SEND_BODY 0x0001 /* include body of message in return */ -#define RTSF_PM_BOUNCE 0x0002 /* this is a postmaster bounce */ - - -/* -** Regular UNIX sockaddrs are too small to handle ISO addresses, so -** we are forced to declare a supertype here. -*/ - -# if NETINET || NETUNIX || NETISO || NETNS || NETX25 -union bigsockaddr -{ - struct sockaddr sa; /* general version */ -#if NETUNIX - struct sockaddr_un sunix; /* UNIX family */ -#endif -#if NETINET - struct sockaddr_in sin; /* INET family */ -#endif -#if NETISO - struct sockaddr_iso siso; /* ISO family */ -#endif -#if NETNS - struct sockaddr_ns sns; /* XNS family */ -#endif -#if NETX25 - struct sockaddr_x25 sx25; /* X.25 family */ -#endif -}; - -#define SOCKADDR union bigsockaddr - -EXTERN SOCKADDR RealHostAddr; /* address of host we are talking to */ - -extern char *hostnamebyanyaddr __P((SOCKADDR *)); -extern char *anynet_ntoa __P((SOCKADDR *)); -# if DAEMON -extern char *validate_connection __P((SOCKADDR *, char *, ENVELOPE *)); -# endif - -#endif - - -/* -** Vendor codes -** -** Vendors can customize sendmail to add special behaviour, -** generally for back compatibility. Ideally, this should -** be set up in the .cf file using the "V" command. However, -** it's quite reasonable for some vendors to want the default -** be their old version; this can be set using -** -DVENDOR_DEFAULT=VENDOR_xxx -** in the Makefile. -** -** Vendors should apply to sendmail@CS.Berkeley.EDU for -** unique vendor codes. -*/ - -#define VENDOR_BERKELEY 1 /* Berkeley-native configuration file */ -#define VENDOR_SUN 2 /* Sun-native configuration file */ -#define VENDOR_HP 3 /* Hewlett-Packard specific config syntax */ -#define VENDOR_IBM 4 /* IBM specific config syntax */ -#define VENDOR_SENDMAIL 5 /* Sendmail, Inc. specific config syntax */ - -EXTERN int VendorCode; /* vendor-specific operation enhancements */ - -/* prototypes for vendor-specific hook routines */ -extern void vendor_set_uid __P((UID_T)); -extern void vendor_daemon_setup __P((ENVELOPE *)); - -/* -** DontBlameSendmail options -** -** Hopefully nobody uses these. -*/ -#define DBS_SAFE 0 -#define DBS_ASSUMESAFECHOWN 0x00000001 -#define DBS_GROUPWRITABLEDIRPATHSAFE 0x00000002 -#define DBS_GROUPWRITABLEFORWARDFILESAFE 0x00000004 -#define DBS_GROUPWRITABLEINCLUDEFILESAFE 0x00000008 -#define DBS_GROUPWRITABLEALIASFILE 0x00000010 -#define DBS_WORLDWRITABLEALIASFILE 0x00000020 -#define DBS_FORWARDFILEINUNSAFEDIRPATH 0x00000040 -#define DBS_MAPINUNSAFEDIRPATH 0x00000080 -#define DBS_LINKEDALIASFILEINWRITABLEDIR 0x00000100 -#define DBS_LINKEDCLASSFILEINWRITABLEDIR 0x00000200 -#define DBS_LINKEDFORWARDFILEINWRITABLEDIR 0x00000400 -#define DBS_LINKEDINCLUDEFILEINWRITABLEDIR 0x00000800 -#define DBS_LINKEDMAPINWRITABLEDIR 0x00001000 -#define DBS_LINKEDSERVICESWITCHFILEINWRITABLEDIR 0x00002000 -#define DBS_FILEDELIVERYTOHARDLINK 0x00004000 -#define DBS_FILEDELIVERYTOSYMLINK 0x00008000 -#define DBS_WRITEMAPTOHARDLINK 0x00010000 -#define DBS_WRITEMAPTOSYMLINK 0x00020000 -#define DBS_WRITESTATSTOHARDLINK 0x00040000 -#define DBS_WRITESTATSTOSYMLINK 0x00080000 -#define DBS_FORWARDFILEINGROUPWRITABLEDIRPATH 0x00100000 -#define DBS_INCLUDEFILEINGROUPWRITABLEDIRPATH 0x00200000 -#define DBS_CLASSFILEINUNSAFEDIRPATH 0x00400000 -#define DBS_ERRORHEADERINUNSAFEDIRPATH 0x00800000 -#define DBS_HELPFILEINUNSAFEDIRPATH 0x01000000 -#define DBS_FORWARDFILEINUNSAFEDIRPATHSAFE 0x02000000 -#define DBS_INCLUDEFILEINUNSAFEDIRPATHSAFE 0x04000000 -#define DBS_RUNPROGRAMINUNSAFEDIRPATH 0x08000000 -#define DBS_RUNWRITABLEPROGRAM 0x10000000 -#define DBS_INCLUDEFILEINUNSAFEDIRPATH 0x20000000 - -/* struct defining such things */ -struct dbsval -{ - char *dbs_name; /* name of DontBlameSendmail flag */ - long dbs_flag; /* numeric level */ -}; - -EXTERN long DontBlameSendmail; /* DontBlameSendmail option bits */ - -/* -** Terminal escape codes. -** -** To make debugging output clearer. -*/ - -struct termescape -{ - char *te_rv_on; /* turn reverse-video on */ - char *te_rv_off; /* turn reverse-video off */ -}; - -EXTERN struct termescape TermEscape; - - -/* -** Error return from inet_addr(3), in case not defined in /usr/include. -*/ - -#ifndef INADDR_NONE -# define INADDR_NONE 0xffffffff -#endif -/* -** Global variables. -*/ - -EXTERN bool FromFlag; /* if set, "From" person is explicit */ -EXTERN bool MeToo; /* send to the sender also */ -EXTERN bool IgnrDot; /* don't let dot end messages */ -EXTERN bool SaveFrom; /* save leading "From" lines */ -EXTERN bool GrabTo; /* if set, get recipients from msg */ -EXTERN bool SuprErrs; /* set if we are suppressing errors */ -EXTERN bool HoldErrs; /* only output errors to transcript */ -EXTERN bool NoConnect; /* don't connect to non-local mailers */ -EXTERN bool SuperSafe; /* be extra careful, even if expensive */ -EXTERN bool ForkQueueRuns; /* fork for each job when running the queue */ -EXTERN bool AutoRebuild; /* auto-rebuild the alias database as needed */ -EXTERN bool CheckAliases; /* parse addresses during newaliases */ -EXTERN bool NoAlias; /* suppress aliasing */ -EXTERN bool UseNameServer; /* using DNS -- interpret h_errno & MX RRs */ -EXTERN bool UseHesiod; /* using Hesiod -- interpret Hesiod errors */ -EXTERN bool SevenBitInput; /* force 7-bit data on input */ -EXTERN bool HasEightBits; /* has at least one eight bit input byte */ -EXTERN bool ConfigFileRead; /* configuration file has been read */ -EXTERN time_t SafeAlias; /* interval to wait until @:@ in alias file */ -EXTERN FILE *InChannel; /* input connection */ -EXTERN FILE *OutChannel; /* output connection */ -EXTERN char *RealUserName; /* real user name of caller */ -EXTERN uid_t RealUid; /* real uid of caller */ -EXTERN gid_t RealGid; /* real gid of caller */ -EXTERN uid_t DefUid; /* default uid to run as */ -EXTERN gid_t DefGid; /* default gid to run as */ -EXTERN char *DefUser; /* default user to run as (from DefUid) */ -EXTERN uid_t TrustedUid; /* uid of trusted user for files and startup */ -EXTERN MODE_T OldUmask; /* umask when sendmail starts up */ -EXTERN int Verbose; /* set if blow-by-blow desired */ -EXTERN int Errors; /* set if errors (local to single pass) */ -EXTERN int ExitStat; /* exit status code */ -EXTERN int LineNumber; /* line number in current input */ -EXTERN int LogLevel; /* level of logging to perform */ -EXTERN int FileMode; /* mode on files */ -EXTERN int QueueLA; /* load average starting forced queueing */ -EXTERN int RefuseLA; /* load average refusing connections are */ -EXTERN int CurrentLA; /* current load average */ -EXTERN long QueueFactor; /* slope of queue function */ -EXTERN time_t QueueIntvl; /* intervals between running the queue */ -EXTERN char *HelpFile; /* location of SMTP help file */ -EXTERN char *ErrMsgFile; /* file to prepend to all error messages */ -EXTERN char *StatFile; /* location of statistics summary */ -EXTERN char *QueueDir; /* location of queue directory */ -EXTERN char *FileName; /* name to print on error messages */ -EXTERN char *SmtpPhase; /* current phase in SMTP processing */ -EXTERN char *MyHostName; /* name of this host for SMTP messages */ -EXTERN char *RealHostName; /* name of host we are talking to */ -EXTERN char *CurHostName; /* current host we are dealing with */ -EXTERN jmp_buf TopFrame; /* branch-to-top-of-loop-on-error frame */ -EXTERN bool QuickAbort; /* .... but only if we want a quick abort */ -EXTERN bool OnlyOneError; /* .... or only want to give one SMTP reply */ -EXTERN bool LogUsrErrs; /* syslog user errors (e.g., SMTP RCPT cmd) */ -EXTERN bool SendMIMEErrors; /* send error messages in MIME format */ -EXTERN bool MatchGecos; /* look for user names in gecos field */ -EXTERN bool UseErrorsTo; /* use Errors-To: header (back compat) */ -EXTERN bool TryNullMXList; /* if we are the best MX, try host directly */ -EXTERN bool InChild; /* true if running in an SMTP subprocess */ -EXTERN bool DisConnected; /* running with OutChannel redirected to xf */ -EXTERN bool ColonOkInAddr; /* single colon legal in address */ -EXTERN bool HasWildcardMX; /* don't use MX records when canonifying */ -EXTERN char SpaceSub; /* substitution for <lwsp> */ -EXTERN int PrivacyFlags; /* privacy flags */ -EXTERN char *ConfFile; /* location of configuration file [conf.c] */ -EXTERN char *PidFile; /* location of proc id file [conf.c] */ -EXTERN char *ControlSocketName; /* control socket filename [control.c] */ -extern ADDRESS NullAddress; /* a null (template) address [main.c] */ -EXTERN long WkClassFact; /* multiplier for message class -> priority */ -EXTERN long WkRecipFact; /* multiplier for # of recipients -> priority */ -EXTERN long WkTimeFact; /* priority offset each time this job is run */ -EXTERN char *UdbSpec; /* user database source spec */ -EXTERN int MaxHopCount; /* max # of hops until bounce */ -EXTERN int ConfigLevel; /* config file level */ -EXTERN char *TimeZoneSpec; /* override time zone specification */ -EXTERN char *ForwardPath; /* path to search for .forward files */ -EXTERN long MinBlocksFree; /* min # of blocks free on queue fs */ -EXTERN char *FallBackMX; /* fall back MX host */ -EXTERN long MaxMessageSize; /* advertised max size we will accept */ -EXTERN time_t MinQueueAge; /* min delivery interval */ -EXTERN time_t DialDelay; /* delay between dial-on-demand tries */ -EXTERN char *SafeFileEnv; /* chroot location for file delivery */ -EXTERN char *HostsFile; /* path to /etc/hosts file */ -EXTERN char *HostStatDir; /* location of host status information */ -EXTERN int MaxQueueRun; /* maximum number of jobs in one queue run */ -EXTERN int MaxChildren; /* maximum number of daemonic children */ -EXTERN int CurChildren; /* current number of daemonic children */ -EXTERN char *SmtpGreeting; /* SMTP greeting message (old $e macro) */ -EXTERN char *UnixFromLine; /* UNIX From_ line (old $l macro) */ -EXTERN char *OperatorChars; /* operators (old $o macro) */ -EXTERN bool DontInitGroups; /* avoid initgroups() because of NIS cost */ -EXTERN int DefaultNotify; /* default DSN notification flags */ -EXTERN bool AllowBogusHELO; /* allow syntax errors on HELO command */ -EXTERN bool UserSubmission; /* initial (user) mail submission */ -EXTERN char *RunAsUserName; /* user to become for bulk of run */ -EXTERN uid_t RunAsUid; /* UID to become for bulk of run */ -EXTERN gid_t RunAsGid; /* GID to become for bulk of run */ -EXTERN int MaxRcptPerMsg; /* max recipients per SMTP message */ -EXTERN bool DoQueueRun; /* non-interrupt time queue run needed */ -EXTERN u_long ConnectOnlyTo; /* override connection address (for testing) */ -EXTERN int MaxHeadersLength; /* max length of headers */ -#if _FFR_DSN_RRT_OPTION -EXTERN bool RrtImpliesDsn; /* turn Return-Receipt-To: into DSN */ -#endif -EXTERN char *DeadLetterDrop; /* path to dead letter office */ -EXTERN bool DontProbeInterfaces; /* don't probe interfaces for names */ -EXTERN bool ChownAlwaysSafe; /* treat chown(2) as safe */ -EXTERN bool IgnoreHostStatus; /* ignore long term host status files */ -EXTERN bool SingleThreadDelivery; /* single thread hosts on delivery */ -EXTERN bool SingleLineFromHeader; /* force From: header to be one line */ -EXTERN bool DontLockReadFiles; /* don't read lock support files */ -EXTERN int ConnRateThrottle; /* throttle for SMTP connection rate */ -EXTERN int MaxAliasRecursion; /* maximum depth of alias recursion */ -EXTERN int MaxMacroRecursion; /* maximum depth of macro recursion */ -EXTERN int MaxRuleRecursion; /* maximum depth of ruleset recursion */ -EXTERN char *MustQuoteChars; /* quote these characters in phrases */ -EXTERN char *ServiceSwitchFile; /* backup service switch */ -EXTERN char *DefaultCharSet; /* default character set for MIME */ -EXTERN char *PostMasterCopy; /* address to get errs cc's */ -EXTERN int CheckpointInterval; /* queue file checkpoint interval */ -EXTERN bool DontPruneRoutes; /* don't prune source routes */ -EXTERN bool DontExpandCnames; /* do not $[...$] expand CNAMEs */ -EXTERN int MaxMciCache; /* maximum entries in MCI cache */ -EXTERN time_t ServiceCacheTime; /* time service switch was cached */ -EXTERN time_t ServiceCacheMaxAge; /* refresh interval for cache */ -EXTERN time_t MciCacheTimeout; /* maximum idle time on connections */ -EXTERN time_t MciInfoTimeout; /* how long 'til we retry down hosts */ -EXTERN FILE *TrafficLogFile; /* file in which to log all traffic */ -EXTERN char *DoubleBounceAddr; /* where to send double bounces */ -EXTERN char **ExternalEnviron; /* input environment */ -EXTERN char *UserEnviron[MAXUSERENVIRON + 1]; - /* saved user environment */ -EXTERN int MaxMimeHeaderLength; /* maximum MIME header length */ -EXTERN int MaxMimeFieldLength; /* maximum MIME field length */ - -extern int errno; - -/* -** Queue Run Limitations -*/ -struct queue_char -{ - char *queue_match; /* string to match */ - struct queue_char *queue_next; -}; - -typedef struct queue_char QUEUE_CHAR; - -EXTERN QUEUE_CHAR *QueueLimitRecipient; /* limit queue runs to this recipient */ -EXTERN QUEUE_CHAR *QueueLimitSender; /* limit queue runs to this sender */ -EXTERN QUEUE_CHAR *QueueLimitId; /* limit queue runs to this id */ - -/* -** Timeouts -** -** Indicated values are the MINIMUM per RFC 1123 section 5.3.2. -*/ - -EXTERN struct -{ - /* RFC 1123-specified timeouts [minimum value] */ - time_t to_initial; /* initial greeting timeout [5m] */ - time_t to_mail; /* MAIL command [5m] */ - time_t to_rcpt; /* RCPT command [5m] */ - time_t to_datainit; /* DATA initiation [2m] */ - time_t to_datablock; /* DATA block [3m] */ - time_t to_datafinal; /* DATA completion [10m] */ - time_t to_nextcommand; /* next command [5m] */ - /* following timeouts are not mentioned in RFC 1123 */ - time_t to_iconnect; /* initial connection timeout (first try) */ - time_t to_connect; /* initial connection timeout (later tries) */ - time_t to_rset; /* RSET command */ - time_t to_helo; /* HELO command */ - time_t to_quit; /* QUIT command */ - time_t to_miscshort; /* misc short commands (NOOP, VERB, etc) */ - time_t to_ident; /* IDENT protocol requests */ - time_t to_fileopen; /* opening :include: and .forward files */ - /* following are per message */ - time_t to_q_return[MAXTOCLASS]; /* queue return timeouts */ - time_t to_q_warning[MAXTOCLASS]; /* queue warning timeouts */ -} TimeOuts; - -/* timeout classes for return and warning timeouts */ -# define TOC_NORMAL 0 /* normal delivery */ -# define TOC_URGENT 1 /* urgent delivery */ -# define TOC_NONURGENT 2 /* non-urgent delivery */ - - -/* -** Trace information -*/ - -/* trace vector and macros for debugging flags */ -EXTERN u_char tTdvect[100]; -# define tTd(flag, level) (tTdvect[flag] >= level) -# define tTdlevel(flag) (tTdvect[flag]) -/* -** Miscellaneous information. -*/ - - -/* -** The "no queue id" queue id for sm_syslog -*/ - -#define NOQID "*~*" - - -/* -** Some in-line functions -*/ - -/* set exit status */ -#define setstat(s) { \ - if (ExitStat == EX_OK || ExitStat == EX_TEMPFAIL) \ - ExitStat = s; \ - } - -/* make a copy of a string */ -#define newstr(s) strcpy(xalloc(strlen(s) + 1), s) - -#define STRUCTCOPY(s, d) d = s - - - -/* -** Declarations of useful functions -*/ - -extern char *xalloc __P((int)); -extern char *sfgets __P((char *, int, FILE *, time_t, char *)); -extern char *queuename __P((ENVELOPE *, int)); -extern time_t curtime __P((void)); -extern bool transienterror __P((int)); -extern char *fgetfolded __P((char *, int, FILE *)); -extern char *username __P((void)); -extern char *pintvl __P((time_t, bool)); -extern bool shouldqueue __P((long, time_t)); -extern bool lockfile __P((int, char *, char *, int)); -extern char *hostsignature __P((MAILER *, char *, ENVELOPE *)); -extern void openxscript __P((ENVELOPE *)); -extern void closexscript __P((ENVELOPE *)); -extern char *shortenstring __P((const char *, int)); -extern bool usershellok __P((char *, char *)); -extern char *defcharset __P((ENVELOPE *)); -extern bool wordinclass __P((char *, int)); -extern char *denlstring __P((char *, bool, bool)); -extern void makelower __P((char *)); -extern bool rebuildaliases __P((MAP *, bool)); -extern void readaliases __P((MAP *, FILE *, bool, bool)); -extern void finis __P((bool, volatile int)); -extern void setsender __P((char *, ENVELOPE *, char **, int, bool)); -extern void xputs __P((const char *)); -extern void logsender __P((ENVELOPE *, char *)); -extern void smtprset __P((MAILER *, MCI *, ENVELOPE *)); -extern void smtpquit __P((MAILER *, MCI *, ENVELOPE *)); -extern void setuserenv __P((const char *, const char *)); -extern char *getextenv __P((const char *)); -extern void disconnect __P((int, ENVELOPE *)); -extern void putxline __P((char *, size_t, MCI *, int)); -extern void dumpfd __P((int, bool, bool)); -extern void makemailer __P((char *)); -extern void putfromline __P((MCI *, ENVELOPE *)); -extern void setoption __P((int, char *, bool, bool, ENVELOPE *)); -extern void setclass __P((int, char *)); -extern void inittimeouts __P((char *)); -extern void logdelivery __P((MAILER *, MCI *, const char *, ADDRESS *, time_t, ENVELOPE *)); -extern void giveresponse __P((int, MAILER *, MCI *, ADDRESS *, time_t, ENVELOPE *)); -extern void buildfname __P((char *, char *, char *, int)); -extern void mci_setstat __P((MCI *, int, char *, char *)); -extern char *smtptodsn __P((int)); -extern int rscheck __P((char *, char *, char *, ENVELOPE *e)); -extern void mime7to8 __P((MCI *, HDR *, ENVELOPE *)); -extern int mime8to7 __P((MCI *, HDR *, ENVELOPE *, char **, int)); -extern void xfclose __P((FILE *, char *, char *)); -extern int switch_map_find __P((char *, char *[], short [])); -extern void shorten_hostname __P((char [])); -extern int waitfor __P((pid_t)); -extern void proc_list_add __P((pid_t, char *)); -extern void proc_list_set __P((pid_t, char *)); -extern void proc_list_drop __P((pid_t)); -extern void proc_list_clear __P((void)); -extern void proc_list_display __P((FILE *)); -extern void proc_list_probe __P((void)); -extern void buffer_errors __P((void)); -extern void flush_errors __P((bool)); -extern void putline __P((char *, MCI *)); -extern bool xtextok __P((char *)); -extern char *xtextify __P((char *, char *)); -extern char *xuntextify __P((char *)); -extern void cleanstrcpy __P((char *, char *, int)); -extern int getmxrr __P((char *, char **, bool, int *)); -extern int strtorwset __P((char *, char **, int)); -extern void printav __P((char **)); -extern void printopenfds __P((bool)); -extern int endmailer __P((MCI *, ENVELOPE *, char **)); -extern void fixcrlf __P((char *, bool)); -extern int dofork __P((void)); -extern void initsys __P((ENVELOPE *)); -extern void collect __P((FILE *, bool, HDR **, ENVELOPE *)); -extern void stripquotes __P((char *)); -extern int include __P((char *, bool, ADDRESS *, ADDRESS **, int, ENVELOPE *)); -extern void unlockqueue __P((ENVELOPE *)); -extern void xunlink __P((char *)); -extern bool runqueue __P((bool, bool)); -extern int getla __P((void)); -extern void sendall __P((ENVELOPE *, int)); -extern void queueup __P((ENVELOPE *, bool)); -extern void checkfds __P((char *)); -extern int returntosender __P((char *, ADDRESS *, int, ENVELOPE *)); -extern void markstats __P((ENVELOPE *, ADDRESS *, bool)); -extern void poststats __P((char *)); -extern char *arpadate __P((char *)); -extern int mailfile __P((char *volatile, MAILER *volatile, ADDRESS *, volatile int, ENVELOPE *)); -extern void loseqfile __P((ENVELOPE *, char *)); -extern int prog_open __P((char **, int *, ENVELOPE *)); -extern bool getcanonname __P((char *, int, bool)); -extern bool path_is_dir __P((char *, bool)); -extern pid_t dowork __P((char *, bool, bool, ENVELOPE *)); -extern int drop_privileges __P((bool)); -extern void fill_fd __P((int, char *)); -extern void closecontrolsocket __P((bool)); -extern void clrcontrol __P((void)); - -extern const char *errstring __P((int)); -extern sigfunc_t setsignal __P((int, sigfunc_t)); -extern int blocksignal __P((int)); -extern int releasesignal __P((int)); -extern struct hostent *sm_gethostbyname __P((char *)); -extern struct hostent *sm_gethostbyaddr __P((char *, int, int)); -extern struct passwd *sm_getpwnam __P((char *)); -extern struct passwd *sm_getpwuid __P((UID_T)); -extern struct passwd *finduser __P((char *, bool *)); - -#ifdef XDEBUG -extern void checkfdopen __P((int, char *)); -extern void checkfd012 __P((char *)); -#endif - -/* ellipsis is a different case though */ -extern void auth_warning __P((ENVELOPE *, const char *, ...)); -extern void syserr __P((const char *, ...)); -extern void usrerr __P((const char *, ...)); -extern void message __P((const char *, ...)); -extern void nmessage __P((const char *, ...)); -extern void setproctitle __P((const char *, ...)); -extern void sm_setproctitle __P((bool, const char *, ...)); -extern void sm_syslog __P((int, const char *, const char *, ...)); - -#if !HASSNPRINTF -extern int snprintf __P((char *, size_t, const char *, ...)); -extern int vsnprintf __P((char *, size_t, const char *, va_list)); -#endif -extern char *quad_to_string __P((QUAD_T)); diff --git a/src/sendmail.hf b/src/sendmail.hf deleted file mode 100644 index 0952963..0000000 --- a/src/sendmail.hf +++ /dev/null @@ -1,124 +0,0 @@ -cpyr -cpyr Copyright (c) 1998 Sendmail, Inc. All rights reserved. -cpyr Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. -cpyr Copyright (c) 1988, 1993 -cpyr The Regents of the University of California. All rights reserved. -cpyr -cpyr -cpyr By using this file, you agree to the terms and conditions set -cpyr forth in the LICENSE file which can be found at the top level of -cpyr the sendmail distribution. -cpyr -cpyr @(#)sendmail.hf 8.18 (Berkeley) 11/19/1998 -cpyr -smtp Topics: -smtp HELO EHLO MAIL RCPT DATA -smtp RSET NOOP QUIT HELP VRFY -smtp EXPN VERB ETRN DSN -smtp For more info use "HELP <topic>". -smtp To report bugs in the implementation send email to -smtp sendmail-bugs@sendmail.org. -smtp For local information send email to Postmaster at your site. -help HELP [ <topic> ] -help The HELP command gives help info. -helo HELO <hostname> -helo Introduce yourself. -ehlo EHLO <hostname> -ehlo Introduce yourself, and request extended SMTP mode. -ehlo Possible replies include: -ehlo SEND Send as mail [RFC821] -ehlo SOML Send as mail or terminal [RFC821] -ehlo SAML Send as mail and terminal [RFC821] -ehlo EXPN Expand the mailing list [RFC821] -ehlo HELP Supply helpful information [RFC821] -ehlo TURN Turn the operation around [RFC821] -ehlo 8BITMIME Use 8-bit data [RFC1652] -ehlo SIZE Message size declaration [RFC1870] -ehlo VERB Verbose [Allman] -ehlo ONEX One message transaction only [Allman] -ehlo CHUNKING Chunking [RFC1830] -ehlo BINARYMIME Binary MIME [RFC1830] -ehlo PIPELINING Command Pipelining [RFC1854] -ehlo DSN Delivery Status Notification [RFC1891] -ehlo ETRN Remote Message Queue Starting [RFC1985] -ehlo XUSR Initial (user) submission [Allman] -mail MAIL FROM: <sender> [ <parameters> ] -mail Specifies the sender. Parameters are ESMTP extensions. -mail See "HELP DSN" for details. -rcpt RCPT TO: <recipient> [ <parameters> ] -rcpt Specifies the recipient. Can be used any number of times. -rcpt Parameters are ESMTP extensions. See "HELP DSN" for details. -data DATA -data Following text is collected as the message. -data End with a single dot. -rset RSET -rset Resets the system. -quit QUIT -quit Exit sendmail (SMTP). -verb VERB -verb Go into verbose mode. This sends 0xy responses that are -verb not RFC821 standard (but should be) They are recognized -verb by humans and other sendmail implementations. -vrfy VRFY <recipient> -vrfy Verify an address. If you want to see what it aliases -vrfy to, use EXPN instead. -expn EXPN <recipient> -expn Expand an address. If the address indicates a mailing -expn list, return the contents of that list. -noop NOOP -noop Do nothing. -send SEND FROM: <sender> -send replaces the MAIL command, and can be used to send -send directly to a users terminal. Not supported in this -send implementation. -soml SOML FROM: <sender> -soml Send or mail. If the user is logged in, send directly, -soml otherwise mail. Not supported in this implementation. -saml SAML FROM: <sender> -saml Send and mail. Send directly to the user's terminal, -saml and also mail a letter. Not supported in this -saml implementation. -turn TURN -turn Reverses the direction of the connection. Not currently -turn implemented. -etrn ETRN [ <hostname> | @<domain> | #<queuename> ] -etrn Run the queue for the specified <hostname>, or -etrn all hosts within a given <domain>, or a specially-named -etrn <queuename> (implementation-specific). -dsn MAIL FROM: <sender> [ RET={ FULL | HDRS} ] [ ENVID=<envid> ] -dsn RCPT TO: <recipient> [ NOTIFY={NEVER,SUCCESS,FAILURE,DELAY} ] -dsn [ ORCPT=<recipient> ] -dsn SMTP Delivery Status Notifications. -dsn Descriptions: -dsn RET Return either the full message or only headers. -dsn ENVID Sender's "envelope identifier" for tracking. -dsn NOTIFY When to send a DSN. Multiple options are OK, comma- -dsn delimited. NEVER must appear by itself. -dsn ORCPT Original recipient. --bt Help for test mode: --bt ? :this help message. --bt .Dmvalue :define macro `m' to `value'. --bt .Ccvalue :add `value' to class `c'. --bt =Sruleset :dump the contents of the indicated ruleset. --bt =M :display the known mailers. --bt -ddebug-spec :equivalent to the command-line -d debug flag. --bt $m :print the value of macro $m. --bt $=c :print the contents of class $=c. --bt /mx host :returns the MX records for `host'. --bt /parse address :parse address, returning the value of crackaddr, and --bt the parsed address (same as -bv). --bt /try mailer addr :rewrite address into the form it will have when --bt presented to the indicated mailer. --bt /tryflags flags :set flags used by parsing. The flags can be `H' for --bt Header or `E' for Envelope, and `S' for Sender or `R' --bt for Recipient. These can be combined, `HR' sets --bt flags for header recipients. --bt /canon hostname :try to canonify hostname. --bt /map mapname key :look up `key' in the indicated `mapname'. --bt rules addr :run the indicated address through the named rules. --bt Rules can be a comma separated list of rules. -control Help for smcontrol: -control help This message. -control restart Restart sendmail. -control shutdown Shutdown sendmail. -control status Show sendmail status. diff --git a/src/snprintf.c b/src/snprintf.c deleted file mode 100644 index 3e07e1b..0000000 --- a/src/snprintf.c +++ /dev/null @@ -1,428 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)snprintf.c 8.12 (Berkeley) 10/13/1998"; -#endif /* not lint */ - -#include "sendmail.h" - -/* -** SNPRINTF, VSNPRINT -- counted versions of printf -** -** These versions have been grabbed off the net. They have been -** cleaned up to compile properly and support for .precision and -** %lx has been added. -*/ - -/************************************************************** - * Original: - * Patrick Powell Tue Apr 11 09:48:21 PDT 1995 - * A bombproof version of doprnt (sm_dopr) included. - * Sigh. This sort of thing is always nasty do deal with. Note that - * the version here does not include floating point... - * - * snprintf() is used instead of sprintf() as it does limit checks - * for string length. This covers a nasty loophole. - * - * The other functions are there to prevent NULL pointers from - * causing nast effects. - **************************************************************/ - -/*static char _id[] = "$Id: snprintf.c,v 1.2 1995/10/09 11:19:47 roberto Exp $";*/ -void sm_dopr(); -char *DoprEnd; -int SnprfOverflow; - -#if !HASSNPRINTF - -/* VARARGS3 */ -int -# ifdef __STDC__ -snprintf(char *str, size_t count, const char *fmt, ...) -# else -snprintf(str, count, fmt, va_alist) - char *str; - size_t count; - const char *fmt; - va_dcl -#endif -{ - int len; - VA_LOCAL_DECL - - VA_START(fmt); - len = vsnprintf(str, count, fmt, ap); - VA_END; - return len; -} - - -# ifndef luna2 -int -vsnprintf(str, count, fmt, args) - char *str; - size_t count; - const char *fmt; - va_list args; -{ - str[0] = 0; - DoprEnd = str + count - 1; - SnprfOverflow = 0; - sm_dopr( str, fmt, args ); - if (count > 0) - DoprEnd[0] = 0; - if (SnprfOverflow && tTd(57, 2)) - printf("\nvsnprintf overflow, len = %ld, str = %s", - (long) count, shortenstring(str, MAXSHORTSTR)); - return strlen(str); -} - -# endif /* !luna2 */ -#endif /* !HASSNPRINTF */ - -/* - * sm_dopr(): poor man's version of doprintf - */ - -void fmtstr __P((char *value, int ljust, int len, int zpad, int maxwidth)); -void fmtnum __P((long value, int base, int dosign, int ljust, int len, int zpad)); -void dostr __P(( char * , int )); -char *output; -void dopr_outch __P(( int c )); -int SyslogErrno; - -void -sm_dopr( buffer, format, args ) - char *buffer; - const char *format; - va_list args; -{ - int ch; - long value; - int longflag = 0; - int pointflag = 0; - int maxwidth = 0; - char *strvalue; - int ljust; - int len; - int zpad; -# if !HASSTRERROR && !defined(ERRLIST_PREDEFINED) - extern char *sys_errlist[]; - extern int sys_nerr; -# endif - - - output = buffer; - while( (ch = *format++) != '\0' ){ - switch( ch ){ - case '%': - ljust = len = zpad = maxwidth = 0; - longflag = pointflag = 0; - nextch: - ch = *format++; - switch( ch ){ - case 0: - dostr( "**end of format**" , 0); - return; - case '-': ljust = 1; goto nextch; - case '0': /* set zero padding if len not set */ - if(len==0 && !pointflag) zpad = '0'; - case '1': case '2': case '3': - case '4': case '5': case '6': - case '7': case '8': case '9': - if (pointflag) - maxwidth = maxwidth*10 + ch - '0'; - else - len = len*10 + ch - '0'; - goto nextch; - case '*': - if (pointflag) - maxwidth = va_arg( args, int ); - else - len = va_arg( args, int ); - goto nextch; - case '.': pointflag = 1; goto nextch; - case 'l': longflag = 1; goto nextch; - case 'u': case 'U': - /*fmtnum(value,base,dosign,ljust,len,zpad) */ - if( longflag ){ - value = va_arg( args, long ); - } else { - value = va_arg( args, int ); - } - fmtnum( value, 10,0, ljust, len, zpad ); break; - case 'o': case 'O': - /*fmtnum(value,base,dosign,ljust,len,zpad) */ - if( longflag ){ - value = va_arg( args, long ); - } else { - value = va_arg( args, int ); - } - fmtnum( value, 8,0, ljust, len, zpad ); break; - case 'd': case 'D': - if( longflag ){ - value = va_arg( args, long ); - } else { - value = va_arg( args, int ); - } - fmtnum( value, 10,1, ljust, len, zpad ); break; - case 'x': - if( longflag ){ - value = va_arg( args, long ); - } else { - value = va_arg( args, int ); - } - fmtnum( value, 16,0, ljust, len, zpad ); break; - case 'X': - if( longflag ){ - value = va_arg( args, long ); - } else { - value = va_arg( args, int ); - } - fmtnum( value,-16,0, ljust, len, zpad ); break; - case 's': - strvalue = va_arg( args, char *); - if (maxwidth > 0 || !pointflag) { - if (pointflag && len > maxwidth) - len = maxwidth; /* Adjust padding */ - fmtstr( strvalue,ljust,len,zpad, maxwidth); - } - break; - case 'c': - ch = va_arg( args, int ); - dopr_outch( ch ); break; - case 'm': -#if HASSTRERROR - dostr(strerror(SyslogErrno), 0); -#else - if (SyslogErrno < 0 || SyslogErrno >= sys_nerr) - { - dostr("Error ", 0); - fmtnum(SyslogErrno, 10, 0, 0, 0, 0); - } - else - dostr((char *)sys_errlist[SyslogErrno], 0); -#endif - break; - - case '%': dopr_outch( ch ); continue; - default: - dostr( "???????" , 0); - } - break; - default: - dopr_outch( ch ); - break; - } - } - *output = 0; -} - -void -fmtstr( value, ljust, len, zpad, maxwidth ) - char *value; - int ljust, len, zpad, maxwidth; -{ - int padlen, strlen; /* amount to pad */ - - if( value == 0 ){ - value = "<NULL>"; - } - for( strlen = 0; value[strlen]; ++ strlen ); /* strlen */ - if (strlen > maxwidth && maxwidth) - strlen = maxwidth; - padlen = len - strlen; - if( padlen < 0 ) padlen = 0; - if( ljust ) padlen = -padlen; - while( padlen > 0 ) { - dopr_outch( ' ' ); - --padlen; - } - dostr( value, maxwidth ); - while( padlen < 0 ) { - dopr_outch( ' ' ); - ++padlen; - } -} - -void -fmtnum( value, base, dosign, ljust, len, zpad ) - long value; - int base, dosign, ljust, len, zpad; -{ - int signvalue = 0; - unsigned long uvalue; - char convert[20]; - int place = 0; - int padlen = 0; /* amount to pad */ - int caps = 0; - - /* DEBUGP(("value 0x%x, base %d, dosign %d, ljust %d, len %d, zpad %d\n", - value, base, dosign, ljust, len, zpad )); */ - uvalue = value; - if( dosign ){ - if( value < 0 ) { - signvalue = '-'; - uvalue = -value; - } - } - if( base < 0 ){ - caps = 1; - base = -base; - } - do{ - convert[place++] = - (caps? "0123456789ABCDEF":"0123456789abcdef") - [uvalue % (unsigned)base ]; - uvalue = (uvalue / (unsigned)base ); - }while(uvalue); - convert[place] = 0; - padlen = len - place; - if( padlen < 0 ) padlen = 0; - if( ljust ) padlen = -padlen; - /* DEBUGP(( "str '%s', place %d, sign %c, padlen %d\n", - convert,place,signvalue,padlen)); */ - if( zpad && padlen > 0 ){ - if( signvalue ){ - dopr_outch( signvalue ); - --padlen; - signvalue = 0; - } - while( padlen > 0 ){ - dopr_outch( zpad ); - --padlen; - } - } - while( padlen > 0 ) { - dopr_outch( ' ' ); - --padlen; - } - if( signvalue ) dopr_outch( signvalue ); - while( place > 0 ) dopr_outch( convert[--place] ); - while( padlen < 0 ){ - dopr_outch( ' ' ); - ++padlen; - } -} - -void -dostr( str , cut) - char *str; - int cut; -{ - if (cut) { - while(*str && cut-- > 0) dopr_outch(*str++); - } else { - while(*str) dopr_outch(*str++); - } -} - -void -dopr_outch( c ) - int c; -{ -#if 0 - if( iscntrl(c) && c != '\n' && c != '\t' ){ - c = '@' + (c & 0x1F); - if( DoprEnd == 0 || output < DoprEnd ) - *output++ = '^'; - } -#endif - if( DoprEnd == 0 || output < DoprEnd ) - *output++ = c; - else - SnprfOverflow++; -} - -/* -** QUAD_TO_STRING -- Convert a quad type to a string. -** -** Convert a quad type to a string. This must be done -** separately as %lld/%qd are not supported by snprint() -** and adding support would slow down systems which only -** emulate the data type. -** -** Parameters: -** value -- number to convert to a string. -** -** Returns: -** pointer to a string. -*/ - -char * -quad_to_string(value) - QUAD_T value; -{ - char *fmtstr; - static char buf[64]; - - /* - ** Use sprintf() instead of snprintf() since snprintf() - ** does not support %qu or %llu. The buffer is large enough - ** to hold the string so there is no danger of buffer - ** overflow. - */ - -#if NEED_PERCENTQ - fmtstr = "%qu"; -#else - fmtstr = "%llu"; -#endif - sprintf(buf, fmtstr, value); - return buf; -} -/* -** SHORTENSTRING -- return short version of a string -** -** If the string is already short, just return it. If it is too -** long, return the head and tail of the string. -** -** Parameters: -** s -- the string to shorten. -** m -- the max length of the string. -** -** Returns: -** Either s or a short version of s. -*/ - -char * -shortenstring(s, m) - register const char *s; - int m; -{ - int l; - static char buf[MAXSHORTSTR + 1]; - - l = strlen(s); - if (l < m) - return (char *) s; - if (m > MAXSHORTSTR) - m = MAXSHORTSTR; - else if (m < 10) - { - if (m < 5) - { - strncpy(buf, s, m); - buf[m] = '\0'; - return buf; - } - strncpy(buf, s, m - 3); - strcpy(buf + m - 3, "..."); - return buf; - } - m = (m - 3) / 2; - strncpy(buf, s, m); - strcpy(buf + m, "..."); - strcpy(buf + m + 3, s + l - m); - return buf; -} diff --git a/src/srvrsmtp.c b/src/srvrsmtp.c deleted file mode 100644 index f4ffe8c..0000000 --- a/src/srvrsmtp.c +++ /dev/null @@ -1,1532 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -# include "sendmail.h" - -#ifndef lint -#if SMTP -static char sccsid[] = "@(#)srvrsmtp.c 8.187 (Berkeley) 10/23/1998 (with SMTP)"; -#else -static char sccsid[] = "@(#)srvrsmtp.c 8.187 (Berkeley) 10/23/1998 (without SMTP)"; -#endif -#endif /* not lint */ - -# include <errno.h> - -# if SMTP - -/* -** SMTP -- run the SMTP protocol. -** -** Parameters: -** nullserver -- if non-NULL, rejection message for -** all SMTP commands. -** e -- the envelope. -** -** Returns: -** never. -** -** Side Effects: -** Reads commands from the input channel and processes -** them. -*/ - -struct cmd -{ - char *cmdname; /* command name */ - int cmdcode; /* internal code, see below */ -}; - -/* values for cmdcode */ -# define CMDERROR 0 /* bad command */ -# define CMDMAIL 1 /* mail -- designate sender */ -# define CMDRCPT 2 /* rcpt -- designate recipient */ -# define CMDDATA 3 /* data -- send message text */ -# define CMDRSET 4 /* rset -- reset state */ -# define CMDVRFY 5 /* vrfy -- verify address */ -# define CMDEXPN 6 /* expn -- expand address */ -# define CMDNOOP 7 /* noop -- do nothing */ -# define CMDQUIT 8 /* quit -- close connection and die */ -# define CMDHELO 9 /* helo -- be polite */ -# define CMDHELP 10 /* help -- give usage info */ -# define CMDEHLO 11 /* ehlo -- extended helo (RFC 1425) */ -# define CMDETRN 12 /* etrn -- flush queue */ -/* non-standard commands */ -# define CMDONEX 16 /* onex -- sending one transaction only */ -# define CMDVERB 17 /* verb -- go into verbose mode */ -# define CMDXUSR 18 /* xusr -- initial (user) submission */ -/* use this to catch and log "door handle" attempts on your system */ -# define CMDLOGBOGUS 23 /* bogus command that should be logged */ -/* debugging-only commands, only enabled if SMTPDEBUG is defined */ -# define CMDDBGQSHOW 24 /* showq -- show send queue */ -# define CMDDBGDEBUG 25 /* debug -- set debug mode */ - -static struct cmd CmdTab[] = -{ - { "mail", CMDMAIL }, - { "rcpt", CMDRCPT }, - { "data", CMDDATA }, - { "rset", CMDRSET }, - { "vrfy", CMDVRFY }, - { "expn", CMDEXPN }, - { "help", CMDHELP }, - { "noop", CMDNOOP }, - { "quit", CMDQUIT }, - { "helo", CMDHELO }, - { "ehlo", CMDEHLO }, - { "etrn", CMDETRN }, - { "verb", CMDVERB }, - { "onex", CMDONEX }, - { "xusr", CMDXUSR }, - /* remaining commands are here only to trap and log attempts to use them */ - { "showq", CMDDBGQSHOW }, - { "debug", CMDDBGDEBUG }, - { "wiz", CMDLOGBOGUS }, - - { NULL, CMDERROR } -}; - -bool OneXact = FALSE; /* one xaction only this run */ -char *CurSmtpClient; /* who's at the other end of channel */ - -static char *skipword __P((char *volatile, char *)); - - -#define MAXBADCOMMANDS 25 /* maximum number of bad commands */ -#define MAXNOOPCOMMANDS 20 /* max "noise" commands before slowdown */ -#define MAXHELOCOMMANDS 3 /* max HELO/EHLO commands before slowdown */ -#define MAXVRFYCOMMANDS 6 /* max VRFY/EXPN commands before slowdown */ -#define MAXETRNCOMMANDS 8 /* max ETRN commands before slowdown */ - -void -smtp(nullserver, e) - char *nullserver; - register ENVELOPE *volatile e; -{ - register char *volatile p; - register struct cmd *c; - char *cmd; - auto ADDRESS *vrfyqueue; - ADDRESS *a; - volatile bool gotmail; /* mail command received */ - volatile bool gothello; /* helo command received */ - bool vrfy; /* set if this is a vrfy command */ - char *volatile protocol; /* sending protocol */ - char *volatile sendinghost; /* sending hostname */ - char *volatile peerhostname; /* name of SMTP peer or "localhost" */ - auto char *delimptr; - char *id; - volatile int nrcpts = 0; /* number of RCPT commands */ - bool doublequeue; - volatile bool discard; - volatile int badcommands = 0; /* count of bad commands */ - volatile int nverifies = 0; /* count of VRFY/EXPN commands */ - volatile int n_etrn = 0; /* count of ETRN commands */ - volatile int n_noop = 0; /* count of NOOP/VERB/ONEX etc cmds */ - volatile int n_helo = 0; /* count of HELO/EHLO commands */ - bool ok; - volatile int lognullconnection = TRUE; - register char *q; - QUEUE_CHAR *new; - char inp[MAXLINE]; - char cmdbuf[MAXLINE]; - extern ENVELOPE BlankEnvelope; - extern void help __P((char *)); - extern void settime __P((ENVELOPE *)); - extern bool enoughdiskspace __P((long)); - extern int runinchild __P((char *, ENVELOPE *)); - extern void checksmtpattack __P((volatile int *, int, char *, ENVELOPE *)); - - if (fileno(OutChannel) != fileno(stdout)) - { - /* arrange for debugging output to go to remote host */ - (void) dup2(fileno(OutChannel), fileno(stdout)); - } - settime(e); - peerhostname = RealHostName; - if (peerhostname == NULL) - peerhostname = "localhost"; - CurHostName = peerhostname; - CurSmtpClient = macvalue('_', e); - if (CurSmtpClient == NULL) - CurSmtpClient = CurHostName; - - /* check_relay may have set discard bit, save for later */ - discard = bitset(EF_DISCARD, e->e_flags); - - sm_setproctitle(TRUE, "server %s startup", CurSmtpClient); -#if DAEMON - if (LogLevel > 11) - { - /* log connection information */ - sm_syslog(LOG_INFO, NOQID, - "SMTP connect from %.100s (%.100s)", - CurSmtpClient, anynet_ntoa(&RealHostAddr)); - } -#endif - - /* output the first line, inserting "ESMTP" as second word */ - expand(SmtpGreeting, inp, sizeof inp, e); - p = strchr(inp, '\n'); - if (p != NULL) - *p++ = '\0'; - id = strchr(inp, ' '); - if (id == NULL) - id = &inp[strlen(inp)]; - cmd = p == NULL ? "220 %.*s ESMTP%s" : "220-%.*s ESMTP%s"; - message(cmd, id - inp, inp, id); - - /* output remaining lines */ - while ((id = p) != NULL && (p = strchr(id, '\n')) != NULL) - { - *p++ = '\0'; - if (isascii(*id) && isspace(*id)) - id++; - message("220-%s", id); - } - if (id != NULL) - { - if (isascii(*id) && isspace(*id)) - id++; - message("220 %s", id); - } - - protocol = NULL; - sendinghost = macvalue('s', e); - gothello = FALSE; - gotmail = FALSE; - for (;;) - { - /* arrange for backout */ - (void) setjmp(TopFrame); - QuickAbort = FALSE; - HoldErrs = FALSE; - SuprErrs = FALSE; - LogUsrErrs = FALSE; - OnlyOneError = TRUE; - e->e_flags &= ~(EF_VRFYONLY|EF_GLOBALERRS); - - /* setup for the read */ - e->e_to = NULL; - Errors = 0; - (void) fflush(stdout); - - /* read the input line */ - SmtpPhase = "server cmd read"; - sm_setproctitle(TRUE, "server %s cmd read", CurSmtpClient); - p = sfgets(inp, sizeof inp, InChannel, TimeOuts.to_nextcommand, - SmtpPhase); - - /* handle errors */ - if (p == NULL) - { - /* end of file, just die */ - disconnect(1, e); - message("421 %s Lost input channel from %s", - MyHostName, CurSmtpClient); - if (LogLevel > (gotmail ? 1 : 19)) - sm_syslog(LOG_NOTICE, e->e_id, - "lost input channel from %.100s", - CurSmtpClient); - if (lognullconnection && LogLevel > 5) - sm_syslog(LOG_INFO, NULL, - "Null connection from %.100s", - CurSmtpClient); - - /* - ** If have not accepted mail (DATA), do not bounce - ** bad addresses back to sender. - */ - if (bitset(EF_CLRQUEUE, e->e_flags)) - e->e_sendqueue = NULL; - - if (InChild) - ExitStat = EX_QUIT; - finis(TRUE, ExitStat); - } - - /* clean up end of line */ - fixcrlf(inp, TRUE); - - /* echo command to transcript */ - if (e->e_xfp != NULL) - fprintf(e->e_xfp, "<<< %s\n", inp); - - if (LogLevel >= 15) - sm_syslog(LOG_INFO, e->e_id, - "<-- %s", - inp); - - if (e->e_id == NULL) - sm_setproctitle(TRUE, "%s: %.80s", CurSmtpClient, inp); - else - sm_setproctitle(TRUE, "%s %s: %.80s", e->e_id, CurSmtpClient, inp); - - /* break off command */ - for (p = inp; isascii(*p) && isspace(*p); p++) - continue; - cmd = cmdbuf; - while (*p != '\0' && - !(isascii(*p) && isspace(*p)) && - cmd < &cmdbuf[sizeof cmdbuf - 2]) - *cmd++ = *p++; - *cmd = '\0'; - - /* throw away leading whitespace */ - while (isascii(*p) && isspace(*p)) - p++; - - /* decode command */ - for (c = CmdTab; c->cmdname != NULL; c++) - { - if (!strcasecmp(c->cmdname, cmdbuf)) - break; - } - - /* reset errors */ - errno = 0; - - /* - ** Process command. - ** - ** If we are running as a null server, return 550 - ** to everything. - */ - - if (nullserver != NULL) - { - switch (c->cmdcode) - { - case CMDQUIT: - case CMDHELO: - case CMDEHLO: - case CMDNOOP: - /* process normally */ - break; - - default: - if (++badcommands > MAXBADCOMMANDS) - sleep(1); - usrerr("550 %s", nullserver); - continue; - } - } - - /* non-null server */ - switch (c->cmdcode) - { - case CMDMAIL: - case CMDEXPN: - case CMDVRFY: - case CMDETRN: - lognullconnection = FALSE; - } - - switch (c->cmdcode) - { - case CMDHELO: /* hello -- introduce yourself */ - case CMDEHLO: /* extended hello */ - if (c->cmdcode == CMDEHLO) - { - protocol = "ESMTP"; - SmtpPhase = "server EHLO"; - } - else - { - protocol = "SMTP"; - SmtpPhase = "server HELO"; - } - - /* avoid denial-of-service */ - checksmtpattack(&n_helo, MAXHELOCOMMANDS, "HELO/EHLO", e); - - /* check for duplicate HELO/EHLO per RFC 1651 4.2 */ - if (gothello) - { - usrerr("503 %s Duplicate HELO/EHLO", - MyHostName); - break; - } - - /* check for valid domain name (re 1123 5.2.5) */ - if (*p == '\0' && !AllowBogusHELO) - { - usrerr("501 %s requires domain address", - cmdbuf); - break; - } - - /* check for long domain name (hides Received: info) */ - if (strlen(p) > MAXNAME) - { - usrerr("501 Invalid domain name"); - break; - } - - for (q = p; *q != '\0'; q++) - { - if (!isascii(*q)) - break; - if (isalnum(*q)) - continue; - if (isspace(*q)) - { - *q = '\0'; - break; - } - if (strchr("[].-_#", *q) == NULL) - break; - } - if (*q == '\0') - { - q = "pleased to meet you"; - sendinghost = newstr(p); - } - else if (!AllowBogusHELO) - { - usrerr("501 Invalid domain name"); - break; - } - else - { - q = "accepting invalid domain name"; - } - - gothello = TRUE; - - /* print HELO response message */ - if (c->cmdcode != CMDEHLO || nullserver != NULL) - { - message("250 %s Hello %s, %s", - MyHostName, CurSmtpClient, q); - break; - } - - message("250-%s Hello %s, %s", - MyHostName, CurSmtpClient, q); - - /* print EHLO features list */ - if (!bitset(PRIV_NOEXPN, PrivacyFlags)) - { - message("250-EXPN"); - if (!bitset(PRIV_NOVERB, PrivacyFlags)) - message("250-VERB"); - } -#if MIME8TO7 - message("250-8BITMIME"); -#endif - if (MaxMessageSize > 0) - message("250-SIZE %ld", MaxMessageSize); - else - message("250-SIZE"); -#if DSN - if (SendMIMEErrors) - message("250-DSN"); -#endif - message("250-ONEX"); - if (!bitset(PRIV_NOETRN, PrivacyFlags)) - message("250-ETRN"); - message("250-XUSR"); - message("250 HELP"); - break; - - case CMDMAIL: /* mail -- designate sender */ - SmtpPhase = "server MAIL"; - - /* check for validity of this command */ - if (!gothello && bitset(PRIV_NEEDMAILHELO, PrivacyFlags)) - { - usrerr("503 Polite people say HELO first"); - break; - } - if (gotmail) - { - usrerr("503 Sender already specified"); - break; - } - if (InChild) - { - errno = 0; - syserr("503 Nested MAIL command: MAIL %s", p); - finis(TRUE, ExitStat); - } - - /* make sure we know who the sending host is */ - if (sendinghost == NULL) - sendinghost = peerhostname; - - p = skipword(p, "from"); - if (p == NULL) - break; - - /* fork a subprocess to process this command */ - if (runinchild("SMTP-MAIL", e) > 0) - break; - if (Errors > 0) - goto undo_subproc_no_pm; - if (!gothello) - { - auth_warning(e, - "%s didn't use HELO protocol", - CurSmtpClient); - } -#ifdef PICKY_HELO_CHECK - if (strcasecmp(sendinghost, peerhostname) != 0 && - (strcasecmp(peerhostname, "localhost") != 0 || - strcasecmp(sendinghost, MyHostName) != 0)) - { - auth_warning(e, "Host %s claimed to be %s", - CurSmtpClient, sendinghost); - } -#endif - - if (protocol == NULL) - protocol = "SMTP"; - define('r', protocol, e); - define('s', sendinghost, e); - initsys(e); - if (Errors > 0) - goto undo_subproc_no_pm; - nrcpts = 0; - e->e_flags |= EF_LOGSENDER|EF_CLRQUEUE; - sm_setproctitle(TRUE, "%s %s: %.80s", e->e_id, CurSmtpClient, inp); - - /* child -- go do the processing */ - if (setjmp(TopFrame) > 0) - { - /* this failed -- undo work */ - undo_subproc_no_pm: - e->e_flags &= ~EF_PM_NOTIFY; - undo_subproc: - if (InChild) - { - QuickAbort = FALSE; - SuprErrs = TRUE; - e->e_flags &= ~EF_FATALERRS; - finis(TRUE, ExitStat); - } - break; - } - QuickAbort = TRUE; - - /* must parse sender first */ - delimptr = NULL; - setsender(p, e, &delimptr, ' ', FALSE); - if (delimptr != NULL && *delimptr != '\0') - *delimptr++ = '\0'; - if (Errors > 0) - goto undo_subproc_no_pm; - - /* do config file checking of the sender */ - if (rscheck("check_mail", p, NULL, e) != EX_OK || - Errors > 0) - goto undo_subproc_no_pm; - - /* check for possible spoofing */ - if (RealUid != 0 && OpMode == MD_SMTP && - !wordinclass(RealUserName, 't') && - !bitnset(M_LOCALMAILER, e->e_from.q_mailer->m_flags) && - strcmp(e->e_from.q_user, RealUserName) != 0) - { - auth_warning(e, "%s owned process doing -bs", - RealUserName); - } - - /* now parse ESMTP arguments */ - e->e_msgsize = 0; - p = delimptr; - while (p != NULL && *p != '\0') - { - char *kp; - char *vp = NULL; - extern void mail_esmtp_args __P((char *, char *, ENVELOPE *)); - - /* locate the beginning of the keyword */ - while (isascii(*p) && isspace(*p)) - p++; - if (*p == '\0') - break; - kp = p; - - /* skip to the value portion */ - while ((isascii(*p) && isalnum(*p)) || *p == '-') - p++; - if (*p == '=') - { - *p++ = '\0'; - vp = p; - - /* skip to the end of the value */ - while (*p != '\0' && *p != ' ' && - !(isascii(*p) && iscntrl(*p)) && - *p != '=') - p++; - } - - if (*p != '\0') - *p++ = '\0'; - - if (tTd(19, 1)) - printf("MAIL: got arg %s=\"%s\"\n", kp, - vp == NULL ? "<null>" : vp); - - mail_esmtp_args(kp, vp, e); - if (Errors > 0) - goto undo_subproc_no_pm; - } - if (Errors > 0) - goto undo_subproc_no_pm; - - if (MaxMessageSize > 0 && e->e_msgsize > MaxMessageSize) - { - usrerr("552 Message size exceeds fixed maximum message size (%ld)", - MaxMessageSize); - goto undo_subproc_no_pm; - } - - if (!enoughdiskspace(e->e_msgsize)) - { - usrerr("452 Insufficient disk space; try again later"); - goto undo_subproc_no_pm; - } - if (Errors > 0) - goto undo_subproc_no_pm; - message("250 Sender ok"); - gotmail = TRUE; - break; - - case CMDRCPT: /* rcpt -- designate recipient */ - if (!gotmail) - { - usrerr("503 Need MAIL before RCPT"); - break; - } - SmtpPhase = "server RCPT"; - if (setjmp(TopFrame) > 0) - { - e->e_flags &= ~EF_FATALERRS; - break; - } - QuickAbort = TRUE; - LogUsrErrs = TRUE; - - /* limit flooding of our machine */ - if (MaxRcptPerMsg > 0 && nrcpts >= MaxRcptPerMsg) - { - usrerr("452 Too many recipients"); - break; - } - - if (e->e_sendmode != SM_DELIVER) - e->e_flags |= EF_VRFYONLY; - - p = skipword(p, "to"); - if (p == NULL) - break; - a = parseaddr(p, NULLADDR, RF_COPYALL, ' ', &delimptr, e); - if (Errors > 0) - break; - if (a == NULL) - { - usrerr("501 Missing recipient"); - break; - } - - if (delimptr != NULL && *delimptr != '\0') - *delimptr++ = '\0'; - - /* do config file checking of the recipient */ - if (rscheck("check_rcpt", p, NULL, e) != EX_OK || - Errors > 0) - break; - - /* now parse ESMTP arguments */ - p = delimptr; - while (p != NULL && *p != '\0') - { - char *kp; - char *vp = NULL; - extern void rcpt_esmtp_args __P((ADDRESS *, char *, char *, ENVELOPE *)); - - /* locate the beginning of the keyword */ - while (isascii(*p) && isspace(*p)) - p++; - if (*p == '\0') - break; - kp = p; - - /* skip to the value portion */ - while ((isascii(*p) && isalnum(*p)) || *p == '-') - p++; - if (*p == '=') - { - *p++ = '\0'; - vp = p; - - /* skip to the end of the value */ - while (*p != '\0' && *p != ' ' && - !(isascii(*p) && iscntrl(*p)) && - *p != '=') - p++; - } - - if (*p != '\0') - *p++ = '\0'; - - if (tTd(19, 1)) - printf("RCPT: got arg %s=\"%s\"\n", kp, - vp == NULL ? "<null>" : vp); - - rcpt_esmtp_args(a, kp, vp, e); - if (Errors > 0) - break; - } - if (Errors > 0) - break; - - /* save in recipient list after ESMTP mods */ - a = recipient(a, &e->e_sendqueue, 0, e); - if (Errors > 0) - break; - - /* no errors during parsing, but might be a duplicate */ - e->e_to = a->q_paddr; - if (!bitset(QBADADDR, a->q_flags)) - { - message("250 Recipient ok%s", - bitset(QQUEUEUP, a->q_flags) ? - " (will queue)" : ""); - nrcpts++; - } - else - { - /* punt -- should keep message in ADDRESS.... */ - usrerr("550 Addressee unknown"); - } - break; - - case CMDDATA: /* data -- text of mail */ - SmtpPhase = "server DATA"; - if (!gotmail) - { - usrerr("503 Need MAIL command"); - break; - } - else if (nrcpts <= 0) - { - usrerr("503 Need RCPT (recipient)"); - break; - } - - /* put back discard bit */ - if (discard) - e->e_flags |= EF_DISCARD; - - /* check to see if we need to re-expand aliases */ - /* also reset QBADADDR on already-diagnosted addrs */ - doublequeue = FALSE; - for (a = e->e_sendqueue; a != NULL; a = a->q_next) - { - if (bitset(QVERIFIED, a->q_flags) && - !bitset(EF_DISCARD, e->e_flags)) - { - /* need to re-expand aliases */ - doublequeue = TRUE; - } - if (bitset(QBADADDR, a->q_flags)) - { - /* make this "go away" */ - a->q_flags |= QDONTSEND; - a->q_flags &= ~QBADADDR; - } - } - - /* collect the text of the message */ - SmtpPhase = "collect"; - buffer_errors(); - collect(InChannel, TRUE, NULL, e); - if (Errors > 0) - { - flush_errors(TRUE); - buffer_errors(); - goto abortmessage; - } - - /* make sure we actually do delivery */ - e->e_flags &= ~EF_CLRQUEUE; - - /* from now on, we have to operate silently */ - buffer_errors(); - e->e_errormode = EM_MAIL; - - /* - ** Arrange to send to everyone. - ** If sending to multiple people, mail back - ** errors rather than reporting directly. - ** In any case, don't mail back errors for - ** anything that has happened up to - ** now (the other end will do this). - ** Truncate our transcript -- the mail has gotten - ** to us successfully, and if we have - ** to mail this back, it will be easier - ** on the reader. - ** Then send to everyone. - ** Finally give a reply code. If an error has - ** already been given, don't mail a - ** message back. - ** We goose error returns by clearing error bit. - */ - - SmtpPhase = "delivery"; - e->e_xfp = freopen(queuename(e, 'x'), "w", e->e_xfp); - id = e->e_id; - - if (doublequeue) - { - /* make sure it is in the queue */ - queueup(e, FALSE); - } - else - { - /* send to all recipients */ - sendall(e, SM_DEFAULT); - } - e->e_to = NULL; - - /* issue success message */ - message("250 %s Message accepted for delivery", id); - - /* if we just queued, poke it */ - if (doublequeue && - e->e_sendmode != SM_QUEUE && - e->e_sendmode != SM_DEFER) - { - CurrentLA = getla(); - - if (!shouldqueue(e->e_msgpriority, e->e_ctime)) - { - unlockqueue(e); - (void) dowork(id, TRUE, TRUE, e); - } - } - - abortmessage: - /* if in a child, pop back to our parent */ - if (InChild) - finis(TRUE, ExitStat); - - /* clean up a bit */ - gotmail = FALSE; - dropenvelope(e, TRUE); - CurEnv = e = newenvelope(e, CurEnv); - e->e_flags = BlankEnvelope.e_flags; - break; - - case CMDRSET: /* rset -- reset state */ - if (tTd(94, 100)) - message("451 Test failure"); - else - message("250 Reset state"); - - /* arrange to ignore any current send list */ - e->e_sendqueue = NULL; - e->e_flags |= EF_CLRQUEUE; - if (InChild) - finis(TRUE, ExitStat); - - /* clean up a bit */ - gotmail = FALSE; - SuprErrs = TRUE; - dropenvelope(e, TRUE); - CurEnv = e = newenvelope(e, CurEnv); - break; - - case CMDVRFY: /* vrfy -- verify address */ - case CMDEXPN: /* expn -- expand address */ - checksmtpattack(&nverifies, MAXVRFYCOMMANDS, - c->cmdcode == CMDVRFY ? "VRFY" : "EXPN", e); - vrfy = c->cmdcode == CMDVRFY; - if (bitset(vrfy ? PRIV_NOVRFY : PRIV_NOEXPN, - PrivacyFlags)) - { - if (vrfy) - message("252 Cannot VRFY user; try RCPT to attempt delivery (or try finger)"); - else - message("502 Sorry, we do not allow this operation"); - if (LogLevel > 5) - sm_syslog(LOG_INFO, e->e_id, - "%.100s: %s [rejected]", - CurSmtpClient, - shortenstring(inp, MAXSHORTSTR)); - break; - } - else if (!gothello && - bitset(vrfy ? PRIV_NEEDVRFYHELO : PRIV_NEEDEXPNHELO, - PrivacyFlags)) - { - usrerr("503 I demand that you introduce yourself first"); - break; - } - if (runinchild(vrfy ? "SMTP-VRFY" : "SMTP-EXPN", e) > 0) - break; - if (Errors > 0) - goto undo_subproc; - if (LogLevel > 5) - sm_syslog(LOG_INFO, e->e_id, - "%.100s: %s", - CurSmtpClient, - shortenstring(inp, MAXSHORTSTR)); - if (setjmp(TopFrame) > 0) - goto undo_subproc; - QuickAbort = TRUE; - vrfyqueue = NULL; - if (vrfy) - e->e_flags |= EF_VRFYONLY; - while (*p != '\0' && isascii(*p) && isspace(*p)) - p++; - if (*p == '\0') - { - usrerr("501 Argument required"); - } - else - { - (void) sendtolist(p, NULLADDR, &vrfyqueue, 0, e); - } - if (Errors > 0) - goto undo_subproc; - if (vrfyqueue == NULL) - { - usrerr("554 Nothing to %s", vrfy ? "VRFY" : "EXPN"); - } - while (vrfyqueue != NULL) - { - extern void printvrfyaddr __P((ADDRESS *, bool, bool)); - - a = vrfyqueue; - while ((a = a->q_next) != NULL && - bitset(QDONTSEND|QBADADDR, a->q_flags)) - continue; - if (!bitset(QDONTSEND|QBADADDR, vrfyqueue->q_flags)) - printvrfyaddr(vrfyqueue, a == NULL, vrfy); - vrfyqueue = vrfyqueue->q_next; - } - if (InChild) - finis(TRUE, ExitStat); - break; - - case CMDETRN: /* etrn -- force queue flush */ - if (bitset(PRIV_NOETRN, PrivacyFlags)) - { - message("502 Sorry, we do not allow this operation"); - if (LogLevel > 5) - sm_syslog(LOG_INFO, e->e_id, - "%.100s: %s [rejected]", - CurSmtpClient, - shortenstring(inp, MAXSHORTSTR)); - break; - } - - if (strlen(p) <= 0) - { - usrerr("500 Parameter required"); - break; - } - - /* crude way to avoid denial-of-service attacks */ - checksmtpattack(&n_etrn, MAXETRNCOMMANDS, "ETRN", e); - - if (LogLevel > 5) - sm_syslog(LOG_INFO, e->e_id, - "%.100s: ETRN %s", - CurSmtpClient, - shortenstring(p, MAXSHORTSTR)); - - id = p; - if (*id == '@') - id++; - else - *--id = '@'; - - if ((new = (QUEUE_CHAR *)malloc(sizeof(QUEUE_CHAR))) == NULL) - { - syserr("500 ETRN out of memory"); - break; - } - new->queue_match = id; - new->queue_next = NULL; - QueueLimitRecipient = new; - ok = runqueue(TRUE, TRUE); - free(QueueLimitRecipient); - QueueLimitRecipient = NULL; - if (ok && Errors == 0) - message("250 Queuing for node %s started", p); - break; - - case CMDHELP: /* help -- give user info */ - help(p); - break; - - case CMDNOOP: /* noop -- do nothing */ - checksmtpattack(&n_noop, MAXNOOPCOMMANDS, "NOOP", e); - message("250 OK"); - break; - - case CMDQUIT: /* quit -- leave mail */ - message("221 %s closing connection", MyHostName); - -doquit: - /* arrange to ignore any current send list */ - e->e_sendqueue = NULL; - - /* avoid future 050 messages */ - disconnect(1, e); - - if (InChild) - ExitStat = EX_QUIT; - if (lognullconnection && LogLevel > 5) - sm_syslog(LOG_INFO, NULL, - "Null connection from %.100s", - CurSmtpClient); - finis(TRUE, ExitStat); - - case CMDVERB: /* set verbose mode */ - if (bitset(PRIV_NOEXPN, PrivacyFlags) || - bitset(PRIV_NOVERB, PrivacyFlags)) - { - /* this would give out the same info */ - message("502 Verbose unavailable"); - break; - } - checksmtpattack(&n_noop, MAXNOOPCOMMANDS, "VERB", e); - Verbose = 1; - e->e_sendmode = SM_DELIVER; - message("250 Verbose mode"); - break; - - case CMDONEX: /* doing one transaction only */ - checksmtpattack(&n_noop, MAXNOOPCOMMANDS, "ONEX", e); - OneXact = TRUE; - message("250 Only one transaction"); - break; - - case CMDXUSR: /* initial (user) submission */ - checksmtpattack(&n_noop, MAXNOOPCOMMANDS, "XUSR", e); - UserSubmission = TRUE; - message("250 Initial submission"); - break; - -# if SMTPDEBUG - case CMDDBGQSHOW: /* show queues */ - printf("Send Queue="); - printaddr(e->e_sendqueue, TRUE); - break; - - case CMDDBGDEBUG: /* set debug mode */ - tTsetup(tTdvect, sizeof tTdvect, "0-99.1"); - tTflag(p); - message("200 Debug set"); - break; - -# else /* not SMTPDEBUG */ - case CMDDBGQSHOW: /* show queues */ - case CMDDBGDEBUG: /* set debug mode */ -# endif /* SMTPDEBUG */ - case CMDLOGBOGUS: /* bogus command */ - if (LogLevel > 0) - sm_syslog(LOG_CRIT, e->e_id, - "\"%s\" command from %.100s (%.100s)", - c->cmdname, CurSmtpClient, - anynet_ntoa(&RealHostAddr)); - /* FALL THROUGH */ - - case CMDERROR: /* unknown command */ - if (++badcommands > MAXBADCOMMANDS) - { - message("421 %s Too many bad commands; closing connection", - MyHostName); - goto doquit; - } - - usrerr("500 Command unrecognized: \"%s\"", - shortenstring(inp, MAXSHORTSTR)); - break; - - default: - errno = 0; - syserr("500 smtp: unknown code %d", c->cmdcode); - break; - } - } -} -/* -** CHECKSMTPATTACK -- check for denial-of-service attack by repetition -** -** Parameters: -** pcounter -- pointer to a counter for this command. -** maxcount -- maximum value for this counter before we -** slow down. -** cname -- command name for logging. -** e -- the current envelope. -** -** Returns: -** none. -** -** Side Effects: -** Slows down if we seem to be under attack. -*/ - -void -checksmtpattack(pcounter, maxcount, cname, e) - volatile int *pcounter; - int maxcount; - char *cname; - ENVELOPE *e; -{ - if (++(*pcounter) >= maxcount) - { - if (*pcounter == maxcount && LogLevel > 5) - { - sm_syslog(LOG_INFO, e->e_id, - "%.100s: %.40s attack?", - CurSmtpClient, cname); - } - sleep(*pcounter / maxcount); - } -} -/* -** SKIPWORD -- skip a fixed word. -** -** Parameters: -** p -- place to start looking. -** w -- word to skip. -** -** Returns: -** p following w. -** NULL on error. -** -** Side Effects: -** clobbers the p data area. -*/ - -static char * -skipword(p, w) - register char *volatile p; - char *w; -{ - register char *q; - char *firstp = p; - - /* find beginning of word */ - while (isascii(*p) && isspace(*p)) - p++; - q = p; - - /* find end of word */ - while (*p != '\0' && *p != ':' && !(isascii(*p) && isspace(*p))) - p++; - while (isascii(*p) && isspace(*p)) - *p++ = '\0'; - if (*p != ':') - { - syntax: - usrerr("501 Syntax error in parameters scanning \"%s\"", - shortenstring(firstp, MAXSHORTSTR)); - return (NULL); - } - *p++ = '\0'; - while (isascii(*p) && isspace(*p)) - p++; - - if (*p == '\0') - goto syntax; - - /* see if the input word matches desired word */ - if (strcasecmp(q, w)) - goto syntax; - - return (p); -} -/* -** MAIL_ESMTP_ARGS -- process ESMTP arguments from MAIL line -** -** Parameters: -** kp -- the parameter key. -** vp -- the value of that parameter. -** e -- the envelope. -** -** Returns: -** none. -*/ - -void -mail_esmtp_args(kp, vp, e) - char *kp; - char *vp; - ENVELOPE *e; -{ - if (strcasecmp(kp, "size") == 0) - { - if (vp == NULL) - { - usrerr("501 SIZE requires a value"); - /* NOTREACHED */ - } -# if defined(__STDC__) && !defined(BROKEN_ANSI_LIBRARY) - e->e_msgsize = strtoul(vp, (char **) NULL, 10); -# else - e->e_msgsize = strtol(vp, (char **) NULL, 10); -# endif - } - else if (strcasecmp(kp, "body") == 0) - { - if (vp == NULL) - { - usrerr("501 BODY requires a value"); - /* NOTREACHED */ - } - else if (strcasecmp(vp, "8bitmime") == 0) - { - SevenBitInput = FALSE; - } - else if (strcasecmp(vp, "7bit") == 0) - { - SevenBitInput = TRUE; - } - else - { - usrerr("501 Unknown BODY type %s", - vp); - /* NOTREACHED */ - } - e->e_bodytype = newstr(vp); - } - else if (strcasecmp(kp, "envid") == 0) - { - if (vp == NULL) - { - usrerr("501 ENVID requires a value"); - /* NOTREACHED */ - } - if (!xtextok(vp)) - { - usrerr("501 Syntax error in ENVID parameter value"); - /* NOTREACHED */ - } - if (e->e_envid != NULL) - { - usrerr("501 Duplicate ENVID parameter"); - /* NOTREACHED */ - } - e->e_envid = newstr(vp); - } - else if (strcasecmp(kp, "ret") == 0) - { - if (vp == NULL) - { - usrerr("501 RET requires a value"); - /* NOTREACHED */ - } - if (bitset(EF_RET_PARAM, e->e_flags)) - { - usrerr("501 Duplicate RET parameter"); - /* NOTREACHED */ - } - e->e_flags |= EF_RET_PARAM; - if (strcasecmp(vp, "hdrs") == 0) - e->e_flags |= EF_NO_BODY_RETN; - else if (strcasecmp(vp, "full") != 0) - { - usrerr("501 Bad argument \"%s\" to RET", vp); - /* NOTREACHED */ - } - } - else - { - usrerr("501 %s parameter unrecognized", kp); - /* NOTREACHED */ - } -} -/* -** RCPT_ESMTP_ARGS -- process ESMTP arguments from RCPT line -** -** Parameters: -** a -- the address corresponding to the To: parameter. -** kp -- the parameter key. -** vp -- the value of that parameter. -** e -- the envelope. -** -** Returns: -** none. -*/ - -void -rcpt_esmtp_args(a, kp, vp, e) - ADDRESS *a; - char *kp; - char *vp; - ENVELOPE *e; -{ - if (strcasecmp(kp, "notify") == 0) - { - char *p; - - if (vp == NULL) - { - usrerr("501 NOTIFY requires a value"); - /* NOTREACHED */ - } - a->q_flags &= ~(QPINGONSUCCESS|QPINGONFAILURE|QPINGONDELAY); - a->q_flags |= QHASNOTIFY; - if (strcasecmp(vp, "never") == 0) - return; - for (p = vp; p != NULL; vp = p) - { - p = strchr(p, ','); - if (p != NULL) - *p++ = '\0'; - if (strcasecmp(vp, "success") == 0) - a->q_flags |= QPINGONSUCCESS; - else if (strcasecmp(vp, "failure") == 0) - a->q_flags |= QPINGONFAILURE; - else if (strcasecmp(vp, "delay") == 0) - a->q_flags |= QPINGONDELAY; - else - { - usrerr("501 Bad argument \"%s\" to NOTIFY", - vp); - /* NOTREACHED */ - } - } - } - else if (strcasecmp(kp, "orcpt") == 0) - { - if (vp == NULL) - { - usrerr("501 ORCPT requires a value"); - /* NOTREACHED */ - } - if (strchr(vp, ';') == NULL || !xtextok(vp)) - { - usrerr("501 Syntax error in ORCPT parameter value"); - /* NOTREACHED */ - } - if (a->q_orcpt != NULL) - { - usrerr("501 Duplicate ORCPT parameter"); - /* NOTREACHED */ - } - a->q_orcpt = newstr(vp); - } - else - { - usrerr("501 %s parameter unrecognized", kp); - /* NOTREACHED */ - } -} -/* -** PRINTVRFYADDR -- print an entry in the verify queue -** -** Parameters: -** a -- the address to print -** last -- set if this is the last one. -** vrfy -- set if this is a VRFY command. -** -** Returns: -** none. -** -** Side Effects: -** Prints the appropriate 250 codes. -*/ - -void -printvrfyaddr(a, last, vrfy) - register ADDRESS *a; - bool last; - bool vrfy; -{ - char fmtbuf[20]; - - if (vrfy && a->q_mailer != NULL && - !bitnset(M_VRFY250, a->q_mailer->m_flags)) - strcpy(fmtbuf, "252"); - else - strcpy(fmtbuf, "250"); - fmtbuf[3] = last ? ' ' : '-'; - - if (a->q_fullname == NULL) - { - if (strchr(a->q_user, '@') == NULL) - strcpy(&fmtbuf[4], "<%s@%s>"); - else - strcpy(&fmtbuf[4], "<%s>"); - message(fmtbuf, a->q_user, MyHostName); - } - else - { - if (strchr(a->q_user, '@') == NULL) - strcpy(&fmtbuf[4], "%s <%s@%s>"); - else - strcpy(&fmtbuf[4], "%s <%s>"); - message(fmtbuf, a->q_fullname, a->q_user, MyHostName); - } -} -/* -** RUNINCHILD -- return twice -- once in the child, then in the parent again -** -** Parameters: -** label -- a string used in error messages -** -** Returns: -** zero in the child -** one in the parent -** -** Side Effects: -** none. -*/ - -int -runinchild(label, e) - char *label; - register ENVELOPE *e; -{ - pid_t childpid; - - if (!OneXact) - { - /* - ** Disable child process reaping, in case ETRN has preceeded - ** MAIL command, and then fork. - */ - - (void) blocksignal(SIGCHLD); - - childpid = dofork(); - if (childpid < 0) - { - syserr("451 %s: cannot fork", label); - (void) releasesignal(SIGCHLD); - return (1); - } - if (childpid > 0) - { - auto int st; - - /* parent -- wait for child to complete */ - sm_setproctitle(TRUE, "server %s child wait", CurSmtpClient); - st = waitfor(childpid); - if (st == -1) - syserr("451 %s: lost child", label); - else if (!WIFEXITED(st)) - syserr("451 %s: died on signal %d", - label, st & 0177); - - /* if we exited on a QUIT command, complete the process */ - if (WEXITSTATUS(st) == EX_QUIT) - { - disconnect(1, e); - finis(TRUE, ExitStat); - } - - /* restore the child signal */ - (void) releasesignal(SIGCHLD); - - return (1); - } - else - { - /* child */ - InChild = TRUE; - QuickAbort = FALSE; - clearenvelope(e, FALSE); - (void) setsignal(SIGCHLD, SIG_DFL); - (void) releasesignal(SIGCHLD); - } - } - return (0); -} - -# endif /* SMTP */ -/* -** HELP -- implement the HELP command. -** -** Parameters: -** topic -- the topic we want help for. -** -** Returns: -** none. -** -** Side Effects: -** outputs the help file to message output. -*/ - -void -help(topic) - char *topic; -{ - register FILE *hf; - int len; - bool noinfo; - int sff = SFF_OPENASROOT|SFF_REGONLY; - char buf[MAXLINE]; - extern char Version[]; - - if (DontLockReadFiles) - sff |= SFF_NOLOCK; - if (!bitset(DBS_HELPFILEINUNSAFEDIRPATH, DontBlameSendmail)) - sff |= SFF_SAFEDIRPATH; - - if (HelpFile == NULL || - (hf = safefopen(HelpFile, O_RDONLY, 0444, sff)) == NULL) - { - /* no help */ - errno = 0; - message("502 Sendmail %s -- HELP not implemented", Version); - return; - } - - if (topic == NULL || *topic == '\0') - { - topic = "smtp"; - message("214-This is Sendmail version %s", Version); - noinfo = FALSE; - } - else - { - makelower(topic); - noinfo = TRUE; - } - - len = strlen(topic); - - while (fgets(buf, sizeof buf, hf) != NULL) - { - if (strncmp(buf, topic, len) == 0) - { - register char *p; - - p = strchr(buf, '\t'); - if (p == NULL) - p = buf; - else - p++; - fixcrlf(p, TRUE); - message("214-%s", p); - noinfo = FALSE; - } - } - - if (noinfo) - message("504 HELP topic \"%.10s\" unknown", topic); - else - message("214 End of HELP info"); - (void) fclose(hf); -} diff --git a/src/stab.c b/src/stab.c deleted file mode 100644 index 37b87a3..0000000 --- a/src/stab.c +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)stab.c 8.19 (Berkeley) 5/19/1998"; -#endif /* not lint */ - -# include "sendmail.h" - -/* -** STAB -- manage the symbol table -** -** Parameters: -** name -- the name to be looked up or inserted. -** type -- the type of symbol. -** op -- what to do: -** ST_ENTER -- enter the name if not -** already present. -** ST_FIND -- find it only. -** -** Returns: -** pointer to a STAB entry for this name. -** NULL if not found and not entered. -** -** Side Effects: -** can update the symbol table. -*/ - -# define STABSIZE 2003 - -static STAB *SymTab[STABSIZE]; - -STAB * -stab(name, type, op) - char *name; - int type; - int op; -{ - register STAB *s; - register STAB **ps; - register int hfunc; - register char *p; - int len; - extern char lower __P((char)); - - if (tTd(36, 5)) - printf("STAB: %s %d ", name, type); - - /* - ** Compute the hashing function - */ - - hfunc = type; - for (p = name; *p != '\0'; p++) - hfunc = ((hfunc << 1) ^ (lower(*p) & 0377)) % STABSIZE; - - if (tTd(36, 9)) - printf("(hfunc=%d) ", hfunc); - - ps = &SymTab[hfunc]; - if (type == ST_MACRO || type == ST_RULESET) - { - while ((s = *ps) != NULL && - (s->s_type != type || strcmp(name, s->s_name))) - ps = &s->s_next; - } - else - { - while ((s = *ps) != NULL && - (s->s_type != type || strcasecmp(name, s->s_name))) - ps = &s->s_next; - } - - /* - ** Dispose of the entry. - */ - - if (s != NULL || op == ST_FIND) - { - if (tTd(36, 5)) - { - if (s == NULL) - printf("not found\n"); - else - { - long *lp = (long *) s->s_class; - - printf("type %d val %lx %lx %lx %lx\n", - s->s_type, lp[0], lp[1], lp[2], lp[3]); - } - } - return (s); - } - - /* - ** Make a new entry and link it in. - */ - - if (tTd(36, 5)) - printf("entered\n"); - - /* determine size of new entry */ -#if _FFR_MEMORY_MISER - switch (type) - { - case ST_CLASS: - len = sizeof s->s_class; - break; - - case ST_ADDRESS: - len = sizeof s->s_address; - break; - - case ST_MAILER: - len = sizeof s->s_mailer; - - case ST_ALIAS: - len = sizeof s->s_alias; - break; - - case ST_MAPCLASS: - len = sizeof s->s_mapclass; - break; - - case ST_MAP: - len = sizeof s->s_map; - break; - - case ST_HOSTSIG: - len = sizeof s->s_hostsig; - break; - - case ST_NAMECANON: - len = sizeof s->s_namecanon; - break; - - case ST_MACRO: - len = sizeof s->s_macro; - break; - - case ST_RULESET: - len = sizeof s->s_ruleset; - break; - - case ST_SERVICE: - len = sizeof s->s_service; - break; - - case ST_HEADER: - len = sizeof s->s_header; - break; - - default: - if (type >= ST_MCI) - len = sizeof s->s_mci; - else - { - syserr("stab: unknown symbol type %d", type); - len = sizeof s->s_value; - } - break; - } - len += sizeof *s - sizeof s->s_value; -#else - len = sizeof *s; -#endif - - /* make new entry */ - s = (STAB *) xalloc(len); - bzero((char *) s, len); - s->s_name = newstr(name); - s->s_type = type; - s->s_len = len; - - /* link it in */ - *ps = s; - - return (s); -} -/* -** STABAPPLY -- apply function to all stab entries -** -** Parameters: -** func -- the function to apply. It will be given one -** parameter (the stab entry). -** arg -- an arbitrary argument, passed to func. -** -** Returns: -** none. -*/ - -void -stabapply(func, arg) - void (*func)__P((STAB *, int)); - int arg; -{ - register STAB **shead; - register STAB *s; - - for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++) - { - for (s = *shead; s != NULL; s = s->s_next) - { - if (tTd(36, 90)) - printf("stabapply: trying %d/%s\n", - s->s_type, s->s_name); - func(s, arg); - } - } -} diff --git a/src/stats.c b/src/stats.c deleted file mode 100644 index b1162ff..0000000 --- a/src/stats.c +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)stats.c 8.22 (Berkeley) 5/19/1998"; -#endif /* not lint */ - -# include "sendmail.h" -# include "mailstats.h" - -struct statistics Stat; - -bool GotStats = FALSE; /* set when we have stats to merge */ - -#define ONE_K 1000 /* one thousand (twenty-four?) */ -#define KBYTES(x) (((x) + (ONE_K - 1)) / ONE_K) -/* -** MARKSTATS -- mark statistics -*/ - -void -markstats(e, to, reject) - register ENVELOPE *e; - register ADDRESS *to; - bool reject; -{ - if (reject == TRUE) - { - if (e->e_from.q_mailer != NULL) - { - if (bitset(EF_DISCARD, e->e_flags)) - Stat.stat_nd[e->e_from.q_mailer->m_mno]++; - else - Stat.stat_nr[e->e_from.q_mailer->m_mno]++; - } - } - else if (to == NULL) - { - if (e->e_from.q_mailer != NULL) - { - Stat.stat_nf[e->e_from.q_mailer->m_mno]++; - Stat.stat_bf[e->e_from.q_mailer->m_mno] += - KBYTES(e->e_msgsize); - } - } - else - { - Stat.stat_nt[to->q_mailer->m_mno]++; - Stat.stat_bt[to->q_mailer->m_mno] += KBYTES(e->e_msgsize); - } - GotStats = TRUE; -} -/* -** POSTSTATS -- post statistics in the statistics file -** -** Parameters: -** sfile -- the name of the statistics file. -** -** Returns: -** none. -** -** Side Effects: -** merges the Stat structure with the sfile file. -*/ - -void -poststats(sfile) - char *sfile; -{ - register int fd; - int sff = SFF_REGONLY|SFF_OPENASROOT; - struct statistics stat; - extern off_t lseek(); - - if (sfile == NULL || !GotStats) - return; - - (void) time(&Stat.stat_itime); - Stat.stat_size = sizeof Stat; - Stat.stat_magic = STAT_MAGIC; - Stat.stat_version = STAT_VERSION; - - if (!bitset(DBS_WRITESTATSTOSYMLINK, DontBlameSendmail)) - sff |= SFF_NOSLINK; - if (!bitset(DBS_WRITESTATSTOHARDLINK, DontBlameSendmail)) - sff |= SFF_NOHLINK; - - fd = safeopen(sfile, O_RDWR, 0644, sff); - if (fd < 0) - { - if (LogLevel > 12) - sm_syslog(LOG_INFO, NOQID, "poststats: %s: %s", - sfile, errstring(errno)); - errno = 0; - return; - } - if (read(fd, (char *) &stat, sizeof stat) == sizeof stat && - stat.stat_size == sizeof stat && - stat.stat_magic == Stat.stat_magic && - stat.stat_version == Stat.stat_version) - { - /* merge current statistics into statfile */ - register int i; - - for (i = 0; i < MAXMAILERS; i++) - { - stat.stat_nf[i] += Stat.stat_nf[i]; - stat.stat_bf[i] += Stat.stat_bf[i]; - stat.stat_nt[i] += Stat.stat_nt[i]; - stat.stat_bt[i] += Stat.stat_bt[i]; - stat.stat_nr[i] += Stat.stat_nr[i]; - stat.stat_nd[i] += Stat.stat_nd[i]; - } - } - else - bcopy((char *) &Stat, (char *) &stat, sizeof stat); - - /* write out results */ - (void) lseek(fd, (off_t) 0, 0); - (void) write(fd, (char *) &stat, sizeof stat); - (void) close(fd); - - /* clear the structure to avoid future disappointment */ - bzero(&Stat, sizeof stat); - GotStats = FALSE; -} diff --git a/src/sysexits.c b/src/sysexits.c deleted file mode 100644 index c7934c7..0000000 --- a/src/sysexits.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)sysexits.c 8.13 (Berkeley) 5/24/1998"; -#endif /* not lint */ - -#include "sendmail.h" - -/* -** SYSEXITS.C -- error messages corresponding to sysexits.h -** -** If the first character of the string is a colon, interpolate -** the current errno after the rest of the string. -*/ - -char *SysExMsg[] = -{ - /* 64 USAGE */ " 500 Bad usage", - /* 65 DATAERR */ " 501 Data format error", - /* 66 NOINPUT */ ":550 Cannot open input", - /* 67 NOUSER */ " 550 User unknown", - /* 68 NOHOST */ " 550 Host unknown", - /* 69 UNAVAILABLE */ " 554 Service unavailable", - /* 70 SOFTWARE */ ":554 Internal error", - /* 71 OSERR */ ":451 Operating system error", - /* 72 OSFILE */ ":554 System file missing", - /* 73 CANTCREAT */ ":550 Can't create output", - /* 74 IOERR */ ":451 I/O error", - /* 75 TEMPFAIL */ " 250 Deferred", - /* 76 PROTOCOL */ " 554 Remote protocol error", - /* 77 NOPERM */ ":550 Insufficient permission", - /* 78 CONFIG */ " 554 Local configuration error", -}; - -int N_SysEx = sizeof(SysExMsg) / sizeof(SysExMsg[0]); -/* -** DSNTOEXITSTAT -- convert DSN-style error code to EX_ style. -** -** Parameters: -** dsncode -- the text of the DSN-style code. -** -** Returns: -** The corresponding exit status. -*/ - -int -dsntoexitstat(dsncode) - char *dsncode; -{ - int code2, code3; - - /* first the easy cases.... */ - if (*dsncode == '2') - return EX_OK; - if (*dsncode == '4') - return EX_TEMPFAIL; - - /* now decode the other two field parts */ - if (*++dsncode == '.') - dsncode++; - code2 = atoi(dsncode); - while (*dsncode != '\0' && *dsncode != '.') - dsncode++; - if (*dsncode != '\0') - dsncode++; - code3 = atoi(dsncode); - - /* and do a nested switch to work them out */ - switch (code2) - { - case 0: /* Other or Undefined status */ - return EX_UNAVAILABLE; - - case 1: /* Address Status */ - switch (code3) - { - case 0: /* Other Address Status */ - return EX_DATAERR; - - case 1: /* Bad destination mailbox address */ - case 6: /* Mailbox has moved, No forwarding address */ - return EX_NOUSER; - - case 2: /* Bad destination system address */ - case 8: /* Bad senders system address */ - return EX_NOHOST; - - case 3: /* Bad destination mailbox address syntax */ - case 7: /* Bad senders mailbox address syntax */ - return EX_USAGE; - - case 4: /* Destination mailbox address ambiguous */ - return EX_UNAVAILABLE; - - case 5: /* Destination address valid */ - return EX_OK; - } - break; - - case 2: /* Mailbox Status */ - switch (code3) - { - case 0: /* Other or Undefined mailbox status */ - case 1: /* Mailbox disabled, not acccepting messages */ - case 2: /* Mailbox full */ - case 4: /* Mailing list expansion problem */ - return EX_UNAVAILABLE; - - case 3: /* Message length exceeds administrative lim */ - return EX_DATAERR; - } - break; - - case 3: /* System Status */ - return EX_OSERR; - - case 4: /* Network and Routing Status */ - switch (code3) - { - case 0: /* Other or undefined network or routing stat */ - return EX_IOERR; - - case 1: /* No answer from host */ - case 3: /* Routing server failure */ - case 5: /* Network congestion */ - return EX_TEMPFAIL; - - case 2: /* Bad connection */ - return EX_IOERR; - - case 4: /* Unable to route */ - return EX_PROTOCOL; - - case 6: /* Routing loop detected */ - return EX_CONFIG; - - case 7: /* Delivery time expired */ - return EX_UNAVAILABLE; - } - break; - - case 5: /* Protocol Status */ - return EX_PROTOCOL; - - case 6: /* Message Content or Media Status */ - return EX_UNAVAILABLE; - - case 7: /* Security Status */ - return EX_DATAERR; - } - return EX_CONFIG; -} diff --git a/src/sysexits.h b/src/sysexits.h deleted file mode 100644 index 464cb11..0000000 --- a/src/sysexits.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (c) 1987, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)sysexits.h 8.1 (Berkeley) 6/2/93 - */ - -#ifndef _SYSEXITS_H_ -#define _SYSEXITS_H_ - -/* - * SYSEXITS.H -- Exit status codes for system programs. - * - * This include file attempts to categorize possible error - * exit statuses for system programs, notably delivermail - * and the Berkeley network. - * - * Error numbers begin at EX__BASE to reduce the possibility of - * clashing with other exit statuses that random programs may - * already return. The meaning of the codes is approximately - * as follows: - * - * EX_USAGE -- The command was used incorrectly, e.g., with - * the wrong number of arguments, a bad flag, a bad - * syntax in a parameter, or whatever. - * EX_DATAERR -- The input data was incorrect in some way. - * This should only be used for user's data & not - * system files. - * EX_NOINPUT -- An input file (not a system file) did not - * exist or was not readable. This could also include - * errors like "No message" to a mailer (if it cared - * to catch it). - * EX_NOUSER -- The user specified did not exist. This might - * be used for mail addresses or remote logins. - * EX_NOHOST -- The host specified did not exist. This is used - * in mail addresses or network requests. - * EX_UNAVAILABLE -- A service is unavailable. This can occur - * if a support program or file does not exist. This - * can also be used as a catchall message when something - * you wanted to do doesn't work, but you don't know - * why. - * EX_SOFTWARE -- An internal software error has been detected. - * This should be limited to non-operating system related - * errors as possible. - * EX_OSERR -- An operating system error has been detected. - * This is intended to be used for such things as "cannot - * fork", "cannot create pipe", or the like. It includes - * things like getuid returning a user that does not - * exist in the passwd file. - * EX_OSFILE -- Some system file (e.g., /etc/passwd, /etc/utmp, - * etc.) does not exist, cannot be opened, or has some - * sort of error (e.g., syntax error). - * EX_CANTCREAT -- A (user specified) output file cannot be - * created. - * EX_IOERR -- An error occurred while doing I/O on some file. - * EX_TEMPFAIL -- temporary failure, indicating something that - * is not really an error. In sendmail, this means - * that a mailer (e.g.) could not create a connection, - * and the request should be reattempted later. - * EX_PROTOCOL -- the remote system returned something that - * was "not possible" during a protocol exchange. - * EX_NOPERM -- You did not have sufficient permission to - * perform the operation. This is not intended for - * file system problems, which should use NOINPUT or - * CANTCREAT, but rather for higher level permissions. - */ - -#define EX_OK 0 /* successful termination */ - -#define EX__BASE 64 /* base value for error messages */ - -#define EX_USAGE 64 /* command line usage error */ -#define EX_DATAERR 65 /* data format error */ -#define EX_NOINPUT 66 /* cannot open input */ -#define EX_NOUSER 67 /* addressee unknown */ -#define EX_NOHOST 68 /* host name unknown */ -#define EX_UNAVAILABLE 69 /* service unavailable */ -#define EX_SOFTWARE 70 /* internal software error */ -#define EX_OSERR 71 /* system error (e.g., can't fork) */ -#define EX_OSFILE 72 /* critical OS file missing */ -#define EX_CANTCREAT 73 /* can't create (user) output file */ -#define EX_IOERR 74 /* input/output error */ -#define EX_TEMPFAIL 75 /* temp failure; user is invited to retry */ -#define EX_PROTOCOL 76 /* remote error in protocol */ -#define EX_NOPERM 77 /* permission denied */ -#define EX_CONFIG 78 /* configuration error */ - -#define EX__MAX 78 /* maximum listed value */ - -#endif /* !_SYSEXITS_H_ */ diff --git a/src/trace.c b/src/trace.c deleted file mode 100644 index 5ab6032..0000000 --- a/src/trace.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)trace.c 8.12 (Berkeley) 5/19/1998"; -#endif /* not lint */ - -# include "sendmail.h" - -/* -** TtSETUP -- set up for trace package. -** -** Parameters: -** vect -- pointer to trace vector. -** size -- number of flags in trace vector. -** defflags -- flags to set if no value given. -** -** Returns: -** none -** -** Side Effects: -** environment is set up. -*/ - -u_char *tTvect; -int tTsize; -static char *DefFlags; - -void -tTsetup(vect, size, defflags) - u_char *vect; - int size; - char *defflags; -{ - tTvect = vect; - tTsize = size; - DefFlags = defflags; -} -/* -** TtFLAG -- process an external trace flag description. -** -** Parameters: -** s -- the trace flag. -** -** Returns: -** none. -** -** Side Effects: -** sets/clears trace flags. -*/ - -void -tTflag(s) - register char *s; -{ - unsigned int first, last; - register unsigned int i; - - if (*s == '\0') - s = DefFlags; - - for (;;) - { - /* find first flag to set */ - i = 0; - while (isascii(*s) && isdigit(*s)) - i = i * 10 + (*s++ - '0'); - first = i; - - /* find last flag to set */ - if (*s == '-') - { - i = 0; - while (isascii(*++s) && isdigit(*s)) - i = i * 10 + (*s - '0'); - } - last = i; - - /* find the level to set it to */ - i = 1; - if (*s == '.') - { - i = 0; - while (isascii(*++s) && isdigit(*s)) - i = i * 10 + (*s - '0'); - } - - /* clean up args */ - if (first >= tTsize) - first = tTsize - 1; - if (last >= tTsize) - last = tTsize - 1; - - /* set the flags */ - while (first <= last) - tTvect[first++] = i; - - /* more arguments? */ - if (*s++ == '\0') - return; - } -} diff --git a/src/udb.c b/src/udb.c deleted file mode 100644 index 96c6513..0000000 --- a/src/udb.c +++ /dev/null @@ -1,1335 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#include "sendmail.h" - -#ifndef lint -#if USERDB -static char sccsid [] = "@(#)udb.c 8.71 (Berkeley) 1/17/1999 (with USERDB)"; -#else -static char sccsid [] = "@(#)udb.c 8.71 (Berkeley) 1/17/1999 (without USERDB)"; -#endif -#endif - -#if USERDB - -#include <errno.h> - -#ifdef NEWDB -# include <db.h> -# ifndef DB_VERSION_MAJOR -# define DB_VERSION_MAJOR 1 -# endif -#else -# define DBT struct _data_base_thang_ -DBT -{ - void *data; /* pointer to data */ - size_t size; /* length of data */ -}; -#endif - -/* -** UDB.C -- interface between sendmail and Berkeley User Data Base. -** -** This depends on the 4.4BSD db package. -*/ - - -struct udbent -{ - char *udb_spec; /* string version of spec */ - int udb_type; /* type of entry */ - pid_t udb_pid; /* PID of process which opened db */ - char *udb_default; /* default host for outgoing mail */ - union - { - /* type UE_REMOTE -- do remote call for lookup */ - struct - { - struct sockaddr_in _udb_addr; /* address */ - int _udb_timeout; /* timeout */ - } udb_remote; -#define udb_addr udb_u.udb_remote._udb_addr -#define udb_timeout udb_u.udb_remote._udb_timeout - - /* type UE_FORWARD -- forward message to remote */ - struct - { - char *_udb_fwdhost; /* name of forward host */ - } udb_forward; -#define udb_fwdhost udb_u.udb_forward._udb_fwdhost - -#ifdef NEWDB - /* type UE_FETCH -- lookup in local database */ - struct - { - char *_udb_dbname; /* pathname of database */ - DB *_udb_dbp; /* open database ptr */ - } udb_lookup; -#define udb_dbname udb_u.udb_lookup._udb_dbname -#define udb_dbp udb_u.udb_lookup._udb_dbp -#endif - } udb_u; -}; - -#define UDB_EOLIST 0 /* end of list */ -#define UDB_SKIP 1 /* skip this entry */ -#define UDB_REMOTE 2 /* look up in remote database */ -#define UDB_DBFETCH 3 /* look up in local database */ -#define UDB_FORWARD 4 /* forward to remote host */ -#define UDB_HESIOD 5 /* look up via hesiod */ - -#define MAXUDBENT 10 /* maximum number of UDB entries */ - - -struct udb_option -{ - char *name; - char *val; -}; - -#ifdef HESIOD -extern int hes_udb_get __P((DBT *, DBT *)); -#endif -extern int _udbx_init __P((ENVELOPE *)); -/* -** UDBEXPAND -- look up user in database and expand -** -** Parameters: -** a -- address to expand. -** sendq -- pointer to head of sendq to put the expansions in. -** aliaslevel -- the current alias nesting depth. -** e -- the current envelope. -** -** Returns: -** EX_TEMPFAIL -- if something "odd" happened -- probably due -** to accessing a file on an NFS server that is down. -** EX_OK -- otherwise. -** -** Side Effects: -** Modifies sendq. -*/ - -int UdbPort = 1616; -int UdbTimeout = 10; - -struct udbent UdbEnts[MAXUDBENT + 1]; -int UdbSock = -1; -bool UdbInitialized = FALSE; - -int -udbexpand(a, sendq, aliaslevel, e) - register ADDRESS *a; - ADDRESS **sendq; - int aliaslevel; - register ENVELOPE *e; -{ - int i; - DBT key; - DBT info; - bool breakout; - register struct udbent *up; - int keylen; - int naddrs; - char *user; - char keybuf[MAXKEY]; - - bzero(&key, sizeof key); - bzero(&info, sizeof info); - - if (tTd(28, 1)) - printf("udbexpand(%s)\n", a->q_paddr); - - /* make certain we are supposed to send to this address */ - if (bitset(QDONTSEND|QVERIFIED, a->q_flags)) - return EX_OK; - e->e_to = a->q_paddr; - - /* on first call, locate the database */ - if (!UdbInitialized) - { - if (_udbx_init(e) == EX_TEMPFAIL) - return EX_TEMPFAIL; - } - - /* short circuit the process if no chance of a match */ - if (UdbSpec == NULL || UdbSpec[0] == '\0') - return EX_OK; - - /* extract user to do userdb matching on */ - user = a->q_user; - - /* short circuit name begins with '\\' since it can't possibly match */ - /* (might want to treat this as unquoted instead) */ - if (user[0] == '\\') - return EX_OK; - - /* if name is too long, assume it won't match */ - if (strlen(user) > (SIZE_T) sizeof keybuf - 12) - return EX_OK; - - /* if name begins with a colon, it indicates our metadata */ - if (user[0] == ':') - return EX_OK; - - /* build actual database key */ - (void) strcpy(keybuf, user); - (void) strcat(keybuf, ":maildrop"); - keylen = strlen(keybuf); - - breakout = FALSE; - for (up = UdbEnts; !breakout; up++) - { - char *user; - int usersize; - int userleft; - char userbuf[MEMCHUNKSIZE]; -#if defined(HESIOD) && defined(HES_GETMAILHOST) - char pobuf[MAXNAME]; -#endif -#if defined(NEWDB) && DB_VERSION_MAJOR > 1 - DBC *dbc = NULL; -#endif - - user = userbuf; - userbuf[0] = '\0'; - usersize = sizeof userbuf; - userleft = sizeof userbuf - 1; - - /* - ** Select action based on entry type. - ** - ** On dropping out of this switch, "class" should - ** explain the type of the data, and "user" should - ** contain the user information. - */ - - switch (up->udb_type) - { -#ifdef NEWDB - case UDB_DBFETCH: - key.data = keybuf; - key.size = keylen; - if (tTd(28, 80)) - printf("udbexpand: trying %s (%d) via db\n", - keybuf, keylen); -#if DB_VERSION_MAJOR < 2 - i = (*up->udb_dbp->seq)(up->udb_dbp, &key, &info, R_CURSOR); -#else - i = 0; - if (dbc == NULL && -# if DB_VERSION_MAJOR > 2 || DB_VERSION_MINOR >=6 - (errno = (*up->udb_dbp->cursor)(up->udb_dbp, - NULL, &dbc, 0)) != 0) -# else - (errno = (*up->udb_dbp->cursor)(up->udb_dbp, - NULL, &dbc)) != 0) -# endif - i = -1; - if (i != 0 || dbc == NULL || - (errno = dbc->c_get(dbc, &key, - &info, DB_SET)) != 0) - i = 1; -#endif - if (i > 0 || info.size <= 0) - { - if (tTd(28, 2)) - printf("udbexpand: no match on %s (%d)\n", - keybuf, keylen); -#if DB_VERSION_MAJOR > 1 - if (dbc != NULL) - { - (void) dbc->c_close(dbc); - dbc = NULL; - } -#endif - break; - } - if (tTd(28, 80)) - printf("udbexpand: match %.*s: %.*s\n", - (int) key.size, (char *) key.data, - (int) info.size, (char *) info.data); - - a->q_flags &= ~QSELFREF; - while (i == 0 && key.size == keylen && - bcmp(key.data, keybuf, keylen) == 0) - { - char *p; - - if (bitset(EF_VRFYONLY, e->e_flags)) - { - a->q_flags |= QVERIFIED; -#if DB_VERSION_MAJOR > 1 - if (dbc != NULL) - { - (void) dbc->c_close(dbc); - dbc = NULL; - } -#endif - return EX_OK; - } - - breakout = TRUE; - if (info.size >= userleft - 1) - { - char *nuser; - int size = MEMCHUNKSIZE; - - if (info.size > MEMCHUNKSIZE) - size = info.size; - nuser = xalloc(usersize + size); - - bcopy(user, nuser, usersize); - if (user != userbuf) - free(user); - user = nuser; - usersize += size; - userleft += size; - } - p = &user[strlen(user)]; - if (p != user) - { - *p++ = ','; - userleft--; - } - bcopy(info.data, p, info.size); - p[info.size] = '\0'; - userleft -= info.size; - - /* get the next record */ -#if DB_VERSION_MAJOR < 2 - i = (*up->udb_dbp->seq)(up->udb_dbp, &key, &info, R_NEXT); -#else - i = 0; - if ((errno = dbc->c_get(dbc, &key, - &info, DB_NEXT)) != 0) - i = 1; -#endif - } - -#if DB_VERSION_MAJOR > 1 - if (dbc != NULL) - { - (void) dbc->c_close(dbc); - dbc = NULL; - } -#endif - - /* if nothing ever matched, try next database */ - if (!breakout) - break; - - message("expanded to %s", user); - if (LogLevel >= 10) - sm_syslog(LOG_INFO, e->e_id, - "expand %.100s => %s", - e->e_to, - shortenstring(user, MAXSHORTSTR)); - naddrs = sendtolist(user, a, sendq, aliaslevel + 1, e); - if (naddrs > 0 && !bitset(QSELFREF, a->q_flags)) - { - if (tTd(28, 5)) - { - printf("udbexpand: QDONTSEND "); - printaddr(a, FALSE); - } - a->q_flags |= QDONTSEND; - } - if (i < 0) - { - syserr("udbexpand: db-get %.*s stat %d", - (int) key.size, (char *) key.data, i); - return EX_TEMPFAIL; - } - - /* - ** If this address has a -request address, reflect - ** it into the envelope. - */ - - bzero(&key, sizeof key); - bzero(&info, sizeof info); - (void) strcpy(keybuf, a->q_user); - (void) strcat(keybuf, ":mailsender"); - keylen = strlen(keybuf); - key.data = keybuf; - key.size = keylen; - -#if DB_VERSION_MAJOR < 2 - i = (*up->udb_dbp->get)(up->udb_dbp, &key, &info, 0); -#else - i = errno = (*up->udb_dbp->get)(up->udb_dbp, NULL, - &key, &info, 0); -#endif - if (i != 0 || info.size <= 0) - break; - a->q_owner = xalloc(info.size + 1); - bcopy(info.data, a->q_owner, info.size); - a->q_owner[info.size] = '\0'; - - /* announce delivery; NORECEIPT bit set later */ - if (e->e_xfp != NULL) - { - fprintf(e->e_xfp, - "Message delivered to mailing list %s\n", - a->q_paddr); - } - e->e_flags |= EF_SENDRECEIPT; - a->q_flags |= QDELIVERED|QEXPANDED; - break; -#endif - -#ifdef HESIOD - case UDB_HESIOD: - key.data = keybuf; - key.size = keylen; - if (tTd(28, 80)) - printf("udbexpand: trying %s (%d) via hesiod\n", - keybuf, keylen); - /* look up the key via hesiod */ - i = hes_udb_get(&key, &info); - if (i < 0) - { - syserr("udbexpand: hesiod-get %.*s stat %d", - (int) key.size, (char *) key.data, i); - return EX_TEMPFAIL; - } - else if (i > 0 || info.size <= 0) - { -#if HES_GETMAILHOST - struct hes_postoffice *hp; -#endif - - if (tTd(28, 2)) - printf("udbexpand: no match on %s (%d)\n", - (char *) keybuf, (int) keylen); -#if HES_GETMAILHOST - if (tTd(28, 8)) - printf(" ... trying hes_getmailhost(%s)\n", - a->q_user); - hp = hes_getmailhost(a->q_user); - if (hp == NULL) - { - if (hes_error() == HES_ER_NET) - { - syserr("udbexpand: hesiod-getmail %s stat %d", - a->q_user, hes_error()); - return EX_TEMPFAIL; - } - if (tTd(28, 2)) - printf("hes_getmailhost(%s): %d\n", - a->q_user, hes_error()); - break; - } - if (strlen(hp->po_name) + strlen(hp->po_host) > - sizeof pobuf - 2) - { - if (tTd(28, 2)) - printf("hes_getmailhost(%s): expansion too long: %.30s@%.30s\n", - a->q_user, - hp->po_name, - hp->po_host); - break; - } - info.data = pobuf; - snprintf(pobuf, sizeof pobuf, "%s@%s", - hp->po_name, hp->po_host); - info.size = strlen(info.data); -#else - break; -#endif - } - if (tTd(28, 80)) - printf("udbexpand: match %.*s: %.*s\n", - (int) key.size, (char *) key.data, - (int) info.size, (char *) info.data); - a->q_flags &= ~QSELFREF; - - if (bitset(EF_VRFYONLY, e->e_flags)) - { - a->q_flags |= QVERIFIED; - return EX_OK; - } - - breakout = TRUE; - if (info.size >= usersize) - user = xalloc(info.size + 1); - bcopy(info.data, user, info.size); - user[info.size] = '\0'; - - message("hesioded to %s", user); - if (LogLevel >= 10) - sm_syslog(LOG_INFO, e->e_id, - "hesiod %.100s => %s", - e->e_to, - shortenstring(user, MAXSHORTSTR)); - naddrs = sendtolist(user, a, sendq, aliaslevel + 1, e); - - if (naddrs > 0 && !bitset(QSELFREF, a->q_flags)) - { - if (tTd(28, 5)) - { - printf("udbexpand: QDONTSEND "); - printaddr(a, FALSE); - } - a->q_flags |= QDONTSEND; - } - - /* - ** If this address has a -request address, reflect - ** it into the envelope. - */ - - (void) strcpy(keybuf, a->q_user); - (void) strcat(keybuf, ":mailsender"); - keylen = strlen(keybuf); - key.data = keybuf; - key.size = keylen; - i = hes_udb_get(&key, &info); - if (i != 0 || info.size <= 0) - break; - a->q_owner = xalloc(info.size + 1); - bcopy(info.data, a->q_owner, info.size); - a->q_owner[info.size] = '\0'; - break; -#endif /* HESIOD */ - - case UDB_REMOTE: - /* not yet implemented */ - break; - - case UDB_FORWARD: - if (bitset(EF_VRFYONLY, e->e_flags)) - return EX_OK; - i = strlen(up->udb_fwdhost) + strlen(a->q_user) + 1; - if (i >= usersize) - { - usersize = i + 1; - user = xalloc(usersize); - } - (void) snprintf(user, usersize, "%s@%s", - a->q_user, up->udb_fwdhost); - message("expanded to %s", user); - a->q_flags &= ~QSELFREF; - naddrs = sendtolist(user, a, sendq, aliaslevel + 1, e); - if (naddrs > 0 && !bitset(QSELFREF, a->q_flags)) - { - if (tTd(28, 5)) - { - printf("udbexpand: QDONTSEND "); - printaddr(a, FALSE); - } - a->q_flags |= QDONTSEND; - } - breakout = TRUE; - break; - - case UDB_EOLIST: - breakout = TRUE; - break; - - default: - /* unknown entry type */ - break; - } - if (user != userbuf) - free(user); - } - return EX_OK; -} -/* -** UDBSENDER -- return canonical external name of sender, given local name -** -** Parameters: -** sender -- the name of the sender on the local machine. -** -** Returns: -** The external name for this sender, if derivable from the -** database. -** NULL -- if nothing is changed from the database. -** -** Side Effects: -** none. -*/ - -char * -udbsender(sender) - char *sender; -{ - extern char *udbmatch __P((char *, char *)); - - return udbmatch(sender, "mailname"); -} - - -char * -udbmatch(user, field) - char *user; - char *field; -{ - register char *p; - register struct udbent *up; - int i; - int keylen; - DBT key, info; - char keybuf[MAXKEY]; - - if (tTd(28, 1)) - printf("udbmatch(%s, %s)\n", user, field); - - if (!UdbInitialized) - { - if (_udbx_init(CurEnv) == EX_TEMPFAIL) - return NULL; - } - - /* short circuit if no spec */ - if (UdbSpec == NULL || UdbSpec[0] == '\0') - return NULL; - - /* short circuit name begins with '\\' since it can't possibly match */ - if (user[0] == '\\') - return NULL; - - /* long names can never match and are a pain to deal with */ - i = strlen(field); - if (i < sizeof "maildrop") - i = sizeof "maildrop"; - if ((strlen(user) + i) > sizeof keybuf - 4) - return NULL; - - /* names beginning with colons indicate metadata */ - if (user[0] == ':') - return NULL; - - /* build database key */ - (void) strcpy(keybuf, user); - (void) strcat(keybuf, ":"); - (void) strcat(keybuf, field); - keylen = strlen(keybuf); - - for (up = UdbEnts; up->udb_type != UDB_EOLIST; up++) - { - /* - ** Select action based on entry type. - */ - - switch (up->udb_type) - { -#ifdef NEWDB - case UDB_DBFETCH: - bzero(&key, sizeof key); - bzero(&info, sizeof info); - key.data = keybuf; - key.size = keylen; -#if DB_VERSION_MAJOR < 2 - i = (*up->udb_dbp->get)(up->udb_dbp, &key, &info, 0); -#else - i = errno = (*up->udb_dbp->get)(up->udb_dbp, NULL, - &key, &info, 0); -#endif - if (i != 0 || info.size <= 0) - { - if (tTd(28, 2)) - printf("udbmatch: no match on %s (%d) via db\n", - keybuf, keylen); - continue; - } - - p = xalloc(info.size + 1); - bcopy(info.data, p, info.size); - p[info.size] = '\0'; - if (tTd(28, 1)) - printf("udbmatch ==> %s\n", p); - return p; -#endif - -#ifdef HESIOD - case UDB_HESIOD: - key.data = keybuf; - key.size = keylen; - i = hes_udb_get(&key, &info); - if (i != 0 || info.size <= 0) - { - if (tTd(28, 2)) - printf("udbmatch: no match on %s (%d) via hesiod\n", - keybuf, keylen); - continue; - } - - p = xalloc(info.size + 1); - bcopy(info.data, p, info.size); - p[info.size] = '\0'; - if (tTd(28, 1)) - printf("udbmatch ==> %s\n", p); - return p; -#endif /* HESIOD */ - } - } - - if (strcmp(field, "mailname") != 0) - return NULL; - - /* - ** Nothing yet. Search again for a default case. But only - ** use it if we also have a forward (:maildrop) pointer already - ** in the database. - */ - - /* build database key */ - (void) strcpy(keybuf, user); - (void) strcat(keybuf, ":maildrop"); - keylen = strlen(keybuf); - - for (up = UdbEnts; up->udb_type != UDB_EOLIST; up++) - { - switch (up->udb_type) - { -#ifdef NEWDB - case UDB_DBFETCH: - /* get the default case for this database */ - if (up->udb_default == NULL) - { - bzero(&key, sizeof key); - bzero(&info, sizeof info); - key.data = ":default:mailname"; - key.size = strlen(key.data); -#if DB_VERSION_MAJOR < 2 - i = (*up->udb_dbp->get)(up->udb_dbp, - &key, &info, 0); -#else - i = errno = (*up->udb_dbp->get)(up->udb_dbp, - NULL, &key, - &info, 0); -#endif - if (i != 0 || info.size <= 0) - { - /* no default case */ - up->udb_default = ""; - continue; - } - - /* save the default case */ - up->udb_default = xalloc(info.size + 1); - bcopy(info.data, up->udb_default, info.size); - up->udb_default[info.size] = '\0'; - } - else if (up->udb_default[0] == '\0') - continue; - - /* we have a default case -- verify user:maildrop */ - bzero(&key, sizeof key); - bzero(&info, sizeof info); - key.data = keybuf; - key.size = keylen; -#if DB_VERSION_MAJOR < 2 - i = (*up->udb_dbp->get)(up->udb_dbp, &key, &info, 0); -#else - i = errno = (*up->udb_dbp->get)(up->udb_dbp, NULL, - &key, &info, 0); -#endif - if (i != 0 || info.size <= 0) - { - /* nope -- no aliasing for this user */ - continue; - } - - /* they exist -- build the actual address */ - p = xalloc(strlen(user) + strlen(up->udb_default) + 2); - (void) strcpy(p, user); - (void) strcat(p, "@"); - (void) strcat(p, up->udb_default); - if (tTd(28, 1)) - printf("udbmatch ==> %s\n", p); - return p; -#endif - -#ifdef HESIOD - case UDB_HESIOD: - /* get the default case for this database */ - if (up->udb_default == NULL) - { - key.data = ":default:mailname"; - key.size = strlen(key.data); - i = hes_udb_get(&key, &info); - - if (i != 0 || info.size <= 0) - { - /* no default case */ - up->udb_default = ""; - continue; - } - - /* save the default case */ - up->udb_default = xalloc(info.size + 1); - bcopy(info.data, up->udb_default, info.size); - up->udb_default[info.size] = '\0'; - } - else if (up->udb_default[0] == '\0') - continue; - - /* we have a default case -- verify user:maildrop */ - key.data = keybuf; - key.size = keylen; - i = hes_udb_get(&key, &info); - if (i != 0 || info.size <= 0) - { - /* nope -- no aliasing for this user */ - continue; - } - - /* they exist -- build the actual address */ - p = xalloc(strlen(user) + strlen(up->udb_default) + 2); - (void) strcpy(p, user); - (void) strcat(p, "@"); - (void) strcat(p, up->udb_default); - if (tTd(28, 1)) - printf("udbmatch ==> %s\n", p); - return p; - break; -#endif /* HESIOD */ - } - } - - /* still nothing.... too bad */ - return NULL; -} -/* -** UDB_MAP_LOOKUP -- look up arbitrary entry in user database map -** -** Parameters: -** map -- the map being queried. -** name -- the name to look up. -** av -- arguments to the map lookup. -** statp -- to get any error status. -** -** Returns: -** NULL if name not found in map. -** The rewritten name otherwise. -*/ - -/* ARGSUSED3 */ -char * -udb_map_lookup(map, name, av, statp) - MAP *map; - char *name; - char **av; - int *statp; -{ - char *val; - char *key; - char keybuf[MAXNAME + 1]; - - if (tTd(28, 20) || tTd(38, 20)) - printf("udb_map_lookup(%s, %s)\n", map->map_mname, name); - - if (bitset(MF_NOFOLDCASE, map->map_mflags)) - { - key = name; - } - else - { - int keysize = strlen(name); - - if (keysize > sizeof keybuf - 1) - keysize = sizeof keybuf - 1; - bcopy(name, keybuf, keysize); - keybuf[keysize] = '\0'; - makelower(keybuf); - key = keybuf; - } - val = udbmatch(key, map->map_file); - if (val == NULL) - return NULL; - if (bitset(MF_MATCHONLY, map->map_mflags)) - return map_rewrite(map, name, strlen(name), NULL); - else - return map_rewrite(map, val, strlen(val), av); -} -/* -** _UDBX_INIT -- parse the UDB specification, opening any valid entries. -** -** Parameters: -** e -- the current envelope. -** -** Returns: -** EX_TEMPFAIL -- if it appeared it couldn't get hold of a -** database due to a host being down or some similar -** (recoverable) situation. -** EX_OK -- otherwise. -** -** Side Effects: -** Fills in the UdbEnts structure from UdbSpec. -*/ - -#define MAXUDBOPTS 27 - -int -_udbx_init(e) - ENVELOPE *e; -{ - int ents = 0; - register char *p; - register struct udbent *up; - - if (UdbInitialized) - return EX_OK; - -# ifdef UDB_DEFAULT_SPEC - if (UdbSpec == NULL) - UdbSpec = UDB_DEFAULT_SPEC; -# endif - - p = UdbSpec; - up = UdbEnts; - while (p != NULL) - { - char *spec; - int l; -# if 0 - auto int rcode; - int nmx; - int i; - register struct hostent *h; - char *mxhosts[MAXMXHOSTS + 1]; -# endif - struct udb_option opts[MAXUDBOPTS + 1]; - extern int _udb_parsespec __P((char *, struct udb_option [], int)); - - while (*p == ' ' || *p == '\t' || *p == ',') - p++; - if (*p == '\0') - break; - spec = p; - p = strchr(p, ','); - if (p != NULL) - *p++ = '\0'; - - if (ents >= MAXUDBENT) - { - syserr("Maximum number of UDB entries exceeded"); - break; - } - - /* extract options */ - (void) _udb_parsespec(spec, opts, MAXUDBOPTS); - - /* - ** Decode database specification. - ** - ** In the sendmail tradition, the leading character - ** defines the semantics of the rest of the entry. - ** - ** +hostname -- send a datagram to the udb server - ** on host "hostname" asking for the - ** home mail server for this user. - ** *hostname -- similar to +hostname, except that the - ** hostname is searched as an MX record; - ** resulting hosts are searched as for - ** +mxhostname. If no MX host is found, - ** this is the same as +hostname. - ** @hostname -- forward email to the indicated host. - ** This should be the last in the list, - ** since it always matches the input. - ** /dbname -- search the named database on the local - ** host using the Berkeley db package. - ** Hesiod -- search the named database with BIND - ** using the MIT Hesiod package. - */ - - switch (*spec) - { -#if 0 - case '+': /* search remote database */ - case '*': /* search remote database (expand MX) */ - if (*spec == '*') - { -#if NAMED_BIND - nmx = getmxrr(spec + 1, mxhosts, FALSE, &rcode); -#else - mxhosts[0] = spec + 1; - nmx = 1; - rcode = 0; -#endif - if (tTd(28, 16)) - { - int i; - - printf("getmxrr(%s): %d", spec + 1, nmx); - for (i = 0; i <= nmx; i++) - printf(" %s", mxhosts[i]); - printf("\n"); - } - } - else - { - nmx = 1; - mxhosts[0] = spec + 1; - } - - for (i = 0; i < nmx; i++) - { - h = sm_gethostbyname(mxhosts[i]); - if (h == NULL) - continue; - up->udb_type = UDB_REMOTE; - up->udb_pid = getpid(); - up->udb_addr.sin_family = h->h_addrtype; - bcopy(h->h_addr_list[0], - (char *) &up->udb_addr.sin_addr, - INADDRSZ); - up->udb_addr.sin_port = UdbPort; - up->udb_timeout = UdbTimeout; - ents++; - up++; - } - - /* set up a datagram socket */ - if (UdbSock < 0) - { - UdbSock = socket(AF_INET, SOCK_DGRAM, 0); - (void) fcntl(UdbSock, F_SETFD, 1); - } - break; -#endif - - case '@': /* forward to remote host */ - up->udb_type = UDB_FORWARD; - up->udb_pid = getpid(); - up->udb_fwdhost = spec + 1; - ents++; - up++; - break; - -#ifdef HESIOD - case 'h': /* use hesiod */ - case 'H': - if (strcasecmp(spec, "hesiod") != 0) - goto badspec; - up->udb_type = UDB_HESIOD; - up->udb_pid = getpid(); - ents++; - up++; - break; -#endif /* HESIOD */ - -#ifdef NEWDB - case '/': /* look up remote name */ - l = strlen(spec); - if (l > 3 && strcmp(&spec[l - 3], ".db") == 0) - { - up->udb_dbname = spec; - } - else - { - up->udb_dbname = xalloc(l + 4); - strcpy(up->udb_dbname, spec); - strcat(up->udb_dbname, ".db"); - } - errno = 0; -#if DB_VERSION_MAJOR < 2 - up->udb_dbp = dbopen(up->udb_dbname, O_RDONLY, - 0644, DB_BTREE, NULL); -#else - up->udb_dbp = NULL; - errno = db_open(up->udb_dbname, DB_BTREE, DB_RDONLY, - 0644, NULL, NULL, &up->udb_dbp); -#endif - if (up->udb_dbp == NULL) - { - if (tTd(28, 1)) - { - int saveerrno = errno; - -#if DB_VERSION_MAJOR < 2 - printf("dbopen(%s): %s\n", -#else - printf("db_open(%s): %s\n", -#endif - up->udb_dbname, - errstring(errno)); - errno = saveerrno; - } - if (errno != ENOENT && errno != EACCES) - { - if (LogLevel > 2) - sm_syslog(LOG_ERR, e->e_id, -#if DB_VERSION_MAJOR < 2 - "dbopen(%s): %s", -#else - "db_open(%s): %s", -#endif - up->udb_dbname, - errstring(errno)); - up->udb_type = UDB_EOLIST; - if (up->udb_dbname != spec) - free(up->udb_dbname); - goto tempfail; - } - if (up->udb_dbname != spec) - free(up->udb_dbname); - break; - } - if (tTd(28, 1)) - { -#if DB_VERSION_MAJOR < 2 - printf("_udbx_init: dbopen(%s)\n", -#else - printf("_udbx_init: db_open(%s)\n", -#endif - up->udb_dbname); - } - up->udb_type = UDB_DBFETCH; - up->udb_pid = getpid(); - ents++; - up++; - break; -#endif - - default: -badspec: - syserr("Unknown UDB spec %s", spec); - break; - } - } - up->udb_type = UDB_EOLIST; - - if (tTd(28, 4)) - { - for (up = UdbEnts; up->udb_type != UDB_EOLIST; up++) - { - switch (up->udb_type) - { -#if DAEMON - case UDB_REMOTE: - printf("REMOTE: addr %s, timeo %d\n", - anynet_ntoa((SOCKADDR *) &up->udb_addr), - up->udb_timeout); - break; -#endif - - case UDB_DBFETCH: -#ifdef NEWDB - printf("FETCH: file %s\n", - up->udb_dbname); -#else - printf("FETCH\n"); -#endif - break; - - case UDB_FORWARD: - printf("FORWARD: host %s\n", - up->udb_fwdhost); - break; - - case UDB_HESIOD: - printf("HESIOD\n"); - break; - - default: - printf("UNKNOWN\n"); - break; - } - } - } - - UdbInitialized = TRUE; - errno = 0; - return EX_OK; - - /* - ** On temporary failure, back out anything we've already done - */ - - tempfail: -#ifdef NEWDB - for (up = UdbEnts; up->udb_type != UDB_EOLIST; up++) - { - if (up->udb_type == UDB_DBFETCH) - { -#if DB_VERSION_MAJOR < 2 - (*up->udb_dbp->close)(up->udb_dbp); -#else - errno = (*up->udb_dbp->close)(up->udb_dbp, 0); -#endif - if (tTd(28, 1)) - { - printf("_udbx_init: db->close(%s)\n", - up->udb_dbname); - } - } - } -#endif - return EX_TEMPFAIL; -} - -int -_udb_parsespec(udbspec, opt, maxopts) - char *udbspec; - struct udb_option opt[]; - int maxopts; -{ - register char *spec; - register char *spec_end; - register int optnum; - - spec_end = strchr(udbspec, ':'); - for (optnum = 0; optnum < maxopts && (spec = spec_end) != NULL; optnum++) - { - register char *p; - - while (isascii(*spec) && isspace(*spec)) - spec++; - spec_end = strchr(spec, ':'); - if (spec_end != NULL) - *spec_end++ = '\0'; - - opt[optnum].name = spec; - opt[optnum].val = NULL; - p = strchr(spec, '='); - if (p != NULL) - opt[optnum].val = ++p; - } - return optnum; -} -/* -** _UDBX_CLOSE -- close all file based UDB entries. -** -** Parameters: -** none -** -** Returns: -** none -*/ -void -_udbx_close() -{ - pid_t pid; - struct udbent *up; - - if (!UdbInitialized) - return; - - pid = getpid(); - - for (up = UdbEnts; up->udb_type != UDB_EOLIST; up++) - { - if (up->udb_pid != pid) - continue; - -#ifdef NEWDB - if (up->udb_type == UDB_DBFETCH) - { -#if DB_VERSION_MAJOR < 2 - (*up->udb_dbp->close)(up->udb_dbp); -#else - errno = (*up->udb_dbp->close)(up->udb_dbp, 0); -#endif - } - if (tTd(28, 1)) - { - printf("_udbx_init: db->close(%s)\n", - up->udb_dbname); - } -#endif - } -} - -#ifdef HESIOD - -int -hes_udb_get(key, info) - DBT *key; - DBT *info; -{ - char *name, *type; - char **hp; - char kbuf[MAXKEY + 1]; - - if (strlen(key->data) >= (SIZE_T) sizeof kbuf) - return 0; - strcpy(kbuf, key->data); - name = kbuf; - type = strrchr(name, ':'); - if (type == NULL) - return 1; - *type++ = '\0'; - if (strchr(name, '@') != NULL) - return 1; - - if (tTd(28, 1)) - printf("hes_udb_get(%s, %s)\n", name, type); - - /* make the hesiod query */ -#ifdef HESIOD_INIT - if (HesiodContext == NULL && hesiod_init(&HesiodContext) != 0) - return -1; - hp = hesiod_resolve(HesiodContext, name, type); -#else - hp = hes_resolve(name, type); -#endif /* HESIOD_INIT */ - *--type = ':'; -#ifdef HESIOD_INIT - if (hp == NULL) - return 1; - if (*hp == NULL) - { - hesiod_free_list(HesiodContext, hp); - if (errno == ECONNREFUSED || errno == EMSGSIZE) - return -1; - return 1; - } -#else - if (hp == NULL || hp[0] == NULL) - { - /* network problem or timeout */ - if (hes_error() == HES_ER_NET) - return -1; - - return 1; - } -#endif /* HESIOD_INIT */ - else - { - /* - ** If there are multiple matches, just return the - ** first one. - ** - ** XXX These should really be returned; for example, - ** XXX it is legal for :maildrop to be multi-valued. - */ - - info->data = hp[0]; - info->size = (size_t) strlen(info->data); - } - - if (tTd(28, 80)) - printf("hes_udb_get => %s\n", *hp); - - return 0; -} -#endif /* HESIOD */ - -#else /* not USERDB */ - -int -udbexpand(a, sendq, aliaslevel, e) - ADDRESS *a; - ADDRESS **sendq; - int aliaslevel; - ENVELOPE *e; -{ - return EX_OK; -} - -#endif /* USERDB */ diff --git a/src/useful.h b/src/useful.h deleted file mode 100644 index a19dd9e..0000000 --- a/src/useful.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - * - * @(#)useful.h 8.12 (Berkeley) 5/19/1998 - */ - -# include <sys/types.h> - -/* support for bool type */ -typedef int bool; -#ifndef TRUE -# define TRUE 1 -# define FALSE 0 -#endif - -# ifndef NULL -# define NULL 0 -# endif /* NULL */ - -/* bit hacking */ -# define bitset(bit, word) (((word) & (bit)) != 0) - -/* some simple functions */ -# ifndef max -# define max(a, b) ((a) > (b) ? (a) : (b)) -# define min(a, b) ((a) < (b) ? (a) : (b)) -# endif - -/* assertions */ -# ifndef NASSERT -# define ASSERT(expr, msg, parm)\ - if (!(expr))\ - {\ - fprintf(stderr, "assertion botch: %s:%d: ", __FILE__, __LINE__);\ - fprintf(stderr, msg, parm);\ - } -# else /* NASSERT */ -# define ASSERT(expr, msg, parm) -# endif /* NASSERT */ - -/* sccs id's */ -# ifndef lint -# ifdef __STDC__ -# define SCCSID(arg) static char SccsId[] = #arg; -# else -# define SCCSID(arg) static char SccsId[] = "arg"; -# endif -# else -# define SCCSID(arg) -# endif diff --git a/src/usersmtp.c b/src/usersmtp.c deleted file mode 100644 index c82942b..0000000 --- a/src/usersmtp.c +++ /dev/null @@ -1,1172 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -# include "sendmail.h" - -#ifndef lint -#if SMTP -static char sccsid[] = "@(#)usersmtp.c 8.111 (Berkeley) 2/3/1999 (with SMTP)"; -#else -static char sccsid[] = "@(#)usersmtp.c 8.111 (Berkeley) 2/3/1999 (without SMTP)"; -#endif -#endif /* not lint */ - -# include <sysexits.h> -# include <errno.h> - -# if SMTP - -/* -** USERSMTP -- run SMTP protocol from the user end. -** -** This protocol is described in RFC821. -*/ - -#define REPLYTYPE(r) ((r) / 100) /* first digit of reply code */ -#define REPLYCLASS(r) (((r) / 10) % 10) /* second digit of reply code */ -#define SMTPCLOSING 421 /* "Service Shutting Down" */ - -char SmtpMsgBuffer[MAXLINE]; /* buffer for commands */ -char SmtpReplyBuffer[MAXLINE]; /* buffer for replies */ -char SmtpError[MAXLINE] = ""; /* save failure error messages */ -bool SmtpNeedIntro; /* need "while talking" in transcript */ - -extern void smtpmessage __P((char *f, MAILER *m, MCI *mci, ...)); -extern int reply __P((MAILER *, MCI *, ENVELOPE *, time_t, void (*)())); -/* -** SMTPINIT -- initialize SMTP. -** -** Opens the connection and sends the initial protocol. -** -** Parameters: -** m -- mailer to create connection to. -** pvp -- pointer to parameter vector to pass to -** the mailer. -** -** Returns: -** none. -** -** Side Effects: -** creates connection and sends initial protocol. -*/ - -void -smtpinit(m, mci, e) - MAILER *m; - register MCI *mci; - ENVELOPE *e; -{ - register int r; - register char *p; - extern void esmtp_check __P((char *, bool, MAILER *, MCI *, ENVELOPE *)); - extern void helo_options __P((char *, bool, MAILER *, MCI *, ENVELOPE *)); - - if (tTd(18, 1)) - { - printf("smtpinit "); - mci_dump(mci, FALSE); - } - - /* - ** Open the connection to the mailer. - */ - - SmtpError[0] = '\0'; - CurHostName = mci->mci_host; /* XXX UGLY XXX */ - if (CurHostName == NULL) - CurHostName = MyHostName; - SmtpNeedIntro = TRUE; - switch (mci->mci_state) - { - case MCIS_ACTIVE: - /* need to clear old information */ - smtprset(m, mci, e); - /* fall through */ - - case MCIS_OPEN: - return; - - case MCIS_ERROR: - case MCIS_SSD: - /* shouldn't happen */ - smtpquit(m, mci, e); - /* fall through */ - - case MCIS_CLOSED: - syserr("451 smtpinit: state CLOSED"); - return; - - case MCIS_OPENING: - break; - } - - mci->mci_state = MCIS_OPENING; - - /* - ** Get the greeting message. - ** This should appear spontaneously. Give it five minutes to - ** happen. - */ - - SmtpPhase = mci->mci_phase = "client greeting"; - sm_setproctitle(TRUE, "%s %s: %s", e->e_id, CurHostName, mci->mci_phase); - r = reply(m, mci, e, TimeOuts.to_initial, esmtp_check); - if (r < 0) - goto tempfail1; - if (REPLYTYPE(r) == 4) - goto tempfail2; - if (REPLYTYPE(r) != 2) - goto unavailable; - - /* - ** Send the HELO command. - ** My mother taught me to always introduce myself. - */ - - if (bitnset(M_ESMTP, m->m_flags) || bitnset(M_LMTP, m->m_flags)) - mci->mci_flags |= MCIF_ESMTP; - -tryhelo: - if (bitnset(M_LMTP, m->m_flags)) - { - smtpmessage("LHLO %s", m, mci, MyHostName); - SmtpPhase = mci->mci_phase = "client LHLO"; - } - else if (bitset(MCIF_ESMTP, mci->mci_flags)) - { - smtpmessage("EHLO %s", m, mci, MyHostName); - SmtpPhase = mci->mci_phase = "client EHLO"; - } - else - { - smtpmessage("HELO %s", m, mci, MyHostName); - SmtpPhase = mci->mci_phase = "client HELO"; - } - sm_setproctitle(TRUE, "%s %s: %s", e->e_id, CurHostName, mci->mci_phase); - r = reply(m, mci, e, TimeOuts.to_helo, helo_options); - if (r < 0) - goto tempfail1; - else if (REPLYTYPE(r) == 5) - { - if (bitset(MCIF_ESMTP, mci->mci_flags) && - !bitnset(M_LMTP, m->m_flags)) - { - /* try old SMTP instead */ - mci->mci_flags &= ~MCIF_ESMTP; - goto tryhelo; - } - goto unavailable; - } - else if (REPLYTYPE(r) != 2) - goto tempfail2; - - /* - ** Check to see if we actually ended up talking to ourself. - ** This means we didn't know about an alias or MX, or we managed - ** to connect to an echo server. - */ - - p = strchr(&SmtpReplyBuffer[4], ' '); - if (p != NULL) - *p = '\0'; - if (!bitnset(M_NOLOOPCHECK, m->m_flags) && - !bitnset(M_LMTP, m->m_flags) && - strcasecmp(&SmtpReplyBuffer[4], MyHostName) == 0) - { - syserr("553 %s config error: mail loops back to me (MX problem?)", - CurHostName); - mci_setstat(mci, EX_CONFIG, NULL, NULL); - mci->mci_errno = 0; - smtpquit(m, mci, e); - return; - } - - /* - ** If this is expected to be another sendmail, send some internal - ** commands. - */ - - if (bitnset(M_INTERNAL, m->m_flags)) - { - /* tell it to be verbose */ - smtpmessage("VERB", m, mci); - r = reply(m, mci, e, TimeOuts.to_miscshort, NULL); - if (r < 0) - goto tempfail1; - } - - if (mci->mci_state != MCIS_CLOSED) - { - mci->mci_state = MCIS_OPEN; - return; - } - - /* got a 421 error code during startup */ - - tempfail1: - if (mci->mci_errno == 0) - mci->mci_errno = errno; - mci_setstat(mci, EX_TEMPFAIL, "4.4.2", NULL); - if (mci->mci_state != MCIS_CLOSED) - smtpquit(m, mci, e); - return; - - tempfail2: - if (mci->mci_errno == 0) - mci->mci_errno = errno; - /* XXX should use code from other end iff ENHANCEDSTATUSCODES */ - mci_setstat(mci, EX_TEMPFAIL, "4.5.0", SmtpReplyBuffer); - if (mci->mci_state != MCIS_CLOSED) - smtpquit(m, mci, e); - return; - - unavailable: - mci->mci_errno = errno; - mci_setstat(mci, EX_UNAVAILABLE, "5.5.0", SmtpReplyBuffer); - smtpquit(m, mci, e); - return; -} -/* -** ESMTP_CHECK -- check to see if this implementation likes ESMTP protocol -** -** Parameters: -** line -- the response line. -** firstline -- set if this is the first line of the reply. -** m -- the mailer. -** mci -- the mailer connection info. -** e -- the envelope. -** -** Returns: -** none. -*/ - -void -esmtp_check(line, firstline, m, mci, e) - char *line; - bool firstline; - MAILER *m; - register MCI *mci; - ENVELOPE *e; -{ - if (strstr(line, "ESMTP") != NULL) - mci->mci_flags |= MCIF_ESMTP; - if (strstr(line, "8BIT-OK") != NULL) - mci->mci_flags |= MCIF_8BITOK; -} -/* -** HELO_OPTIONS -- process the options on a HELO line. -** -** Parameters: -** line -- the response line. -** firstline -- set if this is the first line of the reply. -** m -- the mailer. -** mci -- the mailer connection info. -** e -- the envelope. -** -** Returns: -** none. -*/ - -void -helo_options(line, firstline, m, mci, e) - char *line; - bool firstline; - MAILER *m; - register MCI *mci; - ENVELOPE *e; -{ - register char *p; - - if (firstline) - return; - - if (strlen(line) < (SIZE_T) 5) - return; - line += 4; - p = strchr(line, ' '); - if (p != NULL) - *p++ = '\0'; - if (strcasecmp(line, "size") == 0) - { - mci->mci_flags |= MCIF_SIZE; - if (p != NULL) - mci->mci_maxsize = atol(p); - } - else if (strcasecmp(line, "8bitmime") == 0) - { - mci->mci_flags |= MCIF_8BITMIME; - mci->mci_flags &= ~MCIF_7BIT; - } - else if (strcasecmp(line, "expn") == 0) - mci->mci_flags |= MCIF_EXPN; - else if (strcasecmp(line, "dsn") == 0) - mci->mci_flags |= MCIF_DSN; -} -/* -** SMTPMAILFROM -- send MAIL command -** -** Parameters: -** m -- the mailer. -** mci -- the mailer connection structure. -** e -- the envelope (including the sender to specify). -*/ - -int -smtpmailfrom(m, mci, e) - MAILER *m; - MCI *mci; - ENVELOPE *e; -{ - int r; - char *bufp; - char *bodytype; - char buf[MAXNAME + 1]; - char optbuf[MAXLINE]; - - if (tTd(18, 2)) - printf("smtpmailfrom: CurHost=%s\n", CurHostName); - - /* set up appropriate options to include */ - bufp = optbuf; - if (bitset(MCIF_SIZE, mci->mci_flags) && e->e_msgsize > 0) - snprintf(optbuf, sizeof optbuf, " SIZE=%ld", e->e_msgsize); - else - strcpy(optbuf, ""); - bufp = &optbuf[strlen(optbuf)]; - - bodytype = e->e_bodytype; - if (bitset(MCIF_8BITMIME, mci->mci_flags)) - { - if (bodytype == NULL && - bitset(MM_MIME8BIT, MimeMode) && - bitset(EF_HAS8BIT, e->e_flags) && - !bitset(EF_DONT_MIME, e->e_flags) && - !bitnset(M_8BITS, m->m_flags)) - bodytype = "8BITMIME"; - if (bodytype != NULL && - SPACELEFT(optbuf, bufp) > strlen(bodytype) + 7) - { - snprintf(bufp, SPACELEFT(optbuf, bufp), - " BODY=%s", bodytype); - bufp += strlen(bufp); - } - } - else if (bitnset(M_8BITS, m->m_flags) || - !bitset(EF_HAS8BIT, e->e_flags) || - bitset(MCIF_8BITOK, mci->mci_flags)) - { - /* just pass it through */ - } -#if MIME8TO7 - else if (bitset(MM_CVTMIME, MimeMode) && - !bitset(EF_DONT_MIME, e->e_flags) && - (!bitset(MM_PASS8BIT, MimeMode) || - bitset(EF_IS_MIME, e->e_flags))) - { - /* must convert from 8bit MIME format to 7bit encoded */ - mci->mci_flags |= MCIF_CVT8TO7; - } -#endif - else if (!bitset(MM_PASS8BIT, MimeMode)) - { - /* cannot just send a 8-bit version */ - extern char MsgBuf[]; - - usrerr("%s does not support 8BITMIME", CurHostName); - mci_setstat(mci, EX_NOTSTICKY, "5.6.3", MsgBuf); - return EX_DATAERR; - } - - if (bitset(MCIF_DSN, mci->mci_flags)) - { - if (e->e_envid != NULL && - SPACELEFT(optbuf, bufp) > strlen(e->e_envid) + 7) - { - snprintf(bufp, SPACELEFT(optbuf, bufp), - " ENVID=%s", e->e_envid); - bufp += strlen(bufp); - } - - /* RET= parameter */ - if (bitset(EF_RET_PARAM, e->e_flags) && - SPACELEFT(optbuf, bufp) > 9) - { - snprintf(bufp, SPACELEFT(optbuf, bufp), - " RET=%s", - bitset(EF_NO_BODY_RETN, e->e_flags) ? - "HDRS" : "FULL"); - bufp += strlen(bufp); - } - } - - /* - ** Send the MAIL command. - ** Designates the sender. - */ - - mci->mci_state = MCIS_ACTIVE; - - if (bitset(EF_RESPONSE, e->e_flags) && - !bitnset(M_NO_NULL_FROM, m->m_flags)) - (void) strcpy(buf, ""); - else - expand("\201g", buf, sizeof buf, e); - if (buf[0] == '<') - { - /* strip off <angle brackets> (put back on below) */ - bufp = &buf[strlen(buf) - 1]; - if (*bufp == '>') - *bufp = '\0'; - bufp = &buf[1]; - } - else - bufp = buf; - if (bitnset(M_LOCALMAILER, e->e_from.q_mailer->m_flags) || - !bitnset(M_FROMPATH, m->m_flags)) - { - smtpmessage("MAIL From:<%s>%s", m, mci, bufp, optbuf); - } - else - { - smtpmessage("MAIL From:<@%s%c%s>%s", m, mci, MyHostName, - *bufp == '@' ? ',' : ':', bufp, optbuf); - } - SmtpPhase = mci->mci_phase = "client MAIL"; - sm_setproctitle(TRUE, "%s %s: %s", e->e_id, CurHostName, mci->mci_phase); - r = reply(m, mci, e, TimeOuts.to_mail, NULL); - if (r < 0) - { - /* communications failure */ - mci->mci_errno = errno; - mci_setstat(mci, EX_TEMPFAIL, "4.4.2", NULL); - smtpquit(m, mci, e); - return EX_TEMPFAIL; - } - else if (r == 421) - { - /* service shutting down */ - mci_setstat(mci, EX_TEMPFAIL, "4.5.0", SmtpReplyBuffer); - smtpquit(m, mci, e); - return EX_TEMPFAIL; - } - else if (REPLYTYPE(r) == 4) - { - mci_setstat(mci, EX_NOTSTICKY, smtptodsn(r), SmtpReplyBuffer); - return EX_TEMPFAIL; - } - else if (REPLYTYPE(r) == 2) - { - return EX_OK; - } - else if (r == 501) - { - /* syntax error in arguments */ - mci_setstat(mci, EX_NOTSTICKY, "5.5.2", SmtpReplyBuffer); - return EX_DATAERR; - } - else if (r == 553) - { - /* mailbox name not allowed */ - mci_setstat(mci, EX_NOTSTICKY, "5.1.3", SmtpReplyBuffer); - return EX_DATAERR; - } - else if (r == 552) - { - /* exceeded storage allocation */ - mci_setstat(mci, EX_NOTSTICKY, "5.3.4", SmtpReplyBuffer); - if (bitset(MCIF_SIZE, mci->mci_flags)) - e->e_flags |= EF_NO_BODY_RETN; - return EX_UNAVAILABLE; - } - else if (REPLYTYPE(r) == 5) - { - /* unknown error */ - mci_setstat(mci, EX_NOTSTICKY, "5.0.0", SmtpReplyBuffer); - return EX_UNAVAILABLE; - } - - if (LogLevel > 1) - { - sm_syslog(LOG_CRIT, e->e_id, - "%.100s: SMTP MAIL protocol error: %s", - CurHostName, - shortenstring(SmtpReplyBuffer, 403)); - } - - /* protocol error -- close up */ - mci_setstat(mci, EX_PROTOCOL, "5.5.1", SmtpReplyBuffer); - smtpquit(m, mci, e); - return EX_PROTOCOL; -} -/* -** SMTPRCPT -- designate recipient. -** -** Parameters: -** to -- address of recipient. -** m -- the mailer we are sending to. -** mci -- the connection info for this transaction. -** e -- the envelope for this transaction. -** -** Returns: -** exit status corresponding to recipient status. -** -** Side Effects: -** Sends the mail via SMTP. -*/ - -int -smtprcpt(to, m, mci, e) - ADDRESS *to; - register MAILER *m; - MCI *mci; - ENVELOPE *e; -{ - register int r; - char *bufp; - char optbuf[MAXLINE]; - - strcpy(optbuf, ""); - bufp = &optbuf[strlen(optbuf)]; - if (bitset(MCIF_DSN, mci->mci_flags)) - { - /* NOTIFY= parameter */ - if (bitset(QHASNOTIFY, to->q_flags) && - bitset(QPRIMARY, to->q_flags) && - !bitnset(M_LOCALMAILER, m->m_flags)) - { - bool firstone = TRUE; - - strcat(bufp, " NOTIFY="); - if (bitset(QPINGONSUCCESS, to->q_flags)) - { - strcat(bufp, "SUCCESS"); - firstone = FALSE; - } - if (bitset(QPINGONFAILURE, to->q_flags)) - { - if (!firstone) - strcat(bufp, ","); - strcat(bufp, "FAILURE"); - firstone = FALSE; - } - if (bitset(QPINGONDELAY, to->q_flags)) - { - if (!firstone) - strcat(bufp, ","); - strcat(bufp, "DELAY"); - firstone = FALSE; - } - if (firstone) - strcat(bufp, "NEVER"); - bufp += strlen(bufp); - } - - /* ORCPT= parameter */ - if (to->q_orcpt != NULL && - SPACELEFT(optbuf, bufp) > strlen(to->q_orcpt) + 7) - { - snprintf(bufp, SPACELEFT(optbuf, bufp), - " ORCPT=%s", to->q_orcpt); - bufp += strlen(bufp); - } - } - - smtpmessage("RCPT To:<%s>%s", m, mci, to->q_user, optbuf); - - SmtpPhase = mci->mci_phase = "client RCPT"; - sm_setproctitle(TRUE, "%s %s: %s", e->e_id, CurHostName, mci->mci_phase); - r = reply(m, mci, e, TimeOuts.to_rcpt, NULL); - to->q_rstatus = newstr(SmtpReplyBuffer); - to->q_status = smtptodsn(r); - to->q_statmta = mci->mci_host; - if (r < 0 || REPLYTYPE(r) == 4) - return EX_TEMPFAIL; - else if (REPLYTYPE(r) == 2) - return EX_OK; - else if (r == 550) - { - to->q_status = "5.1.1"; - return EX_NOUSER; - } - else if (r == 551) - { - to->q_status = "5.1.6"; - return EX_NOUSER; - } - else if (r == 553) - { - to->q_status = "5.1.3"; - return EX_NOUSER; - } - else if (REPLYTYPE(r) == 5) - { - return EX_UNAVAILABLE; - } - - if (LogLevel > 1) - { - sm_syslog(LOG_CRIT, e->e_id, - "%.100s: SMTP RCPT protocol error: %s", - CurHostName, - shortenstring(SmtpReplyBuffer, 403)); - } - - mci_setstat(mci, EX_PROTOCOL, "5.5.1", SmtpReplyBuffer); - return EX_PROTOCOL; -} -/* -** SMTPDATA -- send the data and clean up the transaction. -** -** Parameters: -** m -- mailer being sent to. -** mci -- the mailer connection information. -** e -- the envelope for this message. -** -** Returns: -** exit status corresponding to DATA command. -** -** Side Effects: -** none. -*/ - -static jmp_buf CtxDataTimeout; -static void datatimeout __P((void)); - -int -smtpdata(m, mci, e) - MAILER *m; - register MCI *mci; - register ENVELOPE *e; -{ - register int r; - register EVENT *ev; - int rstat; - int xstat; - time_t timeout; - - /* - ** Send the data. - ** First send the command and check that it is ok. - ** Then send the data. - ** Follow it up with a dot to terminate. - ** Finally get the results of the transaction. - */ - - /* send the command and check ok to proceed */ - smtpmessage("DATA", m, mci); - SmtpPhase = mci->mci_phase = "client DATA 354"; - sm_setproctitle(TRUE, "%s %s: %s", e->e_id, CurHostName, mci->mci_phase); - r = reply(m, mci, e, TimeOuts.to_datainit, NULL); - if (r < 0 || REPLYTYPE(r) == 4) - { - smtpquit(m, mci, e); - return EX_TEMPFAIL; - } - else if (REPLYTYPE(r) == 5) - { - smtprset(m, mci, e); - return EX_UNAVAILABLE; - } - else if (REPLYTYPE(r) != 3) - { - if (LogLevel > 1) - { - sm_syslog(LOG_CRIT, e->e_id, - "%.100s: SMTP DATA-1 protocol error: %s", - CurHostName, - shortenstring(SmtpReplyBuffer, 403)); - } - smtprset(m, mci, e); - mci_setstat(mci, EX_PROTOCOL, "5.5.1", SmtpReplyBuffer); - return (EX_PROTOCOL); - } - - /* - ** Set timeout around data writes. Make it at least large - ** enough for DNS timeouts on all recipients plus some fudge - ** factor. The main thing is that it should not be infinite. - */ - - if (setjmp(CtxDataTimeout) != 0) - { - mci->mci_errno = errno; - mci->mci_state = MCIS_ERROR; - mci_setstat(mci, EX_TEMPFAIL, "4.4.2", NULL); - syserr("451 timeout writing message to %s", CurHostName); - smtpquit(m, mci, e); - return EX_TEMPFAIL; - } - - timeout = e->e_msgsize / 16; - if (timeout < (time_t) 600) - timeout = (time_t) 600; - timeout += e->e_nrcpts * 300; - ev = setevent(timeout, datatimeout, 0); - - /* - ** Output the actual message. - */ - - (*e->e_puthdr)(mci, e->e_header, e, M87F_OUTER); - (*e->e_putbody)(mci, e, NULL); - - /* - ** Cleanup after sending message. - */ - - clrevent(ev); - - if (ferror(mci->mci_out)) - { - /* error during processing -- don't send the dot */ - mci->mci_errno = EIO; - mci->mci_state = MCIS_ERROR; - mci_setstat(mci, EX_IOERR, "4.4.2", NULL); - smtpquit(m, mci, e); - return EX_IOERR; - } - - /* terminate the message */ - fprintf(mci->mci_out, ".%s", m->m_eol); - if (TrafficLogFile != NULL) - fprintf(TrafficLogFile, "%05d >>> .\n", (int) getpid()); - if (Verbose) - nmessage(">>> ."); - - /* check for the results of the transaction */ - SmtpPhase = mci->mci_phase = "client DATA status"; - sm_setproctitle(TRUE, "%s %s: %s", e->e_id, CurHostName, mci->mci_phase); - if (bitnset(M_LMTP, m->m_flags)) - return EX_OK; - r = reply(m, mci, e, TimeOuts.to_datafinal, NULL); - if (r < 0) - { - smtpquit(m, mci, e); - return EX_TEMPFAIL; - } - mci->mci_state = MCIS_OPEN; - xstat = EX_NOTSTICKY; - if (r == 452) - rstat = EX_TEMPFAIL; - else if (REPLYTYPE(r) == 4) - rstat = xstat = EX_TEMPFAIL; - else if (REPLYCLASS(r) != 5) - rstat = xstat = EX_PROTOCOL; - else if (REPLYTYPE(r) == 2) - rstat = xstat = EX_OK; - else if (REPLYTYPE(r) == 5) - rstat = EX_UNAVAILABLE; - else - rstat = EX_PROTOCOL; - mci_setstat(mci, xstat, smtptodsn(r), SmtpReplyBuffer); - if (e->e_statmsg != NULL) - free(e->e_statmsg); - e->e_statmsg = newstr(&SmtpReplyBuffer[4]); - if (rstat != EX_PROTOCOL) - return rstat; - if (LogLevel > 1) - { - sm_syslog(LOG_CRIT, e->e_id, - "%.100s: SMTP DATA-2 protocol error: %s", - CurHostName, - shortenstring(SmtpReplyBuffer, 403)); - } - return rstat; -} - - -static void -datatimeout() -{ - longjmp(CtxDataTimeout, 1); -} -/* -** SMTPGETSTAT -- get status code from DATA in LMTP -** -** Parameters: -** m -- the mailer to which we are sending the message. -** mci -- the mailer connection structure. -** e -- the current envelope. -** -** Returns: -** The exit status corresponding to the reply code. -*/ - -int -smtpgetstat(m, mci, e) - MAILER *m; - MCI *mci; - ENVELOPE *e; -{ - int r; - int stat; - - /* check for the results of the transaction */ - r = reply(m, mci, e, TimeOuts.to_datafinal, NULL); - if (r < 0) - { - smtpquit(m, mci, e); - return EX_TEMPFAIL; - } - if (e->e_statmsg != NULL) - free(e->e_statmsg); - e->e_statmsg = newstr(&SmtpReplyBuffer[4]); - if (REPLYTYPE(r) == 4) - stat = EX_TEMPFAIL; - else if (REPLYCLASS(r) != 5) - stat = EX_PROTOCOL; - else if (REPLYTYPE(r) == 2) - stat = EX_OK; - else if (REPLYTYPE(r) == 5) - stat = EX_UNAVAILABLE; - else - stat = EX_PROTOCOL; - mci_setstat(mci, stat, smtptodsn(r), SmtpReplyBuffer); - if (LogLevel > 1 && stat == EX_PROTOCOL) - { - sm_syslog(LOG_CRIT, e->e_id, - "%.100s: SMTP DATA-3 protocol error: %s", - CurHostName, - shortenstring(SmtpReplyBuffer, 403)); - } - return stat; -} -/* -** SMTPQUIT -- close the SMTP connection. -** -** Parameters: -** m -- a pointer to the mailer. -** mci -- the mailer connection information. -** e -- the current envelope. -** -** Returns: -** none. -** -** Side Effects: -** sends the final protocol and closes the connection. -*/ - -void -smtpquit(m, mci, e) - register MAILER *m; - register MCI *mci; - ENVELOPE *e; -{ - bool oldSuprErrs = SuprErrs; - - /* - ** Suppress errors here -- we may be processing a different - ** job when we do the quit connection, and we don't want the - ** new job to be penalized for something that isn't it's - ** problem. - */ - - SuprErrs = TRUE; - - /* send the quit message if we haven't gotten I/O error */ - if (mci->mci_state != MCIS_ERROR) - { - SmtpPhase = "client QUIT"; - smtpmessage("QUIT", m, mci); - (void) reply(m, mci, e, TimeOuts.to_quit, NULL); - SuprErrs = oldSuprErrs; - if (mci->mci_state == MCIS_CLOSED) - return; - } - - /* now actually close the connection and pick up the zombie */ - (void) endmailer(mci, e, NULL); - - SuprErrs = oldSuprErrs; -} -/* -** SMTPRSET -- send a RSET (reset) command -*/ - -void -smtprset(m, mci, e) - register MAILER *m; - register MCI *mci; - ENVELOPE *e; -{ - int r; - - SmtpPhase = "client RSET"; - smtpmessage("RSET", m, mci); - r = reply(m, mci, e, TimeOuts.to_rset, NULL); - if (r < 0) - mci->mci_state = MCIS_ERROR; - else if (REPLYTYPE(r) == 2) - { - mci->mci_state = MCIS_OPEN; - return; - } - smtpquit(m, mci, e); -} -/* -** SMTPPROBE -- check the connection state -*/ - -int -smtpprobe(mci) - register MCI *mci; -{ - int r; - MAILER *m = mci->mci_mailer; - extern ENVELOPE BlankEnvelope; - ENVELOPE *e = &BlankEnvelope; - - SmtpPhase = "client probe"; - smtpmessage("RSET", m, mci); - r = reply(m, mci, e, TimeOuts.to_miscshort, NULL); - if (r < 0 || REPLYTYPE(r) != 2) - smtpquit(m, mci, e); - return r; -} -/* -** REPLY -- read arpanet reply -** -** Parameters: -** m -- the mailer we are reading the reply from. -** mci -- the mailer connection info structure. -** e -- the current envelope. -** timeout -- the timeout for reads. -** pfunc -- processing function called on each line of response. -** If null, no special processing is done. -** -** Returns: -** reply code it reads. -** -** Side Effects: -** flushes the mail file. -*/ - -int -reply(m, mci, e, timeout, pfunc) - MAILER *m; - MCI *mci; - ENVELOPE *e; - time_t timeout; - void (*pfunc)(); -{ - register char *bufp; - register int r; - bool firstline = TRUE; - char junkbuf[MAXLINE]; - - if (mci->mci_out != NULL) - (void) fflush(mci->mci_out); - - if (tTd(18, 1)) - printf("reply\n"); - - /* - ** Read the input line, being careful not to hang. - */ - - bufp = SmtpReplyBuffer; - for (;;) - { - register char *p; - - /* actually do the read */ - if (e->e_xfp != NULL) - (void) fflush(e->e_xfp); /* for debugging */ - - /* if we are in the process of closing just give the code */ - if (mci->mci_state == MCIS_CLOSED) - return (SMTPCLOSING); - - if (mci->mci_out != NULL) - fflush(mci->mci_out); - - /* get the line from the other side */ - p = sfgets(bufp, MAXLINE, mci->mci_in, timeout, SmtpPhase); - mci->mci_lastuse = curtime(); - - if (p == NULL) - { - bool oldholderrs; - extern char MsgBuf[]; - - /* if the remote end closed early, fake an error */ - if (errno == 0) -# ifdef ECONNRESET - errno = ECONNRESET; -# else /* ECONNRESET */ - errno = EPIPE; -# endif /* ECONNRESET */ - - mci->mci_errno = errno; - oldholderrs = HoldErrs; - HoldErrs = TRUE; - usrerr("451 reply: read error from %s", CurHostName); - - /* errors on QUIT should not be persistent */ - if (strncmp(SmtpMsgBuffer, "QUIT", 4) != 0) - mci_setstat(mci, EX_TEMPFAIL, "4.4.2", MsgBuf); - - /* if debugging, pause so we can see state */ - if (tTd(18, 100)) - pause(); - mci->mci_state = MCIS_ERROR; - smtpquit(m, mci, e); -#if XDEBUG - { - char wbuf[MAXLINE]; - char *p = wbuf; - int wbufleft = sizeof wbuf; - - if (e->e_to != NULL) - { - int plen; - - snprintf(p, wbufleft, "%s... ", - shortenstring(e->e_to, MAXSHORTSTR)); - plen = strlen(p); - p += plen; - wbufleft -= plen; - } - snprintf(p, wbufleft, "reply(%.100s) during %s", - CurHostName == NULL ? "NO_HOST" : CurHostName, - SmtpPhase); - checkfd012(wbuf); - } -#endif - HoldErrs = oldholderrs; - return (-1); - } - fixcrlf(bufp, TRUE); - - /* EHLO failure is not a real error */ - if (e->e_xfp != NULL && (bufp[0] == '4' || - (bufp[0] == '5' && strncmp(SmtpMsgBuffer, "EHLO", 4) != 0))) - { - /* serious error -- log the previous command */ - if (SmtpNeedIntro) - { - /* inform user who we are chatting with */ - fprintf(CurEnv->e_xfp, - "... while talking to %s:\n", - CurHostName); - SmtpNeedIntro = FALSE; - } - if (SmtpMsgBuffer[0] != '\0') - fprintf(e->e_xfp, ">>> %s\n", SmtpMsgBuffer); - SmtpMsgBuffer[0] = '\0'; - - /* now log the message as from the other side */ - fprintf(e->e_xfp, "<<< %s\n", bufp); - } - - /* display the input for verbose mode */ - if (Verbose) - nmessage("050 %s", bufp); - - /* ignore improperly formated input */ - if (!(isascii(bufp[0]) && isdigit(bufp[0])) || - !(isascii(bufp[1]) && isdigit(bufp[1])) || - !(isascii(bufp[2]) && isdigit(bufp[2])) || - !(bufp[3] == ' ' || bufp[3] == '-' || bufp[3] == '\0')) - continue; - - /* process the line */ - if (pfunc != NULL) - (*pfunc)(bufp, firstline, m, mci, e); - - firstline = FALSE; - - /* decode the reply code */ - r = atoi(bufp); - - /* extra semantics: 0xx codes are "informational" */ - if (r < 100) - continue; - - /* if no continuation lines, return this line */ - if (bufp[3] != '-') - break; - - /* first line of real reply -- ignore rest */ - bufp = junkbuf; - } - - /* - ** Now look at SmtpReplyBuffer -- only care about the first - ** line of the response from here on out. - */ - - /* save temporary failure messages for posterity */ - if (SmtpReplyBuffer[0] == '4' && - (bitnset(M_LMTP, m->m_flags) || SmtpError[0] == '\0')) - snprintf(SmtpError, sizeof SmtpError, "%s", SmtpReplyBuffer); - - /* reply code 421 is "Service Shutting Down" */ - if (r == SMTPCLOSING && mci->mci_state != MCIS_SSD) - { - /* send the quit protocol */ - mci->mci_state = MCIS_SSD; - smtpquit(m, mci, e); - } - - return (r); -} -/* -** SMTPMESSAGE -- send message to server -** -** Parameters: -** f -- format -** m -- the mailer to control formatting. -** a, b, c -- parameters -** -** Returns: -** none. -** -** Side Effects: -** writes message to mci->mci_out. -*/ - -/*VARARGS1*/ -void -#ifdef __STDC__ -smtpmessage(char *f, MAILER *m, MCI *mci, ...) -#else -smtpmessage(f, m, mci, va_alist) - char *f; - MAILER *m; - MCI *mci; - va_dcl -#endif -{ - VA_LOCAL_DECL - - VA_START(mci); - (void) vsnprintf(SmtpMsgBuffer, sizeof SmtpMsgBuffer, f, ap); - VA_END; - - if (tTd(18, 1) || Verbose) - nmessage(">>> %s", SmtpMsgBuffer); - if (TrafficLogFile != NULL) - fprintf(TrafficLogFile, "%05d >>> %s\n", - (int) getpid(), SmtpMsgBuffer); - if (mci->mci_out != NULL) - { - fprintf(mci->mci_out, "%s%s", SmtpMsgBuffer, - m == NULL ? "\r\n" : m->m_eol); - } - else if (tTd(18, 1)) - { - printf("smtpmessage: NULL mci_out\n"); - } -} - -# endif /* SMTP */ diff --git a/src/util.c b/src/util.c deleted file mode 100644 index 0cb8992..0000000 --- a/src/util.c +++ /dev/null @@ -1,2365 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)util.c 8.168 (Berkeley) 1/21/1999"; -#endif /* not lint */ - -# include "sendmail.h" -# include <sysexits.h> -/* -** STRIPQUOTES -- Strip quotes & quote bits from a string. -** -** Runs through a string and strips off unquoted quote -** characters and quote bits. This is done in place. -** -** Parameters: -** s -- the string to strip. -** -** Returns: -** none. -** -** Side Effects: -** none. -** -** Called By: -** deliver -*/ - -void -stripquotes(s) - char *s; -{ - register char *p; - register char *q; - register char c; - - if (s == NULL) - return; - - p = q = s; - do - { - c = *p++; - if (c == '\\') - c = *p++; - else if (c == '"') - continue; - *q++ = c; - } while (c != '\0'); -} -/* -** ADDQUOTES -- Adds quotes & quote bits to a string. -** -** Runs through a string and adds characters and quote bits. -** -** Parameters: -** s -- the string to modify. -** -** Returns: -** pointer to quoted string. -** -** Side Effects: -** none. -** -*/ - -char * -addquotes(s) - char *s; -{ - int len = 0; - char c; - char *p = s, *q, *r; - - if (s == NULL) - return NULL; - - /* Find length of quoted string */ - while ((c = *p++) != '\0') - { - len++; - if (c == '\\' || c == '"') - len++; - } - - q = r = xalloc(len + 3); - p = s; - - /* add leading quote */ - *q++ = '"'; - while ((c = *p++) != '\0') - { - /* quote \ or " */ - if (c == '\\' || c == '"') - *q++ = '\\'; - *q++ = c; - } - *q++ = '"'; - *q = '\0'; - return r; -} -/* -** RFC822_STRING -- Checks string for proper RFC822 string quoting. -** -** Runs through a string and verifies RFC822 special characters -** are only found inside comments, quoted strings, or backslash -** escaped. Also verified balanced quotes and parenthesis. -** -** Parameters: -** s -- the string to modify. -** -** Returns: -** TRUE -- if the string is RFC822 compliant. -** FALSE -- if the string is not RFC822 compliant. -** -** Side Effects: -** none. -** -*/ - -bool -rfc822_string(s) - char *s; -{ - bool quoted = FALSE; - int commentlev = 0; - char *c = s; - - if (s == NULL) - return FALSE; - - while (*c != '\0') - { - /* escaped character */ - if (*c == '\\') - { - c++; - if (*c == '\0') - return FALSE; - } - else if (commentlev == 0 && *c == '"') - quoted = !quoted; - else if (!quoted) - { - if (*c == ')') - { - /* unbalanced ')' */ - if (commentlev == 0) - return FALSE; - else - commentlev--; - } - else if (*c == '(') - commentlev++; - else if (commentlev == 0 && - strchr(MustQuoteChars, *c) != NULL) - return FALSE; - } - c++; - } - /* unbalanced '"' or '(' */ - if (quoted || commentlev != 0) - return FALSE; - else - return TRUE; -} -/* -** SHORTEN_RFC822_STRING -- Truncate and rebalance an RFC822 string -** -** Arbitratily shorten (in place) an RFC822 string and rebalance -** comments and quotes. -** -** Parameters: -** string -- the string to shorten -** length -- the maximum size, 0 if no maximum -** -** Returns: -** TRUE if string is changed, FALSE otherwise -** -** Side Effects: -** Changes string in place, possibly resulting -** in a shorter string. -*/ - -bool -shorten_rfc822_string(string, length) - char *string; - size_t length; -{ - bool backslash = FALSE; - bool modified = FALSE; - bool quoted = FALSE; - size_t slen; - int parencount = 0; - char *ptr = string; - - /* - ** If have to rebalance an already short enough string, - ** need to do it within allocated space. - */ - slen = strlen(string); - if (length == 0 || slen < length) - length = slen; - - while (*ptr != '\0') - { - if (backslash) - { - backslash = FALSE; - goto increment; - } - - if (*ptr == '\\') - backslash = TRUE; - else if (*ptr == '(') - { - if (!quoted) - parencount++; - } - else if (*ptr == ')') - { - if (--parencount < 0) - parencount = 0; - } - - /* Inside a comment, quotes don't matter */ - if (parencount <= 0 && *ptr == '"') - quoted = !quoted; - -increment: - /* Check for sufficient space for next character */ - if (length - (ptr - string) <= ((backslash ? 1 : 0) + - parencount + - (quoted ? 1 : 0))) - { - /* Not enough, backtrack */ - if (*ptr == '\\') - backslash = FALSE; - else if (*ptr == '(' && !quoted) - parencount--; - else if (*ptr == '"' && parencount == 0) - quoted = FALSE; - break; - } - ptr++; - } - - /* Rebalance */ - while (parencount-- > 0) - { - if (*ptr != ')') - { - modified = TRUE; - *ptr = ')'; - } - ptr++; - } - if (quoted) - { - if (*ptr != '"') - { - modified = TRUE; - *ptr = '"'; - } - ptr++; - } - if (*ptr != '\0') - { - modified = TRUE; - *ptr = '\0'; - } - return modified; -} -/* -** FIND_CHARACTER -- find an unquoted character in an RFC822 string -** -** Find an unquoted, non-commented character in an RFC822 -** string and return a pointer to its location in the -** string. -** -** Parameters: -** string -- the string to search -** character -- the character to find -** -** Returns: -** pointer to the character, or -** a pointer to the end of the line if character is not found -*/ - -char * -find_character(string, character) - char *string; - char character; -{ - bool backslash = FALSE; - bool quoted = FALSE; - int parencount = 0; - - while (string != NULL && *string != '\0') - { - if (backslash) - { - backslash = FALSE; - if (!quoted && character == '\\' && *string == '\\') - break; - string++; - continue; - } - switch (*string) - { - case '\\': - backslash = TRUE; - break; - - case '(': - if (!quoted) - parencount++; - break; - - case ')': - if (--parencount < 0) - parencount = 0; - break; - } - - /* Inside a comment, nothing matters */ - if (parencount > 0) - { - string++; - continue; - } - - if (*string == '"') - quoted = !quoted; - else if (*string == character && !quoted) - break; - string++; - } - - /* Return pointer to the character */ - return string; -} -/* -** XALLOC -- Allocate memory and bitch wildly on failure. -** -** THIS IS A CLUDGE. This should be made to give a proper -** error -- but after all, what can we do? -** -** Parameters: -** sz -- size of area to allocate. -** -** Returns: -** pointer to data region. -** -** Side Effects: -** Memory is allocated. -*/ - -char * -xalloc(sz) - register int sz; -{ - register char *p; - - /* some systems can't handle size zero mallocs */ - if (sz <= 0) - sz = 1; - - p = malloc((unsigned) sz); - if (p == NULL) - { - syserr("!Out of memory!!"); - /* exit(EX_UNAVAILABLE); */ - } - return (p); -} -/* -** COPYPLIST -- copy list of pointers. -** -** This routine is the equivalent of newstr for lists of -** pointers. -** -** Parameters: -** list -- list of pointers to copy. -** Must be NULL terminated. -** copycont -- if TRUE, copy the contents of the vector -** (which must be a string) also. -** -** Returns: -** a copy of 'list'. -** -** Side Effects: -** none. -*/ - -char ** -copyplist(list, copycont) - char **list; - bool copycont; -{ - register char **vp; - register char **newvp; - - for (vp = list; *vp != NULL; vp++) - continue; - - vp++; - - newvp = (char **) xalloc((int) (vp - list) * sizeof *vp); - bcopy((char *) list, (char *) newvp, (int) (vp - list) * sizeof *vp); - - if (copycont) - { - for (vp = newvp; *vp != NULL; vp++) - *vp = newstr(*vp); - } - - return (newvp); -} -/* -** COPYQUEUE -- copy address queue. -** -** This routine is the equivalent of newstr for address queues -** addresses marked with QDONTSEND aren't copied -** -** Parameters: -** addr -- list of address structures to copy. -** -** Returns: -** a copy of 'addr'. -** -** Side Effects: -** none. -*/ - -ADDRESS * -copyqueue(addr) - ADDRESS *addr; -{ - register ADDRESS *newaddr; - ADDRESS *ret; - register ADDRESS **tail = &ret; - - while (addr != NULL) - { - if (!bitset(QDONTSEND, addr->q_flags)) - { - newaddr = (ADDRESS *) xalloc(sizeof(ADDRESS)); - STRUCTCOPY(*addr, *newaddr); - *tail = newaddr; - tail = &newaddr->q_next; - } - addr = addr->q_next; - } - *tail = NULL; - - return ret; -} -/* -** PRINTAV -- print argument vector. -** -** Parameters: -** av -- argument vector. -** -** Returns: -** none. -** -** Side Effects: -** prints av. -*/ - -void -printav(av) - register char **av; -{ - while (*av != NULL) - { - if (tTd(0, 44)) - printf("\n\t%08lx=", (u_long) *av); - else - (void) putchar(' '); - xputs(*av++); - } - (void) putchar('\n'); -} -/* -** LOWER -- turn letter into lower case. -** -** Parameters: -** c -- character to turn into lower case. -** -** Returns: -** c, in lower case. -** -** Side Effects: -** none. -*/ - -char -lower(c) - register char c; -{ - return((isascii(c) && isupper(c)) ? tolower(c) : c); -} -/* -** XPUTS -- put string doing control escapes. -** -** Parameters: -** s -- string to put. -** -** Returns: -** none. -** -** Side Effects: -** output to stdout -*/ - -void -xputs(s) - register const char *s; -{ - register int c; - register struct metamac *mp; - bool shiftout = FALSE; - extern struct metamac MetaMacros[]; - - if (s == NULL) - { - printf("%s<null>%s", TermEscape.te_rv_on, TermEscape.te_rv_off); - return; - } - while ((c = (*s++ & 0377)) != '\0') - { - if (shiftout) - { - printf("%s", TermEscape.te_rv_off); - shiftout = FALSE; - } - if (!isascii(c)) - { - if (c == MATCHREPL) - { - printf("%s$", TermEscape.te_rv_on); - shiftout = TRUE; - if (*s == '\0') - continue; - c = *s++ & 0377; - goto printchar; - } - if (c == MACROEXPAND || c == MACRODEXPAND) - { - printf("%s$", TermEscape.te_rv_on); - if (c == MACRODEXPAND) - putchar('&'); - shiftout = TRUE; - if (*s == '\0') - continue; - if (strchr("=~&?", *s) != NULL) - putchar(*s++); - if (bitset(0200, *s)) - printf("{%s}", macname(*s++ & 0377)); - else - printf("%c", *s++); - continue; - } - for (mp = MetaMacros; mp->metaname != '\0'; mp++) - { - if ((mp->metaval & 0377) == c) - { - printf("%s$%c", - TermEscape.te_rv_on, - mp->metaname); - shiftout = TRUE; - break; - } - } - if (c == MATCHCLASS || c == MATCHNCLASS) - { - if (bitset(0200, *s)) - printf("{%s}", macname(*s++ & 0377)); - else if (*s != '\0') - printf("%c", *s++); - } - if (mp->metaname != '\0') - continue; - - /* unrecognized meta character */ - printf("%sM-", TermEscape.te_rv_on); - shiftout = TRUE; - c &= 0177; - } - printchar: - if (isprint(c)) - { - putchar(c); - continue; - } - - /* wasn't a meta-macro -- find another way to print it */ - switch (c) - { - case '\n': - c = 'n'; - break; - - case '\r': - c = 'r'; - break; - - case '\t': - c = 't'; - break; - } - if (!shiftout) - { - printf("%s", TermEscape.te_rv_on); - shiftout = TRUE; - } - if (isprint(c)) - { - (void) putchar('\\'); - (void) putchar(c); - } - else - { - (void) putchar('^'); - (void) putchar(c ^ 0100); - } - } - if (shiftout) - printf("%s", TermEscape.te_rv_off); - (void) fflush(stdout); -} -/* -** MAKELOWER -- Translate a line into lower case -** -** Parameters: -** p -- the string to translate. If NULL, return is -** immediate. -** -** Returns: -** none. -** -** Side Effects: -** String pointed to by p is translated to lower case. -** -** Called By: -** parse -*/ - -void -makelower(p) - register char *p; -{ - register char c; - - if (p == NULL) - return; - for (; (c = *p) != '\0'; p++) - if (isascii(c) && isupper(c)) - *p = tolower(c); -} -/* -** BUILDFNAME -- build full name from gecos style entry. -** -** This routine interprets the strange entry that would appear -** in the GECOS field of the password file. -** -** Parameters: -** p -- name to build. -** login -- the login name of this user (for &). -** buf -- place to put the result. -** buflen -- length of buf. -** -** Returns: -** none. -** -** Side Effects: -** none. -*/ - -void -buildfname(gecos, login, buf, buflen) - register char *gecos; - char *login; - char *buf; - int buflen; -{ - register char *p; - register char *bp = buf; - - if (*gecos == '*') - gecos++; - - /* copy gecos, interpolating & to be full name */ - for (p = gecos; *p != '\0' && *p != ',' && *p != ';' && *p != '%'; p++) - { - if (bp >= &buf[buflen - 1]) - { - /* buffer overflow -- just use login name */ - snprintf(buf, buflen, "%s", login); - return; - } - if (*p == '&') - { - /* interpolate full name */ - snprintf(bp, buflen - (bp - buf), "%s", login); - *bp = toupper(*bp); - bp += strlen(bp); - } - else - *bp++ = *p; - } - *bp = '\0'; -} -/* -** FIXCRLF -- fix <CR><LF> in line. -** -** Looks for the <CR><LF> combination and turns it into the -** UNIX canonical <NL> character. It only takes one line, -** i.e., it is assumed that the first <NL> found is the end -** of the line. -** -** Parameters: -** line -- the line to fix. -** stripnl -- if true, strip the newline also. -** -** Returns: -** none. -** -** Side Effects: -** line is changed in place. -*/ - -void -fixcrlf(line, stripnl) - char *line; - bool stripnl; -{ - register char *p; - - p = strchr(line, '\n'); - if (p == NULL) - return; - if (p > line && p[-1] == '\r') - p--; - if (!stripnl) - *p++ = '\n'; - *p = '\0'; -} -/* -** PUTLINE -- put a line like fputs obeying SMTP conventions -** -** This routine always guarantees outputing a newline (or CRLF, -** as appropriate) at the end of the string. -** -** Parameters: -** l -- line to put. -** mci -- the mailer connection information. -** -** Returns: -** none -** -** Side Effects: -** output of l to fp. -*/ - -void -putline(l, mci) - register char *l; - register MCI *mci; -{ - putxline(l, strlen(l), mci, PXLF_MAPFROM); -} -/* -** PUTXLINE -- putline with flags bits. -** -** This routine always guarantees outputing a newline (or CRLF, -** as appropriate) at the end of the string. -** -** Parameters: -** l -- line to put. -** len -- the length of the line. -** mci -- the mailer connection information. -** pxflags -- flag bits: -** PXLF_MAPFROM -- map From_ to >From_. -** PXLF_STRIP8BIT -- strip 8th bit. -** PXLF_HEADER -- map bare newline in header to newline space. -** -** Returns: -** none -** -** Side Effects: -** output of l to fp. -*/ - -void -putxline(l, len, mci, pxflags) - register char *l; - size_t len; - register MCI *mci; - int pxflags; -{ - register char *p, *end; - int slop = 0; - size_t eol_len = strlen(mci->mci_mailer->m_eol); - - /* strip out 0200 bits -- these can look like TELNET protocol */ - if (bitset(MCIF_7BIT, mci->mci_flags) || - bitset(PXLF_STRIP8BIT, pxflags)) - { - register char svchar; - - for (p = l; (svchar = *p) != '\0'; ++p) - if (bitset(0200, svchar)) - *p = svchar &~ 0200; - } - - end = l + len; - do - { - /* find the end of the line */ - p = memchr(l, '\n', end - l); - if (p == NULL) - p = end; - - if (TrafficLogFile != NULL) - fprintf(TrafficLogFile, "%05d >>> ", (int) getpid()); - - /* check for line overflow */ - while (mci->mci_mailer->m_linelimit > 0 && - (p - l + slop) > mci->mci_mailer->m_linelimit) - { - char *l_base = l; - register char *q = &l[mci->mci_mailer->m_linelimit - slop - 1]; - - if (l[0] == '.' && slop == 0 && - bitnset(M_XDOT, mci->mci_mailer->m_flags)) - { - (void) putc('.', mci->mci_out); - if (!bitset(MCIF_INHEADER, mci->mci_flags)) - mci->mci_contentlen++; - if (TrafficLogFile != NULL) - (void) putc('.', TrafficLogFile); - } - else if (l[0] == 'F' && slop == 0 && - bitset(PXLF_MAPFROM, pxflags) && - strncmp(l, "From ", 5) == 0 && - bitnset(M_ESCFROM, mci->mci_mailer->m_flags)) - { - (void) putc('>', mci->mci_out); - if (!bitset(MCIF_INHEADER, mci->mci_flags)) - mci->mci_contentlen++; - if (TrafficLogFile != NULL) - (void) putc('>', TrafficLogFile); - } - while (l < q) - { - (void) putc(*l++, mci->mci_out); - if (!bitset(MCIF_INHEADER, mci->mci_flags)) - mci->mci_contentlen++; - } - (void) putc('!', mci->mci_out); - if (!bitset(MCIF_INHEADER, mci->mci_flags)) - mci->mci_contentlen++; - fputs(mci->mci_mailer->m_eol, mci->mci_out); - if (!bitset(MCIF_INHEADER, mci->mci_flags)) - mci->mci_contentlen += eol_len; - (void) putc(' ', mci->mci_out); - if (!bitset(MCIF_INHEADER, mci->mci_flags)) - mci->mci_contentlen++; - if (TrafficLogFile != NULL) - { - for (l = l_base; l < q; l++) - (void) putc(*l, TrafficLogFile); - fprintf(TrafficLogFile, "!\n%05d >>> ", - (int) getpid()); - } - slop = 1; - } - - /* output last part */ - if (l[0] == '.' && slop == 0 && - bitnset(M_XDOT, mci->mci_mailer->m_flags)) - { - (void) putc('.', mci->mci_out); - if (!bitset(MCIF_INHEADER, mci->mci_flags)) - mci->mci_contentlen++; - if (TrafficLogFile != NULL) - (void) putc('.', TrafficLogFile); - } - else if (l[0] == 'F' && slop == 0 && - bitset(PXLF_MAPFROM, pxflags) && - strncmp(l, "From ", 5) == 0 && - bitnset(M_ESCFROM, mci->mci_mailer->m_flags)) - { - (void) putc('>', mci->mci_out); - if (!bitset(MCIF_INHEADER, mci->mci_flags)) - mci->mci_contentlen++; - if (TrafficLogFile != NULL) - (void) putc('>', TrafficLogFile); - } - for ( ; l < p; ++l) - { - if (TrafficLogFile != NULL) - (void) putc(*l, TrafficLogFile); - (void) putc(*l, mci->mci_out); - if (!bitset(MCIF_INHEADER, mci->mci_flags)) - mci->mci_contentlen++; - } - if (TrafficLogFile != NULL) - (void) putc('\n', TrafficLogFile); - fputs(mci->mci_mailer->m_eol, mci->mci_out); - if (!bitset(MCIF_INHEADER, mci->mci_flags)) - mci->mci_contentlen += eol_len; - if (l < end && *l == '\n') - { - if (*++l != ' ' && *l != '\t' && *l != '\0' && - bitset(PXLF_HEADER, pxflags)) - { - (void) putc(' ', mci->mci_out); - if (!bitset(MCIF_INHEADER, mci->mci_flags)) - mci->mci_contentlen++; - if (TrafficLogFile != NULL) - (void) putc(' ', TrafficLogFile); - } - } - } while (l < end); -} -/* -** XUNLINK -- unlink a file, doing logging as appropriate. -** -** Parameters: -** f -- name of file to unlink. -** -** Returns: -** none. -** -** Side Effects: -** f is unlinked. -*/ - -void -xunlink(f) - char *f; -{ - register int i; - - if (LogLevel > 98) - sm_syslog(LOG_DEBUG, CurEnv->e_id, - "unlink %s", - f); - - i = unlink(f); - if (i < 0 && LogLevel > 97) - sm_syslog(LOG_DEBUG, CurEnv->e_id, - "%s: unlink-fail %d", - f, errno); -} -/* -** XFCLOSE -- close a file, doing logging as appropriate. -** -** Parameters: -** fp -- file pointer for the file to close -** a, b -- miscellaneous crud to print for debugging -** -** Returns: -** none. -** -** Side Effects: -** fp is closed. -*/ - -void -xfclose(fp, a, b) - FILE *fp; - char *a, *b; -{ - if (tTd(53, 99)) - printf("xfclose(%lx) %s %s\n", (u_long) fp, a, b); -#if XDEBUG - if (fileno(fp) == 1) - syserr("xfclose(%s %s): fd = 1", a, b); -#endif - if (fclose(fp) < 0 && tTd(53, 99)) - printf("xfclose FAILURE: %s\n", errstring(errno)); -} -/* -** SFGETS -- "safe" fgets -- times out and ignores random interrupts. -** -** Parameters: -** buf -- place to put the input line. -** siz -- size of buf. -** fp -- file to read from. -** timeout -- the timeout before error occurs. -** during -- what we are trying to read (for error messages). -** -** Returns: -** NULL on error (including timeout). This will also leave -** buf containing a null string. -** buf otherwise. -** -** Side Effects: -** none. -*/ - -static jmp_buf CtxReadTimeout; -static void readtimeout __P((time_t)); - -char * -sfgets(buf, siz, fp, timeout, during) - char *buf; - int siz; - FILE *fp; - time_t timeout; - char *during; -{ - register EVENT *ev = NULL; - register char *p; - int save_errno; - - if (fp == NULL) - { - buf[0] = '\0'; - return NULL; - } - - /* set the timeout */ - if (timeout != 0) - { - if (setjmp(CtxReadTimeout) != 0) - { - if (LogLevel > 1) - sm_syslog(LOG_NOTICE, CurEnv->e_id, - "timeout waiting for input from %.100s during %s", - CurHostName ? CurHostName : "local", - during); - buf[0] = '\0'; -#if XDEBUG - checkfd012(during); -#endif - if (TrafficLogFile != NULL) - fprintf(TrafficLogFile, "%05d <<< [TIMEOUT]\n", - (int) getpid()); - errno = 0; - return (NULL); - } - ev = setevent(timeout, readtimeout, 0); - } - - /* try to read */ - p = NULL; - errno = 0; - while (!feof(fp) && !ferror(fp)) - { - errno = 0; - p = fgets(buf, siz, fp); - if (p != NULL || errno != EINTR) - break; - clearerr(fp); - } - save_errno = errno; - - /* clear the event if it has not sprung */ - clrevent(ev); - - /* clean up the books and exit */ - LineNumber++; - if (p == NULL) - { - buf[0] = '\0'; - if (TrafficLogFile != NULL) - fprintf(TrafficLogFile, "%05d <<< [EOF]\n", (int) getpid()); - errno = save_errno; - return (NULL); - } - if (TrafficLogFile != NULL) - fprintf(TrafficLogFile, "%05d <<< %s", (int) getpid(), buf); - if (SevenBitInput) - { - for (p = buf; *p != '\0'; p++) - *p &= ~0200; - } - else if (!HasEightBits) - { - for (p = buf; *p != '\0'; p++) - { - if (bitset(0200, *p)) - { - HasEightBits = TRUE; - break; - } - } - } - return (buf); -} - -/* ARGSUSED */ -static void -readtimeout(timeout) - time_t timeout; -{ - longjmp(CtxReadTimeout, 1); -} -/* -** FGETFOLDED -- like fgets, but know about folded lines. -** -** Parameters: -** buf -- place to put result. -** n -- bytes available. -** f -- file to read from. -** -** Returns: -** input line(s) on success, NULL on error or EOF. -** This will normally be buf -- unless the line is too -** long, when it will be xalloc()ed. -** -** Side Effects: -** buf gets lines from f, with continuation lines (lines -** with leading white space) appended. CRLF's are mapped -** into single newlines. Any trailing NL is stripped. -*/ - -char * -fgetfolded(buf, n, f) - char *buf; - register int n; - FILE *f; -{ - register char *p = buf; - char *bp = buf; - register int i; - - n--; - while ((i = getc(f)) != EOF) - { - if (i == '\r') - { - i = getc(f); - if (i != '\n') - { - if (i != EOF) - (void) ungetc(i, f); - i = '\r'; - } - } - if (--n <= 0) - { - /* allocate new space */ - char *nbp; - int nn; - - nn = (p - bp); - if (nn < MEMCHUNKSIZE) - nn *= 2; - else - nn += MEMCHUNKSIZE; - nbp = xalloc(nn); - bcopy(bp, nbp, p - bp); - p = &nbp[p - bp]; - if (bp != buf) - free(bp); - bp = nbp; - n = nn - (p - bp); - } - *p++ = i; - if (i == '\n') - { - LineNumber++; - i = getc(f); - if (i != EOF) - (void) ungetc(i, f); - if (i != ' ' && i != '\t') - break; - } - } - if (p == bp) - return (NULL); - if (p[-1] == '\n') - p--; - *p = '\0'; - return (bp); -} -/* -** CURTIME -- return current time. -** -** Parameters: -** none. -** -** Returns: -** the current time. -** -** Side Effects: -** none. -*/ - -time_t -curtime() -{ - auto time_t t; - - (void) time(&t); - return (t); -} -/* -** ATOBOOL -- convert a string representation to boolean. -** -** Defaults to "TRUE" -** -** Parameters: -** s -- string to convert. Takes "tTyY" as true, -** others as false. -** -** Returns: -** A boolean representation of the string. -** -** Side Effects: -** none. -*/ - -bool -atobool(s) - register char *s; -{ - if (s == NULL || *s == '\0' || strchr("tTyY", *s) != NULL) - return (TRUE); - return (FALSE); -} -/* -** ATOOCT -- convert a string representation to octal. -** -** Parameters: -** s -- string to convert. -** -** Returns: -** An integer representing the string interpreted as an -** octal number. -** -** Side Effects: -** none. -*/ - -int -atooct(s) - register char *s; -{ - register int i = 0; - - while (*s >= '0' && *s <= '7') - i = (i << 3) | (*s++ - '0'); - return (i); -} -/* -** BITINTERSECT -- tell if two bitmaps intersect -** -** Parameters: -** a, b -- the bitmaps in question -** -** Returns: -** TRUE if they have a non-null intersection -** FALSE otherwise -** -** Side Effects: -** none. -*/ - -bool -bitintersect(a, b) - BITMAP a; - BITMAP b; -{ - int i; - - for (i = BITMAPBYTES / sizeof (int); --i >= 0; ) - if ((a[i] & b[i]) != 0) - return (TRUE); - return (FALSE); -} -/* -** BITZEROP -- tell if a bitmap is all zero -** -** Parameters: -** map -- the bit map to check -** -** Returns: -** TRUE if map is all zero. -** FALSE if there are any bits set in map. -** -** Side Effects: -** none. -*/ - -bool -bitzerop(map) - BITMAP map; -{ - int i; - - for (i = BITMAPBYTES / sizeof (int); --i >= 0; ) - if (map[i] != 0) - return (FALSE); - return (TRUE); -} -/* -** STRCONTAINEDIN -- tell if one string is contained in another -** -** Parameters: -** a -- possible substring. -** b -- possible superstring. -** -** Returns: -** TRUE if a is contained in b. -** FALSE otherwise. -*/ - -bool -strcontainedin(a, b) - register char *a; - register char *b; -{ - int la; - int lb; - int c; - - la = strlen(a); - lb = strlen(b); - c = *a; - if (isascii(c) && isupper(c)) - c = tolower(c); - for (; lb-- >= la; b++) - { - if (*b != c && isascii(*b) && isupper(*b) && tolower(*b) != c) - continue; - if (strncasecmp(a, b, la) == 0) - return TRUE; - } - return FALSE; -} -/* -** CHECKFD012 -- check low numbered file descriptors -** -** File descriptors 0, 1, and 2 should be open at all times. -** This routine verifies that, and fixes it if not true. -** -** Parameters: -** where -- a tag printed if the assertion failed -** -** Returns: -** none -*/ - -void -checkfd012(where) - char *where; -{ -#if XDEBUG - register int i; - - for (i = 0; i < 3; i++) - fill_fd(i, where); -#endif /* XDEBUG */ -} -/* -** CHECKFDOPEN -- make sure file descriptor is open -- for extended debugging -** -** Parameters: -** fd -- file descriptor to check. -** where -- tag to print on failure. -** -** Returns: -** none. -*/ - -void -checkfdopen(fd, where) - int fd; - char *where; -{ -#if XDEBUG - struct stat st; - - if (fstat(fd, &st) < 0 && errno == EBADF) - { - syserr("checkfdopen(%d): %s not open as expected!", fd, where); - printopenfds(TRUE); - } -#endif -} -/* -** CHECKFDS -- check for new or missing file descriptors -** -** Parameters: -** where -- tag for printing. If null, take a base line. -** -** Returns: -** none -** -** Side Effects: -** If where is set, shows changes since the last call. -*/ - -void -checkfds(where) - char *where; -{ - int maxfd; - register int fd; - bool printhdr = TRUE; - int save_errno = errno; - static BITMAP baseline; - extern int DtableSize; - - if (DtableSize > 256) - maxfd = 256; - else - maxfd = DtableSize; - if (where == NULL) - clrbitmap(baseline); - - for (fd = 0; fd < maxfd; fd++) - { - struct stat stbuf; - - if (fstat(fd, &stbuf) < 0 && errno != EOPNOTSUPP) - { - if (!bitnset(fd, baseline)) - continue; - clrbitn(fd, baseline); - } - else if (!bitnset(fd, baseline)) - setbitn(fd, baseline); - else - continue; - - /* file state has changed */ - if (where == NULL) - continue; - if (printhdr) - { - sm_syslog(LOG_DEBUG, CurEnv->e_id, - "%s: changed fds:", - where); - printhdr = FALSE; - } - dumpfd(fd, TRUE, TRUE); - } - errno = save_errno; -} -/* -** PRINTOPENFDS -- print the open file descriptors (for debugging) -** -** Parameters: -** logit -- if set, send output to syslog; otherwise -** print for debugging. -** -** Returns: -** none. -*/ - -#include <arpa/inet.h> - -void -printopenfds(logit) - bool logit; -{ - register int fd; - extern int DtableSize; - - for (fd = 0; fd < DtableSize; fd++) - dumpfd(fd, FALSE, logit); -} -/* -** DUMPFD -- dump a file descriptor -** -** Parameters: -** fd -- the file descriptor to dump. -** printclosed -- if set, print a notification even if -** it is closed; otherwise print nothing. -** logit -- if set, send output to syslog instead of stdout. -*/ - -void -dumpfd(fd, printclosed, logit) - int fd; - bool printclosed; - bool logit; -{ - register char *p; - char *hp; -#ifdef S_IFSOCK - SOCKADDR sa; -#endif - auto SOCKADDR_LEN_T slen; - int i; -#if STAT64 > 0 - struct stat64 st; -#else - struct stat st; -#endif - char buf[200]; - - p = buf; - snprintf(p, SPACELEFT(buf, p), "%3d: ", fd); - p += strlen(p); - - if ( -#if STAT64 > 0 - fstat64(fd, &st) -#else - fstat(fd, &st) -#endif - < 0) - { - if (errno != EBADF) - { - snprintf(p, SPACELEFT(buf, p), "CANNOT STAT (%s)", - errstring(errno)); - goto printit; - } - else if (printclosed) - { - snprintf(p, SPACELEFT(buf, p), "CLOSED"); - goto printit; - } - return; - } - - i = fcntl(fd, F_GETFL, NULL); - if (i != -1) - { - snprintf(p, SPACELEFT(buf, p), "fl=0x%x, ", i); - p += strlen(p); - } - - snprintf(p, SPACELEFT(buf, p), "mode=%o: ", st.st_mode); - p += strlen(p); - switch (st.st_mode & S_IFMT) - { -#ifdef S_IFSOCK - case S_IFSOCK: - snprintf(p, SPACELEFT(buf, p), "SOCK "); - p += strlen(p); - slen = sizeof sa; - if (getsockname(fd, &sa.sa, &slen) < 0) - snprintf(p, SPACELEFT(buf, p), "(%s)", errstring(errno)); - else - { - hp = hostnamebyanyaddr(&sa); - if (sa.sa.sa_family == AF_INET) - snprintf(p, SPACELEFT(buf, p), "%s/%d", - hp, ntohs(sa.sin.sin_port)); - else - snprintf(p, SPACELEFT(buf, p), "%s", hp); - } - p += strlen(p); - snprintf(p, SPACELEFT(buf, p), "->"); - p += strlen(p); - slen = sizeof sa; - if (getpeername(fd, &sa.sa, &slen) < 0) - snprintf(p, SPACELEFT(buf, p), "(%s)", errstring(errno)); - else - { - hp = hostnamebyanyaddr(&sa); - if (sa.sa.sa_family == AF_INET) - snprintf(p, SPACELEFT(buf, p), "%s/%d", - hp, ntohs(sa.sin.sin_port)); - else - snprintf(p, SPACELEFT(buf, p), "%s", hp); - } - break; -#endif - - case S_IFCHR: - snprintf(p, SPACELEFT(buf, p), "CHR: "); - p += strlen(p); - goto defprint; - - case S_IFBLK: - snprintf(p, SPACELEFT(buf, p), "BLK: "); - p += strlen(p); - goto defprint; - -#if defined(S_IFIFO) && (!defined(S_IFSOCK) || S_IFIFO != S_IFSOCK) - case S_IFIFO: - snprintf(p, SPACELEFT(buf, p), "FIFO: "); - p += strlen(p); - goto defprint; -#endif - -#ifdef S_IFDIR - case S_IFDIR: - snprintf(p, SPACELEFT(buf, p), "DIR: "); - p += strlen(p); - goto defprint; -#endif - -#ifdef S_IFLNK - case S_IFLNK: - snprintf(p, SPACELEFT(buf, p), "LNK: "); - p += strlen(p); - goto defprint; -#endif - - default: -defprint: - if (sizeof st.st_ino > sizeof (long)) - snprintf(p, SPACELEFT(buf, p), - "dev=%d/%d, ino=%s, nlink=%d, u/gid=%d/%d, ", - major(st.st_dev), minor(st.st_dev), - quad_to_string(st.st_ino), - st.st_nlink, st.st_uid, st.st_gid); - else - snprintf(p, SPACELEFT(buf, p), - "dev=%d/%d, ino=%lu, nlink=%d, u/gid=%d/%d, ", - major(st.st_dev), minor(st.st_dev), - (unsigned long) st.st_ino, - st.st_nlink, st.st_uid, st.st_gid); - if (sizeof st.st_size > sizeof (long)) - snprintf(p, SPACELEFT(buf, p), "size=%s", - quad_to_string(st.st_size)); - else - snprintf(p, SPACELEFT(buf, p), "size=%lu", - (unsigned long) st.st_size); - break; - } - -printit: - if (logit) - sm_syslog(LOG_DEBUG, CurEnv ? CurEnv->e_id : NULL, - "%.800s", buf); - else - printf("%s\n", buf); -} -/* -** SHORTEN_HOSTNAME -- strip local domain information off of hostname. -** -** Parameters: -** host -- the host to shorten (stripped in place). -** -** Returns: -** none. -*/ - -void -shorten_hostname(host) - char host[]; -{ - register char *p; - char *mydom; - int i; - bool canon = FALSE; - - /* strip off final dot */ - p = &host[strlen(host) - 1]; - if (*p == '.') - { - *p = '\0'; - canon = TRUE; - } - - /* see if there is any domain at all -- if not, we are done */ - p = strchr(host, '.'); - if (p == NULL) - return; - - /* yes, we have a domain -- see if it looks like us */ - mydom = macvalue('m', CurEnv); - if (mydom == NULL) - mydom = ""; - i = strlen(++p); - if ((canon ? strcasecmp(p, mydom) : strncasecmp(p, mydom, i)) == 0 && - (mydom[i] == '.' || mydom[i] == '\0')) - *--p = '\0'; -} -/* -** PROG_OPEN -- open a program for reading -** -** Parameters: -** argv -- the argument list. -** pfd -- pointer to a place to store the file descriptor. -** e -- the current envelope. -** -** Returns: -** pid of the process -- -1 if it failed. -*/ - -int -prog_open(argv, pfd, e) - char **argv; - int *pfd; - ENVELOPE *e; -{ - int pid; - int i; - int saveerrno; - int fdv[2]; - char *p, *q; - char buf[MAXLINE + 1]; - extern int DtableSize; - - if (pipe(fdv) < 0) - { - syserr("%s: cannot create pipe for stdout", argv[0]); - return -1; - } - pid = fork(); - if (pid < 0) - { - syserr("%s: cannot fork", argv[0]); - close(fdv[0]); - close(fdv[1]); - return -1; - } - if (pid > 0) - { - /* parent */ - close(fdv[1]); - *pfd = fdv[0]; - return pid; - } - - /* child -- close stdin */ - close(0); - - /* stdout goes back to parent */ - close(fdv[0]); - if (dup2(fdv[1], 1) < 0) - { - syserr("%s: cannot dup2 for stdout", argv[0]); - _exit(EX_OSERR); - } - close(fdv[1]); - - /* stderr goes to transcript if available */ - if (e->e_xfp != NULL) - { - if (dup2(fileno(e->e_xfp), 2) < 0) - { - syserr("%s: cannot dup2 for stderr", argv[0]); - _exit(EX_OSERR); - } - } - - /* this process has no right to the queue file */ - if (e->e_lockfp != NULL) - close(fileno(e->e_lockfp)); - - /* run as default user */ - endpwent(); - if (setgid(DefGid) < 0 && geteuid() == 0) - syserr("prog_open: setgid(%ld) failed", (long) DefGid); - if (setuid(DefUid) < 0 && geteuid() == 0) - syserr("prog_open: setuid(%ld) failed", (long) DefUid); - - /* run in some directory */ - if (ProgMailer != NULL) - p = ProgMailer->m_execdir; - else - p = NULL; - for (; p != NULL; p = q) - { - q = strchr(p, ':'); - if (q != NULL) - *q = '\0'; - expand(p, buf, sizeof buf, e); - if (q != NULL) - *q++ = ':'; - if (buf[0] != '\0' && chdir(buf) >= 0) - break; - } - if (p == NULL) - { - /* backup directories */ - if (chdir("/tmp") < 0) - (void) chdir("/"); - } - - /* arrange for all the files to be closed */ - for (i = 3; i < DtableSize; i++) - { - register int j; - - if ((j = fcntl(i, F_GETFD, 0)) != -1) - (void) fcntl(i, F_SETFD, j | 1); - } - - /* now exec the process */ - execve(argv[0], (ARGV_T) argv, (ARGV_T) UserEnviron); - - /* woops! failed */ - saveerrno = errno; - syserr("%s: cannot exec", argv[0]); - if (transienterror(saveerrno)) - _exit(EX_OSERR); - _exit(EX_CONFIG); - return -1; /* avoid compiler warning on IRIX */ -} -/* -** GET_COLUMN -- look up a Column in a line buffer -** -** Parameters: -** line -- the raw text line to search. -** col -- the column number to fetch. -** delim -- the delimiter between columns. If null, -** use white space. -** buf -- the output buffer. -** buflen -- the length of buf. -** -** Returns: -** buf if successful. -** NULL otherwise. -*/ - -char * -get_column(line, col, delim, buf, buflen) - char line[]; - int col; - char delim; - char buf[]; - int buflen; -{ - char *p; - char *begin, *end; - int i; - char delimbuf[4]; - - if (delim == '\0') - strcpy(delimbuf, "\n\t "); - else - { - delimbuf[0] = delim; - delimbuf[1] = '\0'; - } - - p = line; - if (*p == '\0') - return NULL; /* line empty */ - if (*p == delim && col == 0) - return NULL; /* first column empty */ - - begin = line; - - if (col == 0 && delim == '\0') - { - while (*begin != '\0' && isascii(*begin) && isspace(*begin)) - begin++; - } - - for (i = 0; i < col; i++) - { - if ((begin = strpbrk(begin, delimbuf)) == NULL) - return NULL; /* no such column */ - begin++; - if (delim == '\0') - { - while (*begin != '\0' && isascii(*begin) && isspace(*begin)) - begin++; - } - } - - end = strpbrk(begin, delimbuf); - if (end == NULL) - i = strlen(begin); - else - i = end - begin; - if (i >= buflen) - i = buflen - 1; - strncpy(buf, begin, i); - buf[i] = '\0'; - return buf; -} -/* -** CLEANSTRCPY -- copy string keeping out bogus characters -** -** Parameters: -** t -- "to" string. -** f -- "from" string. -** l -- length of space available in "to" string. -** -** Returns: -** none. -*/ - -void -cleanstrcpy(t, f, l) - register char *t; - register char *f; - int l; -{ - /* check for newlines and log if necessary */ - (void) denlstring(f, TRUE, TRUE); - - l--; - while (l > 0 && *f != '\0') - { - if (isascii(*f) && - (isalnum(*f) || strchr("!#$%&'*+-./^_`{|}~", *f) != NULL)) - { - l--; - *t++ = *f; - } - f++; - } - *t = '\0'; -} -/* -** DENLSTRING -- convert newlines in a string to spaces -** -** Parameters: -** s -- the input string -** strict -- if set, don't permit continuation lines. -** logattacks -- if set, log attempted attacks. -** -** Returns: -** A pointer to a version of the string with newlines -** mapped to spaces. This should be copied. -*/ - -char * -denlstring(s, strict, logattacks) - char *s; - bool strict; - bool logattacks; -{ - register char *p; - int l; - static char *bp = NULL; - static int bl = 0; - - p = s; - while ((p = strchr(p, '\n')) != NULL) - if (strict || (*++p != ' ' && *p != '\t')) - break; - if (p == NULL) - return s; - - l = strlen(s) + 1; - if (bl < l) - { - /* allocate more space */ - if (bp != NULL) - free(bp); - bp = xalloc(l); - bl = l; - } - strcpy(bp, s); - for (p = bp; (p = strchr(p, '\n')) != NULL; ) - *p++ = ' '; - - if (logattacks) - { - sm_syslog(LOG_NOTICE, CurEnv->e_id, - "POSSIBLE ATTACK from %.100s: newline in string \"%s\"", - RealHostName == NULL ? "[UNKNOWN]" : RealHostName, - shortenstring(bp, MAXSHORTSTR)); - } - - return bp; -} -/* -** PATH_IS_DIR -- check to see if file exists and is a directory. -** -** There are some additional checks for security violations in -** here. This routine is intended to be used for the host status -** support. -** -** Parameters: -** pathname -- pathname to check for directory-ness. -** createflag -- if set, create directory if needed. -** -** Returns: -** TRUE -- if the indicated pathname is a directory -** FALSE -- otherwise -*/ - -int -path_is_dir(pathname, createflag) - char *pathname; - bool createflag; -{ - struct stat statbuf; - -#if HASLSTAT - if (lstat(pathname, &statbuf) < 0) -#else - if (stat(pathname, &statbuf) < 0) -#endif - { - if (errno != ENOENT || !createflag) - return FALSE; - if (mkdir(pathname, 0755) < 0) - return FALSE; - return TRUE; - } - if (!S_ISDIR(statbuf.st_mode)) - { - errno = ENOTDIR; - return FALSE; - } - - /* security: don't allow writable directories */ - if (bitset(S_IWGRP|S_IWOTH, statbuf.st_mode)) - { - errno = EACCES; - return FALSE; - } - - return TRUE; -} -/* -** PROC_LIST_ADD -- add process id to list of our children -** -** Parameters: -** pid -- pid to add to list. -** -** Returns: -** none -*/ - -struct procs -{ - pid_t proc_pid; - char *proc_task; -}; - -static struct procs *ProcListVec = NULL; -static int ProcListSize = 0; - -#define NO_PID ((pid_t) 0) -#ifndef PROC_LIST_SEG -# define PROC_LIST_SEG 32 /* number of pids to alloc at a time */ -#endif - -void -proc_list_add(pid, task) - pid_t pid; - char *task; -{ - int i; - - for (i = 0; i < ProcListSize; i++) - { - if (ProcListVec[i].proc_pid == NO_PID) - break; - } - if (i >= ProcListSize) - { - /* probe the existing vector to avoid growing infinitely */ - proc_list_probe(); - - /* now scan again */ - for (i = 0; i < ProcListSize; i++) - { - if (ProcListVec[i].proc_pid == NO_PID) - break; - } - } - if (i >= ProcListSize) - { - /* grow process list */ - struct procs *npv; - - npv = (struct procs *) xalloc(sizeof (struct procs) * (ProcListSize + PROC_LIST_SEG)); - if (ProcListSize > 0) - { - bcopy(ProcListVec, npv, ProcListSize * - sizeof (struct procs)); - free(ProcListVec); - } - for (i = ProcListSize; i < ProcListSize + PROC_LIST_SEG; i++) - { - npv[i].proc_pid = NO_PID; - npv[i].proc_task = NULL; - } - i = ProcListSize; - ProcListSize += PROC_LIST_SEG; - ProcListVec = npv; - } - ProcListVec[i].proc_pid = pid; - ProcListVec[i].proc_task = newstr(task); - - /* if process adding itself, it's not a child */ - if (pid != getpid()) - CurChildren++; -} -/* -** PROC_LIST_SET -- set pid task in process list -** -** Parameters: -** pid -- pid to set -** task -- task of pid -** -** Returns: -** none. -*/ - -void -proc_list_set(pid, task) - pid_t pid; - char *task; -{ - int i; - - for (i = 0; i < ProcListSize; i++) - { - if (ProcListVec[i].proc_pid == pid) - { - if (ProcListVec[i].proc_task != NULL) - free(ProcListVec[i].proc_task); - ProcListVec[i].proc_task = newstr(task); - break; - } - } -} -/* -** PROC_LIST_DROP -- drop pid from process list -** -** Parameters: -** pid -- pid to drop -** -** Returns: -** none. -*/ - -void -proc_list_drop(pid) - pid_t pid; -{ - int i; - - for (i = 0; i < ProcListSize; i++) - { - if (ProcListVec[i].proc_pid == pid) - { - ProcListVec[i].proc_pid = NO_PID; - if (ProcListVec[i].proc_task != NULL) - { - free(ProcListVec[i].proc_task); - ProcListVec[i].proc_task = NULL; - } - break; - } - } - if (CurChildren > 0) - CurChildren--; -} -/* -** PROC_LIST_CLEAR -- clear the process list -** -** Parameters: -** none. -** -** Returns: -** none. -*/ - -void -proc_list_clear() -{ - int i; - - /* start from 1 since 0 is the daemon itself */ - for (i = 1; i < ProcListSize; i++) - { - ProcListVec[i].proc_pid = NO_PID; - if (ProcListVec[i].proc_task != NULL) - { - free(ProcListVec[i].proc_task); - ProcListVec[i].proc_task = NULL; - } - } - CurChildren = 0; -} -/* -** PROC_LIST_PROBE -- probe processes in the list to see if they still exist -** -** Parameters: -** none -** -** Returns: -** none -*/ - -void -proc_list_probe() -{ - int i; - - /* start from 1 since 0 is the daemon itself */ - for (i = 1; i < ProcListSize; i++) - { - if (ProcListVec[i].proc_pid == NO_PID) - continue; - if (kill(ProcListVec[i].proc_pid, 0) < 0) - { - if (LogLevel > 3) - sm_syslog(LOG_DEBUG, CurEnv->e_id, - "proc_list_probe: lost pid %d", - (int) ProcListVec[i].proc_pid); - ProcListVec[i].proc_pid = NO_PID; - if (ProcListVec[i].proc_task != NULL) - { - free(ProcListVec[i].proc_task); - ProcListVec[i].proc_task = NULL; - } - CurChildren--; - } - } - if (CurChildren < 0) - CurChildren = 0; -} -/* -** PROC_LIST_DISPLAY -- display the process list -** -** Parameters: -** out -- output file pointer -** -** Returns: -** none. -*/ - -void -proc_list_display(out) - FILE *out; -{ - int i; - - for (i = 0; i < ProcListSize; i++) - { - if (ProcListVec[i].proc_pid == NO_PID) - continue; - - fprintf(out, "%d %s%s\n", (int) ProcListVec[i].proc_pid, - ProcListVec[i].proc_task != NULL ? - ProcListVec[i].proc_task : "(unknown)", - (OpMode == MD_SMTP || - OpMode == MD_DAEMON || - OpMode == MD_ARPAFTP) ? "\r" : ""); - } -} -/* -** SM_STRCASECMP -- 8-bit clean version of strcasecmp -** -** Thank you, vendors, for making this all necessary. -*/ - -/* - * Copyright (c) 1987, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)strcasecmp.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -/* - * This array is designed for mapping upper and lower case letter - * together for a case independent comparison. The mappings are - * based upon ascii character sequences. - */ -static const u_char charmap[] = { - 0000, 0001, 0002, 0003, 0004, 0005, 0006, 0007, - 0010, 0011, 0012, 0013, 0014, 0015, 0016, 0017, - 0020, 0021, 0022, 0023, 0024, 0025, 0026, 0027, - 0030, 0031, 0032, 0033, 0034, 0035, 0036, 0037, - 0040, 0041, 0042, 0043, 0044, 0045, 0046, 0047, - 0050, 0051, 0052, 0053, 0054, 0055, 0056, 0057, - 0060, 0061, 0062, 0063, 0064, 0065, 0066, 0067, - 0070, 0071, 0072, 0073, 0074, 0075, 0076, 0077, - 0100, 0141, 0142, 0143, 0144, 0145, 0146, 0147, - 0150, 0151, 0152, 0153, 0154, 0155, 0156, 0157, - 0160, 0161, 0162, 0163, 0164, 0165, 0166, 0167, - 0170, 0171, 0172, 0133, 0134, 0135, 0136, 0137, - 0140, 0141, 0142, 0143, 0144, 0145, 0146, 0147, - 0150, 0151, 0152, 0153, 0154, 0155, 0156, 0157, - 0160, 0161, 0162, 0163, 0164, 0165, 0166, 0167, - 0170, 0171, 0172, 0173, 0174, 0175, 0176, 0177, - 0200, 0201, 0202, 0203, 0204, 0205, 0206, 0207, - 0210, 0211, 0212, 0213, 0214, 0215, 0216, 0217, - 0220, 0221, 0222, 0223, 0224, 0225, 0226, 0227, - 0230, 0231, 0232, 0233, 0234, 0235, 0236, 0237, - 0240, 0241, 0242, 0243, 0244, 0245, 0246, 0247, - 0250, 0251, 0252, 0253, 0254, 0255, 0256, 0257, - 0260, 0261, 0262, 0263, 0264, 0265, 0266, 0267, - 0270, 0271, 0272, 0273, 0274, 0275, 0276, 0277, - 0300, 0301, 0302, 0303, 0304, 0305, 0306, 0307, - 0310, 0311, 0312, 0313, 0314, 0315, 0316, 0317, - 0320, 0321, 0322, 0323, 0324, 0325, 0326, 0327, - 0330, 0331, 0332, 0333, 0334, 0335, 0336, 0337, - 0340, 0341, 0342, 0343, 0344, 0345, 0346, 0347, - 0350, 0351, 0352, 0353, 0354, 0355, 0356, 0357, - 0360, 0361, 0362, 0363, 0364, 0365, 0366, 0367, - 0370, 0371, 0372, 0373, 0374, 0375, 0376, 0377, -}; - -int -sm_strcasecmp(s1, s2) - const char *s1, *s2; -{ - register const u_char *cm = charmap, - *us1 = (const u_char *)s1, - *us2 = (const u_char *)s2; - - while (cm[*us1] == cm[*us2++]) - if (*us1++ == '\0') - return (0); - return (cm[*us1] - cm[*--us2]); -} - -int -sm_strncasecmp(s1, s2, n) - const char *s1, *s2; - register size_t n; -{ - if (n != 0) { - register const u_char *cm = charmap, - *us1 = (const u_char *)s1, - *us2 = (const u_char *)s2; - - do { - if (cm[*us1] != cm[*us2++]) - return (cm[*us1] - cm[*--us2]); - if (*us1++ == '\0') - break; - } while (--n != 0); - } - return (0); -} diff --git a/src/version.c b/src/version.c deleted file mode 100644 index 6f9d05e..0000000 --- a/src/version.c +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)version.c 8.9.3.1 (Berkeley) 2/4/1999"; -#endif /* not lint */ - -char Version[] = "8.9.3"; diff --git a/test/Results b/test/Results deleted file mode 100644 index e31a68b..0000000 --- a/test/Results +++ /dev/null @@ -1,158 +0,0 @@ -The following are results of running t_setreuid on various architectures. - -OPSYS VERSION STATUS DATE TESTER/NOTES -===== ======= ====== ==== ============ - -SunOS 4.1 OK 93.07.19 eric -SunOS 4.1.2 OK 93.07.19 eric -SunOS 4.1.3 OK 93.09.25 Robert Elz - -BSD 4.4 OK 93.07.19 eric (wierd results, but functional) -BSD 4.3Utah OK 93.07.19 eric - -FreeBSD 2.1-sta OK 96.04.14 Jaye Mathisen <mrcpu@cdsnet.net> - -Ultrix 4.2A OK 93.07.19 eric -Ultrix 4.3A OK 93.07.19 Allan Johannesen -Ultrix 4.5 OK 96.09.18 Gregory Neil Shapiro <gshapiro@wpi.edu> - -HP-UX 8.07 OK 93.07.19 eric (on 7xx series) -HP-UX 8.02 OK 93.07.19 Michael Corrigan (on 8xx series) -HP-UX 8.00 OK 93.07.21 Michael Corrigan (on 3xx/4xx series) -HP-UX 9.01 OK 93.11.19 Cassidy (on 7xx series) - -Solaris 2.1 -Solaris 2.2 FAIL 93.07.19 Bill Wisner -Solaris 2.3 FAIL 95.11.22 Scott J. Kramer <sjk@lux.com> -Solaris 2.5 OK 96.02.29 Carson Gaspar <carson@lehman.com> -Solaris 2.5.1 OK 96.11.29 Gregory Neil Shapiro <gshapiro@wpi.edu> - -OSF/1 T1.3-4 OK 93.07.19 eric (on DEC Alpha) -OSF/1 1.3 OK 94.12.10 Jeff A. Earickson (on Intel Paragon) -OSF/1 3.2D OK 96.09.18 Gregory Neil Shapiro <gshapiro@wpi.edu> -OSF/1 4.0 OK 96.09.18 Gregory Neil Shapiro <gshapiro@wpi.edu> - -CxOS 11.5 OK 96.07.08 Eric Schnoebelen <eric@cirr.com> -CxOS 11.0 OK 93.01.21 Eric Schnoebelen (CxOS 11.0 beta 1) -CxOS 10.x OK 93.01.21 Eric Schnoebelen - -AIX 3.1.5 FAIL 93.08.07 David J. N. Begley -AIX 3.2.3e FAIL 93.07.26 Steve Bauer <sbauer@silver.sdsmt.edu> -AIX 3.2.4 FAIL 93.10.07 David J. N. Begley -AIX 3.2.5 FAIL 94.05.17 Steve Bauer <sbauer@hpcmmib.hpc.sdsmt.edu> -AIX 4.1 FAIL 96.10.21 Hakan Lindholm <hakan@af.lu.se> -AIX 4.2 OK 96.10.16 Steve Bauer <sbauer@krypton.hpc.sdsmt.edu> - -IRIX 4.0.4 OK 93.09.25 Robert Elz -IRIX 5.2 OK 94.12.06 Mark Andrews <mandrews@alias.com> -IRIX 5.3 OK 94.12.06 Mark Andrews <mandrews@alias.com> -IRIX 6.2 OK 96.09.16 Kari E. Hurtta <Kari.Hurtta@ozone.FMI.FI> -IRIX 6.3 OK 97.02.10 Mark Andrews <mandrews@aw.sgi.com> - -SCO 3.2v4.0 OK 93.10.02 Peter Wemm (with -lsocket from 3.2v4 devsys) - -NeXT 2.1 OK 93.07.28 eric -NeXT 3.0 OK 34.05.05 Kevin John Wang <kwang@lore.acs.calpoly.edu> - -Linux 0.99p10 OK 93.08.08 Karl London -Linux 0.99p13 OK 93.09.27 Christian Kuhtz -Linux 0.99p14 OK 93.11.30 Christian Kuhtz <chk@data-hh.Hanse.DE> -Linux 1.0 OK 94.03.19 Shayne Smith <snsmith@rastus.brisnet.org.au> -Linux 1.2.13 OK 95.11.02 Sven Neuhaus <sven@ping.de> -Linux 2.0.17 OK 96.09.03 Horst von Brand <vonbrand@sleipnir.valparaiso.cl> -Linux 2.1.109 OK 98.07.21 John Kennedy <jk@csuchico.edu> - -BSD/386 1.0 OK 93.11.13 Tony Sanders - -DELL 2.2 OK 93.11.15 Peter Wemm (using -DSETEUID) - -Pyramid 5.0d OK 95.01.14 David Miller <davem@nadzieja.rutgers.edu> - - - -The following are results of running t_seteuid on various architectures. - -OPSYS VERSION STATUS DATE TESTER/NOTES -===== ======= ====== ==== ============ - -Solaris 2.3 OK 95.11.22 Scott J. Kramer <sjk@lux.com> -Solaris 2.4 OK 95.09.22 Thomas 'Mike' Michlmayr <mike@cosy.sbg.ac.at> -Solaris 2.5 OK 96.02.29 Carson Gaspar <carson@lehman.com> -Solaris 2.5.1 OK 96.11.29 Gregory Neil Shapiro <gshapiro@wpi.edu> - -Linux 1.2.13 FAIL 95.11.02 Sven Neuhaus <sven@ping.de> -Linux 2.0.17 FAIL 96.09.03 Horst von Brand <vonbrand@sleipnir.valparaiso.cl> -Linux 2.1.109 FAIL 98.07.21 John Kennedy <jk@csuchico.edu> - -AIX 4.1 OK 96.10.21 Hakan Lindholm <hakan@af.lu.se> - -IRIX 5.2 OK 95.12.01 Mark Andrews <mandrews@aw.sgi.com> -IRIX 5.3 OK 95.12.01 Mark Andrews <mandrews@aw.sgi.com> -IRIX 6.2 OK 96.09.16 Kari E. Hurtta <Kari.Hurtta@ozone.FMI.FI> -IRIX 6.3 OK 97.02.10 Mark Andrews <mandrews@aw.sgi.com> - -FreeBSD 2.1-sta OK 96.04.14 Jaye Mathisen <mrcpu@cdsnet.net> - -Ultrix 4.5 FAIL 96.09.18 Gregory Neil Shapiro <gshapiro@wpi.edu> - -OSF/1 3.2D OK 96.09.18 Gregory Neil Shapiro <gshapiro@wpi.edu> -OSF/1 4.0 OK 96.09.18 Gregory Neil Shapiro <gshapiro@wpi.edu> - -CxOS 11.5 FAIL 96.07.08 Eric Schnoebelen <eric@cirr.com> - - -The following are the results of running t_pathconf.c. Safe means that -the underlying filesystem (in NFS, the filesystem on the server) does not -permit regular (non-root) users to chown their files to another user. -Unsafe means that they can. Typically, BSD-based systems do not permit -giveaway and System V-based systems do. However, some systems (e.g., -Solaris) can set this on a per-system or per-filesystem basis. Entries -are the return value of pathconf, the errno value, and a * if chown -disagreed with the result of the pathconf call, and a ? if the test has -not been run. A mark of [R] means that the local filesystem has -chown set to be restricted, [U] means that it is set to be unrestricted. - - Safe Filesystem Unsafe Filesystem -SYSTEM LOCAL NFS-V2 NFS-V3 NFS-V2 NFS-V3 - -SunOS 4.1.3_U1 1/0 -1/EINVAL* n/a -1/EINVAL? n/a -SunOS 4.1.4 1/0 -1/EINVAL* n/a -1/EINVAL n/a - -AIX 3.2 0/0 0/0 - -Solaris 2.4 1/0 -1/EINVAL* -Solaris 2.5 1/0 -1/EINVAL* 1/0 0/0? -Solaris 2.5.1 1/0 -1/EINVAL* 0/0 - -DEC OSF1 3.0 0/0 0/0 -DEC OSF1 3.2D-2 0/0 0/0 0/0 -DEC OSF1 4.0A 0/0 0/0 0/0 -DEC OSF 4.0B 0/0 0/0 0/0 - -Ultrix 4.3 0/0 0/0 n/a n/a -Ultrix 4.5 1/0 1/0 - -HP-UX 9.05 -1/0 -1/EOPNOTSUPP* -1/EOPNOTSUPP -HP-UX 9.05[R] 1/0 -1/EOPNOTSUPP* -1/EOPNOTSUPP* -HP-UX 10.10 -1/0 -1/EOPNOTSUPP* -1/EOPNOTSUPP -HP-UX 10.20 -1/EOPNOTSUPP? -1/EOPNOTSUPP? -HP-UX 10.30 -1/0 -1/EOPNOTSUPP -1/EOPNOTSUPP - -BSD/OS 2.1 1/0 - -FreeBSD 2.1.7 1/0 -1/EINVAL* -1/EINVAL - -Irix 5.3 -1/0* -1/0 -Irix 6.2 1/0 -1/0 0/0* -Irix 6.2 -1/0 -1/0 -Irix 6.3 R10000 -1/0 -1/0 0/0* - -A/UX 3.1.1 1/0 - -DomainOS [R] -1/0* -DomainOS [U] -1/0 - -NCR MP-RAS 2 -1/0 -NCR MP-RAS 3 -1/0 - -Linux 2.0.27 1/0 1/0 diff --git a/test/t_exclopen.c b/test/t_exclopen.c deleted file mode 100644 index a42baa9..0000000 --- a/test/t_exclopen.c +++ /dev/null @@ -1,93 +0,0 @@ -/* -** This program tests your system to see if you have the lovely -** security-defeating semantics that an open with O_CREAT|O_EXCL -** set will successfully open a file named by a symbolic link that -** points to a non-existent file. Sadly, Posix is mute on what -** should happen in this situation. -** -** Results to date: -** AIX 3.2 OK -** BSD family OK -** BSD/OS 2.1 OK -** FreeBSD 2.1 OK -** DEC OSF/1 3.0 OK -** HP-UX 9.04 FAIL -** HP-UX 9.05 FAIL -** HP-UX 9.07 OK -** HP-UX 10.01 OK -** HP-UX 10.10 OK -** HP-UX 10.20 OK -** Irix 5.3 OK -** Irix 6.2 OK -** Irix 6.3 OK -** Irix 6.4 OK -** Linux OK -** NeXT 2.1 OK -** Solaris 2.x OK -** SunOS 4.x OK -** Ultrix 4.3 OK -*/ - -#include <stdio.h> -#include <errno.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> - -char Attacker[128]; -char Attackee[128]; - -main(argc, argv) - int argc; - char **argv; -{ - struct stat st; - - sprintf(Attacker, "/tmp/attacker.%d.%ld", getpid(), time(NULL)); - sprintf(Attackee, "/tmp/attackee.%d.%ld", getpid(), time(NULL)); - - if (symlink(Attackee, Attacker) < 0) - { - printf("Could not create %s->%s symlink: %d\n", - Attacker, Attackee, errno); - bail(1); - } - (void) unlink(Attackee); - if (stat(Attackee, &st) >= 0) - { - printf("%s already exists -- remove and try again.\n", - Attackee); - bail(1); - } - if (open(Attacker, O_WRONLY|O_CREAT|O_EXCL, 0644) < 0) - { - int saveerr = errno; - - if (stat(Attackee, &st) >= 0) - { - printf("Weird. Open failed but %s was created anyhow (errno = %d)\n", - Attackee, saveerr); - bail(1); - } - printf("Good show! Exclusive open works properly with symbolic links (errno = %d).\n", - saveerr); - bail(0); - } - if (stat(Attackee, &st) < 0) - { - printf("Weird. Open succeeded but %s was not created\n", - Attackee); - bail(2); - } - printf("Bad news: you can do an exclusive open through a symbolic link\n"); - printf("\tBe sure you #define BOGUS_O_EXCL in conf.h\n"); - bail(1); -} - -bail(stat) - int stat; -{ - (void) unlink(Attacker); - (void) unlink(Attackee); - exit(stat); -} diff --git a/test/t_pathconf.c b/test/t_pathconf.c deleted file mode 100644 index a4b5038..0000000 --- a/test/t_pathconf.c +++ /dev/null @@ -1,63 +0,0 @@ -/* -** The following test program tries the pathconf(2) routine. It should -** be run in a non-NFS-mounted directory (e.g., /tmp) and on remote (NFS) -** mounted directories running both NFS-v2 and NFS-v3 from systems that -** both do and do not permit file giveaway. -*/ - -#include <unistd.h> -#include <errno.h> -#include <sys/types.h> -#include <fcntl.h> -#include <sysexits.h> - -main() -{ - int fd; - int i; - char tbuf[100]; - extern int errno; - - if (geteuid() == 0) - { - printf("*** Run me as a non-root user! ***\n"); - exit(EX_USAGE); - } - - strcpy(tbuf, "TXXXXXX"); - fd = mkstemp(tbuf); - if (fd < 0) - { - printf("*** Could not create test file %s\n", tbuf); - exit(EX_CANTCREAT); - } - errno = 0; - i = pathconf(".", _PC_CHOWN_RESTRICTED); - printf("pathconf(.) returns %2d, errno = %d\n", i, errno); - errno = 0; - i = pathconf(tbuf, _PC_CHOWN_RESTRICTED); - printf("pathconf(%s) returns %2d, errno = %d\n", tbuf, i, errno); - errno = 0; - i = fpathconf(fd, _PC_CHOWN_RESTRICTED); - printf("fpathconf(%s) returns %2d, errno = %d\n", tbuf, i, errno); - if (errno == 0 && i >= 0) - { - /* so it claims that it doesn't work -- try anyhow */ - printf(" fpathconf claims that chown is safe "); - if (fchown(fd, 1, 1) >= 0) - printf("*** but fchown works anyhow! ***\n"); - else - printf("and fchown agrees\n"); - } - else - { - /* well, let's see what really happens */ - printf(" fpathconf claims that chown is not safe "); - if (fchown(fd, 1, 1) >= 0) - printf("as indeed it is not\n"); - else - printf("*** but in fact it is safe ***\n"); - } - unlink(tbuf); - exit(EX_OK); -} diff --git a/test/t_seteuid.c b/test/t_seteuid.c deleted file mode 100644 index f3bd529..0000000 --- a/test/t_seteuid.c +++ /dev/null @@ -1,121 +0,0 @@ -/* -** This program checks to see if your version of seteuid works. -** Compile it, make it setuid root, and run it as yourself (NOT as -** root). If it won't compile or outputs any MAYDAY messages, don't -** define USESETEUID in conf.h. -** -** NOTE: It is not sufficient to have seteuid in your library. -** You must also have saved uids that function properly. -** -** Compilation is trivial -- just "cc t_seteuid.c". Make it setuid, -** root and then execute it as a non-root user. -*/ - -#include <sys/types.h> -#include <unistd.h> -#include <stdio.h> - -#ifdef __hpux -#define seteuid(e) setresuid(-1, e, -1) -#endif - -main() -{ - int fail = 0; - uid_t realuid = getuid(); - - printuids("initial uids", realuid, 0); - - if (geteuid() != 0) - { - printf("SETUP ERROR: re-run setuid root\n"); - exit(1); - } - - if (getuid() == 0) - { - printf("SETUP ERROR: must be run by a non-root user\n"); - exit(1); - } - - if (seteuid(1) < 0) - printf("seteuid(1) failure\n"); - printuids("after seteuid(1)", realuid, 1); - - if (geteuid() != 1) - { - fail++; - printf("MAYDAY! Wrong effective uid\n"); - } - - /* do activity here */ - - if (seteuid(0) < 0) - { - fail++; - printf("seteuid(0) failure\n"); - } - printuids("after seteuid(0)", realuid, 0); - - if (geteuid() != 0) - { - fail++; - printf("MAYDAY! Wrong effective uid\n"); - } - if (getuid() != realuid) - { - fail++; - printf("MAYDAY! Wrong real uid\n"); - } - printf("\n"); - - if (seteuid(2) < 0) - { - fail++; - printf("seteuid(2) failure\n"); - } - printuids("after seteuid(2)", realuid, 2); - - if (geteuid() != 2) - { - fail++; - printf("MAYDAY! Wrong effective uid\n"); - } - - /* do activity here */ - - if (seteuid(0) < 0) - { - fail++; - printf("seteuid(0) failure\n"); - } - printuids("after seteuid(0)", realuid, 0); - - if (geteuid() != 0) - { - fail++; - printf("MAYDAY! Wrong effective uid\n"); - } - if (getuid() != realuid) - { - fail++; - printf("MAYDAY! Wrong real uid\n"); - } - - if (fail) - { - printf("\nThis system cannot use seteuid\n"); - exit(1); - } - - printf("\nIt is safe to define USESETEUID on this system\n"); - exit(0); -} - -printuids(str, r, e) - char *str; - int r, e; -{ - printf("%s (should be %d/%d): r/euid=%d/%d\n", str, r, e, - getuid(), geteuid()); -} diff --git a/test/t_setreuid.c b/test/t_setreuid.c deleted file mode 100644 index 6622068..0000000 --- a/test/t_setreuid.c +++ /dev/null @@ -1,133 +0,0 @@ -/* -** This program checks to see if your version of setreuid works. -** Compile it, make it setuid root, and run it as yourself (NOT as -** root). If it won't compile or outputs any MAYDAY messages, don't -** define HASSETREUID in conf.h. -** -** Compilation is trivial -- just "cc t_setreuid.c". Make it setuid, -** root and then execute it as a non-root user. -*/ - -#include <sys/types.h> -#include <unistd.h> -#include <stdio.h> - -#ifdef __hpux -#define setreuid(r, e) setresuid(r, e, -1) -#endif - -main() -{ - int fail = 0; - uid_t realuid = getuid(); - - printuids("initial uids", realuid, 0); - - if (geteuid() != 0) - { - printf("SETUP ERROR: re-run setuid root\n"); - exit(1); - } - - if (getuid() == 0) - { - printf("SETUP ERROR: must be run by a non-root user\n"); - exit(1); - } - - if (setreuid(0, 1) < 0) - { - fail++; - printf("setreuid(0, 1) failure\n"); - } - printuids("after setreuid(0, 1)", 0, 1); - - if (geteuid() != 1) - { - fail++; - printf("MAYDAY! Wrong effective uid\n"); - } - - /* do activity here */ - - if (setreuid(-1, 0) < 0) - { - fail++; - printf("setreuid(-1, 0) failure\n"); - } - printuids("after setreuid(-1, 0)", 0, 0); - if (setreuid(realuid, 0) < 0) - { - fail++; - printf("setreuid(%d, 0) failure\n", realuid); - } - printuids("after setreuid(realuid, 0)", realuid, 0); - - if (geteuid() != 0) - { - fail++; - printf("MAYDAY! Wrong effective uid\n"); - } - if (getuid() != realuid) - { - fail++; - printf("MAYDAY! Wrong real uid\n"); - } - printf("\n"); - - if (setreuid(0, 2) < 0) - { - fail++; - printf("setreuid(0, 2) failure\n"); - } - printuids("after setreuid(0, 2)", 0, 2); - - if (geteuid() != 2) - { - fail++; - printf("MAYDAY! Wrong effective uid\n"); - } - - /* do activity here */ - - if (setreuid(-1, 0) < 0) - { - fail++; - printf("setreuid(-1, 0) failure\n"); - } - printuids("after setreuid(-1, 0)", 0, 0); - if (setreuid(realuid, 0) < 0) - { - fail++; - printf("setreuid(%d, 0) failure\n", realuid); - } - printuids("after setreuid(realuid, 0)", realuid, 0); - - if (geteuid() != 0) - { - fail++; - printf("MAYDAY! Wrong effective uid\n"); - } - if (getuid() != realuid) - { - fail++; - printf("MAYDAY! Wrong real uid\n"); - } - - if (fail) - { - printf("\nThis system cannot use setreuid\n"); - exit(1); - } - - printf("\nIt is safe to define HASSETREUID on this system\n"); - exit(0); -} - -printuids(str, r, e) - char *str; - int r, e; -{ - printf("%s (should be %d/%d): r/euid=%d/%d\n", str, r, e, - getuid(), geteuid()); -} |