2
0
mirror of https://github.com/vdukhovni/postfix synced 2025-08-31 14:17:41 +00:00

postfix-2.2-20040917

This commit is contained in:
Wietse Venema
2004-09-17 00:00:00 -05:00
committed by Viktor Dukhovni
parent 558e9e5c53
commit 8ccfb61a86
24 changed files with 230 additions and 141 deletions

2
postfix/.indent.pro vendored
View File

@@ -1,4 +1,3 @@
-TSCACHE_HEAD_NODE
-TABOUNCE -TABOUNCE
-TALIAS_TOKEN -TALIAS_TOKEN
-TANVIL_LOCAL -TANVIL_LOCAL
@@ -152,6 +151,7 @@
-TSCACHE_SINGLE -TSCACHE_SINGLE
-TSCACHE_SINGLE_DEST -TSCACHE_SINGLE_DEST
-TSCACHE_SINGLE_ENDP -TSCACHE_SINGLE_ENDP
-TSCACHE_SIZE
-TSCAN_DIR -TSCAN_DIR
-TSCAN_INFO -TSCAN_INFO
-TSCAN_OBJ -TSCAN_OBJ

View File

@@ -9587,9 +9587,9 @@ Apologies for any names omitted.
20040723 20040723
Bug? Safety? spawn(8) did not reject a user with the -1 Safety: spawn(8) now rejects a user with the -1 UID or GID
UID value, so the command could run as root. Files: value, so that commands will not end up running as root.
util/spawn_command.c, src/util/spawn.c. Files: util/spawn_command.c, spawn/spawn.c.
User interface: parameter smtp_connection_cache_domains User interface: parameter smtp_connection_cache_domains
renamed to smtp_connection_cache_destinations. Destinations renamed to smtp_connection_cache_destinations. Destinations
@@ -9706,9 +9706,36 @@ Apologies for any names omitted.
Portability: Solaris closefrom() support didn't work for Portability: Solaris closefrom() support didn't work for
non-SUN compilers. Victor Duchovni, Morgan Stanley. non-SUN compilers. Victor Duchovni, Morgan Stanley.
20040830
Feature: the scache(8) session cache manager now logs the
peak counts of destinations, endpoints and sessions. Files:
scache/scache.c, global/scache*c.
20040831
Portability: disable session caching support on SCO 5
because of incompatible sockets API. File: util/sys_defs.h.
20040913
Bugfix (introduced 20020803): sent the wrong bounce message
type when a Delivered-To: loop was detected for a mailing
list alias. Nicolas Riendeau. File: bounce_notify_util.c.
Open problems: Open problems:
Low: scache & anvil should log cache peak sizes. Low: should the Delivered-To: test in local(8) be configurable?
Low: append a different domain (like, address.invalid) for
mail from clients not in mynetworks.
Low: document propagate_unmatched_extensions in aliases(5)
etc.
Low: make mail_addr_find() lookup configurable.
Low: anvil(8) should log cache peak size, like scache(8).
Low: update events.c so that 1-second timer requests do Low: update events.c so that 1-second timer requests do
not suffer from rounding errors. This is needed for 1-second not suffer from rounding errors. This is needed for 1-second

View File

@@ -13,7 +13,7 @@ Incompatible changes with snapshot Postfix-2.2-20040829
When no recipients are specified on the command line or via the -t When no recipients are specified on the command line or via the -t
option, the Postfix sendmail command terminates with status EX_USAGE option, the Postfix sendmail command terminates with status EX_USAGE
and produces an error message instead of accepting the mail first and produces an error message instead of accepting the mail first
and bouncing it later. This gives direct more feedback in case of and bouncing it later. This gives more direct feedback in case of
a common client configuration error. a common client configuration error.
Major changes with snapshot Postfix-2.2-20040827 Major changes with snapshot Postfix-2.2-20040827

View File

@@ -40,12 +40,6 @@
# Sendmail rule set S3, if you like. This is controlled # Sendmail rule set S3, if you like. This is controlled
# with the canonical_classes parameter. # with the canonical_classes parameter.
# #
# The canonical mapping affects both message header
# addresses (i.e. addresses that appear inside messages) and
# message envelope addresses (for example, the addresses
# that are used in SMTP protocol commands). Think Sendmail
# rule set S3, if you like.
#
# Typically, one would use the canonical table to replace # Typically, one would use the canonical table to replace
# login names by Firstname.Lastname, or to clean up # login names by Firstname.Lastname, or to clean up
# addresses produced by legacy mail systems. # addresses produced by legacy mail systems.

View File

@@ -44,13 +44,7 @@ CANONICAL(5) CANONICAL(5)
sages) and message envelope addresses (for example, the sages) and message envelope addresses (for example, the
addresses that are used in SMTP protocol commands). Think addresses that are used in SMTP protocol commands). Think
Sendmail rule set <b>S3</b>, if you like. This is controlled Sendmail rule set <b>S3</b>, if you like. This is controlled
with the <b>canonical_classes</b> parameter. with the <b><a href="postconf.5.html#canonical_classes">canonical_classes</a></b> parameter.
The <b>canonical</b> mapping affects both message header
addresses (i.e. addresses that appear inside messages) and
message envelope addresses (for example, the addresses
that are used in SMTP protocol commands). Think Sendmail
rule set <b>S3</b>, if you like.
Typically, one would use the <b>canonical</b> table to replace Typically, one would use the <b>canonical</b> table to replace
login names by <i>Firstname.Lastname</i>, or to clean up login names by <i>Firstname.Lastname</i>, or to clean up
@@ -160,7 +154,7 @@ CANONICAL(5) CANONICAL(5)
The text below provides only a parameter summary. See The text below provides only a parameter summary. See
<a href="postconf.5.html">postconf(5)</a> for more details including examples. <a href="postconf.5.html">postconf(5)</a> for more details including examples.
<b>canonical_classes</b> <b><a href="postconf.5.html#canonical_classes">canonical_classes</a></b>
What addresses are subject to canonical address What addresses are subject to canonical address
mapping. mapping.

View File

@@ -4993,10 +4993,10 @@ optional address extension.
address extension. address extension.
<li> Look up the "user+extension" address local part when the <li> Look up the "user+extension" address local part when the
recipient domain equals $<a href="postconf.5.html#myorigin">myorigin</a>, $<a href="postconf.5.html#mydestination">mydestination</a>, $<a href="postconf.5.html#inet_interfaces">inet_interfaces</a> sender domain equals $<a href="postconf.5.html#myorigin">myorigin</a>, $<a href="postconf.5.html#mydestination">mydestination</a>, $<a href="postconf.5.html#inet_interfaces">inet_interfaces</a>
or $<a href="postconf.5.html#proxy_interfaces">proxy_interfaces</a>. or $<a href="postconf.5.html#proxy_interfaces">proxy_interfaces</a>.
<li> Look up the "user" address local part when the recipient domain <li> Look up the "user" address local part when the sender domain
equals $<a href="postconf.5.html#myorigin">myorigin</a>, $<a href="postconf.5.html#mydestination">mydestination</a>, $<a href="postconf.5.html#inet_interfaces">inet_interfaces</a> or $<a href="postconf.5.html#proxy_interfaces">proxy_interfaces</a>. equals $<a href="postconf.5.html#myorigin">myorigin</a>, $<a href="postconf.5.html#mydestination">mydestination</a>, $<a href="postconf.5.html#inet_interfaces">inet_interfaces</a> or $<a href="postconf.5.html#proxy_interfaces">proxy_interfaces</a>.
<li> Look up the "@domain.tld" part. <li> Look up the "@domain.tld" part.
@@ -6224,18 +6224,27 @@ a restriction list, to make the default policy explicit.</dd>
<dd>Reject the request when the envelope sender is the null address, <dd>Reject the request when the envelope sender is the null address,
and the message has multiple envelope recipients. Although this and the message has multiple envelope recipients. Although this
usage is technically allowed, it seems to have no legitimate usage is technically allowed, it seems to have no legitimate
application. <br> The <a href="postconf.5.html#multi_recipient_bounce_reject_code">multi_recipient_bounce_reject_code</a> parameter application. <br> NOTE: this restriction can only work reliably
specifies the response code for rejected requests (default: 550). when used in <a href="postconf.5.html#smtpd_data_restrictions">smtpd_data_restrictions</a>, because the total number of
This feature is available in Postfix 2.1 and later. </dd> recipients is not known at an earlier stage of the SMTP conversation.
Use at the RCPT stage will only reject the second etc. recipient.
<br>
The <a href="postconf.5.html#multi_recipient_bounce_reject_code">multi_recipient_bounce_reject_code</a> parameter specifies the
response code for rejected requests (default: 550). This feature
is available in Postfix 2.1 and later. </dd>
<dt><b><a name="reject_unauth_pipelining">reject_unauth_pipelining</a></b></dt> <dt><b><a name="reject_unauth_pipelining">reject_unauth_pipelining</a></b></dt>
<dd>Reject the request when the client sends SMTP commands ahead <dd>Reject the request when the client sends SMTP commands ahead
of time where it is not allowed, or when the client sends SMTP of time where it is not allowed, or when the client sends SMTP
commands ahead of time without knowing that Postfix actually supports commands ahead of time without knowing that Postfix actually supports
SMTP command pipelining. This stops mail from bulk mail software ESMTP command pipelining. This stops mail from bulk mail software
that improperly uses SMTP command pipelining in order to speed up that improperly uses ESMTP command pipelining in order to speed up
deliveries.</dd> deliveries. <br> NOTE: <a href="postconf.5.html#reject_unauth_pipelining">reject_unauth_pipelining</a> is not useful
outside <a href="postconf.5.html#smtpd_data_restrictions">smtpd_data_restrictions</a> when 1) the client uses ESMTP (EHLO
instead of HELO) and 2) with "<a href="postconf.5.html#smtpd_delay_reject">smtpd_delay_reject</a> = yes" (the
default). The use of <a href="postconf.5.html#reject_unauth_pipelining">reject_unauth_pipelining</a> in the other
restriction contexts is therefore not recommended. </dd>
<dt><b><a name="reject">reject</a></b></dt> <dt><b><a name="reject">reject</a></b></dt>

View File

@@ -97,7 +97,7 @@ SCACHE(8) SCACHE(8)
The maximal time-to-live value that the session The maximal time-to-live value that the session
cache server allows. cache server allows.
<b>session_cache_status_update_time (600s)</b> <b><a href="postconf.5.html#session_cache_status_update_time">session_cache_status_update_time</a> (600s)</b>
How frequently the <a href="scache.8.html">scache(8)</a> server logs usage How frequently the <a href="scache.8.html">scache(8)</a> server logs usage
statistics with session cache hit and miss rates statistics with session cache hit and miss rates
for logical destinations and for physical end- for logical destinations and for physical end-

View File

@@ -52,6 +52,19 @@ SYSLIBS=
AR=ar AR=ar
ARFL=rv ARFL=rv
# Ugly function to make our error message more visible among the
# garbage that is output by some versions of make(1).
# By now all shells must have functions.
error() {
# Alas, tput(1) is not portable so we can't use visual effects.
echo "ATTENTION:" 1>&2;
echo "ATTENTION:" $* 1>&2;
echo "ATTENTION:" 1>&2;
exit 1
}
SYSTEM=`(uname -s) 2>/dev/null` SYSTEM=`(uname -s) 2>/dev/null`
RELEASE=`(uname -r) 2>/dev/null` RELEASE=`(uname -r) 2>/dev/null`
VERSION=`(uname -v) 2>/dev/null` VERSION=`(uname -v) 2>/dev/null`
@@ -81,8 +94,7 @@ case "$SYSTEM.$RELEASE" in
RANLIB=echo RANLIB=echo
SYSLIBS="-lresolv -lsocket -lnsl -lc -L/usr/ucblib -lucb" SYSLIBS="-lresolv -lsocket -lnsl -lc -L/usr/ucblib -lucb"
;; ;;
*) echo "Seems to be UnixWare`uname -v`. Untested." 1>&2; *) error "Seems to be UnixWare`uname -v`. Untested.";;
exit 1;;
esac esac
;; ;;
FreeBSD.2*) SYSTYPE=FREEBSD2 FreeBSD.2*) SYSTYPE=FREEBSD2
@@ -135,12 +147,12 @@ case "$SYSTEM.$RELEASE" in
STRCASE="strcasecmp.o" STRCASE="strcasecmp.o"
# Avoid common types of braindamage # Avoid common types of braindamage
case "$LD_LIBRARY_PATH" in case "$LD_LIBRARY_PATH" in
?*) echo "Don't set LD_LIBRARY_PATH" 1>&2; exit 1;; ?*) error "Don't set LD_LIBRARY_PATH";;
esac esac
case "$CC" in case "${CC}" in
*ucb*) echo "Don't use /usr/ucb/cc or ucblib" 1>&2; exit 1;; *ucb*) error "Don't use /usr/ucb/cc or ucblib";;
cc*) case `which cc` in cc*) case `which ${CC}` in
*ucb*) echo "Don't use /usr/ucb/cc or ucblib" 1>&2; exit 1;; *ucb*) error "Don't use /usr/ucb/cc or ucblib";;
esac;; esac;;
esac esac
;; ;;
@@ -179,7 +191,7 @@ case "$SYSTEM.$RELEASE" in
esac esac
CCARGS="$CCARGS -D_ALL_SOURCE" CCARGS="$CCARGS -D_ALL_SOURCE"
;; ;;
*) echo "Unknown AIX version: `uname -v`." 1>&2; exit 1;; *) error "Unknown AIX version: `uname -v`.";;
esac;; esac;;
# Tested with RedHat 3.03 on 20020729. # Tested with RedHat 3.03 on 20020729.
Linux.1*) SYSTYPE=LINUX1 Linux.1*) SYSTYPE=LINUX1
@@ -297,10 +309,10 @@ Rhapsody.5*|Darwin.*)
: ${CC=cc} : ${CC=cc}
RANLIB="sleep 5; ranlib" RANLIB="sleep 5; ranlib"
else else
echo "Unable to determine your system type." 1>&2; exit 1 error "Unable to determine your system type."
fi fi
;; ;;
*) echo "Unknown system type: $SYSTEM $RELEASE" 1>&2; exit 1;; *) error "Unknown system type: $SYSTEM $RELEASE";;
esac esac
# #
@@ -327,7 +339,7 @@ case "$CC" in
*/gcc|gcc) case `$CC -v` in */gcc|gcc) case `$CC -v` in
"gcc version 2.8"*) : ${OPT=};; "gcc version 2.8"*) : ${OPT=};;
esac;; esac;;
*CC) echo "Don't use CC. That's the C++ compiler" 1>&2; exit 1;; *CC) error "Don't use CC. That's the C++ compiler";;
*) : ${OPT='-O'};; *) : ${OPT='-O'};;
esac esac

View File

@@ -43,11 +43,6 @@ that are used in SMTP protocol commands). Think Sendmail
rule set \fBS3\fR, if you like. This is controlled with rule set \fBS3\fR, if you like. This is controlled with
the \fBcanonical_classes\fR parameter. the \fBcanonical_classes\fR parameter.
The \fBcanonical\fR mapping affects both message header addresses
(i.e. addresses that appear inside messages) and message envelope
addresses (for example, the addresses that are used in SMTP protocol
commands). Think Sendmail rule set \fBS3\fR, if you like.
Typically, one would use the \fBcanonical\fR table to replace login Typically, one would use the \fBcanonical\fR table to replace login
names by \fIFirstname.Lastname\fR, or to clean up addresses produced names by \fIFirstname.Lastname\fR, or to clean up addresses produced
by legacy mail systems. by legacy mail systems.

View File

@@ -2619,10 +2619,10 @@ Look up the "user@domain.tld" address without the optional
address extension. address extension.
.IP \(bu .IP \(bu
Look up the "user+extension" address local part when the Look up the "user+extension" address local part when the
recipient domain equals $myorigin, $mydestination, $inet_interfaces sender domain equals $myorigin, $mydestination, $inet_interfaces
or $proxy_interfaces. or $proxy_interfaces.
.IP \(bu .IP \(bu
Look up the "user" address local part when the recipient domain Look up the "user" address local part when the sender domain
equals $myorigin, $mydestination, $inet_interfaces or $proxy_interfaces. equals $myorigin, $mydestination, $inet_interfaces or $proxy_interfaces.
.IP \(bu .IP \(bu
Look up the "@domain.tld" part. Look up the "@domain.tld" part.
@@ -3286,16 +3286,27 @@ and the message has multiple envelope recipients. Although this
usage is technically allowed, it seems to have no legitimate usage is technically allowed, it seems to have no legitimate
application. application.
.br .br
The multi_recipient_bounce_reject_code parameter NOTE: this restriction can only work reliably
specifies the response code for rejected requests (default: 550). when used in smtpd_data_restrictions, because the total number of
This feature is available in Postfix 2.1 and later. recipients is not known at an earlier stage of the SMTP conversation.
Use at the RCPT stage will only reject the second etc. recipient.
.br
The multi_recipient_bounce_reject_code parameter specifies the
response code for rejected requests (default: 550). This feature
is available in Postfix 2.1 and later.
.IP "\fBreject_unauth_pipelining\fR" .IP "\fBreject_unauth_pipelining\fR"
Reject the request when the client sends SMTP commands ahead Reject the request when the client sends SMTP commands ahead
of time where it is not allowed, or when the client sends SMTP of time where it is not allowed, or when the client sends SMTP
commands ahead of time without knowing that Postfix actually supports commands ahead of time without knowing that Postfix actually supports
SMTP command pipelining. This stops mail from bulk mail software ESMTP command pipelining. This stops mail from bulk mail software
that improperly uses SMTP command pipelining in order to speed up that improperly uses ESMTP command pipelining in order to speed up
deliveries. deliveries.
.br
NOTE: reject_unauth_pipelining is not useful
outside smtpd_data_restrictions when 1) the client uses ESMTP (EHLO
instead of HELO) and 2) with "smtpd_delay_reject = yes" (the
default). The use of reject_unauth_pipelining in the other
restriction contexts is therefore not recommended.
.IP "\fBreject\fR" .IP "\fBreject\fR"
Reject the request. This restriction is useful at the end of Reject the request. This restriction is useful at the end of
a restriction list, to make the default policy explicit. The a restriction list, to make the default policy explicit. The

View File

@@ -298,6 +298,7 @@ while (<>) {
s;\bsetgid_group\b;<a href="postconf.5.html#setgid_group">$&</a>;g; s;\bsetgid_group\b;<a href="postconf.5.html#setgid_group">$&</a>;g;
s;\bsession_cache_service\b;<a href="postconf.5.html#session_cache_service">$&</a>;g; s;\bsession_cache_service\b;<a href="postconf.5.html#session_cache_service">$&</a>;g;
s;\bsession_cache_status_update_time\b;<a href="postconf.5.html#session_cache_status_update_time">$&</a>;g;
s;\bsession_cache_ttl_limit\b;<a href="postconf.5.html#session_cache_ttl_limit">$&</a>;g; s;\bsession_cache_ttl_limit\b;<a href="postconf.5.html#session_cache_ttl_limit">$&</a>;g;
s;\bshow_user_unknown_table_name\b;<a href="postconf.5.html#show_user_unknown_table_name">$&</a>;g; s;\bshow_user_unknown_table_name\b;<a href="postconf.5.html#show_user_unknown_table_name">$&</a>;g;

View File

@@ -37,11 +37,6 @@
# rule set \fBS3\fR, if you like. This is controlled with # rule set \fBS3\fR, if you like. This is controlled with
# the \fBcanonical_classes\fR parameter. # the \fBcanonical_classes\fR parameter.
# #
# The \fBcanonical\fR mapping affects both message header addresses
# (i.e. addresses that appear inside messages) and message envelope
# addresses (for example, the addresses that are used in SMTP protocol
# commands). Think Sendmail rule set \fBS3\fR, if you like.
#
# Typically, one would use the \fBcanonical\fR table to replace login # Typically, one would use the \fBcanonical\fR table to replace login
# names by \fIFirstname.Lastname\fR, or to clean up addresses produced # names by \fIFirstname.Lastname\fR, or to clean up addresses produced
# by legacy mail systems. # by legacy mail systems.

View File

@@ -3142,10 +3142,10 @@ optional address extension.
address extension. address extension.
<li> Look up the "user+extension" address local part when the <li> Look up the "user+extension" address local part when the
recipient domain equals $myorigin, $mydestination, $inet_interfaces sender domain equals $myorigin, $mydestination, $inet_interfaces
or $proxy_interfaces. or $proxy_interfaces.
<li> Look up the "user" address local part when the recipient domain <li> Look up the "user" address local part when the sender domain
equals $myorigin, $mydestination, $inet_interfaces or $proxy_interfaces. equals $myorigin, $mydestination, $inet_interfaces or $proxy_interfaces.
<li> Look up the "@domain.tld" part. <li> Look up the "@domain.tld" part.
@@ -4124,18 +4124,27 @@ a restriction list, to make the default policy explicit.</dd>
<dd>Reject the request when the envelope sender is the null address, <dd>Reject the request when the envelope sender is the null address,
and the message has multiple envelope recipients. Although this and the message has multiple envelope recipients. Although this
usage is technically allowed, it seems to have no legitimate usage is technically allowed, it seems to have no legitimate
application. <br> The multi_recipient_bounce_reject_code parameter application. <br> NOTE: this restriction can only work reliably
specifies the response code for rejected requests (default: 550). when used in smtpd_data_restrictions, because the total number of
This feature is available in Postfix 2.1 and later. </dd> recipients is not known at an earlier stage of the SMTP conversation.
Use at the RCPT stage will only reject the second etc. recipient.
<br>
The multi_recipient_bounce_reject_code parameter specifies the
response code for rejected requests (default: 550). This feature
is available in Postfix 2.1 and later. </dd>
<dt><b><a name="reject_unauth_pipelining">reject_unauth_pipelining</a></b></dt> <dt><b><a name="reject_unauth_pipelining">reject_unauth_pipelining</a></b></dt>
<dd>Reject the request when the client sends SMTP commands ahead <dd>Reject the request when the client sends SMTP commands ahead
of time where it is not allowed, or when the client sends SMTP of time where it is not allowed, or when the client sends SMTP
commands ahead of time without knowing that Postfix actually supports commands ahead of time without knowing that Postfix actually supports
SMTP command pipelining. This stops mail from bulk mail software ESMTP command pipelining. This stops mail from bulk mail software
that improperly uses SMTP command pipelining in order to speed up that improperly uses ESMTP command pipelining in order to speed up
deliveries.</dd> deliveries. <br> NOTE: reject_unauth_pipelining is not useful
outside smtpd_data_restrictions when 1) the client uses ESMTP (EHLO
instead of HELO) and 2) with "smtpd_delay_reject = yes" (the
default). The use of reject_unauth_pipelining in the other
restriction contexts is therefore not recommended. </dd>
<dt><b><a name="reject">reject</a></b></dt> <dt><b><a name="reject">reject</a></b></dt>

View File

@@ -345,12 +345,10 @@ BOUNCE_INFO *bounce_mail_one_init(const char *queue_name,
* Initialize the bounce_info structure. Forge a logfile record for just * Initialize the bounce_info structure. Forge a logfile record for just
* one recipient. * one recipient.
*/ */
#define REALLY_BOUNCE 1
log_handle = bounce_log_forge(orig_recipient, recipient, offset, dsn_status, log_handle = bounce_log_forge(orig_recipient, recipient, offset, dsn_status,
dsn_action, why); dsn_action, why);
bounce_info = bounce_mail_alloc("none", queue_name, queue_id, bounce_info = bounce_mail_alloc("none", queue_name, queue_id,
encoding, REALLY_BOUNCE, log_handle); encoding, BOUNCE_MSG_FAIL, log_handle);
return (bounce_info); return (bounce_info);
} }

View File

@@ -20,7 +20,7 @@
* Patches change the patchlevel and the release date. Snapshots change the * Patches change the patchlevel and the release date. Snapshots change the
* release date only. * release date only.
*/ */
#define MAIL_RELEASE_DATE "20040829" #define MAIL_RELEASE_DATE "20040917"
#define MAIL_VERSION_NUMBER "2.2" #define MAIL_VERSION_NUMBER "2.2"
#define VAR_MAIL_VERSION "mail_version" #define VAR_MAIL_VERSION "mail_version"

View File

@@ -6,6 +6,18 @@
/* SYNOPSIS /* SYNOPSIS
/* #include <scache.h> /* #include <scache.h>
/* DESCRIPTION /* DESCRIPTION
/* typedef struct {
/* .in +4
/* int dest_count;
/* int endp_count;
/* int sess_count;
/* .in -4
/* } SCACHE_SIZE;
/*
/* unsigned scache_size(scache, size)
/* SCACHE *scache;
/* SCACHE_SIZE *size;
/*
/* void scache_free(scache) /* void scache_free(scache)
/* SCACHE *scache; /* SCACHE *scache;
/* /*
@@ -51,6 +63,9 @@
/* endpoints, and one physical endpoint may have multiple /* endpoints, and one physical endpoint may have multiple
/* sessions. /* sessions.
/* /*
/* scache_size() returns the number of logical destination
/* names, physical endpoint addresses, and cached sessions.
/*
/* scache_free() destroys the specified session cache. /* scache_free() destroys the specified session cache.
/* /*
/* scache_save_endp() stores an open session under the specified /* scache_save_endp() stores an open session under the specified

View File

@@ -17,6 +17,7 @@
#include <vstring.h> #include <vstring.h>
typedef struct SCACHE SCACHE; typedef struct SCACHE SCACHE;
typedef struct SCACHE_SIZE SCACHE_SIZE;
/* /*
* In order to cache a session, we specify: * In order to cache a session, we specify:
@@ -85,6 +86,16 @@ typedef int (*SCACHE_FIND_ENDP_FN) (SCACHE *, const char *, VSTRING *);
typedef void (*SCACHE_SAVE_DEST_FN) (SCACHE *, int, const char *, const char *, const char *); typedef void (*SCACHE_SAVE_DEST_FN) (SCACHE *, int, const char *, const char *, const char *);
typedef int (*SCACHE_FIND_DEST_FN) (SCACHE *, const char *, VSTRING *, VSTRING *); typedef int (*SCACHE_FIND_DEST_FN) (SCACHE *, const char *, VSTRING *, VSTRING *);
/*
* Session cache statistics. These are the actual numbers at a specific
* point in time.
*/
struct SCACHE_SIZE {
int dest_count; /* Nr of destination names */
int endp_count; /* Nr of endpoint adresses */
int sess_count; /* Nr of cached sessions */
};
/* /*
* Generic session cache object. Actual session cache objects are derived * Generic session cache object. Actual session cache objects are derived
* types with some additional, cache dependent, private information. * types with some additional, cache dependent, private information.
@@ -94,6 +105,7 @@ struct SCACHE {
SCACHE_FIND_ENDP_FN find_endp; SCACHE_FIND_ENDP_FN find_endp;
SCACHE_SAVE_DEST_FN save_dest; SCACHE_SAVE_DEST_FN save_dest;
SCACHE_FIND_DEST_FN find_dest; SCACHE_FIND_DEST_FN find_dest;
void (*size) (struct SCACHE *, SCACHE_SIZE *);
void (*free) (struct SCACHE *); void (*free) (struct SCACHE *);
}; };
@@ -109,6 +121,7 @@ extern SCACHE *scache_multi_create(void);
(scache)->save_dest((scache), (ttl), (dest_label), (dest_prop), (endp_label)) (scache)->save_dest((scache), (ttl), (dest_label), (dest_prop), (endp_label))
#define scache_find_dest(scache, dest_label, dest_prop, endp_prop) \ #define scache_find_dest(scache, dest_label, dest_prop, endp_prop) \
(scache)->find_dest((scache), (dest_label), (dest_prop), (endp_prop)) (scache)->find_dest((scache), (dest_label), (dest_prop), (endp_prop))
#define scache_size(scache, stats) (scache)->size((scache), (stats))
#define scache_free(scache) (scache)->free(scache) #define scache_free(scache) (scache)->free(scache)
/* /*

View File

@@ -306,6 +306,16 @@ static int scache_clnt_find_dest(SCACHE *scache, const char *dest_label,
return (-1); return (-1);
} }
/* scache_clnt_size - dummy */
static void scache_clnt_size(SCACHE *scache, SCACHE_SIZE *size)
{
/* XXX Crap in a hurry. */
size->dest_count = 0;
size->endp_count = 0;
size->sess_count = 0;
}
/* scache_clnt_free - destroy cache */ /* scache_clnt_free - destroy cache */
static void scache_clnt_free(SCACHE *scache) static void scache_clnt_free(SCACHE *scache)
@@ -329,6 +339,7 @@ SCACHE *scache_clnt_create(const char *server, int idle_limit, int ttl_limit)
sp->scache->find_endp = scache_clnt_find_endp; sp->scache->find_endp = scache_clnt_find_endp;
sp->scache->save_dest = scache_clnt_save_dest; sp->scache->save_dest = scache_clnt_save_dest;
sp->scache->find_dest = scache_clnt_find_dest; sp->scache->find_dest = scache_clnt_find_dest;
sp->scache->size = scache_clnt_size;
sp->scache->free = scache_clnt_free; sp->scache->free = scache_clnt_free;
sp->clnt_stream = clnt_stream_create(MAIL_CLASS_PRIVATE, server, sp->clnt_stream = clnt_stream_create(MAIL_CLASS_PRIVATE, server,

View File

@@ -75,18 +75,18 @@ typedef struct {
SCACHE scache[1]; /* super-class */ SCACHE scache[1]; /* super-class */
HTABLE *dest_cache; /* destination->endpoint bindings */ HTABLE *dest_cache; /* destination->endpoint bindings */
HTABLE *endp_cache; /* endpoint->session bindings */ HTABLE *endp_cache; /* endpoint->session bindings */
int sess_count; /* number of cached sessions */
} SCACHE_MULTI; } SCACHE_MULTI;
/* /*
* Storage for a destination or endpoint list head. The list head has * Storage for a destination or endpoint list head. Each list head knows its
* references to its own hash table entry, so that we can remove a list when * own hash table entry name, so that we can remove the list when it becomes
* it becomes empty. List items are stored in a circular list under the list * empty. List items are stored in a circular list under the list head.
* head.
*/ */
typedef struct { typedef struct {
RING ring[1]; /* circular list linkage */ RING ring[1]; /* circular list linkage */
HTABLE *parent_table; /* parent info */ char *parent_key; /* parent linkage: hash table */
char *parent_key; /* parent info */ SCACHE_MULTI *cache; /* parent linkage: cache */
} SCACHE_MULTI_HEAD; } SCACHE_MULTI_HEAD;
#define RING_TO_MULTI_HEAD(p) RING_TO_APPL((p), SCACHE_MULTI_HEAD, ring) #define RING_TO_MULTI_HEAD(p) RING_TO_APPL((p), SCACHE_MULTI_HEAD, ring)
@@ -97,6 +97,7 @@ typedef struct {
*/ */
typedef struct { typedef struct {
RING ring[1]; /* circular list linkage */ RING ring[1]; /* circular list linkage */
SCACHE_MULTI_HEAD *head; /* parent linkage: list head */
char *endp_label; /* endpoint name */ char *endp_label; /* endpoint name */
char *dest_prop; /* binding properties */ char *dest_prop; /* binding properties */
} SCACHE_MULTI_DEST; } SCACHE_MULTI_DEST;
@@ -111,6 +112,7 @@ static void scache_multi_expire_dest(int, char *);
*/ */
typedef struct { typedef struct {
RING ring[1]; /* circular list linkage */ RING ring[1]; /* circular list linkage */
SCACHE_MULTI_HEAD *head; /* parent linkage: list head */
int fd; /* cached session */ int fd; /* cached session */
char *endp_prop; /* binding properties */ char *endp_prop; /* binding properties */
} SCACHE_MULTI_ENDP; } SCACHE_MULTI_ENDP;
@@ -149,12 +151,11 @@ static void scache_multi_drop_endp(SCACHE_MULTI_ENDP *endp, int direction)
* the list becomes empty. Otherwise, remove the endpoint->session * the list becomes empty. Otherwise, remove the endpoint->session
* binding from the list. * binding from the list.
*/ */
if (direction == BOTTOM_UP ring_detach(endp->ring);
&& ring_pred(endp->ring) == ring_succ(endp->ring)) { head = endp->head;
head = RING_TO_MULTI_HEAD(ring_pred(endp->ring)); head->cache->sess_count--;
htable_delete(head->parent_table, head->parent_key, myfree); if (direction == BOTTOM_UP && ring_pred(head->ring) == head->ring)
} else htable_delete(head->cache->endp_cache, head->parent_key, myfree);
ring_detach(endp->ring);
/* /*
* Destroy the endpoint->session binding. * Destroy the endpoint->session binding.
@@ -215,9 +216,9 @@ static void scache_multi_save_endp(SCACHE *scache, int ttl,
htable_find(sp->endp_cache, endp_label)) == 0) { htable_find(sp->endp_cache, endp_label)) == 0) {
head = (SCACHE_MULTI_HEAD *) mymalloc(sizeof(*head)); head = (SCACHE_MULTI_HEAD *) mymalloc(sizeof(*head));
ring_init(head->ring); ring_init(head->ring);
head->parent_table = sp->endp_cache;
head->parent_key = head->parent_key =
htable_enter(sp->endp_cache, endp_label, (char *) head)->key; htable_enter(sp->endp_cache, endp_label, (char *) head)->key;
head->cache = sp;
} }
/* /*
@@ -225,9 +226,11 @@ static void scache_multi_save_endp(SCACHE *scache, int ttl,
* duplicate, because each session must have a different file descriptor. * duplicate, because each session must have a different file descriptor.
*/ */
endp = (SCACHE_MULTI_ENDP *) mymalloc(sizeof(*endp)); endp = (SCACHE_MULTI_ENDP *) mymalloc(sizeof(*endp));
endp->head = head;
endp->fd = fd; endp->fd = fd;
endp->endp_prop = mystrdup(endp_prop); endp->endp_prop = mystrdup(endp_prop);
ring_prepend(head->ring, endp->ring); ring_prepend(head->ring, endp->ring);
sp->sess_count++;
/* /*
* Make sure this binding will go away eventually. * Make sure this binding will go away eventually.
@@ -303,12 +306,10 @@ static void scache_multi_drop_dest(SCACHE_MULTI_DEST *dest, int direction)
* the list becomes empty. Otherwise, remove the destination->endpoint * the list becomes empty. Otherwise, remove the destination->endpoint
* binding from the list. * binding from the list.
*/ */
if (direction == BOTTOM_UP ring_detach(dest->ring);
&& ring_pred(dest->ring) == ring_succ(dest->ring)) { head = dest->head;
head = RING_TO_MULTI_HEAD(ring_pred(dest->ring)); if (direction == BOTTOM_UP && ring_pred(head->ring) == head->ring)
htable_delete(head->parent_table, head->parent_key, myfree); htable_delete(head->cache->dest_cache, head->parent_key, myfree);
} else
ring_detach(dest->ring);
/* /*
* Destroy the destination->endpoint binding. * Destroy the destination->endpoint binding.
@@ -371,9 +372,9 @@ static void scache_multi_save_dest(SCACHE *scache, int ttl,
htable_find(sp->dest_cache, dest_label)) == 0) { htable_find(sp->dest_cache, dest_label)) == 0) {
head = (SCACHE_MULTI_HEAD *) mymalloc(sizeof(*head)); head = (SCACHE_MULTI_HEAD *) mymalloc(sizeof(*head));
ring_init(head->ring); ring_init(head->ring);
head->parent_table = sp->dest_cache;
head->parent_key = head->parent_key =
htable_enter(sp->dest_cache, dest_label, (char *) head)->key; htable_enter(sp->dest_cache, dest_label, (char *) head)->key;
head->cache = sp;
} }
/* /*
@@ -390,6 +391,7 @@ static void scache_multi_save_dest(SCACHE *scache, int ttl,
} }
if (refresh == 0) { if (refresh == 0) {
dest = (SCACHE_MULTI_DEST *) mymalloc(sizeof(*dest)); dest = (SCACHE_MULTI_DEST *) mymalloc(sizeof(*dest));
dest->head = head;
dest->endp_label = mystrdup(endp_label); dest->endp_label = mystrdup(endp_label);
dest->dest_prop = mystrdup(dest_prop); dest->dest_prop = mystrdup(dest_prop);
ring_prepend(head->ring, dest->ring); ring_prepend(head->ring, dest->ring);
@@ -446,7 +448,18 @@ static int scache_multi_find_dest(SCACHE *scache, const char *dest_label,
return (-1); return (-1);
} }
/* scache_multi_free - destroy single-element cache object */ /* scache_multi_size - size of multi-element cache object */
static void scache_multi_size(SCACHE *scache, SCACHE_SIZE *size)
{
SCACHE_MULTI *sp = (SCACHE_MULTI *) scache;
size->dest_count = sp->dest_cache->used;
size->endp_count = sp->endp_cache->used;
size->sess_count = sp->sess_count;
}
/* scache_multi_free - destroy multi-element cache object */
static void scache_multi_free(SCACHE *scache) static void scache_multi_free(SCACHE *scache)
{ {
@@ -468,10 +481,12 @@ SCACHE *scache_multi_create(void)
sp->scache->find_endp = scache_multi_find_endp; sp->scache->find_endp = scache_multi_find_endp;
sp->scache->save_dest = scache_multi_save_dest; sp->scache->save_dest = scache_multi_save_dest;
sp->scache->find_dest = scache_multi_find_dest; sp->scache->find_dest = scache_multi_find_dest;
sp->scache->size = scache_multi_size;
sp->scache->free = scache_multi_free; sp->scache->free = scache_multi_free;
sp->dest_cache = htable_create(1); sp->dest_cache = htable_create(1);
sp->endp_cache = htable_create(1); sp->endp_cache = htable_create(1);
sp->sess_count = 0;
return (sp->scache); return (sp->scache);
} }

View File

@@ -6,96 +6,47 @@
>>> # Destination name space collision test >>> # Destination name space collision test
>>> >>>
>>> save_dest 2 a_dest a_prop b_endp >>> save_dest 2 a_dest a_prop b_endp
unknown: scache_multi_save_dest: dest_label=a_dest -> dest_prop=a_prop endp_label=b_endp
>>> sleep 1 >>> sleep 1
>>> save_dest 2 a_dest a_prop b_endp >>> save_dest 2 a_dest a_prop b_endp
unknown: scache_multi_save_dest: dest_label=a_dest -> dest_prop=a_prop endp_label=b_endp (refreshed)
>>> sleep 1 >>> sleep 1
>>> save_dest 2 a_dest a_prop b_endp >>> save_dest 2 a_dest a_prop b_endp
unknown: scache_multi_save_dest: dest_label=a_dest -> dest_prop=a_prop endp_label=b_endp (refreshed)
>>> sleep 2 >>> sleep 2
unknown: scache_multi_drop_dest: dest_prop=a_prop endp_label=b_endp
>>> >>>
>>> # Another destination name space collision test >>> # Another destination name space collision test
>>> >>>
>>> save_dest 2 a_dest a_prop b_endp >>> save_dest 2 a_dest a_prop b_endp
unknown: scache_multi_save_dest: dest_label=a_dest -> dest_prop=a_prop endp_label=b_endp
>>> sleep 1 >>> sleep 1
>>> save_dest 2 a_dest a_prop2 b_endp >>> save_dest 2 a_dest a_prop2 b_endp
unknown: scache_multi_save_dest: dest_label=a_dest -> dest_prop=a_prop2 endp_label=b_endp
>>> sleep 1 >>> sleep 1
unknown: scache_multi_drop_dest: dest_prop=a_prop endp_label=b_endp
>>> save_dest 2 a_dest a_prop2 b_endp2 >>> save_dest 2 a_dest a_prop2 b_endp2
unknown: scache_multi_save_dest: dest_label=a_dest -> dest_prop=a_prop2 endp_label=b_endp2
>>> sleep 2 >>> sleep 2
unknown: scache_multi_drop_dest: dest_prop=a_prop2 endp_label=b_endp
unknown: scache_multi_drop_dest: dest_prop=a_prop2 endp_label=b_endp2
>>> >>>
>>> # Endpoint name space collision test >>> # Endpoint name space collision test
>>> >>>
>>> save_endp 2 b_endp b_prop 12 >>> save_endp 2 b_endp b_prop 12
unknown: scache_multi_save_endp: endp_label=b_endp -> endp_prop=b_prop fd=12
>>> save_endp 2 b_endp b_prop 13 >>> save_endp 2 b_endp b_prop 13
unknown: scache_multi_save_endp: endp_label=b_endp -> endp_prop=b_prop fd=13
>>> sleep 3 >>> sleep 3
unknown: scache_multi_drop_endp: endp_prop=b_prop fd=12
unknown: scache_multi_drop_endp: endp_prop=b_prop fd=13
>>> >>>
>>> # Combined destiation and endpoint collision test with lookup >>> # Combined destiation and endpoint collision test with lookup
>>> >>>
>>> save_dest 2 a_dest a_prop b_endp >>> save_dest 2 a_dest a_prop b_endp
unknown: scache_multi_save_dest: dest_label=a_dest -> dest_prop=a_prop endp_label=b_endp
>>> save_dest 2 a_dest a_prop2 b_endp >>> save_dest 2 a_dest a_prop2 b_endp
unknown: scache_multi_save_dest: dest_label=a_dest -> dest_prop=a_prop2 endp_label=b_endp
>>> save_dest 2 a_dest a_prop2 b_endp2 >>> save_dest 2 a_dest a_prop2 b_endp2
unknown: scache_multi_save_dest: dest_label=a_dest -> dest_prop=a_prop2 endp_label=b_endp2
>>> save_endp 2 b_endp b_prop 12 >>> save_endp 2 b_endp b_prop 12
unknown: scache_multi_save_endp: endp_label=b_endp -> endp_prop=b_prop fd=12
>>> save_endp 2 b_endp b_prop 13 >>> save_endp 2 b_endp b_prop 13
unknown: scache_multi_save_endp: endp_label=b_endp -> endp_prop=b_prop fd=13
>>> find_dest a_dest >>> find_dest a_dest
unknown: scache_multi_find_endp: found: endp_label=b_endp -> endp_prop=b_prop fd=12
unknown: scache_multi_drop_endp: endp_prop=b_prop fd=-1
>>> find_dest a_dest >>> find_dest a_dest
unknown: scache_multi_find_endp: found: endp_label=b_endp -> endp_prop=b_prop fd=13
unknown: scache_multi_drop_endp: endp_prop=b_prop fd=-1
>>> find_dest a_dest >>> find_dest a_dest
unknown: scache_multi_find_endp: no endpoint cache: endp_label=b_endp
unknown: scache_multi_find_endp: no endpoint cache: endp_label=b_endp
unknown: scache_multi_find_endp: no endpoint cache: endp_label=b_endp2
unknown: scache_multi_find_dest: not found: dest_label=a_dest
>>> >>>
>>> # Another combined destiation and endpoint collision test with lookup >>> # Another combined destiation and endpoint collision test with lookup
>>> >>>
>>> save_endp 2 b_endp2 b_prop 12 >>> save_endp 2 b_endp2 b_prop 12
unknown: scache_multi_save_endp: endp_label=b_endp2 -> endp_prop=b_prop fd=12
>>> save_endp 2 b_endp2 b_prop 13 >>> save_endp 2 b_endp2 b_prop 13
unknown: scache_multi_save_endp: endp_label=b_endp2 -> endp_prop=b_prop fd=13
>>> save_endp 2 b_endp2 b_prop 14 >>> save_endp 2 b_endp2 b_prop 14
unknown: scache_multi_save_endp: endp_label=b_endp2 -> endp_prop=b_prop fd=14
>>> find_dest a_dest >>> find_dest a_dest
unknown: scache_multi_find_endp: no endpoint cache: endp_label=b_endp
unknown: scache_multi_find_endp: no endpoint cache: endp_label=b_endp
unknown: scache_multi_find_endp: found: endp_label=b_endp2 -> endp_prop=b_prop fd=12
unknown: scache_multi_drop_endp: endp_prop=b_prop fd=-1
>>> find_dest a_dest >>> find_dest a_dest
unknown: scache_multi_find_endp: no endpoint cache: endp_label=b_endp
unknown: scache_multi_find_endp: no endpoint cache: endp_label=b_endp
unknown: scache_multi_find_endp: found: endp_label=b_endp2 -> endp_prop=b_prop fd=13
unknown: scache_multi_drop_endp: endp_prop=b_prop fd=-1
>>> find_dest a_dest >>> find_dest a_dest
unknown: scache_multi_find_endp: no endpoint cache: endp_label=b_endp
unknown: scache_multi_find_endp: no endpoint cache: endp_label=b_endp
unknown: scache_multi_find_endp: found: endp_label=b_endp2 -> endp_prop=b_prop fd=14
unknown: scache_multi_drop_endp: endp_prop=b_prop fd=-1
>>> find_dest a_dest >>> find_dest a_dest
unknown: scache_multi_find_endp: no endpoint cache: endp_label=b_endp
unknown: scache_multi_find_endp: no endpoint cache: endp_label=b_endp
unknown: scache_multi_find_endp: no endpoint cache: endp_label=b_endp2
unknown: scache_multi_find_dest: not found: dest_label=a_dest
>>> >>>
>>> # Let the exit handler clean up the destiation->endpoint bindings. >>> # Let the exit handler clean up the destiation->endpoint bindings.
>>> >>>
unknown: scache_multi_drop_dest: dest_prop=a_prop endp_label=b_endp
unknown: scache_multi_drop_dest: dest_prop=a_prop2 endp_label=b_endp
unknown: scache_multi_drop_dest: dest_prop=a_prop2 endp_label=b_endp2

View File

@@ -257,6 +257,17 @@ static int scache_single_find_dest(SCACHE *scache, const char *dest_label,
return (-1); return (-1);
} }
/* scache_single_size - size of single-element cache :-) */
static void scache_single_size(SCACHE *scache, SCACHE_SIZE *size)
{
SCACHE_SINGLE *sp = (SCACHE_SINGLE *) scache;
size->dest_count = (!SCACHE_SINGLE_DEST_BUSY(sp) ? 0 : 1);
size->endp_count = (!SCACHE_SINGLE_ENDP_BUSY(sp) ? 0 : 1);
size->sess_count = (sp->endp.fd < 0 ? 0 : 1);
}
/* scache_single_free - destroy single-element cache object */ /* scache_single_free - destroy single-element cache object */
static void scache_single_free(SCACHE *scache) static void scache_single_free(SCACHE *scache)
@@ -285,6 +296,7 @@ SCACHE *scache_single_create(void)
sp->scache->find_endp = scache_single_find_endp; sp->scache->find_endp = scache_single_find_endp;
sp->scache->save_dest = scache_single_save_dest; sp->scache->save_dest = scache_single_save_dest;
sp->scache->find_dest = scache_single_find_dest; sp->scache->find_dest = scache_single_find_dest;
sp->scache->size = scache_single_size;
sp->scache->free = scache_single_free; sp->scache->free = scache_single_free;
sp->endp.endp_label = vstring_alloc(10); sp->endp.endp_label = vstring_alloc(10);

View File

@@ -186,8 +186,11 @@ static SCACHE *scache;
*/ */
static int scache_dest_hits; static int scache_dest_hits;
static int scache_dest_miss; static int scache_dest_miss;
static int scache_dest_count;
static int scache_endp_hits; static int scache_endp_hits;
static int scache_endp_miss; static int scache_endp_miss;
static int scache_endp_count;
static int scache_sess_count;
time_t scache_start_time; time_t scache_start_time;
/* /*
@@ -203,6 +206,7 @@ static void scache_save_endp_service(VSTREAM *client_stream)
const char *myname = "scache_save_endp_service"; const char *myname = "scache_save_endp_service";
int ttl; int ttl;
int fd; int fd;
SCACHE_SIZE size;
if (attr_scan(client_stream, if (attr_scan(client_stream,
ATTR_FLAG_STRICT, ATTR_FLAG_STRICT,
@@ -239,6 +243,11 @@ static void scache_save_endp_service(VSTREAM *client_stream)
attr_print(client_stream, ATTR_FLAG_NONE, attr_print(client_stream, ATTR_FLAG_NONE,
ATTR_TYPE_NUM, MAIL_ATTR_STATUS, SCACHE_STAT_OK, ATTR_TYPE_NUM, MAIL_ATTR_STATUS, SCACHE_STAT_OK,
ATTR_TYPE_END); ATTR_TYPE_END);
scache_size(scache, &size);
if (size.endp_count > scache_endp_count)
scache_endp_count = size.endp_count;
if (size.sess_count > scache_sess_count)
scache_sess_count = size.sess_count;
return; return;
} }
} }
@@ -294,6 +303,7 @@ static void scache_save_dest_service(VSTREAM *client_stream)
{ {
const char *myname = "scache_save_dest_service"; const char *myname = "scache_save_dest_service";
int ttl; int ttl;
SCACHE_SIZE size;
if (attr_scan(client_stream, if (attr_scan(client_stream,
ATTR_FLAG_STRICT, ATTR_FLAG_STRICT,
@@ -316,6 +326,12 @@ static void scache_save_dest_service(VSTREAM *client_stream)
attr_print(client_stream, ATTR_FLAG_NONE, attr_print(client_stream, ATTR_FLAG_NONE,
ATTR_TYPE_NUM, MAIL_ATTR_STATUS, SCACHE_STAT_OK, ATTR_TYPE_NUM, MAIL_ATTR_STATUS, SCACHE_STAT_OK,
ATTR_TYPE_END); ATTR_TYPE_END);
scache_size(scache, &size);
if (size.dest_count > scache_dest_count)
scache_dest_count = size.dest_count;
if (size.endp_count > scache_endp_count)
scache_endp_count = size.endp_count;
return;
return; return;
} }
} }
@@ -414,7 +430,9 @@ static void scache_service(VSTREAM *client_stream, char *unused_service,
static void scache_status_dump(char *unused_name, char **unused_argv) static void scache_status_dump(char *unused_name, char **unused_argv)
{ {
if (scache_dest_hits || scache_dest_miss if (scache_dest_hits || scache_dest_miss
|| scache_endp_hits || scache_endp_miss) || scache_endp_hits || scache_endp_miss
|| scache_dest_count || scache_endp_count
|| scache_sess_count)
msg_info("statistics: start interval %.15s", msg_info("statistics: start interval %.15s",
ctime(&scache_start_time) + 4); ctime(&scache_start_time) + 4);
@@ -432,6 +450,13 @@ static void scache_status_dump(char *unused_name, char **unused_argv)
/ (scache_endp_hits + scache_endp_miss)); / (scache_endp_hits + scache_endp_miss));
scache_endp_hits = scache_endp_miss = 0; scache_endp_hits = scache_endp_miss = 0;
} }
if (scache_dest_count || scache_endp_count || scache_sess_count) {
msg_info("statistics: max simultaneous domains=%d addresses=%d sessions=%d",
scache_dest_count, scache_endp_count, scache_sess_count);
scache_dest_count = 0;
scache_endp_count = 0;
scache_sess_count = 0;
}
scache_start_time = event_time(); scache_start_time = event_time();
} }

View File

@@ -151,7 +151,7 @@ void smtp_save_session(SMTP_STATE *state)
STR(state->dest_prop), STR(state->endp_label)); STR(state->dest_prop), STR(state->endp_label));
/* /*
* Save every good sessions under its physical endpoint address. * Save every good session under its physical endpoint address.
*/ */
scache_save_endp(smtp_scache, var_smtp_cache_conn, STR(state->endp_label), scache_save_endp(smtp_scache, var_smtp_cache_conn, STR(state->endp_label),
STR(state->endp_prop), fd); STR(state->endp_prop), fd);

View File

@@ -911,6 +911,8 @@ extern int h_errno;
*/ */
#include <cpio.h> #include <cpio.h>
#define S_ISSOCK(mode) (((mode) & (S_IFMT)) == (C_ISSOCK)) #define S_ISSOCK(mode) (((mode) & (S_IFMT)) == (C_ISSOCK))
#define CANT_USE_SEND_RECV_MSG
#define DEF_SMTP_CACHE_DEMAND 0
#endif #endif
/* /*