Import sendmail 8.11.3

This commit is contained in:
gshapiro 2001-02-28 00:19:57 +00:00
parent 167a83e7b8
commit 8d82727087
49 changed files with 1080 additions and 513 deletions

View File

@ -33,7 +33,7 @@ each of the following conditions is met:
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-2000 Sendmail, Inc. All rights reserved."
"Copyright (c) 1998-2001 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
@ -76,4 +76,4 @@ each of the following conditions is met:
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
$Revision: 8.9 $, Last updated $Date: 2000/03/03 19:24:11 $
$Revision: 8.9.4.1 $, Last updated $Date: 2001/02/14 04:07:19 $

View File

@ -1,11 +1,86 @@
SENDMAIL RELEASE NOTES
$Id: RELEASE_NOTES,v 8.561.2.5.2.181 2000/12/28 23:56:46 gshapiro Exp $
$Id: RELEASE_NOTES,v 8.561.2.5.2.208 2001/02/26 21:24:54 gshapiro Exp $
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.11.3/8.11.3 2001/02/27
Prevent a segmentation fault when a bogus value was used in the
LDAPDefaultSpec option's -r, -s, or -M flags and if a bogus
option was used. Problem noted by Allan E Johannesen of
Worcester Polytechnic Institute.
Prevent "token too long" message by shortening {currHeader} which
could be too long if the last copied character was a quote.
Problem detected by Jan Krueger of digitalanswers
communications consulting gmbh.
Additional IPv6 check for unspecified addresses. Patch from
Jun-ichiro itojun Hagino of the KAME Project.
Do not ignore the ClientPortOptions setting if DaemonPortOptions
Modifier=b (bind to same interface) is set and the
connection came in from the command line.
Do not bind to the loopback address if DaemonPortOptions
Modifier=b (bind to same interface) is set. Patch from
John Beck of Sun Microsystems.
Properly deal with open failures on non-optional maps used in
check_* rulesets by returning a temporary failure.
Buffered file I/O files were not being properly fsync'ed to disk
when they were committed.
Properly encode '=' for the AUTH= parameter of the MAIL command.
Problem noted by Hadmut Danisch.
Under certain circumstances the macro {server_name} could be set
to the wrong hostname (of a previous connection), which may
cause some rulesets to return wrong results. This would
usually cause mail to be queued up and delivered later on.
Ignore F=z (LMTP) mailer flag if $u is given in the mailer A=
equate. Problem noted by Motonori Nakamura of Kyoto
University.
Work around broken accept() implementations which only partially
fill in the peer address if the socket is closed before
accept() completes.
Return an SMTP "421" temporary failure if the data file can't be
opened where the "354" reply would normally be given.
Prevent a CPU loop in trying to expand a macro which doesn't exist
in a queue run. Problem noted by Gordon Lack of Glaxo
Wellcome.
If delivering via a program and that program exits with EX_TEMPFAIL,
note that fact for the mailq display instead of just showing
"Deferred". Problem noted by Motonori Nakamura of Kyoto
University.
If doing canonification via /etc/hosts, try both the fully
qualified hostname as well as the first portion of the
hostname. Problem noted by David Bremner of the
University of New Brunswick.
Portability:
Fix a compilation problem for mail.local and rmail if SFIO
is in use. Problem noted by Auteria Wally
Winzer Jr. of Champion Nutrition.
IPv6 changes for platforms using KAME. Patch from
Jun-ichiro itojun Hagino of the KAME Project.
OpenBSD 2.7 and higher has srandomdev(3). OpenBSD 2.8 and
higher has BSDI-style login classes. Patch from
Todd C. Miller of Courtesan Consulting.
Unixware 7.1.1 doesn't allow h_errno to be set directly if
sendmail is being compiled with -kthread. Problem
noted by Orion Poplawski of CQG, Inc.
CONTRIB: buildvirtuser: Substitute current domain for $DOMAIN and
current left hand side for $LHS in virtuser files.
DEVTOOLS: Do not pass make targets to recursive Build invocations.
Problem noted by Jeff Bronson of J.D. Bronson, Inc.
MAIL.LOCAL: In LMTP mode, do not return errors regarding problems
storing the temporary message file until after the remote
side has sent the final DATA termination dot. Problem
noted by Allan E Johannesen of Worcester Polytechnic
Institute.
MAIL.LOCAL: If LMTP mode is set, give a temporary error if users
are also specified on the command line. Patch from
Motonori Nakamura of Kyoto University.
PRALIASES: Skip over AliasFile specifications which aren't based on
database files (i.e., only show dbm, hash, and btree).
Renamed Files:
devtools/OS/OSF1.V5.0 => devtools/OS/OSF1.V5.x
8.11.2/8.11.2 2000/12/29
Prevent a segmentation fault when trying to set a class in
address test mode due to a negative array index. Audit
@ -89,7 +164,7 @@ summary of the changes in that release.
is used. Problem noted by Phil Homewood of Asia Online,
patch from Neil Rickert of Northern Illinois University.
CONFIG: Change the default DNS based blacklist server for
FEATURE(`dnsbl') to blackholes.mail-abuse.org.
FEATURE(`dnsbl') to blackholes.mail-abuse.org.
CONFIG: Deal correctly with the 'C' flag in {daemon_flags}, i.e.,
implicitly assume canonical host names.
CONFIG: Deal with "::" in IPv6 addresses for access_db. Based on
@ -107,7 +182,7 @@ summary of the changes in that release.
Roth of the University of Illinois at Urbana-Champaign.
DEVTOOLS: Change the internal devtools OS, REL, and ARCH m4
variables into bldOS, bldREL, and bldARCH to prevent
namespace collisions. Problem noted by Motonori Nakamura
namespace collisions. Problem noted by Motonori Nakamura
of Kyoto University.
RMAIL: Undo the 8.11.1 change to use -G when calling sendmail. It
causes some changes in behavior and may break rmail for

View File

@ -54,7 +54,7 @@ Let's examine a typical .mc file:
divert(-1)
#
# Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
# Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
# All rights reserved.
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
# Copyright (c) 1988, 1993
@ -254,12 +254,13 @@ HELP_FILE [/etc/mail/helpfile] The name of the file
QUEUE_DIR [/var/spool/mqueue] The directory containing
queue files. To use multiple queues, supply
a value ending with an asterisk. For
example, /var/spool/mqueue/q* will use all of the
example, /var/spool/mqueue/qd* will use all of the
directories or symbolic links to directories
beginning with 'q' in /var/spool/mqueue as queue
beginning with 'qd' in /var/spool/mqueue as queue
directories. The names 'qf', 'df', and 'xf' are
used as specific subdirectories for the corresponding
queue file types.
reserved as specific subdirectories for the
corresponding queue file types as explained in
doc/op/op.me.
STATUS_FILE [/etc/mail/statistics] The file containing status
information.
LOCAL_MAILER_PATH [/bin/mail] The program used to deliver local mail.
@ -665,7 +666,7 @@ stickyhost This feature is sometimes used with LOCAL_RELAY,
although it can be used for a different effect with
MAIL_HUB.
When used with without MAIL_HUB, email sent to
When used without MAIL_HUB, email sent to
"user@local.host" are marked as "sticky" -- that
is, the local addresses aren't matched against UDB,
don't go through ruleset 5, and are not forwarded to
@ -1860,8 +1861,8 @@ for your purposes. There is now the option to tag entries in the
access map according to their type. Three tags are available:
Connect: connection information (${client_addr}, ${client_name})
From: sender
To: recipient
From: envelope sender
To: envelope recipient
If the required item is looked up in a map, it will be tried first
with the corresponding tag in front, then (as fallback to enable
@ -1913,7 +1914,7 @@ avoid this problem you have to use tagged entries:
Connect:my.domain RELAY
if you need those entries at all (class {R} may take care of them).
FEATURE(`delay_checks') can take an optional argument:
FEATURE(`delay_checks', `friend')
@ -1966,6 +1967,11 @@ defined for them can be given by:
H*: $>CheckHdr
Notice: All rules act on tokens as explained in doc/op/op.{me,ps,txt}.
That may cause problems with simple header checks due to the
tokenization. It might be simpler to use a regex map and apply it
to $&{currHeader}.
After all of the headers are read, the check_eoh ruleset will be called for
any final header-related checks. The ruleset is called with the number of
headers and the size of all of the headers in bytes separated by $|. One
@ -2113,6 +2119,20 @@ should only be accepted if they have been authenticated.
TLS_Srv:secure.example.com ENCR:112
TLS_Clt:laptop.example.com PERM+VERIFY:112
Notice: requiring that e-mail is sent to a server only encrypted,
e.g., via
TLS_Srv:secure.domain ENCR:112
doesn't necessarily mean that e-mail sent to that domain is encrypted.
If the domain has multiple MX servers, e.g.,
secure.domain. IN MX 10 mail.secure.domain.
secure.domain. IN MX 50 mail.other.domain.
then mail to user@secure.domain may go unencrypted to mail.other.domain.
Received: Header
The Received: header reveals whether STARTTLS has been used. It contains an
@ -2979,7 +2999,7 @@ confAUTH_MECHANISMS AuthMechanisms [GSSAPI KERBEROS_V4 DIGEST-MD5
intersection of this list and the list
of available mechanisms as determined
by the CYRUS SASL library.
confDEF_AUTH_INFO DefaultAuthInfo [undefined] Filename that contains
confDEF_AUTH_INFO DefaultAuthInfo [undefined] Name of file that contains
authentication information for
outgoing connections. This file
must contain the user id, the
@ -3257,4 +3277,4 @@ M4 DIVERSIONS
8 DNS based blacklists
9 special local rulesets (1 and 2)
$Revision: 8.383.2.1.2.35 $, Last updated $Date: 2000/12/17 17:19:11 $
$Revision: 8.383.2.1.2.42 $, Last updated $Date: 2001/02/15 23:40:10 $

View File

@ -1,6 +1,6 @@
divert(-1)
#
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
# Copyright (c) 1998, 1999, 2001 Sendmail, Inc. and its suppliers.
# All rights reserved.
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
# Copyright (c) 1988, 1993
@ -17,8 +17,8 @@ divert(-1)
#
divert(0)dnl
VERSIONID(`$Id: knecht.mc,v 8.37 1999/11/19 05:18:12 gshapiro Exp $')
OSTYPE(bsdi)dnl
VERSIONID(`$Id: knecht.mc,v 8.37.16.3 2001/02/22 22:38:39 ca Exp $')
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
@ -28,10 +28,16 @@ define(`confCOPY_ERRORS_TO', `Postmaster')dnl
define(`confTO_QUEUEWARN', `8h')dnl
define(`confTRUSTED_USERS', `www')dnl
define(`confPRIVACY_FLAGS', ``authwarnings,noexpn,novrfy'')dnl
define(`CERT_DIR', `MAIL_SETTINGS_DIR`'certs')dnl
define(`confCACERT_PATH', `CERT_DIR')dnl
define(`confCACERT', `CERT_DIR/CAcert.pem')dnl
define(`confSERVER_CERT', `CERT_DIR/MYcert.pem')dnl
define(`confSERVER_KEY', `CERT_DIR/MYkey.pem')dnl
define(`confCLIENT_CERT', `CERT_DIR/MYcert.pem')dnl
define(`confCLIENT_KEY', `CERT_DIR/MYkey.pem')dnl
FEATURE(virtusertable)dnl
FEATURE(access_db)dnl
FEATURE(local_lmtp)dnl
MODIFY_MAILER_FLAGS(`LOCAL', `+P')dnl
MAILER(local)dnl
MAILER(smtp)dnl
@ -61,7 +67,7 @@ HMessage-Id: $>CheckMessageId
SCheckMessageId
R< $+ @ $+ > $@ OK
R$* $#error $: "553 Header error"
R$* $#error $: "554 Header error"
LOCAL_RULESETS
SLocal_check_mail

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
# Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
# All rights reserved.
# Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved.
# Copyright (c) 1988, 1993
@ -154,28 +154,28 @@ 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
define(`EXPOSED_USER', `PUSHDIVERT(5)C{E}$1
POPDIVERT`'dnl`'')
ifdef(`_FFR_EXPOSED_USER_FILE', `define(`EXPOSED_USER_FILE', `PUSHDIVERT(5)FE$1
ifdef(`_FFR_EXPOSED_USER_FILE', `define(`EXPOSED_USER_FILE', `PUSHDIVERT(5)F{E}$1
POPDIVERT`'dnl`'')', `dnl')
define(`LOCAL_USER', `PUSHDIVERT(5)CL$1
define(`LOCAL_USER', `PUSHDIVERT(5)C{L}$1
POPDIVERT`'dnl`'')
define(`MASQUERADE_AS', `define(`MASQUERADE_NAME', $1)')
define(`MASQUERADE_DOMAIN', `PUSHDIVERT(5)CM$1
define(`MASQUERADE_DOMAIN', `PUSHDIVERT(5)C{M}$1
POPDIVERT`'dnl`'')
define(`MASQUERADE_EXCEPTION', `PUSHDIVERT(5)CN$1
define(`MASQUERADE_EXCEPTION', `PUSHDIVERT(5)C{N}$1
POPDIVERT`'dnl`'')
define(`MASQUERADE_DOMAIN_FILE', `PUSHDIVERT(5)FM$1
define(`MASQUERADE_DOMAIN_FILE', `PUSHDIVERT(5)F{M}$1
POPDIVERT`'dnl`'')
define(`LOCAL_DOMAIN', `PUSHDIVERT(5)Cw$1
define(`LOCAL_DOMAIN', `PUSHDIVERT(5)C{w}$1
POPDIVERT`'dnl`'')
define(`CANONIFY_DOMAIN', `PUSHDIVERT(5)C{Canonify}$1
POPDIVERT`'dnl`'')
define(`CANONIFY_DOMAIN_FILE', `PUSHDIVERT(5)F{Canonify}$1
POPDIVERT`'dnl`'')
define(`GENERICS_DOMAIN', `PUSHDIVERT(5)CG$1
define(`GENERICS_DOMAIN', `PUSHDIVERT(5)C{G}$1
POPDIVERT`'dnl`'')
define(`GENERICS_DOMAIN_FILE', `PUSHDIVERT(5)FG$1
define(`GENERICS_DOMAIN_FILE', `PUSHDIVERT(5)F{G}$1
POPDIVERT`'dnl`'')
define(`LDAPROUTE_DOMAIN', `PUSHDIVERT(5)C{LDAPRoute}$1
POPDIVERT`'dnl`'')
@ -187,9 +187,9 @@ POPDIVERT`'dnl`'')
define(`VIRTUSER_DOMAIN_FILE', `PUSHDIVERT(5)F{VirtHost}$1
define(`_VIRTHOSTS_')
POPDIVERT`'dnl`'')
define(`RELAY_DOMAIN', `PUSHDIVERT(5)CR$1
define(`RELAY_DOMAIN', `PUSHDIVERT(5)C{R}$1
POPDIVERT`'dnl`'')
define(`RELAY_DOMAIN_FILE', `PUSHDIVERT(5)FR$1
define(`RELAY_DOMAIN_FILE', `PUSHDIVERT(5)F{R}$1
POPDIVERT`'dnl`'')
define(`TRUST_AUTH_MECH', `PUSHDIVERT(5)C{TrustAuthMech}$1
POPDIVERT`'dnl`'')
@ -252,4 +252,4 @@ define(`confMILTER_MACROS_ENVRCPT', ``{rcpt_mailer}, {rcpt_host}, {rcpt_addr}'')
divert(0)dnl
VERSIONID(`$Id: cfhead.m4,v 8.76.4.13 2000/08/24 17:09:50 gshapiro Exp $')
VERSIONID(`$Id: cfhead.m4,v 8.76.4.15 2001/02/14 04:07:20 gshapiro Exp $')

View File

@ -1,6 +1,6 @@
divert(-1)
#
# Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
# Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
# All rights reserved.
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
# Copyright (c) 1988, 1993
@ -11,8 +11,8 @@ divert(-1)
# the sendmail distribution.
#
#
VERSIONID(`$Id: version.m4,v 8.39.4.21 2000/12/29 18:22:15 gshapiro Exp $')
VERSIONID(`$Id: version.m4,v 8.39.4.26 2001/02/27 19:22:29 gshapiro Exp $')
#
divert(0)
# Configuration version number
DZ8.11.2`'ifdef(`confCF_VERSION', `/confCF_VERSION')
DZ8.11.3`'ifdef(`confCF_VERSION', `/confCF_VERSION')

View File

@ -1,6 +1,6 @@
#!/usr/bin/perl -w
# Copyright (c) 1999-2000 Gregory Neil Shapiro. All Rights Reserved.
# Copyright (c) 1999-2001 Gregory Neil Shapiro. All Rights Reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@ -27,7 +27,7 @@
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
# $Id: buildvirtuser,v 1.1.2.1 2000/10/26 22:51:03 gshapiro Exp $
# $Id: buildvirtuser,v 1.1.2.3 2001/02/12 02:57:13 gshapiro Exp $
=head1 NAME
@ -45,7 +45,10 @@ directory should contain one file per virtual domain with the filename
matching the virtual domain name and the contents containing a list of
usernames on the left and the actual address for that username on the
right. An empty left column translates to the default for that domain.
Blank lines and lines beginning with '#' are ignored.
Blank lines and lines beginning with '#' are ignored. Occurrences of
$DOMAIN in the file are replaced by the current domain being processed.
Occurrences of $LHS in the right hand side are replaced by the address on
the left hand side.
=head1 CONFIGURATION
@ -66,21 +69,21 @@ Here are some example files from the /etc/mail/virtusers/ directory:
=head2 /etc/mail/virtusers/bsdunix.org:
# Services
MAILER-DAEMON gshapiro+MAILER-DAEMON.bsdunix.org@gshapiro.net
postmaster gshapiro+postmaster.bsdunix.org@gshapiro.net
webmaster gshapiro+webmaster.bsdunix.org@gshapiro.net
MAILER-DAEMON gshapiro+bounce.$DOMAIN@gshapiro.net
postmaster gshapiro+$LHS.$DOMAIN@gshapiro.net
webmaster gshapiro+$LHS.$DOMAIN@gshapiro.net
# Defaults
error:nouser No such user
# Users
gshapiro gshapiro+bsdunix.org@gshapiro.net
gshapiro gshapiro+$DOMAIN@gshapiro.net
bob robert@smtp.org
=head2 /etc/mail/virtusers/smtp.org:
# Defaults
gshapiro+smtp.org@gshapiro.net
gshapiro+$DOMAIN@gshapiro.net
# Users
john john@wookie.org
@ -92,6 +95,8 @@ Gregory Neil Shapiro E<lt>F<gshapiro@gshapiro.net>E<gt>
=cut
use strict;
my $makemap = "/usr/sbin/makemap";
my $dbtype = "hash";
my $maildir = "/etc/mail";
@ -102,6 +107,7 @@ my $newvirt = "$maildir/virtusertable.new.db";
my $virt = "$maildir/virtusertable.db";
my %virt = ();
my $newest = 0;
my ($lhs, $domain, $key, $value);
opendir(VIRTS, $virts) || die "Could not open directory $virts: $!\n";
my @virts = grep { -f "$virts/$_" } readdir(VIRTS);
@ -126,10 +132,12 @@ LINE: while (<DOMAIN>)
{
if (defined($1))
{
$lhs = "$1";
$key = "$1\@$domain";
}
else
{
$lhs = "";
$key = "\@$domain";
}
$value = $2;
@ -138,6 +146,11 @@ LINE: while (<DOMAIN>)
{
die "Bogus line $line in $virts/$domain\n";
}
# Variable subsitution
$key =~ s/\$DOMAIN/$domain/g;
$value =~ s/\$DOMAIN/$domain/g;
$value =~ s/\$LHS/$lhs/g;
$virt{$key} = $value;
}
close(DOMAIN) || die "Could not close $virts/$domain: $!\n";

View File

@ -1,23 +1,29 @@
# $Id: Makefile,v 8.7 2000/02/01 08:21:47 gshapiro Exp $
# $Id: Makefile,v 8.7.8.1 2001/01/04 18:55:46 gshapiro Exp $
DIR= smm/08.sendmailop
SRCS= op.me
OBJS= op.ps
MACROS= -me
DIR= smm/08.sendmailop
SRCS= op.me
OBJS= op.ps
MACROS= -me
ROFF_CMD= groff
PIC_CMD= pic
EQN_CMD= eqn
PIC= ${PIC_CMD} -C
EQN= ${EQN_CMD} -C -Tps
ROFF= ${ROFF_CMD} -Tps -mps ${MACROS}
EQNASCII= ${EQN_CMD} -C -Tascii
EQNPS= ${EQN_CMD} -C -Tps
ROFFASCII= ${ROFF_CMD} -Tascii ${MACROS}
ROFFPS= ${ROFF_CMD} -Tps -mps ${MACROS}
all: ${OBJS}
${OBJS}: ${SRCS}
op.ps: ${SRCS}
rm -f $@
${PIC} ${SRCS} | ${EQN} | ${ROFF} > $@
${PIC} ${SRCS} | ${EQNPS} | ${ROFFPS} > $@
op.txt: ${SRCS}
rm -f $@
${PIC} ${SRCS} | ${EQNASCII} | ${ROFFASCII} > $@
clean:
rm -f ${OBJS}
rm -f op.ps op.txt
install: ${OBJS}

View File

@ -1,4 +1,4 @@
.\" Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
.\" Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
.\" All rights reserved.
.\" Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved.
.\" Copyright (c) 1983, 1993
@ -9,7 +9,7 @@
.\" the sendmail distribution.
.\"
.\"
.\" $Id: op.me,v 8.317.4.47 2000/12/17 00:54:56 gshapiro Exp $
.\" $Id: op.me,v 8.317.4.56 2001/02/15 23:38:16 ca Exp $
.\"
.\" eqn op.me | pic | troff -me
.eh 'SMM:08-%''Sendmail Installation and Operation Guide'
@ -53,7 +53,7 @@ eric@Sendmail.COM
.de Ve
Version \\$2
..
.Ve $Revision: 8.317.4.47 $
.Ve $Revision: 8.317.4.56 $
.rm Ve
.sp
For Sendmail Version 8.11
@ -99,7 +99,7 @@ RFC1652 (SMTP 8BITMIME Extension),
RFC1870 (SMTP SIZE Extension),
RFC1891 (SMTP Delivery Status Notifications),
RFC1892 (Multipart/Report),
RFC1893 (Mail System Status Codes),
RFC1893 (Enhanced Mail System Status Codes),
RFC1894 (Delivery Status Notifications),
RFC1985 (SMTP Service Extension for Remote Message Queue Starting),
RFC2033 (Local Message Transmission Protocol),
@ -624,7 +624,7 @@ option is set.
.pp
This command is also a link to
.i sendmail .
It flushes all information that is stored in the
It flushes expired (Timeout.hoststatus) information that is stored in the
.b HostStatusDirectory
tree.
.sh 3 "/var/spool/mqueue"
@ -644,9 +644,9 @@ file.
To use multiple queues,
supply a value ending with an asterisk.
For example,
.i /var/spool/mqueue/q*
.i /var/spool/mqueue/qd*
will use all of the directories or symbolic links to directories
beginning with `q' in
beginning with `qd' in
.i /var/spool/mqueue
as queue directories.
Do not change the queue directory structure
@ -1141,6 +1141,9 @@ Removing this directory and its subdirectories has an effect similar to
the
.i purgestat
command and is completely safe.
However,
.i purgestat
only removes expired (Timeout.hoststatus) data.
The information in these directories can
be perused with the
.i hoststat
@ -1158,7 +1161,7 @@ the
.b Timeout.hoststatus
option.
.pp
The connection information stored on disk may be purged at any time
The connection information stored on disk may be expired at any time
with the
.i purgestat
command or by invoking sendmail with the
@ -1174,7 +1177,8 @@ switch.
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
If the host operating system supports such a switch,
and sendmail knows about it,
.i sendmail
will use the native version.
Ultrix, Solaris, and DEC OSF/1 are examples of such systems\**.
@ -4262,7 +4266,9 @@ FAIL cert presented but could not be verified,
NONE STARTTLS has not been performed.
TEMP temporary error occurred.
PROTOCOL some protocol error occurred.
SOFTWARE STARTTLS handshake failed.
SOFTWARE STARTTLS handshake failed,
which is a fatal error for this session,
the e-mail will be queued.
.)b
.pp
There are three types of dates that can be used.
@ -4504,6 +4510,9 @@ The syntax is:
.br
.b F \c
.i c\|file
.br
.b F \c
.i c\||program
.)b
The first form defines the class
.i c
@ -4530,11 +4539,13 @@ CHmonet
CHucbmonet
.)b
are equivalent.
The ``F'' form
reads the elements of the class
The ``F'' forms
read the elements of the class
.i c
from the named
.i file .
.i file
or
.i program .
Each element should be listed on a separate line.
To specify an optional file, use ``-o'' between the class
name and the file name, e.g.,
@ -5382,7 +5393,7 @@ should be in the format
``\c
.i class \c
.b :
.i file ''
.i info ''
where
.i class \c
.b :
@ -5397,6 +5408,10 @@ for back compatibility),
(if
.sm NEWDB
is specified),
.q btree
(if
.sm NEWDB
is specified),
.q dbm
(if
.sm NDBM
@ -5404,6 +5419,13 @@ is specified),
.q stab
(internal symbol table \*- not normally used
unless you have no other database lookup),
.q sequence
(use a sequence of maps
previously declared),
.q ldap
(if
.sm LDAPMAP
is specified),
or
.q nis
(if
@ -9390,7 +9412,7 @@ replace it with a blank sheet for double-sided output.
.\".sz 10
.\"Eric Allman
.\".sp
.\"Version $Revision: 8.317.4.47 $
.\"Version $Revision: 8.317.4.56 $
.\".ce 0
.bp 3
.ce

View File

@ -16,9 +16,9 @@ APPENDDEF(`confENVDEF', `-DNOT_SENDMAIL')
divert(bldTARGETS_SECTION)
# Install the API header file
MFAPI= ${SRCDIR}/include/libmilter/mfapi.h
MFAPI= ${SRCDIR}/inc`'lude/libmilter/mfapi.h
install-mfapi: ${MFAPI}
${INSTALL} ${MFAPI} ${DESTDIR}${INCLUDEDIR}
${INSTALL} -c -o ${INCOWN} -g ${INCGRP} -m ${INCMODE} ${MFAPI} ${DESTDIR}${INCLUDEDIR}
divert(0)
bldFINISH

View File

@ -44,6 +44,11 @@ threading support differs according to the compiler and linker used. Check
the Makefile in your appropriate obj.*/libmilter build subdirectory if you
are unsure of the local flag used.
Note that since filters use threads, it may be necessary to alter per
process limits in your filter. For example, you might look at using
setrlimit() to increase the number of open file descriptors if your filter
is going to be busy.
+----------------------------------------+
| SPECIFYING FILTERS IN SENDMAIL CONFIGS |
@ -416,4 +421,4 @@ main(argc, argv)
/* eof */
$Revision: 8.9.2.1.2.13 $, Last updated $Date: 2000/12/29 18:55:23 $
$Revision: 8.9.2.1.2.14 $, Last updated $Date: 2001/02/21 23:08:19 $

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@ -9,7 +9,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: engine.c,v 8.67.4.15 2000/12/29 19:43:10 gshapiro Exp $";
static char id[] = "@(#)$Id: engine.c,v 8.67.4.17 2001/01/22 19:00:16 gshapiro Exp $";
#endif /* ! lint */
#if _FFR_MILTER
@ -122,7 +122,7 @@ static int dec_arg2 __P((char *, size_t, char **, char **));
#define NX_INIT (MASK(ST_OPTS))
#define NX_OPTS (MASK(ST_CONN))
#define NX_CONN (MASK(ST_HELO) | MASK(ST_MAIL))
#define NX_HELO (MASK(ST_MAIL))
#define NX_HELO (MASK(ST_HELO) | MASK(ST_MAIL))
#define NX_MAIL (MASK(ST_RCPT) | MASK(ST_ABRT))
#define NX_RCPT (MASK(ST_HDRS) | MASK(ST_EOHS) | MASK(ST_RCPT) | MASK(ST_ABRT))
#define NX_HDRS (MASK(ST_EOHS) | MASK(ST_HDRS) | MASK(ST_ABRT))

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@ -9,7 +9,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: listener.c,v 8.38.2.1.2.18 2000/12/29 19:44:28 gshapiro Exp $";
static char id[] = "@(#)$Id: listener.c,v 8.38.2.1.2.21 2001/02/14 02:20:40 gshapiro Exp $";
#endif /* ! lint */
#if _FFR_MILTER
@ -30,16 +30,19 @@ static char id[] = "@(#)$Id: listener.c,v 8.38.2.1.2.18 2000/12/29 19:44:28 gsha
** conn -- connection description
** backlog -- listen backlog
** socksize -- socksize of created socket
** family -- family of created socket
** name -- name for logging
**
** Returns:
** socket upon success, error code otherwise.
*/
static socket_t
mi_milteropen(conn, backlog, socksize, name)
mi_milteropen(conn, backlog, socksize, family, name)
char *conn;
int backlog;
SOCKADDR_LEN_T *socksize;
int *family;
char *name;
{
socket_t sock;
@ -393,7 +396,7 @@ mi_milteropen(conn, backlog, socksize, name)
(void) close(sock);
return INVALID_SOCKET;
}
*family = addr.sa.sa_family;
return sock;
}
/*
@ -457,6 +460,46 @@ mi_closener()
** MI_FAILURE -- Network initialization failed.
*/
# if BROKEN_PTHREAD_SLEEP
/*
** Solaris 2.6, perhaps others, gets an internal threads library panic
** when sleep() is used:
**
** thread_create() failed, returned 11 (EINVAL)
** co_enable, thr_create() returned error = 24
** libthread panic: co_enable failed (PID: 17793 LWP 1)
** stacktrace:
** ef526b10
** ef52646c
** ef534cbc
** 156a4
** 14644
** 1413c
** 135e0
** 0
*/
# define MI_SLEEP(s) \
{ \
int rs = 0; \
struct timeval st; \
\
st.tv_sec = (s); \
st.tv_usec = 0; \
if (st.tv_sec > 0) \
rs = select(0, NULL, NULL, NULL, &st); \
if (rs != 0) \
{ \
smi_log(SMI_LOG_ERR, \
"MI_SLEEP(): select() returned non-zero result %d, errno = %d", \
rs, errno); \
} \
}
# else /* BROKEN_PTHREAD_SLEEP */
# define MI_SLEEP(s) sleep((s))
# endif /* BROKEN_PTHREAD_SLEEP */
int
mi_listener(conn, dbg, smfi, timeout, backlog)
char *conn;
@ -466,11 +509,12 @@ mi_listener(conn, dbg, smfi, timeout, backlog)
int backlog;
{
socket_t connfd = INVALID_SOCKET;
int family = AF_UNSPEC;
int sockopt = 1;
int r;
int ret = MI_SUCCESS;
int cnt_m = 0;
int cnt_t = 0;
int mcnt = 0;
int tcnt = 0;
sthread_t thread_id;
_SOCK_ADDR cliaddr;
SOCKADDR_LEN_T socksize;
@ -485,7 +529,8 @@ mi_listener(conn, dbg, smfi, timeout, backlog)
smfi->xxfi_name, conn);
(void) smutex_init(&L_Mutex);
(void) smutex_lock(&L_Mutex);
listenfd = mi_milteropen(conn, backlog, &socksize, smfi->xxfi_name);
listenfd = mi_milteropen(conn, backlog, &socksize, &family,
smfi->xxfi_name);
if (!ValidSocket(listenfd))
{
smi_log(SMI_LOG_FATAL,
@ -545,10 +590,29 @@ mi_listener(conn, dbg, smfi, timeout, backlog)
break;
}
memset(&cliaddr, '\0', sizeof cliaddr);
connfd = accept(listenfd, (struct sockaddr *) &cliaddr,
&clilen);
(void) smutex_unlock(&L_Mutex);
/*
** If remote side closes before
** accept() finishes, sockaddr
** might not be fully filled in.
*/
if (ValidSocket(connfd) &&
(clilen == 0 ||
# ifdef BSD4_4_SOCKADDR
cliaddr.sa.sa_len == 0 ||
# endif /* BSD4_4_SOCKADDR */
cliaddr.sa.sa_family != family))
{
(void) close(connfd);
connfd = INVALID_SOCKET;
errno = EINVAL;
}
if (!ValidSocket(connfd))
{
smi_log(SMI_LOG_ERR,
@ -569,15 +633,16 @@ mi_listener(conn, dbg, smfi, timeout, backlog)
(void) close(connfd);
smi_log(SMI_LOG_ERR, "%s: malloc(ctx) failed",
smfi->xxfi_name);
sleep(++cnt_m);
if (cnt_m >= MAX_FAILS_M)
mcnt++;
MI_SLEEP(mcnt);
if (mcnt >= MAX_FAILS_M)
{
ret = MI_FAILURE;
break;
}
continue;
}
cnt_m = 0;
mcnt = 0;
memset(ctx, '\0', sizeof *ctx);
ctx->ctx_sd = connfd;
ctx->ctx_dbg = dbg;
@ -611,17 +676,18 @@ mi_listener(conn, dbg, smfi, timeout, backlog)
smi_log(SMI_LOG_ERR,
"%s: thread_create() failed: %d",
smfi->xxfi_name, r);
sleep(++cnt_t);
tcnt++;
MI_SLEEP(tcnt);
(void) close(connfd);
free(ctx);
if (cnt_t >= MAX_FAILS_T)
if (tcnt >= MAX_FAILS_T)
{
ret = MI_FAILURE;
break;
}
continue;
}
cnt_t = 0;
tcnt = 0;
}
if (ret != MI_SUCCESS)
mi_stop_milters(MILTER_ABRT);

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@ -9,7 +9,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: sm_gethost.c,v 8.7.8.4 2000/12/19 04:26:33 gshapiro Exp $";
static char id[] = "@(#)$Id: sm_gethost.c,v 8.7.8.6 2001/02/14 04:07:23 gshapiro Exp $";
#endif /* ! lint */
#if _FFR_MILTER
@ -54,7 +54,7 @@ getipnodebyname(name, family, flags, err)
resv6 = bitset(RES_USE_INET6, _res.options);
_res.options |= RES_USE_INET6;
}
h_errno = 0;
SM_SET_H_ERRNO(0);
h = gethostbyname(name);
*err = h_errno;
if (family == AF_INET6 && !resv6)
@ -102,7 +102,7 @@ mi_gethostbyname(name, family)
# if NETINET6
h = getipnodebyname(name, family, AI_V4MAPPED|AI_ALL, &err);
h_errno = err;
SM_SET_H_ERRNO(err);
# else /* NETINET6 */
h = gethostbyname(name);
# endif /* NETINET6 */

View File

@ -1,5 +1,5 @@
/*
** Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers.
** Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
** All rights reserved.
**
** By using this file, you agree to the terms and conditions set
@ -8,7 +8,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: smdb2.c,v 8.53.2.1.2.5 2000/10/26 00:39:56 geir Exp $";
static char id[] = "@(#)$Id: smdb2.c,v 8.53.2.1.2.7 2001/02/14 04:07:24 gshapiro Exp $";
#endif /* ! lint */
#include <fcntl.h>
@ -359,9 +359,12 @@ int
smdb2_cursor_close(cursor)
SMDB_CURSOR *cursor;
{
int ret;
DBC *dbc = (DBC *) cursor->smdbc_impl;
return db2_error_to_smdb(dbc->c_close(dbc));
ret = db2_error_to_smdb(dbc->c_close(dbc));
free(cursor);
return ret;
}
int

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1990, 1993, 1994
* The Regents of the University of California. All rights reserved.
@ -12,14 +12,14 @@
#ifndef lint
static char copyright[] =
"@(#) Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.\n\
"@(#) Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.\n\
All rights reserved.\n\
Copyright (c) 1990, 1993, 1994\n\
The Regents of the University of California. All rights reserved.\n";
#endif /* ! lint */
#ifndef lint
static char id[] = "@(#)$Id: mail.local.c,v 8.143.4.39 2000/11/14 20:02:47 gshapiro Exp $";
static char id[] = "@(#)$Id: mail.local.c,v 8.143.4.57 2001/02/11 20:08:20 gshapiro Exp $";
#endif /* ! lint */
/*
@ -106,37 +106,25 @@ extern size_t strlcat __P((char *, const char *, size_t));
# if defined(_AIX)
# define USE_LOCKF 1
# define USE_SETEUID 1
# define USE_VSYSLOG 0
# endif /* defined(_AIX) */
# if defined(__hpux)
# define USE_LOCKF 1
# define USE_SETRESUID 1
# define USE_VSYSLOG 0
# endif /* defined(__hpux) */
# ifdef DGUX
# define HASSNPRINTF 1
# define USE_LOCKF 1
# define USE_VSYSLOG 0
# endif /* DGUX */
# if defined(_CRAY)
# if !defined(MAXPATHLEN)
# define MAXPATHLEN PATHSIZE
# endif /* !defined(MAXPATHLEN) */
# define USE_VSYSLOG 0
# define _PATH_MAILDIR "/usr/spool/mail"
# endif /* defined(_CRAY) */
# if defined(ultrix)
# define USE_VSYSLOG 0
# endif /* defined(ultrix) */
# if defined(__osf__)
# define USE_VSYSLOG 0
# endif /* defined(__osf__) */
# if defined(NeXT) && !defined(__APPLE__)
# include <libc.h>
# define _PATH_MAILDIR "/usr/spool/mail"
@ -160,10 +148,6 @@ extern size_t strlcat __P((char *, const char *, size_t));
# define LOCK_EX F_LOCK
# endif /* USE_LOCKF */
# ifndef USE_VSYSLOG
# define USE_VSYSLOG 1
# endif /* ! USE_VSYSLOG */
# ifndef LOCK_EX
# include <sys/file.h>
# endif /* ! LOCK_EX */
@ -205,18 +189,19 @@ extern FILE *fdopen __P((int, const char *));
# define HASSNPRINTF 1 /* has snprintf starting in 4.3 */
# endif /* _AIX4 >= 40300 */
# if !HASSNPRINTF
# if !HASSNPRINTF && !SFIO
extern int snprintf __P((char *, size_t, const char *, ...));
# ifndef _CRAY
extern int vsnprintf __P((char *, size_t, const char *, ...));
# endif /* ! _CRAY */
# endif /* !HASSNPRINTF */
# endif /* !HASSNPRINTF && !SFIO */
/*
** 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 /* USE_SETEUID */
@ -224,6 +209,7 @@ extern int vsnprintf __P((char *, size_t, const char *, ...));
/*
** And of course on hpux you have setresuid()
*/
# ifdef USE_SETRESUID
# define setreuid(r, e) setresuid(-1, e, -1)
# endif /* USE_SETRESUID */
@ -261,19 +247,21 @@ off_t BodyLength;
#endif /* CONTENTLENGTH */
bool EightBitMime = TRUE; /* advertise 8BITMIME in LMTP */
char ErrBuf[10240]; /* error buffer */
int ExitVal = EX_OK; /* sysexits.h error value. */
bool HoldErrs = FALSE; /* Hold errors in ErrBuf */
bool LMTPMode = FALSE;
bool bouncequota = FALSE; /* permanent error when over quota */
bool BounceQuota = FALSE; /* permanent error when over quota */
void deliver __P((int, char *, bool));
void deliver __P((int, char *));
int e_to_sys __P((int));
void notifybiff __P((char *));
int store __P((char *, int));
int store __P((char *, int, bool *));
void usage __P((void));
void vwarn __P((const char *, _BSD_VA_LIST_));
int lockmbox __P((char *));
void unlockmbox __P((void));
void mailerr __P((const char *, const char *, ...));
void flush_error __P((void));
int
@ -287,7 +275,6 @@ main(argc, argv)
char *from;
extern char *optarg;
extern int optind;
extern void dolmtp __P((bool));
/* make sure we have some open file descriptors */
@ -313,7 +300,7 @@ main(argc, argv)
break;
case 'b': /* bounce mail when over quota. */
bouncequota = TRUE;
BounceQuota = TRUE;
break;
case 'd': /* Backward compatible. */
@ -323,7 +310,7 @@ main(argc, argv)
case 'r': /* Backward compatible. */
if (from != NULL)
{
mailerr(NULL, "multiple -f options");
mailerr(NULL, "Multiple -f options");
usage();
}
from = optarg;
@ -345,8 +332,21 @@ main(argc, argv)
notifybiff(NULL);
if (LMTPMode)
dolmtp(bouncequota);
{
extern void dolmtp __P((void));
if (argc > 0)
{
mailerr("421", "Users should not be specified in command line if LMTP required");
exit(EX_TEMPFAIL);
}
dolmtp();
/* NOTREACHED */
exit(EX_OK);
}
/* Non-LMTP from here on out */
if (*argv == '\0')
usage();
@ -355,6 +355,7 @@ main(argc, argv)
** uid matches, otherwise, use the name from the password file
** corresponding to the uid.
*/
uid = getuid();
if (from == NULL && ((from = getlogin()) == NULL ||
@ -371,8 +372,17 @@ main(argc, argv)
** 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, bouncequota);
HoldErrs = TRUE;
fd = store(from, 0, NULL);
HoldErrs = FALSE;
if (fd < 0)
{
flush_error();
exit(ExitVal);
}
for (; *argv != NULL; ++argv)
deliver(fd, *argv);
exit(ExitVal);
/* NOTREACHED */
return ExitVal;
@ -460,7 +470,7 @@ parseaddr(s, rcpt)
p = malloc(l);
if (p == NULL)
{
printf("421 4.3.0 memory exhausted\r\n");
mailerr("421 4.3.0", "Memory exhausted");
exit(EX_TEMPFAIL);
}
@ -473,15 +483,14 @@ process_recipient(addr)
char *addr;
{
if (getpwnam(addr) == NULL)
return "550 5.1.1 user unknown";
return "550 5.1.1 User unknown";
return NULL;
}
#define RCPT_GROW 30
void
dolmtp(bouncequota)
bool bouncequota;
dolmtp()
{
char *return_path = NULL;
char **rcpt_addr = NULL;
@ -495,7 +504,10 @@ dolmtp(bouncequota)
char myhostname[1024];
char buf[4096];
memset(myhostname, '\0', sizeof myhostname);
(void) gethostname(myhostname, sizeof myhostname - 1);
if (myhostname[0] == '\0')
strlcpy(myhostname, "localhost", sizeof myhostname);
printf("220 %s LMTP ready\r\n", myhostname);
for (;;)
@ -515,24 +527,37 @@ dolmtp(bouncequota)
case 'D':
if (strcasecmp(buf, "data") == 0)
{
bool inbody = FALSE;
if (rcpt_num == 0)
{
printf("503 5.5.1 No recipients\r\n");
mailerr("503 5.5.1", "No recipients");
continue;
}
msgfd = store(return_path, rcpt_num);
if (msgfd == -1)
HoldErrs = TRUE;
msgfd = store(return_path, rcpt_num, &inbody);
HoldErrs = FALSE;
if (msgfd < 0 && !inbody)
{
flush_error();
continue;
}
for (i = 0; i < rcpt_num; i++)
{
if (msgfd < 0)
{
/* print error for rcpt */
flush_error();
continue;
}
p = strchr(rcpt_addr[i], '+');
if (p != NULL)
*p++ = '\0';
deliver(msgfd, rcpt_addr[i],
bouncequota);
*p = '\0';
deliver(msgfd, rcpt_addr[i]);
}
(void) close(msgfd);
if (msgfd >= 0)
(void) close(msgfd);
goto rset;
}
goto syntaxerr;
@ -546,7 +571,7 @@ dolmtp(bouncequota)
/* check for duplicate per RFC 1651 4.2 */
if (gotlhlo)
{
printf("503 %s Duplicate LHLO\r\n",
mailerr("503", "%s Duplicate LHLO",
myhostname);
continue;
}
@ -568,17 +593,19 @@ dolmtp(bouncequota)
{
if (return_path != NULL)
{
printf("503 5.5.1 Nested MAIL command\r\n");
mailerr("503 5.5.1",
"Nested MAIL command");
continue;
}
if (strncasecmp(buf+5, "from:", 5) != 0 ||
((return_path = parseaddr(buf + 10,
FALSE)) == NULL))
{
printf("501 5.5.4 Syntax error in parameters\r\n");
mailerr("501 5.5.4",
"Syntax error in parameters");
continue;
}
printf("250 2.5.0 ok\r\n");
printf("250 2.5.0 Ok\r\n");
continue;
}
goto syntaxerr;
@ -589,7 +616,7 @@ dolmtp(bouncequota)
case 'N':
if (strcasecmp(buf, "noop") == 0)
{
printf("250 2.0.0 ok\r\n");
printf("250 2.0.0 Ok\r\n");
continue;
}
goto syntaxerr;
@ -600,7 +627,7 @@ dolmtp(bouncequota)
case 'Q':
if (strcasecmp(buf, "quit") == 0)
{
printf("221 2.0.0 bye\r\n");
printf("221 2.0.0 Bye\r\n");
exit(EX_OK);
}
goto syntaxerr;
@ -613,7 +640,8 @@ dolmtp(bouncequota)
{
if (return_path == NULL)
{
printf("503 5.5.1 Need MAIL command\r\n");
mailerr("503 5.5.1",
"Need MAIL command");
continue;
}
if (rcpt_num >= rcpt_alloc)
@ -625,7 +653,8 @@ dolmtp(bouncequota)
sizeof(char **));
if (rcpt_addr == NULL)
{
printf("421 4.3.0 memory exhausted\r\n");
mailerr("421 4.3.0",
"Memory exhausted");
exit(EX_TEMPFAIL);
}
}
@ -633,21 +662,23 @@ dolmtp(bouncequota)
((rcpt_addr[rcpt_num] = parseaddr(buf + 8,
TRUE)) == NULL))
{
printf("501 5.5.4 Syntax error in parameters\r\n");
mailerr("501 5.5.4",
"Syntax error in parameters");
continue;
}
if ((err = process_recipient(rcpt_addr[rcpt_num])) != NULL)
err = process_recipient(rcpt_addr[rcpt_num]);
if (err != NULL)
{
printf("%s\r\n", err);
mailerr(NULL, "%s", err);
continue;
}
rcpt_num++;
printf("250 2.1.5 ok\r\n");
printf("250 2.1.5 Ok\r\n");
continue;
}
else if (strcasecmp(buf, "rset") == 0)
{
printf("250 2.0.0 ok\r\n");
printf("250 2.0.0 Ok\r\n");
rset:
while (rcpt_num > 0)
@ -665,7 +696,7 @@ dolmtp(bouncequota)
case 'V':
if (strncasecmp(buf, "vrfy ", 5) == 0)
{
printf("252 2.3.3 try RCPT to attempt delivery\r\n");
printf("252 2.3.3 Try RCPT to attempt delivery\r\n");
continue;
}
goto syntaxerr;
@ -674,7 +705,7 @@ dolmtp(bouncequota)
default:
syntaxerr:
printf("500 5.5.2 Syntax error\r\n");
mailerr("500 5.5.2", "Syntax error");
continue;
/* NOTREACHED */
break;
@ -683,9 +714,10 @@ dolmtp(bouncequota)
}
int
store(from, lmtprcpts)
store(from, lmtprcpts, inbody)
char *from;
int lmtprcpts;
bool *inbody;
{
FILE *fp = NULL;
time_t tval;
@ -696,28 +728,25 @@ store(from, lmtprcpts)
int fd;
char tmpbuf[sizeof _PATH_LOCTMP + 1];
if (inbody != NULL)
*inbody = FALSE;
(void) umask(0077);
(void) strlcpy(tmpbuf, _PATH_LOCTMP, sizeof tmpbuf);
if ((fd = mkstemp(tmpbuf)) == -1 || (fp = fdopen(fd, "w+")) == NULL)
if ((fd = mkstemp(tmpbuf)) < 0 || (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(ExitVal);
}
mailerr("451 4.3.0", "Unable to open temporary file");
return -1;
}
(void) unlink(tmpbuf);
if (LMTPMode)
{
printf("354 go ahead\r\n");
printf("354 Go ahead\r\n");
(void) fflush(stdout);
}
if (inbody != NULL)
*inbody = TRUE;
(void) time(&tval);
(void) fprintf(fp, "From %s %s", from, ctime(&tval));
@ -729,7 +758,7 @@ store(from, lmtprcpts)
line[0] = '\0';
eline = TRUE;
while (fgets(line, sizeof(line), stdin) != (char *)NULL)
while (fgets(line, sizeof(line), stdin) != (char *) NULL)
{
size_t line_len = 0;
int peek;
@ -740,7 +769,7 @@ store(from, lmtprcpts)
line_len++;
/* Check for dot-stuffing */
if (prevfl && lmtprcpts && line[0] == '.')
if (prevfl && LMTPMode && line[0] == '.')
{
if (line[1] == '\n' ||
(line[1] == '\r' && line[2] == '\n'))
@ -784,7 +813,8 @@ store(from, lmtprcpts)
if (prevfl && line[0] == '\n' && HeaderLength == 0)
{
eline = FALSE;
HeaderLength = ftell(fp);
if (fp != NULL)
HeaderLength = ftell(fp);
if (HeaderLength <= 0)
{
/*
@ -802,6 +832,7 @@ store(from, lmtprcpts)
else
{
if (eline && line[0] == 'F' &&
fp != NULL &&
!memcmp(line, "From ", 5))
(void) putc('>', fp);
eline = FALSE;
@ -821,40 +852,39 @@ store(from, lmtprcpts)
#endif /* CONTENTLENGTH */
}
(void) fwrite(line, sizeof(char), line_len, fp);
if (ferror(fp))
if (fp != NULL)
{
if (lmtprcpts)
{
while (lmtprcpts--)
printf("451 4.3.0 temporary file write error\r\n");
(void) fclose(fp);
return -1;
}
else
(void) fwrite(line, sizeof(char), line_len, fp);
if (ferror(fp))
{
mailerr("451 4.3.0",
"temporary file write error");
"Temporary file write error");
(void) fclose(fp);
exit(ExitVal);
fp = NULL;
continue;
}
}
}
if (lmtprcpts)
/* check if an error occurred */
if (fp == NULL)
return -1;
if (LMTPMode)
{
/* Got a premature EOF -- toss message and exit */
exit(EX_OK);
}
/* If message not newline terminated, need an extra. */
if (strchr(line, '\n') == NULL)
if (fp != NULL && strchr(line, '\n') == NULL)
(void) putc('\n', fp);
lmtpdot:
#ifdef CONTENTLENGTH
BodyLength = ftell(fp);
if (fp != NULL)
BodyLength = ftell(fp);
if (HeaderLength == 0 && BodyLength > 0) /* empty body */
{
HeaderLength = BodyLength;
@ -880,32 +910,23 @@ store(from, lmtprcpts)
#endif /* CONTENTLENGTH */
/* Output a newline; note, empty messages are allowed. */
(void) putc('\n', fp);
if (fp != NULL)
(void) putc('\n', fp);
if (fflush(fp) == EOF || ferror(fp) != 0)
if (fp == NULL || fflush(fp) == EOF || ferror(fp) != 0)
{
if (lmtprcpts)
{
while (lmtprcpts--)
printf("451 4.3.0 temporary file write error\r\n");
mailerr("451 4.3.0", "Temporary file write error");
if (fp != NULL)
(void) fclose(fp);
return -1;
}
else
{
mailerr("451 4.3.0", "temporary file write error");
(void) fclose(fp);
exit(ExitVal);
}
return -1;
}
return fd;
}
void
deliver(fd, name, bouncequota)
deliver(fd, name)
int fd;
char *name;
bool bouncequota;
{
struct stat fsb;
struct stat sb;
@ -913,6 +934,7 @@ deliver(fd, name, bouncequota)
char path[MAXPATHLEN];
int mbfd = -1, nr = 0, nw, off;
char *p;
char *errcode;
off_t curoff;
#ifdef CONTENTLENGTH
off_t headerbytes;
@ -926,28 +948,17 @@ deliver(fd, name, bouncequota)
** Disallow delivery to unknown names -- special mailboxes can be
** handled in the sendmail aliases file.
*/
if ((pw = getpwnam(name)) == NULL)
{
if (ExitVal != EX_TEMPFAIL)
ExitVal = EX_UNAVAILABLE;
if (LMTPMode)
{
if (ExitVal == 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);
}
if (ExitVal == EX_TEMPFAIL)
errcode = "451 4.3.0";
else
{
char *errcode = NULL;
if (ExitVal == EX_TEMPFAIL)
errcode = "451 4.3.0";
else
errcode = "550 5.1.1";
mailerr(errcode, "unknown name: %s", name);
ExitVal = EX_UNAVAILABLE;
errcode = "550 5.1.1";
}
mailerr(errcode, "Unknown name: %s", name);
return;
}
endpwent();
@ -1007,16 +1018,13 @@ deliver(fd, name, bouncequota)
if (off == EX_TEMPFAIL || e_to_sys(off) == EX_TEMPFAIL)
{
ExitVal = EX_TEMPFAIL;
mailerr("451 4.3.0",
"lockmailbox %s failed; error code %d %s",
p, off, errno > 0 ? errstring(errno) : "");
errcode = "451 4.3.0";
}
else
{
mailerr("551 5.3.0",
"lockmailbox %s failed; error code %d %s",
p, off, errno > 0 ? errstring(errno) : "");
}
errcode = "551 5.3.0";
mailerr(errcode, "lockmailbox %s failed; error code %d %s",
p, off, errno > 0 ? errstring(errno) : "");
return;
}
@ -1043,7 +1051,7 @@ deliver(fd, name, bouncequota)
"%s: lstat: file changed after open", path);
goto err1;
}
if (mbfd == -1)
if (mbfd < 0)
{
if (save_errno == EEXIST)
goto tryagain;
@ -1128,7 +1136,7 @@ deliver(fd, name, bouncequota)
}
/* Get the starting offset of the new message for biff. */
curoff = lseek(mbfd, (off_t)0, SEEK_END);
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));
@ -1137,9 +1145,9 @@ deliver(fd, name, bouncequota)
name, (long) curoff);
/* Copy the message into the file. */
if (lseek(fd, (off_t)0, SEEK_SET) == (off_t)-1)
if (lseek(fd, (off_t) 0, SEEK_SET) == (off_t) -1)
{
mailerr("450 4.2.0", "temporary file: %s",
mailerr("450 4.2.0", "Temporary file: %s",
errstring(errno));
goto err1;
}
@ -1176,13 +1184,12 @@ deliver(fd, name, bouncequota)
{
if ((nw = write(mbfd, buf + off, nr - off)) < 0)
{
errcode = "450 4.2.0";
#ifdef EDQUOT
if (errno == EDQUOT && bouncequota)
mailerr("552 5.2.2", "%s: %s",
path, errstring(errno));
else
if (errno == EDQUOT && BounceQuota)
errcode = "552 5.2.2";
#endif /* EDQUOT */
mailerr("450 4.2.0", "%s: %s",
mailerr(errcode, "%s: %s",
path, errstring(errno));
goto err3;
}
@ -1190,7 +1197,7 @@ deliver(fd, name, bouncequota)
}
if (nr < 0)
{
mailerr("450 4.2.0", "temporary file: %s",
mailerr("450 4.2.0", "Temporary file: %s",
errstring(errno));
goto err3;
}
@ -1200,15 +1207,7 @@ deliver(fd, name, bouncequota)
{
mailerr("450 4.2.0", "%s: %s", path, errstring(errno));
err3:
if (setreuid(0, 0) < 0)
{
#if 0
/* already printed an error above for this recipient */
(void) e_to_sys(errno);
mailerr("450 4.2.0", "setreuid(0, 0): %s",
errstring(errno));
#endif /* 0 */
}
(void) setreuid(0, 0);
#ifdef DEBUG
fprintf(stderr, "reset euid = %d\n", geteuid());
#endif /* DEBUG */
@ -1222,12 +1221,12 @@ err0: unlockmbox();
/* Close and check -- NFS doesn't write until the close. */
if (close(mbfd))
{
errcode = "450 4.2.0";
#ifdef EDQUOT
if (errno == EDQUOT && bouncequota)
mailerr("552 5.2.2", "%s: %s", path, errstring(errno));
else
if (errno == EDQUOT && BounceQuota)
errcode = "552 5.2.2";
#endif /* EDQUOT */
mailerr("450 4.2.0", "%s: %s", path, errstring(errno));
mailerr(errcode, "%s: %s", path, errstring(errno));
(void) truncate(path, curoff);
}
else
@ -1244,7 +1243,7 @@ err0: unlockmbox();
#endif /* DEBUG */
unlockmbox();
if (LMTPMode)
printf("250 2.1.5 %s OK\r\n", name);
printf("250 2.1.5 %s Ok\r\n", name);
}
/*
@ -1399,7 +1398,7 @@ notifybiff(msg)
if (addr.sin_family == AF_UNSPEC)
return;
if (f < 0 && (f = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
if (f < 0 && (f = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
return;
len = strlen(msg) + 1;
(void) sendto(f, msg, len, 0, (struct sockaddr *) &addr, sizeof(addr));
@ -1423,61 +1422,53 @@ mailerr(hdr, fmt, va_alist)
va_dcl
#endif /* __STDC__ */
{
size_t len = 0;
va_list ap;
(void) e_to_sys(errno);
#ifdef __STDC__
va_start(ap, fmt);
#else /* __STDC__ */
va_start(ap);
#endif /* __STDC__ */
if (LMTPMode)
{
if (hdr != NULL)
printf("%s ", hdr);
(void) vprintf(fmt, ap);
(void) printf("\r\n");
}
else
{
(void) e_to_sys(errno);
vwarn(fmt, ap);
{
snprintf(ErrBuf, sizeof ErrBuf, "%s ", hdr);
len = strlen(ErrBuf);
}
}
(void) vsnprintf(&ErrBuf[len], sizeof ErrBuf - len, fmt, ap);
if (!HoldErrs)
flush_error();
/* Log the message to syslog. */
if (!LMTPMode)
syslog(LOG_ERR, "%s", ErrBuf);
}
void
vwarn(fmt, ap)
const char *fmt;
_BSD_VA_LIST_ ap;
flush_error()
{
/*
** Log the message to stderr.
**
** Don't use LOG_PERROR as an openlog() flag to do this,
** it's not portable enough.
*/
if (ExitVal != 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 /* USE_VSYSLOG */
if (LMTPMode)
printf("%s\r\n", ErrBuf);
else
{
char fmtbuf[10240];
(void) vsnprintf(fmtbuf, sizeof fmtbuf, fmt, ap);
syslog(LOG_ERR, "%s", fmtbuf);
if (ExitVal != EX_USAGE)
(void) fprintf(stderr, "mail.local: ");
fprintf(stderr, "%s\n", ErrBuf);
}
#endif /* USE_VSYSLOG */
}
/*
* e_to_sys --
* Guess which errno's are temporary. Gag me.
*/
int
e_to_sys(num)
int num;
@ -1490,7 +1481,7 @@ e_to_sys(num)
{
#ifdef EDQUOT
case EDQUOT: /* Disc quota exceeded */
if (bouncequota)
if (BounceQuota)
{
ExitVal = EX_UNAVAILABLE;
break;
@ -1631,15 +1622,6 @@ mkstemp(path)
return (_gettemp(path, &fd) ? fd : -1);
}
# if 0
char *
mktemp(path)
char *path;
{
return(_gettemp(path, (int *)NULL) ? path : (char *)NULL);
}
# endif /* 0 */
static
_gettemp(path, doopen)
char *path;

View File

@ -21,7 +21,7 @@ static char copyright[] =
#endif /* ! lint */
#ifndef lint
static char id[] = "@(#)$Id: mailstats.c,v 8.53.16.11 2000/09/17 17:04:26 gshapiro Exp $";
static char id[] = "@(#)$Id: mailstats.c,v 8.53.16.12 2001/02/15 20:52:36 geir Exp $";
#endif /* ! lint */
#include <unistd.h>

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -13,7 +13,7 @@
#ifndef lint
static char copyright[] =
"@(#) Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.\n\
"@(#) Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.\n\
All rights reserved.\n\
Copyright (c) 1983 Eric P. Allman. All rights reserved.\n\
Copyright (c) 1988, 1993\n\
@ -21,7 +21,7 @@ static char copyright[] =
#endif /* ! lint */
#ifndef lint
static char id[] = "@(#)$Id: praliases.c,v 8.59.4.15 2000/10/24 00:42:59 geir Exp $";
static char id[] = "@(#)$Id: praliases.c,v 8.59.4.18 2001/01/22 19:00:18 gshapiro Exp $";
#endif /* ! lint */
#include <sys/types.h>
@ -272,6 +272,21 @@ praliases(filename, argc, argv)
db_name++;
}
/* Skip non-file based DB types */
if (db_type != NULL && *db_type != '\0')
{
if (db_type != SMDB_TYPE_DEFAULT &&
strcmp(db_type, "hash") != 0 &&
strcmp(db_type, "btree") != 0 &&
strcmp(db_type, "dbm") != 0)
{
fprintf(stderr,
"praliases: Skipping non-file based alias type %s\n",
db_type);
return;
}
}
if (*db_name == '\0' || (db_type != NULL && *db_type == '\0'))
{
if (colon != NULL)

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1988, 1993
* The Regents of the University of California. All rights reserved.
@ -19,7 +19,7 @@ static char copyright[] =
#endif /* ! lint */
#ifndef lint
static char id[] = "@(#)$Id: rmail.c,v 8.39.4.9 2000/11/17 08:42:56 gshapiro Exp $";
static char id[] = "@(#)$Id: rmail.c,v 8.39.4.11 2001/02/14 04:07:25 gshapiro Exp $";
#endif /* ! lint */
/*
@ -97,9 +97,9 @@ static char id[] = "@(#)$Id: rmail.c,v 8.39.4.9 2000/11/17 08:42:56 gshapiro Exp
# define memmove(d, s, l) (bcopy((s), (d), (l)))
#endif /* defined(sun) && !defined(BSD) && !defined(SOLARIS) && !defined(__svr4__) && !defined(__SVR4) */
#if !HASSNPRINTF
#if !HASSNPRINTF && !SFIO
extern int snprintf __P((char *, size_t, const char *, ...));
#endif /* !HASSNPRINTF */
#endif /* !HASSNPRINTF && !SFIO */
#if defined(BSD4_4) || defined(__osf__) || defined(__GNU_LIBRARY__) || defined(IRIX64) || defined(IRIX5) || defined(IRIX6)
# ifndef HASSTRERROR

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1993 Eric P. Allman. All rights reserved.
* Copyright (c) 1993
@ -13,7 +13,7 @@
#ifndef lint
static char copyright[] =
"@(#) Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.\n\
"@(#) Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.\n\
All rights reserved.\n\
Copyright (c) 1993 Eric P. Allman. All rights reserved.\n\
Copyright (c) 1993\n\
@ -21,7 +21,7 @@ static char copyright[] =
#endif /* ! lint */
#ifndef lint
static char id[] = "@(#)$Id: smrsh.c,v 8.31.4.6 2000/10/09 20:37:16 gshapiro Exp $";
static char id[] = "@(#)$Id: smrsh.c,v 8.31.4.8 2001/01/22 19:00:26 gshapiro Exp $";
#endif /* ! lint */
/*
@ -76,9 +76,9 @@ static char id[] = "@(#)$Id: smrsh.c,v 8.31.4.6 2000/10/09 20:37:16 gshapiro Exp
#ifndef CMDDIR
# if defined(HPUX10) || defined(HPUX11) || SOLARIS >= 20800
# define CMDDIR "/var/adm/sm.bin"
# else /* HPUX10 || HPUX11 || SOLARIS > 20800 */
# else /* HPUX10 || HPUX11 || SOLARIS >= 20800 */
# define CMDDIR "/usr/adm/sm.bin"
# endif /* HPUX10 || HPUX11 || SOLARIS > 20800 */
# endif /* HPUX10 || HPUX11 || SOLARIS >= 20800 */
#endif /* ! CMDDIR */
/* characters disallowed in the shell "-c" argument */

View File

@ -1,4 +1,4 @@
# Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
# Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
# All rights reserved.
# Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
# Copyright (c) 1988
@ -9,7 +9,7 @@
# the sendmail distribution.
#
#
# $Id: README,v 8.263.2.1.2.27 2000/12/16 16:46:02 gshapiro Exp $
# $Id: README,v 8.263.2.1.2.32 2001/01/29 23:45:22 gshapiro Exp $
#
This directory contains the source files for sendmail(TM).
@ -631,9 +631,10 @@ YOU HEADACHES!
When attempting to canonify a hostname, some broken name servers will
return SERVFAIL (a temporary failure) on T_AAAA (IPv6) lookups. If you
want to excuse this behavior, compile sendmail with
-D_FFR_WORKAROUND_BROKEN_NAMESERVERS. However, instead, we recommend catching
the problem and reporting it to the name server administrator so we can rid
the world of broken name servers.
-D_FFR_WORKAROUND_BROKEN_NAMESERVERS and add WorkAroundBrokenAAAA to your
ResolverOptions setting. However, instead, we recommend catching the
problem and reporting it to the name server administrator so we can rid the
world of broken name servers.
+----------------------------------------+
| STARTTLS COMPILATION AND CONFIGURATION |
@ -1038,6 +1039,12 @@ IRIX 6.x
If you are using XFS filesystem, avoid using the -32 ABI switch to
the cc compiler if possible.
Broken inet_aton and inet_ntoa on IRIX using gcc: There's
a problem with gcc on IRIX, i.e., gcc can't pass structs
less than 16 bits long unless they are 8 bits; IRIX 6.2 has
some other sized structs. See
http://www.bitmechanic.com/mail-archives/mysql/current/0418.html
IRIX 6.4
The IRIX 6.5.4 version of /bin/m4 does not work properly with
sendmail. Either install fw_m4.sw.m4 off the Freeware_May99 CD and
@ -1096,8 +1103,10 @@ BSDI (BSD/386) 1.0, NetBSD 0.9, FreeBSD 1.0
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 sendmail and add
oldbind.compat.o to OBJADD in the Makefile.
copy ../contrib/oldbind.compat.c into sendmail and add the
following to devtools/Site/site.config.m4:
APPENDDEF(`confOBJADD', `oldbind.compat.o')
A/UX
Date: Tue, 12 Oct 1993 18:28:28 -0400 (EDT)
@ -1236,6 +1245,17 @@ Linux
"#include <syslog.h>" to the SFIO version of stdio.h as the very
first line.
glibc
glibc 2.2.1 (and possibly other versions) changed the value of
__RES in resolv.h but failed to actually provide the IPv6 API
changes that the change implied. Therefore, compiling with
-DNETINET6 fails.
Workarounds:
1) Compile without -DNETINET6
2) Build against a real BIND 8.2.2 include/lib tree
3) Wait for glibc to fix it
AIX 4.X
The AIX 4.X linker uses library paths specified during compilation
using -L for run-time shared library searches. Therefore, it is
@ -1268,7 +1288,7 @@ AIX 4.3.3
Workarounds:
1) Compile without -DNETINET6
2) Build against a real Bind 8.2.2 include/lib tree
2) Build against a real BIND 8.2.2 include/lib tree
3) Wait for IBM to fix it
AIX 4.X
@ -1668,4 +1688,4 @@ util.c Some general purpose routines used by sendmail.
version.c The version number and information about this
version of sendmail.
(Version $Revision: 8.263.2.1.2.27 $, last update $Date: 2000/12/16 16:46:02 $ )
(Version $Revision: 8.263.2.1.2.32 $, last update $Date: 2001/01/29 23:45:22 $ )

View File

@ -1,12 +1,12 @@
/*
* Copyright (c) 1999 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999, 2001 Sendmail, Inc. and its suppliers.
* 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.
*
* $Id: bf.h,v 8.5 1999/11/04 19:31:25 ca Exp $
* $Id: bf.h,v 8.5.16.2 2001/02/14 04:07:27 gshapiro Exp $
*
* Contributed by Exactis.com, Inc.
*
@ -20,6 +20,7 @@ extern FILE *bfdup __P((FILE *));
extern int bfcommit __P((FILE *));
extern int bfrewind __P((FILE *));
extern int bftruncate __P((FILE *));
extern int bffsync __P((FILE *));
extern int bfclose __P((FILE *));
extern bool bftest __P((FILE *));

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@ -11,7 +11,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: bf_portable.c,v 8.25.4.3 2000/06/29 21:21:58 gshapiro Exp $";
static char id[] = "@(#)$Id: bf_portable.c,v 8.25.4.5 2001/02/14 04:07:27 gshapiro Exp $";
#endif /* ! lint */
#if SFIO
@ -282,6 +282,47 @@ bftruncate(fp)
return ret;
}
/*
** BFFSYNC -- fsync the fd associated with the FILE *
**
** Parameters:
** fp -- FILE * to fsync
**
** Returns:
** 0 on success, -1 on error
**
** Sets errno:
** EINVAL if FILE * not bfcommitted yet.
** any value of errno specified by fsync()
*/
int
bffsync(fp)
FILE *fp;
{
int fd;
struct bf *bfp;
/* Get associated bf structure */
bfp = bflookup(fp);
/* If called on a normal FILE *, noop */
if (bfp != NULL && !bfp->bf_committed)
fd = -1;
else
fd = fileno(fp);
if (tTd(58, 10))
dprintf("bffsync: fd = %d\n", fd);
if (fd < 0)
{
errno = EINVAL;
return -1;
}
return fsync(fd);
}
/*
** BFCLOSE -- close a buffered file
**

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@ -11,7 +11,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: bf_torek.c,v 8.19.18.2 2000/09/17 17:04:26 gshapiro Exp $";
static char id[] = "@(#)$Id: bf_torek.c,v 8.19.18.4 2001/02/14 04:07:27 gshapiro Exp $";
#endif /* ! lint */
#if SFIO
@ -380,6 +380,51 @@ bftruncate(fp)
return ftruncate(fileno(fp), 0);
}
/*
** BFFSYNC -- fsync the fd associated with the FILE *
**
** Parameters:
** fp -- FILE * to fsync
**
** Returns:
** 0 on success, -1 on error
**
** Sets errno:
** EINVAL if FILE * not bfcommitted yet.
** any value of errno specified by fsync()
*/
int
bffsync(fp)
FILE *fp;
{
int fd;
struct bf *bfp;
if (bftest(fp))
{
/* Get bf structure */
bfp = (struct bf *)fp->_cookie;
if (bfp->bf_ondisk && bfp->bf_committed)
fd = bfp->bf_disk_fd;
else
fd = -1;
}
else
fd = fileno(fp);
if (tTd(58, 10))
dprintf("bffsync: fd = %d\n", fd);
if (fd < 0)
{
errno = EINVAL;
return -1;
}
return fsync(fd);
}
/*
** BFCLOSE -- close a buffered file
**

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -12,7 +12,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: collect.c,v 8.136.4.8 2000/10/09 00:50:04 gshapiro Exp $";
static char id[] = "@(#)$Id: collect.c,v 8.136.4.15 2001/02/21 01:05:59 gshapiro Exp $";
#endif /* ! lint */
#include <sendmail.h>
@ -84,7 +84,6 @@ collect(fp, smtpmode, hdrp, e)
volatile int hdrslen = 0;
volatile int numhdrs = 0;
volatile int dfd;
volatile int afd;
volatile int rstat = EX_OK;
u_char *volatile pbp;
u_char peekbuf[8];
@ -102,6 +101,8 @@ collect(fp, smtpmode, hdrp, e)
if (!headeronly)
{
struct stat stbuf;
long sff = SFF_OPENASROOT;
(void) strlcpy(dfname, queuename(e, 'd'), sizeof dfname);
#if _FFR_QUEUE_FILE_MODE
@ -110,18 +111,21 @@ collect(fp, smtpmode, hdrp, e)
if (bitset(S_IWGRP, QueueFileMode))
oldumask = umask(002);
df = bfopen(dfname, QueueFileMode, DataFileBufferSize,
SFF_OPENASROOT);
df = bfopen(dfname, QueueFileMode,
DataFileBufferSize, sff);
if (bitset(S_IWGRP, QueueFileMode))
(void) umask(oldumask);
}
#else /* _FFR_QUEUE_FILE_MODE */
df = bfopen(dfname, FileMode, DataFileBufferSize,
SFF_OPENASROOT);
df = bfopen(dfname, FileMode, DataFileBufferSize, sff);
#endif /* _FFR_QUEUE_FILE_MODE */
if (df == NULL)
{
syserr("Cannot create %s", dfname);
HoldErrs = FALSE;
if (smtpmode)
syserr("421 4.3.5 Unable to create data file");
else
syserr("Cannot create %s", dfname);
e->e_flags |= EF_NO_BODY_RETN;
finis(TRUE, ExitStat);
/* NOTREACHED */
@ -346,8 +350,9 @@ collect(fp, smtpmode, hdrp, e)
else if (c != '\0')
{
*bp++ = c;
hdrslen++;
if (MaxHeadersLength > 0 &&
++hdrslen > MaxHeadersLength)
hdrslen > MaxHeadersLength)
{
sm_syslog(LOG_NOTICE, e->e_id,
"headers too large (%d max) from %s during message collect",
@ -496,13 +501,6 @@ collect(fp, smtpmode, hdrp, e)
/* skip next few clauses */
/* EMPTY */
}
else if ((afd = fileno(df)) >= 0 && fsync(afd) < 0)
{
dferror(df, "fsync", e);
flush_errors(TRUE);
finis(TRUE, ExitStat);
/* NOTREACHED */
}
else if (bfcommit(df) < 0)
{
int save_errno = errno;
@ -527,6 +525,13 @@ collect(fp, smtpmode, hdrp, e)
flush_errors(TRUE);
finis(save_errno != EEXIST, ExitStat);
}
else if (bffsync(df) < 0)
{
dferror(df, "bffsync", e);
flush_errors(TRUE);
finis(TRUE, ExitStat);
/* NOTREACHED */
}
else if (bfclose(df) < 0)
{
dferror(df, "bfclose", e);

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -12,7 +12,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: conf.c,v 8.646.2.2.2.61 2000/12/28 23:46:41 gshapiro Exp $";
static char id[] = "@(#)$Id: conf.c,v 8.646.2.2.2.69 2001/02/27 19:50:11 gshapiro Exp $";
#endif /* ! lint */
#include <sendmail.h>
@ -4358,7 +4358,7 @@ getipnodebyname(name, family, flags, err)
resv6 = bitset(RES_USE_INET6, _res.options);
_res.options |= RES_USE_INET6;
}
h_errno = 0;
SM_SET_H_ERRNO(0);
h = gethostbyname(name);
*err = h_errno;
if (family == AF_INET6 && !resv6)
@ -4375,7 +4375,7 @@ getipnodebyaddr(addr, len, family, err)
{
struct hostent *h;
h_errno = 0;
SM_SET_H_ERRNO(0);
h = gethostbyaddr(addr, len, family);
*err = h_errno;
return h;
@ -4401,6 +4401,7 @@ sm_gethostbyname(name, family)
char *name;
int family;
{
int save_errno;
struct hostent *h = NULL;
#if (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) || (defined(sony_news) && defined(__svr4))
# if SOLARIS == 20300 || SOLARIS == 203
@ -4411,12 +4412,14 @@ sm_gethostbyname(name, family)
if (tTd(61, 10))
dprintf("_switch_gethostbyname_r(%s)... ", name);
h = _switch_gethostbyname_r(name, &hp, buf, sizeof(buf), &h_errno);
save_errno = errno;
# else /* SOLARIS == 20300 || SOLARIS == 203 */
extern struct hostent *__switch_gethostbyname();
if (tTd(61, 10))
dprintf("__switch_gethostbyname(%s)... ", name);
h = __switch_gethostbyname(name);
save_errno = errno;
# endif /* SOLARIS == 20300 || SOLARIS == 203 */
#else /* (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) || (defined(sony_news) && defined(__svr4)) */
int nmaps;
@ -4424,7 +4427,6 @@ sm_gethostbyname(name, family)
int flags = AI_DEFAULT|AI_ALL;
int err;
# endif /* NETINET6 */
int save_errno;
char *maptype[MAXMAPSTACK];
short mapreturn[MAXMAPACTIONS];
char hbuf[MAXNAME];
@ -4437,7 +4439,7 @@ sm_gethostbyname(name, family)
flags &= ~AI_ADDRCONFIG;
# endif /* ADDRCONFIG_IS_BROKEN */
h = getipnodebyname(name, family, flags, &err);
h_errno = err;
SM_SET_H_ERRNO(err);
# else /* NETINET6 */
h = gethostbyname(name);
# endif /* NETINET6 */
@ -4465,7 +4467,7 @@ sm_gethostbyname(name, family)
return NULL;
}
(void) strlcpy(hbuf, name, sizeof hbuf);
shorten_hostname(hbuf);
(void) shorten_hostname(hbuf);
/* if it hasn't been shortened, there's no point */
if (strcmp(hbuf, name) != 0)
@ -4478,7 +4480,7 @@ sm_gethostbyname(name, family)
h = getipnodebyname(hbuf, family,
AI_V4MAPPED|AI_ALL,
&err);
h_errno = err;
SM_SET_H_ERRNO(err);
save_errno = errno;
# else /* NETINET6 */
h = gethostbyname(hbuf);
@ -4541,26 +4543,42 @@ sm_gethostbyaddr(addr, len, type)
int type;
{
struct hostent *hp;
#if NETINET6
if (type == AF_INET6 &&
IN6_IS_ADDR_UNSPECIFIED((struct in6_addr *) addr))
{
/* Avoid reverse lookup for IPv6 unspecified address */
SM_SET_H_ERRNO(HOST_NOT_FOUND);
return NULL;
}
#endif /* NETINET6 */
#if (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204)
# if SOLARIS == 20300 || SOLARIS == 203
static struct hostent he;
static char buf[1000];
extern struct hostent *_switch_gethostbyaddr_r();
{
static struct hostent he;
static char buf[1000];
extern struct hostent *_switch_gethostbyaddr_r();
hp = _switch_gethostbyaddr_r(addr, len, type, &he, buf, sizeof(buf), &h_errno);
hp = _switch_gethostbyaddr_r(addr, len, type, &he,
buf, sizeof(buf), &h_errno);
}
# else /* SOLARIS == 20300 || SOLARIS == 203 */
extern struct hostent *__switch_gethostbyaddr();
{
extern struct hostent *__switch_gethostbyaddr();
hp = __switch_gethostbyaddr(addr, len, type);
hp = __switch_gethostbyaddr(addr, len, type);
}
# endif /* SOLARIS == 20300 || SOLARIS == 203 */
#else /* (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) */
# if NETINET6
int err;
# endif /* NETINET6 */
{
int err;
# if NETINET6
hp = getipnodebyaddr(addr, len, type, &err);
h_errno = err;
hp = getipnodebyaddr(addr, len, type, &err);
SM_SET_H_ERRNO(err);
}
# else /* NETINET6 */
hp = gethostbyaddr(addr, len, type);
# endif /* NETINET6 */
@ -4935,18 +4953,21 @@ load_if_names()
switch (af)
{
case AF_INET6:
ia6 = sa->sin6.sin6_addr;
# ifdef __KAME__
/* convert into proper scoped address - */
if ((IN6_IS_ADDR_LINKLOCAL(&ia6) ||
IN6_IS_ADDR_SITELOCAL(&ia6)) &&
# ifdef __KAME__
/* convert into proper scoped address */
if ((IN6_IS_ADDR_LINKLOCAL(&sa->sin6.sin6_addr) ||
IN6_IS_ADDR_SITELOCAL(&sa->sin6.sin6_addr)) &&
sa->sin6.sin6_scope_id == 0)
{
sa->sin6.sin6_scope_id = ntohs(ia6.s6_addr[3] |
((unsigned int) ia6.s6_addr[2] << 8));
ia6.s6_addr[2] = ia6.s6_addr[3] = 0;
struct in6_addr *ia6p;
ia6p = &sa->sin6.sin6_addr;
sa->sin6.sin6_scope_id = ntohs(ia6p->s6_addr[3] |
((unsigned int)ia6p->s6_addr[2] << 8));
ia6p->s6_addr[2] = ia6p->s6_addr[3] = 0;
}
# endif /* __KAME__ */
# endif /* __KAME__ */
ia6 = sa->sin6.sin6_addr;
if (IN6_IS_ADDR_UNSPECIFIED(&ia6))
{
addr = anynet_ntop(&ia6, buf6, sizeof buf6);
@ -5129,6 +5150,20 @@ load_if_names()
# if NETINET6
case AF_INET6:
# ifdef __KAME__
/* convert into proper scoped address */
if ((IN6_IS_ADDR_LINKLOCAL(&sa->sin6.sin6_addr) ||
IN6_IS_ADDR_SITELOCAL(&sa->sin6.sin6_addr)) &&
sa->sin6.sin6_scope_id == 0)
{
struct in6_addr *ia6p;
ia6p = &sa->sin6.sin6_addr;
sa->sin6.sin6_scope_id = ntohs(ia6p->s6_addr[3] |
((unsigned int)ia6p->s6_addr[2] << 8));
ia6p->s6_addr[2] = ia6p->s6_addr[3] = 0;
}
# endif /* __KAME__ */
ia6 = sa->sin6.sin6_addr;
if (IN6_IS_ADDR_UNSPECIFIED(&ia6))
{

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -10,7 +10,7 @@
* the sendmail distribution.
*
*
* $Id: conf.h,v 8.496.4.32 2000/12/15 19:20:53 gshapiro Exp $
* $Id: conf.h,v 8.496.4.37 2001/02/12 21:40:16 gshapiro Exp $
*/
/*
@ -488,6 +488,9 @@ typedef int pid_t;
# endif /* ! __svr4__ */
# define GIDSET_T gid_t
# define USE_SA_SIGACTION 1 /* use sa_sigaction field */
# if _FFR_MILTER
# define BROKEN_PTHREAD_SLEEP 1 /* sleep after pthread_create() fails */
# endif /* _FFR_MILTER */
# ifndef _PATH_UNIX
# define _PATH_UNIX "/dev/ksyms"
# endif /* ! _PATH_UNIX */
@ -1004,6 +1007,12 @@ typedef int pid_t;
# define HASSTRL 0 /* strlcat(3) is broken in 2.5 and earlier */
# else /* OpenBSD < 199912 */
# define HASSTRL 1 /* has strlc{py,at}(3) functions */
# if OpenBSD >= 200006
# define HASSRANDOMDEV 1 /* has srandomdev(3) */
# endif
# if OpenBSD >= 200012
# define HASSETUSERCONTEXT 1 /* BSDI-style login classes */
# endif
# endif /* OpenBSD < 199912 */
# endif /* defined(__OpenBSD__) */
#endif /* defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) */
@ -1727,6 +1736,9 @@ typedef int pid_t;
# define _PATH_SENDMAILPID "/etc/sendmail.pid"
# endif /* ! _PATH_SENDMAILPID */
# undef offsetof /* avoid stddefs.h, sys/sysmacros.h conflict */
#if !defined(SM_SET_H_ERRNO) && defined(_REENTRANT)
# define SM_SET_H_ERRNO(err) set_h_errno((err))
#endif /* ! SM_SET_H_ERRNO && _REENTRANT */
#endif /* __svr5__ */
/* ###################################################################### */
@ -2722,6 +2734,10 @@ typedef void (*sigfunc_t) __P((int));
# define FORK fork /* function to call to fork mailer */
#endif /* ! FORK */
/* setting h_errno */
#ifndef SM_SET_H_ERRNO
# define SM_SET_H_ERRNO(err) h_errno = (err)
#endif /* SM_SET_H_ERRNO */
/* random routine -- set above using #ifdef _osname_ or in Makefile */
#if HASRANDOM
@ -2810,7 +2826,6 @@ typedef void (*sigfunc_t) __P((int));
# endif /* !HASSNPRINTF */
#endif /* SFIO */
#ifndef SFIO_STDIO_COMPAT
# define SFIO_STDIO_COMPAT 0
#endif /* ! SFIO_STDIO_COMPAT */

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@ -9,7 +9,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: control.c,v 8.44.14.13 2000/12/28 21:25:52 gshapiro Exp $";
static char id[] = "@(#)$Id: control.c,v 8.44.14.15 2001/01/22 19:00:22 gshapiro Exp $";
#endif /* ! lint */
#include <sendmail.h>

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -16,9 +16,9 @@
#ifndef lint
# ifdef DAEMON
static char id[] = "@(#)$Id: daemon.c,v 8.401.4.41 2000/12/28 23:46:43 gshapiro Exp $ (with daemon mode)";
static char id[] = "@(#)$Id: daemon.c,v 8.401.4.51 2001/02/23 18:57:27 geir Exp $ (with daemon mode)";
# else /* DAEMON */
static char id[] = "@(#)$Id: daemon.c,v 8.401.4.41 2000/12/28 23:46:43 gshapiro Exp $ (without daemon mode)";
static char id[] = "@(#)$Id: daemon.c,v 8.401.4.51 2001/02/23 18:57:27 geir Exp $ (without daemon mode)";
# endif /* DAEMON */
#endif /* ! lint */
@ -461,9 +461,29 @@ getrequests(e)
FD_ISSET(Daemons[idx].d_socket, &readfds))
{
lotherend = Daemons[idx].d_socksize;
memset(&RealHostAddr, '\0',
sizeof RealHostAddr);
t = accept(Daemons[idx].d_socket,
(struct sockaddr *)&RealHostAddr,
&lotherend);
/*
** If remote side closes before
** accept() finishes, sockaddr
** might not be fully filled in.
*/
if (t >= 0 &&
(lotherend == 0 ||
# ifdef BSD4_4_SOCKADDR
RealHostAddr.sa.sa_len == 0 ||
# endif /* BSD4_4_SOCKADDR */
RealHostAddr.sa.sa_family != Daemons[idx].d_addr.sa.sa_family))
{
(void) close(t);
t = -1;
errno = EINVAL;
}
olddaemon = curdaemon = idx;
break;
}
@ -477,10 +497,30 @@ getrequests(e)
struct sockaddr_un sa_un;
lotherend = sizeof sa_un;
memset(&sa_un, '\0', sizeof sa_un);
t = accept(ControlSocket,
(struct sockaddr *)&sa_un,
&lotherend);
control = TRUE;
/*
** If remote side closes before
** accept() finishes, sockaddr
** might not be fully filled in.
*/
if (t >= 0 &&
(lotherend == 0 ||
# ifdef BSD4_4_SOCKADDR
sa_un.sun_len == 0 ||
# endif /* BSD4_4_SOCKADDR */
sa_un.sun_family != AF_UNIX))
{
(void) close(t);
t = -1;
errno = EINVAL;
}
if (t >= 0)
control = TRUE;
}
# else /* NETUNIX */
if (curdaemon == -1)
@ -1614,7 +1654,8 @@ makeconnection(host, port, mci, e)
/* Set up the address for outgoing connection. */
if (bitnset(D_BINDIF, d_flags) &&
(p = macvalue(macid("{if_addr}", NULL), e)) != NULL)
(p = macvalue(macid("{if_addr}", NULL), e)) != NULL &&
*p != '\0')
{
# if NETINET6
char p6[INET6_ADDRSTRLEN];
@ -1628,18 +1669,13 @@ makeconnection(host, port, mci, e)
{
# if NETINET
case AF_INET:
if ((clt_addr.sin.sin_addr.s_addr = inet_addr(p))
!= INADDR_NONE)
clt_addr.sin.sin_addr.s_addr = inet_addr(p);
if (clt_addr.sin.sin_addr.s_addr != INADDR_NONE &&
clt_addr.sin.sin_addr.s_addr != INADDR_LOOPBACK)
{
clt_bind = TRUE;
socksize = sizeof (struct sockaddr_in);
}
else if (clt_addr.sin.sin_port != 0)
{
clt_addr.sin.sin_addr.s_addr = INADDR_ANY;
clt_bind = TRUE;
socksize = sizeof (struct sockaddr_in);
}
break;
# endif /* NETINET */
@ -1650,18 +1686,12 @@ makeconnection(host, port, mci, e)
else
strlcpy(p6, p, sizeof p6);
if (inet_pton(AF_INET6, p6,
&clt_addr.sin6.sin6_addr) == 1)
&clt_addr.sin6.sin6_addr) == 1 &&
!IN6_IS_ADDR_LOOPBACK(&clt_addr.sin6.sin6_addr))
{
clt_bind = TRUE;
socksize = sizeof (struct sockaddr_in6);
}
else if (clt_addr.sin6.sin6_port != 0)
{
if (IN6_IS_ADDR_UNSPECIFIED(&clt_addr.sin6.sin6_addr))
clt_addr.sin6.sin6_addr = in6addr_any;
clt_bind = TRUE;
socksize = sizeof (struct sockaddr_in6);
}
break;
# endif /* NETINET6 */
@ -1721,7 +1751,7 @@ makeconnection(host, port, mci, e)
*/
# if NAMED_BIND
h_errno = 0;
SM_SET_H_ERRNO(0);
# endif /* NAMED_BIND */
errno = 0;
memset(&CurHostAddr, '\0', sizeof CurHostAddr);
@ -2396,10 +2426,8 @@ myhostname(hostbuf, size)
{
register struct hostent *hp;
if (gethostname(hostbuf, size) < 0)
{
if (gethostname(hostbuf, size) < 0 || hostbuf[0] == '\0')
(void) strlcpy(hostbuf, "localhost", size);
}
hp = sm_gethostbyname(hostbuf, InetMode);
if (hp == NULL)
return NULL;
@ -3045,7 +3073,7 @@ host_map_lookup(map, name, av, statp)
: s->s_namecanon.nc_cname);
errno = s->s_namecanon.nc_errno;
# if NAMED_BIND
h_errno = s->s_namecanon.nc_herrno;
SM_SET_H_ERRNO(s->s_namecanon.nc_herrno);
# endif /* NAMED_BIND */
*statp = s->s_namecanon.nc_stat;
if (*statp == EX_TEMPFAIL)
@ -3221,6 +3249,8 @@ myhostname(hostbuf, size)
fixcrlf(hostbuf, TRUE);
(void) fclose(f);
}
if (hostbuf[0] == '\0')
(void) strlcpy(hostbuf, "localhost", size);
return NULL;
}
/*

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -12,7 +12,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: deliver.c,v 8.600.2.1.2.56 2000/12/19 01:16:12 gshapiro Exp $";
static char id[] = "@(#)$Id: deliver.c,v 8.600.2.1.2.66 2001/02/25 23:30:35 gshapiro Exp $";
#endif /* ! lint */
#include <sendmail.h>
@ -1132,7 +1132,7 @@ deliver(e, firstto)
if (*mvp == NULL)
{
/* running SMTP */
/* running LMTP or SMTP */
#if SMTP
clever = TRUE;
*pvp = NULL;
@ -1142,6 +1142,14 @@ deliver(e, firstto)
return EX_SOFTWARE;
#endif /* SMTP */
}
else if (bitnset(M_LMTP, m->m_flags))
{
/* not running LMTP */
sm_syslog(LOG_ERR, NULL,
"Warning: mailer %s: LMTP flag (F=z) turned off",
m->m_name);
clrbitn(M_LMTP, m->m_flags);
}
/*
** At this point *mvp points to the argument with $u. We
@ -1235,7 +1243,7 @@ deliver(e, firstto)
continue;
}
#if NAMED_BIND
h_errno = 0;
SM_SET_H_ERRNO(0);
#endif /* NAMED_BIND */
ovr = TRUE;
@ -1498,7 +1506,7 @@ deliver(e, firstto)
}
errno = 0;
#if NAMED_BIND
h_errno = 0;
SM_SET_H_ERRNO(0);
#endif /* NAMED_BIND */
CurHostName = NULL;
@ -2267,7 +2275,7 @@ deliver(e, firstto)
!DONE_STARTTLS(mci->mci_flags))
{
int olderrors;
bool hasdot;
int dotpos;
bool usetls;
bool saveQuickAbort = QuickAbort;
bool saveSuprErrs = SuprErrs;
@ -2275,6 +2283,7 @@ deliver(e, firstto)
# if _FFR_TLS_CLT1
char *p;
# endif /* _FFR_TLS_CLT1 */
char *srvname;
extern SOCKADDR CurHostAddr;
rcode = EX_OK;
@ -2296,11 +2305,25 @@ deliver(e, firstto)
}
# endif /* _FFR_TLS_CLT1 */
hasdot = CurHostName[strlen(CurHostName) - 1] == '.';
if (hasdot)
CurHostName[strlen(CurHostName) - 1] = '\0';
if (mci->mci_host != NULL)
{
srvname = mci->mci_host;
dotpos = strlen(srvname) - 1;
if (dotpos >= 0)
{
if (srvname[dotpos] == '.')
srvname[dotpos] = '\0';
else
dotpos = -1;
}
}
else
{
srvname = "";
dotpos = -1;
}
define(macid("{server_name}", NULL),
newstr(CurHostName), e);
newstr(srvname), e);
if (CurHostAddr.sa.sa_family != 0)
define(macid("{server_addr}", NULL),
newstr(anynet_ntoa(&CurHostAddr)), e);
@ -2314,7 +2337,7 @@ deliver(e, firstto)
olderrors = Errors;
QuickAbort = FALSE;
SuprErrs = TRUE;
if (rscheck("try_tls", CurHostName, NULL,
if (rscheck("try_tls", srvname, NULL,
e, TRUE, FALSE, 8, host) != EX_OK
|| Errors > olderrors)
usetls = FALSE;
@ -2323,9 +2346,9 @@ deliver(e, firstto)
# endif /* _FFR_TLS_O_T */
}
/* undo change of CurHostName */
if (hasdot)
CurHostName[strlen(CurHostName)] = '.';
/* undo change of srvname */
if (dotpos >= 0)
srvname[dotpos] = '.';
if (usetls)
{
if ((rcode = starttls(m, mci, e)) == EX_OK)
@ -2562,7 +2585,7 @@ deliver(e, firstto)
rcode = mci->mci_exitstat;
errno = mci->mci_errno;
#if NAMED_BIND
h_errno = mci->mci_herrno;
SM_SET_H_ERRNO(mci->mci_herrno);
#endif /* NAMED_BIND */
if (rcode == EX_OK)
{
@ -2593,6 +2616,18 @@ deliver(e, firstto)
/* get the exit status */
rcode = endmailer(mci, e, pv);
if (rcode == EX_TEMPFAIL &&
SmtpError[0] == '\0')
{
/*
** Need an e_message for mailq display.
** We set SmtpError as
*/
snprintf(SmtpError, sizeof SmtpError,
"%s mailer (%s) exited with EX_TEMPFAIL",
m->m_name, m->m_mailer);
}
}
else
#if SMTP
@ -3345,7 +3380,7 @@ giveresponse(status, dsn, m, mci, ctladdr, xstart, e)
}
errno = 0;
#if NAMED_BIND
h_errno = 0;
SM_SET_H_ERRNO(0);
#endif /* NAMED_BIND */
}
/*
@ -5228,6 +5263,8 @@ endtls(ssl, side)
SSL *ssl;
char *side;
{
int ret = EX_OK;
if (ssl != NULL)
{
int r;
@ -5238,7 +5275,7 @@ endtls(ssl, side)
sm_syslog(LOG_WARNING, NOQID,
"SSL_shutdown %s failed: %d",
side, r);
return EX_SOFTWARE;
ret = EX_SOFTWARE;
}
else if (r == 0)
{
@ -5246,12 +5283,12 @@ endtls(ssl, side)
sm_syslog(LOG_WARNING, NOQID,
"SSL_shutdown %s not done",
side);
return EX_SOFTWARE;
ret = EX_SOFTWARE;
}
SSL_free(ssl);
ssl = NULL;
}
return EX_OK;
return ret;
}
# endif /* STARTTLS */
#endif /* SMTP */

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1986, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -15,9 +15,9 @@
#ifndef lint
# if NAMED_BIND
static char id[] = "@(#)$Id: domain.c,v 8.114.6.1.2.6 2000/12/19 02:50:33 gshapiro Exp $ (with name server)";
static char id[] = "@(#)$Id: domain.c,v 8.114.6.1.2.8 2001/02/12 21:40:19 gshapiro Exp $ (with name server)";
# else /* NAMED_BIND */
static char id[] = "@(#)$Id: domain.c,v 8.114.6.1.2.6 2000/12/19 02:50:33 gshapiro Exp $ (without name server)";
static char id[] = "@(#)$Id: domain.c,v 8.114.6.1.2.8 2001/02/12 21:40:19 gshapiro Exp $ (without name server)";
# endif /* NAMED_BIND */
#endif /* ! lint */
@ -356,7 +356,7 @@ getmxrr(host, mxhosts, mxprefs, droplocalhost, rcode)
if (TryNullMXList)
{
h_errno = 0;
SM_SET_H_ERRNO(0);
errno = 0;
h = sm_gethostbyname(host, AF_INET);
if (h == NULL)
@ -370,7 +370,7 @@ getmxrr(host, mxhosts, mxprefs, droplocalhost, rcode)
return -1;
}
# if NETINET6
h_errno = 0;
SM_SET_H_ERRNO(0);
errno = 0;
h = sm_gethostbyname(host, AF_INET6);
if (h == NULL &&
@ -752,7 +752,7 @@ dns_getcanonname(host, hbsize, trymx, statp)
** broken.
*/
h_errno = TRY_AGAIN;
SM_SET_H_ERRNO(TRY_AGAIN);
*statp = EX_TEMPFAIL;
/*
@ -769,18 +769,22 @@ dns_getcanonname(host, hbsize, trymx, statp)
*/
#if _FFR_WORKAROUND_BROKEN_NAMESERVERS
/*
** Only return if not TRY_AGAIN as an
** attempt with a different qtype may
** succeed (res_querydomain() calls
** res_query() calls res_send() which
** sets errno to ETIMEDOUT if the
** nameservers could be contacted but
** didn't give an answer).
*/
if (WorkAroundBrokenAAAA)
{
/*
** Only return if not TRY_AGAIN as an
** attempt with a different qtype may
** succeed (res_querydomain() calls
** res_query() calls res_send() which
** sets errno to ETIMEDOUT if the
** nameservers could be contacted but
** didn't give an answer).
*/
if (qtype != T_ANY && errno != ETIMEDOUT)
return FALSE;
if (qtype != T_ANY &&
errno != ETIMEDOUT)
return FALSE;
}
#else /* _FFR_WORKAROUND_BROKEN_NAMESERVERS */
if (qtype != T_ANY)
return FALSE;
@ -931,7 +935,7 @@ dns_getcanonname(host, hbsize, trymx, statp)
host);
CurEnv->e_message = newstr(ebuf);
}
h_errno = NO_RECOVERY;
SM_SET_H_ERRNO(NO_RECOVERY);
*statp = EX_CONFIG;
return FALSE;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -12,7 +12,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: headers.c,v 8.203.4.10 2000/10/13 17:54:30 gshapiro Exp $";
static char id[] = "@(#)$Id: headers.c,v 8.203.4.12 2001/01/22 19:00:22 gshapiro Exp $";
#endif /* ! lint */
#include <sendmail.h>
@ -308,7 +308,7 @@ chompheader(line, pflag, hdrp, e)
dp = qval;
l = 0;
dp[l++] = '"';
for (sp = fvalue; *sp != '\0' && l < MAXNAME - 2; sp++)
for (sp = fvalue; *sp != '\0' && l < MAXNAME - 3; sp++)
{
switch(*sp)
{
@ -337,7 +337,7 @@ chompheader(line, pflag, hdrp, e)
if (LogLevel > 9)
sm_syslog(LOG_WARNING, e->e_id,
"Warning: truncated header '%s' before check with '%s' len=%d max=%d",
fname, rs, l, MAXNAME);
fname, rs, l, MAXNAME - 1);
}
if ((sp = macvalue(macid("{currHeader}", NULL), e)) !=
NULL)

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -12,7 +12,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: macro.c,v 8.40.16.7 2000/10/09 15:49:06 gshapiro Exp $";
static char id[] = "@(#)$Id: macro.c,v 8.40.16.9 2001/02/22 01:16:55 gshapiro Exp $";
#endif /* ! lint */
#include <sendmail.h>
@ -295,6 +295,8 @@ macvalue(n, e)
if (p != NULL)
return p;
if (e == e->e_parent)
break;
e = e->e_parent;
}
return NULL;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -13,7 +13,7 @@
#ifndef lint
static char copyright[] =
"@(#) Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.\n\
"@(#) Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.\n\
All rights reserved.\n\
Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.\n\
Copyright (c) 1988, 1993\n\
@ -21,7 +21,7 @@ static char copyright[] =
#endif /* ! lint */
#ifndef lint
static char id[] = "@(#)$Id: main.c,v 8.485.4.38 2000/12/19 02:50:33 gshapiro Exp $";
static char id[] = "@(#)$Id: main.c,v 8.485.4.44 2001/02/08 14:06:55 ca Exp $";
#endif /* ! lint */
#define _DEFINE
@ -1062,7 +1062,8 @@ main(argc, argv, envp)
/* set up the $=m class now, after .cf has a chance to redefine $m */
expand("\201m", jbuf, sizeof jbuf, CurEnv);
setclass('m', jbuf);
if (jbuf[0] != '\0')
setclass('m', jbuf);
/* probe interfaces and locate any additional names */
if (!DontProbeInterfaces)
@ -1231,8 +1232,10 @@ main(argc, argv, envp)
/* full names can't have newlines */
if (strchr(FullName, '\n') != NULL)
{
FullName = full = newstr(denlstring(FullName, TRUE, TRUE));
full = newstr(denlstring(FullName, TRUE, TRUE));
FullName = full;
}
/* check for characters that may have to be quoted */
if (!rfc822_string(FullName))
{
@ -1241,6 +1244,7 @@ main(argc, argv, envp)
** as a comment so crackaddr() doesn't destroy
** the name portion of the address.
*/
FullName = addquotes(FullName);
if (full != NULL)
free(full);
@ -1295,10 +1299,13 @@ main(argc, argv, envp)
/* our name for SMTP codes */
expand("\201j", jbuf, sizeof jbuf, CurEnv);
MyHostName = jbuf;
if (strchr(jbuf, '.') == NULL)
if (jbuf[0] == '\0')
MyHostName = newstr("localhost");
else
MyHostName = jbuf;
if (strchr(MyHostName, '.') == NULL)
message("WARNING: local host name (%s) is not qualified; fix $j in config file",
jbuf);
MyHostName);
/* make certain that this name is part of the $=w class */
setclass('w', MyHostName);
@ -1855,7 +1862,7 @@ main(argc, argv, envp)
}
else
p = newstr(fv);
CurEnv->e_auth_param = newstr(xtextify(p, NULL));
CurEnv->e_auth_param = newstr(xtextify(p, "="));
}
}
if (macvalue('s', CurEnv) == NULL)
@ -1866,6 +1873,7 @@ main(argc, argv, envp)
CurEnv->e_to = NULL;
CurEnv->e_flags |= EF_GLOBALERRS;
HoldErrs = FALSE;
SuperSafe = FALSE;
usrerr("Recipient names must be specified");
/* collect body for UUCP return */

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1992, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1992, 1993
@ -12,7 +12,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: map.c,v 8.414.4.34 2000/12/18 18:00:43 ca Exp $";
static char id[] = "@(#)$Id: map.c,v 8.414.4.39 2001/02/22 18:56:22 gshapiro Exp $";
#endif /* ! lint */
#include <sendmail.h>
@ -52,7 +52,7 @@ static bool db_map_open __P((MAP *, int, char *, DBTYPE, DB_INFO *));
static bool db_map_open __P((MAP *, int, char *, DBTYPE, void **));
# endif /* DB_VERSION_MAJOR > 2 */
#endif /* NEWDB */
static bool extract_canonname __P((char *, char *, char[], int));
static bool extract_canonname __P((char *, char *, char *, char[], int));
#ifdef LDAPMAP
static void ldapmap_clear __P((LDAPMAP_STRUCT *));
static STAB *ldapmap_findconn __P((LDAPMAP_STRUCT *));
@ -767,11 +767,10 @@ getcanonname(host, hbsize, trymx)
#if NAMED_BIND
if (got_tempfail)
h_errno = TRY_AGAIN;
SM_SET_H_ERRNO(TRY_AGAIN);
else
h_errno = HOST_NOT_FOUND;
SM_SET_H_ERRNO(HOST_NOT_FOUND);
#endif /* NAMED_BIND */
return FALSE;
}
/*
@ -779,6 +778,7 @@ getcanonname(host, hbsize, trymx)
**
** Parameters:
** name -- the name against which to match.
** dot -- where to reinsert '.' to get FQDN
** line -- the /etc/hosts line.
** cbuf -- the location to store the result.
** cbuflen -- the size of cbuf.
@ -789,8 +789,9 @@ getcanonname(host, hbsize, trymx)
*/
static bool
extract_canonname(name, line, cbuf, cbuflen)
extract_canonname(name, dot, line, cbuf, cbuflen)
char *name;
char *dot;
char *line;
char cbuf[];
int cbuflen;
@ -819,6 +820,14 @@ extract_canonname(name, line, cbuf, cbuflen)
}
if (strcasecmp(name, p) == 0)
found = TRUE;
else if (dot != NULL)
{
/* try looking for the FQDN as well */
*dot = '.';
if (strcasecmp(name, p) == 0)
found = TRUE;
*dot = '\0';
}
}
if (found && strchr(cbuf, '.') == NULL)
{
@ -1623,6 +1632,10 @@ db_map_open(map, mode, mapclassname, dbtype, openinfo)
ret = db->open(db, buf, NULL, dbtype, flags, DBMMODE);
if (ret != 0)
{
#ifdef DB_OLD_VERSION
if (ret == DB_OLD_VERSION)
ret = EINVAL;
#endif /* DB_OLD_VERSION */
(void) db->close(db, 0);
db = NULL;
}
@ -2258,7 +2271,7 @@ nis_getcanonname(name, hbsize, statp)
*statp = EX_UNAVAILABLE;
return FALSE;
}
shorten_hostname(nbuf);
(void) shorten_hostname(nbuf);
keylen = strlen(nbuf);
if (yp_domain == NULL)
@ -2302,13 +2315,13 @@ nis_getcanonname(name, hbsize, statp)
free(vp);
if (tTd(38, 44))
dprintf("got record `%s'\n", host_record);
if (!extract_canonname(nbuf, host_record, cbuf, sizeof cbuf))
if (!extract_canonname(nbuf, NULL, host_record, cbuf, sizeof cbuf))
{
/* this should not happen, but.... */
*statp = EX_NOHOST;
return FALSE;
}
if (hbsize < strlen(cbuf))
if (hbsize <= strlen(cbuf))
{
*statp = EX_UNAVAILABLE;
return FALSE;
@ -2639,7 +2652,7 @@ nisplus_getcanonname(name, hbsize, statp)
return FALSE;
}
(void) strlcpy(nbuf, name, sizeof nbuf);
shorten_hostname(nbuf);
(void) shorten_hostname(nbuf);
p = strchr(nbuf, '.');
if (p == NULL)
@ -3937,7 +3950,7 @@ ldapmap_parseargs(map, args)
if ((ptr = strchr(p, ' ')) != NULL)
*ptr = '\0';
syserr("Deref must be [never|always|search|find] not %s in map %s",
syserr("Deref must be [never|always|search|find] (not %s) in map %s",
p, map->map_mname);
if (ptr != NULL)
*ptr = ' ';
@ -3972,7 +3985,7 @@ ldapmap_parseargs(map, args)
if ((ptr = strchr(p, ' ')) != NULL)
*ptr = '\0';
syserr("Scope must be [base|one|sub] not %s in map %s",
syserr("Scope must be [base|one|sub] (not %s) in map %s",
p, map->map_mname);
if (ptr != NULL)
*ptr = ' ';
@ -4044,7 +4057,7 @@ ldapmap_parseargs(map, args)
if ((ptr = strchr(p, ' ')) != NULL)
*ptr = '\0';
syserr("Method for binding must be [none|simple|krbv4] not %s in map %s",
syserr("Method for binding must be [none|simple|krbv4] (not %s) in map %s",
p, map->map_mname);
if (ptr != NULL)
*ptr = ' ';
@ -4312,6 +4325,7 @@ void
ldapmap_set_defaults(spec)
char *spec;
{
STAB *class;
MAP map;
/* Allocate and set the default values */
@ -4320,7 +4334,17 @@ ldapmap_set_defaults(spec)
ldapmap_clear(LDAPDefaults);
memset(&map, '\0', sizeof map);
/* look up the class */
class = stab("ldap", ST_MAPCLASS, ST_FIND);
if (class == NULL)
{
syserr("readcf: LDAPDefaultSpec: class ldap not available");
return;
}
map.map_class = &class->s_mapclass;
map.map_db1 = (ARBPTR_T) LDAPDefaults;
map.map_mname = "O LDAPDefaultSpec";
(void) ldapmap_parseargs(&map, spec);
@ -5412,7 +5436,7 @@ ni_getcanonname(name, hbsize, statp)
*statp = EX_UNAVAILABLE;
return FALSE;
}
shorten_hostname(nbuf);
(void) shorten_hostname(nbuf);
/* we only accept single token search key */
if (strchr(nbuf, '.'))
@ -5832,6 +5856,7 @@ text_getcanonname(name, hbsize, statp)
int *statp;
{
bool found;
char *dot;
FILE *f;
char linebuf[MAXLINE];
char cbuf[MAXNAME + 1];
@ -5846,7 +5871,7 @@ text_getcanonname(name, hbsize, statp)
return FALSE;
}
(void) strlcpy(nbuf, name, sizeof nbuf);
shorten_hostname(nbuf);
dot = shorten_hostname(nbuf);
f = fopen(HostsFile, "r");
if (f == NULL)
@ -5862,7 +5887,8 @@ text_getcanonname(name, hbsize, statp)
if (p != NULL)
*p = '\0';
if (linebuf[0] != '\0')
found = extract_canonname(nbuf, linebuf, cbuf, sizeof cbuf);
found = extract_canonname(nbuf, dot, linebuf,
cbuf, sizeof cbuf);
}
(void) fclose(f);
if (!found)

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@ -9,7 +9,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: milter.c,v 8.50.4.41 2000/12/27 21:35:32 gshapiro Exp $";
static char id[] = "@(#)$Id: milter.c,v 8.50.4.44 2001/01/23 19:43:57 gshapiro Exp $";
#endif /* ! lint */
#if _FFR_MILTER
@ -261,7 +261,7 @@ milter_sysread(m, buf, sz, to, e)
}
curl += len;
if (len == 0 || len >= sz)
if (len == 0 || curl >= sz)
break;
}
@ -1810,7 +1810,11 @@ milter_send_command(m, command, data, sz, e, state)
case SMFIR_ACCEPT:
/* this filter is done with message/connection */
m->mf_state = SMFS_DONE;
if (command == SMFIC_HELO ||
command == SMFIC_CONNECT)
m->mf_state = SMFS_CLOSABLE;
else
m->mf_state = SMFS_DONE;
break;
case SMFIR_CONTINUE:
@ -2092,7 +2096,7 @@ milter_per_connection_check(e)
{
struct milter *m = InputFilters[i];
if (m->mf_state == SMFS_DONE)
if (m->mf_state == SMFS_CLOSABLE)
milter_quit_filter(m, e);
}
}
@ -2936,11 +2940,31 @@ milter_helo(helo, e, state)
ENVELOPE *e;
char *state;
{
int i;
char *response;
if (tTd(64, 10))
dprintf("milter_helo(%s)\n", helo);
/* HELO/EHLO can come after encryption is negotiated */
for (i = 0; InputFilters[i] != NULL; i++)
{
struct milter *m = InputFilters[i];
switch (m->mf_state)
{
case SMFS_INMSG:
/* abort in message filters */
milter_abort_filter(m, e);
/* FALLTHROUGH */
case SMFS_DONE:
/* reset done filters */
m->mf_state = SMFS_OPEN;
break;
}
}
response = milter_command(SMFIC_HELO, helo, strlen(helo) + 1,
MilterHeloMacros, e, state);
milter_per_connection_check(e);

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -12,7 +12,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: parseaddr.c,v 8.234.4.9 2000/10/09 03:14:48 gshapiro Exp $";
static char id[] = "@(#)$Id: parseaddr.c,v 8.234.4.11 2001/02/14 04:07:27 gshapiro Exp $";
#endif /* ! lint */
#include <sendmail.h>
@ -2727,7 +2727,11 @@ rscheck(rwset, p1, p2, e, rmcomm, cnt, logl, host)
MapOpenErr = FALSE;
(void) rewrite(pvp, rsno, 0, e);
if (MapOpenErr)
usrerrenh("4.3.0", "451 Temporary failure");
{
usrerrenh("4.3.0", "451 Temporary failure");
rstat = EX_TEMPFAIL;
goto finis;
}
if (pvp[0] == NULL || (pvp[0][0] & 0377) != CANONNET ||
pvp[1] == NULL || (strcmp(pvp[1], "error") != 0 &&

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -16,9 +16,9 @@
#ifndef lint
# if QUEUE
static char id[] = "@(#)$Id: queue.c,v 8.343.4.38 2000/12/08 14:33:02 ca Exp $ (with queueing)";
static char id[] = "@(#)$Id: queue.c,v 8.343.4.44 2001/02/22 00:55:35 ca Exp $ (with queueing)";
# else /* QUEUE */
static char id[] = "@(#)$Id: queue.c,v 8.343.4.38 2000/12/08 14:33:02 ca Exp $ (without queueing)";
static char id[] = "@(#)$Id: queue.c,v 8.343.4.44 2001/02/22 00:55:35 ca Exp $ (without queueing)";
# endif /* QUEUE */
#endif /* ! lint */
@ -835,6 +835,7 @@ run_single_queue(queuedir, forkflag, verbose)
CurEnv = &QueueEnvelope;
e = newenvelope(&QueueEnvelope, CurEnv);
e->e_flags = BlankEnvelope.e_flags;
e->e_parent = NULL;
/* make sure we have disconnected from parent */
if (forkflag)
@ -1558,7 +1559,7 @@ workcmpf1(a, b)
return b->w_lock - a->w_lock;
/* job priority */
return a->w_pri - b->w_pri;
return workcmpf0(a, b);
}
/*
** WORKCMPF2 -- second compare function for ordering work based on host name.
@ -1599,7 +1600,7 @@ workcmpf2(a, b)
return i;
/* job priority */
return a->w_pri - b->w_pri;
return workcmpf0(a, b);
}
/*
** WORKCMPF3 -- simple submission-time-only compare function.

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -12,7 +12,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: readcf.c,v 8.382.4.31 2000/12/18 18:00:43 ca Exp $";
static char id[] = "@(#)$Id: readcf.c,v 8.382.4.38 2001/02/17 00:05:12 geir Exp $";
#endif /* ! lint */
#include <sendmail.h>
@ -844,6 +844,8 @@ fileclass(class, filename, fmt, safe, optional)
** T -- the mailer type (for DSNs)
** U -- the uid to run as
** W -- the time to wait at the end
** m -- maximum messages per connection
** / -- new root directory
** The first word is the canonical name of the mailer.
**
** Returns:
@ -2059,7 +2061,9 @@ setoption(opt, val, safe, sticky, e)
if (val[0] == '\0')
HelpFile = "helpfile";
else
{
HelpFile = newstr(val);
}
break;
case 'h': /* maximum hop count */
@ -2094,6 +2098,13 @@ setoption(opt, val, safe, sticky, e)
HasWildcardMX = !clearmode;
continue;
}
#if _FFR_WORKAROUND_BROKEN_NAMESERVERS
if (sm_strcasecmp(q, "WorkAroundBrokenAAAA") == 0)
{
WorkAroundBrokenAAAA = !clearmode;
continue;
}
#endif /* _FFR_WORKAROUND_BROKEN_NAMESERVERS */
for (rfp = ResolverFlags; rfp->rf_name != NULL; rfp++)
{
if (strcasecmp(q, rfp->rf_name) == 0)
@ -2248,7 +2259,9 @@ setoption(opt, val, safe, sticky, e)
if (val[0] == '\0')
StatFile = "statistics";
else
{
StatFile = newstr(val);
}
break;
case 's': /* be super safe, even if expensive */
@ -2549,7 +2562,9 @@ setoption(opt, val, safe, sticky, e)
case O_HSDIR: /* persistent host status directory */
if (val[0] != '\0')
{
HostStatDir = newstr(val);
}
break;
case O_SINGTHREAD: /* single thread deliveries (requires hsdir) */

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -12,7 +12,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: recipient.c,v 8.231.14.8 2000/09/14 23:32:27 gshapiro Exp $";
static char id[] = "@(#)$Id: recipient.c,v 8.231.14.10 2001/02/14 04:07:30 gshapiro Exp $";
#endif /* ! lint */
#include <sendmail.h>

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -12,7 +12,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: savemail.c,v 8.212.4.11 2000/12/18 18:00:44 ca Exp $";
static char id[] = "@(#)$Id: savemail.c,v 8.212.4.12 2001/01/07 19:31:05 gshapiro Exp $";
#endif /* ! lint */
#include <sendmail.h>
@ -1015,7 +1015,8 @@ errbody(mci, e, separator)
}
/* Reporting-MTA: is us (required) */
(void) snprintf(buf, sizeof buf, "Reporting-MTA: dns; %.800s", MyHostName);
(void) snprintf(buf, sizeof buf, "Reporting-MTA: dns; %.800s",
MyHostName);
putline(buf, mci);
/* DSN-Gateway: not relevant since we are not translating */

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -20,7 +20,7 @@
#ifdef _DEFINE
# define EXTERN
# ifndef lint
static char SmailId[] = "@(#)$Id: sendmail.h,v 8.517.4.45 2000/12/28 23:46:44 gshapiro Exp $";
static char SmailId[] = "@(#)$Id: sendmail.h,v 8.517.4.50 2001/02/22 18:56:24 gshapiro Exp $";
# endif /* ! lint */
#else /* _DEFINE */
# define EXTERN extern
@ -152,6 +152,9 @@ static char SmailId[] = "@(#)$Id: sendmail.h,v 8.517.4.45 2000/12/28 23:46:44 gs
#ifndef INT32SZ
# define INT32SZ 4 /* size of a 32 bit integer in bytes */
#endif /* ! INT32SZ */
#ifndef INADDR_LOOPBACK
# define INADDR_LOOPBACK 0x7f000001 /* loopback address */
#endif /* ! INADDR_LOOPBACK */
/*
** Error return from inet_addr(3), in case not defined in /usr/include.
@ -1377,6 +1380,7 @@ struct milter
# define SMFS_OPEN 'O' /* connected to remote milter filter */
# define SMFS_INMSG 'M' /* currently servicing a message */
# define SMFS_DONE 'D' /* done with current message */
# define SMFS_CLOSABLE 'Q' /* done with current connection */
# define SMFS_ERROR 'E' /* error state */
# define SMFS_READY 'R' /* ready for action */
@ -1692,6 +1696,9 @@ EXTERN bool SingleThreadDelivery; /* single thread hosts on delivery */
EXTERN bool SuperSafe; /* be extra careful, even if expensive */
EXTERN bool SuprErrs; /* set if we are suppressing errors */
EXTERN bool TryNullMXList; /* if we are the best MX, try host directly */
#if _FFR_WORKAROUND_BROKEN_NAMESERVERS
EXTERN bool WorkAroundBrokenAAAA; /* some nameservers return SERVFAIL on AAAA queries */
#endif /* _FFR_WORKAROUND_BROKEN_NAMESERVERS */
EXTERN bool UseErrorsTo; /* use Errors-To: header (back compat) */
EXTERN bool UseHesiod; /* using Hesiod -- interpret Hesiod errors */
EXTERN bool UseNameServer; /* using DNS -- interpret h_errno & MX RRs */
@ -2063,7 +2070,7 @@ extern void setuserenv __P((const char *, const char *));
extern void settime __P((ENVELOPE *));
extern char *sfgets __P((char *, int, FILE *, time_t, char *));
extern char *shortenstring __P((const char *, int));
extern void shorten_hostname __P((char []));
extern char *shorten_hostname __P((char []));
extern bool shorten_rfc822_string __P((char *, size_t));
extern SIGFUNC_DECL sigusr1 __P((int));
extern SIGFUNC_DECL sighup __P((int));

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -16,9 +16,9 @@
#ifndef lint
# if SMTP
static char id[] = "@(#)$Id: srvrsmtp.c,v 8.471.2.2.2.66 2000/12/18 18:00:44 ca Exp $ (with SMTP)";
static char id[] = "@(#)$Id: srvrsmtp.c,v 8.471.2.2.2.67 2001/01/07 19:31:05 gshapiro Exp $ (with SMTP)";
# else /* SMTP */
static char id[] = "@(#)$Id: srvrsmtp.c,v 8.471.2.2.2.66 2000/12/18 18:00:44 ca Exp $ (without SMTP)";
static char id[] = "@(#)$Id: srvrsmtp.c,v 8.471.2.2.2.67 2001/01/07 19:31:05 gshapiro Exp $ (without SMTP)";
# endif /* SMTP */
#endif /* ! lint */
@ -1159,7 +1159,7 @@ smtp(nullserver, d_flags, e)
if (gothello)
{
usrerr("503 %s Duplicate HELO/EHLO",
MyHostName);
MyHostName);
break;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -12,7 +12,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: stats.c,v 8.36.14.3 2000/09/17 17:04:27 gshapiro Exp $";
static char id[] = "@(#)$Id: stats.c,v 8.36.14.5 2001/02/14 04:07:30 gshapiro Exp $";
#endif /* ! lint */
#include <sendmail.h>

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-1999, 2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -15,9 +15,9 @@
#ifndef lint
# if USERDB
static char id[] = "@(#)$Id: udb.c,v 8.111 1999/11/16 02:04:04 gshapiro Exp $ (with USERDB)";
static char id[] = "@(#)$Id: udb.c,v 8.111.16.1 2001/01/04 18:18:37 gshapiro Exp $ (with USERDB)";
# else /* USERDB */
static char id[] = "@(#)$Id: udb.c,v 8.111 1999/11/16 02:04:04 gshapiro Exp $ (without USERDB)";
static char id[] = "@(#)$Id: udb.c,v 8.111.16.1 2001/01/04 18:18:37 gshapiro Exp $ (without USERDB)";
# endif /* USERDB */
#endif /* ! lint */
@ -1011,6 +1011,10 @@ _udbx_init(e)
0644);
if (ret != 0)
{
#ifdef DB_OLD_VERSION
if (ret == DB_OLD_VERSION)
ret = EINVAL;
#endif /* DB_OLD_VERSION */
(void) up->udb_dbp->close(up->udb_dbp, 0);
up->udb_dbp = NULL;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -15,9 +15,9 @@
#ifndef lint
# if SMTP
static char id[] = "@(#)$Id: usersmtp.c,v 8.245.4.18 2000/12/20 16:36:11 ca Exp $ (with SMTP)";
static char id[] = "@(#)$Id: usersmtp.c,v 8.245.4.24 2001/02/21 00:59:09 gshapiro Exp $ (with SMTP)";
# else /* SMTP */
static char id[] = "@(#)$Id: usersmtp.c,v 8.245.4.18 2000/12/20 16:36:11 ca Exp $ (without SMTP)";
static char id[] = "@(#)$Id: usersmtp.c,v 8.245.4.24 2001/02/21 00:59:09 gshapiro Exp $ (without SMTP)";
# endif /* SMTP */
#endif /* ! lint */
@ -844,6 +844,7 @@ safesaslfile(context, file)
if (file == NULL || *file == '\0')
return SASL_OK;
sff = SFF_SAFEDIRPATH|SFF_NOWLINK|SFF_NOGWFILES|SFF_NOWWFILES|SFF_ROOTOK;
if ((p = strrchr(file, '/')) == NULL)
p = file;
@ -873,12 +874,13 @@ safesaslfile(context, file)
}
# endif /* SASL <= 10515 */
if ((r = safefile(file, RunAsUid, RunAsGid, RunAsUserName, sff,
p = file;
if ((r = safefile(p, RunAsUid, RunAsGid, RunAsUserName, sff,
S_IRUSR, NULL)) == 0)
return SASL_OK;
if (LogLevel >= 11 || (r != ENOENT && LogLevel >= 9))
sm_syslog(LOG_WARNING, NOQID, "error: safesasl(%s) failed: %s",
file, errstring(r));
p, errstring(r));
return SASL_CONTINUE;
}
@ -1528,7 +1530,7 @@ smtpmailfrom(m, mci, e)
else
{
smtpmessage("MAIL From:<@%s%c%s>%s", m, mci, MyHostName,
*bufp == '@' ? ',' : ':', bufp, optbuf);
*bufp == '@' ? ',' : ':', bufp, optbuf);
}
SmtpPhase = mci->mci_phase = "client MAIL";
sm_setproctitle(TRUE, e, "%s %s: %s", qid_printname(e),
@ -1943,6 +1945,8 @@ smtpdata(m, mci, e)
else
r = 4;
e->e_statmsg = newstr(&SmtpReplyBuffer[r]);
SmtpPhase = mci->mci_phase = "idle";
sm_setproctitle(TRUE, e, "%s: %s", CurHostName, mci->mci_phase);
if (rstat != EX_PROTOCOL)
return rstat;
if (LogLevel > 1)
@ -2116,6 +2120,17 @@ smtpquit(m, mci, e)
}
/*
** SMTPRSET -- send a RSET (reset) command
**
** Parameters:
** m -- a pointer to the mailer.
** mci -- the mailer connection information.
** e -- the current envelope.
**
** Returns:
** none.
**
** Side Effects:
** closes the connection if there is no reply to RSET.
*/
void
@ -2154,6 +2169,15 @@ smtprset(m, mci, e)
}
/*
** SMTPPROBE -- check the connection state
**
** Parameters:
** mci -- the mailer connection information.
**
** Returns:
** none.
**
** Side Effects:
** closes the connection if there is no reply to RSET.
*/
int

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -12,7 +12,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: util.c,v 8.225.2.1.2.15 2000/10/18 23:46:07 ca Exp $";
static char id[] = "@(#)$Id: util.c,v 8.225.2.1.2.19 2001/02/22 18:56:24 gshapiro Exp $";
#endif /* ! lint */
#include <sendmail.h>
@ -497,7 +497,8 @@ log_sendmail_pid(e)
pidf = safefopen(pidpath, O_WRONLY|O_TRUNC, 0644, sff);
if (pidf == NULL)
{
sm_syslog(LOG_ERR, NOQID, "unable to write %s", pidpath);
sm_syslog(LOG_ERR, NOQID, "unable to write %s: %s",
pidpath, errstring(errno));
}
else
{
@ -1785,10 +1786,10 @@ dumpfd(fd, printclosed, logit)
** host -- the host to shorten (stripped in place).
**
** Returns:
** none.
** place where string was trunacted, NULL if not truncated.
*/
void
char *
shorten_hostname(host)
char host[];
{
@ -1808,7 +1809,7 @@ shorten_hostname(host)
/* see if there is any domain at all -- if not, we are done */
p = strchr(host, '.');
if (p == NULL)
return;
return NULL;
/* yes, we have a domain -- see if it looks like us */
mydom = macvalue('m', CurEnv);
@ -1817,7 +1818,11 @@ shorten_hostname(host)
i = strlen(++p);
if ((canon ? strcasecmp(p, mydom) : strncasecmp(p, mydom, i)) == 0 &&
(mydom[i] == '.' || mydom[i] == '\0'))
{
*--p = '\0';
return p;
}
return NULL;
}
/*
** PROG_OPEN -- open a program for reading

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -12,7 +12,7 @@
*/
#ifndef lint
static char id[] = "@(#)$Id: version.c,v 8.43.4.25 2000/12/29 18:22:18 gshapiro Exp $";
static char id[] = "@(#)$Id: version.c,v 8.43.4.30 2001/02/27 19:22:31 gshapiro Exp $";
#endif /* ! lint */
char Version[] = "8.11.2";
char Version[] = "8.11.3";

View File

@ -13,7 +13,7 @@
#ifndef lint
static char copyright[] =
"@(#) Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.\n\
"@(#) Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers.\n\
All rights reserved.\n\
Copyright (c) 1983, 1987, 1993\n\
The Regents of the University of California. All rights reserved.\n\
@ -21,7 +21,7 @@ static char copyright[] =
#endif /* ! lint */
#ifndef lint
static char id[] = "@(#)$Id: vacation.c,v 8.68.4.15 2000/11/27 22:17:27 ca Exp $";
static char id[] = "@(#)$Id: vacation.c,v 8.68.4.16 2001/02/14 05:02:21 gshapiro Exp $";
#endif /* ! lint */
#include <ctype.h>