This commit was generated by cvs2svn to compensate for changes in r157001,

which included commits to RCS files with non-trunk default branches.
This commit is contained in:
gshapiro 2006-03-22 16:40:03 +00:00
commit 7ec7c93b18
77 changed files with 2016 additions and 940 deletions

View File

@ -88,6 +88,83 @@ y+PVZ1MwnEXfTQReVSla0AAOIRirHEh4YnUVZzFSNEJqoDRZQwVd7Q==
=shxn
-----END PGP PUBLIC KEY BLOCK-----
Type Bits KeyID Created Expires Algorithm Use
pub 1024 0xAF959625 2005-12-31 ---------- RSA Sign & Encrypt
f16 Fingerprint16 = E3 F4 97 BC 9F DF 3F 1D 9B 0D DF D5 77 9A C9 79
uid Sendmail Signing Key/2006 <sendmail@Sendmail.ORG>
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.1 (OpenBSD)
mQCNA0O3FKgAAAEEALUfKjFiXc8T2XS4C8N/jJQkProkzyl7mdN0xVKqokMy9/rx
nbji5dG7WlxyJX3jI9eypZV/d5+KpXljvyC+cBIxhhmsEhVT6AsOkxlg/Y8Gmb5Q
bn2mAiyeaylvcFeHLjBA+CaMByDms97M6FbiSzdXx6JtLP1Tdx57s8ivlZYlAAUR
tDFTZW5kbWFpbCBTaWduaW5nIEtleS8yMDA2IDxzZW5kbWFpbEBTZW5kbWFpbC5P
Ukc+iQCVAwUQQ7cUqB57s8ivlZYlAQEn6gQApe1I5DhI/Y+fwI8hjx7Ydd8LQ553
CoBYnvoqrxybSZtOc3D7LHoKIb01R2hx71O282soxjL6N9SGnGQMcVPINXAcJ0Z0
mTCpUZc+QtItS44R3aqp27q0C8FTt885/pkKT0cQM/9EjWRv3kI+f39gl+MwcA3I
AV4NJmTpi6ASzmmJAJUDBRBDtxYm71iWZNQy4Z0BAbnQA/wIfK6PT+zTefydUovI
G3dDLGGxMowpdG5yQwPwkAEIPFlbLhYsk8E9t8sLsLI1briqKaqxZkHo9ggPNkZU
6Kojwrs7imUZj4AMVL7HDqOlb+jHeYsg3yq/KzKIy3i1fmyUYA/cddSJOp3a0zjy
IISZ9VPR6/KaOj8cLKTQqZG6tYkAlQMFEEO3FjvBnB0lEtNGHQEBJWgD/RkJuAVQ
LL0cEe/VBUi4CmW3iGF+mAokJZn750ibVQg25SjDUc0UScxyvSnl8ehu3fjWmsEu
ckHbzBWkMx/cnCb7xG5Ve1HGgzsBjFpvcQUM07y4JCFOfTOl3WiYP311EKBp2tnL
2i/kdD1IVITswAEQ7XId1NBIuf4P71v16rj/iQCVAwUQQ7cWRL3aj9Y/6n39AQGO
uAQApQ5v6HZkgFNKT+SaXJOsqtk+xQQd19QfQQ2U13uaJ0nQ0i4O11WUTM9qfdWF
utTlDTZKeEdz+Zb67KnuIi8PHyMpBPV1BGvWNqeiEN0Q5TmkxmaXBXTWtGeHoWw4
Jxaic4LdunSNDIpE0A9zfeaj9YJGX87I3KMf1DQ3h+FCRRWJAJUDBRBDtxZZfEtn
baAOFWMBAVi/A/0bQQvU747R5bMC0vQLRMVOtq6rDwNPlXoFhzW26AU2Pb+mKCkU
ugVqjFaAWm2ILxKvkjgDyfw6b62IvEK4rHJbfwH/FeIfi6e0+ye+TpXcCzXkARTm
FHld0IERIXpaUA6XarNlWfiqaZN0YLpCQH0M29kTFvIfyoUHn9LgvBLe1YkAlQMF
EEO3Fl9vUpPYo5umVQEBVtwEAIaSvlhM+gIKnlxN/1hpcG9639bLlUTkAt2gtn2w
4hPDZxMpblkQhcn3JcO9GD0BHNrV5qYBn3bLFwTG2FIoaROS4XyH8GPbEBWGNg9d
IGm3kLdLTWsRVCtlkLKE74ipiiaN8JhPRGAtFUjcDVSSkGNzw2jBHP0hrQEKga9R
wElSiQCVAwUQQ7cWepwcveLjXFY1AQFA/AP7BRC5j+Hed/B/RjbsbX3mxk4DprEh
6IijxC/2XAZbk1e25GspBO9Pbqs/2GufGCFX60Jj1FQJ2+vq8vg7chNNZ5XNEJse
6GrQtUx2/mEKMtvWGbWGSn53ET+AzmLne/u+f3bIh1OtXXro7w8OUkK9J+ZdG/9V
J/a0nYTlPUw6o3KJAJUDBRBDtxaE1uCh/k++Kt0BAf14BAC4mGT1gE0aoW8rn7kk
XJ3an4hThBZVuR2GS+rvwioEsIk2xe4NEFwJPGKmKq+C4vb0OWSiRev5l1fPx13x
tWDGcm2k3SukDOHB0le6gS0RQx/WHCTe/lRKiQ3w/IuhLmrDfmoOOkDj6KVb5fA0
x0Uvd4ycXUPSoJcBq7dwNg0f8YkAlQMFEEO3Foo4IttHzDdPLQEB6N0D/3LRqVT4
Dhw6UmDIre9Tag8EmqTu3R8wFTmmEYDQ+7CxW+ZbJyYEDZp/WU/6xmOE2TSHaFPQ
lgFEAaN1Cp4N9IXAM2EqeNK3fJOAsv4F5NOXbVtGJhyqG4aDUBZPvr/p123cpiiH
2yVIvHDkaacX1Tq/kECpKLj4k5D+dQYrUVdCiQCVAwUQQ7cWl4lpYrhnjAoDAQG9
pQQAg78+p2O+g7qPh1dAMcnQrI1eW3fTntWbadoKPXO5oFr/n+a74Go0D9+8J9Tt
iW3C11KR3w1q+af5wp+viJfe8YDEwvm5gcmoCxPnwOeSAzdquujnQZRE5lynr6r7
QzJOFZv457qzndC2P5qSODCkmVC6uAsRxo4Xq/zflzRXmzCJAJUDBRBDtxaeIYPh
sTlvB4kBAcvhA/9LBX9mskFW9IpA3Y5slRV1G2GFv0DXV79295p8OCKlZhEfk1y+
JyvT2hdnseD3Id2cyoMlEk57gJBuDrKdjeOLBMIJ2lOKGE6dLAsywSYkyFnngXu7
6QvoTS0mE+ahJlT9VDz79Jl6W+118cIeYzzt1TP8c1WkWBCJJcvge390BYkAlQMF
EEO3FqXI1e0plfYXcQEB7W0D/AjxxjEMuS3UedxXI8VQzTB2o3c0o5DdlK2SXgHP
SFxr9feksucCanCoYfuTWgxm/Ioy7cxtVNZT1dAHfn2MSrGN+2Adoep8E/o6PyiD
t3pCzowtXFS1wjq1j/MX5SJoDrGl0VT1sQXsWh2uOFaeMfH1w9/r9Zkl1RYXYOEn
/jkmiQCVAwUQQ7cWunCgJE0e+ZJRAQGTqgQAtdhMXLTw+tBCshX/CdLhrD0byRN5
omeib2QWmxdi7Djyz1wbDMBhnssM3SHUj/kRiorTnjv7qU8TS4z9r9zXw9U7XjCO
T/CRepb3siiHzMU4KI5bxdg0ZAsauCVDel5MItT7OlK2Fjv4vCYam/jHGYXe6AEY
dbARTWInDsFK7VCJAJUDBRBDtxgXwCnKQBb0zOkBAQHXA/47Mvt5oI8f2JbOMLkV
E14upGU+zXYeWH7j9L4AYRzjl/Lg7tT+LBTjh+HEdl2UIMdYASrC6WbKEbatb4dr
nu/pxd7/QaeSMV00P9j+Cfa3uIWn6HFUi+TH5fkLwERfkcLHKZ5SshZal9KTbjzv
uwZsArnsNN0A/d1gUqljdDI/K4kAlQMFEEO7cAXPHrUDIjJ6AQEBYWMEAIJ5g1oG
cL28orl4J7SxhOMyQODgaPRHusnWTBsa/ufUugVSR0g+3a2Pzyuq9xWqYStHf50N
hdFx45JtPmkAiWuiBsyycVbBq/ursCeL2SCQPBCcbIfB+4BUbWoU62QA0a+sY5bW
mitsU1FB2Mxd7QWqIBW4jqwB0nsAVxShRdWliJwEEAECAAYFAkO7mAoACgkQ+IYW
ZdmHE1gcHAQAkMZ2julBDdx5TeQ3rrFus44snaHiq5exlN1wIJrVIhJzmOcHq5i5
ysfoKSha0cYf6F+6kTFxNL/Y9mneisg+rWfgRYmHDzNvXcuyAY/g6rwkRoyVN70q
XhWXdY6nA29E5VH52pKCdjQgpbdyO6JDglLzfq7jVljCuPq8+PXqN+OIRgQQEQIA
BgUCQ7uYzAAKCRDEsQeYhXlqI6AlAJ48z/+X/bUYIu1yekM+Wa3uN1SgSQCePzZl
iV3/rvMdwqhHZPfM00GQQxOIRgQQEQIABgUCQ7vkHwAKCRAJp6JK0eWCB903AJ9x
Jkm4hmDjMy8+ynBwFrnKzmGUgQCdGoOE+xbNHN2kArmTHDvzd80yQAeJAJUDBRJD
u9CCXx7Ib4gMnlUBAfFkA/wP/qNyveNU4ZyJt+Ft/1xIYV4Gk/FJ4MOfpRlDYaN7
z2FXCjXtWeoxEJ8hqtWUMBuQHSm5T49Zv7Tb+6jtflscL3E/Kz3nIIr3Tzu1iNIM
m3dzI37Qdk/7tnP2fp1fO2VbrQC7CtQTYODko6vTUSLap4+NWbidGNQMSEXAFfBK
2okAlQMFEEO776zh1PwU5tB0cQEBZrEEAMjAS0ahmy5KzFgRMrrI3RkrcKwi+Hnj
Vuw6UowvW7tUhIkdFuXpd/a2YczU2Enivu7uSJgUD/2KzurD60ahJjSkC/l8xDNs
v5wvbB+nYCOVDEvL32tvGiyLyT72MpkwT3ECYXFdlwpk2P7bk87tA9isuue0Nqvr
TlO5vpTGYrPoiEYEEBECAAYFAkO9OlsACgkQorv7JAz5Vve2KACdGpTb2FWBtvXB
cyIoyLoYGLWwtSYAoLDtcY9f816jYC3awv42YCMLuKuE
=bh1L
-----END PGP PUBLIC KEY BLOCK-----
Type Bits KeyID Created Expires Algorithm Use
pub 1024 0x1EF99251 2004-12-30 ---------- RSA Sign & Encrypt
f16 Fingerprint16 = 4B 38 0E 0B 41 E8 FC 79 E9 7E 82 9B 04 23 EC 8A
@ -1094,4 +1171,4 @@ SIXqPke2iCW6+zdG1T/gS5T9T9/Lf2c9FQf0FjURAi3ynDA2RBLA5FDsI8v3
=dbDm
-----END PGP PUBLIC KEY BLOCK-----
$Revision: 8.21 $, Last updated $Date: 2005/01/07 04:39:10 $
$Revision: 8.23 $, Last updated $Date: 2006/01/07 01:07:21 $

View File

@ -3,17 +3,18 @@
This directory has the latest sendmail(TM) software from Sendmail, Inc.
Report any bugs to sendmail-bugs@sendmail.ORG
Report any bugs to sendmail-bugs-YYYY@support.sendmail.org
where YYYY is the current year, e.g., 2005.
There is a web site at http://WWW.Sendmail.ORG/ -- see that site for
There is a web site at http://www.sendmail.org/ -- see that site for
the latest updates.
+--------------+
| INTRODUCTION |
+--------------+
0. The vast majority of queries to <sendmail-questions@sendmail.org>
are answered in the README files noted below.
0. The vast majority of queries about sendmail are answered in the
README files noted below.
1. Read this README file, especially this introduction, and the DIRECTORY
PERMISSIONS sections.
@ -463,4 +464,4 @@ sendmail Source for the sendmail program itself.
test Some test scripts (currently only for compilation aids).
vacation Source for the vacation program. NOT PART OF SENDMAIL!
$Revision: 8.91 $, Last updated $Date: 2002/11/09 23:33:07 $
$Revision: 8.93 $, Last updated $Date: 2005/09/16 20:08:50 $

View File

@ -1,11 +1,120 @@
SENDMAIL RELEASE NOTES
$Id: RELEASE_NOTES,v 8.1730 2005/03/28 00:31:23 gshapiro Exp $
$Id: RELEASE_NOTES,v 8.1765 2006/03/08 02:15:03 ca 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.13.6/8.13.6 2006/03/22
SECURITY: Replace unsafe use of setjmp(3)/longjmp(3) in the server
and client side of sendmail with timeouts in the libsm I/O
layer and fix problems in that code. Also fix handling of
a buffer in sm_syslog() which could have been used as an
attack vector to exploit the unsafe handling of
setjmp(3)/longjmp(3) in combination with signals.
Problem detected by Mark Dowd of ISS X-Force.
Handle theoretical integer overflows that could triggered if
the server accepted headers larger than the maximum
(signed) integer value. This is prevented in the default
configuration by restricting the size of a header, and on
most machines memory allocations would fail before reaching
those values. Problems found by Phil Brass of ISS.
If a server returns 421 for an RSET command when trying to start
another transaction in a session while sending mail, do
not trigger an internal consistency check. Problem found
by Allan E Johannesen of Worcester Polytechnic Institute.
If a server returns a 5xy error code (other than 501) in response
to a STARTTLS command despite the fact that it advertised
STARTTLS and that the code is not valid according to RFC
2487 treat it nevertheless as a permanent failure instead
of a protocol error (which has been changed to a
temporary error in 8.13.5). Problem reported by Jeff
A. Earickson of Colby College.
Clear SMTP state after a HELO/EHLO command. Patch from John
Myers of Proofpoint.
Observe MinQueueAge option when gathering entries from the queue
for sorting etc instead of waiting until the entries are
processed. Patch from Brian Fundakowski Feldman.
Set up TLS session cache to properly handle clients that try to
resume a stored TLS session.
Properly count the number of (direct) child processes such that
a configured value (MaxDaemonChildren) is not exceeded.
Based on patch from Attila Bruncsak.
LIBMILTER: Remove superfluous backslash in macro definition
(libmilter.h). Based on patch from Mike Kupfer of
Sun Microsystems.
LIBMILTER: Don't try to set SO_REUSEADDR on UNIX domain sockets.
This generates an error message from libmilter on
Solaris, though other systems appear to just discard the
request silently.
LIBMILTER: Deal with sigwait(2) implementations that return
-1 and set errno instead of returning an error code
directly. Patch from Chris Adams of HiWAAY Informations
Services.
Portability:
Fix compilation checks for closefrom(3) and statvfs(2)
in NetBSD. Problem noted by S. Moonesamy, patch from
Andrew Brown.
8.13.5/8.13.5 2005/09/16
Store the filesystem identifier of the df/ subdirectory (if it
exists) in an internal structure instead of the base
directory. This structure is used decide whether there
is enough free disk space when selecting a queue, hence
without this change queue selection could fail if a df/
subdirectory exists and is on a different filesystem
than the base directory.
Use the queue index of the df file (instead of the qf file) for
checking whether a link(2) operation can be used to split
an envelope across queue groups. Problem found by
Werner Wiethege.
If the list of items in the queue is larger than the maximum
number of items to process, sort the queue first and
then cut the list off instead of the other way around.
Patch from Matej Vela of Rudjer Boskovic Institute.
Fix helpfile to show full entry for ETRN. Problem noted by
Penelope Fudd, patch from Neil Rickert of Northern Illinois
University.
FallbackSmartHost should also be tried on temporary errors.
From John Beck of Sun Microsystems.
When a server responds with 421 to the STARTTLS command then treat
it as a temporary error, not as protocol error. Problem
noted by Andrey J. Melnikoff.
Properly define two functions in libsm as static because their
prototype used static too. Patch from Peter Klein.
Fix syntax errors in helpfile for MAIL and RCPT commands.
LIBMILTER: When smfi_replacebody() is called with bodylen equals
zero then do not silently ignore that call. Patch from
Gurusamy Sarathy of Active State.
LIBMILTER: Recognize "421" also in a multi-line reply to terminate
the SMTP session with that error. Fix from Brian Kantor.
Portability: New option HASSNPRINTF which can be set if the OS
has a properly working snprintf(3) to get rid
of the last two (safe) sprintf(3) calls in the
source code.
Add support for AIX 5.3.
Add support for SunOS 5.11 (aka Solaris 11).
Add support for Darwin 8.x. Patch from Lyndon Nerenberg.
OpenBSD 3.7 has removed support for NETISO.
CONFIG: Add OSTYPE(freebsd6) for FreeBSD 6.X.
Set DontBlameSendmail to AssumeSafeChown and
GroupWritableDirPathSafe for OSTYPE(darwin).
Patch from Lyndon Nerenberg.
Some features still used 4.7.1 as enhanced status code which
was supposed to be eliminated in 8.13.0 because some
broken systems misinterpret it as a permanent error.
Patch from Matej Vela of Rudjer Boskovic Institute.
Some default values in a generated cf file did not match
the defaults in the sendmail binary. Problem noted
by Mike Pechkin.
New Files:
cf/ostype/freebsd6.m4
devtools/OS/AIX.5.3
devtools/OS/Darwin.8.x
devtools/OS/SunOS.5.11
include/sm/time.h
8.13.4/8.13.4 2005/03/27
The bug fixes in 8.13.3 for connection handling uncovered a
different error which could result in connections that

View File

@ -77,7 +77,7 @@ Let's examine a typical .mc file:
divert(-1)
#
# Copyright (c) 1998-2004 Sendmail, Inc. and its suppliers.
# Copyright (c) 1998-2005 Sendmail, Inc. and its suppliers.
# All rights reserved.
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
# Copyright (c) 1988, 1993
@ -492,11 +492,12 @@ QPAGE_MAILER_QGRP [undefined] The queue group for the qpage mailer.
LOCAL_PROG_QGRP [undefined] The queue group for the prog mailer.
Note: to tweak Name_MAILER_FLAGS use the macro MODIFY_MAILER_FLAGS:
MODIFY_MAILER_FLAGS(`Name', `change') where Name is the first part of
the macro Name_MAILER_FLAGS and change can be: flags that should
be used directly (thus overriding the default value), or if it
starts with `+' (`-') then those flags are added to (removed from)
the default value. Example:
MODIFY_MAILER_FLAGS(`Name', `change') where Name is the first part
of the macro Name_MAILER_FLAGS (note: that means Name is entirely in
upper case) and change can be: flags that should be used directly
(thus overriding the default value), or if it starts with `+' (`-')
then those flags are added to (removed from) the default value.
Example:
MODIFY_MAILER_FLAGS(`LOCAL', `+e')
@ -958,7 +959,7 @@ generics_entire_domain
virtusertable A domain-specific form of aliasing, allowing multiple
virtual domains to be hosted on one machine. For example,
if the virtuser table contained:
if the virtuser table contains:
info@foo.com foo-info
info@bar.com bar-info
@ -1186,7 +1187,7 @@ accept_unqualified_senders
Normally, MAIL FROM: commands in the SMTP session will be
refused if the connection is a network connection and the
sender address does not include a domain name. If your
setup sends local mail unqualified (i.e., MAIL FROM: <joe>),
setup sends local mail unqualified (i.e., MAIL FROM:<joe>),
you will need to use this feature to accept unqualified
sender addresses. Setting the DaemonPortOptions modifier
'u' overrides the default behavior, i.e., unqualified
@ -1872,7 +1873,8 @@ sections below).
See the file cf/sendmail.schema for the actual LDAP schemas. Note that
this schema (and therefore the lookups and examples below) is experimental
at this point as it has had little public review. Therefore, it may change
in future versions. Feedback via sendmail@sendmail.org is encouraged.
in future versions. Feedback via sendmail-YYYY@support.sendmail.org is
encouraged (replace YYYY with the current year, e.g., 2005).
-------
Aliases
@ -2336,7 +2338,7 @@ without any prior arrangement). Along the same lines,
FEATURE(`relay_local_from')
will allow relaying if the sender specifies a return path (i.e.
MAIL FROM: <user@domain>) domain which is a local domain. This is a
MAIL FROM:<user@domain>) domain which is a local domain. This is a
dangerous feature as it will allow spammers to spam using your mail
server by simply specifying a return address of user@your.domain.com.
It should not be used unless absolutely necessary.
@ -2357,7 +2359,7 @@ allow relaying for roaming users.
If source routing is used in the recipient address (e.g.,
RCPT TO: <user%site.com@othersite.com>), sendmail will check
RCPT TO:<user%site.com@othersite.com>), sendmail will check
user@site.com for relaying if othersite.com is an allowed relay host
in either class {R}, class {m} if FEATURE(`relay_entire_domain') is used,
or the access database if FEATURE(`access_db') is used. To prevent
@ -2522,15 +2524,30 @@ The value part of the map can contain:
it but causing the default action.
### any text where ### is an RFC 821 compliant error code and
"any text" is a message to return for the command.
The string should be quoted to avoid surprises,
e.g., sendmail may remove spaces otherwise.
The entire string should be quoted to avoid
surprises:
"### any text"
Otherwise sendmail formats the text as email
addresses, e.g., it may remove spaces.
This type is deprecated, use one of the two
ERROR: entries below instead.
ERROR:### any text
as above, but useful to mark error messages as such.
If quotes need to be used to avoid modifications
(see above), they should be placed like this:
ERROR:"### any text"
ERROR:D.S.N:### any text
where D.S.N is an RFC 1893 compliant error code
and the rest as above.
and the rest as above. If quotes need to be used
to avoid modifications, they should be placed
like this:
ERROR:D.S.N:"### any text"
QUARANTINE:any text
Quarantine the message using the given text as the
quarantining reason.
@ -2796,9 +2813,9 @@ 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}.
2. There are no default rulesets coming with this distribution of
sendmail. You can either write your own or you can search the
WWW for examples, e.g., http://www.digitalanswers.org/check_local/
3. When using a default ruleset for headers, the name of the header
sendmail. You can write your own, can search the WWW for examples,
or take a look at cf/cf/knecht.mc.
3. When using a default ruleset for headers, the name of the header
currently being checked can be found in the $&{hdr_name} macro.
After all of the headers are read, the check_eoh ruleset will be called for
@ -4011,12 +4028,17 @@ confDONT_INIT_GROUPS DontInitGroups [False] If set, the initgroups(3)
will only have their primary
(/etc/passwd) group permissions.
confUNSAFE_GROUP_WRITES UnsafeGroupWrites
[False] If set, group-writable
[True] If set, group-writable
:include: and .forward files are
considered "unsafe", that is, programs
and files cannot be directly referenced
from such files. World-writable files
are always considered unsafe.
Notice: this option is deprecated and
will be removed in future versions;
Set GroupWritableForwardFileSafe
and GroupWritableIncludeFileSafe in
DontBlameSendmail if required.
confCONNECT_ONLY_TO ConnectOnlyTo [undefined] override connection
address (for testing).
confCONTROL_SOCKET_NAME ControlSocketName
@ -4183,7 +4205,7 @@ confNICE_QUEUE_RUN NiceQueueRun [undefined] If set, the priority of
confDIRECT_SUBMISSION_MODIFIERS DirectSubmissionModifiers
[undefined] Defines {daemon_flags}
for direct submissions.
confUSE_MSP UseMSP [false] Use as mail submission
confUSE_MSP UseMSP [undefined] Use as mail submission
program, see sendmail/SECURITY.
confDELIVER_BY_MIN DeliverByMin [0] Minimum time for Deliver By
SMTP Service Extension (RFC 2852).
@ -4583,4 +4605,4 @@ M4 DIVERSIONS
8 DNS based blacklists
9 special local rulesets (1 and 2)
$Revision: 8.694 $, Last updated $Date: 2005/03/23 21:41:09 $
$Revision: 8.704 $, Last updated $Date: 2006/02/15 05:49:31 $

View File

@ -1,7 +1,7 @@
#
# Makefile for configuration files.
#
# $Id: Makefile,v 8.59 2004/08/06 03:54:05 gshapiro Exp $
# $Id: Makefile,v 8.60 2005/06/14 02:16:34 gshapiro Exp $
#
#
@ -168,6 +168,7 @@ M4FILES=\
${CFDIR}/ostype/dynix3.2.m4 \
${CFDIR}/ostype/freebsd4.m4 \
${CFDIR}/ostype/freebsd5.m4 \
${CFDIR}/ostype/freebsd6.m4 \
${CFDIR}/ostype/gnu.m4 \
${CFDIR}/ostype/hpux10.m4 \
${CFDIR}/ostype/hpux11.m4 \

View File

@ -1,6 +1,6 @@
divert(-1)
#
# Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
# Copyright (c) 1998-2001, 2004, 2005 Sendmail, Inc. and its suppliers.
# All rights reserved.
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
# Copyright (c) 1988, 1993
@ -19,7 +19,7 @@ divert(-1)
#
divert(0)
VERSIONID(`$Id: knecht.mc,v 8.58 2004/01/28 00:54:41 eric Exp $')
VERSIONID(`$Id: knecht.mc,v 8.61 2005/10/06 05:56:03 ca Exp $')
OSTYPE(bsd4.4)
DOMAIN(generic)
@ -43,10 +43,11 @@ define(`confCLIENT_KEY', `CERT_DIR/MYkey.pem')
define(`CYRUS_MAILER_PATH', `/usr/local/cyrus/bin/deliver')
FEATURE(access_db)
FEATURE(local_lmtp)
FEATURE(virtusertable)
FEATURE(mailertable)
FEATURE(`access_db')
FEATURE(`blacklist_recipients')
FEATURE(`local_lmtp')
FEATURE(`virtusertable')
FEATURE(`mailertable')
FEATURE(`nocanonify', `canonify_hosts')
CANONIFY_DOMAIN(`sendmail.org')
@ -67,9 +68,16 @@ QUEUE_GROUP(`mqueue', `P=/var/spool/mqueue, R=5, r=15, F=f')
dnl # enable spam assassin
INPUT_MAIL_FILTER(`spamassassin', `S=local:/var/run/spamass-milter.sock, F=, T=C:15m;S:4m;R:4m;E:10m')
MAILER(local)
MAILER(smtp)
MAILER(cyrus)
dnl # enable some DNSBLs
dnl FEATURE(`dnsbl', `dnsbl.sorbs.net', `"550 Mail from " $`'&{client_addr} " refused - see http://www.dnsbl.sorbs.net/"')
FEATURE(`dnsbl', `sbl-xbl.spamhaus.org', `"550 Mail from " $`'&{client_addr} " refused - see http://www.spamhaus.org/sbl/"')
FEATURE(`dnsbl', `list.dsbl.org', `"550 Mail from " $`'&{client_addr} " refused - see http://dsbl.org/"')
FEATURE(`dnsbl', `bl.spamcop.net', `"450 Mail from " $`'&{client_addr} " refused - see http://spamcop.net/bl.shtml"')
MAILER(`local')
MAILER(`smtp')
MAILER(`cyrus')
LOCAL_RULE_0
Rcyrus.$+ + $+ < @ $=w . > $#cyrus $@ $2 $: $1

View File

@ -16,8 +16,8 @@
#####
##### SENDMAIL CONFIGURATION FILE
#####
##### built by ca@wiz.smi.sendmail.com on Sun Mar 27 16:38:48 PST 2005
##### in /extra/home/ca/sm-8.13.4/OpenSource/sendmail-8.13.4/cf/cf
##### built by ca@wiz.smi.sendmail.com on Sun Mar 19 22:37:26 PST 2006
##### in /extra/home/ca/sm-8.13.6/OpenSource/sendmail-8.13.6/cf/cf
##### using ../ as configuration include directory
#####
######################################################################
@ -35,7 +35,7 @@
##### $Id: no_default_msa.m4,v 8.2 2001/02/14 05:03:22 gshapiro Exp $ #####
##### $Id: proto.m4,v 8.711 2004/08/04 21:29:55 ca Exp $ #####
##### $Id: proto.m4,v 8.718 2005/08/24 18:07:23 ca Exp $ #####
# level 10 config file format
V10/Berkeley
@ -114,7 +114,7 @@ D{MTAHost}[127.0.0.1]
# Configuration version number
DZ8.13.4/Submit
DZ8.13.6/Submit
###############
@ -252,7 +252,7 @@ O PrivacyOptions=goaway,noetrn,restrictqrun
#O MinQueueAge=30m
# how many jobs can you process in the queue?
#O MaxQueueRunSize=10000
#O MaxQueueRunSize=0
# perform initial split of envelope without checking MX records
#O FastSplit=1
@ -380,13 +380,13 @@ O TimeZoneSpec=
#O HostsFile=/etc/hosts
# dialup line delay on connection failure
#O DialDelay=10s
#O DialDelay=0s
# action to take if there are no recipients in the message
#O NoRecipientAction=add-to-undisclosed
#O NoRecipientAction=none
# chrooted environment for writing to files
#O SafeFileEnvironment=/arch
#O SafeFileEnvironment
# are colons OK in addresses?
#O ColonOkInAddr=True

View File

@ -1,6 +1,6 @@
divert(-1)
#
# Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers.
# Copyright (c) 1998-2002, 2005 Sendmail, Inc. and its suppliers.
# All rights reserved.
#
# By using this file, you agree to the terms and conditions set
@ -12,7 +12,7 @@ divert(-1)
ifdef(`DNSBL_MAP', `', `define(`DNSBL_MAP', `dns -R A')')
divert(0)
ifdef(`_DNSBL_R_',`dnl',`dnl
VERSIONID(`$Id: dnsbl.m4,v 8.29 2002/08/09 21:02:08 ca Exp $')
VERSIONID(`$Id: dnsbl.m4,v 8.30 2005/07/25 20:56:53 ca Exp $')
define(`_DNSBL_R_',`')
LOCAL_CONFIG
# map for DNS based blacklist lookups
@ -28,6 +28,6 @@ R$-.$-.$-.$- $: <?> $(dnsbl $4.$3.$2.$1._DNSBL_SRV_. $: OK $)
R<?>OK $: OKSOFAR
ifelse(len(X`'_ARG3_),`1',
`R<?>$+<TMP> $: TMPOK',
`R<?>$+<TMP> $#error $@ 4.7.1 $: _DNSBL_MSG_TMP_')
`R<?>$+<TMP> $#error $@ 4.4.3 $: _DNSBL_MSG_TMP_')
R<?>$+ $#error $@ 5.7.1 $: _DNSBL_MSG_
divert(-1)

View File

@ -1,6 +1,6 @@
divert(-1)
#
# Copyright (c) 2000-2002 Sendmail, Inc. and its suppliers.
# Copyright (c) 2000-2002, 2005 Sendmail, Inc. and its suppliers.
# All rights reserved.
#
# By using this file, you agree to the terms and conditions set
@ -11,7 +11,7 @@ divert(-1)
divert(0)
ifdef(`_EDNSBL_R_',`dnl',`dnl
VERSIONID(`$Id: enhdnsbl.m4,v 1.9 2002/05/19 21:27:29 gshapiro Exp $')
VERSIONID(`$Id: enhdnsbl.m4,v 1.10 2005/07/25 20:56:53 ca Exp $')
LOCAL_CONFIG
define(`_EDNSBL_R_',`')dnl
# map for enhanced DNS based blacklist lookups
@ -29,7 +29,7 @@ R$-.$-.$-.$- $: <?> $(ednsbl $4.$3.$2.$1._EDNSBL_SRV_. $: OK $)
R<?>OK $: OKSOFAR
ifelse(len(X`'_ARG3_),`1',
`R<?>$+<TMP> $: TMPOK',
`R<?>$+<TMP> $#error $@ 4.7.1 $: _EDNSBL_MSG_TMP_')
`R<?>$+<TMP> $#error $@ 4.4.3 $: _EDNSBL_MSG_TMP_')
R<?>_EDNSBL_MATCH_ $#error $@ 5.7.1 $: _EDNSBL_MSG_
ifelse(len(X`'_ARG5_),`1',`dnl',
`R<?>_ARG5_ $#error $@ 5.7.1 $: _EDNSBL_MSG_')

View File

@ -1,6 +1,6 @@
divert(-1)
#
# Copyright (c) 2004 Sendmail, Inc. and its suppliers.
# Copyright (c) 2004, 2005 Sendmail, Inc. and its suppliers.
# All rights reserved.
#
# By using this file, you agree to the terms and conditions set
@ -11,7 +11,7 @@ divert(-1)
divert(0)
ifdef(`_MTAMARK_R',`dnl',`dnl
VERSIONID(`$Id: mtamark.m4,v 1.1 2004/03/22 19:22:40 ca Exp $')
VERSIONID(`$Id: mtamark.m4,v 1.2 2005/07/25 20:56:53 ca Exp $')
LOCAL_CONFIG
define(`_MTAMARK_R',`')dnl
# map for MTA mark
@ -29,5 +29,5 @@ R<?>1. $: OKSOFAR
R<?>0. $#error $@ 5.7.1 $: _MTAMARK_MSG_
ifelse(len(X`'_ARG2_),`1',
`R<?>$+<TMP> $: TMPOK',
`R<?>$+<TMP> $#error $@ 4.7.1 $: _MTAMARK_MSG_TMP_')
`R<?>$+<TMP> $#error $@ 4.4.3 $: _MTAMARK_MSG_TMP_')
divert(-1)

View File

@ -1,6 +1,6 @@
divert(-1)
#
# Copyright (c) 1998-2004 Sendmail, Inc. and its suppliers.
# Copyright (c) 1998-2005 Sendmail, Inc. and its suppliers.
# All rights reserved.
# Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved.
# Copyright (c) 1988, 1993
@ -13,7 +13,7 @@ divert(-1)
#
divert(0)
VERSIONID(`$Id: proto.m4,v 8.711 2004/08/04 21:29:55 ca Exp $')
VERSIONID(`$Id: proto.m4,v 8.718 2005/08/24 18:07:23 ca Exp $')
# level CF_LEVEL config file format
V`'CF_LEVEL/ifdef(`VENDOR_NAME', `VENDOR_NAME', `Berkeley')
@ -388,7 +388,7 @@ _OPTION(QueueSortOrder, `confQUEUE_SORT_ORDER', `priority')
_OPTION(MinQueueAge, `confMIN_QUEUE_AGE', `30m')
# how many jobs can you process in the queue?
_OPTION(MaxQueueRunSize, `confMAX_QUEUE_RUN_SIZE', `10000')
_OPTION(MaxQueueRunSize, `confMAX_QUEUE_RUN_SIZE', `0')
# perform initial split of envelope without checking MX records
_OPTION(FastSplit, `confFAST_SPLIT', `1')
@ -520,13 +520,13 @@ _OPTION(ServiceSwitchFile, `confSERVICE_SWITCH_FILE', `MAIL_SETTINGS_DIR`'servic
_OPTION(HostsFile, `confHOSTS_FILE', `/etc/hosts')
# dialup line delay on connection failure
_OPTION(DialDelay, `confDIAL_DELAY', `10s')
_OPTION(DialDelay, `confDIAL_DELAY', `0s')
# action to take if there are no recipients in the message
_OPTION(NoRecipientAction, `confNO_RCPT_ACTION', `add-to-undisclosed')
_OPTION(NoRecipientAction, `confNO_RCPT_ACTION', `none')
# chrooted environment for writing to files
_OPTION(SafeFileEnvironment, `confSAFE_FILE_ENV', `/arch')
_OPTION(SafeFileEnvironment, `confSAFE_FILE_ENV', `')
# are colons OK in addresses?
_OPTION(ColonOkInAddr, `confCOLON_OK_IN_ADDR', `True')
@ -2698,6 +2698,11 @@ RSOFTWARE $| <$-:$+> $* $#error $@ $2 $: $1 " TLS handshake failed."
dnl no <reply:dns> i.e. not requirements in the access map
dnl use default error
RSOFTWARE $| $* $#error $@ ifdef(`TLS_PERM_ERR', `5.7.0', `4.7.0') $: "ifdef(`TLS_PERM_ERR', `503', `403') TLS handshake failed."
# deal with TLS protocol errors: abort
RPROTOCOL $| <$-:$+> $* $#error $@ $2 $: $1 " STARTTLS failed."
dnl no <reply:dns> i.e. not requirements in the access map
dnl use default error
RPROTOCOL $| $* $#error $@ ifdef(`TLS_PERM_ERR', `5.7.0', `4.7.0') $: "ifdef(`TLS_PERM_ERR', `503', `403') STARTTLS failed."
R$* $| <$*> <VERIFY> $: <$2> <VERIFY> <> $1
dnl separate optional requirements
R$* $| <$*> <VERIFY + $+> $: <$2> <VERIFY> <$3> $1

View File

@ -1,6 +1,6 @@
divert(-1)
#
# Copyright (c) 1998-2005 Sendmail, Inc. and its suppliers.
# Copyright (c) 1998-2006 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.132 2005/03/25 18:44:45 ca Exp $')
VERSIONID(`$Id: version.m4,v 8.147 2006/03/08 19:21:23 ca Exp $')
#
divert(0)
# Configuration version number
DZ8.13.4`'ifdef(`confCF_VERSION', `/confCF_VERSION')
DZ8.13.6`'ifdef(`confCF_VERSION', `/confCF_VERSION')

View File

@ -10,9 +10,10 @@ divert(-1)
#
divert(0)
VERSIONID(`$Id: darwin.m4,v 8.3 2002/03/05 01:55:40 ca Exp $')
VERSIONID(`$Id: darwin.m4,v 8.4 2005/06/30 01:16:04 ca Exp $')
ifdef(`STATUS_FILE',, `define(`STATUS_FILE', `/var/log/sendmail.st')')dnl
dnl turn on S flag for local mailer
MODIFY_MAILER_FLAGS(`LOCAL', `+S')dnl
ifdef(`LOCAL_MAILER_PATH',, `define(`LOCAL_MAILER_PATH', /usr/libexec/mail.local)')dnl
ifdef(`UUCP_MAILER_ARGS',, `define(`UUCP_MAILER_ARGS', `uux - -r -z -a$g $h!rmail ($u)')')dnl
define(`confDONT_BLAME_SENDMAIL', `AssumeSafeChown,GroupWritableDirPathSafe')dnl

View File

@ -1,15 +1,16 @@
# Copyright (c) 2000-2002 Sendmail, Inc. and its suppliers.
# Copyright (c) 2000-2002, 2005 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: sendmail.schema,v 8.21 2002/11/20 23:13:50 gshapiro Exp $
# $Id: sendmail.schema,v 8.22 2005/09/16 20:18:14 ca Exp $
# Note that this schema is experimental at this point as it has had little
# public review. Therefore, it may change in future versions. Feedback
# via sendmail@sendmail.org is encouraged.
# via sendmail-YYYY@support.sendmail.org is encouraged (replace YYYY with
# the current year, e.g., 2005).
# OID arcs for Sendmail
# enterprise: 1.3.6.1.4.1

View File

@ -1,6 +1,6 @@
divert(-1)
#
# Copyright (c) 2001-2002 Sendmail, Inc. and its suppliers.
# Copyright (c) 2001-2002, 2005 Sendmail, Inc. and its suppliers.
# All rights reserved.
#
# By using this file, you agree to the terms and conditions set
@ -59,7 +59,7 @@ dnl ## address returned does not begin 127, then the mail is
dnl ## processed as if the HACK line were not present.
divert(0)
VERSIONID(`$Id: dnsblaccess.m4,v 1.5 2002/05/19 21:30:06 gshapiro Exp $')
VERSIONID(`$Id: dnsblaccess.m4,v 1.6 2005/07/25 23:32:05 ca Exp $')
ifdef(`_ACCESS_TABLE_', `dnl',
`errprint(`*** ERROR: dnsblaccess requires FEATURE(`access_db')
')')
@ -85,7 +85,7 @@ R<?>$* $- .<>$* <$(access _EDNSBL_KEY_`:'$1$2 $@$3 $@`'_EDNSBL_SRV_ $: ? $)> $1
R<?>$* <>$* $:<$(access _EDNSBL_KEY_`:' $@$2 $@`'_EDNSBL_SRV_ $: ? $)> <>$2
ifelse(len(X`'_ARG3_),`1',
`R<$*<TMPF>>$* $: TMPOK',
`R<$*<TMPF>>$* $#error $@ 4.7.1 $: _EDNSBL_MSG_TMP_')
`R<$*<TMPF>>$* $#error $@ 4.4.3 $: _EDNSBL_MSG_TMP_')
R<$={Accept}>$* $: OKSOFAR
R<ERROR:$-.$-.$-:$+> $* $#error $@ $1.$2.$3 $: $4
R<ERROR:$+> $* $#error $: $1

View File

@ -1,4 +1,4 @@
# $Id: Makefile,v 8.15 2004/07/20 20:25:10 ca Exp $
# $Id: Makefile,v 8.16 2006/01/05 22:03:31 ca Exp $
DIR= smm/08.sendmailop
SRCS= op.me
@ -22,6 +22,7 @@ all: ${OBJS}
op.ps: ${SRCS}
rm -f $@
${PIC} ${SRCS} | ${EQNPS} | ${ROFFPS} > $@
test -s $@ || ${ROFFPS} -p -e ${SRCS} > $@
op.txt: ${SRCS}
rm -f $@

View File

@ -9,7 +9,7 @@
.\" the sendmail distribution.
.\"
.\"
.\" $Id: op.me,v 8.704 2005/02/01 00:40:57 ca Exp $
.\" $Id: op.me,v 8.708 2005/11/12 02:08:04 ca Exp $
.\"
.\" eqn op.me | pic | troff -me
.\"
@ -90,7 +90,7 @@ Sendmail, Inc.
.de Ve
Version \\$2
..
.Ve $Revision: 8.704 $
.Ve $Revision: 8.708 $
.rm Ve
.sp
For Sendmail Version 8.13
@ -1475,6 +1475,18 @@ option, so that it may be shared between several invocations of
.i sendmail .
This allows mail to be queued immediately or skipped during a queue run if
there has been a recent failure in connecting to a remote machine.
Note: information about a remote system is stored in a file
whose pathname consists of the components of the hostname in reverse order.
For example, the information for
.b host.example.com
is stored in
.b com./example./host .
For top-level domains like
.b com
this can create a large number of subdirectories
which on some filesystems can exhaust some limits.
Moreover, the performance of lookups in directory with thousands of entries
can be fairly slow depending on the filesystem implementation.
.pp
Additionally enabling
.b SingleThreadDelivery
@ -7282,6 +7294,16 @@ will refuse connections when it has more than
.i N
children processing incoming mail or automatic queue runs.
This does not limit the number of outgoing connections.
If the default
.b DeliveryMode
(background) is used, then
.i sendmail
may create an almost unlimited number of children
(depending on the number of transactions and the
relative execution times of mail receiption and mail delivery).
If the limit should be enforced, then a
.b DeliveryMode
other than background must be used.
If not set, there is no limit to the number of children --
that is, the system load averaging controls this.
.ip MaxHeadersLength=\fIN\fP
@ -9086,7 +9108,7 @@ For example,
.)b
is equivalent to
.(b
-H ldap://server.example.com:389/dc=example,dc=com
-H ldap://server.example.com:389 -b dc=example,dc=com
.)b
If the LDAP library supports it,
the LDAP URI format however can also request LDAP over SSL by using
@ -9095,13 +9117,13 @@ instead of
.b ldap:// .
For example:
.(b
O LDAPDefaultSpec=-H ldaps://ldap.example.com/dc=example,dc=com
O LDAPDefaultSpec=-H ldaps://ldap.example.com -b dc=example,dc=com
.)b
Similarly, if the LDAP library supports it,
It can also be used to specify a UNIX domain socket using
.b ldapi:// :
.(b
O LDAPDefaultSpec=-H ldapi://socketfile/dc=example,dc=com
O LDAPDefaultSpec=-H ldapi://socketfile -b dc=example,dc=com
.)b
.ip "\-b\fIbase\fP"
LDAP search base.
@ -11317,7 +11339,7 @@ replace it with a blank sheet for double-sided output.
.\".sz 10
.\"Eric Allman
.\".sp
.\"Version $Revision: 8.704 $
.\"Version $Revision: 8.708 $
.\".ce 0
.bp 3
.ce

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2004 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2005 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@ -7,7 +7,7 @@
* the sendmail distribution.
*
*
* $Id: mfdef.h,v 8.21 2004/07/07 21:41:31 ca Exp $
* $Id: mfdef.h,v 8.22 2005/08/05 21:49:04 ca Exp $
*/
/*
@ -61,6 +61,7 @@
# define SMFIR_REPLBODY 'b' /* replace body (chunk) */
# define SMFIR_CONTINUE 'c' /* continue */
# define SMFIR_DISCARD 'd' /* discard */
# define SMFIR_CONN_FAIL 'f' /* cause a connection failure */
# define SMFIR_CHGHEADER 'm' /* change header */
# define SMFIR_PROGRESS 'p' /* progress */
# define SMFIR_REJECT 'r' /* reject */
@ -82,13 +83,17 @@
# if _FFR_MILTER_NOHDR_RESP
# define SMFIP_NOHREPL 0x00000080L /* No reply for headers */
# endif /* _FFR_MILTER_NOHDR_RESP */
# define SMFIP_NOUNKNOWN 0x00000100L /* MTA should not send unknown command */
# define SMFIP_NODATA 0x00000200L /* MTA should not send DATA */
# define SMFI_V1_PROT 0x0000003FL /* The protocol of V1 filter */
# define SMFI_V2_PROT 0x0000007FL /* The protocol of V2 filter */
/* Note: the "current" version is now determined dynamically in milter.c */
# if _FFR_MILTER_NOHDR_RESP
# define SMFI_CURR_PROT 0x000000FFL /* The current version */
# define SMFI_CURR_PROT 0x000000FFL
# else /* _FFR_MILTER_NOHDR_RESP */
# define SMFI_CURR_PROT SMFI_V2_PROT /* The current version */
# define SMFI_CURR_PROT SMFI_V2_PROT
# endif /* _FFR_MILTER_NOHDR_RESP */
#endif /* !_LIBMILTER_MFDEF_H */

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2005 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2006 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 1.120 2005/03/22 22:07:53 ca Exp $
* $Id: conf.h,v 1.128 2006/01/27 18:43:44 ca Exp $
*/
/*
@ -406,6 +406,9 @@ typedef int pid_t;
# if SOLARIS >= 20500 || (SOLARIS < 10000 && SOLARIS >= 205)
# define HASSETREUID 1 /* setreuid works as of 2.5 */
# define HASSETREGID 1 /* use setregid(2) to set saved gid */
# if SOLARIS >= 20600 || (SOLARIS < 10000 && SOLARIS >= 206)
# define HASSNPRINTF 1 /* has snprintf(3c) starting in 2.6 */
# endif /* SOLARIS >= 20600 || (SOLARIS < 10000 && SOLARIS >= 206) */
# if SOLARIS < 207 || (SOLARIS > 10000 && SOLARIS < 20700)
# ifndef LA_TYPE
# define LA_TYPE LA_KSTAT /* use kstat(3k) -- may work in < 2.5 */
@ -734,8 +737,8 @@ typedef int pid_t;
# define HASFLOCK 1 /* has flock(2) */
# define HASUNAME 1 /* has uname(2) */
# define HASUNSETENV 1 /* has unsetenv(3) */
# define HASSETSID 1 /* has POSIX setsid(2) call */
# define HASINITGROUPS 1 /* has initgroups(3) */
# define HASSETSID 1 /* has POSIX setsid(2) call */
# define HASINITGROUPS 1 /* has initgroups(3) */
# define HASSETVBUF 1 /* has setvbuf (3) */
# define HASSETREUID 0 /* setreuid(2) unusable */
# define HASSETEUID 1 /* has seteuid(2) */
@ -748,13 +751,22 @@ typedef int pid_t;
# define HASWAITPID 1 /* has waitpid(2) */
# define HASGETDTABLESIZE 1 /* has getdtablesize(2) */
# define HAS_ST_GEN 1 /* has st_gen field in struct stat */
# define HASURANDOMDEV 1 /* has urandom(4) */
# define HASURANDOMDEV 1 /* has urandom(4) */
# define HASSTRERROR 1 /* has strerror(3) */
# define HASGETUSERSHELL 1 /* had getusershell(3) */
# define GIDSET_T gid_t /* getgroups(2) takes gid_t */
# define LA_TYPE LA_SUBR /* use getloadavg(3) */
# define SFS_TYPE SFS_MOUNT /* use <sys/mount.h> statfs() impl */
# define SPT_TYPE SPT_PSSTRINGS /* use magic PS_STRINGS pointer for setproctitle */
# if DARWIN >= 70000
# define SOCKADDR_LEN_T socklen_t
# endif
# if DARWIN >= 80000
# define SPT_TYPE SPT_REUSEARGV
# define SPT_PADCHAR '\0'
# define SOCKOPT_LEN_T socklen_t
# else
# define SPT_TYPE SPT_PSSTRINGS /* use magic PS_STRINGS pointer for setproctitle */
# endif
# define ERRLIST_PREDEFINED /* don't declare sys_errlist */
# define BSD4_4_SOCKADDR /* struct sockaddr has sa_len */
# define SAFENFSPATHCONF 0 /* unverified: pathconf(2) doesn't work on NFS */
@ -773,7 +785,7 @@ extern unsigned int sleepX __P((unsigned int seconds));
** See also BSD defines.
*/
# if defined(BSD4_4) && !defined(__bsdi__) && !defined(__GNU__)
# if defined(BSD4_4) && !defined(__bsdi__) && !defined(__GNU__) && !defined(DARWIN)
# include <paths.h>
# define HASUNSETENV 1 /* has unsetenv(3) call */
# define USESETEUID 1 /* has usable seteuid(2) call */
@ -791,7 +803,7 @@ extern unsigned int sleepX __P((unsigned int seconds));
# endif /* ! LA_TYPE */
# define SFS_TYPE SFS_MOUNT /* use <sys/mount.h> statfs() impl */
# define SPT_TYPE SPT_PSSTRINGS /* use PS_STRINGS pointer */
# endif /* defined(BSD4_4) && !defined(__bsdi__) && !defined(__GNU__) */
# endif /* defined(BSD4_4) && !defined(__bsdi__) && !defined(__GNU__) && !defined(DARWIN)*/
/*
@ -899,11 +911,14 @@ extern unsigned int sleepX __P((unsigned int seconds));
# define NETLINK 1 /* supports AF_LINK */
# define SAFENFSPATHCONF 1 /* pathconf(2) pessimizes on NFS filesystems */
# define GIDSET_T gid_t
# define QUAD_T unsigned long long
# define QUAD_T unsigned long long
# define HASSNPRINTF 1 /* has snprintf(3) (all versions?) */
# ifndef LA_TYPE
# define LA_TYPE LA_SUBR
# endif /* ! LA_TYPE */
# if defined(__NetBSD__) && defined(__NetBSD_Version__) && __NetBSD_Version__ >= 200040000
# if defined(__NetBSD__) && defined(__NetBSD_Version__) && \
((__NetBSD_Version__ >= 200040000 && __NetBSD_Version__ < 200090000) || \
(__NetBSD_Version__ >= 299000900))
# undef SFS_TYPE
# define SFS_TYPE SFS_STATVFS
# else
@ -919,7 +934,9 @@ extern unsigned int sleepX __P((unsigned int seconds));
# if defined(__NetBSD__) && defined(__NetBSD_Version__) && __NetBSD_Version__ >= 104170000
# define HASSETUSERCONTEXT 1 /* BSDI-style login classes */
# endif
# if defined(__NetBSD__) && defined(__NetBSD_Version__) && __NetBSD_Version__ >= 200060000
# if defined(__NetBSD__) && defined(__NetBSD_Version__) && \
((__NetBSD_Version__ >= 200060000 && __NetBSD_Version__ < 200090000) || \
(__NetBSD_Version__ >= 299000900))
# define HASCLOSEFROM 1 /* closefrom(3) added in 2.0F */
# endif
# if defined(__NetBSD__)
@ -994,6 +1011,9 @@ extern unsigned int sleepX __P((unsigned int seconds));
# if OpenBSD >= 200405
# define HASCLOSEFROM 1 /* closefrom(3) added in 3.5 */
# endif /* OpenBSD >= 200405 */
# if OpenBSD >= 200505
# undef NETISO /* iso.h removed in 3.7 */
# endif /* OpenBSD >= 200505 */
# endif /* defined(__OpenBSD__) */
# endif /* defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) */

View File

@ -1,12 +1,12 @@
/*
* Copyright (c) 2001-2002 Sendmail, Inc. and its suppliers.
* Copyright (c) 2001-2003, 2005 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: ldap.h,v 1.27 2003/12/20 09:23:47 gshapiro Exp $
* $Id: ldap.h,v 1.28 2005/06/23 23:11:21 ca Exp $
*/
#ifndef SM_LDAP_H
@ -44,6 +44,7 @@
# define SM_LDAP_SINGLEMATCH 0x0001
# define SM_LDAP_MATCHONLY 0x0002
# define SM_LDAP_USE_ALLATTR 0x0004
# define SM_LDAP_SINGLEDN 0x0008
struct sm_ldap_struct
{

View File

@ -0,0 +1,56 @@
/*
* Copyright (c) 2005 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: time.h,v 1.1 2005/06/14 23:07:19 ca Exp $
*/
#ifndef SM_TIME_H
# define SM_TIME_H 1
# include <sm/config.h>
# include <sys/time.h>
/* should be defined in sys/time.h */
#ifndef timersub
# define timersub(tvp, uvp, vvp) \
do \
{ \
(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \
(vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \
if ((vvp)->tv_usec < 0) \
{ \
(vvp)->tv_sec--; \
(vvp)->tv_usec += 1000000; \
} \
} while (0)
#endif /* !timersub */
#ifndef timeradd
# define timeradd(tvp, uvp, vvp) \
do \
{ \
(vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \
(vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \
if ((vvp)->tv_usec >= 1000000) \
{ \
(vvp)->tv_sec++; \
(vvp)->tv_usec -= 1000000; \
} \
} while (0)
#endif /* !timeradd */
#ifndef timercmp
# define timercmp(tvp, uvp, cmp) \
(((tvp)->tv_sec == (uvp)->tv_sec) ? \
((tvp)->tv_usec cmp (uvp)->tv_usec) : \
((tvp)->tv_sec cmp (uvp)->tv_sec))
#endif /* !timercmp */
#endif /* ! SM_TIME_H */

View File

@ -12,6 +12,9 @@ issuing the './Build' command in SRCDIR/libmilter .
Starting with 8.13 sendmail is compiled by default with support for
the milter API.
Note: if you want to write a milter in Java, then see
http://sendmail-jilter.sourceforge.net/
+----------------+
| SECURITY HINTS |
+----------------+
@ -466,4 +469,4 @@ main(argc, argv)
/* eof */
$Revision: 8.40 $, Last updated $Date: 2003/12/11 18:14:34 $
$Revision: 8.41 $, Last updated $Date: 2005/04/27 22:47:42 $

View File

@ -2,7 +2,7 @@
<head><title>smfi_stop</title></head>
<body>
<!--
$Id: smfi_stop.html,v 1.2 2003/11/24 23:38:26 ca Exp $
$Id: smfi_stop.html,v 1.3 2005/10/27 06:08:57 ca Exp $
-->
<h1>smfi_stop</h1>
@ -13,8 +13,8 @@ $Id: smfi_stop.html,v 1.2 2003/11/24 23:38:26 ca Exp $
#include &lt;libmilter/mfapi.h&gt;
int smfi_stop(void);
</pre>
Start an orderly shutdown of the milter. No connections will be accepted
after this call.
Shutdown the milter.
No connections will be accepted after this call.
</td></tr>
<!----------- Description ---------->
@ -27,10 +27,11 @@ or any error-handling routines at any time.</td>
</tr>
<tr align="left" valign=top>
<th width="80">Effects</th>
<td>The smfi_stop routine
causes each thread to finish its current connection, then exit.
When all threads have exited, the call
to <a href="smfi_main.html">smfi_main</a> returns to your calling program,
<td>The smfi_stop routine prevents that new connections
will be accepted,
however, it does not wait for existing connections (threads) to terminate.
It will cause
<a href="smfi_main.html">smfi_main</a> to return to the calling program,
which may then exit or warm-restart.
</td>
</tr>
@ -63,7 +64,7 @@ which may then exit or warm-restart.
<hr size="1">
<font size="-1">
Copyright (c) 2003 Sendmail, Inc. and its suppliers.
Copyright (c) 2003, 2005 Sendmail, Inc. and its suppliers.
All rights reserved.
<br>
By using this file, you agree to the terms and conditions set

View File

@ -2,7 +2,7 @@
<head><title>xxfi_helo</title></head>
<body>
<!--
$Id: xxfi_helo.html,v 1.8 2003/03/05 19:57:55 ca Exp $
$Id: xxfi_helo.html,v 1.9 2005/08/30 23:41:45 ca Exp $
-->
<h1>xxfi_helo</h1>
@ -24,8 +24,10 @@ Handle the HELO/EHLO command.
<table border="1" cellspacing=1 cellpadding=4>
<tr align="left" valign=top>
<th width="80">Called When</th> <td>xxfi_helo is called whenever the client
sends a HELO/EHLO command. It may therefore be called between zero and
three times</td>
sends a HELO/EHLO command.
It may therefore be called several times or even not at all;
some restrictions can be imposed by the MTA configuration.
</td>
</tr>
<tr align="left" valign=top>
<th>Default Behavior</th>
@ -52,7 +54,7 @@ three times</td>
<hr size="1">
<font size="-1">
Copyright (c) 2000, 2003 Sendmail, Inc. and its suppliers.
Copyright (c) 2000, 2003, 2005 Sendmail, Inc. and its suppliers.
All rights reserved.
<br>
By using this file, you agree to the terms and conditions set

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2003 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2003, 2006 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@ -19,7 +19,7 @@
#ifdef _DEFINE
# define EXTERN
# define INIT(x) = x
SM_IDSTR(MilterlId, "@(#)$Id: libmilter.h,v 8.50 2003/12/11 18:14:34 ca Exp $")
SM_IDSTR(MilterlId, "@(#)$Id: libmilter.h,v 8.51 2006/01/04 02:24:37 ca Exp $")
#else /* _DEFINE */
# define EXTERN extern
# define INIT(x)
@ -102,7 +102,7 @@ typedef pthread_mutex_t smutex_t;
# define FD_WR_INIT(sd, wrs) \
FD_ZERO(&(wrs)); \
FD_SET((unsigned int) (sd), &(wrs)); \
FD_SET((unsigned int) (sd), &(wrs))
# define FD_IS_RD_EXC(sd, rds, excs) FD_ISSET(sd, &(excs))
# define FD_IS_WR_RDY(sd, wrs) FD_ISSET((sd), &(wrs))

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2004 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2006 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@ -9,7 +9,7 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: listener.c,v 8.111 2004/09/20 21:11:15 msk Exp $")
SM_RCSID("@(#)$Id: listener.c,v 8.115 2006/01/24 00:48:39 ca Exp $")
/*
** listener.c -- threaded network listener
@ -458,11 +458,15 @@ mi_milteropen(conn, backlog, rmsocket, name)
return INVALID_SOCKET;
}
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *) &sockopt,
if (
#if NETUNIX
addr.sa.sa_family != AF_UNIX &&
#endif /* NETUNIX */
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *) &sockopt,
sizeof(sockopt)) == -1)
{
smi_log(SMI_LOG_ERR,
"%s: Unable to setsockopt: %s", name,
"%s: set reuseaddr failed (%s)", name,
sm_errstring(errno));
(void) closesocket(sock);
return INVALID_SOCKET;
@ -565,9 +569,6 @@ mi_thread_handle_wrapper(arg)
/*
** MI_CLOSENER -- close listen socket
**
** NOTE: It is assumed that this function is called from a
** function that has a mutex lock (currently mi_stop_milters()).
**
** Parameters:
** none.
**
@ -872,7 +873,8 @@ mi_listener(conn, dbg, smfi, timeout, backlog)
if (setsockopt(connfd, SOL_SOCKET, SO_KEEPALIVE,
(void *) &sockopt, sizeof sockopt) < 0)
{
smi_log(SMI_LOG_WARN, "%s: setsockopt() failed (%s)",
smi_log(SMI_LOG_WARN,
"%s: set keepalive failed (%s)",
smfi->xxfi_name, sm_errstring(errno));
/* XXX: continue? */
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2004 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2004, 2006 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@ -9,7 +9,7 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: signal.c,v 8.42 2004/08/20 21:10:30 ca Exp $")
SM_RCSID("@(#)$Id: signal.c,v 8.44 2006/03/03 03:42:04 ca Exp $")
#include "libmilter.h"
@ -90,7 +90,7 @@ static void *
mi_signal_thread(name)
void *name;
{
int sig, errs;
int sig, errs, sigerr;
sigset_t set;
(void) sigemptyset(&set);
@ -103,19 +103,23 @@ mi_signal_thread(name)
for (;;)
{
sig = 0;
sigerr = sig = 0;
#if defined(SOLARIS) || defined(__svr5__)
if ((sig = sigwait(&set)) < 0)
#else /* defined(SOLARIS) || defined(__svr5__) */
if (sigwait(&set, &sig) != 0)
if ((sigerr = sigwait(&set, &sig)) != 0)
#endif /* defined(SOLARIS) || defined(__svr5__) */
{
/* some OS return -1 and set errno: copy it */
if (sigerr <= 0)
sigerr = errno;
/* this can happen on OSF/1 (at least) */
if (errno == EINTR)
if (sigerr == EINTR)
continue;
smi_log(SMI_LOG_ERR,
"%s: sigwait returned error: %d",
(char *)name, errno);
(char *)name, sigerr);
if (++errs > MAX_FAILS_T)
{
mi_stop_milters(MILTER_ABRT);

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2004 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2005 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@ -9,7 +9,7 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: smfi.c,v 8.73 2004/09/20 21:26:57 ca Exp $")
SM_RCSID("@(#)$Id: smfi.c,v 8.74 2005/03/30 00:44:07 ca Exp $")
#include <sm/varargs.h>
#include "libmilter.h"
@ -242,7 +242,7 @@ smfi_replacebody(ctx, bodyp, bodylen)
/* split body chunk if necessary */
off = 0;
while (bodylen > 0)
do
{
len = (bodylen >= MILTER_CHUNK_SIZE) ? MILTER_CHUNK_SIZE :
bodylen;
@ -251,7 +251,7 @@ smfi_replacebody(ctx, bodyp, bodylen)
return r;
off += len;
bodylen -= len;
}
} while (bodylen > 0);
return MI_SUCCESS;
}

View File

@ -1,11 +1,11 @@
dnl $Id: Makefile.m4,v 1.68 2005/02/17 23:34:25 ca Exp $
dnl $Id: Makefile.m4,v 1.70 2005/12/22 18:31:11 ca Exp $
define(`confREQUIRE_LIBUNIX')
include(confBUILDTOOLSDIR`/M4/switch.m4')
define(`confREQUIRE_LIBSM', `true')
PREPENDDEF(`confENVDEF', `confMAPDEF')
bldPRODUCT_START(`library', `libsm')
define(`bldSOURCES', ` assert.c debug.c errstring.c exc.c heap.c match.c rpool.c strdup.c strerror.c strl.c clrerr.c fclose.c feof.c ferror.c fflush.c fget.c fpos.c findfp.c flags.c fopen.c fprintf.c fpurge.c fput.c fread.c fscanf.c fseek.c fvwrite.c fwalk.c fwrite.c get.c makebuf.c put.c refill.c rewind.c setvbuf.c smstdio.c snprintf.c sscanf.c stdio.c strio.c ungetc.c vasprintf.c vfprintf.c vfscanf.c vprintf.c vsnprintf.c wbuf.c wsetup.c string.c stringf.c xtrap.c strto.c test.c path.c strcasecmp.c strrevcmp.c signal.c clock.c config.c shm.c sem.c mbdb.c strexit.c cf.c ldap.c niprop.c mpeix.c ')
define(`bldSOURCES', ` assert.c debug.c errstring.c exc.c heap.c match.c rpool.c strdup.c strerror.c strl.c clrerr.c fclose.c feof.c ferror.c fflush.c fget.c fpos.c findfp.c flags.c fopen.c fprintf.c fpurge.c fput.c fread.c fscanf.c fseek.c fvwrite.c fwalk.c fwrite.c get.c makebuf.c put.c refill.c rewind.c setvbuf.c smstdio.c snprintf.c sscanf.c stdio.c strio.c ungetc.c vasprintf.c vfprintf.c vfscanf.c vprintf.c vsnprintf.c wbuf.c wsetup.c string.c stringf.c xtrap.c strto.c test.c path.c strcasecmp.c strrevcmp.c signal.c clock.c config.c shm.c sem.c mbdb.c strexit.c cf.c ldap.c niprop.c mpeix.c memstat.c ')
bldPRODUCT_END
dnl msg.c
dnl syslogio.c
@ -33,5 +33,6 @@ smtest(`t-cf')
smtest(`b-strcmp')
dnl SM_CONF_STRL cannot be turned off
dnl smtest(`b-strl')
smtest(`t-memstat')
bldFINISH

View File

@ -8,12 +8,12 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: b-strcmp.c,v 1.13 2004/08/03 20:07:59 ca Exp $")
SM_RCSID("@(#)$Id: b-strcmp.c,v 1.14 2005/06/14 23:07:20 ca Exp $")
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sm/time.h>
#include <sm/string.h>
#define toseconds(x, y) (x.tv_sec - y.tv_sec)

View File

@ -19,12 +19,12 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: b-strl.c,v 1.24 2001/09/11 04:04:47 gshapiro Exp $")
SM_RCSID("@(#)$Id: b-strl.c,v 1.25 2005/06/14 23:07:20 ca Exp $")
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sm/time.h>
#include <sm/string.h>
#define SRC_SIZE 512

View File

@ -12,12 +12,12 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: clock.c,v 1.46 2004/08/03 19:57:22 ca Exp $")
SM_RCSID("@(#)$Id: clock.c,v 1.47 2005/06/14 23:07:20 ca Exp $")
#include <unistd.h>
#include <time.h>
#include <errno.h>
#if SM_CONF_SETITIMER
# include <sys/time.h>
# include <sm/time.h>
#endif /* SM_CONF_SETITIMER */
#include <sm/heap.h>
#include <sm/debug.h>

View File

@ -13,10 +13,10 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: fclose.c,v 1.43 2004/08/03 20:17:38 ca Exp $")
SM_RCSID("@(#)$Id: fclose.c,v 1.44 2005/06/14 23:07:20 ca Exp $")
#include <errno.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sm/time.h>
#include <setjmp.h>
#include <sm/io.h>
#include <sm/assert.h>

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 2000-2001, 2005, 2006 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@ -13,10 +13,10 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: fflush.c,v 1.43 2001/09/11 04:04:48 gshapiro Exp $")
SM_RCSID("@(#)$Id: fflush.c,v 1.45 2006/03/03 22:25:00 ca Exp $")
#include <unistd.h>
#include <errno.h>
#include <sys/time.h>
#include <sm/time.h>
#include <signal.h>
#include <fcntl.h>
#include <string.h>
@ -145,6 +145,7 @@ sm_flush(fp, timeout)
return SM_IO_EOF;
}
SM_IO_WR_TIMEOUT(fp, fd, *timeout);
t = 0;
}
}
return 0;

View File

@ -13,10 +13,10 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: fopen.c,v 1.61 2004/08/03 20:17:38 ca Exp $")
SM_RCSID("@(#)$Id: fopen.c,v 1.62 2005/06/14 23:07:20 ca Exp $")
#include <errno.h>
#include <setjmp.h>
#include <sys/time.h>
#include <sm/time.h>
#include <sm/heap.h>
#include <sm/signal.h>
#include <sm/assert.h>

View File

@ -13,10 +13,10 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: fpos.c,v 1.38 2004/08/03 20:17:38 ca Exp $")
SM_RCSID("@(#)$Id: fpos.c,v 1.39 2005/06/14 23:07:20 ca Exp $")
#include <errno.h>
#include <setjmp.h>
#include <sys/time.h>
#include <sm/time.h>
#include <sm/heap.h>
#include <sm/signal.h>
#include <sm/clock.h>

View File

@ -13,14 +13,14 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: fseek.c,v 1.46 2004/08/03 20:17:38 ca Exp $")
SM_RCSID("@(#)$Id: fseek.c,v 1.47 2005/06/14 23:07:20 ca Exp $")
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <setjmp.h>
#include <sys/time.h>
#include <sm/time.h>
#include <sm/signal.h>
#include <sm/io.h>
#include <sm/assert.h>

View File

@ -8,7 +8,7 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: ldap.c,v 1.62 2005/02/24 00:30:01 ca Exp $")
SM_RCSID("@(#)$Id: ldap.c,v 1.67 2005/12/14 00:08:03 ca Exp $")
#if LDAPMAP
# include <sys/types.h>
@ -47,6 +47,18 @@ static SM_LDAP_RECURSE_ENTRY *sm_ldap_add_recurse __P((SM_LDAP_RECURSE_LIST **,
**
*/
#if _FFR_LDAP_VERSION
# if defined(LDAP_VERSION_MAX) && _FFR_LDAP_VERSION > LDAP_VERSION_MAX
ERROR FFR_LDAP_VERSION > _LDAP_VERSION_MAX
# endif /* defined(LDAP_VERSION_MAX) && _FFR_LDAP_VERSION > LDAP_VERSION_MAX */
# if defined(LDAP_VERSION_MIN) && _FFR_LDAP_VERSION < LDAP_VERSION_MIN
ERROR FFR_LDAP_VERSION < _LDAP_VERSION_MIN
# endif /* defined(LDAP_VERSION_MIN) && _FFR_LDAP_VERSION < LDAP_VERSION_MIN */
# define SM_LDAP_VERSION_DEFAULT _FFR_LDAP_VERSION
#else /* _FFR_LDAP_VERSION */
# define SM_LDAP_VERSION_DEFAULT 0
#endif /* _FFR_LDAP_VERSION */
void
sm_ldap_clear(lmap)
SM_LDAP_STRUCT *lmap;
@ -57,7 +69,7 @@ sm_ldap_clear(lmap)
lmap->ldap_host = NULL;
lmap->ldap_port = LDAP_PORT;
lmap->ldap_uri = NULL;
lmap->ldap_version = 0;
lmap->ldap_version = SM_LDAP_VERSION_DEFAULT;
lmap->ldap_deref = LDAP_DEREF_NEVER;
lmap->ldap_timelimit = LDAP_NO_LIMIT;
lmap->ldap_sizelimit = LDAP_NO_LIMIT;
@ -615,6 +627,16 @@ sm_ldap_results(lmap, msgid, flags, delim, rpool, result,
continue;
}
#if _FFR_LDAP_SINGLEDN
if (bitset(SM_LDAP_SINGLEDN, flags) && *result != NULL)
{
/* only wanted one match */
SM_LDAP_ERROR_CLEANUP();
errno = ENOENT;
return EX_NOTFOUND;
}
#endif /* _FFR_LDAP_SINGLEDN */
/* record completed DN's to prevent loops */
dn = ldap_get_dn(lmap->ldap_ld, entry);
if (dn == NULL)

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000-2002, 2004 Sendmail, Inc. and its suppliers.
* Copyright (c) 2000-2002, 2004-2006 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@ -11,7 +11,7 @@
* forth in the LICENSE file which can be found at the top level of
* the sendmail distribution.
*
* $Id: local.h,v 1.53 2004/01/09 18:34:22 ca Exp $
* $Id: local.h,v 1.57 2006/02/28 18:48:25 ca Exp $
*/
/*
@ -19,7 +19,7 @@
** in particular, macros and private variables.
*/
#include <sys/time.h>
#include <sm/time.h>
#if !SM_CONF_MEMCHR
# include <memory.h>
#endif /* !SM_CONF_MEMCHR */
@ -75,42 +75,6 @@ int sm_syslogopen __P((SM_FILE_T *, const void *, int, const void *));
int sm_syslogsetinfo __P((SM_FILE_T *, int , void *));
int sm_sysloggetinfo __P((SM_FILE_T *, int , void *));
/* should be defined in sys/time.h */
#ifndef timersub
# define timersub(tvp, uvp, vvp) \
do \
{ \
(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \
(vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \
if ((vvp)->tv_usec < 0) \
{ \
(vvp)->tv_sec--; \
(vvp)->tv_usec += 1000000; \
} \
} while (0)
#endif /* !timersub */
#ifndef timeradd
# define timeradd(tvp, uvp, vvp) \
do \
{ \
(vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \
(vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \
if ((vvp)->tv_usec >= 1000000) \
{ \
(vvp)->tv_sec++; \
(vvp)->tv_usec -= 1000000; \
} \
} while (0)
#endif /* !timeradd */
#ifndef timercmp
# define timercmp(tvp, uvp, cmp) \
(((tvp)->tv_sec == (uvp)->tv_sec) ? \
((tvp)->tv_usec cmp (uvp)->tv_usec) : \
((tvp)->tv_sec cmp (uvp)->tv_sec))
#endif /* !timercmp */
extern bool Sm_IO_DidInit;
/* Return true iff the given SM_FILE_T cannot be written now. */
@ -192,7 +156,7 @@ extern const char SmFileMagic[];
else \
{ \
(time)->tv_sec = (val) / 1000; \
(time)->tv_usec = ((val) - ((time)->tv_sec * 1000)) * 10; \
(time)->tv_usec = ((val) - ((time)->tv_sec * 1000)) * 1000; \
} \
if ((val) == SM_TIME_FOREVER) \
{ \
@ -276,7 +240,7 @@ extern const char SmFileMagic[];
else \
{ \
sm_io_to.tv_sec = (to) / 1000; \
sm_io_to.tv_usec = ((to) - (sm_io_to.tv_sec * 1000)) * 10; \
sm_io_to.tv_usec = ((to) - (sm_io_to.tv_sec * 1000)) * 1000; \
} \
if (FD_SETSIZE > 0 && (fd) >= FD_SETSIZE) \
{ \
@ -289,8 +253,11 @@ extern const char SmFileMagic[];
FD_SET((fd), &sm_io_x_mask); \
if (gettimeofday(&sm_io_to_before, NULL) < 0) \
return SM_IO_EOF; \
sm_io_to_sel = select((fd) + 1, NULL, &sm_io_to_mask, &sm_io_x_mask, \
&sm_io_to); \
do \
{ \
sm_io_to_sel = select((fd) + 1, NULL, &sm_io_to_mask, \
&sm_io_x_mask, &sm_io_to); \
} while (sm_io_to_sel < 0 && errno == EINTR); \
if (sm_io_to_sel < 0) \
{ \
/* something went wrong, errno set */ \
@ -305,10 +272,9 @@ extern const char SmFileMagic[];
/* else loop again */ \
if (gettimeofday(&sm_io_to_after, NULL) < 0) \
return SM_IO_EOF; \
timersub(&sm_io_to_before, &sm_io_to_after, &sm_io_to_diff); \
timersub(&sm_io_to, &sm_io_to_diff, &sm_io_to); \
(to) -= (sm_io_to.tv_sec * 1000); \
(to) -= (sm_io_to.tv_usec / 10); \
timersub(&sm_io_to_after, &sm_io_to_before, &sm_io_to_diff); \
(to) -= (sm_io_to_diff.tv_sec * 1000); \
(to) -= (sm_io_to_diff.tv_usec / 1000); \
if ((to) < 0) \
(to) = 0; \
}

View File

@ -0,0 +1,333 @@
/*
* Copyright (c) 2005 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.
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: memstat.c,v 1.4 2005/12/10 00:38:48 ca Exp $")
#include <errno.h>
#if USESWAPCTL
#include <sys/stat.h>
#include <sys/swap.h>
static long sc_page_size;
/*
** SM_MEMSTAT_OPEN -- open memory statistics
**
** Parameters:
** none
**
** Results:
** errno as error code, 0: ok
*/
int
sm_memstat_open()
{
sc_page_size = sysconf(_SC_PAGE_SIZE);
if (sc_page_size == -1)
return (errno != 0) ? errno : -1;
return 0;
}
/*
** SM_MEMSTAT_CLOSE -- close memory statistics
**
** Parameters:
** none
**
** Results:
** errno as error code, 0: ok
*/
int
sm_memstat_close()
{
return 0;
}
/*
** SM_MEMSTAT_GET -- get memory statistics
**
** Parameters:
** resource -- resource to look up
** pvalue -- (pointer to) memory statistics value (output)
**
** Results:
** 0: success
** !=0: error
*/
int
sm_memstat_get(resource, pvalue)
char *resource;
long *pvalue;
{
int r;
struct anoninfo ai;
r = swapctl(SC_AINFO, &ai);
if (r == -1)
return (errno != 0) ? errno : -1;
r = ai.ani_max - ai.ani_resv;
r *= sc_page_size >> 10;
*pvalue = r;
return 0;
}
#elif USEKSTAT
#include <kstat.h>
#include <sys/sysinfo.h>
static kstat_ctl_t *kc;
static kstat_t *kst;
/*
** SM_MEMSTAT_OPEN -- open memory statistics
**
** Parameters:
** none
**
** Results:
** errno as error code, 0: ok
*/
int
sm_memstat_open()
{
kstat_named_t *kn;
kc = kstat_open();
if (kc == NULL)
return (errno != 0) ? errno : -1;
kst = kstat_lookup(kc, "unix", 0,
(name != NULL) ? name : "system_pages");
if (kst == 0)
return (errno != 0) ? errno : -2;
return 0;
}
/*
** SM_MEMSTAT_CLOSE -- close memory statistics
**
** Parameters:
** none
**
** Results:
** errno as error code, 0: ok
*/
int
sm_memstat_close()
{
int r;
if (kc == NULL)
return 0;
r = kstat_close(kc);
if (r != 0)
return (errno != 0) ? errno : -1;
return 0;
}
/*
** SM_MEMSTAT_GET -- get memory statistics
**
** Parameters:
** resource -- resource to look up
** pvalue -- (pointer to) memory statistics value (output)
**
** Results:
** 0: success
** !=0: error
*/
int
sm_memstat_get(resource, pvalue)
char *resource;
long *pvalue;
{
int r;
kstat_named_t *kn;
if (kc == NULL || kst == NULL)
return -1;
if (kstat_read(kc, kst, NULL) == -1)
return (errno != 0) ? errno : -2;
kn = kstat_data_lookup(kst,
(resource != NULL) ? resource: "freemem");
if (kn == NULL)
return (errno != 0) ? errno : -3;
*pvalue = kn->value.ul;
return 0;
}
#elif USEPROCMEMINFO
/*
/proc/meminfo?
total: used: free: shared: buffers: cached:
Mem: 261468160 252149760 9318400 0 3854336 109813760
Swap: 1052794880 62185472 990609408
MemTotal: 255340 kB
MemFree: 9100 kB
MemShared: 0 kB
Buffers: 3764 kB
Cached: 107240 kB
Active: 104340 kB
Inact_dirty: 4220 kB
Inact_clean: 2444 kB
Inact_target: 4092 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 255340 kB
LowFree: 9100 kB
SwapTotal: 1028120 kB
SwapFree: 967392 kB
*/
#include <stdio.h>
#include <string.h>
static FILE *fp;
/*
** SM_MEMSTAT_OPEN -- open memory statistics
**
** Parameters:
** none
**
** Results:
** errno as error code, 0: ok
*/
int
sm_memstat_open()
{
fp = fopen("/proc/meminfo", "r");
return (fp != NULL) ? 0 : errno;
}
/*
** SM_MEMSTAT_CLOSE -- close memory statistics
**
** Parameters:
** none
**
** Results:
** errno as error code, 0: ok
*/
int
sm_memstat_close()
{
if (fp != NULL)
{
fclose(fp);
fp = NULL;
}
return 0;
}
/*
** SM_MEMSTAT_GET -- get memory statistics
**
** Parameters:
** resource -- resource to look up
** pvalue -- (pointer to) memory statistics value (output)
**
** Results:
** 0: success
** !=0: error
*/
int
sm_memstat_get(resource, pvalue)
char *resource;
long *pvalue;
{
int r;
size_t l;
char buf[80];
if (resource == NULL)
return EINVAL;
if (pvalue == NULL)
return EINVAL;
if (fp == NULL)
return -1; /* try to reopen? */
rewind(fp);
l = strlen(resource);
while (fgets(buf, sizeof(buf), fp) != NULL)
{
if (strncmp(buf, resource, l) == 0 && buf[l] == ':')
{
r = sscanf(buf + l + 1, "%ld", pvalue);
return (r > 0) ? 0 : -1;
}
}
return 0;
}
#else /* USEPROCMEMINFO */
/*
** SM_MEMSTAT_OPEN -- open memory statistics
**
** Parameters:
** none
**
** Results:
** errno as error code, 0: ok
*/
int
sm_memstat_open()
{
return -1;
}
/*
** SM_MEMSTAT_CLOSE -- close memory statistics
**
** Parameters:
** none
**
** Results:
** errno as error code, 0: ok
*/
int
sm_memstat_close()
{
return 0;
}
/*
** SM_MEMSTAT_GET -- get memory statistics
**
** Parameters:
** resource -- resource to look up
** pvalue -- (pointer to) memory statistics value (output)
**
** Results:
** 0: success
** !=0: error
*/
int
sm_memstat_get(resource, pvalue)
char *resource;
long *pvalue;
{
return -1;
}
#endif /* USEKSTAT */

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 2000-2001, 2005-2006 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@ -13,13 +13,13 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: refill.c,v 1.50 2002/09/09 21:50:10 gshapiro Exp $")
SM_RCSID("@(#)$Id: refill.c,v 1.53 2006/02/28 18:48:25 ca Exp $")
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <setjmp.h>
#include <signal.h>
#include <sys/time.h>
#include <sm/time.h>
#include <fcntl.h>
#include <string.h>
#include <sm/io.h>
@ -76,8 +76,11 @@ static int sm_lflush __P((SM_FILE_T *, int *));
FD_SET((fd), &sm_io_x_mask); \
if (gettimeofday(&sm_io_to_before, NULL) < 0) \
return SM_IO_EOF; \
(sel_ret) = select((fd) + 1, &sm_io_to_mask, NULL, \
&sm_io_x_mask, (to)); \
do \
{ \
(sel_ret) = select((fd) + 1, &sm_io_to_mask, NULL, \
&sm_io_x_mask, (to)); \
} while ((sel_ret) < 0 && errno == EINTR); \
if ((sel_ret) < 0) \
{ \
/* something went wrong, errno set */ \
@ -94,7 +97,7 @@ static int sm_lflush __P((SM_FILE_T *, int *));
/* calulate wall-clock time used */ \
if (gettimeofday(&sm_io_to_after, NULL) < 0) \
return SM_IO_EOF; \
timersub(&sm_io_to_before, &sm_io_to_after, &sm_io_to_diff); \
timersub(&sm_io_to_after, &sm_io_to_before, &sm_io_to_diff); \
timersub((to), &sm_io_to_diff, (to)); \
}

View File

@ -8,13 +8,14 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: sem.c,v 1.12 2005/03/25 21:27:02 ca Exp $")
SM_RCSID("@(#)$Id: sem.c,v 1.13 2005/08/12 20:39:59 ca Exp $")
#if SM_CONF_SEM
# include <stdlib.h>
# include <unistd.h>
# include <sm/sem.h>
# include <sm/heap.h>
# include <errno.h>
/*
** SM_SEM_START -- initialize semaphores
@ -37,7 +38,7 @@ sm_sem_start(key, nsem, semflg, owner)
int semflg;
bool owner;
{
int semid, i;
int semid, i, err;
unsigned short *semvals;
semvals = NULL;
@ -67,11 +68,12 @@ sm_sem_start(key, nsem, semflg, owner)
return semid;
error:
err = errno;
if (semvals != NULL)
sm_free(semvals);
if (semid >= 0)
sm_sem_stop(semid);
return -1;
return (err > 0) ? (0 - err) : -1;
}
/*

View File

@ -8,12 +8,13 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: shm.c,v 1.18 2005/02/09 01:54:51 ca Exp $")
SM_RCSID("@(#)$Id: shm.c,v 1.19 2005/07/14 22:34:28 ca Exp $")
#if SM_CONF_SHM
# include <stdlib.h>
# include <unistd.h>
# include <errno.h>
# include <sm/string.h>
# include <sm/shm.h>

View File

@ -8,10 +8,10 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: signal.c,v 1.16 2001/09/11 04:04:49 gshapiro Exp $")
SM_RCSID("@(#)$Id: signal.c,v 1.17 2005/06/14 23:07:20 ca Exp $")
#if SM_CONF_SETITIMER
# include <sys/time.h>
# include <sm/time.h>
#endif /* SM_CONF_SETITIMER */
#include <errno.h>
#include <stdlib.h>

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000-2004 Sendmail, Inc. and its suppliers.
* Copyright (c) 2000-2005 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@ -13,13 +13,13 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: stdio.c,v 1.69 2004/08/03 20:46:34 ca Exp $")
SM_RCSID("@(#)$Id: stdio.c,v 1.71 2005/06/14 23:07:20 ca Exp $")
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h> /* FreeBSD: FD_ZERO needs <string.h> */
#include <sys/stat.h>
#include <sys/time.h>
#include <sm/time.h>
#include <sm/heap.h>
#include <sm/assert.h>
#include <sm/varargs.h>
@ -221,7 +221,7 @@ sm_stdclose(fp)
** Failure: -1 and sets errno
*/
int
static int
sm_stdsetmode(fp, mode)
SM_FILE_T *fp;
const int *mode;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000-2002, 2004 Sendmail, Inc. and its suppliers.
* Copyright (c) 2000-2002, 2004, 2005 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@ -13,7 +13,7 @@
*/
#include <sm/gen.h>
SM_IDSTR(id, "@(#)$Id: strio.c,v 1.43 2004/08/03 20:48:30 ca Exp $")
SM_IDSTR(id, "@(#)$Id: strio.c,v 1.44 2005/06/09 21:40:19 ca Exp $")
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
@ -359,7 +359,7 @@ sm_strsetmode(fp, mode)
** Failure: -1 and sets errno
*/
int
static int
sm_strgetmode(fp, mode)
SM_FILE_T *fp;
int *mode;

View File

@ -8,7 +8,7 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: t-event.c,v 1.12 2004/08/03 20:50:32 ca Exp $")
SM_RCSID("@(#)$Id: t-event.c,v 1.13 2005/06/14 23:07:20 ca Exp $")
#include <stdio.h>
@ -16,7 +16,7 @@ SM_RCSID("@(#)$Id: t-event.c,v 1.12 2004/08/03 20:50:32 ca Exp $")
#include <unistd.h>
# include <sys/wait.h>
#if SM_CONF_SETITIMER
# include <sys/time.h>
# include <sm/time.h>
#endif /* SM_CONF_SETITIMER */
#include <sm/clock.h>

View File

@ -0,0 +1,91 @@
/*
* Copyright (c) 2005 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.
*/
#include <sm/gen.h>
SM_IDSTR(id, "@(#)$Id: t-memstat.c,v 1.5 2005/12/22 19:05:42 ca Exp $")
/*
** Simple test program for memstat
*/
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <strings.h>
int
main(argc, argv)
int argc;
char **argv;
{
int r, r2, i, l, slp, sz;
long v;
char *resource;
l = 1;
sz = slp = 0;
resource = NULL;
while ((r = getopt(argc, argv, "l:m:r:s:")) != -1)
{
switch ((char) r)
{
case 'l':
l = strtol(optarg, NULL, 0);
break;
case 'm':
sz = strtol(optarg, NULL, 0);
break;
case 'r':
resource = strdup(optarg);
break;
case 's':
slp = strtol(optarg, NULL, 0);
break;
default:
break;
}
}
r = sm_memstat_open();
r2 = -1;
for (i = 0; i < l; i++)
{
char *mem;
r2 = sm_memstat_get(resource, &v);
if (slp > 0 && i + 1 < l && 0 == r)
{
printf("open=%d, memstat=%d, %s=%ld\n", r, r2,
resource != NULL ? resource : "default-value",
v);
sleep(slp);
if (sz > 0)
{
/*
** Just allocate some memory to test the
** values that are returned.
** Note: this is a memory leak, but that
** doesn't matter here.
*/
mem = malloc(sz);
if (NULL == mem)
printf("malloc(%d) failed\n", sz);
}
}
}
printf("open=%d, memstat=%d, %s=%ld\n", r, r2,
resource != NULL ? resource : "default-value", v);
r = sm_memstat_close();
return r;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 2000-2001, 2005-2006 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@ -8,7 +8,7 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: t-sem.c,v 1.14 2005/03/25 21:27:41 ca Exp $")
SM_RCSID("@(#)$Id: t-sem.c,v 1.15 2006/03/13 20:40:43 msk Exp $")
#include <stdio.h>
@ -307,7 +307,7 @@ main(argc, argv)
pid_t pid;
printf("This test takes about 8 seconds.\n");
printf("If it takes longer than 30 second, please interrupt it\n");
printf("If it takes longer than 30 seconds, please interrupt it\n");
printf("and compile again without semaphore support, i.e.,");
printf("-DSM_CONF_SEM=0\n");
if ((pid = fork()) < 0)

View File

@ -13,12 +13,12 @@
*/
#include <sm/gen.h>
SM_IDSTR(id, "@(#)$Id: ungetc.c,v 1.29 2004/08/03 20:54:49 ca Exp $")
SM_IDSTR(id, "@(#)$Id: ungetc.c,v 1.30 2005/06/14 23:07:20 ca Exp $")
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/time.h>
#include <sm/time.h>
#include <errno.h>
#include <sm/io.h>
#include <sm/heap.h>

View File

@ -13,7 +13,7 @@
*/
#include <sm/gen.h>
SM_IDSTR(id, "@(#)$Id: vfprintf.c,v 1.53 2004/08/03 20:54:49 ca Exp $")
SM_IDSTR(id, "@(#)$Id: vfprintf.c,v 1.54 2005/05/16 03:52:00 ca Exp $")
/*
** Overall:
@ -535,9 +535,19 @@ reswitch: switch (ch)
if (prec > 120)
prec = 120;
if (prec >= 0)
#if HASSNPRINTF
snprintf(out, sizeof(out), fmt, width,
prec, val);
#else /* HASSNPRINTF */
sprintf(out, fmt, width, prec, val);
#endif /* HASSNPRINTF */
else
#if HASSNPRINTF
snprintf(out, sizeof(out), fmt, width,
val);
#else /* HASSNPRINTF */
sprintf(out, fmt, width, val);
#endif /* HASSNPRINTF */
len = strlen(out);
PRINT(out, len);
FLUSH();

View File

@ -13,13 +13,13 @@
*/
#include <sm/gen.h>
SM_IDSTR(id, "@(#)$Id: vfscanf.c,v 1.52 2004/08/03 20:56:32 ca Exp $")
SM_IDSTR(id, "@(#)$Id: vfscanf.c,v 1.53 2005/06/14 23:07:20 ca Exp $")
#include <ctype.h>
#include <stdlib.h>
#include <errno.h>
#include <setjmp.h>
#include <sys/time.h>
#include <sm/time.h>
#include <sm/varargs.h>
#include <sm/config.h>
#include <sm/io.h>

View File

@ -9,7 +9,7 @@
# the sendmail distribution.
#
#
# $Id: README,v 8.386 2005/03/04 23:24:08 ca Exp $
# $Id: README,v 8.388 2005/07/26 05:45:39 ca Exp $
#
This directory contains the source files for sendmail(TM).
@ -502,6 +502,12 @@ NEEDINTERRNO Set this if <errno.h> does not declare errno, i.e., if an
extern int errno;
USE_TTYPATH Set this to 1 to enable ErrorMode=write.
USESYSCTL Use sysctl(3) to determine the number of CPUs in a system.
HASSNPRINTF Set this to 1 if your OS has a working snprintf(3), i.e.,
it properly obeys the size of the buffer and returns the
number of characters that would have been printed if the
size were unlimited.
LDAP_REFERRALS Set this if you want to use the -R flag (do not auto chase
referrals) for LDAP maps (requires -DLDAPMAP).
+-----------------------+
@ -1826,4 +1832,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.386 $, last update $Date: 2005/03/04 23:24:08 $ )
(Version $Revision: 8.388 $, last update $Date: 2005/07/26 05:45:39 $ )

View File

@ -1,4 +1,4 @@
# $Id: TRACEFLAGS,v 8.43 2005/02/16 23:38:51 ca Exp $
# $Id: TRACEFLAGS,v 8.44 2006/02/27 18:52:41 ca Exp $
0, 4 main.c main canonical name, UUCP node name, a.k.a.s
0, 15 main.c main print configuration
0, 44 util.c printav print address of each string
@ -86,6 +86,8 @@
73 queue.c shared memory updates
80 content length
81 sun remote mode
83 collect.c timeout
84 deliver.c timeout
91 mci.c syslogging of MCI cache information
93,>99 * Prevent daemon connection fork for profiling/debugging
94,>99 srvrsmtp.c cause commands to fail (for protocol testing)

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2004 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2006 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -13,9 +13,8 @@
#include <sendmail.h>
SM_RCSID("@(#)$Id: collect.c,v 8.261 2005/02/16 23:38:51 ca Exp $")
SM_RCSID("@(#)$Id: collect.c,v 8.272 2006/03/02 19:09:26 ca Exp $")
static void collecttimeout __P((int));
static void eatfrom __P((char *volatile, ENVELOPE *));
static void collect_doheader __P((ENVELOPE *));
static SM_FILE_T *collect_dfopen __P((ENVELOPE *));
@ -263,10 +262,6 @@ collect_dfopen(e)
** If data file cannot be created, the process is terminated.
*/
static jmp_buf CtxCollectTimeout;
static bool volatile CollectProgress;
static SM_EVENT *volatile CollectTimeout = NULL;
/* values for input state machine */
#define IS_NORM 0 /* middle of line */
#define IS_BOL 1 /* beginning of line */
@ -288,27 +283,31 @@ collect(fp, smtpmode, hdrp, e, rsetsize)
register ENVELOPE *e;
bool rsetsize;
{
register SM_FILE_T *volatile df;
volatile bool ignrdot;
volatile int dbto;
register char *volatile bp;
volatile int c;
volatile bool inputerr;
register SM_FILE_T *df;
bool ignrdot;
int dbto;
register char *bp;
int c;
bool inputerr;
bool headeronly;
char *volatile buf;
volatile int buflen;
volatile int istate;
volatile int mstate;
volatile int hdrslen;
volatile int numhdrs;
volatile int afd;
unsigned char *volatile pbp;
char *buf;
int buflen;
int istate;
int mstate;
int hdrslen;
int numhdrs;
int afd;
unsigned char *pbp;
unsigned char peekbuf[8];
char bufbuf[MAXLINE];
df = NULL;
ignrdot = smtpmode ? false : IgnrDot;
dbto = smtpmode ? (int) TimeOuts.to_datablock : 0;
/* timeout for I/O functions is in milliseconds */
dbto = smtpmode ? ((int) TimeOuts.to_datablock * 1000)
: SM_TIME_FOREVER;
sm_io_setinfo(fp, SM_IO_WHAT_TIMEOUT, &dbto);
c = SM_IO_EOF;
inputerr = false;
headeronly = hdrp != NULL;
@ -320,7 +319,6 @@ collect(fp, smtpmode, hdrp, e, rsetsize)
pbp = peekbuf;
istate = IS_BOL;
mstate = SaveFrom ? MS_HEADER : MS_UFROM;
CollectProgress = false;
/*
** Tell ARPANET to go ahead.
@ -329,6 +327,10 @@ collect(fp, smtpmode, hdrp, e, rsetsize)
if (smtpmode)
message("354 Enter mail, end with \".\" on a line by itself");
/* simulate an I/O timeout when used as sink */
if (tTd(83, 101))
sleep(319);
if (tTd(30, 2))
sm_dprintf("collect\n");
@ -341,32 +343,6 @@ collect(fp, smtpmode, hdrp, e, rsetsize)
** the larger picture (e.g., header versus body).
*/
if (dbto != 0)
{
/* handle possible input timeout */
if (setjmp(CtxCollectTimeout) != 0)
{
if (LogLevel > 2)
sm_syslog(LOG_NOTICE, e->e_id,
"timeout waiting for input from %s during message collect",
CURHOSTNAME);
errno = 0;
if (smtpmode)
{
/*
** Override e_message in usrerr() as this
** is the reason for failure that should
** be logged for undelivered recipients.
*/
e->e_message = NULL;
}
usrerr("451 4.4.1 timeout waiting for input during message collect");
goto readerr;
}
CollectTimeout = sm_setevent(dbto, collecttimeout, dbto);
}
if (rsetsize)
e->e_msgsize = 0;
for (;;)
@ -390,9 +366,26 @@ collect(fp, smtpmode, hdrp, e, rsetsize)
sm_io_clearerr(fp);
continue;
}
/* timeout? */
if (c == SM_IO_EOF && errno == EAGAIN
&& smtpmode)
{
/*
** Override e_message in
** usrerr() as this is the
** reason for failure that
** should be logged for
** undelivered recipients.
*/
e->e_message = NULL;
errno = 0;
inputerr = true;
goto readabort;
}
break;
}
CollectProgress = true;
if (TrafficLogFile != NULL && !headeronly)
{
if (istate == IS_BOL)
@ -446,7 +439,8 @@ collect(fp, smtpmode, hdrp, e, rsetsize)
OpMode != MD_ARPAFTP))
{
SM_ASSERT(pbp < peekbuf + sizeof(peekbuf));
SM_ASSERT(pbp < peekbuf +
sizeof(peekbuf));
*pbp++ = c;
c = '.';
}
@ -458,7 +452,8 @@ collect(fp, smtpmode, hdrp, e, rsetsize)
else
{
/* push back the ".\rx" */
SM_ASSERT(pbp < peekbuf + sizeof(peekbuf));
SM_ASSERT(pbp < peekbuf +
sizeof(peekbuf));
*pbp++ = c;
if (OpMode != MD_SMTP &&
OpMode != MD_DAEMON &&
@ -538,6 +533,18 @@ collect(fp, smtpmode, hdrp, e, rsetsize)
buflen *= 2;
else
buflen += MEMCHUNKSIZE;
if (buflen <= 0)
{
sm_syslog(LOG_NOTICE, e->e_id,
"header overflow from %s during message collect",
CURHOSTNAME);
errno = 0;
e->e_flags |= EF_CLRQUEUE;
e->e_status = "5.6.0";
usrerrenh(e->e_status,
"552 Headers too large");
goto discard;
}
buf = xalloc(buflen);
memmove(buf, obuf, bp - obuf);
bp = &buf[bp - obuf];
@ -581,6 +588,7 @@ collect(fp, smtpmode, hdrp, e, rsetsize)
usrerrenh(e->e_status,
"552 Headers too large (%d max)",
MaxHeadersLength);
discard:
mstate = MS_DISCARD;
}
}
@ -620,6 +628,24 @@ collect(fp, smtpmode, hdrp, e, rsetsize)
sm_io_clearerr(fp);
errno = 0;
c = sm_io_getc(fp, SM_TIME_DEFAULT);
/* timeout? */
if (c == SM_IO_EOF && errno == EAGAIN
&& smtpmode)
{
/*
** Override e_message in
** usrerr() as this is the
** reason for failure that
** should be logged for
** undelivered recipients.
*/
e->e_message = NULL;
errno = 0;
inputerr = true;
goto readabort;
}
} while (c == SM_IO_EOF && errno == EINTR);
if (c != SM_IO_EOF)
(void) sm_io_ungetc(fp, SM_TIME_DEFAULT, c);
@ -629,8 +655,12 @@ collect(fp, smtpmode, hdrp, e, rsetsize)
continue;
}
/* trim off trailing CRLF or NL */
SM_ASSERT(bp > buf);
/* guaranteed by isheader(buf) */
SM_ASSERT(*(bp - 1) != '\n' || bp > buf + 1);
/* trim off trailing CRLF or NL */
if (*--bp != '\n' || *--bp != '\r')
bp++;
*bp = '\0';
@ -696,10 +726,6 @@ collect(fp, smtpmode, hdrp, e, rsetsize)
inputerr = true;
}
/* reset global timer */
if (CollectTimeout != NULL)
sm_clrevent(CollectTimeout);
if (headeronly)
return;
@ -786,6 +812,7 @@ collect(fp, smtpmode, hdrp, e, rsetsize)
}
/* An EOF when running SMTP is an error */
readabort:
if (inputerr && (OpMode == MD_SMTP || OpMode == MD_DAEMON))
{
char *host;
@ -808,13 +835,14 @@ collect(fp, smtpmode, hdrp, e, rsetsize)
problem, host,
shortenstring(e->e_from.q_paddr, MAXSHORTSTR));
if (sm_io_eof(fp))
usrerr("451 4.4.1 collect: %s on connection from %s, from=%s",
usrerr("421 4.4.1 collect: %s on connection from %s, from=%s",
problem, host,
shortenstring(e->e_from.q_paddr, MAXSHORTSTR));
else
syserr("451 4.4.1 collect: %s on connection from %s, from=%s",
syserr("421 4.4.1 collect: %s on connection from %s, from=%s",
problem, host,
shortenstring(e->e_from.q_paddr, MAXSHORTSTR));
flush_errors(true);
/* don't return an error indication */
e->e_to = NULL;
@ -907,39 +935,6 @@ collect(fp, smtpmode, hdrp, e, rsetsize)
}
}
static void
collecttimeout(timeout)
int timeout;
{
int save_errno = errno;
/*
** NOTE: THIS CAN BE CALLED FROM A SIGNAL HANDLER. DO NOT ADD
** ANYTHING TO THIS ROUTINE UNLESS YOU KNOW WHAT YOU ARE
** DOING.
*/
if (CollectProgress)
{
/* reset the timeout */
CollectTimeout = sm_sigsafe_setevent(timeout, collecttimeout,
timeout);
CollectProgress = false;
}
else
{
/* event is done */
CollectTimeout = NULL;
}
/* if no progress was made or problem resetting event, die now */
if (CollectTimeout == NULL)
{
errno = ETIMEDOUT;
longjmp(CtxCollectTimeout, 1);
}
errno = save_errno;
}
/*
** DFERROR -- signal error on writing the data file.
**

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2005 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2006 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 @@
#include <sendmail.h>
SM_RCSID("@(#)$Id: daemon.c,v 8.658 2005/02/02 18:19:28 ca Exp $")
SM_RCSID("@(#)$Id: daemon.c,v 8.665 2006/03/02 19:12:00 ca Exp $")
#if defined(SOCK_STREAM) || defined(__GNU_LIBRARY__)
# define USE_SOCK_STREAM 1
@ -34,7 +34,7 @@ SM_RCSID("@(#)$Id: daemon.c,v 8.658 2005/02/02 18:19:28 ca Exp $")
# include <openssl/rand.h>
#endif /* STARTTLS */
#include <sys/time.h>
#include <sm/time.h>
#if IP_SRCROUTE && NETINET
# include <netinet/in_systm.h>
@ -90,9 +90,6 @@ typedef struct daemon DAEMON_T;
#define SAFE_NOTSET (-1) /* SuperSafe (per daemon) option not set */
/* see also sendmail.h: SuperSafe values */
#define DM_NOTSET (-1) /* DeliveryMode (per daemon) option not set */
/* see also sendmail.h: values for e_sendmode -- send modes */
static void connecttimeout __P((int));
static int opendaemonsocket __P((DAEMON_T *, bool));
static unsigned short setupdaemon __P((SOCKADDR *));
@ -390,8 +387,8 @@ getrequests(e)
#endif /* _FFR_QUEUE_RUN_PARANOIA */
}
#if _FFR_QUEUE_RUN_PARANOIA
else if (QueueIntvl > 0 &&
lastrun + QueueIntvl + 60 < now)
else if (CheckQueueRunners > 0 && QueueIntvl > 0 &&
lastrun + QueueIntvl + CheckQueueRunners < now)
{
/*
@ -764,7 +761,6 @@ getrequests(e)
set_delivery_mode(
Daemons[curdaemon].d_dm, e);
#endif /* _FFR_DM_PER_DAEMON */
sm_setproctitle(true, e, "startup with %s",
anynet_ntoa(&RealHostAddr));
@ -1455,6 +1451,12 @@ setsockaddroptions(p, d)
if (d->d_addr.sa.sa_family == AF_UNSPEC)
d->d_addr.sa.sa_family = AF_INET;
#endif /* NETINET */
#if _FFR_SS_PER_DAEMON
d->d_supersafe = SAFE_NOTSET;
#endif /* _FFR_SS_PER_DAEMON */
#if _FFR_DM_PER_DAEMON
d->d_dm = DM_NOTSET;
#endif /* _FFR_DM_PER_DAEMON */
while (p != NULL)
{
@ -1476,12 +1478,6 @@ setsockaddroptions(p, d)
continue;
if (isascii(*f) && islower(*f))
*f = toupper(*f);
#if _FFR_SS_PER_DAEMON
d->d_supersafe = SAFE_NOTSET;
#endif /* _FFR_SS_PER_DAEMON */
#if _FFR_DM_PER_DAEMON
d->d_dm = DM_NOTSET;
#endif /* _FFR_DM_PER_DAEMON */
switch (*f)
{
@ -1496,7 +1492,7 @@ setsockaddroptions(p, d)
case SM_QUEUE:
case SM_DEFER:
case SM_DELIVER:
case SM_FORK:
case SM_FORK:
d->d_dm = *v;
break;
default:

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2005 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2006 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -12,9 +12,9 @@
*/
#include <sendmail.h>
#include <sys/time.h>
#include <sm/time.h>
SM_RCSID("@(#)$Id: deliver.c,v 8.986 2005/03/05 02:28:50 ca Exp $")
SM_RCSID("@(#)$Id: deliver.c,v 8.1000 2006/03/02 01:37:39 ca Exp $")
#if HASSETUSERCONTEXT
# include <login_cap.h>
@ -1201,13 +1201,13 @@ should_try_fbsh(e, tried_fallbacksmarthost, hostbuf, hbsz, status)
int status;
{
/*
** If the host was not found and a FallbackSmartHost is defined
** (and we have not yet tried it), then make one last try with
** it as the host.
** If the host was not found or a temporary failure occurred
** and a FallbackSmartHost is defined (and we have not yet
** tried it), then make one last try with it as the host.
*/
if (status == EX_NOHOST && FallbackSmartHost != NULL &&
!*tried_fallbacksmarthost)
if ((status == EX_NOHOST || status == EX_TEMPFAIL) &&
FallbackSmartHost != NULL && !*tried_fallbacksmarthost)
{
*tried_fallbacksmarthost = true;
expand(FallbackSmartHost, hostbuf, hbsz, e);
@ -2992,6 +2992,9 @@ deliver(e, firstto)
case EX_SOFTWARE:
s = "SOFTWARE";
break;
case EX_UNAVAILABLE:
s = "NONE";
break;
/* everything else is a failure */
default:
@ -3257,16 +3260,33 @@ deliver(e, firstto)
}
else if (!clever)
{
bool ok;
/*
** Format and send message.
*/
putfromline(mci, e);
(*e->e_puthdr)(mci, e->e_header, e, M87F_OUTER);
(*e->e_putbody)(mci, e, NULL);
rcode = EX_OK;
errno = 0;
ok = putfromline(mci, e);
if (ok)
ok = (*e->e_puthdr)(mci, e->e_header, e, M87F_OUTER);
if (ok)
ok = (*e->e_putbody)(mci, e, NULL);
/* get the exit status */
/*
** Ignore an I/O error that was caused by EPIPE.
** Some broken mailers don't read the entire body
** but just exit() thus causing an I/O error.
*/
if (!ok && (sm_io_error(mci->mci_out) && errno == EPIPE))
ok = true;
/* (always) get the exit status */
rcode = endmailer(mci, e, pv);
if (!ok)
rcode = EX_TEMPFAIL;
if (rcode == EX_TEMPFAIL && SmtpError[0] == '\0')
{
/*
@ -4430,13 +4450,13 @@ logdelivery(m, mci, dsn, status, ctladdr, xstart, e)
** e -- the envelope.
**
** Returns:
** none
** true iff line was written successfully
**
** Side Effects:
** outputs some text to fp.
*/
void
bool
putfromline(mci, e)
register MCI *mci;
ENVELOPE *e;
@ -4446,7 +4466,7 @@ putfromline(mci, e)
char xbuf[MAXLINE];
if (bitnset(M_NHDR, mci->mci_mailer->m_flags))
return;
return true;
mci->mci_flags |= MCIF_INHEADER;
@ -4487,8 +4507,9 @@ putfromline(mci, e)
}
}
expand(template, buf, sizeof buf, e);
putxline(buf, strlen(buf), mci, PXLF_HEADER);
return putxline(buf, strlen(buf), mci, PXLF_HEADER);
}
/*
** PUTBODY -- put the body of a message.
**
@ -4499,24 +4520,26 @@ putfromline(mci, e)
** not be permitted in the resulting message.
**
** Returns:
** none.
** true iff message was written successfully
**
** Side Effects:
** The message is written onto fp.
*/
/* values for output state variable */
#define OS_HEAD 0 /* at beginning of line */
#define OS_CR 1 /* read a carriage return */
#define OS_INLINE 2 /* putting rest of line */
#define OSTATE_HEAD 0 /* at beginning of line */
#define OSTATE_CR 1 /* read a carriage return */
#define OSTATE_INLINE 2 /* putting rest of line */
void
bool
putbody(mci, e, separator)
register MCI *mci;
register ENVELOPE *e;
char *separator;
{
bool dead = false;
bool ioerr = false;
int save_errno;
char buf[MAXLINE];
#if MIME8TO7
char *boundaries[MAXMIMENESTING + 1];
@ -4546,10 +4569,12 @@ putbody(mci, e, separator)
{
if (bitset(MCIF_INHEADER, mci->mci_flags))
{
putline("", mci);
if (!putline("", mci))
goto writeerr;
mci->mci_flags &= ~MCIF_INHEADER;
}
putline("<<< No Message Collected >>>", mci);
if (!putline("<<< No Message Collected >>>", mci))
goto writeerr;
goto endofmessage;
}
@ -4570,6 +4595,10 @@ putbody(mci, e, separator)
/* paranoia: the data file should always be in a rewound state */
(void) bfrewind(e->e_dfp);
/* simulate an I/O timeout when used as source */
if (tTd(84, 101))
sleep(319);
#if MIME8TO7
if (bitset(MCIF_CVT8TO7, mci->mci_flags))
{
@ -4578,26 +4607,31 @@ putbody(mci, e, separator)
*/
/* make sure it looks like a MIME message */
if (hvalue("MIME-Version", e->e_header) == NULL)
putline("MIME-Version: 1.0", mci);
if (hvalue("MIME-Version", e->e_header) == NULL &&
!putline("MIME-Version: 1.0", mci))
goto writeerr;
if (hvalue("Content-Type", e->e_header) == NULL)
{
(void) sm_snprintf(buf, sizeof buf,
"Content-Type: text/plain; charset=%s",
defcharset(e));
putline(buf, mci);
if (!putline(buf, mci))
goto writeerr;
}
/* now do the hard work */
boundaries[0] = NULL;
mci->mci_flags |= MCIF_INHEADER;
(void) mime8to7(mci, e->e_header, e, boundaries, M87F_OUTER);
if (mime8to7(mci, e->e_header, e, boundaries, M87F_OUTER) ==
SM_IO_EOF)
goto writeerr;
}
# if MIME7TO8
else if (bitset(MCIF_CVT7TO8, mci->mci_flags))
{
(void) mime7to8(mci, e->e_header, e);
if (!mime7to8(mci, e->e_header, e))
goto writeerr;
}
# endif /* MIME7TO8 */
else if (MaxMimeHeaderLength > 0 || MaxMimeFieldLength > 0)
@ -4619,8 +4653,9 @@ putbody(mci, e, separator)
if (bitset(EF_DONT_MIME, e->e_flags))
SuprErrs = true;
(void) mime8to7(mci, e->e_header, e, boundaries,
M87F_OUTER|M87F_NO8TO7);
if (mime8to7(mci, e->e_header, e, boundaries,
M87F_OUTER|M87F_NO8TO7) == SM_IO_EOF)
goto writeerr;
/* restore SuprErrs */
SuprErrs = oldsuprerrs;
@ -4640,7 +4675,8 @@ putbody(mci, e, separator)
if (bitset(MCIF_INHEADER, mci->mci_flags))
{
putline("", mci);
if (!putline("", mci))
goto writeerr;
mci->mci_flags &= ~MCIF_INHEADER;
}
@ -4651,7 +4687,7 @@ putbody(mci, e, separator)
buflim = &buf[mci->mci_mailer->m_linelimit - 1];
/* copy temp file to output with mapping */
ostate = OS_HEAD;
ostate = OSTATE_HEAD;
bp = buf;
pbp = peekbuf;
while (!sm_io_error(mci->mci_out) && !dead)
@ -4665,7 +4701,7 @@ putbody(mci, e, separator)
c &= 0x7f;
switch (ostate)
{
case OS_HEAD:
case OSTATE_HEAD:
if (c == '\0' &&
bitnset(M_NONULLS,
mci->mci_mailer->m_flags))
@ -4731,11 +4767,6 @@ putbody(mci, e, separator)
dead = true;
continue;
}
else
{
/* record progress for DATA timeout */
DataProgress = true;
}
pos++;
}
for (xp = buf; xp < bp; xp++)
@ -4748,11 +4779,6 @@ putbody(mci, e, separator)
dead = true;
break;
}
else
{
/* record progress for DATA timeout */
DataProgress = true;
}
}
if (dead)
continue;
@ -4763,11 +4789,6 @@ putbody(mci, e, separator)
mci->mci_mailer->m_eol)
== SM_IO_EOF)
break;
else
{
/* record progress for DATA timeout */
DataProgress = true;
}
pos = 0;
}
else
@ -4785,14 +4806,14 @@ putbody(mci, e, separator)
/* determine next state */
if (c == '\n')
ostate = OS_HEAD;
ostate = OSTATE_HEAD;
else if (c == '\r')
ostate = OS_CR;
ostate = OSTATE_CR;
else
ostate = OS_INLINE;
ostate = OSTATE_INLINE;
continue;
case OS_CR:
case OSTATE_CR:
if (c == '\n')
{
/* got CRLF */
@ -4801,11 +4822,6 @@ putbody(mci, e, separator)
mci->mci_mailer->m_eol)
== SM_IO_EOF)
continue;
else
{
/* record progress for DATA timeout */
DataProgress = true;
}
if (TrafficLogFile != NULL)
{
@ -4813,7 +4829,7 @@ putbody(mci, e, separator)
SM_TIME_DEFAULT,
mci->mci_mailer->m_eol);
}
ostate = OS_HEAD;
ostate = OSTATE_HEAD;
continue;
}
@ -4821,13 +4837,13 @@ putbody(mci, e, separator)
SM_ASSERT(pbp < peekbuf + sizeof(peekbuf));
*pbp++ = c;
c = '\r';
ostate = OS_INLINE;
ostate = OSTATE_INLINE;
goto putch;
case OS_INLINE:
case OSTATE_INLINE:
if (c == '\r')
{
ostate = OS_CR;
ostate = OSTATE_CR;
continue;
}
if (c == '\0' &&
@ -4867,11 +4883,6 @@ putbody(mci, e, separator)
dead = true;
continue;
}
else
{
/* record progress for DATA timeout */
DataProgress = true;
}
pos++;
continue;
}
@ -4887,11 +4898,6 @@ putbody(mci, e, separator)
dead = true;
continue;
}
else
{
/* record progress for DATA timeout */
DataProgress = true;
}
if (TrafficLogFile != NULL)
{
@ -4900,7 +4906,7 @@ putbody(mci, e, separator)
"!%s",
mci->mci_mailer->m_eol);
}
ostate = OS_HEAD;
ostate = OSTATE_HEAD;
SM_ASSERT(pbp < peekbuf +
sizeof(peekbuf));
*pbp++ = c;
@ -4917,13 +4923,8 @@ putbody(mci, e, separator)
mci->mci_mailer->m_eol)
== SM_IO_EOF)
continue;
else
{
/* record progress for DATA timeout */
DataProgress = true;
}
pos = 0;
ostate = OS_HEAD;
ostate = OSTATE_HEAD;
}
else
{
@ -4939,13 +4940,8 @@ putbody(mci, e, separator)
dead = true;
continue;
}
else
{
/* record progress for DATA timeout */
DataProgress = true;
}
pos++;
ostate = OS_INLINE;
ostate = OSTATE_INLINE;
}
break;
}
@ -4970,11 +4966,6 @@ putbody(mci, e, separator)
dead = true;
break;
}
else
{
/* record progress for DATA timeout */
DataProgress = true;
}
}
pos += bp - buf;
}
@ -4984,11 +4975,9 @@ putbody(mci, e, separator)
(void) sm_io_fputs(TrafficLogFile,
SM_TIME_DEFAULT,
mci->mci_mailer->m_eol);
(void) sm_io_fputs(mci->mci_out, SM_TIME_DEFAULT,
mci->mci_mailer->m_eol);
/* record progress for DATA timeout */
DataProgress = true;
if (sm_io_fputs(mci->mci_out, SM_TIME_DEFAULT,
mci->mci_mailer->m_eol) == SM_IO_EOF)
goto writeerr;
}
}
@ -4998,6 +4987,7 @@ putbody(mci, e, separator)
qid_printqueue(e->e_dfqgrp, e->e_dfqdir),
DATAFL_LETTER, e->e_id);
ExitStat = EX_IOERR;
ioerr = true;
}
endofmessage:
@ -5012,23 +5002,35 @@ putbody(mci, e, separator)
** offset to match.
*/
save_errno = errno;
if (e->e_dfp != NULL)
(void) bfrewind(e->e_dfp);
/* some mailers want extra blank line at end of message */
if (!dead && bitnset(M_BLANKEND, mci->mci_mailer->m_flags) &&
buf[0] != '\0' && buf[0] != '\n')
putline("", mci);
(void) sm_io_flush(mci->mci_out, SM_TIME_DEFAULT);
if (sm_io_error(mci->mci_out) && errno != EPIPE)
{
syserr("putbody: write error");
ExitStat = EX_IOERR;
if (!putline("", mci))
goto writeerr;
}
errno = 0;
if (!dead &&
(sm_io_flush(mci->mci_out, SM_TIME_DEFAULT) == SM_IO_EOF ||
(sm_io_error(mci->mci_out) && errno != EPIPE)))
{
save_errno = errno;
syserr("putbody: write error");
ExitStat = EX_IOERR;
ioerr = true;
}
errno = save_errno;
return !dead && !ioerr;
writeerr:
return false;
}
/*
** MAILFILE -- Send a message to a file.
**
@ -5559,14 +5561,14 @@ mailfile(filename, mailer, ctladdr, sfflags, e)
}
#endif /* MIME7TO8 */
putfromline(&mcibuf, e);
(*e->e_puthdr)(&mcibuf, e->e_header, e, M87F_OUTER);
(*e->e_putbody)(&mcibuf, e, NULL);
putline("\n", &mcibuf);
if (sm_io_flush(f, SM_TIME_DEFAULT) != 0 ||
if (!putfromline(&mcibuf, e) ||
!(*e->e_puthdr)(&mcibuf, e->e_header, e, M87F_OUTER) ||
!(*e->e_putbody)(&mcibuf, e, NULL) ||
!putline("\n", &mcibuf) ||
(sm_io_flush(f, SM_TIME_DEFAULT) != 0 ||
(SuperSafe != SAFE_NO &&
fsync(sm_io_getinfo(f, SM_IO_WHAT_FD, NULL)) < 0) ||
sm_io_error(f))
sm_io_error(f)))
{
setstat(EX_IOERR);
#if !NOFTRUNCATE
@ -6079,12 +6081,16 @@ starttls(m, mci, e)
XS_STARTTLS);
/* check return code from server */
if (smtpresult == 454)
if (REPLYTYPE(smtpresult) == 4)
return EX_TEMPFAIL;
if (smtpresult == 501)
return EX_USAGE;
if (smtpresult == -1)
return smtpresult;
/* not an expected reply but we have to deal with it */
if (REPLYTYPE(smtpresult) == 5)
return EX_UNAVAILABLE;
if (smtpresult != 220)
return EX_PROTOCOL;
@ -6128,86 +6134,23 @@ starttls(m, mci, e)
ssl_retry:
if ((result = SSL_connect(clt_ssl)) <= 0)
{
int i;
bool timedout;
time_t left;
time_t now = curtime();
struct timeval tv;
int i, ssl_err;
/* what to do in this case? */
i = SSL_get_error(clt_ssl, result);
ssl_err = SSL_get_error(clt_ssl, result);
i = tls_retry(clt_ssl, rfd, wfd, tlsstart,
TimeOuts.to_starttls, ssl_err, "client");
if (i > 0)
goto ssl_retry;
/*
** For SSL_ERROR_WANT_{READ,WRITE}:
** There is not a complete SSL record available yet
** or there is only a partial SSL record removed from
** the network (socket) buffer into the SSL buffer.
** The SSL_connect will only succeed when a full
** SSL record is available (assuming a "real" error
** doesn't happen). To handle when a "real" error
** does happen the select is set for exceptions too.
** The connection may be re-negotiated during this time
** so both read and write "want errors" need to be handled.
** A select() exception loops back so that a proper SSL
** error message can be gotten.
*/
left = TimeOuts.to_starttls - (now - tlsstart);
timedout = left <= 0;
if (!timedout)
{
tv.tv_sec = left;
tv.tv_usec = 0;
}
if (!timedout && FD_SETSIZE > 0 &&
(rfd >= FD_SETSIZE ||
(i == SSL_ERROR_WANT_WRITE && wfd >= FD_SETSIZE)))
{
if (LogLevel > 5)
{
sm_syslog(LOG_ERR, e->e_id,
"STARTTLS=client, error: fd %d/%d too large",
rfd, wfd);
if (LogLevel > 8)
tlslogerr("client");
}
errno = EINVAL;
goto tlsfail;
}
if (!timedout && i == SSL_ERROR_WANT_READ)
{
fd_set ssl_maskr, ssl_maskx;
FD_ZERO(&ssl_maskr);
FD_SET(rfd, &ssl_maskr);
FD_ZERO(&ssl_maskx);
FD_SET(rfd, &ssl_maskx);
if (select(rfd + 1, &ssl_maskr, NULL, &ssl_maskx, &tv)
> 0)
goto ssl_retry;
}
if (!timedout && i == SSL_ERROR_WANT_WRITE)
{
fd_set ssl_maskw, ssl_maskx;
FD_ZERO(&ssl_maskw);
FD_SET(wfd, &ssl_maskw);
FD_ZERO(&ssl_maskx);
FD_SET(rfd, &ssl_maskx);
if (select(wfd + 1, NULL, &ssl_maskw, &ssl_maskx, &tv)
> 0)
goto ssl_retry;
}
if (LogLevel > 5)
{
sm_syslog(LOG_ERR, e->e_id,
"STARTTLS=client, error: connect failed=%d, SSL_error=%d, timedout=%d, errno=%d",
result, i, (int) timedout, errno);
sm_syslog(LOG_WARNING, NOQID,
"STARTTLS=client, error: connect failed=%d, SSL_error=%d, errno=%d, retry=%d",
result, ssl_err, errno, i);
if (LogLevel > 8)
tlslogerr("client");
}
tlsfail:
SSL_free(clt_ssl);
clt_ssl = NULL;
return EX_SOFTWARE;

View File

@ -13,7 +13,7 @@
#include <sendmail.h>
SM_RCSID("@(#)$Id: envelope.c,v 8.294 2005/02/16 23:38:51 ca Exp $")
SM_RCSID("@(#)$Id: envelope.c,v 8.295 2005/06/15 20:32:18 ca Exp $")
/*
** CLRSESSENVELOPE -- clear session oriented data in an envelope
@ -75,6 +75,10 @@ newenvelope(e, parent, rpool)
register ENVELOPE *parent;
SM_RPOOL_T *rpool;
{
#if _FFR_DM_PER_DAEMON
int sendmode;
#endif /* _FFR_DM_PER_DAEMON */
/*
** This code used to read:
** if (e == parent && e->e_parent != NULL)
@ -84,6 +88,13 @@ newenvelope(e, parent, rpool)
** This meant macvalue() could go into an infinite loop.
*/
#if _FFR_DM_PER_DAEMON
if (parent != NULL)
sendmode = parent->e_sendmode;
else
sendmode = DM_NOTSET;
#endif /* _FFR_DM_PER_DAEMON */
if (e == parent)
parent = e->e_parent;
clearenvelope(e, true, rpool);
@ -119,6 +130,10 @@ newenvelope(e, parent, rpool)
e->e_putbody = putbody;
if (CurEnv->e_xfp != NULL)
(void) sm_io_flush(CurEnv->e_xfp, SM_TIME_DEFAULT);
#if _FFR_DM_PER_DAEMON
if (sendmode != DM_NOTSET)
e->e_sendmode = sendmode;
#endif /* _FFR_DM_PER_DAEMON */
return e;
}

View File

@ -1,6 +1,6 @@
#vers 2
cpyr
cpyr Copyright (c) 1998-2000, 2002, 2004 Sendmail, Inc. and its suppliers.
cpyr Copyright (c) 1998-2000, 2002, 2004, 2005 Sendmail, Inc. and its suppliers.
cpyr All rights reserved.
cpyr Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
cpyr Copyright (c) 1988, 1993
@ -11,7 +11,7 @@ cpyr By using this file, you agree to the terms and conditions set
cpyr forth in the LICENSE file which can be found at the top level of
cpyr the sendmail distribution.
cpyr
cpyr $$Id: helpfile,v 8.43 2004/10/29 18:05:39 ca Exp $$
cpyr $$Id: helpfile,v 8.45 2005/09/13 00:05:23 ca Exp $$
cpyr
smtp This is sendmail version $v
smtp Topics:
@ -48,10 +48,10 @@ ehlo STARTTLS Secure SMTP [RFC2487]
ehlo AUTH Authentication [RFC2554]
ehlo ENHANCEDSTATUSCODES Enhanced status codes [RFC2034]
ehlo DELIVERBY Deliver By [RFC2852]
mail MAIL FROM: <sender> [ <parameters> ]
mail MAIL From:<sender> [ <parameters> ]
mail Specifies the sender. Parameters are ESMTP extensions.
mail See "HELP DSN" for details.
rcpt RCPT TO: <recipient> [ <parameters> ]
rcpt RCPT To:<recipient> [ <parameters> ]
rcpt Specifies the recipient. Can be used any number of times.
rcpt Parameters are ESMTP extensions. See "HELP DSN" for details.
data DATA
@ -91,7 +91,7 @@ saml implementation.
turn TURN
turn Reverses the direction of the connection. Not currently
turn implemented.
etrn ETRN [ <hostname> | @<domain> | #<queuename> ]
etrn ETRN [ <hostname> | @<domain> | \#<queuename> ]
etrn Run the queue for the specified <hostname>, or
etrn all hosts within a given <domain>, or a specially-named
etrn <queuename> (implementation-specific).

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2004 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2005 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -25,7 +25,7 @@ SM_UNUSED(static char copyright[]) =
The Regents of the University of California. All rights reserved.\n";
#endif /* ! lint */
SM_RCSID("@(#)$Id: main.c,v 8.939 2004/06/17 16:39:21 ca Exp $")
SM_RCSID("@(#)$Id: main.c,v 8.942 2005/12/26 04:39:13 ca Exp $")
#if NETINET || NETINET6
@ -649,7 +649,7 @@ main(argc, argv, envp)
}
/* prime the child environment */
setuserenv("AGENT", "sendmail");
sm_setuserenv("AGENT", "sendmail");
(void) sm_signal(SIGPIPE, SIG_IGN);
OldUmask = umask(022);
@ -1318,9 +1318,9 @@ main(argc, argv, envp)
if (TimeZoneSpec == NULL)
unsetenv("TZ");
else if (TimeZoneSpec[0] != '\0')
setuserenv("TZ", TimeZoneSpec);
sm_setuserenv("TZ", TimeZoneSpec);
else
setuserenv("TZ", NULL);
sm_setuserenv("TZ", NULL);
tzset();
/* initialize mailbox database */
@ -1462,6 +1462,16 @@ main(argc, argv, envp)
"Warning: HostStatusDirectory required for SingleThreadDelivery\n");
}
#if _FFR_MEMSTAT
j = sm_memstat_open();
if (j < 0 && (RefuseLowMem > 0 || QueueLowMem > 0) && LogLevel > 4)
{
sm_syslog(LOG_WARNING, NOQID,
"cannot get memory statistics, settings ignored, error=%d"
, j);
}
#endif /* _FFR_MEMSTAT */
/* check for permissions */
if (RealUid != 0 &&
RealUid != TrustedUid)
@ -2949,6 +2959,9 @@ finis(drop, cleanup, exitstat)
/* reset uid for process accounting */
endpwent();
sm_mbdb_terminate();
#if _FFR_MEMSTAT
(void) sm_memstat_close();
#endif /* _FFR_MEMSTAT */
(void) setuid(RealUid);
#if SM_HEAP_CHECK
/* dump the heap, if we are checking for memory leaks */
@ -3439,21 +3452,21 @@ getextenv(envar)
return NULL;
}
/*
** SETUSERENV -- set an environment in the propagated environment
** SM_SETUSERENV -- set an environment variable in the propagated environment
**
** Parameters:
** envar -- the name of the environment variable.
** value -- the value to which it should be set. If
** null, this is extracted from the incoming
** environment. If that is not set, the call
** to setuserenv is ignored.
** to sm_setuserenv is ignored.
**
** Returns:
** none.
*/
void
setuserenv(envar, value)
sm_setuserenv(envar, value)
const char *envar;
const char *value;
{
@ -3488,7 +3501,7 @@ setuserenv(envar, value)
/* make sure it is in our environment as well */
if (putenv(p) < 0)
syserr("setuserenv: putenv(%s) failed", p);
syserr("sm_setuserenv: putenv(%s) failed", p);
}
/*
** DUMPSTATE -- dump state

View File

@ -13,7 +13,7 @@
#include <sendmail.h>
SM_RCSID("@(#)$Id: map.c,v 8.669 2005/02/09 01:46:35 ca Exp $")
SM_RCSID("@(#)$Id: map.c,v 8.671 2005/10/25 17:55:50 ca Exp $")
#if LDAPMAP
# include <sm/ldap.h>
@ -3493,7 +3493,7 @@ ldapmap_lookup(map, name, av, statp)
char *result = NULL;
SM_RPOOL_T *rpool;
SM_LDAP_STRUCT *lmap = NULL;
char keybuf[MAXNAME + 1];
char keybuf[MAXKEY];
if (tTd(38, 20))
sm_dprintf("ldapmap_lookup(%s, %s)\n", map->map_mname, name);
@ -3551,6 +3551,10 @@ ldapmap_lookup(map, name, av, statp)
flags |= SM_LDAP_SINGLEMATCH;
if (bitset(MF_MATCHONLY, map->map_mflags))
flags |= SM_LDAP_MATCHONLY;
# if _FFR_LDAP_SINGLEDN
if (bitset(MF_SINGLEDN, map->map_mflags))
flags |= SM_LDAP_SINGLEDN;
# endif /* _FFR_LDAP_SINGLEDN */
/* Create an rpool for search related memory usage */
rpool = sm_rpool_new_x(NULL);
@ -3911,6 +3915,12 @@ ldapmap_parseargs(map, args)
map->map_mflags |= MF_SINGLEMATCH;
break;
# if _FFR_LDAP_SINGLEDN
case '2':
map->map_mflags |= MF_SINGLEDN;
break;
# endif /* _FFR_LDAP_SINGLEDN */
/* args stolen from ldapsearch.c */
case 'R': /* don't auto chase referrals */
# ifdef LDAP_REFERRALS

View File

@ -10,14 +10,14 @@
#include <sendmail.h>
SM_RCSID("@(#)$Id: milter.c,v 8.229 2005/03/02 02:32:34 ca Exp $")
SM_RCSID("@(#)$Id: milter.c,v 8.232 2005/08/05 21:49:04 ca Exp $")
#if MILTER
# include <libmilter/mfapi.h>
# include <libmilter/mfdef.h>
# include <errno.h>
# include <sys/time.h>
# include <sm/time.h>
# include <sys/uio.h>
# if NETINET || NETINET6
@ -1962,11 +1962,20 @@ milter_send_command(m, command, data, sz, e, state)
#if SMFI_VERSION > 2
case SMFIC_UNKNOWN:
skipflag = SMFIP_NOUNKNOWN;
action = "unknown";
defresponse = "550 5.7.1 Command rejected";
break;
#endif /* SMFI_VERSION > 2 */
#if SMFI_VERSION > 3
case SMFIC_DATA:
skipflag = SMFIP_NODATA;
action = "data";
defresponse = "550 5.7.1 Command rejected";
break;
#endif /* SMFI_VERSION > 3 */
case SMFIC_BODYEOB:
case SMFIC_OPTNEG:
case SMFIC_MACRO:
@ -2184,8 +2193,9 @@ milter_negotiate(m, e)
mi_int32 fvers;
mi_int32 fflags;
mi_int32 pflags;
char *response;
mi_int32 curr_prot;
ssize_t rlen;
char *response;
char data[MILTER_OPTLEN];
/* sanity check */
@ -2201,7 +2211,18 @@ milter_negotiate(m, e)
fvers = htonl(SMFI_VERSION);
fflags = htonl(SMFI_CURR_ACTS);
pflags = htonl(SMFI_CURR_PROT);
curr_prot = SMFI_V2_PROT
#if _FFR_MILTER_NOHDR_RESP
| SMFIP_NOHREPL
#endif /* _FFR_MILTER_NOHDR_RESP */
#if SMFI_VERSION >= 3
| SMFIP_NOUNKNOWN
# if SMFI_VERSION >= 4
| SMFIP_NODATA
# endif /* SMFI_VERSION >= 4 */
#endif /* SMFI_VERSION >= 3 */
;
pflags = htonl(curr_prot);
(void) memcpy(data, (char *) &fvers, MILTER_LEN_BYTES);
(void) memcpy(data + MILTER_LEN_BYTES,
(char *) &fflags, MILTER_LEN_BYTES);
@ -2310,21 +2331,26 @@ milter_negotiate(m, e)
}
/* check for protocol feature mismatch */
if ((m->mf_pflags & SMFI_CURR_PROT) != m->mf_pflags)
if ((m->mf_pflags & curr_prot) != m->mf_pflags)
{
if (tTd(64, 5))
sm_dprintf("milter_negotiate(%s): protocol abilities 0x%x != MTA milter abilities 0x%lx\n",
m->mf_name, m->mf_pflags,
(unsigned long) SMFI_CURR_PROT);
(unsigned long) curr_prot);
if (MilterLogLevel > 0)
sm_syslog(LOG_ERR, e->e_id,
"Milter (%s): negotiate: protocol abilities 0x%x != MTA milter abilities 0x%lx",
m->mf_name, m->mf_pflags,
(unsigned long) SMFI_CURR_PROT);
(unsigned long) curr_prot);
milter_error(m, e);
return -1;
}
if (m->mf_fvers <= 2)
m->mf_pflags |= SMFIP_NOUNKNOWN;
if (m->mf_fvers <= 3)
m->mf_pflags |= SMFIP_NODATA;
if (tTd(64, 5))
sm_dprintf("milter_negotiate(%s): version %u, fflags 0x%x, pflags 0x%x\n",
m->mf_name, m->mf_fvers, m->mf_fflags, m->mf_pflags);
@ -2689,10 +2715,10 @@ milter_addheader(response, rlen, e)
** Returns:
** none
**
** Notes:
** Unlike milter_addheader(), this does not attempt to determine
** if the header already exists in the envelope, even a
** deleted version. It just blindly inserts.
** Notes:
** Unlike milter_addheader(), this does not attempt to determine
** if the header already exists in the envelope, even a
** deleted version. It just blindly inserts.
*/
static void
@ -2752,7 +2778,7 @@ milter_insheader(response, rlen, e)
sm_dprintf("Insert (%d) %s: %s\n", idx, response, val);
if (MilterLogLevel > 8)
sm_syslog(LOG_INFO, e->e_id,
"Milter insert (%d): header: %s: %s",
"Milter insert (%d): header: %s: %s",
idx, field, val);
insheader(idx, newstr(field), val, H_USER, e);
}

View File

@ -14,7 +14,7 @@
#include <sendmail.h>
#include <string.h>
SM_RCSID("@(#)$Id: mime.c,v 8.137 2004/09/02 21:37:26 ca Exp $")
SM_RCSID("@(#)$Id: mime.c,v 8.139 2006/03/01 18:07:45 ca Exp $")
/*
** MIME support.
@ -86,6 +86,7 @@ static bool MapNLtoCRLF;
** MBT_FINAL -- the final boundary
** MBT_INTERMED -- an intermediate boundary
** MBT_NOTSEP -- an end of file
** SM_IO_EOF -- I/O error occurred
*/
struct args
@ -298,7 +299,8 @@ mime8to7(mci, header, e, boundaries, flags)
mci->mci_flags |= MCIF_INMIME;
/* skip the early "comment" prologue */
putline("", mci);
if (!putline("", mci))
goto writeerr;
mci->mci_flags &= ~MCIF_INHEADER;
bt = MBT_FINAL;
while (sm_io_fgets(e->e_dfp, SM_TIME_DEFAULT, buf, sizeof buf)
@ -307,8 +309,9 @@ mime8to7(mci, header, e, boundaries, flags)
bt = mimeboundary(buf, boundaries);
if (bt != MBT_NOTSEP)
break;
putxline(buf, strlen(buf), mci,
PXLF_MAPFROM|PXLF_STRIP8BIT);
if (!putxline(buf, strlen(buf), mci,
PXLF_MAPFROM|PXLF_STRIP8BIT))
goto writeerr;
if (tTd(43, 99))
sm_dprintf(" ...%s", buf);
}
@ -319,19 +322,24 @@ mime8to7(mci, header, e, boundaries, flags)
auto HDR *hdr = NULL;
(void) sm_strlcpyn(buf, sizeof buf, 2, "--", bbuf);
putline(buf, mci);
if (!putline(buf, mci))
goto writeerr;
if (tTd(43, 35))
sm_dprintf(" ...%s\n", buf);
collect(e->e_dfp, false, &hdr, e, false);
if (tTd(43, 101))
putline("+++after collect", mci);
putheader(mci, hdr, e, flags);
if (!putheader(mci, hdr, e, flags))
goto writeerr;
if (tTd(43, 101))
putline("+++after putheader", mci);
bt = mime8to7(mci, hdr, e, boundaries, flags);
if (bt == SM_IO_EOF)
goto writeerr;
}
(void) sm_strlcpyn(buf, sizeof buf, 3, "--", bbuf, "--");
putline(buf, mci);
if (!putline(buf, mci))
goto writeerr;
if (tTd(43, 35))
sm_dprintf(" ...%s\n", buf);
boundaries[i] = NULL;
@ -344,8 +352,9 @@ mime8to7(mci, header, e, boundaries, flags)
bt = mimeboundary(buf, boundaries);
if (bt != MBT_NOTSEP)
break;
putxline(buf, strlen(buf), mci,
PXLF_MAPFROM|PXLF_STRIP8BIT);
if (!putxline(buf, strlen(buf), mci,
PXLF_MAPFROM|PXLF_STRIP8BIT))
goto writeerr;
if (tTd(43, 99))
sm_dprintf(" ...%s", buf);
}
@ -373,18 +382,21 @@ mime8to7(mci, header, e, boundaries, flags)
{
auto HDR *hdr = NULL;
putline("", mci);
if (!putline("", mci))
goto writeerr;
mci->mci_flags |= MCIF_INMIME;
collect(e->e_dfp, false, &hdr, e, false);
if (tTd(43, 101))
putline("+++after collect", mci);
putheader(mci, hdr, e, flags);
if (!putheader(mci, hdr, e, flags))
goto writeerr;
if (tTd(43, 101))
putline("+++after putheader", mci);
if (hvalue("MIME-Version", hdr) == NULL &&
!bitset(M87F_NO8TO7, flags))
putline("MIME-Version: 1.0", mci);
!bitset(M87F_NO8TO7, flags) &&
!putline("MIME-Version: 1.0", mci))
goto writeerr;
bt = mime8to7(mci, hdr, e, boundaries, flags);
mci->mci_flags &= ~MCIF_INMIME;
return bt;
@ -480,11 +492,13 @@ mime8to7(mci, header, e, boundaries, flags)
(void) sm_snprintf(buf, sizeof buf,
"Content-Transfer-Encoding: %.200s", cte);
putline(buf, mci);
if (!putline(buf, mci))
goto writeerr;
if (tTd(43, 36))
sm_dprintf(" ...%s\n", buf);
}
putline("", mci);
if (!putline("", mci))
goto writeerr;
mci->mci_flags &= ~MCIF_INHEADER;
while (sm_io_fgets(e->e_dfp, SM_TIME_DEFAULT, buf, sizeof buf)
!= NULL)
@ -492,7 +506,8 @@ mime8to7(mci, header, e, boundaries, flags)
bt = mimeboundary(buf, boundaries);
if (bt != MBT_NOTSEP)
break;
putline(buf, mci);
if (!putline(buf, mci))
goto writeerr;
}
if (sm_io_eof(e->e_dfp))
bt = MBT_FINAL;
@ -505,12 +520,13 @@ mime8to7(mci, header, e, boundaries, flags)
if (tTd(43, 36))
sm_dprintf(" ...Content-Transfer-Encoding: base64\n");
putline("Content-Transfer-Encoding: base64", mci);
if (!putline("Content-Transfer-Encoding: base64", mci))
goto writeerr;
(void) sm_snprintf(buf, sizeof buf,
"X-MIME-Autoconverted: from 8bit to base64 by %s id %s",
MyHostName, e->e_id);
putline(buf, mci);
putline("", mci);
if (!putline(buf, mci) || !putline("", mci))
goto writeerr;
mci->mci_flags &= ~MCIF_INHEADER;
while ((c1 = mime_getchar_crlf(e->e_dfp, boundaries, &bt)) !=
SM_IO_EOF)
@ -518,7 +534,8 @@ mime8to7(mci, header, e, boundaries, flags)
if (linelen > 71)
{
*bp = '\0';
putline(buf, mci);
if (!putline(buf, mci))
goto writeerr;
linelen = 0;
bp = buf;
}
@ -548,7 +565,8 @@ mime8to7(mci, header, e, boundaries, flags)
*bp++ = Base64Code[c2 & 0x3f];
}
*bp = '\0';
putline(buf, mci);
if (!putline(buf, mci))
goto writeerr;
}
else
{
@ -571,12 +589,14 @@ mime8to7(mci, header, e, boundaries, flags)
if (tTd(43, 36))
sm_dprintf(" ...Content-Transfer-Encoding: quoted-printable\n");
putline("Content-Transfer-Encoding: quoted-printable", mci);
if (!putline("Content-Transfer-Encoding: quoted-printable",
mci))
goto writeerr;
(void) sm_snprintf(buf, sizeof buf,
"X-MIME-Autoconverted: from 8bit to quoted-printable by %s id %s",
MyHostName, e->e_id);
putline(buf, mci);
putline("", mci);
if (!putline(buf, mci) || !putline("", mci))
goto writeerr;
mci->mci_flags &= ~MCIF_INHEADER;
fromstate = 0;
c2 = '\n';
@ -598,7 +618,8 @@ mime8to7(mci, header, e, boundaries, flags)
*bp++ = Base16Code['.' & 0x0f];
}
*bp = '\0';
putline(buf, mci);
if (!putline(buf, mci))
goto writeerr;
linelen = fromstate = 0;
bp = buf;
c2 = c1;
@ -627,7 +648,8 @@ mime8to7(mci, header, e, boundaries, flags)
c2 = '\n';
*bp++ = '=';
*bp = '\0';
putline(buf, mci);
if (!putline(buf, mci))
goto writeerr;
linelen = fromstate = 0;
bp = buf;
if (c2 == '.')
@ -665,13 +687,17 @@ mime8to7(mci, header, e, boundaries, flags)
if (linelen > 0 || boundaries[0] != NULL)
{
*bp = '\0';
putline(buf, mci);
if (!putline(buf, mci))
goto writeerr;
}
}
if (tTd(43, 3))
sm_dprintf("\t\t\tmime8to7=>%s (basic)\n", MimeBoundaryNames[bt]);
return bt;
writeerr:
return SM_IO_EOF;
}
/*
** MIME_GETCHAR -- get a character for MIME processing
@ -958,7 +984,7 @@ static int mime_fromqp __P((unsigned char *, unsigned char **, int));
** e -- envelope.
**
** Returns:
** none.
** true iff body was written successfully
*/
static char index_64[128] =
@ -975,7 +1001,7 @@ static char index_64[128] =
# define CHAR64(c) (((c) < 0 || (c) > 127) ? -1 : index_64[(c)])
void
bool
mime7to8(mci, header, e)
register MCI *mci;
HDR *header;
@ -1008,25 +1034,31 @@ mime7to8(mci, header, e)
{
(void) sm_snprintf(buf, sizeof buf,
"Content-Transfer-Encoding: %s", p);
putline(buf, mci);
if (!putline(buf, mci))
goto writeerr;
}
putline("", mci);
if (!putline("", mci))
goto writeerr;
mci->mci_flags &= ~MCIF_INHEADER;
while (sm_io_fgets(e->e_dfp, SM_TIME_DEFAULT, buf, sizeof buf)
!= NULL)
putline(buf, mci);
return;
{
if (!putline(buf, mci))
goto writeerr;
}
return true;
}
cataddr(pvp, NULL, buf, sizeof buf, '\0');
cte = sm_rpool_strdup_x(e->e_rpool, buf);
mci->mci_flags |= MCIF_INHEADER;
putline("Content-Transfer-Encoding: 8bit", mci);
if (!putline("Content-Transfer-Encoding: 8bit", mci))
goto writeerr;
(void) sm_snprintf(buf, sizeof buf,
"X-MIME-Autoconverted: from %.200s to 8bit by %s id %s",
cte, MyHostName, e->e_id);
putline(buf, mci);
putline("", mci);
if (!putline(buf, mci) || !putline("", mci))
goto writeerr;
mci->mci_flags &= ~MCIF_INHEADER;
/*
@ -1090,7 +1122,8 @@ mime7to8(mci, header, e)
if (*fbufp++ == '\n' || fbufp >= &fbuf[MAXLINE]) \
{ \
CHK_EOL; \
putxline((char *) fbuf, fbufp - fbuf, mci, pxflags); \
if (!putxline((char *) fbuf, fbufp - fbuf, mci, pxflags)) \
goto writeerr; \
pxflags &= ~PXLF_NOADDEOL; \
fbufp = fbuf; \
} \
@ -1127,8 +1160,11 @@ mime7to8(mci, header, e)
continue;
if (fbufp - fbuf > 0)
putxline((char *) fbuf, fbufp - fbuf - 1, mci,
pxflags);
{
if (!putxline((char *) fbuf, fbufp - fbuf - 1,
mci, pxflags))
goto writeerr;
}
fbufp = fbuf;
if (off >= 0 && buf[off] != '\0')
{
@ -1144,7 +1180,8 @@ mime7to8(mci, header, e)
if (fbufp > fbuf)
{
*fbufp = '\0';
putxline((char *) fbuf, fbufp - fbuf, mci, pxflags);
if (!putxline((char *) fbuf, fbufp - fbuf, mci, pxflags))
goto writeerr;
}
/*
@ -1154,10 +1191,15 @@ mime7to8(mci, header, e)
** but so is auto-converting MIME in the first place.
*/
putline("", mci);
if (!putline("", mci))
goto writeerr;
if (tTd(43, 3))
sm_dprintf("\t\t\tmime7to8 => %s to 8bit done\n", cte);
return true;
writeerr:
return false;
}
/*
** The following is based on Borenstein's "codes.c" module, with simplifying

View File

@ -13,7 +13,7 @@
#include <sendmail.h>
SM_RCSID("@(#)$Id: parseaddr.c,v 8.381 2005/02/04 22:01:45 ca Exp $")
SM_RCSID("@(#)$Id: parseaddr.c,v 8.383 2006/02/01 19:46:11 ca Exp $")
static void allocaddr __P((ADDRESS *, int, char *, ENVELOPE *));
static int callsubr __P((char**, int, ENVELOPE *));
@ -1337,7 +1337,7 @@ rewrite(pvp, ruleset, reclevel, e, maxatom)
/* $&{x} replacement */
char *mval = macvalue(rp[1], e);
char **xpvp;
int trsize = 0;
size_t trsize = 0;
static size_t pvpb1_size = 0;
static char **pvpb1 = NULL;
char pvpbuf[PSBUFSIZE];
@ -1352,7 +1352,7 @@ rewrite(pvp, ruleset, reclevel, e, maxatom)
/* save the remainder of the input */
for (xpvp = pvp; *xpvp != NULL; xpvp++)
trsize += sizeof *xpvp;
if ((size_t) trsize > pvpb1_size)
if (trsize > pvpb1_size)
{
if (pvpb1 != NULL)
sm_free(pvpb1);
@ -1407,7 +1407,7 @@ rewrite(pvp, ruleset, reclevel, e, maxatom)
{
char **hbrvp;
char **xpvp;
int trsize;
size_t trsize;
char *replac;
int endtoken;
STAB *map;
@ -1415,7 +1415,7 @@ rewrite(pvp, ruleset, reclevel, e, maxatom)
char **key_rvp;
char **arg_rvp;
char **default_rvp;
char cbuf[MAXNAME + 1];
char cbuf[MAXKEY];
char *pvpb1[MAXATOM + 1];
char *argvect[MAX_MAP_ARGS];
char pvpbuf[PSBUFSIZE];
@ -1509,7 +1509,7 @@ rewrite(pvp, ruleset, reclevel, e, maxatom)
*++arg_rvp = NULL;
/* save the remainder of the input string */
trsize = (int) (avp - rvp + 1) * sizeof *rvp;
trsize = (avp - rvp + 1) * sizeof *rvp;
memmove((char *) pvpb1, (char *) rvp, trsize);
/* look it up */
@ -2949,7 +2949,7 @@ rscheck(rwset, p1, p2, e, flags, logl, host, logid)
char *logid;
{
char *volatile buf;
int bufsize;
size_t bufsize;
int saveexitstat;
int volatile rstat = EX_OK;
char **pvp;
@ -3163,7 +3163,7 @@ rscap(rwset, p1, p2, e, pvp, pvpbuf, size)
int size;
{
char *volatile buf;
int bufsize;
size_t bufsize;
int volatile rstat = EX_OK;
int rsno;
bool saveQuickAbort = QuickAbort;

View File

@ -14,7 +14,7 @@
#include <sendmail.h>
#include <sm/sem.h>
SM_RCSID("@(#)$Id: queue.c,v 8.944 2005/02/17 23:58:58 ca Exp $")
SM_RCSID("@(#)$Id: queue.c,v 8.951 2006/03/02 19:13:38 ca Exp $")
#include <dirent.h>
@ -2853,7 +2853,8 @@ gatherq(qgrp, qdir, doall, full, more)
if (cf != NULL)
(void) sm_io_close(cf, SM_TIME_DEFAULT);
if ((!doall && shouldqueue(w->w_pri, w->w_ctime)) ||
if ((!doall && (shouldqueue(w->w_pri, w->w_ctime) ||
w->w_tooyoung)) ||
bitset(HAS_QUARANTINE, i) ||
bitset(NEED_QUARANTINE, i) ||
bitset(NEED_R|NEED_S, i))
@ -2931,10 +2932,6 @@ sortq(max)
if (WorkList == NULL || wc <= 0)
return 0;
/* Check if the per queue group item limit will be exceeded */
if (wc > max && max > 0)
wc = max;
/*
** The sort now takes place using all of the items in WorkList.
** The list gets trimmed to the most important items after the sort.
@ -3046,6 +3043,10 @@ sortq(max)
}
/* else don't sort at all */
/* Check if the per queue group item limit will be exceeded */
if (wc > max && max > 0)
wc = max;
/*
** Convert the work list into canonical form.
** Should be turning it into a list of envelopes here perhaps.
@ -3443,13 +3444,13 @@ init_shuffle_alphabet()
return;
/* fill the ShuffledAlphabet */
for (i = 0; i < NCHAR; i++)
for (i = 0; i < NASCII; i++)
ShuffledAlphabet[i] = i;
/* mix it */
for (i = 1; i < NCHAR; i++)
for (i = 1; i < NASCII; i++)
{
register int j = get_random() % NCHAR;
register int j = get_random() % NASCII;
register int tmp;
tmp = ShuffledAlphabet[j];
@ -3462,8 +3463,8 @@ init_shuffle_alphabet()
ShuffledAlphabet[i] = ShuffledAlphabet[i + 'a' - 'A'];
/* fill the upper part */
for (i = 0; i < NCHAR; i++)
ShuffledAlphabet[i + NCHAR] = ShuffledAlphabet[i];
for (i = 0; i < NASCII; i++)
ShuffledAlphabet[i + NASCII] = ShuffledAlphabet[i];
init = true;
}
@ -6266,7 +6267,8 @@ multiqueue_cache(basedir, blen, qg, qn, phash)
** If the directory does not exist, -1 is returned.
**
** Parameters:
** path -- pathname of directory
** name -- name of directory (must be persistent!)
** path -- pathname of directory (name plus maybe "/df")
** add -- add to structure if not found.
**
** Returns:
@ -6277,14 +6279,15 @@ multiqueue_cache(basedir, blen, qg, qn, phash)
** FSF_NOT_FOUND: not in list
*/
static short filesys_find __P((char *, bool));
static short filesys_find __P((char *, char *, bool));
#define FSF_NOT_FOUND (-1)
#define FSF_STAT_FAIL (-2)
#define FSF_TOO_MANY (-3)
static short
filesys_find(path, add)
filesys_find(name, path, add)
char *name;
char *path;
bool add;
{
@ -6310,7 +6313,7 @@ filesys_find(path, add)
return FSF_NOT_FOUND;
++NumFileSys;
FILE_SYS_NAME(i) = path;
FILE_SYS_NAME(i) = name;
FILE_SYS_DEV(i) = st.st_dev;
FILE_SYS_AVAIL(i) = 0;
FILE_SYS_BLKSIZE(i) = 1024; /* avoid divide by zero */
@ -6350,8 +6353,12 @@ filesys_setup(add)
for (j = 0; j < Queue[i]->qg_numqueues; ++j)
{
QPATHS *qp = &Queue[i]->qg_qpaths[j];
char qddf[MAXPATHLEN];
fs = filesys_find(qp->qp_name, add);
(void) sm_strlcpyn(qddf, sizeof qddf, 2, qp->qp_name,
(bitset(QP_SUBDF, qp->qp_subdirs)
? "/df" : ""));
fs = filesys_find(qp->qp_name, qddf, add);
if (fs >= 0)
qp->qp_fsysidx = fs;
else
@ -6679,6 +6686,22 @@ write_key_file(keypath, key)
}
else
{
if (geteuid() == 0 && RunAsUid != 0)
{
# if HASFCHOWN
int fd;
fd = keyf->f_file;
if (fd >= 0 && fchown(fd, RunAsUid, -1) < 0)
{
int err = errno;
sm_syslog(LOG_ALERT, NOQID,
"ownership change on %s to %d failed: %s",
keypath, RunAsUid, sm_errstring(err));
}
# endif /* HASFCHOWN */
}
ok = sm_io_fprintf(keyf, SM_TIME_DEFAULT, "%ld\n", key) !=
SM_IO_EOF;
ok = (sm_io_close(keyf, SM_TIME_DEFAULT) != SM_IO_EOF) && ok;
@ -6830,13 +6853,11 @@ init_shm(qn, owner, hash)
#endif /* _FFR_SELECT_SHM */
if (owner && RunAsUid != 0)
{
i = sm_shmsetowner(ShmId, RunAsUid, RunAsGid,
0660);
i = sm_shmsetowner(ShmId, RunAsUid, RunAsGid, 0660);
if (i != 0)
sm_syslog(LOG_ERR, NOQID,
"key=%ld, sm_shmsetowner=%d, RunAsUid=%d, RunAsGid=%d",
(long) ShmKey, i,
RunAsUid, RunAsGid);
"key=%ld, sm_shmsetowner=%d, RunAsUid=%d, RunAsGid=%d",
(long) ShmKey, i, RunAsUid, RunAsGid);
}
p = (int *) Pshm;
if (owner)
@ -7722,8 +7743,11 @@ dup_df(old, new)
** are on the same file system.
*/
ofs = Queue[old->e_qgrp]->qg_qpaths[old->e_qdir].qp_fsysidx;
nfs = Queue[new->e_qgrp]->qg_qpaths[new->e_qdir].qp_fsysidx;
SM_REQUIRE(ISVALIDQGRP(old->e_dfqgrp) && ISVALIDQDIR(old->e_dfqdir));
SM_REQUIRE(ISVALIDQGRP(new->e_dfqgrp) && ISVALIDQDIR(new->e_dfqdir));
ofs = Queue[old->e_dfqgrp]->qg_qpaths[old->e_dfqdir].qp_fsysidx;
nfs = Queue[new->e_dfqgrp]->qg_qpaths[new->e_dfqdir].qp_fsysidx;
if (FILE_SYS_DEV(ofs) == FILE_SYS_DEV(nfs))
{
if (link(opath, npath) == 0)

View File

@ -45,7 +45,7 @@
*/
#include <sendmail.h>
SM_RCSID("@(#)$Id: ratectrl.c,v 8.9 2004/07/07 21:23:57 ca Exp $")
SM_RCSID("@(#)$Id: ratectrl.c,v 8.10 2005/06/14 23:07:23 ca Exp $")
/*
** stuff included - given some warnings (inet_ntoa)
@ -56,7 +56,7 @@ SM_RCSID("@(#)$Id: ratectrl.c,v 8.9 2004/07/07 21:23:57 ca Exp $")
# include <arpa/inet.h>
#endif /* NETINET || NETINET6 */
#include <sys/time.h>
#include <sm/time.h>
#ifndef HASH_ALG
# define HASH_ALG 2

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2004 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2006 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 @@
#include <sendmail.h>
SM_RCSID("@(#)$Id: readcf.c,v 8.642 2004/08/04 21:17:57 ca Exp $")
SM_RCSID("@(#)$Id: readcf.c,v 8.651 2006/03/02 19:17:09 ca Exp $")
#if NETINET || NETINET6
# include <arpa/inet.h>
@ -679,7 +679,7 @@ readcf(cfname, safe, e)
p = strchr(bp, '=');
if (p != NULL)
*p++ = '\0';
setuserenv(&bp[1], p);
sm_setuserenv(&bp[1], p);
break;
case 'X': /* mail filter */
@ -2191,6 +2191,26 @@ static struct optioninfo
# define O_HELONAME 0xd8
{ "HeloName", O_HELONAME, OI_NONE },
#endif /* _FFR_HELONAME */
#if _FFR_MEMSTAT
# define O_REFUSELOWMEM 0xd9
{ "RefuseLowMem", O_REFUSELOWMEM, OI_NONE },
# define O_QUEUELOWMEM 0xda
{ "QueueLowMem", O_QUEUELOWMEM, OI_NONE },
# define O_MEMRESOURCE 0xdb
{ "MemoryResource", O_MEMRESOURCE, OI_NONE },
#endif /* _FFR_MEMSTAT */
#if _FFR_MAXNOOPCOMMANDS
# define O_MAXNOOPCOMMANDS 0xdc
{ "MaxNOOPCommands", O_MAXNOOPCOMMANDS, OI_NONE },
#endif /* _FFR_MAXNOOPCOMMANDS */
#if _FFR_MSG_ACCEPT
# define O_MSG_ACCEPT 0xdd
{ "MessageAccept", O_MSG_ACCEPT, OI_NONE },
#endif /* _FFR_MSG_ACCEPT */
#if _FFR_QUEUE_RUN_PARANOIA
# define O_CHK_Q_RUNNERS 0xde
{ "CheckQueueRunners", O_CHK_Q_RUNNERS, OI_NONE },
#endif /* _FFR_QUEUE_RUN_PARANOIA */
{ NULL, '\0', OI_NONE }
};
@ -2231,10 +2251,10 @@ setoption(opt, val, safe, sticky, e)
#if _FFR_ALLOW_SASLINFO
extern unsigned int SubmitMode;
#endif /* _FFR_ALLOW_SASLINFO */
#if STARTTLS
#if STARTTLS || (_FFR_SELECT_SHM && SM_CONF_SHM)
char *newval;
char exbuf[MAXLINE];
#endif /* STARTTLS */
#endif /* STARTTLS || (_FFR_SELECT_SHM && SM_CONF_SHM) */
errno = 0;
if (opt == ' ')
@ -2472,6 +2492,10 @@ setoption(opt, val, safe, sticky, e)
case SM_DEFER: /* queue only and defer map lookups */
case SM_DELIVER: /* do everything */
case SM_FORK: /* fork after verification */
#if _FFR_DM_ONE
/* deliver first TA in background, then queue */
case SM_DM_ONE:
#endif /* _FFR_DM_ONE */
set_delivery_mode(*val, e);
break;
@ -3707,9 +3731,38 @@ setoption(opt, val, safe, sticky, e)
#if _FFR_HELONAME
case O_HELONAME:
HeloName = newstr(val);
break;
HeloName = newstr(val);
break;
#endif /* _FFR_HELONAME */
#if _FFR_MEMSTAT
case O_REFUSELOWMEM:
RefuseLowMem = atoi(val);
break;
case O_QUEUELOWMEM:
QueueLowMem = atoi(val);
break;
case O_MEMRESOURCE:
MemoryResource = newstr(val);
break;
#endif /* _FFR_MEMSTAT */
#if _FFR_MAXNOOPCOMMANDS
case O_MAXNOOPCOMMANDS:
MaxNOOPCommands = atoi(val);
break;
#endif /* _FFR_MAXNOOPCOMMANDS */
#if _FFR_MSG_ACCEPT
case O_MSG_ACCEPT:
MessageAccept = newstr(val);
break;
#endif /* _FFR_MSG_ACCEPT */
#if _FFR_QUEUE_RUN_PARANOIA
case O_CHK_Q_RUNNERS:
CheckQueueRunners = atoi(val);
break;
#endif /* _FFR_QUEUE_RUN_PARANOIA */
default:
if (tTd(37, 1))

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2005 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2006 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -52,7 +52,7 @@
#ifdef _DEFINE
# ifndef lint
SM_UNUSED(static char SmailId[]) = "@(#)$Id: sendmail.h,v 8.993 2005/03/07 18:03:17 ca Exp $";
SM_UNUSED(static char SmailId[]) = "@(#)$Id: sendmail.h,v 8.1006 2006/02/27 17:49:09 ca Exp $";
# endif /* ! lint */
#endif /* _DEFINE */
@ -809,13 +809,13 @@ extern struct hdrinfo HdrInfo[];
/* functions */
extern void addheader __P((char *, char *, int, ENVELOPE *));
extern unsigned long chompheader __P((char *, int, HDR **, ENVELOPE *));
extern void commaize __P((HDR *, char *, bool, MCI *, ENVELOPE *));
extern bool commaize __P((HDR *, char *, bool, MCI *, ENVELOPE *));
extern HDR *copyheader __P((HDR *, SM_RPOOL_T *));
extern void eatheader __P((ENVELOPE *, bool, bool));
extern char *hvalue __P((char *, HDR *));
extern void insheader __P((int, char *, char *, int, ENVELOPE *));
extern bool isheader __P((char *));
extern void putfromline __P((MCI *, ENVELOPE *));
extern bool putfromline __P((MCI *, ENVELOPE *));
extern void setupheaders __P((void));
/*
@ -870,9 +870,9 @@ struct envelope
short e_sendmode; /* message send mode */
short e_errormode; /* error return mode */
short e_timeoutclass; /* message timeout class */
void (*e_puthdr)__P((MCI *, HDR *, ENVELOPE *, int));
bool (*e_puthdr)__P((MCI *, HDR *, ENVELOPE *, int));
/* function to put header of message */
void (*e_putbody)__P((MCI *, ENVELOPE *, char *));
bool (*e_putbody)__P((MCI *, ENVELOPE *, char *));
/* function to put body of message */
ENVELOPE *e_parent; /* the message this one encloses */
ENVELOPE *e_sibling; /* the next envelope of interest */
@ -965,8 +965,8 @@ extern void dropenvelope __P((ENVELOPE *, bool, bool));
extern ENVELOPE *newenvelope __P((ENVELOPE *, ENVELOPE *, SM_RPOOL_T *));
extern void clrsessenvelope __P((ENVELOPE *));
extern void printenvflags __P((ENVELOPE *));
extern void putbody __P((MCI *, ENVELOPE *, char *));
extern void putheader __P((MCI *, HDR *, ENVELOPE *, int));
extern bool putbody __P((MCI *, ENVELOPE *, char *));
extern bool putheader __P((MCI *, HDR *, ENVELOPE *, int));
/*
** Message priority classes.
@ -1213,7 +1213,7 @@ MAP
#define MF_REGEX_NOT 0x00040000 /* regular expression negation */
#define MF_DEFER 0x00080000 /* don't lookup map in defer mode */
#define MF_SINGLEMATCH 0x00100000 /* successful only if match one key */
/* 0x00200000 available for use */
#define MF_SINGLEDN 0x00200000 /* only one match, but multi values */
#define MF_FILECLASS 0x00400000 /* this is a file class map */
#define MF_OPENBOGUS 0x00800000 /* open failed, don't call map_close */
#define MF_CLOSING 0x01000000 /* map is being closed */
@ -1542,9 +1542,13 @@ extern void stabapply __P((void (*)(STAB *, int), int));
/* values for e_sendmode -- send modes */
#define SM_DELIVER 'i' /* interactive delivery */
#define SM_FORK 'b' /* deliver in background */
#if _FFR_DM_ONE
#define SM_DM_ONE 'o' /* deliver first TA in background, then queue */
#endif /* _FFR_DM_ONE */
#define SM_QUEUE 'q' /* queue, don't deliver */
#define SM_DEFER 'd' /* defer map lookups as well as queue */
#define SM_VERIFY 'v' /* verify only (used internally) */
#define DM_NOTSET (-1) /* DeliveryMode (per daemon) option not set */
#define WILL_BE_QUEUED(m) ((m) == SM_QUEUE || (m) == SM_DEFER)
@ -1650,7 +1654,7 @@ EXTERN unsigned long PrivacyFlags; /* privacy flags */
#define M87F_NO8TO7 0x0004 /* don't do 8->7 bit conversions */
/* functions */
extern void mime7to8 __P((MCI *, HDR *, ENVELOPE *));
extern bool mime7to8 __P((MCI *, HDR *, ENVELOPE *));
extern int mime8to7 __P((MCI *, HDR *, ENVELOPE *, char **, int));
/*
@ -1820,11 +1824,12 @@ struct termescape
#define TLS_I_SRV_CERT (TLS_I_CERT_EX | TLS_I_KEY_EX | \
TLS_I_KEY_UNR | TLS_I_KEY_OUNR | \
TLS_I_CERTP_EX | TLS_I_CERTF_EX | \
TLS_I_USE_KEY | TLS_I_USE_CERT)
TLS_I_USE_KEY | TLS_I_USE_CERT | TLS_I_CACHE)
/* server requirements */
#define TLS_I_SRV (TLS_I_SRV_CERT | TLS_I_RSA_TMP | TLS_I_VRFY_PATH | \
TLS_I_VRFY_LOC | TLS_I_TRY_DH | TLS_I_DH512)
TLS_I_VRFY_LOC | TLS_I_TRY_DH | TLS_I_DH512 | \
TLS_I_CACHE)
/* client requirements */
#define TLS_I_CLT (TLS_I_KEY_UNR | TLS_I_KEY_OUNR)
@ -1841,7 +1846,7 @@ extern void setclttls __P((bool));
extern bool initsrvtls __P((bool));
extern int tls_get_info __P((SSL *, bool, char *, MACROS_T *, bool));
extern int endtls __P((SSL *, char *));
extern void tlslogerr __P((char *));
extern void tlslogerr __P((const char *));
EXTERN char *CACertPath; /* path to CA certificates (dir. with hashes) */
@ -2141,11 +2146,13 @@ extern unsigned char tTdvect[100]; /* trace vector */
EXTERN bool AllowBogusHELO; /* allow syntax errors on HELO command */
EXTERN bool CheckAliases; /* parse addresses during newaliases */
#if _FFR_QUEUE_RUN_PARANOIA
EXTERN int CheckQueueRunners; /* check whether queue runners are OK */
#endif /* _FFR_QUEUE_RUN_PARANOIA */
EXTERN bool ColonOkInAddr; /* single colon legal in address */
#if !defined(_USE_SUN_NSSWITCH_) && !defined(_USE_DEC_SVC_CONF_)
EXTERN bool ConfigFileRead; /* configuration file has been read */
#endif /* !defined(_USE_SUN_NSSWITCH_) && !defined(_USE_DEC_SVC_CONF_) */
EXTERN bool volatile DataProgress; /* have we sent anything since last check */
EXTERN bool DisConnected; /* running with OutChannel redirect to transcript file */
EXTERN bool DontExpandCnames; /* do not $[...$] expand CNAMEs */
EXTERN bool DontInitGroups; /* avoid initgroups() because of NIS cost */
@ -2212,9 +2219,14 @@ EXTERN int MaxHopCount; /* max # of hops until bounce */
EXTERN int MaxMacroRecursion; /* maximum depth of macro recursion */
EXTERN int MaxMimeFieldLength; /* maximum MIME field length */
EXTERN int MaxMimeHeaderLength; /* maximum MIME header length */
EXTERN int MaxNOOPCommands; /* max "noise" commands before slowdown */
EXTERN int MaxRcptPerMsg; /* max recipients per SMTP message */
EXTERN int MaxRuleRecursion; /* maximum depth of ruleset recursion */
#if _FFR_MSG_ACCEPT
EXTERN char *MessageAccept;
#endif /* _FFR_MSG_ACCEPT */
EXTERN int MimeMode; /* MIME processing mode */
EXTERN int NoRecipientAction;
@ -2229,6 +2241,11 @@ EXTERN int NumFileSys; /* number of queue file systems */
EXTERN int QueueLA; /* load average starting forced queueing */
EXTERN int RefuseLA; /* load average refusing connections */
EXTERN time_t RejectLogInterval; /* time btwn log msgs while refusing */
#if _FFR_MEMSTAT
EXTERN long QueueLowMem; /* low memory starting forced queueing */
EXTERN long RefuseLowMem; /* low memory refusing connections */
EXTERN char *MemoryResource;/* memory resource to look up */
#endif /* _FFR_MEMSTAT */
EXTERN int SuperSafe; /* be extra careful, even if expensive */
EXTERN int VendorCode; /* vendor-specific operation enhancements */
EXTERN int Verbose; /* set if blow-by-blow desired */
@ -2371,6 +2388,7 @@ extern void smtpquit __P((MAILER *, MCI *, ENVELOPE *));
extern int smtprcpt __P((ADDRESS *, MAILER *, MCI *, ENVELOPE *, ADDRESS *, time_t));
extern void smtprset __P((MAILER *, MCI *, ENVELOPE *));
#define REPLYTYPE(r) ((r) / 100) /* first digit of reply code */
#define ISSMTPCODE(c) (isascii(c[0]) && isdigit(c[0]) && \
isascii(c[1]) && isdigit(c[1]) && \
isascii(c[2]) && isdigit(c[2]))
@ -2519,8 +2537,8 @@ extern void printopenfds __P((bool));
extern void printqueue __P((void));
extern void printrules __P((void));
extern pid_t prog_open __P((char **, int *, ENVELOPE *));
extern void putline __P((char *, MCI *));
extern void putxline __P((char *, size_t, MCI *, int));
extern bool putline __P((char *, MCI *));
extern bool putxline __P((char *, size_t, MCI *, int));
extern void queueup_macros __P((int, SM_FILE_T *, ENVELOPE *));
extern void readcf __P((char *, bool, ENVELOPE *));
extern SIGFUNC_DECL reapchild __P((int));
@ -2540,7 +2558,7 @@ extern bool setvendor __P((char *));
extern void set_op_mode __P((int));
extern void setoption __P((int, char *, bool, bool, ENVELOPE *));
extern sigfunc_t setsignal __P((int, sigfunc_t));
extern void setuserenv __P((const char *, const char *));
extern void sm_setuserenv __P((const char *, const char *));
extern void settime __P((ENVELOPE *));
extern char *sfgets __P((char *, int, SM_FILE_T *, time_t, char *));
extern char *shortenstring __P((const char *, size_t));

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2004 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2006 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@ -9,7 +9,7 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: sfsasl.c,v 8.101 2004/12/15 22:45:55 ca Exp $")
SM_RCSID("@(#)$Id: sfsasl.c,v 8.113 2006/03/02 19:18:27 ca Exp $")
#include <stdlib.h>
#include <sendmail.h>
#include <errno.h>
@ -223,6 +223,9 @@ sasl_read(fp, buf, size)
(unsigned int) len, &outbuf, &outlen);
if (result != SASL_OK)
{
if (LogLevel > 7)
sm_syslog(LOG_WARNING, NOQID,
"AUTH: sasl_decode error=%d", result);
outbuf = NULL;
offset = 0;
outlen = 0;
@ -304,7 +307,7 @@ sasl_write(fp, buf, size)
*/
result = sasl_getprop(so->conn, SASL_MAXOUTBUF,
(const void **) &maxencode);
(const void **) &maxencode);
if (result == SASL_OK && size > *maxencode && *maxencode > 0)
size = *maxencode;
@ -312,7 +315,12 @@ sasl_write(fp, buf, size)
(unsigned int) size, &outbuf, &outlen);
if (result != SASL_OK)
{
if (LogLevel > 7)
sm_syslog(LOG_WARNING, NOQID,
"AUTH: sasl_encode error=%d", result);
return -1;
}
if (outbuf != NULL)
{
@ -540,6 +548,125 @@ tls_close(fp)
/* maximum number of retries for TLS related I/O due to handshakes */
# define MAX_TLS_IOS 4
/*
** TLS_RETRY -- check whether a failed SSL operation can be retried
**
** Parameters:
** ssl -- TLS structure
** rfd -- read fd
** wfd -- write fd
** tlsstart -- start time of TLS operation
** timeout -- timeout for TLS operation
** err -- SSL error
** where -- description of operation
**
** Results:
** >0 on success
** 0 on timeout
** <0 on error
*/
int
tls_retry(ssl, rfd, wfd, tlsstart, timeout, err, where)
SSL *ssl;
int rfd;
int wfd;
time_t tlsstart;
int timeout;
int err;
const char *where;
{
int ret;
time_t left;
time_t now = curtime();
struct timeval tv;
ret = -1;
/*
** For SSL_ERROR_WANT_{READ,WRITE}:
** There is not a complete SSL record available yet
** or there is only a partial SSL record removed from
** the network (socket) buffer into the SSL buffer.
** The SSL_connect will only succeed when a full
** SSL record is available (assuming a "real" error
** doesn't happen). To handle when a "real" error
** does happen the select is set for exceptions too.
** The connection may be re-negotiated during this time
** so both read and write "want errors" need to be handled.
** A select() exception loops back so that a proper SSL
** error message can be gotten.
*/
left = timeout - (now - tlsstart);
if (left <= 0)
return 0; /* timeout */
tv.tv_sec = left;
tv.tv_usec = 0;
if (LogLevel > 14)
{
sm_syslog(LOG_INFO, NOQID,
"STARTTLS=%s, info: fds=%d/%d, err=%d",
where, rfd, wfd, err);
}
if (FD_SETSIZE > 0 &&
((err == SSL_ERROR_WANT_READ && rfd >= FD_SETSIZE) ||
(err == SSL_ERROR_WANT_WRITE && wfd >= FD_SETSIZE)))
{
if (LogLevel > 5)
{
sm_syslog(LOG_ERR, NOQID,
"STARTTLS=%s, error: fd %d/%d too large",
where, rfd, wfd);
if (LogLevel > 8)
tlslogerr(where);
}
errno = EINVAL;
}
else if (err == SSL_ERROR_WANT_READ)
{
fd_set ssl_maskr, ssl_maskx;
FD_ZERO(&ssl_maskr);
FD_SET(rfd, &ssl_maskr);
FD_ZERO(&ssl_maskx);
FD_SET(rfd, &ssl_maskx);
do
{
ret = select(rfd + 1, &ssl_maskr, NULL, &ssl_maskx,
&tv);
} while (ret < 0 && errno == EINTR);
if (ret < 0 && errno > 0)
ret = -errno;
}
else if (err == SSL_ERROR_WANT_WRITE)
{
fd_set ssl_maskw, ssl_maskx;
FD_ZERO(&ssl_maskw);
FD_SET(wfd, &ssl_maskw);
FD_ZERO(&ssl_maskx);
FD_SET(rfd, &ssl_maskx);
do
{
ret = select(wfd + 1, NULL, &ssl_maskw, &ssl_maskx,
&tv);
} while (ret < 0 && errno == EINTR);
if (ret < 0 && errno > 0)
ret = -errno;
}
return ret;
}
/* errno to force refill() etc to stop (see IS_IO_ERROR()) */
#ifdef ETIMEDOUT
# define SM_ERR_TIMEOUT ETIMEDOUT
#else /* ETIMEDOUT */
# define SM_ERR_TIMEOUT EIO
#endif /* ETIMEDOUT */
/*
** TLS_READ -- read secured information for the caller
**
@ -561,38 +688,42 @@ tls_read(fp, buf, size)
char *buf;
size_t size;
{
int r;
static int again = MAX_TLS_IOS;
int r, rfd, wfd, try, ssl_err;
struct tls_obj *so = (struct tls_obj *) fp->f_cookie;
time_t tlsstart;
char *err;
try = 99;
err = NULL;
tlsstart = curtime();
retry:
r = SSL_read(so->con, (char *) buf, size);
if (r > 0)
{
again = MAX_TLS_IOS;
return r;
}
err = NULL;
switch (SSL_get_error(so->con, r))
switch (ssl_err = SSL_get_error(so->con, r))
{
case SSL_ERROR_NONE:
case SSL_ERROR_ZERO_RETURN:
again = MAX_TLS_IOS;
break;
case SSL_ERROR_WANT_WRITE:
if (--again <= 0)
err = "read W BLOCK";
else
errno = EAGAIN;
break;
err = "read W BLOCK";
/* FALLTHROUGH */
case SSL_ERROR_WANT_READ:
if (--again <= 0)
if (err == NULL)
err = "read R BLOCK";
else
errno = EAGAIN;
rfd = SSL_get_rfd(so->con);
wfd = SSL_get_wfd(so->con);
try = tls_retry(so->con, rfd, wfd, tlsstart,
TimeOuts.to_datablock, ssl_err, "read");
if (try > 0)
goto retry;
errno = SM_ERR_TIMEOUT;
break;
case SSL_ERROR_WANT_X509_LOOKUP:
err = "write X BLOCK";
break;
@ -625,15 +756,22 @@ tls_read(fp, buf, size)
int save_errno;
save_errno = (errno == 0) ? EIO : errno;
again = MAX_TLS_IOS;
if (LogLevel > 9)
if (try == 0 && save_errno == SM_ERR_TIMEOUT)
{
if (LogLevel > 7)
sm_syslog(LOG_WARNING, NOQID,
"STARTTLS: read error=timeout");
}
else if (LogLevel > 8)
sm_syslog(LOG_WARNING, NOQID,
"STARTTLS: read error=%s (%d), errno=%d, get_error=%s",
"STARTTLS: read error=%s (%d), errno=%d, get_error=%s, retry=%d, ssl_err=%d",
err, r, errno,
ERR_error_string(ERR_get_error(), NULL));
ERR_error_string(ERR_get_error(), NULL), try,
ssl_err);
else if (LogLevel > 7)
sm_syslog(LOG_WARNING, NOQID,
"STARTTLS: read error=%s (%d)", err, r);
"STARTTLS: read error=%s (%d), retry=%d, ssl_err=%d",
err, r, errno, try, ssl_err);
errno = save_errno;
}
return r;
@ -660,36 +798,39 @@ tls_write(fp, buf, size)
const char *buf;
size_t size;
{
int r;
static int again = MAX_TLS_IOS;
int r, rfd, wfd, try, ssl_err;
struct tls_obj *so = (struct tls_obj *) fp->f_cookie;
time_t tlsstart;
char *err;
try = 99;
err = NULL;
tlsstart = curtime();
retry:
r = SSL_write(so->con, (char *) buf, size);
if (r > 0)
{
again = MAX_TLS_IOS;
return r;
}
err = NULL;
switch (SSL_get_error(so->con, r))
switch (ssl_err = SSL_get_error(so->con, r))
{
case SSL_ERROR_NONE:
case SSL_ERROR_ZERO_RETURN:
again = MAX_TLS_IOS;
break;
case SSL_ERROR_WANT_WRITE:
if (--again <= 0)
err = "write W BLOCK";
else
errno = EAGAIN;
break;
err = "read W BLOCK";
/* FALLTHROUGH */
case SSL_ERROR_WANT_READ:
if (--again <= 0)
err = "write R BLOCK";
else
errno = EAGAIN;
if (err == NULL)
err = "read R BLOCK";
rfd = SSL_get_rfd(so->con);
wfd = SSL_get_wfd(so->con);
try = tls_retry(so->con, rfd, wfd, tlsstart,
DATA_PROGRESS_TIMEOUT, ssl_err, "write");
if (try > 0)
goto retry;
errno = SM_ERR_TIMEOUT;
break;
case SSL_ERROR_WANT_X509_LOOKUP:
err = "write X BLOCK";
@ -722,15 +863,22 @@ tls_write(fp, buf, size)
int save_errno;
save_errno = (errno == 0) ? EIO : errno;
again = MAX_TLS_IOS;
if (LogLevel > 9)
if (try == 0 && save_errno == SM_ERR_TIMEOUT)
{
if (LogLevel > 7)
sm_syslog(LOG_WARNING, NOQID,
"STARTTLS: write error=timeout");
}
else if (LogLevel > 8)
sm_syslog(LOG_WARNING, NOQID,
"STARTTLS: write error=%s (%d), errno=%d, get_error=%s",
"STARTTLS: write error=%s (%d), errno=%d, get_error=%s, retry=%d, ssl_err=%d",
err, r, errno,
ERR_error_string(ERR_get_error(), NULL));
ERR_error_string(ERR_get_error(), NULL), try,
ssl_err);
else if (LogLevel > 7)
sm_syslog(LOG_WARNING, NOQID,
"STARTTLS: write error=%s (%d)", err, r);
"STARTTLS: write error=%s (%d), errno=%d, retry=%d, ssl_err=%d",
err, r, errno, try, ssl_err);
errno = save_errno;
}
return r;

View File

@ -1,12 +1,12 @@
/*
* Copyright (c) 1999, 2000 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999, 2000, 2006 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: sfsasl.h,v 8.17 2000/09/19 21:30:49 ca Exp $"
* $Id: sfsasl.h,v 8.19 2006/02/27 19:53:37 ca Exp $"
*/
#ifndef SFSASL_H
@ -17,6 +17,8 @@ extern int sfdcsasl __P((SM_FILE_T **, SM_FILE_T **, sasl_conn_t *));
#endif /* SASL */
# if STARTTLS
extern int tls_retry __P((SSL *, int, int, time_t, int, int,
const char *));
extern int sfdctls __P((SM_FILE_T **, SM_FILE_T **, SSL *));
# endif /* STARTTLS */

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2005 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2006 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -17,9 +17,9 @@
# include <libmilter/mfdef.h>
#endif /* MILTER */
SM_RCSID("@(#)$Id: srvrsmtp.c,v 8.906 2005/03/16 00:36:09 ca Exp $")
SM_RCSID("@(#)$Id: srvrsmtp.c,v 8.922 2006/02/28 00:42:13 ca Exp $")
#include <sys/time.h>
#include <sm/time.h>
#include <sm/fdset.h>
#if SASL || STARTTLS
@ -36,6 +36,9 @@ static SSL_CTX *srv_ctx = NULL; /* TLS server context */
static SSL *srv_ssl = NULL; /* per connection context */
static bool tls_ok_srv = false;
#if _FFR_DM_ONE
static bool NotFirstDelivery = false;
#endif /* _FFR_DM_ONE */
extern void tls_set_verify __P((SSL_CTX *, SSL *, bool));
# define TLS_VERIFY_CLIENT() tls_set_verify(srv_ctx, srv_ssl, \
@ -221,9 +224,6 @@ static char *CurSmtpClient; /* who's at the other end of channel */
#ifndef MAXBADCOMMANDS
# define MAXBADCOMMANDS 25 /* maximum number of bad commands */
#endif /* ! MAXBADCOMMANDS */
#ifndef MAXNOOPCOMMANDS
# define MAXNOOPCOMMANDS 20 /* max "noise" commands before slowdown */
#endif /* ! MAXNOOPCOMMANDS */
#ifndef MAXHELOCOMMANDS
# define MAXHELOCOMMANDS 3 /* max HELO/EHLO commands before slowdown */
#endif /* ! MAXHELOCOMMANDS */
@ -292,6 +292,24 @@ static bool smtp_data __P((SMTP_T *, ENVELOPE *));
\
switch (state) \
{ \
case SMFIR_SHUTDOWN: \
if (MilterLogLevel > 3) \
{ \
sm_syslog(LOG_INFO, e->e_id, \
"Milter: %s=%s, reject=421, errormode=4", \
str, addr); \
LogUsrErrs = false; \
} \
{ \
bool tsave = QuickAbort; \
\
QuickAbort = false; \
usrerr("421 4.3.0 closing connection"); \
QuickAbort = tsave; \
e->e_sendqueue = NULL; \
goto doquit; \
} \
break; \
case SMFIR_REPLYCODE: \
if (MilterLogLevel > 3) \
{ \
@ -300,7 +318,8 @@ static bool smtp_data __P((SMTP_T *, ENVELOPE *));
str, addr, response); \
LogUsrErrs = false; \
} \
if (strncmp(response, "421 ", 4) == 0) \
if (strncmp(response, "421 ", 4) == 0 \
|| strncmp(response, "421-", 4) == 0) \
{ \
bool tsave = QuickAbort; \
\
@ -504,7 +523,6 @@ smtp(nullserver, d_flags, e)
#endif /* SASL */
int r;
#if STARTTLS
int fdfl;
int rfd, wfd;
volatile bool tls_active = false;
volatile bool smtps = bitnset(D_SMTPS, d_flags);
@ -810,6 +828,19 @@ smtp(nullserver, d_flags, e)
tempfail = true;
smtp.sm_milterize = false;
break;
case SMFIR_SHUTDOWN:
if (MilterLogLevel > 3)
sm_syslog(LOG_INFO, e->e_id,
"Milter: initialization failed, closing connection");
tempfail = true;
smtp.sm_milterize = false;
message("421 4.7.0 %s closing connection",
MyHostName);
/* arrange to ignore send list */
e->e_sendqueue = NULL;
goto doquit;
}
}
@ -896,6 +927,9 @@ smtp(nullserver, d_flags, e)
int fd;
fd_set readfds;
struct timeval timeout;
#if _FFR_LOG_GREET_PAUSE
struct timeval bp, ep, tp; /* {begin,end,total}pause */
#endif /* _FFR_LOG_GREET_PAUSE */
/* pause for a moment */
timeout.tv_sec = msecs / 1000;
@ -912,16 +946,32 @@ smtp(nullserver, d_flags, e)
fd = sm_io_getinfo(InChannel, SM_IO_WHAT_FD, NULL);
FD_ZERO(&readfds);
SM_FD_SET(fd, &readfds);
#if _FFR_LOG_GREET_PAUSE
gettimeofday(&bp, NULL);
#endif /* _FFR_LOG_GREET_PAUSE */
if (select(fd + 1, FDSET_CAST &readfds,
NULL, NULL, &timeout) > 0 &&
FD_ISSET(fd, &readfds))
{
#if _FFR_LOG_GREET_PAUSE
gettimeofday(&ep, NULL);
timersub(&ep, &bp, &tp);
#endif /* _FFR_LOG_GREET_PAUSE */
greetcode = "554";
nullserver = "Command rejected";
sm_syslog(LOG_INFO, e->e_id,
#if _FFR_LOG_GREET_PAUSE
"rejecting commands from %s [%s] after %d seconds due to pre-greeting traffic",
#else /* _FFR_LOG_GREET_PAUSE */
"rejecting commands from %s [%s] due to pre-greeting traffic",
#endif /* _FFR_LOG_GREET_PAUSE */
peerhostname,
anynet_ntoa(&RealHostAddr));
anynet_ntoa(&RealHostAddr)
#if _FFR_LOG_GREET_PAUSE
, (int) tp.tv_sec +
(tp.tv_usec >= 500000 ? 1 : 0)
#endif /* _FFR_LOG_GREET_PAUSE */
);
}
}
}
@ -1693,97 +1743,26 @@ smtp(nullserver, d_flags, e)
# define SSL_ACC(s) SSL_accept(s)
tlsstart = curtime();
fdfl = fcntl(rfd, F_GETFL);
if (fdfl != -1)
fcntl(rfd, F_SETFL, fdfl|O_NONBLOCK);
ssl_retry:
if ((r = SSL_ACC(srv_ssl)) <= 0)
{
int i;
bool timedout;
time_t left;
time_t now = curtime();
struct timeval tv;
int i, ssl_err;
/* what to do in this case? */
i = SSL_get_error(srv_ssl, r);
ssl_err = SSL_get_error(srv_ssl, r);
i = tls_retry(srv_ssl, rfd, wfd, tlsstart,
TimeOuts.to_starttls, ssl_err,
"server");
if (i > 0)
goto ssl_retry;
/*
** For SSL_ERROR_WANT_{READ,WRITE}:
** There is no SSL record available yet
** or there is only a partial SSL record
** removed from the network (socket) buffer
** into the SSL buffer. The SSL_accept will
** only succeed when a full SSL record is
** available (assuming a "real" error
** doesn't happen). To handle when a "real"
** error does happen the select is set for
** exceptions too.
** The connection may be re-negotiated
** during this time so both read and write
** "want errors" need to be handled.
** A select() exception loops back so that
** a proper SSL error message can be gotten.
*/
left = TimeOuts.to_starttls - (now - tlsstart);
timedout = left <= 0;
if (!timedout)
{
tv.tv_sec = left;
tv.tv_usec = 0;
}
if (!timedout && FD_SETSIZE > 0 &&
(rfd >= FD_SETSIZE ||
(i == SSL_ERROR_WANT_WRITE &&
wfd >= FD_SETSIZE)))
{
if (LogLevel > 5)
{
sm_syslog(LOG_ERR, NOQID,
"STARTTLS=server, error: fd %d/%d too large",
rfd, wfd);
if (LogLevel > 8)
tlslogerr("server");
}
goto tlsfail;
}
/* XXX what about SSL_pending() ? */
if (!timedout && i == SSL_ERROR_WANT_READ)
{
fd_set ssl_maskr, ssl_maskx;
FD_ZERO(&ssl_maskr);
FD_SET(rfd, &ssl_maskr);
FD_ZERO(&ssl_maskx);
FD_SET(rfd, &ssl_maskx);
if (select(rfd + 1, &ssl_maskr, NULL,
&ssl_maskx, &tv) > 0)
goto ssl_retry;
}
if (!timedout && i == SSL_ERROR_WANT_WRITE)
{
fd_set ssl_maskw, ssl_maskx;
FD_ZERO(&ssl_maskw);
FD_SET(wfd, &ssl_maskw);
FD_ZERO(&ssl_maskx);
FD_SET(rfd, &ssl_maskx);
if (select(wfd + 1, NULL, &ssl_maskw,
&ssl_maskx, &tv) > 0)
goto ssl_retry;
}
if (LogLevel > 5)
{
sm_syslog(LOG_WARNING, NOQID,
"STARTTLS=server, error: accept failed=%d, SSL_error=%d, timedout=%d, errno=%d",
r, i, (int) timedout, errno);
"STARTTLS=server, error: accept failed=%d, SSL_error=%d, errno=%d, retry=%d",
r, ssl_err, errno, i);
if (LogLevel > 8)
tlslogerr("server");
}
tlsfail:
tls_ok_srv = false;
SSL_free(srv_ssl);
srv_ssl = NULL;
@ -1798,9 +1777,6 @@ smtp(nullserver, d_flags, e)
goto doquit;
}
if (fdfl != -1)
fcntl(rfd, F_SETFL, fdfl);
/* ignore return code for now, it's in {verify} */
(void) tls_get_info(srv_ssl, true,
CurSmtpClient,
@ -1998,10 +1974,8 @@ smtp(nullserver, d_flags, e)
q = "accepting invalid domain name";
}
if (gothello)
{
if (gothello || smtp.sm_gotmail)
CLEAR_STATE(cmdbuf);
}
#if MILTER
if (smtp.sm_milterlist && smtp.sm_milterize &&
@ -2039,6 +2013,19 @@ smtp(nullserver, d_flags, e)
tempfail = true;
smtp.sm_milterize = false;
break;
case SMFIR_SHUTDOWN:
if (MilterLogLevel > 3)
sm_syslog(LOG_INFO, e->e_id,
"Milter: Milter: helo=%s, reject=421 4.7.0 %s closing connection",
p, MyHostName);
tempfail = true;
smtp.sm_milterize = false;
message("421 4.7.0 %s closing connection",
MyHostName);
/* arrange to ignore send list */
e->e_sendqueue = NULL;
goto doquit;
}
if (response != NULL)
sm_free(response);
@ -2475,7 +2462,11 @@ smtp(nullserver, d_flags, e)
goto rcpt_done;
}
if (e->e_sendmode != SM_DELIVER)
if (e->e_sendmode != SM_DELIVER
#if _FFR_DM_ONE
&& (NotFirstDelivery || SM_DM_ONE != e->e_sendmode)
#endif /* _FFR_DM_ONE */
)
e->e_flags |= EF_VRFYONLY;
#if MILTER
@ -2900,7 +2891,7 @@ smtp(nullserver, d_flags, e)
case CMDNOOP: /* noop -- do nothing */
DELAY_CONN("NOOP");
STOP_IF_ATTACK(checksmtpattack(&n_noop, MAXNOOPCOMMANDS,
STOP_IF_ATTACK(checksmtpattack(&n_noop, MaxNOOPCommands,
true, "NOOP", e));
message("250 2.0.0 OK");
break;
@ -2974,6 +2965,9 @@ smtp(nullserver, d_flags, e)
finis(true, true, ExitStat);
/* NOTREACHED */
/* just to avoid bogus warning from some compilers */
exit(EX_OSERR);
case CMDVERB: /* set verbose mode */
DELAY_CONN("VERB");
if (!bitset(SRV_OFFER_EXPN, features) ||
@ -2983,7 +2977,7 @@ smtp(nullserver, d_flags, e)
message("502 5.7.0 Verbose unavailable");
break;
}
STOP_IF_ATTACK(checksmtpattack(&n_noop, MAXNOOPCOMMANDS,
STOP_IF_ATTACK(checksmtpattack(&n_noop, MaxNOOPCommands,
true, "VERB", e));
Verbose = 1;
set_delivery_mode(SM_DELIVER, e);
@ -3044,7 +3038,8 @@ smtp(nullserver, d_flags, e)
MILTER_REPLY("unknown");
if (state == SMFIR_REPLYCODE ||
state == SMFIR_REJECT ||
state == SMFIR_TEMPFAIL)
state == SMFIR_TEMPFAIL ||
state == SMFIR_SHUTDOWN)
{
/* MILTER_REPLY already gave an error */
break;
@ -3111,6 +3106,7 @@ smtp_data(smtp, e)
char *id;
char *oldid;
char buf[32];
bool rv = true;
SmtpPhase = "server DATA";
if (!smtp->sm_gotmail)
@ -3149,7 +3145,8 @@ smtp_data(smtp, e)
LogUsrErrs = false;
}
usrerr(response);
if (strncmp(response, "421 ", 4) == 0)
if (strncmp(response, "421 ", 4) == 0
|| strncmp(response, "421-", 4) == 0)
{
e->e_sendqueue = NULL;
return false;
@ -3183,6 +3180,18 @@ smtp_data(smtp, e)
}
usrerr(MSG_TEMPFAIL);
return true;
case SMFIR_SHUTDOWN:
if (MilterLogLevel > 3)
{
sm_syslog(LOG_INFO, e->e_id,
"Milter: cmd=data, reject=421 4.7.0 %s closing connection",
MyHostName);
LogUsrErrs = false;
}
usrerr("421 4.7.0 %s closing connection", MyHostName);
e->e_sendqueue = NULL;
return false;
}
LogUsrErrs = savelogusrerrs;
if (response != NULL)
@ -3273,6 +3282,16 @@ smtp_data(smtp, e)
milteraccept = false;
usrerr(MSG_TEMPFAIL);
break;
case SMFIR_SHUTDOWN:
if (MilterLogLevel > 3)
sm_syslog(LOG_INFO, e->e_id,
"Milter: data, reject=421 4.7.0 %s closing connection",
MyHostName);
milteraccept = false;
usrerr("421 4.7.0 %s closing connection", MyHostName);
rv = false;
break;
}
if (response != NULL)
sm_free(response);
@ -3451,8 +3470,26 @@ smtp_data(smtp, e)
}
else
{
int mode;
/* send to all recipients */
sendall(ee, SM_DEFAULT);
mode = SM_DEFAULT;
#if _FFR_DM_ONE
if (SM_DM_ONE == e->e_sendmode)
{
if (NotFirstDelivery)
{
mode = SM_QUEUE;
e->e_sendmode = SM_QUEUE;
}
else
{
mode = SM_FORK;
NotFirstDelivery = true;
}
}
#endif /* _FFR_DM_ONE */
sendall(ee, mode);
}
ee->e_to = NULL;
}
@ -3462,6 +3499,16 @@ smtp_data(smtp, e)
CurEnv->e_id = id;
/* issue success message */
#if _FFR_MSG_ACCEPT
if (MessageAccept != NULL && *MessageAccept != '\0')
{
char msg[MAXLINE];
expand(MessageAccept, msg, sizeof msg, e);
message("250 2.0.0 %s", msg);
}
else
#endif /* _FFR_MSG_ACCEPT */
message("250 2.0.0 %s Message accepted for delivery", id);
CurEnv->e_id = oldid;
@ -3566,7 +3613,7 @@ smtp_data(smtp, e)
macdefine(&e->e_macro, A_PERM,
macid("{quarantine}"), e->e_quarmsg);
}
return true;
return rv;
}
/*
** LOGUNDELRCPTS -- log undelivered (or all) recipients.

View File

@ -11,11 +11,11 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: timers.c,v 8.24 2001/09/11 04:05:17 gshapiro Exp $")
SM_RCSID("@(#)$Id: timers.c,v 8.25 2005/06/14 23:07:23 ca Exp $")
#if _FFR_TIMERS
# include <sys/types.h>
# include <sys/time.h>
# include <sm/time.h>
# include "sendmail.h"
# include <sys/resource.h> /* Must be after sendmail.h for NCR MP-RAS */

View File

@ -10,7 +10,7 @@
#include <sendmail.h>
SM_RCSID("@(#)$Id: tls.c,v 8.97 2005/03/08 22:20:52 ca Exp $")
SM_RCSID("@(#)$Id: tls.c,v 8.102 2006/03/02 19:18:27 ca Exp $")
#if STARTTLS
# include <openssl/err.h>
@ -497,6 +497,15 @@ tls_safe_f(var, sff, srv)
** succeeded?
*/
/*
** The session_id_context identifies the service that created a session.
** This information is used to distinguish between multiple TLS-based
** servers running on the same server. We use the name of the mail system.
** Note: the session cache is not persistent.
*/
static char server_session_id_context[] = "sendmail8";
bool
inittls(ctx, req, srv, certfile, keyfile, cacertpath, cacertfile, dhparam)
SSL_CTX **ctx;
@ -972,8 +981,20 @@ inittls(ctx, req, srv, certfile, keyfile, cacertpath, cacertfile, dhparam)
/* XXX do we need this cache here? */
if (bitset(TLS_I_CACHE, req))
SSL_CTX_sess_set_cache_size(*ctx, 128);
/* timeout? SSL_CTX_set_timeout(*ctx, TimeOut...); */
{
SSL_CTX_sess_set_cache_size(*ctx, 1);
SSL_CTX_set_timeout(*ctx, 1);
SSL_CTX_set_session_id_context(*ctx,
(void *) &server_session_id_context,
sizeof(server_session_id_context));
(void) SSL_CTX_set_session_cache_mode(*ctx,
SSL_SESS_CACHE_SERVER);
}
else
{
(void) SSL_CTX_set_session_cache_mode(*ctx,
SSL_SESS_CACHE_OFF);
}
/* load certificate locations and default CA paths */
if (bitset(TLS_S_CERTP_EX, status) && bitset(TLS_S_CERTF_EX, status))
@ -1557,7 +1578,7 @@ tls_verify_cb(ctx, unused)
void
tlslogerr(who)
char *who;
const char *who;
{
unsigned long l;
int line, flags;

View File

@ -14,9 +14,9 @@
#include <sendmail.h>
#if USERDB
SM_RCSID("@(#)$Id: udb.c,v 8.160 2003/04/03 16:32:46 ca Exp $ (with USERDB)")
SM_RCSID("@(#)$Id: udb.c,v 8.161 2005/08/31 21:34:20 ca Exp $ (with USERDB)")
#else /* USERDB */
SM_RCSID("@(#)$Id: udb.c,v 8.160 2003/04/03 16:32:46 ca Exp $ (without USERDB)")
SM_RCSID("@(#)$Id: udb.c,v 8.161 2005/08/31 21:34:20 ca Exp $ (without USERDB)")
#endif /* USERDB */
#if USERDB
@ -137,7 +137,7 @@ udbexpand(a, sendq, aliaslevel, e)
int keylen;
int naddrs;
char *user;
char keybuf[MAXKEY];
char keybuf[MAXUDBKEY];
memset(&key, '\0', sizeof key);
memset(&info, '\0', sizeof info);
@ -597,7 +597,7 @@ udbmatch(user, field, rpool)
int i;
int keylen;
DBT key, info;
char keybuf[MAXKEY];
char keybuf[MAXUDBKEY];
if (tTd(28, 1))
sm_dprintf("udbmatch(%s, %s)\n", user, field);
@ -1232,7 +1232,7 @@ hes_udb_get(key, info)
{
char *name, *type;
char **hp;
char kbuf[MAXKEY + 1];
char kbuf[MAXUDBKEY + 1];
if (sm_strlcpy(kbuf, key->data, sizeof kbuf) >= sizeof kbuf)
return 0;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2005 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2006 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -13,12 +13,11 @@
#include <sendmail.h>
SM_RCSID("@(#)$Id: usersmtp.c,v 8.463 2005/03/16 00:36:09 ca Exp $")
SM_RCSID("@(#)$Id: usersmtp.c,v 8.467 2006/03/19 06:07:56 ca Exp $")
#include <sysexits.h>
static void datatimeout __P((int));
static void esmtp_check __P((char *, bool, MAILER *, MCI *, ENVELOPE *));
static void helo_options __P((char *, bool, MAILER *, MCI *, ENVELOPE *));
static int smtprcptstat __P((ADDRESS *, MAILER *, MCI *, ENVELOPE *));
@ -34,7 +33,6 @@ extern void sm_sasl_free __P((void *));
** This protocol is described in RFC821.
*/
#define REPLYTYPE(r) ((r) / 100) /* first digit of reply code */
#define REPLYCLASS(r) (((r) / 10) % 10) /* second digit of reply code */
#define SMTPCLOSING 421 /* "Service Shutting Down" */
@ -2491,9 +2489,6 @@ smtprcptstat(to, m, mci, e)
** exit status corresponding to DATA command.
*/
static jmp_buf CtxDataTimeout;
static SM_EVENT *volatile DataTimeout = NULL;
int
smtpdata(m, mci, e, ctladdr, xstart)
MAILER *m;
@ -2505,7 +2500,7 @@ smtpdata(m, mci, e, ctladdr, xstart)
register int r;
int rstat;
int xstat;
time_t timeout;
int timeout;
char *enhsc;
/*
@ -2629,43 +2624,22 @@ smtpdata(m, mci, e, ctladdr, xstart)
** factor. The main thing is that it should not be infinite.
*/
if (setjmp(CtxDataTimeout) != 0)
{
mci->mci_errno = errno;
mci->mci_state = MCIS_ERROR;
mci_setstat(mci, EX_TEMPFAIL, "4.4.2", NULL);
/*
** If putbody() couldn't finish due to a timeout,
** rewind it here in the timeout handler. See
** comments at the end of putbody() for reasoning.
*/
if (e->e_dfp != NULL)
(void) bfrewind(e->e_dfp);
errno = mci->mci_errno;
syserr("451 4.4.1 timeout writing message to %s", CurHostName);
smtpquit(m, mci, e);
return EX_TEMPFAIL;
}
if (tTd(18, 101))
{
/* simulate a DATA timeout */
timeout = 1;
timeout = 10;
}
else
timeout = DATA_PROGRESS_TIMEOUT;
DataTimeout = sm_setevent(timeout, datatimeout, 0);
timeout = DATA_PROGRESS_TIMEOUT * 1000;
sm_io_setinfo(mci->mci_out, SM_IO_WHAT_TIMEOUT, &timeout);
/*
** Output the actual message.
*/
(*e->e_puthdr)(mci, e->e_header, e, M87F_OUTER);
if (!(*e->e_puthdr)(mci, e->e_header, e, M87F_OUTER))
goto writeerr;
if (tTd(18, 101))
{
@ -2673,14 +2647,13 @@ smtpdata(m, mci, e, ctladdr, xstart)
(void) sleep(2);
}
(*e->e_putbody)(mci, e, NULL);
if (!(*e->e_putbody)(mci, e, NULL))
goto writeerr;
/*
** Cleanup after sending message.
*/
if (DataTimeout != NULL)
sm_clrevent(DataTimeout);
#if PIPELINING
}
@ -2720,7 +2693,9 @@ smtpdata(m, mci, e, ctladdr, xstart)
}
/* terminate the message */
(void) sm_io_fprintf(mci->mci_out, SM_TIME_DEFAULT, ".%s", m->m_eol);
if (sm_io_fprintf(mci->mci_out, SM_TIME_DEFAULT, ".%s", m->m_eol) ==
SM_IO_EOF)
goto writeerr;
if (TrafficLogFile != NULL)
(void) sm_io_fprintf(TrafficLogFile, SM_TIME_DEFAULT,
"%05d >>> .\n", (int) CurrentPid);
@ -2771,51 +2746,27 @@ smtpdata(m, mci, e, ctladdr, xstart)
shortenstring(SmtpReplyBuffer, 403));
}
return rstat;
}
static void
datatimeout(ignore)
int ignore;
{
int save_errno = errno;
writeerr:
mci->mci_errno = errno;
mci->mci_state = MCIS_ERROR;
mci_setstat(mci, EX_TEMPFAIL, "4.4.2", NULL);
/*
** NOTE: THIS CAN BE CALLED FROM A SIGNAL HANDLER. DO NOT ADD
** ANYTHING TO THIS ROUTINE UNLESS YOU KNOW WHAT YOU ARE
** DOING.
** If putbody() couldn't finish due to a timeout,
** rewind it here in the timeout handler. See
** comments at the end of putbody() for reasoning.
*/
if (DataProgress)
{
time_t timeout;
if (e->e_dfp != NULL)
(void) bfrewind(e->e_dfp);
/* check back again later */
if (tTd(18, 101))
{
/* simulate a DATA timeout */
timeout = 1;
}
else
timeout = DATA_PROGRESS_TIMEOUT;
/* reset the timeout */
DataTimeout = sm_sigsafe_setevent(timeout, datatimeout, 0);
DataProgress = false;
}
else
{
/* event is done */
DataTimeout = NULL;
}
/* if no progress was made or problem resetting event, die now */
if (DataTimeout == NULL)
{
errno = ETIMEDOUT;
longjmp(CtxDataTimeout, 1);
}
errno = save_errno;
errno = mci->mci_errno;
syserr("451 4.4.1 timeout writing message to %s", CurHostName);
smtpquit(m, mci, e);
return EX_TEMPFAIL;
}
/*
** SMTPGETSTAT -- get status code from DATA in LMTP
**
@ -3021,6 +2972,8 @@ smtprset(m, mci, e)
if (mci->mci_state != MCIS_SSD && mci->mci_state != MCIS_CLOSED)
mci->mci_state = MCIS_OPEN;
else if (mci->mci_exitstat == EX_OK)
mci_setstat(mci, EX_TEMPFAIL, "4.5.0", NULL);
}
/*
** SMTPPROBE -- check the connection state

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2004 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2006 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 @@
#include <sendmail.h>
SM_RCSID("@(#)$Id: util.c,v 8.383 2004/08/02 18:50:59 ca Exp $")
SM_RCSID("@(#)$Id: util.c,v 8.392 2006/03/09 19:49:35 ca Exp $")
#include <sysexits.h>
#include <sm/xtrap.h>
@ -456,6 +456,8 @@ xalloc(sz)
{
register char *p;
SM_REQUIRE(sz >= 0);
/* some systems can't handle size zero mallocs */
if (sz <= 0)
sz = 1;
@ -970,18 +972,18 @@ fixcrlf(line, stripnl)
** mci -- the mailer connection information.
**
** Returns:
** none
** true iff line was written successfully
**
** Side Effects:
** output of l to mci->mci_out.
*/
void
bool
putline(l, mci)
register char *l;
register MCI *mci;
{
putxline(l, strlen(l), mci, PXLF_MAPFROM);
return putxline(l, strlen(l), mci, PXLF_MAPFROM);
}
/*
** PUTXLINE -- putline with flags bits.
@ -1000,13 +1002,13 @@ putline(l, mci)
** PXLF_NOADDEOL -- don't add an EOL if one wasn't present.
**
** Returns:
** none
** true iff line was written successfully
**
** Side Effects:
** output of l to mci->mci_out.
*/
void
bool
putxline(l, len, mci, pxflags)
register char *l;
size_t len;
@ -1058,11 +1060,6 @@ putxline(l, len, mci, pxflags)
if (sm_io_putc(mci->mci_out, SM_TIME_DEFAULT,
'.') == SM_IO_EOF)
dead = true;
else
{
/* record progress for DATA timeout */
DataProgress = true;
}
if (TrafficLogFile != NULL)
(void) sm_io_putc(TrafficLogFile,
SM_TIME_DEFAULT, '.');
@ -1075,11 +1072,6 @@ putxline(l, len, mci, pxflags)
if (sm_io_putc(mci->mci_out, SM_TIME_DEFAULT,
'>') == SM_IO_EOF)
dead = true;
else
{
/* record progress for DATA timeout */
DataProgress = true;
}
if (TrafficLogFile != NULL)
(void) sm_io_putc(TrafficLogFile,
SM_TIME_DEFAULT,
@ -1091,16 +1083,11 @@ putxline(l, len, mci, pxflags)
while (l < q)
{
if (sm_io_putc(mci->mci_out, SM_TIME_DEFAULT,
(unsigned char) *l++) == SM_IO_EOF)
(unsigned char) *l++) == SM_IO_EOF)
{
dead = true;
break;
}
else
{
/* record progress for DATA timeout */
DataProgress = true;
}
}
if (dead)
break;
@ -1116,11 +1103,6 @@ putxline(l, len, mci, pxflags)
dead = true;
break;
}
else
{
/* record progress for DATA timeout */
DataProgress = true;
}
if (TrafficLogFile != NULL)
{
for (l = l_base; l < q; l++)
@ -1144,11 +1126,9 @@ putxline(l, len, mci, pxflags)
{
if (sm_io_putc(mci->mci_out, SM_TIME_DEFAULT, '.') ==
SM_IO_EOF)
break;
else
{
/* record progress for DATA timeout */
DataProgress = true;
dead = true;
break;
}
if (TrafficLogFile != NULL)
(void) sm_io_putc(TrafficLogFile,
@ -1161,11 +1141,9 @@ putxline(l, len, mci, pxflags)
{
if (sm_io_putc(mci->mci_out, SM_TIME_DEFAULT, '>') ==
SM_IO_EOF)
break;
else
{
/* record progress for DATA timeout */
DataProgress = true;
dead = true;
break;
}
if (TrafficLogFile != NULL)
(void) sm_io_putc(TrafficLogFile,
@ -1183,11 +1161,6 @@ putxline(l, len, mci, pxflags)
dead = true;
break;
}
else
{
/* record progress for DATA timeout */
DataProgress = true;
}
}
if (dead)
break;
@ -1198,11 +1171,9 @@ putxline(l, len, mci, pxflags)
if ((!bitset(PXLF_NOADDEOL, pxflags) || !noeol) &&
sm_io_fputs(mci->mci_out, SM_TIME_DEFAULT,
mci->mci_mailer->m_eol) == SM_IO_EOF)
break;
else
{
/* record progress for DATA timeout */
DataProgress = true;
dead = true;
break;
}
if (l < end && *l == '\n')
{
@ -1211,11 +1182,9 @@ putxline(l, len, mci, pxflags)
{
if (sm_io_putc(mci->mci_out, SM_TIME_DEFAULT,
' ') == SM_IO_EOF)
break;
else
{
/* record progress for DATA timeout */
DataProgress = true;
dead = true;
break;
}
if (TrafficLogFile != NULL)
@ -1224,10 +1193,10 @@ putxline(l, len, mci, pxflags)
}
}
/* record progress for DATA timeout */
DataProgress = true;
} while (l < end);
return !dead;
}
/*
** XUNLINK -- unlink a file, doing logging as appropriate.
**
@ -2096,6 +2065,9 @@ prog_open(argv, pfd, e)
/* run as default user */
endpwent();
sm_mbdb_terminate();
#if _FFR_MEMSTAT
(void) sm_memstat_close();
#endif /* _FFR_MEMSTAT */
if (setgid(DefGid) < 0 && geteuid() == 0)
{
syserr("prog_open: setgid(%ld) failed", (long) DefGid);
@ -2433,6 +2405,7 @@ str2prt(s)
*h++ = 'r';
break;
default:
SM_ASSERT(l >= 2);
(void) sm_snprintf(h, l, "%03o",
(unsigned int)((unsigned char) c));
@ -2669,11 +2642,11 @@ proc_list_drop(pid, st, other)
type = ProcListVec[i].proc_type;
if (other != NULL)
*other = ProcListVec[i].proc_other;
if (CurChildren > 0)
CurChildren--;
break;
}
}
if (CurChildren > 0)
CurChildren--;
if (type == PROC_CONTROL && WIFEXITED(st))
@ -2732,14 +2705,20 @@ proc_list_clear()
void
proc_list_probe()
{
int i;
int i, children;
int chldwasblocked;
pid_t pid;
children = 0;
chldwasblocked = sm_blocksignal(SIGCHLD);
/* start from 1 since 0 is the daemon itself */
for (i = 1; i < ProcListSize; i++)
{
if (ProcListVec[i].proc_pid == NO_PID)
pid = ProcListVec[i].proc_pid;
if (pid == NO_PID || pid == CurrentPid)
continue;
if (kill(ProcListVec[i].proc_pid, 0) < 0)
if (kill(pid, 0) < 0)
{
if (LogLevel > 3)
sm_syslog(LOG_DEBUG, CurEnv->e_id,
@ -2749,9 +2728,21 @@ proc_list_probe()
SM_FREE_CLR(ProcListVec[i].proc_task);
CurChildren--;
}
else
{
++children;
}
}
if (CurChildren < 0)
CurChildren = 0;
if (chldwasblocked == 0)
(void) sm_releasesignal(SIGCHLD);
if (LogLevel > 10 && children != CurChildren)
{
sm_syslog(LOG_ERR, NOQID,
"proc_list_probe: found %d children, expected %d",
children, CurChildren);
}
}
/*
@ -2859,7 +2850,6 @@ count_open_connections(hostaddr)
{
if (ProcListVec[i].proc_pid == NO_PID)
continue;
if (hostaddr->sa.sa_family !=
ProcListVec[i].proc_hostaddr.sa.sa_family)
continue;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2005 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2006 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -13,6 +13,6 @@
#include <sm/gen.h>
SM_RCSID("@(#)$Id: version.c,v 8.145 2005/03/25 18:44:44 ca Exp $")
SM_RCSID("@(#)$Id: version.c,v 8.160 2006/03/08 19:21:21 ca Exp $")
char Version[] = "8.13.4";
char Version[] = "8.13.6";