106f25ae9SGregory Neil Shapiro /* 25dd76dd0SGregory Neil Shapiro * Copyright (c) 1999-2003, 2006 Proofpoint, Inc. and its suppliers. 306f25ae9SGregory Neil Shapiro * All rights reserved. 406f25ae9SGregory Neil Shapiro * 506f25ae9SGregory Neil Shapiro * By using this file, you agree to the terms and conditions set 606f25ae9SGregory Neil Shapiro * forth in the LICENSE file which can be found at the top level of 706f25ae9SGregory Neil Shapiro * the sendmail distribution. 806f25ae9SGregory Neil Shapiro */ 906f25ae9SGregory Neil Shapiro 1006f25ae9SGregory Neil Shapiro /* 1106f25ae9SGregory Neil Shapiro ** LIBMILTER.H -- include file for mail filter library functions 1206f25ae9SGregory Neil Shapiro */ 1306f25ae9SGregory Neil Shapiro 1406f25ae9SGregory Neil Shapiro #ifndef _LIBMILTER_H 1506f25ae9SGregory Neil Shapiro # define _LIBMILTER_H 1 1640266059SGregory Neil Shapiro 1740266059SGregory Neil Shapiro #include <sm/gen.h> 1840266059SGregory Neil Shapiro 1906f25ae9SGregory Neil Shapiro #ifdef _DEFINE 2006f25ae9SGregory Neil Shapiro # define EXTERN 2106f25ae9SGregory Neil Shapiro # define INIT(x) = x 224313cc83SGregory Neil Shapiro SM_IDSTR(MilterlId, "@(#)$Id: libmilter.h,v 8.78 2013-11-22 20:51:36 ca Exp $") 23*5b0945b5SGregory Neil Shapiro #else 2406f25ae9SGregory Neil Shapiro # define EXTERN extern 2506f25ae9SGregory Neil Shapiro # define INIT(x) 26*5b0945b5SGregory Neil Shapiro #endif 2706f25ae9SGregory Neil Shapiro 2806f25ae9SGregory Neil Shapiro 29d0cef73dSGregory Neil Shapiro #include "sm/tailq.h" 30d0cef73dSGregory Neil Shapiro 3106f25ae9SGregory Neil Shapiro #define NOT_SENDMAIL 1 3206f25ae9SGregory Neil Shapiro #define _SOCK_ADDR union bigsockaddr 3306f25ae9SGregory Neil Shapiro #include "sendmail.h" 3406f25ae9SGregory Neil Shapiro 35d0cef73dSGregory Neil Shapiro #ifdef SM_ASSERT 36d0cef73dSGregory Neil Shapiro #undef SM_ASSERT 37d0cef73dSGregory Neil Shapiro #endif 38d0cef73dSGregory Neil Shapiro #ifndef SM_ASSERT 39d0cef73dSGregory Neil Shapiro #include <assert.h> 40d0cef73dSGregory Neil Shapiro #define SM_ASSERT(x) assert(x) 41d0cef73dSGregory Neil Shapiro #endif 42d0cef73dSGregory Neil Shapiro 4306f25ae9SGregory Neil Shapiro #include "libmilter/milter.h" 4406f25ae9SGregory Neil Shapiro 45d0cef73dSGregory Neil Shapiro #define MAX_MACROS_ENTRIES 7 /* max size of macro pointer array */ 46d0cef73dSGregory Neil Shapiro 47d0cef73dSGregory Neil Shapiro typedef SM_TAILQ_HEAD(, smfi_str) smfi_hd_T; 48d0cef73dSGregory Neil Shapiro typedef struct smfi_str smfi_str_S; 49d0cef73dSGregory Neil Shapiro 50d0cef73dSGregory Neil Shapiro /* 51d0cef73dSGregory Neil Shapiro ** Context for one milter session. 52d0cef73dSGregory Neil Shapiro ** 53d0cef73dSGregory Neil Shapiro ** Notes: 54d0cef73dSGregory Neil Shapiro ** There is a 1-1 correlation between a sendmail SMTP server process, 55d0cef73dSGregory Neil Shapiro ** an SMTP session, and an milter context. Due to the nature of SMTP 56d0cef73dSGregory Neil Shapiro ** session handling in sendmail 8, this libmilter implementation deals 57d0cef73dSGregory Neil Shapiro ** only with a single SMTP session per MTA - libmilter connection. 58d0cef73dSGregory Neil Shapiro ** 59d0cef73dSGregory Neil Shapiro ** There is no "global" context for libmilter, global variables are 60d0cef73dSGregory Neil Shapiro ** just that (they are not "collected" in a context). 61d0cef73dSGregory Neil Shapiro ** 62d0cef73dSGregory Neil Shapiro ** Implementation hint: 63d0cef73dSGregory Neil Shapiro ** macros are stored in mac_buf[] as sequence of: 64d0cef73dSGregory Neil Shapiro ** macro_name \0 macro_value 65d0cef73dSGregory Neil Shapiro ** (just as read from the MTA) 66d0cef73dSGregory Neil Shapiro ** mac_ptr is a list of pointers into mac_buf to the beginning of each 67d0cef73dSGregory Neil Shapiro ** entry, i.e., macro_name, macro_value, ... 68d0cef73dSGregory Neil Shapiro */ 69d0cef73dSGregory Neil Shapiro 70d0cef73dSGregory Neil Shapiro struct smfi_str 71d0cef73dSGregory Neil Shapiro { 72d0cef73dSGregory Neil Shapiro sthread_t ctx_id; /* thread id */ 73d0cef73dSGregory Neil Shapiro socket_t ctx_sd; /* socket descriptor */ 74d0cef73dSGregory Neil Shapiro int ctx_dbg; /* debug level */ 75d0cef73dSGregory Neil Shapiro time_t ctx_timeout; /* timeout */ 76d0cef73dSGregory Neil Shapiro int ctx_state; /* state */ 77d0cef73dSGregory Neil Shapiro smfiDesc_ptr ctx_smfi; /* filter description */ 78d0cef73dSGregory Neil Shapiro 79d0cef73dSGregory Neil Shapiro int ctx_prot_vers; /* libmilter protocol version */ 80d0cef73dSGregory Neil Shapiro unsigned long ctx_aflags; /* milter action flags */ 81d0cef73dSGregory Neil Shapiro 82d0cef73dSGregory Neil Shapiro unsigned long ctx_pflags; /* milter protocol flags */ 83d0cef73dSGregory Neil Shapiro 84d0cef73dSGregory Neil Shapiro /* 85d0cef73dSGregory Neil Shapiro ** milter protocol flags that are sent to the MTA; 86d0cef73dSGregory Neil Shapiro ** this is the same as ctx_pflags except for those flags that 87d0cef73dSGregory Neil Shapiro ** are not offered by the MTA but emulated in libmilter. 88d0cef73dSGregory Neil Shapiro */ 89d0cef73dSGregory Neil Shapiro 90d0cef73dSGregory Neil Shapiro unsigned long ctx_pflags2mta; 91d0cef73dSGregory Neil Shapiro 92d0cef73dSGregory Neil Shapiro /* 93d0cef73dSGregory Neil Shapiro ** milter protocol version that is sent to the MTA; 94d0cef73dSGregory Neil Shapiro ** this is the same as ctx_prot_vers unless the 95d0cef73dSGregory Neil Shapiro ** MTA protocol version (ctx_mta_prot_vers) is smaller 96d0cef73dSGregory Neil Shapiro ** but still "acceptable". 97d0cef73dSGregory Neil Shapiro */ 98d0cef73dSGregory Neil Shapiro 99d0cef73dSGregory Neil Shapiro int ctx_prot_vers2mta; 100d0cef73dSGregory Neil Shapiro 101d0cef73dSGregory Neil Shapiro char **ctx_mac_ptr[MAX_MACROS_ENTRIES]; 102d0cef73dSGregory Neil Shapiro char *ctx_mac_buf[MAX_MACROS_ENTRIES]; 103d0cef73dSGregory Neil Shapiro char *ctx_mac_list[MAX_MACROS_ENTRIES]; 104d0cef73dSGregory Neil Shapiro char *ctx_reply; /* reply code */ 105d0cef73dSGregory Neil Shapiro void *ctx_privdata; /* private data */ 106d0cef73dSGregory Neil Shapiro 107d0cef73dSGregory Neil Shapiro int ctx_mta_prot_vers; /* MTA protocol version */ 108d0cef73dSGregory Neil Shapiro unsigned long ctx_mta_pflags; /* MTA protocol flags */ 109d0cef73dSGregory Neil Shapiro unsigned long ctx_mta_aflags; /* MTA action flags */ 110d0cef73dSGregory Neil Shapiro 111d0cef73dSGregory Neil Shapiro #if _FFR_THREAD_MONITOR 112d0cef73dSGregory Neil Shapiro time_t ctx_start; /* start time of thread */ 113d0cef73dSGregory Neil Shapiro SM_TAILQ_ENTRY(smfi_str) ctx_mon_link; 114*5b0945b5SGregory Neil Shapiro #endif 115d0cef73dSGregory Neil Shapiro 116d0cef73dSGregory Neil Shapiro #if _FFR_WORKERS_POOL 117d0cef73dSGregory Neil Shapiro long ctx_sid; /* session identifier */ 118d0cef73dSGregory Neil Shapiro int ctx_wstate; /* state of the session (worker pool) */ 119d0cef73dSGregory Neil Shapiro int ctx_wait; /* elapsed time waiting for sm cmd */ 120d0cef73dSGregory Neil Shapiro SM_TAILQ_ENTRY(smfi_str) ctx_link; 121d0cef73dSGregory Neil Shapiro #endif /* _FFR_WORKERS_POOL */ 122d0cef73dSGregory Neil Shapiro }; 123d0cef73dSGregory Neil Shapiro 12406f25ae9SGregory Neil Shapiro # define ValidSocket(sd) ((sd) >= 0) 12540266059SGregory Neil Shapiro # define INVALID_SOCKET (-1) 12640266059SGregory Neil Shapiro # define closesocket close 12740266059SGregory Neil Shapiro # define MI_SOCK_READ(s, b, l) read(s, b, l) 12840266059SGregory Neil Shapiro # define MI_SOCK_READ_FAIL(x) ((x) < 0) 12940266059SGregory Neil Shapiro # define MI_SOCK_WRITE(s, b, l) write(s, b, l) 13006f25ae9SGregory Neil Shapiro 13106f25ae9SGregory Neil Shapiro # define thread_create(ptid,wr,arg) pthread_create(ptid, NULL, wr, arg) 13206f25ae9SGregory Neil Shapiro # define sthread_get_id() pthread_self() 13306f25ae9SGregory Neil Shapiro 134193538b7SGregory Neil Shapiro typedef pthread_mutex_t smutex_t; 135193538b7SGregory Neil Shapiro # define smutex_init(mp) (pthread_mutex_init(mp, NULL) == 0) 136193538b7SGregory Neil Shapiro # define smutex_destroy(mp) (pthread_mutex_destroy(mp) == 0) 137193538b7SGregory Neil Shapiro # define smutex_lock(mp) (pthread_mutex_lock(mp) == 0) 138193538b7SGregory Neil Shapiro # define smutex_unlock(mp) (pthread_mutex_unlock(mp) == 0) 139193538b7SGregory Neil Shapiro # define smutex_trylock(mp) (pthread_mutex_trylock(mp) == 0) 140193538b7SGregory Neil Shapiro 141d0cef73dSGregory Neil Shapiro #if _FFR_WORKERS_POOL 142d0cef73dSGregory Neil Shapiro /* SM_CONF_POLL shall be defined with _FFR_WORKERS_POOL */ 143d0cef73dSGregory Neil Shapiro # if !SM_CONF_POLL 144d0cef73dSGregory Neil Shapiro # define SM_CONF_POLL 1 145*5b0945b5SGregory Neil Shapiro # endif 146d0cef73dSGregory Neil Shapiro #endif /* _FFR_WORKERS_POOL */ 147d0cef73dSGregory Neil Shapiro 148d0cef73dSGregory Neil Shapiro typedef pthread_cond_t scond_t; 149d0cef73dSGregory Neil Shapiro #define scond_init(cp) pthread_cond_init(cp, NULL) 150d0cef73dSGregory Neil Shapiro #define scond_destroy(cp) pthread_cond_destroy(cp) 151d0cef73dSGregory Neil Shapiro #define scond_wait(cp, mp) pthread_cond_wait(cp, mp) 152d0cef73dSGregory Neil Shapiro #define scond_signal(cp) pthread_cond_signal(cp) 153d0cef73dSGregory Neil Shapiro #define scond_broadcast(cp) pthread_cond_broadcast(cp) 154d0cef73dSGregory Neil Shapiro #define scond_timedwait(cp, mp, to) \ 155d0cef73dSGregory Neil Shapiro do \ 156d0cef73dSGregory Neil Shapiro { \ 157d0cef73dSGregory Neil Shapiro struct timespec timeout; \ 158d0cef73dSGregory Neil Shapiro struct timeval now; \ 159d0cef73dSGregory Neil Shapiro gettimeofday(&now, NULL); \ 160d0cef73dSGregory Neil Shapiro timeout.tv_sec = now.tv_sec + to; \ 161d0cef73dSGregory Neil Shapiro timeout.tv_nsec = now.tv_usec / 1000; \ 162d0cef73dSGregory Neil Shapiro r = pthread_cond_timedwait(cp,mp,&timeout); \ 163d0cef73dSGregory Neil Shapiro if (r != 0 && r != ETIMEDOUT) \ 164d0cef73dSGregory Neil Shapiro smi_log(SMI_LOG_ERR, \ 165d0cef73dSGregory Neil Shapiro "pthread_cond_timedwait error %d", r); \ 166d0cef73dSGregory Neil Shapiro } while (0) 167d0cef73dSGregory Neil Shapiro 168d0cef73dSGregory Neil Shapiro 169e92d3f3fSGregory Neil Shapiro #if SM_CONF_POLL 170d9986b26SGregory Neil Shapiro 171d9986b26SGregory Neil Shapiro # include <poll.h> 172d9986b26SGregory Neil Shapiro # define MI_POLLSELECT "poll" 173d9986b26SGregory Neil Shapiro 174d9986b26SGregory Neil Shapiro # define MI_POLL_RD_FLAGS (POLLIN | POLLPRI) 175d9986b26SGregory Neil Shapiro # define MI_POLL_WR_FLAGS (POLLOUT) 176*5b0945b5SGregory Neil Shapiro # define MI_MS(timeout) (((timeout)->tv_sec * 1000) + (((timeout)->tv_usec) / 1000)) 177d9986b26SGregory Neil Shapiro 178d9986b26SGregory Neil Shapiro # define FD_RD_VAR(rds, excs) struct pollfd rds 179d9986b26SGregory Neil Shapiro # define FD_WR_VAR(wrs) struct pollfd wrs 180d9986b26SGregory Neil Shapiro 181d9986b26SGregory Neil Shapiro # define FD_RD_INIT(sd, rds, excs) \ 182d9986b26SGregory Neil Shapiro (rds).fd = (sd); \ 183d9986b26SGregory Neil Shapiro (rds).events = MI_POLL_RD_FLAGS; \ 184d9986b26SGregory Neil Shapiro (rds).revents = 0 185d9986b26SGregory Neil Shapiro 186d9986b26SGregory Neil Shapiro # define FD_WR_INIT(sd, wrs) \ 187d9986b26SGregory Neil Shapiro (wrs).fd = (sd); \ 188d9986b26SGregory Neil Shapiro (wrs).events = MI_POLL_WR_FLAGS; \ 189d9986b26SGregory Neil Shapiro (wrs).revents = 0 190d9986b26SGregory Neil Shapiro 191d9986b26SGregory Neil Shapiro # define FD_IS_RD_EXC(sd, rds, excs) \ 192d9986b26SGregory Neil Shapiro (((rds).revents & (POLLERR | POLLHUP | POLLNVAL)) != 0) 193d9986b26SGregory Neil Shapiro 194d9986b26SGregory Neil Shapiro # define FD_IS_WR_RDY(sd, wrs) \ 195d9986b26SGregory Neil Shapiro (((wrs).revents & MI_POLL_WR_FLAGS) != 0) 196d9986b26SGregory Neil Shapiro 197d9986b26SGregory Neil Shapiro # define FD_IS_RD_RDY(sd, rds, excs) \ 198d9986b26SGregory Neil Shapiro (((rds).revents & MI_POLL_RD_FLAGS) != 0) 199d9986b26SGregory Neil Shapiro 200*5b0945b5SGregory Neil Shapiro # define FD_WR_READY(sd, wrs, timeout) \ 201d9986b26SGregory Neil Shapiro poll(&(wrs), 1, MI_MS(timeout)) 202d9986b26SGregory Neil Shapiro 203d9986b26SGregory Neil Shapiro # define FD_RD_READY(sd, rds, excs, timeout) \ 204d9986b26SGregory Neil Shapiro poll(&(rds), 1, MI_MS(timeout)) 205d9986b26SGregory Neil Shapiro 206e92d3f3fSGregory Neil Shapiro #else /* SM_CONF_POLL */ 207d9986b26SGregory Neil Shapiro 208d9986b26SGregory Neil Shapiro # include <sm/fdset.h> 209d9986b26SGregory Neil Shapiro # define MI_POLLSELECT "select" 210d9986b26SGregory Neil Shapiro 211d9986b26SGregory Neil Shapiro # define FD_RD_VAR(rds, excs) fd_set rds, excs 212d9986b26SGregory Neil Shapiro # define FD_WR_VAR(wrs) fd_set wrs 213d9986b26SGregory Neil Shapiro 214d9986b26SGregory Neil Shapiro # define FD_RD_INIT(sd, rds, excs) \ 215d9986b26SGregory Neil Shapiro FD_ZERO(&(rds)); \ 216d9986b26SGregory Neil Shapiro FD_SET((unsigned int) (sd), &(rds)); \ 217d9986b26SGregory Neil Shapiro FD_ZERO(&(excs)); \ 218d9986b26SGregory Neil Shapiro FD_SET((unsigned int) (sd), &(excs)) 219d9986b26SGregory Neil Shapiro 220d9986b26SGregory Neil Shapiro # define FD_WR_INIT(sd, wrs) \ 221d9986b26SGregory Neil Shapiro FD_ZERO(&(wrs)); \ 2224e4196cbSGregory Neil Shapiro FD_SET((unsigned int) (sd), &(wrs)) 223d9986b26SGregory Neil Shapiro 224d9986b26SGregory Neil Shapiro # define FD_IS_RD_EXC(sd, rds, excs) FD_ISSET(sd, &(excs)) 225d9986b26SGregory Neil Shapiro # define FD_IS_WR_RDY(sd, wrs) FD_ISSET((sd), &(wrs)) 226d9986b26SGregory Neil Shapiro # define FD_IS_RD_RDY(sd, rds, excs) FD_ISSET((sd), &(rds)) 227d9986b26SGregory Neil Shapiro 228d9986b26SGregory Neil Shapiro # define FD_WR_READY(sd, wrs, timeout) \ 229d9986b26SGregory Neil Shapiro select((sd) + 1, NULL, &(wrs), NULL, (timeout)) 230d9986b26SGregory Neil Shapiro # define FD_RD_READY(sd, rds, excs, timeout) \ 231d9986b26SGregory Neil Shapiro select((sd) + 1, &(rds), NULL, &(excs), (timeout)) 232d9986b26SGregory Neil Shapiro 233e92d3f3fSGregory Neil Shapiro #endif /* SM_CONF_POLL */ 234d9986b26SGregory Neil Shapiro 23506f25ae9SGregory Neil Shapiro #include <sys/time.h> 23606f25ae9SGregory Neil Shapiro 23706f25ae9SGregory Neil Shapiro /* some defaults */ 2388774250cSGregory Neil Shapiro #define MI_TIMEOUT 7210 /* default timeout for read/write */ 23906f25ae9SGregory Neil Shapiro #define MI_CHK_TIME 5 /* checking whether to terminate */ 24006f25ae9SGregory Neil Shapiro 24140266059SGregory Neil Shapiro #ifndef MI_SOMAXCONN 24242e5d165SGregory Neil Shapiro # if SOMAXCONN > 20 24342e5d165SGregory Neil Shapiro # define MI_SOMAXCONN SOMAXCONN 244*5b0945b5SGregory Neil Shapiro # else 24542e5d165SGregory Neil Shapiro # define MI_SOMAXCONN 20 246*5b0945b5SGregory Neil Shapiro # endif 24740266059SGregory Neil Shapiro #endif /* ! MI_SOMAXCONN */ 24842e5d165SGregory Neil Shapiro 24906f25ae9SGregory Neil Shapiro /* maximum number of repeated failures in mi_listener() */ 25006f25ae9SGregory Neil Shapiro #define MAX_FAILS_M 16 /* malloc() */ 25106f25ae9SGregory Neil Shapiro #define MAX_FAILS_T 16 /* thread creation */ 2528774250cSGregory Neil Shapiro #define MAX_FAILS_A 16 /* accept() */ 25340266059SGregory Neil Shapiro #define MAX_FAILS_S 16 /* select() */ 25406f25ae9SGregory Neil Shapiro 25506f25ae9SGregory Neil Shapiro /* internal "commands", i.e., error codes */ 25606f25ae9SGregory Neil Shapiro #define SMFIC_TIMEOUT ((char) 1) /* timeout */ 25706f25ae9SGregory Neil Shapiro #define SMFIC_SELECT ((char) 2) /* select error */ 25806f25ae9SGregory Neil Shapiro #define SMFIC_MALLOC ((char) 3) /* malloc error */ 25906f25ae9SGregory Neil Shapiro #define SMFIC_RECVERR ((char) 4) /* recv() error */ 26006f25ae9SGregory Neil Shapiro #define SMFIC_EOF ((char) 5) /* eof */ 26106f25ae9SGregory Neil Shapiro #define SMFIC_UNKNERR ((char) 6) /* unknown error */ 26206f25ae9SGregory Neil Shapiro #define SMFIC_TOOBIG ((char) 7) /* body chunk too big */ 26306f25ae9SGregory Neil Shapiro #define SMFIC_VALIDCMD ' ' /* first valid command */ 26406f25ae9SGregory Neil Shapiro 26506f25ae9SGregory Neil Shapiro /* hack */ 26606f25ae9SGregory Neil Shapiro #define smi_log syslog 267a7ec597cSGregory Neil Shapiro #define sm_dprintf (void) printf 26806f25ae9SGregory Neil Shapiro #define milter_ret int 26906f25ae9SGregory Neil Shapiro #define SMI_LOG_ERR LOG_ERR 27006f25ae9SGregory Neil Shapiro #define SMI_LOG_FATAL LOG_ERR 27106f25ae9SGregory Neil Shapiro #define SMI_LOG_WARN LOG_WARNING 27206f25ae9SGregory Neil Shapiro #define SMI_LOG_INFO LOG_INFO 27306f25ae9SGregory Neil Shapiro #define SMI_LOG_DEBUG LOG_DEBUG 27406f25ae9SGregory Neil Shapiro 27506f25ae9SGregory Neil Shapiro /* stop? */ 27606f25ae9SGregory Neil Shapiro #define MILTER_CONT 0 27706f25ae9SGregory Neil Shapiro #define MILTER_STOP 1 27806f25ae9SGregory Neil Shapiro #define MILTER_ABRT 2 27906f25ae9SGregory Neil Shapiro 28006f25ae9SGregory Neil Shapiro /* functions */ 28106f25ae9SGregory Neil Shapiro extern int mi_handle_session __P((SMFICTX_PTR)); 28206f25ae9SGregory Neil Shapiro extern int mi_engine __P((SMFICTX_PTR)); 28342e5d165SGregory Neil Shapiro extern int mi_listener __P((char *, int, smfiDesc_ptr, time_t, int)); 28406f25ae9SGregory Neil Shapiro extern void mi_clr_macros __P((SMFICTX_PTR, int)); 2859bd497b8SGregory Neil Shapiro extern void mi_clr_ctx __P((SMFICTX_PTR)); 28606f25ae9SGregory Neil Shapiro extern int mi_stop __P((void)); 28706f25ae9SGregory Neil Shapiro extern int mi_control_startup __P((char *)); 28806f25ae9SGregory Neil Shapiro extern void mi_stop_milters __P((int)); 28906f25ae9SGregory Neil Shapiro extern void mi_clean_signals __P((void)); 29006f25ae9SGregory Neil Shapiro extern struct hostent *mi_gethostbyname __P((char *, int)); 29140266059SGregory Neil Shapiro extern int mi_inet_pton __P((int, const char *, void *)); 29242e5d165SGregory Neil Shapiro extern void mi_closener __P((void)); 293323f6dcbSGregory Neil Shapiro extern int mi_opensocket __P((char *, int, int, bool, smfiDesc_ptr)); 29406f25ae9SGregory Neil Shapiro 29506f25ae9SGregory Neil Shapiro /* communication functions */ 29606f25ae9SGregory Neil Shapiro extern char *mi_rd_cmd __P((socket_t, struct timeval *, char *, size_t *, char *)); 29706f25ae9SGregory Neil Shapiro extern int mi_wr_cmd __P((socket_t, struct timeval *, int, char *, size_t)); 29806f25ae9SGregory Neil Shapiro extern bool mi_sendok __P((SMFICTX_PTR, int)); 29906f25ae9SGregory Neil Shapiro 30040266059SGregory Neil Shapiro 301d0cef73dSGregory Neil Shapiro #if _FFR_THREAD_MONITOR 302d0cef73dSGregory Neil Shapiro extern bool Monitor; 303d0cef73dSGregory Neil Shapiro 304d0cef73dSGregory Neil Shapiro #define MI_MONITOR_INIT() mi_monitor_init() 305d0cef73dSGregory Neil Shapiro #define MI_MONITOR_BEGIN(ctx, cmd) \ 306d0cef73dSGregory Neil Shapiro do \ 307d0cef73dSGregory Neil Shapiro { \ 308d0cef73dSGregory Neil Shapiro if (Monitor) \ 309d0cef73dSGregory Neil Shapiro mi_monitor_work_begin(ctx, cmd);\ 310d0cef73dSGregory Neil Shapiro } while (0) 311d0cef73dSGregory Neil Shapiro 312d0cef73dSGregory Neil Shapiro #define MI_MONITOR_END(ctx, cmd) \ 313d0cef73dSGregory Neil Shapiro do \ 314d0cef73dSGregory Neil Shapiro { \ 315d0cef73dSGregory Neil Shapiro if (Monitor) \ 316d0cef73dSGregory Neil Shapiro mi_monitor_work_end(ctx, cmd); \ 317d0cef73dSGregory Neil Shapiro } while (0) 318d0cef73dSGregory Neil Shapiro 319d0cef73dSGregory Neil Shapiro int mi_monitor_init __P((void)); 320d0cef73dSGregory Neil Shapiro int mi_monitor_work_begin __P((SMFICTX_PTR, int)); 321d0cef73dSGregory Neil Shapiro int mi_monitor_work_end __P((SMFICTX_PTR, int)); 322d0cef73dSGregory Neil Shapiro 323d0cef73dSGregory Neil Shapiro #else /* _FFR_THREAD_MONITOR */ 324d0cef73dSGregory Neil Shapiro #define MI_MONITOR_INIT() MI_SUCCESS 325d0cef73dSGregory Neil Shapiro #define MI_MONITOR_BEGIN(ctx, cmd) 326d0cef73dSGregory Neil Shapiro #define MI_MONITOR_END(ctx, cmd) 327d0cef73dSGregory Neil Shapiro #endif /* _FFR_THREAD_MONITOR */ 328d0cef73dSGregory Neil Shapiro 329d0cef73dSGregory Neil Shapiro #if _FFR_WORKERS_POOL 330d0cef73dSGregory Neil Shapiro extern int mi_pool_manager_init __P((void)); 331d0cef73dSGregory Neil Shapiro extern int mi_pool_controller_init __P((void)); 332d0cef73dSGregory Neil Shapiro extern int mi_start_session __P((SMFICTX_PTR)); 333d0cef73dSGregory Neil Shapiro #endif /* _FFR_WORKERS_POOL */ 334d0cef73dSGregory Neil Shapiro 33506f25ae9SGregory Neil Shapiro #endif /* ! _LIBMILTER_H */ 336