/*
 * Copyright (c) 2004, 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: aq_rcpt_status.c,v 1.9 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_STATUS2TXT -- Translate status into text
**
**	Parameters:
**		aq_rcpt -- AQ recipient
**		perrmsg -- (pointer to) error message (output)
**
**	Returns:
**		usual sm_error code
*/

sm_ret_T
aq_rcpt_status2txt(aq_rcpt_P aq_rcpt, sm_str_P errmsg)
{
	sm_ret_T ret, rv;
	char *err_msg;

	SM_REQUIRE(errmsg != NULL);
	SM_IS_AQ_RCPT(aq_rcpt);
	rv = ret = SM_SUCCESS;
	err_msg = NULL;
	switch (aq_rcpt->aqr_status)
	{
	  case SMTP_OK:
		err_msg = "ok";
		break;
#ifdef SMTP_R_ACC
	  case SMTP_R_ACC:
		err_msg = "accept";
		break;
#endif
	  case SMTP_R_CONT:
		err_msg = "continue";
		break;
	  case SMTP_R_SSD:
		err_msg = "session shutting down";
		break;
	  case SMTP_R_TEMP:
		err_msg = "temporary error";
		break;
	  case SMTP_R_SYNTAX:
		err_msg = "syntax error";
		break;
	  case SMTP_R_REJECT:
		err_msg = "rejected";
		break;
	  case SMTPC_TEMP_ST:
		err_msg = "temporary error in DA";
		break;
	  case SMTPC_IO_ST:
		err_msg = "I/O error";
		break;
	  case SMTPC_DA_ST:
		err_msg = "lost DA [local error]";
		break;
	  case SMTPC_SE_OPEN_ST:
		err_msg = "session open error";
		rv = AQR_TXT_COMPLETE;
		break;
	  case SMTPC_SE_OP_TMO:
		err_msg = "session open: timeout";
		rv = AQR_TXT_COMPLETE;
		break;
	  case SMTPC_SE_OP_REFUSED:
		err_msg = "session open: connection refused";
		rv = AQR_TXT_COMPLETE;
		break;
	  case SMTPC_SE_OP_UNREACH:
		err_msg = "session open: host/net unreachable";
		rv = AQR_TXT_COMPLETE;
		break;
	  case SMTP_AR_TMO:
		err_msg = "timeout in address resolver";
		rv = AQR_TXT_COMPLETE;
		break;
	  case SMTP_AR_TEMP:
		err_msg = "temporary error in address resolver";
		rv = AQR_TXT_COMPLETE;
		break;
	  case SMTP_AR_ALIAS:
		err_msg = "alias expansion in address resolver failed";
		rv = AQR_TXT_COMPLETE;
		break;
	  case SMTP_MAP_TEMP:
		err_msg = "temporary map lookup error in address resolver";
		rv = AQR_TXT_COMPLETE;
		break;
	  case SMTP_CDB_TEMP:
		err_msg = "temporary error from CDB [local error]";
		break;
	  case SMTP_TMO_SCHED:
		err_msg = "timeout in scheduler [local error]";
		break;
	  case SMTP_TMO_DA:
		err_msg = "timeout waiting for DA";
		break;
	  case SMTP_AR_NOTF:
		err_msg = "address not found (address resolver)";
		break;
	  case SMTP_AR_PERM:
		err_msg = "permanent error (address resolver)";
		break;
	  case SMTP_AR_LOOP:
		err_msg = "CNAME loop (address resolver)";
		break;
	  case SMTP_AR_AL_REC:
		err_msg = "alias nesting too deep in address resolver";
		break;
	  case SMTP_AR_MXEMPTY:
		err_msg = "MX list empty in  address resolver, mail loops back";
		break;
	  case SMTPC_SE_TTMYSELF:
		err_msg = "talking to myself?";
		break;
	  default:
		if (smtp_is_reply_ok(aq_rcpt->aqr_status))
			err_msg = "ok";
		else if (smtp_is_reply_temp(aq_rcpt->aqr_status))
			err_msg = "temporary error";
		else if (smtp_is_reply_fail(aq_rcpt->aqr_status))
			err_msg = "permanent error";
	}
	if (err_msg != NULL)
		ret = sm_str_scat(errmsg, err_msg);
	return sm_is_err(ret) ? ret : rv;
}


syntax highlighted by Code2HTML, v. 0.9.1