mirror of
https://github.com/vdukhovni/postfix
synced 2025-09-04 08:05:37 +00:00
snapshot-20001209
This commit is contained in:
committed by
Viktor Dukhovni
parent
528b9b115c
commit
f76aed6caf
@@ -4576,3 +4576,19 @@ Apologies for any names omitted.
|
|||||||
(asynchronous bounce client), qmgr/qmgr_active.c. Problem
|
(asynchronous bounce client), qmgr/qmgr_active.c. Problem
|
||||||
reported by El Bunzo (webpower.nl) and Tiger Technologies
|
reported by El Bunzo (webpower.nl) and Tiger Technologies
|
||||||
(tigertech.com).
|
(tigertech.com).
|
||||||
|
|
||||||
|
20001209
|
||||||
|
|
||||||
|
Feature: mailbox_transport and fallback_transport can now
|
||||||
|
have the form transport:nexthop, with suitable defaults
|
||||||
|
when either transport or nexthop are omitted, just like in
|
||||||
|
the Postfix transport map. This allows you to specify for
|
||||||
|
example, "mailbox_transport = lmtp:unix:/file/name". File:
|
||||||
|
global/deliver_pass.c.
|
||||||
|
|
||||||
|
Bugfix: local_destination_concurrency_limit no longer works
|
||||||
|
as per-user concurrency limit but as per-domain limit, so
|
||||||
|
the limit of "2" in the sample main.cf files would result
|
||||||
|
in poor local delivery performance. The Postfix install
|
||||||
|
procedure repairs this. Problem reported by David Schweikert
|
||||||
|
(ee.ethz.ch) and Dallas Wisehaupt (cynicism.com).
|
||||||
|
@@ -285,6 +285,7 @@ bin/postconf -c $CONFIG_DIRECTORY -e \
|
|||||||
"command_directory = $command_directory" \
|
"command_directory = $command_directory" \
|
||||||
"queue_directory = $queue_directory" \
|
"queue_directory = $queue_directory" \
|
||||||
"mail_owner = $mail_owner" \
|
"mail_owner = $mail_owner" \
|
||||||
|
"local_destination_concurrency_limit = 0" \
|
||||||
|| exit 1
|
|| exit 1
|
||||||
|
|
||||||
(echo "# This file was generated by $0"
|
(echo "# This file was generated by $0"
|
||||||
|
@@ -388,8 +388,11 @@ mail_owner = postfix
|
|||||||
#
|
#
|
||||||
# Each message delivery transport has its XXX_destination_concurrency_limit
|
# Each message delivery transport has its XXX_destination_concurrency_limit
|
||||||
# parameter. The default is $default_destination_concurrency_limit.
|
# parameter. The default is $default_destination_concurrency_limit.
|
||||||
|
# The limit is per destination domain, so the destination concurrency
|
||||||
|
# limit for local delivery must be set to zero otherwise performance
|
||||||
|
# will suffer.
|
||||||
|
|
||||||
local_destination_concurrency_limit = 2
|
local_destination_concurrency_limit = 0
|
||||||
default_destination_concurrency_limit = 10
|
default_destination_concurrency_limit = 10
|
||||||
|
|
||||||
# DEBUGGING CONTROL
|
# DEBUGGING CONTROL
|
||||||
|
@@ -150,12 +150,26 @@ mailbox_command =
|
|||||||
# has precedence over the mailbox_command, fallback_transport and
|
# has precedence over the mailbox_command, fallback_transport and
|
||||||
# luser_relay parameters.
|
# luser_relay parameters.
|
||||||
#
|
#
|
||||||
|
# Specify a string of the form transport:nexthop, where transport is
|
||||||
|
# the name of a mail delivery transport defined in master.cf. Either
|
||||||
|
# transport or nexthop are optional. For more details see the sample
|
||||||
|
# transports file.
|
||||||
|
#
|
||||||
|
# mailbox_transport = lmtp:unix:/file/name
|
||||||
|
# mailbox_transport = cyrus
|
||||||
mailbox_transport =
|
mailbox_transport =
|
||||||
|
|
||||||
# The fallback_transport specifies the optional transport in master.cf
|
# The fallback_transport specifies the optional transport in master.cf
|
||||||
# to use for recipients that are not found in the UNIX passwd database.
|
# to use for recipients that are not found in the UNIX passwd database.
|
||||||
# This parameter has precedence over the luser_relay parameter.
|
# This parameter has precedence over the luser_relay parameter.
|
||||||
#
|
#
|
||||||
|
# Specify a string of the form transport:nexthop, where transport is
|
||||||
|
# the name of a mail delivery transport defined in master.cf. Either
|
||||||
|
# transport or nexthop are optional. For more details see the sample
|
||||||
|
# transports file.
|
||||||
|
#
|
||||||
|
# fallback_transport = lmtp:unix:/file/name
|
||||||
|
# fallback_transport = cyrus
|
||||||
fallback_transport =
|
fallback_transport =
|
||||||
|
|
||||||
#
|
#
|
||||||
@@ -163,14 +177,15 @@ fallback_transport =
|
|||||||
#
|
#
|
||||||
|
|
||||||
# The local_destination_concurrency_limit parameter limits the number
|
# The local_destination_concurrency_limit parameter limits the number
|
||||||
# of parallel deliveries to the same local recipient.
|
# of parallel deliveries to the local domain. It should therefore be
|
||||||
|
# set to zero, in order to prevent poor local delivery performance.
|
||||||
|
# In old Postfix versions this parameter implemented a per-user
|
||||||
|
# limit. That is no longer the case.
|
||||||
#
|
#
|
||||||
# The default limit is taken from the default_destination_concurrency_limit
|
# The default limit is taken from the default_destination_concurrency_limit
|
||||||
# parameter. I recommend a low limit of 2, just in case someone has
|
# parameter.
|
||||||
# an expensive shell command in a .forward file or in an alias (e.g.,
|
|
||||||
# a mailing list manager). You don't want to run lots of those.
|
|
||||||
#
|
#
|
||||||
local_destination_concurrency_limit = 2
|
local_destination_concurrency_limit = 0
|
||||||
|
|
||||||
# The local_destination_recipient_limit parameter limits the number
|
# The local_destination_recipient_limit parameter limits the number
|
||||||
# of recipients per local message delivery. The default limit is
|
# of recipients per local message delivery. The default limit is
|
||||||
|
@@ -280,7 +280,7 @@ int main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
static CONFIG_INT_TABLE int_table[] = {
|
static CONFIG_INT_TABLE int_table[] = {
|
||||||
VAR_BOUNCE_LIMIT, DEF_BOUNCE_LIMIT, &var_bounce_limit, 1, 0,
|
VAR_BOUNCE_LIMIT, DEF_BOUNCE_LIMIT, &var_bounce_limit, 1, 0,
|
||||||
VAR_MAX_QUEUE_TIME, DEF_MAX_QUEUE_TIME, &var_max_queue_time, 1, 0,
|
VAR_MAX_QUEUE_TIME, DEF_MAX_QUEUE_TIME, &var_max_queue_time, 1, 1000,
|
||||||
VAR_DELAY_WARN_TIME, DEF_DELAY_WARN_TIME, &var_delay_warn_time, 0, 0,
|
VAR_DELAY_WARN_TIME, DEF_DELAY_WARN_TIME, &var_delay_warn_time, 0, 0,
|
||||||
0,
|
0,
|
||||||
};
|
};
|
||||||
|
@@ -13,7 +13,7 @@
|
|||||||
/* DESCRIPTION
|
/* DESCRIPTION
|
||||||
/* deliver_flock() sets one exclusive kernel lock on an open file,
|
/* deliver_flock() sets one exclusive kernel lock on an open file,
|
||||||
/* for example in order to deliver mail.
|
/* for example in order to deliver mail.
|
||||||
/* It performs several non-blocking attempts to acquire an exclusive
|
/* It performs several non-blocking attempts to acquire an exclusive
|
||||||
/* lock before giving up.
|
/* lock before giving up.
|
||||||
/*
|
/*
|
||||||
/* Arguments:
|
/* Arguments:
|
||||||
@@ -57,9 +57,9 @@
|
|||||||
#include "mail_params.h"
|
#include "mail_params.h"
|
||||||
#include "deliver_flock.h"
|
#include "deliver_flock.h"
|
||||||
|
|
||||||
/* deliver_flock - lock open file for mail delivery*/
|
/* deliver_flock - lock open file for mail delivery */
|
||||||
|
|
||||||
int deliver_flock(int fd, int lock_style, VSTRING * why)
|
int deliver_flock(int fd, int lock_style, VSTRING *why)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@@ -30,7 +30,8 @@
|
|||||||
/* .IP class
|
/* .IP class
|
||||||
/* Destination delivery agent service class
|
/* Destination delivery agent service class
|
||||||
/* .IP service
|
/* .IP service
|
||||||
/* Destination delivery agent service name.
|
/* String of the form \fItransport\fR:\fInexthop\fR. Either transport
|
||||||
|
/* or nexthop are optional. For details see the transport map manual page.
|
||||||
/* .IP request
|
/* .IP request
|
||||||
/* Delivery request with queue file information.
|
/* Delivery request with queue file information.
|
||||||
/* .IP address
|
/* .IP address
|
||||||
@@ -62,9 +63,12 @@
|
|||||||
#include <msg.h>
|
#include <msg.h>
|
||||||
#include <vstring.h>
|
#include <vstring.h>
|
||||||
#include <vstream.h>
|
#include <vstream.h>
|
||||||
|
#include <split_at.h>
|
||||||
|
#include <mymalloc.h>
|
||||||
|
|
||||||
/* Global library. */
|
/* Global library. */
|
||||||
|
|
||||||
|
#include <mail_params.h>
|
||||||
#include <deliver_pass.h>
|
#include <deliver_pass.h>
|
||||||
|
|
||||||
/* deliver_pass_initial_reply - retrieve initial delivery process response */
|
/* deliver_pass_initial_reply - retrieve initial delivery process response */
|
||||||
@@ -83,7 +87,7 @@ static int deliver_pass_initial_reply(VSTREAM *stream)
|
|||||||
/* deliver_pass_send_request - send delivery request to delivery process */
|
/* deliver_pass_send_request - send delivery request to delivery process */
|
||||||
|
|
||||||
static int deliver_pass_send_request(VSTREAM *stream, DELIVER_REQUEST *request,
|
static int deliver_pass_send_request(VSTREAM *stream, DELIVER_REQUEST *request,
|
||||||
const char *addr, long offs)
|
const char *nexthop, const char *addr, long offs)
|
||||||
{
|
{
|
||||||
int stat;
|
int stat;
|
||||||
|
|
||||||
@@ -91,7 +95,7 @@ static int deliver_pass_send_request(VSTREAM *stream, DELIVER_REQUEST *request,
|
|||||||
request->flags,
|
request->flags,
|
||||||
request->queue_name, request->queue_id,
|
request->queue_name, request->queue_id,
|
||||||
request->data_offset, request->data_size,
|
request->data_offset, request->data_size,
|
||||||
request->nexthop, request->sender,
|
nexthop, request->sender,
|
||||||
request->errors_to, request->return_receipt,
|
request->errors_to, request->return_receipt,
|
||||||
request->arrival_time,
|
request->arrival_time,
|
||||||
offs, addr, "0");
|
offs, addr, "0");
|
||||||
@@ -126,11 +130,24 @@ int deliver_pass(const char *class, const char *service,
|
|||||||
VSTREAM *stream;
|
VSTREAM *stream;
|
||||||
VSTRING *reason;
|
VSTRING *reason;
|
||||||
int status;
|
int status;
|
||||||
|
char *saved_service;
|
||||||
|
char *transport;
|
||||||
|
char *nexthop;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Parse service into transport:nexthop form, and allow for omission of
|
||||||
|
* optional fields
|
||||||
|
*/
|
||||||
|
transport = saved_service = mystrdup(service);
|
||||||
|
if ((nexthop = split_at(saved_service, ':')) == 0 || *nexthop == 0)
|
||||||
|
nexthop = request->nexthop;
|
||||||
|
if (*transport == 0)
|
||||||
|
transport = var_def_transport;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize.
|
* Initialize.
|
||||||
*/
|
*/
|
||||||
stream = mail_connect_wait(class, service);
|
stream = mail_connect_wait(class, transport);
|
||||||
reason = vstring_alloc(1);
|
reason = vstring_alloc(1);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -144,7 +161,8 @@ int deliver_pass(const char *class, const char *service,
|
|||||||
* different transport.
|
* different transport.
|
||||||
*/
|
*/
|
||||||
if ((status = deliver_pass_initial_reply(stream)) == 0
|
if ((status = deliver_pass_initial_reply(stream)) == 0
|
||||||
&& (status = deliver_pass_send_request(stream, request, addr, offs)) == 0)
|
&& (status = deliver_pass_send_request(stream, request, nexthop,
|
||||||
|
addr, offs)) == 0)
|
||||||
status = deliver_pass_final_reply(stream, reason);
|
status = deliver_pass_final_reply(stream, reason);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -152,6 +170,7 @@ int deliver_pass(const char *class, const char *service,
|
|||||||
*/
|
*/
|
||||||
vstream_fclose(stream);
|
vstream_fclose(stream);
|
||||||
vstring_free(reason);
|
vstring_free(reason);
|
||||||
|
myfree(saved_service);
|
||||||
|
|
||||||
return (status);
|
return (status);
|
||||||
}
|
}
|
||||||
|
@@ -46,7 +46,6 @@ extern const char *mail_conf_lookup_eval(const char *);
|
|||||||
extern char *get_mail_conf_str(const char *, const char *, int, int);
|
extern char *get_mail_conf_str(const char *, const char *, int, int);
|
||||||
extern int get_mail_conf_int(const char *, int, int, int);
|
extern int get_mail_conf_int(const char *, int, int, int);
|
||||||
extern int get_mail_conf_bool(const char *, int);
|
extern int get_mail_conf_bool(const char *, int);
|
||||||
extern int get_mail_conf_lock(const char *, int);
|
|
||||||
extern int get_mail_conf_time(const char *, const char *, int, int, int);
|
extern int get_mail_conf_time(const char *, const char *, int, int, int);
|
||||||
extern char *get_mail_conf_raw(const char *, const char *, int, int);
|
extern char *get_mail_conf_raw(const char *, const char *, int, int);
|
||||||
|
|
||||||
@@ -59,7 +58,6 @@ extern int get_mail_conf_time2(const char *, const char *, const char *, int, in
|
|||||||
extern char *get_mail_conf_str_fn(const char *, const char *(*) (void), int, int);
|
extern char *get_mail_conf_str_fn(const char *, const char *(*) (void), int, int);
|
||||||
extern int get_mail_conf_int_fn(const char *, int (*) (void), int, int);
|
extern int get_mail_conf_int_fn(const char *, int (*) (void), int, int);
|
||||||
extern int get_mail_conf_bool_fn(const char *, int (*) (void));
|
extern int get_mail_conf_bool_fn(const char *, int (*) (void));
|
||||||
extern int get_mail_conf_lock_fn(const char *, int (*) (void));
|
|
||||||
extern int get_mail_conf_time_fn(const char *, const char *(*) (void), int, int, int);
|
extern int get_mail_conf_time_fn(const char *, const char *(*) (void), int, int, int);
|
||||||
extern char *get_mail_conf_raw_fn(const char *, const char *(*) (void), int, int);
|
extern char *get_mail_conf_raw_fn(const char *, const char *(*) (void), int, int);
|
||||||
|
|
||||||
@@ -69,7 +67,6 @@ extern char *get_mail_conf_raw_fn(const char *, const char *(*) (void), int, int
|
|||||||
extern void set_mail_conf_str(const char *, const char *);
|
extern void set_mail_conf_str(const char *, const char *);
|
||||||
extern void set_mail_conf_int(const char *, int);
|
extern void set_mail_conf_int(const char *, int);
|
||||||
extern void set_mail_conf_bool(const char *, int);
|
extern void set_mail_conf_bool(const char *, int);
|
||||||
extern void set_mail_conf_lock(const char *, int);
|
|
||||||
extern void set_mail_conf_time(const char *, const char *);
|
extern void set_mail_conf_time(const char *, const char *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -98,12 +95,6 @@ typedef struct {
|
|||||||
int *target; /* pointer to global variable */
|
int *target; /* pointer to global variable */
|
||||||
} CONFIG_BOOL_TABLE;
|
} CONFIG_BOOL_TABLE;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
const char *name; /* config variable name */
|
|
||||||
int defval; /* default value */
|
|
||||||
int *target; /* pointer to global variable */
|
|
||||||
} CONFIG_LOCK_TABLE;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const char *name; /* config variable name */
|
const char *name; /* config variable name */
|
||||||
const char *defval; /* default value */
|
const char *defval; /* default value */
|
||||||
@@ -116,7 +107,6 @@ typedef struct {
|
|||||||
extern void get_mail_conf_str_table(CONFIG_STR_TABLE *);
|
extern void get_mail_conf_str_table(CONFIG_STR_TABLE *);
|
||||||
extern void get_mail_conf_int_table(CONFIG_INT_TABLE *);
|
extern void get_mail_conf_int_table(CONFIG_INT_TABLE *);
|
||||||
extern void get_mail_conf_bool_table(CONFIG_BOOL_TABLE *);
|
extern void get_mail_conf_bool_table(CONFIG_BOOL_TABLE *);
|
||||||
extern void get_mail_conf_lock_table(CONFIG_LOCK_TABLE *);
|
|
||||||
extern void get_mail_conf_time_table(CONFIG_TIME_TABLE *);
|
extern void get_mail_conf_time_table(CONFIG_TIME_TABLE *);
|
||||||
extern void get_mail_conf_raw_table(CONFIG_STR_TABLE *);
|
extern void get_mail_conf_raw_table(CONFIG_STR_TABLE *);
|
||||||
|
|
||||||
@@ -146,12 +136,6 @@ typedef struct {
|
|||||||
int *target; /* pointer to global variable */
|
int *target; /* pointer to global variable */
|
||||||
} CONFIG_BOOL_FN_TABLE;
|
} CONFIG_BOOL_FN_TABLE;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
const char *name; /* config variable name */
|
|
||||||
int (*defval) (void); /* default value provider */
|
|
||||||
int *target; /* pointer to global variable */
|
|
||||||
} CONFIG_LOCK_FN_TABLE;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const char *name; /* config variable name */
|
const char *name; /* config variable name */
|
||||||
const char *(*defval) (void); /* default value provider */
|
const char *(*defval) (void); /* default value provider */
|
||||||
@@ -164,7 +148,6 @@ typedef struct {
|
|||||||
extern void get_mail_conf_str_fn_table(CONFIG_STR_FN_TABLE *);
|
extern void get_mail_conf_str_fn_table(CONFIG_STR_FN_TABLE *);
|
||||||
extern void get_mail_conf_int_fn_table(CONFIG_INT_FN_TABLE *);
|
extern void get_mail_conf_int_fn_table(CONFIG_INT_FN_TABLE *);
|
||||||
extern void get_mail_conf_bool_fn_table(CONFIG_BOOL_FN_TABLE *);
|
extern void get_mail_conf_bool_fn_table(CONFIG_BOOL_FN_TABLE *);
|
||||||
extern void get_mail_conf_lock_fn_table(CONFIG_LOCK_FN_TABLE *);
|
|
||||||
extern void get_mail_conf_time_fn_table(CONFIG_TIME_FN_TABLE *);
|
extern void get_mail_conf_time_fn_table(CONFIG_TIME_FN_TABLE *);
|
||||||
extern void get_mail_conf_raw_fn_table(CONFIG_STR_FN_TABLE *);
|
extern void get_mail_conf_raw_fn_table(CONFIG_STR_FN_TABLE *);
|
||||||
|
|
||||||
|
@@ -59,6 +59,7 @@
|
|||||||
/* char *var_syslog_facility;
|
/* char *var_syslog_facility;
|
||||||
/* char *var_relay_domains;
|
/* char *var_relay_domains;
|
||||||
/* char *var_fflush_domains;
|
/* char *var_fflush_domains;
|
||||||
|
/* char *var_def_transport;
|
||||||
/*
|
/*
|
||||||
/* char *var_import_environ;
|
/* char *var_import_environ;
|
||||||
/* char *var_export_environ;
|
/* char *var_export_environ;
|
||||||
@@ -111,6 +112,7 @@
|
|||||||
#include "mynetworks.h"
|
#include "mynetworks.h"
|
||||||
#include "mail_conf.h"
|
#include "mail_conf.h"
|
||||||
#include "mail_version.h"
|
#include "mail_version.h"
|
||||||
|
#include "mail_proto.h"
|
||||||
#include "mail_params.h"
|
#include "mail_params.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -169,6 +171,7 @@ int var_daemon_timeout;
|
|||||||
char *var_syslog_facility;
|
char *var_syslog_facility;
|
||||||
char *var_relay_domains;
|
char *var_relay_domains;
|
||||||
char *var_fflush_domains;
|
char *var_fflush_domains;
|
||||||
|
char *var_def_transport;
|
||||||
|
|
||||||
char *var_import_environ;
|
char *var_import_environ;
|
||||||
char *var_export_environ;
|
char *var_export_environ;
|
||||||
@@ -286,6 +289,7 @@ void mail_params_init()
|
|||||||
VAR_FFLUSH_DOMAINS, DEF_FFLUSH_DOMAINS, &var_fflush_domains, 0, 0,
|
VAR_FFLUSH_DOMAINS, DEF_FFLUSH_DOMAINS, &var_fflush_domains, 0, 0,
|
||||||
VAR_EXPORT_ENVIRON, DEF_EXPORT_ENVIRON, &var_export_environ, 0, 0,
|
VAR_EXPORT_ENVIRON, DEF_EXPORT_ENVIRON, &var_export_environ, 0, 0,
|
||||||
VAR_IMPORT_ENVIRON, DEF_IMPORT_ENVIRON, &var_import_environ, 0, 0,
|
VAR_IMPORT_ENVIRON, DEF_IMPORT_ENVIRON, &var_import_environ, 0, 0,
|
||||||
|
VAR_DEF_TRANSPORT, DEF_DEF_TRANSPORT, &var_def_transport, 0, 0,
|
||||||
0,
|
0,
|
||||||
};
|
};
|
||||||
static CONFIG_STR_FN_TABLE function_str_defaults_2[] = {
|
static CONFIG_STR_FN_TABLE function_str_defaults_2[] = {
|
||||||
|
@@ -1107,8 +1107,6 @@ extern char *var_export_environ;
|
|||||||
/* LICENSE
|
/* LICENSE
|
||||||
/* .ad
|
/* .ad
|
||||||
/* .fi
|
/* .fi
|
||||||
Unterminated comment
|
|
||||||
|
|
||||||
/* The Secure Mailer license must be distributed with this software.
|
/* The Secure Mailer license must be distributed with this software.
|
||||||
/* AUTHOR(S)
|
/* AUTHOR(S)
|
||||||
/* Wietse Venema
|
/* Wietse Venema
|
||||||
|
@@ -247,6 +247,12 @@ MAIL_STREAM *mail_stream_command(const char *command)
|
|||||||
/*
|
/*
|
||||||
* Treat fork() failure as a transient problem. Treat bad handshake as a
|
* Treat fork() failure as a transient problem. Treat bad handshake as a
|
||||||
* permanent error.
|
* permanent error.
|
||||||
|
*
|
||||||
|
* XXX Are we invoking a Postfix process or a non-Postfix process? In the
|
||||||
|
* former case we can share the full environment; in the latter case only
|
||||||
|
* a restricted environment should be propagated. Even though we are
|
||||||
|
* talking a Postfix-internal protocol there is no way we can tell what
|
||||||
|
* is being executed except by duplicating a lot of existing code.
|
||||||
*/
|
*/
|
||||||
export_env = argv_split(var_export_environ, ", \t\r\n");
|
export_env = argv_split(var_export_environ, ", \t\r\n");
|
||||||
while ((stream = vstream_popen(O_RDWR,
|
while ((stream = vstream_popen(O_RDWR,
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
* Version of this program.
|
* Version of this program.
|
||||||
*/
|
*/
|
||||||
#define VAR_MAIL_VERSION "mail_version"
|
#define VAR_MAIL_VERSION "mail_version"
|
||||||
#define DEF_MAIL_VERSION "Snapshot-20001208"
|
#define DEF_MAIL_VERSION "Snapshot-20001209"
|
||||||
extern char *var_mail_version;
|
extern char *var_mail_version;
|
||||||
|
|
||||||
/* LICENSE
|
/* LICENSE
|
||||||
|
@@ -12,7 +12,7 @@
|
|||||||
/* ARGV *mbox_lock_names()
|
/* ARGV *mbox_lock_names()
|
||||||
/* DESCRIPTION
|
/* DESCRIPTION
|
||||||
/* The functions in this module translate between external
|
/* The functions in this module translate between external
|
||||||
/* mailbox locking method names and internal forms.
|
/* mailbox locking method names and internal representations.
|
||||||
/*
|
/*
|
||||||
/* mbox_lock_mask() translates a string with locking method names
|
/* mbox_lock_mask() translates a string with locking method names
|
||||||
/* into a bit mask. Names are separated by comma or whitespace.
|
/* into a bit mask. Names are separated by comma or whitespace.
|
||||||
@@ -21,13 +21,16 @@
|
|||||||
/* .IP "flock (MBOX_FLOCK_LOCK)"
|
/* .IP "flock (MBOX_FLOCK_LOCK)"
|
||||||
/* Use flock() style lock after opening the file. This is the mailbox
|
/* Use flock() style lock after opening the file. This is the mailbox
|
||||||
/* locking method traditionally used on BSD-ish systems (including
|
/* locking method traditionally used on BSD-ish systems (including
|
||||||
/* Ultrix and SunOS).
|
/* Ultrix and SunOS). It is not suitable for remote file systems.
|
||||||
/* .IP "fcntl (MBOX_FCNTL_LOCK)"
|
/* .IP "fcntl (MBOX_FCNTL_LOCK)"
|
||||||
/* Use fcntl() style lock after opening the file. This is the mailbox
|
/* Use fcntl() style lock after opening the file. This is the mailbox
|
||||||
/* locking method on System-V-ish systems (Solaris, AIX, IRIX, HP-UX).
|
/* locking method on System-V-ish systems (Solaris, AIX, IRIX, HP-UX).
|
||||||
|
/* This method is supposed to work for remote systems, but often
|
||||||
|
/* has problems.
|
||||||
/* .IP "dotlock (MBOX_DOT_LOCK)"
|
/* .IP "dotlock (MBOX_DOT_LOCK)"
|
||||||
/* Create a lock file with the name \fIfilename\fB.lock\fR. This
|
/* Create a lock file with the name \fIfilename\fB.lock\fR. This
|
||||||
/* method pre-dates kernel locks.
|
/* method pre-dates kernel locks. This works with remote file systems,
|
||||||
|
/* modulo cache coherency problems.
|
||||||
/* .PP
|
/* .PP
|
||||||
/* mbox_lock_names() returns an array with the names of available
|
/* mbox_lock_names() returns an array with the names of available
|
||||||
/* mailbox locking methods. The result should be given to argv_free().
|
/* mailbox locking methods. The result should be given to argv_free().
|
||||||
@@ -60,9 +63,9 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* The table with available mailbox locking methods. Some systems have
|
* The table with available mailbox locking methods. Some systems have
|
||||||
* flock() locks; all POSIX-compatible systems should have fcntl() locks.
|
* flock() locks; all POSIX-compatible systems have fcntl() locks. Even
|
||||||
* Even though some systems do not use dotlock files, it can be necessary
|
* though some systems do not use dotlock files by default (4.4BSD), such
|
||||||
* when accessing mailbox files over NFS.
|
* locks can be necessary when accessing mailbox files over NFS.
|
||||||
*/
|
*/
|
||||||
static NAME_MASK mbox_mask[] = {
|
static NAME_MASK mbox_mask[] = {
|
||||||
#ifdef HAS_FLOCK_LOCK
|
#ifdef HAS_FLOCK_LOCK
|
||||||
|
@@ -391,7 +391,7 @@ static int deliver_message(DELIVER_REQUEST *request, char **unused_argv)
|
|||||||
|
|
||||||
/* lmtp_service - perform service for client */
|
/* lmtp_service - perform service for client */
|
||||||
|
|
||||||
static void lmtp_service(VSTREAM * client_stream, char *unused_service, char **argv)
|
static void lmtp_service(VSTREAM *client_stream, char *unused_service, char **argv)
|
||||||
{
|
{
|
||||||
DELIVER_REQUEST *request;
|
DELIVER_REQUEST *request;
|
||||||
int status;
|
int status;
|
||||||
|
@@ -595,7 +595,8 @@ static void local_mask_init(void)
|
|||||||
local_mbox_lock_mask &= MBOX_DOT_LOCK;
|
local_mbox_lock_mask &= MBOX_DOT_LOCK;
|
||||||
}
|
}
|
||||||
if (local_mbox_lock_mask == 0)
|
if (local_mbox_lock_mask == 0)
|
||||||
msg_fatal("no applicable mailbox locking method");
|
msg_fatal("parameter %s specifies no applicable mailbox locking method",
|
||||||
|
VAR_MAILBOX_LOCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* pre_accept - see if tables have changed */
|
/* pre_accept - see if tables have changed */
|
||||||
|
@@ -220,7 +220,7 @@ static void multi_server_timeout(int unused_event, char *unused_context)
|
|||||||
|
|
||||||
/* multi_server_disconnect - terminate client session */
|
/* multi_server_disconnect - terminate client session */
|
||||||
|
|
||||||
void multi_server_disconnect(VSTREAM * stream)
|
void multi_server_disconnect(VSTREAM *stream)
|
||||||
{
|
{
|
||||||
if (msg_verbose)
|
if (msg_verbose)
|
||||||
msg_info("connection closed fd %d", vstream_fileno(stream));
|
msg_info("connection closed fd %d", vstream_fileno(stream));
|
||||||
@@ -548,7 +548,7 @@ NORETURN multi_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
|
|||||||
".", service_name, (char *) 0);
|
".", service_name, (char *) 0);
|
||||||
why = vstring_alloc(1);
|
why = vstring_alloc(1);
|
||||||
if ((multi_server_lock = safe_open(lock_path, O_CREAT | O_RDWR, 0600,
|
if ((multi_server_lock = safe_open(lock_path, O_CREAT | O_RDWR, 0600,
|
||||||
(struct stat *) 0, -1, -1, why)) == 0)
|
(struct stat *) 0, -1, -1, why)) == 0)
|
||||||
msg_fatal("open lock file %s: %s", lock_path, vstring_str(why));
|
msg_fatal("open lock file %s: %s", lock_path, vstring_str(why));
|
||||||
close_on_exec(vstream_fileno(multi_server_lock), CLOSE_ON_EXEC);
|
close_on_exec(vstream_fileno(multi_server_lock), CLOSE_ON_EXEC);
|
||||||
myfree(lock_path);
|
myfree(lock_path);
|
||||||
|
@@ -519,7 +519,7 @@ NORETURN single_server_main(int argc, char **argv, SINGLE_SERVER_FN service,...)
|
|||||||
".", service_name, (char *) 0);
|
".", service_name, (char *) 0);
|
||||||
why = vstring_alloc(1);
|
why = vstring_alloc(1);
|
||||||
if ((single_server_lock = safe_open(lock_path, O_CREAT | O_RDWR, 0600,
|
if ((single_server_lock = safe_open(lock_path, O_CREAT | O_RDWR, 0600,
|
||||||
(struct stat *) 0, -1, -1, why)) == 0)
|
(struct stat *) 0, -1, -1, why)) == 0)
|
||||||
msg_fatal("open lock file %s: %s", lock_path, vstring_str(why));
|
msg_fatal("open lock file %s: %s", lock_path, vstring_str(why));
|
||||||
close_on_exec(vstream_fileno(single_server_lock), CLOSE_ON_EXEC);
|
close_on_exec(vstream_fileno(single_server_lock), CLOSE_ON_EXEC);
|
||||||
myfree(lock_path);
|
myfree(lock_path);
|
||||||
|
@@ -533,7 +533,7 @@ NORETURN trigger_server_main(int argc, char **argv, TRIGGER_SERVER_FN service,..
|
|||||||
".", service_name, (char *) 0);
|
".", service_name, (char *) 0);
|
||||||
why = vstring_alloc(1);
|
why = vstring_alloc(1);
|
||||||
if ((trigger_server_lock = safe_open(lock_path, O_CREAT | O_RDWR, 0600,
|
if ((trigger_server_lock = safe_open(lock_path, O_CREAT | O_RDWR, 0600,
|
||||||
(struct stat *) 0, -1, -1, why)) == 0)
|
(struct stat *) 0, -1, -1, why)) == 0)
|
||||||
msg_fatal("open lock file %s: %s", lock_path, vstring_str(why));
|
msg_fatal("open lock file %s: %s", lock_path, vstring_str(why));
|
||||||
close_on_exec(vstream_fileno(trigger_server_lock), CLOSE_ON_EXEC);
|
close_on_exec(vstream_fileno(trigger_server_lock), CLOSE_ON_EXEC);
|
||||||
myfree(lock_path);
|
myfree(lock_path);
|
||||||
|
@@ -515,7 +515,7 @@ int main(int argc, char **argv)
|
|||||||
VAR_MAX_BACKOFF_TIME, DEF_MAX_BACKOFF_TIME, &var_max_backoff_time, 1, 0,
|
VAR_MAX_BACKOFF_TIME, DEF_MAX_BACKOFF_TIME, &var_max_backoff_time, 1, 0,
|
||||||
VAR_MAX_QUEUE_TIME, DEF_MAX_QUEUE_TIME, &var_max_queue_time, 1, 1000,
|
VAR_MAX_QUEUE_TIME, DEF_MAX_QUEUE_TIME, &var_max_queue_time, 1, 1000,
|
||||||
VAR_QMGR_ACT_LIMIT, DEF_QMGR_ACT_LIMIT, &var_qmgr_active_limit, 1, 0,
|
VAR_QMGR_ACT_LIMIT, DEF_QMGR_ACT_LIMIT, &var_qmgr_active_limit, 1, 0,
|
||||||
VAR_QMGR_RCPT_LIMIT, DEF_QMGR_RCPT_LIMIT, &var_qmgr_rcpt_limit, 0, 0,
|
VAR_QMGR_RCPT_LIMIT, DEF_QMGR_RCPT_LIMIT, &var_qmgr_rcpt_limit, 1, 0,
|
||||||
VAR_QMGR_MSG_RCPT_LIMIT, DEF_QMGR_MSG_RCPT_LIMIT, &var_qmgr_msg_rcpt_limit, 1, 0,
|
VAR_QMGR_MSG_RCPT_LIMIT, DEF_QMGR_MSG_RCPT_LIMIT, &var_qmgr_msg_rcpt_limit, 1, 0,
|
||||||
VAR_XPORT_RCPT_LIMIT, DEF_XPORT_RCPT_LIMIT, &var_xport_rcpt_limit, 0, 0,
|
VAR_XPORT_RCPT_LIMIT, DEF_XPORT_RCPT_LIMIT, &var_xport_rcpt_limit, 0, 0,
|
||||||
VAR_STACK_RCPT_LIMIT, DEF_STACK_RCPT_LIMIT, &var_stack_rcpt_limit, 0, 0,
|
VAR_STACK_RCPT_LIMIT, DEF_STACK_RCPT_LIMIT, &var_stack_rcpt_limit, 0, 0,
|
||||||
|
@@ -174,13 +174,6 @@ int main(int argc, char **argv)
|
|||||||
&& (close(fd), open("/dev/null", O_RDWR, 0)) != fd)
|
&& (close(fd), open("/dev/null", O_RDWR, 0)) != fd)
|
||||||
msg_fatal("open /dev/null: %m");
|
msg_fatal("open /dev/null: %m");
|
||||||
|
|
||||||
/*
|
|
||||||
* Strip the environment so we don't have to trust the C library.
|
|
||||||
*/
|
|
||||||
import_env = argv_split(var_import_environ, ", \t\r\n");
|
|
||||||
clean_env(import_env->argv);
|
|
||||||
argv_free(import_env);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up logging. Censor the process name: it is provided by the user.
|
* Set up logging. Censor the process name: it is provided by the user.
|
||||||
*/
|
*/
|
||||||
@@ -199,6 +192,14 @@ int main(int argc, char **argv)
|
|||||||
* perform some sanity checks on the input.
|
* perform some sanity checks on the input.
|
||||||
*/
|
*/
|
||||||
mail_conf_read();
|
mail_conf_read();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Strip the environment so we don't have to trust the C library.
|
||||||
|
*/
|
||||||
|
import_env = argv_split(var_import_environ, ", \t\r\n");
|
||||||
|
clean_env(import_env->argv);
|
||||||
|
argv_free(import_env);
|
||||||
|
|
||||||
if (chdir(var_queue_dir))
|
if (chdir(var_queue_dir))
|
||||||
msg_fatal("chdir %s: %m", var_queue_dir);
|
msg_fatal("chdir %s: %m", var_queue_dir);
|
||||||
if (msg_verbose)
|
if (msg_verbose)
|
||||||
|
@@ -147,7 +147,6 @@ static VSTRING *command;
|
|||||||
* Tunable parameters.
|
* Tunable parameters.
|
||||||
*/
|
*/
|
||||||
char *var_transport_maps;
|
char *var_transport_maps;
|
||||||
char *var_def_transport;
|
|
||||||
bool var_swap_bangpath;
|
bool var_swap_bangpath;
|
||||||
bool var_append_dot_mydomain;
|
bool var_append_dot_mydomain;
|
||||||
bool var_append_at_myorigin;
|
bool var_append_at_myorigin;
|
||||||
@@ -210,7 +209,6 @@ int main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
static CONFIG_STR_TABLE str_table[] = {
|
static CONFIG_STR_TABLE str_table[] = {
|
||||||
VAR_TRANSPORT_MAPS, DEF_TRANSPORT_MAPS, &var_transport_maps, 0, 0,
|
VAR_TRANSPORT_MAPS, DEF_TRANSPORT_MAPS, &var_transport_maps, 0, 0,
|
||||||
VAR_DEF_TRANSPORT, DEF_DEF_TRANSPORT, &var_def_transport, 0, 0,
|
|
||||||
VAR_LOCAL_TRANSPORT, DEF_LOCAL_TRANSPORT, &var_local_transport, 0, 0,
|
VAR_LOCAL_TRANSPORT, DEF_LOCAL_TRANSPORT, &var_local_transport, 0, 0,
|
||||||
0,
|
0,
|
||||||
};
|
};
|
||||||
|
@@ -109,8 +109,8 @@ static VSTREAM *safe_open_exist(const char *path, int flags,
|
|||||||
if (fstat_st == 0)
|
if (fstat_st == 0)
|
||||||
fstat_st = &local_statbuf;
|
fstat_st = &local_statbuf;
|
||||||
if (fstat(vstream_fileno(fp), fstat_st) < 0) {
|
if (fstat(vstream_fileno(fp), fstat_st) < 0) {
|
||||||
msg_fatal("bad open file status: %m");
|
msg_fatal("%s: bad open file status: %m", path);
|
||||||
} else if (fstat_st->st_nlink != 1) {
|
} else if (fstat_st->st_nlink > 1) {
|
||||||
vstring_sprintf(why, "file has multiple hard links");
|
vstring_sprintf(why, "file has multiple hard links");
|
||||||
} else if (S_ISDIR(fstat_st->st_mode)) {
|
} else if (S_ISDIR(fstat_st->st_mode)) {
|
||||||
vstring_sprintf(why, "file is a directory");
|
vstring_sprintf(why, "file is a directory");
|
||||||
@@ -187,7 +187,7 @@ static VSTREAM *safe_open_create(const char *path, int flags, int mode,
|
|||||||
* Optionally look up the file attributes.
|
* Optionally look up the file attributes.
|
||||||
*/
|
*/
|
||||||
if (st != 0 && fstat(vstream_fileno(fp), st) < 0)
|
if (st != 0 && fstat(vstream_fileno(fp), st) < 0)
|
||||||
msg_fatal("bad open file status: %m");
|
msg_fatal("%s: bad open file status: %m", path);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We are almost there...
|
* We are almost there...
|
||||||
|
Reference in New Issue
Block a user