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