sample.html revision 363466
1210284Sjmallett<HTML>
2232812Sjmallett<HEAD><TITLE>A Sample Filter</TITLE></HEAD>
3215990Sjmallett<BODY>
4210284Sjmallett<!--
5210284Sjmallett$Id: sample.html,v 1.23 2013-11-22 20:51:39 ca Exp $
6215990Sjmallett-->
7215990Sjmallett<H1>A Sample Filter</H1>
8215990Sjmallett
9210284SjmallettThe following sample logs each message to a separate temporary file,
10215990Sjmallettadds a recipient given with the -a flag,
11215990Sjmallettand rejects a disallowed recipient address given with the -r flag.
12210284SjmallettIt recognizes the following options:
13215990Sjmallett<P>
14215990Sjmallett<CENTER>
15215990Sjmallett<TABLE border="1" cellpadding=2 cellspacing=1>
16215990Sjmallett<TR><TD><CODE>-p port</CODE></TD><TD>The port through which the MTA will connect to the filter.</TD></TR>
17215990Sjmallett<TR><TD><CODE>-t sec</CODE></TD><TD>The timeout value.</TD></TR>
18232812Sjmallett<TR><TD><CODE>-r addr</CODE></TD><TD>A recipient to reject.</TD></TR>
19215990Sjmallett<TR><TD><CODE>-a addr</CODE></TD><TD>A recipient to add.</TD></TR>
20215990Sjmallett</TABLE>
21215990Sjmallett</CENTER>
22215990Sjmallett<HR>
23215990Sjmallett<PRE>
24215990Sjmallett#include &lt;sys/types.h&gt;
25215990Sjmallett#include &lt;sys/stat.h&gt;
26215990Sjmallett#include &lt;errno.h&gt;
27215990Sjmallett#include &lt;stdio.h&gt;
28215990Sjmallett#include &lt;stdlib.h&gt;
29232812Sjmallett#include &lt;string.h&gt;
30215990Sjmallett#include &lt;sysexits.h&gt;
31215990Sjmallett#include &lt;unistd.h&gt;
32215990Sjmallett
33215990Sjmallett#include "libmilter/mfapi.h"
34215990Sjmallett
35215990Sjmallett#ifndef bool
36215990Sjmallett# define bool	int
37215990Sjmallett# define TRUE	1
38210284Sjmallett# define FALSE	0
39210284Sjmallett#endif /* ! bool */
40210284Sjmallett
41210284Sjmallett
42210284Sjmallettstruct mlfiPriv
43210284Sjmallett{
44210284Sjmallett	char	*mlfi_fname;
45210284Sjmallett	char	*mlfi_connectfrom;
46232812Sjmallett	char	*mlfi_helofrom;
47210284Sjmallett	FILE	*mlfi_fp;
48210284Sjmallett};
49232812Sjmallett
50215990Sjmallett#define MLFIPRIV	((struct mlfiPriv *) <A href="smfi_getpriv.html">smfi_getpriv</A>(ctx))
51215990Sjmallett
52215990Sjmallettextern sfsistat		mlfi_cleanup(SMFICTX *, bool);
53215990Sjmallett
54215990Sjmallett/* recipients to add and reject (set with -a and -r options) */
55215990Sjmallettchar *add = NULL;
56210284Sjmallettchar *reject = NULL;
57215990Sjmallett
58210284Sjmallettsfsistat
59210284Sjmallett<A href="xxfi_connect.html">mlfi_connect</A>(ctx, hostname, hostaddr)
60210284Sjmallett	 SMFICTX *ctx;
61210284Sjmallett	 char *hostname;
62215990Sjmallett	 _SOCK_ADDR *hostaddr;
63210284Sjmallett{
64210284Sjmallett	struct mlfiPriv *priv;
65232812Sjmallett	char *ident;
66232812Sjmallett
67232812Sjmallett	/* allocate some private memory */
68232812Sjmallett	priv = malloc(sizeof *priv);
69232812Sjmallett	if (priv == NULL)
70232812Sjmallett	{
71232812Sjmallett		/* can't accept this message right now */
72232812Sjmallett		return SMFIS_TEMPFAIL;
73210284Sjmallett	}
74210284Sjmallett	memset(priv, '\0', sizeof *priv);
75210284Sjmallett
76210284Sjmallett	/* save the private data */
77210284Sjmallett	<A href="smfi_setpriv.html">smfi_setpriv</A>(ctx, priv);
78232812Sjmallett
79210284Sjmallett	ident = <A href="smfi_getsymval.html">smfi_getsymval</A>(ctx, "_");
80210284Sjmallett	if (ident == NULL)
81210284Sjmallett		ident = "???";
82210284Sjmallett	if ((priv-&gt;mlfi_connectfrom = strdup(ident)) == NULL)
83210284Sjmallett	{
84232812Sjmallett		(void) mlfi_cleanup(ctx, FALSE);
85215990Sjmallett		return SMFIS_TEMPFAIL;
86215990Sjmallett	}
87232812Sjmallett
88232812Sjmallett	/* continue processing */
89232812Sjmallett	return SMFIS_CONTINUE;
90210284Sjmallett}
91210284Sjmallett
92210284Sjmallettsfsistat
93232812Sjmallett<A href="xxfi_helo.html">mlfi_helo</A>(ctx, helohost)
94232812Sjmallett	 SMFICTX *ctx;
95232812Sjmallett	 char *helohost;
96210284Sjmallett{
97210284Sjmallett	size_t len;
98232812Sjmallett	char *tls;
99232812Sjmallett	char *buf;
100232812Sjmallett	struct mlfiPriv *priv = MLFIPRIV;
101232812Sjmallett
102232812Sjmallett	tls = <A href="smfi_getsymval.html">smfi_getsymval</A>(ctx, "{tls_version}");
103232812Sjmallett	if (tls == NULL)
104232812Sjmallett		tls = "No TLS";
105232812Sjmallett	if (helohost == NULL)
106232812Sjmallett		helohost = "???";
107210284Sjmallett	len = strlen(tls) + strlen(helohost) + 3;
108232812Sjmallett	if ((buf = (char*) malloc(len)) == NULL)
109210284Sjmallett	{
110210284Sjmallett		(void) mlfi_cleanup(ctx, FALSE);
111210284Sjmallett		return SMFIS_TEMPFAIL;
112210284Sjmallett	}
113232812Sjmallett	snprintf(buf, len, "%s, %s", helohost, tls);
114232812Sjmallett	if (priv-&gt;mlfi_helofrom != NULL)
115210284Sjmallett		free(priv-&gt;mlfi_helofrom);
116210284Sjmallett	priv-&gt;mlfi_helofrom = buf;
117210284Sjmallett
118210284Sjmallett	/* continue processing */
119210284Sjmallett	return SMFIS_CONTINUE;
120215990Sjmallett}
121232812Sjmallett
122210284Sjmallettsfsistat
123210284Sjmallett<A href="xxfi_envfrom.html">mlfi_envfrom</A>(ctx, argv)
124210284Sjmallett	 SMFICTX *ctx;
125210284Sjmallett	 char **argv;
126210284Sjmallett{
127210284Sjmallett	int fd = -1;
128232812Sjmallett	int argc = 0;
129232812Sjmallett	struct mlfiPriv *priv = MLFIPRIV;
130232812Sjmallett	char *mailaddr = <A href="smfi_getsymval.html">smfi_getsymval</A>(ctx, "{mail_addr}");
131215990Sjmallett
132210284Sjmallett	/* open a file to store this message */
133232812Sjmallett	if ((priv-&gt;mlfi_fname = strdup("/tmp/msg.XXXXXX")) == NULL)
134232812Sjmallett	{
135210284Sjmallett		(void) mlfi_cleanup(ctx, FALSE);
136210284Sjmallett		return SMFIS_TEMPFAIL;
137210284Sjmallett	}
138210284Sjmallett
139232812Sjmallett	if ((fd = mkstemp(priv-&gt;mlfi_fname)) == -1)
140232812Sjmallett	{
141210284Sjmallett		(void) mlfi_cleanup(ctx, FALSE);
142210284Sjmallett		return SMFIS_TEMPFAIL;
143210284Sjmallett	}
144232812Sjmallett
145232812Sjmallett	if ((priv-&gt;mlfi_fp = fdopen(fd, "w+")) == NULL)
146232812Sjmallett	{
147232812Sjmallett		(void) close(fd);
148232812Sjmallett		(void) mlfi_cleanup(ctx, FALSE);
149232812Sjmallett		return SMFIS_TEMPFAIL;
150232812Sjmallett	}
151232812Sjmallett
152232812Sjmallett	/* count the arguments */
153232812Sjmallett	while (*argv++ != NULL)
154232812Sjmallett		++argc;
155232812Sjmallett
156232812Sjmallett	/* log the connection information we stored earlier: */
157232812Sjmallett	if (fprintf(priv-&gt;mlfi_fp, "Connect from %s (%s)\n\n",
158232812Sjmallett		    priv-&gt;mlfi_helofrom, priv-&gt;mlfi_connectfrom) == EOF)
159232812Sjmallett	{
160232812Sjmallett		(void) mlfi_cleanup(ctx, FALSE);
161232812Sjmallett		return SMFIS_TEMPFAIL;
162232812Sjmallett	}
163232812Sjmallett	/* log the sender */
164232812Sjmallett	if (fprintf(priv-&gt;mlfi_fp, "FROM %s (%d argument%s)\n",
165210284Sjmallett		    mailaddr ? mailaddr : "???", argc,
166210284Sjmallett		    (argc == 1) ? "" : "s") == EOF)
167210284Sjmallett	{
168210284Sjmallett		(void) mlfi_cleanup(ctx, FALSE);
169210284Sjmallett		return SMFIS_TEMPFAIL;
170210284Sjmallett	}
171210284Sjmallett
172210284Sjmallett	/* continue processing */
173210284Sjmallett	return SMFIS_CONTINUE;
174210284Sjmallett}
175210284Sjmallett
176215990Sjmallettsfsistat
177232812Sjmallett<A href="xxfi_envrcpt.html">mlfi_envrcpt</A>(ctx, argv)
178210284Sjmallett	 SMFICTX *ctx;
179210284Sjmallett	 char **argv;
180232812Sjmallett{
181215990Sjmallett	struct mlfiPriv *priv = MLFIPRIV;
182215990Sjmallett	char *rcptaddr = <A href="smfi_getsymval.html">smfi_getsymval</A>(ctx, "{rcpt_addr}");
183232812Sjmallett	int argc = 0;
184232812Sjmallett
185210284Sjmallett	/* count the arguments */
186210284Sjmallett	while (*argv++ != NULL)
187210284Sjmallett		++argc;
188210284Sjmallett
189210284Sjmallett	/* log this recipient */
190232812Sjmallett	if (reject != NULL &amp;&amp; rcptaddr != NULL &amp;&amp;
191232812Sjmallett	    (strcasecmp(rcptaddr, reject) == 0))
192215990Sjmallett	{
193232812Sjmallett		if (fprintf(priv-&gt;mlfi_fp, "RCPT %s -- REJECTED\n",
194210284Sjmallett			    rcptaddr) == EOF)
195210284Sjmallett		{
196232812Sjmallett			(void) mlfi_cleanup(ctx, FALSE);
197215990Sjmallett			return SMFIS_TEMPFAIL;
198232812Sjmallett		}
199210284Sjmallett		return SMFIS_REJECT;
200232812Sjmallett	}
201232812Sjmallett	if (fprintf(priv-&gt;mlfi_fp, "RCPT %s (%d argument%s)\n",
202210284Sjmallett		    rcptaddr ? rcptaddr : "???", argc,
203232812Sjmallett		    (argc == 1) ? "" : "s") == EOF)
204232812Sjmallett	{
205232812Sjmallett		(void) mlfi_cleanup(ctx, FALSE);
206232812Sjmallett		return SMFIS_TEMPFAIL;
207232812Sjmallett	}
208232812Sjmallett
209232812Sjmallett	/* continue processing */
210232812Sjmallett	return SMFIS_CONTINUE;
211232812Sjmallett}
212232812Sjmallett
213232812Sjmallettsfsistat
214232812Sjmallett<A href="xxfi_header.html">mlfi_header</A>(ctx, headerf, headerv)
215232812Sjmallett	 SMFICTX *ctx;
216232812Sjmallett	 char *headerf;
217232812Sjmallett	 unsigned char *headerv;
218232812Sjmallett{
219232812Sjmallett	/* write the header to the log file */
220232812Sjmallett	if (fprintf(MLFIPRIV-&gt;mlfi_fp, "%s: %s\n", headerf, headerv) == EOF)
221232812Sjmallett	{
222232812Sjmallett		(void) mlfi_cleanup(ctx, FALSE);
223232812Sjmallett		return SMFIS_TEMPFAIL;
224232812Sjmallett	}
225232812Sjmallett
226215990Sjmallett	/* continue processing */
227215990Sjmallett	return SMFIS_CONTINUE;
228232812Sjmallett}
229232812Sjmallett
230232812Sjmallettsfsistat
231232812Sjmallett<A href="xxfi_eoh.html">mlfi_eoh</A>(ctx)
232232812Sjmallett	 SMFICTX *ctx;
233232812Sjmallett{
234232812Sjmallett	/* output the blank line between the header and the body */
235232812Sjmallett	if (fprintf(MLFIPRIV-&gt;mlfi_fp, "\n") == EOF)
236232812Sjmallett	{
237232812Sjmallett		(void) mlfi_cleanup(ctx, FALSE);
238232812Sjmallett		return SMFIS_TEMPFAIL;
239232812Sjmallett	}
240232812Sjmallett
241232812Sjmallett	/* continue processing */
242232812Sjmallett	return SMFIS_CONTINUE;
243232812Sjmallett}
244232812Sjmallett
245232812Sjmallettsfsistat
246232812Sjmallett<A href="xxfi_body.html">mlfi_body</A>(ctx, bodyp, bodylen)
247232812Sjmallett	 SMFICTX *ctx;
248232812Sjmallett	 unsigned char *bodyp;
249232812Sjmallett	 size_t bodylen;
250215990Sjmallett{
251215990Sjmallett        struct mlfiPriv *priv = MLFIPRIV;
252215990Sjmallett
253232812Sjmallett	/* output body block to log file */
254232812Sjmallett	if (fwrite(bodyp, bodylen, 1, priv-&gt;mlfi_fp) != 1)
255215990Sjmallett	{
256210284Sjmallett		/* write failed */
257215990Sjmallett		fprintf(stderr, "Couldn't write file %s: %s\n",
258215990Sjmallett			priv-&gt;mlfi_fname, strerror(errno));
259215990Sjmallett		(void) mlfi_cleanup(ctx, FALSE);
260215990Sjmallett		return SMFIS_TEMPFAIL;
261215990Sjmallett	}
262215990Sjmallett
263232812Sjmallett	/* continue processing */
264232812Sjmallett	return SMFIS_CONTINUE;
265232812Sjmallett}
266232812Sjmallett
267232812Sjmallettsfsistat
268232812Sjmallett<A href="xxfi_eom.html">mlfi_eom</A>(ctx)
269232812Sjmallett	 SMFICTX *ctx;
270232812Sjmallett{
271232812Sjmallett	bool ok = TRUE;
272232812Sjmallett
273232812Sjmallett	/* change recipients, if requested */
274232812Sjmallett	if (add != NULL)
275232812Sjmallett		ok = (<A href="smfi_addrcpt.html">smfi_addrcpt</A>(ctx, add) == MI_SUCCESS);
276232812Sjmallett	return mlfi_cleanup(ctx, ok);
277215990Sjmallett}
278232812Sjmallett
279232812Sjmallettsfsistat
280232812Sjmallett<A href="xxfi_abort.html">mlfi_abort</A>(ctx)
281215990Sjmallett	 SMFICTX *ctx;
282210284Sjmallett{
283210284Sjmallett	return mlfi_cleanup(ctx, FALSE);
284210284Sjmallett}
285210284Sjmallett
286232812Sjmallettsfsistat
287232812Sjmallettmlfi_cleanup(ctx, ok)
288232812Sjmallett	 SMFICTX *ctx;
289232812Sjmallett	 bool ok;
290232812Sjmallett{
291232812Sjmallett	sfsistat rstat = SMFIS_CONTINUE;
292232812Sjmallett	struct mlfiPriv *priv = MLFIPRIV;
293232812Sjmallett	char *p;
294232812Sjmallett	char host[512];
295232812Sjmallett	char hbuf[1024];
296232812Sjmallett
297232812Sjmallett	if (priv == NULL)
298232812Sjmallett		return rstat;
299232812Sjmallett
300232812Sjmallett	/* close the archive file */
301232812Sjmallett	if (priv-&gt;mlfi_fp != NULL &amp;&amp; fclose(priv-&gt;mlfi_fp) == EOF)
302232812Sjmallett	{
303232812Sjmallett		/* failed; we have to wait until later */
304232812Sjmallett		fprintf(stderr, "Couldn't close archive file %s: %s\n",
305232812Sjmallett			priv-&gt;mlfi_fname, strerror(errno));
306232812Sjmallett		rstat = SMFIS_TEMPFAIL;
307232812Sjmallett		(void) unlink(priv-&gt;mlfi_fname);
308232812Sjmallett	}
309232812Sjmallett	else if (ok)
310232812Sjmallett	{
311232812Sjmallett		/* add a header to the message announcing our presence */
312232812Sjmallett		if (gethostname(host, sizeof host) &lt; 0)
313232812Sjmallett			snprintf(host, sizeof host, "localhost");
314232812Sjmallett		p = strrchr(priv-&gt;mlfi_fname, '/');
315232812Sjmallett		if (p == NULL)
316232812Sjmallett			p = priv-&gt;mlfi_fname;
317232812Sjmallett		else
318232812Sjmallett			p++;
319232812Sjmallett		snprintf(hbuf, sizeof hbuf, "%s@%s", p, host);
320232812Sjmallett		if (<A href="smfi_addheader.html">smfi_addheader</A>(ctx, "X-Archived", hbuf) != MI_SUCCESS)
321232812Sjmallett		{
322232812Sjmallett			/* failed; we have to wait until later */
323232812Sjmallett			fprintf(stderr,
324232812Sjmallett				"Couldn't add header: X-Archived: %s\n",
325232812Sjmallett				hbuf);
326232812Sjmallett			ok = FALSE;
327232812Sjmallett			rstat = SMFIS_TEMPFAIL;
328210284Sjmallett			(void) unlink(priv-&gt;mlfi_fname);
329210284Sjmallett		}
330210284Sjmallett	}
331210284Sjmallett	else
332210284Sjmallett	{
333210284Sjmallett		/* message was aborted -- delete the archive file */
334210284Sjmallett		fprintf(stderr, "Message aborted.  Removing %s\n",
335210284Sjmallett			priv-&gt;mlfi_fname);
336210284Sjmallett		rstat = SMFIS_TEMPFAIL;
337210284Sjmallett		(void) unlink(priv-&gt;mlfi_fname);
338210284Sjmallett	}
339210284Sjmallett
340210284Sjmallett	/* release private memory */
341210284Sjmallett	if (priv-&gt;mlfi_fname != NULL)
342323862Semaste		free(priv-&gt;mlfi_fname);
343232812Sjmallett
344232812Sjmallett	/* return status */
345232812Sjmallett	return rstat;
346232812Sjmallett}
347210284Sjmallett
348210284Sjmallettsfsistat
349210284Sjmallett<A href="xxfi_close.html">mlfi_close</A>(ctx)
350232812Sjmallett	 SMFICTX *ctx;
351232812Sjmallett{
352232812Sjmallett	struct mlfiPriv *priv = MLFIPRIV;
353232812Sjmallett
354232812Sjmallett	if (priv == NULL)
355232812Sjmallett		return SMFIS_CONTINUE;
356210284Sjmallett	if (priv-&gt;mlfi_connectfrom != NULL)
357210284Sjmallett		free(priv-&gt;mlfi_connectfrom);
358210284Sjmallett	if (priv-&gt;mlfi_helofrom != NULL)
359210284Sjmallett		free(priv-&gt;mlfi_helofrom);
360210284Sjmallett	free(priv);
361210284Sjmallett	<A href="smfi_setpriv.html">smfi_setpriv</A>(ctx, NULL);
362210284Sjmallett	return SMFIS_CONTINUE;
363210284Sjmallett}
364232812Sjmallett
365215990Sjmallettsfsistat
366215990Sjmallett<A href="xxfi_unknown.html">mlfi_unknown</A>(ctx, cmd)
367232812Sjmallett	SMFICTX *ctx;
368232812Sjmallett	char *cmd;
369232812Sjmallett{
370215990Sjmallett	return SMFIS_CONTINUE;
371232812Sjmallett}
372232812Sjmallett
373210284Sjmallettsfsistat
374232812Sjmallett<A href="xxfi_data.html">mlfi_data</A>(ctx)
375232812Sjmallett	SMFICTX *ctx;
376232812Sjmallett{
377232812Sjmallett	return SMFIS_CONTINUE;
378232812Sjmallett}
379232812Sjmallett
380232812Sjmallettsfsistat
381232812Sjmallett<A href="xxfi_negotiate.html">mlfi_negotiate</A>(ctx, f0, f1, f2, f3, pf0, pf1, pf2, pf3)
382232812Sjmallett	SMFICTX *ctx;
383215990Sjmallett	unsigned long f0;
384232812Sjmallett	unsigned long f1;
385215990Sjmallett	unsigned long f2;
386232812Sjmallett	unsigned long f3;
387232812Sjmallett	unsigned long *pf0;
388232812Sjmallett	unsigned long *pf1;
389232812Sjmallett	unsigned long *pf2;
390232812Sjmallett	unsigned long *pf3;
391232812Sjmallett{
392215990Sjmallett	return SMFIS_ALL_OPTS;
393215990Sjmallett}
394232812Sjmallett
395232812Sjmallettstruct smfiDesc smfilter =
396215990Sjmallett{
397210284Sjmallett	"SampleFilter",	/* filter name */
398215990Sjmallett	SMFI_VERSION,	/* version code -- do not change */
399232812Sjmallett	SMFIF_ADDHDRS|SMFIF_ADDRCPT,
400232812Sjmallett			/* flags */
401232812Sjmallett	<A href="xxfi_connect.html">mlfi_connect</A>,	/* connection info filter */
402215990Sjmallett	<A href="xxfi_helo.html">mlfi_helo</A>,	/* SMTP HELO command filter */
403215990Sjmallett	<A href="xxfi_envfrom.html">mlfi_envfrom</A>,	/* envelope sender filter */
404210284Sjmallett	<A href="xxfi_envrcpt.html">mlfi_envrcpt</A>,	/* envelope recipient filter */
405215990Sjmallett	<A href="xxfi_header.html">mlfi_header</A>,	/* header filter */
406232812Sjmallett	<A href="xxfi_eoh.html">mlfi_eoh</A>,	/* end of header */
407232812Sjmallett	<A href="xxfi_body.html">mlfi_body</A>,	/* body block filter */
408232812Sjmallett	<A href="xxfi_eom.html">mlfi_eom</A>,	/* end of message */
409215990Sjmallett	<A href="xxfi_abort.html">mlfi_abort</A>,	/* message aborted */
410215990Sjmallett	<A href="xxfi_close.html">mlfi_close</A>,	/* connection cleanup */
411232812Sjmallett	<A href="xxfi_unknown.html">mlfi_unknown</A>,	/* unknown SMTP commands */
412232812Sjmallett	<A href="xxfi_data.html">mlfi_data</A>,	/* DATA command */
413215990Sjmallett	<A href="xxfi_negotiate.html">mlfi_negotiate</A>	/* Once, at the start of each SMTP connection */
414232812Sjmallett};
415232812Sjmallett
416232812Sjmallettstatic void
417232812Sjmallettusage(prog)
418210284Sjmallett	char *prog;
419215990Sjmallett{
420210284Sjmallett	fprintf(stderr,
421215990Sjmallett		"Usage: %s -p socket-addr [-t timeout] [-r reject-addr] [-a add-addr]\n",
422215990Sjmallett		prog);
423215990Sjmallett}
424210284Sjmallett
425215990Sjmallettint
426215990Sjmallettmain(argc, argv)
427215990Sjmallett	 int argc;
428215990Sjmallett	 char **argv;
429215990Sjmallett{
430210284Sjmallett	bool setconn = FALSE;
431215990Sjmallett	int c;
432210284Sjmallett	const char *args = "p:t:r:a:h";
433215990Sjmallett	extern char *optarg;
434215990Sjmallett
435215990Sjmallett	/* Process command line options */
436215990Sjmallett	while ((c = getopt(argc, argv, args)) != -1)
437215990Sjmallett	{
438210284Sjmallett		switch (c)
439215990Sjmallett		{
440215990Sjmallett		  case 'p':
441215990Sjmallett			if (optarg == NULL || *optarg == '\0')
442210284Sjmallett			{
443232812Sjmallett				(void) fprintf(stderr, "Illegal conn: %s\n",
444232812Sjmallett					       optarg);
445232812Sjmallett				exit(EX_USAGE);
446215990Sjmallett			}
447232812Sjmallett			if (<A href="smfi_setconn.html">smfi_setconn</A>(optarg) == MI_FAILURE)
448215990Sjmallett			{
449215990Sjmallett				(void) fprintf(stderr,
450215990Sjmallett					       "smfi_setconn failed\n");
451215990Sjmallett				exit(EX_SOFTWARE);
452215990Sjmallett			}
453232812Sjmallett
454232812Sjmallett			/*
455215990Sjmallett			**  If we're using a local socket, make sure it
456215990Sjmallett			**  doesn't already exist.  Don't ever run this
457215990Sjmallett			**  code as root!!
458215990Sjmallett			*/
459215990Sjmallett
460232812Sjmallett			if (strncasecmp(optarg, "unix:", 5) == 0)
461232812Sjmallett				unlink(optarg + 5);
462215990Sjmallett			else if (strncasecmp(optarg, "local:", 6) == 0)
463215990Sjmallett				unlink(optarg + 6);
464215990Sjmallett			setconn = TRUE;
465215990Sjmallett			break;
466215990Sjmallett
467215990Sjmallett		  case 't':
468215990Sjmallett			if (optarg == NULL || *optarg == '\0')
469215990Sjmallett			{
470215990Sjmallett				(void) fprintf(stderr, "Illegal timeout: %s\n",
471215990Sjmallett					       optarg);
472232812Sjmallett				exit(EX_USAGE);
473215990Sjmallett			}
474210284Sjmallett			if (<A href="smfi_settimeout.html">smfi_settimeout</A>(atoi(optarg)) == MI_FAILURE)
475210284Sjmallett			{
476210284Sjmallett				(void) fprintf(stderr,
477210284Sjmallett					       "smfi_settimeout failed\n");
478210284Sjmallett				exit(EX_SOFTWARE);
479210284Sjmallett			}
480210284Sjmallett			break;
481210284Sjmallett
482210284Sjmallett		  case 'r':
483210284Sjmallett			if (optarg == NULL)
484210284Sjmallett			{
485232812Sjmallett				(void) fprintf(stderr,
486232812Sjmallett					       "Illegal reject rcpt: %s\n",
487232812Sjmallett					       optarg);
488210284Sjmallett				exit(EX_USAGE);
489210284Sjmallett			}
490210284Sjmallett			reject = optarg;
491232812Sjmallett			break;
492210284Sjmallett
493210284Sjmallett		  case 'a':
494210284Sjmallett			if (optarg == NULL)
495210284Sjmallett			{
496210284Sjmallett				(void) fprintf(stderr,
497210284Sjmallett					       "Illegal add rcpt: %s\n",
498210284Sjmallett					       optarg);
499215990Sjmallett				exit(EX_USAGE);
500215990Sjmallett			}
501210284Sjmallett			add = optarg;
502232812Sjmallett			smfilter.xxfi_flags |= SMFIF_ADDRCPT;
503215990Sjmallett			break;
504215990Sjmallett
505215990Sjmallett		  case 'h':
506215990Sjmallett		  default:
507232812Sjmallett			usage(argv[0]);
508232812Sjmallett			exit(EX_USAGE);
509215990Sjmallett		}
510232812Sjmallett	}
511215990Sjmallett	if (!setconn)
512215990Sjmallett	{
513210284Sjmallett		fprintf(stderr, "%s: Missing required -p argument\n", argv[0]);
514232812Sjmallett		usage(argv[0]);
515232812Sjmallett		exit(EX_USAGE);
516232812Sjmallett	}
517215990Sjmallett	if (<A href="smfi_register.html">smfi_register</A>(smfilter) == MI_FAILURE)
518215990Sjmallett	{
519210284Sjmallett		fprintf(stderr, "smfi_register failed\n");
520210284Sjmallett		exit(EX_UNAVAILABLE);
521210284Sjmallett	}
522210284Sjmallett	return <A href="smfi_main.html">smfi_main</A>();
523232812Sjmallett}
524210284Sjmallett
525232812Sjmallett/* eof */
526232812Sjmallett
527232812Sjmallett</PRE>
528215990Sjmallett<HR size="1">
529215990Sjmallett<FONT size="-1">
530210284SjmallettCopyright (c) 2000-2004, 2006 Proofpoint, Inc. and its suppliers.
531215990SjmallettAll rights reserved.
532215990Sjmallett<BR>
533232812SjmallettBy using this file, you agree to the terms and conditions set
534232812Sjmallettforth in the LICENSE.
535232812Sjmallett</FONT>
536232812Sjmallett</BODY>
537232812Sjmallett</HTML>
538232812Sjmallett