From: Wietse Venema Date: Thu, 27 May 1999 05:00:00 +0000 (-0500) Subject: snapshot-19990527 X-Git-Tag: v20010228~103 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8933229fb7abd01c0d32cda6231e2535f10a3950;p=thirdparty%2Fpostfix.git snapshot-19990527 --- diff --git a/postfix/HISTORY b/postfix/HISTORY index cd0b2e921..db56eee6f 100644 --- a/postfix/HISTORY +++ b/postfix/HISTORY @@ -2790,8 +2790,22 @@ Apologies for any names omitted. discarded" warning when mail is dropped on the floor. Requested by Michael Hasenstein, SuSE, Germany. +19990516 + + Feature: per-service peak and average process limit. When + the system is lightly loaded, use the per-service peak + process limit. When the system is under stress, use the + per-service average process limit. The per-service average + process count is computed once a minute. + 19990517 Bugfix: reject_non_fqdn_sender/recipient would pass user@[ip_address] regardless of destination. Eric Cholet had the honor of suffering from this one. + +19990527 + + More SMTP client logging for easier debugging: the smtp + client now logs hostname[ip.addr], and logs every failed + attempt to reach an MX host, not just the last one. diff --git a/postfix/RELEASE_NOTES b/postfix/RELEASE_NOTES index 79ddd58e7..0d3f3744a 100644 --- a/postfix/RELEASE_NOTES +++ b/postfix/RELEASE_NOTES @@ -27,12 +27,12 @@ commands into separate directories. Major changes with snapshot-19990513: ===================================== -- New USER, EXTENSION, LOCAL and DOMAIN environment variables for -delivery to command (including mailbox_command) by the local delivery -agent. As you might expect, the information is censored. The list -of acceptable characters is specified with the command_expansion_filter -configuration parameter. Unacceptable characters are replaced by -underscores. +- New USER, EXTENSION, LOCAL, DOMAIN. and RECIPIENT environment +variables for delivery to command (including mailbox_command) by +the local delivery agent. As you might expect, the information is +censored. The list of acceptable characters is specified with the +command_expansion_filter configuration parameter. Unacceptable +characters are replaced by underscores. See html/local.8.html. - Specify "forward_path = /var/forward/$user" to avoid looking up .forward files in user home directories. The default value is diff --git a/postfix/cleanup/cleanup_envelope.c b/postfix/cleanup/cleanup_envelope.c index e7c29bf1c..6e009b23e 100644 --- a/postfix/cleanup/cleanup_envelope.c +++ b/postfix/cleanup/cleanup_envelope.c @@ -78,7 +78,8 @@ void cleanup_envelope(void) } if (type == REC_TYPE_MESG) { if (cleanup_sender == 0 || cleanup_time == 0) { - msg_warn("missing sender or time envelope record"); + msg_warn("%s: missing sender or time envelope record", + cleanup_queue_id); cleanup_errs |= CLEANUP_STAT_BAD; } else { if (warn_time == 0 && var_delay_warn_time > 0) @@ -90,7 +91,8 @@ void cleanup_envelope(void) break; } if (strchr(REC_TYPE_ENVELOPE, type) == 0) { - msg_warn("unexpected record type %d in envelope", type); + msg_warn("%s: unexpected record type %d in envelope", type, + cleanup_queue_id); cleanup_errs |= CLEANUP_STAT_BAD; break; } @@ -117,7 +119,8 @@ void cleanup_envelope(void) cleanup_sender = mystrdup(STR(clean_addr)); } else if (type == REC_TYPE_RCPT) { if (cleanup_sender == 0) { /* protect showq */ - msg_warn("envelope recipient precedes sender"); + msg_warn("%s: envelope recipient precedes sender", + cleanup_queue_id); cleanup_errs |= CLEANUP_STAT_BAD; break; } diff --git a/postfix/cleanup/cleanup_extracted.c b/postfix/cleanup/cleanup_extracted.c index 3bd442b79..1057273f5 100644 --- a/postfix/cleanup/cleanup_extracted.c +++ b/postfix/cleanup/cleanup_extracted.c @@ -90,7 +90,8 @@ void cleanup_extracted(void) } else if (type == REC_TYPE_END) { break; } else { - msg_warn("unexpected record type %d in extracted segment", type); + msg_warn("%s: unexpected record type %d in extracted segment", + cleanup_queue_id, type); cleanup_errs |= CLEANUP_STAT_BAD; if (type >= 0) cleanup_skip(); diff --git a/postfix/cleanup/cleanup_map11.c b/postfix/cleanup/cleanup_map11.c index 0680191a8..96069324a 100644 --- a/postfix/cleanup/cleanup_map11.c +++ b/postfix/cleanup/cleanup_map11.c @@ -103,8 +103,8 @@ void cleanup_map11_external(VSTRING *addr, MAPS *maps, int propagate) for (count = 0; count < MAX_RECURSION; count++) { if ((new_addr = mail_addr_map(maps, STR(addr), propagate)) != 0) { if (new_addr->argc > 1) - msg_warn("multi-valued %s entry for %s", - maps->title, STR(addr)); + msg_warn("%s: multi-valued %s entry for %s", + cleanup_queue_id, maps->title, STR(addr)); saved_addr = mystrdup(STR(addr)); vstring_strcpy(addr, new_addr->argv[0]); expand_to_self = !strcasecmp(saved_addr, STR(addr)); diff --git a/postfix/cleanup/cleanup_message.c b/postfix/cleanup/cleanup_message.c index 592a8696d..2a862e54c 100644 --- a/postfix/cleanup/cleanup_message.c +++ b/postfix/cleanup/cleanup_message.c @@ -391,7 +391,8 @@ void cleanup_message(void) break; } if (strchr(REC_TYPE_CONTENT, type) == 0) { - msg_warn("%s: unexpected record type %d", myname, type); + msg_warn("%s: %s: unexpected record type %d", + cleanup_queue_id, myname, type); cleanup_errs |= CLEANUP_STAT_BAD; break; } diff --git a/postfix/cleanup/cleanup_out.c b/postfix/cleanup/cleanup_out.c index dd51383e6..7be237040 100644 --- a/postfix/cleanup/cleanup_out.c +++ b/postfix/cleanup/cleanup_out.c @@ -84,7 +84,8 @@ void cleanup_out(int type, char *string, int len) if (CLEANUP_OUT_OK()) { if (rec_put(cleanup_dst, type, string, len) < 0) { if (errno == EFBIG) { - msg_warn("queue file size limit exceeded"); + msg_warn("%s: queue file size limit exceeded", + cleanup_queue_id); cleanup_errs |= CLEANUP_STAT_SIZE; } else { msg_warn("%s: write queue file: %m", cleanup_queue_id); diff --git a/postfix/cleanup/cleanup_skip.c b/postfix/cleanup/cleanup_skip.c index 00f73aa4b..d9d22ed5c 100644 --- a/postfix/cleanup/cleanup_skip.c +++ b/postfix/cleanup/cleanup_skip.c @@ -46,7 +46,7 @@ void cleanup_skip(void) { int type; - msg_warn("skipping further client input"); + msg_warn("%s: skipping further client input", cleanup_queue_id); /* * XXX Rely on the front-end programs to enforce record size limits. diff --git a/postfix/conf/main.cf.default b/postfix/conf/main.cf.default index ef7182e6f..45bfd12e9 100644 --- a/postfix/conf/main.cf.default +++ b/postfix/conf/main.cf.default @@ -62,7 +62,7 @@ luser_relay = mail_name = Postfix mail_owner = postfix mail_spool_directory = /var/mail -mail_version = Snapshot-19990513 +mail_version = Snapshot-19990527 mailbox_command = mailbox_transport = maps_rbl_domains = rbl.maps.vix.com @@ -82,7 +82,7 @@ notify_classes = resource,software owner_request_special = yes process_id_directory = pid program_directory = /usr/libexec/postfix -propagate_unmatched_extension = canonical, virtual +propagate_unmatched_extensions = canonical, virtual qmgr_message_active_limit = 1000 qmgr_message_recipient_limit = 10000 queue_directory = /var/spool/postfix diff --git a/postfix/global/mail_params.h b/postfix/global/mail_params.h index bd1ce7422..517e6fc5a 100644 --- a/postfix/global/mail_params.h +++ b/postfix/global/mail_params.h @@ -328,7 +328,7 @@ extern char *var_fallback_transport; #define DEF_FORWARD_PATH "$home/.forward${recipient_delimiter}${extension},$home/.forward" extern char *var_forward_path; -#define VAR_PROP_EXTENSION "propagate_unmatched_extension" +#define VAR_PROP_EXTENSION "propagate_unmatched_extensions" #define DEF_PROP_EXTENSION "canonical, virtual" extern char *var_prop_extension; diff --git a/postfix/global/mail_version.h b/postfix/global/mail_version.h index caac8b2f4..369c9134a 100644 --- a/postfix/global/mail_version.h +++ b/postfix/global/mail_version.h @@ -15,7 +15,7 @@ * Version of this program. */ #define VAR_MAIL_VERSION "mail_version" -#define DEF_MAIL_VERSION "Snapshot-19990518" +#define DEF_MAIL_VERSION "Snapshot-19990527" extern char *var_mail_version; /* LICENSE diff --git a/postfix/html/faq.html b/postfix/html/faq.html index 9070ba017..16cbd5033 100644 --- a/postfix/html/faq.html +++ b/postfix/html/faq.html @@ -24,6 +24,10 @@
  • Running Postfix on a firewall +
  • Running Postfix on a dialup machine + +

    +

  • Delivering some users locally while sending mail as user@domain
  • Support for maildir-style mailboxes @@ -36,12 +40,16 @@
  • Postfix breaks the majordomo "approve" command +

    +

  • Setting up an Internet to UUCP gateway
  • Using UUCP as the default transport
  • Sending mail to a FAX machine +

    +

  • Mail fails with timeout or lost connection
  • Undefined symbols: ___dn_expand, ___res_init etc. @@ -241,6 +249,105 @@ Unfortunately, the solution cannot use the transport table, because that table is ignored for destinations that match $mydestination. That's an implementation error, and it will be removed. +
    + +

    Running Postfix on a dialup machine

    + +
    @@ -249,14 +356,14 @@ That's an implementation error, and it will be removed. +Postfix exports information via environment variables. The contents +are censored. Any characters that may have special meaning to the +shell are replaced by underscores. + +

    + +

    + +
    + +
    DOMAIN
    The text to the right-hand side of the +@ in the recipient address. + +
    EXTENSION
    Optional address extension part. + +
    HOME
    The recpient's home directory. + +
    LOCAL
    The text to the left-hand side of the @ +in the recipient address, for example, $USER+$EXTENSION. + +
    LOGNAME
    The recipient username. + +
    RECIPIENT
    The entire recipient address, +$LOCAL@$DOMAIN. + +
    SHELL
    The recipient's login shell. + +
    USER
    The recipient username. + +
    + +
    +

    Postfix breaks "sendmail -v"

    diff --git a/postfix/makedefs b/postfix/makedefs index 33ae8d168..50e58dec2 100644 --- a/postfix/makedefs +++ b/postfix/makedefs @@ -195,7 +195,8 @@ case "$CC" in */gcc|gcc) case `$CC -v` in "gcc version 2.8"*) : ${OPT=};; esac;; - *) : ${OPT='-O'};; + *CC) echo "Don't use CC. That's the C++ compiler" 1>&2; exit 1;; + *) : ${OPT='-O'};; esac : ${CC='gcc $(WARN)'} ${OPT='-O'} ${DEBUG='-g'} diff --git a/postfix/master/Makefile.in b/postfix/master/Makefile.in index fe194f86e..a8d7b9631 100644 --- a/postfix/master/Makefile.in +++ b/postfix/master/Makefile.in @@ -2,10 +2,10 @@ SHELL = /bin/sh SRCS = master.c master_conf.c master_ent.c master_sig.c master_avail.c \ master_spawn.c master_service.c master_status.o master_listen.c \ master_proto.c single_server.c multi_server.c master_vars.c \ - master_wakeup.c + master_wakeup.c master_sample.c OBJS = master.o master_conf.o master_ent.o master_sig.o master_avail.o \ master_spawn.o master_service.o master_status.o master_listen.o \ - master_vars.o master_wakeup.o + master_vars.o master_wakeup.o master_sample.o LIB_OBJ = single_server.o multi_server.o trigger_server.o master_proto.o HDRS = mail_server.h master_proto.h INT_HDR = master.h @@ -118,6 +118,7 @@ master_ent.o: ../include/argv.h master_ent.o: ../include/stringops.h master_ent.o: ../include/readlline.h master_ent.o: ../include/inet_addr_list.h +master_ent.o: ../include/split_at.h master_ent.o: ../include/mail_proto.h master_ent.o: ../include/iostuff.h master_ent.o: ../include/mail_params.h @@ -139,6 +140,11 @@ master_proto.o: master_proto.c master_proto.o: ../include/sys_defs.h master_proto.o: ../include/msg.h master_proto.o: master_proto.h +master_sample.o: master_sample.c +master_sample.o: ../include/sys_defs.h +master_sample.o: ../include/events.h +master_sample.o: ../include/msg.h +master_sample.o: master.h master_service.o: master_service.c master_service.o: ../include/sys_defs.h master_service.o: ../include/msg.h diff --git a/postfix/master/master.c b/postfix/master/master.c index 463d324ae..36f0b1e36 100644 --- a/postfix/master/master.c +++ b/postfix/master/master.c @@ -331,6 +331,7 @@ int main(int argc, char **argv) * that there are no concurrency conflicts within the master process. */ signal(SIGALRM, master_watchdog); + master_sample_start(); for (;;) { #ifdef HAS_VOLATILE_LOCKS if (myflock(vstream_fileno(lock_fp), MYFLOCK_EXCLUSIVE) < 0) diff --git a/postfix/master/master.h b/postfix/master/master.h index f09af8770..d54748f6e 100644 --- a/postfix/master/master.h +++ b/postfix/master/master.h @@ -27,10 +27,13 @@ typedef struct MASTER_SERV { struct INET_ADDR_LIST *inet; } addr_list; int max_proc; /* upper bound on # processes */ + int max_proc_pk; /* peak upper bound */ + int max_proc_avg; /* average upper bound */ char *path; /* command pathname */ struct ARGV *args; /* argument vector */ int avail_proc; /* idle processes */ int total_proc; /* number of processes */ + float total_proc_avg; /* average number of processes */ int throttle_delay; /* failure recovery parameter */ int status_fd[2]; /* child status reports */ struct BINHASH *children; /* linkage */ @@ -155,6 +158,12 @@ extern void master_spawn(MASTER_SERV *); extern void master_reap_child(void); extern void master_delete_children(MASTER_SERV *); + /* + * master_sample.c + */ +extern void master_sample_start(void); +extern void master_sample_stop(void); + /* DIAGNOSTICS /* BUGS /* SEE ALSO diff --git a/postfix/master/master_avail.c b/postfix/master/master_avail.c index e5507ef6d..7defd510b 100644 --- a/postfix/master/master_avail.c +++ b/postfix/master/master_avail.c @@ -102,8 +102,10 @@ void master_avail_listen(MASTER_SERV *serv) * request. */ if (msg_verbose) - msg_info("%s: avail %d total %d max %d", myname, - serv->avail_proc, serv->total_proc, serv->max_proc); + msg_info("%s: avail %d total/avg %d/%.1f max/pk/avg %d/%d/%d", myname, + serv->avail_proc, serv->total_proc, serv->total_proc_avg, + serv->max_proc, serv->max_proc, serv->max_proc_pk, + serv->max_proc_avg); if (serv->avail_proc < 1 && MASTER_LIMIT_OK(serv->max_proc, serv->total_proc) && !MASTER_THROTTLED(serv)) { diff --git a/postfix/master/master_conf.c b/postfix/master/master_conf.c index 083295531..85da4619d 100644 --- a/postfix/master/master_conf.c +++ b/postfix/master/master_conf.c @@ -124,7 +124,8 @@ void master_config(void) else { serv->flags &= ~MASTER_FLAG_MARK; serv->wakeup_time = entry->wakeup_time; - serv->max_proc = entry->max_proc; + serv->max_proc_pk = entry->max_proc_pk; + serv->max_proc_avg = entry->max_proc_avg; serv->throttle_delay = entry->throttle_delay; SWAP(char *, serv->path, entry->path); SWAP(ARGV *, serv->args, entry->args); diff --git a/postfix/master/master_ent.c b/postfix/master/master_ent.c index ae77491ca..3557f4fa1 100644 --- a/postfix/master/master_ent.c +++ b/postfix/master/master_ent.c @@ -84,6 +84,7 @@ #include #include #include +#include /* Global library. */ @@ -183,13 +184,10 @@ static char *get_str_ent(char **bufp, char *name, char *def_val) } } -/* get_bool_ent - extract boolean field */ +/* cvt_bool_ent - convert boolean field */ -static int get_bool_ent(char **bufp, char *name, char *def_val) +static int cvt_bool_ent(char *name, char *value) { - char *value; - - value = get_str_ent(bufp, name, def_val); if (strcmp("y", value) == 0) { return (1); } else if (strcmp("n", value) == 0) { @@ -200,19 +198,37 @@ static int get_bool_ent(char **bufp, char *name, char *def_val) /* NOTREACHED */ } -/* get_int_ent - extract integer field */ +/* get_bool_ent - extract boolean field */ -static int get_int_ent(char **bufp, char *name, char *def_val, int min_val) +static int get_bool_ent(char **bufp, char *name, char *def_val) { char *value; - int n; value = get_str_ent(bufp, name, def_val); + return (cvt_bool_ent(name, value)); +} + +/* cvt_int_ent - convert integer field */ + +static int cvt_int_ent(char *name, char *value, int min_val) +{ + int n; + if (!ISDIGIT(*value) || (n = atoi(value)) < min_val) fatal_invalid_field(name, value); return (n); } +/* get_int_ent - extract integer field */ + +static int get_int_ent(char **bufp, char *name, char *def_val, int min_val) +{ + char *value; + + value = get_str_ent(bufp, name, def_val); + return (cvt_int_ent(name, value, min_val)); +} + /* get_master_ent - read entry from configuration file */ MASTER_SERV *get_master_ent() @@ -229,6 +245,7 @@ MASTER_SERV *get_master_ent() char *command; int n; char *bufp; + char *cp2; if (master_fp == 0) msg_panic("get_master_ent: config file not open"); @@ -343,7 +360,23 @@ MASTER_SERV *get_master_ent() * Concurrency limit. Zero means no limit. */ vstring_sprintf(junk, "%d", var_proc_limit); - serv->max_proc = get_int_ent(&bufp, "max_proc", vstring_str(junk), 0); + cp = get_str_ent(&bufp, "max_proc", vstring_str(junk)); + if ((cp2 = split_at(cp, '/')) != 0) { + serv->max_proc_pk = cvt_int_ent("max_proc", strcmp(cp, "-") != 0 ? + cp : vstring_str(junk), 0); + serv->max_proc_avg = cvt_int_ent("max_proc", strcmp(cp2, "-") != 0 ? + cp2 : vstring_str(junk), 0); + if (serv->max_proc_pk == 0 && serv->max_proc_avg != 0) + fatal_with_context("specify a non-zero peak process limit"); + if (serv->max_proc_pk != 0 && serv->max_proc_avg == 0) + fatal_with_context("specify a non-zero average process limit"); + if (serv->max_proc_pk < serv->max_proc_avg) + fatal_with_context("peak < average process limit"); + } else { + serv->max_proc_pk = cvt_int_ent("max_proc", cp, 0); + serv->max_proc_avg = serv->max_proc; + } + serv->max_proc = serv->max_proc_pk; /* * Path to command, @@ -356,6 +389,7 @@ MASTER_SERV *get_master_ent() */ serv->avail_proc = 0; serv->total_proc = 0; + serv->total_proc_avg = 0; /* * Backoff time in case a service is broken. @@ -378,7 +412,7 @@ MASTER_SERV *get_master_ent() */ serv->args = argv_alloc(0); argv_add(serv->args, command, (char *) 0); - if (serv->max_proc == 1) + if (serv->max_proc_pk == 1) argv_add(serv->args, "-l", (char *) 0); if (strcmp(basename(command), name) != 0) argv_add(serv->args, "-n", name, (char *) 0); @@ -422,11 +456,14 @@ void print_master_ent(MASTER_SERV *serv) msg_info("listen_fd_count: %d", serv->listen_fd_count); msg_info("wakeup: %d", serv->wakeup_time); msg_info("max_proc: %d", serv->max_proc); + msg_info("max_proc_pk: %d", serv->max_proc_pk); + msg_info("max_proc_avg: %d", serv->max_proc_avg); msg_info("path: %s", serv->path); for (cpp = serv->args->argv; *cpp; cpp++) msg_info("arg[%d]: %s", (int) (cpp - serv->args->argv), *cpp); msg_info("avail_proc: %d", serv->avail_proc); msg_info("total_proc: %d", serv->total_proc); + msg_info("total_proc_avg: %f", serv->total_proc_avg); msg_info("throttle_delay: %d", serv->throttle_delay); msg_info("status_fd %d %d", serv->status_fd[0], serv->status_fd[1]); msg_info("children: 0x%lx", (long) serv->children); diff --git a/postfix/master/master_sample.c b/postfix/master/master_sample.c new file mode 100644 index 000000000..e3200b265 --- /dev/null +++ b/postfix/master/master_sample.c @@ -0,0 +1,98 @@ +/*++ +/* NAME +/* master_sample 3 +/* SUMMARY +/* Postfix master - statistics sampling +/* SYNOPSIS +/* #include "master.h" +/* +/* void master_sample_start() +/* +/* void master_sample_stop(serv) +/* DESCRIPTION +/* This module samples statistics at one-minute intervals. +/* Currently, it maintains the average process counts. +/* +/* master_sample_start() resets the statistics and starts +/* the statistics sampling process. +/* +/* master_sample_start() stops the statistics sampling process. +/* DIAGNOSTICS +/* BUGS +/* SEE ALSO +/* LICENSE +/* .ad +/* .fi +/* The Secure Mailer license must be distributed with this software. +/* AUTHOR(S) +/* Wietse Venema +/* IBM T.J. Watson Research +/* P.O. Box 704 +/* Yorktown Heights, NY 10598, USA +/*--*/ + +/* System libraries. */ + +#include + +/* Utility library. */ + +#include +#include + +/* Application-specific. */ + +#include "master.h" + +/* master_sample_action - take sample */ + +static void master_sample_action(int unused_event, char *unused_context) +{ + MASTER_SERV *serv; + +#define TSAMPLE 60 +#define NSAMPLE 5 + + /* + * Update the process limit for services that have different peak/average + * concurrency limits. Gradually change from idle mode (allowing peak + * concurrency) to stress mode (long-term average process limit). + */ + for (serv = master_head; serv != 0; serv = serv->next) { + if (serv->max_proc_pk == 0 || serv->max_proc_avg == 0 + || serv->max_proc_pk == serv->max_proc_avg) + continue; + serv->total_proc_avg += + (serv->total_proc - serv->total_proc_avg) / NSAMPLE; + if (msg_verbose) + msg_info("%s total/avg %d/%.1f", + serv->name, serv->total_proc, serv->total_proc_avg); + if (serv->max_proc_pk < serv->max_proc_avg) + msg_panic("%s: process limit botch: %d < %d", + serv->name, serv->max_proc_pk, serv->max_proc_avg); + if (serv->total_proc_avg >= serv->max_proc_avg) + serv->max_proc = serv->max_proc_avg; + else + serv->max_proc = serv->max_proc_pk + - serv->total_proc_avg * (serv->max_proc_pk - serv->max_proc_avg) / (double) serv->max_proc_avg; + } + event_request_timer(master_sample_action, (char *) 0, TSAMPLE); +} + +/* master_sample_start - start sampling */ + +void master_sample_start(void) +{ + MASTER_SERV *serv; + + for (serv = master_head; serv != 0; serv = serv->next) + serv->total_proc_avg = 0; + event_request_timer(master_sample_action, (char *) 0, TSAMPLE); +} + +/* master_sample_stop - stop sampling */ + +void master_sample_stop(void) +{ + event_cancel_timer(master_sample_action, (char *) 0); +} diff --git a/postfix/smtp/smtp.h b/postfix/smtp/smtp.h index 0d34d8372..e236d9a07 100644 --- a/postfix/smtp/smtp.h +++ b/postfix/smtp/smtp.h @@ -54,6 +54,7 @@ typedef struct SMTP_SESSION { VSTREAM *stream; /* network connection */ char *host; /* mail exchanger */ char *addr; /* mail exchanger */ + char *namaddr; /* mail exchanger */ int best; /* most preferred host */ } SMTP_SESSION; diff --git a/postfix/smtp/smtp_addr.c b/postfix/smtp/smtp_addr.c index 9d32ba074..7d44ad2ec 100644 --- a/postfix/smtp/smtp_addr.c +++ b/postfix/smtp/smtp_addr.c @@ -143,9 +143,11 @@ static DNS_RR *smtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI */ if (ISDIGIT(host[0]) && (inaddr.s_addr = inet_addr(host)) != INADDR_NONE) { memset((char *) &fixed, 0, sizeof(fixed)); - return (dns_rr_append(addr_list, - dns_rr_create(host, &fixed, pref, - (char *) &inaddr, sizeof(inaddr)))); + rr = dns_rr_create(host, &fixed, pref, + (char *) &inaddr, sizeof(inaddr)); + if (msg_verbose) + smtp_print_addr(host, rr); + return (dns_rr_append(addr_list, rr)); } /* @@ -163,10 +165,12 @@ static DNS_RR *smtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI smtp_errno = SMTP_FAIL; } else { while (hp->h_addr_list[0]) { - addr_list = dns_rr_append(addr_list, - dns_rr_create(host, &fixed, pref, - hp->h_addr_list[0], - sizeof(inaddr))); + rr = dns_rr_create(host, &fixed, pref, + hp->h_addr_list[0], + sizeof(inaddr)); + if (msg_verbose) + smtp_print_addr(host, rr); + addr_list = dns_rr_append(addr_list, rr); hp->h_addr_list++; } } @@ -180,6 +184,8 @@ static DNS_RR *smtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRI case DNS_OK: for (rr = addr; rr; rr = rr->next) rr->pref = pref; + if (msg_verbose) + smtp_print_addr(host, addr_list); addr_list = dns_rr_append(addr_list, addr); break; default: diff --git a/postfix/smtp/smtp_chat.c b/postfix/smtp/smtp_chat.c index 7d3547461..de11387a1 100644 --- a/postfix/smtp/smtp_chat.c +++ b/postfix/smtp/smtp_chat.c @@ -142,7 +142,7 @@ void smtp_chat_cmd(SMTP_STATE *state, char *fmt,...) * program is trying to do. */ if (msg_verbose) - msg_info("> %s: %s", session->host, STR(state->buffer)); + msg_info("> %s: %s", session->namaddr, STR(state->buffer)); /* * Send the command to the SMTP server. @@ -177,9 +177,9 @@ SMTP_RESP *smtp_chat_resp(SMTP_STATE *state) cp = printable(STR(state->buffer), '?'); if (last_char != '\n') msg_warn("%s: response longer than %d: %.30s...", - session->host, var_line_limit, cp); + session->namaddr, var_line_limit, cp); if (msg_verbose) - msg_info("< %s: %s", session->host, cp); + msg_info("< %s: %s", session->namaddr, cp); while (ISDIGIT(*cp)) cp++; rdata.code = (cp - STR(state->buffer) == 3 ? @@ -256,9 +256,9 @@ void smtp_chat_notify(SMTP_STATE *state) mail_addr_mail_daemon()); post_mail_fprintf(notice, "To: %s (Postmaster)", var_error_rcpt); post_mail_fprintf(notice, "Subject: %s SMTP client: errors from %s", - var_mail_name, session->host); + var_mail_name, session->namaddr); post_mail_fputs(notice, ""); - post_mail_fprintf(notice, "Unexpected response from %s.", session->host); + post_mail_fprintf(notice, "Unexpected response from %s.", session->namaddr); post_mail_fputs(notice, ""); post_mail_fputs(notice, "Transcript of session follows."); post_mail_fputs(notice, ""); diff --git a/postfix/smtp/smtp_connect.c b/postfix/smtp/smtp_connect.c index 1cd81061a..525add1b7 100644 --- a/postfix/smtp/smtp_connect.c +++ b/postfix/smtp/smtp_connect.c @@ -256,6 +256,7 @@ SMTP_SESSION *smtp_connect_host(char *host, unsigned port, VSTRING *why) SMTP_SESSION *smtp_connect_domain(char *name, unsigned port, VSTRING *why) { + struct in_addr inaddr; SMTP_SESSION *session = 0; DNS_RR *addr_list; DNS_RR *addr; @@ -274,6 +275,11 @@ SMTP_SESSION *smtp_connect_domain(char *name, unsigned port, VSTRING *why) session->best = (addr->pref == addr_list->pref); break; } + if (addr->next) { + memcpy((char *) &inaddr, addr->data, sizeof(inaddr)); + msg_info("%s: connect to %s port %d: %s", + name, inet_ntoa(inaddr), port, vstring_str(why)); + } } dns_rr_free(addr_list); return (session); diff --git a/postfix/smtp/smtp_proto.c b/postfix/smtp/smtp_proto.c index b29b5c418..11db0bfee 100644 --- a/postfix/smtp/smtp_proto.c +++ b/postfix/smtp/smtp_proto.c @@ -166,7 +166,7 @@ int smtp_helo(SMTP_STATE *state) if (((resp = smtp_chat_resp(state))->code / 100) != 2) return (smtp_site_fail(state, resp->code, "host %s refused to talk to me: %s", - session->host, translit(resp->str, "\n", " "))); + session->namaddr, translit(resp->str, "\n", " "))); /* * See if we are talking to ourself. This should not be possible with the @@ -179,7 +179,7 @@ int smtp_helo(SMTP_STATE *state) for (n = 0; (word = mystrtok(&words, " \t\n")) != 0; n++) { if (n == 0 && strcasecmp(word, var_myhostname) == 0) { msg_warn("host %s greeted me with my own hostname %s", - session->host, var_myhostname); + session->namaddr, var_myhostname); return (smtp_site_fail(state, session->best ? 550 : 450, "mail for %s loops back to myself", request->nexthop)); @@ -201,7 +201,7 @@ int smtp_helo(SMTP_STATE *state) if ((resp = smtp_chat_resp(state))->code / 100 != 2) return (smtp_site_fail(state, resp->code, "host %s refused to talk to me: %s", - session->host, + session->namaddr, translit(resp->str, "\n", " "))); } @@ -441,7 +441,7 @@ int smtp_xfer(SMTP_STATE *state) case SMTP_STATE_MAIL: if (resp->code / 100 != 2) { smtp_mesg_fail(state, resp->code, - "host %s said: %s", session->host, + "host %s said: %s", session->namaddr, translit(resp->str, "\n", " ")); mail_from_rejected = 1; } @@ -461,7 +461,7 @@ int smtp_xfer(SMTP_STATE *state) } else { rcpt = request->rcpt_list.info + recv_rcpt; smtp_rcpt_fail(state, resp->code, rcpt, - "host %s said: %s", session->host, + "host %s said: %s", session->namaddr, translit(resp->str, "\n", " ")); rcpt->offset = 0; /* in case deferred */ } @@ -479,7 +479,7 @@ int smtp_xfer(SMTP_STATE *state) if (resp->code / 100 != 3) { if (nrcpt > 0) smtp_mesg_fail(state, resp->code, - "host %s said: %s", session->host, + "host %s said: %s", session->namaddr, translit(resp->str, "\n", " ")); nrcpt = -1; } @@ -500,14 +500,15 @@ int smtp_xfer(SMTP_STATE *state) if (resp->code / 100 != 2) { smtp_mesg_fail(state, resp->code, "host %s said: %s", - session->host, + session->namaddr, translit(resp->str, "\n", " ")); } else { for (nrcpt = 0; nrcpt < recv_rcpt; nrcpt++) { rcpt = request->rcpt_list.info + nrcpt; if (rcpt->offset) { sent(request->queue_id, rcpt->address, - session->host, request->arrival_time, "%s", + session->namaddr, + request->arrival_time, "%s", resp->str); deliver_completed(state->src, rcpt->offset); rcpt->offset = 0; @@ -604,6 +605,9 @@ int smtp_xfer(SMTP_STATE *state) msg_fatal("queue file read error"); if (rec_type != REC_TYPE_XTRA) RETURN(mark_corrupt(state->src)); +#if 0 + vstream_fflush(session->stream); +#endif } /* diff --git a/postfix/smtp/smtp_session.c b/postfix/smtp/smtp_session.c index 549bf1403..4e9558723 100644 --- a/postfix/smtp/smtp_session.c +++ b/postfix/smtp/smtp_session.c @@ -40,6 +40,7 @@ #include #include +#include /* Application-specific. */ @@ -55,6 +56,7 @@ SMTP_SESSION *smtp_session_alloc(VSTREAM *stream, char *host, char *addr) session->stream = stream; session->host = mystrdup(host); session->addr = mystrdup(addr); + session->namaddr = concatenate(host, "[", addr, "]", (char *) 0); session->best = 1; return (session); } @@ -66,6 +68,7 @@ void smtp_session_free(SMTP_SESSION *session) vstream_fclose(session->stream); myfree(session->host); myfree(session->addr); + myfree(session->namaddr); myfree((char *) session); } diff --git a/postfix/smtp/smtp_trouble.c b/postfix/smtp/smtp_trouble.c index 0cf53a289..2bf2c64b7 100644 --- a/postfix/smtp/smtp_trouble.c +++ b/postfix/smtp/smtp_trouble.c @@ -168,7 +168,7 @@ int smtp_site_fail(SMTP_STATE *state, int code, char *format,...) continue; status = (soft_error ? defer_append : bounce_append) (KEEP, request->queue_id, rcpt->address, - session ? session->host : "none", + session ? session->namaddr : "none", request->arrival_time, "%s", vstring_str(why)); if (status == 0) { deliver_completed(state->src, rcpt->offset); @@ -215,7 +215,7 @@ int smtp_mesg_fail(SMTP_STATE *state, int code, char *format,...) continue; status = (SMTP_SOFT(code) ? defer_append : bounce_append) (KEEP, request->queue_id, rcpt->address, - session->host, request->arrival_time, + session->namaddr, request->arrival_time, "%s", vstring_str(why)); if (status == 0) { deliver_completed(state->src, rcpt->offset); @@ -248,7 +248,7 @@ void smtp_rcpt_fail(SMTP_STATE *state, int code, RECIPIENT *rcpt, */ va_start(ap, format); status = (SMTP_SOFT(code) ? vdefer_append : vbounce_append) - (KEEP, request->queue_id, rcpt->address, session->host, + (KEEP, request->queue_id, rcpt->address, session->namaddr, request->arrival_time, format, ap); va_end(ap); if (status == 0) { @@ -277,11 +277,11 @@ int smtp_stream_except(SMTP_STATE *state, int code, char *description) msg_panic("smtp_stream_except: unknown exception %d", code); case SMTP_ERR_EOF: vstring_sprintf(why, "lost connection with %s while %s", - session->host, description); + session->namaddr, description); break; case SMTP_ERR_TIME: vstring_sprintf(why, "conversation with %s timed out while %s", - session->host, description); + session->namaddr, description); break; } @@ -294,7 +294,7 @@ int smtp_stream_except(SMTP_STATE *state, int code, char *description) if (rcpt->offset == 0) continue; state->status |= defer_append(KEEP, request->queue_id, - rcpt->address, session->host, + rcpt->address, session->namaddr, request->arrival_time, "%s", vstring_str(why)); }