/*
* 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: rcbcomm.h,v 1.19 2006/01/23 18:22:51 ca Exp $
*/
#ifndef SM_RCBCOMM_H
#define SM_RCBCOMM_H 1
/*
** Generic RCB communication context;
** This module uses
** - one read RCB: only one message at a time is received and decoded.
** - one write RCBE: this acts as a fallback RCB entry if allocation fails.
** - one list of RCBEs to write: a module creates an RCB entry, fills in
** the necessary data and then calls sm_rcbcom_endrep() to append that
** RCB entry to the write list (rcbcom_wrrcbl).
** - event thread task that performs the communication
**
** The function sm_rcbcom2mod() is called when the fd for the task is
** ready to write: it takes the first RCB entry from the write list
** and sends it to the external module.
*/
#include "sm/generic.h"
#include "sm/evthr.h"
#include "sm/rcb.h"
#include "sm/rcbl.h"
#include "sm/queue.h"
#include "sm/pthread.h"
#ifndef RCBCOM_CHECK
# define RCBCOM_CHECK 0
#endif
#ifndef RCBCOMM_DEBUG
# define RCBCOMM_DEBUG 0
#endif
#if RCBCOMM_DEBUG
uint rcbcomm_debug;
# define RCBCOMM_DEBFP smioerr
# define RCBCOMM_LEV_DPRINTF(lev, x) do \
{ \
if ((lev) < rcbcomm_debug) \
sm_io_fprintf x; \
} while (0)
# define RCBCOMM_DPRINTF(x) sm_io_fprintf x
#else /* RCBCOMM_DEBUG */
# define RCBCOMM_DPRINTF(x)
# define RCBCOMM_LEV_DPRINTF(lev, x)
#endif /* RCBCOMM_DEBUG */
typedef struct rcbcom_ctx_S rcbcom_ctx_T, *rcbcom_ctx_P;
/* Generic communication context RCBCOMM - external module */
struct rcbcom_ctx_S
{
#if RCBCOM_CHECK
sm_magic_T sm_magic;
#endif
sm_evthr_task_P rcbcom_tsk; /* pointer to evthr task */
sm_rcb_P rcbcom_rdrcb; /* RCB for communication (rd) */
sm_rcbe_P rcbcom_wrrcbe; /* RCB entry for writing */
sm_rcbh_T rcbcom_wrrcbl; /* RCB list (wr) */
uint rcbcom_wr_len_cur; /* cur. length of RCB write list */
uint rcbcom_wr_len_max; /* max. length of RCB write list */
pthread_mutex_t rcbcom_wrmutex;
};
sm_ret_T sm_rcbe_new_enc(sm_rcbe_P *_prcbe, int _minsz, uint _maxlen);
sm_ret_T sm_rcbcom_open(rcbcom_ctx_P _rcbcom_ctx);
sm_ret_T sm_rcbcom_close(rcbcom_ctx_P _rcbcom_ctx);
sm_ret_T sm_rcbcom_prerep(rcbcom_ctx_P _rcbcom_ctx, sm_evthr_task_P _tsk, sm_rcbe_P *_prcbe);
sm_ret_T sm_rcbcom_endrep(rcbcom_ctx_P _rcbcom_ctx, sm_evthr_task_P _tsk, bool _notified, sm_rcbe_P *_prcbe);
sm_ret_T sm_rcbcom2mod(sm_evthr_task_P _tsk, rcbcom_ctx_P _rcbcom_ctx);
#endif /* SM_RCBCOMM_H */
syntax highlighted by Code2HTML, v. 0.9.1