/*
* Copyright (c) 2004-2006 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: aq_rcpt_err_state.c,v 1.6 2007/06/02 04:11:40 ca Exp $")
#include "sm/error.h"
#include "sm/assert.h"
#include "sm/actdb-int.h"
#include "sm/da.h"
/*
** AQ_RCPT_ERR_STATE -- Translate delivery error state into text
**
** Parameters:
** aq_rcpt -- AQ recipient
** unknown -- use "unknown" as text if nothing matches?
** errmsg -- error message (output)
**
** Returns:
** <0: usual sm_error code
** =0: ok, but no text appended
** >0: appended some text
*/
sm_ret_T
aq_rcpt_err_state(aq_rcpt_P aq_rcpt, bool unknown, sm_str_P errmsg)
{
sm_ret_T ret;
char *err_msg;
SM_REQUIRE(errmsg != NULL);
SM_IS_AQ_RCPT(aq_rcpt);
ret = SM_SUCCESS;
err_msg = NULL;
switch (da_err_cmd(aq_rcpt->aqr_err_st))
{
case DA_TA_ERR_MAIL:
err_msg = "during MAIL";
break;
case DA_TA_ERR_RCPT:
err_msg = "during RCPT";
break;
case DA_TA_ERR_DATA:
err_msg = "during DATA";
break;
case DA_TA_ERR_CDB:
err_msg = "during opening of body";
break;
case DA_TA_ERR_BODY:
err_msg = "during transmission of body";
break;
case DA_TA_ERR_DOT:
err_msg = "during final dot";
break;
case DA_TA_ERR_L_RCPT:
err_msg = "during LMTP RCPT";
break;
case DA_TA_ERR_RSET:
err_msg = "during RSET";
break;
case DA_TA_ERR_SIZE:
err_msg = "during SIZE check";
break;
case DA_SE_ERR_OPEN:
err_msg = "during session open";
break;
case DA_SE_ERR_GRET:
err_msg = "during session greeting";
break;
case DA_SE_ERR_EHLO:
err_msg = "during EHLO";
break;
case DA_SE_ERR_HELO:
err_msg = "during HELO";
break;
case DA_SE_ERR_STLS:
err_msg = "during STARTTLS";
break;
case DA_SE_ERR_TTMYSLEF:
#if 0
err_msg = "server greeting contains my hostname";
#else /* 0 */
err_msg = "config error: mail loops back to me";
#endif /* 0 */
break;
case DA_AR_ERR:
switch (aq_rcpt->aqr_status)
{
case SMTP_AR_NOTF:
err_msg = "error from address resolver "
"record not found";
break;
case SMTP_AR_TEMP:
err_msg = "error from address resolver "
"temporary error";
break;
case SMTP_AR_PERM:
err_msg = "error from address resolver "
"permanent error";
break;
case SMTP_AR_TMO:
err_msg = "error from address resolver "
"timeout during query";
break;
case SMTP_AR_MXEMPTY:
err_msg = "error from address resolver "
"MX points back to me";
break;
case SMTP_AR_ALIAS:
err_msg = "error from address resolver "
"alias expansion failed";
break;
case SMTP_AR_AL_REC:
err_msg = "error from address resolver "
"alias nesting too deep";
break;
case SMTP_AR_LOOP:
err_msg = "error from address resolver "
"CNAME recursion";
break;
case SMTP_MAP_TEMP:
err_msg = "error from address resolver "
"temporary map lookup error";
break;
default:
err_msg = "unknown error from address resolver";
#if 0
sm_snprintf(err_txt, sizeof(err_txt),
"unknown error %d from address resolver"
, aq_rcpt->aqr_status);
err_msg = err_txt;
#endif /* 0 */
break;
}
break;
case DA_AQ_TMO_ERR:
err_msg = "item too long in active queue";
break;
case DA_DQ_TMO_ERR:
err_msg = "maximum time in queue exceeded";
break;
case DA_TERMINATED:
err_msg = "delivery agent module did not respond before timeout";
break;
default:
if (unknown)
err_msg = "unknown";
break;
}
if (err_msg != NULL)
{
ret = sm_str_scat(errmsg, err_msg);
if (sm_is_success(ret))
ret = 1; /* any value > 0 */
}
return ret;
}
syntax highlighted by Code2HTML, v. 0.9.1