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

which included commits to RCS files with non-trunk default branches.
This commit is contained in:
Gregory Neil Shapiro 2002-04-10 03:05:00 +00:00
commit 982281085c
92 changed files with 2562 additions and 1007 deletions

View File

@ -41,6 +41,25 @@ This list is not guaranteed to be complete.
characters then no header check is done even if one is configured for
the header.
* Sender addresses whose domain part cause a temporary A record lookup
failure but have a valid MX record will be temporarily rejected in
the default configuration. Solution: fix the DNS at the sender side.
If that's not easy to achieve, possible workarounds are:
- add an entry to the access map:
dom.ain OK
- (only for advanced users) replace
# Resolve map (to check if a host exists in check_mail)
Kresolve host -a<OKR> -T<TEMP>
with
# Resolve map (to check if a host exists in check_mail)
Kcanon host -a<OKR> -T<TEMP>
Kdnsmx dns -R MX -a<OKR> -T<TEMP>
Kresolve sequence dnsmx canon
* Duplicate error messages.
Sometimes identical, duplicate error messages can be generated. As
@ -216,4 +235,4 @@ This list is not guaranteed to be complete.
the file. This is unavoidable as sendmail must verify the file is safe
to open before opening it. A file can not be locked until it is open.
$Revision: 8.54 $, Last updated $Date: 2001/12/17 16:07:51 $
$Revision: 8.55 $, Last updated $Date: 2002/03/05 00:45:54 $

View File

@ -1,11 +1,190 @@
SENDMAIL RELEASE NOTES
$Id: RELEASE_NOTES,v 8.1218 2002/01/13 18:24:15 ca Exp $
$Id: RELEASE_NOTES,v 8.1296 2002/04/05 19:17:34 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.12.3/8.12.3 2002/04/05
NOTICE: In general queue files should not be moved if queue groups
are used. In previous versions this could cause mail
not to be delivered if a queue file is repeatedly moved
by an external process whenever sendmail moved it back
into the right place. Some precautions have been taken
to avoid moving queue files if not really necessary.
sendmail may use links to refer to queue files and it
may store the path of data files in queue files. Hence
queue files should not be moved unless those internals
are understood and the integrity of the files is not
compromised. Problem noted by Anne Bennett of Concordia
University.
If an error mail is created, and the mail is split across different
queue directories, and SuperSafe is off, then write the mail
to disk before splitting it, otherwise an assertion is
triggered. Problem tracked down by Henning Schmiedehausen
of INTERMETA.
Fix possible race condition that could cause sendmail to forget
running queues. Problem noted by Jeff Wasilko of smoe.org.
Handle bogus qf files better without triggering assertions.
Problem noted by Guy Feltin.
Protect against interrupted select() call when enforcing Milter
read and write timeouts. Patch from Gurusamy Sarathy of
ActiveState.
Matching queue IDs with -qI should be case sensitive. Problem
noted by Anne Bennett of Concordia University.
If privileges have been dropped, don't try to change group ID to
the RunAsUser group. Problem noted by Neil Rickert of
Northern Illinois University.
Fix SafeFileEnvironment path munging when the specified path
contains a trailing slash. Based on patch from Dirk Meyer
of Dinoex.
Do not limit sendmail command line length to SM_ARG_MAX (usually
4096). Problem noted by Allan E Johannesen of Worcester
Polytechnic Institute.
Clear full name of sender for each new envelope to avoid bogus data
if several mails are sent in one session and some of them
do not have a From: header. Problem noted by Bas Haakman.
Change timeout check such that cached information about a connection
will be immediately invalid if ConnectionCacheTimeout is zero.
Based on patch from David Burns of Portland State University.
Properly count message size for mailstats during mail collection.
Problem noted by Werner Wiethege.
Log complete response from LMTP delivery agent on failure. Based on
patch from by Motonori Nakamura of Kyoto University.
Provide workaround for getopt() implementations that do not catch
missing arguments.
Fix the message size calculation if the message body is replaced by
a milter filter and buffered file I/O is being used.
Problem noted by Sergey Akhapkin of Dr.Web.
Do not honor SIGUSR1 requests if running with extra privileges.
Problem noted by Werner Wiethege.
Prevent a file descriptor leak on mail delivery if the initial
connect fails and DialDelay is set. Patch from Servaas
Vandenberghe of Katholieke Universiteit Leuven.
Properly deal with a case where sendmail is called by root running
a set-user-ID (non-root) program. Problem noted by Jon
Lusky of ISS Atlanta.
Avoid leaving behind stray transcript (xf) files if multiple queue
directories are used and mail is sent to a mailing list
which has an owner- alias. Problem noted by Anne Bennett
of Concordia University.
Fix class map parsing code if optional key is specified. Problem
found by Mario Nigrovic.
The SMTP daemon no longer tries to fix up improperly dot-stuffed
incoming messages. A leading dot is always stripped by the
SMTP receiver regardless of whether or not it is followed by
another dot. Problem noted by Jordan Ritter of darkridge.com.
Fix corruption when doing automatic MIME 7-bit quoted-printable or
base64 encoding to 8-bit text. Problem noted by Mark
Elvers.
Correct the statistics gathered for total number of connections.
Instead of being the exact same number as the total number
of messages (T line in mailstats) it now represents the
total number of TCP connections.
Be more explicit about syntax errors in addresses, especially
non-ASCII characters, and properly create DSNs if necessary.
Problem noted by Leena Heino of the University of Tampere.
Prevent small timeouts from being lost on slow machines if itimers
are used. Problem noted by Suresh Ramasubramanian.
Prevent a race condition on child cleanup for delivery to files.
Problem noted by Fletcher Mattox of the University of
Texas.
Change the SMTP error code for temporary map failures from 421
to 451.
Do not assume that realloc(NULL, size) works on all OS (this was
only done in one place: queue group creation). Based on
patch by Bryan Costales.
Initialize Timeout.iconnect in the code to prevent randomly short
timeouts. Problem noted by Bradley Watts of AT&T Canada.
Do not try to send a second SMTP QUIT command if the remote
responds to a MAIL command with a 421 reply or on I/O
errors. By doing so, the host was marked as having a
temporary problem and other mail destined for that host was
queued for the next queue run. Problem noted by Fletcher
Mattox of the University of Texas, Allan E Johannesen of
Worcester Polytechnic Institute, Larry Greenfield of CMU,
and Neil Rickert of Northern Illinois University.
Ignore error replies from the SMTP QUIT command (including servers
which drop the connection instead of responding to the
command).
Portability:
Check LDAP_API_VERSION to determine if ldap_memfree() is
availble.
Define HPUX10 when building on HP-UX 10.X. That platform
now gets the proper _PATH_SENDMAIL and SMRSH_CMDDIR
settings. Patch from Elias Halldor Agustsson of
Skyrr.
Fix dependency building on Mac OS X and Darwin. Problem
noted by John Beck.
Preliminary support for the sparc64 port of FreeBSD 5.0.
Add /sbin/sh as an acceptable user shell on HP-UX. From
Rajesh Somasund of Hewlett-Packard.
CONFIG: Add FEATURE(`authinfo') to allow a separate database for
SMTP AUTH information. This feature was actually added in
8.12.0 but a release note was not included.
CONFIG: Do not bounce mail if FEATURE(`ldap_routing')'s bounce
parameter is set and the LDAP lookup returns a temporary
error.
CONFIG: Honor FEATURE(`relay_hosts_only') when using
FEATURE(`relay_mail_from', `domain'). Problem noted by
Krzysztof Oledzki.
CONFIG: FEATURE(`msp') now disables any type of alias
initialization as aliases are not needed for the MSP.
CONFIG: Allow users to override RELAY_MAILER_ARGS when FEATURE(`msp')
is in use. Patch from Andrzej Filip.
CONFIG: FEATURE(`msp') uses `[localhost]' as default instead of
`localhost' and turns on MX lookups for the SMTP mailers.
This will only have an effect if a parameter is specified,
i.e., an MX lookup will be performed on the hostname unless
it is embedded in square brackets. Problem noted by
Theo Van Dinter of Collective Technologies.
CONFIG: Set confTIME_ZONE to USE_TZ in submit.mc (TimeZoneSpec= in
submit.cf) to use $TZ for time stamps. This is a compromise
to allow for the proper time zone on systems where the
default results in misleading time stamps. That is, syslog
time stamps and Date headers on submitted mail will use the
user's $TZ setting. Problem noted by Mark Roth of the
University of Illinois at Urbana-Champaign, solution proposed
by Neil Rickert of Northern Illinois University.
CONFIG: Mac OS X (Darwin) ships with mail.local as non-set-user-ID
binary. Adjust local mailer flags accordingly. Problem
noted by John Beck.
CONTRIB: Add a warning to qtool.pl to not move queue files around
if queue groups are used.
CONTRIB: buildvirtuser: Add -f option to force rebuild.
CONTRIB: smcontrol.pl: Add -f option to specify control socket.
CONTRIB: smcontrol.pl: Add support for 'memdump' command.
Suggested by Bryan Costales.
DEVTOOLS: Add dependency generation for test programs.
LIBMILTER: Remove conversion of port number for the socket
structure that is passed to xxfi_connect(). Notice:
this fix requires that sendmail and libmilter have both
this change, mixing versions may lead to wrong port
values depending on the endianness of the involved systems.
Problem noted by Gisle Aas of ActiveState.
LIBMILTER: If smfi_setreply() sets a custom reply code of '4XX' but
SMFI_REJECT is returned, ignore the custom reply. Do the
same if '5XX' is used and SMFI_TEMPFAIL is returned.
LIBMILTER: Install include files in ${INCLUDEDIR}/libmilter/ as
required by mfapi.h. Problem noted by Jose Marcio Martins
da Cruz of Ecole Nationale Superieure des Mines de Paris.
LIBSM: Add SM_CONF_LDAP_MEMFREE as a configuration define. Set
this to 1 if your LDAP client libraries include
ldap_memfree().
LIBSMDB: Avoid a file creation race condition for Berkeley DB 1.X
and NDBM on systems with the O_EXLOCK open(2) flag.
SMRSH: Fix compilation problem on some operating systems. Problem
noted by Christian Krackowizer of schuler technodat GmbH.
VACATION: Allow root to operate on user vacation databases. Based
on patch from Greg Couch of the University of California,
San Francisco.
VACATION: Don't ignore -C option. Based on patch by Bryan Costales.
VACATION: Clarify option usage in the man page. Problem noted by
Joe Barbish.
New Files:
libmilter/docs/smfi_setbacklog.html
8.12.2/8.12.2 2002/01/13
Don't complain too much if stdin, stdout, or stderr are missing
at startup, only log an error message.

View File

@ -367,6 +367,9 @@ SMTP_MAILER_MAX [undefined] The maximum size of messages that will
SMTP_MAILER_MAXMSGS [undefined] If defined, the maximum number of
messages to deliver in a single connection for the
smtp, smtp8, esmtp, or dsmtp mailers.
SMTP_MAILER_MAXRCPTS [undefined] If defined, the maximum number of
recipients to deliver in a single connection for the
smtp, smtp8, esmtp, or dsmtp mailers.
SMTP_MAILER_ARGS [TCP $h] The arguments passed to the smtp mailer.
About the only reason you would want to change this
would be to change the default port.
@ -1084,6 +1087,9 @@ relay_entire_domain
By default, only hosts listed as RELAY in the access db
will be allowed to relay. This option also allows any
host in your domain as defined by class {m}.
Notice: make sure that your domain is not just a top level
domain, e.g., com. This can happen if you give your
host a name like example.com instead of host.example.com.
relay_hosts_only
By default, names that are listed as RELAY in the access
@ -1274,11 +1280,13 @@ no_default_msa Don't generate the default MSA daemon, i.e.,
FEATURE and introduce new settings via DAEMON_OPTIONS().
msp Defines config file for Message Submission Program.
See sendmail/SECURITY for details and cf/cf/submit.mc
how to use it. An optional argument can be used to
override the default of `localhost' to use as host to send
all e-mails to. If `MSA' is specified as second argument
then port 587 is used to contact the server. Example:
See sendmail/SECURITY for details and cf/cf/submit.mc how
to use it. An optional argument can be used to override
the default of `[localhost]' to use as host to send all
e-mails to. Note that MX records will be used if the
specified hostname is not in square brackets (e.g.,
[hostname]). If `MSA' is specified as second argument then
port 587 is used to contact the server. Example:
FEATURE(`msp', `', `MSA')
@ -1298,6 +1306,9 @@ queuegroup A simple example how to select a queue group based
queue groups. If an argument is specified, it is used
as default queue group.
Note: please read the warning in doc/op/op.me about
queue groups and possible queue manipulations.
+-------+
| HACKS |
+-------+
@ -1744,7 +1755,7 @@ CAUTION: aliases are additive so that entries like these:
sendmailMTAKey: bob
sendmailMTAAliasValue: eric
dn: sendmailMTAKey=bob, dc=sendmail, dc=org
dn: sendmailMTAKey=bobetrn, dc=sendmail, dc=org
objectClass: sendmailMTA
objectClass: sendmailMTAAlias
objectClass: sendmailMTAAliasObject
@ -1973,19 +1984,21 @@ found, the +detail information is copied to the new address.
The default <mailHost> map definition is:
ldap -1 -v mailHost -k (&(objectClass=inetLocalMailRecipient)
ldap -1 -T<TMPF> -v mailHost -k (&(objectClass=inetLocalMailRecipient)
(mailLocalAddress=%0))
The default <mailRoutingAddress> map definition is:
ldap -1 -v mailRoutingAddress -k (&(objectClass=inetLocalMailRecipient)
ldap -1 -T<TMPF> -v mailRoutingAddress
-k (&(objectClass=inetLocalMailRecipient)
(mailLocalAddress=%0))
Note that neither includes the LDAP server hostname (-h server) or base DN
(-b o=org,c=COUNTRY), both necessary for LDAP queries. It is presumed that
your .mc file contains a setting for the confLDAP_DEFAULT_SPEC option with
these settings. If this is not the case, the map definitions should be
changed as described above.
changed as described above. The "-T<TMPF>" is required in any user
specified map definition to catch temporary errors.
The following possibilities exist as a result of an LDAP lookup on an
address:
@ -2242,14 +2255,16 @@ For example,
spammer@aol.com REJECT
cyberspammer.com REJECT
TLD REJECT
192.168.212 REJECT
IPv6:2002:c0a8:02c7 RELAY
IPv6:2002:c0a8:51d2::23f4 REJECT
would refuse mail from spammer@aol.com, any user from cyberspammer.com
(or any host within the cyberspammer.com domain), any host on the
192.168.212.* network, and the IPv6 address 2002:c0a8:51d2::23f4. It would
allow relay for the IPv6 network 2002:c0a8:02c7::/48.
(or any host within the cyberspammer.com domain), any host in the entire
top level domain TLD, 192.168.212.* network, and the IPv6 address
2002:c0a8:51d2::23f4. It would allow relay for the IPv6 network
2002:c0a8:02c7::/48.
The value part of the map can contain:
@ -2505,11 +2520,15 @@ FEATURE(`delay_checks') can take an optional argument:
FEATURE(`delay_checks', `hater')
enables spamhater test
If such an argument is given, the recipient will be looked up in the access
map (using the tag Spam:). If the argument is `friend', then the other
rulesets will be skipped if the recipient address is found and has RHS
friend. If the argument is `hater', then the other rulesets will be
applied if the recipient address is found and has RHS hater.
If such an argument is given, the recipient will be looked up in the
access map (using the tag Spam:). If the argument is `friend', then
the default behavior is to apply the other rulesets and make a SPAM
friend the exception. The rulesets check_mail and check_relay will be
skipped only if the recipient address is found and has RHS FRIEND. If
the argument is `hater', then the default behavior is to skip the rulesets
check_mail and check_relay and make a SPAM hater the exception. The
other two rulesets will be applied only if the recipient address is
found and has RHS HATER.
This allows for simple exceptions from the tests, e.g., by activating
the friend option and having
@ -3022,8 +3041,8 @@ For example:
LOCAL_NET_CONFIG
R$* < @ $* .$m. > $* $#smtp $@ $2.$m. $: $1 < @ $2.$m. > $3
This will cause all names that end in your domain name ($m) via
SMTP; anything else will be sent via uucp-new (smart UUCP) to uunet.
This will cause all names that end in your domain name ($m) to be sent
via SMTP; anything else will be sent via uucp-new (smart UUCP) to uunet.
If you have FEATURE(`nocanonify'), you may need to omit the dots after
the $m. If you are running a local DNS inside your domain which is
not otherwise connected to the outside world, you probably want to
@ -3998,7 +4017,9 @@ Notice: do not add options/features to submit.mc unless you are
absolutely sure you need them. Options you may want to change
include:
- confTIME_ZONE on OS that don't use the default, e.g., Irix.
- confTRUSTED_USERS, FEATURE(`use_ct_file'), and confCT_FILE for
avoiding X-Authorization warnings.
- confTIME_ZONE to change it from the default `USE_TZ'.
- confDELIVERY_MODE is set to interactive in msp.m4 instead
of the default background mode.
@ -4237,4 +4258,4 @@ M4 DIVERSIONS
8 DNS based blacklists
9 special local rulesets (1 and 2)
$Revision: 8.600 $, Last updated $Date: 2002/01/10 17:43:41 $
$Revision: 8.612 $, Last updated $Date: 2002/04/03 17:12:52 $

View File

@ -5,8 +5,8 @@ This document describes how to install the sendmail configuration files.
Please see ../README about the sendmail configuration files themselves.
By default you need two .mc files: sendmail.mc and submit.mc. The
latter is a copy of msp.mc in which OSTYPE() has been filled in
according to the host OS. For the former see ../README.
latter is an OS independent configuration file for the mail submission
program (MSP). See ../README for details about both files.
Installation of these two files can be done via:
@ -31,4 +31,4 @@ The name of the source file for "submit.cf" can be overridden by
For more details see Makefile.
$Revision: 1.1 $, Last updated $Date: 2001/04/26 15:43:20 $
$Revision: 1.2 $, Last updated $Date: 2002/02/22 00:33:54 $

View File

@ -26,13 +26,13 @@
##### $Id: cfhead.m4,v 8.107 2001/07/22 03:25:37 ca Exp $ #####
##### $Id: cf.m4,v 8.32 1999/02/07 07:26:14 gshapiro Exp $ #####
##### $Id: submit.mc,v 8.5 2001/09/08 01:20:53 gshapiro Exp $ #####
##### $Id: msp.m4,v 1.29 2001/12/13 23:56:38 gshapiro Exp $ #####
##### $Id: submit.mc,v 8.6 2002/03/26 03:30:58 ca Exp $ #####
##### $Id: msp.m4,v 1.32 2002/03/26 22:02:03 ca Exp $ #####
##### $Id: no_default_msa.m4,v 8.2 2001/02/14 05:03:22 gshapiro Exp $ #####
##### $Id: proto.m4,v 8.628 2001/12/28 19:02:40 ca Exp $ #####
##### $Id: proto.m4,v 8.639 2002/04/02 23:42:42 gshapiro Exp $ #####
# level 10 config file format
V10/Berkeley
@ -106,11 +106,11 @@ Kdequote dequote
DnMAILER-DAEMON
D{MTAHost}localhost
D{MTAHost}[localhost]
# Configuration version number
DZ8.12.2/Submit
DZ8.12.3/Submit
###############
@ -127,7 +127,7 @@ O SevenBitInput=False
O AliasWait=10
# location of alias file
O AliasFile
#O AliasFile=/etc/mail/aliases
# minimum number of free blocks on filesystem
O MinFreeBlocks=100
@ -259,6 +259,8 @@ O QueueDirectory=/var/spool/clientmqueue
# key for shared memory; 0 to turn off
#O SharedMemoryKey=0
# timeouts (many of these)
#O Timeout.initial=5m
#O Timeout.connect=5m
@ -312,7 +314,7 @@ O StatusFile=/var/spool/clientmqueue/sm-client.st
# if undefined, use system default
# if defined but null, use TZ envariable passed in
# if defined and non-null, use that info
#O TimeZoneSpec=
O TimeZoneSpec=
# default UID (can be username or userid:groupid)
#O DefaultUser=mailnull
@ -1351,19 +1353,19 @@ SMasqRelay
R$+ $: $>MasqSMTP $1
R$+ $: $>MasqHdr $1
Msmtp, P=[IPC], F=mDFMuXk05, S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP, E=\r\n, L=990,
Msmtp, P=[IPC], F=mDFMuXk5, S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP, E=\r\n, L=990,
T=DNS/RFC822/SMTP,
A=TCP $h
Mesmtp, P=[IPC], F=mDFMuXak05, S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP, E=\r\n, L=990,
Mesmtp, P=[IPC], F=mDFMuXak5, S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP, E=\r\n, L=990,
T=DNS/RFC822/SMTP,
A=TCP $h
Msmtp8, P=[IPC], F=mDFMuX8k05, S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP, E=\r\n, L=990,
Msmtp8, P=[IPC], F=mDFMuX8k5, S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP, E=\r\n, L=990,
T=DNS/RFC822/SMTP,
A=TCP $h
Mdsmtp, P=[IPC], F=mDFMuXa%k05, S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP, E=\r\n, L=990,
Mdsmtp, P=[IPC], F=mDFMuXa%k5, S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP, E=\r\n, L=990,
T=DNS/RFC822/SMTP,
A=TCP $h
Mrelay, P=[IPC], F=mDFMuXa8k0, S=EnvFromSMTP/HdrFromSMTP, R=MasqSMTP, E=\r\n, L=2040,
Mrelay, P=[IPC], F=mDFMuXa8k, S=EnvFromSMTP/HdrFromSMTP, R=MasqSMTP, E=\r\n, L=2040,
T=DNS/RFC822/SMTP,
A=TCP $h

View File

@ -1,6 +1,6 @@
divert(-1)
#
# Copyright (c) 2001 Sendmail, Inc. and its suppliers.
# Copyright (c) 2001, 2002 Sendmail, Inc. and its suppliers.
# All rights reserved.
#
# By using this file, you agree to the terms and conditions set
@ -15,8 +15,9 @@ divert(-1)
#
divert(0)dnl
VERSIONID(`$Id: submit.mc,v 8.5 2001/09/08 01:20:53 gshapiro Exp $')
VERSIONID(`$Id: submit.mc,v 8.6 2002/03/26 03:30:58 ca Exp $')
define(`confCF_VERSION', `Submit')dnl
define(`__OSTYPE__',`')dnl dirty hack to keep proto.m4 from complaining
define(`_USE_DECNET_SYNTAX_', `1')dnl support DECnet
define(`confTIME_ZONE', `USE_TZ')dnl
FEATURE(`msp')dnl

View File

@ -1,6 +1,6 @@
divert(-1)
#
# Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
# Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers.
# All rights reserved.
#
# By using this file, you agree to the terms and conditions set
@ -10,7 +10,7 @@ divert(-1)
#
divert(0)
VERSIONID(`$Id: access_db.m4,v 8.23 2001/03/16 00:51:25 gshapiro Exp $')
VERSIONID(`$Id: access_db.m4,v 8.24 2002/03/06 21:50:25 ca Exp $')
divert(-1)
define(`_ACCESS_TABLE_', `')
@ -21,14 +21,18 @@ ifelse(lower(_ARG3_),`skip',`define(`_ACCESS_SKIP_', `1')')
ifelse(lower(_ARG3_),`lookupdotdomain',`define(`_LOOKUPDOTDOMAIN_', `1')')
define(`_ATMPF_', `<TMPF>')dnl
dnl check whether arg contains -T`'_ATMPF_
dnl unless it is a sequence map
ifelse(defn(`_ARG_'), `', `',
defn(`_ARG_'), `LDAP', `',
`ifelse(index(_ARG_, `sequence '), `0', `',
`ifelse(index(_ARG_, _ATMPF_), `-1',
`errprint(`*** WARNING: missing -T'_ATMPF_` in argument of FEATURE(`access_db',' defn(`_ARG_')`)
')
define(`_ABP_', index(_ARG_, ` '))
define(`_NARG_', `substr(_ARG_, 0, _ABP_) -T'_ATMPF_` substr(_ARG_, _ABP_)')
')')
')
')
')
LOCAL_CONFIG
# Access list database (for spam stomping)

View File

@ -1,6 +1,6 @@
divert(-1)
#
# Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
# Copyright (c) 2000-2002 Sendmail, Inc. and its suppliers.
# All rights reserved.
#
# By using this file, you agree to the terms and conditions set
@ -9,7 +9,7 @@ divert(-1)
#
#
divert(0)
VERSIONID(`$Id: compat_check.m4,v 1.3 2001/11/21 18:40:06 ca Exp $')
VERSIONID(`$Id: compat_check.m4,v 1.4 2002/02/26 22:15:31 gshapiro Exp $')
divert(-1)
ifdef(`_ACCESS_TABLE_', `',
`errprint(`FEATURE(`compat_check') requires FEATURE(`access_db')
@ -25,7 +25,7 @@ R$+ $| $+ $: <$(access Compat:$1<@>$2 $:OK $)>
R$* $| $* $@ ok
# act on the result,
# it must be one of the following... anything else will be allowed..
dnl for consistency with the other two even though discard does not take an
dnl for consistency with the other two even though discard does not take a
dnl reply code
R< DISCARD:$* > $#discard $: $1 " - discarded by check_compat"
R< DISCARD $* > $#discard $: $1 " - discarded by check_compat"

View File

@ -1,6 +1,6 @@
divert(-1)
#
# Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
# Copyright (c) 1999-2002 Sendmail, Inc. and its suppliers.
# All rights reserved.
#
# By using this file, you agree to the terms and conditions set
@ -10,7 +10,7 @@ divert(-1)
#
divert(0)
VERSIONID(`$Id: ldap_routing.m4,v 8.8 2001/06/27 21:46:31 gshapiro Exp $')
VERSIONID(`$Id: ldap_routing.m4,v 8.10 2002/03/27 22:17:43 ca Exp $')
divert(-1)
# Check first two arguments. If they aren't set, may need to warn in proto.m4
@ -31,9 +31,9 @@ ifelse(len(X`'_ARG4_), `1', `',
LOCAL_CONFIG
# LDAP routing maps
Kldapmh ifelse(len(X`'_ARG1_), `1',
`ldap -1 -v mailHost -k (&(objectClass=inetLocalMailRecipient)(mailLocalAddress=%0))',
`ldap -1 -T<TMPF> -v mailHost -k (&(objectClass=inetLocalMailRecipient)(mailLocalAddress=%0))',
`_ARG1_')
Kldapmra ifelse(len(X`'_ARG2_), `1',
`ldap -1 -v mailRoutingAddress -k (&(objectClass=inetLocalMailRecipient)(mailLocalAddress=%0))',
`ldap -1 -T<TMPF> -v mailRoutingAddress -k (&(objectClass=inetLocalMailRecipient)(mailLocalAddress=%0))',
`_ARG2_')

View File

@ -1,6 +1,6 @@
divert(-1)
#
# Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
# Copyright (c) 2000-2002 Sendmail, Inc. and its suppliers.
# All rights reserved.
#
# By using this file, you agree to the terms and conditions set
@ -10,9 +10,9 @@ divert(-1)
#
divert(0)dnl
VERSIONID(`$Id: msp.m4,v 1.29 2001/12/13 23:56:38 gshapiro Exp $')
VERSIONID(`$Id: msp.m4,v 1.32 2002/03/26 22:02:03 ca Exp $')
divert(-1)
define(`ALIAS_FILE', `')
undefine(`ALIAS_FILE')
define(`confDELIVERY_MODE', `i')
define(`confUSE_MSP', `True')
define(`confFORWARD_PATH', `')
@ -29,10 +29,10 @@ dnl notice: do not test for QUEUE_DIR, it is set in some ostype/*.m4 files
ifdef(`MSP_QUEUE_DIR',
`define(`QUEUE_DIR', `MSP_QUEUE_DIR')',
`define(`QUEUE_DIR', `/var/spool/clientmqueue')')
define(`_MTA_HOST_', ifelse(defn(`_ARG_'), `', `localhost', `_ARG_'))
define(`_MTA_HOST_', ifelse(defn(`_ARG_'), `', `[localhost]', `_ARG_'))
define(`_MSP_FQHN_',`dnl used to qualify addresses
ifdef(`MASQUERADE_NAME', ifdef(`_MASQUERADE_ENVELOPE_', `$M', `$j'), `$j')')
define(`RELAY_MAILER_ARGS', `TCP $h'ifelse(_ARG2_, `MSA', ` 587'))
ifelse(_ARG2_, `MSA', `define(`RELAY_MAILER_ARGS', `TCP $h 587')')
dnl ---------------------------------------------
ifdef(`confPID_FILE', `dnl',
`define(`confPID_FILE', QUEUE_DIR`/sm-client.pid')')
@ -55,11 +55,11 @@ define(`LOCAL_MAILER_DSN_DIAGNOSTIC_CODE', `SMTP')dnl
define(`LOCAL_SHELL_PATH', `[IPC]')dnl
define(`LOCAL_SHELL_FLAGS', `lmDFMuXk5')dnl
define(`LOCAL_SHELL_ARGS', `TCP $h')dnl
MODIFY_MAILER_FLAGS(`SMTP', `+k05')dnl
MODIFY_MAILER_FLAGS(`ESMTP', `+k05')dnl
MODIFY_MAILER_FLAGS(`DSMTP', `+k05')dnl
MODIFY_MAILER_FLAGS(`SMTP8', `+k05')dnl
MODIFY_MAILER_FLAGS(`RELAY', `+k0')dnl
MODIFY_MAILER_FLAGS(`SMTP', `+k5')dnl
MODIFY_MAILER_FLAGS(`ESMTP', `+k5')dnl
MODIFY_MAILER_FLAGS(`DSMTP', `+k5')dnl
MODIFY_MAILER_FLAGS(`SMTP8', `+k5')dnl
MODIFY_MAILER_FLAGS(`RELAY', `+k')dnl
MAILER(`local')dnl
MAILER(`smtp')dnl

View File

@ -1,6 +1,6 @@
divert(-1)
#
# Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
# Copyright (c) 1998-2002 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.628 2001/12/28 19:02:40 ca Exp $')
VERSIONID(`$Id: proto.m4,v 8.639 2002/04/02 23:42:42 gshapiro Exp $')
# level CF_LEVEL config file format
V`'CF_LEVEL/ifdef(`VENDOR_NAME', `VENDOR_NAME', `Berkeley')
@ -337,7 +337,8 @@ _OPTION(OldStyleHeaders, `confOLD_STYLE_HEADERS', `False')
# SMTP daemon options
ifelse(defn(`confDAEMON_OPTIONS'), `', `dnl',
`errprint(WARNING: `confDAEMON_OPTIONS' is no longer valid. See cf/README for more information.
`errprint(WARNING: `confDAEMON_OPTIONS' is no longer valid.
Use `DAEMON_OPTIONS()'; see cf/README.
)'dnl
`DAEMON_OPTIONS(`confDAEMON_OPTIONS')')
ifelse(defn(`_DPO_'), `',
@ -395,6 +396,10 @@ O QueueDirectory=ifdef(`QUEUE_DIR', QUEUE_DIR, `/var/spool/mqueue')
# key for shared memory; 0 to turn off
_OPTION(SharedMemoryKey, `confSHARED_MEMORY_KEY', `0')
ifdef(`confSHARED_MEMORY_KEY_FILE', `dnl
# file to store key for shared memory (if SharedMemoryKey = -1)
O SharedMemoryKeyFile=confSHARED_MEMORY_KEY_FILE')
# timeouts (many of these)
_OPTION(Timeout.initial, `confTO_INITIAL', `5m')
_OPTION(Timeout.connect, `confTO_CONNECT', `5m')
@ -1416,6 +1421,10 @@ SLDAPExpand
# do the LDAP lookups
R<$+><$+><$*> $: <$(ldapmra $2 $: $)> <$(ldapmh $2 $: $)> <$1> <$2> <$3>
# look for temporary failures (return original address, MTA will queue up)
R<$* <TMPF>> <$*> <$+> <$+> <$*> $@ $2
R<$*> <$* <TMPF>> <$+> <$+> <$*> $@ $2
# if mailRoutingAddress and local or non-existant mailHost,
# return the new mailRoutingAddress
ifelse(_LDAP_ROUTE_DETAIL_, `_PRESERVE_', `dnl
@ -2104,7 +2113,7 @@ ifdef(`_RELAY_LOCAL_FROM_', `dnl
# check whether local FROM is ok
R<?> $+ < @ $=w > $@ RELAY FROM local', `dnl')
ifdef(`_RELAY_DB_FROM_', `dnl
R<?> $+ < @ $+ > $: <@> $>SearchList <! From> $| <F:$1@$2> ifdef(`_RELAY_DB_FROM_DOMAIN_', `<D:$2>') <>
R<?> $+ < @ $+ > $: <@> $>SearchList <! From> $| <F:$1@$2> ifdef(`_RELAY_DB_FROM_DOMAIN_', ifdef(`_RELAY_HOSTS_ONLY_', `<E:$2>', `<D:$2>')) <>
R<@> <RELAY> $@ RELAY RELAY FROM sender ok
ifdef(`_ATMPF_', `R<@> <_ATMPF_> $#TEMP $@ 4.3.0 $: "451 Temporary system failure. Please try again later."', `dnl')
', `dnl
@ -2201,9 +2210,10 @@ dnl should we "clean up" $&f?
ifdef(`_FFR_MAIL_MACRO',
`R$* $: $1 $| $>checkmail $&{mail_from}',
`R$* $: $1 $| $>checkmail <$&f>')
dnl recipient (canonical format) $| result of checkmail
R$* $| $#$* $#$2
dnl run further checks: check_relay
R$* $: $1 $| $>checkrelay $&{client_name} $| $&{client_addr}
R$* $| $* $: $1 $| $>checkrelay $&{client_name} $| $&{client_addr}
R$* $| $#$* $#$2
R$* $| $* $: $1
', `dnl')

View File

@ -11,8 +11,8 @@ divert(-1)
# the sendmail distribution.
#
#
VERSIONID(`$Id: version.m4,v 8.81 2002/01/13 18:23:32 ca Exp $')
VERSIONID(`$Id: version.m4,v 8.89 2002/04/04 22:20:08 ca Exp $')
#
divert(0)
# Configuration version number
DZ8.12.2`'ifdef(`confCF_VERSION', `/confCF_VERSION')
DZ8.12.3`'ifdef(`confCF_VERSION', `/confCF_VERSION')

View File

@ -1,6 +1,6 @@
divert(-1)
#
# Copyright (c) 2000 Sendmail, Inc. and its suppliers.
# Copyright (c) 2000, 2002 Sendmail, Inc. and its suppliers.
# All rights reserved.
#
# By using this file, you agree to the terms and conditions set
@ -8,10 +8,11 @@ divert(-1)
# the sendmail distribution.
#
#
#
divert(0)
VERSIONID(`$Id: darwin.m4,v 8.1 2000/06/15 06:36:30 gshapiro Exp $')
VERSIONID(`$Id: darwin.m4,v 8.3 2002/03/05 01:55:40 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

View File

@ -1,6 +1,6 @@
#!/usr/bin/perl -w
# Copyright (c) 1999-2001 Gregory Neil Shapiro. All Rights Reserved.
# Copyright (c) 1999-2002 Gregory Neil Shapiro. All Rights Reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@ -27,7 +27,7 @@
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
# $Id: buildvirtuser,v 1.3 2001/02/12 02:58:20 gshapiro Exp $
# $Id: buildvirtuser,v 1.5 2002/02/08 08:10:59 gshapiro Exp $
=head1 NAME
@ -35,7 +35,7 @@ buildvirtuser - Build virtusertable support from a directory of files
=head1 SYNOPSIS
buildvirtuser
buildvirtuser [-f]
=head1 DESCRIPTION
@ -50,6 +50,9 @@ $DOMAIN in the file are replaced by the current domain being processed.
Occurrences of $LHS in the right hand side are replaced by the address on
the left hand side.
The -f option forces the database to be rebuilt regardless of whether
any file changes were detected.
=head1 CONFIGURATION
In order to function properly, sendmail must be configured to use these
@ -96,6 +99,7 @@ Gregory Neil Shapiro E<lt>F<gshapiro@gshapiro.net>E<gt>
=cut
use strict;
use Getopt::Std;
my $makemap = "/usr/sbin/makemap";
my $dbtype = "hash";
@ -108,6 +112,9 @@ my $virt = "$maildir/virtusertable.db";
my %virt = ();
my $newest = 0;
my ($lhs, $domain, $key, $value);
my $opts = {};
getopts('f', $opts) || die "Usage: $0 [-f]\n";
opendir(VIRTS, $virts) || die "Could not open directory $virts: $!\n";
my @virts = grep { -f "$virts/$_" } readdir(VIRTS);
@ -157,7 +164,7 @@ LINE: while (<DOMAIN>)
}
my $virtmtime = (stat($virt))[9] || 0;
if ($virtmtime < $newest)
if ($opts->{f} || $virtmtime < $newest)
{
print STDOUT "Rebuilding $virt\n";
# logger -s -t ${prog} -p mail.info "Rebuilding ${basedir}/virtusertable"

View File

@ -1,4 +1,4 @@
.\" Copyright (c) 1999, 2001 Sendmail, Inc. and its suppliers.
.\" Copyright (c) 1999, 2001-2002 Sendmail, Inc. and its suppliers.
.\" All rights reserved.
.\"
.\" By using this file, you agree to the terms and conditions set
@ -6,9 +6,9 @@
.\" the sendmail distribution.
.\"
.\"
.\" $Id: qtool.8,v 8.16 2001/11/21 19:21:20 gshapiro Exp $
.\" $Id: qtool.8,v 8.17 2002/01/29 21:55:49 ca Exp $
.\"
.TH QTOOL 8 "$Date: 2001/11/21 19:21:20 $"
.TH QTOOL 8 "$Date: 2002/01/29 21:55:49 $"
.SH NAME
qtool
\- manipulate sendmail queues
@ -25,6 +25,11 @@ source [source ...]
moves the queue files used by sendmail between queues. It uses the same
locking mechanism as sendmail so can be safely used while sendmail is
running.
However, it should not be used when queue groups have been configured
to move queue files into directories to which they do not belong according
to the queue group selections made in the sendmail.cf file.
Unless you are absolutely sure you do not interfere with the queue group
selection mechanism, do not move queue files around.
.PP
With no options,
.B qtool

View File

@ -1,9 +1,9 @@
#!/usr/bin/env perl
##
## Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
## Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers.
## All rights reserved.
##
## $Id: qtool.pl,v 8.26 2001/11/21 19:26:17 gshapiro Exp $
## $Id: qtool.pl,v 8.27 2002/01/29 21:55:49 ca Exp $
##
use strict;
use File::Basename;
@ -18,6 +18,11 @@ use Getopt::Std;
## pretty similar to just moving the files manually, but it locks the files
## the same way sendmail does to prevent problems.
##
## NOTICE: Do not use this program to move queue files around
## if you use sendmail 8.12 and multiple queue groups. It may interfere
## with sendmail's internal queue group selection strategy and can cause
## mail to be not delivered.
##
## The syntax is the reverse of mv (ie. the target argument comes
## first). This lets you pick the files you want to move using find and
## xargs.
@ -62,6 +67,7 @@ my $result;
my $action;
my $new_condition;
my $qprefix;
my $queuegroups = 0;
my $conditions = new Compound();
Getopt::Std::getopts('bC:de:Qs:', \%opts);
@ -147,6 +153,10 @@ my $queue_root;
my $line;
open(CONFIG_FILE, $config_file) or die "$config_file: $!";
## Notice: we can only break out of this loop (using last)
## when both entries (queue directory and group group)
## have been found.
while ($line = <CONFIG_FILE>)
{
chomp $line;
@ -157,9 +167,28 @@ my $queue_root;
{
$queue_root = $1;
}
# found also queue groups?
if ($queuegroups)
{
last;
}
}
if ($line =~ m/^Q.*/)
{
$queuegroups = 1;
if ($action == \&move_action)
{
print("WARNING: moving queue files around " .
"when queue groups are used may\n" .
"result in undelivered mail!\n");
}
# found also queue directory?
if (defined $queue_root)
{
last;
}
}
}
close(CONFIG_FILE);
if (!defined $queue_root)
{

View File

@ -1,9 +1,11 @@
#!/usr/local/bin/perl -w
use strict;
use Getopt::Std;
use FileHandle;
use Socket;
$sendmailDaemon = "/usr/sbin/sendmail -q30m -bd";
my $sendmailDaemon = "/usr/sbin/sendmail -q30m -bd";
##########################################################################
#
@ -70,6 +72,7 @@ sub do_command
my $command = shift;
my $proto = getprotobyname('ip');
my @reply;
my $i;
socket(SOCK, PF_UNIX, SOCK_STREAM, $proto) or return undef;
@ -216,7 +219,7 @@ sub start_daemon
}
elsif (defined $pid)
{
exec($main::sendmailDaemon);
exec($sendmailDaemon);
die "Unable to start sendmail daemon: $!.\n";
}
else
@ -272,6 +275,29 @@ sub restart_daemon
return &do_command($control, "RESTART");
}
##########################################################################
#
# &memdump -- get memdump from the daemon using the control socket
#
# Parameters:
# control -- control socket name
#
# Returns:
# Error message or status message
#
sub memdump
{
my $control = shift;
my $status;
if (not defined $control)
{
return "The control socket is not configured so the daemon can not be queried for memdump.";
}
return &do_command($control, "MEMDUMP");
}
##########################################################################
#
# &help -- get help from the daemon using the control socket
@ -295,10 +321,14 @@ sub help
return &do_command($control, "HELP");
}
my $command = shift;
my $control = &get_controlname;
my $status = undef;
my $daemonStatus = undef;
my $opts = {};
getopts('f:', $opts) || die "Usage: $0 [-f /path/to/control/socket] command\n";
my $control = $opts->{f} || &get_controlname;
my $command = shift;
if (not defined $control)
{
@ -306,7 +336,7 @@ if (not defined $control)
}
if (not defined $command)
{
die "Usage: $0 command\n";
die "Usage: $0 [-f /path/to/control/socket] command\n";
}
if ($command eq "status")
{
@ -341,6 +371,10 @@ elsif (lc($command) eq "start")
{
$status = &start_daemon($control);
}
elsif (lc($command) eq "memdump")
{
$status = &memdump($control);
}
elsif (lc($command) eq "help")
{
$status = &help($control);

View File

@ -1,4 +1,4 @@
.\" Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
.\" Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers.
.\" All rights reserved.
.\" Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved.
.\" Copyright (c) 1983, 1993
@ -9,7 +9,7 @@
.\" the sendmail distribution.
.\"
.\"
.\" $Id: op.me,v 8.592 2001/12/26 03:44:39 ca Exp $
.\" $Id: op.me,v 8.600 2002/03/06 16:00:27 ca Exp $
.\"
.\" eqn op.me | pic | troff -me
.\"
@ -88,7 +88,7 @@ Sendmail, Inc.
.de Ve
Version \\$2
..
.Ve $Revision: 8.592 $
.Ve $Revision: 8.600 $
.rm Ve
.sp
For Sendmail Version 8.12
@ -1158,6 +1158,13 @@ in the message, then the message will be split into multiple messages,
each of which have at most
.i N
recipients.
.pp
Notice: if multiple queue groups are used, do
.b not
move queue files around, e.g., into a different queue directory.
This may have wierd effects and can cause mail not to be delivered.
Queue files and directories should be treated as opaque
and should not be manipulated directly.
.sh 3 "Queue Runs"
.pp
.i sendmail
@ -5455,10 +5462,14 @@ If the
field is also specified,
this flag causes the effective user id to be set to that user.
.ip u
Upper case should be preserved in user names
for this mailer.
Standards require preservation of case in the local part of addresses,
except for those address for which your system accepts responsibility.
Upper case should be preserved in user names for this mailer. Standards
require preservation of case in the local part of addresses, except for
those address for which your system accepts responsibility.
RFC 2142 provides a long list of addresses which should be case
insensitive.
If you use this flag, you may be violating RFC 2142.
Note that postmaster is always treated as a case insensitive address
regardless of this flag.
.ip U
This mailer wants UUCP-style
.q From
@ -7987,7 +7998,7 @@ indicates the database key.
For example, the rule
.(b
.ta 1.5i
R$\- ! $+ $: $(uucp $1 $@ $2 $: %1 @ %0 . UUCP $)
R$\- ! $+ $: $(uucp $1 $@ $2 $: $2 @ $1 . UUCP $)
.)b
Looks up the UUCP name in a (user defined) UUCP map;
if not found it turns it into
@ -10026,7 +10037,7 @@ by
is incremented during processing,
and if it reaches
MAXHOP
(currently 30)
(currently 25)
.i sendmail
throws away the message with an error.
.ip "\-L \fItag\fP"
@ -10391,6 +10402,18 @@ and
.b w
indicating that a warning message has been sent
announcing that the mail has been delayed.
Other flag bits are:
.b 8 :
the body contains 8bit data,
.b b :
a Bcc: header should be removed,
.b d :
the mail has RET parameters (see RFC 1894),
.b n :
the body of the message should not be returned
in case of an error,
.b s :
the envelope has been split.
.ip N
The total number of delivery attempts.
.ip K
@ -10556,7 +10579,7 @@ replace it with a blank sheet for double-sided output.
.\".sz 10
.\"Eric Allman
.\".sp
.\"Version $Revision: 8.592 $
.\"Version $Revision: 8.600 $
.\".ce 0
.bp 3
.ce

View File

@ -22,7 +22,7 @@ SM_UNUSED(static char copyright[]) =
#endif /* ! lint */
#ifndef lint
SM_UNUSED(static char id[]) = "@(#)$Id: editmap.c,v 1.22 2002/01/11 23:52:27 gshapiro Exp $";
SM_UNUSED(static char id[]) = "@(#)$Id: editmap.c,v 1.23 2002/03/28 17:49:33 gshapiro Exp $";
#endif /* ! lint */

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2002 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: mfapi.h,v 8.35 2001/10/09 19:05:24 gshapiro Exp $
* $Id: mfapi.h,v 8.41 2002/03/22 21:36:12 gshapiro Exp $
*/
/*
@ -17,12 +17,12 @@
#ifndef _LIBMILTER_MFAPI_H
# define _LIBMILTER_MFAPI_H 1
# include <sys/types.h>
# include <sys/socket.h>
# include "libmilter/mfdef.h"
# define LIBMILTER_API extern
# include <sys/types.h>
#ifndef _SOCK_ADDR
# define _SOCK_ADDR struct sockaddr
@ -108,6 +108,7 @@ struct smfiDesc
LIBMILTER_API int smfi_register __P((struct smfiDesc));
LIBMILTER_API int smfi_main __P((void));
LIBMILTER_API int smfi_setbacklog __P((int));
LIBMILTER_API int smfi_setdbg __P((int));
LIBMILTER_API int smfi_settimeout __P((int));
LIBMILTER_API int smfi_setconn __P((char *));
@ -371,6 +372,17 @@ LIBMILTER_API int smfi_addrcpt __P((SMFICTX *, char *));
LIBMILTER_API int smfi_delrcpt __P((SMFICTX *, char *));
#if _FFR_SMFI_PROGRESS
/*
** Send a "no-op" up to the MTA to tell it we're still alive, so long
** milter-side operations don't time out.
**
** SMFICTX *ctx; Opaque context structure
*/
LIBMILTER_API int smfi_progress __P((SMFICTX *));
#endif /* _FFR_SMFI_PROGRESS */
/*
** Delete a recipient from the envelope
**

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2002 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: milter.h,v 8.35 2001/06/27 21:46:44 gshapiro Exp $
* $Id: milter.h,v 8.37 2002/03/22 19:32:48 ca Exp $
*/
/*

View File

@ -1,12 +1,12 @@
/*
* Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 2000-2002 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: cdefs.h,v 1.14 2001/06/07 20:04:53 ca Exp $
* $Id: cdefs.h,v 1.15 2002/01/16 18:30:11 ca Exp $
*/
/*
@ -43,7 +43,9 @@
# define __END_DECLS
# endif /* defined(__cplusplus) */
# if defined(__STDC__) || defined(__cplusplus)
# ifndef __P
# define __P(protos) protos
# endif /* __P */
# define __CONCAT(x,y) x ## y
# define __STRING(x) #x
# else /* defined(__STDC__) || defined(__cplusplus) */

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2002 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.82 2001/12/20 16:14:48 ca Exp $
* $Id: conf.h,v 1.87 2002/04/02 08:11:52 gshapiro Exp $
*/
/*
@ -105,6 +105,7 @@
# define SMRSH_CMDDIR "/var/adm/sm.bin"
# endif /* HPUX10 */
# ifdef HPUX11
# define HASSETREUID 1 /* setreuid(2) works on HP-UX 11.x */
# define HASFCHOWN 1 /* has fchown(2) */
# ifndef BROKEN_RES_SEARCH
# define BROKEN_RES_SEARCH 1 /* res_search(unknown) returns h_errno=0 */
@ -618,6 +619,15 @@ extern long dgux_inet_addr();
# ifndef _PATH_SENDMAILPID
# define _PATH_SENDMAILPID "/var/run/sendmail.pid"
# endif /* ! _PATH_SENDMAILPID */
# if _FFR_DIGUNIX_SAFECHOWN
/*
** Testing on a Digital UNIX 4.0a system showed this to be the correct
** setting but given the security consequences, more testing and
** verification is needed. Unfortunately, the man page offers no
** assistance.
*/
# define IS_SAFE_CHOWN >= 0
# endif /* _FFR_DIGUNIX_SAFECHOWN */
# endif /* __osf__ */
@ -716,6 +726,9 @@ typedef int pid_t;
# define SPT_TYPE SPT_PSSTRINGS
# define SPT_PADCHAR '\0' /* pad process title with nulls */
# define ERRLIST_PREDEFINED /* don't declare sys_errlist */
# ifndef NOT_SENDMAIL
# define sleep sleepX
# endif /* ! NOT_SENDMAIL */
# endif /* defined(DARWIN) */

View File

@ -6,7 +6,7 @@
* forth in the LICENSE file which can be found at the top level of
* the sendmail distribution.
*
* $Id: config.h,v 1.42 2001/06/17 21:31:11 ca Exp $
* $Id: config.h,v 1.44 2002/01/23 17:47:15 gshapiro Exp $
*/
/*
@ -143,4 +143,20 @@
# define SM_CONF_TEST_LLONG 1
# endif /* !SM_CONF_TEST_LLONG */
/* Does LDAP library have ldap_memfree()? */
# ifndef SM_CONF_LDAP_MEMFREE
/*
** The new LDAP C API (draft-ietf-ldapext-ldap-c-api-04.txt) includes
** ldap_memfree() in the API. That draft states to use LDAP_API_VERSION
** of 2004 to identify the API.
*/
# if USING_NETSCAPE_LDAP || LDAP_API_VERSION >= 2004
# define SM_CONF_LDAP_MEMFREE 1
# else /* USING_NETSCAPE_LDAP || LDAP_API_VERSION >= 2004 */
# define SM_CONF_LDAP_MEMFREE 0
# endif /* USING_NETSCAPE_LDAP || LDAP_API_VERSION >= 2004 */
# endif /* ! SM_CONF_LDAP_MEMFREE */
#endif /* ! SM_CONFIG_H */

View File

@ -1,12 +1,12 @@
/*
* Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 2000-2002 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: gen.h,v 1.19 2001/09/11 04:04:43 gshapiro Exp $
* $Id: gen.h,v 1.22 2002/04/03 00:40:42 ca Exp $
*/
/*

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 2000-2002 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1990
* 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: io.h,v 1.19 2001/07/10 21:56:46 gshapiro Exp $
* $Id: io.h,v 1.23 2002/02/23 19:32:17 gshapiro Exp $
*/
/*-
@ -46,6 +46,7 @@
#define SM_IO_WHAT_ISTYPE 5
#define SM_IO_IS_READABLE 6
#define SM_IO_WHAT_TIMEOUT 7
#define SM_IO_WHAT_SIZE 8
/* info flags (exposed) */
#define SM_IO_FTYPE_CREATE 1
@ -117,7 +118,6 @@ struct sm_file
int f_timeout;
int f_timeoutstate; /* either blocking or non-blocking */
char *f_type; /* for by-type lookups */
void *f_self; /* self for reference */
struct sm_file *f_flushfp; /* flush this before reading parent */
struct sm_file *f_modefp; /* sync mode with this fp */
@ -130,9 +130,6 @@ struct sm_file
unsigned char f_ubuf[3]; /* guarantee an ungetc() buffer */
unsigned char f_nbuf[1]; /* guarantee a getc() buffer */
/* separate buffer for fgetln() when line crosses buffer boundary */
struct smbuf f_lb; /* buffer for fgetln() */
/* Unix stdio files get aligned to block boundaries on fseek() */
int f_blksize; /* stat.st_blksize (may be != bf.size) */
off_t f_lseekoff; /* current lseek offset */
@ -224,8 +221,7 @@ __END_DECLS
#define SMOFF 0x004000 /* set iff offset is in fact correct */
#define SMALC 0x010000 /* allocate string space dynamically */
#define SMACCESSMASK 0x0070
#define SMMODEMASK 0x011C
#define SMMODEMASK 0x0070 /* read/write mode */
/* defines for timeout constants */
#define SM_TIME_IMMEDIATE (0)

View File

@ -6,7 +6,7 @@
* forth in the LICENSE file which can be found at the top level of
* the sendmail distribution.
*
* $Id: ldap.h,v 1.9 2002/01/11 22:06:50 gshapiro Exp $
* $Id: ldap.h,v 1.22 2002/03/05 02:17:26 ca Exp $
*/
#ifndef SM_LDAP_H
@ -15,6 +15,11 @@
# include <sm/conf.h>
# include <sm/rpool.h>
/*
** NOTE: These should be changed from LDAPMAP_* to SM_LDAP_*
** in the next major release (8.13) of sendmail.
*/
# ifndef LDAPMAP_MAX_ATTR
# define LDAPMAP_MAX_ATTR 64
# endif /* ! LDAPMAP_MAX_ATTR */
@ -30,22 +35,31 @@
# if _FFR_LDAP_RECURSION
/* Attribute types */
# define LDAPMAP_ATTR_NORMAL 0
# define LDAPMAP_ATTR_DN 1
# define LDAPMAP_ATTR_FILTER 2
# define LDAPMAP_ATTR_URL 3
# define LDAPMAP_ATTR_FINAL 4
# define SM_LDAP_ATTR_NONE (-1)
# define SM_LDAP_ATTR_OBJCLASS 0
# define SM_LDAP_ATTR_NORMAL 1
# define SM_LDAP_ATTR_DN 2
# define SM_LDAP_ATTR_FILTER 3
# define SM_LDAP_ATTR_URL 4
/* sm_ldap_results() flags */
# define SM_LDAP_SINGLEMATCH 0x0001
# define SM_LDAP_MATCHONLY 0x0002
# define SM_LDAP_USE_ALLATTR 0x0004
# endif /* _FFR_LDAP_RECURSION */
struct sm_ldap_struct
{
/* needed for ldap_open or ldap_init */
char *ldap_host;
char *ldap_target;
int ldap_port;
# if _FFR_LDAP_URI
bool ldap_uri;
# endif /* _FFR_LDAP_URI */
# if _FFR_LDAP_SETVERSION
int ldap_version;
# endif /* _FFR_LDAP_SETVERSION */
pid_t ldap_pid;
/* options set in ld struct before ldap_bind_s */
@ -67,7 +81,7 @@ struct sm_ldap_struct
char *ldap_attr[LDAPMAP_MAX_ATTR + 1];
# if _FFR_LDAP_RECURSION
int ldap_attr_type[LDAPMAP_MAX_ATTR + 1];
char *ldap_attr_final[LDAPMAP_MAX_ATTR + 1];
char *ldap_attr_needobjclass[LDAPMAP_MAX_ATTR + 1];
# endif /* _FFR_LDAP_RECURSION */
bool ldap_attrsonly;
@ -85,13 +99,21 @@ struct sm_ldap_struct
typedef struct sm_ldap_struct SM_LDAP_STRUCT;
# if _FFR_LDAP_RECURSION
struct sm_ldap_recurse_list
struct sm_ldap_recurse_entry
{
char *lr_search;
int lr_type;
struct sm_ldap_recurse_list *lr_next;
bool lr_done;
};
struct sm_ldap_recurse_list
{
int lr_size;
int lr_cnt;
struct sm_ldap_recurse_entry **lr_data;
};
typedef struct sm_ldap_recurse_entry SM_LDAP_RECURSE_ENTRY;
typedef struct sm_ldap_recurse_list SM_LDAP_RECURSE_LIST;
# endif /* _FFR_LDAP_RECURSION */
@ -100,13 +122,18 @@ extern void sm_ldap_clear __P((SM_LDAP_STRUCT *));
extern bool sm_ldap_start __P((char *, SM_LDAP_STRUCT *));
extern int sm_ldap_search __P((SM_LDAP_STRUCT *, char *));
# if _FFR_LDAP_RECURSION
extern int sm_ldap_results __P((SM_LDAP_STRUCT *, int, int, char,
SM_RPOOL_T *, char **,
extern int sm_ldap_results __P((SM_LDAP_STRUCT *, int, int, int,
SM_RPOOL_T *, char **, int *, int *,
SM_LDAP_RECURSE_LIST *));
# endif /* _FFR_LDAP_RECURSION */
extern void sm_ldap_setopts __P((LDAP *, SM_LDAP_STRUCT *));
extern int sm_ldap_geterrno __P((LDAP *));
extern void sm_ldap_close __P((SM_LDAP_STRUCT *));
# endif /* LDAPMAP */
/* Portability defines */
# if !SM_CONF_LDAP_MEMFREE
# define ldap_memfree(x) ((void) 0)
# endif /* !SM_CONF_LDAP_MEMFREE */
# endif /* LDAPMAP */
#endif /* ! SM_LDAP_H */

View File

@ -6,7 +6,7 @@
* forth in the LICENSE file which can be found at the top level of
* the sendmail distribution.
*
* $Id: sm_os_freebsd.h,v 1.9 2001/06/27 21:46:48 gshapiro Exp $
* $Id: sm_os_freebsd.h,v 1.10 2002/03/10 22:41:03 gshapiro Exp $
*/
/*
@ -31,7 +31,11 @@
#endif
#ifndef SM_CONF_SHM
# ifdef __sparc64__
# define SM_CONF_SHM 0
# else /* __sparc64__ */
# define SM_CONF_SHM 1
# endif /* __sparc64__ */
#endif /* SM_CONF_SHM */
#ifndef SM_CONF_SEM
# define SM_CONF_SEM 1

View File

@ -31,8 +31,9 @@ divert(bldTARGETS_SECTION)
MFAPI= ${SRCDIR}/inc`'lude/libmilter/mfapi.h
MFDEF= ${SRCDIR}/inc`'lude/libmilter/mfdef.h
install-mfapi: ${MFAPI}
${INSTALL} -c -o ${INCOWN} -g ${INCGRP} -m ${INCMODE} ${MFAPI} ${DESTDIR}${INCLUDEDIR}
${INSTALL} -c -o ${INCOWN} -g ${INCGRP} -m ${INCMODE} ${MFDEF} ${DESTDIR}${INCLUDEDIR}
if [ ! -d ${DESTDIR}${INCLUDEDIR}/libmilter ]; then mkdir -p ${DESTDIR}${INCLUDEDIR}/libmilter; else :; fi
${INSTALL} -c -o ${INCOWN} -g ${INCGRP} -m ${INCMODE} ${MFAPI} ${DESTDIR}${INCLUDEDIR}/libmilter/mfapi.h
${INSTALL} -c -o ${INCOWN} -g ${INCGRP} -m ${INCMODE} ${MFDEF} ${DESTDIR}${INCLUDEDIR}/libmilter/mfdef.h
divert(0)
bldFINISH

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2002 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: comm.c,v 8.48 2001/11/07 17:43:04 ca Exp $")
SM_RCSID("@(#)$Id: comm.c,v 8.54 2002/03/06 16:03:26 ca Exp $")
#include "libmilter.h"
#include <sm/errstring.h>
@ -206,6 +206,39 @@ mi_rd_cmd(sd, timeout, cmd, rlen, name)
** MI_SUCCESS/MI_FAILURE
*/
/*
** we don't care much about the timeout here, it's very long anyway
** FD_SETSIZE is only checked in mi_rd_cmd.
** XXX l == 0 ?
*/
#define MI_WR(data) \
while (sl > 0) \
{ \
FD_ZERO(&wrtset); \
FD_SET((unsigned int) sd, &wrtset); \
ret = select(sd + 1, NULL, &wrtset, NULL, timeout); \
if (ret == 0) \
return MI_FAILURE; \
if (ret < 0) \
{ \
if (errno == EINTR) \
continue; \
else \
return MI_FAILURE; \
} \
l = MI_SOCK_WRITE(sd, (void *) ((data) + i), sl); \
if (l < 0) \
{ \
if (errno == EINTR) \
continue; \
else \
return MI_FAILURE; \
} \
i += l; \
sl -= l; \
}
int
mi_wr_cmd(sd, timeout, cmd, buf, len)
socket_t sd;
@ -229,48 +262,15 @@ mi_wr_cmd(sd, timeout, cmd, buf, len)
i = 0;
sl = MILTER_LEN_BYTES + 1;
do
{
FD_ZERO(&wrtset);
FD_SET((unsigned int) sd, &wrtset);
if ((ret = select(sd + 1, NULL, &wrtset, NULL, timeout)) == 0)
return MI_FAILURE;
} while (ret < 0 && errno == EINTR);
if (ret < 0)
return MI_FAILURE;
/* use writev() instead to send the whole stuff at once? */
while ((l = MI_SOCK_WRITE(sd, (void *) (data + i),
sl - i)) < (ssize_t) sl)
{
if (l < 0)
return MI_FAILURE;
i += l;
sl -= l;
}
MI_WR(data);
if (len > 0 && buf == NULL)
return MI_FAILURE;
if (len == 0 || buf == NULL)
return MI_SUCCESS;
i = 0;
sl = len;
do
{
FD_ZERO(&wrtset);
FD_SET((unsigned int) sd, &wrtset);
if ((ret = select(sd + 1, NULL, &wrtset, NULL, timeout)) == 0)
return MI_FAILURE;
} while (ret < 0 && errno == EINTR);
if (ret < 0)
return MI_FAILURE;
while ((l = MI_SOCK_WRITE(sd, (void *) (buf + i),
sl - i)) < (ssize_t) sl)
{
if (l < 0)
return MI_FAILURE;
i += l;
sl -= l;
}
MI_WR(buf);
return MI_SUCCESS;
}

View File

@ -37,20 +37,21 @@ run-time linker.
<H2><a name="config">Configuring Sendmail</A></H2>
First, you must compile sendmail versions before 8.12 with _FFR_MILTER
defined. To do this, add the following lines to your build
First, you must compile sendmail with MILTER defined.
If you use a sendmail version older than 8.12 please see
the instructions for your version.
To do this, add the following lines to your build
configuration file (devtools/Site/config.site.m4)
<pre>
APPENDDEF(`conf_sendmail_ENVDEF', `-D_FFR_MILTER=1')
APPENDDEF(`conf_libmilter_ENVDEF', `-D_FFR_MILTER=1')
APPENDDEF(`conf_sendmail_ENVDEF', `-DMILTER')
</pre>
then type <code>./Build -c</code> in your sendmail directory.
<P>
Next, you must add the desired filters to your sendmail configuration
(.mc) file. With versions before 8.12, the file must then be
processed with _FFR_MILTER defined. Mail filters have three equates:
(.mc) file.
Mail filters have three equates:
The required <code>S=</code> equate specifies the socket where
sendmail should look for the filter; The optional <code>F=</code> and
<code>T=</code> equates specify flags and timeouts, respectively. All
@ -117,7 +118,7 @@ third uses an IP socket on port 999.
define(`confINPUT_MAIL_FILTERS', `filter2,filter1,filter3')
<hr width="30%">
m4 <b>-D_FFR_MILTER</b> ../m4/cf.m4 myconfig.mc &gt; myconfig.cf
m4 ../m4/cf.m4 myconfig.mc &gt; myconfig.cf
</pre>
By default, the filters would be run in the order declared,
i.e. "filter1, filter2, filter3"; however, since
@ -160,7 +161,7 @@ For information about available macros and their meanings, please
consult the sendmail documentation.
<hr size="1">
<font size="-1">
Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
Copyright (c) 2000-2002 Sendmail, Inc. and its suppliers.
All rights reserved.
<br>
By using this file, you agree to the terms and conditions set

View File

@ -0,0 +1,60 @@
<html>
<head><title>smfi_setbacklog</title></head>
<body>
<h1>smfi_setbacklog</h1>
<table border="0" cellspacing=4 cellpadding=4>
<!---------- Synopsis ----------->
<tr><th valign="top" align=left width=150>SYNOPSIS</th><td>
<pre>
#include &lt;libmilter/mfapi.h&gt;
int smfi_setbacklog(
int obacklog
);
</pre>
Set the filter's listen backlog value.
</td></tr>
<!----------- Description ---------->
<tr><th valign="top" align=left>DESCRIPTION</th><td>
<table border="1" cellspacing=1 cellpadding=4>
<tr align="left" valign=top>
<th width="80">Called When</th>
<td>smfi_setbacklog should only be called before <a href="smfi_main.html">smfi_main</a>.</td>
</tr>
<tr align="left" valign=top>
<th width="80">Effects</th>
<td>Sets the incoming socket backlog used by listen(). If smfi_setbacklog is not called, the operating system default is used.</td>
</tr>
</table>
<!----------- Arguments ---------->
<tr><th valign="top" align=left>ARGUMENTS</th><td>
<table border="1" cellspacing=0>
<tr bgcolor="#dddddd"><th>Argument</th><th>Description</th></tr>
<tr valign="top"><td>obacklog</td>
<td>The number of incoming connections to allow in the listen queue.
</td></tr>
</table>
</td></tr>
<!----------- Return values ---------->
<tr>
<th valign="top" align=left>RETURN VALUES</th>
<td>smfi_setbacklog returns MI_FAILURE if obacklog is less than or equal
to zero.</td>
</tr>
</table>
<hr size="1">
<font size="-1">
Copyright (c) 2002 Sendmail, Inc. and its suppliers.
All rights reserved.
<br>
By using this file, you agree to the terms and conditions set
forth in the <a href="LICENSE.txt">LICENSE</a>.
</font>
</body>
</html>

View File

@ -72,8 +72,12 @@ Otherwise, it return MI_SUCCESS.
<ul>
<li>Values passed to smfi_setreply are not checked for standards compliance.
<li>For details about reply codes and their meanings, please see RFC's
<a href="http://www.cis.ohio-state.edu/htbin/rfc/rfc821.html">821</a>
and <a href="http://www.cis.ohio-state.edu/htbin/rfc/rfc2034.html">2034</a>.
<a href="http://www.rfc-editor.org/rfc/rfc821.txt">821</a>
and <a href="http://www.rfc-editor.org/rfc/rfc2034.txt">2034</a>.
<li>If the reply code (rcode) given is a '4XX' code but SMFI_REJECT is used
for the message, the custom reply is not used.
<li>Similarly, if the reply code (rcode) given is a '5XX' code but
SMFI_TEMPFAIL is used for the message, the custom reply is not used.
</ul>
</td>
</tr>
@ -82,7 +86,7 @@ and <a href="http://www.cis.ohio-state.edu/htbin/rfc/rfc2034.html">2034</a>.
<hr size="1">
<font size="-1">
Copyright (c) 2000 Sendmail, Inc. and its suppliers.
Copyright (c) 2000, 2002 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-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2002 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: engine.c,v 8.102 2001/12/13 17:10:00 ca Exp $")
SM_RCSID("@(#)$Id: engine.c,v 8.109 2002/03/13 17:18:44 gshapiro Exp $")
#include "libmilter.h"
@ -406,7 +406,9 @@ sendreply(r, sd, timeout_ptr, ctx)
break;
case SMFIS_TEMPFAIL:
case SMFIS_REJECT:
if (ctx->ctx_reply != NULL)
if (ctx->ctx_reply != NULL &&
((r == SMFIS_TEMPFAIL && *ctx->ctx_reply == '4') ||
(r == SMFIS_REJECT && *ctx->ctx_reply == '5')))
{
ret = mi_wr_cmd(sd, timeout_ptr, SMFIR_REPLYCODE,
ctx->ctx_reply,
@ -605,7 +607,6 @@ st_connectinfo(g)
{
(void) memcpy((void *) &port, (void *) (s + i),
sizeof port);
port = ntohs(port);
if ((i += sizeof port) >= l)
{
smi_log(SMI_LOG_ERR,
@ -614,11 +615,15 @@ st_connectinfo(g)
(int) g->a_ctx->ctx_id, i, l);
return _SMFIS_ABORT;
}
/* make sure string is terminated */
if (s[l - 1] != '\0')
return _SMFIS_ABORT;
# if NETINET
if (family == SMFIA_INET)
{
if (inet_aton(s + i, (struct in_addr *) &sockaddr.sin.sin_addr)
== INADDR_NONE)
!= 1)
{
smi_log(SMI_LOG_ERR,
"%s: connect[%d]: inet_aton failed",

View File

@ -9,7 +9,7 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: listener.c,v 8.81 2002/01/08 23:14:23 ca Exp $")
SM_RCSID("@(#)$Id: listener.c,v 8.82 2002/01/22 18:46:47 ca Exp $")
/*
** listener.c -- threaded network listener

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2002 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: main.c,v 8.53 2001/11/29 02:21:02 ca Exp $")
SM_RCSID("@(#)$Id: main.c,v 8.55 2002/02/25 17:54:41 gshapiro Exp $")
#define _DEFINE 1
#include "libmilter.h"
@ -161,7 +161,7 @@ smfi_setconn(oconn)
** SMFI_SETBACKLOG -- set backlog
**
** Parameters:
** odbg -- new backlog.
** obacklog -- new backlog.
**
** Returns:
** MI_SUCCESS/MI_FAILURE

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2002 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.35 2002/01/10 01:34:55 ca Exp $")
SM_RCSID("@(#)$Id: signal.c,v 8.37 2002/03/23 00:55:19 ca Exp $")
#include "libmilter.h"

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2002 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.57 2001/11/20 18:47:49 ca Exp $")
SM_RCSID("@(#)$Id: smfi.c,v 8.63 2002/02/07 01:16:13 msk Exp $")
#include <sm/varargs.h>
#include "libmilter.h"
@ -111,6 +111,7 @@ smfi_chgheader(ctx, headerf, hdridx, headerv)
free(buf);
return r;
}
/*
** SMFI_ADDRCPT -- send an additional recipient to the MTA
**
@ -139,6 +140,7 @@ smfi_addrcpt(ctx, rcpt)
len = strlen(rcpt) + 1;
return mi_wr_cmd(ctx->ctx_sd, &timeout, SMFIR_ADDRCPT, rcpt, len);
}
/*
** SMFI_DELRCPT -- send a recipient to be removed to the MTA
**
@ -167,6 +169,7 @@ smfi_delrcpt(ctx, rcpt)
len = strlen(rcpt) + 1;
return mi_wr_cmd(ctx->ctx_sd, &timeout, SMFIR_DELRCPT, rcpt, len);
}
/*
** SMFI_REPLACEBODY -- send a body chunk to the MTA
**
@ -210,6 +213,7 @@ smfi_replacebody(ctx, bodyp, bodylen)
}
return MI_SUCCESS;
}
#if _FFR_QUARANTINE
/*
** SMFI_QUARANTINE -- quarantine an envelope
@ -430,18 +434,20 @@ smfi_setmlreply(ctx, rcode, xcode, va_alist)
tl = strlen(txt);
if (tl > MAXREPLYLEN)
return MI_FAILURE;
break;
/* this text, reply codes, \r\n */
len += tl + 2 + rlen;
if (++args > MAXREPLIES)
return MI_FAILURE;
break;
/* XXX check also for unprintable chars? */
if (strpbrk(txt, "\r\n") != NULL)
return MI_FAILURE;
break;
}
SM_VA_END(ap);
if (txt != NULL)
return MI_FAILURE;
/* trailing '\0' */
++len;
@ -493,6 +499,7 @@ smfi_setpriv(ctx, privatedata)
ctx->ctx_privdata = privatedata;
return MI_SUCCESS;
}
/*
** SMFI_GETPRIV -- get private data
**
@ -511,6 +518,7 @@ smfi_getpriv(ctx)
return NULL;
return ctx->ctx_privdata;
}
/*
** SMFI_GETSYMVAL -- get the value of a macro
**
@ -574,3 +582,31 @@ smfi_getsymval(ctx, symname)
}
return NULL;
}
#if _FFR_SMFI_PROGRESS
/*
** SMFI_PROGRESS -- send "progress" message to the MTA to prevent premature
** timeouts during long milter-side operations
**
** Parameters:
** ctx -- Opaque context structure
**
** Return value:
** MI_SUCCESS/MI_FAILURE
*/
int
smfi_progress(ctx)
SMFICTX *ctx;
{
struct timeval timeout;
if (ctx == NULL)
return MI_FAILURE;
timeout.tv_sec = ctx->ctx_timeout;
timeout.tv_usec = 0;
return mi_wr_cmd(ctx->ctx_sd, &timeout, SMFIR_PROGRESS, NULL, 0);
}
#endif /* _FFR_SMFI_PROGRESS */

View File

@ -5,7 +5,7 @@
# forth in the LICENSE file which can be found at the top level of
# the sendmail distribution.
#
# $Id: README,v 1.20 2002/01/09 18:05:39 ca Exp $
# $Id: README,v 1.21 2002/01/23 17:30:48 gshapiro Exp $
#
Libsm is a library of generally useful C abstractions.
@ -109,6 +109,9 @@ SM_CONF_BROKEN_STRTOD
SM_CONF_GETOPT
Set to 1 if your operating system does not include getopt(3).
SM_CONF_LDAP_MEMFREE
Set to 1 if your LDAP client libraries include ldap_memfree(3).
SM_IO_MAX_BUF_FILE
Set this to a useful buffer size for regular files if stat(2)
does not return a value for st_blksize that is the

View File

@ -12,7 +12,7 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: clock.c,v 1.34 2001/11/05 18:33:20 ca Exp $")
SM_RCSID("@(#)$Id: clock.c,v 1.35 2002/03/22 18:34:38 gshapiro Exp $")
#include <unistd.h>
#include <time.h>
#include <errno.h>
@ -160,6 +160,8 @@ sm_sigsafe_seteventm(intvl, func, arg)
timersub(&SmEventQueue->ev_time, &now, &itime.it_value);
itime.it_interval.tv_sec = 0;
itime.it_interval.tv_usec = 0;
if (itime.it_value.tv_sec < 0)
itime.it_value.tv_sec = 0;
if (itime.it_value.tv_sec == 0 && itime.it_value.tv_usec == 0)
itime.it_value.tv_usec = 1000;
(void) setitimer(ITIMER_REAL, &itime, NULL);
@ -412,6 +414,11 @@ sm_tick(sig)
&clr.it_value);
clr.it_interval.tv_sec = 0;
clr.it_interval.tv_usec = 0;
if (clr.it_value.tv_sec < 0)
clr.it_value.tv_sec = 0;
if (clr.it_value.tv_sec == 0 &&
clr.it_value.tv_usec == 0)
clr.it_value.tv_usec = 1000;
(void) setitimer(ITIMER_REAL, &clr, NULL);
}
else
@ -452,6 +459,10 @@ sm_tick(sig)
timersub(&SmEventQueue->ev_time, &now, &clr.it_value);
clr.it_interval.tv_sec = 0;
clr.it_interval.tv_usec = 0;
if (clr.it_value.tv_sec < 0)
clr.it_value.tv_sec = 0;
if (clr.it_value.tv_sec == 0 && clr.it_value.tv_usec == 0)
clr.it_value.tv_usec = 1000;
(void) setitimer(ITIMER_REAL, &clr, NULL);
#else /* SM_CONF_SETITIMER */
(void) alarm((unsigned) (SmEventQueue->ev_time - now));

View File

@ -9,7 +9,7 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: config.c,v 1.26 2001/12/14 00:26:18 ca Exp $")
SM_RCSID("@(#)$Id: config.c,v 1.27 2002/01/23 17:30:48 gshapiro Exp $")
#include <stdlib.h>
#include <sm/heap.h>
@ -176,6 +176,9 @@ char *SmCompileOptions[] =
#if SM_CONF_GETOPT
"SM_CONF_GETOPT",
#endif /* SM_CONF_GETOPT */
#if SM_CONF_LDAP_MEMFREE
"SM_CONF_LDAP_MEMFREE",
#endif /* SM_CONF_LDAP_MEMFREE */
#if SM_CONF_LONGLONG
"SM_CONF_LONGLONG",
#endif /* SM_CONF_LONGLONG */

View File

@ -8,7 +8,7 @@
<center>
<h1> libsm : Debugging and Tracing </h1>
<br> $Id: debug.html,v 1.8 2000/12/08 21:41:41 ca Exp $
<br> $Id: debug.html,v 1.9 2002/02/02 16:50:56 ca Exp $
</center>
<h2> Introduction </h2>
@ -59,10 +59,6 @@ For example,
does all of the above.
</dl>
<p>
For sendmail 9.x, I propose to drop support for numeric debug categories,
and just use named debug categories.
<h2> Synopsis </h2>
<pre>

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 2000-2002 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_RCSID("@(#)$Id: fclose.c,v 1.41 2001/09/11 04:04:48 gshapiro Exp $")
SM_RCSID("@(#)$Id: fclose.c,v 1.42 2002/02/01 02:28:00 ca Exp $")
#include <errno.h>
#include <stdlib.h>
#include <sys/time.h>
@ -86,6 +86,7 @@ sm_io_close(fp, timeout)
SM_REQUIRE_ISA(fp, SmFileMagic);
/* XXX this won't be reached if above macro is active */
if (fp->sm_magic == NULL)
{
/* not open! */
@ -140,8 +141,6 @@ sm_io_close(fp, timeout)
}
if (HASUB(fp))
FREEUB(fp);
if (HASLB(fp))
FREELB(fp);
fp->f_flags = 0; /* clear flags */
fp->sm_magic = NULL; /* Release this SM_FILE_T for reuse. */
fp->f_r = fp->f_w = 0; /* Mess up if reaccessed. */

View File

@ -13,7 +13,7 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: findfp.c,v 1.62 2002/01/11 16:33:03 ca Exp $")
SM_RCSID("@(#)$Id: findfp.c,v 1.66 2002/02/20 02:40:24 ca Exp $")
#include <stdlib.h>
#include <unistd.h>
#include <sys/param.h>
@ -47,7 +47,7 @@ SM_FILE_T SmFtStdiofd_def =
SM_TIME_BLOCK, "stdiofd" };
/* A string file type */
SM_FILE_T _SmFtString_def =
SM_FILE_T SmFtString_def =
{SmFileMagic, 0, 0, 0, (SMRW|SMNBF), -1, {0, 0}, 0, 0, 0,
sm_strclose, sm_strread, sm_strseek, sm_strwrite,
sm_stropen, sm_strsetinfo, sm_strgetinfo, SM_TIME_FOREVER,
@ -119,9 +119,9 @@ sm_moreglue_x(n)
register struct sm_glue *g;
register SM_FILE_T *p;
g = (struct sm_glue *) sm_pmalloc_x(sizeof(*g) + ALIGNBYTES +
g = (struct sm_glue *) sm_pmalloc_x(sizeof(*g) + SM_ALIGN_BITS +
n * sizeof(SM_FILE_T));
p = (SM_FILE_T *) ALIGN(g + 1);
p = (SM_FILE_T *) SM_ALIGN(g + 1);
g->gl_next = NULL;
g->gl_niobs = n;
g->gl_iobs = p;
@ -194,13 +194,10 @@ sm_fp(t, flags, oldfp)
fp->f_setinfo = t->f_setinfo; /* assign setinfo function */
fp->f_getinfo = t->f_getinfo; /* assign getinfo function */
fp->f_type = t->f_type; /* file type */
fp->f_self = fp; /* self reference for future use */
fp->f_ub.smb_base = NULL; /* no ungetc buffer */
fp->f_ub.smb_size = 0; /* no size for no ungetc buffer */
fp->f_lb.smb_base = NULL; /* no line buffer */
fp->f_lb.smb_size = 0; /* no size for no line buffer */
if (fp->f_timeout == SM_TIME_DEFAULT)
fp->f_timeout = SM_TIME_FOREVER;
else

View File

@ -8,7 +8,7 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: ldap.c,v 1.18 2002/01/11 22:06:51 gshapiro Exp $")
SM_RCSID("@(#)$Id: ldap.c,v 1.44 2002/02/22 21:54:02 gshapiro Exp $")
#if LDAPMAP
# include <sys/types.h>
@ -24,6 +24,9 @@ SM_RCSID("@(#)$Id: ldap.c,v 1.18 2002/01/11 22:06:51 gshapiro Exp $")
# include <sm/errstring.h>
# include <sm/ldap.h>
# include <sm/string.h>
# ifdef EX_OK
# undef EX_OK /* for SVr4.2 SMP */
# endif /* EX_OK */
# include <sm/sysexits.h>
SM_DEBUG_T SmLDAPTrace = SM_DEBUG_INITIALIZER("sm_trace_ldap",
@ -49,8 +52,14 @@ sm_ldap_clear(lmap)
if (lmap == NULL)
return;
lmap->ldap_host = NULL;
lmap->ldap_target = NULL;
lmap->ldap_port = LDAP_PORT;
#if _FFR_LDAP_URI
lmap->ldap_uri = false;
#endif /* _FFR_LDAP_URI */
# if _FFR_LDAP_SETVERSION
lmap->ldap_version = 0;
# endif /* _FFR_LDAP_SETVERSION */
lmap->ldap_deref = LDAP_DEREF_NEVER;
lmap->ldap_timelimit = LDAP_NO_LIMIT;
lmap->ldap_sizelimit = LDAP_NO_LIMIT;
@ -72,8 +81,8 @@ sm_ldap_clear(lmap)
lmap->ldap_filter = NULL;
lmap->ldap_attr[0] = NULL;
#if _FFR_LDAP_RECURSION
lmap->ldap_attr_type[0] = LDAPMAP_ATTR_NORMAL;
lmap->ldap_attr_final[0] = NULL;
lmap->ldap_attr_type[0] = SM_LDAP_ATTR_NONE;
lmap->ldap_attr_needobjclass[0] = NULL;
#endif /* _FFR_LDAP_RECURSION */
lmap->ldap_res = NULL;
lmap->ldap_next = NULL;
@ -132,11 +141,16 @@ sm_ldap_start(name, lmap)
if (sm_debug_active(&SmLDAPTrace, 9))
sm_dprintf("ldapmap_start(%s, %d)\n",
lmap->ldap_host == NULL ? "localhost" : lmap->ldap_host,
lmap->ldap_target == NULL ? "localhost" : lmap->ldap_target,
lmap->ldap_port);
# if USE_LDAP_INIT
ld = ldap_init(lmap->ldap_host, lmap->ldap_port);
# if _FFR_LDAP_URI
if (lmap->ldap_uri)
errno = ldap_initialize(&ld, lmap->ldap_target);
else
# endif /* _FFR_LDAP_URI */
ld = ldap_init(lmap->ldap_target, lmap->ldap_port);
save_errno = errno;
# else /* USE_LDAP_INIT */
/*
@ -146,7 +160,7 @@ sm_ldap_start(name, lmap)
*/
SM_LDAP_SETTIMEOUT(lmap->ldap_timeout.tv_sec);
ld = ldap_open(lmap->ldap_host, lmap->ldap_port);
ld = ldap_open(lmap->ldap_target, lmap->ldap_port);
save_errno = errno;
/* clear the event if it has not sprung */
@ -297,8 +311,8 @@ sm_ldap_search(lmap, key)
sm_dprintf("ldap search filter=%s\n", filter);
lmap->ldap_res = NULL;
msgid = ldap_search(lmap->ldap_ld, lmap->ldap_base, lmap->ldap_scope,
filter,
msgid = ldap_search(lmap->ldap_ld, lmap->ldap_base,
lmap->ldap_scope, filter,
(lmap->ldap_attr[0] == NULL ? NULL :
lmap->ldap_attr),
lmap->ldap_attrsonly);
@ -306,6 +320,66 @@ sm_ldap_search(lmap, key)
}
# if _FFR_LDAP_RECURSION
/*
** SM_LDAP_HAS_OBJECTCLASS -- determine if an LDAP entry is part of a
** particular objectClass
**
** Parameters:
** lmap -- pointer to SM_LDAP_STRUCT in use
** entry -- current LDAP entry struct
** ocvalue -- particular objectclass in question.
** may be of form (fee|foo|fum) meaning
** any entry can be part of either fee,
** foo or fum objectclass
**
** Returns:
** true if item has that objectClass
*/
static bool
sm_ldap_has_objectclass(lmap, entry, ocvalue)
SM_LDAP_STRUCT *lmap;
LDAPMessage *entry;
char *ocvalue;
{
char **vals = NULL;
int i;
if (ocvalue == NULL)
return false;
vals = ldap_get_values(lmap->ldap_ld, entry, "objectClass");
if (vals == NULL)
return false;
for (i = 0; vals[i] != NULL; i++)
{
char *p;
char *q;
p = q = ocvalue;
while (*p != '\0')
{
while (*p != '\0' && *p != '|')
p++;
if ((p - q) == strlen(vals[i]) &&
sm_strncasecmp(vals[i], q, p - q) == 0)
{
ldap_value_free(vals);
return true;
}
while (*p == '|')
p++;
q = p;
}
}
ldap_value_free(vals);
return false;
}
/*
** SM_LDAP_RESULTS -- return results from an LDAP lookup in result
**
@ -322,7 +396,7 @@ sm_ldap_search(lmap, key)
** status (sysexit)
*/
# define LDAPMAP_ERROR_CLEANUP() \
# define SM_LDAP_ERROR_CLEANUP() \
{ \
if (lmap->ldap_res != NULL) \
{ \
@ -332,58 +406,138 @@ sm_ldap_search(lmap, key)
(void) ldap_abandon(lmap->ldap_ld, msgid); \
}
static int
ldapmap_add_recurse(top, item, type, rpool)
static SM_LDAP_RECURSE_ENTRY *
sm_ldap_add_recurse(top, item, type, rpool)
SM_LDAP_RECURSE_LIST **top;
char *item;
int type;
SM_RPOOL_T *rpool;
{
SM_LDAP_RECURSE_LIST *p;
SM_LDAP_RECURSE_LIST *last;
int n;
int m;
int p;
int insertat;
int moveb;
int oldsizeb;
int rc;
SM_LDAP_RECURSE_ENTRY *newe;
SM_LDAP_RECURSE_ENTRY **olddata;
last = NULL;
for (p = *top; p != NULL; p = p->lr_next)
/*
** This code will maintain a list of
** SM_LDAP_RECURSE_ENTRY structures
** in ascending order.
*/
if (*top == NULL)
{
if (strcasecmp(item, p->lr_search) == 0 &&
type == p->lr_type)
{
/* already on list */
return 1;
}
last = p;
/* Allocate an initial SM_LDAP_RECURSE_LIST struct */
*top = sm_rpool_malloc_x(rpool, sizeof **top);
(*top)->lr_cnt = 0;
(*top)->lr_size = 0;
(*top)->lr_data = NULL;
}
/* not on list, add it */
p = sm_rpool_malloc_x(rpool, sizeof *p);
p->lr_search = sm_rpool_strdup_x(rpool, item);
p->lr_type = type;
p->lr_next = NULL;
if (last == NULL)
*top = p;
if ((*top)->lr_cnt >= (*top)->lr_size)
{
/* Grow the list of SM_LDAP_RECURSE_ENTRY ptrs */
olddata = (*top)->lr_data;
if ((*top)->lr_size == 0)
{
oldsizeb = 0;
(*top)->lr_size = 256;
}
else
last->lr_next = p;
return 0;
{
oldsizeb = (*top)->lr_size * sizeof *((*top)->lr_data);
(*top)->lr_size *= 2;
}
(*top)->lr_data = sm_rpool_malloc_x(rpool,
(*top)->lr_size * sizeof *((*top)->lr_data));
if (oldsizeb > 0)
memcpy((*top)->lr_data, olddata, oldsizeb);
}
/*
** Binary search/insert item:type into list.
** Return current entry pointer if already exists.
*/
n = 0;
m = (*top)->lr_cnt - 1;
if (m < 0)
insertat = 0;
else
insertat = -1;
while (insertat == -1)
{
p = (m + n) / 2;
rc = sm_strcasecmp(item, (*top)->lr_data[p]->lr_search);
if (rc == 0)
rc = type - (*top)->lr_data[p]->lr_type;
if (rc < 0)
m = p - 1;
else if (rc > 0)
n = p + 1;
else
return (*top)->lr_data[p];
if (m == -1)
insertat = 0;
else if (n >= (*top)->lr_cnt)
insertat = (*top)->lr_cnt;
else if (m < n)
insertat = m + 1;
}
/*
** Not found in list, make room
** at insert point and add it.
*/
newe = sm_rpool_malloc_x(rpool, sizeof *newe);
if (newe != NULL)
{
moveb = ((*top)->lr_cnt - insertat) * sizeof *((*top)->lr_data);
if (moveb > 0)
memmove(&((*top)->lr_data[insertat + 1]),
&((*top)->lr_data[insertat]),
moveb);
newe->lr_search = sm_rpool_strdup_x(rpool, item);
newe->lr_type = type;
newe->lr_done = false;
((*top)->lr_data)[insertat] = newe;
(*top)->lr_cnt++;
}
return newe;
}
int
sm_ldap_results(lmap, msgid, flags, delim, rpool, result, recurse)
sm_ldap_results(lmap, msgid, flags, delim, rpool, result,
resultln, resultsz, recurse)
SM_LDAP_STRUCT *lmap;
int msgid;
int flags;
char delim;
int delim;
SM_RPOOL_T *rpool;
char **result;
int *resultln;
int *resultsz;
SM_LDAP_RECURSE_LIST *recurse;
{
bool toplevel;
int i;
int entries = 0;
int statp;
int vsize;
int ret;
int save_errno;
char *p;
SM_LDAP_RECURSE_ENTRY *rl;
/* Are we the top top level of the search? */
toplevel = (recurse == NULL);
@ -397,20 +551,8 @@ sm_ldap_results(lmap, msgid, flags, delim, rpool, result, recurse)
{
LDAPMessage *entry;
if (bitset(SM_LDAP_SINGLEMATCH, flags))
{
entries += ldap_count_entries(lmap->ldap_ld,
lmap->ldap_res);
if (entries > 1)
{
LDAPMAP_ERROR_CLEANUP();
errno = ENOENT;
return EX_NOTFOUND;
}
}
/* If we don't want multiple values and we have one, break */
if (delim == '\0' && *result != NULL)
if ((char) delim == '\0' && *result != NULL)
break;
/* Cycle through all entries */
@ -438,23 +580,24 @@ sm_ldap_results(lmap, msgid, flags, delim, rpool, result, recurse)
{
save_errno = sm_ldap_geterrno(lmap->ldap_ld);
save_errno += E_LDAPBASE;
LDAPMAP_ERROR_CLEANUP();
SM_LDAP_ERROR_CLEANUP();
errno = save_errno;
return EX_OSERR;
}
switch (ldapmap_add_recurse(&recurse, dn,
LDAPMAP_ATTR_NORMAL,
rpool))
rl = sm_ldap_add_recurse(&recurse, dn,
SM_LDAP_ATTR_DN,
rpool);
if (rl == NULL)
{
case -1:
/* error adding */
ldap_memfree(dn);
LDAPMAP_ERROR_CLEANUP();
SM_LDAP_ERROR_CLEANUP();
errno = ENOMEM;
return EX_OSERR;
case 1:
}
else if (rl->lr_done)
{
/* already on list, skip it */
ldap_memfree(dn);
continue;
@ -479,27 +622,54 @@ sm_ldap_results(lmap, msgid, flags, delim, rpool, result, recurse)
{
char *tmp, *vp_tmp;
int type;
char *needobjclass = NULL;
type = SM_LDAP_ATTR_NONE;
for (i = 0; lmap->ldap_attr[i] != NULL; i++)
{
if (sm_strcasecmp(lmap->ldap_attr[i],
attr) == 0)
{
type = lmap->ldap_attr_type[i];
needobjclass = lmap->ldap_attr_needobjclass[i];
break;
}
}
if (lmap->ldap_attr[i] == NULL)
if (bitset(SM_LDAP_USE_ALLATTR, flags) &&
type == SM_LDAP_ATTR_NONE)
{
/* URL lookups specify attrs to use */
type = SM_LDAP_ATTR_NORMAL;
needobjclass = NULL;
}
if (type == SM_LDAP_ATTR_NONE)
{
/* attribute not requested */
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
LDAPMAP_ERROR_CLEANUP();
SM_LDAP_ERROR_CLEANUP();
errno = EFAULT;
return EX_SOFTWARE;
}
/*
** For recursion on a particular attribute,
** we may need to see if this entry is
** part of a particular objectclass.
** Also, ignore objectClass attribute.
** Otherwise we just ignore this attribute.
*/
if (type == SM_LDAP_ATTR_OBJCLASS ||
(needobjclass != NULL &&
!sm_ldap_has_objectclass(lmap, entry,
needobjclass)))
{
ldap_memfree(attr);
continue;
}
if (lmap->ldap_attrsonly == LDAPMAP_FALSE)
{
vals = ldap_get_values(lmap->ldap_ld,
@ -510,18 +680,14 @@ sm_ldap_results(lmap, msgid, flags, delim, rpool, result, recurse)
save_errno = sm_ldap_geterrno(lmap->ldap_ld);
if (save_errno == LDAP_SUCCESS)
{
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
continue;
}
/* Must be an error */
save_errno += E_LDAPBASE;
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
LDAPMAP_ERROR_CLEANUP();
SM_LDAP_ERROR_CLEANUP();
errno = save_errno;
return EX_TEMPFAIL;
}
@ -548,10 +714,7 @@ sm_ldap_results(lmap, msgid, flags, delim, rpool, result, recurse)
{
if (lmap->ldap_attrsonly == LDAPMAP_FALSE)
ldap_value_free(vals);
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
continue;
}
@ -560,24 +723,36 @@ sm_ldap_results(lmap, msgid, flags, delim, rpool, result, recurse)
** return first found.
*/
if (delim == '\0')
if ((char) delim == '\0')
{
if (*result != NULL)
{
/* already have a value */
break;
}
if (bitset(SM_LDAP_SINGLEMATCH,
flags) &&
*result != NULL)
{
/* only wanted one match */
SM_LDAP_ERROR_CLEANUP();
errno = ENOENT;
return EX_NOTFOUND;
}
if (lmap->ldap_attrsonly == LDAPMAP_TRUE)
{
*result = sm_rpool_strdup_x(rpool,
attr);
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
break;
}
if (vals[0] == NULL)
{
ldap_value_free(vals);
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
continue;
}
@ -596,9 +771,7 @@ sm_ldap_results(lmap, msgid, flags, delim, rpool, result, recurse)
sm_strlcpy(*result, vals[0],
vsize);
ldap_value_free(vals);
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
break;
}
@ -610,94 +783,137 @@ sm_ldap_results(lmap, msgid, flags, delim, rpool, result, recurse)
attr);
else
{
if (bitset(SM_LDAP_SINGLEMATCH,
flags) &&
*result != NULL)
{
/* only wanted one match */
SM_LDAP_ERROR_CLEANUP();
errno = ENOENT;
return EX_NOTFOUND;
}
vsize = strlen(*result) +
strlen(attr) + 2;
tmp = sm_rpool_malloc_x(rpool,
vsize);
(void) sm_snprintf(tmp,
vsize, "%s%c%s",
*result, delim,
*result, (char) delim,
attr);
*result = tmp;
}
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
continue;
}
/*
** If there is more than one,
** munge then into a map_coldelim
** separated string
** If there is more than one, munge then
** into a map_coldelim separated string.
** If we are recursing we may have an entry
** with no 'normal' values to put in the
** string.
** This is not an error.
*/
if (type == SM_LDAP_ATTR_NORMAL &&
bitset(SM_LDAP_SINGLEMATCH, flags) &&
*result != NULL)
{
/* only wanted one match */
SM_LDAP_ERROR_CLEANUP();
errno = ENOENT;
return EX_NOTFOUND;
}
vsize = 0;
for (i = 0; vals[i] != NULL; i++)
{
if (type == LDAPMAP_ATTR_DN ||
type == LDAPMAP_ATTR_FILTER ||
type == LDAPMAP_ATTR_URL)
if (type == SM_LDAP_ATTR_DN ||
type == SM_LDAP_ATTR_FILTER ||
type == SM_LDAP_ATTR_URL)
{
if (ldapmap_add_recurse(&recurse,
/* add to recursion */
if (sm_ldap_add_recurse(&recurse,
vals[i],
type) < 0)
type,
rpool) == NULL)
{
LDAPMAP_ERROR_CLEANUP();
SM_LDAP_ERROR_CLEANUP();
errno = ENOMEM;
return EX_OSERR;
}
}
if (type != LDAPMAP_ATTR_NORMAL)
{
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
continue;
}
vsize += strlen(vals[i]) + 1;
if (lmap->ldap_attrsep != '\0')
vsize += strlen(attr) + 1;
}
vp_tmp = sm_rpool_malloc_x(rpool, vsize);
/*
** Create/Append to string any normal
** attribute values. Otherwise, just free
** memory and move on to the next
** attribute in this entry.
*/
if (type == SM_LDAP_ATTR_NORMAL && vsize > 0)
{
char *pe;
/* Grow result string if needed */
if ((*resultln + vsize) >= *resultsz)
{
while ((*resultln + vsize) >= *resultsz)
{
if (*resultsz == 0)
*resultsz = 1024;
else
*resultsz *= 2;
}
vp_tmp = sm_rpool_malloc_x(rpool, *resultsz);
*vp_tmp = '\0';
p = vp_tmp;
if (*result != NULL)
sm_strlcpy(vp_tmp,
*result,
*resultsz);
*result = vp_tmp;
}
p = *result + *resultln;
pe = *result + *resultsz;
for (i = 0; vals[i] != NULL; i++)
{
if (*resultln > 0)
*p++ = (char) delim;
if (lmap->ldap_attrsep != '\0')
{
p += sm_strlcpy(p, attr,
vsize - (p - vp_tmp));
pe - p);
if (p < pe)
*p++ = lmap->ldap_attrsep;
}
p += sm_strlcpy(p, vals[i],
vsize - (p - vp_tmp));
if (p >= vp_tmp + vsize)
pe - p);
*resultln = p - (*result);
if (p >= pe)
{
/* Internal error: buffer too small for LDAP values */
LDAPMAP_ERROR_CLEANUP();
SM_LDAP_ERROR_CLEANUP();
errno = ENOMEM;
return EX_OSERR;
}
if (vals[i + 1] != NULL)
*p++ = delim;
}
}
ldap_value_free(vals);
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
if (*result == NULL)
{
*result = vp_tmp;
continue;
}
vsize = strlen(*result) + strlen(vp_tmp) + 2;
tmp = sm_rpool_malloc_x(rpool, vsize);
(void) sm_snprintf(tmp, vsize, "%s%c%s",
*result, delim, vp_tmp);
*result = tmp;
}
save_errno = sm_ldap_geterrno(lmap->ldap_ld);
@ -715,13 +931,16 @@ sm_ldap_results(lmap, msgid, flags, delim, rpool, result, recurse)
{
/* Must be an error */
save_errno += E_LDAPBASE;
LDAPMAP_ERROR_CLEANUP();
SM_LDAP_ERROR_CLEANUP();
errno = save_errno;
return EX_TEMPFAIL;
}
/* mark this DN as done */
rl->lr_done = true;
/* We don't want multiple values and we have one */
if (delim == '\0' && *result != NULL)
if ((char) delim == '\0' && *result != NULL)
break;
}
save_errno = sm_ldap_geterrno(lmap->ldap_ld);
@ -730,7 +949,7 @@ sm_ldap_results(lmap, msgid, flags, delim, rpool, result, recurse)
{
/* Must be an error */
save_errno += E_LDAPBASE;
LDAPMAP_ERROR_CLEANUP();
SM_LDAP_ERROR_CLEANUP();
errno = save_errno;
return EX_TEMPFAIL;
}
@ -754,13 +973,18 @@ sm_ldap_results(lmap, msgid, flags, delim, rpool, result, recurse)
#endif /* LDAP_SERVER_DOWN */
case LDAP_TIMEOUT:
case LDAP_UNAVAILABLE:
/* server disappeared, try reopen on next search */
/*
** server disappeared,
** try reopen on next search
*/
statp = EX_RESTART;
break;
}
save_errno += E_LDAPBASE;
}
LDAPMAP_ERROR_CLEANUP();
SM_LDAP_ERROR_CLEANUP();
errno = save_errno;
return statp;
}
@ -773,7 +997,7 @@ sm_ldap_results(lmap, msgid, flags, delim, rpool, result, recurse)
if (toplevel)
{
SM_LDAP_RECURSE_LIST *rl;
int rlidx;
/*
** Spin through the built-up recurse list at the top
@ -784,42 +1008,50 @@ sm_ldap_results(lmap, msgid, flags, delim, rpool, result, recurse)
** will be expanded by the top level.
*/
for (rl = recurse; rl != NULL; rl = rl->lr_next)
for (rlidx = 0; recurse != NULL && rlidx < recurse->lr_cnt; rlidx++)
{
int newflags;
int sid;
int status;
if (rl->lr_type == LDAPMAP_ATTR_NORMAL)
rl = recurse->lr_data[rlidx];
newflags = flags;
if (rl->lr_done)
{
/* already expanded */
continue;
}
else if (rl->lr_type == LDAPMAP_ATTR_DN)
if (rl->lr_type == SM_LDAP_ATTR_DN)
{
/* do DN search */
sid = ldap_search(lmap->ldap_ld,
rl->lr_search,
lmap->ldap_scope,
"(objectClass=*)",
lmap->ldap_attr_final,
(lmap->ldap_attr[0] == NULL ?
NULL : lmap->ldap_attr),
lmap->ldap_attrsonly);
}
else if (rl->lr_type == LDAPMAP_ATTR_FILTER)
else if (rl->lr_type == SM_LDAP_ATTR_FILTER)
{
/* do new search */
sid = ldap_search(lmap->ldap_ld,
lmap->ldap_base,
lmap->ldap_scope,
rl->lr_search,
lmap->ldap_attr_final,
(lmap->ldap_attr[0] == NULL ?
NULL : lmap->ldap_attr),
lmap->ldap_attrsonly);
}
else if (rl->lr_type == LDAPMAP_ATTR_URL)
else if (rl->lr_type == SM_LDAP_ATTR_URL)
{
/* do new URL search */
sid = ldap_url_search(lmap->ldap_ld,
rl->lr_search,
lmap->ldap_attrsonly);
newflags |= SM_LDAP_USE_ALLATTR;
}
else
{
@ -840,7 +1072,12 @@ sm_ldap_results(lmap, msgid, flags, delim, rpool, result, recurse)
#endif /* LDAP_SERVER_DOWN */
case LDAP_TIMEOUT:
case LDAP_UNAVAILABLE:
/* server disappeared, try reopen on next search */
/*
** server disappeared,
** try reopen on next search
*/
statp = EX_RESTART;
break;
}
@ -848,8 +1085,9 @@ sm_ldap_results(lmap, msgid, flags, delim, rpool, result, recurse)
return statp;
}
status = sm_ldap_results(lmap, sid, flags, delim,
rpool, result, recurse);
status = sm_ldap_results(lmap, sid, newflags, delim,
rpool, result, resultln,
resultsz, recurse);
save_errno = errno;
if (status != EX_OK && status != EX_NOTFOUND)
{
@ -858,7 +1096,10 @@ sm_ldap_results(lmap, msgid, flags, delim, rpool, result, recurse)
}
/* Mark as done */
rl->lr_type = LDAPMAP_ATTR_NORMAL;
rl->lr_done = true;
/* Reset rlidx as new items may have been added */
rlidx = -1;
}
}
return statp;
@ -907,6 +1148,13 @@ sm_ldap_setopts(ld, lmap)
SM_LDAP_STRUCT *lmap;
{
# if USE_LDAP_SET_OPTION
# if _FFR_LDAP_SETVERSION
if (lmap->ldap_version != 0)
{
ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION,
&lmap->ldap_version);
}
# endif /* _FFR_LDAP_SETVERSION */
ldap_set_option(ld, LDAP_OPT_DEREF, &lmap->ldap_deref);
if (bitset(LDAP_OPT_REFERRALS, lmap->ldap_options))
ldap_set_option(ld, LDAP_OPT_REFERRALS, LDAP_OPT_ON);

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 2000-2002 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.48 2001/05/14 20:42:29 gshapiro Exp $
* $Id: local.h,v 1.51 2002/02/20 02:40:24 ca Exp $
*/
/*
@ -132,25 +132,9 @@ extern bool Sm_IO_DidInit;
(fp)->f_ub.smb_base = NULL; \
}
/* Test for an fgetln() buffer. */
#define HASLB(fp) ((fp)->f_lb.smb_base != NULL)
#define FREELB(fp) \
{ \
sm_free((char *)(fp)->f_lb.smb_base); \
(fp)->f_lb.smb_base = NULL; \
}
struct sm_io_obj
{
int file;
};
extern const char SmFileMagic[];
#ifndef ALIGNBYTES
# define ALIGNBYTES (sizeof(long) - 1)
# define ALIGN(p) (((unsigned long)(p) + ALIGNBYTES) & ~ALIGNBYTES)
#endif /* ALIGNBYTES */
#define SM_ALIGN(p) (((unsigned long)(p) + SM_ALIGN_BITS) & ~SM_ALIGN_BITS)
#define sm_io_flockfile(fp) ((void) 0)
#define sm_io_funlockfile(fp) ((void) 0)

View File

@ -8,7 +8,7 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: mbdb.c,v 1.28 2002/01/07 23:29:43 gshapiro Exp $")
SM_RCSID("@(#)$Id: mbdb.c,v 1.36 2002/03/25 18:08:20 gshapiro Exp $")
#include <sys/param.h>
@ -26,6 +26,9 @@ SM_RCSID("@(#)$Id: mbdb.c,v 1.28 2002/01/07 23:29:43 gshapiro Exp $")
#include <sm/heap.h>
#include <sm/mbdb.h>
#include <sm/string.h>
# ifdef EX_OK
# undef EX_OK /* for SVr4.2 SMP */
# endif /* EX_OK */
#include <sm/sysexits.h>
#if LDAPMAP
@ -207,6 +210,20 @@ sm_mbdb_frompw(user, pw)
** none.
*/
#if _FFR_HANDLE_ISO8859_GECOS
static char Latin1ToASCII[128] =
{
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33,
99, 80, 36, 89, 124, 36, 34, 99, 97, 60, 45, 45, 114, 45, 111, 42,
50, 51, 39, 117, 80, 46, 44, 49, 111, 62, 42, 42, 42, 63, 65, 65,
65, 65, 65, 65, 65, 67, 69, 69, 69, 69, 73, 73, 73, 73, 68, 78, 79,
79, 79, 79, 79, 88, 79, 85, 85, 85, 85, 89, 80, 66, 97, 97, 97, 97,
97, 97, 97, 99, 101, 101, 101, 101, 105, 105, 105, 105, 100, 110,
111, 111, 111, 111, 111, 47, 111, 117, 117, 117, 117, 121, 112, 121
};
#endif /* _FFR_HANDLE_ISO8859_GECOS */
void
sm_pwfullname(gecos, user, buf, buflen)
register char *gecos;
@ -237,8 +254,15 @@ sm_pwfullname(gecos, user, buf, buflen)
bp += strlen(bp);
}
else
{
#if _FFR_HANDLE_ISO8859_GECOS
if ((unsigned char) *p >= 128)
*bp++ = Latin1ToASCII[(unsigned char) *p - 128];
else
#endif /* _FFR_HANDLE_ISO8859_GECOS */
*bp++ = *p;
}
}
*bp = '\0';
}
@ -409,13 +433,13 @@ mbdb_ldap_initialize(arg)
{
sm_ldap_clear(&LDAPLMAP);
LDAPLMAP.ldap_base = MBDB_DEFAULT_LDAP_BASEDN;
LDAPLMAP.ldap_host = MBDB_DEFAULT_LDAP_SERVER;
LDAPLMAP.ldap_target = MBDB_DEFAULT_LDAP_SERVER;
LDAPLMAP.ldap_filter = MBDB_LDAP_FILTER;
/* Only want one match */
LDAPLMAP.ldap_sizelimit = 1;
/* interpolate new ldap_base and ldap_host from arg if given */
/* interpolate new ldap_base and ldap_target from arg if given */
if (arg != NULL && *arg != '\0')
{
char *new;
@ -431,7 +455,7 @@ mbdb_ldap_initialize(arg)
if (sep != NULL)
{
*sep++ = '\0';
LDAPLMAP.ldap_host = sep;
LDAPLMAP.ldap_target = sep;
}
LDAPLMAP.ldap_base = new;
}
@ -568,9 +592,7 @@ mbdb_ldap_lookup(name, user)
errno = sm_ldap_geterrno(LDAPLMAP.ldap_ld);
if (errno == LDAP_SUCCESS)
{
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
continue;
}
@ -670,9 +692,7 @@ mbdb_ldap_lookup(name, user)
skip:
ldap_value_free(vals);
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
}
errno = sm_ldap_geterrno(LDAPLMAP.ldap_ld);
@ -699,9 +719,7 @@ mbdb_ldap_lookup(name, user)
save_errno = errno;
if (attr != NULL)
{
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
attr = NULL;
}
if (LDAPLMAP.ldap_res != NULL)

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 2000-2002 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@ -8,11 +8,12 @@
*/
#include <sm/gen.h>
SM_IDSTR(id, "@(#)$Id: smstdio.c,v 1.29 2001/09/11 04:04:49 gshapiro Exp $")
SM_IDSTR(id, "@(#)$Id: smstdio.c,v 1.32 2002/02/23 20:18:36 gshapiro Exp $")
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/stat.h>
#include <sm/assert.h>
#include <sm/io.h>
#include <sm/string.h>
@ -264,6 +265,22 @@ sm_stdiogetinfo(fp, what, valp)
{
switch (what)
{
case SM_IO_WHAT_SIZE:
{
int fd;
struct stat st;
if (fp->f_cookie == NULL)
setup(fp);
fd = fileno((FILE *) fp->f_cookie);
if (fd < 0)
return -1;
if (fstat(fd, &st) == 0)
return st.st_size;
else
return -1;
}
case SM_IO_WHAT_MODE:
default:
errno = EINVAL;

View File

@ -13,7 +13,7 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: sscanf.c,v 1.24 2001/09/11 04:04:49 gshapiro Exp $")
SM_RCSID("@(#)$Id: sscanf.c,v 1.25 2002/02/01 02:28:00 ca Exp $")
#include <string.h>
#include <sm/varargs.h>
#include <sm/io.h>
@ -93,7 +93,6 @@ sm_io_sscanf(str, fmt, va_alist)
fake.f_type = "sm_io_sscanf:fake";
fake.f_flushfp = NULL;
fake.f_ub.smb_base = NULL;
fake.f_lb.smb_base = NULL;
fake.f_timeout = SM_TIME_FOREVER;
fake.f_timeoutstate = SM_TIME_BLOCK;
SM_VA_START(ap, fmt);

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 2000-2002 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_RCSID("@(#)$Id: stdio.c,v 1.52 2001/09/18 21:45:23 gshapiro Exp $")
SM_RCSID("@(#)$Id: stdio.c,v 1.56 2002/04/03 21:55:15 ca Exp $")
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
@ -338,6 +338,16 @@ sm_stdgetinfo(fp, what, valp)
case SM_IO_WHAT_FD:
return fp->f_file;
case SM_IO_WHAT_SIZE:
{
struct stat st;
if (fstat(fp->f_file, &st) == 0)
return st.st_size;
else
return -1;
}
case SM_IO_IS_READABLE:
{
fd_set readfds;
@ -347,11 +357,8 @@ sm_stdgetinfo(fp, what, valp)
SM_FD_SET(fp->f_file, &readfds);
timeout.tv_sec = 0;
timeout.tv_usec = 0;
if (select(fp->f_file + 1,
FDSET_CAST &readfds,
NULL,
NULL,
&timeout) > 0 &&
if (select(fp->f_file + 1, FDSET_CAST &readfds,
NULL, NULL, &timeout) > 0 &&
SM_FD_ISSET(fp->f_file, &readfds))
return 1;
return 0;
@ -364,19 +371,19 @@ sm_stdgetinfo(fp, what, valp)
}
/*
** SM_STDFDOPEN -- open file by primative 'fd' rather than pathname
** SM_STDFDOPEN -- open file by primitive 'fd' rather than pathname
**
** I/O function to handle fdopen() stdio equivalence. The rest of
** the functions are the same as the sm_stdopen() above.
**
** Parameters:
** fp -- the file pointer to be associated with the open
** name -- the primative file descriptor for association
** name -- the primitive file descriptor for association
** flags -- indicates type of access methods
** rpool -- ignored
**
** Results:
** Success: primative file descriptor value
** Success: primitive file descriptor value
** Failure: -1 and sets errno
*/

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 2000-2002 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.40 2001/09/11 04:04:49 gshapiro Exp $")
SM_IDSTR(id, "@(#)$Id: strio.c,v 1.42 2002/02/11 23:05:50 gshapiro Exp $")
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
@ -36,6 +36,7 @@ struct sm_str_obj
size_t strio_size;
size_t strio_offset;
int strio_flags;
const void *strio_rpool;
};
typedef struct sm_str_obj SM_STR_OBJ_T;
@ -109,7 +110,7 @@ sm_strread(fp, buf, n)
**
** Parameters:
** fp -- the file pointer
** buf -- location of data for writting
** buf -- location of data for writing
** n -- number of bytes to write
**
** Returns:
@ -200,8 +201,8 @@ sm_strseek(fp, offset, whence)
**
** Parameters:
** fp -- file pointer open to be associated with
** info -- flags for methods of access (was mode)
** flags -- ignored
** info -- initial contents (NULL for none)
** flags -- flags for methods of access (was mode)
** rpool -- resource pool to use memory from (if applicable)
**
** Results:
@ -217,24 +218,23 @@ sm_stropen(fp, info, flags, rpool)
const void *rpool;
{
register SM_STR_OBJ_T *s;
int *strmode = (int *) info;
#if SM_RPOOL
s = sm_rpool_malloc_x(rpool, sizeof(SM_STR_OBJ_T));
#else /* SM_RPOOL */
s = sm_malloc(sizeof(SM_STR_OBJ_T));
if (s == NULL)
{
errno = ENOMEM;
return -1;
}
#endif /* SM_RPOOL */
fp->f_cookie = s;
s->strio_rpool = rpool;
s->strio_offset = 0;
s->strio_base = 0;
s->strio_size = 0;
s->strio_base = NULL;
s->strio_end = 0;
switch (*strmode)
switch (flags)
{
case SM_IO_RDWR:
s->strio_flags = SMRW;
@ -246,10 +246,31 @@ sm_stropen(fp, info, flags, rpool)
s->strio_flags = SMWR;
break;
case SM_IO_APPEND:
return -1;
default:
if (s->strio_rpool == NULL)
sm_free(s);
errno = EINVAL;
return -1;
default:
if (s->strio_rpool == NULL)
sm_free(s);
errno = EINVAL;
return -1;
}
if (info != NULL)
{
s->strio_base = sm_strdup_x(info);
if (s->strio_base == NULL)
{
int save_errno = errno;
if (s->strio_rpool == NULL)
sm_free(s);
errno = save_errno;
return -1;
}
s->strio_size = strlen(info);
s->strio_end = s->strio_base + s->strio_size;
}
return 0;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2002 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: strl.c,v 1.29 2001/10/03 16:09:32 ca Exp $")
SM_RCSID("@(#)$Id: strl.c,v 1.31 2002/01/20 01:41:25 gshapiro Exp $")
#include <sm/config.h>
#include <sm/string.h>
@ -229,6 +229,7 @@ sm_strlcpyn(dst, len, n, va_alist)
i = 0;
while (n-- > 0)
i += strlen(SM_VA_ARG(ap, char *));
SM_VA_END(ap);
return i;
}
@ -251,9 +252,11 @@ sm_strlcpyn(dst, len, n, va_alist)
j += strlen(str + i);
while (n-- > 0)
j += strlen(SM_VA_ARG(ap, char *));
SM_VA_END(ap);
return j;
}
}
SM_VA_END(ap);
dst[j] = '\0'; /* terminate dst; there is space since j < len */
return j;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 2001-2002 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-event.c,v 1.7 2001/09/11 04:04:49 gshapiro Exp $")
SM_RCSID("@(#)$Id: t-event.c,v 1.9 2002/03/19 00:26:21 ca Exp $")
#include <stdio.h>
@ -51,7 +51,7 @@ main(argc, argv)
SM_EVENT *ev;
sm_test_begin(argc, argv, "test event handling");
fprintf(stdout, "this test may hang. If there is no output within twelve seconds, abort it\nand recompile with -DSM_CONF_SETITIMER=%d\n",
fprintf(stdout, "This test may hang. If there is no output within twelve seconds, abort it\nand recompile with -DSM_CONF_SETITIMER=%d\n",
SM_CONF_SETITIMER == 0 ? 1 : 0);
sleep(1);
SM_TEST(1 == 1);

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 2000-2002 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_IDSTR(id, "@(#)$Id: t-fopen.c,v 1.8 2001/09/11 04:04:49 gshapiro Exp $")
SM_IDSTR(id, "@(#)$Id: t-fopen.c,v 1.9 2002/02/06 23:57:45 ca Exp $")
#include <fcntl.h>
#include <sm/io.h>
@ -20,6 +20,7 @@ main(argc, argv)
int argc;
char *argv[];
{
int m, r;
SM_FILE_T *out;
sm_test_begin(argc, argv, "test sm_io_fopen");
@ -28,6 +29,9 @@ main(argc, argv)
if (out != NULL)
{
(void) sm_io_fprintf(out, SM_TIME_DEFAULT, "foo\n");
r = sm_io_getinfo(out, SM_IO_WHAT_MODE, &m);
SM_TEST(r == 0);
SM_TEST(m == SM_IO_WRONLY);
sm_io_close(out, SM_TIME_DEFAULT);
}
return sm_test_end();

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 2000-2002 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-shm.c,v 1.17 2001/09/11 04:04:49 gshapiro Exp $")
SM_RCSID("@(#)$Id: t-shm.c,v 1.18 2002/01/31 04:11:41 ca Exp $")
#include <stdio.h>
@ -230,6 +230,7 @@ main(argc, argv)
else
{
pid_t pid;
extern int SmTestNumErrors;
if ((pid = fork()) < 0)
{
@ -250,6 +251,8 @@ main(argc, argv)
(void) wait(&status);
}
SM_TEST(r == 0);
if (SmTestNumErrors > 0)
printf("add -DSM_CONF_SHM=0 to confENVDEF in devtools/Site/site.config.m4\nand start over.\n");
return sm_test_end();
}
return r;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 2000-2002 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_IDSTR(id, "@(#)$Id: t-types.c,v 1.16 2001/09/11 04:04:49 gshapiro Exp $")
SM_IDSTR(id, "@(#)$Id: t-types.c,v 1.18 2002/03/13 17:29:53 gshapiro Exp $")
#include <sm/limits.h>
#include <sm/io.h>

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 2000-2002 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_RCSID("@(#)$Id: vsscanf.c,v 1.22 2001/09/11 04:04:49 gshapiro Exp $")
SM_RCSID("@(#)$Id: vsscanf.c,v 1.23 2002/02/01 02:28:00 ca Exp $")
#include <string.h>
#include <sm/io.h>
@ -77,7 +77,6 @@ sm_vsscanf(str, fmt, ap)
fake.f_bf.smb_size = fake.f_r = strlen(str);
fake.f_read = sm_eofread;
fake.f_ub.smb_base = NULL;
fake.f_lb.smb_base = NULL;
fake.f_close = NULL;
fake.f_open = NULL;
fake.f_write = NULL;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 2000-2002 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
@ -13,14 +13,14 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: wsetup.c,v 1.19 2001/09/11 04:04:49 gshapiro Exp $")
SM_RCSID("@(#)$Id: wsetup.c,v 1.20 2002/02/07 18:02:45 ca Exp $")
#include <stdlib.h>
#include <errno.h>
#include <sm/io.h>
#include "local.h"
/*
** SM_WSETUP -- check writting is safe
** SM_WSETUP -- check writing is safe
**
** Various output routines call wsetup to be sure it is safe to write,
** because either flags does not include SMMWR, or buf is NULL.
@ -55,6 +55,8 @@ sm_wsetup(fp)
/* clobber any ungetc data */
if (HASUB(fp))
FREEUB(fp);
/* discard read buffer */
fp->f_flags &= ~(SMRD|SMFEOF);
fp->f_r = 0;
fp->f_p = fp->f_bf.smb_base;

View File

@ -8,7 +8,7 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: smdb.c,v 8.53 2001/11/19 19:31:14 gshapiro Exp $")
SM_RCSID("@(#)$Id: smdb.c,v 8.54 2002/04/04 21:32:14 gshapiro Exp $")
#include <fcntl.h>
#include <stdlib.h>
@ -119,15 +119,14 @@ smdb_lockfile(fd, type)
if (!bitset(LOCK_NB, type) ||
(save_errno != EACCES && save_errno != EAGAIN))
{
int omode = -1;
# ifdef F_GETFL
(void) fcntl(fd, F_GETFL, &omode);
errno = save_errno;
# endif /* F_GETFL */
# if 0
int omode = fcntl(fd, F_GETFL, NULL);
int euid = (int) geteuid();
syslog(LOG_ERR, "cannot lockf(%s%s, fd=%d, type=%o, omode=%o, euid=%d)",
filename, ext, fd, type, omode, (int) geteuid());
filename, ext, fd, type, omode, euid);
# endif /* 0 */
errno = save_errno;
return false;
}
#else /* !HASFLOCK */
@ -140,15 +139,14 @@ smdb_lockfile(fd, type)
if (!bitset(LOCK_NB, type) || save_errno != EWOULDBLOCK)
{
int omode = -1;
# ifdef F_GETFL
(void) fcntl(fd, F_GETFL, &omode);
errno = save_errno;
# endif /* F_GETFL */
# if 0
int omode = fcntl(fd, F_GETFL, NULL);
int euid = (int) geteuid();
syslog(LOG_ERR, "cannot flock(%s%s, fd=%d, type=%o, omode=%o, euid=%d)",
filename, ext, fd, type, omode, (int) geteuid());
filename, ext, fd, type, omode, euid);
# endif /* 0 */
errno = save_errno;
return false;
}
#endif /* !HASFLOCK */

View File

@ -1,5 +1,5 @@
/*
** Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
** Copyright (c) 1999-2002 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: smdb1.c,v 8.55 2001/09/12 21:19:12 gshapiro Exp $")
SM_RCSID("@(#)$Id: smdb1.c,v 8.56 2002/01/21 04:10:44 gshapiro Exp $")
#include <unistd.h>
#include <stdlib.h>
@ -434,6 +434,7 @@ smdb_db_open(database, db_name, mode, mode_mask, sff, type, user_info,
SMDB_USER_INFO *user_info;
SMDB_DBPARAMS *db_params;
{
bool lockcreated = false;
int db_fd;
int lock_fd;
int result;
@ -462,15 +463,21 @@ smdb_db_open(database, db_name, mode, mode_mask, sff, type, user_info,
if (result != SMDBE_OK)
return result;
if (stat_info.st_mode == ST_MODE_NOFILE &&
bitset(mode, O_CREAT))
lockcreated = true;
lock_fd = -1;
# if O_EXLOCK
mode |= O_EXLOCK;
# else /* O_EXLOCK */
result = smdb_lock_file(&lock_fd, db_name, mode, sff,
SMDB1_FILE_EXTENSION);
if (result != SMDBE_OK)
return result;
# endif /* O_EXLOCK */
if (lockcreated)
{
mode |= O_TRUNC;
mode &= ~(O_CREAT|O_EXCL);
}
*database = NULL;

View File

@ -1,5 +1,5 @@
/*
** Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
** Copyright (c) 1999-2002 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: smndbm.c,v 8.50 2001/09/11 04:04:53 gshapiro Exp $")
SM_RCSID("@(#)$Id: smndbm.c,v 8.51 2002/01/21 04:10:44 gshapiro Exp $")
#include <fcntl.h>
#include <stdlib.h>
@ -492,6 +492,7 @@ smdb_ndbm_open(database, db_name, mode, mode_mask, sff, type, user_info,
SMDB_USER_INFO *user_info;
SMDB_DBPARAMS *db_params;
{
bool lockcreated = false;
int result;
int lock_fd;
SMDB_DATABASE *smdb_db;
@ -516,15 +517,34 @@ smdb_ndbm_open(database, db_name, mode, mode_mask, sff, type, user_info,
if (result != SMDBE_OK)
return result;
if ((dir_stat_info.st_mode == ST_MODE_NOFILE ||
pag_stat_info.st_mode == ST_MODE_NOFILE) &&
bitset(mode, O_CREAT))
lockcreated = true;
lock_fd = -1;
# if O_EXLOCK
mode |= O_EXLOCK;
# else /* O_EXLOCK */
result = smdb_lock_file(&lock_fd, db_name, mode, sff,
SMNDB_DIR_FILE_EXTENSION);
if (result != SMDBE_OK)
return result;
# endif /* O_EXLOCK */
if (lockcreated)
{
int pag_fd;
/* Need to pre-open the .pag file as well with O_EXCL */
result = smdb_lock_file(&pag_fd, db_name, mode, sff,
SMNDB_PAG_FILE_EXTENSION);
if (result != SMDBE_OK)
{
(void) close(lock_fd);
return result;
}
(void) close(pag_fd);
mode |= O_TRUNC;
mode &= ~(O_CREAT|O_EXCL);
}
smdb_db = smdb_malloc_database();
if (smdb_db == NULL)

View File

@ -10,6 +10,7 @@ bldPRODUCT_START(`executable', `mail.local')
define(`bldNO_INSTALL', `true')
define(`bldSOURCES', `mail.local.c ')
bldPUSH_SMLIB(`sm')
APPENDDEF(`confENVDEF', `-DNOT_SENDMAIL')
bldPRODUCT_END
bldPRODUCT_START(`manpage', `mail.local')

View File

@ -1,4 +1,4 @@
.\" Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
.\" Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers.
.\" All rights reserved.
.\"
.\" By using this file, you agree to the terms and conditions set
@ -6,9 +6,9 @@
.\" the sendmail distribution.
.\"
.\"
.\" $Id: mailstats.8,v 8.26 2001/10/21 19:12:10 gshapiro Exp $
.\" $Id: mailstats.8,v 8.28 2002/03/19 00:23:23 gshapiro Exp $
.\"
.TH MAILSTATS 8 "$Date: 2001/10/21 19:12:10 $"
.TH MAILSTATS 8 "$Date: 2002/03/19 00:23:23 $"
.SH NAME
mailstats
\- display mail statistics
@ -65,7 +65,7 @@ is displayed (preceded with a ``T''),
separated from the previous information by a line containing only equals
(``='')
characters.
Another line preceded with a ``C'' lists the number of connections.
Another line preceded with a ``C'' lists the number of TCP connections.
.PP
The options are as follows:
.TP

View File

@ -10,6 +10,7 @@ bldPRODUCT_START(`executable', `smrsh')
define(`bldINSTALL_DIR', `E')
define(`bldSOURCES', `smrsh.c ')
bldPUSH_SMLIB(`sm')
APPENDDEF(`confENVDEF', `-DNOT_SENDMAIL')
bldPRODUCT_END
bldPRODUCT_START(`manpage', `smrsh')

View File

@ -9,7 +9,7 @@
# the sendmail distribution.
#
#
# $Id: README,v 8.345 2002/01/09 18:04:30 ca Exp $
# $Id: README,v 8.353 2002/04/04 21:39:33 gshapiro Exp $
#
This directory contains the source files for sendmail(TM).
@ -73,7 +73,8 @@ file.
You can recompile from scratch using the -c flag with the Build
command. This removes the existing compilation directory for the
current platform and builds a new one.
current platform and builds a new one. The -c flag must also
be used if any site.*.m4 file in devtools/Site/ is changed.
Porting to a new Unix-based system should be a matter of creating
an appropriate configuration file in the devtools/OS/ directory.
@ -158,8 +159,8 @@ and the filename includes the string "/yp/", sendmail adds the special
tokens "YP_LAST_MODIFIED" and "YP_MASTER_NAME", both of which are
required if the NDBM file is to be used as an NIS map.
All of these flags are normally defined in the DBMDEF line in the
Makefile.
All of these flags are normally defined in a confMAPDEF setting in your
site.config.m4.
If you define NEWDB or HESIOD you get the User Database (USERDB)
automatically. Generally you do want to have NEWDB for it to do
@ -465,10 +466,8 @@ NEEDSGETIPNODE Set this if your system supports IPv6 but doesn't include
for Linux's glibc.
PIPELINING Support SMTP PIPELINING (set by default).
USING_NETSCAPE_LDAP
Set this if LDAPMAP is set and your LDAP libraries are from
(or are derived from) Netscape's implementation, which
requires that the return value of ldap_first_attribute()
and ldap_next_attribute() be ldap_memfree()'d.
Deprecated in favor of SM_CONF_LDAP_MEMFREE. See
libsm/README.
NEEDLINK Set this if your system doesn't have a link() call. It
will create a copy of the file instead of a hardlink.
USE_ENVIRON Set this to 1 to access process environment variables from
@ -586,7 +585,7 @@ SASL Enables SMTP AUTH (RFC 2554). This requires the Cyrus SASL
compared with the actual version found and if there is a
mismatch, compilation will fail.
EGD Define this if your system has EGD installed, see
http://www.lothar.com/tech/crypto/ . It should be used to
http://egd.sourceforge.net/ . It should be used to
seed the PRNG for STARTTLS if HASURANDOMDEV is not defined.
STARTTLS Enables SMTP STARTTLS (RFC 2487). This requires OpenSSL
(http://www.OpenSSL.org/); use OpenSSL 0.9.5a or later
@ -878,10 +877,10 @@ Solaris 2.x (SunOS 5.x)
make sure /opt/SUNWspro/bin/cc is used instead of /usr/ucb/cc
(or it might complain about tm_zone).
The Solaris "syslog" function is apparently limited to something
about 90 characters because of a kernel limitation. If you have
source code, you can probably up this number. You can get patches
that fix this problem: the patch ids are:
The Solaris 2.x (x <= 3) "syslog" function is apparently limited
to something about 90 characters because of a kernel limitation.
If you have source code, you can probably up this number. You
can get patches that fix this problem: the patch ids are:
Solaris 2.1 100834
Solaris 2.2 100999
@ -974,9 +973,10 @@ Solaris 8 and later (SunOS 5.8 and later)
Solaris 9 and later (SunOS 5.9 and later)
Solaris 9 and later have a revised LDAP library, libldap.so.5,
which is derived from a Netscape implementation, thus requiring
that USING_NETSCAPE_LDAP be defined in conjunction with LDAPMAP:
that SM_CONF_LDAP_MEMFREE be defined in conjunction with LDAPMAP:
APPENDDEF(`confMAPDEF', `-DLDAPMAP -DUSING_NETSCAPE_LDAP')
APPENDDEF(`confMAPDEF', `-DLDAPMAP')
APPENDDEF(`confENVDEF', `-DSM_CONF_LDAP_MEMFREE')
APPENDDEF(`confLIBS', `-lldap')
Solaris
@ -1472,7 +1472,10 @@ UNICOS 8.0.3.4
problems. You may want to turn this off if you have problems
running sendmail. Reported by Jerry G. DeLapp <jgd@acl.lanl.gov>.
Mac OS X (10.0.X)
Darwin/Mac OS X (10.X.X)
The linker errors produced regarding getopt() and it's associated
variables can safely be ignored.
From Mike Zimmerman <zimmy@torrentnet.com>:
From scratch here is what Darwin users need to do to the standard
@ -1735,4 +1738,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.345 $, last update $Date: 2002/01/09 18:04:30 $ )
(Version $Revision: 8.353 $, last update $Date: 2002/04/04 21:39:33 $ )

View File

@ -1,11 +1,11 @@
# Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
# Copyright (c) 2000-2002 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: SECURITY,v 1.47 2001/09/23 02:29:05 ca Exp $
# $Id: SECURITY,v 1.50 2002/03/29 19:45:48 ca Exp $
#
This file gives some hints how to configure and run sendmail for
@ -61,6 +61,9 @@ drwx------ root wheel ... /var/spool/mqueue
-r--r--r-- root wheel ... /etc/mail/sendmail.cf
-r--r--r-- root wheel ... /etc/mail/submit.cf
[Notice: On some OS "wheel" is not used but "bin" or "root" instead,
however, this is not important here.]
That is, the owner of sendmail is root, the group is smmsp, and
the binary is set-group-ID. The client mail queue is owned by
smmsp with group smmsp and is group writable. The client mail
@ -186,7 +189,14 @@ sm-mta.
Set-User-Id
-----------
If you really have to install sendmail set-user-ID root, you can use
If you really have to install sendmail set-user-ID root, first build
the sendmail package normally using
sh ./Build
Then you can use
sh ./Build install-set-user-id
to install the package in the old (pre-8.12) way. Make sure that
no submit.cf file is installed.

View File

@ -1,11 +1,11 @@
# Copyright (c) 2001 Sendmail, Inc. and its suppliers.
# Copyright (c) 2001-2002 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: TUNING,v 1.16 2001/08/19 21:03:38 gshapiro Exp $
# $Id: TUNING,v 1.18 2002/03/03 03:38:21 ca Exp $
#
********************************************
@ -141,13 +141,12 @@ should be added to the .mc file.
Before 8.12 sendmail delivers an e-mail sequentially to all its
recipients. For mailing lists or large aliases the overall delivery
time can be substantial, especially if some of the recipients are located
at hosts that are slow to accept e-mail. Some mailing list software
therefore "split" up e-mails into smaller pieces with fewer recipients.
sendmail 8.12 can do this itself, either across queue groups or
within a queue directory. For the former the option SplitAcrossQueueGroups
option must be set, the latter is controlled by the 'r=' field of
a queue group declaration.
time can be substantial, especially if some of the recipients are
located at hosts that are slow to accept e-mail. Some mailing list
software therefore "split" up e-mails into smaller pieces with
fewer recipients. sendmail 8.12 can do this itself, either across
queue groups or within a queue directory. The latter is controlled
by the 'r=' field of a queue group declaration.
Let's assume a simple example: a mailing lists where most of
the recipients are at three domains: the local one (local.domain)

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2002 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@ -18,7 +18,7 @@
*/
#include <sm/gen.h>
SM_RCSID("@(#)$Id: bf.c,v 8.48 2001/11/04 17:10:49 ca Exp $")
SM_RCSID("@(#)$Id: bf.c,v 8.51 2002/03/04 21:51:25 gshapiro Exp $")
#include <sys/types.h>
#include <sys/stat.h>
@ -61,7 +61,6 @@ struct bf
MODE_T bf_filemode; /* Mode of buffered file, if ever committed */
off_t bf_offset; /* Currect file offset */
int bf_size; /* Total current size of file */
int bf_refcount; /* Reference count */
};
#ifdef BF_STANDALONE
@ -84,10 +83,8 @@ struct bf_info
**
** Parameters:
** fp -- file pointer being filled-in for file being open'd
** filename -- name of the file being open'd
** info -- information about file being opened
** flags -- ignored
** fmode -- file mode (stored for use later)
** sflags -- "safeopen" flags (stored for use later)
** rpool -- ignored (currently)
**
** Returns:
@ -156,7 +153,6 @@ sm_bfopen(fp, info, flags, rpool)
/* Nearly home free, just set all the parameters now */
bfp->bf_committed = false;
bfp->bf_ondisk = false;
bfp->bf_refcount = 1;
bfp->bf_flags = sflags;
bfp->bf_bufsize = bsize;
bfp->bf_buffilled = 0;
@ -173,7 +169,7 @@ sm_bfopen(fp, info, flags, rpool)
(void) sm_strlcpy(bfp->bf_filename, filename, l);
bfp->bf_filemode = fmode;
bfp->bf_offset = 0;
bfp->bf_size = bsize;
bfp->bf_size = 0;
bfp->bf_disk_fd = -1;
fp->f_cookie = bfp;
@ -262,6 +258,8 @@ sm_bfgetinfo(fp, what, valp)
{
case SM_IO_WHAT_FD:
return bfp->bf_disk_fd;
case SM_IO_WHAT_SIZE:
return bfp->bf_size;
default:
return -1;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2002 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: collect.c,v 8.237 2001/12/10 19:56:03 ca Exp $")
SM_RCSID("@(#)$Id: collect.c,v 8.241 2002/03/15 01:32:47 gshapiro Exp $")
static void collecttimeout __P((time_t));
static void dferror __P((SM_FILE_T *volatile, char *, ENVELOPE *));
@ -104,10 +104,6 @@ collect_doheader(e)
if (GrabTo && e->e_sendqueue == NULL)
usrerr("No recipient addresses found in header");
/* collect statistics */
if (OpMode != MD_VERIFY)
markstats(e, (ADDRESS *) NULL, STATS_NORMAL);
/*
** If we have a Return-Receipt-To:, turn it into a DSN.
*/
@ -431,10 +427,12 @@ collect(fp, smtpmode, hdrp, e)
istate = IS_DOTCR;
continue;
}
else if (c != '.' ||
(OpMode != MD_SMTP &&
else if (ignrdot ||
(c != '.' &&
OpMode != MD_SMTP &&
OpMode != MD_DAEMON &&
OpMode != MD_ARPAFTP))
{
*pbp++ = c;
c = '.';
@ -448,9 +446,16 @@ collect(fp, smtpmode, hdrp, e)
{
/* push back the ".\rx" */
*pbp++ = c;
if (OpMode != MD_SMTP &&
OpMode != MD_DAEMON &&
OpMode != MD_ARPAFTP)
{
*pbp++ = '\r';
c = '.';
}
else
c = '\r';
}
break;
case IS_CR:
@ -851,6 +856,10 @@ collect(fp, smtpmode, hdrp, e)
}
else
e->e_dfp = df;
/* collect statistics */
if (OpMode != MD_VERIFY)
markstats(e, (ADDRESS *) NULL, STATS_NORMAL);
}
static void

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@ -10,7 +10,7 @@
#include <sendmail.h>
SM_RCSID("@(#)$Id: control.c,v 8.116 2001/12/13 21:51:38 gshapiro Exp $")
SM_RCSID("@(#)$Id: control.c,v 8.118 2002/03/19 00:23:27 gshapiro Exp $")
/* values for cmd_code */
#define CMDERROR 0 /* bad command */

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2002 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.603 2001/12/31 19:46:38 gshapiro Exp $")
SM_RCSID("@(#)$Id: daemon.c,v 8.611 2002/03/18 23:08:50 gshapiro Exp $")
#if defined(SOCK_STREAM) || defined(__GNU_LIBRARY__)
# define USE_SOCK_STREAM 1
@ -154,6 +154,9 @@ getrequests(e)
char status[MAXLINE];
SOCKADDR sa;
SOCKADDR_LEN_T len = sizeof sa;
#if _FFR_QUEUE_RUN_PARANOIA
time_t lastrun;
#endif /* _FFR_QUEUE_RUN_PARANOIA */
# if NETUNIX
extern int ControlSocket;
# endif /* NETUNIX */
@ -388,7 +391,28 @@ getrequests(e)
curdaemon = -1;
if (doqueuerun())
{
(void) runqueue(true, false, false, false);
#if _FFR_QUEUE_RUN_PARANOIA
lastrun = now;
#endif /* _FFR_QUEUE_RUN_PARANOIA */
}
#if _FFR_QUEUE_RUN_PARANOIA
else if (QueueIntvl > 0 &&
lastrun + QueueIntvl + 60 < now)
{
/*
** set lastrun unconditionally to avoid
** calling checkqueuerunner() all the time.
** That's also why we currently ignore the
** result of the function call.
*/
(void) checkqueuerunner();
lastrun = now;
}
#endif /* _FFR_QUEUE_RUN_PARANOIA */
if (t <= 0)
{
@ -759,6 +783,7 @@ getrequests(e)
macdefine(&BlankEnvelope.e_macro, A_PERM,
macid("{client_resolve}"), "OK");
sm_setproctitle(true, e, "startup with %s", p);
markstats(e, NULL, STATS_CONNECT);
if ((inchannel = sm_io_open(SmFtStdiofd,
SM_TIME_DEFAULT,
@ -2504,6 +2529,9 @@ makeconnection(host, port, mci, e, enough)
else
save_errno = errno;
/* couldn't connect.... figure out why */
(void) close(s);
/* if running demand-dialed connection, try again */
if (DialDelay > 0 && firstconnect &&
bitnset(M_DIALDELAY, mci->mci_mailer->m_flags))
@ -2516,9 +2544,6 @@ makeconnection(host, port, mci, e, enough)
continue;
}
/* couldn't connect.... figure out why */
(void) close(s);
if (LogLevel > 13)
sm_syslog(LOG_INFO, e->e_id,
"makeconnection (%s [%s]) failed: %s",
@ -2980,6 +3005,8 @@ restart_daemon()
#ifdef SIGUSR1
SM_NOOP_SIGNAL(SIGUSR1, ousr1);
#endif /* SIGUSR1 */
/* Turn back on signals */
sm_allsignals(false);
(void) execve(SaveArgv[0], (ARGV_T) SaveArgv, (ARGV_T) ExternalEnviron);

View File

@ -14,12 +14,16 @@
#include <sendmail.h>
#include <sys/time.h>
SM_RCSID("@(#)$Id: deliver.c,v 8.928 2002/01/10 03:23:29 gshapiro Exp $")
SM_RCSID("@(#)$Id: deliver.c,v 8.935 2002/03/23 18:30:40 gshapiro Exp $")
#if HASSETUSERCONTEXT
# include <login_cap.h>
#endif /* HASSETUSERCONTEXT */
#if NETINET || NETINET6
# include <arpa/inet.h>
#endif /* NETINET || NETINET6 */
#if STARTTLS || SASL
# include "sfsasl.h"
#endif /* STARTTLS || SASL */
@ -2112,6 +2116,7 @@ deliver(e, firstto)
if (i == EX_OK)
{
goodmxfound = true;
markstats(e, firstto, STATS_CONNECT);
mci->mci_state = MCIS_OPENING;
mci_cache(mci);
if (TrafficLogFile != NULL)
@ -2501,6 +2506,22 @@ deliver(e, firstto)
new_ruid = m->m_uid;
else
new_ruid = DefUid;
# if _FFR_USE_SETLOGIN
/* run disconnected from terminal and set login name */
if (setsid() >= 0 &&
ctladdr != NULL && ctladdr->q_uid != 0 &&
new_euid == ctladdr->q_uid)
{
struct passwd *pwd;
pwd = sm_getpwuid(ctladdr->q_uid);
if (pwd != NULL && suidwarn)
(void) setlogin(pwd->pw_name);
endpwent();
}
# endif /* _FFR_USE_SETLOGIN */
if (new_euid != NO_UID)
{
if (RunAsUid != 0 && new_euid != RunAsUid)
@ -2631,8 +2652,10 @@ deliver(e, firstto)
j | FD_CLOEXEC);
}
# if !_FFR_USE_SETLOGIN
/* run disconnected from terminal */
(void) setsid();
# endif /* !_FFR_USE_SETLOGIN */
/* try to execute the mailer */
(void) execve(m->m_mailer, (ARGV_T) pv,
@ -3931,6 +3954,13 @@ giveresponse(status, dsn, m, mci, ctladdr, xstart, e, to)
statmsg = buf;
usestat = true;
}
else if (bitnset(M_LMTP, m->m_flags) && e->e_statmsg != NULL)
{
(void) sm_snprintf(buf, sizeof buf, "%s (%s)", statmsg,
shortenstring(e->e_statmsg, 403));
statmsg = buf;
usestat = true;
}
}
/*
@ -4998,11 +5028,17 @@ mailfile(filename, mailer, ctladdr, sfflags, e)
}
(void) sm_strlcpy(targetfile, SafeFileEnv, sizeof targetfile);
realfile = targetfile + len;
if (targetfile[len - 1] != '/')
(void) sm_strlcat(targetfile, "/", sizeof targetfile);
if (*filename == '/')
filename++;
(void) sm_strlcat(targetfile, filename, sizeof targetfile);
if (*filename != '\0')
{
/* paranoia: trailing / should be removed in readcf */
if (targetfile[len - 1] != '/')
(void) sm_strlcat(targetfile,
"/", sizeof targetfile);
(void) sm_strlcat(targetfile, filename,
sizeof targetfile);
}
}
else if (mailer->m_rootdir != NULL)
{
@ -5045,6 +5081,14 @@ mailfile(filename, mailer, ctladdr, sfflags, e)
** the complications of calling subroutines, etc.
*/
/*
** Dispose of SIGCHLD signal catchers that may be laying
** around so that the waitfor() below will get it.
*/
(void) sm_signal(SIGCHLD, SIG_DFL);
DOFORK(fork);
if (pid < 0)
@ -5234,6 +5278,9 @@ mailfile(filename, mailer, ctladdr, sfflags, e)
if (realfile != targetfile)
{
char save;
save = *realfile;
*realfile = '\0';
if (tTd(11, 20))
sm_dprintf("mailfile: chroot %s\n", targetfile);
@ -5243,7 +5290,7 @@ mailfile(filename, mailer, ctladdr, sfflags, e)
targetfile);
RETURN(EX_CANTCREAT);
}
*realfile = '/';
*realfile = save;
}
if (tTd(11, 40))

View File

@ -14,9 +14,9 @@
#include <sendmail.h>
#if NAMED_BIND
SM_RCSID("@(#)$Id: domain.c,v 8.177 2001/12/12 01:16:15 ca Exp $ (with name server)")
SM_RCSID("@(#)$Id: domain.c,v 8.180 2002/03/05 05:47:12 gshapiro Exp $ (with name server)")
#else /* NAMED_BIND */
SM_RCSID("@(#)$Id: domain.c,v 8.177 2001/12/12 01:16:15 ca Exp $ (without name server)")
SM_RCSID("@(#)$Id: domain.c,v 8.180 2002/03/05 05:47:12 gshapiro Exp $ (without name server)")
#endif /* NAMED_BIND */
#if NAMED_BIND
@ -931,6 +931,14 @@ dns_getcanonname(host, hbsize, trymx, statp, pttl)
*/
SM_SET_H_ERRNO(TRY_AGAIN);
# if _FFR_DONT_STOP_LOOKING
if (**dp == '\0')
{
if (*statp == EX_OK)
*statp = EX_TEMPFAIL;
goto nexttype;
}
# endif /* _FFR_DONT_STOP_LOOKING */
*statp = EX_TEMPFAIL;
if (WorkAroundBrokenAAAA)
@ -952,6 +960,9 @@ dns_getcanonname(host, hbsize, trymx, statp, pttl)
return false;
}
# if _FFR_DONT_STOP_LOOKING
nexttype:
# endif /* _FFR_DONT_STOP_LOOKING */
if (h_errno != HOST_NOT_FOUND)
{
/* might have another type of interest */

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2002 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: envelope.c,v 8.279 2001/12/10 19:56:04 ca Exp $")
SM_RCSID("@(#)$Id: envelope.c,v 8.281 2002/02/06 19:54:54 ca Exp $")
/*
** NEWENVELOPE -- fill in a new envelope
@ -1030,8 +1030,13 @@ setsender(from, e, delimptr, delimchar, internal)
/* if the user already given fullname don't redefine */
if (FullName == NULL)
FullName = macvalue('x', e);
if (FullName != NULL && FullName[0] == '\0')
if (FullName != NULL)
{
if (FullName[0] == '\0')
FullName = NULL;
else
FullName = newstr(FullName);
}
}
if (e->e_from.q_user[0] != '\0' &&

View File

@ -1,6 +1,6 @@
#vers 2
cpyr
cpyr Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
cpyr Copyright (c) 1998-2000, 2002 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.38 2000/10/15 17:18:44 ca Exp $$
cpyr $$Id: helpfile,v 8.40 2002/03/19 00:23:28 gshapiro Exp $$
cpyr
smtp This is sendmail version $v
smtp Topics:
@ -133,4 +133,4 @@ control help This message.
control restart Restart sendmail.
control shutdown Shutdown sendmail.
control status Show sendmail status.
control memdump Dump allocated memory list.
control memdump Dump allocated memory list (for debugging only).

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2002 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.868 2001/12/29 04:54:38 ca Exp $")
SM_RCSID("@(#)$Id: main.c,v 8.876 2002/02/27 23:49:52 ca Exp $")
#if NETINET || NETINET6
@ -326,11 +326,16 @@ main(argc, argv, envp)
#ifdef SIGUSR1
/* Only allow root (or non-set-*-ID binaries) to use SIGUSR1 */
if (extraprivs)
if (!extraprivs)
{
/* arrange to dump state on user-1 signal */
(void) sm_signal(SIGUSR1, sigusr1);
}
else
{
/* ignore user-1 signal */
(void) sm_signal(SIGUSR1, SIG_IGN);
}
#endif /* SIGUSR1 */
/* initialize for setproctitle */
@ -389,7 +394,8 @@ main(argc, argv, envp)
switch (j)
{
case 'b': /* operations mode */
switch (j = *optarg)
j = (optarg == NULL) ? ' ' : *optarg;
switch (j)
{
case MD_DAEMON:
case MD_FGDAEMON:
@ -544,13 +550,6 @@ main(argc, argv, envp)
j = 0;
for (av = argv; *av != NULL; )
j += strlen(*av++) + 1;
if (j < 0 || j > SM_ARG_MAX)
{
syserr("!Arguments too long");
/* NOTREACHED */
return EX_USAGE;
}
SaveArgv = (char **) xalloc(sizeof (char *) * (argc + 1));
CommandLineArgs = xalloc(j);
p = CommandLineArgs;
@ -2179,7 +2178,10 @@ main(argc, argv, envp)
** increment the work counter.
*/
runqueueevent(qgrp);
for (i = 0; i < NumQueue && Queue[i] != NULL;
i++)
Queue[i]->qg_nextrun = (time_t) -1;
Queue[qgrp]->qg_nextrun = 0;
(void) run_work_group(Queue[qgrp]->qg_wgrp,
false, Verbose,
queuepersistent, false);
@ -3537,6 +3539,7 @@ drop_privileges(to_real_uid)
RunAsUserName = RealUserName;
RunAsUid = RealUid;
RunAsGid = RealGid;
EffGid = RunAsGid;
}
/* make sure no one can grab open descriptors for secret files */
@ -3620,20 +3623,19 @@ drop_privileges(to_real_uid)
/* fiddle with uid */
if (to_real_uid || RunAsUid != 0)
{
uid_t euid = geteuid();
uid_t euid;
/*
** Try to setuid(RunAsUid).
** euid must be RunAsUid,
** ruid must be RunAsUid unless it's the MSP and the euid
** wasn't 0 and we didn't have to drop privileges to the
** real uid.
** ruid must be RunAsUid unless (e|r)uid wasn't 0
** and we didn't have to drop privileges to the real uid.
*/
if (setuid(RunAsUid) < 0 ||
geteuid() != RunAsUid ||
(getuid() != RunAsUid &&
(!UseMSP || euid == 0 || to_real_uid )) ||
geteuid() != RunAsUid)
(to_real_uid || geteuid() == 0 || getuid() == 0)))
{
#if HASSETREUID
/*
@ -3642,7 +3644,7 @@ drop_privileges(to_real_uid)
** setuid() to drop the saved-uid as well.
*/
if (euid == RunAsUid)
if (geteuid() == RunAsUid)
{
if (setreuid(RunAsUid, -1) < 0)
{
@ -3665,6 +3667,7 @@ drop_privileges(to_real_uid)
rval = EX_OSERR;
}
}
euid = geteuid();
if (RunAsUid != 0 && setuid(0) == 0)
{
/*

View File

@ -13,7 +13,7 @@
#include <sendmail.h>
SM_RCSID("@(#)$Id: map.c,v 8.618 2002/01/11 22:06:52 gshapiro Exp $")
SM_RCSID("@(#)$Id: map.c,v 8.641 2002/03/26 22:56:36 gshapiro Exp $")
#if LDAPMAP
# include <sm/ldap.h>
@ -2591,7 +2591,7 @@ nis_map_open(map, mode)
if (yperr != 0)
{
if (!bitset(MF_OPTIONAL, map->map_mflags))
syserr("421 4.3.5 NIS map %s specified, but NIS not running",
syserr("451 4.3.5 NIS map %s specified, but NIS not running",
map->map_file);
return false;
}
@ -2625,7 +2625,7 @@ nis_map_open(map, mode)
if (!bitset(MF_OPTIONAL, map->map_mflags))
{
syserr("421 4.0.0 Cannot bind to map %s in domain %s: %s",
syserr("451 4.3.5 Cannot bind to map %s in domain %s: %s",
map->map_file, map->map_domain, yperr_string(yperr));
}
@ -2879,7 +2879,7 @@ nisplus_map_open(map, mode)
default: /* all other nisplus errors */
# if 0
if (!bitset(MF_OPTIONAL, map->map_mflags))
syserr("421 4.0.0 Cannot find table %s.%s: %s",
syserr("451 4.3.5 Cannot find table %s.%s: %s",
map->map_file, map->map_domain,
nis_sperrno(res->status));
# endif /* 0 */
@ -2895,7 +2895,7 @@ nisplus_map_open(map, mode)
sm_dprintf("nisplus_map_open: %s is not a table\n", qbuf);
# if 0
if (!bitset(MF_OPTIONAL, map->map_mflags))
syserr("421 4.0.0 %s.%s: %s is not a table",
syserr("451 4.3.5 %s.%s: %s is not a table",
map->map_file, map->map_domain,
nis_sperrno(res->status));
# endif /* 0 */
@ -3132,7 +3132,7 @@ nisplus_getcanonname(name, hbsize, statp)
}
if (tTd(38, 20))
sm_dprintf("\nnisplus_getcanoname(%s), qbuf=%s\n",
sm_dprintf("\nnisplus_getcanonname(%s), qbuf=%s\n",
name, qbuf);
result = nis_list(qbuf, EXPAND_NAME|FOLLOW_LINKS|FOLLOW_PATH,
@ -3152,12 +3152,12 @@ nisplus_getcanonname(name, hbsize, statp)
/* ignore second entry */
if (tTd(38, 20))
sm_dprintf("nisplus_getcanoname(%s), got %d entries, all but first ignored\n",
sm_dprintf("nisplus_getcanonname(%s), got %d entries, all but first ignored\n",
name, count);
}
if (tTd(38, 20))
sm_dprintf("nisplus_getcanoname(%s), found in directory \"%s\"\n",
sm_dprintf("nisplus_getcanonname(%s), found in directory \"%s\"\n",
name, (NIS_RES_OBJECT(result))->zo_domain);
@ -3325,7 +3325,7 @@ ldapmap_open(map, mode)
if (LogLevel > 1)
sm_syslog(LOG_NOTICE, CurEnv->e_id,
"timeout conning to LDAP server %.100s",
lmap->ldap_host == NULL ? "localhost" : lmap->ldap_host);
lmap->ldap_target == NULL ? "localhost" : lmap->ldap_target);
}
if (!bitset(MF_OPTIONAL, map->map_mflags))
@ -3337,18 +3337,18 @@ ldapmap_open(map, mode)
# else /* USE_LDAP_INIT */
"ldap_open",
# endif /* USE_LDAP_INIT */
lmap->ldap_host == NULL ? "localhost"
: lmap->ldap_host,
lmap->ldap_target == NULL ? "localhost"
: lmap->ldap_target,
map->map_mname);
else
syserr("421 4.0.0 %s failed to %s in map %s",
syserr("451 4.3.5 %s failed to %s in map %s",
# if USE_LDAP_INIT
"ldap_init/ldap_bind",
# else /* USE_LDAP_INIT */
"ldap_open",
# endif /* USE_LDAP_INIT */
lmap->ldap_host == NULL ? "localhost"
: lmap->ldap_host,
lmap->ldap_target == NULL ? "localhost"
: lmap->ldap_target,
map->map_mname);
}
return false;
@ -3445,12 +3445,17 @@ ldapmap_lookup(map, name, av, statp)
char **av;
int *statp;
{
int i;
# if _FFR_LDAP_RECURSION
int plen = 0;
int psize = 0;
# else /* _FFR_LDAP_RECURSION */
int entries = 0;
int msgid;
int i;
int ret;
int save_errno;
int vsize;
# endif /* _FFR_LDAP_RECURSION */
int msgid;
int save_errno;
char *vp, *p;
char *result = NULL;
SM_LDAP_STRUCT *lmap = NULL;
@ -3485,7 +3490,7 @@ ldapmap_lookup(map, name, av, statp)
syserr("Error in ldap_search using %s in map %s",
keybuf, map->map_mname);
else
syserr("421 4.0.0 Error in ldap_search using %s in map %s",
syserr("451 4.3.5 Error in ldap_search using %s in map %s",
keybuf, map->map_mname);
}
*statp = EX_TEMPFAIL;
@ -3523,7 +3528,7 @@ ldapmap_lookup(map, name, av, statp)
p = NULL;
*statp = sm_ldap_results(lmap, msgid, flags, map->map_coldelim,
rpool, &p, NULL);
rpool, &p, &plen, &psize, NULL);
save_errno = errno;
/* Copy result so rpool can be freed */
@ -3547,15 +3552,14 @@ ldapmap_lookup(map, name, av, statp)
syserr("Error getting LDAP results in map %s",
map->map_mname);
else
syserr("421 4.0.0 Error getting LDAP results in map %s",
syserr("451 4.3.5 Error getting LDAP results in map %s",
map->map_mname);
}
errno = save_errno;
return NULL;
}
goto finishlookup;
}
# endif /* _FFR_LDAP_RECURSION */
# else /* _FFR_LDAP_RECURSION */
/* Get results */
while ((ret = ldap_result(lmap->ldap_ld, msgid, 0,
@ -3636,9 +3640,7 @@ ldapmap_lookup(map, name, av, statp)
save_errno = sm_ldap_geterrno(lmap->ldap_ld);
if (save_errno == LDAP_SUCCESS)
{
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
continue;
}
@ -3653,13 +3655,11 @@ ldapmap_lookup(map, name, av, statp)
syserr("Error getting LDAP values in map %s",
map->map_mname);
else
syserr("421 4.0.0 Error getting LDAP values in map %s",
syserr("451 4.3.5 Error getting LDAP values in map %s",
map->map_mname);
}
*statp = EX_TEMPFAIL;
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
if (lmap->ldap_res != NULL)
{
ldap_msgfree(lmap->ldap_res);
@ -3696,9 +3696,7 @@ ldapmap_lookup(map, name, av, statp)
if (lmap->ldap_attrsonly == LDAPMAP_FALSE)
ldap_value_free(vals);
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
continue;
}
@ -3712,18 +3710,14 @@ ldapmap_lookup(map, name, av, statp)
if (lmap->ldap_attrsonly == LDAPMAP_TRUE)
{
vp = newstr(attr);
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
break;
}
if (vals[0] == NULL)
{
ldap_value_free(vals);
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
continue;
}
@ -3740,9 +3734,7 @@ ldapmap_lookup(map, name, av, statp)
else
sm_strlcpy(vp, vals[0], vsize);
ldap_value_free(vals);
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
break;
}
@ -3763,9 +3755,7 @@ ldapmap_lookup(map, name, av, statp)
sm_free(vp); /* XXX */
vp = tmp;
}
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
continue;
}
@ -3803,9 +3793,7 @@ ldapmap_lookup(map, name, av, statp)
}
ldap_value_free(vals);
# if USING_NETSCAPE_LDAP
ldap_memfree(attr);
# endif /* USING_NETSCAPE_LDAP */
if (vp == NULL)
{
vp = vp_tmp;
@ -3843,7 +3831,7 @@ ldapmap_lookup(map, name, av, statp)
syserr("Error getting LDAP attributes in map %s",
map->map_mname);
else
syserr("421 4.0.0 Error getting LDAP attributes in map %s",
syserr("451 4.3.5 Error getting LDAP attributes in map %s",
map->map_mname);
}
*statp = EX_TEMPFAIL;
@ -3876,7 +3864,7 @@ ldapmap_lookup(map, name, av, statp)
syserr("Error getting LDAP entries in map %s",
map->map_mname);
else
syserr("421 4.0.0 Error getting LDAP entries in map %s",
syserr("451 4.3.5 Error getting LDAP entries in map %s",
map->map_mname);
}
*statp = EX_TEMPFAIL;
@ -3911,7 +3899,7 @@ ldapmap_lookup(map, name, av, statp)
syserr("Error getting LDAP results in map %s",
map->map_mname);
else
syserr("421 4.0.0 Error getting LDAP results in map %s",
syserr("451 4.3.5 Error getting LDAP results in map %s",
map->map_mname);
}
*statp = EX_TEMPFAIL;
@ -3932,9 +3920,6 @@ ldapmap_lookup(map, name, av, statp)
errno = save_errno;
return NULL;
}
# if _FFR_LDAP_RECURSION
finishlookup:
# endif /* _FFR_LDAP_RECURSION */
/* Did we match anything? */
@ -3980,15 +3965,25 @@ static STAB *
ldapmap_findconn(lmap)
SM_LDAP_STRUCT *lmap;
{
char *format;
char *nbuf;
STAB *SM_NONVOLATILE s = NULL;
nbuf = sm_stringf_x("%s%c%d%c%s%c%s%d",
(lmap->ldap_host == NULL ? "localhost"
: lmap->ldap_host),
# if _FFR_LDAP_SETVERSION
format = "%s%c%d%c%d%c%s%c%s%d";
# else /* _FFR_LDAP_SETVERSION */
format = "%s%c%d%c%s%c%s%d";
# endif /* _FFR_LDAP_SETVERSION */
nbuf = sm_stringf_x(format,
(lmap->ldap_target == NULL ? "localhost"
: lmap->ldap_target),
CONDELSE,
lmap->ldap_port,
CONDELSE,
# if _FFR_LDAP_SETVERSION
lmap->ldap_version,
CONDELSE,
# endif /* _FFR_LDAP_SETVERSION */
(lmap->ldap_binddn == NULL ? ""
: lmap->ldap_binddn),
CONDELSE,
@ -4039,6 +4034,9 @@ ldapmap_parseargs(map, args)
char *args;
{
bool secretread = true;
# if _FFR_LDAP_URI
bool ldaphost = false;
# endif /* _FFR_LDAP_URI */
int i;
register char *p = args;
SM_LDAP_STRUCT *lmap;
@ -4320,7 +4318,16 @@ ldapmap_parseargs(map, args)
case 'h': /* ldap host */
while (isascii(*++p) && isspace(*p))
continue;
lmap->ldap_host = p;
# if _FFR_LDAP_URI
if (lmap->ldap_uri)
{
syserr("Can not specify both an LDAP host and an LDAP URI in map %s",
map->map_mname);
return false;
}
ldaphost = true;
# endif /* _FFR_LDAP_URI */
lmap->ldap_target = p;
break;
case 'b': /* search base */
@ -4402,6 +4409,54 @@ ldapmap_parseargs(map, args)
secretread = false;
break;
# if _FFR_LDAP_URI
case 'H': /* Use LDAP URI */
# if !USE_LDAP_INIT
syserr("Must compile with -DUSE_LDAP_INIT to use LDAP URIs (-H) in map %s",
map->map_mname);
return false;
# else /* !USE_LDAP_INIT */
if (ldaphost)
{
syserr("Can not specify both an LDAP host and an LDAP URI in map %s",
map->map_mname);
return false;
}
while (isascii(*++p) && isspace(*p))
continue;
lmap->ldap_target = p;
lmap->ldap_uri = true;
break;
# endif /* !USE_LDAP_INIT */
# endif /* _FFR_LDAP_URI */
# if _FFR_LDAP_SETVERSION
case 'w':
/* -w should be for passwd, -P should be for version */
while (isascii(*++p) && isspace(*p))
continue;
lmap->ldap_version = atoi(p);
# ifdef LDAP_VERSION_MAX
if (lmap->ldap_version > LDAP_VERSION_MAX)
{
syserr("LDAP version %d exceeds max of %d in map %s",
lmap->ldap_version, LDAP_VERSION_MAX,
map->map_mname);
return false;
}
# endif /* LDAP_VERSION_MAX */
# ifdef LDAP_VERSION_MIN
if (lmap->ldap_version < LDAP_VERSION_MIN)
{
syserr("LDAP version %d is lower than min of %d in map %s",
lmap->ldap_version, LDAP_VERSION_MIN,
map->map_mname);
return false;
}
# endif /* LDAP_VERSION_MIN */
break;
# endif /* _FFR_LDAP_SETVERSION */
default:
syserr("Illegal option %c map %s", *p, map->map_mname);
break;
@ -4435,12 +4490,12 @@ ldapmap_parseargs(map, args)
** and dump it into map->map_dbptr1
*/
if (lmap->ldap_host != NULL &&
if (lmap->ldap_target != NULL &&
(LDAPDefaults == NULL ||
LDAPDefaults == lmap ||
LDAPDefaults->ldap_host != lmap->ldap_host))
lmap->ldap_host = newstr(ldapmap_dequote(lmap->ldap_host));
map->map_domain = lmap->ldap_host;
LDAPDefaults->ldap_target != lmap->ldap_target))
lmap->ldap_target = newstr(ldapmap_dequote(lmap->ldap_target));
map->map_domain = lmap->ldap_target;
if (lmap->ldap_binddn != NULL &&
(LDAPDefaults == NULL ||
@ -4566,13 +4621,21 @@ ldapmap_parseargs(map, args)
{
# if _FFR_LDAP_RECURSION
bool recurse = false;
int final = 0;
bool normalseen = false;
# endif /* _FFR_LDAP_RECURSION */
i = 0;
p = ldapmap_dequote(lmap->ldap_attr[0]);
lmap->ldap_attr[0] = NULL;
# if _FFR_LDAP_RECURSION
/* Prime the attr list with the objectClass attribute */
lmap->ldap_attr[i] = "objectClass";
lmap->ldap_attr_type[i] = SM_LDAP_ATTR_OBJCLASS;
lmap->ldap_attr_needobjclass[i] = NULL;
i++;
# endif /* _FFR_LDAP_RECURSION */
while (p != NULL)
{
char *v;
@ -4595,47 +4658,84 @@ ldapmap_parseargs(map, args)
if (*v != '\0')
{
# if _FFR_LDAP_RECURSION
int j;
int use;
char *type;
char *needobjclass;
type = strchr(v, ':');
if (type != NULL)
{
*type++ = '\0';
#endif /* _FFR_LDAP_RECURSION */
lmap->ldap_attr[i] = newstr(v);
#if _FFR_LDAP_RECURSION
if (type != NULL)
{
if (sm_strcasecmp(type, "normal") == 0)
{
lmap->ldap_attr_type[i] = LDAPMAP_ATTR_NORMAL;
needobjclass = strchr(type, ':');
if (needobjclass != NULL)
*needobjclass++ = '\0';
}
else if (sm_strcasecmp(type, "dn") == 0)
else
{
needobjclass = NULL;
}
use = i;
/* allow override on "objectClass" type */
if (sm_strcasecmp(v, "objectClass") == 0 &&
lmap->ldap_attr_type[0] == SM_LDAP_ATTR_OBJCLASS)
{
use = 0;
}
else
{
/*
** Don't add something to attribute
** list twice.
*/
for (j = 1; j < i; j++)
{
if (sm_strcasecmp(v, lmap->ldap_attr[j]) == 0)
{
syserr("Duplicate attribute (%s) in %s",
v, map->map_mname);
return false;
}
}
lmap->ldap_attr[use] = newstr(v);
if (needobjclass != NULL &&
*needobjclass != '\0' &&
*needobjclass != '*')
{
lmap->ldap_attr_needobjclass[use] = newstr(needobjclass);
}
else
{
lmap->ldap_attr_needobjclass[use] = NULL;
}
}
if (type != NULL && *type != '\0')
{
if (sm_strcasecmp(type, "dn") == 0)
{
recurse = true;
lmap->ldap_attr_type[i] = LDAPMAP_ATTR_DN;
lmap->ldap_attr_type[use] = SM_LDAP_ATTR_DN;
}
else if (sm_strcasecmp(type, "filter") == 0)
{
recurse = true;
lmap->ldap_attr_type[i] = LDAPMAP_ATTR_FILTER;
lmap->ldap_attr_type[use] = SM_LDAP_ATTR_FILTER;
}
else if (sm_strcasecmp(type, "url") == 0)
{
recurse = true;
lmap->ldap_attr_type[i] = LDAPMAP_ATTR_URL;
lmap->ldap_attr_type[use] = SM_LDAP_ATTR_URL;
}
else if (sm_strcasecmp(type, "final") == 0)
else if (sm_strcasecmp(type, "normal") == 0)
{
lmap->ldap_attr_type[i] = LDAPMAP_ATTR_FINAL;
if (final >= LDAPMAP_MAX_ATTR)
{
syserr("Too many FINAL attributes in %s (max %d)",
map->map_mname, LDAPMAP_MAX_ATTR);
return false;
}
lmap->ldap_attr_final[final++] = lmap->ldap_attr[i];
lmap->ldap_attr_type[use] = SM_LDAP_ATTR_NORMAL;
normalseen = true;
}
else
{
@ -4645,17 +4745,21 @@ ldapmap_parseargs(map, args)
}
}
else
lmap->ldap_attr_type[i] = LDAPMAP_ATTR_NORMAL;
{
lmap->ldap_attr_type[use] = SM_LDAP_ATTR_NORMAL;
normalseen = true;
}
# else /* _FFR_LDAP_RECURSION */
lmap->ldap_attr[i] = newstr(v);
# endif /* _FFR_LDAP_RECURSION */
i++;
}
}
lmap->ldap_attr[i] = NULL;
# if _FFR_LDAP_RECURSION
lmap->ldap_attr_final[final] = NULL;
if (recurse && lmap->ldap_attr_final[0] == NULL)
if (recurse && !normalseen)
{
syserr("LDAP recursion requested in %s but no FINAL attribute given",
syserr("LDAP recursion requested in %s but no returnable attribute given",
map->map_mname);
return false;
}
@ -4722,6 +4826,7 @@ ldapmap_set_defaults(spec)
if (LDAPDefaults->ldap_filter != NULL)
{
syserr("readcf: option LDAPDefaultSpec: Do not set the LDAP search filter");
/* don't free, it isn't malloc'ed in parseargs */
LDAPDefaults->ldap_filter = NULL;
}
@ -4917,7 +5022,7 @@ ph_map_close(map)
pmap = (PH_MAP_STRUCT *)map->map_db1;
if (tTd(38, 9))
sm_dprintf("ph_map_close(%s): pmap->ph_fastclose=%d",
sm_dprintf("ph_map_close(%s): pmap->ph_fastclose=%d\n",
map->map_mname, pmap->ph_fastclose);
@ -5311,7 +5416,7 @@ hes_map_open(map, mode)
return true;
if (!bitset(MF_OPTIONAL, map->map_mflags))
syserr("421 4.0.0 cannot initialize Hesiod map (%s)",
syserr("451 4.3.5 cannot initialize Hesiod map (%s)",
sm_errstring(errno));
return false;
# else /* HESIOD_INIT */
@ -5325,7 +5430,7 @@ hes_map_open(map, mode)
}
if (!bitset(MF_OPTIONAL, map->map_mflags))
syserr("421 4.0.0 cannot initialize Hesiod map (%d)", hes_error());
syserr("451 4.3.5 cannot initialize Hesiod map (%d)", hes_error());
return false;
# endif /* HESIOD_INIT */

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2002 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@ -10,7 +10,7 @@
#include <sendmail.h>
SM_RCSID("@(#)$Id: milter.c,v 8.185 2001/11/21 02:21:15 gshapiro Exp $")
SM_RCSID("@(#)$Id: milter.c,v 8.194 2002/03/05 00:23:47 gshapiro Exp $")
#if MILTER
# include <libmilter/mfapi.h>
@ -139,6 +139,8 @@ static char *MilterEnvRcptMacros[MAXFILTERMACROS + 1];
return NULL; \
} \
\
do \
{ \
FD_ZERO(&fds); \
SM_FD_SET(m->mf_sock, &fds); \
tv.tv_sec = (secs); \
@ -147,6 +149,7 @@ static char *MilterEnvRcptMacros[MAXFILTERMACROS + 1];
(write) ? NULL : &fds, \
(write) ? &fds : NULL, \
NULL, &tv); \
} while (ret < 0 && errno == EINTR); \
\
switch (ret) \
{ \
@ -566,6 +569,7 @@ milter_open(m, parseonly, e)
}
/* protocol:filename or protocol:port@host */
memset(&addr, '\0', sizeof addr);
p = m->mf_conn;
colon = strchr(p, ':');
if (colon != NULL)
@ -1881,7 +1885,7 @@ milter_send_command(m, command, data, sz, e, state)
m->mf_timeout[SMFTO_WRITE], e);
if (m->mf_state == SMFS_ERROR)
{
MILTER_CHECK_ERROR(/* EMPTY */;);
MILTER_CHECK_ERROR(return NULL);
return NULL;
}
@ -1890,7 +1894,7 @@ milter_send_command(m, command, data, sz, e, state)
m->mf_timeout[SMFTO_READ], e);
if (m->mf_state == SMFS_ERROR)
{
MILTER_CHECK_ERROR(/* EMPTY */;);
MILTER_CHECK_ERROR(return NULL);
return NULL;
}
@ -2166,11 +2170,11 @@ milter_negotiate(m, e)
m->mf_fvers > SMFI_VERSION)
{
if (tTd(64, 5))
sm_dprintf("milter_negotiate(%s): version %lu != MTA milter version %d\n",
sm_dprintf("milter_negotiate(%s): version %d != MTA milter version %d\n",
m->mf_name, m->mf_fvers, SMFI_VERSION);
if (MilterLogLevel > 0)
sm_syslog(LOG_ERR, e->e_id,
"Milter (%s): negotiate: version %ld != MTA milter version %d",
"Milter (%s): negotiate: version %d != MTA milter version %d",
m->mf_name, m->mf_fvers, SMFI_VERSION);
milter_error(m, e);
return -1;
@ -2180,12 +2184,12 @@ milter_negotiate(m, e)
if ((m->mf_fflags & SMFI_CURR_ACTS) != m->mf_fflags)
{
if (tTd(64, 5))
sm_dprintf("milter_negotiate(%s): filter abilities 0x%lx != MTA milter abilities 0x%lx\n",
sm_dprintf("milter_negotiate(%s): filter abilities 0x%x != MTA milter abilities 0x%lx\n",
m->mf_name, m->mf_fflags,
(unsigned long) SMFI_CURR_ACTS);
SMFI_CURR_ACTS);
if (MilterLogLevel > 0)
sm_syslog(LOG_ERR, e->e_id,
"Milter (%s): negotiate: filter abilities 0x%lx != MTA milter abilities 0x%lx",
"Milter (%s): negotiate: filter abilities 0x%x != MTA milter abilities 0x%lx",
m->mf_name, m->mf_fflags,
(unsigned long) SMFI_CURR_ACTS);
milter_error(m, e);
@ -2196,12 +2200,12 @@ milter_negotiate(m, e)
if ((m->mf_pflags & SMFI_CURR_PROT) != m->mf_pflags)
{
if (tTd(64, 5))
sm_dprintf("milter_negotiate(%s): protocol abilities 0x%lx != MTA milter abilities 0x%lx\n",
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);
if (MilterLogLevel > 0)
sm_syslog(LOG_ERR, e->e_id,
"Milter (%s): negotiate: protocol abilities 0x%lx != MTA milter abilities 0x%lx",
"Milter (%s): negotiate: protocol abilities 0x%x != MTA milter abilities 0x%lx",
m->mf_name, m->mf_pflags,
(unsigned long) SMFI_CURR_PROT);
milter_error(m, e);
@ -2209,7 +2213,7 @@ milter_negotiate(m, e)
}
if (tTd(64, 5))
sm_dprintf("milter_negotiate(%s): version %lu, fflags 0x%lx, pflags 0x%lx\n",
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);
return 0;
}
@ -2864,7 +2868,7 @@ milter_replbody(response, rlen, newfilter, e)
/* If a new filter, reset previous character and truncate data file */
if (newfilter)
{
off_t prevsize = 0;
off_t prevsize;
char dfname[MAXPATHLEN];
(void) sm_strlcpy(dfname, queuename(e, DATAFL_LETTER),
@ -2874,15 +2878,9 @@ milter_replbody(response, rlen, newfilter, e)
prevchar = '\0';
/* Get the current data file information */
if (bitset(EF_HAS_DF, e->e_flags) && e->e_dfp != NULL)
{
int afd;
struct stat st;
afd = sm_io_getinfo(e->e_dfp, SM_IO_WHAT_FD, NULL);
if (afd > 0 && fstat(afd, &st) == 0)
prevsize = st.st_size;
}
prevsize = sm_io_getinfo(e->e_dfp, SM_IO_WHAT_SIZE, NULL);
if (prevsize < 0)
prevsize = 0;
/* truncate current data file */
if (sm_io_getinfo(e->e_dfp, SM_IO_WHAT_ISTYPE, BF_FILE_TYPE))
@ -3117,7 +3115,7 @@ milter_connect(hostname, addr, e, state)
# if NETINET
case AF_INET:
family = SMFIA_INET;
port = htons(addr.sin.sin_port);
port = addr.sin.sin_port;
sockinfo = (char *) inet_ntoa(addr.sin.sin_addr);
break;
# endif /* NETINET */
@ -3128,7 +3126,7 @@ milter_connect(hostname, addr, e, state)
family = SMFIA_INET;
else
family = SMFIA_INET6;
port = htons(addr.sin6.sin6_port);
port = addr.sin6.sin6_port;
sockinfo = anynet_ntop(&addr.sin6.sin6_addr, buf6,
sizeof buf6);
if (sockinfo == NULL)
@ -3559,7 +3557,7 @@ milter_data(e, state)
"milter_data(%s): EOM ACK/NAK timeout",
m->mf_name);
milter_error(m, e);
MILTER_CHECK_ERROR(continue);
MILTER_CHECK_ERROR(break);
break;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1994, 1996-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1994
@ -14,7 +14,7 @@
#include <sendmail.h>
#include <string.h>
SM_RCSID("@(#)$Id: mime.c,v 8.125 2001/09/11 04:05:15 gshapiro Exp $")
SM_RCSID("@(#)$Id: mime.c,v 8.129 2002/03/13 07:28:05 gshapiro Exp $")
/*
** MIME support.
@ -924,7 +924,7 @@ isboundary(line, boundaries)
#endif /* MIME8TO7 */
#if MIME7TO8
static int mime_fromqp __P((unsigned char *, unsigned char **, int, int));
static int mime_fromqp __P((unsigned char *, unsigned char **, int));
/*
** MIME7TO8 -- output 7 bit encoded MIME body in 8 bit format
@ -936,7 +936,7 @@ static int mime_fromqp __P((unsigned char *, unsigned char **, int, int));
** will be able to deal with encoded MIME bodies if it can parse MIME
** multipart messages.
**
** Note also that we wont be called unless it is a text/plain MIME
** Note also that we won't be called unless it is a text/plain MIME
** message, encoded base64 or QP and mailer flag '9' has been defined
** on mailer.
**
@ -971,6 +971,7 @@ mime7to8(mci, header, e)
HDR *header;
register ENVELOPE *e;
{
int pxflags;
register char *p;
char *cte;
char **pvp;
@ -1024,6 +1025,7 @@ mime7to8(mci, header, e)
** it is not base64.
*/
pxflags = PXLF_MAPFROM;
if (sm_strcasecmp(cte, "base64") == 0)
{
int c1, c2, c3, c4;
@ -1066,9 +1068,13 @@ mime7to8(mci, header, e)
{
if (*--fbufp != '\n' ||
(fbufp > fbuf && *--fbufp != '\r'))
{
pxflags |= PXLF_NOADDEOL;
fbufp++;
}
putxline((char *) fbuf, fbufp - fbuf,
mci, PXLF_MAPFROM);
mci, pxflags);
pxflags &= ~PXLF_NOADDEOL;
fbufp = fbuf;
}
if (c3 == '=')
@ -1079,9 +1085,13 @@ mime7to8(mci, header, e)
{
if (*--fbufp != '\n' ||
(fbufp > fbuf && *--fbufp != '\r'))
{
pxflags |= PXLF_NOADDEOL;
fbufp++;
}
putxline((char *) fbuf, fbufp - fbuf,
mci, PXLF_MAPFROM);
mci, pxflags);
pxflags &= ~PXLF_NOADDEOL;
fbufp = fbuf;
}
if (c4 == '=')
@ -1092,28 +1102,44 @@ mime7to8(mci, header, e)
{
if (*--fbufp != '\n' ||
(fbufp > fbuf && *--fbufp != '\r'))
{
pxflags |= PXLF_NOADDEOL;
fbufp++;
}
putxline((char *) fbuf, fbufp - fbuf,
mci, PXLF_MAPFROM);
mci, pxflags);
pxflags &= ~PXLF_NOADDEOL;
fbufp = fbuf;
}
}
}
else
{
int off;
/* quoted-printable */
pxflags |= PXLF_NOADDEOL;
fbufp = fbuf;
while (sm_io_fgets(e->e_dfp, SM_TIME_DEFAULT, buf, sizeof buf)
!= NULL)
while (sm_io_fgets(e->e_dfp, SM_TIME_DEFAULT, buf,
sizeof buf) != NULL)
{
if (mime_fromqp((unsigned char *) buf, &fbufp, 0,
&fbuf[MAXLINE] - fbufp) == 0)
off = mime_fromqp((unsigned char *) buf, &fbufp,
&fbuf[MAXLINE] - fbufp);
again:
if (off < -1)
continue;
if (fbufp - fbuf > 0)
putxline((char *) fbuf, fbufp - fbuf - 1, mci,
PXLF_MAPFROM);
pxflags);
fbufp = fbuf;
if (off >= 0 && buf[off] != '\0')
{
off = mime_fromqp((unsigned char *) (buf + off),
&fbufp,
&fbuf[MAXLINE] - fbufp);
goto again;
}
}
}
@ -1121,8 +1147,18 @@ mime7to8(mci, header, e)
if (fbufp > fbuf)
{
*fbufp = '\0';
putxline((char *) fbuf, fbufp - fbuf, mci, PXLF_MAPFROM);
putxline((char *) fbuf, fbufp - fbuf, mci, pxflags);
}
/*
** The decoded text may end without an EOL. Since this function
** is only called for text/plain MIME messages, it is safe to
** add an extra one at the end just in case. This is a hack,
** but so is auto-converting MIME in the first place.
*/
putline("", mci);
if (tTd(43, 3))
sm_dprintf("\t\t\tmime7to8 => %s to 8bit done\n", cte);
}
@ -1149,31 +1185,47 @@ static char index_hex[128] =
# define HEXCHAR(c) (((c) < 0 || (c) > 127) ? -1 : index_hex[(c)])
/*
** MIME_FROMQP -- decode quoted printable string
**
** Parameters:
** infile -- input (encoded) string
** outfile -- output string
** maxlen -- size of output buffer
**
** Returns:
** -2 if decoding failure
** -1 if infile completely decoded into outfile
** >= 0 is the position in infile decoding
** reached before maxlen was reached
*/
static int
mime_fromqp(infile, outfile, state, maxlen)
mime_fromqp(infile, outfile, maxlen)
unsigned char *infile;
unsigned char **outfile;
int state; /* Decoding body (0) or header (1) */
int maxlen; /* Max # of chars allowed in outfile */
{
int c1, c2;
int nchar = 0;
unsigned char *b;
if (maxlen < 0)
/* decrement by one for trailing '\0', at least one other char */
if (--maxlen < 1)
return 0;
while ((c1 = *infile++) != '\0')
b = infile;
while ((c1 = *infile++) != '\0' && nchar < maxlen)
{
if (c1 == '=')
{
if ((c1 = *infile++) == 0)
if ((c1 = *infile++) == '\0')
break;
if (c1 == '\n' || (c1 = HEXCHAR(c1)) == -1)
{
/* ignore it */
if (state == 0)
return 0;
/* ignore it and the rest of the buffer */
return -2;
}
else
{
@ -1186,27 +1238,23 @@ mime_fromqp(infile, outfile, state, maxlen)
}
} while ((c2 = HEXCHAR(c2)) == -1);
if (c2 == -1 || ++nchar > maxlen)
if (c2 == -1)
break;
nchar++;
*(*outfile)++ = c1 << 4 | c2;
}
}
else
{
if (state == 1 && c1 == '_')
c1 = ' ';
if (++nchar > maxlen)
break;
nchar++;
*(*outfile)++ = c1;
if (c1 == '\n')
break;
}
}
*(*outfile)++ = '\0';
return 1;
if (nchar >= maxlen)
return (infile - b - 1);
return -1;
}
#endif /* MIME7TO8 */

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@ -13,13 +13,16 @@
#include <sendmail.h>
SM_RCSID("@(#)$Id: parseaddr.c,v 8.349 2001/12/12 02:50:22 gshapiro Exp $")
SM_RCSID("@(#)$Id: parseaddr.c,v 8.359 2002/03/29 16:20:47 ca Exp $")
static void allocaddr __P((ADDRESS *, int, char *, ENVELOPE *));
static int callsubr __P((char**, int, ENVELOPE *));
static char *map_lookup __P((STAB *, char *, char **, int *, ENVELOPE *));
static ADDRESS *buildaddr __P((char **, ADDRESS *, int, ENVELOPE *));
static bool hasctrlchar __P((register char *, bool));
static bool hasctrlchar __P((register char *, bool, bool));
/* replacement for illegal characters in addresses */
#define BAD_CHAR_REPLACEMENT '?'
/*
** PARSEADDR -- Parse an address
@ -138,11 +141,18 @@ parseaddr(addr, a, flags, delim, delimptr, e, isrcpt)
a = buildaddr(pvp, a, flags, e);
if (hasctrlchar(a->q_user, isrcpt))
if (hasctrlchar(a->q_user, isrcpt, true))
{
if (tTd(20, 1))
sm_dprintf("parseaddr-->bad q_user\n");
return NULL;
/*
** Just mark the address as bad so DSNs work.
** hasctrlchar() has to make sure that the address
** has been sanitized, e.g., shortened.
*/
a->q_state = QS_BADADDR;
}
/*
@ -152,7 +162,11 @@ parseaddr(addr, a, flags, delim, delimptr, e, isrcpt)
allocaddr(a, flags, addr, e);
if (QS_IS_BADADDR(a->q_state))
{
/* weed out bad characters in the printable address too */
(void) hasctrlchar(a->q_paddr, isrcpt, false);
return a;
}
/*
** Select a queue directory for recipient addresses.
@ -242,6 +256,7 @@ invalidaddr(addr, delimptr, isrcpt)
{
bool result = false;
char savedelim = '\0';
char *b = addr;
int len = 0;
if (delimptr != NULL)
@ -257,12 +272,16 @@ invalidaddr(addr, delimptr, isrcpt)
{
setstat(EX_USAGE);
result = true;
break;
*addr = BAD_CHAR_REPLACEMENT;
}
if (++len > MAXNAME - 1)
{
usrerr("553 5.1.0 Address too long (%d bytes max)",
MAXNAME - 1);
char saved = *addr;
*addr = '\0';
usrerr("553 5.1.0 Address \"%s\" too long (%d bytes max)",
b, MAXNAME - 1);
*addr = saved;
result = true;
goto delim;
}
@ -270,9 +289,11 @@ invalidaddr(addr, delimptr, isrcpt)
if (result)
{
if (isrcpt)
usrerr("501 5.1.3 Syntax error in mailbox address");
usrerr("501 5.1.3 8-bit character in mailbox address \"%s\"",
b);
else
usrerr("501 5.1.7 Syntax error in mailbox address");
usrerr("501 5.1.7 8-bit character in mailbox address \"%s\"",
b);
}
delim:
if (delimptr != NULL && savedelim != '\0')
@ -290,6 +311,8 @@ invalidaddr(addr, delimptr, isrcpt)
** addr -- the address to check.
** isrcpt -- true if the address is for a recipient; false
** indicates a from.
** complain -- true if an error should issued if the address
** is invalid and should be "repaired".
**
** Returns:
** true -- if the address has any "wierd" characters or
@ -298,22 +321,35 @@ invalidaddr(addr, delimptr, isrcpt)
*/
static bool
hasctrlchar(addr, isrcpt)
hasctrlchar(addr, isrcpt, complain)
register char *addr;
bool isrcpt;
bool isrcpt, complain;
{
bool result = false;
int len = 0;
bool quoted = false;
int len = 0;
char *result = NULL;
char *b = addr;
if (addr == NULL)
return false;
for (; *addr != '\0'; addr++)
{
if (++len > MAXNAME - 1)
{
if (complain)
{
(void) shorten_rfc822_string(b, MAXNAME - 1);
usrerr("553 5.1.0 Address \"%s\" too long (%d bytes max)",
b, MAXNAME - 1);
return true;
}
result = "too long";
}
if (!quoted && (*addr < 32 || *addr == 127))
{
result = true; /* a non-printable */
break;
result = "non-printable character";
*addr = BAD_CHAR_REPLACEMENT;
continue;
}
if (*addr == '"')
quoted = !quoted;
@ -322,33 +358,31 @@ hasctrlchar(addr, isrcpt)
/* XXX Generic problem: no '\0' in strings. */
if (*++addr == '\0')
{
result = true;
result = "trailing \\ character";
*--addr = BAD_CHAR_REPLACEMENT;
break;
}
}
if ((*addr & 0340) == 0200)
{
setstat(EX_USAGE);
result = true;
break;
}
if (++len > MAXNAME - 1)
{
usrerr("553 5.1.0 Address too long (%d bytes max)",
MAXNAME - 1);
return true;
result = "8-bit character";
*addr = BAD_CHAR_REPLACEMENT;
continue;
}
}
if (quoted)
result = true; /* unbalanced quote */
if (result)
result = "unbalanced quote"; /* unbalanced quote */
if (result != NULL && complain)
{
if (isrcpt)
usrerr("501 5.1.3 Syntax error in mailbox address");
usrerr("501 5.1.3 Syntax error in mailbox address \"%s\" (%s)",
b, result);
else
usrerr("501 5.1.7 Syntax error in mailbox address");
usrerr("501 5.1.7 Syntax error in mailbox address \"%s\" (%s)",
b, result);
}
return result;
return result != NULL;
}
/*
** ALLOCADDR -- do local allocations of address on demand.
@ -1820,6 +1854,7 @@ buildaddr(tv, a, flags, e)
int flags;
register ENVELOPE *e;
{
bool tempfail = false;
struct mailer **mp;
register struct mailer *m;
register char *p;
@ -1847,7 +1882,23 @@ buildaddr(tv, a, flags, e)
{
syserr("554 5.3.5 buildaddr: no mailer in parsed address");
badaddr:
if (ExitStat == EX_TEMPFAIL)
#if _FFR_ALLOW_S0_ERROR_4XX
/*
** ExitStat may have been set by an earlier map open
** failure (to a permanent error (EX_OSERR) in syserr())
** so we also need to check if this particular $#error
** return wanted a 4XX failure.
**
** XXX the real fix is probably to set ExitStat correctly,
** i.e., to EX_TEMPFAIL if the map open is just a temporary
** error.
**
** tempfail is tested here even if _FFR_ALLOW_S0_ERROR_4XX
** is not set; that's ok because it is initialized to false.
*/
#endif /* _FFR_ALLOW_S0_ERROR_4XX */
if (ExitStat == EX_TEMPFAIL || tempfail)
a->q_state = QS_QUEUEUP;
else
{
@ -1936,6 +1987,10 @@ buildaddr(tv, a, flags, e)
else
usrerr(fmt, ubuf + off);
/* XXX ubuf[off - 1] = ' '; */
#if _FFR_ALLOW_S0_ERROR_4XX
if (ubuf[0] == '4')
tempfail = true;
#endif /* _FFR_ALLOW_S0_ERROR_4XX */
}
else
{
@ -2093,6 +2148,11 @@ cataddr(pvp, evp, buf, sz, spacesub)
if (pvp++ == evp)
break;
}
#if _FFR_CATCH_LONG_STRINGS
/* Don't silently truncate long strings */
if (*pvp != NULL)
syserr("cataddr: string too long");
#endif /* _FFR_CATCH_LONG_STRINGS */
*p = '\0';
}
/*

View File

@ -13,7 +13,7 @@
#include <sendmail.h>
SM_RCSID("@(#)$Id: queue.c,v 8.834 2002/01/08 23:04:58 ca Exp $")
SM_RCSID("@(#)$Id: queue.c,v 8.857 2002/04/02 16:43:25 ca Exp $")
#include <dirent.h>
@ -71,13 +71,11 @@ static WORK *WorkQ; /* queue of things to be done */
static int NumWorkGroups; /* number of work groups */
/*
** use of DoQueueRun:
** NumQueue: indicates that a queue run is needed, look at individual bits
** 0 - NumQueue-1: indicates that a queue run for this queue group
** is needed.
** DoQueueRun indicates that a queue run is needed.
** Notice: DoQueueRun is modified in a signal handler!
*/
static BITMAP256 volatile DoQueueRun; /* non-interrupt time queue run needed */
static bool volatile DoQueueRun; /* non-interrupt time queue run needed */
/*
** Work group definition structure.
@ -124,7 +122,7 @@ static void printctladdr __P((ADDRESS *, SM_FILE_T *));
static bool readqf __P((ENVELOPE *, bool));
static void restart_work_group __P((int));
static void runner_work __P((ENVELOPE *, int, bool, int, int));
static void schedule_queue_runs __P((bool, int));
static void schedule_queue_runs __P((bool, int, bool));
static char *strrev __P((char *));
static ADDRESS *setctluser __P((char *, int, ENVELOPE *));
#if _FFR_RHS
@ -1217,6 +1215,7 @@ restart_work_group(wgrp)
** Parameters:
** runall -- schedule even if individual bit is not set.
** wgrp -- the work group id to schedule.
** didit -- the queue run was performed for this work group.
**
** Returns:
** nothing
@ -1227,22 +1226,35 @@ restart_work_group(wgrp)
else
static void
schedule_queue_runs(runall, wgrp)
schedule_queue_runs(runall, wgrp, didit)
bool runall;
int wgrp;
bool didit;
{
int qgrp, cgrp, endgrp;
#if _FFR_QUEUE_SCHED_DBG
time_t lastsched;
bool sched;
#endif /* _FFR_QUEUE_SCHED_DBG */
time_t now;
time_t minqintvl;
/*
** This is a bit ugly since we have to duplicate the
** code that "walks" through a work queue group.
*/
now = curtime();
minqintvl = 0;
cgrp = endgrp = WorkGrp[wgrp].wg_curqgrp;
do
{
time_t qintvl;
#if _FFR_QUEUE_SCHED_DBG
lastsched = 0;
sched = false;
#endif /* _FFR_QUEUE_SCHED_DBG */
qgrp = WorkGrp[wgrp].wg_qgs[cgrp]->qg_index;
if (Queue[qgrp]->qg_queueintvl > 0)
qintvl = Queue[qgrp]->qg_queueintvl;
@ -1250,21 +1262,97 @@ schedule_queue_runs(runall, wgrp)
qintvl = QueueIntvl;
else
qintvl = (time_t) 0;
if ((runall || bitnset(qgrp, DoQueueRun)) && qintvl > 0)
(void) sm_setevent(qintvl, runqueueevent, qgrp);
#if _FFR_QUEUE_SCHED_DBG
lastsched = Queue[qgrp]->qg_nextrun;
#endif /* _FFR_QUEUE_SCHED_DBG */
if ((runall || Queue[qgrp]->qg_nextrun <= now) && qintvl > 0)
{
#if _FFR_QUEUE_SCHED_DBG
sched = true;
#endif /* _FFR_QUEUE_SCHED_DBG */
if (minqintvl == 0 || qintvl < minqintvl)
minqintvl = qintvl;
/*
** Only set a new time if a queue run was performed
** for this queue group. If the queue was not run,
** we could starve it by setting a new time on each
** call.
*/
if (didit)
Queue[qgrp]->qg_nextrun += qintvl;
}
#if _FFR_QUEUE_SCHED_DBG
if (tTd(69, 10))
sm_syslog(LOG_INFO, NOQID,
"sqr: wgrp=%d, cgrp=%d, qgrp=%d, intvl=%ld, QI=%ld, runall=%d, bit=%d, sched=%d",
"sqr: wgrp=%d, cgrp=%d, qgrp=%d, intvl=%ld, QI=%ld, runall=%d, lastrun=%ld, nextrun=%ld, sched=%d",
wgrp, cgrp, qgrp, Queue[qgrp]->qg_queueintvl,
QueueIntvl, runall, bitnset(qgrp, DoQueueRun),
(runall || bitnset(qgrp, DoQueueRun)) &&
qintvl > 0);
QueueIntvl, runall, lastsched,
Queue[qgrp]->qg_nextrun, sched);
#endif /* _FFR_QUEUE_SCHED_DBG */
clrbitn(qgrp, DoQueueRun);
INCR_MOD(cgrp, WorkGrp[wgrp].wg_numqgrp);
} while (endgrp != cgrp);
if (minqintvl > 0)
(void) sm_setevent(minqintvl, runqueueevent, 0);
}
#if _FFR_QUEUE_RUN_PARANOIA
/*
** CHECKQUEUERUNNER -- check whether a queue group hasn't been run.
**
** Use this if events may get lost and hence queue runners may not
** be started and mail will pile up in a queue.
**
** Parameters:
** none.
**
** Returns:
** true if a queue run is necessary.
**
** Side Effects:
** may schedule a queue run.
*/
bool
checkqueuerunner()
{
int qgrp;
time_t now, minqintvl;
now = curtime();
minqintvl = 0;
for (qgrp = 0; qgrp < NumQueue && Queue[qgrp] != NULL; qgrp++)
{
time_t qintvl;
if (Queue[qgrp]->qg_queueintvl > 0)
qintvl = Queue[qgrp]->qg_queueintvl;
else if (QueueIntvl > 0)
qintvl = QueueIntvl;
else
qintvl = (time_t) 0;
if (Queue[qgrp]->qg_nextrun <= now - qintvl)
{
if (minqintvl == 0 || qintvl < minqintvl)
minqintvl = qintvl;
if (LogLevel > 1)
sm_syslog(LOG_WARNING, NOQID,
"checkqueuerunner: queue %d should have been run at %s, queue interval %ld",
qgrp,
arpadate(ctime(&Queue[qgrp]->qg_nextrun)),
qintvl);
}
}
if (minqintvl > 0)
{
(void) sm_setevent(minqintvl, runqueueevent, 0);
return true;
}
return false;
}
#endif /* _FFR_QUEUE_RUN_PARANOIA */
/*
** RUNQUEUE -- run the jobs in the queue.
**
@ -1286,7 +1374,6 @@ schedule_queue_runs(runall, wgrp)
** Side Effects:
** runs things in the mail queue using run_work_group().
** maybe schedules next queue run.
**
*/
static ENVELOPE QueueEnvelope; /* the queue run envelope */
@ -1322,7 +1409,7 @@ runqueue(forkflag, verbose, persistent, runall)
#endif /* SM_HEAP_CHECK */
/* queue run has been started, don't do any more this time */
clrbitn(NumQueue, DoQueueRun);
DoQueueRun = false;
/* more than one queue or more than one directory per queue */
if (!forkflag && !verbose &&
@ -1392,7 +1479,7 @@ runqueue(forkflag, verbose, persistent, runall)
/* Success means the runner count needs to be updated. */
CurRunners += WorkGrp[curnum].wg_maxact;
if (!persistent)
schedule_queue_runs(runall, curnum);
schedule_queue_runs(runall, curnum, true);
INCR_MOD(curnum, NumWorkGroups);
}
@ -1403,7 +1490,7 @@ runqueue(forkflag, verbose, persistent, runall)
for (h = curnum; i < NumWorkGroups; i++)
{
schedule_queue_runs(runall, h);
schedule_queue_runs(runall, h, false);
INCR_MOD(h, NumWorkGroups);
}
}
@ -1638,7 +1725,7 @@ run_work_group(wgrp, forkflag, verbose, persistent, runall)
int njobs, qdir;
int sequenceno = 1;
int qgrp, endgrp, h, i;
time_t current_la_time;
time_t current_la_time, now;
bool full, more;
SM_RPOOL_T *rpool;
extern void rmexpstab __P((void));
@ -1809,6 +1896,7 @@ run_work_group(wgrp, forkflag, verbose, persistent, runall)
** runall is set or the bit for this group is set.
*/
now = curtime();
for (;;)
{
/*
@ -1819,7 +1907,9 @@ run_work_group(wgrp, forkflag, verbose, persistent, runall)
qgrp = WorkGrp[wgrp].wg_qgs[WorkGrp[wgrp].wg_curqgrp]->qg_index;
WorkGrp[wgrp].wg_curqgrp++; /* advance */
WorkGrp[wgrp].wg_curqgrp %= WorkGrp[wgrp].wg_numqgrp; /* wrap */
if (runall || bitnset(qgrp, DoQueueRun))
if (runall ||
(Queue[qgrp]->qg_nextrun <= now &&
Queue[qgrp]->qg_nextrun != (time_t) -1))
break;
if (endgrp == WorkGrp[wgrp].wg_curqgrp)
{
@ -2039,8 +2129,6 @@ run_work_group(wgrp, forkflag, verbose, persistent, runall)
/* No more queues in work group to process. Now check persistent. */
if (persistent)
{
time_t now;
sequenceno = 1;
sm_setproctitle(true, CurEnv, "running queue: %s",
qid_printqueue(qgrp, qdir));
@ -2134,25 +2222,19 @@ run_work_group(wgrp, forkflag, verbose, persistent, runall)
bool
doqueuerun()
{
return bitnset(NumQueue, DoQueueRun);
return DoQueueRun;
}
/*
** RUNQUEUEEVENT -- stub for use in sm_setevent
**
** Sets the bit to indicate that on the next run this queue should be
** processed. The work group that the queue group is a member of has its
** count of queue's to process updated.
** RUNQUEUEEVENT -- Sets a flag to indicate that a queue run should be done.
**
** Parameters:
** qgrp -- the index of the queue group.
** none.
**
** Returns:
** none.
**
** Side Effects:
** The work group that the queue group is a member of has its
** count of queues to process updated.
** The invocation of this function via an alarm may interrupt
** a set of actions. Thus errno may be set in that context.
** We need to restore errno at the end of this function to ensure
@ -2168,10 +2250,8 @@ doqueuerun()
*/
void
runqueueevent(qgrp)
int qgrp;
runqueueevent()
{
int i;
int save_errno = errno;
/*
@ -2179,23 +2259,12 @@ runqueueevent(qgrp)
** tested in doqueuerun()
*/
setbitn(NumQueue, DoQueueRun);
DoQueueRun = true;
#if _FFR_QUEUE_SCHED_DBG
if (tTd(69, 10))
sm_syslog(LOG_INFO, NOQID, "rqe: done");
#endif /* _FFR_QUEUE_SCHED_DBG */
/* if it is a specific group: set that bit */
if (qgrp != NOQGRP)
{
setbitn(qgrp, DoQueueRun);
goto ret;
}
/* for all others: set the bit if it doesn't have a queue interval */
for (i = 0; i < NumQueue; i++)
{
if (Queue[i]->qg_queueintvl <= 0)
setbitn(i, DoQueueRun);
}
ret:
errno = save_errno;
if (errno == EINTR)
errno = ETIMEDOUT;
@ -2374,7 +2443,7 @@ gatherq(qgrp, qdir, doall, full, more)
check = QueueLimitId;
while (check != NULL)
{
if (strcontainedin(true, check->queue_match,
if (strcontainedin(false, check->queue_match,
d->d_name) != check->queue_negate)
break;
else
@ -3689,6 +3758,7 @@ readqf(e, openonly)
bool nomore = false;
bool bogus = false;
MODE_T qsafe;
char *err;
char qf[MAXPATHLEN];
char buf[MAXLINE];
@ -3934,13 +4004,8 @@ readqf(e, openonly)
hackattack:
syserr("SECURITY ALERT: extra or bogus data in queue file: %s",
bp);
(void) sm_io_close(qfp, SM_TIME_DEFAULT);
/* the file is already on disk */
e->e_flags |= EF_INQUEUE;
loseqfile(e, "bogus queue line");
RELEASE_QUEUE;
return false;
err = "bogus queue line";
goto fail;
}
switch (bp[0])
{
@ -3992,9 +4057,8 @@ readqf(e, openonly)
}
}
}
loseqfile(e, "bogus queue file directory");
RELEASE_QUEUE;
return false;
err = "bogus queue file directory";
goto fail;
done:
break;
}
@ -4008,10 +4072,8 @@ readqf(e, openonly)
{
/* we are being spoofed! */
syserr("SECURITY ALERT: bogus qf line %s", bp);
(void) sm_io_close(qfp, SM_TIME_DEFAULT);
loseqfile(e, "bogus queue line");
RELEASE_QUEUE;
return false;
err = "bogus queue line";
goto fail;
}
for (p = &bp[1]; *p != '\0'; p++)
{
@ -4063,8 +4125,15 @@ readqf(e, openonly)
#endif /* _FFR_QUARANTINE */
case 'H': /* header */
/*
** count size before chompheader() destroys the line.
** this isn't accurate due to macro expansion, but
** better than before. "+3" to skip H?? at least.
*/
hdrsize += strlen(bp + 3);
(void) chompheader(&bp[1], CHHDR_QUEUE, NULL, e);
hdrsize += strlen(&bp[1]);
break;
case 'I': /* data file's inode number */
@ -4184,6 +4253,9 @@ readqf(e, openonly)
true);
if (q != NULL)
{
/* make sure we keep the current qgrp */
if (ISVALIDQGRP(e->e_qgrp))
q->q_qgrp = e->e_qgrp;
q->q_alias = ctladdr;
if (qfver >= 1)
q->q_flags &= ~Q_PINGFLAGS;
@ -4215,10 +4287,8 @@ readqf(e, openonly)
break;
syserr("Version number in queue file (%d) greater than max (%d)",
qfver, QF_VERSION);
(void) sm_io_close(qfp, SM_TIME_DEFAULT);
loseqfile(e, "unsupported queue file version");
RELEASE_QUEUE;
return false;
err = "unsupported queue file version";
goto fail;
/* NOTREACHED */
break;
@ -4260,10 +4330,8 @@ readqf(e, openonly)
default:
syserr("readqf: %s: line %d: bad line \"%s\"",
qf, LineNumber, shortenstring(bp, MAXSHORTSTR));
(void) sm_io_close(qfp, SM_TIME_DEFAULT);
loseqfile(e, "unrecognized line");
RELEASE_QUEUE;
return false;
err = "unrecognized line";
goto fail;
}
if (bp != buf)
@ -4328,6 +4396,24 @@ readqf(e, openonly)
RELEASE_QUEUE;
return true;
fail:
/*
** There was some error reading the qf file (reason is in err var.)
** Cleanup:
** close file; clear e_lockfp since it is the same as qfp,
** hence it is invalid (as file) after qfp is closed;
** the qf file is on disk, so set the flag to avoid calling
** queueup() with bogus data.
*/
if (qfp != NULL)
(void) sm_io_close(qfp, SM_TIME_DEFAULT);
e->e_lockfp = NULL;
e->e_flags |= EF_INQUEUE;
loseqfile(e, err);
RELEASE_QUEUE;
return false;
}
/*
** PRTSTR -- print a string, "unprintable" characters are shown as \oct
@ -4987,7 +5073,8 @@ queuename(e, type)
}
}
if (e->e_qdir == NOQDIR)
/* xf files always have a valid qd and qg picked above */
if (e->e_qdir == NOQDIR && type != XSCRPT_LETTER)
(void) sm_strlcpyn(buf, sizeof buf, 2, pref, e->e_id);
else
{
@ -6289,6 +6376,98 @@ upd_qs(e, delete, avail)
FILE_SYS_AVAIL(fidx) -= s;
}
#if _FFR_SELECT_SHM
static bool write_key_file __P((char *, long));
static long read_key_file __P((char *, long));
/*
** WRITE_KEY_FILE -- record some key into a file.
**
** Parameters:
** keypath -- file name.
** key -- key to write.
**
** Returns:
** true iff file could be written.
**
** Side Effects:
** writes file.
*/
static bool
write_key_file(keypath, key)
char *keypath;
long key;
{
bool ok;
long sff;
SM_FILE_T *keyf;
ok = false;
if (keypath == NULL || *keypath == '\0')
return ok;
sff = SFF_NOLINK|SFF_ROOTOK|SFF_REGONLY|SFF_CREAT;
if (TrustedUid != 0 && RealUid == TrustedUid)
sff |= SFF_OPENASROOT;
keyf = safefopen(keypath, O_WRONLY|O_TRUNC, 0644, sff);
if (keyf == NULL)
{
sm_syslog(LOG_ERR, NOQID, "unable to write %s: %s",
keypath, sm_errstring(errno));
}
else
{
ok = sm_io_fprintf(keyf, SM_TIME_DEFAULT, "%ld\n", key) !=
SM_IO_EOF;
ok = ok && (sm_io_close(keyf, SM_TIME_DEFAULT) != SM_IO_EOF);
}
return ok;
}
/*
** READ_KEY_FILE -- read a key from a file.
**
** Parameters:
** keypath -- file name.
** key -- default key.
**
** Returns:
** key.
*/
static long
read_key_file(keypath, key)
char *keypath;
long key;
{
int r;
long sff, n;
SM_FILE_T *keyf;
if (keypath == NULL || *keypath == '\0')
return key;
sff = SFF_NOLINK|SFF_ROOTOK|SFF_REGONLY;
if (TrustedUid != 0 && RealUid == TrustedUid)
sff |= SFF_OPENASROOT;
keyf = safefopen(keypath, O_RDONLY, 0644, sff);
if (keyf == NULL)
{
sm_syslog(LOG_ERR, NOQID, "unable to read %s: %s",
keypath, sm_errstring(errno));
}
else
{
r = sm_io_fscanf(keyf, SM_TIME_DEFAULT, "%ld", &n);
if (r == 1)
key = n;
(void) sm_io_close(keyf, SM_TIME_DEFAULT);
}
return key;
}
#endif /* _FFR_SELECT_SHM */
/*
** INIT_SHM -- initialize shared memory structure
**
@ -6316,9 +6495,17 @@ init_shm(qn, owner, hash)
unsigned int hash;
{
int i;
#if _FFR_SELECT_SHM
bool keyselect;
#endif /* _FFR_SELECT_SHM */
PtrFileSys = &FileSys[0];
PNumFileSys = &Numfilesys;
#if _FFR_SELECT_SHM
/* if this "key" is specified: select one yourself */
# define SEL_SHM_KEY ((key_t) -1)
# define FIRST_SHM_KEY 25
#endif /* _FFR_SELECT_SHM */
/* This allows us to disable shared memory at runtime. */
if (ShmKey != 0)
@ -6329,6 +6516,21 @@ init_shm(qn, owner, hash)
count = 0;
shms = SM_T_SIZE + qn * sizeof(QUEUE_SHM_T);
#if _FFR_SELECT_SHM
keyselect = ShmKey == SEL_SHM_KEY;
if (keyselect)
{
if (owner)
ShmKey = FIRST_SHM_KEY;
else
{
ShmKey = read_key_file(ShmKeyFile, ShmKey);
keyselect = false;
if (ShmKey == SEL_SHM_KEY)
goto error;
}
}
#endif /* _FFR_SELECT_SHM */
for (;;)
{
/* XXX: maybe allow read access for group? */
@ -6338,13 +6540,34 @@ init_shm(qn, owner, hash)
if (Pshm != NULL || save_errno != EEXIST)
break;
if (++count >= 3)
{
#if _FFR_SELECT_SHM
if (keyselect)
{
++ShmKey;
/* back where we started? */
if (ShmKey == SEL_SHM_KEY)
break;
continue;
}
#endif /* _FFR_SELECT_SHM */
break;
}
#if _FFR_SELECT_SHM
/* only sleep if we are at the first key */
if (!keyselect || ShmKey == SEL_SHM_KEY)
#endif /* _FFR_SELECT_SHM */
sleep(count);
}
if (Pshm != NULL)
{
int *p;
#if _FFR_SELECT_SHM
if (keyselect)
(void) write_key_file(ShmKeyFile, (long) ShmKey);
#endif /* _FFR_SELECT_SHM */
p = (int *) Pshm;
if (owner)
{
@ -6425,6 +6648,7 @@ setup_queues(owner)
{
int i, qn, len;
unsigned int hashval;
time_t now;
char basedir[MAXPATHLEN];
struct stat st;
@ -6494,8 +6718,11 @@ setup_queues(owner)
hashval = hash_q(basedir, hashval);
#endif /* SM_CONF_SHM */
/* initialize map for queue runs */
clrbitmap(DoQueueRun);
/* initialize for queue runs */
DoQueueRun = false;
now = curtime();
for (i = 0; i < NumQueue && Queue[i] != NULL; i++)
Queue[i]->qg_nextrun = now;
if (UseMSP && OpMode != MD_TEST)
@ -6645,9 +6872,9 @@ set_def_queueval(qg, all)
return;
if (all)
qg->qg_qdir = QueueDir;
#if 0
#if _FFR_QUEUE_GROUP_SORTORDER
qg->qg_sortorder = QueueSortOrder;
#endif /* 0 */
#endif /* _FFR_QUEUE_GROUP_SORTORDER */
qg->qg_maxqrun = all ? MaxRunnersPerQueue : -1;
qg->qg_nice = NiceQueueRun;
}
@ -6788,7 +7015,7 @@ makequeue(line, qdef)
qg->qg_maxrcpt = atoi(p);
break;
#if 0
#if _FFR_QUEUE_GROUP_SORTORDER
case 'S': /* queue sorting order */
switch (*p)
{
@ -6814,14 +7041,26 @@ makequeue(line, qdef)
case 'm': /* Modification time */
case 'M':
qgrp->qg_sortorder = QSO_BYMODTIME;
qg->qg_sortorder = QSO_BYMODTIME;
break;
case 'r': /* Random */
case 'R':
qg->qg_sortorder = QSO_RANDOM;
break;
# if _FFR_RHS
case 's': /* Shuffled host name */
case 'S':
qg->qg_sortorder = QSO_BYSHUFFLE;
break;
# endif /* _FFR_RHS */
default:
syserr("Invalid queue sort order \"%s\"", p);
}
break;
#endif /* 0 */
#endif /* _FFR_QUEUE_GROUP_SORTORDER */
default:
syserr("Q%s: unknown queue equate %c=",
@ -7117,12 +7356,16 @@ makeworkgroups()
dir = 1;
}
if (WorkGrp[j].wg_qgs == NULL)
WorkGrp[j].wg_qgs = (QUEUEGRP **)sm_malloc(sizeof(QUEUEGRP *) *
(WorkGrp[j].wg_numqgrp + 1));
else
WorkGrp[j].wg_qgs = (QUEUEGRP **)sm_realloc(WorkGrp[j].wg_qgs,
sizeof(QUEUEGRP *) *
(WorkGrp[j].wg_numqgrp + 1));
if (WorkGrp[j].wg_qgs == NULL)
{
syserr("@cannot allocate memory for work queues, need %d bytes",
syserr("!cannot allocate memory for work queues, need %d bytes",
(int) (sizeof(QUEUEGRP *) *
(WorkGrp[j].wg_numqgrp + 1)));
}
@ -7203,7 +7446,15 @@ dup_df(old, new)
char opath[MAXPATHLEN];
char npath[MAXPATHLEN];
SM_REQUIRE(bitset(EF_HAS_DF, old->e_flags));
if (!bitset(EF_HAS_DF, old->e_flags))
{
/*
** this can happen if: SuperSafe != True
** and a bounce mail is sent that is split.
*/
queueup(old, false, true);
}
SM_REQUIRE(ISVALIDQGRP(old->e_qgrp) && ISVALIDQDIR(old->e_qdir));
SM_REQUIRE(ISVALIDQGRP(new->e_qgrp) && ISVALIDQDIR(new->e_qdir));
@ -7305,6 +7556,11 @@ split_env(e, sendqueue, qgrp, qdir)
ee->e_lockfp = NULL;
if (e->e_xfp != NULL)
ee->e_xfp = sm_io_dup(e->e_xfp);
/* failed to dup e->e_xfp, start a new transcript */
if (ee->e_xfp == NULL)
openxscript(ee);
ee->e_qgrp = ee->e_dfqgrp = qgrp;
ee->e_qdir = ee->e_dfqdir = qdir;
ee->e_errormode = EM_MAIL;
@ -7317,7 +7573,7 @@ split_env(e, sendqueue, qgrp, qdir)
/*
** XXX Not sure if this copying is necessary.
** sendall() does this copying, but I don't know if that is
** sendall() does this copying, but I (dm) don't know if that is
** because of the storage management discipline we were using
** before rpools were introduced, or if it is because these lists
** can be modified later.
@ -7444,6 +7700,8 @@ split_across_queue_groups(e)
if (q->q_mailer != NULL &&
ISVALIDQGRP(q->q_mailer->m_qgrp))
q->q_qgrp = q->q_mailer->m_qgrp;
else if (ISVALIDQGRP(e->e_qgrp))
q->q_qgrp = e->e_qgrp;
else
q->q_qgrp = 0;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2002 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.594 2001/12/14 00:43:17 gshapiro Exp $")
SM_RCSID("@(#)$Id: readcf.c,v 8.604 2002/04/02 16:43:25 ca Exp $")
#if NETINET || NETINET6
# include <arpa/inet.h>
@ -24,7 +24,7 @@ SM_RCSID("@(#)$Id: readcf.c,v 8.594 2001/12/14 00:43:17 gshapiro Exp $")
#define HOUR * 3600
#define HOURS HOUR
static void fileclass __P((int, char *, char *, bool, bool));
static void fileclass __P((int, char *, char *, bool, bool, bool));
static char **makeargv __P((char *));
static void settimeout __P((char *, char *, bool));
static void toomany __P((int, int));
@ -96,6 +96,7 @@ readcf(cfname, safe, e)
char *file;
bool optional;
bool ok;
bool ismap;
int mid;
register char *p;
long sff = SFF_OPENASROOT;
@ -458,7 +459,22 @@ readcf(cfname, safe, e)
else
optional = false;
if (*p == '@')
/* check if [key]@map:spec */
ismap = false;
if (!SM_IS_DIR_DELIM(*p) &&
*p != '|' &&
(q = strchr(p, '@')) != NULL)
{
q++;
/* look for @LDAP or @map: in string */
if (strcmp(q, "LDAP") == 0 ||
(*q != ':' &&
strchr(q, ':') != NULL))
ismap = true;
}
if (ismap)
{
/* use entire spec */
file = p;
@ -473,7 +489,7 @@ readcf(cfname, safe, e)
}
}
if (*file == '|' || *file == '@')
if (*file == '|' || ismap)
p = "%s";
else
{
@ -487,7 +503,7 @@ readcf(cfname, safe, e)
continue;
}
}
fileclass(mid, file, p, safe, optional);
fileclass(mid, file, p, ismap, safe, optional);
break;
#if XLA
@ -754,6 +770,7 @@ toomany(id, maxcnt)
** class -- class to define.
** filename -- name of file to read.
** fmt -- scanf string to use for match.
** ismap -- if set, this is a map lookup.
** safe -- if set, this is a safe read.
** optional -- if set, it is not an error for the file to
** not exist.
@ -798,10 +815,11 @@ parse_class_words(class, line)
}
static void
fileclass(class, filename, fmt, safe, optional)
fileclass(class, filename, fmt, ismap, safe, optional)
int class;
char *filename;
char *fmt;
bool ismap;
bool safe;
bool optional;
{
@ -819,8 +837,7 @@ fileclass(class, filename, fmt, safe, optional)
syserr("fileclass: missing file name");
return;
}
else if (!SM_IS_DIR_DELIM(*filename) && *filename != '|' &&
(p = strchr(filename, '@')) != NULL)
else if (ismap)
{
int status = 0;
char *key;
@ -833,6 +850,15 @@ fileclass(class, filename, fmt, safe, optional)
key = filename;
/* skip past key */
if ((p = strchr(filename, '@')) == NULL)
{
/* should not happen */
syserr("fileclass: bogus map specification");
sm_free(mn);
return;
}
/* skip past '@' */
*p++ = '\0';
cl = p;
@ -901,6 +927,11 @@ fileclass(class, filename, fmt, safe, optional)
map.map_mname = mn;
map.map_mflags |= MF_FILECLASS;
if (tTd(37, 5))
sm_dprintf("fileclass: F{%s}: map class %s, key %s, spec %s\n",
mn, cl, key, spec);
/* parse map spec */
if (!map.map_class->map_parse(&map, spec))
{
@ -1082,6 +1113,7 @@ makemailer(line)
return;
}
m->m_name = newstr(line);
m->m_qgrp = NOQGRP;
/* now scan through and assign info from the fields */
while (*p != '\0')
@ -2064,6 +2096,10 @@ static struct optioninfo
# define O_SOFTBOUNCE 0xcf
{ "SoftBounce", O_SOFTBOUNCE, OI_NONE },
#endif /* _FFR_SOFT_BOUNCE */
#if _FFR_SELECT_SHM
# define O_SHMKEYFILE 0xd0
{ "SharedMemoryKeyFile", O_SHMKEYFILE, OI_NONE },
#endif /* _FFR_SELECT_SHM */
{ NULL, '\0', OI_NONE }
};
@ -2729,6 +2765,9 @@ setoption(opt, val, safe, sticky, e)
break;
#if _FFR_QUEUE_GROUP_SORTORDER
/* coordinate this with makequeue() */
#endif /* _FFR_QUEUE_GROUP_SORTORDER */
case O_QUEUESORTORD: /* queue sorting order */
switch (*val)
{
@ -2849,6 +2888,17 @@ setoption(opt, val, safe, sticky, e)
break;
case O_SAFEFILEENV: /* chroot() environ for writing to files */
if (*val == '\0')
break;
/* strip trailing slashes */
p = val + strlen(val) - 1;
while (p >= val && *p == '/')
*p-- = '\0';
if (*val == '\0')
break;
SafeFileEnv = newstr(val);
break;
@ -2896,6 +2946,19 @@ setoption(opt, val, safe, sticky, e)
#endif /* SM_CONF_SHM */
break;
#if _FFR_SELECT_SHM
case O_SHMKEYFILE: /* shared memory key file */
# if SM_CONF_SHM
CANONIFY(val);
ShmKeyFile = newstr(val);
# else /* SM_CONF_SHM */
(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
"Warning: Option: %s requires shared memory support (-DSM_CONF_SHM)\n",
OPTNAME);
# endif /* SM_CONF_SHM */
break;
#endif /* _FFR_SELECT_SHM */
#if _FFR_MAX_FORWARD_ENTRIES
case O_MAXFORWARD: /* max # of forward entries */
MaxForwardEntries = atoi(val);
@ -4128,6 +4191,7 @@ inittimeouts(val, sticky)
{
TimeOuts.to_connect = (time_t) 0 SECONDS;
TimeOuts.to_aconnect = (time_t) 0 SECONDS;
TimeOuts.to_iconnect = (time_t) 0 SECONDS;
TimeOuts.to_initial = (time_t) 5 MINUTES;
TimeOuts.to_helo = (time_t) 5 MINUTES;
TimeOuts.to_mail = (time_t) 10 MINUTES;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 2001-2002 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@ -8,9 +8,10 @@
*
*/
#if SASL
#include <sm/gen.h>
SM_RCSID("@(#)$Id: sasl.c,v 8.11 2001/09/11 04:05:16 gshapiro Exp $")
SM_RCSID("@(#)$Id: sasl.c,v 8.12 2002/01/21 02:28:05 gshapiro Exp $")
#if SASL
# include <stdlib.h>
# include <sendmail.h>
# include <errno.h>

View File

@ -48,7 +48,7 @@
#ifdef _DEFINE
# ifndef lint
SM_UNUSED(static char SmailId[]) = "@(#)$Id: sendmail.h,v 8.902 2002/01/09 00:10:11 ca Exp $";
SM_UNUSED(static char SmailId[]) = "@(#)$Id: sendmail.h,v 8.912 2002/04/02 16:43:26 ca Exp $";
# endif /* ! lint */
#endif /* _DEFINE */
@ -444,7 +444,10 @@ struct mailer
extern void initerrmailers __P((void));
extern void makemailer __P((char *));
extern void makequeue __P((char *, bool));
extern void runqueueevent __P((int));
extern void runqueueevent __P((void));
#if _FFR_QUEUE_RUN_PARANOIA
extern bool checkqueuerunner __P((void));
#endif /* _FFR_QUEUE_RUN_PARANOIA */
EXTERN MAILER *FileMailer; /* ptr to *file* mailer */
EXTERN MAILER *InclMailer; /* ptr to *include* mailer */
@ -500,8 +503,11 @@ struct queuegrp
int qg_curnum; /* current number of queue for queue runs */
int qg_maxrcpt; /* max recipients per envelope, 0==no limit */
#if 0
time_t qg_nextrun; /* time for next queue runs */
#if _FFR_QUEUE_GROUP_SORTORDER
short qg_sortorder; /* how do we sort this queuerun */
#endif /* _FFR_QUEUE_GROUP_SORTORDER */
#if 0
long qg_wkrcptfact; /* multiplier for # recipients -> priority */
long qg_qfactor; /* slope of queue function */
bool qg_doqueuerun; /* XXX flag is it time to do a queuerun */
@ -657,7 +663,7 @@ MCI
#define MCIF_SIZE 0x00000020 /* SIZE option supported */
#define MCIF_8BITMIME 0x00000040 /* BODY=8BITMIME supported */
#define MCIF_7BIT 0x00000080 /* strip this message to 7 bits */
#define MCIF_MULTSTAT 0x00000100 /* MAIL11V3: handles MULT status */
/* 0x00000100 unused, was MCIF_MULTSTAT: MAIL11V3: handles MULT status */
#define MCIF_INHEADER 0x00000200 /* currently outputing header */
#define MCIF_CVT8TO7 0x00000400 /* convert from 8 to 7 bits */
#define MCIF_DSN 0x00000800 /* DSN extension supported */
@ -1493,6 +1499,7 @@ extern void set_delivery_mode __P((int, ENVELOPE *));
#define PXLF_MAPFROM 0x0001 /* map From_ to >From_ */
#define PXLF_STRIP8BIT 0x0002 /* strip 8th bit */
#define PXLF_HEADER 0x0004 /* map newlines in headers */
#define PXLF_NOADDEOL 0x0008 /* if EOL not present, don't add one */
/*
** Privacy flags
@ -1607,11 +1614,18 @@ extern char *validate_connection __P((SOCKADDR *, char *, ENVELOPE *));
#endif /* NETINET || NETINET6 || NETUNIX || NETISO || NETNS || NETX25 */
#if MILTER
/*
** Mail Filters (milter)
*/
/*
** 32-bit type used by milter
** (needed by libmilter even if MILTER isn't defined)
*/
typedef SM_INT32 mi_int32;
#if MILTER
# define SMFTO_WRITE 0 /* Timeout for sending information */
# define SMFTO_READ 1 /* Timeout waiting for a response */
# define SMFTO_EOM 2 /* Timeout for ACK/NAK to EOM */
@ -1623,9 +1637,9 @@ struct milter
{
char *mf_name; /* filter name */
BITMAP256 mf_flags; /* MTA flags */
unsigned long mf_fvers; /* filter version */
unsigned long mf_fflags; /* filter flags */
unsigned long mf_pflags; /* protocol flags */
mi_int32 mf_fvers; /* filter version */
mi_int32 mf_fflags; /* filter flags */
mi_int32 mf_pflags; /* protocol flags */
char *mf_conn; /* connection info */
int mf_sock; /* connected socket */
char mf_state; /* state of filter */
@ -1655,13 +1669,6 @@ extern void setup_daemon_milters __P(());
# endif /* _FFR_MILTER_PERDAEMON */
#endif /* MILTER */
/*
** 32-bit type used by milter
** (needed by libmilter even if MILTER isn't defined)
*/
typedef SM_INT32 mi_int32;
/*
** Vendor codes
**
@ -2170,6 +2177,9 @@ EXTERN gid_t RunAsGid; /* GID to become for bulk of run */
EXTERN gid_t EffGid; /* effective gid */
#if SM_CONF_SHM
EXTERN key_t ShmKey; /* shared memory key */
# if _FFR_SELECT_SHM
EXTERN char *ShmKeyFile; /* shared memory key file */
# endif /* _FFR_SELECT_SHM */
#endif /* SM_CONF_SHM */
EXTERN pid_t CurrentPid; /* current process id */
EXTERN pid_t DaemonPid; /* process id of daemon */
@ -2313,6 +2323,7 @@ extern void sendall __P((ENVELOPE *, int));
# define STATS_QUARANTINE 'q'
#endif /* _FFR_QUARANTINE */
#define STATS_REJECT 'r'
#define STATS_CONNECT 'c'
extern void markstats __P((ENVELOPE *, ADDRESS *, int));
extern void clearstats __P((void));

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2002 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.86 2001/09/11 04:05:16 gshapiro Exp $")
SM_RCSID("@(#)$Id: sfsasl.c,v 8.89 2002/02/22 04:41:28 ca Exp $")
#include <stdlib.h>
#include <sendmail.h>
#include <errno.h>
@ -270,6 +270,7 @@ sasl_write(fp, buf, size)
{
while (outlen > 0)
{
/* XXX result == 0? */
ret = sm_io_write(so->fp, SM_TIME_DEFAULT,
&outbuf[total], outlen);
outlen -= ret;
@ -552,12 +553,14 @@ tls_read(fp, buf, size)
}
if (err != NULL)
{
int save_errno;
save_errno = (errno == 0) ? EIO : errno;
again = MAX_TLS_IOS;
if (errno == 0)
errno = EIO;
if (LogLevel > 7)
sm_syslog(LOG_WARNING, NOQID,
"STARTTLS: read error=%s (%d)", err, r);
errno = save_errno;
}
return r;
}
@ -636,12 +639,14 @@ tls_write(fp, buf, size)
}
if (err != NULL)
{
int save_errno;
save_errno = (errno == 0) ? EIO : errno;
again = MAX_TLS_IOS;
if (errno == 0)
errno = EIO;
if (LogLevel > 7)
sm_syslog(LOG_WARNING, NOQID,
"STARTTLS: write error=%s (%d)", err, r);
errno = save_errno;
}
return r;
}

View File

@ -16,7 +16,7 @@
# include <libmilter/mfdef.h>
#endif /* MILTER */
SM_RCSID("@(#)$Id: srvrsmtp.c,v 8.814 2002/01/08 00:56:22 ca Exp $")
SM_RCSID("@(#)$Id: srvrsmtp.c,v 8.819 2002/04/02 03:51:02 ca Exp $")
#if SASL || STARTTLS
# include <sys/time.h>
@ -172,22 +172,22 @@ static char *CurSmtpClient; /* who's at the other end of channel */
#ifndef MAXBADCOMMANDS
# define MAXBADCOMMANDS 25 /* maximum number of bad commands */
#endif
#endif /* ! MAXBADCOMMANDS */
#ifndef MAXNOOPCOMMANDS
# define MAXNOOPCOMMANDS 20 /* max "noise" commands before slowdown */
#endif
#endif /* ! MAXNOOPCOMMANDS */
#ifndef MAXHELOCOMMANDS
# define MAXHELOCOMMANDS 3 /* max HELO/EHLO commands before slowdown */
#endif
#endif /* ! MAXHELOCOMMANDS */
#ifndef MAXVRFYCOMMANDS
# define MAXVRFYCOMMANDS 6 /* max VRFY/EXPN commands before slowdown */
#endif
#endif /* ! MAXVRFYCOMMANDS */
#ifndef MAXETRNCOMMANDS
# define MAXETRNCOMMANDS 8 /* max ETRN commands before slowdown */
#endif
#endif /* ! MAXETRNCOMMANDS */
#ifndef MAXTIMEOUT
# define MAXTIMEOUT (4 * 60) /* max timeout for bad commands */
#endif
#endif /* ! MAXTIMEOUT */
#if SM_HEAP_CHECK
static SM_DEBUG_T DebugLeakSmtp = SM_DEBUG_INITIALIZER("leak_smtp",
@ -613,7 +613,7 @@ smtp(nullserver, d_flags, e)
case SMFIR_REJECT:
if (MilterLogLevel > 3)
sm_syslog(LOG_INFO, e->e_id,
"Milter: inititalization failed, rejecting commands");
"Milter: initialization failed, rejecting commands");
greetcode = "554";
nullserver = "Command rejected";
smtp.sm_milterize = false;
@ -622,7 +622,7 @@ smtp(nullserver, d_flags, e)
case SMFIR_TEMPFAIL:
if (MilterLogLevel > 3)
sm_syslog(LOG_INFO, e->e_id,
"Milter: inititalization failed, temp failing commands");
"Milter: initialization failed, temp failing commands");
tempfail = true;
smtp.sm_milterize = false;
break;
@ -1727,7 +1727,6 @@ smtp(nullserver, d_flags, e)
** remember to update 'helpfile'
*/
message("250-ENHANCEDSTATUSCODES");
#if PIPELINING
if (bitset(SRV_OFFER_PIPE, features))
@ -1858,7 +1857,10 @@ smtp(nullserver, d_flags, e)
/* do the processing */
SM_TRY
{
extern char *FullName;
QuickAbort = true;
SM_FREE_CLR(FullName);
/* must parse sender first */
delimptr = NULL;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2002 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: stats.c,v 8.52 2001/11/21 13:39:14 gshapiro Exp $")
SM_RCSID("@(#)$Id: stats.c,v 8.54 2002/03/19 00:23:28 gshapiro Exp $")
#include <sendmail/mailstats.h>
@ -65,10 +65,16 @@ markstats(e, to, type)
Stat.stat_cr++;
break;
case STATS_CONNECT:
if (to == NULL)
Stat.stat_cf++;
else
Stat.stat_ct++;
break;
case STATS_NORMAL:
if (to == NULL)
{
Stat.stat_cf++;
if (e->e_from.q_mailer != NULL)
{
Stat.stat_nf[e->e_from.q_mailer->m_mno]++;
@ -78,7 +84,6 @@ markstats(e, to, type)
}
else
{
Stat.stat_ct++;
Stat.stat_nt[to->q_mailer->m_mno]++;
Stat.stat_bt[to->q_mailer->m_mno] += KBYTES(e->e_msgsize);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 2000-2002 Sendmail, Inc. and its suppliers.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set
@ -10,7 +10,7 @@
#include <sendmail.h>
SM_RCSID("@(#)$Id: tls.c,v 8.75 2001/09/11 04:05:17 gshapiro Exp $")
SM_RCSID("@(#)$Id: tls.c,v 8.79 2002/03/21 22:24:13 gshapiro Exp $")
#if STARTTLS
# include <openssl/err.h>
@ -26,9 +26,18 @@ SM_RCSID("@(#)$Id: tls.c,v 8.75 2001/09/11 04:05:17 gshapiro Exp $")
static RSA *rsa_tmp = NULL; /* temporary RSA key */
static RSA *tmp_rsa_key __P((SSL *, int, int));
# endif /* !TLS_NO_RSA */
# if !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x00907000L
static int tls_verify_cb __P((X509_STORE_CTX *));
# else /* !defined() || OPENSSL_VERSION_NUMBER < 0x00907000L */
static int tls_verify_cb __P((X509_STORE_CTX *, void *));
# endif /* !defined() || OPENSSL_VERSION_NUMBER < 0x00907000L */
static void apps_ssl_info_cb __P((SSL *, int , int));
# if !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x00907000L
# define CONST097
# else /* !defined() || OPENSSL_VERSION_NUMBER < 0x00907000L */
# define CONST097 const
# endif /* !defined() || OPENSSL_VERSION_NUMBER < 0x00907000L */
static void apps_ssl_info_cb __P((CONST097 SSL *, int , int));
# if !NO_DH
static DH *get_dh512 __P((void));
@ -139,6 +148,8 @@ tls_rand_init(randfile, logl)
| SFF_NOGWFILES | SFF_NOWWFILES
| SFF_NOGRFILES | SFF_NOWRFILES
| SFF_MUSTOWN | SFF_ROOTOK | SFF_OPENASROOT;
if (DontLockReadFiles)
sff |= SFF_NOLOCK;
if ((fd = safeopen(randfile, O_RDONLY, 0, sff)) >= 0)
{
if (fstat(fd, &st) < 0)
@ -1308,7 +1319,7 @@ tmp_rsa_key(s, export, keylength)
static void
apps_ssl_info_cb(s, where, ret)
SSL *s;
CONST097 SSL *s;
int where;
int ret;
{
@ -1420,8 +1431,14 @@ tls_verify_log(ok, ctx)
*/
static int
# if !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x00907000L
tls_verify_cb(ctx)
X509_STORE_CTX *ctx;
# else /* !defined() || OPENSSL_VERSION_NUMBER < 0x00907000L */
tls_verify_cb(ctx, unused)
X509_STORE_CTX *ctx;
void *unused;
# endif /* !defined() || OPENSSL_VERSION_NUMBER < 0x00907000L */
{
int ok;

View File

@ -13,7 +13,7 @@
#include <sendmail.h>
SM_RCSID("@(#)$Id: usersmtp.c,v 8.428 2002/01/08 00:56:23 ca Exp $")
SM_RCSID("@(#)$Id: usersmtp.c,v 8.431 2002/04/03 00:23:25 gshapiro Exp $")
#include <sysexits.h>
@ -73,6 +73,7 @@ smtpinit(m, mci, e, onlyhelo)
bool onlyhelo;
{
register int r;
int state;
register char *p;
register char *hn;
char *enhsc;
@ -93,6 +94,7 @@ smtpinit(m, mci, e, onlyhelo)
if (CurHostName == NULL)
CurHostName = MyHostName;
SmtpNeedIntro = true;
state = mci->mci_state;
switch (mci->mci_state)
{
case MCIS_MAIL:
@ -115,7 +117,7 @@ smtpinit(m, mci, e, onlyhelo)
/* FALLTHROUGH */
case MCIS_CLOSED:
syserr("451 4.4.0 smtpinit: state CLOSED");
syserr("451 4.4.0 smtpinit: state CLOSED (was %d)", state);
return;
case MCIS_OPENING:
@ -1903,15 +1905,11 @@ smtpmailfrom(m, mci, e)
{
/* communications failure */
mci_setstat(mci, EX_TEMPFAIL, "4.4.2", NULL);
smtpquit(m, mci, e);
return EX_TEMPFAIL;
}
else if (r == SMTPCLOSING)
{
/* service shutting down */
mci_setstat(mci, EX_TEMPFAIL, ENHSCN(enhsc, "4.5.0"),
SmtpReplyBuffer);
smtpquit(m, mci, e);
/* service shutting down: handled by reply() */
return EX_TEMPFAIL;
}
else if (REPLYTYPE(r) == 4)
@ -2307,6 +2305,7 @@ smtpdata(m, mci, e, ctladdr, xstart)
r = reply(m, mci, e, TimeOuts.to_datainit, NULL, &enhsc);
if (r < 0 || REPLYTYPE(r) == 4)
{
if (r >= 0)
smtpquit(m, mci, e);
errno = mci->mci_errno;
return EX_TEMPFAIL;
@ -2458,10 +2457,7 @@ smtpdata(m, mci, e, ctladdr, xstart)
return EX_OK;
r = reply(m, mci, e, TimeOuts.to_datafinal, NULL, &enhsc);
if (r < 0)
{
smtpquit(m, mci, e);
return EX_TEMPFAIL;
}
mci->mci_state = MCIS_OPEN;
xstat = EX_NOTSTICKY;
if (r == 452)
@ -2567,10 +2563,7 @@ smtpgetstat(m, mci, e)
/* check for the results of the transaction */
r = reply(m, mci, e, TimeOuts.to_datafinal, NULL, &enhsc);
if (r < 0)
{
smtpquit(m, mci, e);
return EX_TEMPFAIL;
}
xstat = EX_NOTSTICKY;
if (REPLYTYPE(r) == 4)
status = EX_TEMPFAIL;
@ -2624,6 +2617,9 @@ smtpquit(m, mci, e)
int rcode;
char *oldcurhost;
if (mci->mci_state == MCIS_CLOSED)
return;
oldcurhost = CurHostName;
CurHostName = mci->mci_host; /* XXX UGLY XXX */
if (CurHostName == NULL)
@ -2646,15 +2642,12 @@ smtpquit(m, mci, e)
if (mci->mci_state != MCIS_ERROR &&
mci->mci_state != MCIS_QUITING)
{
int origstate = mci->mci_state;
SmtpPhase = "client QUIT";
mci->mci_state = MCIS_QUITING;
smtpmessage("QUIT", m, mci);
(void) reply(m, mci, e, TimeOuts.to_quit, NULL, NULL);
SuprErrs = oldSuprErrs;
if (mci->mci_state == MCIS_CLOSED ||
origstate == MCIS_CLOSED)
if (mci->mci_state == MCIS_CLOSED)
goto end;
}
@ -2729,9 +2722,8 @@ smtprset(m, mci, e)
smtpmessage("RSET", m, mci);
r = reply(m, mci, e, TimeOuts.to_rset, NULL, NULL);
if (r < 0)
mci->mci_state = MCIS_ERROR;
else
{
return;
/*
** Any response is deemed to be acceptable.
** The standard does not state the proper action
@ -2743,9 +2735,6 @@ smtprset(m, mci, e)
if (mci->mci_state != MCIS_SSD)
mci->mci_state = MCIS_OPEN;
return;
}
smtpquit(m, mci, e);
}
/*
** SMTPPROBE -- check the connection state
@ -2777,7 +2766,7 @@ smtpprobe(mci)
SmtpPhase = "client probe";
smtpmessage("RSET", m, mci);
r = reply(m, mci, e, TimeOuts.to_miscshort, NULL, NULL);
if (r < 0 || REPLYTYPE(r) != 2)
if (REPLYTYPE(r) != 2)
smtpquit(m, mci, e);
return r;
}
@ -2853,6 +2842,15 @@ reply(m, mci, e, timeout, pfunc, enhstat)
{
if (mci->mci_errno == 0)
mci->mci_errno = EBADF;
/* errors on QUIT should be ignored */
if (strncmp(SmtpMsgBuffer, "QUIT", 4) == 0)
{
errno = mci->mci_errno;
return -1;
}
mci->mci_state = MCIS_ERROR;
smtpquit(m, mci, e);
errno = mci->mci_errno;
return -1;
}
@ -2870,6 +2868,10 @@ reply(m, mci, e, timeout, pfunc, enhstat)
bool oldholderrs;
extern char MsgBuf[];
/* errors on QUIT should be ignored */
if (strncmp(SmtpMsgBuffer, "QUIT", 4) == 0)
return -1;
/* if the remote end closed early, fake an error */
errno = save_errno;
if (errno == 0)
@ -2890,9 +2892,6 @@ reply(m, mci, e, timeout, pfunc, enhstat)
HoldErrs = true;
usrerr("451 4.4.1 reply: read error from %s",
CURHOSTNAME);
/* errors on QUIT should not be persistent */
if (strncmp(SmtpMsgBuffer, "QUIT", 4) != 0)
mci_setstat(mci, EX_TEMPFAIL, "4.4.2", MsgBuf);
/* if debugging, pause so we can see state */
@ -2993,7 +2992,8 @@ reply(m, mci, e, timeout, pfunc, enhstat)
(void) sm_strlcpy(SmtpError, SmtpReplyBuffer, sizeof SmtpError);
/* reply code 421 is "Service Shutting Down" */
if (r == SMTPCLOSING && mci->mci_state != MCIS_SSD)
if (r == SMTPCLOSING && mci->mci_state != MCIS_SSD &&
mci->mci_state != MCIS_QUITING)
{
/* send the quit protocol */
mci->mci_state = MCIS_SSD;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1998-2002 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.357 2001/11/28 19:19:27 gshapiro Exp $")
SM_RCSID("@(#)$Id: util.c,v 8.360 2002/04/04 21:32:15 gshapiro Exp $")
#include <sysexits.h>
#include <sm/xtrap.h>
@ -905,6 +905,7 @@ putline(l, mci)
** PXLF_MAPFROM -- map From_ to >From_.
** PXLF_STRIP8BIT -- strip 8th bit.
** PXLF_HEADER -- map bare newline in header to newline space.
** PXLF_NOADDEOL -- don't add an EOL if one wasn't present.
**
** Returns:
** none
@ -938,10 +939,15 @@ putxline(l, len, mci, pxflags)
end = l + len;
do
{
bool noeol = false;
/* find the end of the line */
p = memchr(l, '\n', end - l);
if (p == NULL)
{
p = end;
noeol = true;
}
if (TrafficLogFile != NULL)
(void) sm_io_fprintf(TrafficLogFile, SM_TIME_DEFAULT,
@ -1097,7 +1103,8 @@ putxline(l, len, mci, pxflags)
if (TrafficLogFile != NULL)
(void) sm_io_putc(TrafficLogFile, SM_TIME_DEFAULT,
'\n');
if (sm_io_fputs(mci->mci_out, SM_TIME_DEFAULT,
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
@ -1711,7 +1718,7 @@ dumpfd(fd, printclosed, logit)
return;
}
i = fcntl(fd, F_GETFL, NULL);
i = fcntl(fd, F_GETFL, 0);
if (i != -1)
{
(void) sm_snprintf(p, SPACELEFT(buf, p), "fl=0x%x, ", i);

View File

@ -13,6 +13,6 @@
#include <sm/gen.h>
SM_RCSID("@(#)$Id: version.c,v 8.91 2002/01/13 18:23:00 ca Exp $")
SM_RCSID("@(#)$Id: version.c,v 8.99 2002/04/04 22:20:06 ca Exp $")
char Version[] = "8.12.2";
char Version[] = "8.12.3";

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.
* Copyright (c) 1999-2002 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1987, 1993
* The Regents of the University of California. All rights reserved.
@ -20,7 +20,7 @@ SM_IDSTR(copyright,
The Regents of the University of California. All rights reserved.\n\
Copyright (c) 1983 Eric P. Allman. All rights reserved.\n")
SM_IDSTR(id, "@(#)$Id: vacation.c,v 8.131 2001/12/12 00:02:42 gshapiro Exp $")
SM_IDSTR(id, "@(#)$Id: vacation.c,v 8.134 2002/03/01 20:45:00 ca Exp $")
#include <ctype.h>
@ -319,7 +319,7 @@ main(argc, argv)
SM_CF_OPT_T mbdbname;
SM_MBDB_T user;
cfpath = getcfname(0, 0, SM_GET_SENDMAIL_CF, NULL);
cfpath = getcfname(0, 0, SM_GET_SENDMAIL_CF, cfpath);
mbdbname.opt_name = "MailboxDatabase";
mbdbname.opt_val = "pw";
(void) sm_cf_getopt(cfpath, 1, &mbdbname);
@ -370,6 +370,15 @@ main(argc, argv)
RunAsGid = user_info.smdbu_group_id = getegid();
sff |= SFF_OPENASROOT;
}
if (getuid() == 0)
{
/* Allow root to initialize user's vacation databases */
sff |= SFF_OPENASROOT|SFF_ROOTOK;
/* ... safely */
sff |= SFF_NOSLINK|SFF_NOHLINK|SFF_REGONLY;
}
result = smdb_open_database(&Db, dbfilename,
O_CREAT|O_RDWR | (iflag ? O_TRUNC : 0),