-/* $Cambridge: exim/src/src/retry.c,v 1.1 2004/10/07 10:39:01 ph10 Exp $ */
+/* $Cambridge: exim/src/src/retry.c,v 1.4 2005/09/19 11:56:11 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) University of Cambridge 1995 - 2004 */
+/* Copyright (c) University of Cambridge 1995 - 2005 */
/* See the file NOTICE for conditions of use and distribution. */
/* Functions concerned with retrying unsuccessful deliveries. */
if (rule == NULL) next_try = now; else
{
if (rule->rule == 'F') next_try = now + rule->p1;
- else /* assume rule = 'G' */
+ else /* rule = 'G' or 'H' */
{
int last_predicted_gap =
retry_record->next_try - retry_record->last_try;
int last_actual_gap = now - retry_record->last_try;
int lastgap = (last_predicted_gap < last_actual_gap)?
last_predicted_gap : last_actual_gap;
- next_try = now + ((lastgap < rule->p1)? rule->p1 :
- (lastgap * rule->p2)/1000);
+ int next_gap = (lastgap * rule->p2)/1000;
+ if (rule->rule == 'G')
+ {
+ next_try = now + ((lastgap < rule->p1)? rule->p1 : next_gap);
+ }
+ else /* The 'H' rule */
+ {
+ next_try = now + rule->p1;
+ if (next_gap > rule->p1)
+ next_try += random_number(next_gap - rule->p1);
+ }
}
}
setflag(addr, af_retry_timedout);
addr->message = (addr->message == NULL)? US"retry timeout exceeded" :
string_sprintf("%s: retry timeout exceeded", addr->message);
+ addr->user_message = (addr->user_message == NULL)?
+ US"retry timeout exceeded" :
+ string_sprintf("%s: retry timeout exceeded", addr->user_message);
log_write(0, LOG_MAIN, "** %s%s%s%s: retry timeout exceeded",
addr->address,
(addr->parent == NULL)? US"" : US" <",