/*
 * 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