From: Jeremy Harris Date: Thu, 4 Apr 2024 14:53:53 +0000 (+0100) Subject: Retries: rework DB keys, and fix exinext IPv6. Bug 3086 X-Git-Url: https://git.exim.org/exim.git/commitdiff_plain/5e0ccec4397bd2d21cc1473681a62e7c2fb6afbe Retries: rework DB keys, and fix exinext IPv6. Bug 3086 --- diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog index 611a2ee76..65da3cead 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -140,6 +140,11 @@ JH/27 Fix crash in logging. When a message with a large number of recipients messages were created as a result. Find and debug help by Mateusz Krawczyk +JH/28 Bug 3086: Fix exinext for ipv6. Change the format of keys in the retry + DB, wrapping transport record bare-ip "host names" and ipv6 + "host addresses" in square-brackets. This makes the parsing that + exinext does more reliable. + Exim version 4.97 ----------------- diff --git a/src/src/deliver.c b/src/src/deliver.c index 70f44535f..0157743a1 100644 --- a/src/src/deliver.c +++ b/src/src/deliver.c @@ -2039,7 +2039,7 @@ static BOOL previously_transported(address_item *addr, BOOL testing) { uschar * s = string_sprintf("%s/%s", - addr->unique + (testflag(addr, af_homonym)? 3:0), addr->transport->name); + addr->unique + (testflag(addr, af_homonym) ? 3:0), addr->transport->name); if (tree_search(tree_nonrecipients, s) != 0) { @@ -3142,7 +3142,7 @@ while (addr_local) if (result == DEFER || testflag(addr2, af_lt_retry_exists)) { int flags = result == DEFER ? 0 : rf_delete; - uschar *retry_key = string_copy(tp->retry_use_local_part + uschar * retry_key = string_copy(tp->retry_use_local_part ? addr2->address_retry_key : addr2->domain_retry_key); *retry_key = 'T'; retry_add_item(addr2, retry_key, flags); @@ -7292,7 +7292,7 @@ while (addr_new) /* Loop until all addresses dealt with */ addr->unique = string_sprintf("%s:%s", addr->address, addr->parent->unique + - (testflag(addr->parent, af_homonym)? 3:0)); + (testflag(addr->parent, af_homonym) ? 3:0)); addr->address_retry_key = addr->domain_retry_key = string_sprintf("T:%s", addr->unique); @@ -7729,7 +7729,7 @@ while (addr_new) /* Loop until all addresses dealt with */ else if (testflag(addr, af_dr_retry_exists)) { - uschar *altkey = string_sprintf("%s:<%s>", addr->address_retry_key, + uschar * altkey = string_sprintf("%s:<%s>", addr->address_retry_key, sender_address); retry_add_item(addr, altkey, rf_delete); retry_add_item(addr, addr->address_retry_key, rf_delete); diff --git a/src/src/exim_dbutil.c b/src/src/exim_dbutil.c index 4d213773b..c868832b1 100644 --- a/src/src/exim_dbutil.c +++ b/src/src/exim_dbutil.c @@ -628,7 +628,7 @@ for (uschar * key = dbfn_scan(dbm, TRUE, &cursor); print_time(retry->first_failed)); printf("%s ", print_time(retry->last_try)); printf("%s %s\n", print_time(retry->next_try), - (retry->expired)? "*" : ""); + retry->expired ? "*" : ""); break; case type_wait: diff --git a/src/src/exinext.src b/src/src/exinext.src index 882ad5f60..5724812c4 100644 --- a/src/src/exinext.src +++ b/src/src/exinext.src @@ -195,45 +195,18 @@ perl - $exim_path "$eximmacdef" $argone $spool_directory $qualify_domain $config $printed = 1; if (/^\s*T:[^:\s]*:/) { + # We rely on non-space-containing strings, for parsing + ($key,$error,$error2,$text) = /^\s*T:(\S+)\s+(\S+)\s+(\S+)\s*(.*)$/; - # Parsing the keys is a nightmare because of IPv6. The design of the - # format for the keys is a complete shambles. All my fault (PH). But - # I don't want to change it just for this purpose. If they key - # contains more than 3 colons, we have an IPv6 address, because - # an IPv6 address must contain at least two colons. - - # Deal with IPv4 addresses (3 colons or fewer) - - if ($key !~ /:([^:]*?:){3}/) - { - ($host,$ip,$port,$msgid) = $key =~ - /^([^:]*):([^:]*)(?::([^:]*)(?::(\S*)|)|)/; - } - - # Deal with IPv6 addresses; sorting out the colons is a complete - # mess. We should be able to find the host name and IP address from - # further in the message. That seems the easiest escape plan here. We - # can use those to match the rest of the key. - - else - { - ($host,$ip) = $text =~ /host\s(\S+)\s\[([^]]+)\]/; - if (defined $host) - { - ($port,$msgid) = $key =~ - /^$host:$ip(?::([^:]*)(?::(\S*)|)|)/; - } - - # This will probably be wrong... - - else - { - ($host,$ip) = $key =~ /([^:]*):(.*)/; - } - } - - printf("Transport: %s [%s]", $host, $ip); + ($host,$ip,$port,$msgid) = $key =~ + /^([^:[]*|\[[^]]*\]) # host (could be an ip) + :([^:[]*|\[[^]]*\]) # ip + (?::(\d{1,5}))? # maybe port + (?::(\S{23}))? # maybe msgid + $/x; + + printf("Transport: %s %s", $host, $ip); print ":$port" if defined $port; print " $msgid" if defined $msgid; print " error $error: $text\n"; diff --git a/src/src/functions.h b/src/src/functions.h index b2f948650..9f6396a17 100644 --- a/src/src/functions.h +++ b/src/src/functions.h @@ -454,11 +454,14 @@ extern BOOL regex_match_and_setup(const pcre2_code *, const uschar *, int, in extern const pcre2_code *regex_compile(const uschar *, mcs_flags, uschar **, pcre2_compile_context *); extern const pcre2_code *regex_must_compile(const uschar *, mcs_flags, BOOL); -extern void retry_add_item(address_item *, uschar *, int); + +extern void retry_add_item(address_item *, const uschar *, int); extern BOOL retry_check_address(const uschar *, host_item *, uschar *, BOOL, - uschar **, uschar **); + const uschar **, const uschar **); extern retry_config *retry_find_config(const uschar *, const uschar *, int, int); -extern BOOL retry_ultimate_address_timeout(uschar *, const uschar *, +extern const uschar *retry_host_key_build(const host_item *, BOOL, + const uschar *); +extern BOOL retry_ultimate_address_timeout(const uschar *, const uschar *, dbdata_retry *, time_t); extern void retry_update(address_item **, address_item **, address_item **); extern const uschar *rewrite_address(const uschar *, BOOL, BOOL, rewrite_rule *, int); diff --git a/src/src/retry.c b/src/src/retry.c index 42393d424..6b977dd58 100644 --- a/src/src/retry.c +++ b/src/src/retry.c @@ -31,7 +31,7 @@ Returns: TRUE if the ultimate timeout has been reached */ BOOL -retry_ultimate_address_timeout(uschar *retry_key, const uschar *domain, +retry_ultimate_address_timeout(const uschar * retry_key, const uschar *domain, dbdata_retry *retry_record, time_t now) { BOOL address_timeout; @@ -75,6 +75,29 @@ return address_timeout; +const uschar * +retry_host_key_build(const host_item * host, BOOL incl_ip, + const uschar * portstring) +{ +const uschar * s = host->name; +gstring * g = string_is_ip_address(s, NULL) + ? string_fmt_append(NULL, "T:[%s]", s) /* wrap a name which is a bare ip */ + : string_fmt_append(NULL, "T:%s", s); + +s = host->address; +if (incl_ip) + g = Ustrchr(s, ':') + ? string_fmt_append(g, ":[%s]", s) /* wrap an ipv6 */ + : string_fmt_append(g, ":%s", s); + +if (portstring) + g = string_cat(g, portstring); + +gstring_release_unused(g); +return string_from_gstring(g); +} + + /************************************************* * Set status of a host+address item * *************************************************/ @@ -124,11 +147,12 @@ Returns: TRUE if the host has expired but is usable because BOOL retry_check_address(const uschar *domain, host_item *host, uschar *portstring, - BOOL include_ip_address, uschar **retry_host_key, uschar **retry_message_key) + BOOL include_ip_address, + const uschar **retry_host_key, const uschar **retry_message_key) { BOOL yield = FALSE; time_t now = time(NULL); -uschar * host_key, * message_key; +const uschar * host_key, * message_key; open_db dbblock, * dbm_file; tree_node * node; dbdata_retry * host_retry_record, * message_retry_record; @@ -143,14 +167,11 @@ if (host->status != hstatus_unknown) return FALSE; host->status = hstatus_usable; /* Generate the host key for the unusable tree and the retry database. Ensure -host names are lower cased (that's what %S does). */ - -host_key = include_ip_address - ? string_sprintf("T:%S:%s%s", host->name, host->address, portstring) - : string_sprintf("T:%S%s", host->name, portstring); - -/* Generate the message-specific key */ +host names are lower cased (that's what %S does). +Generate the message-specific key too. +Be sure to maintain lack-of-spaces in retry keys; exinext depends on it. */ +host_key = retry_host_key_build(host, include_ip_address, portstring); message_key = string_sprintf("%s:%s", host_key, message_id); /* Search the tree of unusable IP addresses. This is filled in when deliveries @@ -290,7 +311,7 @@ Returns: nothing */ void -retry_add_item(address_item *addr, uschar *key, int flags) +retry_add_item(address_item * addr, const uschar * key, int flags) { retry_item * rti = store_get(sizeof(retry_item), GET_UNTAINTED); host_item * host = addr->host_used; @@ -343,11 +364,11 @@ Returns: pointer to retry rule, or NULL */ retry_config * -retry_find_config(const uschar *key, const uschar *alternate, int basic_errno, +retry_find_config(const uschar * key, const uschar * alternate, int basic_errno, int more_errno) { -const uschar *colon = Ustrchr(key, ':'); -retry_config *yield; +const uschar * colon = Ustrchr(key, ':'); +retry_config * yield; /* If there's a colon in the key, there are two possibilities: @@ -355,7 +376,8 @@ retry_config *yield; hostname:ip+port - In this case, we copy the host name. + In this case, we copy the host name (which could be an [ip], including + being an [ipv6], and we drop the []). (2) This is a key for a pipe, file, or autoreply delivery, in the format @@ -369,6 +391,8 @@ retry_config *yield; if (colon) key = isalnum(*key) ? string_copyn(key, colon-key) /* the hostname */ + : *key == '[' + ? string_copyn(key+1, Ustrchr(key, ']')-1-key) /* the ip */ : Ustrrchr(key, ':') + 1; /* Take from the last colon */ /* Sort out the keys */ @@ -932,3 +956,5 @@ DEBUG(D_retry) debug_printf("end of retry processing\n"); } /* End of retry.c */ +/* vi: aw ai sw=2 +*/ diff --git a/src/src/string.c b/src/src/string.c index cd76e1f1c..a627611af 100644 --- a/src/src/string.c +++ b/src/src/string.c @@ -1698,7 +1698,7 @@ while (*fp) } /* If a width is not specified and the precision is specified, set - the width to the precision, or the string length if shorted. */ + the width to the precision, or the string length if shorter. */ else if (precision >= 0) width = precision < slen ? precision : slen; diff --git a/src/src/structs.h b/src/src/structs.h index b16a8a3f2..8aab54055 100644 --- a/src/src/structs.h +++ b/src/src/structs.h @@ -480,7 +480,7 @@ can be tried. */ typedef struct retry_item { struct retry_item *next; /* for chaining */ - uschar *key; /* string identifying host/address/message */ + const uschar *key; /* string identifying host/address/message */ int basic_errno; /* error code for this destination */ int more_errno; /* additional error information */ uschar *message; /* local error message */ diff --git a/src/src/transports/smtp.c b/src/src/transports/smtp.c index ed5994241..a5f99edaa 100644 --- a/src/src/transports/smtp.c +++ b/src/src/transports/smtp.c @@ -1306,7 +1306,7 @@ while (count-- > 0) if (testflag(addr, af_dr_retry_exists)) { - uschar *altkey = string_sprintf("%s:<%s>", addr->address_retry_key, + uschar * altkey = string_sprintf("%s:<%s>", addr->address_retry_key, sender_address); retry_add_item(addr, altkey, rf_delete); retry_add_item(addr, addr->address_retry_key, rf_delete); @@ -1322,7 +1322,7 @@ while (count-- > 0) else if (errno == ETIMEDOUT) { - uschar *message = string_sprintf("SMTP timeout after RCPT TO:<%s>", + uschar * message = string_sprintf("SMTP timeout after RCPT TO:<%s>", transport_rcpt_address(addr, sx->conn_args.tblock->rcpt_include_affixes)); set_errno_nohost(sx->first_addr, ETIMEDOUT, message, DEFER, FALSE, &sx->delivery_start); retry_add_item(addr, addr->address_retry_key, 0); @@ -5376,7 +5376,7 @@ retry_non_continued: BOOL host_is_expired = FALSE, message_defer = FALSE, some_deferred = FALSE; address_item * first_addr = NULL; uschar * interface = NULL; - uschar * retry_host_key = NULL, * retry_message_key = NULL; + const uschar * retry_host_key = NULL, * retry_message_key = NULL; uschar * serialize_key = NULL; /* Deal slightly better with a possible Linux kernel bug that results @@ -5873,9 +5873,7 @@ retry_non_continued: ob->expand_retry_include_ip_address, &incl_ip) != OK) incl_ip = TRUE; /* error; use most-specific retry record */ - retry_host_key = incl_ip - ? string_sprintf("T:%S:%s%s", host->name, host->address, pistring) - : string_sprintf("T:%S%s", host->name, pistring); + retry_host_key = retry_host_key_build(host, incl_ip, pistring); } /* If a delivery of another message over an existing SMTP connection @@ -5921,10 +5919,8 @@ retry_non_continued: ob->expand_retry_include_ip_address, &incl_ip) != OK) incl_ip = TRUE; /* error; use most-specific retry record */ - retry_message_key = incl_ip - ? string_sprintf("T:%S:%s%s:%s", host->name, host->address, pistring, - message_id) - : string_sprintf("T:%S%s:%s", host->name, pistring, message_id); + retry_message_key = string_sprintf("%s:%s", + retry_host_key_build(host, incl_ip, pistring), message_id); } retry_add_item(addrlist, retry_message_key, rf_message | rf_host | delete_flag); diff --git a/src/src/tree.c b/src/src/tree.c index eb54829db..2c703583e 100644 --- a/src/src/tree.c +++ b/src/src/tree.c @@ -65,6 +65,7 @@ if (!tree_insertnode(&tree_duplicates, node)) store_reset(rpoint); +#ifndef COMPILE_UTILITY /************************************************* * Add entry to unusable addresses tree * *************************************************/ @@ -76,12 +77,11 @@ Returns: nothing */ void -tree_add_unusable(const host_item *h) +tree_add_unusable(const host_item * h) { rmark rpoint = store_mark(); -tree_node *node; -uschar s[256]; -sprintf(CS s, "T:%.200s:%s", h->name, h->address); +tree_node * node; +const uschar * s = retry_host_key_build(h, TRUE, NULL); node = store_get(sizeof(tree_node) + Ustrlen(s), is_tainted(h->name) || is_tainted(h->address) ? GET_TAINTED : GET_UNTAINTED); Ustrcpy(node->name, s); @@ -89,7 +89,7 @@ node->data.val = h->why; if (h->status == hstatus_unusable_expired) node->data.val += 256; if (!tree_insertnode(&tree_unusable, node)) store_reset(rpoint); } - +#endif /************************************************* diff --git a/test/runtest b/test/runtest index 98914d171..e8f1933f2 100755 --- a/test/runtest +++ b/test/runtest @@ -500,7 +500,10 @@ RESET_AFTER_EXTRA_LINE_READ: s/T:(\S+)\s-22\s(\S+)\s/T:$1 -22 xxxx /; # port numbers in dumpdb output - s/T:([a-z.]+(:[0-9.]+)?):$parm_port_n /T:$1:PORT_N /; + s/T:([a-z0-9.]+(:[0-9.]+|:\[[^]]+])?):$parm_port_n /T:$1:PORT_N /; + s/T:([a-z0-9.[\]]+(:[0-9.]+|:\[[^]]+])?):$parm_port_s /T:$1:PORT_S /; + # and exinext + s/Transport: (?:[a-z0-9.]+|\[[^\]]+]) (?:[0-9.]+|\[[^\]]+]):\K$parm_port_s /PORT_S /; # port numbers in stderr s/^set_process_info: .*\]:\K$parm_port_d /PORT_D /; @@ -821,7 +824,8 @@ RESET_AFTER_EXTRA_LINE_READ: # This handles "connection from" and the like, when the port is given if (!/listening for SMTP on/ && !/Connecting to/ && !/=>/ && !/->/ - && !/\*>/&& !/==/ && !/\*\*/ && !/Connection refused/ && !/in response to/) + && !/\*>/&& !/==/ && !/\*\*/ && !/Connection refused/ && !/in response to/ + && !/T(?:ransport)?:/) { s/\[([a-z\d:]+|\d+(?:\.\d+){3})\]:(\d+)/"[".$1."]:".new_value($2,"%s",\$next_port)/ie; } diff --git a/test/stderr/0388 b/test/stderr/0388 index 784cc3913..92b85e558 100644 --- a/test/stderr/0388 +++ b/test/stderr/0388 @@ -132,11 +132,11 @@ Connecting to V4NET.0.0.0 [V4NET.0.0.0]:PORT_S ... V4NET.0.0.0 in hosts_try_fast LOG: MAIN H=V4NET.0.0.0 [V4NET.0.0.0] Network Error set_process_info: pppp delivering 10HmaX-000000005vi-0000: just tried V4NET.0.0.0 [V4NET.0.0.0]:PORT_S for x@y: result DEFER -added retry item for T:V4NET.0.0.0:V4NET.0.0.0:PORT_S: errno=dd more_errno=dd,A flags=2 +added retry item for T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S: errno=dd more_errno=dd,A flags=2 set_process_info: pppp delivering 10HmaX-000000005vi-0000: waiting for a remote delivery subprocess to finish set_process_info: pppp delivering 10HmaX-000000005vi-0000 (just run smtp for x@y in subprocess) search_tidyup called -reading retry information for T:V4NET.0.0.0:V4NET.0.0.0:PORT_S from subprocess +reading retry information for T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S from subprocess added retry item reading retry information for R:x@y from subprocess added retry item @@ -177,14 +177,14 @@ Writing retry data for R:x@y list element: * V4NET.0.0.0 in "*"? yes (matched "*") *@V4NET.0.0.0 in "*"? yes (matched "*") -retry for T:V4NET.0.0.0:V4NET.0.0.0:PORT_S (y) = * 0 0 - dbfn_read: key=T:V4NET.0.0.0:V4NET.0.0.0:PORT_S +retry for T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S (y) = * 0 0 + dbfn_read: key=T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S failing_interval=ttt message_age=ttt on queue longer than maximum retry -Writing retry data for T:V4NET.0.0.0:V4NET.0.0.0:PORT_S +Writing retry data for T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S first failed=dddd last try=dddd next try=+0 expired=0 errno=dd more_errno=dd,A Network Error - dbfn_write: key=T:V4NET.0.0.0:V4NET.0.0.0:PORT_S + dbfn_write: key=T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S timed out: all retries expired LOG: MAIN ** x@y: retry timeout exceeded diff --git a/test/stderr/0450 b/test/stderr/0450 index 997954187..1364d55a2 100644 --- a/test/stderr/0450 +++ b/test/stderr/0450 @@ -21,7 +21,7 @@ delivering 10HmaX-000000005vi-0000 to 127.0.0.1 [127.0.0.1] (userx@test.ex) Connecting to 127.0.0.1 [127.0.0.1]:PORT_D ... failed: Connection refused LOG: MAIN H=127.0.0.1 [127.0.0.1] Connection refused -added retry item for T:127.0.0.1:127.0.0.1:PORT_D: errno=dd more_errno=dd,A flags=2 +added retry item for T:[127.0.0.1]:127.0.0.1:PORT_D: errno=dd more_errno=dd,A flags=2 all IP addresses skipped or deferred at least one address updating wait-t1 database added 10HmaX-000000005vi-0000 to queue for 127.0.0.1 @@ -50,7 +50,7 @@ delivering 10HmaX-000000005vi-0000 to 127.0.0.1 [127.0.0.1] (userx@test.ex) Connecting to 127.0.0.1 [127.0.0.1]:PORT_D2 ... failed: Connection refused LOG: MAIN H=127.0.0.1 [127.0.0.1] Connection refused -added retry item for T:127.0.0.1:127.0.0.1:PORT_D2: errno=dd more_errno=dd,A flags=2 +added retry item for T:[127.0.0.1]:127.0.0.1:PORT_D2: errno=dd more_errno=dd,A flags=2 all IP addresses skipped or deferred at least one address updating wait-t1 database already listed for 127.0.0.1 diff --git a/test/stderr/0476 b/test/stderr/0476 index 86070390d..d14e2dbd2 100644 --- a/test/stderr/0476 +++ b/test/stderr/0476 @@ -89,7 +89,7 @@ Connecting to 127.0.0.1 [127.0.0.1]:PORT_S ... failed: Connection refused LOG: MAIN H=127.0.0.1 [127.0.0.1] Connection refused set_process_info: pppp delivering 10HmaZ-000000005vi-0000: just tried 127.0.0.1 [127.0.0.1]:PORT_S for CALLER@the.local.host.name: result DEFER -added retry item for T:127.0.0.1:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2 +added retry item for T:[127.0.0.1]:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2 all IP addresses skipped or deferred at least one address updating wait-t1 database added 10HmaZ-000000005vi-0000 to queue for 127.0.0.1 diff --git a/test/stderr/0512 b/test/stderr/0512 index 18ebdc002..7bb550c81 100644 --- a/test/stderr/0512 +++ b/test/stderr/0512 @@ -18,7 +18,7 @@ hosts_max_try limit reached with this host Connecting to 127.0.0.1 [127.0.0.1]:PORT_S ... failed: Connection refused LOG: MAIN H=127.0.0.1 [127.0.0.1] Connection refused -added retry item for T:127.0.0.1:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2 +added retry item for T:[127.0.0.1]:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2 temporary delivery error(s) override hosts_max_try (message older than host's retry time) Clearing TFO as not first host for message getting address for 127.0.0.1 @@ -30,7 +30,7 @@ hosts_max_try limit reached with this host Connecting to 127.0.0.1 [127.0.0.1]:PORT_S ... failed: Connection refused LOG: MAIN H=127.0.0.1 [127.0.0.1] Connection refused -added retry item for T:127.0.0.1:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2 +added retry item for T:[127.0.0.1]:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2 temporary delivery error(s) override hosts_max_try (message older than host's retry time) Clearing TFO as not first host for message getting address for 127.0.0.1 @@ -42,7 +42,7 @@ hosts_max_try limit reached with this host Connecting to 127.0.0.1 [127.0.0.1]:PORT_S ... failed: Connection refused LOG: MAIN H=127.0.0.1 [127.0.0.1] Connection refused -added retry item for T:127.0.0.1:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2 +added retry item for T:[127.0.0.1]:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2 temporary delivery error(s) override hosts_max_try (message older than host's retry time) Clearing TFO as not first host for message getting address for 127.0.0.1 @@ -54,7 +54,7 @@ hosts_max_try limit reached with this host Connecting to 127.0.0.1 [127.0.0.1]:PORT_S ... failed: Connection refused LOG: MAIN H=127.0.0.1 [127.0.0.1] Connection refused -added retry item for T:127.0.0.1:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2 +added retry item for T:[127.0.0.1]:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2 reached transport hosts_max_try limit 1 all IP addresses skipped or deferred at least one address updating wait-t1 database @@ -109,7 +109,7 @@ hosts_max_try limit reached with this host Connecting to 127.0.0.1 [127.0.0.1]:PORT_S ... failed: Connection refused LOG: MAIN H=127.0.0.1 [127.0.0.1] Connection refused -added retry item for T:127.0.0.1:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2 +added retry item for T:[127.0.0.1]:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2 temporary delivery error(s) override hosts_max_try (message older than host's retry time) Clearing TFO as not first host for message getting address for 127.0.0.1 @@ -121,7 +121,7 @@ hosts_max_try limit reached with this host Connecting to 127.0.0.1 [127.0.0.1]:PORT_S ... failed: Connection refused LOG: MAIN H=127.0.0.1 [127.0.0.1] Connection refused -added retry item for T:127.0.0.1:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2 +added retry item for T:[127.0.0.1]:127.0.0.1:PORT_S: errno=dd more_errno=dd,A flags=2 temporary delivery error(s) override hosts_max_try (message older than host's retry time) reached transport hosts_max_try_hardlimit limit 2 all IP addresses skipped or deferred at least one address diff --git a/test/stderr/0623 b/test/stderr/0623 index ce3804c13..bb517b859 100644 --- a/test/stderr/0623 +++ b/test/stderr/0623 @@ -55,7 +55,7 @@ ok=0 send_quit=0 send_rset=1 continue_more=0 yield=0 first_address is NULL SMTP<< 221 Closing connection SMTP(close)>> cmdlog: '220:EHLO:250-:MAIL|:RCPT|:DATA:250:250:300:.:QUIT+:451:221' -added retry item for T:127.0.0.1:127.0.0.1:PORT_D:10HmaZ-000000005vi-0000: errno=-46 more_errno=dd,A flags=6 +added retry item for T:[127.0.0.1]:127.0.0.1:PORT_D:10HmaZ-000000005vi-0000: errno=-46 more_errno=dd,A flags=6 all IP addresses skipped or deferred at least one address Leaving send_to_server transport LOG: MAIN @@ -187,7 +187,7 @@ ok=0 send_quit=0 send_rset=1 continue_more=0 yield=0 first_address is NULL SMTP(closed)<< SMTP(close)>> cmdlog: '220:EHLO:250-:MAIL|:RCPT|:DATA:250:250:300:.:QUIT+' -added retry item for T:127.0.0.1:127.0.0.1:PORT_D:10HmbB-000000005vi-0000: errno=-18 more_errno=dd,A flags=6 +added retry item for T:[127.0.0.1]:127.0.0.1:PORT_D:10HmbB-000000005vi-0000: errno=-18 more_errno=dd,A flags=6 all IP addresses skipped or deferred at least one address Leaving send_to_server transport LOG: MAIN diff --git a/test/stderr/0909 b/test/stderr/0909 index 4d744afd0..730dc2c0a 100644 --- a/test/stderr/0909 +++ b/test/stderr/0909 @@ -189,7 +189,7 @@ ok=0 send_quit=0 send_rset=1 continue_more=0 yield=0 first_address is NULL SMTP<< 221 Closing connection SMTP(close)>> cmdlog: '220:EHLO:250-:MAIL|:RCPT|:BDAT+:QUIT+:250:250:451:221' -added retry item for T:127.0.0.1:127.0.0.1:PORT_D:10HmaZ-000000005vi-0000: errno=-46 more_errno=dd,A flags=6 +added retry item for T:[127.0.0.1]:127.0.0.1:PORT_D:10HmaZ-000000005vi-0000: errno=-46 more_errno=dd,A flags=6 all IP addresses skipped or deferred at least one address Leaving send_to_server transport LOG: MAIN @@ -329,7 +329,7 @@ ok=0 send_quit=0 send_rset=1 continue_more=0 yield=0 first_address is NULL SMTP(closed)<< SMTP(close)>> cmdlog: '220:EHLO:250-:MAIL|:RCPT|:BDAT+:QUIT+:250:250' -added retry item for T:127.0.0.1:127.0.0.1:PORT_D:10HmbB-000000005vi-0000: errno=-18 more_errno=dd,A flags=6 +added retry item for T:[127.0.0.1]:127.0.0.1:PORT_D:10HmbB-000000005vi-0000: errno=-18 more_errno=dd,A flags=6 all IP addresses skipped or deferred at least one address Leaving send_to_server transport LOG: MAIN diff --git a/test/stdout/0213 b/test/stdout/0213 index d3dd7cffc..4647ccbed 100644 --- a/test/stdout/0213 +++ b/test/stdout/0213 @@ -1,5 +1,5 @@ +++++++++++++++++++++++++++ - T:127.0.0.1:127.0.0.1:1224 -19 65 H=127.0.0.1 [127.0.0.1]: Malformed SMTP reply in response to RCPT TO:: 550 The answer is no, but I am going to make sure it is a very l + T:[127.0.0.1]:127.0.0.1:PORT_S -19 65 H=127.0.0.1 [127.0.0.1]: Malformed SMTP reply in response to RCPT TO:: 550 The answer is no, but I am going to make sure it is a very l first failed = time last try = time2 next try = time2 + 3600 ******** SERVER ******** diff --git a/test/stdout/0343 b/test/stdout/0343 index dbcd79079..37752fc5f 100644 --- a/test/stdout/0343 +++ b/test/stdout/0343 @@ -1,6 +1,6 @@ +++++++++++++++++++++++++++ - T:127.0.0.1:127.0.0.1:1223 dd 65 Connection refused + T:[127.0.0.1]:127.0.0.1:1223 dd 65 Connection refused first failed = time last try = time2 next try = time2 + 600 +++++++++++++++++++++++++++ - T:127.0.0.1:127.0.0.1:1223 dd 65 Connection refused + T:[127.0.0.1]:127.0.0.1:1223 dd 65 Connection refused first failed = time last try = time2 next try = time2 + 600 diff --git a/test/stdout/0447 b/test/stdout/0447 index caecaea8a..9b4f1785d 100644 --- a/test/stdout/0447 +++ b/test/stdout/0447 @@ -4,13 +4,13 @@ Retry rule: * timeout_connect F,1d,1m; Retry rule: * timeout_A F,1d,30s; Retry rule: * timeout_connect_A F,1d,29s; +++++++++++++++++++++++++++ - T:127.0.0.1:127.0.0.1:1224 dd 321 Connection timed out + T:[127.0.0.1]:127.0.0.1:PORT_S dd 321 Connection timed out first failed = time last try = time2 next try = time2 + 60 +++++++++++++++++++++++++++ - T:127.0.0.1:127.0.0.1:1224 dd 321 Connection timed out + T:[127.0.0.1]:127.0.0.1:PORT_S dd 321 Connection timed out first failed = time last try = time2 next try = time2 + 30 +++++++++++++++++++++++++++ - T:127.0.0.1:127.0.0.1:1224 dd 321 Connection timed out + T:[127.0.0.1]:127.0.0.1:PORT_S dd 321 Connection timed out first failed = time last try = time2 next try = time2 + 30 +++++++++++++++++++++++++++ R:xx.test.again.dns -1 0 host lookup did not complete diff --git a/test/stdout/0450 b/test/stdout/0450 index 2da7c051e..640292415 100644 --- a/test/stdout/0450 +++ b/test/stdout/0450 @@ -1,5 +1,5 @@ +++++++++++++++++++++++++++ - T:127.0.0.1:127.0.0.1:1225 dd 65 Connection refused + T:[127.0.0.1]:127.0.0.1:1225 dd 65 Connection refused first failed = time last try = time2 next try = time2 + 600 - T:127.0.0.1:127.0.0.1:1226 dd 65 Connection refused + T:[127.0.0.1]:127.0.0.1:1226 dd 65 Connection refused first failed = time last try = time2 next try = time2 + 600 diff --git a/test/stdout/0474 b/test/stdout/0474 index b4ae3cce2..4491500a7 100644 --- a/test/stdout/0474 +++ b/test/stdout/0474 @@ -1,8 +1,8 @@ +++++++++++++++++++++++++++ - T:127.0.0.1:127.0.0.1:1224:10HmaX-000000005vi-0000 0 65 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after end of data: 850 NONSENSE + T:[127.0.0.1]:127.0.0.1:1224:10HmaX-000000005vi-0000 0 65 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after end of data: 850 NONSENSE first failed = time last try = time2 next try = time2 + 10 +++++++++++++++++++++++++++ - T:127.0.0.1:127.0.0.1:1224:10HmaX-000000005vi-0000 0 65 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after MAIL FROM:: 850 RUBBISH + T:[127.0.0.1]:127.0.0.1:1224:10HmaX-000000005vi-0000 0 65 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after MAIL FROM:: 850 RUBBISH first failed = time last try = time2 next try = time2 + 10 +++++++++++++++++++++++++++ R:abcd@xyz: -44 12865 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after RCPT TO:: 850 RUBBISH diff --git a/test/stdout/0497 b/test/stdout/0497 index ac02261ac..acba7c8db 100644 --- a/test/stdout/0497 +++ b/test/stdout/0497 @@ -1,5 +1,5 @@ +++++++++++++++++++++++++++ - T:127.0.0.1:127.0.0.1:1224:10HmaX-000000005vi-0000 -45 13377 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after MAIL FROM:: 452 temporary error + T:[127.0.0.1]:127.0.0.1:1224:10HmaX-000000005vi-0000 -45 13377 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after MAIL FROM:: 452 temporary error first failed = time last try = time2 next try = time2 + 0 * +++++++++++++++++++++++++++ R:userx@x.y: -44 13377 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after RCPT TO:: 452 temporary error diff --git a/test/stdout/0498 b/test/stdout/0498 index 727e2a2fb..635730dc9 100644 --- a/test/stdout/0498 +++ b/test/stdout/0498 @@ -1,5 +1,5 @@ +++++++++++++++++++++++++++ - T:127.0.0.1:127.0.0.1:1224:10HmaX-000000005vi-0000 -45 12865 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after MAIL FROM:: 450 DELAY + T:[127.0.0.1]:127.0.0.1:1224:10HmaX-000000005vi-0000 -45 12865 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after MAIL FROM:: 450 DELAY first failed = time last try = time2 next try = time2 + 10 ******** SERVER ******** diff --git a/test/stdout/0610 b/test/stdout/0610 index 48ce1dee0..5fc87bef2 100644 --- a/test/stdout/0610 +++ b/test/stdout/0610 @@ -11,9 +11,9 @@ 250 OK id=10HmaY-000000005vi-0000 221 the.local.host.name closing connection +++++++++++++++++++++++++++ - T:127.0.0.1:127.0.0.1:1225/127.0.0.1 0 65 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after initial connection: 451 Temporary local problem - please try later + T:[127.0.0.1]:127.0.0.1:1225/127.0.0.1 0 65 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after initial connection: 451 Temporary local problem - please try later first failed = time last try = time2 next try = time2 + 2 - T:127.0.0.1:127.0.0.1:1225/ip4.ip4.ip4.ip4 0 65 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after initial connection: 451 Temporary local problem - please try later + T:[127.0.0.1]:127.0.0.1:1225/ip4.ip4.ip4.ip4 0 65 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after initial connection: 451 Temporary local problem - please try later first failed = time last try = time2 next try = time2 + 2 +++++++++++++++++++++++++++ +++++++++++++++++++++++++++ diff --git a/test/stdout/1008 b/test/stdout/1008 index 0fb622a03..42485be93 100644 --- a/test/stdout/1008 +++ b/test/stdout/1008 @@ -1,18 +1,14 @@ +++++++++++++++++++++++++++ - T:127.0.0.1:127.0.0.1:1224:10HmaX-000000005vi-0000 -45 12865 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after MAIL FROM:: 450 Temporary error + T:[127.0.0.1]:127.0.0.1:1224:10HmaX-000000005vi-0000 -45 12865 H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after MAIL FROM:: 450 Temporary error first failed = time last try = time2 next try = time2 + 7200 - T:::1:::1:1224:10HmaX-000000005vi-0000 -45 12865 H=::1 [::1]: SMTP error from remote mail server after MAIL FROM:: 450 Temporary error + T:[::1]:[::1]:1224:10HmaX-000000005vi-0000 -45 12865 H=::1 [::1]: SMTP error from remote mail server after MAIL FROM:: 450 Temporary error first failed = time last try = time2 next try = time2 + 7200 -Transport: 127.0.0.1 [127.0.0.1]:1111 10HmaX-000000005vi-0000 error -45: H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after MAIL FROM:: 450 Temporary error - first failed: 07-Mar-2000 12:21:52 - last tried: 07-Mar-2000 12:21:52 - next try at: 07-Mar-2000 12:21:52 -Transport: [:1:::1:1224:10HmaX-000000005vi-0000]:1224 10HmaX-000000005vi-0000 error -45: H=::1 [::1]: SMTP error from remote mail server after MAIL FROM:: 450 Temporary error +Transport: [127.0.0.1] 127.0.0.1:PORT_S 10HmaX-000000005vi-0000 error -45: H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after MAIL FROM:: 450 Temporary error first failed: 07-Mar-2000 12:21:52 last tried: 07-Mar-2000 12:21:52 next try at: 07-Mar-2000 12:21:52 exinext exit code = 0 -Transport: [:1:::1:1224:10HmaX-000000005vi-0000] error -45: H=::1 [::1]: SMTP error from remote mail server after MAIL FROM:: 450 Temporary error +Transport: [::1] [::1]:PORT_S 10HmaX-000000005vi-0000 error -45: H=::1 [::1]: SMTP error from remote mail server after MAIL FROM:: 450 Temporary error first failed: 07-Mar-2000 12:21:52 last tried: 07-Mar-2000 12:21:52 next try at: 07-Mar-2000 12:21:52