mirror of
https://github.com/vdukhovni/postfix
synced 2025-08-30 13:48:06 +00:00
snapshot-20001029
This commit is contained in:
parent
273b2bb449
commit
0a906a1db4
@ -1,21 +1,68 @@
|
||||
Purpose of this document
|
||||
========================
|
||||
|
||||
This document describes how to build Postfix with Berkeley DB
|
||||
support on systems that ship without DB library. The canonical
|
||||
third-party source for Berkeley DB is www.sleepycat.com.
|
||||
This document describes how to build Postfix with third-party
|
||||
Berkeley DB from www.sleepycat.com, or how to choose a specific
|
||||
Berkeley DB version when your system provides multiple implementations.
|
||||
|
||||
The information can also be used to build Postfix with a non-default
|
||||
Berkeley DB version. However, the file formats of Berkeley DB
|
||||
version 2 and later are not compatible with the older Berkeley DB
|
||||
version that ships with, for example, 4.4BSD.
|
||||
Building Postfix with Sleepycat Berkeley DB
|
||||
===========================================
|
||||
|
||||
Building Postfix with third-party Berkeley DB support
|
||||
=====================================================
|
||||
Many commercial UNIXes ship without Berkeley DB support. Examples
|
||||
are Solaris, HP-UX, IRIX, UNIXWARE. In order to build Postfix with
|
||||
Berkeley DB support you need to download and install the source
|
||||
code from www.sleepycat.com.
|
||||
|
||||
If you installed the Berkeley DB from Sleepycat, use something like:
|
||||
To build Postfix after you installed the Berkeley DB from Sleepycat,
|
||||
use something like:
|
||||
|
||||
% make tidy
|
||||
% make makefiles CCARGS="-DHAS_DB -I/usr/local/BerkeleyDB/include" \
|
||||
AUXLIBS=/usr/local/BerkeleyDB/lib/libdb.a
|
||||
% make makefiles CCARGS="-DHAS_DB -I/usr/local/BerkeleyDB.3.1/include" \
|
||||
AUXLIBS=/usr/local/BerkeleyDB.3.1/lib/libdb.a
|
||||
% make
|
||||
|
||||
The exact pathnames depend on the DB version that you installed.
|
||||
For example, Berkeley DB version 2 installs in /usr/local/BerkeleyDB.
|
||||
|
||||
Beware, the file format produced by Berkeley DB version 1 is not
|
||||
compatible with that of versions 2 and 3 (versions 2 and 3 have
|
||||
the same format). If you switch between DB versions, then you may
|
||||
have to rebuild all your Postfix DB files.
|
||||
|
||||
Building Postfix on BSD systems with a specific Berkeley DB version
|
||||
===================================================================
|
||||
|
||||
Some BSD systems ship with multiple Berkeley DB implementations.
|
||||
Normally, Postfix builds with the default DB version that ships
|
||||
with the system.
|
||||
|
||||
To build Postfix on BSD systems with a specific DB version, use a
|
||||
variant of the following commands:
|
||||
|
||||
% make tidy
|
||||
% make makefiles CCARGS=-I/usr/include/db2 AUXLIBS=-ldb2
|
||||
% make
|
||||
|
||||
Beware, the file format produced by Berkeley DB version 1 is not
|
||||
compatible with that of versions 2 and 3 (versions 2 and 3 have
|
||||
the same format). If you switch between DB versions, then you may
|
||||
have to rebuild all your Postfix DB files.
|
||||
|
||||
Building Postfix on Linux with a specific Berkeley DB version
|
||||
=============================================================
|
||||
|
||||
Some Linux systems systems ship with multiple Berkeley DB
|
||||
implementations. Normally, Postfix builds with the default DB
|
||||
version that ships with the system.
|
||||
|
||||
On Linux, you need to edit the makedefs script in order to specify
|
||||
a non-default DB library.
|
||||
|
||||
The reason is that the location of the default db.h include file
|
||||
changes randomly between vendors and between versions, so that
|
||||
Postfix has to choose the file for you.
|
||||
|
||||
Beware, the file format produced by Berkeley DB version 1 is not
|
||||
compatible with that of versions 2 and 3 (versions 2 and 3 have
|
||||
the same format). If you switch between DB versions, then you may
|
||||
have to rebuild all your Postfix DB files.
|
||||
|
@ -4358,12 +4358,12 @@ Apologies for any names omitted.
|
||||
the [] or host:port syntax, and there was no way to suppress
|
||||
MX record lookups. Files: smtp/smtp_addr.c, smtp/smtp_connect.c.
|
||||
|
||||
Convenience: you can now specify multiple destinations in
|
||||
the relayhost or fallback_relay configuration parameters.
|
||||
Convenience: you can now specify multiple SMTP destinations
|
||||
in the relayhost or fallback_relay configuration parameters.
|
||||
The specified destinations will be tried in the specified
|
||||
order. File: smtp/smtp_connect.c.
|
||||
|
||||
Typographical corrections by Matthias Andree.
|
||||
Many typographical corrections by Matthias Andree.
|
||||
|
||||
20001024
|
||||
|
||||
@ -4380,13 +4380,13 @@ Apologies for any names omitted.
|
||||
|
||||
Horror: postmap and postalias (newaliases) silently lose
|
||||
the file lock while building a lookup table with Berkeley
|
||||
DB 2.x and later on Solaris, HP-UX or IRIX. The result is
|
||||
that table lookups fail while the table is being built, so
|
||||
that mail is lost. In order to avoid this misbehavior one
|
||||
has to use an undocumented feature that is NOT available
|
||||
with the DB1.85 compatibility interface. Therefore, Postfix
|
||||
now supports three Berkeley DB programming interfaces of
|
||||
increasing complexity. File: util/dict_db.c.
|
||||
DB 2.x and later on Solaris, HP-UX, IRIX, and UNIXWARE.
|
||||
The result is that table lookups fail while the table is
|
||||
being built, so that mail is lost. In order to avoid this
|
||||
misbehavior one has to use an undocumented feature that is
|
||||
NOT available with the DB1.85 compatibility interface.
|
||||
Therefore, Postfix now supports three Berkeley DB programming
|
||||
interfaces of increasing complexity. File: util/dict_db.c.
|
||||
|
||||
Bugfix: some character manipulations were not portable for
|
||||
signed/unsigned characters. Files: global/quote_821_local.c,
|
||||
@ -4396,3 +4396,25 @@ Apologies for any names omitted.
|
||||
begins with "From sender time-stamp". Sendmail silently
|
||||
ignores such RFC violating garbage, and therefore Postfix
|
||||
needs to jump another hoop. File: smtpd/smtpd.c.
|
||||
|
||||
20001028
|
||||
|
||||
Bugfix: the flush server tried to access config files after
|
||||
going to the chroot jail. Found by Lutz Jaenicke, TU-Cottbus.DE.
|
||||
File: flush/flush.c.
|
||||
|
||||
Update: revised LDAP module from primary maintainer John
|
||||
Hensley, with contributions from many other people. Files:
|
||||
util/dict_ldap.c, LDAP_README.
|
||||
|
||||
Update: LINUX2 chroot setup script by Matthias Andree,
|
||||
uni-dortmund.de.
|
||||
|
||||
Feature: specify unix:/path/name for LMTP connections over
|
||||
UNIX-domain sockets, and specify inet:host or inet:host:port
|
||||
for IPV4. If no unix: or inet: is specified, IPV4 is assumed.
|
||||
File: lmtp/lmtp_connect.c.
|
||||
|
||||
Feature: added UNIX-domain support to the smtpstone test
|
||||
programs in order to test the LMTP client UNIX-domain
|
||||
support.
|
||||
|
@ -82,10 +82,22 @@ parameter below, "server_host", would be defined in main.cf as
|
||||
substitute for the address Postfix is trying to resolve, e.g.
|
||||
ldapsource_query_filter = (&(mail=%s)(paid_up=true))
|
||||
|
||||
domain (No default; you must configure this.)
|
||||
This is a list of domain names, paths to files, or dictionaries.
|
||||
If specified, only lookups ending in a domain on this list will
|
||||
be searched. This can significantly reduce the query load on the
|
||||
LDAP server.
|
||||
ldapsource_domain = postfix.org, hash:/etc/postfix/searchdomains
|
||||
|
||||
result_attribute (maildrop)
|
||||
The attribute Postfix will read from any directory entries
|
||||
The attribute(s) Postfix will read from any directory entries
|
||||
returned by the lookup, to be resolved to an email address.
|
||||
ldapsource_result_attribute = mailbox
|
||||
ldapsource_result_attribute = mailbox,maildrop
|
||||
|
||||
special_result_attribute (No default)
|
||||
The attribute(s) of directory entries that can contain DNs or URLs.
|
||||
If found, a recursive subsequent search is done using their values.
|
||||
ldapsource_special_result_attribute = member
|
||||
|
||||
scope (sub)
|
||||
The LDAP search scope: sub, base, or one. These translate into
|
||||
@ -147,8 +159,11 @@ configuration routines understand how to deal with quoted strings.
|
||||
EXAMPLES
|
||||
========
|
||||
|
||||
Here's a basic example for using LDAP to look up aliases. In main.cf,
|
||||
you have these configuration parameters defined:
|
||||
ALIASES
|
||||
-------
|
||||
|
||||
Here's a basic example for using LDAP to look up aliases. Assume that in
|
||||
main.cf, you have these configuration parameters defined:
|
||||
|
||||
alias_maps = hash:/etc/aliases, ldap:ldapsource
|
||||
ldapsource_server_host = ldap.my.com
|
||||
@ -162,39 +177,52 @@ read the "maildrop" attributes of those found, and build a list of their
|
||||
maildrops, which will be treated as RFC822 addresses to which the
|
||||
message will be delivered.
|
||||
|
||||
VIRTUAL DOMAINS/ADDRESSES
|
||||
-------------------------
|
||||
|
||||
If you want to keep information for virtual lookups in your directory,
|
||||
it's only a little more complicated. You'll want to make sure all of
|
||||
your virtual mailacceptinggeneralid attributes are fully qualified with
|
||||
their virtual domains. If you want to designate a directory entry as the
|
||||
it's only a little more complicated. First you need to make sure Postfix
|
||||
knows about the virtual domain. An easy way to do that is to add the
|
||||
domain to the mailacceptinggeneralid attribute of some entry in the
|
||||
directory. Next you'll want to make sure all of your virtual recipients'
|
||||
mailacceptinggeneralid attributes are fully qualified with their virtual
|
||||
domains. Finally, if you want to designate a directory entry as the
|
||||
default user for a virtual domain, just give it an additional
|
||||
mailacceptinggeneralid (or the equivalent in your directory) of
|
||||
"@virtual.dom". That's right, no user part.
|
||||
"@virtual.dom". That's right, no user part. If you don't want a catchall
|
||||
user, omit this step and mail to unknown users in the domain will simply
|
||||
bounce.
|
||||
|
||||
If you want to get information for relay_domains out of your directory,
|
||||
the simplest way to get it is to add the domain name (without even the
|
||||
'@') as a mailacceptinggeneralid to some recipient in each domain, then
|
||||
add "$virtual_maps" to your relay_domains line. Then you can use the
|
||||
same map you use to find virtual recipients to determine if a domain is
|
||||
a valid virtual domain and should be allowed to relay.
|
||||
If you're using a version of Postfix newer than 19991226, that should do
|
||||
it. If not, you also need to add your virtual domains to relay_domains.
|
||||
Simply add "$virtual_maps" to your relay_domains line. Then you can use
|
||||
the same map you use to find virtual recipients to determine if a domain
|
||||
is a valid virtual domain and should be allowed to relay.
|
||||
|
||||
For example, the catchall user for a virtual domain might look like
|
||||
this:
|
||||
In summary, you might have a catchall user for a virtual domain that
|
||||
looks like this:
|
||||
|
||||
dn: cn=defaultrecipient, dc=fake, dc=dom
|
||||
objectclass: top
|
||||
objectclass: rfc822mailgroup
|
||||
cn: defaultrecipient
|
||||
owner: uid=root, dc=someserver, dc=isp, dc=dom
|
||||
mailacceptinggeneralid: fake.dom
|
||||
mailacceptinggeneralid: @fake.dom
|
||||
maildrop: realuser@real.dom
|
||||
dn: cn=defaultrecipient, dc=fake, dc=dom
|
||||
objectclass: top
|
||||
objectclass: virtualaccount
|
||||
cn: defaultrecipient
|
||||
owner: uid=root, dc=someserver, dc=isp, dc=dom
|
||||
1 -> mailacceptinggeneralid: fake.dom
|
||||
2 -> mailacceptinggeneralid: @fake.dom
|
||||
3 -> maildrop: realuser@real.dom
|
||||
|
||||
If you don't necessarily have a catchall user for the domain (i.e. you
|
||||
want mail to unknown users in the domain to bounce), and don't want to
|
||||
tag an arbitrary user in the virtual domain, you might define another
|
||||
LDAP map that finds your virtual domain's domain object entry, and add
|
||||
that map to relay_domains instead of "$virtual_maps". All that's
|
||||
necessary is that a search for the domain name return something.
|
||||
1: Postfix knows fake.dom is a valid virtual domain when it looks for
|
||||
this and gets something (the maildrop) back.
|
||||
|
||||
2: This causes any mail for unknown users in fake.dom to go to this entry ...
|
||||
|
||||
3: ... and then to its maildrop.
|
||||
|
||||
Normal users might simply have one mailacceptinggeneralid and maildrop,
|
||||
e.g. "normaluser@fake.dom" and "normaluser@real.dom".
|
||||
|
||||
OTHER USES
|
||||
----------
|
||||
|
||||
Other common uses for LDAP lookups include rewriting senders and
|
||||
recipients with Postfix' canonical lookups, for example in order to make
|
||||
@ -204,6 +232,11 @@ instead of "userid@site.dom".
|
||||
NOTES AND THINGS TO THINK ABOUT
|
||||
===============================
|
||||
|
||||
- The bits of schema and attribute names used in this document are just
|
||||
examples. There's nothing special about them, other than that some are
|
||||
the defaults in the LDAP configuration parameters. You can use
|
||||
whatever schema you like, and configure Postfix accordingly.
|
||||
|
||||
- You probably want to make sure that mailacceptinggeneralids are
|
||||
unique, and that not just anyone can specify theirs as postmaster or
|
||||
root, say.
|
||||
@ -266,17 +299,17 @@ contents, please include the applicable bits of some directory entries.
|
||||
CREDITS
|
||||
=======
|
||||
|
||||
Support for LDAP was initially written by Prabhat K Singh of VSNL,
|
||||
Bombay, India, and then hideously bloated by John Hensley to support
|
||||
multiple sources and more configurable attributes. The caching bits were
|
||||
initially worked out by Prabhat, then munged to support the multiple
|
||||
sources.
|
||||
|
||||
Other contributors, of code or direction or dope slaps, include:
|
||||
|
||||
Manuel Guesdon
|
||||
Carsten Hoeger
|
||||
Keith Stevenson
|
||||
Samuel Tardieu
|
||||
Manuel Guesdon: Spotted a bug with the ldapsource_timeout attribute.
|
||||
John Hensley: Multiple LDAP sources with more configurable attributes.
|
||||
Carsten Hoeger: Search scope handling.
|
||||
LaMont Jones: Domain restriction, URL and DN searches, multiple result
|
||||
attributes.
|
||||
Mike Mattice: Alias dereferencing control.
|
||||
Hery Rakotoarisoa: Patches for LDAPv3 updating.
|
||||
Prabhat K Singh: Wrote the initial Postfix LDAP lookups and connection caching.
|
||||
Keith Stevenson: RFC 2254 escaping in queries.
|
||||
Samuel Tardieu: Noticed that searches could include wildcards, prompting
|
||||
the work on RFC 2254 escaping in queries. Spotted a bug
|
||||
in binding.
|
||||
|
||||
And of course Wietse.
|
||||
|
@ -1,17 +1,45 @@
|
||||
Incompatible changes with snapshot-20001027
|
||||
Incompatible changes with snapshot-20001029
|
||||
===========================================
|
||||
|
||||
If this release does not work for you, you can go back to a previous
|
||||
Postfix version without losing your mail, subject to the "incompatible
|
||||
changes" listed for previous Postfix releases below.
|
||||
|
||||
Berkeley DB support has changed for Solaris, HP-UX, UNIXWARE, IRIX.
|
||||
You can no longer use the DB 1.85 compatibility interface, because
|
||||
that interface loses the file lock while building a table, so that
|
||||
table lookups fail and mail is lost. See the DB_README file for
|
||||
instructions on how to build with third-party Berkeley DB support.
|
||||
On these systems, Postfix must no longer use DB 1.85 compatibility
|
||||
mode, because that mode loses the file lock while building a table,
|
||||
so that table lookups fail and mail is lost. See the DB_README file
|
||||
for instructions on how to build Postfix with third-party Berkeley
|
||||
DB support.
|
||||
|
||||
The "fast ETRN" policy configuration has changed. You now specify
|
||||
the list of eligible "fast ETRN" domains with the fast_flush_domains
|
||||
parameter (default: $relay_domains). In order to disable the feature,
|
||||
specify an empty value (fast_flush_domains =).
|
||||
|
||||
Major changes with snapshot-20001029
|
||||
====================================
|
||||
|
||||
This release ships with an updated LDAP client module that has better
|
||||
group support by Lamont Jones, and that has several other enhancements.
|
||||
Review the LDAP_README file for more information.
|
||||
|
||||
The LMTP client can now make connections over UNIX-domain sockets
|
||||
in addition to IPV4. For connections over UNIX-domain sockets,
|
||||
specify a transport table entry like:
|
||||
|
||||
domain.name lmtp:unix:/path/name
|
||||
|
||||
IPV4-based servers are still the default. The LMTP_README file
|
||||
still needs to be revised to account for this change. This is
|
||||
best done by someone who actually uses the Postfix LMTP client.
|
||||
|
||||
You can now specify multiple SMTP destinations in the relayhost
|
||||
and fallback_relay configuration parameters. The destinations are
|
||||
tried in the specified order. Specify host or host:port (perform
|
||||
MX record lookups), [host] or [host]:port (no MX record lookups),
|
||||
[address] or [address]:port (numerical IP address).
|
||||
|
||||
Incompatible changes with snapshot-20001005
|
||||
===========================================
|
||||
|
||||
|
@ -122,9 +122,12 @@ mail_owner = postfix
|
||||
# internal DNS uses no MX records, specify the name of the intranet
|
||||
# gateway host instead.
|
||||
#
|
||||
# Specify a domain, host, host:port, [host]:port, [address] or
|
||||
# [address]:port. Use the form [name] to turn off MX lookups. See
|
||||
# also the default_transport parameter if you're connected via UUCP.
|
||||
# In the case of SMTP, specify a domain, host, host:port, [host]:port,
|
||||
# [address] or [address]:port; the form [host] turns off MX lookups.
|
||||
# If you specify multiple SMTP destinations, Postfix will try them
|
||||
# in the specified order.
|
||||
#
|
||||
# If you're connected via UUCP, see also the default_transport parameter.
|
||||
#
|
||||
# relayhost = $mydomain
|
||||
# relayhost = gateway.my.domain
|
||||
|
@ -245,9 +245,12 @@ recipient_delimiter =
|
||||
# internal DNS uses no MX records, specify the name of the intranet
|
||||
# gateway host instead.
|
||||
#
|
||||
# Specify a domain, host, host:port, [host]:port, [address] or
|
||||
# [address]:port. Use the form [name] to turn off MX lookups. See
|
||||
# also the default_transport parameter if you're connected via UUCP.
|
||||
# In the case of SMTP, specify a domain, host, host:port, [host]:port,
|
||||
# [address] or [address]:port; the form [host] turns off MX lookups.
|
||||
# If you specify multiple SMTP destinations, Postfix will try them
|
||||
# in the specified order.
|
||||
#
|
||||
# If you're connected via UUCP, see also the default_transport parameter.
|
||||
#
|
||||
# relayhost = $mydomain
|
||||
# relayhost = gateway.my.domain
|
||||
|
@ -24,6 +24,11 @@
|
||||
# By default, mail is bounced when a destination is not found, and
|
||||
# delivery is deferred if a destination is unreachable.
|
||||
#
|
||||
# In the case of SMTP, specify a domain, host, host:port, [host]:port,
|
||||
# [address] or [address]:port; the form [host] turns off MX lookups.
|
||||
# If you specify multiple SMTP destinations, Postfix will try them
|
||||
# in the specified order.
|
||||
#
|
||||
fallback_relay =
|
||||
|
||||
# The ignore_mx_lookup_error parameter controls what happens when a
|
||||
|
@ -1,16 +1,56 @@
|
||||
# Setup chroot jail for Linux
|
||||
#! /bin/sh
|
||||
|
||||
# LINUX2 - shell script to set up a Postfix chroot jail for Linux
|
||||
# Tested on SuSE Linux 5.3 (libc5) and 6.4 (glibc2.1)
|
||||
|
||||
# Copyright (c) 2000 by Matthias Andree
|
||||
# Redistributable unter the MIT-style license that follows:
|
||||
# Abstract: "do whatever you want except hold somebody liable or change
|
||||
# the copyright information".
|
||||
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to
|
||||
# deal in the Software without restriction, including without limitation the
|
||||
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
# sell copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
cond_copy() {
|
||||
# find files as per pattern in $1
|
||||
# if any, copy to directory $2
|
||||
dir=`dirname "$1"`
|
||||
pat=`basename "$1"`
|
||||
lr=`find "$dir" -name "$pat"`
|
||||
if test ! -d "$2" ; then exit 1 ; fi
|
||||
if test "x$lr" != "x" ; then cp -p $1 "$2" ; fi
|
||||
}
|
||||
|
||||
set -e
|
||||
umask 022
|
||||
|
||||
POSTFIX_DIR=${POSTFIX_DIR-/var/spool/postfix}
|
||||
|
||||
cd ${POSTFIX_DIR}
|
||||
|
||||
mkdir etc
|
||||
cp /etc/localtime /etc/services /etc/resolv.conf /etc/nsswitch.conf etc
|
||||
mkdir -p usr/lib/zoneinfo
|
||||
ln -s /etc/localtime usr/lib/zoneinfo
|
||||
mkdir -p etc lib usr/lib/zoneinfo
|
||||
|
||||
mkdir lib
|
||||
cp /lib/libnss_* lib
|
||||
# find localtime (SuSE 5.3 does not have /etc/localtime)
|
||||
lt=/etc/localtime
|
||||
if test ! -f $lt ; then lt=/usr/lib/zoneinfo/localtime ; fi
|
||||
if test ! -f $lt ; then echo "cannot find localtime" ; exit 1 ; fi
|
||||
cp -p -f $lt /etc/services /etc/resolv.conf /etc/nsswitch.conf etc
|
||||
cp -p -f /etc/host.conf /etc/hosts /etc/passwd etc
|
||||
ln -s -f /etc/localtime usr/lib/zoneinfo
|
||||
|
||||
cond_copy '/lib/libnss_*' lib
|
||||
cond_copy '/lib/libresolv*' lib
|
@ -2592,79 +2592,11 @@ systems.
|
||||
<p>
|
||||
|
||||
In order to build Postfix with <b>db</b> support on UNIX systems
|
||||
that do not have <b>db</b> support out of the box, you need the
|
||||
db-1.85 release, or <a href="http://www.sleepycat.com">the current
|
||||
version</a> which has a db-1.85 compatible interface.
|
||||
|
||||
<p>
|
||||
|
||||
To build with a third-party DB library, use the following commands
|
||||
in the Postfix top-level directory.
|
||||
On Solaris, the LD_LIBRARY_PATH unset commands may be required to
|
||||
avoid linking in the wrong libraries.
|
||||
|
||||
<p>
|
||||
|
||||
<pre>
|
||||
% LD_LIBRARY_PATH= (Bourne-shell syntax)
|
||||
% unsetenv LD_LIBRARY_PATH (C-shell syntax)
|
||||
% make tidy
|
||||
% make makefiles CCARGS="-DHAS_DB -DPATH_DB_H='<db_185.h>' -I/some/where/include" AUXLIBS=/some/where/libdb.a
|
||||
% make
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
|
||||
Of course you will have to specify the actual location of the
|
||||
include directory and of the object library.
|
||||
|
||||
<p>
|
||||
|
||||
When building with a third-party DB library you may into one of the
|
||||
following problems:
|
||||
|
||||
<p>
|
||||
|
||||
<ul>
|
||||
|
||||
<li> Older DB versions install a file
|
||||
<b>/usr/local/include/ndbm.h</b> that is incompatible with
|
||||
<b>/usr/include/ndbm.h</b>. Be sure to get rid of the bogus file.
|
||||
See the FAQ entry titled "<a href="#dbm_dirfno">Undefined symbols:
|
||||
dbm_pagfno, dbm_dirfno etc</a>".
|
||||
|
||||
<p>
|
||||
|
||||
<li>With Sleepcat DB 3.0.55, the linker will complain that dbopen()
|
||||
is not found. To fix, apply the following patch to the DB 3.0.55
|
||||
db_185.h include file:
|
||||
|
||||
<p>
|
||||
<pre>
|
||||
*** db_185.h.orig Tue Mar 7 16:27:32 2000
|
||||
--- db_185.h Tue Mar 7 16:27:44 2000
|
||||
***************
|
||||
*** 166,173 ****
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
- #ifdef DB_LIBRARY_COMPATIBILITY_API
|
||||
#define dbopen __db185_open
|
||||
DB *__db185_open __P((const char *, int, int, DBTYPE, const void *));
|
||||
#else
|
||||
DB *dbopen __P((const char *, int, int, DBTYPE, const void *));
|
||||
--- 166,173 ----
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
#define dbopen __db185_open
|
||||
+ #ifdef DB_LIBRARY_COMPATIBILITY_API
|
||||
DB *__db185_open __P((const char *, int, int, DBTYPE, const void *));
|
||||
#else
|
||||
DB *dbopen __P((const char *, int, int, DBTYPE, const void *));
|
||||
</pre>
|
||||
|
||||
</ul>
|
||||
that do not have <b>db</b> support out of the box, you can use the
|
||||
Berkeley DB source code from <a
|
||||
href="http://www.sleepycat.com">www.sleepycat.com</a>. See the file
|
||||
<b>DB_README</b> in the Postfix source code distribution for
|
||||
instructions on how to build Postfix with Sleepycat's Berkeley DB.
|
||||
|
||||
<hr>
|
||||
|
||||
|
@ -24,14 +24,31 @@ LMTP(8) LMTP(8)
|
||||
problem reports are sent to the <a href="bounce.8.html"><b>bounce</b>(8)</a> or <a href="defer.8.html"><b>defer</b>(8)</a> dae-
|
||||
mon as appropriate.
|
||||
|
||||
If no server is given on the command line, the LMTP client
|
||||
connects to the destination specified in the message
|
||||
delivery request and to the TCP port defined as <b>lmtp</b> in
|
||||
<b>services</b>(4). If no such service is found, the
|
||||
<b>lmtp</b><i>_</i><b>tcp</b><i>_</i><b>port</b> configuration parameter (default value of
|
||||
24) will be used. The LMTP client does not perform MX
|
||||
(mail exchanger) lookups since those are defined only for
|
||||
SMTP.
|
||||
The LMTP client connects to the destination specified in
|
||||
the message delivery request. The destination, usually
|
||||
specified in the Postfix <a href="transport.5.html"><b>transport</b>(5)</a> table, has the form:
|
||||
|
||||
<b>unix</b>:<i>pathname</i>
|
||||
Connect to the UNIX-domain server that is bound to
|
||||
the specified <i>pathname</i>. If the process runs
|
||||
chrooted, an absolute pathname is interpreted rela-
|
||||
tive to the changed root directory.
|
||||
|
||||
<b>inet</b>:<i>host</i>, <b>inet:</b><i>host</i>:<i>port</i> (symbolic host)
|
||||
|
||||
<b>inet</b>:[<i>addr</i>], <b>inet</b>:[<i>addr</i>]:<i>port</i> (numeric host)
|
||||
Connect to the specified IPV4 TCP port on the spec-
|
||||
ified host. If no port is specified, connect to the
|
||||
port defined as <b>lmtp</b> in <b>services</b>(4). If no such
|
||||
service is found, the <b>lmtp</b><i>_</i><b>tcp</b><i>_</i><b>port</b> configuration
|
||||
parameter (default value of 24) will be used.
|
||||
|
||||
The LMTP client does not perform MX (mail
|
||||
exchanger) lookups since those are defined only for
|
||||
mail delivery via SMTP.
|
||||
|
||||
If neither <b>unix:</b> nor <b>inet:</b> are specified, <b>inet:</b> is
|
||||
assumed.
|
||||
|
||||
<b>SECURITY</b>
|
||||
The LMTP client is moderately security-sensitive. It talks
|
||||
@ -42,6 +59,18 @@ LMTP(8) LMTP(8)
|
||||
<a href="http://www.faqs.org/rfcs/rfc821.html">RFC 821</a> (SMTP protocol)
|
||||
<a href="http://www.faqs.org/rfcs/rfc1651.html">RFC 1651</a> (SMTP service extensions)
|
||||
<a href="http://www.faqs.org/rfcs/rfc1870.html">RFC 1870</a> (Message Size Declaration)
|
||||
|
||||
|
||||
|
||||
1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LMTP(8) LMTP(8)
|
||||
|
||||
|
||||
<a href="http://www.faqs.org/rfcs/rfc2033.html">RFC 2033</a> (LMTP protocol)
|
||||
<a href="http://www.faqs.org/rfcs/rfc2197.html">RFC 2197</a> (Pipelining)
|
||||
|
||||
@ -59,18 +88,6 @@ LMTP(8) LMTP(8)
|
||||
The following <b>main.cf</b> parameters are especially relevant
|
||||
to this program. See the Postfix <b>main.cf</b> file for syntax
|
||||
details and for default values. Use the <b>postfix</b> <b>reload</b>
|
||||
|
||||
|
||||
|
||||
1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LMTP(8) LMTP(8)
|
||||
|
||||
|
||||
command after a configuration change.
|
||||
|
||||
<b>Miscellaneous</b>
|
||||
@ -108,6 +125,18 @@ LMTP(8) LMTP(8)
|
||||
The effectiveness of cached connections will be
|
||||
determined by the number of LMTP servers in use,
|
||||
and the concurrency limit specified for the LMTP
|
||||
|
||||
|
||||
|
||||
2
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LMTP(8) LMTP(8)
|
||||
|
||||
|
||||
client. Cached connections are closed under any of
|
||||
the following conditions:
|
||||
|
||||
@ -125,18 +154,6 @@ LMTP(8) LMTP(8)
|
||||
|
||||
<b>o</b> Upon the onset of another delivery request,
|
||||
the LMTP server associated with the current
|
||||
|
||||
|
||||
|
||||
2
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LMTP(8) LMTP(8)
|
||||
|
||||
|
||||
session does not respond to the <b>RSET</b> com-
|
||||
mand.
|
||||
|
||||
@ -175,6 +192,17 @@ LMTP(8) LMTP(8)
|
||||
LMTP server. If no connection can be made within
|
||||
the deadline, the message is deferred.
|
||||
|
||||
|
||||
|
||||
3
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LMTP(8) LMTP(8)
|
||||
|
||||
|
||||
<b>lmtp</b><i>_</i><b>lhlo</b><i>_</i><b>timeout</b>
|
||||
Timeout in seconds for sending the <b>LHLO</b> command,
|
||||
and for receiving the server response.
|
||||
@ -191,18 +219,6 @@ LMTP(8) LMTP(8)
|
||||
Timeout in seconds for sending the <b>DATA</b> command,
|
||||
and for receiving the server response.
|
||||
|
||||
|
||||
|
||||
|
||||
3
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LMTP(8) LMTP(8)
|
||||
|
||||
|
||||
<b>lmtp</b><i>_</i><b>data</b><i>_</i><b>xfer</b><i>_</i><b>timeout</b>
|
||||
Timeout in seconds for sending the message content.
|
||||
|
||||
@ -226,7 +242,7 @@ LMTP(8) LMTP(8)
|
||||
<a href="master.8.html">master(8)</a> process manager
|
||||
<a href="qmgr.8.html">qmgr(8)</a> queue manager
|
||||
services(4) Internet services and aliases
|
||||
spawn(8) auxiliary command spawner
|
||||
<a href="spawn.8.html">spawn(8)</a> auxiliary command spawner
|
||||
syslogd(8) system logging
|
||||
|
||||
<b>LICENSE</b>
|
||||
@ -241,6 +257,18 @@ LMTP(8) LMTP(8)
|
||||
|
||||
Alterations for LMTP by:
|
||||
Philip A. Prindeville
|
||||
|
||||
|
||||
|
||||
4
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LMTP(8) LMTP(8)
|
||||
|
||||
|
||||
Mirapoint, Inc.
|
||||
USA.
|
||||
|
||||
@ -260,7 +288,45 @@ LMTP(8) LMTP(8)
|
||||
|
||||
|
||||
|
||||
4
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
5
|
||||
|
||||
|
||||
</pre> </body> </html>
|
||||
|
@ -29,6 +29,11 @@ SMTP(8) SMTP(8)
|
||||
preference, and connects to each listed address until it
|
||||
finds a server that responds.
|
||||
|
||||
When the domain or host is specified as a comma/whitespace
|
||||
separated list, the SMTP client repeats the above process
|
||||
for all destinations until it finds a server that
|
||||
responds.
|
||||
|
||||
Once the SMTP client has received the server greeting ban-
|
||||
ner, no error will cause it to proceed to the next address
|
||||
on the mail exchanger list. Instead, the message is either
|
||||
@ -36,7 +41,7 @@ SMTP(8) SMTP(8)
|
||||
|
||||
<b>SECURITY</b>
|
||||
The SMTP client is moderately security-sensitive. It talks
|
||||
to SMTP servers and to DNS servers on the network. The
|
||||
to SMTP servers and to DNS servers on the network. The
|
||||
SMTP client can be run chrooted at fixed low privilege.
|
||||
|
||||
<b>STANDARDS</b>
|
||||
@ -47,19 +52,14 @@ SMTP(8) SMTP(8)
|
||||
<a href="http://www.faqs.org/rfcs/rfc2554.html">RFC 2554</a> (AUTH command)
|
||||
|
||||
<b>DIAGNOSTICS</b>
|
||||
Problems and transactions are logged to <b>syslogd</b>(8). Cor-
|
||||
rupted message files are marked so that the queue manager
|
||||
Problems and transactions are logged to <b>syslogd</b>(8). Cor-
|
||||
rupted message files are marked so that the queue manager
|
||||
can move them to the <b>corrupt</b> queue for further inspection.
|
||||
|
||||
Depending on the setting of the <b>notify</b><i>_</i><b>classes</b> parameter,
|
||||
the postmaster is notified of bounces, protocol problems,
|
||||
Depending on the setting of the <b>notify</b><i>_</i><b>classes</b> parameter,
|
||||
the postmaster is notified of bounces, protocol problems,
|
||||
and of other trouble.
|
||||
|
||||
<b>BUGS</b>
|
||||
<b>CONFIGURATION</b> <b>PARAMETERS</b>
|
||||
The following <b>main.cf</b> parameters are especially relevant
|
||||
to this program. See the Postfix <b>main.cf</b> file for syntax
|
||||
|
||||
|
||||
|
||||
1
|
||||
@ -71,36 +71,40 @@ SMTP(8) SMTP(8)
|
||||
SMTP(8) SMTP(8)
|
||||
|
||||
|
||||
details and for default values. Use the <b>postfix</b> <b>reload</b>
|
||||
<b>BUGS</b>
|
||||
<b>CONFIGURATION</b> <b>PARAMETERS</b>
|
||||
The following <b>main.cf</b> parameters are especially relevant
|
||||
to this program. See the Postfix <b>main.cf</b> file for syntax
|
||||
details and for default values. Use the <b>postfix</b> <b>reload</b>
|
||||
command after a configuration change.
|
||||
|
||||
<b>Miscellaneous</b>
|
||||
<b>best</b><i>_</i><b>mx</b><i>_</i><b>transport</b>
|
||||
Name of the delivery transport to use when the
|
||||
local machine is the most-preferred mail exchanger
|
||||
(by default, a mailer loop is reported, and the
|
||||
Name of the delivery transport to use when the
|
||||
local machine is the most-preferred mail exchanger
|
||||
(by default, a mailer loop is reported, and the
|
||||
message is bounced).
|
||||
|
||||
<b>debug</b><i>_</i><b>peer</b><i>_</i><b>level</b>
|
||||
Verbose logging level increment for hosts that
|
||||
Verbose logging level increment for hosts that
|
||||
match a pattern in the <b>debug</b><i>_</i><b>peer</b><i>_</i><b>list</b> parameter.
|
||||
|
||||
<b>debug</b><i>_</i><b>peer</b><i>_</i><b>list</b>
|
||||
List of domain or network patterns. When a remote
|
||||
host matches a pattern, increase the verbose log-
|
||||
ging level by the amount specified in the
|
||||
List of domain or network patterns. When a remote
|
||||
host matches a pattern, increase the verbose log-
|
||||
ging level by the amount specified in the
|
||||
<b>debug</b><i>_</i><b>peer</b><i>_</i><b>level</b> parameter.
|
||||
|
||||
<b>disable</b><i>_</i><b>dns</b><i>_</i><b>lookups</b>
|
||||
Disable DNS lookups. This means that mail must be
|
||||
Disable DNS lookups. This means that mail must be
|
||||
forwarded via a smart relay host.
|
||||
|
||||
<b>error</b><i>_</i><b>notice</b><i>_</i><b>recipient</b>
|
||||
Recipient of protocol/policy/resource/software
|
||||
Recipient of protocol/policy/resource/software
|
||||
error notices.
|
||||
|
||||
<b>fallback</b><i>_</i><b>relay</b>
|
||||
Hosts to hand off mail to if a message destination
|
||||
Hosts to hand off mail to if a message destination
|
||||
is not found or if a destination is unreachable.
|
||||
|
||||
<b>ignore</b><i>_</i><b>mx</b><i>_</i><b>lookup</b><i>_</i><b>error</b>
|
||||
@ -110,21 +114,17 @@ SMTP(8) SMTP(8)
|
||||
|
||||
<b>inet</b><i>_</i><b>interfaces</b>
|
||||
The network interface addresses that this mail sys-
|
||||
tem receives mail on. When any of those addresses
|
||||
tem receives mail on. When any of those addresses
|
||||
appears in the list of mail exchangers for a remote
|
||||
destination, the list is truncated to avoid mail
|
||||
destination, the list is truncated to avoid mail
|
||||
delivery loops.
|
||||
|
||||
<b>notify</b><i>_</i><b>classes</b>
|
||||
When this parameter includes the <b>protocol</b> class,
|
||||
send mail to the postmaster with transcripts of
|
||||
When this parameter includes the <b>protocol</b> class,
|
||||
send mail to the postmaster with transcripts of
|
||||
SMTP sessions with protocol errors.
|
||||
|
||||
<b>smtp</b><i>_</i><b>always</b><i>_</i><b>send</b><i>_</i><b>ehlo</b>
|
||||
Always send EHLO at the start of a connection.
|
||||
|
||||
<b>smtp</b><i>_</i><b>skip</b><i>_</i><b>4xx</b><i>_</i><b>greeting</b>
|
||||
Skip servers that greet us with a 4xx status code.
|
||||
|
||||
|
||||
|
||||
@ -137,26 +137,32 @@ SMTP(8) SMTP(8)
|
||||
SMTP(8) SMTP(8)
|
||||
|
||||
|
||||
<b>smtp</b><i>_</i><b>always</b><i>_</i><b>send</b><i>_</i><b>ehlo</b>
|
||||
Always send EHLO at the start of a connection.
|
||||
|
||||
<b>smtp</b><i>_</i><b>skip</b><i>_</i><b>4xx</b><i>_</i><b>greeting</b>
|
||||
Skip servers that greet us with a 4xx status code.
|
||||
|
||||
<b>smtp</b><i>_</i><b>skip</b><i>_</i><b>5xx</b><i>_</i><b>greeting</b>
|
||||
Skip servers that greet us with a 5xx status code.
|
||||
Skip servers that greet us with a 5xx status code.
|
||||
|
||||
<b>smtp</b><i>_</i><b>skip</b><i>_</i><b>quit</b><i>_</i><b>response</b>
|
||||
Do not wait for the server response after sending
|
||||
Do not wait for the server response after sending
|
||||
QUIT.
|
||||
|
||||
<b>smtp</b><i>_</i><b>bind</b><i>_</i><b>address</b>
|
||||
Numerical network address to bind to when making a
|
||||
Numerical network address to bind to when making a
|
||||
connection.
|
||||
|
||||
<b>Authentication</b> <b>controls</b>
|
||||
<b>smtp</b><i>_</i><b>enable</b><i>_</i><b>sasl</b><i>_</i><b>auth</b>
|
||||
Enable per-session authentication as per <a href="http://www.faqs.org/rfcs/rfc2554.html">RFC 2554</a>
|
||||
(SASL). By default, Postfix is built without SASL
|
||||
Enable per-session authentication as per <a href="http://www.faqs.org/rfcs/rfc2554.html">RFC 2554</a>
|
||||
(SASL). By default, Postfix is built without SASL
|
||||
support.
|
||||
|
||||
<b>smtp</b><i>_</i><b>sasl</b><i>_</i><b>password</b><i>_</i><b>maps</b>
|
||||
Lookup tables with per-host or domain <i>name</i>:<i>password</i>
|
||||
entries. No entry for a host means no attempt to
|
||||
entries. No entry for a host means no attempt to
|
||||
authenticate.
|
||||
|
||||
<b>smtp</b><i>_</i><b>sasl</b><i>_</i><b>security</b><i>_</i><b>options</b>
|
||||
@ -180,17 +186,11 @@ SMTP(8) SMTP(8)
|
||||
<b>Resource</b> <b>controls</b>
|
||||
<b>smtp</b><i>_</i><b>destination</b><i>_</i><b>concurrency</b><i>_</i><b>limit</b>
|
||||
Limit the number of parallel deliveries to the same
|
||||
destination. The default limit is taken from the
|
||||
destination. The default limit is taken from the
|
||||
<b>default</b><i>_</i><b>destination</b><i>_</i><b>concurrency</b><i>_</i><b>limit</b> parameter.
|
||||
|
||||
<b>smtp</b><i>_</i><b>destination</b><i>_</i><b>recipient</b><i>_</i><b>limit</b>
|
||||
Limit the number of recipients per message deliv-
|
||||
ery. The default limit is taken from the
|
||||
<b>default</b><i>_</i><b>destination</b><i>_</i><b>recipient</b><i>_</i><b>limit</b> parameter.
|
||||
|
||||
<b>Timeout</b> <b>controls</b>
|
||||
<b>smtp</b><i>_</i><b>connect</b><i>_</i><b>timeout</b>
|
||||
Timeout in seconds for completing a TCP connection.
|
||||
Limit the number of recipients per message
|
||||
|
||||
|
||||
|
||||
@ -203,24 +203,30 @@ SMTP(8) SMTP(8)
|
||||
SMTP(8) SMTP(8)
|
||||
|
||||
|
||||
delivery. The default limit is taken from the
|
||||
<b>default</b><i>_</i><b>destination</b><i>_</i><b>recipient</b><i>_</i><b>limit</b> parameter.
|
||||
|
||||
<b>Timeout</b> <b>controls</b>
|
||||
<b>smtp</b><i>_</i><b>connect</b><i>_</i><b>timeout</b>
|
||||
Timeout in seconds for completing a TCP connection.
|
||||
When no connection can be made within the deadline,
|
||||
the SMTP client tries the next address on the mail
|
||||
the SMTP client tries the next address on the mail
|
||||
exchanger list.
|
||||
|
||||
<b>smtp</b><i>_</i><b>helo</b><i>_</i><b>timeout</b>
|
||||
Timeout in seconds for receiving the SMTP greeting
|
||||
Timeout in seconds for receiving the SMTP greeting
|
||||
banner. When the server drops the connection with-
|
||||
out sending a greeting banner, or when it sends no
|
||||
out sending a greeting banner, or when it sends no
|
||||
greeting banner within the deadline, the SMTP
|
||||
client tries the next address on the mail exchanger
|
||||
list.
|
||||
|
||||
<b>smtp</b><i>_</i><b>helo</b><i>_</i><b>timeout</b>
|
||||
Timeout in seconds for sending the <b>HELO</b> command,
|
||||
Timeout in seconds for sending the <b>HELO</b> command,
|
||||
and for receiving the server response.
|
||||
|
||||
<b>smtp</b><i>_</i><b>mail</b><i>_</i><b>timeout</b>
|
||||
Timeout in seconds for sending the <b>MAIL</b> <b>FROM</b> com-
|
||||
Timeout in seconds for sending the <b>MAIL</b> <b>FROM</b> com-
|
||||
mand, and for receiving the server response.
|
||||
|
||||
<b>smtp</b><i>_</i><b>rcpt</b><i>_</i><b>timeout</b>
|
||||
@ -228,7 +234,7 @@ SMTP(8) SMTP(8)
|
||||
and for receiving the server response.
|
||||
|
||||
<b>smtp</b><i>_</i><b>data</b><i>_</i><b>init</b><i>_</i><b>timeout</b>
|
||||
Timeout in seconds for sending the <b>DATA</b> command,
|
||||
Timeout in seconds for sending the <b>DATA</b> command,
|
||||
and for receiving the server response.
|
||||
|
||||
<b>smtp</b><i>_</i><b>data</b><i>_</i><b>xfer</b><i>_</i><b>timeout</b>
|
||||
@ -237,11 +243,11 @@ SMTP(8) SMTP(8)
|
||||
<b>smtp</b><i>_</i><b>data</b><i>_</i><b>done</b><i>_</i><b>timeout</b>
|
||||
Timeout in seconds for sending the "<b>.</b>" command, and
|
||||
for receiving the server response. When no response
|
||||
is received, a warning is logged that the mail may
|
||||
is received, a warning is logged that the mail may
|
||||
be delivered multiple times.
|
||||
|
||||
<b>smtp</b><i>_</i><b>quit</b><i>_</i><b>timeout</b>
|
||||
Timeout in seconds for sending the <b>QUIT</b> command,
|
||||
Timeout in seconds for sending the <b>QUIT</b> command,
|
||||
and for receiving the server response.
|
||||
|
||||
<b>SEE</b> <b>ALSO</b>
|
||||
@ -250,13 +256,7 @@ SMTP(8) SMTP(8)
|
||||
<a href="qmgr.8.html">qmgr(8)</a> queue manager
|
||||
syslogd(8) system logging
|
||||
|
||||
<b>LICENSE</b>
|
||||
The Secure Mailer license must be distributed with this
|
||||
software.
|
||||
|
||||
<b>AUTHOR(S)</b>
|
||||
Wietse Venema
|
||||
IBM T.J. Watson Research
|
||||
|
||||
|
||||
|
||||
@ -269,6 +269,13 @@ SMTP(8) SMTP(8)
|
||||
SMTP(8) SMTP(8)
|
||||
|
||||
|
||||
<b>LICENSE</b>
|
||||
The Secure Mailer license must be distributed with this
|
||||
software.
|
||||
|
||||
<b>AUTHOR(S)</b>
|
||||
Wietse Venema
|
||||
IBM T.J. Watson Research
|
||||
P.O. Box 704
|
||||
Yorktown Heights, NY 10598, USA
|
||||
|
||||
@ -311,13 +318,6 @@ SMTP(8) SMTP(8)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -159,18 +159,12 @@ case "$SYSTEM.$RELEASE" in
|
||||
*) echo "Unknown AIX version: `uname -v`." 1>&2; exit 1;;
|
||||
esac;;
|
||||
Linux.2*) SYSTYPE=LINUX2
|
||||
if [ -f /usr/lib/libdb-3.1.a ]
|
||||
# Postfix no longer needs DB 1.85 compatibility
|
||||
if [ ! -f /usr/include/db.h -a -f /usr/include/db/db.h ]
|
||||
then
|
||||
CCARGS="$CCARGS -I/usr/include/db3"
|
||||
SYSLIBS="$SYSLIBS -ldb-3.1"
|
||||
else
|
||||
if [ -f /usr/include/db/db.h ]
|
||||
then
|
||||
CCARGS="$CCARGS -I/usr/include/db"
|
||||
fi
|
||||
test -f /usr/lib/libdb.a && SYSLIBS="$SYSLIBS -ldb"
|
||||
CCARGS="$CCARGS -I/usr/include/db"
|
||||
fi
|
||||
for name in nsl resolv
|
||||
for name in db nsl resolv
|
||||
do
|
||||
test -f /usr/lib/lib$name.a && SYSLIBS="$SYSLIBS -l$name"
|
||||
done
|
||||
@ -192,9 +186,6 @@ HP-UX.A.09.*) SYSTYPE=HPUX9
|
||||
CCARGS="$CCARGS -DHAS_DB"
|
||||
SYSLIBS="$SYSLIBS -ldb"
|
||||
fi
|
||||
if [ -f /usr/include/db_185.h ]; then
|
||||
CCARGS="$CCARGS -DPATH_DB_H='<db_185.h>'"
|
||||
fi
|
||||
;;
|
||||
HP-UX.B.10.*) SYSTYPE=HPUX10
|
||||
CCARGS="$CCARGS `nm /usr/lib/libc.a 2>/dev/null |
|
||||
@ -203,9 +194,6 @@ HP-UX.B.10.*) SYSTYPE=HPUX10
|
||||
CCARGS="$CCARGS -DHAS_DB"
|
||||
SYSLIBS=-ldb
|
||||
fi
|
||||
if [ -f /usr/include/db_185.h ]; then
|
||||
CCARGS="$CCARGS -DPATH_DB_H='<db_185.h>'"
|
||||
fi
|
||||
;;
|
||||
HP-UX.B.11.*) SYSTYPE=HPUX11
|
||||
SYSLIBS=-lnsl
|
||||
@ -213,9 +201,6 @@ HP-UX.B.11.*) SYSTYPE=HPUX11
|
||||
CCARGS="$CCARGS -DHAS_DB"
|
||||
SYSLIBS="$SYSLIBS -ldb"
|
||||
fi
|
||||
if [ -f /usr/include/db_185.h ]; then
|
||||
CCARGS="$CCARGS -DPATH_DB_H='<db_185.h>'"
|
||||
fi
|
||||
;;
|
||||
ReliantUNIX-?.5.43) SYSTYPE=ReliantUnix543
|
||||
RANLIB=echo
|
||||
|
@ -23,12 +23,26 @@ as finished, or it informs the queue manager that delivery should
|
||||
be tried again at a later time. Delivery problem reports are sent
|
||||
to the \fBbounce\fR(8) or \fBdefer\fR(8) daemon as appropriate.
|
||||
|
||||
If no server is given on the command line, the LMTP client connects
|
||||
to the destination specified in the message delivery request and to
|
||||
the TCP port defined as \fBlmtp\fR in \fBservices\fR(4). If no such
|
||||
service is found, the \fBlmtp_tcp_port\fR configuration parameter
|
||||
(default value of 24) will be used. The LMTP client does not perform
|
||||
MX (mail exchanger) lookups since those are defined only for SMTP.
|
||||
The LMTP client connects to the destination specified in the message
|
||||
delivery request. The destination, usually specified in the Postfix
|
||||
\fBtransport\fR(5) table, has the form:
|
||||
.IP \fBunix\fR:\fIpathname\fR
|
||||
Connect to the UNIX-domain server that is bound to the specified
|
||||
\fIpathname\fR. If the process runs chrooted, an absolute pathname
|
||||
is interpreted relative to the changed root directory.
|
||||
.IP "\fBinet\fR:\fIhost\fR, \fBinet\fB:\fIhost\fR:\fIport\fR (symbolic host)"
|
||||
.IP "\fBinet\fR:[\fIaddr\fR], \fBinet\fR:[\fIaddr\fR]:\fIport\fR (numeric host)"
|
||||
Connect to the specified IPV4 TCP port on the specified host. If no
|
||||
port is specified, connect to the port defined as \fBlmtp\fR in
|
||||
\fBservices\fR(4).
|
||||
If no such service is found, the \fBlmtp_tcp_port\fR configuration
|
||||
parameter (default value of 24) will be used.
|
||||
|
||||
The LMTP client does not perform MX (mail exchanger) lookups since
|
||||
those are defined only for mail delivery via SMTP.
|
||||
.PP
|
||||
If neither \fBunix:\fR nor \fBinet:\fR are specified, \fBinet:\fR
|
||||
is assumed.
|
||||
.SH SECURITY
|
||||
.na
|
||||
.nf
|
||||
|
@ -27,6 +27,10 @@ The SMTP client looks up a list of mail exchanger addresses for
|
||||
the destination host, sorts the list by preference, and connects
|
||||
to each listed address until it finds a server that responds.
|
||||
|
||||
When the domain or host is specified as a comma/whitespace
|
||||
separated list, the SMTP client repeats the above process
|
||||
for all destinations until it finds a server that responds.
|
||||
|
||||
Once the SMTP client has received the server greeting banner, no
|
||||
error will cause it to proceed to the next address on the mail
|
||||
exchanger list. Instead, the message is either bounced, or its
|
||||
|
@ -189,9 +189,6 @@ static DOMAIN_LIST *flush_domains;
|
||||
|
||||
static int flush_policy_ok(const char *site)
|
||||
{
|
||||
if (flush_domains == 0)
|
||||
flush_domains = domain_list_init(var_fflush_domains);
|
||||
|
||||
return (domain_list_match(flush_domains, site));
|
||||
}
|
||||
|
||||
@ -497,6 +494,13 @@ static void flush_service(VSTREAM *client_stream, char *unused_service,
|
||||
vstring_free(queue_id);
|
||||
}
|
||||
|
||||
/* pre_jail_init - pre-jail initialization */
|
||||
|
||||
static void pre_jail_init(char *unused_name, char **unused_argv)
|
||||
{
|
||||
flush_domains = domain_list_init(var_fflush_domains);
|
||||
}
|
||||
|
||||
/* main - pass control to the single-threaded skeleton */
|
||||
|
||||
int main(int argc, char **argv)
|
||||
@ -509,5 +513,6 @@ int main(int argc, char **argv)
|
||||
|
||||
single_server_main(argc, argv, flush_service,
|
||||
MAIL_SERVER_TIME_TABLE, time_table,
|
||||
MAIL_SERVER_PRE_INIT, pre_jail_init,
|
||||
0);
|
||||
}
|
||||
|
Binary file not shown.
@ -15,7 +15,7 @@
|
||||
* Version of this program.
|
||||
*/
|
||||
#define VAR_MAIL_VERSION "mail_version"
|
||||
#define DEF_MAIL_VERSION "Snapshot-20001028"
|
||||
#define DEF_MAIL_VERSION "Snapshot-20001029"
|
||||
extern char *var_mail_version;
|
||||
|
||||
/* LICENSE
|
||||
|
@ -17,12 +17,26 @@
|
||||
/* be tried again at a later time. Delivery problem reports are sent
|
||||
/* to the \fBbounce\fR(8) or \fBdefer\fR(8) daemon as appropriate.
|
||||
/*
|
||||
/* If no server is given on the command line, the LMTP client connects
|
||||
/* to the destination specified in the message delivery request and to
|
||||
/* the TCP port defined as \fBlmtp\fR in \fBservices\fR(4). If no such
|
||||
/* service is found, the \fBlmtp_tcp_port\fR configuration parameter
|
||||
/* (default value of 24) will be used. The LMTP client does not perform
|
||||
/* MX (mail exchanger) lookups since those are defined only for SMTP.
|
||||
/* The LMTP client connects to the destination specified in the message
|
||||
/* delivery request. The destination, usually specified in the Postfix
|
||||
/* \fBtransport\fR(5) table, has the form:
|
||||
/* .IP \fBunix\fR:\fIpathname\fR
|
||||
/* Connect to the UNIX-domain server that is bound to the specified
|
||||
/* \fIpathname\fR. If the process runs chrooted, an absolute pathname
|
||||
/* is interpreted relative to the changed root directory.
|
||||
/* .IP "\fBinet\fR:\fIhost\fR, \fBinet\fB:\fIhost\fR:\fIport\fR (symbolic host)"
|
||||
/* .IP "\fBinet\fR:[\fIaddr\fR], \fBinet\fR:[\fIaddr\fR]:\fIport\fR (numeric host)"
|
||||
/* Connect to the specified IPV4 TCP port on the specified host. If no
|
||||
/* port is specified, connect to the port defined as \fBlmtp\fR in
|
||||
/* \fBservices\fR(4).
|
||||
/* If no such service is found, the \fBlmtp_tcp_port\fR configuration
|
||||
/* parameter (default value of 24) will be used.
|
||||
/*
|
||||
/* The LMTP client does not perform MX (mail exchanger) lookups since
|
||||
/* those are defined only for mail delivery via SMTP.
|
||||
/* .PP
|
||||
/* If neither \fBunix:\fR nor \fBinet:\fR are specified, \fBinet:\fR
|
||||
/* is assumed.
|
||||
/* SECURITY
|
||||
/* .ad
|
||||
/* .fi
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*++
|
||||
/* NAME
|
||||
/* lmtp_connect_inet 3
|
||||
/* lmtp_connect 3
|
||||
/* SUMMARY
|
||||
/* connect to LMTP server
|
||||
/* SYNOPSIS
|
||||
@ -12,13 +12,22 @@
|
||||
/* DESCRIPTION
|
||||
/* This module implements LMTP connection management.
|
||||
/*
|
||||
/* lmtp_connect() attempts to establish an LMTP session with a host.
|
||||
/* lmtp_connect() attempts to establish an LMTP session.
|
||||
/*
|
||||
/* The destination is one of the following:
|
||||
/* .IP unix:address
|
||||
/* Connect to a UNIX-domain service. The destination is a pathname.
|
||||
/* Beware: UNIX-domain sockets are flakey on Solaris, at last up to
|
||||
/* and including Solaris 7.0.
|
||||
/* .IP inet:address
|
||||
/* Connect to an IPV4 service.
|
||||
/* The destination is either a host name or a numeric address.
|
||||
/* Symbolic or numeric service port information may be appended,
|
||||
/* separated by a colon (":").
|
||||
/*
|
||||
/* Numerical address information should always be quoted with `[]'.
|
||||
/* .PP
|
||||
/* When no transport is specified, "inet" is assumed.
|
||||
/* DIAGNOSTICS
|
||||
/* This routine either returns an LMTP_SESSION pointer, or
|
||||
/* returns a null pointer and set the \fIlmtp_errno\fR
|
||||
@ -58,6 +67,7 @@
|
||||
|
||||
#include <sys_defs.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <errno.h>
|
||||
@ -97,6 +107,58 @@
|
||||
#include "lmtp.h"
|
||||
#include "lmtp_addr.h"
|
||||
|
||||
/*
|
||||
* Forward declaration.
|
||||
*/
|
||||
static LMTP_SESSION *lmtp_connect_sock(int, struct sockaddr *, int,
|
||||
const char *, const char *,
|
||||
const char *, VSTRING *);
|
||||
|
||||
/* lmtp_connect_unix - connect to UNIX-domain address */
|
||||
|
||||
static LMTP_SESSION *lmtp_connect_unix(const char *addr, VSTRING *why)
|
||||
{
|
||||
#undef sun
|
||||
char *myname = "lmtp_connect_unix";
|
||||
struct sockaddr_un sun;
|
||||
int len = strlen(addr);
|
||||
int sock;
|
||||
|
||||
/*
|
||||
* Sanity checks.
|
||||
*/
|
||||
if (len >= (int) sizeof(sun.sun_path)) {
|
||||
msg_warn("unix-domain name too long: %s", addr);
|
||||
lmtp_errno = LMTP_RETRY;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize.
|
||||
*/
|
||||
memset((char *) &sun, 0, sizeof(sun));
|
||||
sun.sun_family = AF_UNIX;
|
||||
#ifdef HAS_SUN_LEN
|
||||
sun.sun_len = len + 1;
|
||||
#endif
|
||||
memcpy(sun.sun_path, addr, len + 1);
|
||||
|
||||
/*
|
||||
* Create a client socket.
|
||||
*/
|
||||
if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
|
||||
msg_fatal("%s: socket: %m", myname);
|
||||
|
||||
/*
|
||||
* Connect to the LMTP server.
|
||||
*/
|
||||
if (msg_verbose)
|
||||
msg_info("%s: trying: %s...", myname, addr);
|
||||
|
||||
return (lmtp_connect_sock(sock, (struct sockaddr *) & sun, sizeof(sun),
|
||||
addr, addr, addr, why));
|
||||
}
|
||||
|
||||
/* lmtp_connect_addr - connect to explicit address */
|
||||
|
||||
static LMTP_SESSION *lmtp_connect_addr(DNS_RR *addr, unsigned port,
|
||||
@ -105,10 +167,6 @@ static LMTP_SESSION *lmtp_connect_addr(DNS_RR *addr, unsigned port,
|
||||
char *myname = "lmtp_connect_addr";
|
||||
struct sockaddr_in sin;
|
||||
int sock;
|
||||
int conn_stat;
|
||||
int saved_errno;
|
||||
VSTREAM *stream;
|
||||
int ch;
|
||||
|
||||
/*
|
||||
* Sanity checks.
|
||||
@ -137,19 +195,35 @@ static LMTP_SESSION *lmtp_connect_addr(DNS_RR *addr, unsigned port,
|
||||
if (msg_verbose)
|
||||
msg_info("%s: trying: %s[%s] port %d...",
|
||||
myname, addr->name, inet_ntoa(sin.sin_addr), ntohs(port));
|
||||
|
||||
return (lmtp_connect_sock(sock, (struct sockaddr *) & sin, sizeof(sin),
|
||||
addr->name, inet_ntoa(sin.sin_addr),
|
||||
destination, why));
|
||||
}
|
||||
|
||||
/* lmtp_connect_sock - connect a socket over some transport */
|
||||
|
||||
static LMTP_SESSION *lmtp_connect_sock(int sock, struct sockaddr * sa, int len,
|
||||
const char *name, const char *addr,
|
||||
const char *destination, VSTRING *why)
|
||||
{
|
||||
int conn_stat;
|
||||
int saved_errno;
|
||||
VSTREAM *stream;
|
||||
int ch;
|
||||
|
||||
if (var_lmtp_conn_tmout > 0) {
|
||||
non_blocking(sock, NON_BLOCKING);
|
||||
conn_stat = timed_connect(sock, (struct sockaddr *) & sin,
|
||||
sizeof(sin), var_lmtp_conn_tmout);
|
||||
conn_stat = timed_connect(sock, sa, len, var_lmtp_conn_tmout);
|
||||
saved_errno = errno;
|
||||
non_blocking(sock, BLOCKING);
|
||||
errno = saved_errno;
|
||||
} else {
|
||||
conn_stat = connect(sock, (struct sockaddr *) & sin, sizeof(sin));
|
||||
conn_stat = connect(sock, sa, len);
|
||||
}
|
||||
if (conn_stat < 0) {
|
||||
vstring_sprintf(why, "connect to %s[%s]: %m",
|
||||
addr->name, inet_ntoa(sin.sin_addr));
|
||||
name, addr);
|
||||
lmtp_errno = LMTP_RETRY;
|
||||
close(sock);
|
||||
return (0);
|
||||
@ -160,7 +234,7 @@ static LMTP_SESSION *lmtp_connect_addr(DNS_RR *addr, unsigned port,
|
||||
*/
|
||||
if (read_wait(sock, var_lmtp_lhlo_tmout) < 0) {
|
||||
vstring_sprintf(why, "connect to %s[%s]: read timeout",
|
||||
addr->name, inet_ntoa(sin.sin_addr));
|
||||
name, addr);
|
||||
lmtp_errno = LMTP_RETRY;
|
||||
close(sock);
|
||||
return (0);
|
||||
@ -172,7 +246,7 @@ static LMTP_SESSION *lmtp_connect_addr(DNS_RR *addr, unsigned port,
|
||||
stream = vstream_fdopen(sock, O_RDWR);
|
||||
if ((ch = VSTREAM_GETC(stream)) == VSTREAM_EOF) {
|
||||
vstring_sprintf(why, "connect to %s[%s]: server dropped connection",
|
||||
addr->name, inet_ntoa(sin.sin_addr));
|
||||
name, addr);
|
||||
lmtp_errno = LMTP_RETRY;
|
||||
vstream_fclose(stream);
|
||||
return (0);
|
||||
@ -184,13 +258,12 @@ static LMTP_SESSION *lmtp_connect_addr(DNS_RR *addr, unsigned port,
|
||||
*/
|
||||
if (ch == '4' || ch == '5') {
|
||||
vstring_sprintf(why, "connect to %s[%s]: server refused mail service",
|
||||
addr->name, inet_ntoa(sin.sin_addr));
|
||||
name, addr);
|
||||
lmtp_errno = LMTP_RETRY;
|
||||
vstream_fclose(stream);
|
||||
return (0);
|
||||
}
|
||||
return (lmtp_session_alloc(stream, addr->name, inet_ntoa(sin.sin_addr),
|
||||
destination));
|
||||
return (lmtp_session_alloc(stream, name, addr, destination));
|
||||
}
|
||||
|
||||
/* lmtp_connect_host - direct connection to host */
|
||||
@ -220,7 +293,7 @@ static LMTP_SESSION *lmtp_connect_host(char *host, unsigned port,
|
||||
/* lmtp_parse_destination - parse destination */
|
||||
|
||||
static char *lmtp_parse_destination(const char *destination, char *def_service,
|
||||
char **hostp, unsigned *portp)
|
||||
char **hostp, unsigned *portp)
|
||||
{
|
||||
char *myname = "lmtp_parse_destination";
|
||||
char *buf = mystrdup(destination);
|
||||
@ -272,7 +345,7 @@ static char *lmtp_parse_destination(const char *destination, char *def_service,
|
||||
|
||||
LMTP_SESSION *lmtp_connect(const char *destination, VSTRING *why)
|
||||
{
|
||||
char *myname = "lmtp_connect_inet";
|
||||
char *myname = "lmtp_connect";
|
||||
LMTP_SESSION *session;
|
||||
char *dest_buf;
|
||||
char *host;
|
||||
@ -281,7 +354,15 @@ LMTP_SESSION *lmtp_connect(const char *destination, VSTRING *why)
|
||||
|
||||
/*
|
||||
* Connect to the LMTP server.
|
||||
*
|
||||
* XXX Ad-hoc transport parsing and connection management. Some or all
|
||||
* should be moved away to a reusable library routine so that every
|
||||
* program benefits from it.
|
||||
*/
|
||||
if (strncmp(destination, "unix:", 5) == 0)
|
||||
return (lmtp_connect_unix(destination + 5, why));
|
||||
if (strncmp(destination, "inet:", 5) == 0)
|
||||
destination += 5;
|
||||
dest_buf = lmtp_parse_destination(destination, def_service,
|
||||
&host, &port);
|
||||
if (msg_verbose)
|
||||
|
@ -246,11 +246,9 @@ int lmtp_lhlo(LMTP_STATE *state)
|
||||
* because they benefit little from pipelining.
|
||||
*/
|
||||
if (state->features & LMTP_FEATURE_PIPELINING) {
|
||||
if (getsockopt(vstream_fileno(state->session->stream), SOL_SOCKET,
|
||||
SO_SNDBUF, (char *) &state->sndbufsize, &optlen) < 0)
|
||||
msg_fatal("%s: getsockopt: %m", myname);
|
||||
state->sndbufsize = 4 * 1024;
|
||||
if (msg_verbose)
|
||||
msg_info("Using LMTP PIPELINING, TCP send buffer size is %d",
|
||||
msg_info("Using LMTP PIPELINING, send buffer size is %d",
|
||||
state->sndbufsize);
|
||||
} else
|
||||
state->sndbufsize = 0;
|
||||
|
@ -21,6 +21,10 @@
|
||||
/* the destination host, sorts the list by preference, and connects
|
||||
/* to each listed address until it finds a server that responds.
|
||||
/*
|
||||
/* When the domain or host is specified as a comma/whitespace
|
||||
/* separated list, the SMTP client repeats the above process
|
||||
/* for all destinations until it finds a server that responds.
|
||||
/*
|
||||
/* Once the SMTP client has received the server greeting banner, no
|
||||
/* error will cause it to proceed to the next address on the mail
|
||||
/* exchanger list. Instead, the message is either bounced, or its
|
||||
|
@ -401,7 +401,7 @@ SMTP_SESSION *smtp_connect(char *destination, VSTRING *why)
|
||||
*/
|
||||
cp = save = concatenate(destination, " ", var_fallback_relay, (char *) 0);
|
||||
|
||||
while ((dest = mystrtok(&cp, " \t\r\n")) != 0) {
|
||||
while ((dest = mystrtok(&cp, ", \t\r\n")) != 0) {
|
||||
|
||||
/*
|
||||
* Parse the destination. Default is to use the SMTP port.
|
||||
|
@ -353,6 +353,13 @@ char *smtpd_path;
|
||||
#define STR(x) vstring_str(x)
|
||||
#define LEN(x) VSTRING_LEN(x)
|
||||
|
||||
/*
|
||||
* Forward declarations.
|
||||
*/
|
||||
static void helo_reset(SMTPD_STATE *);
|
||||
static void mail_reset(SMTPD_STATE *);
|
||||
static void rcpt_reset(SMTPD_STATE *);
|
||||
|
||||
/* collapse_args - put arguments together again */
|
||||
|
||||
static void collapse_args(int argc, SMTPD_TOKEN *argv)
|
||||
@ -377,10 +384,8 @@ static int helo_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
|
||||
smtpd_chat_reply(state, "501 Syntax: HELO hostname");
|
||||
return (-1);
|
||||
}
|
||||
if (state->helo_name != 0) {
|
||||
myfree(state->helo_name);
|
||||
state->helo_name = 0;
|
||||
}
|
||||
if (state->helo_name != 0)
|
||||
helo_reset(state);
|
||||
if (argc > 2)
|
||||
collapse_args(argc - 1, argv + 1);
|
||||
if (SMTPD_STAND_ALONE(state) == 0
|
||||
@ -406,10 +411,12 @@ static int ehlo_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
|
||||
smtpd_chat_reply(state, "501 Syntax: EHLO hostname");
|
||||
return (-1);
|
||||
}
|
||||
if (state->helo_name != 0) {
|
||||
myfree(state->helo_name);
|
||||
state->helo_name = 0;
|
||||
}
|
||||
if (state->helo_name != 0)
|
||||
helo_reset(state);
|
||||
#if 0
|
||||
mail_reset(state);
|
||||
rcpt_reset(state);
|
||||
#endif
|
||||
if (argc > 2)
|
||||
collapse_args(argc - 1, argv + 1);
|
||||
if (SMTPD_STAND_ALONE(state) == 0
|
||||
|
@ -4,12 +4,19 @@
|
||||
/* SUMMARY
|
||||
/* multi-threaded SMTP/LMTP test server
|
||||
/* SYNOPSIS
|
||||
/* smtp-sink [-cLpv] [-w delay] [host]:port backlog
|
||||
/* .fi
|
||||
/* \fBsmtp-sink\fR [\fB-cLpv\fR] [\fB-w \fIdelay\fR]
|
||||
/* [\fBinet:\fR][\fIhost\fR]:\fIport\fR \fIbacklog\fR
|
||||
/*
|
||||
/* \fBsmtp-sink\fR [\fB-cLpv\fR] [\fB-w \fIdelay\fR]
|
||||
/* \fBunix:\fR\fIpathname\fR \fIbacklog\fR
|
||||
/* DESCRIPTION
|
||||
/* \fIsmtp-sink\fR listens on the named host (or address) and port.
|
||||
/* It takes SMTP messages from the network and throws them away.
|
||||
/* The purpose is to measure SMTP client performance, not protocol
|
||||
/* compliance.
|
||||
/* Connections can be accepted on IPV4 endpoints or UNIX-domain sockets.
|
||||
/* IPV4 is the default.
|
||||
/* This program is the complement of the \fIsmtp-source\fR program.
|
||||
/* .IP -c
|
||||
/* Display a running counter that is updated whenever an SMTP
|
||||
@ -392,7 +399,13 @@ int main(int argc, char **argv)
|
||||
*/
|
||||
buffer = vstring_alloc(1024);
|
||||
var_myhostname = "smtp-sink";
|
||||
sock = inet_listen(argv[optind], backlog, BLOCKING);
|
||||
if (strncmp(argv[optind], "unix:", 5) == 0) {
|
||||
sock = unix_listen(argv[optind] + 5, backlog, BLOCKING);
|
||||
} else {
|
||||
if (strncmp(argv[optind], "inet:", 5) == 0)
|
||||
argv[optind] += 5;
|
||||
sock = inet_listen(argv[optind], backlog, BLOCKING);
|
||||
}
|
||||
|
||||
/*
|
||||
* Start the event handler.
|
||||
|
@ -4,12 +4,16 @@
|
||||
/* SUMMARY
|
||||
/* multi-threaded SMTP test generator
|
||||
/* SYNOPSIS
|
||||
/* smtp-source [options] host[:port]
|
||||
/* .fi
|
||||
/* \fBsmtp-source\fR [\fIoptions\fR] [\fBinet:\fR]\fIhost\fR[:\fIport\fR]
|
||||
/*
|
||||
/* \fBsmtp-source\fR [\fIoptions\fR] \fBunix:\fIpathname\fR
|
||||
/* DESCRIPTION
|
||||
/* smtp-source connects to the named host and port (default 25)
|
||||
/* and sends one or more little messages to it, either sequentially
|
||||
/* or in parallel. The program speaks either SMTP (default) or
|
||||
/* LMTP.
|
||||
/* LMTP. Connections can be made to UNIX-domain and IPV4 servers.
|
||||
/* IPV4 is the default.
|
||||
/*
|
||||
/* Options:
|
||||
/* .IP -c
|
||||
@ -64,6 +68,7 @@
|
||||
#include <sys/socket.h>
|
||||
#include <sys/wait.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/un.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
@ -131,6 +136,10 @@ static const char *var_myhostname;
|
||||
static int session_count;
|
||||
static int message_count = 1;
|
||||
static struct sockaddr_in sin;
|
||||
#undef sun
|
||||
static struct sockaddr_un sun;
|
||||
static struct sockaddr *sa;
|
||||
static int sa_len;
|
||||
static int recipients = 1;
|
||||
static char *defaddr;
|
||||
static char *recipient;
|
||||
@ -383,14 +392,13 @@ static void start_connect(SESSION *session)
|
||||
* retrieving it later with getsockopt(). We can't use MSG_PEEK to
|
||||
* distinguish between server disconnect and connection refused.
|
||||
*/
|
||||
if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||
if ((fd = socket(sa->sa_family, SOCK_STREAM, 0)) < 0)
|
||||
msg_fatal("socket: %m");
|
||||
(void) non_blocking(fd, NON_BLOCKING);
|
||||
session->stream = vstream_fdopen(fd, O_RDWR);
|
||||
event_enable_write(fd, connect_done, (char *) session);
|
||||
smtp_timeout_setup(session->stream, var_timeout);
|
||||
if (connect(fd, (struct sockaddr *) & sin, sizeof(sin)) < 0
|
||||
&& errno != EINPROGRESS)
|
||||
if (connect(fd, sa, sa_len) < 0 && errno != EINPROGRESS)
|
||||
fail_connect(session);
|
||||
}
|
||||
|
||||
@ -739,6 +747,8 @@ int main(int argc, char **argv)
|
||||
SESSION *session;
|
||||
char *host;
|
||||
char *port;
|
||||
char *path;
|
||||
int path_len;
|
||||
int sessions = 1;
|
||||
int ch;
|
||||
int i;
|
||||
@ -813,8 +823,6 @@ int main(int argc, char **argv)
|
||||
}
|
||||
if (argc - optind != 1)
|
||||
usage(argv[0]);
|
||||
if ((port = split_at(host = argv[optind], ':')) == 0)
|
||||
port = "smtp";
|
||||
|
||||
if (random_delay > 0)
|
||||
srand(getpid());
|
||||
@ -822,10 +830,31 @@ int main(int argc, char **argv)
|
||||
/*
|
||||
* Translate endpoint address to internal form.
|
||||
*/
|
||||
memset((char *) &sin, 0, sizeof(sin));
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_addr.s_addr = find_inet_addr(host);
|
||||
sin.sin_port = find_inet_port(port, "tcp");
|
||||
if (strncmp(argv[optind], "unix:", 5) == 0) {
|
||||
path = argv[optind] + 5;
|
||||
path_len = strlen(path);
|
||||
if (path_len >= (int) sizeof(sun.sun_path))
|
||||
msg_fatal("unix-domain name too long: %s", path);
|
||||
memset((char *) &sun, 0, sizeof(sun));
|
||||
sun.sun_family = AF_UNIX;
|
||||
#ifdef HAS_SUN_LEN
|
||||
sun.sun_len = path_len + 1;
|
||||
#endif
|
||||
memcpy(sun.sun_path, path, path_len);
|
||||
sa = (struct sockaddr *) & sun;
|
||||
sa_len = sizeof(sun);
|
||||
} else {
|
||||
if (strncmp(argv[optind], "inet:", 5) == 0)
|
||||
argv[optind] += 5;
|
||||
if ((port = split_at(host = argv[optind], ':')) == 0)
|
||||
port = "smtp";
|
||||
memset((char *) &sin, 0, sizeof(sin));
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_addr.s_addr = find_inet_addr(host);
|
||||
sin.sin_port = find_inet_port(port, "tcp");
|
||||
sa = (struct sockaddr *) & sin;
|
||||
sa_len = sizeof(sin);
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure the SMTP server cannot run us out of memory by sending
|
||||
|
@ -82,6 +82,10 @@
|
||||
#define DONT_CLOBBER DB_NOOVERWRITE
|
||||
#endif
|
||||
|
||||
#ifndef DB_FCNTL_LOCKING
|
||||
#define DB_FCNTL_LOCKING 0
|
||||
#endif
|
||||
|
||||
/* Utility library. */
|
||||
|
||||
#include "msg.h"
|
||||
@ -399,6 +403,8 @@ static void dict_db_close(DICT *dict)
|
||||
{
|
||||
DICT_DB *dict_db = (DICT_DB *) dict;
|
||||
|
||||
if (DICT_DB_SYNC(dict_db->db, 0) < 0)
|
||||
msg_fatal("flush database %s: %m", dict_db->path);
|
||||
if (DICT_DB_CLOSE(dict_db->db) < 0)
|
||||
msg_fatal("close database %s: %m", dict_db->path);
|
||||
myfree(dict_db->path);
|
||||
|
@ -1,4 +1,3 @@
|
||||
|
||||
/*++
|
||||
/* NAME
|
||||
/* dict_ldap 3
|
||||
@ -32,14 +31,20 @@
|
||||
/* The port the LDAP server listens on.
|
||||
/* .IP \fIldapsource_\fRsearch_base
|
||||
/* The LDAP search base, for example: \fIO=organization name, C=country\fR.
|
||||
/* .IP \fIldapsource_\fRdomain
|
||||
/* If specified, only lookups ending in this value will be queried.
|
||||
/* This can significantly reduce the query load on the LDAP server.
|
||||
/* .IP \fIldapsource_\fRtimeout
|
||||
/* Deadline for LDAP open() and LDAP search() .
|
||||
/* .IP \fIldapsource_\fRquery_filter
|
||||
/* The filter used to search for directory entries, for example
|
||||
/* \fI(mailacceptinggeneralid=%s)\fR.
|
||||
/* .IP \fIldapsource_\fRresult_attribute
|
||||
/* The attribute returned by the search, in which to find
|
||||
/* The attribute(s) returned by the search, in which to find
|
||||
/* RFC822 addresses, for example \fImaildrop\fR.
|
||||
/* .IP \fIldapsource_\fRspecial_result_attribute
|
||||
/* The attribute(s) of directory entries that can contain DNs or URLs.
|
||||
/* If found, a recursive subsequent search is done using their values.
|
||||
/* .IP \fIldapsource_\fRscope
|
||||
/* LDAP search scope: sub, base, or one.
|
||||
/* .IP \fIldapsource_\fRbind
|
||||
@ -70,7 +75,7 @@
|
||||
/* Yorktown Heights, NY 10532, USA
|
||||
/*
|
||||
/* John Hensley
|
||||
/* roll@ic.net
|
||||
/* john@sunislelodge.com
|
||||
/*
|
||||
/*--*/
|
||||
|
||||
@ -90,6 +95,8 @@
|
||||
|
||||
/* Utility library. */
|
||||
|
||||
#include "match_list.h"
|
||||
#include "match_ops.h"
|
||||
#include "msg.h"
|
||||
#include "mymalloc.h"
|
||||
#include "vstring.h"
|
||||
@ -107,8 +114,10 @@ typedef struct {
|
||||
int server_port;
|
||||
int scope;
|
||||
char *search_base;
|
||||
MATCH_LIST *domain;
|
||||
char *query_filter;
|
||||
char *result_attribute;
|
||||
ARGV *result_attributes;
|
||||
int num_attributes; /* rest of list is DN's. */
|
||||
int bind;
|
||||
char *bind_dn;
|
||||
char *bind_pw;
|
||||
@ -170,9 +179,13 @@ static int dict_ldap_connect(DICT_LDAP *dict_ldap)
|
||||
|
||||
/*
|
||||
* Configure alias dereferencing for this connection. Thanks to Mike
|
||||
* Mattice for this.
|
||||
* Mattice for this, and to Hery Rakotoarisoa for the v3 update.
|
||||
*/
|
||||
#if (LDAP_API_VERSION >= 2000)
|
||||
ldap_set_option(dict_ldap->ld, LDAP_OPT_DEREF, &(dict_ldap->dereference));
|
||||
#else
|
||||
dict_ldap->ld->ld_deref = dict_ldap->dereference;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If this server requires a bind, do so. Thanks to Sam Tardieu for
|
||||
@ -227,27 +240,138 @@ static int dict_ldap_connect(DICT_LDAP *dict_ldap)
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* dict_ldap_get_values: for each entry returned by a search, get the values
|
||||
* of all its attributes. Recurses to resolve any DN or URL values found.
|
||||
*
|
||||
* This and the rest of the handling of multiple attributes, DNs and URLs
|
||||
* are thanks to LaMont Jones.
|
||||
*/
|
||||
static void dict_ldap_get_values(DICT_LDAP *dict_ldap, LDAPMessage * res,
|
||||
VSTRING * result)
|
||||
{
|
||||
long i = 0;
|
||||
int rc = 0;
|
||||
LDAPMessage *resloop = 0;
|
||||
LDAPMessage *entry = 0;
|
||||
BerElement *ber;
|
||||
char **vals;
|
||||
char *attr;
|
||||
char *myname = "dict_ldap_get_values";
|
||||
struct timeval tv;
|
||||
|
||||
tv.tv_sec = dict_ldap->timeout;
|
||||
tv.tv_usec = 0;
|
||||
|
||||
if (msg_verbose)
|
||||
msg_info("%s: Search found %d match(es)", myname,
|
||||
ldap_count_entries(dict_ldap->ld, res));
|
||||
|
||||
for (entry = ldap_first_entry(dict_ldap->ld, res); entry != NULL;
|
||||
entry = ldap_next_entry(dict_ldap->ld, entry)) {
|
||||
attr = ldap_first_attribute(dict_ldap->ld, entry, &ber);
|
||||
if (attr == NULL) {
|
||||
msg_warn("%s: no attributes found", myname);
|
||||
continue;
|
||||
}
|
||||
for (; attr != NULL;
|
||||
attr = ldap_next_attribute(dict_ldap->ld, entry, ber)) {
|
||||
|
||||
vals = ldap_get_values(dict_ldap->ld, entry, attr);
|
||||
if (vals == NULL) {
|
||||
msg_warn("%s: Entry doesn't have any values for %s",
|
||||
myname, attr);
|
||||
continue;
|
||||
}
|
||||
for (i = 0; dict_ldap->result_attributes->argv[i]; i++) {
|
||||
if (strcasecmp(dict_ldap->result_attributes->argv[i],
|
||||
attr) == 0) {
|
||||
if (msg_verbose)
|
||||
msg_info("%s: search returned value(s) for requested result attribute %s", myname, attr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Append each returned address to the result list, possibly
|
||||
* recursing (for dn or url attributes).
|
||||
*/
|
||||
if (i < dict_ldap->num_attributes) {
|
||||
for (i = 0; vals[i] != NULL; i++) {
|
||||
if (VSTRING_LEN(result) > 0)
|
||||
vstring_strcat(result, ",");
|
||||
vstring_strcat(result, vals[i]);
|
||||
}
|
||||
} else if (dict_ldap->result_attributes->argv[i]) {
|
||||
for (i = 0; vals[i] != NULL; i++) {
|
||||
if (ldap_is_ldap_url(vals[i])) {
|
||||
if (msg_verbose)
|
||||
msg_info("%s: looking up URL %s", myname,
|
||||
vals[i]);
|
||||
rc = ldap_url_search_st(dict_ldap->ld, vals[i],
|
||||
0, &tv, &resloop);
|
||||
} else {
|
||||
if (msg_verbose)
|
||||
msg_info("%s: looking up DN %s", myname, vals[i]);
|
||||
rc = ldap_search_st(dict_ldap->ld, vals[i],
|
||||
LDAP_SCOPE_BASE, "objectclass=*",
|
||||
dict_ldap->result_attributes->argv,
|
||||
0, &tv, &resloop);
|
||||
}
|
||||
if (rc == LDAP_SUCCESS)
|
||||
dict_ldap_get_values(dict_ldap, resloop, result);
|
||||
else {
|
||||
msg_warn("%s: search error %d: %s ", myname, rc,
|
||||
ldap_err2string(rc));
|
||||
dict_errno = DICT_ERR_RETRY;
|
||||
}
|
||||
if (resloop != 0)
|
||||
ldap_msgfree(resloop);
|
||||
}
|
||||
}
|
||||
ldap_value_free(vals);
|
||||
}
|
||||
}
|
||||
if (msg_verbose)
|
||||
msg_info("%s: Leaving %s", myname, myname);
|
||||
}
|
||||
|
||||
/* dict_ldap_lookup - find database entry */
|
||||
|
||||
static const char *dict_ldap_lookup(DICT *dict, const char *name)
|
||||
{
|
||||
char *myname = "dict_ldap_lookup";
|
||||
DICT_LDAP *dict_ldap = (DICT_LDAP *) dict;
|
||||
static VSTRING *result;
|
||||
LDAPMessage *res = 0;
|
||||
LDAPMessage *entry = 0;
|
||||
static VSTRING *result;
|
||||
struct timeval tv;
|
||||
VSTRING *escaped_name = 0,
|
||||
*filter_buf = 0;
|
||||
char *result_attributes[1],
|
||||
**attr_values;
|
||||
long i = 0;
|
||||
int rc = 0;
|
||||
char *sub,
|
||||
*end;
|
||||
|
||||
dict_errno = 0;
|
||||
|
||||
if (msg_verbose)
|
||||
msg_info("%s: In dict_ldap_lookup", myname);
|
||||
|
||||
/*
|
||||
* If they specified a domain list for this map, then only search for
|
||||
* addresses in domains on the list. This can significantly reduce the
|
||||
* load on the LDAP server.
|
||||
*/
|
||||
if (dict_ldap->domain) {
|
||||
if (strrchr(name, '@') != 0) {
|
||||
if (match_list_match(dict_ldap->domain, (char *) strrchr(name, '@') + 1) == 0) {
|
||||
if (msg_verbose)
|
||||
msg_info("%s: domain of %s not found in domain list", myname,
|
||||
name);
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the result holder.
|
||||
*/
|
||||
@ -255,9 +379,6 @@ static const char *dict_ldap_lookup(DICT *dict, const char *name)
|
||||
result = vstring_alloc(2);
|
||||
vstring_strcpy(result, "");
|
||||
|
||||
if (msg_verbose)
|
||||
msg_info("%s: In dict_ldap_lookup", myname);
|
||||
|
||||
/*
|
||||
* Connect to the LDAP server, if necessary.
|
||||
*/
|
||||
@ -371,56 +492,35 @@ static const char *dict_ldap_lookup(DICT *dict, const char *name)
|
||||
msg_info("%s: Searching with filter %s", myname,
|
||||
vstring_str(filter_buf));
|
||||
|
||||
/*
|
||||
* Put result_attribute in an array, so the search can return only that
|
||||
* attribute and not the entire entry.
|
||||
*/
|
||||
result_attributes[0] = dict_ldap->result_attribute;
|
||||
|
||||
if ((rc = ldap_search_st(dict_ldap->ld, dict_ldap->search_base,
|
||||
dict_ldap->scope,
|
||||
vstring_str(filter_buf),
|
||||
result_attributes,
|
||||
dict_ldap->result_attributes->argv,
|
||||
0, &tv, &res)) == LDAP_SUCCESS) {
|
||||
|
||||
/*
|
||||
* Search worked; extract the requested result_attribute.
|
||||
*/
|
||||
if (msg_verbose)
|
||||
msg_info("%s: Search found %d match(es)", myname,
|
||||
ldap_count_entries(dict_ldap->ld, res));
|
||||
|
||||
dict_ldap_get_values(dict_ldap, res, result);
|
||||
|
||||
/*
|
||||
* There could have been lots of hits.
|
||||
* OpenLDAP's ldap_next_attribute returns a bogus
|
||||
* LDAP_DECODING_ERROR; I'm ignoring that for now.
|
||||
*/
|
||||
for (entry = ldap_first_entry(dict_ldap->ld, res); entry != NULL;
|
||||
entry = ldap_next_entry(dict_ldap->ld, entry)) {
|
||||
|
||||
/*
|
||||
* And each entry could have multiple attributes.
|
||||
*/
|
||||
attr_values = ldap_get_values(dict_ldap->ld, entry,
|
||||
dict_ldap->result_attribute);
|
||||
if (attr_values == NULL) {
|
||||
msg_warn("%s: Entry doesn't have any values for %s",
|
||||
myname, dict_ldap->result_attribute);
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Append each returned address to the result list.
|
||||
*/
|
||||
for (i = 0; attr_values[i] != NULL; i++) {
|
||||
if (VSTRING_LEN(result) > 0)
|
||||
vstring_strcat(result, ",");
|
||||
vstring_strcat(result, attr_values[i]);
|
||||
}
|
||||
ldap_value_free(attr_values);
|
||||
}
|
||||
if (dict_ldap->ld->ld_errno != LDAP_SUCCESS)
|
||||
#if (LDAP_API_VERSION >= 2000)
|
||||
ldap_get_option(dict_ldap->ld, LDAP_OPT_ERROR_NUMBER, &rc);
|
||||
if (rc != LDAP_SUCCESS && rc != LDAP_DECODING_ERROR)
|
||||
msg_warn("%s: Had some trouble with entries returned by search: %s", myname, ldap_err2string(rc));
|
||||
#else
|
||||
if (dict_ldap->ld->ld_errno != LDAP_SUCCESS &&
|
||||
dict_ldap->ld->ld_errno != LDAP_DECODING_ERROR)
|
||||
msg_warn
|
||||
("%s: Had some trouble with entries returned by search: %s",
|
||||
myname, ldap_err2string(dict_ldap->ld->ld_errno));
|
||||
#endif
|
||||
|
||||
if (msg_verbose)
|
||||
msg_info("%s: Search returned %s", myname,
|
||||
VSTRING_LEN(result) >
|
||||
@ -454,7 +554,11 @@ static const char *dict_ldap_lookup(DICT *dict, const char *name)
|
||||
if (filter_buf != 0)
|
||||
vstring_free(filter_buf);
|
||||
|
||||
return (VSTRING_LEN(result) > 0 ? vstring_str(result) : 0);
|
||||
/*
|
||||
* If we had an error, return nothing, Otherwise, return the result, if
|
||||
* any.
|
||||
*/
|
||||
return (VSTRING_LEN(result) > 0 && !dict_errno ? vstring_str(result) : 0);
|
||||
}
|
||||
|
||||
/* dict_ldap_update - add or update database entry */
|
||||
@ -478,8 +582,9 @@ static void dict_ldap_close(DICT *dict)
|
||||
myfree(dict_ldap->ldapsource);
|
||||
myfree(dict_ldap->server_host);
|
||||
myfree(dict_ldap->search_base);
|
||||
match_list_free(dict_ldap->domain);
|
||||
myfree(dict_ldap->query_filter);
|
||||
myfree(dict_ldap->result_attribute);
|
||||
argv_free(dict_ldap->result_attributes);
|
||||
myfree(dict_ldap->bind_dn);
|
||||
myfree(dict_ldap->bind_pw);
|
||||
myfree((char *) dict_ldap);
|
||||
@ -492,8 +597,9 @@ DICT *dict_ldap_open(const char *ldapsource, int dummy, int dict_flags)
|
||||
char *myname = "dict_ldap_open";
|
||||
DICT_LDAP *dict_ldap;
|
||||
VSTRING *config_param;
|
||||
int rc = 0;
|
||||
char *domainlist;
|
||||
char *scope;
|
||||
char *attr;
|
||||
|
||||
dict_ldap = (DICT_LDAP *) mymalloc(sizeof(*dict_ldap));
|
||||
dict_ldap->dict.lookup = dict_ldap_lookup;
|
||||
@ -566,6 +672,20 @@ DICT *dict_ldap_open(const char *ldapsource, int dummy, int dict_flags)
|
||||
msg_info("%s: %s is %s", myname, vstring_str(config_param),
|
||||
dict_ldap->search_base);
|
||||
|
||||
vstring_sprintf(config_param, "%s_domain", ldapsource);
|
||||
domainlist =
|
||||
mystrdup((char *) get_mail_conf_str(vstring_str(config_param),
|
||||
"", 0, 0));
|
||||
if (domainlist) {
|
||||
dict_ldap->domain = match_list_init(domainlist, 1, match_string);
|
||||
if (dict_ldap->domain == NULL)
|
||||
msg_warn("%s: domain match list creation using \"%s\" failed, will continue without it", myname, domainlist);
|
||||
if (msg_verbose)
|
||||
msg_info("%s: domain list created using \"%s\"", myname,
|
||||
domainlist);
|
||||
myfree(domainlist);
|
||||
}
|
||||
|
||||
/*
|
||||
* get configured value of "ldapsource_timeout"; default to 10 seconds
|
||||
*
|
||||
@ -589,12 +709,22 @@ DICT *dict_ldap_open(const char *ldapsource, int dummy, int dict_flags)
|
||||
dict_ldap->query_filter);
|
||||
|
||||
vstring_sprintf(config_param, "%s_result_attribute", ldapsource);
|
||||
dict_ldap->result_attribute =
|
||||
mystrdup((char *) get_mail_conf_str(vstring_str(config_param),
|
||||
"maildrop", 0, 0));
|
||||
attr = mystrdup((char *) get_mail_conf_str(vstring_str(config_param),
|
||||
"maildrop", 0, 0));
|
||||
if (msg_verbose)
|
||||
msg_info("%s: %s is %s", myname, vstring_str(config_param),
|
||||
dict_ldap->result_attribute);
|
||||
msg_info("%s: %s is %s", myname, vstring_str(config_param), attr);;
|
||||
dict_ldap->result_attributes = argv_split(attr, " ,\t\r\n");
|
||||
dict_ldap->num_attributes = dict_ldap->result_attributes->argc;
|
||||
|
||||
vstring_sprintf(config_param, "%s_special_result_attribute", ldapsource);
|
||||
attr = mystrdup((char *) get_mail_conf_str(vstring_str(config_param),
|
||||
"", 0, 0));
|
||||
if (msg_verbose)
|
||||
msg_info("%s: %s is %s", myname, vstring_str(config_param), attr);
|
||||
|
||||
if (*attr) {
|
||||
argv_split_append(dict_ldap->result_attributes, attr, " ,\t\r\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* get configured value of "ldapsource_bind"; default to true
|
||||
@ -646,7 +776,7 @@ DICT *dict_ldap_open(const char *ldapsource, int dummy, int dict_flags)
|
||||
dict_ldap->cache_expiry = get_mail_conf_int(vstring_str(config_param),
|
||||
30, 0, 0);
|
||||
if (msg_verbose)
|
||||
msg_info("%s: %s is %d", myname, vstring_str(config_param),
|
||||
msg_info("%s: %s is %ld", myname, vstring_str(config_param),
|
||||
dict_ldap->cache_expiry);
|
||||
|
||||
/*
|
||||
@ -656,7 +786,7 @@ DICT *dict_ldap_open(const char *ldapsource, int dummy, int dict_flags)
|
||||
dict_ldap->cache_size = get_mail_conf_int(vstring_str(config_param),
|
||||
32768, 0, 0);
|
||||
if (msg_verbose)
|
||||
msg_info("%s: %s is %d", myname, vstring_str(config_param),
|
||||
msg_info("%s: %s is %ld", myname, vstring_str(config_param),
|
||||
dict_ldap->cache_size);
|
||||
|
||||
/*
|
||||
@ -698,3 +828,4 @@ DICT *dict_ldap_open(const char *ldapsource, int dummy, int dict_flags)
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -181,7 +181,7 @@ typedef struct {
|
||||
static DICT_OPEN_INFO dict_open_info[] = {
|
||||
"environ", dict_env_open,
|
||||
"unix", dict_unix_open,
|
||||
#if 1
|
||||
#if 0
|
||||
"tcp", dict_tcp_open,
|
||||
#endif
|
||||
#ifdef HAS_DBM
|
||||
|
Loading…
x
Reference in New Issue
Block a user