/* * Copyright (c) 2002-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: c2q.h,v 1.20 2007/08/19 17:39:33 ca Exp $ */ #ifndef SMTPS_C2Q_H #define SMTPS_C2Q_H 1 #include "sm/generic.h" #include "sm/magic.h" #include "sm/reccom.h" #include "statethreads/st.h" #include "sm/rcbst.h" #include "smtpc.h" /* basic size for RCB in c2q_ctx */ #define C2Q_RCB_SIZE 256 /* SMTPC context for communication with QMGR */ typedef struct c2q_ctx_S c2q_ctx_T, *c2q_ctx_P; struct c2q_ctx_S { sm_magic_T sm_magic; sc_ctx_P c2q_sc_ctx; /* pointer back to SMTPC context */ int c2q_status; /* status */ st_netfd_t c2q_fd; /* fd for communication */ st_mutex_t c2q_wr_mutex; /* mutex for write */ st_cond_t c2q_cond_rd; /* cond.var for read */ uint c2q_max_ses; /* max. # of open sessions */ #if 0 uint c2q_cur_ses; /* current # of open sessions */ #endif sm_rcb_P c2q_notify_rcb; /* ** array of session ctx: associates a session id with a session. ** this could also be implemented as a lookup table (e.g., hash) ** but since there is a fixed upper limit for the number of ** active threads (which shouldn't be too large) a simple array ** is used here. */ sc_sess_P *c2q_sess; }; #define C2Q_ST_OK 0 #define C2Q_ST_IOERR 1 #define C2Q_ST_CLOSED (-1) /* use flags? */ #define C2Q_IS_IOERR(c2q_ctx) ((c2q_ctx)->c2q_status == C2Q_ST_IOERR) #define C2Q_SET_IOERR(c2q_ctx) (c2q_ctx)->c2q_status = C2Q_ST_IOERR #define C2Q_CLR_IOERR(c2q_ctx) (c2q_ctx)->c2q_status = C2Q_ST_OK #define SM_IS_C2Q_CTX(c2q_ctx) SM_REQUIRE_ISA((c2q_ctx), SM_C2Q_CTX_MAGIC) sm_ret_T c2q_init(sc_ctx_P _sc_ctx, c2q_ctx_P _c2q_ctx, uint _max_ses); sm_ret_T c2q_stop(c2q_ctx_P _c2q_ctx); #if 0 sm_ret_T sm_w4q2c(sc_t_ctx_P _sc_t_ctx, uint _tmo); #endif sm_ret_T sc_c2q(sc_t_ctx_P _sc_t_ctx, uint32_t _whichstatus, sm_ret_T _ret, c2q_ctx_P _c2q_ctx); sm_ret_T sc_rm_sess_rq(sc_sess_P _sc_sess, c2q_ctx_P _c2q_ctx); sm_ret_T sc_rcb_send(sm_rcb_P _rcb, c2q_ctx_P _c2q_ctx); #endif /* SMTPS_C2Q_H */