mirror of
https://github.com/vdukhovni/postfix
synced 2025-09-01 06:35:27 +00:00
postfix-2.0.16-20040105
This commit is contained in:
committed by
Viktor Dukhovni
parent
8fb3e35efe
commit
8b3ac07c69
@@ -8978,13 +8978,13 @@ Apologies for any names omitted.
|
|||||||
used by the Postfix SMTP server. Liviu Daia. Files:
|
used by the Postfix SMTP server. Liviu Daia. Files:
|
||||||
mail_params.h, smtpd.c, smtpd_sasl_glue.c.
|
mail_params.h, smtpd.c, smtpd_sasl_glue.c.
|
||||||
|
|
||||||
Cleanup: shared config file parser for ldap, mysql, pgsql
|
Cleanup: the LDAP client configuration parser is now shared
|
||||||
lookup tables. Liviu Daia. Files: global/cfgparser.[hc],
|
between the LDAP, MySQL, and PGSQL clients. Liviu Daia.
|
||||||
global/dict_ldap.c, global/dict_mtsql.c, global/dict_pgsql.c
|
Files: global/cfgparser.[hc], global/dict_ldap.c,
|
||||||
and documentation.
|
global/dict_mtsql.c, global/dict_pgsql.c and documentation.
|
||||||
|
|
||||||
Cleanup: moved modules with dependencies on higher-level
|
Cleanup: moved "util" modules with dependencies on higher-level
|
||||||
code from the util directory to the global directory:
|
"global" code from the util directory to the global directory:
|
||||||
util/dict_open.c, global/cfgparser.[hc], global/dict_ldap.c,
|
util/dict_open.c, global/cfgparser.[hc], global/dict_ldap.c,
|
||||||
global/dict_mtsql.c, global/dict_pgsql.c, global/mail_dict.c.
|
global/dict_mtsql.c, global/dict_pgsql.c, global/mail_dict.c.
|
||||||
|
|
||||||
@@ -8998,6 +8998,19 @@ Apologies for any names omitted.
|
|||||||
character stored. This avoids mis-leading warnings. File:
|
character stored. This avoids mis-leading warnings. File:
|
||||||
global/vstring_vstream.c.
|
global/vstring_vstream.c.
|
||||||
|
|
||||||
|
20040105
|
||||||
|
|
||||||
|
Cleanup: don't bother the flush daemon while deferring mail
|
||||||
|
if the destination is not "fast flush" eligible. File:
|
||||||
|
global/flush_clnt.c.
|
||||||
|
|
||||||
|
Safety: the SMTP server flushes recipients to the cleanup
|
||||||
|
server in order to avoid SMTP timeouts when virtual or
|
||||||
|
canonical expansions take a lot of time. File smtpd/smtpd.c.
|
||||||
|
|
||||||
|
Safety: add warnings to postmap and postalias when table
|
||||||
|
lookup results in an empty string.
|
||||||
|
|
||||||
Open problems:
|
Open problems:
|
||||||
|
|
||||||
Low: in the SMTP client, pass the session, request and
|
Low: in the SMTP client, pass the session, request and
|
||||||
|
@@ -314,7 +314,7 @@ filtering for incoming mail. This is required or else mail will
|
|||||||
stay in the content filtering loop.
|
stay in the content filtering loop.
|
||||||
|
|
||||||
The "-o receive_override_options" overrides main.cf. It is
|
The "-o receive_override_options" overrides main.cf. It is
|
||||||
complementary to the the options that are specified in main.cf:
|
complementary to the options that are specified in main.cf:
|
||||||
|
|
||||||
- Disable attempts to find out if a recipient is unknown, and
|
- Disable attempts to find out if a recipient is unknown, and
|
||||||
disable header/body checks. This work was already done before
|
disable header/body checks. This work was already done before
|
||||||
|
@@ -2,6 +2,9 @@ This code was created by Andrew McNamara <andrew@connect.com.au>
|
|||||||
and adapted to snapshot 20001121 by Xavier Beaudouin. It was merged
|
and adapted to snapshot 20001121 by Xavier Beaudouin. It was merged
|
||||||
with mainstream Postfix for snapshot 20010128 by Wietse.
|
with mainstream Postfix for snapshot 20010128 by Wietse.
|
||||||
|
|
||||||
|
See the VIRTUAL_README file for an overview of how you can host
|
||||||
|
multiple domains with one Postfix system.
|
||||||
|
|
||||||
Purpose of this software
|
Purpose of this software
|
||||||
========================
|
========================
|
||||||
|
|
||||||
|
@@ -1,17 +1,258 @@
|
|||||||
Porpose of this document
|
Purpose of this document
|
||||||
========================
|
========================
|
||||||
|
|
||||||
Hosting multiple domains on one server
|
This document describes how to configure one Postfix system for
|
||||||
|
final mail delivery of multiple Internet domains, using the mailbox
|
||||||
|
and maildir delivery mechanisms that are already built into Postfix.
|
||||||
|
|
||||||
|
See the LMTP_README file for an example of final delivery with
|
||||||
|
third-party mailstores such as Cyrus.
|
||||||
|
|
||||||
UNIX system accounts, domain shared with all users
|
Preliminaries: local files versus databases
|
||||||
==================================================
|
===========================================
|
||||||
|
|
||||||
UNIX system accounts, domains not shared
|
The examples in this text use table lookups from local files.
|
||||||
========================================
|
These are easy to debug with the postmap "-q" command option.
|
||||||
|
|
||||||
Non-UNIX accounts, domains not shared
|
Example: postmap -q info@example.com hash:/etc/postfix/virtual
|
||||||
=====================================
|
|
||||||
|
See LDAP_README, MYSQL_README and PGSQL_README for how to replace
|
||||||
|
local files by databases. The reader is strongly advised to make
|
||||||
|
the system work with local files before migrating to database files,
|
||||||
|
and to use the postmap "-q" command option to verify that database
|
||||||
|
lookups produce the exact same results as local file lookup.
|
||||||
|
|
||||||
|
Example: postmap -q info@example.com:ldap:/etc/postfix/virtual.cf
|
||||||
|
|
||||||
|
Preliminaries: canonical versus virtual domains
|
||||||
|
===============================================
|
||||||
|
|
||||||
|
Each Postfix system does final delivery for a small number of
|
||||||
|
canonical domains; usually these are the names of the machine that
|
||||||
|
Postfix runs on. Sometimes the list of canonical domains also
|
||||||
|
includes the parent domain of the machine name.
|
||||||
|
|
||||||
|
Postfix can be configured to do final delivery for additional
|
||||||
|
domains. The domains are called virtual, because they are not
|
||||||
|
associated with the name of the machine itself.
|
||||||
|
|
||||||
|
Postfix understands two types of virtual domain:
|
||||||
|
|
||||||
|
- The virtual alias domain, where each virtual address is aliased
|
||||||
|
to a different (remote or local) address.
|
||||||
|
|
||||||
|
- The virtual mailbox domain, where each virtual address can have
|
||||||
|
its own mailbox.
|
||||||
|
|
||||||
|
A third type, the "sendmail style virtual domain" was described
|
||||||
|
with older Postfix versions. It will not be discussed here in order
|
||||||
|
to avoid a lot of confusion.
|
||||||
|
|
||||||
|
Shared domains, UNIX system accounts
|
||||||
|
====================================
|
||||||
|
|
||||||
|
The simplest method to host an additional domain is to specify the
|
||||||
|
user names in the UNIX password file and to specify the domain name
|
||||||
|
in the Postfix mydestination configuration parameter.
|
||||||
|
|
||||||
|
In the examples we will use "example.com" as the domain that is
|
||||||
|
being hosted on the local Postfix machine.
|
||||||
|
|
||||||
|
/etc/postfix/main.cf:
|
||||||
|
mydestination = $myhostname localhost.$mydomain ... example.com
|
||||||
|
|
||||||
|
The downside of this approach is a total lack of separation: mail
|
||||||
|
for info@my.host.name is delivered to the same UNIX system account
|
||||||
|
as mail for info@example.com. If different domains need to have
|
||||||
|
different "info" mailboxes, then you can use one of the methods
|
||||||
|
described in the remainder of this document.
|
||||||
|
|
||||||
|
Another downside of listing all users in the UNIX password file is
|
||||||
|
that administration of large numbers of users becomes inconvenient.
|
||||||
|
|
||||||
|
Virtual ALIAS domains: separate domains, UNIX system accounts
|
||||||
|
=============================================================
|
||||||
|
|
||||||
|
The simplest method to host separate domains is to create so-called
|
||||||
|
virtual aliases that redirect mail from each virtual address to
|
||||||
|
its own UNIX account.
|
||||||
|
|
||||||
|
The example below shows how to set up the example.com domain
|
||||||
|
as a so-called virtual alias domain:
|
||||||
|
|
||||||
|
/etc/postfix/main.cf:
|
||||||
|
virtual_alias_domains = example.com ...other domains...
|
||||||
|
virtual_alias_maps = hash:/etc/postfix/virtual
|
||||||
|
|
||||||
|
/etc/postfix/virtual:
|
||||||
|
postmaster@example.com postmaster
|
||||||
|
info@example.com joe
|
||||||
|
sales@example.com jane
|
||||||
|
# Uncomment entry below to implement a catch-all address
|
||||||
|
# @example.com jim
|
||||||
|
...virtual aliases for other domains...
|
||||||
|
|
||||||
|
The virtual_alias_domains setting tells Postfix that example.com
|
||||||
|
is a so-called virtual alias domain. If you omit this step then
|
||||||
|
Postfix will either reject mail (relay access denied) or will not
|
||||||
|
be able to deliver it (mail for example.com loops back to myself).
|
||||||
|
|
||||||
|
The /etc/postfix/virtual file contains the virtual aliases. With
|
||||||
|
the example above, mail for postmaster@example.com goes to the
|
||||||
|
local postmaster, while mail for info@example.com goes to the UNIX
|
||||||
|
account joe, and mail for sales@example.com goes to the UNIX account
|
||||||
|
jane. Mail for all other addresses in example.com is rejected with
|
||||||
|
the error message "User unknown".
|
||||||
|
|
||||||
|
The commented out entry (text after #) shows how one would implement
|
||||||
|
a catch-all virtual alias that receives mail for every example.com
|
||||||
|
address not listed in the virtual alias file. This is not without
|
||||||
|
risk. Spammers nowadays try to send mail from (or mail to) every
|
||||||
|
possible name that they can think of. A catch-all mailbox is likely
|
||||||
|
to receive many spam messages, and many bounces for spam messages
|
||||||
|
that were sent in the name of anything@example.com.
|
||||||
|
|
||||||
|
Execute the command "postmap /etc/postfix/virtual" after changing
|
||||||
|
the virtual file, and execute the command "postfix reload" after
|
||||||
|
changing the main.cf file.
|
||||||
|
|
||||||
|
Note: virtual aliases can resolve to a local address or to a remote
|
||||||
|
address, or both. They don't have to resolve to UNIX system accounts
|
||||||
|
on your machine.
|
||||||
|
|
||||||
|
More details about the virtual alias file are given in the virtual(5)
|
||||||
|
manual page, including multiple addresses on the right-hand side.
|
||||||
|
|
||||||
|
Virtual aliasing solves one problem: it allows each domain to have
|
||||||
|
its own info mail address. Virtual aliasing to UNIX system accounts
|
||||||
|
still has the drawback that every user has to be listed in the UNIX
|
||||||
|
password file. The next section eliminates this problem.
|
||||||
|
|
||||||
|
Virtual MAILBOX domains: separate domains, non-UNIX accounts
|
||||||
|
============================================================
|
||||||
|
|
||||||
|
As a system hosts more and more domains and users, it becomes
|
||||||
|
unpractical to give everyone their own UNIX system account.
|
||||||
|
|
||||||
|
With the Postfix virtual delivery agent, every recipient address
|
||||||
|
can have its own virtual mailbox. Unlike virtual alias domains,
|
||||||
|
there is no translation from recipient addresses into different
|
||||||
|
addresses.
|
||||||
|
|
||||||
|
The Postfix virtual delivery agent looks up the user mailbox
|
||||||
|
pathname, uid and gid via separate tables that are searched with
|
||||||
|
the recipient's mail address. Maildir style delivery is turned on
|
||||||
|
by terminating the mailbox pathname with "/".
|
||||||
|
|
||||||
|
Here is an example of a virtual mailbox domain example.com:
|
||||||
|
|
||||||
|
/etc/postfix/main.cf:
|
||||||
|
virtual_mailbox_base = /var/mail/vhosts
|
||||||
|
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
|
||||||
|
virtual_mailbox_domains = example.com ...other domains...
|
||||||
|
virtual_minimum_uid = 100
|
||||||
|
virtual_uid_maps = static:5000
|
||||||
|
virtual_gid_maps = static:5000
|
||||||
|
virtual_alias_maps = hash:/etc/postfix/virtual
|
||||||
|
|
||||||
|
/etc/postfix/vmailbox:
|
||||||
|
info@example.com example.com/info
|
||||||
|
sales@example.com example.com/sales/
|
||||||
|
# Comment out the entry below to implement a catch-all.
|
||||||
|
# @example.com example.com/catchall
|
||||||
|
...virtual mailboxes for other domains...
|
||||||
|
|
||||||
|
/etc/postfix/virtual:
|
||||||
|
postmaster@example.com postmaster
|
||||||
|
|
||||||
|
The virtual_mailbox_base parameter specifies a prefix for all
|
||||||
|
virtual mailbox pathnames. This is a safety mechanism that prevents
|
||||||
|
mail from being delivered all over the file system.
|
||||||
|
|
||||||
|
The virtual_mailbox_maps parameter specifies the lookup table with
|
||||||
|
mailbox (or maildir) pathnames, indexed by the virtual mail address.
|
||||||
|
In this example, mail for info@example.com goes to the mailbox at
|
||||||
|
/var/mail/vhosts/example.com/info while mail for sales@example.com
|
||||||
|
goes to the maildir located at /var/mail/vhosts/example.com/sales/.
|
||||||
|
|
||||||
|
The virtual_minimum_uid prevents specifies a lower bound on the
|
||||||
|
mailbox or maildir owner's UID. This is a safety mechanism that
|
||||||
|
prevents mail from being written to sensitive files.
|
||||||
|
|
||||||
|
In the above example, the virtual_uid_maps and virtual_gid_maps
|
||||||
|
parameters specify that all the virtual mailboxes are owned by a
|
||||||
|
fixed uid and gid 5000. If this is not what you want, specify
|
||||||
|
lookup tables that are searched by the recipient's mail address.
|
||||||
|
|
||||||
|
The commented out entry (text after #) shows how one would implement
|
||||||
|
a catch-all virtual mailbox address. Be prepared to receive a lot
|
||||||
|
of spam, as well as bounced spam that was sent in the name of
|
||||||
|
anything@example.com.
|
||||||
|
|
||||||
|
NEVER put a virtual MAILBOX wild-card in the virtual ALIAS file!!
|
||||||
|
|
||||||
|
As you see above, it is possible to mix virtual aliases with virtual
|
||||||
|
mailboxes. We use this feature to redirect mail for example.com's
|
||||||
|
postmaster address to the local postmaster.
|
||||||
|
|
||||||
|
Execute the command "postmap /etc/postfix/virtual" after changing
|
||||||
|
the virtual file, execute "postmap /etc/postfix/vmailbox" after
|
||||||
|
changing the vmailbox file, and execute the command "postfix reload"
|
||||||
|
after changing the main.cf file.
|
||||||
|
|
||||||
|
Note: mail delivery happens with the UID/GID privileges of the
|
||||||
|
recipient. You must create maildirs in advance before you can use
|
||||||
|
them. Depending on directory permissions, Postfix may be able to
|
||||||
|
create mailbox files by itself, but it is safer to create them
|
||||||
|
ahead of time.
|
||||||
|
|
||||||
|
More details about the virtual mailbox delivery agent are given
|
||||||
|
in the file VIRTUAL_MAILBOX_README, and in the virtual(8) manual
|
||||||
|
page.
|
||||||
|
|
||||||
Aliases, mailing lists, etc.
|
Aliases, mailing lists, etc.
|
||||||
============================
|
============================
|
||||||
|
|
||||||
|
The examples above already show how to direct mail for virtual
|
||||||
|
postmaster addresses to a local postmaster. The same method can be
|
||||||
|
used to direct mail for other virtual addresses to a local or remote
|
||||||
|
address.
|
||||||
|
|
||||||
|
Virtual aliases can't directly deliver to mailing list managers
|
||||||
|
such as majordomo. One solution is to set up a transport mapping
|
||||||
|
that directs the mail to the Postfix local delivery agent, and to
|
||||||
|
use the local alias file for delivery to the mailing list manager:
|
||||||
|
|
||||||
|
/etc/postfix/main.cf:
|
||||||
|
transport_maps = hash:/etc/postfix/transport
|
||||||
|
|
||||||
|
/etc/postfix/transport:
|
||||||
|
listname-request@example.com local:
|
||||||
|
listname@example.com local:
|
||||||
|
owner-listname@example.com local:
|
||||||
|
|
||||||
|
/etc/aliases:
|
||||||
|
listname: "|/some/where/majordomo/wrapper ..."
|
||||||
|
owner-listname: ...
|
||||||
|
listname-request: ...
|
||||||
|
|
||||||
|
You can achieve the same result with virtual aliases that direct
|
||||||
|
virtual addresses to the local delivery agent:
|
||||||
|
|
||||||
|
/etc/postfix/main.cf:
|
||||||
|
virtual_alias_maps = hash:/etc/postfix/virtual
|
||||||
|
|
||||||
|
/etc/postfix/virtual:
|
||||||
|
listname-request@example.com listname-request
|
||||||
|
listname@example.com listname
|
||||||
|
owner-listname@example.com owner-listname
|
||||||
|
|
||||||
|
/etc/aliases:
|
||||||
|
listname: "|/some/where/majordomo/wrapper ..."
|
||||||
|
owner-listname: ...
|
||||||
|
listname-request: ...
|
||||||
|
|
||||||
|
Either approach will do the job.
|
||||||
|
|
||||||
|
More information about the Postfix local delivery agent can be
|
||||||
|
found in the local(8) manual page.
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
<html> <head> </head> <body> <pre>
|
<html> <body> <pre>
|
||||||
POSTMAP(1) POSTMAP(1)
|
POSTMAP(1) POSTMAP(1)
|
||||||
|
|
||||||
<b>NAME</b>
|
<b>NAME</b>
|
||||||
|
@@ -336,7 +336,7 @@ AR = $AR
|
|||||||
ARFL = $ARFL
|
ARFL = $ARFL
|
||||||
RANLIB = $RANLIB
|
RANLIB = $RANLIB
|
||||||
SYSLIBS = $AUXLIBS $SYSLIBS
|
SYSLIBS = $AUXLIBS $SYSLIBS
|
||||||
CC = $CC $CCARGS
|
CC = $CC -DSNAPSHOT $CCARGS
|
||||||
OPT = $OPT
|
OPT = $OPT
|
||||||
DEBUG = $DEBUG
|
DEBUG = $DEBUG
|
||||||
AWK = $AWK
|
AWK = $AWK
|
||||||
|
@@ -245,6 +245,7 @@ cleanup_init.o: ../../include/name_mask.h
|
|||||||
cleanup_init.o: ../../include/mail_addr.h
|
cleanup_init.o: ../../include/mail_addr.h
|
||||||
cleanup_init.o: ../../include/mail_params.h
|
cleanup_init.o: ../../include/mail_params.h
|
||||||
cleanup_init.o: ../../include/ext_prop.h
|
cleanup_init.o: ../../include/ext_prop.h
|
||||||
|
cleanup_init.o: ../../include/flush_clnt.h
|
||||||
cleanup_init.o: cleanup.h
|
cleanup_init.o: cleanup.h
|
||||||
cleanup_init.o: ../../include/vstring.h
|
cleanup_init.o: ../../include/vstring.h
|
||||||
cleanup_init.o: ../../include/vbuf.h
|
cleanup_init.o: ../../include/vbuf.h
|
||||||
|
@@ -78,6 +78,7 @@
|
|||||||
#include <mail_addr.h>
|
#include <mail_addr.h>
|
||||||
#include <mail_params.h>
|
#include <mail_params.h>
|
||||||
#include <ext_prop.h>
|
#include <ext_prop.h>
|
||||||
|
#include <flush_clnt.h>
|
||||||
|
|
||||||
/* Application-specific. */
|
/* Application-specific. */
|
||||||
|
|
||||||
@@ -244,6 +245,8 @@ void cleanup_pre_jail(char *unused_name, char **unused_argv)
|
|||||||
cleanup_rcpt_bcc_maps =
|
cleanup_rcpt_bcc_maps =
|
||||||
maps_create(VAR_RCPT_BCC_MAPS, var_rcpt_bcc_maps,
|
maps_create(VAR_RCPT_BCC_MAPS, var_rcpt_bcc_maps,
|
||||||
DICT_FLAG_LOCK);
|
DICT_FLAG_LOCK);
|
||||||
|
|
||||||
|
flush_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* cleanup_post_jail - initialize after entering the chroot jail */
|
/* cleanup_post_jail - initialize after entering the chroot jail */
|
||||||
|
@@ -63,4 +63,5 @@ error.o: ../../include/recipient_list.h
|
|||||||
error.o: ../../include/mail_queue.h
|
error.o: ../../include/mail_queue.h
|
||||||
error.o: ../../include/bounce.h
|
error.o: ../../include/bounce.h
|
||||||
error.o: ../../include/deliver_completed.h
|
error.o: ../../include/deliver_completed.h
|
||||||
|
error.o: ../../include/flush_clnt.h
|
||||||
error.o: ../../include/mail_server.h
|
error.o: ../../include/mail_server.h
|
||||||
|
@@ -81,6 +81,7 @@
|
|||||||
#include <mail_queue.h>
|
#include <mail_queue.h>
|
||||||
#include <bounce.h>
|
#include <bounce.h>
|
||||||
#include <deliver_completed.h>
|
#include <deliver_completed.h>
|
||||||
|
#include <flush_clnt.h>
|
||||||
|
|
||||||
/* Single server skeleton. */
|
/* Single server skeleton. */
|
||||||
|
|
||||||
@@ -176,9 +177,18 @@ static void error_service(VSTREAM *client_stream, char *unused_service, char **a
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* pre_init - pre-jail initialization */
|
||||||
|
|
||||||
|
static void pre_init(char *unused_name, char **unused_argv)
|
||||||
|
{
|
||||||
|
flush_init();
|
||||||
|
}
|
||||||
|
|
||||||
/* main - pass control to the single-threaded skeleton */
|
/* main - pass control to the single-threaded skeleton */
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
single_server_main(argc, argv, error_service, 0);
|
single_server_main(argc, argv, error_service,
|
||||||
|
MAIL_SERVER_PRE_INIT, pre_init,
|
||||||
|
0);
|
||||||
}
|
}
|
||||||
|
@@ -6,6 +6,8 @@
|
|||||||
/* SYNOPSIS
|
/* SYNOPSIS
|
||||||
/* #include <flush_clnt.h>
|
/* #include <flush_clnt.h>
|
||||||
/*
|
/*
|
||||||
|
/* void flush_init()
|
||||||
|
/*
|
||||||
/* int flush_add(site, queue_id)
|
/* int flush_add(site, queue_id)
|
||||||
/* const char *site;
|
/* const char *site;
|
||||||
/* const char *queue_id;
|
/* const char *queue_id;
|
||||||
@@ -22,6 +24,9 @@
|
|||||||
/* is maintained for eligible destinations. A destination is the
|
/* is maintained for eligible destinations. A destination is the
|
||||||
/* right-hand side of a user@domain email address.
|
/* right-hand side of a user@domain email address.
|
||||||
/*
|
/*
|
||||||
|
/* flush_init() initializes. It must be called before dropping
|
||||||
|
/* privileges in a daemon process.
|
||||||
|
/*
|
||||||
/* flush_add() informs the "fast flush" cache manager that mail is
|
/* flush_add() informs the "fast flush" cache manager that mail is
|
||||||
/* queued for the specified site with the specified queue ID.
|
/* queued for the specified site with the specified queue ID.
|
||||||
/*
|
/*
|
||||||
@@ -77,13 +82,25 @@
|
|||||||
|
|
||||||
#include <mail_proto.h>
|
#include <mail_proto.h>
|
||||||
#include <mail_flush.h>
|
#include <mail_flush.h>
|
||||||
#include <flush_clnt.h>
|
|
||||||
#include <mail_params.h>
|
#include <mail_params.h>
|
||||||
|
#include <domain_list.h>
|
||||||
|
#include <match_parent_style.h>
|
||||||
|
#include <flush_clnt.h>
|
||||||
|
|
||||||
/* Application-specific. */
|
/* Application-specific. */
|
||||||
|
|
||||||
#define STR(x) vstring_str(x)
|
#define STR(x) vstring_str(x)
|
||||||
|
|
||||||
|
static DOMAIN_LIST *flush_domains;
|
||||||
|
|
||||||
|
/* flush_init - initialize */
|
||||||
|
|
||||||
|
void flush_init(void)
|
||||||
|
{
|
||||||
|
flush_domains = domain_list_init(match_parent_style(VAR_FFLUSH_DOMAINS),
|
||||||
|
var_fflush_domains);
|
||||||
|
}
|
||||||
|
|
||||||
/* flush_purge - house keeping */
|
/* flush_purge - house keeping */
|
||||||
|
|
||||||
int flush_purge(void)
|
int flush_purge(void)
|
||||||
@@ -147,9 +164,12 @@ int flush_send(const char *site)
|
|||||||
msg_info("%s: site %s", myname, site);
|
msg_info("%s: site %s", myname, site);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Don't bother the server if the service is turned off.
|
* Don't bother the server if the service is turned off, or if the site
|
||||||
|
* is not eligible.
|
||||||
*/
|
*/
|
||||||
if (*var_fflush_domains == 0)
|
if (flush_domains == 0)
|
||||||
|
msg_panic("missing flush client initialization");
|
||||||
|
if (domain_list_match(flush_domains, site) == 0)
|
||||||
status = FLUSH_STAT_DENY;
|
status = FLUSH_STAT_DENY;
|
||||||
else
|
else
|
||||||
status = mail_command_client(MAIL_CLASS_PUBLIC, var_flush_service,
|
status = mail_command_client(MAIL_CLASS_PUBLIC, var_flush_service,
|
||||||
@@ -174,9 +194,12 @@ int flush_add(const char *site, const char *queue_id)
|
|||||||
msg_info("%s: site %s id %s", myname, site, queue_id);
|
msg_info("%s: site %s id %s", myname, site, queue_id);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Don't bother the server if the service is turned off.
|
* Don't bother the server if the service is turned off, or if the site
|
||||||
|
* is not eligible.
|
||||||
*/
|
*/
|
||||||
if (*var_fflush_domains == 0)
|
if (flush_domains == 0)
|
||||||
|
msg_panic("missing flush client initialization");
|
||||||
|
if (domain_list_match(flush_domains, site) == 0)
|
||||||
status = FLUSH_STAT_DENY;
|
status = FLUSH_STAT_DENY;
|
||||||
else
|
else
|
||||||
status = mail_command_client(MAIL_CLASS_PUBLIC, var_flush_service,
|
status = mail_command_client(MAIL_CLASS_PUBLIC, var_flush_service,
|
||||||
|
@@ -14,6 +14,7 @@
|
|||||||
/*
|
/*
|
||||||
* External interface.
|
* External interface.
|
||||||
*/
|
*/
|
||||||
|
extern void flush_init(void);
|
||||||
extern int flush_add(const char *, const char *);
|
extern int flush_add(const char *, const char *);
|
||||||
extern int flush_send(const char *);
|
extern int flush_send(const char *);
|
||||||
extern int flush_refresh(void);
|
extern int flush_refresh(void);
|
||||||
|
@@ -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, unless they include the same bugfix as a patch release.
|
* release date only, unless they include the same bugfix as a patch release.
|
||||||
*/
|
*/
|
||||||
#define MAIL_RELEASE_DATE "20040104"
|
#define MAIL_RELEASE_DATE "20040105"
|
||||||
|
|
||||||
#define VAR_MAIL_VERSION "mail_version"
|
#define VAR_MAIL_VERSION "mail_version"
|
||||||
#define DEF_MAIL_VERSION "2.0.16-" MAIL_RELEASE_DATE
|
#define DEF_MAIL_VERSION "2.0.16-" MAIL_RELEASE_DATE
|
||||||
|
@@ -75,6 +75,7 @@ lmtp.o: ../../include/mail_params.h
|
|||||||
lmtp.o: ../../include/mail_conf.h
|
lmtp.o: ../../include/mail_conf.h
|
||||||
lmtp.o: ../../include/debug_peer.h
|
lmtp.o: ../../include/debug_peer.h
|
||||||
lmtp.o: ../../include/mail_error.h
|
lmtp.o: ../../include/mail_error.h
|
||||||
|
lmtp.o: ../../include/flush_clnt.h
|
||||||
lmtp.o: ../../include/mail_server.h
|
lmtp.o: ../../include/mail_server.h
|
||||||
lmtp.o: lmtp.h
|
lmtp.o: lmtp.h
|
||||||
lmtp.o: lmtp_sasl.h
|
lmtp.o: lmtp_sasl.h
|
||||||
|
@@ -253,6 +253,7 @@
|
|||||||
#include <mail_conf.h>
|
#include <mail_conf.h>
|
||||||
#include <debug_peer.h>
|
#include <debug_peer.h>
|
||||||
#include <mail_error.h>
|
#include <mail_error.h>
|
||||||
|
#include <flush_clnt.h>
|
||||||
|
|
||||||
/* Single server skeleton. */
|
/* Single server skeleton. */
|
||||||
|
|
||||||
@@ -496,6 +497,11 @@ static void pre_init(char *unused_name, char **unused_argv)
|
|||||||
msg_warn("%s is true, but SASL support is not compiled in",
|
msg_warn("%s is true, but SASL support is not compiled in",
|
||||||
VAR_LMTP_SASL_ENABLE);
|
VAR_LMTP_SASL_ENABLE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* flush client.
|
||||||
|
*/
|
||||||
|
flush_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* cleanup - close any open connections, etc. */
|
/* cleanup - close any open connections, etc. */
|
||||||
|
@@ -310,6 +310,7 @@ local.o: ../../include/mail_conf.h
|
|||||||
local.o: ../../include/been_here.h
|
local.o: ../../include/been_here.h
|
||||||
local.o: ../../include/ext_prop.h
|
local.o: ../../include/ext_prop.h
|
||||||
local.o: ../../include/maps.h
|
local.o: ../../include/maps.h
|
||||||
|
local.o: ../../include/flush_clnt.h
|
||||||
local.o: ../../include/mail_server.h
|
local.o: ../../include/mail_server.h
|
||||||
local.o: local.h
|
local.o: local.h
|
||||||
local.o: ../../include/tok822.h
|
local.o: ../../include/tok822.h
|
||||||
|
@@ -473,6 +473,7 @@
|
|||||||
#include <mail_params.h>
|
#include <mail_params.h>
|
||||||
#include <ext_prop.h>
|
#include <ext_prop.h>
|
||||||
#include <maps.h>
|
#include <maps.h>
|
||||||
|
#include <flush_clnt.h>
|
||||||
|
|
||||||
/* Single server skeleton. */
|
/* Single server skeleton. */
|
||||||
|
|
||||||
@@ -708,6 +709,8 @@ static void pre_init(char *unused_name, char **unused_argv)
|
|||||||
}
|
}
|
||||||
alias_maps = maps_create("aliases", var_alias_maps,
|
alias_maps = maps_create("aliases", var_alias_maps,
|
||||||
DICT_FLAG_LOCK | DICT_FLAG_PARANOID);
|
DICT_FLAG_LOCK | DICT_FLAG_PARANOID);
|
||||||
|
|
||||||
|
flush_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* main - pass control to the single-threaded skeleton */
|
/* main - pass control to the single-threaded skeleton */
|
||||||
|
@@ -74,6 +74,7 @@ qmgr.o: ../../include/mail_proto.h
|
|||||||
qmgr.o: ../../include/iostuff.h
|
qmgr.o: ../../include/iostuff.h
|
||||||
qmgr.o: ../../include/attr.h
|
qmgr.o: ../../include/attr.h
|
||||||
qmgr.o: ../../include/mail_flow.h
|
qmgr.o: ../../include/mail_flow.h
|
||||||
|
qmgr.o: ../../include/flush_clnt.h
|
||||||
qmgr.o: ../../include/master_proto.h
|
qmgr.o: ../../include/master_proto.h
|
||||||
qmgr.o: ../../include/mail_server.h
|
qmgr.o: ../../include/mail_server.h
|
||||||
qmgr.o: qmgr.h
|
qmgr.o: qmgr.h
|
||||||
|
@@ -255,6 +255,7 @@
|
|||||||
#include <mail_params.h>
|
#include <mail_params.h>
|
||||||
#include <mail_proto.h> /* QMGR_SCAN constants */
|
#include <mail_proto.h> /* QMGR_SCAN constants */
|
||||||
#include <mail_flow.h>
|
#include <mail_flow.h>
|
||||||
|
#include <flush_clnt.h>
|
||||||
|
|
||||||
/* Master process interface */
|
/* Master process interface */
|
||||||
|
|
||||||
@@ -437,6 +438,13 @@ static void pre_accept(char *unused_name, char **unused_argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* qmgr_pre_init - pre-jail initialization */
|
||||||
|
|
||||||
|
static void qmgr_pre_init(char *unused_name, char **unused_argv)
|
||||||
|
{
|
||||||
|
flush_init();
|
||||||
|
}
|
||||||
|
|
||||||
/* qmgr_post_init - post-jail initialization */
|
/* qmgr_post_init - post-jail initialization */
|
||||||
|
|
||||||
static void qmgr_post_init(char *unused_name, char **unused_argv)
|
static void qmgr_post_init(char *unused_name, char **unused_argv)
|
||||||
@@ -519,6 +527,7 @@ int main(int argc, char **argv)
|
|||||||
MAIL_SERVER_STR_TABLE, str_table,
|
MAIL_SERVER_STR_TABLE, str_table,
|
||||||
MAIL_SERVER_BOOL_TABLE, bool_table,
|
MAIL_SERVER_BOOL_TABLE, bool_table,
|
||||||
MAIL_SERVER_TIME_TABLE, time_table,
|
MAIL_SERVER_TIME_TABLE, time_table,
|
||||||
|
MAIL_SERVER_PRE_INIT, qmgr_pre_init,
|
||||||
MAIL_SERVER_POST_INIT, qmgr_post_init,
|
MAIL_SERVER_POST_INIT, qmgr_post_init,
|
||||||
MAIL_SERVER_LOOP, qmgr_loop,
|
MAIL_SERVER_LOOP, qmgr_loop,
|
||||||
MAIL_SERVER_PRE_ACCEPT, pre_accept,
|
MAIL_SERVER_PRE_ACCEPT, pre_accept,
|
||||||
|
@@ -83,4 +83,5 @@ pipe.o: ../../include/split_addr.h
|
|||||||
pipe.o: ../../include/off_cvt.h
|
pipe.o: ../../include/off_cvt.h
|
||||||
pipe.o: ../../include/quote_822_local.h
|
pipe.o: ../../include/quote_822_local.h
|
||||||
pipe.o: ../../include/quote_flags.h
|
pipe.o: ../../include/quote_flags.h
|
||||||
|
pipe.o: ../../include/flush_clnt.h
|
||||||
pipe.o: ../../include/mail_server.h
|
pipe.o: ../../include/mail_server.h
|
||||||
|
@@ -279,6 +279,7 @@
|
|||||||
#include <split_addr.h>
|
#include <split_addr.h>
|
||||||
#include <off_cvt.h>
|
#include <off_cvt.h>
|
||||||
#include <quote_822_local.h>
|
#include <quote_822_local.h>
|
||||||
|
#include <flush_clnt.h>
|
||||||
|
|
||||||
/* Single server skeleton. */
|
/* Single server skeleton. */
|
||||||
|
|
||||||
@@ -998,6 +999,13 @@ static void drop_privileges(char *unused_name, char **unused_argv)
|
|||||||
set_eugid(var_owner_uid, var_owner_gid);
|
set_eugid(var_owner_uid, var_owner_gid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* pre_init - initialize */
|
||||||
|
|
||||||
|
static void pre_init(char *unused_name, char **unused_argv)
|
||||||
|
{
|
||||||
|
flush_init();
|
||||||
|
}
|
||||||
|
|
||||||
/* main - pass control to the single-threaded skeleton */
|
/* main - pass control to the single-threaded skeleton */
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
@@ -1009,6 +1017,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
single_server_main(argc, argv, pipe_service,
|
single_server_main(argc, argv, pipe_service,
|
||||||
MAIL_SERVER_TIME_TABLE, time_table,
|
MAIL_SERVER_TIME_TABLE, time_table,
|
||||||
|
MAIL_SERVER_PRE_INIT, pre_init,
|
||||||
MAIL_SERVER_POST_INIT, drop_privileges,
|
MAIL_SERVER_POST_INIT, drop_privileges,
|
||||||
MAIL_SERVER_PRE_ACCEPT, pre_accept,
|
MAIL_SERVER_PRE_ACCEPT, pre_accept,
|
||||||
0);
|
0);
|
||||||
|
@@ -397,6 +397,12 @@ static int postalias_queries(VSTREAM *in, char **maps, const int map_count,
|
|||||||
dict_open3(maps[n], map_name, O_RDONLY, DICT_FLAG_LOCK) :
|
dict_open3(maps[n], map_name, O_RDONLY, DICT_FLAG_LOCK) :
|
||||||
dict_open3(var_db_type, maps[n], O_RDONLY, DICT_FLAG_LOCK));
|
dict_open3(var_db_type, maps[n], O_RDONLY, DICT_FLAG_LOCK));
|
||||||
if ((value = dict_get(dicts[n], STR(keybuf))) != 0) {
|
if ((value = dict_get(dicts[n], STR(keybuf))) != 0) {
|
||||||
|
if (*value == 0) {
|
||||||
|
msg_warn("table %s:%s: key %s: empty string result is not allowed",
|
||||||
|
dicts[n]->type, dicts[n]->name, STR(keybuf));
|
||||||
|
msg_warn("table %s:%s should return NO RESULT in case of NOT FOUND",
|
||||||
|
dicts[n]->type, dicts[n]->name);
|
||||||
|
}
|
||||||
vstream_printf("%s: %s\n", STR(keybuf), value);
|
vstream_printf("%s: %s\n", STR(keybuf), value);
|
||||||
found = 1;
|
found = 1;
|
||||||
break;
|
break;
|
||||||
@@ -428,6 +434,12 @@ static int postalias_query(const char *map_type, const char *map_name,
|
|||||||
|
|
||||||
dict = dict_open3(map_type, map_name, O_RDONLY, DICT_FLAG_LOCK);
|
dict = dict_open3(map_type, map_name, O_RDONLY, DICT_FLAG_LOCK);
|
||||||
if ((value = dict_get(dict, key)) != 0) {
|
if ((value = dict_get(dict, key)) != 0) {
|
||||||
|
if (*value == 0) {
|
||||||
|
msg_warn("table %s:%s: key %s: empty string result is not allowed",
|
||||||
|
map_type, map_name, key);
|
||||||
|
msg_warn("table %s:%s should return NO RESULT in case of NOT FOUND",
|
||||||
|
map_type, map_name);
|
||||||
|
}
|
||||||
vstream_printf("%s\n", value);
|
vstream_printf("%s\n", value);
|
||||||
vstream_fflush(VSTREAM_OUT);
|
vstream_fflush(VSTREAM_OUT);
|
||||||
}
|
}
|
||||||
|
@@ -345,6 +345,12 @@ static int postmap_queries(VSTREAM *in, char **maps, const int map_count,
|
|||||||
dict_open3(maps[n], map_name, O_RDONLY, DICT_FLAG_LOCK) :
|
dict_open3(maps[n], map_name, O_RDONLY, DICT_FLAG_LOCK) :
|
||||||
dict_open3(var_db_type, maps[n], O_RDONLY, DICT_FLAG_LOCK));
|
dict_open3(var_db_type, maps[n], O_RDONLY, DICT_FLAG_LOCK));
|
||||||
if ((value = dict_get(dicts[n], STR(keybuf))) != 0) {
|
if ((value = dict_get(dicts[n], STR(keybuf))) != 0) {
|
||||||
|
if (*value == 0) {
|
||||||
|
msg_warn("table %s:%s: key %s: empty string result is not allowed",
|
||||||
|
dicts[n]->type, dicts[n]->name, STR(keybuf));
|
||||||
|
msg_warn("table %s:%s should return NO RESULT in case of NOT FOUND",
|
||||||
|
dicts[n]->type, dicts[n]->name);
|
||||||
|
}
|
||||||
vstream_printf("%s %s\n", STR(keybuf), value);
|
vstream_printf("%s %s\n", STR(keybuf), value);
|
||||||
found = 1;
|
found = 1;
|
||||||
break;
|
break;
|
||||||
@@ -376,6 +382,12 @@ static int postmap_query(const char *map_type, const char *map_name,
|
|||||||
|
|
||||||
dict = dict_open3(map_type, map_name, O_RDONLY, DICT_FLAG_LOCK);
|
dict = dict_open3(map_type, map_name, O_RDONLY, DICT_FLAG_LOCK);
|
||||||
if ((value = dict_get(dict, key)) != 0) {
|
if ((value = dict_get(dict, key)) != 0) {
|
||||||
|
if (*value == 0) {
|
||||||
|
msg_warn("table %s:%s: key %s: empty string result is not allowed",
|
||||||
|
map_type, map_name, key);
|
||||||
|
msg_warn("table %s:%s should return NO RESULT in case of NOT FOUND",
|
||||||
|
map_type, map_name);
|
||||||
|
}
|
||||||
vstream_printf("%s\n", value);
|
vstream_printf("%s\n", value);
|
||||||
vstream_fflush(VSTREAM_OUT);
|
vstream_fflush(VSTREAM_OUT);
|
||||||
}
|
}
|
||||||
|
@@ -76,6 +76,7 @@ qmgr.o: ../../include/mail_proto.h
|
|||||||
qmgr.o: ../../include/iostuff.h
|
qmgr.o: ../../include/iostuff.h
|
||||||
qmgr.o: ../../include/attr.h
|
qmgr.o: ../../include/attr.h
|
||||||
qmgr.o: ../../include/mail_flow.h
|
qmgr.o: ../../include/mail_flow.h
|
||||||
|
qmgr.o: ../../include/flush_clnt.h
|
||||||
qmgr.o: ../../include/master_proto.h
|
qmgr.o: ../../include/master_proto.h
|
||||||
qmgr.o: ../../include/mail_server.h
|
qmgr.o: ../../include/mail_server.h
|
||||||
qmgr.o: qmgr.h
|
qmgr.o: qmgr.h
|
||||||
|
@@ -300,6 +300,7 @@
|
|||||||
#include <mail_params.h>
|
#include <mail_params.h>
|
||||||
#include <mail_proto.h> /* QMGR_SCAN constants */
|
#include <mail_proto.h> /* QMGR_SCAN constants */
|
||||||
#include <mail_flow.h>
|
#include <mail_flow.h>
|
||||||
|
#include <flush_clnt.h>
|
||||||
|
|
||||||
/* Master process interface */
|
/* Master process interface */
|
||||||
|
|
||||||
@@ -485,6 +486,13 @@ static void pre_accept(char *unused_name, char **unused_argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* qmgr_pre_init - pre-jail initialization */
|
||||||
|
|
||||||
|
static void qmgr_pre_init(char *unused_name, char **unused_argv)
|
||||||
|
{
|
||||||
|
flush_init();
|
||||||
|
}
|
||||||
|
|
||||||
/* qmgr_post_init - post-jail initialization */
|
/* qmgr_post_init - post-jail initialization */
|
||||||
|
|
||||||
static void qmgr_post_init(char *name, char **unused_argv)
|
static void qmgr_post_init(char *name, char **unused_argv)
|
||||||
@@ -583,6 +591,7 @@ int main(int argc, char **argv)
|
|||||||
MAIL_SERVER_STR_TABLE, str_table,
|
MAIL_SERVER_STR_TABLE, str_table,
|
||||||
MAIL_SERVER_BOOL_TABLE, bool_table,
|
MAIL_SERVER_BOOL_TABLE, bool_table,
|
||||||
MAIL_SERVER_TIME_TABLE, time_table,
|
MAIL_SERVER_TIME_TABLE, time_table,
|
||||||
|
MAIL_SERVER_PRE_INIT, qmgr_pre_init,
|
||||||
MAIL_SERVER_POST_INIT, qmgr_post_init,
|
MAIL_SERVER_POST_INIT, qmgr_post_init,
|
||||||
MAIL_SERVER_LOOP, qmgr_loop,
|
MAIL_SERVER_LOOP, qmgr_loop,
|
||||||
MAIL_SERVER_PRE_ACCEPT, pre_accept,
|
MAIL_SERVER_PRE_ACCEPT, pre_accept,
|
||||||
|
@@ -75,6 +75,7 @@ smtp.o: ../../include/recipient_list.h
|
|||||||
smtp.o: ../../include/mail_params.h
|
smtp.o: ../../include/mail_params.h
|
||||||
smtp.o: ../../include/mail_conf.h
|
smtp.o: ../../include/mail_conf.h
|
||||||
smtp.o: ../../include/debug_peer.h
|
smtp.o: ../../include/debug_peer.h
|
||||||
|
smtp.o: ../../include/flush_clnt.h
|
||||||
smtp.o: ../../include/mail_server.h
|
smtp.o: ../../include/mail_server.h
|
||||||
smtp.o: smtp.h
|
smtp.o: smtp.h
|
||||||
smtp.o: smtp_sasl.h
|
smtp.o: smtp_sasl.h
|
||||||
|
@@ -282,6 +282,7 @@
|
|||||||
#include <mail_params.h>
|
#include <mail_params.h>
|
||||||
#include <mail_conf.h>
|
#include <mail_conf.h>
|
||||||
#include <debug_peer.h>
|
#include <debug_peer.h>
|
||||||
|
#include <flush_clnt.h>
|
||||||
|
|
||||||
/* Single server skeleton. */
|
/* Single server skeleton. */
|
||||||
|
|
||||||
@@ -452,6 +453,11 @@ static void pre_init(char *unused_name, char **unused_argv)
|
|||||||
msg_warn("%s is true, but SASL support is not compiled in",
|
msg_warn("%s is true, but SASL support is not compiled in",
|
||||||
VAR_SMTP_SASL_ENABLE);
|
VAR_SMTP_SASL_ENABLE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flush client.
|
||||||
|
*/
|
||||||
|
flush_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* pre_accept - see if tables have changed */
|
/* pre_accept - see if tables have changed */
|
||||||
|
@@ -469,6 +469,7 @@
|
|||||||
#include <namadr_list.h>
|
#include <namadr_list.h>
|
||||||
#include <input_transp.h>
|
#include <input_transp.h>
|
||||||
#include <anvil_clnt.h>
|
#include <anvil_clnt.h>
|
||||||
|
#include <flush_clnt.h>
|
||||||
|
|
||||||
/* Single-threaded server skeleton. */
|
/* Single-threaded server skeleton. */
|
||||||
|
|
||||||
@@ -1266,12 +1267,17 @@ static int rcpt_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Store the recipient. Remember the first one.
|
* Store the recipient. Remember the first one.
|
||||||
|
*
|
||||||
|
* Flush recipients to maintain a stiffer coupling with the next stage and
|
||||||
|
* to better utilize parallelism.
|
||||||
*/
|
*/
|
||||||
state->rcpt_count++;
|
state->rcpt_count++;
|
||||||
if (state->recipient == 0)
|
if (state->recipient == 0)
|
||||||
state->recipient = mystrdup(argv[2].strval);
|
state->recipient = mystrdup(argv[2].strval);
|
||||||
if (state->cleanup)
|
if (state->cleanup) {
|
||||||
rec_fputs(state->cleanup, REC_TYPE_RCPT, argv[2].strval);
|
rec_fputs(state->cleanup, REC_TYPE_RCPT, argv[2].strval);
|
||||||
|
vstream_fflush(state->cleanup);
|
||||||
|
}
|
||||||
smtpd_chat_reply(state, "250 Ok");
|
smtpd_chat_reply(state, "250 Ok");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
@@ -2396,6 +2402,11 @@ static void pre_jail_init(char *unused_name, char **unused_argv)
|
|||||||
msg_warn("%s is true, but SASL support is not compiled in",
|
msg_warn("%s is true, but SASL support is not compiled in",
|
||||||
VAR_SMTPD_SASL_ENABLE);
|
VAR_SMTPD_SASL_ENABLE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* flush client.
|
||||||
|
*/
|
||||||
|
flush_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* post_jail_init - post-jail initialization */
|
/* post_jail_init - post-jail initialization */
|
||||||
|
@@ -191,7 +191,9 @@ typedef struct {
|
|||||||
static DICT_OPEN_INFO dict_open_info[] = {
|
static DICT_OPEN_INFO dict_open_info[] = {
|
||||||
DICT_TYPE_ENVIRON, dict_env_open,
|
DICT_TYPE_ENVIRON, dict_env_open,
|
||||||
DICT_TYPE_UNIX, dict_unix_open,
|
DICT_TYPE_UNIX, dict_unix_open,
|
||||||
|
#ifdef SNAPSHOT
|
||||||
DICT_TYPE_TCP, dict_tcp_open,
|
DICT_TYPE_TCP, dict_tcp_open,
|
||||||
|
#endif
|
||||||
#ifdef HAS_DBM
|
#ifdef HAS_DBM
|
||||||
DICT_TYPE_DBM, dict_dbm_open,
|
DICT_TYPE_DBM, dict_dbm_open,
|
||||||
#endif
|
#endif
|
||||||
|
@@ -162,6 +162,7 @@ virtual.o: ../../include/mail_params.h
|
|||||||
virtual.o: ../../include/mail_conf.h
|
virtual.o: ../../include/mail_conf.h
|
||||||
virtual.o: ../../include/mail_addr_find.h
|
virtual.o: ../../include/mail_addr_find.h
|
||||||
virtual.o: ../../include/maps.h
|
virtual.o: ../../include/maps.h
|
||||||
|
virtual.o: ../../include/flush_clnt.h
|
||||||
virtual.o: ../../include/mail_server.h
|
virtual.o: ../../include/mail_server.h
|
||||||
virtual.o: virtual.h
|
virtual.o: virtual.h
|
||||||
virtual.o: ../../include/mbox_conf.h
|
virtual.o: ../../include/mbox_conf.h
|
||||||
|
@@ -312,6 +312,7 @@
|
|||||||
#include <mail_conf.h>
|
#include <mail_conf.h>
|
||||||
#include <mail_params.h>
|
#include <mail_params.h>
|
||||||
#include <mail_addr_find.h>
|
#include <mail_addr_find.h>
|
||||||
|
#include <flush_clnt.h>
|
||||||
|
|
||||||
/* Single server skeleton. */
|
/* Single server skeleton. */
|
||||||
|
|
||||||
@@ -476,6 +477,11 @@ static void pre_init(char *unused_name, char **unused_argv)
|
|||||||
VAR_VIRT_MAILBOX_LIMIT, VAR_MESSAGE_LIMIT);
|
VAR_VIRT_MAILBOX_LIMIT, VAR_MESSAGE_LIMIT);
|
||||||
set_file_limit(var_virt_mailbox_limit);
|
set_file_limit(var_virt_mailbox_limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* flush client.
|
||||||
|
*/
|
||||||
|
flush_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* main - pass control to the single-threaded skeleton */
|
/* main - pass control to the single-threaded skeleton */
|
||||||
|
Reference in New Issue
Block a user