Deleted Added
full compact
api.html (132943) api.html (168515)
1<html>
2<head><title>Milter API</title></head>
3<body>
1<HTML>
2<HEAD><TITLE>Milter API</TITLE></HEAD>
3<BODY>
4<!--
4<!--
5$Id: api.html,v 1.18 2004/04/28 23:26:51 msk Exp $
5$Id: api.html,v 1.35 2006/11/30 23:09:23 ca Exp $
6-->
6-->
7<h1>Milter API</h1>
7<H1>Milter API</H1>
8
8
9<h2>Contents</h2>
10<ul>
11 <li>Library Control Functions
12 <li>Data Access Functions
13 <li>Message Modification Functions
14 <li>Callbacks
15</ul>
9<H2>Contents</H2>
10<UL>
11 <LI><A HREF="#LibraryControlFunctions">Library Control Functions</A>
12 <LI><A HREF="#DataAccessFunctions">Data Access Functions</A>
13 <LI><A HREF="#MessageModificationFunctions">Message Modification Functions</A>
14 <LI><A HREF="#Callbacks">Callbacks</A>
15 <LI><A HREF="#Miscellaneous">Miscellaneous</A>
16</UL>
16
17
17<h2>Library Control Functions</h2>
18<H2><A NAME="LibraryControlFunctions">Library Control Functions</A></H2>
18
19
19Before handing control to libmilter (by calling <a
20href="smfi_main.html">smfi_main</a>), a filter may call the following
21functions to set libmilter parameters. In particular, the filter must
22call <a href="smfi_register.html">smfi_register</a> to register its
23callbacks. Each function will return either MI_SUCCESS or MI_FAILURE to
20Before handing control to libmilter (by calling
21<A HREF="smfi_main.html">smfi_main</A>), a filter may call the following
22functions to set libmilter parameters.
23In particular, the filter must call
24<A HREF="smfi_register.html">smfi_register</A> to register its callbacks.
25Each function will return either MI_SUCCESS or MI_FAILURE to
24indicate the status of the operation.
26indicate the status of the operation.
25<p>
27
28<P>
26None of these functions communicate with the MTA. All alter the
29None of these functions communicate with the MTA. All alter the
27library's state, some of which is communicated to the MTA inside <a
28href="smfi_main.html">smfi_main</a>.
29<p>
30<table border="1" cellspacing=0 cellpadding=2><tr bgcolor="#dddddd"><th>Function</th><th>Description</th></tr>
30library's state, some of which is communicated to the MTA inside
31<A HREF="smfi_main.html">smfi_main</A>.
31
32
32<tr><td><a href="smfi_opensocket.html">smfi_opensocket</a></td><td>Try to create the interface socket.</td></tr>
33<P>
34<TABLE BORDER="1" CELLSPACING=0 CELLPADDING=2><TR BGCOLOR="#dddddd"><TH>Function</TH><TH>Description</TH></TR>
33
35
34<tr><td><a href="smfi_register.html">smfi_register</a></td><td>Register a filter.</td></tr>
36<TR><TD><A HREF="smfi_opensocket.html">smfi_opensocket</A></TD><TD>Try to create the interface socket.</TD></TR>
35
37
36<tr><td><a href="smfi_setconn.html">smfi_setconn</a></td><td>Specify socket to use.</td></tr>
38<TR><TD><A HREF="smfi_register.html">smfi_register</A></TD><TD>Register a filter.</TD></TR>
37
39
38<tr><td><a href="smfi_settimeout.html">smfi_settimeout</a></td><td>Set timeout.</td></tr>
40<TR><TD><A HREF="smfi_setconn.html">smfi_setconn</A></TD><TD>Specify socket to use.</TD></TR>
39
41
40<tr><td><a href="smfi_setbacklog.html">smfi_setbacklog</a></td><td>Define the incoming <i>listen</i>(2) queue size.</td></tr>
42<TR><TD><A HREF="smfi_settimeout.html">smfi_settimeout</A></TD><TD>Set timeout.</TD></TR>
41
43
42<tr><td><a href="smfi_setdbg.html">smfi_setdbg</a></td><td>Set the milter library debugging (tracing) level.</td></tr>
44<TR><TD><A HREF="smfi_setbacklog.html">smfi_setbacklog</A></TD><TD>Define the incoming <CODE>listen(2)</CODE> queue size.</TD></TR>
43
45
44<tr><td><a href="smfi_stop.html">smfi_stop</a></td><td>Cause an orderly shutdown.</td></tr>
46<TR><TD><A HREF="smfi_setdbg.html">smfi_setdbg</A></TD><TD>Set the milter library debugging (tracing) level.</TD></TR>
45
47
46<tr><td><a href="smfi_main.html">smfi_main</a></td><td>Hand control to libmilter.</td></tr>
48<TR><TD><A HREF="smfi_stop.html">smfi_stop</A></TD><TD>Cause an orderly shutdown.</TD></TR>
47
49
48</table>
50<TR><TD><A HREF="smfi_main.html">smfi_main</A></TD><TD>Hand control to libmilter.</TD></TR>
49
51
50<h2>Data Access Functions</h2>
52</TABLE>
51
53
54<H2><A NAME="DataAccessFunctions">Data Access Functions</A></H2>
55
52The following functions may be called from within the filter-defined callbacks
53to access information about the current connection or message.
56The following functions may be called from within the filter-defined callbacks
57to access information about the current connection or message.
54<p>
55<table border="1" cellspacing=0 cellpadding=2><tr bgcolor="#dddddd"><th>Function</th><th>Description</th></tr>
56<tr><td><a href="smfi_getsymval.html">smfi_getsymval</a></td><td>Return the value
57of a symbol.</td></tr>
58<P>
59<TABLE BORDER="1" CELLSPACING=0 CELLPADDING=2><TR bgcolor="#dddddd"><TH>Function</TH><TH>Description</TH></TR>
60<TR><TD><A HREF="smfi_getsymval.html">smfi_getsymval</A></TD><TD>Return the value
61of a symbol.</TD></TR>
58
62
59<tr><td><a href="smfi_getpriv.html">smfi_getpriv</a></td><td>Get the private data
60pointer.</td></tr>
63<TR><TD><A HREF="smfi_getpriv.html">smfi_getpriv</A></TD><TD>Get the private data
64pointer.</TD></TR>
61
65
62<tr><td><a href="smfi_setpriv.html">smfi_setpriv</a></td><td>Set the private data
63pointer.</td></tr>
66<TR><TD><A HREF="smfi_setpriv.html">smfi_setpriv</A></TD><TD>Set the private data
67pointer.</TD></TR>
64
68
65<tr><td><a href="smfi_setreply.html">smfi_setreply</a></td><td>Set the specific
66reply code to be used.</td></tr>
69<TR><TD><A HREF="smfi_setreply.html">smfi_setreply</A></TD><TD>Set the specific
70reply code to be used.</TD></TR>
67
71
68<tr><td><a href="smfi_setmlreply.html">smfi_setmlreply</a></td><td>Set the
69specific multi-line reply to be used.</td></tr>
72<TR><TD><A HREF="smfi_setmlreply.html">smfi_setmlreply</A></TD><TD>Set the
73specific multi-line reply to be used.</TD></TR>
70
74
71</table>
75</TABLE>
72
76
73<h2>Message Modification Functions</h2>
77<H2><A NAME="MessageModificationFunctions">Message Modification Functions</A></H2>
74
75The following functions change a message's contents and attributes.
78
79The following functions change a message's contents and attributes.
76<b>They may only be called in <a href="xxfi_eom.html">xxfi_eom</a></b>.
80<EM>They may only be called in <A HREF="xxfi_eom.html">xxfi_eom</A></EM>.
77All of these functions may invoke additional communication with the MTA.
78They will return either MI_SUCCESS or MI_FAILURE to indicate the status of
79the operation.
80
81All of these functions may invoke additional communication with the MTA.
82They will return either MI_SUCCESS or MI_FAILURE to indicate the status of
83the operation.
84
81<p>
85<P>
82A filter must have set the appropriate flag (listed below) in the
86A filter must have set the appropriate flag (listed below) in the
83description passed to <a href="smfi_register.html">smfi_register</a>
87description passed to <A HREF="smfi_register.html">smfi_register</A>
84to call any message modification function. Failure to do so will
85cause the MTA to treat a call to the function as a failure of the
86filter, terminating its connection.
87
88to call any message modification function. Failure to do so will
89cause the MTA to treat a call to the function as a failure of the
90filter, terminating its connection.
91
88<p>
92<P>
89Note that the status returned indicates only whether or not the
90filter's message was successfully sent to the MTA, not whether or not
93Note that the status returned indicates only whether or not the
94filter's message was successfully sent to the MTA, not whether or not
91the MTA performed the requested operation. For example, <a
92href="smfi_addheader.html">smfi_addheader</a>, when called with an
95the MTA performed the requested operation. For example,
96<A HREF="smfi_addheader.html">smfi_addheader</A>, when called with an
93illegal header name, will return MI_SUCCESS even though the MTA may
94later refuse to add the illegal header.
97illegal header name, will return MI_SUCCESS even though the MTA may
98later refuse to add the illegal header.
95<p>
96<table border="1" cellspacing=0 cellpadding=2><tr bgcolor="#dddddd"><th>Function</th><th>Description</th><th>SMFIF_* flag</tr>
97<tr><td><a href="smfi_addheader.html">smfi_addheader</a></td><td>Add a header to
98the message.</td><td>SMFIF_ADDHDRS</td></tr>
99<P>
100<TABLE BORDER="1" CELLSPACING=0 CELLPADDING=2><TR BGCOLOR="#dddddd"><TH>Function</TH><TH>Description</TH><TH>SMFIF_* flag</TR>
101<TR><TD><A HREF="smfi_addheader.html">smfi_addheader</A></TD><TD>Add a header to
102the message.</TD><TD>SMFIF_ADDHDRS</TD></TR>
99
103
100<tr><td><a href="smfi_chgheader.html">smfi_chgheader</a></td><td>Change or delete a header.</td><td>SMFIF_CHGHDRS</td></tr>
104<TR><TD><A HREF="smfi_chgheader.html">smfi_chgheader</A></TD><TD>Change or delete a header.</TD><TD>SMFIF_CHGHDRS</TD></TR>
101
105
102<tr><td><a href="smfi_insheader.html">smfi_insheader</a></td><td>Insert a
103header into the message.</td><td>SMFIF_ADDHDRS</td></tr>
106<TR><TD><A HREF="smfi_insheader.html">smfi_insheader</A></TD><TD>Insert a
107header into the message.</TD><TD>SMFIF_ADDHDRS</TD></TR>
104
108
105<tr><td><a href="smfi_addrcpt.html">smfi_addrcpt</a></td><td>Add a recipient to
106the envelope.</td><td>SMFIF_ADDRCPT</td></tr>
109<TR><TD><A HREF="smfi_chgfrom.html">smfi_chgfrom</A></TD><TD>Change the
110envelope sender address.</TD><TD>SMFIF_CHGFROM</TD></TR>
107
111
108<tr><td><a href="smfi_delrcpt.html">smfi_delrcpt</a></td><td>Delete a recipient
109from the envelope.</td><td>SMFIF_DELRCPT</td></tr>
112<TR><TD><A HREF="smfi_addrcpt.html">smfi_addrcpt</A></TD><TD>Add a recipient to
113the envelope.</TD><TD>SMFIF_ADDRCPT</TD></TR>
110
114
111<tr><td><a href="smfi_replacebody.html">smfi_replacebody</a></td><td>Replace the
112body of the message.</td><td>SMFIF_CHGBODY</td></tr>
115<TR><TD><A HREF="smfi_addrcpt_par.html">smfi_addrcpt_par</A></TD><TD>Add
116a recipient including ESMTP parameter to the envelope.
117</TD><TD>SMFIF_ADDRCPT_PAR</TD></TR>
113
118
114</table>
119<TR><TD><A HREF="smfi_delrcpt.html">smfi_delrcpt</A></TD><TD>Delete a recipient
120from the envelope.</TD><TD>SMFIF_DELRCPT</TD></TR>
115
121
116<h2>Other Message Handling Functions</h2>
122<TR><TD><A HREF="smfi_replacebody.html">smfi_replacebody</A></TD><TD>Replace the
123body of the message.</TD><TD>SMFIF_CHGBODY</TD></TR>
117
124
125</TABLE>
126
127<H2>Other Message Handling Functions</H2>
128
118The following functions provide special case handling instructions for
119milter or the MTA, without altering the content or status of the message.
129The following functions provide special case handling instructions for
130milter or the MTA, without altering the content or status of the message.
120<b>They too may only be called in <a href="xxfi_eom.html">xxfi_eom</a></b>.
131<EM>They too may only be called in <A HREF="xxfi_eom.html">xxfi_eom</A></EM>.
121All of these functions may invoke additional communication with the MTA.
122They will return either MI_SUCCESS or MI_FAILURE to indicate the status of
123the operation.
124
132All of these functions may invoke additional communication with the MTA.
133They will return either MI_SUCCESS or MI_FAILURE to indicate the status of
134the operation.
135
125<p>
136<P>
126Note that the status returned indicates only whether or not the
127filter's message was successfully sent to the MTA, not whether or not
128the MTA performed the requested operation.
129
137Note that the status returned indicates only whether or not the
138filter's message was successfully sent to the MTA, not whether or not
139the MTA performed the requested operation.
140
130<p>
131<table border="1" cellspacing=0 cellpadding=2><tr bgcolor="#dddddd"><th>Function</th><th>Description</th></tr>
132<tr><td><a href="smfi_progress.html">smfi_progress</a></td><td>Report operation in progress.</td></tr>
141<P>
142<TABLE BORDER="1" CELLSPACING=0 CELLPADDING=2><TR BGCOLOR="#dddddd"><TH>Function</TH><TH>Description</TH></TR>
143<TR><TD><A HREF="smfi_progress.html">smfi_progress</A></TD><TD>Report operation in progress.</TD></TR>
133
144
134<tr><td><a href="smfi_quarantine.html">smfi_quarantine</a></td><td>Quarantine a message.</td></tr>
145<TR><TD><A HREF="smfi_quarantine.html">smfi_quarantine</A></TD><TD>Quarantine a message.</TD></TR>
135
146
136</table>
147</TABLE>
137
148
138<h2><a name="callbacks">Callbacks</a></h2>
149<H2><A NAME="Callbacks">Callbacks</A></H2>
139
140The filter should implement one or more of the following callbacks,
150
151The filter should implement one or more of the following callbacks,
141which are registered via <a href="smfi_register.html">smfi_register</a>:
142<p>
143<table border="1" cellspacing=0 cellpadding=2><tr bgcolor="#dddddd"><th>Function</th><th>Description</th></tr>
152which are registered via <A HREF="smfi_register.html">smfi_register</A>:
144
153
145<tr><td><a href="xxfi_connect.html">xxfi_connect</a></td><td>connection info</td></tr>
154<P>
155<TABLE BORDER="1" CELLSPACING=0 CELLPADDING=2><TR BGCOLOR="#dddddd"><TH>Function</TH><TH>Description</TH></TR>
146
156
147<tr><td><a href="xxfi_helo.html">xxfi_helo</a></td><td>SMTP HELO/EHLO command</td></tr>
157<TR><TD><A HREF="xxfi_connect.html">xxfi_connect</A></TD><TD>connection info</TD></TR>
148
158
149<tr><td><a href="xxfi_envfrom.html">xxfi_envfrom</a></td><td>envelope sender</td></tr>
159<TR><TD><A HREF="xxfi_helo.html">xxfi_helo</A></TD><TD>SMTP HELO/EHLO command</TD></TR>
150
160
151<tr><td><a href="xxfi_envrcpt.html">xxfi_envrcpt</a></td><td>envelope recipient</td></tr>
161<TR><TD><A HREF="xxfi_envfrom.html">xxfi_envfrom</A></TD><TD>envelope sender</TD></TR>
152
162
153<tr><td><a href="xxfi_header.html">xxfi_header</a></td><td>header</td></tr>
163<TR><TD><A HREF="xxfi_envrcpt.html">xxfi_envrcpt</A></TD><TD>envelope recipient</TD></TR>
154
164
155<tr><td><a href="xxfi_eoh.html">xxfi_eoh</a></td><td>end of header</td></tr>
165<TR><TD><A HREF="xxfi_data.html">xxfi_data</A></TD><TD>DATA command</TD></TR>
156
166
157<tr><td><a href="xxfi_body.html">xxfi_body</a></td><td>body block</td></tr>
167<TR><TD><A HREF="xxfi_unknown.html">xxfi_unknown</A></TD><TD>Unknown SMTP command</TD></TR>
158
168
159<tr><td><a href="xxfi_eom.html">xxfi_eom</a></td><td>end of message</td></tr>
169<TR><TD><A HREF="xxfi_header.html">xxfi_header</A></TD><TD>header</TD></TR>
160
170
161<tr><td><a href="xxfi_abort.html">xxfi_abort</a></td><td>message aborted</td></tr>
171<TR><TD><A HREF="xxfi_eoh.html">xxfi_eoh</A></TD><TD>end of header</TD></TR>
162
172
163<tr><td><a href="xxfi_close.html">xxfi_close</a></td><td>connection cleanup</td></tr>
173<TR><TD><A HREF="xxfi_body.html">xxfi_body</A></TD><TD>body block</TD></TR>
164
174
165</table>
175<TR><TD><A HREF="xxfi_eom.html">xxfi_eom</A></TD><TD>end of message</TD></TR>
166
176
167<p>
177<TR><TD><A HREF="xxfi_abort.html">xxfi_abort</A></TD><TD>message aborted</TD></TR>
178
179<TR><TD><A HREF="xxfi_close.html">xxfi_close</A></TD><TD>connection cleanup</TD></TR>
180
181<TR><TD><A HREF="xxfi_negotiate.html">xxfi_negotiate</A></TD><TD>option negotiattion</TD></TR>
182
183</TABLE>
184
185<P>
168The above callbacks should all return one of the following return values,
169having the indicated meanings. Any return other than one of the below
170values constitutes an error, and will cause sendmail to terminate its
171connection to the offending filter.
172
186The above callbacks should all return one of the following return values,
187having the indicated meanings. Any return other than one of the below
188values constitutes an error, and will cause sendmail to terminate its
189connection to the offending filter.
190
173<p><a name="conn-spec">Milter</a> distinguishes between recipient-,
191<P><A NAME="conn-spec">Milter</A> distinguishes between recipient-,
174message-, and connection-oriented routines. Recipient-oriented
175callbacks may affect the processing of a single message recipient;
176message-oriented callbacks, a single message; connection-oriented
177callbacks, an entire connection (during which multiple messages may be
178delivered to multiple sets of recipients).
192message-, and connection-oriented routines. Recipient-oriented
193callbacks may affect the processing of a single message recipient;
194message-oriented callbacks, a single message; connection-oriented
195callbacks, an entire connection (during which multiple messages may be
196delivered to multiple sets of recipients).
179<a href="xxfi_envrcpt.html">xxfi_envrcpt</a> is recipient-oriented.
180<a href="xxfi_connect.html">xxfi_connect</a>,
181<a href="xxfi_helo.html">xxfi_helo</a> and
182<a href="xxfi_close.html">xxfi_close</a> are connection-oriented. All
197<A HREF="xxfi_envrcpt.html">xxfi_envrcpt</A> is recipient-oriented.
198<A HREF="xxfi_connect.html">xxfi_connect</A>,
199<A HREF="xxfi_helo.html">xxfi_helo</A> and
200<A HREF="xxfi_close.html">xxfi_close</A> are connection-oriented. All
183other callbacks are message-oriented.
184
201other callbacks are message-oriented.
202
185<p>
186<table border="1" cellspacing=0 cellpadding=2>
187 <tr bgcolor="#dddddd"><th>Return value</th><th>Description</th></tr>
188 <tr valign="top">
189 <td>SMFIS_CONTINUE</td>
190 <td>Continue processing the current connection, message, or recipient.
191 </td>
192 </tr>
193 <tr valign="top">
194 <td>SMFIS_REJECT</td>
195 <td>For a connection-oriented routine, reject this connection; call <a href="xxfi_close.html">xxfi_close</a>.<br>
203<P>
204<TABLE BORDER="1" CELLSPACING=0 CELLPADDING=2>
205 <TR BGCOLOR="#dddddd"><TH>Return value</TH><TH>Description</TH></TR>
206 <TR VALIGN="TOP">
207 <TD>SMFIS_CONTINUE</TD>
208 <TD>Continue processing the current connection, message, or recipient.
209 </TD>
210 </TR>
211 <TR VALIGN="TOP">
212 <TD>SMFIS_REJECT</TD>
213 <TD>For a connection-oriented routine, reject this connection; call <A HREF="xxfi_close.html">xxfi_close</A>.<BR>
196 For a message-oriented routine (except
214 For a message-oriented routine (except
197 <a href="xxfi_eom.html">xxfi_eom</a> or
198 <a href="xxfi_abort.html">xxfi_abort</a>), reject this message.<br>
215 <A HREF="xxfi_eom.html">xxfi_eom</A> or
216 <A HREF="xxfi_abort.html">xxfi_abort</A>), reject this message.<BR>
199 For a recipient-oriented routine, reject the current recipient (but continue processing the current message).
217 For a recipient-oriented routine, reject the current recipient (but continue processing the current message).
200 </td>
201 </tr>
202 <tr valign="top">
203 <td>SMFIS_DISCARD</td>
204 <td>For a message- or recipient-oriented routine, accept this message, but silently discard it.<br>
218 </TD>
219 </TR>
220 <TR valign="top">
221 <TD>SMFIS_DISCARD</TD>
222 <TD>For a message- or recipient-oriented routine, accept this message, but silently discard it.<BR>
205 SMFIS_DISCARD should not be returned by a connection-oriented routine.
223 SMFIS_DISCARD should not be returned by a connection-oriented routine.
206 </td>
207 </tr>
208 <tr valign="top">
209 <td>SMFIS_ACCEPT</td>
210 <td>For a connection-oriented routine, accept this connection without further filter processing; call <a href="xxfi_close.html">xxfi_close</a>.<br>
211 For a message- or recipient-oriented routine, accept this message without further filtering.<br>
212 </td>
213 </tr>
214 <tr valign="top">
215 <td>SMFIS_TEMPFAIL</td>
216 <td>Return a temporary failure, i.e., the corresponding SMTP command will return an appropriate 4xx status code.
217 For a message-oriented routine (except <a href="xxfi_envfrom.html">xxfi_envfrom</a>), fail for this message. <br>
218 For a connection-oriented routine, fail for this connection; call <a href="xxfi_close.html">xxfi_close</a>. <br>
224 </TD>
225 </TR>
226 <TR valign="top">
227 <TD>SMFIS_ACCEPT</TD>
228 <TD>For a connection-oriented routine, accept this connection without further filter processing; call <A HREF="xxfi_close.html">xxfi_close</A>.<BR>
229 For a message- or recipient-oriented routine, accept this message without further filtering.<BR>
230 </TD>
231 </TR>
232 <TR valign="top">
233 <TD>SMFIS_TEMPFAIL</TD>
234 <TD>Return a temporary failure, i.e., the corresponding SMTP command will return an appropriate 4xx status code.
235 For a message-oriented routine (except <A HREF="xxfi_envfrom.html">xxfi_envfrom</A>), fail for this message. <BR>
236 For a connection-oriented routine, fail for this connection; call <A HREF="xxfi_close.html">xxfi_close</A>. <BR>
219 For a recipient-oriented routine, only fail for the current recipient; continue message processing.
237 For a recipient-oriented routine, only fail for the current recipient; continue message processing.
220 </td>
221 </tr>
222</table>
238 </TD>
239 </TR>
223
240
224<hr size="1">
225<font size="-1">
226Copyright (c) 2000, 2003 Sendmail, Inc. and its suppliers.
241 <TR valign="top">
242 <TD><A NAME="SMFIS_SKIP">SMFIS_SKIP</A></TD>
243 <TD>Skip further callbacks of the same type in this transaction.
244 Currently this return value is only allowed in
245 <A HREF="xxfi_body.html">xxfi_body()</A>.
246 It can be used if a milter has received sufficiently many
247 body chunks to make a decision, but still wants to invoke
248 message modification functions that are only allowed to be called from
249 <A HREF="xxfi_eom.html">xxfi_eom()</A>.
250 Note: the milter <EM>must</EM>
251 <A HREF="xxfi_negotiate.html">negotiate</A>
252 this behavior with the MTA, i.e., it must check whether
253 the protocol action
254 <A HREF="xxfi_negotiate.html#SMFIP_SKIP"><CODE>SMFIP_SKIP</CODE></A>
255 is available and if so, the milter must request it.
256 </TD>
257 </TR>
258
259 <TR valign="top">
260 <TD><A NAME="SMFIS_NOREPLY">SMFIS_NOREPLY</A></TD>
261 <TD>Do not send a reply back to the MTA.
262 The milter <EM>must</EM>
263 <A HREF="xxfi_negotiate.html">negotiate</A>
264 this behavior with the MTA, i.e., it must check whether
265 the appropriate protocol action
266 <A HREF="xxfi_negotiate.html#SMFIP_NR_"><CODE>SMFIP_NR_*</CODE></A>
267 is available and if so, the milter must request it.
268 If you set the
269 <A HREF="xxfi_negotiate.html#SMFIP_NR_"><CODE>SMFIP_NR_*</CODE></A>
270 protocol action for a callback, that callback <EM>must</EM>
271 always reply with
272 SMFIS_NOREPLY.
273 Using any other reply code is a violation of the API.
274 If in some cases your callback may return another value
275 (e.g., due to some resource shortages), then you
276 <EM>must not</EM> set
277 <A HREF="xxfi_negotiate.html#SMFIP_NR_"><CODE>SMFIP_NR_*</CODE></A>
278 and you must use
279 SMFIS_CONTINUE as the default return code.
280 (Alternatively you can try to delay reporting the problem to
281 a later callback for which
282 <A HREF="xxfi_negotiate.html#SMFIP_NR_"><CODE>SMFIP_NR_*</CODE></A>
283 is not set.)
284 </TD>
285 </TR>
286
287</TABLE>
288
289<H2><A NAME="Miscellaneous">Miscellaneous</A></H2>
290
291<P>
292<TABLE BORDER="1" CELLSPACING=0 CELLPADDING=2><TR BGCOLOR="#dddddd"><TH>Function</TH><TH>Description</TH></TR>
293
294<TR><TD><A HREF="smfi_version.html">smfi_version</A></TD><TD>libmilter (runtime) version info</TD></TR>
295
296<TR><TD><A HREF="smfi_setsymlist.html">smfi_setsymlist</A></TD><TD>
297Set the list of macros that the milter wants to receive from the MTA
298for a protocol stage.
299</TD></TR>
300
301</TABLE>
302
303<P>
304<TABLE BORDER="1" CELLSPACING=0 CELLPADDING=2><TR BGCOLOR="#dddddd"><TH>Constant</TH><TH>Description</TH></TR>
305
306<TR><TD><A HREF="smfi_version.html">SMFI_VERSION</A></TD><TD>libmilter (compile time) version info</TD></TR>
307
308</TABLE>
309
310
311<HR SIZE="1">
312<FONT SIZE="-1">
313Copyright (c) 2000, 2003, 2006 Sendmail, Inc. and its suppliers.
227All rights reserved.
314All rights reserved.
228<br>
315<BR>
229By using this file, you agree to the terms and conditions set
230forth in the LICENSE.
316By using this file, you agree to the terms and conditions set
317forth in the LICENSE.
231</font>
232</body>
233</html>
318</FONT>
319</BODY>
320</HTML>