Import sendmail 8.8.4. See RELEASE_NOTES for changes.

This commit is contained in:
Peter Wemm 1996-12-03 06:07:35 +00:00
parent fcf445de96
commit 33cdb0aebd
38 changed files with 1201 additions and 446 deletions

View file

@ -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

View file

@ -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')

View file

@ -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

View file

@ -32,8 +32,8 @@ divert(-1)
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
VERSIONID(`@(#)version.m4 8.8.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')

View file

@ -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
View 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>

View file

@ -30,7 +30,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" @(#)op.me 8.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

View file

@ -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

View file

@ -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

View file

@ -30,7 +30,7 @@
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# @(#)READ_ME 8.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)

View file

@ -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;
}

View file

@ -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);

View file

@ -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

View file

@ -31,7 +31,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)conf.h 8.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

View file

@ -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;

View file

@ -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 */

View file

@ -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))

View file

@ -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");

View file

@ -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 */

View file

@ -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

View file

@ -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]);

View file

@ -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;;

View file

@ -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)
{

View file

@ -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;
}
}

View file

@ -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;

View file

@ -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++)

View file

@ -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=");

View file

@ -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");

View file

@ -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;

View file

@ -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))
{

View file

@ -31,7 +31,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)sendmail.h 8.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));

View file

@ -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);
}
}

View file

@ -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

View file

@ -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),

View file

@ -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,

View file

@ -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:

View file

@ -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";

View file

@ -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>