xref: /freebsd/contrib/sendmail/libmilter/docs/overview.html (revision fcb560670601b2a4d87bb31d7531c8dcc37ee71b)
1<HTML>
2<HEAD>
3<TITLE>Technical Overview</TITLE>
4</HEAD>
5<BODY>
6<!--
7$Id: overview.html,v 1.22 2013-11-22 20:51:39 ca Exp $
8-->
9
10<H1>Technical Overview</H1>
11
12<H2>Contents</H2>
13
14<UL>
15    <LI><A HREF="#Initialization">Initialization</A>
16    <LI><A HREF="#ControlFlow">Control Flow</A>
17    <LI><A HREF="#Multithreading">Multithreading</A>
18    <LI><A HREF="#ResourceManagement">Resource Management</A>
19    <LI><A HREF="#SignalHandling">Signal Handling</A>
20</UL>
21
22<H2><A NAME="Initialization">Initialization</A></H2>
23
24In addition to its own initialization,
25libmilter expects a filter to initialize several parameters
26before calling <A HREF="smfi_main.html">smfi_main</A>:
27<UL>
28    <LI>The callbacks the filter wishes to be called, and the types of
29    message modification it intends to perform (required, see
30    <A HREF="smfi_register.html">smfi_register</A>).
31
32    <LI>The socket address to be used when communicating with the MTA
33    (required, see <A HREF="smfi_setconn.html">smfi_setconn</A>).
34
35    <LI>The number of seconds to wait for MTA connections before
36    timing out (optional, see
37    <A HREF="smfi_settimeout.html">smfi_settimeout</A>).
38</UL>
39<P>
40If the filter fails to initialize libmilter,
41or if one or more of the parameters it has passed are invalid,
42a subsequent call to smfi_main will fail.
43
44<H2><A NAME="ControlFlow">Control Flow</A></H2>
45
46<P>
47The following pseudocode describes the filtering process from the
48perspective of a set of <CODE>N</CODE> MTA's,
49each corresponding to a connection.
50Callbacks are shown beside the processing stages in which they are invoked;
51if no callbacks are defined for a particular stage,
52that stage may be bypassed.
53Though it is not shown,
54processing may be aborted at any time during a message,
55in which case the
56<A HREF="xxfi_abort.html">xxfi_abort</A> callback is invoked and control
57returns to <CODE>MESSAGE</CODE>.
58<P>
59<PRE>
60For each of N connections
61{
62	For each filter
63		process connection (<A HREF="xxfi_connect.html">xxfi_connect</A>)
64	For each filter
65		process helo/ehlo (<A HREF="xxfi_helo.html">xxfi_helo</A>)
66MESSAGE:For each message in this connection (sequentially)
67	{
68		For each filter
69			process sender (<A HREF="xxfi_envfrom.html">xxfi_envfrom</A>)
70		For each recipient
71		{
72			For each filter
73				process recipient (<A HREF="xxfi_envrcpt.html">xxfi_envrcpt</A>)
74		}
75		For each filter
76		{
77			process DATA (<A HREF="xxfi_data.html">xxfi_data</A>)
78			For each header
79				process header (<A HREF="xxfi_header.html">xxfi_header</A>)
80			process end of headers (<A HREF="xxfi_eoh.html">xxfi_eoh</A>)
81			For each body block
82				process this body block (<A HREF="xxfi_body.html">xxfi_body</A>)
83			process end of message (<A HREF="xxfi_eom.html">xxfi_eom</A>)
84		}
85	}
86	For each filter
87		process end of connection (<A HREF="xxfi_close.html">xxfi_close</A>)
88}
89</PRE>
90
91<P>Note: Filters are contacted in order defined in config file.</P>
92
93<P>
94To write a filter, a vendor supplies callbacks to process relevant
95parts of a message transaction.
96The library then controls all sequencing, threading,
97and protocol exchange with the MTA.
98<A HREF="#figure-3">Figure 3</A> outlines control flow for a filter
99process, showing where different callbacks are invoked.
100</P>
101
102<DIV ALIGN="center"><A NAME="figure-3"></A>
103<TABLE border=1 cellspacing=0 cellpadding=2 width="70%">
104<TR bgcolor="#dddddd"><TH>SMTP Commands</TH><TH>Milter Callbacks</TH></TR>
105<TR><TD>(open SMTP connection)</TD><TD>xxfi_connect</TD></TR>
106<TR><TD>HELO ...</TD><TD>xxfi_helo</TD></TR>
107<TR><TD>MAIL From: ...</TD><TD>xxfi_envfrom</TD></TR>
108<TR><TD>RCPT To: ...</TD><TD>xxfi_envrcpt</TD></TR>
109<TR><TD>[more RCPTs]</TD><TD>[xxfi_envrcpt]</TD></TR>
110<TR><TD>DATA</TD><TD>xxfi_data</TD></TR>
111<TR><TD>Header: ...</TD><TD>xxfi_header</TD></TR>
112<TR><TD>[more headers]</TD><TD>[xxfi_header]</TD></TR>
113<TR><TD>&nbsp;</TD><TD>xxfi_eoh</TD></TR>
114<TR><TD>body... </TD><TD>xxfi_body</TD></TR>
115<TR><TD>[more body...]</TD><TD>[xxfi_body]</TD></TR>
116<TR><TD>.</TD><TD>xxfi_eom</TD></TR>
117<TR><TD>QUIT</TD><TD>xxfi_close</TD></TR>
118<TR><TD>(close SMTP connection)</TD><TD>&nbsp;</TD></TR>
119</TABLE>
120<B>Figure 3: Milter callbacks related to an SMTP transaction.</B>
121</DIV>
122
123<P>
124Note that although only a single message is shown above, multiple
125messages may be sent in a single connection.
126Note also that a message or connection may be aborted by
127either the remote host or the MTA
128at any point during the SMTP transaction.
129If this occurs during a message (between the MAIL command and the final "."),
130the filter's
131<A HREF="xxfi_abort.html">xxfi_abort</A> routine will be called.
132<A HREF="xxfi_close.html">xxfi_close</A> is called any time the
133connection closes.
134
135<H2><A NAME="Multithreading">Multithreading</A></H2>
136
137<P>
138A single filter process may handle any number of connections
139simultaneously.
140All filtering callbacks must therefore be reentrant,
141and use some appropriate external synchronization methods to access
142global data.
143Furthermore, since there is not a one-to-one correspondence
144between threads and connections
145(N connections mapped onto M threads, M &lt;= N),
146connection-specific data must be accessed
147through the handles provided by the Milter library.
148The programmer cannot rely on library-supplied thread-specific data blocks
149(e.g., <CODE>pthread_getspecific(3)</CODE>) to store connection-specific data.
150See the API documentation for
151<A HREF="smfi_setpriv.html">smfi_setpriv</A> and
152<A HREF="smfi_getpriv.html">smfi_getpriv</A> for details.
153
154<H2><A NAME="ResourceManagement">Resource Management</A></H2>
155
156Since filters are likely to be long-lived,
157and to handle many connections,
158proper deallocation of per-connection resources is important.
159The lifetime of a connection is bracketed by calls to the
160callbacks <A HREF="xxfi_connect.html">xxfi_connect</A> and
161<A HREF="xxfi_close.html">xxfi_close</A>.
162Therefore connection-specific
163resources (accessed via <A HREF="smfi_getpriv.html">smfi_getpriv</A>
164and <A HREF="smfi_setpriv.html">smfi_setpriv</A>) may be allocated in
165<A HREF="xxfi_connect.html">xxfi_connect</A>,
166and should be freed in
167<A HREF="xxfi_close.html">xxfi_close</A>.
168For further information see
169the <A HREF="api.html#conn-msg">discussion</A> of message- versus
170connection-oriented routines.
171In particular,
172note that there is only one connection-specific data pointer per connection.
173<P>
174
175Each message is bracketed by calls to
176<A HREF="xxfi_envfrom.html">xxfi_envfrom</A> and
177<A HREF="xxfi_eom.html">xxfi_eom</A> (or
178<A HREF="xxfi_abort.html">xxfi_abort</A>),
179implying that message-specific resources can be allocated
180and reclaimed in these routines.
181Since the messages in a connection are processed sequentially by each filter,
182there will be only one active message associated with a given
183connection and filter (and connection-private data block).
184These resources must still be accessed through
185<A HREF="smfi_getpriv.html">smfi_getpriv</A> and
186<A HREF="smfi_setpriv.html">smfi_setpriv</A>,
187and must be reclaimed in
188<A HREF="xxfi_abort.html">xxfi_abort</A>.
189
190<H2><A NAME="SignalHandling">Signal Handling</A></H2>
191
192libmilter takes care of signal handling,
193the filters are not influenced directly by signals.
194There are basically two types of signal handlers:
195
196<OL>
197<LI><TT>Stop</TT>: no new connections from the MTA will be accepted,
198but existing connections are allowed to continue.
199<LI><TT>Abort</TT>: all filters will be stopped as soon as the next
200communication with the MTA happens.
201</OL>
202
203Filters are not terminated asynchronously
204(except by signals that can't be caught).
205In the case of <TT>Abort</TT> the
206<A HREF="xxfi_abort.html">xxfi_abort</A> callback is invoked.
207
208<HR size="1">
209<FONT size="-1">
210Copyright (c) 2000, 2001, 2003, 2006 Proofpoint, Inc. and its suppliers.
211All rights reserved.
212<BR>
213By using this file, you agree to the terms and conditions set
214forth in the LICENSE.
215</FONT>
216</BODY>
217</HTML>
218