/*
 * Copyright (c) 2003-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.
 *
 * $Id: da.h,v 1.23 2006/03/20 23:32:09 ca Exp $
 */

#ifndef SM_DA_H
#define SM_DA_H 1
#include "sm/generic.h"
#include "sm/error.h"

/*
**  This file includes some flags/information that is shared between
**  qmgr and smtpc (or other "Deliver Agents").
**  1. Flags (requests by qmgr to a DA how to behave)
**  2. Error codes (sent back from a DA to qmgr)
*/

/*
**  Flags.
**  Note: if changes are made here check whether that requires changes
**	in smtpc/smtpc.h too (e.g., SCTA_FL_*)
*/

#define DA_FL_HDR_ONLY	0x00000001	/* send bounce with headers only */
#define DA_FL_DSN_MIME	0x00000002	/* DSN in MIME format (not yet impl) */

/*
**  Session flags.
*/

#define DA_FL_SE_KEEP		0x00000001	/* keep session open */
#define DA_FL_SE_CLOSE_EX	0x00000002	/* close existing session */
#define DA_FL_SE_REUSE_EX	0x00000004	/* reuse existing session */

/*
**  Error codes.
*/

#define DA_ERR_NONE		0	/* none... */

/*
**  Error states in DA:
**  I: internal
**  W: during write
**  S: SMTP reply code
**  R: during read of reply
**
**  NOTE: if entries are added here, add a textual representation to
**	qmgr/bounce.c!
*/

#define da_err_cmd(err)	((err) & 0x0ff0)


/*
**  What's the purpose of distinguishing between DA_TA_ERR_x and DA_SE_ERR_x?
**  As long as the values are the same: seemingly none... hence the next macros
**  are ok, otherwise they must be split into TA/SE.
*/

#define DA_SET_ERR_I(err)	((err)|DA_TA_ERR_I)
#define DA_SET_ERR_W(err)	((err)|DA_TA_ERR_W)
#define DA_SET_ERR_S(err)	((err)|DA_TA_ERR_S)
#define DA_SET_ERR_R(err)	((err)|DA_TA_ERR_R)

#define DA_TA_ERR_I		0x1
#define DA_TA_ERR_W		0x2
#define DA_TA_ERR_S		0x4
#define DA_TA_ERR_R		0x8
#define da_ta_err_type(err)	((err) & 0x000f)
#define da_ta_err_cmd(err)	((err) & 0x00f0)

#define DA_SE_ERR_I		0x1
#define DA_SE_ERR_W		0x2
#define DA_SE_ERR_S		0x4
#define DA_SE_ERR_R		0x8
#define da_se_err_type(err)	((err) & 0x000f)
#define da_se_err_cmd(err)	((err) & 0x0ff0)

/* write/read or SMTP reply code error? */
#define DA_SET_ERR_WS(err, ret)	((err)|(sm_is_err(ret)?DA_TA_ERR_W:DA_TA_ERR_S))
#define DA_SET_ERR_RS(err, ret)	((err)|(sm_is_err(ret)?DA_TA_ERR_R:DA_TA_ERR_S))

/* MAIL command */
#define DA_TA_ERR_MAIL		0x10
#define DA_TA_ERR_MAIL_I	(DA_TA_ERR_MAIL|DA_TA_ERR_I)
#define DA_TA_ERR_MAIL_W	(DA_TA_ERR_MAIL|DA_TA_ERR_W)
#define DA_TA_ERR_MAIL_S	(DA_TA_ERR_MAIL|DA_TA_ERR_S)
#define DA_TA_ERR_MAIL_R	(DA_TA_ERR_MAIL|DA_TA_ERR_R)

/* RCPT command */
#define DA_TA_ERR_RCPT		0x20
#define DA_TA_ERR_RCPT_I	(DA_TA_ERR_RCPT|DA_TA_ERR_I)
#define DA_TA_ERR_RCPT_W	(DA_TA_ERR_RCPT|DA_TA_ERR_W)
#define DA_TA_ERR_RCPT_S	(DA_TA_ERR_RCPT|DA_TA_ERR_S)
#define DA_TA_ERR_RCPT_R	(DA_TA_ERR_RCPT|DA_TA_ERR_R)

/* DATA command */
#define DA_TA_ERR_DATA		0x30
#define DA_TA_ERR_DATA_I	(DA_TA_ERR_DATA|DA_TA_ERR_I)
#define DA_TA_ERR_DATA_W	(DA_TA_ERR_DATA|DA_TA_ERR_W)
#define DA_TA_ERR_DATA_S	(DA_TA_ERR_DATA|DA_TA_ERR_S)
#define DA_TA_ERR_DATA_R	(DA_TA_ERR_DATA|DA_TA_ERR_R)

/* CDB errors, e.g., cdb entry can't be opened */
#define DA_TA_ERR_CDB		0x40
#define DA_TA_ERR_CDB_I		(DA_TA_ERR_CDB|DA_TA_ERR_I)
#define DA_TA_ERR_CDB_W		(DA_TA_ERR_CDB|DA_TA_ERR_W)
/* unused, no SMTP command */
/* #define DA_TA_ERR_CDB_S	(DA_TA_ERR_CDB|DA_TA_ERR_S)	*/
#define DA_TA_ERR_CDB_R		(DA_TA_ERR_CDB|DA_TA_ERR_R)

/* Transmission of body */
#define DA_TA_ERR_BODY		0x50
#define DA_TA_ERR_BODY_I	(DA_TA_ERR_BODY|DA_TA_ERR_I)
#define DA_TA_ERR_BODY_W	(DA_TA_ERR_BODY|DA_TA_ERR_W)
/* unused, no SMTP command */
/* #define DA_TA_ERR_BODY_S	(DA_TA_ERR_BODY|DA_TA_ERR_S)	*/
#define DA_TA_ERR_BODY_R	(DA_TA_ERR_BODY|DA_TA_ERR_R)

/* Final dot */
#define DA_TA_ERR_DOT		0x60
#define DA_TA_ERR_DOT_I		(DA_TA_ERR_DOT|DA_TA_ERR_I)
#define DA_TA_ERR_DOT_W		(DA_TA_ERR_DOT|DA_TA_ERR_W)
#define DA_TA_ERR_DOT_S		(DA_TA_ERR_DOT|DA_TA_ERR_S)
#define DA_TA_ERR_DOT_R		(DA_TA_ERR_DOT|DA_TA_ERR_R)

/* LMTP RCPT replies after dot */
#define DA_TA_ERR_L_RCPT	0x70
#define DA_TA_ERR_L_RCPT_I	(DA_TA_ERR_L_RCPT|DA_TA_ERR_I)
#define DA_TA_ERR_L_RCPT_W	(DA_TA_ERR_L_RCPT|DA_TA_ERR_W)
#define DA_TA_ERR_L_RCPT_S	(DA_TA_ERR_L_RCPT|DA_TA_ERR_S)
#define DA_TA_ERR_L_RCPT_R	(DA_TA_ERR_L_RCPT|DA_TA_ERR_R)

/* RSET command (transaction or session?) */
#define DA_TA_ERR_RSET		0x80
#define DA_TA_ERR_RSET_I	(DA_TA_ERR_RSET|DA_TA_ERR_I)
#define DA_TA_ERR_RSET_W	(DA_TA_ERR_RSET|DA_TA_ERR_W)
#define DA_TA_ERR_RSET_S	(DA_TA_ERR_RSET|DA_TA_ERR_S)
#define DA_TA_ERR_RSET_R	(DA_TA_ERR_RSET|DA_TA_ERR_R)

/* "SIZE" command */
#define DA_TA_ERR_SIZE		0x90
#define DA_TA_ERR_SIZE_I	(DA_TA_ERR_SIZE|DA_TA_ERR_I)
#define DA_TA_ERR_SIZE_W	(DA_TA_ERR_SIZE|DA_TA_ERR_W)
#define DA_TA_ERR_SIZE_S	(DA_TA_ERR_SIZE|DA_TA_ERR_S)
#define DA_TA_ERR_SIZE_R	(DA_TA_ERR_SIZE|DA_TA_ERR_R)

/* Errors for session */

/* session can't be created */
#define DA_SE_ERR_CRT		0x00f0
#define DA_SE_ERR_CRT_I		(DA_SE_ERR_CRT|DA_SE_ERR_I)
/* #define DA_SE_ERR_CRT_W		(DA_SE_ERR_CRT|DA_SE_ERR_W) */
/* #define DA_SE_ERR_CRT_S		(DA_SE_ERR_CRT|DA_SE_ERR_S) */
/* #define DA_SE_ERR_CRT_R		(DA_SE_ERR_OPEN|DA_SE_ERR_R) */

/* socket/connect/open */
#define DA_SE_ERR_OPEN		0x0100
#define DA_SE_ERR_OPEN_I	(DA_SE_ERR_OPEN|DA_SE_ERR_I)
#define DA_SE_ERR_OPEN_W	(DA_SE_ERR_OPEN|DA_SE_ERR_W)
#define DA_SE_ERR_OPEN_S	(DA_SE_ERR_OPEN|DA_SE_ERR_S)
#define DA_SE_ERR_OPEN_R	(DA_SE_ERR_OPEN|DA_SE_ERR_R)

/* Greeting from server */
#define DA_SE_ERR_GRET		0x0110
#define DA_SE_ERR_GRET_I	(DA_SE_ERR_GRET|DA_SE_ERR_I)
#define DA_SE_ERR_GRET_W	(DA_SE_ERR_GRET|DA_SE_ERR_W)
#define DA_SE_ERR_GRET_S	(DA_SE_ERR_GRET|DA_SE_ERR_S)
#define DA_SE_ERR_GRET_R	(DA_SE_ERR_GRET|DA_SE_ERR_R)

/* EHLO */
#define DA_SE_ERR_EHLO		0x0120
#define DA_SE_ERR_EHLO_I	(DA_SE_ERR_EHLO|DA_SE_ERR_I)
#define DA_SE_ERR_EHLO_W	(DA_SE_ERR_EHLO|DA_SE_ERR_W)
#define DA_SE_ERR_EHLO_S	(DA_SE_ERR_EHLO|DA_SE_ERR_S)
#define DA_SE_ERR_EHLO_R	(DA_SE_ERR_EHLO|DA_SE_ERR_R)

/* HELO */
#define DA_SE_ERR_HELO		0x0130
#define DA_SE_ERR_HELO_I	(DA_SE_ERR_HELO|DA_SE_ERR_I)
#define DA_SE_ERR_HELO_W	(DA_SE_ERR_HELO|DA_SE_ERR_W)
#define DA_SE_ERR_HELO_S	(DA_SE_ERR_HELO|DA_SE_ERR_S)
#define DA_SE_ERR_HELO_R	(DA_SE_ERR_HELO|DA_SE_ERR_R)

/* LHLO */
#define DA_SE_ERR_LHLO		0x0140
#define DA_SE_ERR_LHLO_I	(DA_SE_ERR_LHLO|DA_SE_ERR_I)
#define DA_SE_ERR_LHLO_W	(DA_SE_ERR_LHLO|DA_SE_ERR_W)
#define DA_SE_ERR_LHLO_S	(DA_SE_ERR_LHLO|DA_SE_ERR_S)
#define DA_SE_ERR_LHLO_R	(DA_SE_ERR_LHLO|DA_SE_ERR_R)

/* STARTTLS */
#define DA_SE_ERR_STLS		0x0150
#define DA_SE_ERR_STLS_I	(DA_SE_ERR_STLS|DA_SE_ERR_I)
#define DA_SE_ERR_STLS_W	(DA_SE_ERR_STLS|DA_SE_ERR_W)
#define DA_SE_ERR_STLS_S	(DA_SE_ERR_STLS|DA_SE_ERR_S)
#define DA_SE_ERR_STLS_R	(DA_SE_ERR_STLS|DA_SE_ERR_R)

/* EHLO */
#define DA_SE_ERR_TTMYSLEF	0x0160
#define DA_SE_ERR_TTMYSLEF_S	(DA_SE_ERR_TTMYSLEF|DA_SE_ERR_S)

/* AUTH, ... */

/* Errors from address resolver; more specific? */
#define DA_AR_ERR		0x0200

/* Timeout error in AQ */
#define DA_AQ_TMO_ERR		0x0210

/* Timeout error in DEFEDB */
#define DA_DQ_TMO_ERR		0x0220

/* DA terminated */
#define DA_TERMINATED		0x0230

#endif /* SM_DA_H */


syntax highlighted by Code2HTML, v. 0.9.1