/* * Copyright (c) 2003-2005 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set * forth in the LICENSE file which can be found at the top level of * the sendmail distribution. */ #include "sm/generic.h" SM_RCSID("@(#)$Id: qm_delay_next_try.c,v 1.2 2005/11/18 23:35:56 ca Exp $") #include "sm/error.h" #include "sm/assert.h" #include "sm/qmgr.h" #include "sm/qmgr-int.h" #include "qmgr.h" #include "log.h" /* ** QM_DELAY_NEXT_TRY -- Compute delay for next try ** ** Parameters: ** qmgr_ctx -- QMGR context ** aq_rcpt -- AQ recipient ** ** Returns: ** seconds to next try ** ** Called by: q_upd_rcpt_fail() ** ** Last code review: ** Last code change: 2005-11-18 23:24:21 */ uint qm_delay_next_try(qmgr_ctx_P qmgr_ctx, aq_rcpt_P aq_rcpt) { uint delay; /* ** XXX Need a better formula! XXX ** Must depend on connection information etc. */ SM_IS_QMGR_CTX(qmgr_ctx); SM_IS_AQ_RCPT(aq_rcpt); delay = evthr_time(qmgr_ctx->qmgr_ev_ctx) - aq_rcpt->aqr_st_time; /* Permanent failures get delayed longer since a bounce is sent */ if (AQR_IS_FLAG(aq_rcpt, AQR_FL_PERM)) delay <<= 1; if (delay > qmgr_ctx->qmgr_cnf.q_cnf_max_delay) delay = qmgr_ctx->qmgr_cnf.q_cnf_max_delay; /* no else in case some bozo sets min > max */ if (delay < qmgr_ctx->qmgr_cnf.q_cnf_min_delay) delay = qmgr_ctx->qmgr_cnf.q_cnf_min_delay; QM_LEV_DPRINTFC(QDC_UPDRCPT, 6, (QM_DEBFP, "sev=DBG, func=qm_delay_next_try, aq_rcpt=%p, ntries=%d, cnf_delay=%d, delay=%u\n", aq_rcpt, aq_rcpt->aqr_tries, qmgr_ctx->qmgr_cnf.q_cnf_min_delay, delay)); sm_log_write(qmgr_ctx->qmgr_lctx, QM_LCAT_SCHED, QM_LMOD_SCHED, SM_LOG_DEBUG, 15, "sev=DBG, func=qm_delay_next_try, aq_rcpt=%p, ntries=%d, cnf_delay=%d, delay=%u", aq_rcpt, aq_rcpt->aqr_tries, qmgr_ctx->qmgr_cnf.q_cnf_min_delay, delay); return delay; }