mirror of
https://github.com/opnsense/src.git
synced 2026-06-11 01:30:30 -04:00
Import sendmail 8.8.4. See RELEASE_NOTES for changes.
This commit is contained in:
parent
fcf445de96
commit
33cdb0aebd
38 changed files with 1201 additions and 446 deletions
|
|
@ -1,11 +1,110 @@
|
|||
SENDMAIL RELEASE NOTES
|
||||
@(#)RELEASE_NOTES 8.8.3.2 (Berkeley) 11/16/96
|
||||
@(#)RELEASE_NOTES 8.8.4.4 (Berkeley) 12/2/96
|
||||
|
||||
|
||||
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.4/8.8.4 96/12/02
|
||||
SECURITY: under some circumstances, an attacker could get additional
|
||||
permissions by hard linking to files that were group
|
||||
writable by the attacker. The solution is to disallow any
|
||||
files that have hard links -- this will affect .forward,
|
||||
:include:, and output files. Problem noted by Terry
|
||||
Kyriacopoulos of Interlog Internet Services. As a
|
||||
workaround, set UnsafeGroupWrites -- always a good idea.
|
||||
SECURITY: the TryNullMXList (w) option should not be safe -- if it
|
||||
is, it is possible to do a denial-of-service attack on
|
||||
MX hosts that rely on the use of the null MX list. There
|
||||
is no danger if you have this option turned off (the default).
|
||||
Problem noted by Dan Bernstein. Also, make the DontInitGroups
|
||||
unsafe. I know of no specific attack against this, although
|
||||
a denial-of-service attack is probably possible, but in theory
|
||||
you should not be able to safely tweak anything that affects
|
||||
the permissions that are used when mail is delivered.
|
||||
Purgestat could go into an infinite loop if one of the host status
|
||||
directories somehow became empty. Problem noted by Roy
|
||||
Mongiovi of Georgia Tech.
|
||||
Processes got "lost" when counting children due to a race condition.
|
||||
This caused "proc_list_probe: lost pid" messages to be logged.
|
||||
Problem noted by several people.
|
||||
On systems with System V SIGCLD child signal semantics (notably AIX
|
||||
and HP-UX), mail transactions would print the message "451
|
||||
SMTP-MAIL: lost child: No child processes". Problem noted
|
||||
by several people.
|
||||
Miscellaneous compiler warnings on picky compilers (or when setting
|
||||
gcc to high warning levels). From Tom Moore of NCR Corp.
|
||||
SMTP protocol errors, and most errors on MAIL FROM: lines should
|
||||
not be persistent between runs, since they are based on the
|
||||
message rather than the host. Problem noted by Matt Dillon
|
||||
of Best Internet Communications.
|
||||
The F=7 flag was ignored on SMTP mailers. Problem noted by Tom Moore
|
||||
of NCR (a.k.a., AT&T Global Information Solutions).
|
||||
Avoid the possibility of having a child daemon run to completion
|
||||
(including closing the SMTP socket) before the parent has
|
||||
had a chance to close the socket; this can cause the parent
|
||||
to hang for a long time waiting for the socket to drain.
|
||||
Patch from Don Lewis of TDK Semiconductor.
|
||||
If the fork() failed in a queue run, the queue runners would not be
|
||||
rescheduled (so queue runs would stop). Patch from Don Lewis.
|
||||
Some error conditions in ETRN could cause output without an SMTP
|
||||
status code. Problem noted by Don Lewis.
|
||||
Multiple :maildrop addresses in the user database didn't work properly.
|
||||
Patch from Roy Mongiovi of Georgia Tech.
|
||||
Add ".db" automatically onto any user database spec that does not
|
||||
already have it; this is for consistency with makemap, the
|
||||
K line, and the documentation. Inconsistency pointed out
|
||||
by Roy Mongiovi.
|
||||
Allow sendmail to be properly called in nohup mode. Patch from
|
||||
Kyle Jones of UUNET.
|
||||
Change ETRN to ignore but still update host status files; previously
|
||||
it would ignore them and not save the updated status, which
|
||||
caused stale information to be maintained. Based on a patch
|
||||
from Christopher Davis of Kapor Enterprises Inc. Also, have
|
||||
ETRN ignore the MinQueueAge option.
|
||||
Patch long term host status to recover more gracefully from an empty
|
||||
host status file condition. Patch from NAKAMURA Motonori
|
||||
of Kyoto University.
|
||||
Several patches to signal handling code to fix potential race
|
||||
conditions from Don Lewis.
|
||||
Make it possible to compile with -DDAEMON=0 (previously it had some
|
||||
compile errors). This turns DAEMON, QUEUE, and SMTP into
|
||||
0/1 compilation flags. Note that DAEMON is an obsolete
|
||||
compile flag; use NETINET instead. Solution based on a
|
||||
patch from Bryan Costales.
|
||||
PORTABILITY FIXES:
|
||||
AIX4: getpwnam() and getpwuid() do a sequential scan of the
|
||||
/etc/security/passwd file when called as root. This
|
||||
is very slow on some systems. To speed it up, use the
|
||||
(undocumented) _getpw{nam,uid}_shadow() routines.
|
||||
Patch from Chris Thomas of UCLA/OAC Systems Group.
|
||||
SCO 5.x: include -lprot in the Makefile. Patch from Bill
|
||||
Glicker of Burrelle's Information Service.
|
||||
NEWS-OS 4.x: need a definition for MODE_T to compile. Patch
|
||||
from Makoto MATSUSHITA of Osaka University.
|
||||
SunOS 4.0.3: compile problems. Patches from Andrew Cole of
|
||||
Leeds University and SASABE Tetsuro of the University
|
||||
of Tokyo.
|
||||
DG/UX 5.4.4.11 from Brian J. Murrell of InterLinx Support
|
||||
Services, Inc.
|
||||
Domain/OS from Don (Truck) Lewis of TDK Semiconductor Corp.
|
||||
I believe this to have only been a problem if you
|
||||
compiled with -DUSE_VENDOR_CF_PATH -- another reason
|
||||
to stick with /etc/sendmail.cf as your One True Path.
|
||||
Digital UNIX (OSF/1 on Alpha) load average computation from
|
||||
Martin Laubach of the Technischen Universität Wien.
|
||||
CONFIG: change default Received: line to be multiple lines rather
|
||||
than one long one. By popular demand.
|
||||
MAIL.LOCAL: warnings weren't being logged on some systems. Patch
|
||||
from Jerome Berkman of U.C. Berkeley.
|
||||
MAKEMAP: be sure to zero hinfo to avoid cruft that can cause runs
|
||||
to take a very long time. Problem noted by Yoshiro YONEYA
|
||||
of NTT Software Corporation.
|
||||
CONTRIB: add etrn.pl, contributed by John Beck.
|
||||
NEW FILES:
|
||||
contrib/etrn.pl
|
||||
|
||||
8.8.3/8.8.3 96/11/17
|
||||
SECURITY: it was possible to get a root shell by lying to sendmail
|
||||
about argv[0] and then sending it a signal. Problem noted
|
||||
|
|
@ -83,7 +182,7 @@ summary of the changes in that release.
|
|||
AIX4: use tzname[] vector to determine time zone name.
|
||||
Patch from NAKAMURA Motonori of Kyoto University.
|
||||
MkLinux: add Makefile.Linux.ppc and OSTYPE(mklinux) support.
|
||||
Contributed by Paul DeBois <dubois@primate.wisc.edu>.
|
||||
Contributed by Paul DuBois <dubois@primate.wisc.edu>.
|
||||
Solaris: kstat(3k) support for retrieving the load average.
|
||||
This adds the LA_KSTAT definition for LA_TYPE.
|
||||
The outline of the implementation was contributed
|
||||
|
|
|
|||
|
|
@ -128,7 +128,9 @@ define(`confMAILER_NAME', ``MAILER-DAEMON'')
|
|||
define(`confFROM_LINE', `From $g $d')
|
||||
define(`confOPERATORS', `.:%@!^/[]+')
|
||||
define(`confSMTP_LOGIN_MSG', `$j Sendmail $v/$Z; $b')
|
||||
define(`confRECEIVED_HEADER', `$?sfrom $s $.$?_($?s$|from $.$_) $.by $j ($v/$Z)$?r with $r$. id $i$?u for $u$.; $b')
|
||||
define(`confRECEIVED_HEADER', `$?sfrom $s $.$?_($?s$|from $.$_)
|
||||
$.by $j ($v/$Z)$?r with $r$.
|
||||
id $i$?u for $u$.; $b')
|
||||
define(`confSEVEN_BIT_INPUT', `False')
|
||||
define(`confEIGHT_BIT_HANDLING', `pass8')
|
||||
define(`confALIAS_WAIT', `10')
|
||||
|
|
@ -154,4 +156,4 @@ define(`confMIME_FORMAT_ERRORS', `True')
|
|||
define(`confFORWARD_PATH', `$z/.forward.$w:$z/.forward')
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`@(#)cfhead.m4 8.6 (Berkeley) 6/19/96')
|
||||
VERSIONID(`@(#)cfhead.m4 8.7 (Berkeley) 11/20/96')
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ divert(-1)
|
|||
#
|
||||
divert(0)
|
||||
|
||||
VERSIONID(`@(#)proto.m4 8.135 (Berkeley) 10/26/96')
|
||||
VERSIONID(`@(#)proto.m4 8.136 (Berkeley) 11/24/96')
|
||||
|
||||
MAILER(local)dnl
|
||||
|
||||
|
|
@ -428,7 +428,7 @@ _OPTION(OperatorChars, `confOPERATORS')
|
|||
# shall I avoid calling initgroups(3) because of high NIS costs?
|
||||
_OPTION(DontInitGroups, `confDONT_INIT_GROUPS')
|
||||
|
||||
# are group-writable :include: and .forward files (un)trustworthy?
|
||||
# are group-writable `:include:' and .forward files (un)trustworthy?
|
||||
_OPTION(UnsafeGroupWrites, `confUNSAFE_GROUP_WRITES')
|
||||
|
||||
# where do errors that occur when sending errors get sent?
|
||||
|
|
@ -635,7 +635,7 @@ ifdef(`_USE_DECNET_SYNTAX_',
|
|||
R$+ @ $+ . DECNET $2 :: $1 u@h.DECNET => h::u',
|
||||
`dnl')
|
||||
# delete duplicate local names
|
||||
R$+ % $=w @ $=w $1 @ $j u%host@host => u@host
|
||||
R$+ % $=w @ $=w $1 @ $2 u%host@host => u@host
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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.3.1 (Berkeley) 11/16/96')
|
||||
VERSIONID(`@(#)version.m4 8.8.4.2 (Berkeley) 11/26/96')
|
||||
#
|
||||
divert(0)
|
||||
# Configuration version number
|
||||
DZ8.8.3`'ifdef(`confCF_VERSION', `/confCF_VERSION')
|
||||
DZ8.8.4`'ifdef(`confCF_VERSION', `/confCF_VERSION')
|
||||
|
|
|
|||
|
|
@ -32,11 +32,11 @@ divert(-1)
|
|||
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
# SUCH DAMAGE.
|
||||
#
|
||||
# MkLinux support contributed by Paul DeBois <dubois@primate.wisc.edu>
|
||||
# MkLinux support contributed by Paul DuBois <dubois@primate.wisc.edu>
|
||||
#
|
||||
|
||||
divert(0)
|
||||
VERSIONID(`@(#)mklinux.m4 8.1 (Berkeley) 10/30/96')
|
||||
VERSIONID(`@(#)mklinux.m4 8.2 (Berkeley) 11/17/96')
|
||||
ifdef(`STATUS_FILE',,
|
||||
`define(`STATUS_FILE', /var/log/sendmail.st)')
|
||||
ifdef(`PROCMAIL_MAILER_PATH',,
|
||||
|
|
|
|||
301
usr.sbin/sendmail/contrib/etrn.pl
Executable file
301
usr.sbin/sendmail/contrib/etrn.pl
Executable file
|
|
@ -0,0 +1,301 @@
|
|||
#!/usr/local/bin/perl
|
||||
'di ';
|
||||
'ds 00 \\"';
|
||||
'ig 00 ';
|
||||
#
|
||||
# THIS PROGRAM IS ITS OWN MANUAL PAGE. INSTALL IN man & bin.
|
||||
#
|
||||
|
||||
# hardcoded constants, should work fine for BSD-based systems
|
||||
require 'sys/socket.ph';
|
||||
$sockaddr = 'S n a4 x8';
|
||||
|
||||
# system requirements:
|
||||
# must have 'hostname' program.
|
||||
|
||||
#############################################################################
|
||||
# Copyright (c) 1996 John T. Beck <john@beck.org>
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# 3. All advertising materials mentioning features or use of this software
|
||||
# must display the following acknowledgement:
|
||||
# This product includes software developed by John T. Beck.
|
||||
# 4. The name of John Beck may not be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY JOHN T. BECK ``AS IS'' AND ANY EXPRESS OR
|
||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
# IN NO EVENT SHALL JOHN T. BECK BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# This copyright notice derived from material copyrighted by the Regents
|
||||
# of the University of California.
|
||||
#
|
||||
# Contributions accepted.
|
||||
#############################################################################
|
||||
# Further disclaimer: the etrn.pl script was highly leveraged from the
|
||||
# expn.pl script which is (C) 1993 David Muir Sharnoff.
|
||||
#############################################################################
|
||||
|
||||
$port = 'smtp';
|
||||
$av0 = $0;
|
||||
select(STDERR);
|
||||
|
||||
$0 = "$av0 - running hostname";
|
||||
chop($name = `hostname || uname -n`);
|
||||
|
||||
$0 = "$av0 - lookup host FQDN and IP addr";
|
||||
($hostname,$aliases,$type,$len,$thisaddr) = gethostbyname($name);
|
||||
|
||||
push(@hosts,$hostname);
|
||||
|
||||
$0 = "$av0 - parsing sendmail.cf";
|
||||
open(CF, "</etc/sendmail.cf") || die "open /etc/sendmail.cf: $!";
|
||||
while (<CF>){
|
||||
if (/^Fw.*$/){ # look for a line starting with "Fw"
|
||||
$cwfile = $_;
|
||||
chop($cwfile);
|
||||
$optional = /^Fw-o/;
|
||||
$cwfile =~ s,^Fw[^/]*,,; # extract the file name
|
||||
}
|
||||
}
|
||||
close(CF);
|
||||
|
||||
$0 = "$av0 - reading $cwfile";
|
||||
if (open(CW, "<$cwfile")){
|
||||
while (<CW>){
|
||||
$thishost = $_;
|
||||
chop($thishost);
|
||||
push(@hosts, $thishost) unless $thishost =~ $hostname;
|
||||
}
|
||||
close(CW);
|
||||
} else {
|
||||
die "open $cwfile: $!" unless optional;
|
||||
}
|
||||
|
||||
$0 = "$av0 - parsing args";
|
||||
$usage = "Usage: $av0 [-wd] host";
|
||||
for $a (@ARGV) {
|
||||
die $usage if $a eq "-";
|
||||
while ($a =~ s/^(-.*)([wd])/$1/) {
|
||||
eval '$'."flag_$2 += 1";
|
||||
}
|
||||
next if $a eq "-";
|
||||
die $usage if $a =~ /^-/;
|
||||
$server = $a;
|
||||
}
|
||||
$watch = $flag_w;
|
||||
$debug = $flag_d;
|
||||
|
||||
die $usage unless $server;
|
||||
|
||||
$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);
|
||||
|
||||
# look it up
|
||||
$0 = "$av0 - gethostbyname($server)";
|
||||
|
||||
($name,$aliases,$type,$len,$thataddr) = gethostbyname($server);
|
||||
|
||||
# get a connection
|
||||
$0 = "$av0 - socket to $server";
|
||||
$that = pack($sockaddr, &AF_INET, $port, $thataddr);
|
||||
socket(S, &AF_INET, &SOCK_STREAM, $proto)
|
||||
|| die "socket: $!";
|
||||
$0 = "$av0 - 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)) {
|
||||
$0 = "$av0 - $server: could not connect: $!\n";
|
||||
}
|
||||
select((select(S),$| = 1)[0]); # don't buffer output to S
|
||||
|
||||
# read the greeting
|
||||
$0 = "$av0 - talking to $server";
|
||||
&alarm("greeting with $server",'');
|
||||
while(<S>) {
|
||||
alarm(0);
|
||||
print if $watch;
|
||||
if (/^(\d+)([- ])/) {
|
||||
if ($1 != 220) {
|
||||
$0 = "$av0 - bad numeric response from $server";
|
||||
&alarm("giving up after bad response from $server",'');
|
||||
&read_response($2,$watch);
|
||||
alarm(0);
|
||||
print STDERR "$server: NOT 220 greeting: $_"
|
||||
if ($debug || $watch);
|
||||
}
|
||||
last if ($2 eq " ");
|
||||
} else {
|
||||
$0 = "$av0 - bad response from $server";
|
||||
print STDERR "$server: NOT 220 greeting: $_"
|
||||
if ($debug || $watch);
|
||||
close(S);
|
||||
}
|
||||
&alarm("greeting with $server",'');
|
||||
}
|
||||
alarm(0);
|
||||
|
||||
# if this causes problems, remove it
|
||||
$0 = "$av0 - sending helo to $server";
|
||||
&alarm("sending ehlo to $server","");
|
||||
&ps("ehlo $hostname");
|
||||
$etrn_support = 0;
|
||||
while(<S>) {
|
||||
if (/^250([- ])ETRN(.+)$/){
|
||||
$etrn_support = 1;
|
||||
}
|
||||
print if $watch;
|
||||
last if /^\d+ /;
|
||||
}
|
||||
alarm(0);
|
||||
|
||||
if ($etrn_support){
|
||||
print "ETRN supported\n" if ($debug)
|
||||
&alarm("sending etrn to $server",'');
|
||||
while (@hosts) {
|
||||
$server = shift(@hosts);
|
||||
&ps("etrn $server");
|
||||
while(<S>) {
|
||||
print if $watch;
|
||||
last if /^\d+ /;
|
||||
}
|
||||
sleep(1);
|
||||
}
|
||||
} else {
|
||||
print "\nETRN not supported\n\n"
|
||||
}
|
||||
|
||||
&alarm("sending 'quit' to $server",'');
|
||||
$0 = "$av0 - sending 'quit' to $server";
|
||||
&ps("quit");
|
||||
while(<S>) {
|
||||
print if $watch;
|
||||
last if /^\d+ /;
|
||||
}
|
||||
close(S);
|
||||
alarm(0);
|
||||
|
||||
select(STDOUT);
|
||||
exit(0);
|
||||
|
||||
# print to the server (also to stdout, if -w)
|
||||
sub ps
|
||||
{
|
||||
local($p) = @_;
|
||||
print ">>> $p\n" if $watch;
|
||||
print S "$p\n";
|
||||
}
|
||||
|
||||
sub alarm
|
||||
{
|
||||
local($alarm_action,$alarm_redirect,$alarm_user) = @_;
|
||||
alarm(3600);
|
||||
$SIG{ALRM} = 'handle_alarm';
|
||||
}
|
||||
|
||||
sub handle_alarm
|
||||
{
|
||||
&giveup($alarm_redirect,"Timed out during $alarm_action",$alarm_user);
|
||||
}
|
||||
|
||||
# read the rest of the current smtp daemon's response (and toss it away)
|
||||
sub read_response
|
||||
{
|
||||
local($done,$watch) = @_;
|
||||
local(@resp);
|
||||
print $s if $watch;
|
||||
while(($done eq "-") && ($s = <S>) && ($s =~ /^\d+([- ])/)) {
|
||||
print $s if $watch;
|
||||
$done = $1;
|
||||
push(@resp,$s);
|
||||
}
|
||||
return @resp;
|
||||
}
|
||||
# to pass perl -w:
|
||||
@tp;
|
||||
$flag_a;
|
||||
$flag_d;
|
||||
&handle_alarm;
|
||||
################### BEGIN PERL/TROFF TRANSITION
|
||||
.00 ;
|
||||
|
||||
'di
|
||||
.nr nl 0-1
|
||||
.nr % 0
|
||||
.\\"'; __END__
|
||||
.\" ############## END PERL/TROFF TRANSITION
|
||||
.TH ETRN 1 "November 16, 1996"
|
||||
.AT 3
|
||||
.SH NAME
|
||||
etrn \- start mail queue run
|
||||
.SH SYNOPSIS
|
||||
.B etrn
|
||||
.RI [ -w ]
|
||||
.RI [ -d ]
|
||||
.IR hostname
|
||||
.SH DESCRIPTION
|
||||
.B etrn
|
||||
will use the SMTP
|
||||
.B etrn
|
||||
command to start mail delivery from the host given on the command line.
|
||||
.SH OPTIONS
|
||||
.LP
|
||||
The normal mode of operation for
|
||||
.B etrn
|
||||
is to do all of its work silently.
|
||||
The following options make it more verbose.
|
||||
It is not necessary to make it verbose to see what it is
|
||||
doing because as it works, it changes its
|
||||
.BR argv [0]
|
||||
variable to reflect its current activity.
|
||||
The
|
||||
.IR -w ,
|
||||
watch, flag will cause
|
||||
.B etrn
|
||||
to show you its conversations with the mail daemons.
|
||||
The
|
||||
.IR -d ,
|
||||
debug, flag will expose many of the inner workings so that
|
||||
it is possible to eliminate bugs.
|
||||
.SH ENVIRONMENT
|
||||
No enviroment variables are used.
|
||||
.SH FILES
|
||||
.B /etc/sendmail.cf
|
||||
.SH SEE ALSO
|
||||
.BR sendmail (8),
|
||||
RFC 1985.
|
||||
.SH BUGS
|
||||
Not all mail daemons will implement
|
||||
.B etrn .
|
||||
.LP
|
||||
It is assumed that you are running domain names.
|
||||
.SH CREDITS
|
||||
Leveraged from David Muir Sharnoff's expn.pl script.
|
||||
.SH AVAILABILITY
|
||||
The latest version of
|
||||
.B etrn
|
||||
is available in the contrib directory of the sendmail
|
||||
distribution through anonymous ftp at
|
||||
.IR ftp://ftp.sendmail.org/ucb/src/sendmail/ .
|
||||
.SH AUTHOR
|
||||
.I John T. Beck\ \ \ \ <john@beck.org>
|
||||
|
|
@ -30,7 +30,7 @@
|
|||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" @(#)op.me 8.98 (Berkeley) 11/16/96
|
||||
.\" @(#)op.me 8.100 (Berkeley) 12/1/96
|
||||
.\"
|
||||
.\" eqn op.me | pic | troff -me
|
||||
.eh 'SMM:08-%''Sendmail Installation and Operation Guide'
|
||||
|
|
@ -68,7 +68,7 @@ Eric Allman
|
|||
InReference, Inc.
|
||||
eric@Sendmail.ORG
|
||||
.sp
|
||||
Version 8.98
|
||||
Version 8.100
|
||||
.sp
|
||||
For Sendmail Version 8.8
|
||||
.)l
|
||||
|
|
@ -5845,7 +5845,7 @@ to the list of recognized vendors by editing the routine
|
|||
.i setvendor
|
||||
in
|
||||
.i conf.c .
|
||||
Please send e-mail to sendmail@CS.Berkeley.EDU
|
||||
Please send e-mail to sendmail@Sendmail.ORG
|
||||
to register your vendor dialect.
|
||||
.)f
|
||||
You may use
|
||||
|
|
@ -6619,12 +6619,12 @@ you can set this flag to turn off special processing
|
|||
of UNIX-style
|
||||
.q "From "
|
||||
lines.
|
||||
.ip QUEUE
|
||||
.ip QUEUE\(dg
|
||||
This flag should be set to compile in the queueing code.
|
||||
If this is not set,
|
||||
mailers must accept the mail immediately
|
||||
or it will be returned to the sender.
|
||||
.ip SMTP
|
||||
.ip SMTP\(dg
|
||||
If set,
|
||||
the code to handle user and server SMTP will be compiled in.
|
||||
This is only necessary if your machine has some mailer
|
||||
|
|
@ -7156,7 +7156,7 @@ If you are porting to a new environment
|
|||
you may need to add some new tweaks.\**
|
||||
.(f
|
||||
\**If you do, please send updates to
|
||||
sendmail@CS.Berkeley.EDU.
|
||||
sendmail@Sendmail.ORG.
|
||||
.)f
|
||||
.sh 2 "Configuration in src/daemon.c"
|
||||
.pp
|
||||
|
|
@ -7686,7 +7686,7 @@ I appreciate their contribution as well.
|
|||
.pp
|
||||
Special thanks are reserved for Michael Corrigan and Christophe Wolfhugel,
|
||||
who besides being wonderful guinea pigs and contributors
|
||||
have also consented to be added to the ``sendmail@CS.Berkeley.EDU'' list
|
||||
have also consented to be added to the ``sendmail@Sendmail.ORG'' list
|
||||
and, by answering the bulk of the questions sent to that list,
|
||||
have freed me up to do other work.
|
||||
.++ A
|
||||
|
|
@ -8150,7 +8150,7 @@ A transcript of the current session.
|
|||
.\"Eric Allman
|
||||
.\"InReference, Inc.
|
||||
.\".sp
|
||||
.\"Version 8.98
|
||||
.\"Version 8.100
|
||||
.\".ce 0
|
||||
.bp 2
|
||||
.rs
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ static char copyright[] =
|
|||
#endif /* not lint */
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)mail.local.c 8.33 (Berkeley) 11/13/96";
|
||||
static char sccsid[] = "@(#)mail.local.c 8.34 (Berkeley) 11/24/96";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
|
|
@ -646,7 +646,7 @@ vwarn(fmt, ap)
|
|||
{
|
||||
char fmtbuf[10240];
|
||||
|
||||
(void) sprintf(fmtbuf, fmt, ap);
|
||||
(void) vsprintf(fmtbuf, fmt, ap);
|
||||
syslog(LOG_ERR, "%s", fmtbuf);
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)makemap.c 8.18 (Berkeley) 11/13/96";
|
||||
static char sccsid[] = "@(#)makemap.c 8.19 (Berkeley) 11/18/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <stdio.h>
|
||||
|
|
@ -237,6 +237,7 @@ main(argc, argv)
|
|||
break;
|
||||
|
||||
case T_HASH:
|
||||
bzero(&hinfo, sizeof hinfo);
|
||||
if (allowreplace)
|
||||
putflags = 0;
|
||||
else
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
# SUCH DAMAGE.
|
||||
#
|
||||
# @(#)READ_ME 8.130 (Berkeley) 11/10/96
|
||||
# @(#)READ_ME 8.132 (Berkeley) 12/1/96
|
||||
#
|
||||
|
||||
This directory contains the source files for sendmail.
|
||||
|
|
@ -175,6 +175,10 @@ LDAPMAP Lightweight Directory Lookup Protocol support. You will
|
|||
>>> OVERRIDE calls to ndbm routines -- in particular, if you leave ndbm.h
|
||||
>>> in, you can find yourself using the new db package even if you don't
|
||||
>>> define NEWDB.
|
||||
>>>
|
||||
>>> Further note: DO NOT remove your existing /usr/include/ndbm.h --
|
||||
>>> you need that one. But do not install an updated ndbm.h in
|
||||
>>> /usr/include, /usr/local/include, or anywhere else.
|
||||
|
||||
If NEWDB and NDBM are defined (but not NIS), then sendmail will read
|
||||
NDBM format alias files, but the next time a newaliases is run the
|
||||
|
|
@ -790,6 +794,23 @@ Ultrix
|
|||
IDENT on in the configuration file by setting the "ident" timeout
|
||||
to 30 seconds.
|
||||
|
||||
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:
|
||||
|
||||
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 file in the
|
||||
obj.SunOS.5.5.1.* directory that reads:
|
||||
|
||||
#undef __P
|
||||
#include "/usr/include/resolv.h"
|
||||
|
||||
... And then file a bug report with Sun.
|
||||
|
||||
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
|
||||
|
|
@ -1377,4 +1398,4 @@ version.c The version number and information about this
|
|||
|
||||
Eric Allman
|
||||
|
||||
(Version 8.130, last update 11/10/96 11:15:30)
|
||||
(Version 8.132, last update 12/1/96 09:34:37)
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)clock.c 8.13 (Berkeley) 2/21/96";
|
||||
static char sccsid[] = "@(#)clock.c 8.16 (Berkeley) 11/27/96";
|
||||
#endif /* not lint */
|
||||
|
||||
# include "sendmail.h"
|
||||
|
|
@ -98,8 +98,8 @@ setevent(intvl, func, arg)
|
|||
*evp = ev;
|
||||
|
||||
if (tTd(5, 5))
|
||||
printf("setevent: intvl=%ld, for=%ld, func=%x, arg=%d, ev=%x\n",
|
||||
intvl, now + intvl, func, arg, ev);
|
||||
printf("setevent: intvl=%ld, for=%ld, func=%lx, arg=%d, ev=%lx\n",
|
||||
intvl, now + intvl, (u_long) func, arg, (u_long) ev);
|
||||
|
||||
tick(0);
|
||||
return (ev);
|
||||
|
|
@ -124,7 +124,7 @@ clrevent(ev)
|
|||
register EVENT **evp;
|
||||
|
||||
if (tTd(5, 5))
|
||||
printf("clrevent: ev=%x\n", ev);
|
||||
printf("clrevent: ev=%lx\n", (u_long) ev);
|
||||
if (ev == NULL)
|
||||
return;
|
||||
|
||||
|
|
@ -191,8 +191,9 @@ tick(arg)
|
|||
ev = EventQueue;
|
||||
EventQueue = EventQueue->ev_link;
|
||||
if (tTd(5, 6))
|
||||
printf("tick: ev=%x, func=%x, arg=%d, pid=%d\n", ev,
|
||||
ev->ev_func, ev->ev_arg, ev->ev_pid);
|
||||
printf("tick: ev=%lx, func=%lx, arg=%d, pid=%d\n",
|
||||
(u_long) ev, (u_long) ev->ev_func,
|
||||
ev->ev_arg, ev->ev_pid);
|
||||
|
||||
/* we must be careful in here because ev_func may not return */
|
||||
f = ev->ev_func;
|
||||
|
|
@ -211,17 +212,7 @@ tick(arg)
|
|||
|
||||
/* restore signals so that we can take ticks while in ev_func */
|
||||
(void) setsignal(SIGALRM, tick);
|
||||
#ifdef SIG_UNBLOCK
|
||||
/* unblock SIGALRM signal */
|
||||
sigemptyset(&ss);
|
||||
sigaddset(&ss, SIGALRM);
|
||||
sigprocmask(SIG_UNBLOCK, &ss, NULL);
|
||||
#else
|
||||
#if HASSIGSETMASK
|
||||
/* reset 4.2bsd signal mask to allow future alarms */
|
||||
(void) sigsetmask(sigblock(0) & ~sigmask(SIGALRM));
|
||||
#endif /* HASSIGSETMASK */
|
||||
#endif /* SIG_UNBLOCK */
|
||||
(void) releasesignal(SIGALRM);
|
||||
|
||||
/* call ev_func */
|
||||
errno = olderrno;
|
||||
|
|
@ -262,12 +253,17 @@ SLEEP_T
|
|||
sleep(intvl)
|
||||
unsigned int intvl;
|
||||
{
|
||||
int was_held;
|
||||
|
||||
if (intvl == 0)
|
||||
return (SLEEP_T) 0;
|
||||
SleepDone = FALSE;
|
||||
(void) setevent((time_t) intvl, endsleep, 0);
|
||||
was_held = releasesignal(SIGALRM);
|
||||
while (!SleepDone)
|
||||
pause();
|
||||
if (was_held > 0)
|
||||
blocksignal(SIGALRM);
|
||||
return (SLEEP_T) 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)collect.c 8.60 (Berkeley) 11/15/96";
|
||||
static char sccsid[] = "@(#)collect.c 8.61 (Berkeley) 11/24/96";
|
||||
#endif /* not lint */
|
||||
|
||||
# include <errno.h>
|
||||
|
|
@ -90,18 +90,18 @@ collect(fp, smtpmode, requeueflag, hdrp, e)
|
|||
HDR **hdrp;
|
||||
register ENVELOPE *e;
|
||||
{
|
||||
register FILE *tf;
|
||||
bool ignrdot = smtpmode ? FALSE : IgnrDot;
|
||||
time_t dbto = smtpmode ? TimeOuts.to_datablock : 0;
|
||||
register char *bp;
|
||||
int c = '\0';
|
||||
bool inputerr = FALSE;
|
||||
register FILE *volatile tf;
|
||||
volatile bool ignrdot = smtpmode ? FALSE : IgnrDot;
|
||||
volatile time_t dbto = smtpmode ? TimeOuts.to_datablock : 0;
|
||||
register char *volatile bp;
|
||||
volatile int c = '\0';
|
||||
volatile bool inputerr = FALSE;
|
||||
bool headeronly;
|
||||
char *buf;
|
||||
int buflen;
|
||||
int istate;
|
||||
int mstate;
|
||||
u_char *pbp;
|
||||
char *volatile buf;
|
||||
volatile int buflen;
|
||||
volatile int istate;
|
||||
volatile int mstate;
|
||||
u_char *volatile pbp;
|
||||
u_char peekbuf[8];
|
||||
char dfname[20];
|
||||
char bufbuf[MAXLINE];
|
||||
|
|
@ -205,7 +205,7 @@ collect(fp, smtpmode, requeueflag, hdrp, e)
|
|||
{
|
||||
if (istate == IS_BOL)
|
||||
fprintf(TrafficLogFile, "%05d <<< ",
|
||||
getpid());
|
||||
(int) getpid());
|
||||
if (c == EOF)
|
||||
fprintf(TrafficLogFile, "[EOF]\n");
|
||||
else
|
||||
|
|
@ -647,7 +647,7 @@ tferror(tf, e)
|
|||
st.st_size);
|
||||
else
|
||||
fprintf(tf, "\n*** Mail of at least %ld bytes could not be accepted\n",
|
||||
st.st_size);
|
||||
(long) st.st_size);
|
||||
fprintf(tf, "*** at %s due to lack of disk space for temp file.\n",
|
||||
MyHostName);
|
||||
avail = freediskspace(QueueDir, &bsize);
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)conf.c 8.315 (Berkeley) 11/10/96";
|
||||
static char sccsid[] = "@(#)conf.c 8.325 (Berkeley) 12/1/96";
|
||||
#endif /* not lint */
|
||||
|
||||
# include "sendmail.h"
|
||||
|
|
@ -1089,13 +1089,56 @@ setsignal(sig, handler)
|
|||
#endif
|
||||
}
|
||||
/*
|
||||
** BLOCKSIGNAL -- hold a signal to prevent delivery
|
||||
**
|
||||
** Parameters:
|
||||
** sig -- the signal to block.
|
||||
**
|
||||
** Returns:
|
||||
** 1 signal was previously blocked
|
||||
** 0 signal was not previously blocked
|
||||
** -1 on failure.
|
||||
*/
|
||||
|
||||
int
|
||||
blocksignal(sig)
|
||||
int sig;
|
||||
{
|
||||
#ifdef BSD4_3
|
||||
# ifndef sigmask
|
||||
# define sigmask(s) (1 << ((s) - 1))
|
||||
# endif
|
||||
return (sigblock(sigmask(sig)) & sigmask(sig)) != 0;
|
||||
#else
|
||||
# ifdef ALTOS_SYSTEM_V
|
||||
sigfunc_t handler;
|
||||
|
||||
handler = sigset(sig, SIG_HOLD);
|
||||
if (handler == SIG_ERR)
|
||||
return -1;
|
||||
else
|
||||
return handler == SIG_HOLD;
|
||||
# else
|
||||
sigset_t sset, oset;
|
||||
|
||||
sigemptyset(&sset);
|
||||
sigaddset(&sset, sig);
|
||||
if (sigprocmask(SIG_BLOCK, &sset, &oset) < 0)
|
||||
return -1;
|
||||
else
|
||||
return sigismember(&oset, sig);
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
/*
|
||||
** RELEASESIGNAL -- release a held signal
|
||||
**
|
||||
** Parameters:
|
||||
** sig -- the signal to release.
|
||||
**
|
||||
** Returns:
|
||||
** 0 on success.
|
||||
** 1 signal was previously blocked
|
||||
** 0 signal was not previously blocked
|
||||
** -1 on failure.
|
||||
*/
|
||||
|
||||
|
|
@ -1104,19 +1147,25 @@ releasesignal(sig)
|
|||
int sig;
|
||||
{
|
||||
#ifdef BSD4_3
|
||||
# ifndef sigmask
|
||||
# define sigmask(s) (1 << ((s) - 1))
|
||||
# endif
|
||||
return sigsetmask(sigblock(0) & ~sigmask(sig));
|
||||
return (sigsetmask(sigblock(0) & ~sigmask(sig)) & sigmask(sig)) != 0;
|
||||
#else
|
||||
# ifdef ALTOS_SYSTEM_V
|
||||
sigrelse(sig) ;
|
||||
sigfunc_t handler;
|
||||
|
||||
handler = sigset(sig, SIG_HOLD);
|
||||
if (sigrelse(sig) < 0)
|
||||
return -1;
|
||||
else
|
||||
return handler == SIG_HOLD;
|
||||
# else
|
||||
sigset_t sset;
|
||||
sigset_t sset, oset;
|
||||
|
||||
sigemptyset(&sset);
|
||||
sigaddset(&sset, sig);
|
||||
return sigprocmask(SIG_UNBLOCK, &sset, NULL);
|
||||
if (sigprocmask(SIG_UNBLOCK, &sset, &oset) < 0)
|
||||
return -1;
|
||||
else
|
||||
return sigismember(&oset, sig);
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
|
|
@ -1258,6 +1307,7 @@ init_vendor_macros(e)
|
|||
#define LA_IRIX6 11 /* special IRIX 6.2 implementation */
|
||||
#define LA_KSTAT 12 /* special Solaris kstat(3k) implementation */
|
||||
#define LA_DEVSHORT 13 /* read short from a device */
|
||||
#define LA_ALPHAOSF 14 /* Digital UNIX (OSF/1 on Alpha) table() call */
|
||||
|
||||
/* do guesses based on general OS type */
|
||||
#ifndef LA_TYPE
|
||||
|
|
@ -1380,7 +1430,8 @@ getla()
|
|||
(void) fcntl(kmem, F_SETFD, 1);
|
||||
}
|
||||
if (tTd(3, 20))
|
||||
printf("getla: symbol address = %#x\n", Nl[X_AVENRUN].n_value);
|
||||
printf("getla: symbol address = %#lx\n",
|
||||
(u_long) Nl[X_AVENRUN].n_value);
|
||||
if (lseek(kmem, (off_t) Nl[X_AVENRUN].n_value, SEEK_SET) == -1 ||
|
||||
read(kmem, (char *) avenrun, sizeof(avenrun)) < sizeof(avenrun))
|
||||
{
|
||||
|
|
@ -1884,6 +1935,37 @@ getla()
|
|||
|
||||
#endif /* LA_TYPE == LA_DEVSHORT */
|
||||
|
||||
#if LA_TYPE == LA_ALPHAOSF
|
||||
# include <sys/table.h>
|
||||
|
||||
int getla()
|
||||
{
|
||||
int ave = 0;
|
||||
struct tbl_loadavg tab;
|
||||
|
||||
if (table(TBL_LOADAVG, 0, &tab, 1, sizeof(tab)) == -1)
|
||||
{
|
||||
if (tTd(3, 1))
|
||||
printf("getla: table %s\n", errstring(errno));
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (tTd(3, 1))
|
||||
printf("getla: scale = %d\n", tab.tl_lscale);
|
||||
|
||||
if (tab.tl_lscale)
|
||||
ave = (tab.tl_avenrun.l[0] + (tab.tl_lscale/2)) / tab.tl_lscale;
|
||||
else
|
||||
ave = (int) (tab.tl_avenrun.d[0] + 0.5);
|
||||
|
||||
if (tTd(3, 1))
|
||||
printf("getla: %d\n", ave);
|
||||
|
||||
return ave;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if LA_TYPE == LA_ZERO
|
||||
|
||||
int
|
||||
|
|
@ -2063,6 +2145,8 @@ refuseconnections(port)
|
|||
|
||||
if (MaxChildren > 0 && CurChildren >= MaxChildren)
|
||||
{
|
||||
extern void proc_list_probe __P((void));
|
||||
|
||||
proc_list_probe();
|
||||
if (CurChildren >= MaxChildren)
|
||||
{
|
||||
|
|
@ -2876,7 +2960,7 @@ static void dopr_outch __P(( int c ));
|
|||
static void
|
||||
dopr( buffer, format, args )
|
||||
char *buffer;
|
||||
char *format;
|
||||
const char *format;
|
||||
va_list args;
|
||||
{
|
||||
int ch;
|
||||
|
|
@ -3848,6 +3932,11 @@ vendor_pre_defaults(e)
|
|||
#ifdef SUN_EXTENSIONS
|
||||
sun_pre_defaults(e);
|
||||
#endif
|
||||
#ifdef apollo
|
||||
/* stupid domain/os can't even open /etc/sendmail.cf without this */
|
||||
setuserenv("ISP", NULL);
|
||||
setuserenv("SYSTYPE", NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -3926,6 +4015,7 @@ int allow_severity = LOG_INFO;
|
|||
int deny_severity = LOG_WARNING;
|
||||
#endif
|
||||
|
||||
#if DAEMON
|
||||
bool
|
||||
validate_connection(sap, hostname, e)
|
||||
SOCKADDR *sap;
|
||||
|
|
@ -3941,6 +4031,8 @@ validate_connection(sap, hostname, e)
|
|||
#endif
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif
|
||||
/*
|
||||
** STRTOL -- convert string to long integer
|
||||
**
|
||||
|
|
@ -4190,14 +4282,26 @@ struct passwd *
|
|||
sm_getpwnam(user)
|
||||
char *user;
|
||||
{
|
||||
#ifdef _AIX4
|
||||
extern struct passwd *_getpwnam_shadow(const char *, const int);
|
||||
|
||||
return _getpwnam_shadow(user, 0);
|
||||
#else
|
||||
return getpwnam(user);
|
||||
#endif
|
||||
}
|
||||
|
||||
struct passwd *
|
||||
sm_getpwuid(uid)
|
||||
UID_T uid;
|
||||
{
|
||||
#if defined(_AIX4) && 0
|
||||
extern struct passwd *_getpwuid_shadow(const int, const int);
|
||||
|
||||
return _getpwuid_shadow(uid,0);
|
||||
#else
|
||||
return getpwuid(uid);
|
||||
#endif
|
||||
}
|
||||
/*
|
||||
** SECUREWARE_SETUP_SECURE -- Convex SecureWare setup
|
||||
|
|
@ -4617,9 +4721,6 @@ char *OsCompileOptions[] =
|
|||
#if HASSETVBUF
|
||||
"HASSETVBUF",
|
||||
#endif
|
||||
#if HASSIGSETMASK
|
||||
"HASSIGSETMASK",
|
||||
#endif
|
||||
#if HASSNPRINTF
|
||||
"HASSNPRINTF",
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)conf.h 8.272 (Berkeley) 11/16/96
|
||||
* @(#)conf.h 8.279 (Berkeley) 12/1/96
|
||||
*/
|
||||
|
||||
/*
|
||||
|
|
@ -443,6 +443,7 @@ typedef int pid_t;
|
|||
# undef WEXITSTATUS
|
||||
# undef HASUNAME
|
||||
# define setpgid setpgrp
|
||||
# define MODE_T int
|
||||
typedef int pid_t;
|
||||
extern char *getenv();
|
||||
|
||||
|
|
@ -476,6 +477,7 @@ extern char *getenv();
|
|||
# define HASINITGROUPS 1 /* has initgroups(3) call */
|
||||
# define IP_SRCROUTE 0 /* does not have <netinet/ip_var.h> */
|
||||
# define HASGETUSERSHELL 0 /* does not have getusershell(3) */
|
||||
# define HASSNPRINTF 1 /* has snprintf(3) */
|
||||
# ifndef IDENTPROTO
|
||||
# define IDENTPROTO 0 /* TCP/IP implementation is broken */
|
||||
# endif
|
||||
|
|
@ -574,7 +576,7 @@ extern long dgux_inet_addr();
|
|||
# ifndef HASFLOCK
|
||||
# define HASFLOCK 1 /* has flock(2) call */
|
||||
# endif
|
||||
# define LA_TYPE LA_INT
|
||||
# define LA_TYPE LA_ALPHAOSF
|
||||
# define SFS_TYPE SFS_MOUNT /* use <sys/mount.h> statfs() impl */
|
||||
# define _PATH_VENDOR_CF "/var/adm/sendmail/sendmail.cf"
|
||||
# ifndef _PATH_SENDMAILPID
|
||||
|
|
@ -1435,7 +1437,6 @@ extern int syslog(int, char *, ...);
|
|||
# define HASUNAME 1 /* use System V uname(2) system call */
|
||||
# define HASINITGROUPS 1 /* has initgroups(3) function */
|
||||
# define HASSETVBUF 1 /* has setvbuf(3) function */
|
||||
# define HASSIGSETMASK 0 /* does not have sigsetmask(2) function */
|
||||
# ifndef HASGETUSERSHELL
|
||||
# define HASGETUSERSHELL 0 /* does not have getusershell(3) function */
|
||||
# endif
|
||||
|
|
@ -1489,6 +1490,7 @@ extern struct group *getgrent(), *getgrnam(), *getgrgid();
|
|||
# define setpgid setpgrp
|
||||
# undef WIFEXITED
|
||||
# undef WEXITSTATUS
|
||||
# define MODE_T int /* system include files have no mode_t */
|
||||
typedef int pid_t;
|
||||
typedef int (*sigfunc_t)();
|
||||
# define SIGFUNC_DEFINED
|
||||
|
|
@ -1842,15 +1844,6 @@ extern int errno;
|
|||
# define SECUREWARE 0 /* assume no SecureWare C2 auditing hooks */
|
||||
#endif
|
||||
|
||||
/* heuristic setting of HASSETSIGMASK; can override above */
|
||||
#ifndef HASSIGSETMASK
|
||||
# ifdef SIGVTALRM
|
||||
# define HASSETSIGMASK 1
|
||||
# else
|
||||
# define HASSETSIGMASK 0
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
** If no type for argument two of getgroups call is defined, assume
|
||||
** it's an integer -- unfortunately, there seem to be several choices
|
||||
|
|
@ -1918,6 +1911,9 @@ extern int errno;
|
|||
/* pseudo-code used in server SMTP */
|
||||
# define EX_QUIT 22 /* drop out of server immediately */
|
||||
|
||||
/* pseudo-code used for mci_setstat */
|
||||
# define EX_NOTSTICKY -5 /* don't save persistent status */
|
||||
|
||||
|
||||
/*
|
||||
** These are used in a few cases where we need some special
|
||||
|
|
@ -1980,9 +1976,15 @@ extern int h_errno;
|
|||
*/
|
||||
|
||||
#if NETINET || NETISO
|
||||
# define SMTP 1 /* enable user and server SMTP */
|
||||
# define QUEUE 1 /* enable queueing */
|
||||
# define DAEMON 1 /* include the daemon (requires IPC & SMTP) */
|
||||
# ifndef SMTP
|
||||
# define SMTP 1 /* enable user and server SMTP */
|
||||
# endif
|
||||
# ifndef QUEUE
|
||||
# define QUEUE 1 /* enable queueing */
|
||||
# endif
|
||||
# ifndef DAEMON
|
||||
# define DAEMON 1 /* include the daemon (requires IPC & SMTP) */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)convtime.c 8.7 (Berkeley) 9/15/96";
|
||||
static char sccsid[] = "@(#)convtime.c 8.8 (Berkeley) 11/24/96";
|
||||
#endif /* not lint */
|
||||
|
||||
# include "sendmail.h"
|
||||
|
|
@ -149,7 +149,10 @@ pintvl(intvl, brief)
|
|||
hr = intvl % 24;
|
||||
intvl /= 24;
|
||||
if (brief)
|
||||
{
|
||||
dy = intvl;
|
||||
wk = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
dy = intvl % 7;
|
||||
|
|
|
|||
|
|
@ -37,28 +37,29 @@
|
|||
|
||||
#ifndef lint
|
||||
#ifdef DAEMON
|
||||
static char sccsid[] = "@(#)daemon.c 8.148 (Berkeley) 11/8/96 (with daemon mode)";
|
||||
static char sccsid[] = "@(#)daemon.c 8.156 (Berkeley) 12/1/96 (with daemon mode)";
|
||||
#else
|
||||
static char sccsid[] = "@(#)daemon.c 8.148 (Berkeley) 11/8/96 (without daemon mode)";
|
||||
static char sccsid[] = "@(#)daemon.c 8.156 (Berkeley) 12/1/96 (without daemon mode)";
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#ifdef DAEMON
|
||||
|
||||
#if DAEMON || defined(SOCK_STREAM)
|
||||
# include <arpa/inet.h>
|
||||
|
||||
#if NAMED_BIND
|
||||
# include <resolv.h>
|
||||
# ifndef NO_DATA
|
||||
# define NO_DATA NO_ADDRESS
|
||||
# if NAMED_BIND
|
||||
# include <resolv.h>
|
||||
# ifndef NO_DATA
|
||||
# define NO_DATA NO_ADDRESS
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if IP_SRCROUTE
|
||||
# include <netinet/in_systm.h>
|
||||
# include <netinet/ip.h>
|
||||
# include <netinet/ip_var.h>
|
||||
#endif
|
||||
#if DAEMON
|
||||
|
||||
# if IP_SRCROUTE
|
||||
# include <netinet/in_systm.h>
|
||||
# include <netinet/ip.h>
|
||||
# include <netinet/ip_var.h>
|
||||
# endif
|
||||
|
||||
/*
|
||||
** DAEMON.C -- routines to use when running as a daemon.
|
||||
|
|
@ -195,10 +196,13 @@ getrequests(e)
|
|||
{
|
||||
register pid_t pid;
|
||||
auto int lotherend;
|
||||
int savederrno;
|
||||
int pipefd[2];
|
||||
extern bool refuseconnections();
|
||||
extern int getla();
|
||||
|
||||
/* see if we are rejecting connections */
|
||||
(void) blocksignal(SIGALRM);
|
||||
if (refuseconnections(ntohs(DaemonAddr.sin.sin_port)))
|
||||
{
|
||||
if (DaemonSocket >= 0)
|
||||
|
|
@ -254,6 +258,7 @@ getrequests(e)
|
|||
if (SetNonBlocking(DaemonSocket, FALSE) < 0)
|
||||
log an error here;
|
||||
#endif
|
||||
(void) releasesignal(SIGALRM);
|
||||
do
|
||||
{
|
||||
errno = 0;
|
||||
|
|
@ -261,8 +266,11 @@ getrequests(e)
|
|||
t = accept(DaemonSocket,
|
||||
(struct sockaddr *)&RealHostAddr, &lotherend);
|
||||
} while (t < 0 && errno == EINTR);
|
||||
savederrno = errno;
|
||||
(void) blocksignal(SIGALRM);
|
||||
if (t < 0)
|
||||
{
|
||||
errno = savederrno;
|
||||
syserr("getrequests: accept");
|
||||
|
||||
/* arrange to re-open the socket next time around */
|
||||
|
|
@ -280,10 +288,26 @@ getrequests(e)
|
|||
if (tTd(15, 2))
|
||||
printf("getrequests: forking (fd = %d)\n", t);
|
||||
|
||||
/*
|
||||
** Create a pipe to keep the child from writing to the
|
||||
** socket until after the parent has closed it. Otherwise
|
||||
** the parent may hang if the child has closed it first.
|
||||
*/
|
||||
|
||||
if (pipe(pipefd) < 0)
|
||||
pipefd[0] = pipefd[1] = -1;
|
||||
|
||||
blocksignal(SIGCHLD);
|
||||
pid = fork();
|
||||
if (pid < 0)
|
||||
{
|
||||
syserr("daemon: cannot fork");
|
||||
if (pipefd[0] != -1)
|
||||
{
|
||||
(void) close(pipefd[0]);
|
||||
(void) close(pipefd[1]);
|
||||
}
|
||||
(void) releasesignal(SIGCHLD);
|
||||
sleep(10);
|
||||
(void) close(t);
|
||||
continue;
|
||||
|
|
@ -302,13 +326,41 @@ getrequests(e)
|
|||
** Verify calling user id if possible here.
|
||||
*/
|
||||
|
||||
(void) releasesignal(SIGALRM);
|
||||
(void) releasesignal(SIGCHLD);
|
||||
(void) setsignal(SIGCHLD, SIG_DFL);
|
||||
(void) setsignal(SIGHUP, intsig);
|
||||
(void) close(DaemonSocket);
|
||||
proc_list_clear();
|
||||
|
||||
/* don't schedule queue runs if we are told to ETRN */
|
||||
QueueIntvl = 0;
|
||||
|
||||
setproctitle("startup with %s",
|
||||
anynet_ntoa(&RealHostAddr));
|
||||
|
||||
if (pipefd[0] != -1)
|
||||
{
|
||||
auto char c;
|
||||
|
||||
/*
|
||||
** Wait for the parent to close the write end
|
||||
** of the pipe, which we will see as an EOF.
|
||||
** This guarantees that we won't write to the
|
||||
** socket until after the parent has closed
|
||||
** the pipe.
|
||||
*/
|
||||
|
||||
/* close the write end of the pipe */
|
||||
(void) close(pipefd[1]);
|
||||
|
||||
/* we shouldn't be interrupted, but ... */
|
||||
while (read(pipefd[0], &c, 1) < 0 &&
|
||||
errno == EINTR)
|
||||
continue;
|
||||
(void) close(pipefd[0]);
|
||||
}
|
||||
|
||||
/* determine host name */
|
||||
p = hostnamebyanyaddr(&RealHostAddr);
|
||||
if (strlen(p) > (SIZE_T) MAXNAME)
|
||||
|
|
@ -350,9 +402,18 @@ getrequests(e)
|
|||
|
||||
/* parent -- keep track of children */
|
||||
proc_list_add(pid);
|
||||
(void) releasesignal(SIGCHLD);
|
||||
|
||||
/* close the read end of the synchronization pipe */
|
||||
if (pipefd[0] != -1)
|
||||
(void) close(pipefd[0]);
|
||||
|
||||
/* close the port so that others will hang (for a while) */
|
||||
(void) close(t);
|
||||
|
||||
/* release the child by closing the read end of the sync pipe */
|
||||
if (pipefd[1] != -1)
|
||||
(void) close(pipefd[1]);
|
||||
}
|
||||
if (tTd(15, 2))
|
||||
printf("getreq: returning (null server)\n");
|
||||
|
|
@ -585,7 +646,9 @@ setdaemonoptions(p)
|
|||
case 'P': /* port */
|
||||
switch (DaemonAddr.sa.sa_family)
|
||||
{
|
||||
#if NETISO
|
||||
short port;
|
||||
#endif
|
||||
|
||||
#if NETINET
|
||||
case AF_INET:
|
||||
|
|
@ -683,14 +746,14 @@ makeconnection(host, port, mci, e)
|
|||
register MCI *mci;
|
||||
ENVELOPE *e;
|
||||
{
|
||||
register int i = 0;
|
||||
register int s;
|
||||
register struct hostent *hp = (struct hostent *)NULL;
|
||||
register volatile int i = 0;
|
||||
register volatile int s;
|
||||
register struct hostent *volatile hp = (struct hostent *)NULL;
|
||||
SOCKADDR addr;
|
||||
int sav_errno;
|
||||
int addrlen;
|
||||
bool firstconnect;
|
||||
EVENT *ev;
|
||||
volatile int addrlen;
|
||||
volatile bool firstconnect;
|
||||
EVENT *volatile ev = NULL;
|
||||
|
||||
/*
|
||||
** Set up the address for the mailer.
|
||||
|
|
@ -1109,7 +1172,7 @@ getauthinfo(fd)
|
|||
int fd;
|
||||
{
|
||||
int falen;
|
||||
register char *p;
|
||||
register char *volatile p = NULL;
|
||||
SOCKADDR la;
|
||||
int lalen;
|
||||
register struct servent *sp;
|
||||
|
|
@ -1545,6 +1608,94 @@ host_map_lookup(map, name, av, statp)
|
|||
s->s_namecanon.nc_cname = newstr(cp);
|
||||
return cp;
|
||||
}
|
||||
|
||||
# else /* DAEMON */
|
||||
/* code for systems without sophisticated networking */
|
||||
|
||||
/*
|
||||
** MYHOSTNAME -- stub version for case of no daemon code.
|
||||
**
|
||||
** Can't convert to upper case here because might be a UUCP name.
|
||||
**
|
||||
** Mark, you can change this to be anything you want......
|
||||
*/
|
||||
|
||||
char **
|
||||
myhostname(hostbuf, size)
|
||||
char hostbuf[];
|
||||
int size;
|
||||
{
|
||||
register FILE *f;
|
||||
|
||||
hostbuf[0] = '\0';
|
||||
f = fopen("/usr/include/whoami", "r");
|
||||
if (f != NULL)
|
||||
{
|
||||
(void) fgets(hostbuf, size, f);
|
||||
fixcrlf(hostbuf, TRUE);
|
||||
(void) fclose(f);
|
||||
}
|
||||
return (NULL);
|
||||
}
|
||||
/*
|
||||
** GETAUTHINFO -- get the real host name asociated with a file descriptor
|
||||
**
|
||||
** Parameters:
|
||||
** fd -- the descriptor
|
||||
**
|
||||
** Returns:
|
||||
** The host name associated with this descriptor, if it can
|
||||
** be determined.
|
||||
** NULL otherwise.
|
||||
**
|
||||
** Side Effects:
|
||||
** none
|
||||
*/
|
||||
|
||||
char *
|
||||
getauthinfo(fd)
|
||||
int fd;
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
/*
|
||||
** MAPHOSTNAME -- turn a hostname into canonical form
|
||||
**
|
||||
** Parameters:
|
||||
** map -- a pointer to the database map.
|
||||
** name -- a buffer containing a hostname.
|
||||
** avp -- a pointer to a (cf file defined) argument vector.
|
||||
** statp -- an exit status (out parameter).
|
||||
**
|
||||
** Returns:
|
||||
** mapped host name
|
||||
** FALSE otherwise.
|
||||
**
|
||||
** Side Effects:
|
||||
** Looks up the host specified in name. If it is not
|
||||
** the canonical name for that host, replace it with
|
||||
** the canonical name. If the name is unknown, or it
|
||||
** is already the canonical name, leave it unchanged.
|
||||
*/
|
||||
|
||||
/*ARGSUSED*/
|
||||
char *
|
||||
host_map_lookup(map, name, avp, statp)
|
||||
MAP *map;
|
||||
char *name;
|
||||
char **avp;
|
||||
char *statp;
|
||||
{
|
||||
register struct hostent *hp;
|
||||
|
||||
hp = sm_gethostbyname(name);
|
||||
if (hp != NULL)
|
||||
return hp->h_name;
|
||||
*statp = EX_NOHOST;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif /* DAEMON */
|
||||
/*
|
||||
** ANYNET_NTOA -- convert a network address to printable form.
|
||||
**
|
||||
|
|
@ -1555,6 +1706,8 @@ host_map_lookup(map, name, av, statp)
|
|||
** A printable version of that sockaddr.
|
||||
*/
|
||||
|
||||
#ifdef SOCK_STREAM
|
||||
|
||||
#if NETLINK
|
||||
# include <net/if_dl.h>
|
||||
#endif
|
||||
|
|
@ -1659,9 +1812,11 @@ hostnamebyanyaddr(sap)
|
|||
break;
|
||||
#endif
|
||||
|
||||
#if NETUNIX
|
||||
case AF_UNIX:
|
||||
hp = NULL;
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
hp = sm_gethostbyaddr(sap->sa.sa_data,
|
||||
|
|
@ -1686,90 +1841,4 @@ hostnamebyanyaddr(sap)
|
|||
}
|
||||
}
|
||||
|
||||
# else /* DAEMON */
|
||||
/* code for systems without sophisticated networking */
|
||||
|
||||
/*
|
||||
** MYHOSTNAME -- stub version for case of no daemon code.
|
||||
**
|
||||
** Can't convert to upper case here because might be a UUCP name.
|
||||
**
|
||||
** Mark, you can change this to be anything you want......
|
||||
*/
|
||||
|
||||
char **
|
||||
myhostname(hostbuf, size)
|
||||
char hostbuf[];
|
||||
int size;
|
||||
{
|
||||
register FILE *f;
|
||||
|
||||
hostbuf[0] = '\0';
|
||||
f = fopen("/usr/include/whoami", "r");
|
||||
if (f != NULL)
|
||||
{
|
||||
(void) fgets(hostbuf, size, f);
|
||||
fixcrlf(hostbuf, TRUE);
|
||||
(void) fclose(f);
|
||||
}
|
||||
return (NULL);
|
||||
}
|
||||
/*
|
||||
** GETAUTHINFO -- get the real host name asociated with a file descriptor
|
||||
**
|
||||
** Parameters:
|
||||
** fd -- the descriptor
|
||||
**
|
||||
** Returns:
|
||||
** The host name associated with this descriptor, if it can
|
||||
** be determined.
|
||||
** NULL otherwise.
|
||||
**
|
||||
** Side Effects:
|
||||
** none
|
||||
*/
|
||||
|
||||
char *
|
||||
getauthinfo(fd)
|
||||
int fd;
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
/*
|
||||
** MAPHOSTNAME -- turn a hostname into canonical form
|
||||
**
|
||||
** Parameters:
|
||||
** map -- a pointer to the database map.
|
||||
** name -- a buffer containing a hostname.
|
||||
** avp -- a pointer to a (cf file defined) argument vector.
|
||||
** statp -- an exit status (out parameter).
|
||||
**
|
||||
** Returns:
|
||||
** mapped host name
|
||||
** FALSE otherwise.
|
||||
**
|
||||
** Side Effects:
|
||||
** Looks up the host specified in name. If it is not
|
||||
** the canonical name for that host, replace it with
|
||||
** the canonical name. If the name is unknown, or it
|
||||
** is already the canonical name, leave it unchanged.
|
||||
*/
|
||||
|
||||
/*ARGSUSED*/
|
||||
char *
|
||||
host_map_lookup(map, name, avp, statp)
|
||||
MAP *map;
|
||||
char *name;
|
||||
char **avp;
|
||||
char *statp;
|
||||
{
|
||||
register struct hostent *hp;
|
||||
|
||||
hp = sm_gethostbyname(name);
|
||||
if (hp != NULL)
|
||||
return hp->h_name;
|
||||
*statp = EX_NOHOST;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif /* DAEMON */
|
||||
#endif /* SOCK_STREAM */
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)deliver.c 8.251 (Berkeley) 11/11/96";
|
||||
static char sccsid[] = "@(#)deliver.c 8.260 (Berkeley) 12/1/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "sendmail.h"
|
||||
|
|
@ -44,7 +44,7 @@ static char sccsid[] = "@(#)deliver.c 8.251 (Berkeley) 11/11/96";
|
|||
extern int h_errno;
|
||||
#endif
|
||||
|
||||
#ifdef SMTP
|
||||
#if SMTP
|
||||
extern char SmtpError[];
|
||||
#endif
|
||||
|
||||
|
|
@ -131,7 +131,7 @@ sendall(e, mode)
|
|||
if (e->e_hopcount > MaxHopCount)
|
||||
{
|
||||
errno = 0;
|
||||
#ifdef QUEUE
|
||||
#if QUEUE
|
||||
queueup(e, mode == SM_QUEUE || mode == SM_DEFER);
|
||||
#endif
|
||||
e->e_flags |= EF_FATALERRS|EF_PM_NOTIFY|EF_CLRQUEUE;
|
||||
|
|
@ -422,7 +422,7 @@ sendall(e, mode)
|
|||
mode = SM_QUEUE;
|
||||
}
|
||||
|
||||
# ifdef QUEUE
|
||||
# if QUEUE
|
||||
if ((mode == SM_QUEUE || mode == SM_DEFER || mode == SM_FORK ||
|
||||
(mode != SM_VERIFY && SuperSafe)) &&
|
||||
(!bitset(EF_INQUEUE, e->e_flags) || splitenv != NULL))
|
||||
|
|
@ -609,7 +609,7 @@ sendenvelope(e, mode)
|
|||
bool didany;
|
||||
|
||||
if (tTd(13, 10))
|
||||
printf("sendenvelope(%s) e_flags=0x%x\n",
|
||||
printf("sendenvelope(%s) e_flags=0x%lx\n",
|
||||
e->e_id == NULL ? "[NOQUEUE]" : e->e_id,
|
||||
e->e_flags);
|
||||
#ifdef LOG
|
||||
|
|
@ -676,7 +676,7 @@ sendenvelope(e, mode)
|
|||
{
|
||||
extern int deliver __P((ENVELOPE *, ADDRESS *));
|
||||
|
||||
# ifdef QUEUE
|
||||
# if QUEUE
|
||||
/*
|
||||
** Checkpoint the send list every few addresses
|
||||
*/
|
||||
|
|
@ -847,7 +847,7 @@ deliver(e, firstto)
|
|||
host = to->q_host;
|
||||
CurEnv = e; /* just in case */
|
||||
e->e_statmsg = NULL;
|
||||
#ifdef SMTP
|
||||
#if SMTP
|
||||
SmtpError[0] = '\0';
|
||||
#endif
|
||||
xstart = curtime();
|
||||
|
|
@ -939,7 +939,7 @@ deliver(e, firstto)
|
|||
if (*mvp == NULL)
|
||||
{
|
||||
/* running SMTP */
|
||||
# ifdef SMTP
|
||||
# if SMTP
|
||||
clever = TRUE;
|
||||
*pvp = NULL;
|
||||
# else /* SMTP */
|
||||
|
|
@ -1231,7 +1231,7 @@ deliver(e, firstto)
|
|||
else if (strcmp(m->m_mailer, "[IPC]") == 0 ||
|
||||
strcmp(m->m_mailer, "[TCP]") == 0)
|
||||
{
|
||||
#ifdef DAEMON
|
||||
#if DAEMON
|
||||
register int i;
|
||||
|
||||
if (pv[0] == NULL || pv[1] == NULL || pv[1][0] == '\0')
|
||||
|
|
@ -1340,7 +1340,7 @@ tryhost:
|
|||
mci_cache(mci);
|
||||
if (TrafficLogFile != NULL)
|
||||
fprintf(TrafficLogFile, "%05d === CONNECT %s\n",
|
||||
getpid(), hostbuf);
|
||||
(int) getpid(), hostbuf);
|
||||
break;
|
||||
}
|
||||
else
|
||||
|
|
@ -1385,7 +1385,7 @@ tryhost:
|
|||
{
|
||||
char **av;
|
||||
|
||||
fprintf(TrafficLogFile, "%05d === EXEC", getpid());
|
||||
fprintf(TrafficLogFile, "%05d === EXEC", (int) getpid());
|
||||
for (av = pv; *av != NULL; av++)
|
||||
fprintf(TrafficLogFile, " %s", *av);
|
||||
fprintf(TrafficLogFile, "\n");
|
||||
|
|
@ -1440,7 +1440,7 @@ tryhost:
|
|||
#endif
|
||||
|
||||
/* if this mailer speaks smtp, create a return pipe */
|
||||
#ifdef SMTP
|
||||
#if SMTP
|
||||
if (clever)
|
||||
{
|
||||
if (pipe(rpvect) < 0)
|
||||
|
|
@ -1484,7 +1484,7 @@ tryhost:
|
|||
shortenstring(e->e_to, 203), m->m_name);
|
||||
(void) close(mpvect[0]);
|
||||
(void) close(mpvect[1]);
|
||||
#ifdef SMTP
|
||||
#if SMTP
|
||||
if (clever)
|
||||
{
|
||||
(void) close(rpvect[0]);
|
||||
|
|
@ -1575,13 +1575,10 @@ tryhost:
|
|||
new_ruid = stb.st_uid;
|
||||
else if (ctladdr != NULL && ctladdr->q_uid != 0)
|
||||
new_ruid = ctladdr->q_uid;
|
||||
else
|
||||
{
|
||||
if (m->m_uid == 0)
|
||||
new_ruid = DefUid;
|
||||
else
|
||||
new_ruid = m->m_uid;
|
||||
}
|
||||
else if (m->m_uid != 0)
|
||||
new_ruid = m->m_uid;
|
||||
else if (!bitnset(M_SPECIFIC_UID, m->m_flags))
|
||||
new_ruid = DefUid;
|
||||
if (new_euid != NO_UID)
|
||||
{
|
||||
vendor_set_uid(new_euid);
|
||||
|
|
@ -1611,7 +1608,7 @@ tryhost:
|
|||
|
||||
if (tTd(11, 2))
|
||||
printf("openmailer: running as r/euid=%d/%d\n",
|
||||
getuid(), geteuid());
|
||||
(int) getuid(), (int) geteuid());
|
||||
|
||||
/* move into some "safe" directory */
|
||||
if (m->m_execdir != NULL)
|
||||
|
|
@ -1636,7 +1633,7 @@ tryhost:
|
|||
}
|
||||
|
||||
/* arrange to filter std & diag output of command */
|
||||
#ifdef SMTP
|
||||
#if SMTP
|
||||
if (clever)
|
||||
{
|
||||
(void) close(rpvect[0]);
|
||||
|
|
@ -1718,7 +1715,7 @@ tryhost:
|
|||
syserr("deliver: cannot create mailer output channel, fd=%d",
|
||||
mpvect[1]);
|
||||
(void) close(mpvect[1]);
|
||||
#ifdef SMTP
|
||||
#if SMTP
|
||||
if (clever)
|
||||
{
|
||||
(void) close(rpvect[0]);
|
||||
|
|
@ -1728,7 +1725,7 @@ tryhost:
|
|||
rcode = EX_OSERR;
|
||||
goto give_up;
|
||||
}
|
||||
#ifdef SMTP
|
||||
#if SMTP
|
||||
if (clever)
|
||||
{
|
||||
(void) close(rpvect[1]);
|
||||
|
|
@ -1757,9 +1754,9 @@ tryhost:
|
|||
*/
|
||||
|
||||
if (bitnset(M_7BITS, m->m_flags) &&
|
||||
(!clever || mci->mci_state == MCIS_CLOSED))
|
||||
(!clever || mci->mci_state == MCIS_OPENING))
|
||||
mci->mci_flags |= MCIF_7BIT;
|
||||
#ifdef SMTP
|
||||
#if SMTP
|
||||
if (clever && mci->mci_state != MCIS_CLOSED)
|
||||
{
|
||||
extern void smtpinit __P((MAILER *, MCI *, ENVELOPE *));
|
||||
|
|
@ -1814,7 +1811,7 @@ tryhost:
|
|||
mci_dump_all(TRUE);
|
||||
rcode = EX_SOFTWARE;
|
||||
}
|
||||
#ifdef DAEMON
|
||||
#if DAEMON
|
||||
else if (curhost != NULL && *curhost != '\0')
|
||||
{
|
||||
/* try next MX site */
|
||||
|
|
@ -1836,7 +1833,7 @@ tryhost:
|
|||
rcode = endmailer(mci, e, pv);
|
||||
}
|
||||
else
|
||||
#ifdef SMTP
|
||||
#if SMTP
|
||||
{
|
||||
extern int smtpmailfrom __P((MAILER *, MCI *, ENVELOPE *));
|
||||
extern int smtprcpt __P((ADDRESS *, MAILER *, MCI *, ENVELOPE *));
|
||||
|
|
@ -1886,11 +1883,13 @@ tryhost:
|
|||
rcode = smtpdata(m, mci, e);
|
||||
}
|
||||
}
|
||||
# if DAEMON
|
||||
if (rcode == EX_TEMPFAIL && curhost != NULL && *curhost != '\0')
|
||||
{
|
||||
/* try next MX site */
|
||||
goto tryhost;
|
||||
}
|
||||
# endif
|
||||
}
|
||||
#else /* not SMTP */
|
||||
{
|
||||
|
|
@ -1915,8 +1914,8 @@ tryhost:
|
|||
*/
|
||||
|
||||
give_up:
|
||||
#ifdef SMTP
|
||||
# if FFR_LMTP
|
||||
#if SMTP
|
||||
# if _FFR_LMTP
|
||||
if (bitnset(M_LMTP, m->m_flags))
|
||||
{
|
||||
tobuf[0] = '\0';
|
||||
|
|
@ -1933,8 +1932,8 @@ tryhost:
|
|||
if (bitset(QBADADDR|QQUEUEUP, to->q_flags))
|
||||
continue;
|
||||
|
||||
#ifdef SMTP
|
||||
# if FFR_LMTP
|
||||
#if SMTP
|
||||
# if _FFR_LMTP
|
||||
/* if running LMTP, get the status for each address */
|
||||
if (bitnset(M_LMTP, m->m_flags))
|
||||
{
|
||||
|
|
@ -1988,8 +1987,8 @@ tryhost:
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef SMTP
|
||||
# if FFR_LMTP
|
||||
#if SMTP
|
||||
# if _FFR_LMTP
|
||||
if (bitnset(M_LMTP, m->m_flags))
|
||||
{
|
||||
/*
|
||||
|
|
@ -2013,7 +2012,7 @@ tryhost:
|
|||
markstats(e, tochain);
|
||||
mci_store_persistent(mci);
|
||||
|
||||
#ifdef SMTP
|
||||
#if SMTP
|
||||
/* now close the connection */
|
||||
if (clever && mci->mci_state != MCIS_CLOSED &&
|
||||
!bitset(MCIF_CACHED, mci->mci_flags))
|
||||
|
|
@ -2196,7 +2195,7 @@ endmailer(mci, e, pv)
|
|||
if (mci->mci_pid == 0)
|
||||
return (EX_OK);
|
||||
|
||||
#ifdef FFR_TIMEOUT_WAIT
|
||||
#ifdef _FFR_TIMEOUT_WAIT
|
||||
put a timeout around the wait
|
||||
#endif
|
||||
|
||||
|
|
@ -2309,7 +2308,7 @@ giveresponse(stat, m, mci, ctladdr, xstart, e)
|
|||
statmsg = errstring(errno);
|
||||
else
|
||||
{
|
||||
#ifdef SMTP
|
||||
#if SMTP
|
||||
statmsg = SmtpError;
|
||||
#else /* SMTP */
|
||||
statmsg = NULL;
|
||||
|
|
@ -2465,7 +2464,7 @@ logdelivery(m, mci, stat, ctladdr, xstart, e)
|
|||
/* relay: max 66 bytes for IPv4 addresses */
|
||||
if (mci != NULL && mci->mci_host != NULL)
|
||||
{
|
||||
# ifdef DAEMON
|
||||
# if DAEMON
|
||||
extern SOCKADDR CurHostAddr;
|
||||
# endif
|
||||
|
||||
|
|
@ -2473,7 +2472,7 @@ logdelivery(m, mci, stat, ctladdr, xstart, e)
|
|||
shortenstring(mci->mci_host, 40));
|
||||
bp += strlen(bp);
|
||||
|
||||
# ifdef DAEMON
|
||||
# if DAEMON
|
||||
if (CurHostAddr.sa.sa_family != 0)
|
||||
{
|
||||
snprintf(bp, SPACELEFT(buf, bp), " [%s]",
|
||||
|
|
@ -2584,14 +2583,14 @@ logdelivery(m, mci, stat, ctladdr, xstart, e)
|
|||
bp = buf;
|
||||
if (mci != NULL && mci->mci_host != NULL)
|
||||
{
|
||||
# ifdef DAEMON
|
||||
# if DAEMON
|
||||
extern SOCKADDR CurHostAddr;
|
||||
# endif
|
||||
|
||||
snprintf(bp, SPACELEFT(buf, bp), "relay=%.100s", mci->mci_host);
|
||||
bp += strlen(bp);
|
||||
|
||||
# ifdef DAEMON
|
||||
# if DAEMON
|
||||
if (CurHostAddr.sa.sa_family != 0)
|
||||
snprintf(bp, SPACELEFT(buf, bp), " [%.100s]",
|
||||
anynet_ntoa(&CurHostAddr));
|
||||
|
|
@ -2787,6 +2786,7 @@ putbody(mci, e, separator)
|
|||
register char *bp;
|
||||
register char *pbp;
|
||||
register int c;
|
||||
register char *xp;
|
||||
int padc;
|
||||
char *buflim;
|
||||
int pos = 0;
|
||||
|
|
@ -2811,8 +2811,6 @@ putbody(mci, e, separator)
|
|||
pbp = peekbuf;
|
||||
while (!ferror(mci->mci_out))
|
||||
{
|
||||
register char *xp;
|
||||
|
||||
if (pbp > peekbuf)
|
||||
c = *--pbp;
|
||||
else if ((c = getc(e->e_dfp)) == EOF)
|
||||
|
|
@ -2822,6 +2820,11 @@ putbody(mci, e, separator)
|
|||
switch (ostate)
|
||||
{
|
||||
case OS_HEAD:
|
||||
#ifdef _FFR_NONULLS
|
||||
if (c == '\0' &&
|
||||
bitnset(M_NONULLS, mci->mci_mailer->m_flags))
|
||||
break;
|
||||
#endif
|
||||
if (c != '\r' && c != '\n' && bp < buflim)
|
||||
{
|
||||
*bp++ = c;
|
||||
|
|
@ -2856,7 +2859,8 @@ putbody(mci, e, separator)
|
|||
/* now copy out saved line */
|
||||
if (TrafficLogFile != NULL)
|
||||
{
|
||||
fprintf(TrafficLogFile, "%05d >>> ", getpid());
|
||||
fprintf(TrafficLogFile, "%05d >>> ",
|
||||
(int) getpid());
|
||||
if (padc != EOF)
|
||||
putc(padc, TrafficLogFile);
|
||||
for (xp = buf; xp < bp; xp++)
|
||||
|
|
@ -2921,6 +2925,11 @@ putbody(mci, e, separator)
|
|||
ostate = OS_CR;
|
||||
continue;
|
||||
}
|
||||
#ifdef _FFR_NONULLS
|
||||
if (c == '\0' &&
|
||||
bitnset(M_NONULLS, mci->mci_mailer->m_flags))
|
||||
break;
|
||||
#endif
|
||||
putch:
|
||||
if (mci->mci_mailer->m_linelimit > 0 &&
|
||||
pos > mci->mci_mailer->m_linelimit &&
|
||||
|
|
@ -2937,11 +2946,23 @@ putch:
|
|||
*pbp++ = c;
|
||||
continue;
|
||||
}
|
||||
if (TrafficLogFile != NULL)
|
||||
putc(c, TrafficLogFile);
|
||||
putc(c, mci->mci_out);
|
||||
pos++;
|
||||
ostate = c == '\n' ? OS_HEAD : OS_INLINE;
|
||||
if (c == '\n')
|
||||
{
|
||||
if (TrafficLogFile != NULL)
|
||||
fputs(mci->mci_mailer->m_eol,
|
||||
TrafficLogFile);
|
||||
fputs(mci->mci_mailer->m_eol, mci->mci_out);
|
||||
pos = 0;
|
||||
ostate = OS_HEAD;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (TrafficLogFile != NULL)
|
||||
putc(c, TrafficLogFile);
|
||||
putc(c, mci->mci_out);
|
||||
pos++;
|
||||
ostate = OS_INLINE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -2949,12 +2970,21 @@ putch:
|
|||
/* make sure we are at the beginning of a line */
|
||||
if (bp > buf)
|
||||
{
|
||||
*bp = '\0';
|
||||
fputs(buf, mci->mci_out);
|
||||
if (TrafficLogFile != NULL)
|
||||
{
|
||||
for (xp = buf; xp < bp; xp++)
|
||||
putc(*xp, TrafficLogFile);
|
||||
}
|
||||
for (xp = buf; xp < bp; xp++)
|
||||
putc(*xp, mci->mci_out);
|
||||
pos += bp - buf;
|
||||
}
|
||||
if (pos > 0)
|
||||
{
|
||||
if (TrafficLogFile != NULL)
|
||||
fputs(mci->mci_mailer->m_eol, TrafficLogFile);
|
||||
fputs(mci->mci_mailer->m_eol, mci->mci_out);
|
||||
}
|
||||
}
|
||||
|
||||
if (ferror(e->e_dfp))
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)envelope.c 8.96 (Berkeley) 11/11/96";
|
||||
static char sccsid[] = "@(#)envelope.c 8.99 (Berkeley) 12/1/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "sendmail.h"
|
||||
|
|
@ -110,7 +110,7 @@ dropenvelope(e, fulldrop)
|
|||
{
|
||||
extern void printenvflags();
|
||||
|
||||
printf("dropenvelope %x: id=", e);
|
||||
printf("dropenvelope %lx: id=", (u_long) e);
|
||||
xputs(e->e_id);
|
||||
printf(", flags=");
|
||||
printenvflags(e);
|
||||
|
|
@ -168,8 +168,8 @@ dropenvelope(e, fulldrop)
|
|||
queueit = TRUE;
|
||||
#if XDEBUG
|
||||
else if (bitset(QQUEUEUP, q->q_flags))
|
||||
syslog(LOG_DEBUG, "%s: q_flags = %x",
|
||||
e->e_id, q->q_flags);
|
||||
syslog(LOG_DEBUG, "dropenvelope: %s: q_flags = %x, paddr = %s",
|
||||
e->e_id, q->q_flags, q->q_paddr);
|
||||
#endif
|
||||
|
||||
/* see if a notification is needed */
|
||||
|
|
@ -349,7 +349,7 @@ simpledrop:
|
|||
}
|
||||
else if (queueit || !bitset(EF_INQUEUE, e->e_flags))
|
||||
{
|
||||
#ifdef QUEUE
|
||||
#if QUEUE
|
||||
queueup(e, FALSE);
|
||||
#else /* QUEUE */
|
||||
syserr("554 dropenvelope: queueup");
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)err.c 8.50 (Berkeley) 9/20/96";
|
||||
static char sccsid[] = "@(#)err.c 8.52 (Berkeley) 12/1/96";
|
||||
#endif /* not lint */
|
||||
|
||||
# include "sendmail.h"
|
||||
|
|
@ -432,7 +432,7 @@ putoutmsg(msg, holdmsg, heldmsg)
|
|||
else
|
||||
fprintf(OutChannel, "%s\n", &msg[4]);
|
||||
if (TrafficLogFile != NULL)
|
||||
fprintf(TrafficLogFile, "%05d >>> %s\n", getpid(),
|
||||
fprintf(TrafficLogFile, "%05d >>> %s\n", (int) getpid(),
|
||||
(OpMode == MD_SMTP || OpMode == MD_DAEMON) ? msg : &msg[4]);
|
||||
if (msg[3] == ' ')
|
||||
(void) fflush(OutChannel);
|
||||
|
|
@ -631,7 +631,7 @@ errstring(errnum)
|
|||
extern char *sys_errlist[];
|
||||
extern int sys_nerr;
|
||||
# endif
|
||||
# ifdef SMTP
|
||||
# if SMTP
|
||||
extern char *SmtpPhase;
|
||||
# endif /* SMTP */
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)headers.c 8.100 (Berkeley) 9/15/96";
|
||||
static char sccsid[] = "@(#)headers.c 8.101 (Berkeley) 11/23/96";
|
||||
#endif /* not lint */
|
||||
|
||||
# include <errno.h>
|
||||
|
|
@ -1267,8 +1267,14 @@ put_vanilla_header(h, v, mci)
|
|||
{
|
||||
register char *nlp;
|
||||
register char *obp;
|
||||
int putflags;
|
||||
char obuf[MAXLINE];
|
||||
|
||||
putflags = 0;
|
||||
#ifdef _FFR_7BITHDRS
|
||||
if (bitnset(M_7BITHDRS, mci->mci_mailer->m_flags))
|
||||
putflags |= PXLF_STRIP8BIT;
|
||||
#endif
|
||||
(void) snprintf(obuf, sizeof obuf, "%.200s: ", h->h_field);
|
||||
obp = obuf + strlen(obuf);
|
||||
while ((nlp = strchr(v, '\n')) != NULL)
|
||||
|
|
@ -1280,7 +1286,7 @@ put_vanilla_header(h, v, mci)
|
|||
l = sizeof obuf - (obp - obuf);
|
||||
|
||||
snprintf(obp, SPACELEFT(obuf, obp), "%.*s", l, v);
|
||||
putline(obuf, mci);
|
||||
putxline(obuf, mci, putflags);
|
||||
v += l + 1;
|
||||
obp = obuf;
|
||||
if (*v != ' ' && *v != '\t')
|
||||
|
|
@ -1288,7 +1294,7 @@ put_vanilla_header(h, v, mci)
|
|||
}
|
||||
snprintf(obp, SPACELEFT(obuf, obp), "%.*s",
|
||||
sizeof obuf - (obp - obuf) - 1, v);
|
||||
putline(obuf, mci);
|
||||
putxline(obuf, mci, putflags);
|
||||
}
|
||||
/*
|
||||
** COMMAIZE -- output a header field, making a comma-translated list.
|
||||
|
|
@ -1319,6 +1325,7 @@ commaize(h, p, oldstyle, mci, e)
|
|||
int opos;
|
||||
int omax;
|
||||
bool firstone = TRUE;
|
||||
int putflags = 0;
|
||||
char obuf[MAXLINE + 3];
|
||||
|
||||
/*
|
||||
|
|
@ -1329,6 +1336,11 @@ commaize(h, p, oldstyle, mci, e)
|
|||
if (tTd(14, 2))
|
||||
printf("commaize(%s: %s)\n", h->h_field, p);
|
||||
|
||||
#ifdef _FFR_7BITHDRS
|
||||
if (bitnset(M_7BITHDRS, mci->mci_mailer->m_flags))
|
||||
putflags |= PXLF_STRIP8BIT;
|
||||
#endif
|
||||
|
||||
obp = obuf;
|
||||
(void) snprintf(obp, SPACELEFT(obuf, obp), "%.200s: ", h->h_field);
|
||||
opos = strlen(h->h_field) + 2;
|
||||
|
|
@ -1425,7 +1437,7 @@ commaize(h, p, oldstyle, mci, e)
|
|||
if (opos > omax && !firstone)
|
||||
{
|
||||
snprintf(obp, SPACELEFT(obuf, obp), ",\n");
|
||||
putline(obuf, mci);
|
||||
putxline(obuf, mci, putflags);
|
||||
obp = obuf;
|
||||
(void) strcpy(obp, " ");
|
||||
opos = strlen(obp);
|
||||
|
|
@ -1444,7 +1456,7 @@ commaize(h, p, oldstyle, mci, e)
|
|||
*p = savechar;
|
||||
}
|
||||
*obp = '\0';
|
||||
putline(obuf, mci);
|
||||
putxline(obuf, mci, putflags);
|
||||
}
|
||||
/*
|
||||
** COPYHEADER -- copy header list
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ static char copyright[] =
|
|||
#endif /* not lint */
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)main.c 8.215 (Berkeley) 11/16/96";
|
||||
static char sccsid[] = "@(#)main.c 8.223 (Berkeley) 12/1/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#define _DEFINE
|
||||
|
|
@ -103,11 +103,12 @@ static void obsolete();
|
|||
extern void printmailer __P((MAILER *));
|
||||
extern void tTflag __P((char *));
|
||||
|
||||
#ifdef DAEMON
|
||||
#ifndef SMTP
|
||||
ERROR %%%% Cannot have daemon mode without SMTP %%%% ERROR
|
||||
#endif /* SMTP */
|
||||
#endif /* DAEMON */
|
||||
#if DAEMON && !SMTP
|
||||
ERROR %%%% Cannot have DAEMON mode without SMTP %%%% ERROR
|
||||
#endif /* DAEMON && !SMTP */
|
||||
#if SMTP && !QUEUE
|
||||
ERROR %%%% Cannot have SMTP mode without QUEUE %%%% ERROR
|
||||
#endif /* DAEMON && !SMTP */
|
||||
|
||||
#define MAXCONFIGLEVEL 7 /* highest config version level known */
|
||||
|
||||
|
|
@ -134,7 +135,7 @@ main(argc, argv, envp)
|
|||
struct passwd *pw;
|
||||
struct stat stb;
|
||||
struct hostent *hp;
|
||||
bool nullserver;
|
||||
bool nullserver = FALSE;
|
||||
char jbuf[MAXHOSTNAMELEN]; /* holds MyHostName */
|
||||
static char rnamebuf[MAXNAME]; /* holds RealUserName */
|
||||
char *emptyenviron[1];
|
||||
|
|
@ -519,13 +520,13 @@ main(argc, argv, envp)
|
|||
{
|
||||
case MD_DAEMON:
|
||||
case MD_FGDAEMON:
|
||||
# ifndef DAEMON
|
||||
# if !DAEMON
|
||||
usrerr("Daemon mode not implemented");
|
||||
ExitStat = EX_USAGE;
|
||||
break;
|
||||
# endif /* DAEMON */
|
||||
case MD_SMTP:
|
||||
# ifndef SMTP
|
||||
# if !SMTP
|
||||
usrerr("I don't speak SMTP");
|
||||
ExitStat = EX_USAGE;
|
||||
break;
|
||||
|
|
@ -653,7 +654,7 @@ main(argc, argv, envp)
|
|||
break;
|
||||
|
||||
case 'q': /* run queue files at intervals */
|
||||
# ifdef QUEUE
|
||||
# if QUEUE
|
||||
FullName = NULL;
|
||||
queuemode = TRUE;
|
||||
switch (optarg[0])
|
||||
|
|
@ -949,7 +950,8 @@ main(argc, argv, envp)
|
|||
|
||||
default:
|
||||
/* arrange to exit cleanly on hangup signal */
|
||||
setsignal(SIGHUP, intsig);
|
||||
if (setsignal(SIGHUP, SIG_IGN) == (sigfunc_t) SIG_DFL)
|
||||
setsignal(SIGHUP, intsig);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -1046,10 +1048,6 @@ main(argc, argv, envp)
|
|||
setbitn(M_RUNASRCPT, ProgMailer->m_flags);
|
||||
if (FileMailer != NULL)
|
||||
setbitn(M_RUNASRCPT, FileMailer->m_flags);
|
||||
|
||||
/* propogate some envariables into children */
|
||||
setuserenv("ISP", NULL);
|
||||
setuserenv("SYSTYPE", NULL);
|
||||
}
|
||||
if (ConfigLevel < 7)
|
||||
{
|
||||
|
|
@ -1104,7 +1102,7 @@ main(argc, argv, envp)
|
|||
HostStatDir = NULL;
|
||||
}
|
||||
|
||||
# ifdef QUEUE
|
||||
# if QUEUE
|
||||
if (queuemode && RealUid != 0 && bitset(PRIV_RESTRICTQRUN, PrivacyFlags))
|
||||
{
|
||||
struct stat stbuf;
|
||||
|
|
@ -1141,7 +1139,7 @@ main(argc, argv, envp)
|
|||
{
|
||||
case MD_PRINT:
|
||||
/* print the queue */
|
||||
#ifdef QUEUE
|
||||
#if QUEUE
|
||||
dropenvelope(CurEnv, TRUE);
|
||||
printqueue();
|
||||
endpwent();
|
||||
|
|
@ -1247,7 +1245,7 @@ main(argc, argv, envp)
|
|||
}
|
||||
}
|
||||
|
||||
# ifdef QUEUE
|
||||
# if QUEUE
|
||||
/*
|
||||
** If collecting stuff from the queue, go start doing that.
|
||||
*/
|
||||
|
|
@ -1255,7 +1253,7 @@ main(argc, argv, envp)
|
|||
if (queuemode && OpMode != MD_DAEMON && QueueIntvl == 0)
|
||||
{
|
||||
(void) unsetenv("HOSTALIASES");
|
||||
runqueue(FALSE);
|
||||
(void) runqueue(FALSE, Verbose);
|
||||
finis();
|
||||
}
|
||||
# endif /* QUEUE */
|
||||
|
|
@ -1305,10 +1303,10 @@ main(argc, argv, envp)
|
|||
xla_create_file();
|
||||
#endif
|
||||
|
||||
# ifdef QUEUE
|
||||
# if QUEUE
|
||||
if (queuemode)
|
||||
{
|
||||
runqueue(TRUE);
|
||||
(void) runqueue(TRUE, FALSE);
|
||||
if (OpMode != MD_DAEMON)
|
||||
for (;;)
|
||||
pause();
|
||||
|
|
@ -1316,7 +1314,7 @@ main(argc, argv, envp)
|
|||
# endif /* QUEUE */
|
||||
dropenvelope(CurEnv, TRUE);
|
||||
|
||||
#ifdef DAEMON
|
||||
#if DAEMON
|
||||
nullserver = getrequests(CurEnv);
|
||||
|
||||
/* drop privileges */
|
||||
|
|
@ -1337,7 +1335,7 @@ main(argc, argv, envp)
|
|||
#endif /* DAEMON */
|
||||
}
|
||||
|
||||
# ifdef SMTP
|
||||
# if SMTP
|
||||
/*
|
||||
** If running SMTP protocol, start collecting and executing
|
||||
** commands. This will never return.
|
||||
|
|
@ -1651,8 +1649,8 @@ disconnect(droplev, e)
|
|||
int fd;
|
||||
|
||||
if (tTd(52, 1))
|
||||
printf("disconnect: In %d Out %d, e=%x\n",
|
||||
fileno(InChannel), fileno(OutChannel), e);
|
||||
printf("disconnect: In %d Out %d, e=%lx\n",
|
||||
fileno(InChannel), fileno(OutChannel), (u_long) e);
|
||||
if (tTd(52, 100))
|
||||
{
|
||||
printf("don't\n");
|
||||
|
|
@ -1956,6 +1954,14 @@ sigusr1()
|
|||
void
|
||||
sighup()
|
||||
{
|
||||
if (SaveArgv[0][0] != '/')
|
||||
{
|
||||
#ifdef LOG
|
||||
if (LogLevel > 3)
|
||||
syslog(LOG_INFO, "could not restart: need full path");
|
||||
#endif
|
||||
exit(EX_OSFILE);
|
||||
}
|
||||
#ifdef LOG
|
||||
if (LogLevel > 3)
|
||||
syslog(LOG_INFO, "restarting %s on signal", SaveArgv[0]);
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
# SUCH DAMAGE.
|
||||
#
|
||||
# @(#)makesendmail 8.41 (Berkeley) 9/23/96
|
||||
# @(#)makesendmail 8.42 (Berkeley) 11/10/96
|
||||
#
|
||||
|
||||
#
|
||||
|
|
@ -109,6 +109,13 @@ in
|
|||
esac
|
||||
|
||||
# tweak operating system type and release
|
||||
node=`uname -n | sed -e 's/\//-/g' -e 's/ //g'`
|
||||
if [ "$os" = "$node" -a "$arch" = "i386" -a "$rel" = 3.2 -a "`uname -v`" = 2 ]
|
||||
then
|
||||
# old versions of SCO UNIX set uname -s the same as uname -n
|
||||
os=SCO_SV
|
||||
fi
|
||||
|
||||
case $os
|
||||
in
|
||||
DYNIX-ptx) os=PTX;;
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)map.c 8.144 (Berkeley) 11/16/96";
|
||||
static char sccsid[] = "@(#)map.c 8.146 (Berkeley) 11/24/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "sendmail.h"
|
||||
|
|
@ -1323,7 +1323,8 @@ db_map_store(map, lhs, rhs)
|
|||
data.size = data.size + old.size + 1;
|
||||
data.data = buf;
|
||||
if (tTd(38, 9))
|
||||
printf("db_map_store append=%s\n", data.data);
|
||||
printf("db_map_store append=%s\n",
|
||||
(char *) data.data);
|
||||
}
|
||||
}
|
||||
stat = db->put(db, &key, &data, 0);
|
||||
|
|
@ -1344,7 +1345,7 @@ db_map_close(map)
|
|||
register DB *db = map->map_db2;
|
||||
|
||||
if (tTd(38, 9))
|
||||
printf("db_map_close(%s, %s, %x)\n",
|
||||
printf("db_map_close(%s, %s, %lx)\n",
|
||||
map->map_mname, map->map_file, map->map_mflags);
|
||||
|
||||
if (bitset(MF_WRITABLE, map->map_mflags))
|
||||
|
|
@ -3406,7 +3407,7 @@ impl_map_close(map)
|
|||
MAP *map;
|
||||
{
|
||||
if (tTd(38, 9))
|
||||
printf("impl_map_close(%s, %s, %x)\n",
|
||||
printf("impl_map_close(%s, %s, %lx)\n",
|
||||
map->map_mname, map->map_file, map->map_mflags);
|
||||
#ifdef NEWDB
|
||||
if (bitset(MF_IMPL_HASH, map->map_mflags))
|
||||
|
|
@ -3598,6 +3599,7 @@ prog_map_lookup(map, name, av, statp)
|
|||
printf(" %s", argv[i]);
|
||||
printf("\n");
|
||||
}
|
||||
(void) blocksignal(SIGCHLD);
|
||||
pid = prog_open(argv, &fd, CurEnv);
|
||||
if (pid < 0)
|
||||
{
|
||||
|
|
@ -3646,6 +3648,7 @@ prog_map_lookup(map, name, av, statp)
|
|||
/* wait for the process to terminate */
|
||||
close(fd);
|
||||
stat = waitfor(pid);
|
||||
(void) releasesignal(SIGCHLD);
|
||||
|
||||
if (stat == -1)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)mci.c 8.46 (Berkeley) 11/3/96";
|
||||
static char sccsid[] = "@(#)mci.c 8.54 (Berkeley) 12/1/96";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "sendmail.h"
|
||||
|
|
@ -114,8 +114,8 @@ mci_cache(mci)
|
|||
mci_uncache(mcislot, TRUE);
|
||||
|
||||
if (tTd(42, 5))
|
||||
printf("mci_cache: caching %x (%s) in slot %d\n",
|
||||
mci, mci->mci_host, mcislot - MciCache);
|
||||
printf("mci_cache: caching %lx (%s) in slot %d\n",
|
||||
(u_long) mci, mci->mci_host, mcislot - MciCache);
|
||||
#ifdef LOG
|
||||
if (tTd(91, 100))
|
||||
syslog(LOG_DEBUG, "%s: mci_cache: caching %x (%.100s) in slot %d",
|
||||
|
|
@ -214,8 +214,8 @@ mci_uncache(mcislot, doquit)
|
|||
mci_unlock_host(mci);
|
||||
|
||||
if (tTd(42, 5))
|
||||
printf("mci_uncache: uncaching %x (%s) from slot %d (%d)\n",
|
||||
mci, mci->mci_host, mcislot - MciCache, doquit);
|
||||
printf("mci_uncache: uncaching %lx (%s) from slot %d (%d)\n",
|
||||
(u_long) mci, mci->mci_host, mcislot - MciCache, doquit);
|
||||
#ifdef LOG
|
||||
if (tTd(91, 100))
|
||||
syslog(LOG_DEBUG, "%s: mci_uncache: uncaching %x (%.100s) from slot %d (%d)",
|
||||
|
|
@ -223,7 +223,7 @@ mci_uncache(mcislot, doquit)
|
|||
mci, mci->mci_host, mcislot - MciCache, doquit);
|
||||
#endif
|
||||
|
||||
#ifdef SMTP
|
||||
#if SMTP
|
||||
if (doquit)
|
||||
{
|
||||
message("Closing connection to %s", mci->mci_host);
|
||||
|
|
@ -289,7 +289,7 @@ mci_get(host, m)
|
|||
register MCI *mci;
|
||||
register STAB *s;
|
||||
|
||||
#ifdef DAEMON
|
||||
#if DAEMON
|
||||
extern SOCKADDR CurHostAddr;
|
||||
|
||||
/* clear CurHostAddr so we don't get a bogus address with this name */
|
||||
|
|
@ -314,7 +314,7 @@ mci_get(host, m)
|
|||
mci->mci_exitstat, mci->mci_errno);
|
||||
}
|
||||
|
||||
#ifdef SMTP
|
||||
#if SMTP
|
||||
if (mci->mci_state == MCIS_OPEN)
|
||||
{
|
||||
extern int smtpprobe __P((MCI *));
|
||||
|
|
@ -329,7 +329,7 @@ mci_get(host, m)
|
|||
mci->mci_exitstat = EX_OK;
|
||||
mci->mci_state = MCIS_CLOSED;
|
||||
}
|
||||
# ifdef DAEMON
|
||||
# if DAEMON
|
||||
else
|
||||
{
|
||||
/* get peer host address for logging reasons only */
|
||||
|
|
@ -377,7 +377,10 @@ mci_setstat(mci, xstat, dstat, rstat)
|
|||
char *dstat;
|
||||
char *rstat;
|
||||
{
|
||||
mci->mci_exitstat = xstat;
|
||||
/* protocol errors should never be interpreted as sticky */
|
||||
if (xstat != EX_NOTSTICKY && xstat != EX_PROTOCOL)
|
||||
mci->mci_exitstat = xstat;
|
||||
|
||||
mci->mci_status = dstat;
|
||||
if (mci->mci_rstatus != NULL)
|
||||
free(mci->mci_rstatus);
|
||||
|
|
@ -672,7 +675,6 @@ mci_load_persistent(mci)
|
|||
{
|
||||
int saveErrno = errno;
|
||||
FILE *fp;
|
||||
int status;
|
||||
char fname[MAXPATHLEN+1];
|
||||
|
||||
if (mci == NULL)
|
||||
|
|
@ -682,7 +684,7 @@ mci_load_persistent(mci)
|
|||
return;
|
||||
}
|
||||
|
||||
if (HostStatDir == NULL || mci->mci_host == NULL)
|
||||
if (IgnoreHostStatus || HostStatDir == NULL || mci->mci_host == NULL)
|
||||
return;
|
||||
|
||||
if (tTd(56, 1))
|
||||
|
|
@ -750,7 +752,7 @@ mci_read_persistent(fp, mci)
|
|||
syserr("mci_read_persistent: NULL mci");
|
||||
if (tTd(56, 93))
|
||||
{
|
||||
printf("mci_read_persistent: fp=%x, mci=", fp);
|
||||
printf("mci_read_persistent: fp=%lx, mci=", (u_long) fp);
|
||||
mci_dump(mci, FALSE);
|
||||
}
|
||||
|
||||
|
|
@ -760,6 +762,7 @@ mci_read_persistent(fp, mci)
|
|||
mci->mci_rstatus = NULL;
|
||||
|
||||
rewind(fp);
|
||||
ver = -1;
|
||||
while (fgets(buf, sizeof buf, fp) != NULL)
|
||||
{
|
||||
p = strchr(buf, '\n');
|
||||
|
|
@ -806,6 +809,8 @@ mci_read_persistent(fp, mci)
|
|||
return -1;
|
||||
}
|
||||
}
|
||||
if (ver < 0)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
|
|
@ -868,7 +873,6 @@ mci_store_persistent(mci)
|
|||
|
||||
fflush(mci->mci_statfile);
|
||||
|
||||
cleanup:
|
||||
errno = saveErrno;
|
||||
return;
|
||||
}
|
||||
|
|
@ -903,7 +907,7 @@ mci_traverse_persistent(action, pathname)
|
|||
{
|
||||
struct stat statbuf;
|
||||
DIR *d;
|
||||
int ret = 0;
|
||||
int ret;
|
||||
|
||||
if (pathname == NULL)
|
||||
pathname = HostStatDir;
|
||||
|
|
@ -961,13 +965,17 @@ mci_traverse_persistent(action, pathname)
|
|||
|
||||
/*
|
||||
** The following appears to be
|
||||
** necessary during purgest, since
|
||||
** necessary during purges, since
|
||||
** we modify the directory structure
|
||||
*/
|
||||
|
||||
if (action == mci_purge_persistent)
|
||||
rewinddir(d);
|
||||
}
|
||||
|
||||
/* purge (or whatever) the directory proper */
|
||||
*--newptr = '\0';
|
||||
ret = (*action)(newpath, NULL);
|
||||
closedir(d);
|
||||
}
|
||||
else if (S_ISREG(statbuf.st_mode))
|
||||
|
|
@ -1031,12 +1039,14 @@ mci_print_persistent(pathname, hostname)
|
|||
{
|
||||
static int initflag = FALSE;
|
||||
FILE *fp;
|
||||
int status;
|
||||
int width = Verbose ? 78 : 25;
|
||||
bool locked;
|
||||
char *p;
|
||||
MCI mcib;
|
||||
|
||||
/* skip directories */
|
||||
if (hostname == NULL)
|
||||
return 0;
|
||||
|
||||
if (!initflag)
|
||||
{
|
||||
initflag = TRUE;
|
||||
|
|
@ -1101,6 +1111,7 @@ mci_print_persistent(pathname, hostname)
|
|||
** Parameters:
|
||||
** pathname -- path to the status file.
|
||||
** hostname -- name of host corresponding to that file.
|
||||
** NULL if this is a directory (domain).
|
||||
**
|
||||
** Returns:
|
||||
** 0
|
||||
|
|
@ -1116,43 +1127,30 @@ mci_purge_persistent(pathname, hostname)
|
|||
if (tTd(56, 1))
|
||||
printf("mci_purge_persistent: purging %s\n", pathname);
|
||||
|
||||
/* remove the file */
|
||||
if (unlink(pathname) < 0)
|
||||
if (hostname != NULL)
|
||||
{
|
||||
if (tTd(56, 2))
|
||||
printf("mci_purge_persistent: failed to unlink %s: %s\n",
|
||||
pathname, errstring(errno));
|
||||
return -1;
|
||||
/* remove the file */
|
||||
if (unlink(pathname) < 0)
|
||||
{
|
||||
if (tTd(56, 2))
|
||||
printf("mci_purge_persistent: failed to unlink %s: %s\n",
|
||||
pathname, errstring(errno));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** remove empty parent directories.
|
||||
*/
|
||||
|
||||
for (;;)
|
||||
else
|
||||
{
|
||||
while (*end != '/')
|
||||
end--;
|
||||
*(end--) = '\0';
|
||||
|
||||
/* remove the directory */
|
||||
if (*end != '.')
|
||||
break;
|
||||
return 0;
|
||||
|
||||
if (tTd(56, 1))
|
||||
printf("mci_purge_persistent: dpurge %s\n", pathname);
|
||||
|
||||
if (rmdir(pathname) < 0)
|
||||
{
|
||||
if (errno == ENOENT || errno == EEXIST)
|
||||
break; /* directory is not empty */
|
||||
#ifdef ENOTEMTPY
|
||||
if (errno == ENOTEMPTY)
|
||||
break; /* BSDism */
|
||||
#endif
|
||||
if (tTd(56, 2))
|
||||
printf("mci_purge_persistent: rmdir %s: %s\n",
|
||||
pathname, errstring(errno));
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
# include <string.h>
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)mime.c 8.49 (Berkeley) 10/30/96";
|
||||
static char sccsid[] = "@(#)mime.c 8.51 (Berkeley) 11/24/96";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
|
|
@ -450,7 +450,7 @@ mime8to7(mci, header, e, boundaries, flags)
|
|||
if (tTd(43, 8))
|
||||
{
|
||||
printf("mime8to7: %ld high bit(s) in %ld byte(s), cte=%s, type=%s/%s\n",
|
||||
sectionhighbits, sectionsize,
|
||||
(long) sectionhighbits, (long) sectionsize,
|
||||
cte == NULL ? "[none]" : cte,
|
||||
type == NULL ? "[none]" : type,
|
||||
subtype == NULL ? "[none]" : subtype);
|
||||
|
|
@ -959,7 +959,7 @@ mime7to8(mci, header, e)
|
|||
char *cte;
|
||||
char **pvp;
|
||||
u_char *obp;
|
||||
u_char ch, *fbufp, *obufp;
|
||||
u_char *fbufp;
|
||||
char buf[MAXLINE];
|
||||
u_char obuf[MAXLINE + 1];
|
||||
u_char fbuf[MAXLINE + 1];
|
||||
|
|
@ -1010,7 +1010,6 @@ mime7to8(mci, header, e)
|
|||
|
||||
if (strcasecmp(cte, "base64") == 0)
|
||||
{
|
||||
int nchar = 0;
|
||||
int c1, c2, c3, c4;
|
||||
|
||||
fbufp = fbuf;
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)parseaddr.c 8.114 (Berkeley) 9/20/96";
|
||||
static char sccsid[] = "@(#)parseaddr.c 8.115 (Berkeley) 11/24/96";
|
||||
#endif /* not lint */
|
||||
|
||||
# include "sendmail.h"
|
||||
|
|
@ -1045,7 +1045,7 @@ rewrite(pvp, ruleset, reclevel, e)
|
|||
pp = m->first;
|
||||
while (pp <= m->last)
|
||||
{
|
||||
printf(" %x=\"", *pp);
|
||||
printf(" %lx=\"", (u_long) *pp);
|
||||
(void) fflush(stdout);
|
||||
printf("%s\"", *pp++);
|
||||
}
|
||||
|
|
@ -1873,7 +1873,7 @@ printaddr(a, follow)
|
|||
|
||||
while (a != NULL)
|
||||
{
|
||||
printf("%x=", a);
|
||||
printf("%lx=", (u_long) a);
|
||||
(void) fflush(stdout);
|
||||
|
||||
/* find the mailer -- carefully */
|
||||
|
|
@ -1892,8 +1892,9 @@ printaddr(a, follow)
|
|||
printf("\tuser `%s', ruser `%s'\n",
|
||||
a->q_user,
|
||||
a->q_ruser == NULL ? "<null>" : a->q_ruser);
|
||||
printf("\tnext=%x, alias %x, uid %d, gid %d\n",
|
||||
a->q_next, a->q_alias, a->q_uid, a->q_gid);
|
||||
printf("\tnext=%lx, alias %lx, uid %d, gid %d\n",
|
||||
(u_long) a->q_next, (u_long) a->q_alias,
|
||||
(int) a->q_uid, (int) a->q_gid);
|
||||
printf("\tflags=%lx<", a->q_flags);
|
||||
firstone = TRUE;
|
||||
for (qfp = AddressFlags; qfp->qf_name != NULL; qfp++)
|
||||
|
|
|
|||
|
|
@ -35,17 +35,17 @@
|
|||
# include "sendmail.h"
|
||||
|
||||
#ifndef lint
|
||||
#ifdef QUEUE
|
||||
static char sccsid[] = "@(#)queue.c 8.131 (Berkeley) 11/8/96 (with queueing)";
|
||||
#if QUEUE
|
||||
static char sccsid[] = "@(#)queue.c 8.145 (Berkeley) 12/2/96 (with queueing)";
|
||||
#else
|
||||
static char sccsid[] = "@(#)queue.c 8.131 (Berkeley) 11/8/96 (without queueing)";
|
||||
static char sccsid[] = "@(#)queue.c 8.145 (Berkeley) 12/2/96 (without queueing)";
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
# include <errno.h>
|
||||
# include <dirent.h>
|
||||
|
||||
# ifdef QUEUE
|
||||
# if QUEUE
|
||||
|
||||
/*
|
||||
** Work queue.
|
||||
|
|
@ -195,7 +195,7 @@ queueup(e, announce)
|
|||
|
||||
if (!bitset(EF_HAS_DF, e->e_flags))
|
||||
{
|
||||
register FILE *dfp;
|
||||
register FILE *dfp = NULL;
|
||||
char dfname[20];
|
||||
struct stat stbuf;
|
||||
|
||||
|
|
@ -300,8 +300,9 @@ queueup(e, announce)
|
|||
{
|
||||
#if XDEBUG
|
||||
if (bitset(QQUEUEUP, q->q_flags))
|
||||
syslog(LOG_DEBUG, "%s: q_flags = %x",
|
||||
e->e_id, q->q_flags);
|
||||
syslog(LOG_DEBUG,
|
||||
"dropenvelope: %s: q_flags = %x, paddr = %s",
|
||||
e->e_id, q->q_flags, q->q_paddr);
|
||||
#endif
|
||||
continue;
|
||||
}
|
||||
|
|
@ -474,7 +475,6 @@ printctladdr(a, tfp)
|
|||
{
|
||||
char *uname;
|
||||
char *paddr;
|
||||
register struct passwd *pw;
|
||||
register ADDRESS *q;
|
||||
uid_t uid;
|
||||
gid_t gid;
|
||||
|
|
@ -531,9 +531,10 @@ printctladdr(a, tfp)
|
|||
** forkflag -- TRUE if the queue scanning should be done in
|
||||
** a child process. We double-fork so it is not our
|
||||
** child and we don't have to clean up after it.
|
||||
** verbose -- if TRUE, print out status information.
|
||||
**
|
||||
** Returns:
|
||||
** none.
|
||||
** TRUE if the queue run successfully began.
|
||||
**
|
||||
** Side Effects:
|
||||
** runs things in the mail queue.
|
||||
|
|
@ -541,15 +542,17 @@ printctladdr(a, tfp)
|
|||
|
||||
ENVELOPE QueueEnvelope; /* the queue run envelope */
|
||||
|
||||
void
|
||||
runqueue(forkflag)
|
||||
bool
|
||||
runqueue(forkflag, verbose)
|
||||
bool forkflag;
|
||||
bool verbose;
|
||||
{
|
||||
register ENVELOPE *e;
|
||||
int njobs;
|
||||
int sequenceno = 0;
|
||||
extern ENVELOPE BlankEnvelope;
|
||||
extern void clrdaemon __P((void));
|
||||
extern void runqueueevent __P((bool));
|
||||
|
||||
/*
|
||||
** If no work will ever be selected, don't even bother reading
|
||||
|
|
@ -562,15 +565,15 @@ runqueue(forkflag)
|
|||
{
|
||||
char *msg = "Skipping queue run -- load average too high";
|
||||
|
||||
if (Verbose)
|
||||
printf("%s\n", msg);
|
||||
if (verbose)
|
||||
message("458 %s\n", msg);
|
||||
#ifdef LOG
|
||||
if (LogLevel > 8)
|
||||
syslog(LOG_INFO, "runqueue: %s", msg);
|
||||
#endif
|
||||
if (forkflag && QueueIntvl != 0)
|
||||
(void) setevent(QueueIntvl, runqueue, TRUE);
|
||||
return;
|
||||
(void) setevent(QueueIntvl, runqueueevent, TRUE);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -584,27 +587,49 @@ runqueue(forkflag)
|
|||
#ifdef SIGCHLD
|
||||
extern void reapchild();
|
||||
|
||||
blocksignal(SIGCHLD);
|
||||
(void) setsignal(SIGCHLD, reapchild);
|
||||
#endif
|
||||
|
||||
pid = dofork();
|
||||
if (pid == -1)
|
||||
{
|
||||
const char *msg = "Skipping queue run -- fork() failed";
|
||||
const char *err = errstring(errno);
|
||||
|
||||
if (verbose)
|
||||
message("458 %s: %s\n", msg, err);
|
||||
#ifdef LOG
|
||||
if (LogLevel > 8)
|
||||
syslog(LOG_INFO, "runqueue: %s: %s", msg, err);
|
||||
#endif
|
||||
if (QueueIntvl != 0)
|
||||
(void) setevent(QueueIntvl, runqueueevent, TRUE);
|
||||
(void) releasesignal(SIGCHLD);
|
||||
return FALSE;
|
||||
}
|
||||
if (pid != 0)
|
||||
{
|
||||
/* parent -- pick up intermediate zombie */
|
||||
#ifndef SIGCHLD
|
||||
(void) waitfor(pid);
|
||||
#else
|
||||
(void) blocksignal(SIGALRM);
|
||||
proc_list_add(pid);
|
||||
(void) releasesignal(SIGALRM);
|
||||
releasesignal(SIGCHLD);
|
||||
#endif /* SIGCHLD */
|
||||
if (QueueIntvl != 0)
|
||||
(void) setevent(QueueIntvl, runqueue, TRUE);
|
||||
return;
|
||||
(void) setevent(QueueIntvl, runqueueevent, TRUE);
|
||||
return TRUE;
|
||||
}
|
||||
/* child -- double fork and clean up signals */
|
||||
proc_list_clear();
|
||||
#ifndef SIGCHLD
|
||||
if (fork() != 0)
|
||||
exit(EX_OK);
|
||||
#else /* SIGCHLD */
|
||||
releasesignal(SIGCHLD);
|
||||
(void) setsignal(SIGCHLD, SIG_DFL);
|
||||
#endif /* SIGCHLD */
|
||||
(void) setsignal(SIGHUP, intsig);
|
||||
|
|
@ -623,7 +648,7 @@ runqueue(forkflag)
|
|||
** Release any resources used by the daemon code.
|
||||
*/
|
||||
|
||||
# ifdef DAEMON
|
||||
# if DAEMON
|
||||
clrdaemon();
|
||||
# endif /* DAEMON */
|
||||
|
||||
|
|
@ -660,7 +685,10 @@ runqueue(forkflag)
|
|||
|
||||
if (QueueLimitId != NULL || QueueLimitSender != NULL ||
|
||||
QueueLimitRecipient != NULL)
|
||||
HostStatDir = NULL;
|
||||
{
|
||||
IgnoreHostStatus = TRUE;
|
||||
MinQueueAge = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
** Start making passes through the queue.
|
||||
|
|
@ -719,6 +747,20 @@ runqueue(forkflag)
|
|||
/* exit without the usual cleanup */
|
||||
e->e_id = NULL;
|
||||
finis();
|
||||
/*NOTREACHED*/
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** RUNQUEUEEVENT -- stub for use in setevent
|
||||
*/
|
||||
|
||||
void
|
||||
runqueueevent(forkflag)
|
||||
bool forkflag;
|
||||
{
|
||||
(void) runqueue(forkflag, FALSE);
|
||||
}
|
||||
/*
|
||||
** ORDERQ -- order the work queue.
|
||||
|
|
@ -1257,7 +1299,7 @@ workcmpf3(a, b)
|
|||
if (a->w_ctime > b->w_ctime)
|
||||
return 1;
|
||||
else if (a->w_ctime < b->w_ctime)
|
||||
return 1;
|
||||
return -1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1340,6 +1382,7 @@ dowork(id, forkflag, requeueflag, e)
|
|||
disconnect(1, e);
|
||||
OpMode = MD_DELIVER;
|
||||
}
|
||||
setproctitle("%s: from queue", id);
|
||||
# ifdef LOG
|
||||
if (LogLevel > 76)
|
||||
syslog(LOG_DEBUG, "%s: dowork, pid=%d", e->e_id,
|
||||
|
|
@ -2054,7 +2097,8 @@ queuename(e, type)
|
|||
e->e_id = newstr(&qf[2]);
|
||||
define('i', e->e_id, e);
|
||||
if (tTd(7, 1))
|
||||
printf("queuename: assigned id %s, env=%x\n", e->e_id, e);
|
||||
printf("queuename: assigned id %s, env=%lx\n",
|
||||
e->e_id, (u_long) e);
|
||||
if (tTd(7, 9))
|
||||
{
|
||||
printf(" lockfd=");
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)readcf.c 8.176 (Berkeley) 11/10/96";
|
||||
static char sccsid[] = "@(#)readcf.c 8.181 (Berkeley) 12/1/96";
|
||||
#endif /* not lint */
|
||||
|
||||
# include "sendmail.h"
|
||||
|
|
@ -1298,7 +1298,7 @@ printmailer(m)
|
|||
m->m_mno, m->m_name,
|
||||
m->m_mailer, m->m_se_rwset, m->m_sh_rwset,
|
||||
m->m_re_rwset, m->m_rh_rwset, m->m_maxsize,
|
||||
m->m_uid, m->m_gid);
|
||||
(int) m->m_uid, (int) m->m_gid);
|
||||
for (j = '\0'; j <= '\177'; j++)
|
||||
if (bitnset(j, m->m_flags))
|
||||
(void) putchar(j);
|
||||
|
|
@ -1423,7 +1423,7 @@ struct optioninfo
|
|||
{ "DefaultUser", 'u', FALSE },
|
||||
{ "FallbackMXhost", 'V', FALSE },
|
||||
{ "Verbose", 'v', TRUE },
|
||||
{ "TryNullMXList", 'w', TRUE },
|
||||
{ "TryNullMXList", 'w', FALSE },
|
||||
{ "QueueLA", 'x', FALSE },
|
||||
{ "RefuseLA", 'X', FALSE },
|
||||
{ "RecipientFactor", 'y', FALSE },
|
||||
|
|
@ -1465,7 +1465,7 @@ struct optioninfo
|
|||
#define O_OPCHARS 0x92
|
||||
{ "OperatorChars", O_OPCHARS, FALSE },
|
||||
#define O_DONTINITGRPS 0x93
|
||||
{ "DontInitGroups", O_DONTINITGRPS, TRUE },
|
||||
{ "DontInitGroups", O_DONTINITGRPS, FALSE },
|
||||
#define O_SLFH 0x94
|
||||
{ "SingleLineFromHeader", O_SLFH, TRUE },
|
||||
#define O_ABH 0x95
|
||||
|
|
@ -1728,7 +1728,7 @@ setoption(opt, val, safe, sticky, e)
|
|||
|
||||
case SM_QUEUE: /* queue only */
|
||||
case SM_DEFER: /* queue only and defer map lookups */
|
||||
#ifndef QUEUE
|
||||
#if !QUEUE
|
||||
syserr("need QUEUE to set -odqueue or -oddefer");
|
||||
#endif /* QUEUE */
|
||||
/* fall through..... */
|
||||
|
|
@ -1849,7 +1849,7 @@ setoption(opt, val, safe, sticky, e)
|
|||
}
|
||||
if (tTd(8, 2))
|
||||
printf("_res.options = %x, HasWildcardMX = %d\n",
|
||||
_res.options, HasWildcardMX);
|
||||
(u_int) _res.options, HasWildcardMX);
|
||||
#else
|
||||
usrerr("name server (I option) specified but BIND not compiled in");
|
||||
#endif
|
||||
|
|
@ -1906,7 +1906,7 @@ setoption(opt, val, safe, sticky, e)
|
|||
/* 'N' available -- was "net name" */
|
||||
|
||||
case 'O': /* daemon options */
|
||||
#ifdef DAEMON
|
||||
#if DAEMON
|
||||
setdaemonoptions(val);
|
||||
#else
|
||||
syserr("DaemonPortOptions (O option) set but DAEMON not compiled in");
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)recipient.c 8.116 (Berkeley) 8/17/96";
|
||||
static char sccsid[] = "@(#)recipient.c 8.118 (Berkeley) 12/1/96";
|
||||
#endif /* not lint */
|
||||
|
||||
# include "sendmail.h"
|
||||
|
|
@ -474,8 +474,8 @@ recipient(a, sendq, aliaslevel, e)
|
|||
|
||||
if (tTd(29, 5))
|
||||
{
|
||||
printf("recipient: testing local? cl=%d, rr5=%x\n\t",
|
||||
ConfigLevel, RewriteRules[5]);
|
||||
printf("recipient: testing local? cl=%d, rr5=%lx\n\t",
|
||||
ConfigLevel, (u_long) RewriteRules[5]);
|
||||
printaddr(a, FALSE);
|
||||
}
|
||||
if (!bitset(QNOTREMOTE|QDONTSEND|QQUEUEUP|QVERIFIED, a->q_flags) &&
|
||||
|
|
@ -601,7 +601,7 @@ recipient(a, sendq, aliaslevel, e)
|
|||
if (aliaslevel == 0)
|
||||
{
|
||||
int nrcpts = 0;
|
||||
ADDRESS *only;
|
||||
ADDRESS *only = NULL;
|
||||
|
||||
for (q = *sendq; q != NULL; q = q->q_next)
|
||||
{
|
||||
|
|
@ -907,7 +907,7 @@ include(fname, forwarding, ctladdr, sendq, aliaslevel, e)
|
|||
volatile gid_t savedgid, gid;
|
||||
char *volatile uname;
|
||||
int rval = 0;
|
||||
int sfflags = SFF_REGONLY;
|
||||
volatile int sfflags = SFF_REGONLY;
|
||||
struct stat st;
|
||||
char buf[MAXLINE];
|
||||
#ifdef _POSIX_CHOWN_RESTRICTED
|
||||
|
|
@ -932,7 +932,7 @@ include(fname, forwarding, ctladdr, sendq, aliaslevel, e)
|
|||
if (tTd(27, 2))
|
||||
printf("include(%s)\n", fname);
|
||||
if (tTd(27, 4))
|
||||
printf(" ruid=%d euid=%d\n", getuid(), geteuid());
|
||||
printf(" ruid=%d euid=%d\n", (int) getuid(), (int) geteuid());
|
||||
if (tTd(27, 14))
|
||||
{
|
||||
printf("ctladdr ");
|
||||
|
|
@ -940,7 +940,8 @@ include(fname, forwarding, ctladdr, sendq, aliaslevel, e)
|
|||
}
|
||||
|
||||
if (tTd(27, 9))
|
||||
printf("include: old uid = %d/%d\n", getuid(), geteuid());
|
||||
printf("include: old uid = %d/%d\n",
|
||||
(int) getuid(), (int) geteuid());
|
||||
|
||||
if (forwarding)
|
||||
sfflags |= SFF_MUSTOWN|SFF_ROOTOK|SFF_NOSLINK;
|
||||
|
|
@ -985,7 +986,8 @@ include(fname, forwarding, ctladdr, sendq, aliaslevel, e)
|
|||
#endif
|
||||
|
||||
if (tTd(27, 9))
|
||||
printf("include: new uid = %d/%d\n", getuid(), geteuid());
|
||||
printf("include: new uid = %d/%d\n",
|
||||
(int) getuid(), (int) geteuid());
|
||||
|
||||
/*
|
||||
** If home directory is remote mounted but server is down,
|
||||
|
|
@ -1013,7 +1015,7 @@ include(fname, forwarding, ctladdr, sendq, aliaslevel, e)
|
|||
/* don't use this :include: file */
|
||||
if (tTd(27, 4))
|
||||
printf("include: not safe (uid=%d): %s\n",
|
||||
uid, errstring(rval));
|
||||
(int) uid, errstring(rval));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1053,7 +1055,8 @@ resetuid:
|
|||
#endif
|
||||
|
||||
if (tTd(27, 9))
|
||||
printf("include: reset uid = %d/%d\n", getuid(), geteuid());
|
||||
printf("include: reset uid = %d/%d\n",
|
||||
(int) getuid(), (int) geteuid());
|
||||
|
||||
if (rval == EOPENTIMEOUT)
|
||||
usrerr("451 open timeout on %s", fname);
|
||||
|
|
@ -1083,7 +1086,7 @@ resetuid:
|
|||
ctladdr->q_flags |= ca->q_flags & QBOGUSSHELL;
|
||||
ctladdr->q_ruser = ca->q_ruser;
|
||||
}
|
||||
else
|
||||
else if (!forwarding)
|
||||
{
|
||||
register struct passwd *pw;
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)savemail.c 8.100 (Berkeley) 9/27/96";
|
||||
static char sccsid[] = "@(#)savemail.c 8.101 (Berkeley) 11/24/96";
|
||||
#endif /* not lint */
|
||||
|
||||
# include "sendmail.h"
|
||||
|
|
@ -481,8 +481,8 @@ returntosender(msg, returnq, flags, e)
|
|||
|
||||
if (tTd(6, 1))
|
||||
{
|
||||
printf("\n*** Return To Sender: msg=\"%s\", depth=%d, e=%x, returnq=",
|
||||
msg, returndepth, e);
|
||||
printf("\n*** Return To Sender: msg=\"%s\", depth=%d, e=%lx, returnq=",
|
||||
msg, returndepth, (u_long) e);
|
||||
printaddr(returnq, TRUE);
|
||||
if (tTd(6, 20))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)sendmail.h 8.209 (Berkeley) 11/8/96
|
||||
* @(#)sendmail.h 8.216 (Berkeley) 12/1/96
|
||||
*/
|
||||
|
||||
/*
|
||||
|
|
@ -41,7 +41,7 @@
|
|||
# ifdef _DEFINE
|
||||
# define EXTERN
|
||||
# ifndef lint
|
||||
static char SmailSccsId[] = "@(#)sendmail.h 8.209 11/8/96";
|
||||
static char SmailSccsId[] = "@(#)sendmail.h 8.216 12/1/96";
|
||||
# endif
|
||||
# else /* _DEFINE */
|
||||
# define EXTERN extern
|
||||
|
|
@ -68,7 +68,7 @@ static char SmailSccsId[] = "@(#)sendmail.h 8.209 11/8/96";
|
|||
# include <syslog.h>
|
||||
# endif /* LOG */
|
||||
|
||||
# ifdef DAEMON
|
||||
# if NETINET || NETUNIX || NETISO || NETNS || NETX25
|
||||
# include <sys/socket.h>
|
||||
# endif
|
||||
# if NETUNIX
|
||||
|
|
@ -277,8 +277,10 @@ struct mailer
|
|||
# define M_XDOT 'X' /* use hidden-dot algorithm */
|
||||
# define M_LMTP 'z' /* run Local Mail Transport Protocol */
|
||||
# define M_NOMX '0' /* turn off MX lookups */
|
||||
# define M_NONULLS '1' /* don't send null bytes */
|
||||
# define M_EBCDIC '3' /* extend Q-P encoding for EBCDIC */
|
||||
# define M_TRYRULESET5 '5' /* use ruleset 5 after local aliasing */
|
||||
# define M_7BITHDRS '6' /* strip headers to 7 bits even in 8 bit path */
|
||||
# define M_7BITS '7' /* use 7-bit path */
|
||||
# define M_8BITS '8' /* force "just send 8" behaviour */
|
||||
# define M_MAKE8BIT '9' /* convert 7 -> 8 bit if appropriate */
|
||||
|
|
@ -984,7 +986,7 @@ extern int safefile __P((char *, UID_T, GID_T, char *, int, int, struct stat *))
|
|||
** we are forced to declare a supertype here.
|
||||
*/
|
||||
|
||||
#ifdef DAEMON
|
||||
# if NETINET || NETUNIX || NETISO || NETNS || NETX25
|
||||
union bigsockaddr
|
||||
{
|
||||
struct sockaddr sa; /* general version */
|
||||
|
|
@ -1011,6 +1013,9 @@ EXTERN SOCKADDR RealHostAddr; /* address of host we are talking to */
|
|||
|
||||
extern char *hostnamebyanyaddr __P((SOCKADDR *));
|
||||
extern char *anynet_ntoa __P((SOCKADDR *));
|
||||
# if DAEMON
|
||||
extern bool validate_connection __P((SOCKADDR *, char *, ENVELOPE *));
|
||||
# endif
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -1160,6 +1165,7 @@ EXTERN bool AllowBogusHELO; /* allow syntax errors on HELO command */
|
|||
EXTERN bool UserSubmission; /* initial (user) mail submission */
|
||||
EXTERN uid_t RunAsUid; /* UID to become for bulk of run */
|
||||
EXTERN gid_t RunAsGid; /* GID to become for bulk of run */
|
||||
EXTERN bool IgnoreHostStatus; /* ignore long term host status files */
|
||||
EXTERN bool SingleThreadDelivery; /* single thread hosts on delivery */
|
||||
EXTERN bool UnsafeGroupWrites; /* group-writable files are unsafe */
|
||||
EXTERN bool SingleLineFromHeader; /* force From: header to be one line */
|
||||
|
|
@ -1315,6 +1321,7 @@ extern void shorten_hostname __P((char []));
|
|||
extern int waitfor __P((pid_t));
|
||||
extern void proc_list_add __P((pid_t));
|
||||
extern void proc_list_drop __P((pid_t));
|
||||
extern void proc_list_clear __P((void));
|
||||
extern void buffer_errors __P((void));
|
||||
extern void flush_errors __P((bool));
|
||||
extern void putline __P((char *, MCI *));
|
||||
|
|
@ -1336,7 +1343,7 @@ extern void stripquotes __P((char *));
|
|||
extern int include __P((char *, bool, ADDRESS *, ADDRESS **, int, ENVELOPE *));
|
||||
extern void unlockqueue __P((ENVELOPE *));
|
||||
extern void xunlink __P((char *));
|
||||
extern void runqueue __P((bool));
|
||||
extern bool runqueue __P((bool, bool));
|
||||
extern int getla __P((void));
|
||||
extern void sendall __P((ENVELOPE *, int));
|
||||
extern void queueup __P((ENVELOPE *, bool));
|
||||
|
|
@ -1349,12 +1356,12 @@ extern int mailfile __P((char *, ADDRESS *, int, ENVELOPE *));
|
|||
extern void loseqfile __P((ENVELOPE *, char *));
|
||||
extern int prog_open __P((char **, int *, ENVELOPE *));
|
||||
extern bool getcanonname __P((char *, int, bool));
|
||||
extern bool validate_connection __P((SOCKADDR *, char *, ENVELOPE *));
|
||||
extern bool path_is_dir __P((char *, bool));
|
||||
extern pid_t dowork __P((char *, bool, bool, ENVELOPE *));
|
||||
|
||||
extern const char *errstring __P((int));
|
||||
extern sigfunc_t setsignal __P((int, sigfunc_t));
|
||||
extern int blocksignal __P((int));
|
||||
extern int releasesignal __P((int));
|
||||
extern struct hostent *sm_gethostbyname __P((char *));
|
||||
extern struct hostent *sm_gethostbyaddr __P((char *, int, int));
|
||||
|
|
|
|||
|
|
@ -35,16 +35,16 @@
|
|||
# include "sendmail.h"
|
||||
|
||||
#ifndef lint
|
||||
#ifdef SMTP
|
||||
static char sccsid[] = "@(#)srvrsmtp.c 8.125 (Berkeley) 11/8/96 (with SMTP)";
|
||||
#if SMTP
|
||||
static char sccsid[] = "@(#)srvrsmtp.c 8.131 (Berkeley) 12/1/96 (with SMTP)";
|
||||
#else
|
||||
static char sccsid[] = "@(#)srvrsmtp.c 8.125 (Berkeley) 11/8/96 (without SMTP)";
|
||||
static char sccsid[] = "@(#)srvrsmtp.c 8.131 (Berkeley) 12/1/96 (without SMTP)";
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
# include <errno.h>
|
||||
|
||||
# ifdef SMTP
|
||||
# if SMTP
|
||||
|
||||
/*
|
||||
** SMTP -- run the SMTP protocol.
|
||||
|
|
@ -128,7 +128,7 @@ smtp(nullserver, e)
|
|||
bool nullserver;
|
||||
register ENVELOPE *volatile e;
|
||||
{
|
||||
register char *p;
|
||||
register char *volatile p;
|
||||
register struct cmd *c;
|
||||
char *cmd;
|
||||
auto ADDRESS *vrfyqueue;
|
||||
|
|
@ -146,6 +146,7 @@ smtp(nullserver, e)
|
|||
volatile int badcommands = 0; /* count of bad commands */
|
||||
volatile int nverifies = 0; /* count of VRFY/EXPN commands */
|
||||
volatile int n_etrn = 0; /* count of ETRN commands */
|
||||
bool ok;
|
||||
char inp[MAXLINE];
|
||||
char cmdbuf[MAXLINE];
|
||||
extern ENVELOPE BlankEnvelope;
|
||||
|
|
@ -169,7 +170,7 @@ smtp(nullserver, e)
|
|||
CurSmtpClient = CurHostName;
|
||||
|
||||
setproctitle("server %s startup", CurSmtpClient);
|
||||
#ifdef LOG
|
||||
#if defined(LOG) && DAEMON
|
||||
if (LogLevel > 11)
|
||||
{
|
||||
/* log connection information */
|
||||
|
|
@ -880,9 +881,10 @@ smtp(nullserver, e)
|
|||
shortenstring(id, 203));
|
||||
#endif
|
||||
QueueLimitRecipient = id;
|
||||
runqueue(TRUE);
|
||||
ok = runqueue(TRUE, TRUE);
|
||||
QueueLimitRecipient = NULL;
|
||||
message("250 Queuing for node %s started", p);
|
||||
if (ok)
|
||||
message("250 Queuing for node %s started", p);
|
||||
break;
|
||||
|
||||
case CMDHELP: /* help -- give user info */
|
||||
|
|
@ -929,7 +931,7 @@ doquit:
|
|||
message("250 Initial submission");
|
||||
break;
|
||||
|
||||
# ifdef SMTPDEBUG
|
||||
# if SMTPDEBUG
|
||||
case CMDDBGQSHOW: /* show queues */
|
||||
printf("Send Queue=");
|
||||
printaddr(e->e_sendqueue, TRUE);
|
||||
|
|
@ -1271,23 +1273,21 @@ runinchild(label, e)
|
|||
register ENVELOPE *e;
|
||||
{
|
||||
pid_t childpid;
|
||||
sigfunc_t chldsig;
|
||||
|
||||
if (!OneXact)
|
||||
{
|
||||
/*
|
||||
** Disable child process reaping, in case ETRN has preceeded
|
||||
** MAIL command.
|
||||
** MAIL command, and then fork.
|
||||
*/
|
||||
|
||||
#ifdef SIGCHLD
|
||||
chldsig = setsignal(SIGCHLD, SIG_IGN);
|
||||
#endif
|
||||
(void) blocksignal(SIGCHLD);
|
||||
|
||||
childpid = dofork();
|
||||
if (childpid < 0)
|
||||
{
|
||||
syserr("451 %s: cannot fork", label);
|
||||
(void) releasesignal(SIGCHLD);
|
||||
return (1);
|
||||
}
|
||||
if (childpid > 0)
|
||||
|
|
@ -1310,10 +1310,8 @@ runinchild(label, e)
|
|||
finis();
|
||||
}
|
||||
|
||||
#ifdef SIGCHLD
|
||||
/* restore the child signal */
|
||||
(void) setsignal(SIGCHLD, chldsig);
|
||||
#endif
|
||||
(void) releasesignal(SIGCHLD);
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
|
@ -1323,6 +1321,8 @@ runinchild(label, e)
|
|||
InChild = TRUE;
|
||||
QuickAbort = FALSE;
|
||||
clearenvelope(e, FALSE);
|
||||
(void) setsignal(SIGCHLD, SIG_DFL);
|
||||
(void) releasesignal(SIGCHLD);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)stab.c 8.9 (Berkeley) 10/17/96";
|
||||
static char sccsid[] = "@(#)stab.c 8.10 (Berkeley) 11/23/96";
|
||||
#endif /* not lint */
|
||||
|
||||
# include "sendmail.h"
|
||||
|
|
@ -131,7 +131,7 @@ stab(name, type, op)
|
|||
printf("entered\n");
|
||||
|
||||
/* determine size of new entry */
|
||||
#ifdef FFR_MEMORY_MISER
|
||||
#ifdef _FFR_MEMORY_MISER
|
||||
if (type >= ST_MCI)
|
||||
len = sizeof s->s_mci;
|
||||
else
|
||||
|
|
|
|||
|
|
@ -36,9 +36,9 @@
|
|||
|
||||
#ifndef lint
|
||||
#if USERDB
|
||||
static char sccsid [] = "@(#)udb.c 8.42 (Berkeley) 9/18/96 (with USERDB)";
|
||||
static char sccsid [] = "@(#)udb.c 8.46 (Berkeley) 12/1/96 (with USERDB)";
|
||||
#else
|
||||
static char sccsid [] = "@(#)udb.c 8.42 (Berkeley) 9/18/96 (without USERDB)";
|
||||
static char sccsid [] = "@(#)udb.c 8.46 (Berkeley) 12/1/96 (without USERDB)";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
|
@ -210,6 +210,7 @@ udbexpand(a, sendq, aliaslevel, e)
|
|||
#endif
|
||||
|
||||
user = userbuf;
|
||||
userbuf[0] = '\0';
|
||||
usersize = sizeof userbuf;
|
||||
userleft = sizeof userbuf - 1;
|
||||
|
||||
|
|
@ -240,7 +241,8 @@ udbexpand(a, sendq, aliaslevel, e)
|
|||
}
|
||||
if (tTd(28, 80))
|
||||
printf("udbexpand: match %.*s: %.*s\n",
|
||||
key.size, key.data, info.size, info.data);
|
||||
(int) key.size, (char *) key.data,
|
||||
(int) info.size, (char *) info.data);
|
||||
|
||||
a->q_flags &= ~QSELFREF;
|
||||
while (i == 0 && key.size == keylen &&
|
||||
|
|
@ -272,7 +274,7 @@ udbexpand(a, sendq, aliaslevel, e)
|
|||
*p++ = ',';
|
||||
userleft--;
|
||||
}
|
||||
bcopy(info.data, user, info.size);
|
||||
bcopy(info.data, p, info.size);
|
||||
user[info.size] = '\0';
|
||||
userleft -= info.size;
|
||||
|
||||
|
|
@ -817,6 +819,7 @@ _udbx_init()
|
|||
{
|
||||
char *spec;
|
||||
int nopts;
|
||||
int l;
|
||||
# if 0
|
||||
auto int rcode;
|
||||
int nmx;
|
||||
|
|
@ -934,9 +937,20 @@ _udbx_init()
|
|||
|
||||
#ifdef NEWDB
|
||||
case '/': /* look up remote name */
|
||||
up->udb_dbname = spec;
|
||||
l = strlen(spec);
|
||||
if (l > 3 && strcmp(&spec[l - 3], ".db") == 0)
|
||||
{
|
||||
up->udb_dbname = spec;
|
||||
}
|
||||
else
|
||||
{
|
||||
up->udb_dbname = xalloc(l + 4);
|
||||
strcpy(up->udb_dbname, spec);
|
||||
strcat(up->udb_dbname, ".db");
|
||||
}
|
||||
errno = 0;
|
||||
up->udb_dbp = dbopen(spec, O_RDONLY, 0644, DB_BTREE, NULL);
|
||||
up->udb_dbp = dbopen(up->udb_dbname, O_RDONLY,
|
||||
0644, DB_BTREE, NULL);
|
||||
if (up->udb_dbp == NULL)
|
||||
{
|
||||
if (tTd(28, 1))
|
||||
|
|
@ -944,7 +958,8 @@ _udbx_init()
|
|||
int saveerrno = errno;
|
||||
|
||||
printf("dbopen(%s): %s",
|
||||
spec, errstring(errno));
|
||||
up->udb_dbname,
|
||||
errstring(errno));
|
||||
errno = saveerrno;
|
||||
}
|
||||
if (errno != ENOENT && errno != EACCES)
|
||||
|
|
@ -952,11 +967,16 @@ _udbx_init()
|
|||
#ifdef LOG
|
||||
if (LogLevel > 2)
|
||||
syslog(LOG_ERR, "dbopen(%s): %s",
|
||||
spec, errstring(errno));
|
||||
up->udb_dbname,
|
||||
errstring(errno));
|
||||
#endif
|
||||
up->udb_type = UDB_EOLIST;
|
||||
if (up->udb_dbname != spec)
|
||||
free(up->udb_dbname);
|
||||
goto tempfail;
|
||||
}
|
||||
if (up->udb_dbname != spec)
|
||||
free(up->udb_dbname);
|
||||
break;
|
||||
}
|
||||
up->udb_type = UDB_DBFETCH;
|
||||
|
|
@ -978,7 +998,7 @@ badspec:
|
|||
{
|
||||
switch (up->udb_type)
|
||||
{
|
||||
#ifdef DAEMON
|
||||
#if DAEMON
|
||||
case UDB_REMOTE:
|
||||
printf("REMOTE: addr %s, timeo %d\n",
|
||||
anynet_ntoa((SOCKADDR *) &up->udb_addr),
|
||||
|
|
|
|||
|
|
@ -35,17 +35,17 @@
|
|||
# include "sendmail.h"
|
||||
|
||||
#ifndef lint
|
||||
#ifdef SMTP
|
||||
static char sccsid[] = "@(#)usersmtp.c 8.75 (Berkeley) 11/6/96 (with SMTP)";
|
||||
#if SMTP
|
||||
static char sccsid[] = "@(#)usersmtp.c 8.79 (Berkeley) 12/1/96 (with SMTP)";
|
||||
#else
|
||||
static char sccsid[] = "@(#)usersmtp.c 8.75 (Berkeley) 11/6/96 (without SMTP)";
|
||||
static char sccsid[] = "@(#)usersmtp.c 8.79 (Berkeley) 12/1/96 (without SMTP)";
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
# include <sysexits.h>
|
||||
# include <errno.h>
|
||||
|
||||
# ifdef SMTP
|
||||
# if SMTP
|
||||
|
||||
/*
|
||||
** USERSMTP -- run SMTP protocol from the user end.
|
||||
|
|
@ -155,7 +155,7 @@ smtpinit(m, mci, e)
|
|||
** My mother taught me to always introduce myself.
|
||||
*/
|
||||
|
||||
#if FFR_LMTP
|
||||
#if _FFR_LMTP
|
||||
if (bitnset(M_ESMTP, m->m_flags) || bitnset(M_LMTP, m->m_flags))
|
||||
#else
|
||||
if (bitnset(M_ESMTP, m->m_flags))
|
||||
|
|
@ -163,7 +163,7 @@ smtpinit(m, mci, e)
|
|||
mci->mci_flags |= MCIF_ESMTP;
|
||||
|
||||
tryhelo:
|
||||
#if FFR_LMTP
|
||||
#if _FFR_LMTP
|
||||
if (bitnset(M_LMTP, m->m_flags))
|
||||
{
|
||||
smtpmessage("LHLO %s", m, mci, MyHostName);
|
||||
|
|
@ -188,7 +188,7 @@ tryhelo:
|
|||
goto tempfail1;
|
||||
else if (REPLYTYPE(r) == 5)
|
||||
{
|
||||
#if FFR_LMTP
|
||||
#if _FFR_LMTP
|
||||
if (bitset(MCIF_ESMTP, mci->mci_flags) &&
|
||||
!bitnset(M_LMTP, m->m_flags))
|
||||
#else
|
||||
|
|
@ -214,7 +214,7 @@ tryhelo:
|
|||
if (p != NULL)
|
||||
*p = '\0';
|
||||
if (!bitnset(M_NOLOOPCHECK, m->m_flags) &&
|
||||
#if FFR_LMTP
|
||||
#if _FFR_LMTP
|
||||
!bitnset(M_LMTP, m->m_flags) &&
|
||||
#endif
|
||||
strcasecmp(&SmtpReplyBuffer[4], MyHostName) == 0)
|
||||
|
|
@ -418,7 +418,7 @@ smtpmailfrom(m, mci, e)
|
|||
extern char MsgBuf[];
|
||||
|
||||
usrerr("%s does not support 8BITMIME", mci->mci_host);
|
||||
mci_setstat(mci, EX_DATAERR, "5.6.3", MsgBuf);
|
||||
mci_setstat(mci, EX_NOTSTICKY, "5.6.3", MsgBuf);
|
||||
return EX_DATAERR;
|
||||
}
|
||||
|
||||
|
|
@ -505,25 +505,25 @@ smtpmailfrom(m, mci, e)
|
|||
else if (r == 501)
|
||||
{
|
||||
/* syntax error in arguments */
|
||||
mci_setstat(mci, EX_DATAERR, "5.5.2", SmtpReplyBuffer);
|
||||
mci_setstat(mci, EX_NOTSTICKY, "5.5.2", SmtpReplyBuffer);
|
||||
return EX_DATAERR;
|
||||
}
|
||||
else if (r == 553)
|
||||
{
|
||||
/* mailbox name not allowed */
|
||||
mci_setstat(mci, EX_DATAERR, "5.1.3", SmtpReplyBuffer);
|
||||
mci_setstat(mci, EX_NOTSTICKY, "5.1.3", SmtpReplyBuffer);
|
||||
return EX_DATAERR;
|
||||
}
|
||||
else if (r == 552)
|
||||
{
|
||||
/* exceeded storage allocation */
|
||||
mci_setstat(mci, EX_UNAVAILABLE, "5.2.2", SmtpReplyBuffer);
|
||||
mci_setstat(mci, EX_NOTSTICKY, "5.2.2", SmtpReplyBuffer);
|
||||
return EX_UNAVAILABLE;
|
||||
}
|
||||
else if (REPLYTYPE(r) == 5)
|
||||
{
|
||||
/* unknown error */
|
||||
mci_setstat(mci, EX_UNAVAILABLE, "5.0.0", SmtpReplyBuffer);
|
||||
mci_setstat(mci, EX_NOTSTICKY, "5.0.0", SmtpReplyBuffer);
|
||||
return EX_UNAVAILABLE;
|
||||
}
|
||||
|
||||
|
|
@ -654,6 +654,7 @@ smtprcpt(to, m, mci, e)
|
|||
}
|
||||
#endif
|
||||
|
||||
mci_setstat(mci, EX_PROTOCOL, "5.5.1", SmtpReplyBuffer);
|
||||
return EX_PROTOCOL;
|
||||
}
|
||||
/*
|
||||
|
|
@ -719,6 +720,7 @@ smtpdata(m, mci, e)
|
|||
}
|
||||
#endif
|
||||
smtprset(m, mci, e);
|
||||
mci_setstat(mci, EX_PROTOCOL, "5.5.1", SmtpReplyBuffer);
|
||||
return (EX_PROTOCOL);
|
||||
}
|
||||
|
||||
|
|
@ -770,14 +772,14 @@ smtpdata(m, mci, e)
|
|||
/* terminate the message */
|
||||
fprintf(mci->mci_out, ".%s", m->m_eol);
|
||||
if (TrafficLogFile != NULL)
|
||||
fprintf(TrafficLogFile, "%05d >>> .\n", getpid());
|
||||
fprintf(TrafficLogFile, "%05d >>> .\n", (int) getpid());
|
||||
if (Verbose)
|
||||
nmessage(">>> .");
|
||||
|
||||
/* check for the results of the transaction */
|
||||
SmtpPhase = mci->mci_phase = "client DATA status";
|
||||
setproctitle("%s %s: %s", e->e_id, CurHostName, mci->mci_phase);
|
||||
#if FFR_LMTP
|
||||
#if _FFR_LMTP
|
||||
if (bitnset(M_LMTP, m->m_flags))
|
||||
return EX_OK;
|
||||
#endif
|
||||
|
|
@ -833,7 +835,7 @@ datatimeout()
|
|||
** The exit status corresponding to the reply code.
|
||||
*/
|
||||
|
||||
#if FFR_LMTP
|
||||
#if _FFR_LMTP
|
||||
|
||||
int
|
||||
smtpgetstat(m, mci, e)
|
||||
|
|
@ -1183,7 +1185,8 @@ smtpmessage(f, m, mci, va_alist)
|
|||
if (tTd(18, 1) || Verbose)
|
||||
nmessage(">>> %s", SmtpMsgBuffer);
|
||||
if (TrafficLogFile != NULL)
|
||||
fprintf(TrafficLogFile, "%05d >>> %s\n", getpid(), SmtpMsgBuffer);
|
||||
fprintf(TrafficLogFile, "%05d >>> %s\n",
|
||||
(int) getpid(), SmtpMsgBuffer);
|
||||
if (mci->mci_out != NULL)
|
||||
{
|
||||
fprintf(mci->mci_out, "%s%s", SmtpMsgBuffer,
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)util.c 8.109 (Berkeley) 11/16/96";
|
||||
static char sccsid[] = "@(#)util.c 8.113 (Berkeley) 11/24/96";
|
||||
#endif /* not lint */
|
||||
|
||||
# include "sendmail.h"
|
||||
|
|
@ -215,7 +215,7 @@ printav(av)
|
|||
while (*av != NULL)
|
||||
{
|
||||
if (tTd(0, 44))
|
||||
printf("\n\t%08x=", *av);
|
||||
printf("\n\t%08lx=", (u_long) *av);
|
||||
else
|
||||
(void) putchar(' ');
|
||||
xputs(*av++);
|
||||
|
|
@ -423,7 +423,6 @@ buildfname(gecos, login, buf, buflen)
|
|||
{
|
||||
register char *p;
|
||||
register char *bp = buf;
|
||||
int l;
|
||||
|
||||
if (*gecos == '*')
|
||||
gecos++;
|
||||
|
|
@ -507,7 +506,7 @@ safefile(fn, uid, gid, uname, flags, mode, st)
|
|||
|
||||
if (tTd(44, 4))
|
||||
printf("safefile(%s, uid=%d, gid=%d, flags=%x, mode=%o):\n",
|
||||
fn, uid, gid, flags, mode);
|
||||
fn, (int) uid, (int) gid, flags, mode);
|
||||
errno = 0;
|
||||
if (st == NULL)
|
||||
st = &fstbuf;
|
||||
|
|
@ -635,8 +634,8 @@ safefile(fn, uid, gid, uname, flags, mode, st)
|
|||
}
|
||||
ret = errno;
|
||||
if (tTd(44, 4))
|
||||
printf("\t[final dir %s uid %d mode %o] %s\n",
|
||||
fn, stbuf.st_uid, stbuf.st_mode,
|
||||
printf("\t[final dir %s uid %d mode %lo] %s\n",
|
||||
fn, (int) stbuf.st_uid, (u_long) stbuf.st_mode,
|
||||
errstring(ret));
|
||||
*p = '/';
|
||||
st->st_mode = ST_MODE_NOFILE;
|
||||
|
|
@ -664,6 +663,12 @@ safefile(fn, uid, gid, uname, flags, mode, st)
|
|||
printf("\t[exec bits %o]\tEPERM]\n", st->st_mode);
|
||||
return EPERM;
|
||||
}
|
||||
if (st->st_nlink > 1)
|
||||
{
|
||||
if (tTd(44, 4))
|
||||
printf("\t[link count %d]\tEPERM\n", st->st_nlink);
|
||||
return EPERM;
|
||||
}
|
||||
|
||||
if (uid == 0 && !bitset(SFF_ROOTOK, flags))
|
||||
mode >>= 6;
|
||||
|
|
@ -690,8 +695,9 @@ safefile(fn, uid, gid, uname, flags, mode, st)
|
|||
mode >>= 3;
|
||||
}
|
||||
if (tTd(44, 4))
|
||||
printf("\t[uid %d, stat %o, mode %o] ",
|
||||
st->st_uid, st->st_mode, mode);
|
||||
printf("\t[uid %d, nlink %d, stat %lo, mode %lo] ",
|
||||
(int) st->st_uid, (int) st->st_nlink,
|
||||
(u_long) st->st_mode, (u_long) mode);
|
||||
if ((st->st_uid == uid || st->st_uid == 0 ||
|
||||
!bitset(SFF_MUSTOWN, flags)) &&
|
||||
(st->st_mode & mode) == mode)
|
||||
|
|
@ -966,7 +972,7 @@ putxline(l, mci, pxflags)
|
|||
p = &l[strlen(l)];
|
||||
|
||||
if (TrafficLogFile != NULL)
|
||||
fprintf(TrafficLogFile, "%05d >>> ", getpid());
|
||||
fprintf(TrafficLogFile, "%05d >>> ", (int) getpid());
|
||||
|
||||
/* check for line overflow */
|
||||
while (mci->mci_mailer->m_linelimit > 0 &&
|
||||
|
|
@ -998,7 +1004,7 @@ putxline(l, mci, pxflags)
|
|||
(void) putc(' ', mci->mci_out);
|
||||
if (TrafficLogFile != NULL)
|
||||
fprintf(TrafficLogFile, "%s!\n%05d >>> ",
|
||||
l, getpid());
|
||||
l, (int) getpid());
|
||||
*q = svchar;
|
||||
l = q;
|
||||
slop = 1;
|
||||
|
|
@ -1087,7 +1093,7 @@ xfclose(fp, a, b)
|
|||
char *a, *b;
|
||||
{
|
||||
if (tTd(53, 99))
|
||||
printf("xfclose(%x) %s %s\n", fp, a, b);
|
||||
printf("xfclose(%lx) %s %s\n", (u_long) fp, a, b);
|
||||
#if XDEBUG
|
||||
if (fileno(fp) == 1)
|
||||
syserr("xfclose(%s %s): fd = 1", a, b);
|
||||
|
|
@ -1178,11 +1184,11 @@ sfgets(buf, siz, fp, timeout, during)
|
|||
{
|
||||
buf[0] = '\0';
|
||||
if (TrafficLogFile != NULL)
|
||||
fprintf(TrafficLogFile, "%05d <<< [EOF]\n", getpid());
|
||||
fprintf(TrafficLogFile, "%05d <<< [EOF]\n", (int) getpid());
|
||||
return (NULL);
|
||||
}
|
||||
if (TrafficLogFile != NULL)
|
||||
fprintf(TrafficLogFile, "%05d <<< %s", getpid(), buf);
|
||||
fprintf(TrafficLogFile, "%05d <<< %s", (int) getpid(), buf);
|
||||
if (SevenBitInput)
|
||||
{
|
||||
for (p = buf; *p != '\0'; p++)
|
||||
|
|
@ -2273,6 +2279,25 @@ proc_list_drop(pid)
|
|||
CurChildren--;
|
||||
}
|
||||
/*
|
||||
** PROC_LIST_CLEAR -- clear the process list
|
||||
**
|
||||
** Parameters:
|
||||
** none.
|
||||
**
|
||||
** Returns:
|
||||
** none.
|
||||
*/
|
||||
|
||||
void
|
||||
proc_list_clear()
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ProcListSize; i++)
|
||||
ProcListVec[i] = NO_PID;
|
||||
CurChildren = 0;
|
||||
}
|
||||
/*
|
||||
** PROC_LIST_PROBE -- probe processes in the list to see if they still exist
|
||||
**
|
||||
** Parameters:
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)version.c 8.8.3.2 (Berkeley) 11/16/96";
|
||||
static char sccsid[] = "@(#)version.c 8.8.4.4 (Berkeley) 12/2/96";
|
||||
#endif /* not lint */
|
||||
|
||||
char Version[] = "8.8.3";
|
||||
char Version[] = "8.8.4";
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ Solaris 2.1
|
|||
Solaris 2.2 FAIL 93.07.19 Bill Wisner
|
||||
Solaris 2.3 FAIL 95.11.22 Scott J. Kramer <sjk@lux.com>
|
||||
Solaris 2.5 OK 96.02.29 Carson Gaspar <carson@lehman.com>
|
||||
Solaris 2.5.1 OK 96.11.29 Gregory Neil Shapiro <gshapiro@wpi.edu>
|
||||
|
||||
OSF/1 T1.3-4 OK 93.07.19 eric (on DEC Alpha)
|
||||
OSF/1 1.3 OK 94.12.10 Jeff A. Earickson (on Intel Paragon)
|
||||
|
|
@ -75,6 +76,7 @@ OPSYS VERSION STATUS DATE TESTER/NOTES
|
|||
Solaris 2.3 OK 95.11.22 Scott J. Kramer <sjk@lux.com>
|
||||
Solaris 2.4 OK 95.09.22 Thomas 'Mike' Michlmayr <mike@cosy.sbg.ac.at>
|
||||
Solaris 2.5 OK 96.02.29 Carson Gaspar <carson@lehman.com>
|
||||
Solaris 2.5.1 OK 96.11.29 Gregory Neil Shapiro <gshapiro@wpi.edu>
|
||||
|
||||
Linux 1.2.13 FAIL 95.11.02 Sven Neuhaus <sven@ping.de>
|
||||
Linux 2.0.17 FAIL 96.09.03 Horst von Brand <vonbrand@sleipnir.valparaiso.cl>
|
||||
|
|
|
|||
Loading…
Reference in a new issue