Import sendmail-8.8.8

Obtained from: ftp.sendmail.org
This commit is contained in:
Peter Wemm 1997-11-10 01:58:17 +00:00
parent e54babdf0c
commit ff37c899d7
30 changed files with 588 additions and 298 deletions

View File

@ -1,11 +1,150 @@
SENDMAIL RELEASE NOTES
@(#)RELEASE_NOTES 8.8.7.7 (Berkeley) 8/3/97
@(#)RELEASE_NOTES 8.8.8.4 (Berkeley) 10/24/97
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.8.8/8.8.8 97/10/24
If the check_relay ruleset failed, the relay= field was logged
incorrectly. Problem noted by Kari Hurtta of the Finnish
Meteorological Institute.
If /usr/tmp/dead.letter already existed, sendmail could not
add additional bounces to it. Problem noted by Thomas J.
Arseneault of SRI International.
If an SMTP mailer used a non-standard port number for the outgoing
connection, it would be displayed incorrectly in verbose mode.
Problem noted by John Kennedy of Cal State University, Chico.
Log the ETRN parameter specified by the client before altering them
to internal form. Suggested by Bob Kupiec of GES-Verio.
EXPN and VRFY SMTP commands on malformed addresses were logging as
User unknown with bogus delay= values. Change them to log
the same as compliant addresses. Problem noted by Kari E.
Hurtta of the Finnish Meteorological Institute.
Ignore the debug resolver option unless using sendmail debug trace
option for resolver. Problem noted by Greg Nichols of Wind
River Systems.
If SingleThreadDelivery was enabled and the remote server returned a
protocol error on the DATA command, the connection would be
closed but the persistent host status file would not be
unlocked so other sendmail processes could not deliver to
that host. Problem noted by Peter Wemm of DIALix.
If queueing up a message due to an expensive mailer, don't increment
the number of delivery attempts or set the last delivery
attempt time so the message will be delivered on the next
queue run regardless of MinQueueAge. Problem noted by
Brian J. Coan of the Institute for Global Communications.
Authentication warnings of "Processed from queue _directory_" and
"Processed by _username_ with -C _filename_" would be logged
with the incorrect timestamp. Problem noted by Kari E. Hurtta
of the Finnish Meteorological Institute.
Use a better heuristic for detecting GDBM.
Log null connections on dropped connections. Problem noted by
Jon Lewis of Florida Digital Turnpike.
If class dbm maps are rebuilt, sendmail will now detect this and
reopen the map. Previously, they could give stale
results during a single message processing (but would
recover when the next message was received). Fix from
Joe Pruett of Q7 Enterprises.
Do not log failures such as "User unknown" on -bv or SMTP VRFY
requests. Problem noted by Kari E. Hurtta of the
Finnish Meteorological Institute.
Do not send a bounce message back to the sender regarding bad
recipients if the SMTP connection is dropped before the
message is accepted. Problem noted by Kari E. Hurtta of the
Finnish Meteorological Institute.
Use "localhost" instead of "[UNIX: localhost]" when connecting to
sendmail via a UNIX pipe. This will allow rulesets using
$&{client_name} to process without sending the string through
dequote. Problem noted by Alan Barrett of Internet Africa.
A combination of deferred delivery mode, a double bounce situation,
and the inability to save a bounce message to
/var/tmp/dead.letter would cause sendmail to send a bounce
to postmaster but not remove the offending envelope from the
queue causing it to create a new bounce message each time the
queue was run. Problem noted by Brad Doctor of Net Daemons
Associates.
Remove newlines from hostname information returned via DNS. There are
no known security implications of newlines in hostnames as
sendmail filters newlines in all vital areas; however, this
could cause confusing error messages.
Starting with sendmail 8.8.6, mail sent with the '-t' option would be
rejected if any of the specified addresses were bad. This
behavior was modified to only reject the bad addresses and not
the entire message. Problem noted by Jozsef Hollosi of
SuperNet, Inc.
Use Timeout.fileopen when delivering mail to a file. Suggested by
Bryan Costales of InfoBeat, Inc.
Display the proper Final-Recipient on DSN messages for non-SMTP
mailers. Problem noted by Kari E. Hurtta of the
Finnish Meteorological Institute.
An error in calculating the available space in the list of addresses
for logging deliveries could cause an address to be silently
dropped.
Include the initial user environment if sendmail is restarted via
a HUP signal. This will give room for the process title.
Problem noted by Jon Lewis of Florida Digital Turnpike.
Mail could be delivered without a body if the machine does not
support flock locking and runs out of processes during
delivery. Fix from Chuck Lever of the University of Michigan.
Drop recipient address from 251 and 551 SMTP responses per RFC 821.
Problem noted by Kari E. Hurtta of the Finnish Meteorological
Institute.
Make sure non-rebuildable database maps are opened before the
rebuildable maps (i.e. alias files) in case the database maps
are needed for verifying the left hand side of the aliases.
Problem noted by Lloyd Parkes of Victoria University.
Make sure sender RFC822 source route addresses are alias expanded for
bounce messages. Problem noted by Juergen Georgi of
RUS University of Stuttgart.
Minor lint fixes.
Return a temporary error instead of a permanent error if an LDAP map
search returns an error. This will allow sequenced maps which
use other LDAP servers to be checked. Fix from Booker Bense
of Stanford University.
When automatically converting from quoted printable to 8bit text do
not pad bare linefeeds with a space. Problem noted by Theo
Nolte of the University of Technology Aachen, Germany.
Portability:
Non-standard C compilers may have had a problem compiling
conf.c due to a standard C external declaration of
setproctitle(). Problem noted by Ted Roberts of
Electronic Data Systems.
AUX: has a broken O_EXCL implementation. Reported by Jim
Jagielski of jaguNET Access Services.
BSD/OS: didn't compile if HASSETUSERCONTEXT was defined.
Digital UNIX: Digital UNIX (and possibly others) moves
loader environment variables into the loader memory
area. If one of these environment variables (such as
LD_LIBRARY_PATH) was the last environment variable,
an invalid memory address would be used by the process
title routine causing memory corruption. Problem
noted by Sam Hartman of Mesa Internet Systems.
GNU libc: uses an enum for _PC_CHOWN_RESTRICTED which caused
chownsafe() to always return 0 even if the OS does
not permit file giveaways. Problem noted by
Yasutaka Sumi of The University of Tokyo.
IRIX6: Syslog buffer size set to 512 bytes. Reported by
Gerald Rinske of Siemens Business Services VAS.
Linux: Pad process title with NULLs. Problem noted by
Jon Lewis of Florida Digital Turnpike.
SCO OpenServer 5.0: SIOCGIFCONF ioctl call returns an
incorrect value for the number of interfaces.
Problem noted by Chris Loelke of JetStream Internet
Services.
SINIX: Update for Makefile and syslog buffer size from Gerald
Rinske of Siemens Business Services VAS.
Solaris: Make sure HASGETUSERSHELL setting for SunOS is not
used on a Solaris machine. Problem noted by
Stephen Ma of Jtec Pty Limited.
CONFIG: SINIX: Update from Gerald Rinske of Siemens Business
Services VAS.
MAKEMAP: Use a better heuristic for detecting GDBM.
CONTRIB: expn.pl: Updated version from the author, David Muir Sharnoff.
OP.ME: Document the F=i mailer flag. Problem noted by Per Hedeland of
Ericsson.
8.8.7/8.8.7 97/08/03
If using Berkeley DB on systems without O_EXLOCK (open a file with
an exclusive lock already set -- i.e., almost all systems

View File

@ -4,7 +4,7 @@
Eric Allman <eric@CS.Berkeley.EDU>
@(#)README 8.122 (Berkeley) 7/6/97
@(#)README 8.124 (Berkeley) 9/23/97
This document describes the sendmail configuration files being used
@ -657,7 +657,7 @@ genericstable This feature will cause certain addresses originating in the
The key for this table is either the full address or the
unqualified username (the former is tried first); the
value is the new user address. If the new user address does
not include a domain, $j is used. Note that the address must
not include a domain, $j is used. Note that the address
being looked up must be fully qualified. For local mail, it
is necessary to use FEATURE(always_add_domain) for the
addresses to be qualified.
@ -1335,10 +1335,10 @@ confCF_VERSION $Z macro If defined, this is appended to the
confFROM_HEADER From: [$?x$x <$g>$|$g$.] The format of an
internally generated From: address.
confRECEIVED_HEADER Received:
[$?sfrom $s .$?_($?s$|from $.$_)
[$?sfrom $s $.$?_($?s$|from $.$_)
$.by $j ($v/$Z)$?r with $r$. id $i$?u
for $u$.;
$b]
for $u; $|;
$.$b]
The format of the Received: header
in messages passed through this host.
It is unwise to try to change this.

View File

@ -38,7 +38,7 @@ divert(-1)
#
divert(0)dnl
VERSIONID(`@(#)knecht.mc 8.13 (Berkeley) 7/7/97')
VERSIONID(`@(#)knecht.mc 8.15 (Berkeley) 10/20/97')
OSTYPE(bsd4.4)dnl
DOMAIN(generic)dnl
define(`confFORWARD_PATH', `$z/.forward.$w:$z/.forward+$h:$z/.forward')dnl
@ -48,6 +48,7 @@ define(`confTO_ICONNECT', `10s')dnl
define(`confCOPY_ERRORS_TO', `Postmaster')dnl
define(`confTO_QUEUEWARN', `8h')dnl
define(`confPRIVACY_FLAGS', ``authwarnings,noexpn,novrfy'')dnl
define(`LOCAL_MAILER_FLAGS', `rmn9P')dnl
FEATURE(virtusertable)dnl
MAILER(local)dnl
MAILER(smtp)dnl
@ -119,7 +120,7 @@ R<FAIL> $* $#error $: 451 Sender domain must resolve
# handle case of no @domain on address
R<?> $* $: < ? $&{client_name} > $1
R<?> $* $@ <OK> ...local unqualed ok
R<? $+> $* $#error $: 551 Domain name required
R<? $+> $* $#error $: 550 Domain name required
...remote is not
R<$+> $* $#error $: $1 error from domaincheck

View File

@ -32,8 +32,8 @@ divert(-1)
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
VERSIONID(`@(#)version.m4 8.8.7.1 (Berkeley) 8/1/97')
VERSIONID(`@(#)version.m4 8.8.8.1 (Berkeley) 10/24/97')
#
divert(0)
# Configuration version number
DZ8.8.7`'ifdef(`confCF_VERSION', `/confCF_VERSION')
DZ8.8.8`'ifdef(`confCF_VERSION', `/confCF_VERSION')

View File

@ -34,12 +34,9 @@ divert(-1)
#
divert(0)
VERSIONID(`@(#)sinix.m4 8.1 (Berkeley) 12/14/96')
define(`QUEUE_DIR', /usr/ucblib/mqueue)dnl
define(`ALIAS_FILE', /usr/ucblib/aliases)dnl
ifdef(`HELP_FILE',,`define(`HELP_FILE', /usr/ucblib/sendmail.hf)')dnl
ifdef(`STATUS_FILE',,`define(`STATUS_FILE', /usr/ucblib/sendmail.st)')dnl
define(`LOCAL_MAILER_PATH', `/usr/ucblib/mail.local')dnl
define(`LOCAL_MAILER_FLAGS', `rmn9')dnl
define(`LOCAL_SHELL_FLAGS', `ehuP')dnl
define(`UUCP_MAILER_ARGS', `uux - -r -a$g -gmedium $h!rmail ($u)')dnl
VERSIONID(`@(#)sinix.m4 8.2 (Berkeley) 9/13/97')
ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /var/spool/mqueue)')dnl
define(`ALIAS_FILE', /etc/aliases)dnl
define(`LOCAL_MAILER_PATH', `/bin/mail.local')dnl
ifdef(`STATUS_FILE',, `define(`STATUS_FILE', /var/sendmail.st)')dnl
ifdef(`HELP_FILE',, `define(`HELP_FILE', /etc/sendmail.hf)')dnl

View File

@ -6,19 +6,19 @@
# THIS PROGRAM IS ITS OWN MANUAL PAGE. INSTALL IN man & bin.
#
# hardcoded constants, should work fine for BSD-based systems
require 'sys/socket.ph';
$sockaddr = 'S n a4 x8';
use 5.001;
use IO::Socket;
# system requirements:
# must have 'nslookup' and 'hostname' programs.
# $Header: /home/muir/bin/RCS/expn,v 3.9 1995/10/02 17:51:35 muir Exp muir $
# $Header: /home/muir/bin/RCS/expn,v 3.11 1997/09/10 08:14:02 muir Exp muir $
# TODO:
# less magic should apply to command-line addresses
# less magic should apply to local addresses
# add magic to deal with cross-domain cnames
# disconnect & reconnect after 25 commands to the same sendmail 8.8.* host
# Checklist: (hard addresses)
# 250 Kimmo Suominen <"|/usr/local/mh/lib/slocal -user kim"@grendel.tac.nyc.ny.us>
@ -96,7 +96,7 @@ $sockaddr = 'S n a4 x8';
# $debug : -d
# $valid : -a
# $levels : -1
# S : the socket connection to $server
# $S : the socket connection to $server
$have_nslookup = 1; # we have the nslookup program
$port = 'smtp';
@ -143,12 +143,6 @@ if ($valid) {
}
}
$0 = "$av0 - building local socket";
($name,$aliases,$proto) = getprotobyname('tcp');
($name,$aliases,$port) = getservbyname($port,'tcp')
unless $port =~ /^\d+/;
$this = pack($sockaddr, &AF_INET, 0, $thisaddr);
HOST:
while (@hosts) {
$server = shift(@hosts);
@ -177,15 +171,13 @@ while (@hosts) {
# get a connection, or look for an mx
$0 = "$av0 - socket to $server";
$that = pack($sockaddr, &AF_INET, $port, $thataddr);
socket(S, &AF_INET, &SOCK_STREAM, $proto)
|| die "socket: $!";
$0 = "$av0 - bind to $server";
bind(S, $this)
|| die "bind $hostname,0: $!";
$0 = "$av0 - connect to $server";
print "debug = $debug server = $server\n" if $debug > 8;
if (! connect(S, $that) || ($debug == 10 && $server =~ /relay\d.UU.NET$/i)) {
$S = new IO::Socket::INET (
'PeerAddr' => $server,
'PeerPort' => $port,
'Proto' => 'tcp');
if (! $S || ($debug == 10 && $server =~ /relay\d.UU.NET$/i)) {
$0 = "$av0 - $server: could not connect: $!\n";
$emsg = $!;
unless (&mxlookup(0,$server,"$server: could not connect: $!",*users)) {
@ -193,12 +185,12 @@ while (@hosts) {
}
next HOST;
}
select((select(S),$| = 1)[0]); # don't buffer output to S
$S->autoflush(1);
# read the greeting
$0 = "$av0 - talking to $server";
&alarm("greeting with $server",'');
while(<S>) {
while(<$S>) {
alarm(0);
print if $watch;
if (/^(\d+)([- ])/) {
@ -210,7 +202,7 @@ while (@hosts) {
print STDERR "$server: NOT 220 greeting: $_"
if ($debug || $vw);
if (&mxlookup(0,$server,"$server: did not respond with a 220 greeting",*users)) {
close(S);
close($S);
next HOST;
}
}
@ -222,7 +214,7 @@ while (@hosts) {
unless (&mxlookup(0,$server,"$server: did not respond with SMTP codes",*users)) {
&giveup('',"$server: did not talk SMTP");
}
close(S);
close($S);
next HOST;
}
&alarm("greeting with $server",'');
@ -233,7 +225,7 @@ while (@hosts) {
$0 = "$av0 - sending helo to $server";
&alarm("sending helo to $server","");
&ps("helo $hostname");
while(<S>) {
while(<$S>) {
print if $watch;
last if /^\d+ /;
}
@ -395,11 +387,11 @@ while (@hosts) {
&alarm("sending 'quit' to $server",'');
$0 = "$av0 - sending 'quit' to $server";
&ps("quit");
while(<S>) {
while(<$S>) {
print if $watch;
last if /^\d+ /;
}
close(S);
close($S);
alarm(0);
}
@ -604,7 +596,7 @@ sub expn_vrfy
&alarm("${c}'ing $try_u on $server",'',$u);
&ps("$c $try_u");
alarm(0);
$s = <S>;
$s = <$S>;
if ($s eq '') {
return "$server: lost connection";
}
@ -905,7 +897,7 @@ sub ps
{
local($p) = @_;
print ">>> $p\n" if $watch;
print S "$p\n";
print $S "$p\n";
}
# return case-adjusted name for a host (for comparison purposes)
sub trhost
@ -1207,7 +1199,7 @@ sub read_response
local($done,$watch) = @_;
local(@resp);
print $s if $watch;
while(($done eq "-") && ($s = <S>) && ($s =~ /^\d+([- ])/)) {
while(($done eq "-") && ($s = <$S>) && ($s =~ /^\d+([- ])/)) {
print $s if $watch;
$done = $1;
push(@resp,$s);

View File

@ -30,7 +30,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" @(#)op.me 8.105 (Berkeley) 7/3/97
.\" @(#)op.me 8.106 (Berkeley) 10/20/97
.\"
.\" eqn op.me | pic | troff -me
.eh 'SMM:08-%''Sendmail Installation and Operation Guide'
@ -67,7 +67,7 @@
Eric Allman
eric@Sendmail.ORG
.sp
Version 8.105
Version 8.106
.sp
For Sendmail Version 8.8
.)l
@ -4128,6 +4128,8 @@ macro).
.ip h
Upper case should be preserved in host names
for this mailer.
.ip i
Do User Database rewriting on envelope sender address.
.ip I
This mailer will be speaking SMTP
to another
@ -8185,7 +8187,7 @@ replace it with a blank sheet for double-sided output.
.\".sz 10
.\"Eric Allman
.\".sp
.\"Version 8.105
.\"Version 8.106
.\".ce 0
.bp 3
.ce

View File

@ -33,7 +33,7 @@
*/
#ifndef lint
static char sccsid[] = "@(#)makemap.c 8.37 (Berkeley) 7/10/97";
static char sccsid[] = "@(#)makemap.c 8.38 (Berkeley) 9/23/97";
#endif /* not lint */
#include <sys/types.h>
@ -363,13 +363,6 @@ main(argc, argv)
pbuf, errstring(st));
exit(EX_CANTCREAT);
}
if (std.st_dev == stp.st_dev && std.st_ino == stp.st_ino)
{
fprintf(stderr,
"%s: cannot run with GDBM\n",
mapname);
exit(EX_CONFIG);
}
break;
#endif
default:
@ -407,6 +400,14 @@ main(argc, argv)
#ifdef NDBM
case T_DBM:
dbp.dbm = dbm_open(mapname, mode, 0644);
if (dbp.dbm != NULL &&
dbm_dirfno(dbp.dbm) == dbm_pagfno(dbp.dbm))
{
fprintf(stderr, "dbm map %s: cannot run with GDBM\n",
mapname);
dbm_close(dbp.dbm);
exit(EX_CONFIG);
}
if (!ignoresafeties && dbp.dbm != NULL &&
(filechanged(dbuf, dbm_dirfno(dbp.dbm), &std, sff) ||
filechanged(pbuf, dbm_pagfno(dbp.dbm), &stp, sff)))

View File

@ -33,7 +33,7 @@
*/
#ifndef lint
static char sccsid[] = "@(#)smrsh.c 8.4 (Berkeley) 11/11/95";
static char sccsid[] = "@(#)smrsh.c 8.5 (Berkeley) 10/19/97";
#endif /* not lint */
/*
@ -76,6 +76,7 @@ static char sccsid[] = "@(#)smrsh.c 8.4 (Berkeley) 11/11/95";
#endif
#include <sysexits.h>
#include <syslog.h>
#include <stdlib.h>
/* directory in which all commands must reside */
#ifndef CMDDIR

View File

@ -30,7 +30,7 @@
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# @(#)READ_ME 8.148 (Berkeley) 8/1/97
# @(#)READ_ME 8.156 (Berkeley) 10/23/97
#
This directory contains the source files for sendmail.
@ -148,9 +148,10 @@ The options are:
NEWDB The new Berkeley DB package. Some systems (e.g., BSD/OS and
Digital UNIX 4.0) have this package pre-installed. If your
system does not have NEWDB installed, get the latest version
system does not have NEWDB installed, get version 1.85
from http://www.sleepycat.com/packages/db.1.85.tar.gz.
DO NOT use the version from the Net2 distribution. If you are
DO NOT use Berkeley DB version 2.X with sendmail. DO NOT
use the version from the Net2 distribution. If you are
still running BSD/386 1.x, you will also need to define
OLD_NEWDB.
NDBM The older NDBM implementation -- the very old V7 DBM
@ -731,7 +732,13 @@ SunOS 4.1.3, 4.1.3_U1
101790-01 (SunOS 4.1.3_U1: TCP socket and reset problems).
Solaris 2.x (SunOS 5.x)
To compile for Solaris, be sure you use -DSOLARIS.
To compile for Solaris, the Makefile chosen by makesendmail must
include a SOLARIS definition which reflects the Solaris version
(i.e. -DSOLARIS=20400 for 2.4 or -DSOLARIS=20501 for 2.5.1).
If you are using gcc, make sure -I/usr/include is not used (or
it might complain about TopFrame). If you are using Sun's cc,
make sure /opt/SUNWspro/bin/cc is used instead of /usr/ucb/cc
(or it might complain about tm_zone).
To the best of my knowledge, Solaris does not have the
gethostbyname problem described above. However, it does
@ -828,22 +835,25 @@ Solaris 2.6 (SunOS 5.6)
incompatible snprintf(3s) calls. This problem is fixed in sendmail
8.8.5.
Solaris 2.5.1 (SunOS 5.5.1)
Apparently patch 103663-01 installs a new /usr/include/resolv.h
file that defines the __P macro without checking to see if it is
already defined. This causes compile warnings such as:
Solaris 2.5.1 (SunOS 5.5.1) and 2.6 (SunOS 5.6)
Apparently Solaris 2.5.1 patch 103663-01 installs a new
/usr/include/resolv.h file that defines the __P macro without
checking to see if it is already defined. This new resolv.h is also
included in the Solaris 2.6 distribution. This causes compile
warnings such as:
In file included from daemon.c:51:
/usr/include/resolv.h:208: warning: `__P' redefined
cdefs.h:58: warning: this is the location of the previous definition
If you are running with this patch, create a resolv.h file in the
obj.SunOS.5.5.1.* directory that reads:
These warnings can be safely ignored or you can create a resolv.h
file in the obj.SunOS.5.5.1.* or obj.SunOS.5.6.* directory that reads:
#undef __P
#include "/usr/include/resolv.h"
... And then file a bug report with Sun.
Sun is aware of the problem (Sun bug ID 4081053) and it will be fixed
in a to-be-released patch.
Ultrix
By default, the IDENT protocol is turned off on Ultrix. If you
@ -852,7 +862,7 @@ Ultrix
IDENT on in the configuration file by setting the "ident" timeout
to 30 seconds.
OSF/1
Digital UNIX (formerly DEC OSF/1)
If you are compiling on OSF/1 (DEC Alpha), you must use
-L/usr/shlib (otherwise it core dumps on startup). You may also
need -mld to get the nlist() function, although some versions
@ -865,6 +875,19 @@ OSF/1
properly due to a bug in the getpw* routines. If you want to use
this, use -DDEC_OSF_BROKEN_GETPWENT=1. The problem is fixed in 3.2C.
On Digital UNIX 4.0 and later, Berkeley DB is included with the
operating system and already has the ndbm.o module removed. However,
Digital has modified the original Berkeley DB db.h include file.
This results in the following warning while compiling map.c and udb.c:
cc: Warning: /usr/include/db.h, line 74: The redefinition of the macro
"__signed" conflicts with a current definition because the replacement
lists differ. The redefinition is now in effect.
#define __signed signed
------------------------^
This warning can be ignored.
IRIX
The header files on SGI IRIX are completely prototyped, and as
a result you can sometimes get some warning messages during
@ -1439,4 +1462,4 @@ version.c The version number and information about this
Eric Allman
(Version 8.148, last update 8/1/97 16:41:54)
(Version 8.156, last update 10/23/97 12:53:12)

View File

@ -33,7 +33,7 @@
*/
#ifndef lint
static char sccsid[] = "@(#)collect.c 8.71 (Berkeley) 6/30/97";
static char sccsid[] = "@(#)collect.c 8.72 (Berkeley) 10/6/97";
#endif /* not lint */
# include <errno.h>
@ -567,7 +567,7 @@ collect(fp, smtpmode, hdrp, e)
/* check for message too large */
if (MaxMessageSize > 0 && e->e_msgsize > MaxMessageSize)
{
e->e_flags |= EF_NO_BODY_RETN;
e->e_flags |= EF_NO_BODY_RETN|EF_CLRQUEUE;
e->e_status = "5.2.3";
usrerr("552 Message exceeds maximum fixed size (%ld)",
MaxMessageSize);

View File

@ -33,7 +33,7 @@
*/
#ifndef lint
static char sccsid[] = "@(#)conf.c 8.374 (Berkeley) 8/2/97";
static char sccsid[] = "@(#)conf.c 8.379 (Berkeley) 10/20/97";
#endif /* not lint */
# include "sendmail.h"
@ -2066,7 +2066,6 @@ refuseconnections(port)
static time_t lastconn = (time_t) 0;
static int conncnt = 0;
extern bool enoughdiskspace();
extern void setproctitle __P((const char *, ...));
#ifdef XLA
if (!xla_smtp_ok())
@ -2225,7 +2224,7 @@ initsetproctitle(argc, argv, envp)
char **argv;
char **envp;
{
register int i;
register int i, envpsize = 0;
extern char **environ;
/*
@ -2234,7 +2233,7 @@ initsetproctitle(argc, argv, envp)
*/
for (i = 0; envp[i] != NULL; i++)
continue;
envpsize += strlen(envp[i]) + 1;
environ = (char **) xalloc(sizeof (char *) * (i + 1));
for (i = 0; envp[i] != NULL; i++)
environ[i] = newstr(envp[i]);
@ -2245,6 +2244,16 @@ initsetproctitle(argc, argv, envp)
*/
Argv = argv;
/*
** Find the last environment variable within sendmail's
** process memory area.
*/
while (i > 0 && (envp[i - 1] < argv[0] ||
envp[i - 1] > (argv[argc - 1] +
strlen(argv[argc - 1]) + 1 + envpsize)))
i--;
if (i > 0)
LastArgv = envp[i - 1] + strlen(envp[i - 1]);
else
@ -2820,6 +2829,7 @@ char *optarg = NULL; /* argument associated with option */
#define tell(s) if (opterr) {fputs(*nargv,stderr);fputs(s,stderr); \
fputc(optopt,stderr);fputc('\n',stderr);return(BADCH);}
int
getopt(nargc,nargv,ostr)
int nargc;
char *const *nargv;
@ -2827,7 +2837,7 @@ getopt(nargc,nargv,ostr)
{
static char *place = EMSG; /* option letter processing */
static char atend = 0;
register char *oli; /* option letter list index */
register char *oli = NULL; /* option letter list index */
if (atend) {
atend = 0;
@ -3844,7 +3854,7 @@ chownsafe(fd, safedir)
bool safedir;
{
#if (!defined(_POSIX_CHOWN_RESTRICTED) || _POSIX_CHOWN_RESTRICTED != -1) && \
defined(_PC_CHOWN_RESTRICTED)
(defined(_PC_CHOWN_RESTRICTED) || defined(_GNU_TYPES_H))
int rval;
/* give the system administrator a chance to override */

View File

@ -31,7 +31,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)conf.h 8.328 (Berkeley) 8/3/97
* @(#)conf.h 8.335 (Berkeley) 10/24/97
*/
/*
@ -294,7 +294,9 @@ typedef int pid_t;
define BSD_REMAP_SIGNAL_TO_SIGVEC
RTisms needed above */
/* make this sendmail in a completely different place */
# define _PATH_VENDORCF "/usr/local/newmail/sendmail.cf"
# ifndef _PATH_VENDOR_CF
# define _PATH_VENDOR_CF "/usr/local/newmail/sendmail.cf"
# endif
# ifndef _PATH_SENDMAILPID
# define _PATH_SENDMAILPID "/usr/local/newmail/sendmail.pid"
# endif
@ -348,6 +350,7 @@ typedef int pid_t;
# ifdef IRIX6
# define LA_TYPE LA_IRIX6 /* figure out at run time */
# define SAFENFSPATHCONF 0 /* pathconf(2) lies on NFS filesystems */
# define SYSLOG_BUFSIZE 512
# else
# define LA_TYPE LA_INT
@ -382,7 +385,6 @@ typedef int pid_t;
# include <sys/time.h>
# define HASINITGROUPS 1 /* has initgroups(3) call */
# define HASUNAME 1 /* use System V uname(2) system call */
# define HASGETUSERSHELL 1 /* DOES have getusershell(3) call in libc */
# define HASFCHMOD 1 /* has fchmod(2) syscall */
# define IP_SRCROUTE 1 /* can check IP source routing */
# define SAFENFSPATHCONF 1 /* pathconf(2) pessimizes on NFS filesystems */
@ -438,6 +440,7 @@ typedef int pid_t;
# else
/* SunOS 4.0.3 or 4.1.x */
# define HASGETUSERSHELL 1 /* DOES have getusershell(3) call in libc */
# define HASSETREUID 1 /* has setreuid(2) call */
# ifndef HASFLOCK
# define HASFLOCK 1 /* has flock(2) call */
@ -903,6 +906,7 @@ extern int errno;
#if _SCO_DS >= 1
# include <paths.h>
# define _SCO_unix_4_2
# define SIOCGIFNUM_IS_BROKEN 1 /* SIOCGIFNUM returns bogus value */
# define HASSNPRINTF 1 /* has snprintf(3) call */
# define HASFCHMOD 1 /* has fchmod(2) call */
# define HASSETRLIMIT 1 /* has setrlimit(2) call */
@ -1188,6 +1192,7 @@ extern void *malloc();
# define LA_TYPE LA_PROCSTR
# endif
# define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() impl */
# define SPT_PADCHAR '\0' /* pad process title with nulls */
# ifndef _PATH_SENDMAILPID
# define _PATH_SENDMAILPID "/var/run/sendmail.pid"
# endif
@ -1224,6 +1229,7 @@ extern void *malloc();
# define BSD /* has BSD routines */
# define HASSETRLIMIT 0 /* ... but not setrlimit(2) */
# define BROKEN_RES_SEARCH 1 /* res_search(unknown) returns h_errno=0 */
# define BOGUS_O_EXCL 1 /* exclusive open follows symlinks */
# define HASUNAME 1 /* use System V uname(2) system call */
# define HASFCHMOD 1 /* has fchmod(2) syscall */
# define HASINITGROUPS 1 /* has initgroups(3) call */
@ -1836,6 +1842,15 @@ typedef struct msgb mblk_t;
# undef offsetof /* avoid stddefs.h and sys/sysmacros.h conflict */
#endif
/*
** Siemens Nixdorf Informationssysteme AG SINIX
**
** Contributed by Gerald Rinske <Gerald.Rinske@mch.sni.de>
** of Siemens Business Services VAS.
*/
#ifdef _sinix_
# define SYSLOG_BUFSIZE 1024
#endif
/**********************************************************************
** End of Per-Operating System defines

View File

@ -37,9 +37,9 @@
#ifndef lint
#ifdef DAEMON
static char sccsid[] = "@(#)daemon.c 8.186 (Berkeley) 8/2/97 (with daemon mode)";
static char sccsid[] = "@(#)daemon.c 8.195 (Berkeley) 10/23/97 (with daemon mode)";
#else
static char sccsid[] = "@(#)daemon.c 8.186 (Berkeley) 8/2/97 (without daemon mode)";
static char sccsid[] = "@(#)daemon.c 8.195 (Berkeley) 10/23/97 (without daemon mode)";
#endif
#endif /* not lint */
@ -103,9 +103,7 @@ static char sccsid[] = "@(#)daemon.c 8.186 (Berkeley) 8/2/97 (without daemon mod
** e -- the current envelope.
**
** Returns:
** TRUE -- if a "null server" should be used -- that is, one
** that rejects all commands.
** FALSE -- to use a normal server.
** none.
**
** Side Effects:
** Waits until some interesting activity occurs. When
@ -122,7 +120,7 @@ int ListenQueueSize = 10; /* size of listen queue */
int TcpRcvBufferSize = 0; /* size of TCP receive buffer */
int TcpSndBufferSize = 0; /* size of TCP send buffer */
bool
void
getrequests(e)
ENVELOPE *e;
{
@ -188,7 +186,7 @@ getrequests(e)
*/
if (tTd(15, 1))
printf("getrequests: port 0x%x\n", DaemonAddr.sin.sin_port);
printf("getrequests: port 0x%x\n", port);
/* get a socket for the SMTP connection */
socksize = opendaemonsocket(TRUE);
@ -238,7 +236,7 @@ getrequests(e)
/* see if we are rejecting connections */
(void) blocksignal(SIGALRM);
if (refuseconnections(ntohs(DaemonAddr.sin.sin_port)))
if (refuseconnections(ntohs(port)))
{
if (DaemonSocket >= 0)
{
@ -284,7 +282,7 @@ getrequests(e)
/* wait for a connection */
setproctitle("accepting connections on port %d",
ntohs(DaemonAddr.sin.sin_port));
ntohs(port));
#if 0
/*
** Andrew Sun <asun@ieps-sun.ml.com> claims that this will
@ -372,7 +370,6 @@ getrequests(e)
char *p;
extern SIGFUNC_DECL intsig __P((int));
FILE *inchannel, *outchannel;
bool nullconn;
/*
** CHILD -- return to caller.
@ -437,13 +434,6 @@ getrequests(e)
/* open maps for check_relay ruleset */
initmaps(FALSE, e);
/* validate the connection */
HoldErrs = TRUE;
nullconn = !validate_connection(&RealHostAddr, RealHostName, e);
HoldErrs = FALSE;
if (nullconn)
break;
#ifdef XLA
if (!xla_host_ok(RealHostName))
{
@ -452,9 +442,7 @@ getrequests(e)
}
#endif
if (tTd(15, 2))
printf("getreq: returning (normal server)\n");
return FALSE;
break;
}
/* parent -- keep track of children */
@ -473,8 +461,8 @@ getrequests(e)
(void) close(pipefd[1]);
}
if (tTd(15, 2))
printf("getreq: returning (null server)\n");
return TRUE;
printf("getreq: returning\n");
return;
}
/*
** OPENDAEMONSOCKET -- open the SMTP socket
@ -1265,7 +1253,7 @@ getauthinfo(fd)
int nleft;
struct hostent *hp;
char **ha;
bool may_be_forged;
volatile bool may_be_forged;
char ibuf[MAXNAME + 1];
static char hbuf[MAXNAME * 2 + 2];
@ -1750,6 +1738,7 @@ host_map_lookup(map, name, av, statp)
}
/* found a match -- copy out */
hp->h_name = denlstring((char *) hp->h_name, TRUE, TRUE);
s->s_namecanon.nc_stat = *statp = EX_OK;
s->s_namecanon.nc_cname = newstr(hp->h_name);
if (bitset(MF_MATCHONLY, map->map_mflags))
@ -2027,7 +2016,9 @@ hostnamebyanyaddr(sap)
#endif /* NAMED_BIND */
if (hp != NULL && hp->h_name[0] != '[')
return (char *) hp->h_name;
return denlstring((char *) hp->h_name, TRUE, TRUE);
else if (sap->sa.sa_family == AF_UNIX && sap->sunix.sun_path[0] == '\0')
return "localhost";
else
{
/* produce a dotted quad */

View File

@ -33,7 +33,7 @@
*/
#ifndef lint
static char sccsid[] = "@(#)deliver.c 8.285 (Berkeley) 8/2/97";
static char sccsid[] = "@(#)deliver.c 8.296 (Berkeley) 10/22/97";
#endif /* not lint */
#include "sendmail.h"
@ -44,6 +44,10 @@ static char sccsid[] = "@(#)deliver.c 8.285 (Berkeley) 8/2/97";
extern int h_errno;
#endif
#if HASSETUSERCONTEXT
# include <login_cap.h>
#endif
#if SMTP
extern char SmtpError[];
#endif
@ -77,7 +81,7 @@ sendall(e, mode)
register ENVELOPE *ee;
ENVELOPE *splitenv = NULL;
int oldverbose = Verbose;
bool somedeliveries = FALSE;
bool somedeliveries = FALSE, expensive = FALSE;
pid_t pid;
extern void sendenvelope();
@ -281,6 +285,7 @@ sendall(e, mode)
if (tTd(13, 30))
printf(" ... expensive\n");
q->q_flags |= QQUEUEUP;
expensive = TRUE;
}
else
{
@ -393,11 +398,13 @@ sendall(e, mode)
/* treat this as a delivery in terms of counting tries */
e->e_dtime = curtime();
e->e_ntries++;
if (!expensive)
e->e_ntries++;
for (ee = splitenv; ee != NULL; ee = ee->e_sibling)
{
ee->e_dtime = curtime();
ee->e_ntries++;
if (!expensive)
ee->e_ntries++;
}
}
@ -466,34 +473,13 @@ sendall(e, mode)
/*
** Since fcntl locking has the interesting semantic that
** the lock is owned by a process, not by an open file
** descriptor, we have to flush this to the queue, and
** descriptor, we have to unlock this envelope, and
** then restart from scratch in the child.
*/
{
/* save id for future use */
char *qid = e->e_id;
/* now drop the envelope in the parent */
e->e_flags |= EF_INQUEUE;
dropenvelope(e, FALSE);
/* arrange to reacquire lock after fork */
e->e_id = qid;
}
unlockqueue(e);
for (ee = splitenv; ee != NULL; ee = ee->e_sibling)
{
/* save id for future use */
char *qid = ee->e_id;
/* drop envelope in parent */
ee->e_flags |= EF_INQUEUE;
dropenvelope(ee, FALSE);
/* and save qid for reacquisition */
ee->e_id = qid;
}
unlockqueue(ee);
# endif /* !HASFLOCK */
@ -1368,7 +1354,7 @@ deliver(e, firstto)
hostbuf, m->m_name);
else
message("Connecting to %s port %d via %s...",
hostbuf, port, m->m_name);
hostbuf, ntohs(port), m->m_name);
i = makeconnection(hostbuf, port, mci, e);
mci->mci_lastuse = curtime();
mci->mci_exitstat = i;
@ -1577,7 +1563,7 @@ deliver(e, firstto)
pwd = sm_getpwnam(contextaddr->q_user);
if (pwd != NULL)
(void) setusercontext(NULL,
pwd, pwd->m_uid,
pwd, pwd->pw_uid,
LOGIN_SETRESOURCES|LOGIN_SETPRIORITY);
}
#endif
@ -1901,7 +1887,7 @@ deliver(e, firstto)
for (to = tochain; to != NULL; to = to->q_tchain)
{
e->e_to = to->q_paddr;
if (strlen(to->q_paddr) + (t - tobuf) + 2 >= sizeof tobuf)
if (strlen(to->q_paddr) + (t - tobuf) + 2 > sizeof tobuf)
{
/* not enough room */
continue;
@ -2244,6 +2230,8 @@ endmailer(mci, e, pv)
{
int st;
mci_unlock_host(mci);
/* close any connections */
if (mci->mci_in != NULL)
(void) xfclose(mci->mci_in, mci->mci_mailer->m_name, "mci_in");
@ -2331,6 +2319,9 @@ giveresponse(stat, m, mci, ctladdr, xstart, e)
extern int N_SysEx;
char buf[MAXLINE];
if (e == NULL)
syserr("giveresponse: null envelope");
/*
** Compute status message from code.
*/
@ -2428,7 +2419,8 @@ giveresponse(stat, m, mci, ctladdr, xstart, e)
** that.
*/
if (LogLevel > ((stat == EX_TEMPFAIL) ? 8 : (stat == EX_OK) ? 7 : 6))
if (OpMode != MD_VERIFY && !bitset(EF_VRFYONLY, e->e_flags) &&
LogLevel > ((stat == EX_TEMPFAIL) ? 8 : (stat == EX_OK) ? 7 : 6))
logdelivery(m, mci, &statmsg[4], ctladdr, xstart, e);
if (tTd(11, 2))
@ -2741,7 +2733,7 @@ putfromline(mci, e)
}
}
expand(template, buf, sizeof buf, e);
putxline(buf, strlen(buf), mci, PXLF_NOTHINGSPECIAL);
putxline(buf, strlen(buf), mci, PXLF_HEADER);
}
/*
** PUTBODY -- put the body of a message.
@ -3096,17 +3088,21 @@ putbody(mci, e, separator)
** none.
*/
static jmp_buf CtxMailfileTimeout;
static void mailfiletimeout();
int
mailfile(filename, ctladdr, sfflags, e)
char *filename;
char *volatile filename;
ADDRESS *ctladdr;
int sfflags;
volatile int sfflags;
register ENVELOPE *e;
{
register FILE *f;
register pid_t pid = -1;
int mode = ST_MODE_NOFILE;
volatile int mode = ST_MODE_NOFILE;
bool suidwarn = geteuid() == 0;
EVENT *ev;
if (tTd(11, 1))
{
@ -3140,7 +3136,7 @@ mailfile(filename, ctladdr, sfflags, e)
/* child -- actually write to file */
struct stat stb;
MCI mcibuf;
int oflags = O_WRONLY|O_APPEND;
volatile int oflags = O_WRONLY|O_APPEND;
if (e->e_lockfp != NULL)
(void) close(fileno(e->e_lockfp));
@ -3152,6 +3148,16 @@ mailfile(filename, ctladdr, sfflags, e)
e->e_to = filename;
ExitStat = EX_OK;
if (setjmp(CtxMailfileTimeout) != 0)
{
exit(EX_TEMPFAIL);
}
if (TimeOuts.to_fileopen > 0)
ev = setevent(TimeOuts.to_fileopen, mailfiletimeout, 0);
else
ev = NULL;
#ifdef HASLSTAT
if (lstat(filename, &stb) < 0)
#else
@ -3287,6 +3293,9 @@ mailfile(filename, ctladdr, sfflags, e)
exit(EX_CANTCREAT);
}
if (ev != NULL)
clrevent(ev);
bzero(&mcibuf, sizeof mcibuf);
mcibuf.mci_mailer = FileMailer;
mcibuf.mci_out = f;
@ -3332,6 +3341,12 @@ mailfile(filename, ctladdr, sfflags, e)
}
return EX_UNAVAILABLE; /* avoid compiler warning on IRIX */
}
static void
mailfiletimeout()
{
longjmp(CtxMailfileTimeout, 1);
}
/*
** HOSTSIGNATURE -- return the "signature" for a host.
**

View File

@ -33,7 +33,7 @@
*/
#ifndef lint
static char sccsid[] = "@(#)err.c 8.64 (Berkeley) 7/25/97";
static char sccsid[] = "@(#)err.c 8.65 (Berkeley) 10/18/97";
#endif /* not lint */
# include "sendmail.h"
@ -556,7 +556,9 @@ fmtmsg(eb, to, num, eno, fmt, ap)
}
/* output the "to" person */
if (to != NULL && to[0] != '\0')
if (to != NULL && to[0] != '\0' &&
strncmp(num, "551", 3) != 0 &&
strncmp(num, "251", 3) != 0)
{
(void) snprintf(eb, spaceleft, "%s... ",
shortenstring(to, 203));

View File

@ -33,7 +33,7 @@
*/
#ifndef lint
static char sccsid[] = "@(#)headers.c 8.111 (Berkeley) 7/9/97";
static char sccsid[] = "@(#)headers.c 8.115 (Berkeley) 10/22/97";
#endif /* not lint */
# include <errno.h>
@ -522,9 +522,16 @@ eatheader(e, full)
(void) sendtolist(h->h_value, NULLADDR,
&e->e_sendqueue, 0, e);
#if 0
/*
** Change functionality so a fatal error on an
** address doesn't affect the entire envelope.
*/
/* delete fatal errors generated by this address */
if (!GrabTo && !bitset(EF_FATALERRS, saveflags))
if (!bitset(EF_FATALERRS, saveflags))
e->e_flags &= ~EF_FATALERRS;
#endif
}
/* save the message-id for logging */
@ -1330,7 +1337,7 @@ put_vanilla_header(h, v, mci)
int putflags;
char obuf[MAXLINE];
putflags = 0;
putflags = PXLF_HEADER;
#if _FFR_7BITHDRS
if (bitnset(M_7BITHDRS, mci->mci_mailer->m_flags))
putflags |= PXLF_STRIP8BIT;
@ -1342,8 +1349,8 @@ put_vanilla_header(h, v, mci)
int l;
l = nlp - v;
if (sizeof obuf - (obp - obuf) < l)
l = sizeof obuf - (obp - obuf);
if (SPACELEFT(obuf, obp) - 1 < l)
l = SPACELEFT(obuf, obp) - 1;
snprintf(obp, SPACELEFT(obuf, obp), "%.*s", l, v);
putxline(obuf, strlen(obuf), mci, putflags);
@ -1385,7 +1392,7 @@ commaize(h, p, oldstyle, mci, e)
int opos;
int omax;
bool firstone = TRUE;
int putflags = 0;
int putflags = PXLF_HEADER;
char obuf[MAXLINE + 3];
/*
@ -1491,6 +1498,7 @@ commaize(h, p, oldstyle, mci, e)
*p = savechar;
continue;
}
name = denlstring(name, FALSE, TRUE);
/* output the name with nice formatting */
opos += strlen(name);

View File

@ -39,7 +39,7 @@ static char copyright[] =
#endif /* not lint */
#ifndef lint
static char sccsid[] = "@(#)main.c 8.249 (Berkeley) 7/25/97";
static char sccsid[] = "@(#)main.c 8.258 (Berkeley) 10/20/97";
#endif /* not lint */
#define _DEFINE
@ -50,10 +50,6 @@ static char sccsid[] = "@(#)main.c 8.249 (Berkeley) 7/25/97";
#include <resolv.h>
#endif
# ifdef lint
char edata, end;
# endif /* lint */
/*
** SENDMAIL -- Post mail to a set of destinations.
**
@ -122,7 +118,6 @@ main(argc, argv, envp)
char **av;
extern char Version[];
char *ep, *from;
typedef int (*fnptr)();
STAB *st;
register int i;
int j;
@ -133,7 +128,6 @@ main(argc, argv, envp)
bool run_in_foreground = FALSE; /* -bD mode */
static bool reenter = FALSE;
struct passwd *pw;
struct stat stb;
struct hostent *hp;
bool nullserver = FALSE;
char jbuf[MAXHOSTNAMELEN]; /* holds MyHostName */
@ -436,6 +430,8 @@ main(argc, argv, envp)
res_init();
if (tTd(8, 8))
_res.options |= RES_DEBUG;
else
_res.options &= ~RES_DEBUG;
# ifdef RES_NOALIASES
_res.options |= RES_NOALIASES;
# endif
@ -832,6 +828,15 @@ main(argc, argv, envp)
ConfigFileRead = TRUE;
vendor_post_defaults(CurEnv);
/* Enforce use of local time (null string overrides this) */
if (TimeZoneSpec == NULL)
unsetenv("TZ");
else if (TimeZoneSpec[0] != '\0')
setuserenv("TZ", TimeZoneSpec);
else
setuserenv("TZ", NULL);
tzset();
/* avoid denial-of-service attacks */
resetlimits();
@ -903,15 +908,6 @@ main(argc, argv, envp)
if (DefaultNotify == 0)
DefaultNotify = QPINGONFAILURE|QPINGONDELAY;
/* Enforce use of local time (null string overrides this) */
if (TimeZoneSpec == NULL)
unsetenv("TZ");
else if (TimeZoneSpec[0] != '\0')
setuserenv("TZ", TimeZoneSpec);
else
setuserenv("TZ", NULL);
tzset();
/* be sure we don't pick up bogus HOSTALIASES environment variable */
if (queuemode && RealUid != 0)
(void) unsetenv("HOSTALIASES");
@ -1321,7 +1317,7 @@ main(argc, argv, envp)
if (OpMode == MD_DAEMON || QueueIntvl != 0)
{
char dtype[200];
extern bool getrequests __P((ENVELOPE *));
extern void getrequests __P((ENVELOPE *));
if (!run_in_foreground && !tTd(99, 100))
{
@ -1371,7 +1367,7 @@ main(argc, argv, envp)
dropenvelope(CurEnv, TRUE);
#if DAEMON
nullserver = getrequests(CurEnv);
getrequests(CurEnv);
/* drop privileges */
(void) drop_privileges(FALSE);
@ -1385,6 +1381,11 @@ main(argc, argv, envp)
p = getauthinfo(fileno(InChannel));
define('_', p, &BlankEnvelope);
/* validate the connection */
HoldErrs = TRUE;
nullserver = !validate_connection(&RealHostAddr, RealHostName, CurEnv);
HoldErrs = FALSE;
#endif /* DAEMON */
}
@ -1476,10 +1477,9 @@ main(argc, argv, envp)
CurEnv->e_flags &= ~EF_FATALERRS;
collect(InChannel, FALSE, NULL, CurEnv);
/* bail out if there were fatal errors in collect */
if (OpMode != MD_VERIFY && bitset(EF_FATALERRS, CurEnv->e_flags))
/* bail out if message too large */
if (bitset(EF_CLRQUEUE, CurEnv->e_flags))
{
CurEnv->e_flags |= EF_CLRQUEUE;
finis();
/*NOTREACHED*/
return -1;
@ -2047,7 +2047,7 @@ sighup(sig)
RunAsUid, RunAsGid);
exit(EX_OSERR);
}
execv(SaveArgv[0], (ARGV_T) SaveArgv);
execve(SaveArgv[0], (ARGV_T) SaveArgv, (ARGV_T) ExternalEnviron);
if (LogLevel > 0)
sm_syslog(LOG_ALERT, NOQID, "could not exec %s: %m", SaveArgv[0]);
exit(EX_OSFILE);
@ -2089,14 +2089,14 @@ drop_privileges(to_real_uid)
#ifdef NGROUPS_MAX
/* reset group permissions; these can be set later */
emptygidset[0] = RunAsGid == 0 ? getegid() : RunAsGid;
emptygidset[0] = (to_real_uid || RunAsGid != 0) ? RunAsGid : getegid();
(void) setgroups(1, emptygidset);
#endif
/* reset primary group and user id */
if (RunAsGid != 0 && setgid(RunAsGid) < 0)
if ((to_real_uid || RunAsGid != 0) && setgid(RunAsGid) < 0)
rval = EX_OSERR;
if (RunAsUid != 0 && setuid(RunAsUid) < 0)
if ((to_real_uid || RunAsUid != 0) && setuid(RunAsUid) < 0)
rval = EX_OSERR;
return rval;
}

View File

@ -33,7 +33,7 @@
*/
#ifndef lint
static char sccsid[] = "@(#)map.c 8.181 (Berkeley) 7/9/97";
static char sccsid[] = "@(#)map.c 8.186 (Berkeley) 10/21/97";
#endif /* not lint */
#include "sendmail.h"
@ -402,8 +402,8 @@ map_rewrite(map, s, slen, av)
**
** Side Effects:
** initializes aliases:
** if NDBM: opens the database.
** if ~NDBM: reads the aliases into the symbol table.
** if alias database: opens the database.
** if no database available: reads aliases into the symbol table.
*/
void
@ -417,25 +417,20 @@ initmaps(rebuild, e)
checkfd012("entering initmaps");
#endif
CurEnv = e;
if (rebuild)
{
stabapply(map_init, 1);
stabapply(map_init, 2);
}
else
{
stabapply(map_init, 0);
}
stabapply(map_init, 0);
stabapply(map_init, rebuild ? 2 : 1);
#if XDEBUG
checkfd012("exiting initmaps");
#endif
}
void
map_init(s, rebuild)
map_init(s, pass)
register STAB *s;
int rebuild;
int pass;
{
bool rebuildable;
register MAP *map;
/* has to be a map */
@ -452,13 +447,23 @@ map_init(s, rebuild)
map->map_class->map_cname,
map->map_mname == NULL ? "NULL" : map->map_mname,
map->map_file == NULL ? "NULL" : map->map_file,
rebuild);
pass);
if (rebuild == (bitset(MF_ALIAS, map->map_mflags) &&
bitset(MCF_REBUILDABLE, map->map_class->map_cflags) ? 1 : 2))
/*
** Pass 0 opens all non-rebuildable maps.
** Pass 1 opens all rebuildable maps for read.
** Pass 2 rebuilds all rebuildable maps.
*/
rebuildable = (bitset(MF_ALIAS, map->map_mflags) &&
bitset(MCF_REBUILDABLE, map->map_class->map_cflags));
if ((pass == 0 && rebuildable) ||
((pass == 1 || pass == 2) && !rebuildable))
{
if (tTd(38, 3))
printf("\twrong pass\n");
printf("\twrong pass (pass = %d, rebuildable = %d)\n",
pass, rebuildable);
return;
}
@ -468,43 +473,42 @@ map_init(s, rebuild)
map->map_class->map_close(map);
map->map_mflags &= ~(MF_OPEN|MF_WRITABLE);
}
if (rebuild == 2)
if (pass == 2)
{
rebuildaliases(map, FALSE);
return;
}
if (map->map_class->map_open(map, O_RDONLY))
{
if (tTd(38, 4))
printf("\t%s:%s %s: valid\n",
map->map_class->map_cname == NULL ? "NULL" :
map->map_class->map_cname,
map->map_mname == NULL ? "NULL" :
map->map_mname,
map->map_file == NULL ? "NULL" :
map->map_file);
map->map_mflags |= MF_OPEN;
}
else
{
if (map->map_class->map_open(map, O_RDONLY))
if (tTd(38, 4))
printf("\t%s:%s %s: invalid: %s\n",
map->map_class->map_cname == NULL ? "NULL" :
map->map_class->map_cname,
map->map_mname == NULL ? "NULL" :
map->map_mname,
map->map_file == NULL ? "NULL" :
map->map_file,
errstring(errno));
if (!bitset(MF_OPTIONAL, map->map_mflags))
{
if (tTd(38, 4))
printf("\t%s:%s %s: valid\n",
map->map_class->map_cname == NULL ? "NULL" :
map->map_class->map_cname,
map->map_mname == NULL ? "NULL" :
map->map_mname,
map->map_file == NULL ? "NULL" :
map->map_file);
map->map_mflags |= MF_OPEN;
}
else
{
if (tTd(38, 4))
printf("\t%s:%s %s: invalid: %s\n",
map->map_class->map_cname == NULL ? "NULL" :
map->map_class->map_cname,
map->map_mname == NULL ? "NULL" :
map->map_mname,
map->map_file == NULL ? "NULL" :
map->map_file,
errstring(errno));
if (!bitset(MF_OPTIONAL, map->map_mflags))
{
extern MAPCLASS BogusMapClass;
extern MAPCLASS BogusMapClass;
map->map_class = &BogusMapClass;
map->map_mflags |= MF_OPEN;
}
map->map_class = &BogusMapClass;
map->map_mflags |= MF_OPEN;
}
}
}
@ -781,14 +785,6 @@ ndbm_map_open(map, mode)
if (std.st_mode == ST_MODE_NOFILE)
mode |= O_CREAT|O_EXCL;
/* heuristic: if files are linked, this is actually gdbm */
if (std.st_dev == stp.st_dev && std.st_ino == stp.st_ino)
{
syserr("dbm map \"%s\": cannot support GDBM",
map->map_mname);
return FALSE;
}
#if LOCK_ON_OPEN
if (mode == O_RDONLY)
mode |= O_SHLOCK;
@ -891,6 +887,20 @@ ndbm_map_open(map, mode)
}
dfd = dbm_dirfno(dbm);
pfd = dbm_pagfno(dbm);
if (dfd == pfd)
{
/* heuristic: if files are linked, this is actually gdbm */
dbm_close(dbm);
#if !LOCK_ON_OPEN && !NOFTRUNCATE
if (map->map_lockfd >= 0)
close(map->map_lockfd);
#endif
errno = 0;
syserr("dbm map \"%s\": cannot support GDBM",
map->map_mname);
return FALSE;
}
if (filechanged(dirfile, dfd, &std, sff) ||
filechanged(pagfile, pfd, &stp, sff))
{
@ -944,6 +954,7 @@ ndbm_map_lookup(map, name, av, statp)
datum key, val;
int fd;
char keybuf[MAXNAME + 1];
struct stat stbuf;
if (tTd(38, 20))
printf("ndbm_map_lookup(%s, %s)\n",
@ -960,9 +971,40 @@ ndbm_map_lookup(map, name, av, statp)
makelower(keybuf);
key.dptr = keybuf;
}
lockdbm:
fd = dbm_dirfno((DBM *) map->map_db1);
if (fd >= 0 && !bitset(MF_LOCKED, map->map_mflags))
(void) lockfile(fd, map->map_file, ".dir", LOCK_SH);
if (fd < 0 || fstat(fd, &stbuf) < 0 || stbuf.st_mtime > map->map_mtime)
{
/* Reopen the database to sync the cache */
int omode = bitset(map->map_mflags, MF_WRITABLE) ? O_RDWR
: O_RDONLY;
map->map_class->map_close(map);
map->map_mflags &= ~(MF_OPEN|MF_WRITABLE);
if (map->map_class->map_open(map, omode))
{
map->map_mflags |= MF_OPEN;
if ((omode && O_ACCMODE) == O_RDWR)
map->map_mflags |= MF_WRITABLE;
goto lockdbm;
}
else
{
if (!bitset(MF_OPTIONAL, map->map_mflags))
{
extern MAPCLASS BogusMapClass;
*statp = EX_TEMPFAIL;
map->map_class = &BogusMapClass;
map->map_mflags |= MF_OPEN;
syserr("Cannot reopen NDBM database %s",
map->map_file);
}
return NULL;
}
}
val.dptr = NULL;
if (bitset(MF_TRY0NULL, map->map_mflags))
{
@ -2489,7 +2531,7 @@ ldap_map_lookup(map, name, av, statp)
filter, map->map_mname);
}
result = NULL;
*statp = EX_UNAVAILABLE;
*statp = EX_TEMPFAIL;
goto quick_exit;
}
}

View File

@ -33,7 +33,7 @@
*/
#ifndef lint
static char sccsid[] = "@(#)parseaddr.c 8.130 (Berkeley) 8/2/97";
static char sccsid[] = "@(#)parseaddr.c 8.132 (Berkeley) 10/20/97";
#endif /* not lint */
# include "sendmail.h"
@ -1859,6 +1859,7 @@ struct qflags AddressFlags[] =
{ "QDELIVERED", QDELIVERED },
{ "QDELAYED", QDELAYED },
{ "QTHISPASS", QTHISPASS },
{ "QRCPTOK", QRCPTOK },
{ NULL }
};
@ -2136,7 +2137,11 @@ maplocaluser(a, sendq, aliaslevel, e)
}
pvp = prescan(a->q_user, '\0', pvpbuf, sizeof pvpbuf, &delimptr, NULL);
if (pvp == NULL)
{
if (tTd(29, 9))
printf("maplocaluser: cannot prescan %s\n", a->q_user);
return;
}
define('h', a->q_host, e);
define('u', a->q_user, e);
@ -2144,17 +2149,25 @@ maplocaluser(a, sendq, aliaslevel, e)
if (rewrite(pvp, 5, 0, e) == EX_TEMPFAIL)
{
if (tTd(29, 9))
printf("maplocaluser: rewrite tempfail\n");
a->q_flags |= QQUEUEUP;
a->q_status = "4.4.3";
return;
}
if (pvp[0] == NULL || (pvp[0][0] & 0377) != CANONNET)
{
if (tTd(29, 9))
printf("maplocaluser: doesn't resolve\n");
return;
}
/* if non-null, mailer destination specified -- has it changed? */
a1 = buildaddr(pvp, NULL, 0, e);
if (a1 == NULL || sameaddr(a, a1))
{
if (tTd(29, 9))
printf("maplocaluser: address unchanged\n");
if (a1 != NULL)
free(a1);
return;

View File

@ -36,9 +36,9 @@
#ifndef lint
#if QUEUE
static char sccsid[] = "@(#)queue.c 8.174 (Berkeley) 7/23/97 (with queueing)";
static char sccsid[] = "@(#)queue.c 8.175 (Berkeley) 10/4/97 (with queueing)";
#else
static char sccsid[] = "@(#)queue.c 8.174 (Berkeley) 7/23/97 (without queueing)";
static char sccsid[] = "@(#)queue.c 8.175 (Berkeley) 10/4/97 (without queueing)";
#endif
#endif /* not lint */
@ -474,7 +474,6 @@ printctladdr(a, tfp)
FILE *tfp;
{
char *uname;
char *paddr;
register ADDRESS *q;
uid_t uid;
gid_t gid;
@ -514,12 +513,12 @@ printctladdr(a, tfp)
lastuid = uid;
lastctladdr = a;
paddr = denlstring(a->q_paddr, TRUE, FALSE);
if (uid == 0 || uname == NULL || uname[0] == '\0')
fprintf(tfp, "C:%s\n", paddr);
fprintf(tfp, "C");
else
fprintf(tfp, "C%s:%ld:%ld:%s\n",
uname, (long) uid, (long) gid, paddr);
fprintf(tfp, "C%s:%ld:%ld",
denlstring(uname, TRUE, FALSE), (long) uid, (long) gid);
fprintf(tfp, ":%s\n", denlstring(a->q_paddr, TRUE, FALSE));
}
/*
** RUNQUEUE -- run the jobs in the queue.

View File

@ -33,7 +33,7 @@
*/
#ifndef lint
static char sccsid[] = "@(#)readcf.c 8.200 (Berkeley) 8/2/97";
static char sccsid[] = "@(#)readcf.c 8.201 (Berkeley) 10/1/97";
#endif /* not lint */
# include "sendmail.h"
@ -1521,6 +1521,10 @@ struct optioninfo
#define O_DONTLOCK 0xa5
{ "DontLockFilesForRead", O_DONTLOCK, FALSE },
#endif
#if _FFR_MAXALIASRECURSION_OPTION
#define O_MAXALIASRCSN 0xa6
{ "MaxAliasRecursion", O_MAXALIASRCSN, FALSE },
#endif
{ NULL, '\0', FALSE }
};
@ -2355,6 +2359,12 @@ setoption(opt, val, safe, sticky, e)
break;
#endif
#if _FFR_MAXALIASRECURSION_OPTION
case O_MAXALIASRCSN:
MaxAliasRecursion = atoi(val);
break;
#endif
default:
if (tTd(37, 1))
{

View File

@ -33,7 +33,7 @@
*/
#ifndef lint
static char sccsid[] = "@(#)recipient.c 8.130 (Berkeley) 5/29/97";
static char sccsid[] = "@(#)recipient.c 8.133 (Berkeley) 10/19/97";
#endif /* not lint */
# include "sendmail.h"
@ -263,6 +263,7 @@ recipient(a, sendq, aliaslevel, e)
/* break aliasing loops */
if (aliaslevel > MaxAliasRecursion)
{
a->q_flags |= QBADADDR;
a->q_status = "5.4.6";
usrerr("554 aliasing/forwarding loop broken (%d aliases deep; %d max)",
aliaslevel, MaxAliasRecursion);
@ -327,7 +328,7 @@ recipient(a, sendq, aliaslevel, e)
for (pq = sendq; (q = *pq) != NULL; pq = &q->q_next)
{
if (sameaddr(q, a))
if (sameaddr(q, a) && bitset(QRCPTOK, q->q_flags))
{
if (tTd(26, 1))
{
@ -641,7 +642,7 @@ recipient(a, sendq, aliaslevel, e)
a->q_paddr);
}
}
a->q_flags |= QRCPTOK;
return (a);
}
/*
@ -922,7 +923,7 @@ include(fname, forwarding, ctladdr, sendq, aliaslevel, e)
volatile int sfflags = SFF_REGONLY;
register char *p;
bool safechown = FALSE;
bool safedir = FALSE;
volatile bool safedir = FALSE;
struct stat st;
char buf[MAXLINE];
extern bool chownsafe();

View File

@ -33,7 +33,7 @@
*/
#ifndef lint
static char sccsid[] = "@(#)savemail.c 8.114 (Berkeley) 8/2/97";
static char sccsid[] = "@(#)savemail.c 8.121 (Berkeley) 10/22/97";
#endif /* not lint */
# include "sendmail.h"
@ -85,7 +85,6 @@ savemail(e, sendbody)
int flags;
char buf[MAXLINE+1];
extern char *ttypath();
typedef int (*fnptr)();
extern bool writable();
if (tTd(6, 1))
@ -254,8 +253,29 @@ savemail(e, sendbody)
}
if (!emptyaddr(&e->e_from))
{
(void) sendtolist(e->e_from.q_paddr,
NULLADDR, &e->e_errorqueue, 0, e);
char from[TOBUFSIZE];
extern bool pruneroute __P((char *));
if (strlen(e->e_from.q_paddr) + 1 > sizeof from)
{
state = ESM_POSTMASTER;
break;
}
strcpy(from, e->e_from.q_paddr);
if (!DontPruneRoutes && pruneroute(from))
{
ADDRESS *a;
for (a = e->e_errorqueue; a != NULL;
a = a->q_next)
{
if (sameaddr(a, &e->e_from))
a->q_flags |= QDONTSEND;
}
}
(void) sendtolist(from, NULLADDR,
&e->e_errorqueue, 0, e);
}
/*
@ -379,7 +399,7 @@ savemail(e, sendbody)
break;
}
flags = SFF_NOLINK|SFF_CREAT|SFF_REGONLY|SFF_OPENASROOT|SFF_MUSTOWN;
flags = SFF_NOLINK|SFF_CREAT|SFF_REGONLY|SFF_ROOTOK|SFF_OPENASROOT|SFF_MUSTOWN;
if (!writable(DeadLetterDrop, NULL, flags) ||
(fp = safefopen(DeadLetterDrop, O_WRONLY|O_APPEND,
FileMode, flags)) == NULL)
@ -519,26 +539,12 @@ returntosender(msg, returnq, flags, e)
initsys(ee);
for (q = returnq; q != NULL; q = q->q_next)
{
extern bool pruneroute __P((char *));
if (bitset(QBADADDR, q->q_flags))
continue;
q->q_flags &= ~(QHASNOTIFY|Q_PINGFLAGS);
q->q_flags |= QPINGONFAILURE;
if (!DontPruneRoutes && pruneroute(q->q_paddr))
{
register ADDRESS *p;
parseaddr(q->q_paddr, q, RF_COPYPARSE, '\0', NULL, e);
for (p = returnq; p != NULL; p = p->q_next)
{
if (p != q && sameaddr(p, q))
q->q_flags |= QDONTSEND;
}
}
if (!bitset(QDONTSEND, q->q_flags))
ee->e_nrcpts++;
@ -650,7 +656,7 @@ returntosender(msg, returnq, flags, e)
return 0;
for (q = ee->e_sendqueue; q != NULL; q = q->q_next)
{
if (bitset(QSENT, q->q_flags))
if (bitset(QQUEUEUP|QSENT, q->q_flags))
return 0;
}
return -1;
@ -681,7 +687,7 @@ errbody(mci, e, separator)
{
register FILE *xfile;
char *p;
register ADDRESS *q;
register ADDRESS *q = NULL;
bool printheader;
bool sendbody;
bool pm_notify;
@ -1001,18 +1007,24 @@ errbody(mci, e, separator)
p = "rfc822";
for (r = q; r->q_alias != NULL; r = r->q_alias)
continue;
if (strchr(r->q_user, '@') == NULL)
{
(void) snprintf(buf, sizeof buf,
"Final-Recipient: %s; %.700s@%.100s",
p, r->q_user, MyHostName);
}
else
if (strchr(r->q_user, '@') != NULL)
{
(void) snprintf(buf, sizeof buf,
"Final-Recipient: %s; %.800s",
p, r->q_user);
}
else if (strchr(r->q_paddr, '@') != NULL)
{
(void) snprintf(buf, sizeof buf,
"Final-Recipient: %s; %.800s",
p, r->q_paddr);
}
else
{
(void) snprintf(buf, sizeof buf,
"Final-Recipient: %s; %.700s@%.100s",
p, r->q_user, MyHostName);
}
putline(buf, mci);
/* X-Actual-Recipient: -- the real problem address */

View File

@ -31,7 +31,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)sendmail.h 8.242 (Berkeley) 8/2/97
* @(#)sendmail.h 8.245 (Berkeley) 10/22/97
*/
/*
@ -41,7 +41,7 @@
# ifdef _DEFINE
# define EXTERN
# ifndef lint
static char SmailSccsId[] = "@(#)sendmail.h 8.242 8/2/97";
static char SmailSccsId[] = "@(#)sendmail.h 8.245 10/22/97";
# endif
# else /* _DEFINE */
# define EXTERN extern
@ -206,6 +206,7 @@ typedef struct address ADDRESS;
# define QDELIVERED 0x00040000 /* DSN: successful final delivery */
# define QDELAYED 0x00080000 /* DSN: message delayed */
# define QTHISPASS 0x40000000 /* temp: address set this pass */
# define QRCPTOK 0x80000000 /* recipient() processed address */
# define Q_PINGFLAGS (QPINGONSUCCESS|QPINGONFAILURE|QPINGONDELAY)
@ -928,6 +929,7 @@ EXTERN int NoRecipientAction;
#define PXLF_NOTHINGSPECIAL 0 /* no special mapping */
#define PXLF_MAPFROM 0x0001 /* map From_ to >From_ */
#define PXLF_STRIP8BIT 0x0002 /* strip 8th bit */
#define PXLF_HEADER 0x0004 /* map newlines in headers */
/*
** Additional definitions
*/
@ -1231,7 +1233,6 @@ EXTERN int MaxRuleRecursion; /* maximum depth of ruleset recursion */
EXTERN char *MustQuoteChars; /* quote these characters in phrases */
EXTERN char *ServiceSwitchFile; /* backup service switch */
EXTERN char *DefaultCharSet; /* default character set for MIME */
EXTERN int DeliveryNiceness; /* how nice to be during delivery */
EXTERN char *PostMasterCopy; /* address to get errs cc's */
EXTERN int CheckpointInterval; /* queue file checkpoint interval */
EXTERN bool DontPruneRoutes; /* don't prune source routes */

View File

@ -36,9 +36,9 @@
#ifndef lint
#if SMTP
static char sccsid[] = "@(#)srvrsmtp.c 8.154 (Berkeley) 8/2/97 (with SMTP)";
static char sccsid[] = "@(#)srvrsmtp.c 8.159 (Berkeley) 10/19/97 (with SMTP)";
#else
static char sccsid[] = "@(#)srvrsmtp.c 8.154 (Berkeley) 8/2/97 (without SMTP)";
static char sccsid[] = "@(#)srvrsmtp.c 8.159 (Berkeley) 10/19/97 (without SMTP)";
#endif
#endif /* not lint */
@ -153,7 +153,7 @@ smtp(nullserver, e)
volatile int n_noop = 0; /* count of NOOP/VERB/ONEX etc cmds */
volatile int n_helo = 0; /* count of HELO/EHLO commands */
bool ok;
int lognullconnection = TRUE;
volatile int lognullconnection = TRUE;
register char *q;
char inp[MAXLINE];
char cmdbuf[MAXLINE];
@ -252,6 +252,18 @@ smtp(nullserver, e)
sm_syslog(LOG_NOTICE, e->e_id,
"lost input channel from %.100s",
CurSmtpClient);
if (lognullconnection && LogLevel > 5)
sm_syslog(LOG_INFO, NULL,
"Null connection from %.100s",
CurSmtpClient);
/*
** If have not accepted mail (DATA), do not bounce
** bad addresses back to sender.
*/
if (bitset(EF_CLRQUEUE, e->e_flags))
e->e_sendqueue = NULL;
if (InChild)
ExitStat = EX_QUIT;
finis();
@ -872,6 +884,7 @@ smtp(nullserver, e)
shortenstring(inp, 203));
if (setjmp(TopFrame) > 0)
goto undo_subproc;
QuickAbort = TRUE;
vrfyqueue = NULL;
if (vrfy)
e->e_flags |= EF_VRFYONLY;
@ -917,16 +930,17 @@ smtp(nullserver, e)
/* crude way to avoid denial-of-service attacks */
checksmtpattack(&n_etrn, MAXETRNCOMMANDS, "ETRN", e);
if (LogLevel > 5)
sm_syslog(LOG_INFO, e->e_id,
"%.100s: ETRN %s",
CurSmtpClient,
shortenstring(p, 203));
id = p;
if (*id == '@')
id++;
else
*--id = '@';
if (LogLevel > 5)
sm_syslog(LOG_INFO, e->e_id,
"%.100s: ETRN %s",
CurSmtpClient,
shortenstring(id, 203));
QueueLimitRecipient = id;
ok = runqueue(TRUE, TRUE);
QueueLimitRecipient = NULL;

View File

@ -36,9 +36,9 @@
#ifndef lint
#if SMTP
static char sccsid[] = "@(#)usersmtp.c 8.87 (Berkeley) 6/3/97 (with SMTP)";
static char sccsid[] = "@(#)usersmtp.c 8.88 (Berkeley) 10/20/97 (with SMTP)";
#else
static char sccsid[] = "@(#)usersmtp.c 8.87 (Berkeley) 6/3/97 (without SMTP)";
static char sccsid[] = "@(#)usersmtp.c 8.88 (Berkeley) 10/20/97 (without SMTP)";
#endif
#endif /* not lint */
@ -60,7 +60,6 @@ static char sccsid[] = "@(#)usersmtp.c 8.87 (Berkeley) 6/3/97 (without SMTP)";
char SmtpMsgBuffer[MAXLINE]; /* buffer for commands */
char SmtpReplyBuffer[MAXLINE]; /* buffer for replies */
char SmtpError[MAXLINE] = ""; /* save failure error messages */
int SmtpPid; /* pid of mailer */
bool SmtpNeedIntro; /* need "while talking" in transcript */
extern void smtpmessage __P((char *f, MAILER *m, MCI *mci, ...));

View File

@ -33,7 +33,7 @@
*/
#ifndef lint
static char sccsid[] = "@(#)util.c 8.133 (Berkeley) 8/1/97";
static char sccsid[] = "@(#)util.c 8.137 (Berkeley) 10/22/97";
#endif /* not lint */
# include "sendmail.h"
@ -520,6 +520,7 @@ putline(l, mci)
** pxflags -- flag bits:
** PXLF_MAPFROM -- map From_ to >From_.
** PXLF_STRIP8BIT -- strip 8th bit.
** PXLF_HEADER -- map bare newline in header to newline space.
**
** Returns:
** none
@ -626,7 +627,8 @@ putxline(l, len, mci, pxflags)
fputs(mci->mci_mailer->m_eol, mci->mci_out);
if (l < end && *l == '\n')
{
if (*++l != ' ' && *l != '\t' && *l != '\0')
if (*++l != ' ' && *l != '\t' && *l != '\0' &&
bitset(PXLF_HEADER, pxflags))
{
(void) putc(' ', mci->mci_out);
if (TrafficLogFile != NULL)
@ -1058,7 +1060,6 @@ checkfd012(where)
{
#if XDEBUG
register int i;
struct stat stbuf;
for (i = 0; i < 3; i++)
fill_fd(i, where);
@ -1199,7 +1200,6 @@ dumpfd(fd, printclosed, logit)
int i;
struct stat st;
char buf[200];
extern char *hostnamebyanyaddr();
p = buf;
snprintf(p, SPACELEFT(buf, p), "%3d: ", fd);
@ -1311,7 +1311,7 @@ dumpfd(fd, printclosed, logit)
printit:
if (logit)
sm_syslog(LOG_DEBUG, CurEnv->e_id,
sm_syslog(LOG_DEBUG, CurEnv ? CurEnv->e_id : NULL,
"%.800s", buf);
else
printf("%s\n", buf);

View File

@ -33,7 +33,7 @@
*/
#ifndef lint
static char sccsid[] = "@(#)version.c 8.8.7.3 (Berkeley) 8/3/97";
static char sccsid[] = "@(#)version.c 8.8.8.1 (Berkeley) 10/24/97";
#endif /* not lint */
char Version[] = "8.8.7";
char Version[] = "8.8.8";

View File

@ -19,6 +19,8 @@
** HP-UX 10.20 OK
** Irix 5.3 OK
** Irix 6.2 OK
** Irix 6.3 OK
** Irix 6.4 OK
** Linux OK
** NeXT 2.1 OK
** Solaris 2.x OK