mirror of
https://github.com/vdukhovni/postfix
synced 2025-09-01 06:35:27 +00:00
snapshot-20010501
This commit is contained in:
committed by
Viktor Dukhovni
parent
fc7670eff8
commit
6d2c0a5a12
@@ -5050,11 +5050,11 @@ Apologies for any names omitted.
|
|||||||
|
|
||||||
20010411
|
20010411
|
||||||
|
|
||||||
Compatibility: the SMTP server now replies with 550 instead
|
Bugfix: the SMTP server now replies with 550 instead of
|
||||||
of 503 when it receives the DATA command without having
|
503 when it receives the DATA command without having received
|
||||||
received a valid recipient address. This is needed for the
|
a valid recipient address. This is needed for the Sendmail
|
||||||
Sendmail client-side pipelining implementation. Problem
|
client-side pipelining implementation. Problem reported by
|
||||||
reported by Lutz Jaenicke. File: smtpd/smtpd.c.
|
Lutz Jaenicke. File: smtpd/smtpd.c.
|
||||||
|
|
||||||
Cleanup: shut up if chattr fails on Reiserfs and other file
|
Cleanup: shut up if chattr fails on Reiserfs and other file
|
||||||
systems that do not support the respective attributes.
|
systems that do not support the respective attributes.
|
||||||
@@ -5080,9 +5080,10 @@ Apologies for any names omitted.
|
|||||||
|
|
||||||
20010426
|
20010426
|
||||||
|
|
||||||
Workaround: the SMTP server did not really parse invalid
|
Bugfix: the SMTP server did not parse invalid MAIL FROM or
|
||||||
addresses such as <first last <user@domain>> well. I
|
RCPT TO addresses such as <first last <user@domain>> the
|
||||||
thought this was taken care of years ago. File: smtpd/smtpd.c.
|
way it was supposed to do. I thought this was taken care
|
||||||
|
of years ago. File: smtpd/smtpd.c.
|
||||||
|
|
||||||
20010427
|
20010427
|
||||||
|
|
||||||
@@ -5095,4 +5096,26 @@ Apologies for any names omitted.
|
|||||||
|
|
||||||
Feature: the Postfix SMTP client now by default randomly
|
Feature: the Postfix SMTP client now by default randomly
|
||||||
shuffles destination IP addresses of equal preference.
|
shuffles destination IP addresses of equal preference.
|
||||||
File: smtp/smtp_addr.c. Based on an idea by Aleph1.
|
Specify "smtp_randomize_addresses = no" to disable.
|
||||||
|
Shuffling code by Elias Levy @ SecurityFocus.com Files:
|
||||||
|
dns/dns_rr.c, smtp/smtp_addr.c.
|
||||||
|
|
||||||
|
20010501
|
||||||
|
|
||||||
|
Bugfix: The SMTP server's 550 in reply to DATA should be
|
||||||
|
a 554 response. And it wasn't Sendmail. Claus Assman.
|
||||||
|
|
||||||
|
Bugfix: the INSTALL.sh test for non-interactive upgrade
|
||||||
|
broke rooted installations that specify settings via the
|
||||||
|
environment. Simon Mudd.
|
||||||
|
|
||||||
|
Bugfix: mailq output is now really flushed one message at
|
||||||
|
a time. File: sendmail/sendmail.c.
|
||||||
|
|
||||||
|
Feature: "postsuper -d queueID" deletes one message queue
|
||||||
|
file; "postsuper -d -" reads zero or more queue IDs from
|
||||||
|
standard input. In order to make this operation usable
|
||||||
|
with a running Postfix mail system, some routines were made
|
||||||
|
more tolerant for sudden queue file disappearances. Files:
|
||||||
|
postsuper/postsuper.c, global/deliver_request.c,
|
||||||
|
*qmgr/qmgr_move.c.
|
||||||
|
@@ -166,15 +166,17 @@ test -f $CONFIG_DIRECTORY/main.cf && {
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
test -f $CONFIG_DIRECTORY/install.cf && . $CONFIG_DIRECTORY/install.cf || {
|
if [ -f $CONFIG_DIRECTORY/install.cf ]
|
||||||
test -t 0 || {
|
then
|
||||||
echo Non-interactive install needs the $CONFIG_DIRECTORY/install.cf 1>&2
|
. $CONFIG_DIRECTORY/install.cf
|
||||||
echo file from a previous Postfix installation. 1>&2
|
elif [ ! -t 0 -a -z "$install_root" ]
|
||||||
echo 1>&2
|
then
|
||||||
echo Use interactive installation instead. 1>&2
|
echo Non-interactive install needs the $CONFIG_DIRECTORY/install.cf 1>&2
|
||||||
exit 1
|
echo file from a previous Postfix installation. 1>&2
|
||||||
}
|
echo 1>&2
|
||||||
}
|
echo Use interactive installation instead. 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Override default settings.
|
# Override default settings.
|
||||||
|
|
||||||
|
@@ -9,7 +9,7 @@ MASTER(8) MASTER(8)
|
|||||||
master - Postfix master process
|
master - Postfix master process
|
||||||
|
|
||||||
<b>SYNOPSIS</b>
|
<b>SYNOPSIS</b>
|
||||||
<b>master</b> [<b>-c</b> <i>config_dir</i>] [<b>-D</b>] [<b>-t</b>] [<b>-v</b>]
|
<b>master</b> [<b>-c</b> <i>config_dir</i>] [<b>-e</b> <i>exit_time</i>] [<b>-D</b>] [<b>-t</b>] [<b>-v</b>]
|
||||||
|
|
||||||
<b>DESCRIPTION</b>
|
<b>DESCRIPTION</b>
|
||||||
The <b>master</b> daemon is the resident process that runs Post-
|
The <b>master</b> daemon is the resident process that runs Post-
|
||||||
@@ -37,6 +37,11 @@ MASTER(8) MASTER(8)
|
|||||||
in the named directory instead of the default con-
|
in the named directory instead of the default con-
|
||||||
figuration directory.
|
figuration directory.
|
||||||
|
|
||||||
|
<b>-e</b> <i>exit_time</i>
|
||||||
|
Terminate the master process after <i>exit_time</i> sec-
|
||||||
|
onds. Child processes terminate at their conve-
|
||||||
|
nience.
|
||||||
|
|
||||||
<b>-D</b> After initialization, run a debugger on the master
|
<b>-D</b> After initialization, run a debugger on the master
|
||||||
process. The debugging command is specified with
|
process. The debugging command is specified with
|
||||||
the <b>debugger</b><i>_</i><b>command</b> in the <b>main.cf</b> global configu-
|
the <b>debugger</b><i>_</i><b>command</b> in the <b>main.cf</b> global configu-
|
||||||
@@ -54,11 +59,6 @@ MASTER(8) MASTER(8)
|
|||||||
Signals:
|
Signals:
|
||||||
|
|
||||||
<b>SIGHUP</b> Upon receipt of a <b>HUP</b> signal (e.g., after <b>postfix</b>
|
<b>SIGHUP</b> Upon receipt of a <b>HUP</b> signal (e.g., after <b>postfix</b>
|
||||||
<b>reload</b>), the master process re-reads its configura-
|
|
||||||
tion files. If a service has been removed from the
|
|
||||||
<b>master.cf</b> file, its running processes are termi-
|
|
||||||
nated immediately. Otherwise, running processes
|
|
||||||
are allowed to terminate as soon as is convenient,
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -71,6 +71,11 @@ MASTER(8) MASTER(8)
|
|||||||
MASTER(8) MASTER(8)
|
MASTER(8) MASTER(8)
|
||||||
|
|
||||||
|
|
||||||
|
<b>reload</b>), the master process re-reads its configura-
|
||||||
|
tion files. If a service has been removed from the
|
||||||
|
<b>master.cf</b> file, its running processes are termi-
|
||||||
|
nated immediately. Otherwise, running processes
|
||||||
|
are allowed to terminate as soon as is convenient,
|
||||||
so that changes in configuration settings affect
|
so that changes in configuration settings affect
|
||||||
only new service requests.
|
only new service requests.
|
||||||
|
|
||||||
@@ -119,11 +124,6 @@ MASTER(8) MASTER(8)
|
|||||||
<b>daemon</b><i>_</i><b>directory</b>
|
<b>daemon</b><i>_</i><b>directory</b>
|
||||||
Directory with Postfix daemon programs.
|
Directory with Postfix daemon programs.
|
||||||
|
|
||||||
<b>queue</b><i>_</i><b>directory</b>
|
|
||||||
Top-level directory of the Postfix queue. This is
|
|
||||||
also the root directory of Postfix daemons that run
|
|
||||||
chrooted.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -137,6 +137,11 @@ MASTER(8) MASTER(8)
|
|||||||
MASTER(8) MASTER(8)
|
MASTER(8) MASTER(8)
|
||||||
|
|
||||||
|
|
||||||
|
<b>queue</b><i>_</i><b>directory</b>
|
||||||
|
Top-level directory of the Postfix queue. This is
|
||||||
|
also the root directory of Postfix daemons that run
|
||||||
|
chrooted.
|
||||||
|
|
||||||
<b>Resource</b> <b>controls</b>
|
<b>Resource</b> <b>controls</b>
|
||||||
<b>default</b><i>_</i><b>process</b><i>_</i><b>limit</b>
|
<b>default</b><i>_</i><b>process</b><i>_</i><b>limit</b>
|
||||||
Default limit for the number of simultaneous child
|
Default limit for the number of simultaneous child
|
||||||
@@ -188,11 +193,6 @@ MASTER(8) MASTER(8)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3
|
3
|
||||||
|
|
||||||
|
@@ -9,7 +9,7 @@ POSTSUPER(1) POSTSUPER(1)
|
|||||||
postsuper - Postfix super intendent
|
postsuper - Postfix super intendent
|
||||||
|
|
||||||
<b>SYNOPSIS</b>
|
<b>SYNOPSIS</b>
|
||||||
<b>postsuper</b> [<b>-p</b>] [<b>-s</b>] [<b>-v</b>] [<i>directory</i> <i>...</i>]
|
<b>postsuper</b> [<b>-d</b> <i>queue_id</i>] [<b>-p</b>] [<b>-s</b>] [<b>-v</b>] [<i>directory</i> <i>...</i>]
|
||||||
|
|
||||||
<b>DESCRIPTION</b>
|
<b>DESCRIPTION</b>
|
||||||
The <b>postsuper</b> command does small maintenance jobs on the
|
The <b>postsuper</b> command does small maintenance jobs on the
|
||||||
@@ -25,40 +25,40 @@ POSTSUPER(1) POSTSUPER(1)
|
|||||||
|
|
||||||
Options:
|
Options:
|
||||||
|
|
||||||
<b>-s</b> Structure check. Move queue files that are in the
|
<b>-d</b> Delete one message queue file with the named queue
|
||||||
|
ID. Specify multiple <b>-d</b> options to delete multiple
|
||||||
|
queue files by name.
|
||||||
|
|
||||||
|
Alternatively, if a <i>queue_id</i> of <b>-</b> is specified, the
|
||||||
|
program reads queue IDs from standard input.
|
||||||
|
|
||||||
|
This operation can be performed safely while the
|
||||||
|
mail system is running, although the queue manager
|
||||||
|
may issue warnings when a file suddenly disappears.
|
||||||
|
The exit status is zero if at least one of the
|
||||||
|
named message queue files was found.
|
||||||
|
|
||||||
|
<b>-s</b> Structure check. Move queue files that are in the
|
||||||
wrong place in the file system hierarchy and remove
|
wrong place in the file system hierarchy and remove
|
||||||
subdirectories that are no longer needed. File
|
subdirectories that are no longer needed. File
|
||||||
rearrangements are necessary after a change in the
|
rearrangements are necessary after a change in the
|
||||||
<b>hash</b><i>_</i><b>queue</b><i>_</i><b>names</b> and/or <b>hash</b><i>_</i><b>queue</b><i>_</i><b>depth</b> configura-
|
<b>hash</b><i>_</i><b>queue</b><i>_</i><b>names</b> and/or <b>hash</b><i>_</i><b>queue</b><i>_</i><b>depth</b> configura-
|
||||||
tion parameters. It is highly recommended to run
|
tion parameters. It is highly recommended to run
|
||||||
this check once before Postfix startup.
|
this check once before Postfix startup.
|
||||||
|
|
||||||
<b>-p</b> Purge stale files (files that are left over after
|
<b>-p</b> Purge stale files (files that are left over after
|
||||||
system or software crashes).
|
system or software crashes).
|
||||||
|
|
||||||
<b>-v</b> Enable verbose logging for debugging purposes. Mul-
|
<b>-v</b> Enable verbose logging for debugging purposes. Mul-
|
||||||
tiple <b>-v</b> options make the software increasingly
|
tiple <b>-v</b> options make the software increasingly
|
||||||
verbose.
|
verbose.
|
||||||
|
|
||||||
<b>DIAGNOSTICS</b>
|
<b>DIAGNOSTICS</b>
|
||||||
Problems are reported to the standard error stream and to
|
Problems are reported to the standard error stream and to
|
||||||
<b>syslogd</b>.
|
<b>syslogd</b>.
|
||||||
|
|
||||||
<b>CONFIGURATION</b> <b>PARAMETERS</b>
|
<b>CONFIGURATION</b> <b>PARAMETERS</b>
|
||||||
See the Postfix <b>main.cf</b> file for syntax details and for
|
See the Postfix <b>main.cf</b> file for syntax details and for
|
||||||
default values.
|
|
||||||
|
|
||||||
<b>hash</b><i>_</i><b>queue</b><i>_</i><b>depth</b>
|
|
||||||
Number of subdirectory levels for hashed queues.
|
|
||||||
|
|
||||||
<b>hash</b><i>_</i><b>queue</b><i>_</i><b>names</b>
|
|
||||||
The names of queues that are organized into multi-
|
|
||||||
ple levels of subdirectories.
|
|
||||||
|
|
||||||
<b>LICENSE</b>
|
|
||||||
The Secure Mailer license must be distributed with this
|
|
||||||
software.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -71,6 +71,19 @@ POSTSUPER(1) POSTSUPER(1)
|
|||||||
POSTSUPER(1) POSTSUPER(1)
|
POSTSUPER(1) POSTSUPER(1)
|
||||||
|
|
||||||
|
|
||||||
|
default values.
|
||||||
|
|
||||||
|
<b>hash</b><i>_</i><b>queue</b><i>_</i><b>depth</b>
|
||||||
|
Number of subdirectory levels for hashed queues.
|
||||||
|
|
||||||
|
<b>hash</b><i>_</i><b>queue</b><i>_</i><b>names</b>
|
||||||
|
The names of queues that are organized into multi-
|
||||||
|
ple levels of subdirectories.
|
||||||
|
|
||||||
|
<b>LICENSE</b>
|
||||||
|
The Secure Mailer license must be distributed with this
|
||||||
|
software.
|
||||||
|
|
||||||
<b>AUTHOR(S)</b>
|
<b>AUTHOR(S)</b>
|
||||||
Wietse Venema
|
Wietse Venema
|
||||||
IBM T.J. Watson Research
|
IBM T.J. Watson Research
|
||||||
@@ -101,19 +114,6 @@ POSTSUPER(1) POSTSUPER(1)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -283,7 +283,7 @@ SMTPD(8) SMTPD(8)
|
|||||||
nasty relay loopholes involving trusted backup MX
|
nasty relay loopholes involving trusted backup MX
|
||||||
hosts.
|
hosts.
|
||||||
|
|
||||||
<b>restriction</b><i>_</i><b>classes</b>
|
<b>smtpd</b><i>_</i><b>restriction</b><i>_</i><b>classes</b>
|
||||||
Declares the name of zero or more parameters that
|
Declares the name of zero or more parameters that
|
||||||
contain a list of UCE restrictions. The names of
|
contain a list of UCE restrictions. The names of
|
||||||
these parameters can then be used instead of the
|
these parameters can then be used instead of the
|
||||||
|
@@ -175,17 +175,18 @@ case "$SYSTEM.$RELEASE" in
|
|||||||
echo "See the RELEASE_NOTES file for more information." 1>&2
|
echo "See the RELEASE_NOTES file for more information." 1>&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
# See where GDBM's ndbm.h include file sits. XXX verify that
|
# See where GDBM's ndbm.h include file sits.
|
||||||
# gdbm links in by default (i.e. NO -lgdbm is needed).
|
|
||||||
if [ -f /usr/include/gdbm-ndbm.h ]
|
if [ -f /usr/include/gdbm-ndbm.h ]
|
||||||
then
|
then
|
||||||
CCARGS="$CCARGS -DHAS_DBM -DPATH_NDBM_H=\\\"<gdbm-ndbm.h>\\\""
|
CCARGS="$CCARGS -DHAS_DBM -DPATH_NDBM_H=\\\"<gdbm-ndbm.h>\\\""
|
||||||
|
GDBM_LIBS=gdbm
|
||||||
elif [ -f /usr/include/gdbm/ndbm.h ]
|
elif [ -f /usr/include/gdbm/ndbm.h ]
|
||||||
then
|
then
|
||||||
CCARGS="$CCARGS -DHAS_DBM -DPATH_NDBM_H=\\\"<gdbm/ndbm.h>\\\""
|
CCARGS="$CCARGS -DHAS_DBM -DPATH_NDBM_H=\\\"<gdbm/ndbm.h>\\\""
|
||||||
|
GDBM_LIBS=gdbm
|
||||||
fi
|
fi
|
||||||
SYSLIBS="-ldb"
|
SYSLIBS="-ldb"
|
||||||
for name in nsl resolv
|
for name in nsl resolv $GDBM_LIBS
|
||||||
do
|
do
|
||||||
test -f /usr/lib/lib$name.a && SYSLIBS="$SYSLIBS -l$name"
|
test -f /usr/lib/lib$name.a && SYSLIBS="$SYSLIBS -l$name"
|
||||||
done
|
done
|
||||||
|
@@ -9,7 +9,8 @@ Postfix super intendent
|
|||||||
.na
|
.na
|
||||||
.nf
|
.nf
|
||||||
.fi
|
.fi
|
||||||
\fBpostsuper\fR [\fB-p\fR] [\fB-s\fR] [\fB-v\fR] [\fIdirectory ...\fR]
|
\fBpostsuper\fR [\fB-d \fIqueue_id\fR] [\fB-p\fR]
|
||||||
|
[\fB-s\fR] [\fB-v\fR] [\fIdirectory ...\fR]
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
.ad
|
.ad
|
||||||
.fi
|
.fi
|
||||||
@@ -23,6 +24,17 @@ By default, \fBpostsuper\fR performs the operations requested with the
|
|||||||
nor directories. Use of this command is restricted to the super-user.
|
nor directories. Use of this command is restricted to the super-user.
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
|
.IP \fB-d \fIqueue_id\fR
|
||||||
|
Delete one message queue file with the named queue ID. Specify
|
||||||
|
multiple \fB-d\fR options to delete multiple queue files by name.
|
||||||
|
.sp
|
||||||
|
Alternatively, if a \fIqueue_id\fR of \fB-\fR is specified, the
|
||||||
|
program reads queue IDs from standard input.
|
||||||
|
.sp
|
||||||
|
This operation can be performed safely while the mail system is
|
||||||
|
running, although the queue manager may issue warnings when a
|
||||||
|
file suddenly disappears. The exit status is zero if at least one
|
||||||
|
of the named message queue files was found.
|
||||||
.IP \fB-s\fR
|
.IP \fB-s\fR
|
||||||
Structure check. Move queue files that are in the wrong place
|
Structure check. Move queue files that are in the wrong place
|
||||||
in the file system hierarchy and remove subdirectories that are
|
in the file system hierarchy and remove subdirectories that are
|
||||||
|
@@ -9,7 +9,8 @@ Postfix master process
|
|||||||
.na
|
.na
|
||||||
.nf
|
.nf
|
||||||
.fi
|
.fi
|
||||||
\fBmaster\fR [\fB-c \fIconfig_dir\fR] [\fB-D\fR] [\fB-t\fR] [\fB-v\fR]
|
\fBmaster\fR [\fB-c \fIconfig_dir\fR] [\fB-e \fIexit_time\fR]
|
||||||
|
[\fB-D\fR] [\fB-t\fR] [\fB-v\fR]
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
.ad
|
.ad
|
||||||
.fi
|
.fi
|
||||||
@@ -34,6 +35,9 @@ Options:
|
|||||||
.IP "\fB-c \fIconfig_dir\fR"
|
.IP "\fB-c \fIconfig_dir\fR"
|
||||||
Read the \fBmain.cf\fR and \fBmaster.cf\fR configuration files in
|
Read the \fBmain.cf\fR and \fBmaster.cf\fR configuration files in
|
||||||
the named directory instead of the default configuration directory.
|
the named directory instead of the default configuration directory.
|
||||||
|
.IP "\fB-e \fIexit_time\fR"
|
||||||
|
Terminate the master process after \fIexit_time\fR seconds. Child
|
||||||
|
processes terminate at their convenience.
|
||||||
.IP \fB-D\fR
|
.IP \fB-D\fR
|
||||||
After initialization, run a debugger on the master process. The
|
After initialization, run a debugger on the master process. The
|
||||||
debugging command is specified with the \fBdebugger_command\fR in
|
debugging command is specified with the \fBdebugger_command\fR in
|
||||||
|
@@ -196,7 +196,7 @@ and what clients may issue \fBETRN\fR commands.
|
|||||||
Allow untrusted clients to specify addresses with sender-specified
|
Allow untrusted clients to specify addresses with sender-specified
|
||||||
routing. Enabling this opens up nasty relay loopholes involving
|
routing. Enabling this opens up nasty relay loopholes involving
|
||||||
trusted backup MX hosts.
|
trusted backup MX hosts.
|
||||||
.IP \fBrestriction_classes\fR
|
.IP \fBsmtpd_restriction_classes\fR
|
||||||
Declares the name of zero or more parameters that contain a
|
Declares the name of zero or more parameters that contain a
|
||||||
list of UCE restrictions. The names of these parameters can
|
list of UCE restrictions. The names of these parameters can
|
||||||
then be used instead of the restriction lists that they represent.
|
then be used instead of the restriction lists that they represent.
|
||||||
|
@@ -81,6 +81,7 @@ dns_rr.o: dns_rr.c
|
|||||||
dns_rr.o: ../../include/sys_defs.h
|
dns_rr.o: ../../include/sys_defs.h
|
||||||
dns_rr.o: ../../include/msg.h
|
dns_rr.o: ../../include/msg.h
|
||||||
dns_rr.o: ../../include/mymalloc.h
|
dns_rr.o: ../../include/mymalloc.h
|
||||||
|
dns_rr.o: ../../include/myrand.h
|
||||||
dns_rr.o: dns.h
|
dns_rr.o: dns.h
|
||||||
dns_rr.o: ../../include/vstring.h
|
dns_rr.o: ../../include/vstring.h
|
||||||
dns_rr.o: ../../include/vbuf.h
|
dns_rr.o: ../../include/vbuf.h
|
||||||
|
@@ -105,6 +105,7 @@ extern void dns_rr_free(DNS_RR *);
|
|||||||
extern DNS_RR *dns_rr_copy(DNS_RR *);
|
extern DNS_RR *dns_rr_copy(DNS_RR *);
|
||||||
extern DNS_RR *dns_rr_append(DNS_RR *, DNS_RR *);
|
extern DNS_RR *dns_rr_append(DNS_RR *, DNS_RR *);
|
||||||
extern DNS_RR *dns_rr_sort(DNS_RR *, int (*) (DNS_RR *, DNS_RR *));
|
extern DNS_RR *dns_rr_sort(DNS_RR *, int (*) (DNS_RR *, DNS_RR *));
|
||||||
|
extern DNS_RR *dns_rr_shuffle(DNS_RR *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* dns_lookup.c
|
* dns_lookup.c
|
||||||
|
@@ -26,6 +26,9 @@
|
|||||||
/* DNS_RR *dns_rr_sort(list, compar)
|
/* DNS_RR *dns_rr_sort(list, compar)
|
||||||
/* DNS_RR *list
|
/* DNS_RR *list
|
||||||
/* int (*compar)(DNS_RR *, DNS_RR *);
|
/* int (*compar)(DNS_RR *, DNS_RR *);
|
||||||
|
/*
|
||||||
|
/* DNS_RR *dns_rr_shuffle(list)
|
||||||
|
/* DNS_RR *list;
|
||||||
/* DESCRIPTION
|
/* DESCRIPTION
|
||||||
/* The routines in this module maintain memory for DNS resource record
|
/* The routines in this module maintain memory for DNS resource record
|
||||||
/* information, and maintain lists of DNS resource records.
|
/* information, and maintain lists of DNS resource records.
|
||||||
@@ -49,6 +52,8 @@
|
|||||||
/* dns_rr_sort() sorts a list of resource records into ascending
|
/* dns_rr_sort() sorts a list of resource records into ascending
|
||||||
/* order according to a user-specified criterion. The result is the
|
/* order according to a user-specified criterion. The result is the
|
||||||
/* sorted list.
|
/* sorted list.
|
||||||
|
/*
|
||||||
|
/* dns_rr_shuffle() randomly permutes a list of resource records.
|
||||||
/* LICENSE
|
/* LICENSE
|
||||||
/* .ad
|
/* .ad
|
||||||
/* .fi
|
/* .fi
|
||||||
@@ -70,6 +75,7 @@
|
|||||||
|
|
||||||
#include <msg.h>
|
#include <msg.h>
|
||||||
#include <mymalloc.h>
|
#include <mymalloc.h>
|
||||||
|
#include <myrand.h>
|
||||||
|
|
||||||
/* DNS library. */
|
/* DNS library. */
|
||||||
|
|
||||||
@@ -193,3 +199,47 @@ DNS_RR *dns_rr_sort(DNS_RR *list, int (*compar) (DNS_RR *, DNS_RR *))
|
|||||||
dns_rr_sort_user = saved_user;
|
dns_rr_sort_user = saved_user;
|
||||||
return (list);
|
return (list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* dns_rr_shuffle - shuffle resource record list */
|
||||||
|
|
||||||
|
DNS_RR *dns_rr_shuffle(DNS_RR *list)
|
||||||
|
{
|
||||||
|
DNS_RR **rr_array;
|
||||||
|
DNS_RR *rr;
|
||||||
|
int len;
|
||||||
|
int i;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Build linear array with pointers to each list element.
|
||||||
|
*/
|
||||||
|
for (len = 0, rr = list; rr != 0; len++, rr = rr->next)
|
||||||
|
/* void */ ;
|
||||||
|
rr_array = (DNS_RR **) mymalloc(len * sizeof(*rr_array));
|
||||||
|
for (len = 0, rr = list; rr != 0; len++, rr = rr->next)
|
||||||
|
rr_array[len] = rr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Shuffle resource records.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
r = myrand() % len;
|
||||||
|
rr = rr_array[i];
|
||||||
|
rr_array[i] = rr_array[r];
|
||||||
|
rr_array[r] = rr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fix the links.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < len - 1; i++)
|
||||||
|
rr_array[i]->next = rr_array[i + 1];
|
||||||
|
rr_array[i]->next = 0;
|
||||||
|
list = rr_array[0];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Cleanup.
|
||||||
|
*/
|
||||||
|
myfree((char *) rr_array);
|
||||||
|
return (list);
|
||||||
|
}
|
||||||
|
@@ -85,6 +85,7 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
/* Utility library. */
|
/* Utility library. */
|
||||||
|
|
||||||
@@ -230,8 +231,12 @@ static int deliver_request_get(VSTREAM *stream, DELIVER_REQUEST *request)
|
|||||||
|
|
||||||
request->fp =
|
request->fp =
|
||||||
mail_queue_open(request->queue_name, request->queue_id, O_RDWR, 0);
|
mail_queue_open(request->queue_name, request->queue_id, O_RDWR, 0);
|
||||||
if (request->fp == 0)
|
if (request->fp == 0) {
|
||||||
msg_fatal("open %s %s: %m", request->queue_name, request->queue_id);
|
if (errno != ENOENT)
|
||||||
|
msg_fatal("open %s %s: %m", request->queue_name, request->queue_id);
|
||||||
|
msg_warn("open %s %s: %m", request->queue_name, request->queue_id);
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
if (msg_verbose)
|
if (msg_verbose)
|
||||||
msg_info("%s: file %s", myname, VSTREAM_PATH(request->fp));
|
msg_info("%s: file %s", myname, VSTREAM_PATH(request->fp));
|
||||||
if (myflock(vstream_fileno(request->fp), INTERNAL_LOCK, DELIVER_LOCK_MODE) < 0)
|
if (myflock(vstream_fileno(request->fp), INTERNAL_LOCK, DELIVER_LOCK_MODE) < 0)
|
||||||
|
@@ -7,12 +7,10 @@
|
|||||||
/* #include <mail_conf.h>
|
/* #include <mail_conf.h>
|
||||||
/*
|
/*
|
||||||
/* int get_mail_conf_bool(name, defval)
|
/* int get_mail_conf_bool(name, defval)
|
||||||
/* const char *path;
|
|
||||||
/* const char *name;
|
/* const char *name;
|
||||||
/* int defval;
|
/* int defval;
|
||||||
/*
|
/*
|
||||||
/* int get_mail_conf_bool_fn(name, defval)
|
/* int get_mail_conf_bool_fn(name, defval)
|
||||||
/* const char *path;
|
|
||||||
/* const char *name;
|
/* const char *name;
|
||||||
/* int (*defval)();
|
/* int (*defval)();
|
||||||
/*
|
/*
|
||||||
|
@@ -699,7 +699,7 @@ extern bool var_smtp_never_ehlo;
|
|||||||
#define DEF_SMTP_BIND_ADDR ""
|
#define DEF_SMTP_BIND_ADDR ""
|
||||||
extern char *var_smtp_bind_addr;
|
extern char *var_smtp_bind_addr;
|
||||||
|
|
||||||
#define VAR_SMTP_RAND_ADDR "smtp_randomize_address"
|
#define VAR_SMTP_RAND_ADDR "smtp_randomize_addresses"
|
||||||
#define DEF_SMTP_RAND_ADDR 1
|
#define DEF_SMTP_RAND_ADDR 1
|
||||||
extern bool var_smtp_rand_addr;
|
extern bool var_smtp_rand_addr;
|
||||||
|
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
* Version of this program.
|
* Version of this program.
|
||||||
*/
|
*/
|
||||||
#define VAR_MAIL_VERSION "mail_version"
|
#define VAR_MAIL_VERSION "mail_version"
|
||||||
#define DEF_MAIL_VERSION "Snapshot-20010429"
|
#define DEF_MAIL_VERSION "Snapshot-20010501"
|
||||||
extern char *var_mail_version;
|
extern char *var_mail_version;
|
||||||
|
|
||||||
/* LICENSE
|
/* LICENSE
|
||||||
|
@@ -279,7 +279,9 @@ int deliver_alias(LOCAL_STATE state, USER_ATTR usr_attr,
|
|||||||
"alias database unavailable") :
|
"alias database unavailable") :
|
||||||
deliver_token_string(state, usr_attr, expansion, &alias_count));
|
deliver_token_string(state, usr_attr, expansion, &alias_count));
|
||||||
#if 0
|
#if 0
|
||||||
if (state.msg_attr.owner == 0 && alias_count > 10)
|
if (var_ownreq_special
|
||||||
|
&& strncmp("owner-", state.msg_attr.sender, 6) != 0
|
||||||
|
&& alias_count > 10)
|
||||||
msg_warn("mailing list \"%s\" needs an \"owner-%s\" alias",
|
msg_warn("mailing list \"%s\" needs an \"owner-%s\" alias",
|
||||||
name, name);
|
name, name);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -121,6 +121,8 @@ master_ent.o: ../../include/argv.h
|
|||||||
master_ent.o: ../../include/stringops.h
|
master_ent.o: ../../include/stringops.h
|
||||||
master_ent.o: ../../include/readlline.h
|
master_ent.o: ../../include/readlline.h
|
||||||
master_ent.o: ../../include/inet_addr_list.h
|
master_ent.o: ../../include/inet_addr_list.h
|
||||||
|
master_ent.o: ../../include/inet_util.h
|
||||||
|
master_ent.o: ../../include/inet_addr_host.h
|
||||||
master_ent.o: ../../include/mail_proto.h
|
master_ent.o: ../../include/mail_proto.h
|
||||||
master_ent.o: ../../include/iostuff.h
|
master_ent.o: ../../include/iostuff.h
|
||||||
master_ent.o: ../../include/mail_params.h
|
master_ent.o: ../../include/mail_params.h
|
||||||
|
@@ -24,8 +24,13 @@ typedef struct MASTER_SERV {
|
|||||||
int *listen_fd; /* incoming requests */
|
int *listen_fd; /* incoming requests */
|
||||||
int listen_fd_count; /* nr of descriptors */
|
int listen_fd_count; /* nr of descriptors */
|
||||||
union {
|
union {
|
||||||
struct INET_ADDR_LIST *inet;
|
struct {
|
||||||
} addr_list;
|
char *port; /* inet listen port */
|
||||||
|
struct INET_ADDR_LIST *addr;/* inet listen address */
|
||||||
|
} inet_ep;
|
||||||
|
#define MASTER_INET_ADDRLIST(s) ((s)->endpoint.inet_ep.addr)
|
||||||
|
#define MASTER_INET_PORT(s) ((s)->endpoint.inet_ep.port)
|
||||||
|
} endpoint;
|
||||||
int max_proc; /* upper bound on # processes */
|
int max_proc; /* upper bound on # processes */
|
||||||
char *path; /* command pathname */
|
char *path; /* command pathname */
|
||||||
struct ARGV *args; /* argument vector */
|
struct ARGV *args; /* argument vector */
|
||||||
|
@@ -276,20 +276,21 @@ MASTER_SERV *get_master_ent()
|
|||||||
if (STR_SAME(transport, MASTER_XPORT_NAME_INET)) {
|
if (STR_SAME(transport, MASTER_XPORT_NAME_INET)) {
|
||||||
serv->type = MASTER_SERV_TYPE_INET;
|
serv->type = MASTER_SERV_TYPE_INET;
|
||||||
atmp = inet_parse(name, &host, &port);
|
atmp = inet_parse(name, &host, &port);
|
||||||
if (host && *host) {
|
if (*host) {
|
||||||
serv->flags |= MASTER_FLAG_INETHOST;/* host:port */
|
serv->flags |= MASTER_FLAG_INETHOST;/* host:port */
|
||||||
serv->addr_list.inet =
|
MASTER_INET_ADDRLIST(serv) = (INET_ADDR_LIST *)
|
||||||
(INET_ADDR_LIST *) mymalloc(sizeof(*serv->addr_list.inet));
|
mymalloc(sizeof(*MASTER_INET_ADDRLIST(serv)));
|
||||||
inet_addr_list_init(serv->addr_list.inet);
|
inet_addr_list_init(MASTER_INET_ADDRLIST(serv));
|
||||||
inet_addr_host(serv->addr_list.inet, host);
|
inet_addr_host(MASTER_INET_ADDRLIST(serv), host);
|
||||||
serv->listen_fd_count = serv->addr_list.inet->used;
|
serv->listen_fd_count = MASTER_INET_ADDRLIST(serv)->used;
|
||||||
} else if (strcasecmp(var_inet_interfaces, DEF_INET_INTERFACES) == 0) {
|
} else if (strcasecmp(var_inet_interfaces, DEF_INET_INTERFACES) == 0) {
|
||||||
serv->addr_list.inet = 0; /* wild-card */
|
MASTER_INET_ADDRLIST(serv) = 0; /* wild-card */
|
||||||
serv->listen_fd_count = 1;
|
serv->listen_fd_count = 1;
|
||||||
} else {
|
} else {
|
||||||
serv->addr_list.inet = own_inet_addr_list(); /* virtual */
|
MASTER_INET_ADDRLIST(serv) = own_inet_addr_list(); /* virtual */
|
||||||
serv->listen_fd_count = serv->addr_list.inet->used;
|
serv->listen_fd_count = MASTER_INET_ADDRLIST(serv)->used;
|
||||||
}
|
}
|
||||||
|
MASTER_INET_PORT(serv) = mystrdup(port);
|
||||||
myfree(atmp);
|
myfree(atmp);
|
||||||
} else if (STR_SAME(transport, MASTER_XPORT_NAME_UNIX)) {
|
} else if (STR_SAME(transport, MASTER_XPORT_NAME_UNIX)) {
|
||||||
serv->type = MASTER_SERV_TYPE_UNIX;
|
serv->type = MASTER_SERV_TYPE_UNIX;
|
||||||
@@ -463,8 +464,12 @@ void free_master_ent(MASTER_SERV *serv)
|
|||||||
/*
|
/*
|
||||||
* Undo what get_master_ent() created.
|
* Undo what get_master_ent() created.
|
||||||
*/
|
*/
|
||||||
if (serv->flags & MASTER_FLAG_INETHOST)
|
if (serv->flags & MASTER_FLAG_INETHOST) {
|
||||||
inet_addr_list_free(serv->addr_list.inet);
|
inet_addr_list_free(MASTER_INET_ADDRLIST(serv));
|
||||||
|
myfree((char *) MASTER_INET_ADDRLIST(serv));
|
||||||
|
}
|
||||||
|
if (serv->type == MASTER_SERV_TYPE_INET)
|
||||||
|
myfree(MASTER_INET_PORT(serv));
|
||||||
myfree(serv->name);
|
myfree(serv->name);
|
||||||
myfree(serv->path);
|
myfree(serv->path);
|
||||||
argv_free(serv->args);
|
argv_free(serv->args);
|
||||||
|
@@ -107,15 +107,16 @@ void master_listen_init(MASTER_SERV *serv)
|
|||||||
* bound to specific interface addresses.
|
* bound to specific interface addresses.
|
||||||
*/
|
*/
|
||||||
case MASTER_SERV_TYPE_INET:
|
case MASTER_SERV_TYPE_INET:
|
||||||
if (serv->addr_list.inet == 0) { /* wild-card */
|
if (MASTER_INET_ADDRLIST(serv) == 0) { /* wild-card */
|
||||||
serv->listen_fd[0] =
|
serv->listen_fd[0] =
|
||||||
inet_listen(serv->name, serv->max_proc > var_proc_limit ?
|
inet_listen(MASTER_INET_PORT(serv),
|
||||||
|
serv->max_proc > var_proc_limit ?
|
||||||
serv->max_proc : var_proc_limit, NON_BLOCKING);
|
serv->max_proc : var_proc_limit, NON_BLOCKING);
|
||||||
close_on_exec(serv->listen_fd[0], CLOSE_ON_EXEC);
|
close_on_exec(serv->listen_fd[0], CLOSE_ON_EXEC);
|
||||||
} else { /* virtual */
|
} else { /* virtual or host:port */
|
||||||
for (n = 0; n < serv->listen_fd_count; n++) {
|
for (n = 0; n < serv->listen_fd_count; n++) {
|
||||||
end_point = concatenate(inet_ntoa(serv->addr_list.inet->addrs[n]),
|
end_point = concatenate(inet_ntoa(MASTER_INET_ADDRLIST(serv)->addrs[n]),
|
||||||
":", serv->name, (char *) 0);
|
":", MASTER_INET_PORT(serv), (char *) 0);
|
||||||
serv->listen_fd[n]
|
serv->listen_fd[n]
|
||||||
= inet_listen(end_point, serv->max_proc > var_proc_limit ?
|
= inet_listen(end_point, serv->max_proc > var_proc_limit ?
|
||||||
serv->max_proc : var_proc_limit, NON_BLOCKING);
|
serv->max_proc : var_proc_limit, NON_BLOCKING);
|
||||||
|
@@ -35,6 +35,7 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <utime.h>
|
#include <utime.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
/* Utility library. */
|
/* Utility library. */
|
||||||
|
|
||||||
@@ -73,12 +74,21 @@ void qmgr_move(const char *src_queue, const char *dst_queue,
|
|||||||
if (time_stamp > 0) {
|
if (time_stamp > 0) {
|
||||||
tbuf.actime = tbuf.modtime = time_stamp;
|
tbuf.actime = tbuf.modtime = time_stamp;
|
||||||
path = mail_queue_path((VSTRING *) 0, src_queue, queue_id);
|
path = mail_queue_path((VSTRING *) 0, src_queue, queue_id);
|
||||||
if (utime(path, &tbuf) < 0)
|
if (utime(path, &tbuf) < 0) {
|
||||||
msg_fatal("%s: update %s time stamps: %m", myname, path);
|
if (errno != ENOENT)
|
||||||
|
msg_fatal("%s: update %s time stamps: %m", myname, path);
|
||||||
|
msg_warn("%s: update %s time stamps: %m", myname, path);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (mail_queue_rename(queue_id, src_queue, dst_queue)) {
|
||||||
|
if (errno != ENOENT)
|
||||||
|
msg_fatal("%s: rename %s from %s to %s: %m",
|
||||||
|
myname, queue_id, src_queue, dst_queue);
|
||||||
|
msg_warn("%s: rename %s from %s to %s: %m",
|
||||||
|
myname, queue_id, src_queue, dst_queue);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
if (mail_queue_rename(queue_id, src_queue, dst_queue))
|
|
||||||
msg_fatal("%s: rename %s from %s to %s: %m",
|
|
||||||
myname, queue_id, src_queue, dst_queue);
|
|
||||||
if (msg_verbose)
|
if (msg_verbose)
|
||||||
msg_info("%s: moved %s from %s to %s",
|
msg_info("%s: moved %s from %s to %s",
|
||||||
myname, queue_id, src_queue, dst_queue);
|
myname, queue_id, src_queue, dst_queue);
|
||||||
|
@@ -65,6 +65,7 @@ postalias.o: ../../include/readlline.h
|
|||||||
postalias.o: ../../include/stringops.h
|
postalias.o: ../../include/stringops.h
|
||||||
postalias.o: ../../include/split_at.h
|
postalias.o: ../../include/split_at.h
|
||||||
postalias.o: ../../include/get_hostname.h
|
postalias.o: ../../include/get_hostname.h
|
||||||
|
postalias.o: ../../include/vstring_vstream.h
|
||||||
postalias.o: ../../include/tok822.h
|
postalias.o: ../../include/tok822.h
|
||||||
postalias.o: ../../include/resolve_clnt.h
|
postalias.o: ../../include/resolve_clnt.h
|
||||||
postalias.o: ../../include/mail_conf.h
|
postalias.o: ../../include/mail_conf.h
|
||||||
|
@@ -64,6 +64,7 @@ postmap.o: ../../include/msg_vstream.h
|
|||||||
postmap.o: ../../include/readlline.h
|
postmap.o: ../../include/readlline.h
|
||||||
postmap.o: ../../include/stringops.h
|
postmap.o: ../../include/stringops.h
|
||||||
postmap.o: ../../include/split_at.h
|
postmap.o: ../../include/split_at.h
|
||||||
|
postmap.o: ../../include/vstring_vstream.h
|
||||||
postmap.o: ../../include/mail_conf.h
|
postmap.o: ../../include/mail_conf.h
|
||||||
postmap.o: ../../include/mail_params.h
|
postmap.o: ../../include/mail_params.h
|
||||||
postmap.o: ../../include/mkmap.h
|
postmap.o: ../../include/mkmap.h
|
||||||
|
@@ -5,7 +5,8 @@
|
|||||||
/* Postfix super intendent
|
/* Postfix super intendent
|
||||||
/* SYNOPSIS
|
/* SYNOPSIS
|
||||||
/* .fi
|
/* .fi
|
||||||
/* \fBpostsuper\fR [\fB-p\fR] [\fB-s\fR] [\fB-v\fR] [\fIdirectory ...\fR]
|
/* \fBpostsuper\fR [\fB-d \fIqueue_id\fR] [\fB-p\fR]
|
||||||
|
/* [\fB-s\fR] [\fB-v\fR] [\fIdirectory ...\fR]
|
||||||
/* DESCRIPTION
|
/* DESCRIPTION
|
||||||
/* The \fBpostsuper\fR command does small maintenance jobs on the named
|
/* The \fBpostsuper\fR command does small maintenance jobs on the named
|
||||||
/* Postfix queue directories (default: all).
|
/* Postfix queue directories (default: all).
|
||||||
@@ -17,6 +18,17 @@
|
|||||||
/* nor directories. Use of this command is restricted to the super-user.
|
/* nor directories. Use of this command is restricted to the super-user.
|
||||||
/*
|
/*
|
||||||
/* Options:
|
/* Options:
|
||||||
|
/* .IP \fB-d \fIqueue_id\fR
|
||||||
|
/* Delete one message queue file with the named queue ID. Specify
|
||||||
|
/* multiple \fB-d\fR options to delete multiple queue files by name.
|
||||||
|
/* .sp
|
||||||
|
/* Alternatively, if a \fIqueue_id\fR of \fB-\fR is specified, the
|
||||||
|
/* program reads queue IDs from standard input.
|
||||||
|
/* .sp
|
||||||
|
/* This operation can be performed safely while the mail system is
|
||||||
|
/* running, although the queue manager may issue warnings when a
|
||||||
|
/* file suddenly disappears. The exit status is zero if at least one
|
||||||
|
/* of the named message queue files was found.
|
||||||
/* .IP \fB-s\fR
|
/* .IP \fB-s\fR
|
||||||
/* Structure check. Move queue files that are in the wrong place
|
/* Structure check. Move queue files that are in the wrong place
|
||||||
/* in the file system hierarchy and remove subdirectories that are
|
/* in the file system hierarchy and remove subdirectories that are
|
||||||
@@ -76,6 +88,7 @@
|
|||||||
#include <safe.h>
|
#include <safe.h>
|
||||||
#include <set_ugid.h>
|
#include <set_ugid.h>
|
||||||
#include <argv.h>
|
#include <argv.h>
|
||||||
|
#include <vstring_vstream.h>
|
||||||
|
|
||||||
/* Global library. */
|
/* Global library. */
|
||||||
|
|
||||||
@@ -91,6 +104,7 @@
|
|||||||
|
|
||||||
#define ACTION_STRUCT (1<<0) /* fix file organization */
|
#define ACTION_STRUCT (1<<0) /* fix file organization */
|
||||||
#define ACTION_PURGE (1<<1) /* purge old temp files */
|
#define ACTION_PURGE (1<<1) /* purge old temp files */
|
||||||
|
#define ACTION_DELETE (1<<2) /* delete named queue file(s) */
|
||||||
|
|
||||||
#define ACTION_DEFAULT (ACTION_STRUCT | ACTION_PURGE)
|
#define ACTION_DEFAULT (ACTION_STRUCT | ACTION_PURGE)
|
||||||
|
|
||||||
@@ -121,6 +135,57 @@ static struct queue_info queue_info[] = {
|
|||||||
0,
|
0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* delete_one - delete one message instance and all its associated files */
|
||||||
|
|
||||||
|
static int delete_one(const char *queue_id)
|
||||||
|
{
|
||||||
|
const char *msg_queue_names[] = {
|
||||||
|
MAIL_QUEUE_INCOMING, /* twice, to avoid */
|
||||||
|
MAIL_QUEUE_ACTIVE, /* missing a file while */
|
||||||
|
MAIL_QUEUE_DEFERRED, /* it is being renamed */
|
||||||
|
MAIL_QUEUE_INCOMING, /* this is not 100% */
|
||||||
|
MAIL_QUEUE_ACTIVE, /* foolproof but adequate */
|
||||||
|
MAIL_QUEUE_DEFERRED,
|
||||||
|
0,
|
||||||
|
};
|
||||||
|
const char **cpp;
|
||||||
|
VSTRING *msg_path = vstring_alloc(100);
|
||||||
|
int found = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Do not delete defer or bounce logfiles, because we could lose a race
|
||||||
|
* and delete a defer/bounce logfile from a message that reuses the queue
|
||||||
|
* ID.
|
||||||
|
*/
|
||||||
|
for (cpp = msg_queue_names; *cpp != 0; cpp++) {
|
||||||
|
(void) mail_queue_path(msg_path, *cpp, queue_id);
|
||||||
|
if (unlink(STR(msg_path)) == 0) {
|
||||||
|
found = 1;
|
||||||
|
if (msg_verbose)
|
||||||
|
msg_info("removed file %s", STR(msg_path));
|
||||||
|
break;
|
||||||
|
} else if (errno != ENOENT) {
|
||||||
|
msg_warn("remove file %s: %m", STR(msg_path));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vstring_free(msg_path);
|
||||||
|
return (found);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* delete_stream - delete queue IDs given on stream */
|
||||||
|
|
||||||
|
static int delete_stream(VSTREAM *fp)
|
||||||
|
{
|
||||||
|
VSTRING *buf = vstring_alloc(20);
|
||||||
|
int found = 0;
|
||||||
|
|
||||||
|
while (vstring_get_nonl(buf, fp) != VSTREAM_EOF)
|
||||||
|
found |= delete_one(STR(buf));
|
||||||
|
|
||||||
|
vstring_free(buf);
|
||||||
|
return (found);
|
||||||
|
}
|
||||||
|
|
||||||
/* super - check queue file location and clean up */
|
/* super - check queue file location and clean up */
|
||||||
|
|
||||||
static void super(char **queues, int action)
|
static void super(char **queues, int action)
|
||||||
@@ -286,6 +351,7 @@ int main(int argc, char **argv)
|
|||||||
int action = 0;
|
int action = 0;
|
||||||
char **queues;
|
char **queues;
|
||||||
int c;
|
int c;
|
||||||
|
int found = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Defaults.
|
* Defaults.
|
||||||
@@ -356,11 +422,18 @@ int main(int argc, char **argv)
|
|||||||
/*
|
/*
|
||||||
* Parse JCL.
|
* Parse JCL.
|
||||||
*/
|
*/
|
||||||
while ((c = GETOPT(argc, argv, "spv")) > 0) {
|
while ((c = GETOPT(argc, argv, "d:spv")) > 0) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
default:
|
default:
|
||||||
msg_fatal("usage: %s [-s (fix structure)] [-p (purge stale files)]",
|
msg_fatal("usage: %s [-d queue_id] [-p (purge stale files)] [-s (fix structure)]",
|
||||||
argv[0]);
|
argv[0]);
|
||||||
|
case 'd':
|
||||||
|
if (strcmp(optarg, "-") == 0)
|
||||||
|
found |= delete_stream(VSTREAM_IN);
|
||||||
|
else
|
||||||
|
found |= delete_one(optarg);
|
||||||
|
action |= ACTION_DELETE;
|
||||||
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
action |= ACTION_STRUCT;
|
action |= ACTION_STRUCT;
|
||||||
break;
|
break;
|
||||||
@@ -384,7 +457,8 @@ int main(int argc, char **argv)
|
|||||||
else
|
else
|
||||||
queues = argv + optind;
|
queues = argv + optind;
|
||||||
|
|
||||||
super(queues, action);
|
if (action & ~ACTION_DELETE)
|
||||||
|
super(queues, action & ~ACTION_DELETE);
|
||||||
|
|
||||||
exit(0);
|
exit((action & ACTION_DELETE) ? !found : 0);
|
||||||
}
|
}
|
||||||
|
@@ -35,6 +35,7 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <utime.h>
|
#include <utime.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
/* Utility library. */
|
/* Utility library. */
|
||||||
|
|
||||||
@@ -73,12 +74,21 @@ void qmgr_move(const char *src_queue, const char *dst_queue,
|
|||||||
if (time_stamp > 0) {
|
if (time_stamp > 0) {
|
||||||
tbuf.actime = tbuf.modtime = time_stamp;
|
tbuf.actime = tbuf.modtime = time_stamp;
|
||||||
path = mail_queue_path((VSTRING *) 0, src_queue, queue_id);
|
path = mail_queue_path((VSTRING *) 0, src_queue, queue_id);
|
||||||
if (utime(path, &tbuf) < 0)
|
if (utime(path, &tbuf) < 0) {
|
||||||
msg_fatal("%s: update %s time stamps: %m", myname, path);
|
if (errno != ENOENT)
|
||||||
|
msg_fatal("%s: update %s time stamps: %m", myname, path);
|
||||||
|
msg_warn("%s: update %s time stamps: %m", myname, path);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (mail_queue_rename(queue_id, src_queue, dst_queue)) {
|
||||||
|
if (errno != ENOENT)
|
||||||
|
msg_fatal("%s: rename %s from %s to %s: %m",
|
||||||
|
myname, queue_id, src_queue, dst_queue);
|
||||||
|
msg_warn("%s: rename %s from %s to %s: %m",
|
||||||
|
myname, queue_id, src_queue, dst_queue);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
if (mail_queue_rename(queue_id, src_queue, dst_queue))
|
|
||||||
msg_fatal("%s: rename %s from %s to %s: %m",
|
|
||||||
myname, queue_id, src_queue, dst_queue);
|
|
||||||
if (msg_verbose)
|
if (msg_verbose)
|
||||||
msg_info("%s: moved %s from %s to %s",
|
msg_info("%s: moved %s from %s to %s",
|
||||||
myname, queue_id, src_queue, dst_queue);
|
myname, queue_id, src_queue, dst_queue);
|
||||||
|
@@ -517,12 +517,10 @@ static void show_queue(void)
|
|||||||
signal(SIGPIPE, SIG_DFL);
|
signal(SIGPIPE, SIG_DFL);
|
||||||
if ((showq = mail_connect(MAIL_CLASS_PUBLIC, MAIL_SERVICE_SHOWQ, BLOCKING)) != 0) {
|
if ((showq = mail_connect(MAIL_CLASS_PUBLIC, MAIL_SERVICE_SHOWQ, BLOCKING)) != 0) {
|
||||||
while ((n = vstream_fread(showq, buf, sizeof(buf))) > 0)
|
while ((n = vstream_fread(showq, buf, sizeof(buf))) > 0)
|
||||||
if (vstream_fwrite(VSTREAM_OUT, buf, n) != n)
|
if (vstream_fwrite(VSTREAM_OUT, buf, n) != n
|
||||||
|
|| vstream_fflush(VSTREAM_OUT) != 0)
|
||||||
msg_fatal("write error: %m");
|
msg_fatal("write error: %m");
|
||||||
|
|
||||||
if (vstream_fflush(VSTREAM_OUT))
|
|
||||||
msg_fatal("write error: %m");
|
|
||||||
|
|
||||||
if (vstream_fclose(showq))
|
if (vstream_fclose(showq))
|
||||||
msg_warn("close: %m");
|
msg_warn("close: %m");
|
||||||
}
|
}
|
||||||
|
@@ -91,6 +91,7 @@ smtp_addr.o: ../../include/vbuf.h
|
|||||||
smtp_addr.o: ../../include/mymalloc.h
|
smtp_addr.o: ../../include/mymalloc.h
|
||||||
smtp_addr.o: ../../include/inet_addr_list.h
|
smtp_addr.o: ../../include/inet_addr_list.h
|
||||||
smtp_addr.o: ../../include/stringops.h
|
smtp_addr.o: ../../include/stringops.h
|
||||||
|
smtp_addr.o: ../../include/myrand.h
|
||||||
smtp_addr.o: ../../include/mail_params.h
|
smtp_addr.o: ../../include/mail_params.h
|
||||||
smtp_addr.o: ../../include/own_inet_addr.h
|
smtp_addr.o: ../../include/own_inet_addr.h
|
||||||
smtp_addr.o: ../../include/dns.h
|
smtp_addr.o: ../../include/dns.h
|
||||||
|
@@ -128,20 +128,6 @@ static void smtp_print_addr(char *what, DNS_RR *addr_list)
|
|||||||
msg_info("end %s address list", what);
|
msg_info("end %s address list", what);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* smtp_rand_addr - randomize equal-preference resource records */
|
|
||||||
|
|
||||||
static int smtp_rand_addr(DNS_RR *a, DNS_RR *b)
|
|
||||||
{
|
|
||||||
int diff;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* XXX Equal-preference records are made to appear different. The bogus
|
|
||||||
* difference is not consistent from one call to the next. Code based on
|
|
||||||
* an idea by Aleph1.
|
|
||||||
*/
|
|
||||||
return ((diff = a->pref - b->pref != 0) ? diff : (myrand() & 1) ? -1 : 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* smtp_addr_one - address lookup for one host name */
|
/* smtp_addr_one - address lookup for one host name */
|
||||||
|
|
||||||
static DNS_RR *smtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRING *why)
|
static DNS_RR *smtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRING *why)
|
||||||
@@ -377,8 +363,10 @@ DNS_RR *smtp_domain_addr(char *name, VSTRING *why, int *found_myself)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (addr_list && var_smtp_rand_addr)
|
if (addr_list && addr_list->next && var_smtp_rand_addr) {
|
||||||
addr_list = dns_rr_sort(addr_list, smtp_rand_addr);
|
addr_list = dns_rr_shuffle(addr_list);
|
||||||
|
addr_list = dns_rr_sort(addr_list, smtp_compare_pref);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DNS_NOTFOUND:
|
case DNS_NOTFOUND:
|
||||||
addr_list = smtp_host_addr(name, why);
|
addr_list = smtp_host_addr(name, why);
|
||||||
@@ -404,8 +392,8 @@ DNS_RR *smtp_host_addr(char *host, VSTRING *why)
|
|||||||
*/
|
*/
|
||||||
#define PREF0 0
|
#define PREF0 0
|
||||||
addr_list = smtp_addr_one((DNS_RR *) 0, host, PREF0, why);
|
addr_list = smtp_addr_one((DNS_RR *) 0, host, PREF0, why);
|
||||||
if (addr_list && var_smtp_rand_addr)
|
if (addr_list && addr_list->next && var_smtp_rand_addr)
|
||||||
addr_list = dns_rr_sort(addr_list, smtp_rand_addr);
|
addr_list = dns_rr_shuffle(addr_list);
|
||||||
if (msg_verbose)
|
if (msg_verbose)
|
||||||
smtp_print_addr(host, addr_list);
|
smtp_print_addr(host, addr_list);
|
||||||
return (addr_list);
|
return (addr_list);
|
||||||
|
@@ -834,7 +834,7 @@ static int data_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *unused_argv)
|
|||||||
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
state->error_mask |= MAIL_ERROR_PROTOCOL;
|
||||||
smtpd_chat_reply(state, "503 Error: need RCPT command");
|
smtpd_chat_reply(state, "503 Error: need RCPT command");
|
||||||
} else {
|
} else {
|
||||||
smtpd_chat_reply(state, "550 Error: no valid recipients");
|
smtpd_chat_reply(state, "554 Error: no valid recipients");
|
||||||
}
|
}
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
@@ -24,6 +24,10 @@
|
|||||||
/* SMTPD_STATE *state;
|
/* SMTPD_STATE *state;
|
||||||
/* char *recipient;
|
/* char *recipient;
|
||||||
/*
|
/*
|
||||||
|
/* char *smtpd_check_rcptmap(state, recipient)
|
||||||
|
/* SMTPD_STATE *state;
|
||||||
|
/* char *recipient;
|
||||||
|
/*
|
||||||
/* char *smtpd_check_etrn(state, destination)
|
/* char *smtpd_check_etrn(state, destination)
|
||||||
/* SMTPD_STATE *state;
|
/* SMTPD_STATE *state;
|
||||||
/* char *destination;
|
/* char *destination;
|
||||||
@@ -172,6 +176,12 @@
|
|||||||
/* Restrictions on the recipient address that is sent with the RCPT
|
/* Restrictions on the recipient address that is sent with the RCPT
|
||||||
/* TO command.
|
/* TO command.
|
||||||
/* .PP
|
/* .PP
|
||||||
|
/* smtpd_check_rcptmap() validates the recipient address provided
|
||||||
|
/* with an RCPT TO request. Relevant configuration parameters:
|
||||||
|
/* .IP local_recipients_map
|
||||||
|
/* Tables of user names (not addresses) that exist in $mydestination.
|
||||||
|
/* Mail for local users not in these tables is rejected.
|
||||||
|
/* .PP
|
||||||
/* smtpd_check_etrn() validates the domain name provided with the
|
/* smtpd_check_etrn() validates the domain name provided with the
|
||||||
/* ETRN command, and other client-provided information. Relevant
|
/* ETRN command, and other client-provided information. Relevant
|
||||||
/* configuration parameters:
|
/* configuration parameters:
|
||||||
|
@@ -111,12 +111,12 @@ rcpt foo@porcupine.org
|
|||||||
#
|
#
|
||||||
# MX backup
|
# MX backup
|
||||||
#
|
#
|
||||||
mydestination spike.porcupine.org,localhost.porcupine.org
|
#mydestination spike.porcupine.org,localhost.porcupine.org
|
||||||
inet_interfaces 168.100.189.2,127.0.0.1
|
#inet_interfaces 168.100.189.2,127.0.0.1
|
||||||
recipient_restrictions permit_mx_backup,reject
|
#recipient_restrictions permit_mx_backup,reject
|
||||||
rcpt wietse@wzv.win.tue.nl
|
#rcpt wietse@wzv.win.tue.nl
|
||||||
rcpt wietse@trouble.org
|
#rcpt wietse@trouble.org
|
||||||
rcpt wietse@porcupine.org
|
#rcpt wietse@porcupine.org
|
||||||
#
|
#
|
||||||
# Deferred restrictions
|
# Deferred restrictions
|
||||||
#
|
#
|
||||||
|
@@ -47,8 +47,6 @@ OK
|
|||||||
>>> client foo 123.123.123.123
|
>>> client foo 123.123.123.123
|
||||||
OK
|
OK
|
||||||
>>> helo foo.
|
>>> helo foo.
|
||||||
./smtpd_check: warning: valid_hostname: misplaced delimiter: foo.
|
|
||||||
./smtpd_check: warning: valid_hostname: misplaced delimiter: foo.
|
|
||||||
./smtpd_check: reject: HELO from foo[123.123.123.123]: 450 <foo.>: Helo command rejected: Host not found
|
./smtpd_check: reject: HELO from foo[123.123.123.123]: 450 <foo.>: Helo command rejected: Host not found
|
||||||
450 <foo.>: Helo command rejected: Host not found
|
450 <foo.>: Helo command rejected: Host not found
|
||||||
>>> helo foo
|
>>> helo foo
|
||||||
@@ -66,9 +64,6 @@ OK
|
|||||||
>>> helo_restrictions reject_invalid_hostname,reject_unknown_hostname
|
>>> helo_restrictions reject_invalid_hostname,reject_unknown_hostname
|
||||||
OK
|
OK
|
||||||
>>> helo 123.123.123.123
|
>>> helo 123.123.123.123
|
||||||
./smtpd_check: warning: valid_hostname: numeric hostname: 123.123.123.123
|
|
||||||
./smtpd_check: warning: valid_hostname: numeric hostname: 123.123.123.123
|
|
||||||
./smtpd_check: warning: valid_hostname: numeric hostname: 123.123.123.123
|
|
||||||
./smtpd_check: reject: HELO from foo[123.123.123.123]: 450 <123.123.123.123>: Helo command rejected: Host not found
|
./smtpd_check: reject: HELO from foo[123.123.123.123]: 450 <123.123.123.123>: Helo command rejected: Host not found
|
||||||
450 <123.123.123.123>: Helo command rejected: Host not found
|
450 <123.123.123.123>: Helo command rejected: Host not found
|
||||||
>>> helo_restrictions permit_naked_ip_address,reject_invalid_hostname,reject_unknown_hostname
|
>>> helo_restrictions permit_naked_ip_address,reject_invalid_hostname,reject_unknown_hostname
|
||||||
@@ -186,8 +181,8 @@ OK
|
|||||||
>>> client spike.porcupine.org 168.100.189.2
|
>>> client spike.porcupine.org 168.100.189.2
|
||||||
OK
|
OK
|
||||||
>>> client foo 127.0.0.2
|
>>> client foo 127.0.0.2
|
||||||
./smtpd_check: reject: CONNECT from foo[127.0.0.2]: 554 Service unavailable; [127.0.0.2] blocked using rbl.maps.vix.com, reason: Blackholed - see <URL:http://mail-abuse.org/cgi-bin/lookup?127.0.0.2>; from=<foo@friend.bad.domain>
|
./smtpd_check: reject: CONNECT from foo[127.0.0.2]: 554 Service unavailable; [127.0.0.2] blocked using blackholes.mail-abuse.org, reason: Blackholed - see <URL:http://mail-abuse.org/cgi-bin/lookup?127.0.0.2>; from=<foo@friend.bad.domain>
|
||||||
554 Service unavailable; [127.0.0.2] blocked using rbl.maps.vix.com, reason: Blackholed - see <URL:http://mail-abuse.org/cgi-bin/lookup?127.0.0.2>
|
554 Service unavailable; [127.0.0.2] blocked using blackholes.mail-abuse.org, reason: Blackholed - see <URL:http://mail-abuse.org/cgi-bin/lookup?127.0.0.2>
|
||||||
>>> #
|
>>> #
|
||||||
>>> # Hybrids
|
>>> # Hybrids
|
||||||
>>> #
|
>>> #
|
||||||
@@ -215,7 +210,6 @@ OK
|
|||||||
./smtpd_check: reject: RCPT from foo[131.155.210.17]: 554 <bad.domain>: Helo command rejected: match bad.domain; from=<foo@friend.bad.domain> to=<foo@porcupine.org>
|
./smtpd_check: reject: RCPT from foo[131.155.210.17]: 554 <bad.domain>: Helo command rejected: match bad.domain; from=<foo@friend.bad.domain> to=<foo@porcupine.org>
|
||||||
554 <bad.domain>: Helo command rejected: match bad.domain
|
554 <bad.domain>: Helo command rejected: match bad.domain
|
||||||
>>> helo 131.155.210.17
|
>>> helo 131.155.210.17
|
||||||
./smtpd_check: warning: valid_hostname: numeric hostname: 131.155.210.17
|
|
||||||
OK
|
OK
|
||||||
>>> rcpt foo@porcupine.org
|
>>> rcpt foo@porcupine.org
|
||||||
OK
|
OK
|
||||||
@@ -234,19 +228,12 @@ OK
|
|||||||
>>> #
|
>>> #
|
||||||
>>> # MX backup
|
>>> # MX backup
|
||||||
>>> #
|
>>> #
|
||||||
>>> mydestination spike.porcupine.org,localhost.porcupine.org
|
>>> #mydestination spike.porcupine.org,localhost.porcupine.org
|
||||||
OK
|
>>> #inet_interfaces 168.100.189.2,127.0.0.1
|
||||||
>>> inet_interfaces 168.100.189.2,127.0.0.1
|
>>> #recipient_restrictions permit_mx_backup,reject
|
||||||
OK
|
>>> #rcpt wietse@wzv.win.tue.nl
|
||||||
>>> recipient_restrictions permit_mx_backup,reject
|
>>> #rcpt wietse@trouble.org
|
||||||
OK
|
>>> #rcpt wietse@porcupine.org
|
||||||
>>> rcpt wietse@wzv.win.tue.nl
|
|
||||||
OK
|
|
||||||
>>> rcpt wietse@trouble.org
|
|
||||||
./smtpd_check: reject: RCPT from foo[131.155.210.17]: 554 <wietse@trouble.org>: Recipient address rejected: Access denied; from=<foo@friend.bad.domain> to=<wietse@trouble.org>
|
|
||||||
554 <wietse@trouble.org>: Recipient address rejected: Access denied
|
|
||||||
>>> rcpt wietse@porcupine.org
|
|
||||||
OK
|
|
||||||
>>> #
|
>>> #
|
||||||
>>> # Deferred restrictions
|
>>> # Deferred restrictions
|
||||||
>>> #
|
>>> #
|
||||||
@@ -316,68 +303,52 @@ OK
|
|||||||
>>> helo [1.2.3.4]
|
>>> helo [1.2.3.4]
|
||||||
OK
|
OK
|
||||||
>>> helo [321.255.255.255]
|
>>> helo [321.255.255.255]
|
||||||
./smtpd_check: warning: valid_hostaddr: invalid octet value: 321.255.255.255
|
|
||||||
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <[321.255.255.255]>: Helo command rejected: invalid ip address; from=<foo>
|
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <[321.255.255.255]>: Helo command rejected: invalid ip address; from=<foo>
|
||||||
501 <[321.255.255.255]>: Helo command rejected: invalid ip address
|
501 <[321.255.255.255]>: Helo command rejected: invalid ip address
|
||||||
>>> helo [0.255.255.255]
|
>>> helo [0.255.255.255]
|
||||||
./smtpd_check: warning: valid_hostaddr: bad initial octet value: 0.255.255.255
|
|
||||||
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <[0.255.255.255]>: Helo command rejected: invalid ip address; from=<foo>
|
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <[0.255.255.255]>: Helo command rejected: invalid ip address; from=<foo>
|
||||||
501 <[0.255.255.255]>: Helo command rejected: invalid ip address
|
501 <[0.255.255.255]>: Helo command rejected: invalid ip address
|
||||||
>>> helo [1.2.3.321]
|
>>> helo [1.2.3.321]
|
||||||
./smtpd_check: warning: valid_hostaddr: invalid octet value: 1.2.3.321
|
|
||||||
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <[1.2.3.321]>: Helo command rejected: invalid ip address; from=<foo>
|
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <[1.2.3.321]>: Helo command rejected: invalid ip address; from=<foo>
|
||||||
501 <[1.2.3.321]>: Helo command rejected: invalid ip address
|
501 <[1.2.3.321]>: Helo command rejected: invalid ip address
|
||||||
>>> helo [1.2.3]
|
>>> helo [1.2.3]
|
||||||
./smtpd_check: warning: valid_hostaddr: invalid octet count: 1.2.3
|
|
||||||
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <[1.2.3]>: Helo command rejected: invalid ip address; from=<foo>
|
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <[1.2.3]>: Helo command rejected: invalid ip address; from=<foo>
|
||||||
501 <[1.2.3]>: Helo command rejected: invalid ip address
|
501 <[1.2.3]>: Helo command rejected: invalid ip address
|
||||||
>>> helo [1.2.3.4.5]
|
>>> helo [1.2.3.4.5]
|
||||||
./smtpd_check: warning: valid_hostaddr: invalid octet count: 1.2.3.4.5
|
|
||||||
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <[1.2.3.4.5]>: Helo command rejected: invalid ip address; from=<foo>
|
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <[1.2.3.4.5]>: Helo command rejected: invalid ip address; from=<foo>
|
||||||
501 <[1.2.3.4.5]>: Helo command rejected: invalid ip address
|
501 <[1.2.3.4.5]>: Helo command rejected: invalid ip address
|
||||||
>>> helo [1..2.3.4]
|
>>> helo [1..2.3.4]
|
||||||
./smtpd_check: warning: valid_hostaddr: misplaced dot: 1..2.3.4
|
|
||||||
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <[1..2.3.4]>: Helo command rejected: invalid ip address; from=<foo>
|
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <[1..2.3.4]>: Helo command rejected: invalid ip address; from=<foo>
|
||||||
501 <[1..2.3.4]>: Helo command rejected: invalid ip address
|
501 <[1..2.3.4]>: Helo command rejected: invalid ip address
|
||||||
>>> helo [.1.2.3.4]
|
>>> helo [.1.2.3.4]
|
||||||
./smtpd_check: warning: valid_hostaddr: misplaced dot: .1.2.3.4
|
|
||||||
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <[.1.2.3.4]>: Helo command rejected: invalid ip address; from=<foo>
|
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <[.1.2.3.4]>: Helo command rejected: invalid ip address; from=<foo>
|
||||||
501 <[.1.2.3.4]>: Helo command rejected: invalid ip address
|
501 <[.1.2.3.4]>: Helo command rejected: invalid ip address
|
||||||
>>> helo [1.2.3.4.5.]
|
>>> helo [1.2.3.4.5.]
|
||||||
./smtpd_check: warning: valid_hostaddr: misplaced dot: 1.2.3.4.5.
|
|
||||||
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <[1.2.3.4.5.]>: Helo command rejected: invalid ip address; from=<foo>
|
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <[1.2.3.4.5.]>: Helo command rejected: invalid ip address; from=<foo>
|
||||||
501 <[1.2.3.4.5.]>: Helo command rejected: invalid ip address
|
501 <[1.2.3.4.5.]>: Helo command rejected: invalid ip address
|
||||||
>>> helo 1.2.3.4
|
>>> helo 1.2.3.4
|
||||||
OK
|
OK
|
||||||
>>> helo 321.255.255.255
|
>>> helo 321.255.255.255
|
||||||
./smtpd_check: warning: valid_hostaddr: invalid octet value: 321.255.255.255
|
|
||||||
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <321.255.255.255>: Helo command rejected: invalid ip address; from=<foo>
|
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <321.255.255.255>: Helo command rejected: invalid ip address; from=<foo>
|
||||||
501 <321.255.255.255>: Helo command rejected: invalid ip address
|
501 <321.255.255.255>: Helo command rejected: invalid ip address
|
||||||
>>> helo 0.255.255.255
|
>>> helo 0.255.255.255
|
||||||
./smtpd_check: warning: valid_hostaddr: bad initial octet value: 0.255.255.255
|
|
||||||
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <0.255.255.255>: Helo command rejected: invalid ip address; from=<foo>
|
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <0.255.255.255>: Helo command rejected: invalid ip address; from=<foo>
|
||||||
501 <0.255.255.255>: Helo command rejected: invalid ip address
|
501 <0.255.255.255>: Helo command rejected: invalid ip address
|
||||||
>>> helo 1.2.3.321
|
>>> helo 1.2.3.321
|
||||||
./smtpd_check: warning: valid_hostaddr: invalid octet value: 1.2.3.321
|
|
||||||
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <1.2.3.321>: Helo command rejected: invalid ip address; from=<foo>
|
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <1.2.3.321>: Helo command rejected: invalid ip address; from=<foo>
|
||||||
501 <1.2.3.321>: Helo command rejected: invalid ip address
|
501 <1.2.3.321>: Helo command rejected: invalid ip address
|
||||||
>>> helo 1.2.3
|
>>> helo 1.2.3
|
||||||
./smtpd_check: warning: valid_hostaddr: invalid octet count: 1.2.3
|
|
||||||
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <1.2.3>: Helo command rejected: invalid ip address; from=<foo>
|
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <1.2.3>: Helo command rejected: invalid ip address; from=<foo>
|
||||||
501 <1.2.3>: Helo command rejected: invalid ip address
|
501 <1.2.3>: Helo command rejected: invalid ip address
|
||||||
>>> helo 1.2.3.4.5
|
>>> helo 1.2.3.4.5
|
||||||
./smtpd_check: warning: valid_hostaddr: invalid octet count: 1.2.3.4.5
|
|
||||||
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <1.2.3.4.5>: Helo command rejected: invalid ip address; from=<foo>
|
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <1.2.3.4.5>: Helo command rejected: invalid ip address; from=<foo>
|
||||||
501 <1.2.3.4.5>: Helo command rejected: invalid ip address
|
501 <1.2.3.4.5>: Helo command rejected: invalid ip address
|
||||||
>>> helo 1..2.3.4
|
>>> helo 1..2.3.4
|
||||||
./smtpd_check: warning: valid_hostaddr: misplaced dot: 1..2.3.4
|
|
||||||
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <1..2.3.4>: Helo command rejected: invalid ip address; from=<foo>
|
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <1..2.3.4>: Helo command rejected: invalid ip address; from=<foo>
|
||||||
501 <1..2.3.4>: Helo command rejected: invalid ip address
|
501 <1..2.3.4>: Helo command rejected: invalid ip address
|
||||||
>>> helo .1.2.3.4
|
>>> helo .1.2.3.4
|
||||||
./smtpd_check: warning: valid_hostaddr: misplaced dot: .1.2.3.4
|
|
||||||
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <.1.2.3.4>: Helo command rejected: invalid ip address; from=<foo>
|
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <.1.2.3.4>: Helo command rejected: invalid ip address; from=<foo>
|
||||||
501 <.1.2.3.4>: Helo command rejected: invalid ip address
|
501 <.1.2.3.4>: Helo command rejected: invalid ip address
|
||||||
>>> helo 1.2.3.4.5.
|
>>> helo 1.2.3.4.5.
|
||||||
./smtpd_check: warning: valid_hostaddr: misplaced dot: 1.2.3.4.5.
|
|
||||||
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <1.2.3.4.5.>: Helo command rejected: invalid ip address; from=<foo>
|
./smtpd_check: reject: HELO from foo[131.155.210.17]: 501 <1.2.3.4.5.>: Helo command rejected: invalid ip address; from=<foo>
|
||||||
501 <1.2.3.4.5.>: Helo command rejected: invalid ip address
|
501 <1.2.3.4.5.>: Helo command rejected: invalid ip address
|
||||||
|
@@ -47,8 +47,6 @@ OK
|
|||||||
>>> client foo 123.123.123.123
|
>>> client foo 123.123.123.123
|
||||||
OK
|
OK
|
||||||
>>> helo foo.
|
>>> helo foo.
|
||||||
./smtpd_check: warning: valid_hostname: misplaced delimiter: foo.
|
|
||||||
./smtpd_check: warning: valid_hostname: misplaced delimiter: foo.
|
|
||||||
./smtpd_check: reject: HELO from foo[123.123.123.123]: 450 <foo.>: Helo command rejected: Host not found
|
./smtpd_check: reject: HELO from foo[123.123.123.123]: 450 <foo.>: Helo command rejected: Host not found
|
||||||
450 <foo.>: Helo command rejected: Host not found
|
450 <foo.>: Helo command rejected: Host not found
|
||||||
>>> helo foo
|
>>> helo foo
|
||||||
@@ -174,8 +172,8 @@ OK
|
|||||||
>>> client spike.porcupine.org 168.100.189.2
|
>>> client spike.porcupine.org 168.100.189.2
|
||||||
OK
|
OK
|
||||||
>>> client foo 127.0.0.2
|
>>> client foo 127.0.0.2
|
||||||
./smtpd_check: reject: CONNECT from foo[127.0.0.2]: 554 Service unavailable; [127.0.0.2] blocked using rbl.maps.vix.com, reason: Blackholed - see <URL:http://mail-abuse.org/cgi-bin/lookup?127.0.0.2>; from=<foo@friend.bad.domain>
|
./smtpd_check: reject: CONNECT from foo[127.0.0.2]: 554 Service unavailable; [127.0.0.2] blocked using blackholes.mail-abuse.org, reason: Blackholed - see <URL:http://mail-abuse.org/cgi-bin/lookup?127.0.0.2>; from=<foo@friend.bad.domain>
|
||||||
554 Service unavailable; [127.0.0.2] blocked using rbl.maps.vix.com, reason: Blackholed - see <URL:http://mail-abuse.org/cgi-bin/lookup?127.0.0.2>
|
554 Service unavailable; [127.0.0.2] blocked using blackholes.mail-abuse.org, reason: Blackholed - see <URL:http://mail-abuse.org/cgi-bin/lookup?127.0.0.2>
|
||||||
>>> #
|
>>> #
|
||||||
>>> # unknown sender/recipient domain
|
>>> # unknown sender/recipient domain
|
||||||
>>> #
|
>>> #
|
||||||
|
@@ -810,6 +810,7 @@ printable.o: vbuf.h
|
|||||||
rand_sleep.o: rand_sleep.c
|
rand_sleep.o: rand_sleep.c
|
||||||
rand_sleep.o: sys_defs.h
|
rand_sleep.o: sys_defs.h
|
||||||
rand_sleep.o: msg.h
|
rand_sleep.o: msg.h
|
||||||
|
rand_sleep.o: myrand.h
|
||||||
rand_sleep.o: iostuff.h
|
rand_sleep.o: iostuff.h
|
||||||
read_wait.o: read_wait.c
|
read_wait.o: read_wait.c
|
||||||
read_wait.o: sys_defs.h
|
read_wait.o: sys_defs.h
|
||||||
|
@@ -17,11 +17,14 @@
|
|||||||
/* mysrand() performs initialization. This call may be skipped.
|
/* mysrand() performs initialization. This call may be skipped.
|
||||||
/*
|
/*
|
||||||
/* myrand() returns a pseudo-random number in the range [0, RAND_MAX].
|
/* myrand() returns a pseudo-random number in the range [0, RAND_MAX].
|
||||||
/* If mysrand() was not called, it is invoked with the process ID.
|
/* If mysrand() was not called, it is invoked with the process ID
|
||||||
|
/* ex-or-ed with the time of day in seconds.
|
||||||
/* LICENSE
|
/* LICENSE
|
||||||
/* .ad
|
/* .ad
|
||||||
/* .fi
|
/* .fi
|
||||||
/* The Secure Mailer license must be distributed with this software.
|
/* The Secure Mailer license must be distributed with this software.
|
||||||
|
/* WARNING
|
||||||
|
/* Do not use this code for generating unpredictable numbers.
|
||||||
/* AUTHOR(S)
|
/* AUTHOR(S)
|
||||||
/* Wietse Venema
|
/* Wietse Venema
|
||||||
/* IBM T.J. Watson Research
|
/* IBM T.J. Watson Research
|
||||||
@@ -34,6 +37,7 @@
|
|||||||
#include <sys_defs.h>
|
#include <sys_defs.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
/* Utility library. */
|
/* Utility library. */
|
||||||
|
|
||||||
@@ -54,6 +58,6 @@ void mysrand(int seed)
|
|||||||
int myrand(void)
|
int myrand(void)
|
||||||
{
|
{
|
||||||
if (myrand_initdone == 0)
|
if (myrand_initdone == 0)
|
||||||
mysrand(getpid());
|
mysrand(getpid() ^ time((time_t *) 0));
|
||||||
return (rand());
|
return (rand());
|
||||||
}
|
}
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
/* SYNOPSIS
|
/* SYNOPSIS
|
||||||
/* #include <sane_fsops.h>
|
/* #include <sane_fsops.h>
|
||||||
/*
|
/*
|
||||||
/* int sane_link(old, new)
|
/* int sane_link(from, to)
|
||||||
/* const char *from;
|
/* const char *from;
|
||||||
/* const char *to;
|
/* const char *to;
|
||||||
/* DESCRIPTION
|
/* DESCRIPTION
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
/* int fd;
|
/* int fd;
|
||||||
/* DESCRIPTION
|
/* DESCRIPTION
|
||||||
/* writable() asks the kernel if the specified file descriptor
|
/* writable() asks the kernel if the specified file descriptor
|
||||||
/* is writable, i.e. a read operation would not block.
|
/* is writable, i.e. a write operation would not block.
|
||||||
/*
|
/*
|
||||||
/* Arguments:
|
/* Arguments:
|
||||||
/* .IP fd
|
/* .IP fd
|
||||||
|
Reference in New Issue
Block a user