xref: /freebsd/contrib/sendmail/libmilter/docs/sample.html (revision e2c0e292e8a7ca00ba99bcfccc9e637f45c3e8b1)
1d0cef73dSGregory Neil Shapiro<HTML>
2d0cef73dSGregory Neil Shapiro<HEAD><TITLE>A Sample Filter</TITLE></HEAD>
3d0cef73dSGregory Neil Shapiro<BODY>
4e92d3f3fSGregory Neil Shapiro<!--
54313cc83SGregory Neil Shapiro$Id: sample.html,v 1.23 2013-11-22 20:51:39 ca Exp $
6e92d3f3fSGregory Neil Shapiro-->
7d0cef73dSGregory Neil Shapiro<H1>A Sample Filter</H1>
840266059SGregory Neil Shapiro
940266059SGregory Neil ShapiroThe following sample logs each message to a separate temporary file,
10d0cef73dSGregory Neil Shapiroadds a recipient given with the -a flag,
11d0cef73dSGregory Neil Shapiroand rejects a disallowed recipient address given with the -r flag.
12d0cef73dSGregory Neil ShapiroIt recognizes the following options:
13d0cef73dSGregory Neil Shapiro<P>
14d0cef73dSGregory Neil Shapiro<CENTER>
15d0cef73dSGregory Neil Shapiro<TABLE border="1" cellpadding=2 cellspacing=1>
16d0cef73dSGregory Neil Shapiro<TR><TD><CODE>-p port</CODE></TD><TD>The port through which the MTA will connect to the filter.</TD></TR>
17d0cef73dSGregory Neil Shapiro<TR><TD><CODE>-t sec</CODE></TD><TD>The timeout value.</TD></TR>
18d0cef73dSGregory Neil Shapiro<TR><TD><CODE>-r addr</CODE></TD><TD>A recipient to reject.</TD></TR>
19d0cef73dSGregory Neil Shapiro<TR><TD><CODE>-a addr</CODE></TD><TD>A recipient to add.</TD></TR>
20d0cef73dSGregory Neil Shapiro</TABLE>
21d0cef73dSGregory Neil Shapiro</CENTER>
22d0cef73dSGregory Neil Shapiro<HR>
23d0cef73dSGregory Neil Shapiro<PRE>
2494c01205SGregory Neil Shapiro#include &lt;sys/types.h&gt;
2594c01205SGregory Neil Shapiro#include &lt;sys/stat.h&gt;
2694c01205SGregory Neil Shapiro#include &lt;errno.h&gt;
2740266059SGregory Neil Shapiro#include &lt;stdio.h&gt;
2840266059SGregory Neil Shapiro#include &lt;stdlib.h&gt;
2940266059SGregory Neil Shapiro#include &lt;string.h&gt;
3040266059SGregory Neil Shapiro#include &lt;sysexits.h&gt;
3140266059SGregory Neil Shapiro#include &lt;unistd.h&gt;
3294c01205SGregory Neil Shapiro
3394c01205SGregory Neil Shapiro#include "libmilter/mfapi.h"
3494c01205SGregory Neil Shapiro
3540266059SGregory Neil Shapiro#ifndef bool
3694c01205SGregory Neil Shapiro# define bool	int
3740266059SGregory Neil Shapiro# define TRUE	1
3840266059SGregory Neil Shapiro# define FALSE	0
3994c01205SGregory Neil Shapiro#endif /* ! bool */
4040266059SGregory Neil Shapiro
4140266059SGregory Neil Shapiro
4240266059SGregory Neil Shapirostruct mlfiPriv
4340266059SGregory Neil Shapiro{
4440266059SGregory Neil Shapiro	char	*mlfi_fname;
4540266059SGregory Neil Shapiro	char	*mlfi_connectfrom;
4640266059SGregory Neil Shapiro	char	*mlfi_helofrom;
4740266059SGregory Neil Shapiro	FILE	*mlfi_fp;
4840266059SGregory Neil Shapiro};
4940266059SGregory Neil Shapiro
50d0cef73dSGregory Neil Shapiro#define MLFIPRIV	((struct mlfiPriv *) <A href="smfi_getpriv.html">smfi_getpriv</A>(ctx))
5140266059SGregory Neil Shapiro
5240266059SGregory Neil Shapiroextern sfsistat		mlfi_cleanup(SMFICTX *, bool);
5394c01205SGregory Neil Shapiro
5440266059SGregory Neil Shapiro/* recipients to add and reject (set with -a and -r options) */
5594c01205SGregory Neil Shapirochar *add = NULL;
5694c01205SGregory Neil Shapirochar *reject = NULL;
5740266059SGregory Neil Shapiro
5840266059SGregory Neil Shapirosfsistat
59d0cef73dSGregory Neil Shapiro<A href="xxfi_connect.html">mlfi_connect</A>(ctx, hostname, hostaddr)
6040266059SGregory Neil Shapiro	 SMFICTX *ctx;
6140266059SGregory Neil Shapiro	 char *hostname;
6240266059SGregory Neil Shapiro	 _SOCK_ADDR *hostaddr;
6340266059SGregory Neil Shapiro{
6440266059SGregory Neil Shapiro	struct mlfiPriv *priv;
6540266059SGregory Neil Shapiro	char *ident;
6640266059SGregory Neil Shapiro
6740266059SGregory Neil Shapiro	/* allocate some private memory */
6840266059SGregory Neil Shapiro	priv = malloc(sizeof *priv);
6940266059SGregory Neil Shapiro	if (priv == NULL)
7040266059SGregory Neil Shapiro	{
7140266059SGregory Neil Shapiro		/* can't accept this message right now */
7240266059SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
7340266059SGregory Neil Shapiro	}
7440266059SGregory Neil Shapiro	memset(priv, '\0', sizeof *priv);
7540266059SGregory Neil Shapiro
7640266059SGregory Neil Shapiro	/* save the private data */
77d0cef73dSGregory Neil Shapiro	<A href="smfi_setpriv.html">smfi_setpriv</A>(ctx, priv);
7840266059SGregory Neil Shapiro
79d0cef73dSGregory Neil Shapiro	ident = <A href="smfi_getsymval.html">smfi_getsymval</A>(ctx, "_");
8094c01205SGregory Neil Shapiro	if (ident == NULL)
8194c01205SGregory Neil Shapiro		ident = "???";
8294c01205SGregory Neil Shapiro	if ((priv-&gt;mlfi_connectfrom = strdup(ident)) == NULL)
8394c01205SGregory Neil Shapiro	{
8494c01205SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
8540266059SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
8640266059SGregory Neil Shapiro	}
8794c01205SGregory Neil Shapiro
8894c01205SGregory Neil Shapiro	/* continue processing */
8940266059SGregory Neil Shapiro	return SMFIS_CONTINUE;
9040266059SGregory Neil Shapiro}
9140266059SGregory Neil Shapiro
9240266059SGregory Neil Shapirosfsistat
93d0cef73dSGregory Neil Shapiro<A href="xxfi_helo.html">mlfi_helo</A>(ctx, helohost)
9440266059SGregory Neil Shapiro	 SMFICTX *ctx;
9540266059SGregory Neil Shapiro	 char *helohost;
9640266059SGregory Neil Shapiro{
9794c01205SGregory Neil Shapiro	size_t len;
9840266059SGregory Neil Shapiro	char *tls;
9940266059SGregory Neil Shapiro	char *buf;
10040266059SGregory Neil Shapiro	struct mlfiPriv *priv = MLFIPRIV;
10194c01205SGregory Neil Shapiro
102d0cef73dSGregory Neil Shapiro	tls = <A href="smfi_getsymval.html">smfi_getsymval</A>(ctx, "{tls_version}");
10394c01205SGregory Neil Shapiro	if (tls == NULL)
10494c01205SGregory Neil Shapiro		tls = "No TLS";
10594c01205SGregory Neil Shapiro	if (helohost == NULL)
10694c01205SGregory Neil Shapiro		helohost = "???";
10794c01205SGregory Neil Shapiro	len = strlen(tls) + strlen(helohost) + 3;
10894c01205SGregory Neil Shapiro	if ((buf = (char*) malloc(len)) == NULL)
10994c01205SGregory Neil Shapiro	{
11094c01205SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
11140266059SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
11240266059SGregory Neil Shapiro	}
11394c01205SGregory Neil Shapiro	snprintf(buf, len, "%s, %s", helohost, tls);
11494c01205SGregory Neil Shapiro	if (priv-&gt;mlfi_helofrom != NULL)
11540266059SGregory Neil Shapiro		free(priv-&gt;mlfi_helofrom);
11640266059SGregory Neil Shapiro	priv-&gt;mlfi_helofrom = buf;
11794c01205SGregory Neil Shapiro
11894c01205SGregory Neil Shapiro	/* continue processing */
11940266059SGregory Neil Shapiro	return SMFIS_CONTINUE;
12040266059SGregory Neil Shapiro}
12140266059SGregory Neil Shapiro
12240266059SGregory Neil Shapirosfsistat
123d0cef73dSGregory Neil Shapiro<A href="xxfi_envfrom.html">mlfi_envfrom</A>(ctx, argv)
12440266059SGregory Neil Shapiro	 SMFICTX *ctx;
12540266059SGregory Neil Shapiro	 char **argv;
12640266059SGregory Neil Shapiro{
127e92d3f3fSGregory Neil Shapiro	int fd = -1;
128e92d3f3fSGregory Neil Shapiro	int argc = 0;
12940266059SGregory Neil Shapiro	struct mlfiPriv *priv = MLFIPRIV;
130d0cef73dSGregory Neil Shapiro	char *mailaddr = <A href="smfi_getsymval.html">smfi_getsymval</A>(ctx, "{mail_addr}");
13140266059SGregory Neil Shapiro
13240266059SGregory Neil Shapiro	/* open a file to store this message */
13394c01205SGregory Neil Shapiro	if ((priv-&gt;mlfi_fname = strdup("/tmp/msg.XXXXXX")) == NULL)
13494c01205SGregory Neil Shapiro	{
13594c01205SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
13640266059SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
13794c01205SGregory Neil Shapiro	}
13894c01205SGregory Neil Shapiro
139e92d3f3fSGregory Neil Shapiro	if ((fd = mkstemp(priv-&gt;mlfi_fname)) == -1)
14094c01205SGregory Neil Shapiro	{
14194c01205SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
14294c01205SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
14394c01205SGregory Neil Shapiro	}
14494c01205SGregory Neil Shapiro
145e92d3f3fSGregory Neil Shapiro	if ((priv-&gt;mlfi_fp = fdopen(fd, "w+")) == NULL)
14640266059SGregory Neil Shapiro	{
147e92d3f3fSGregory Neil Shapiro		(void) close(fd);
14894c01205SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
14940266059SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
15040266059SGregory Neil Shapiro	}
15140266059SGregory Neil Shapiro
15240266059SGregory Neil Shapiro	/* count the arguments */
15394c01205SGregory Neil Shapiro	while (*argv++ != NULL)
15494c01205SGregory Neil Shapiro		++argc;
15594c01205SGregory Neil Shapiro
15640266059SGregory Neil Shapiro	/* log the connection information we stored earlier: */
15740266059SGregory Neil Shapiro	if (fprintf(priv-&gt;mlfi_fp, "Connect from %s (%s)\n\n",
15894c01205SGregory Neil Shapiro		    priv-&gt;mlfi_helofrom, priv-&gt;mlfi_connectfrom) == EOF)
15994c01205SGregory Neil Shapiro	{
16040266059SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
16140266059SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
16240266059SGregory Neil Shapiro	}
16340266059SGregory Neil Shapiro	/* log the sender */
16440266059SGregory Neil Shapiro	if (fprintf(priv-&gt;mlfi_fp, "FROM %s (%d argument%s)\n",
16540266059SGregory Neil Shapiro		    mailaddr ? mailaddr : "???", argc,
16694c01205SGregory Neil Shapiro		    (argc == 1) ? "" : "s") == EOF)
16794c01205SGregory Neil Shapiro	{
16840266059SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
16940266059SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
17040266059SGregory Neil Shapiro	}
17194c01205SGregory Neil Shapiro
17240266059SGregory Neil Shapiro	/* continue processing */
17340266059SGregory Neil Shapiro	return SMFIS_CONTINUE;
17440266059SGregory Neil Shapiro}
17540266059SGregory Neil Shapiro
17640266059SGregory Neil Shapirosfsistat
177d0cef73dSGregory Neil Shapiro<A href="xxfi_envrcpt.html">mlfi_envrcpt</A>(ctx, argv)
17840266059SGregory Neil Shapiro	 SMFICTX *ctx;
17940266059SGregory Neil Shapiro	 char **argv;
18040266059SGregory Neil Shapiro{
18140266059SGregory Neil Shapiro	struct mlfiPriv *priv = MLFIPRIV;
182d0cef73dSGregory Neil Shapiro	char *rcptaddr = <A href="smfi_getsymval.html">smfi_getsymval</A>(ctx, "{rcpt_addr}");
18340266059SGregory Neil Shapiro	int argc = 0;
18494c01205SGregory Neil Shapiro
18540266059SGregory Neil Shapiro	/* count the arguments */
18694c01205SGregory Neil Shapiro	while (*argv++ != NULL)
18794c01205SGregory Neil Shapiro		++argc;
18894c01205SGregory Neil Shapiro
18940266059SGregory Neil Shapiro	/* log this recipient */
190*5b0945b5SGregory Neil Shapiro	if (reject != NULL &amp;&amp; rcptaddr != NULL &amp;&amp;
19194c01205SGregory Neil Shapiro	    (strcasecmp(rcptaddr, reject) == 0))
19294c01205SGregory Neil Shapiro	{
19394c01205SGregory Neil Shapiro		if (fprintf(priv-&gt;mlfi_fp, "RCPT %s -- REJECTED\n",
19494c01205SGregory Neil Shapiro			    rcptaddr) == EOF)
19594c01205SGregory Neil Shapiro		{
19640266059SGregory Neil Shapiro			(void) mlfi_cleanup(ctx, FALSE);
19740266059SGregory Neil Shapiro			return SMFIS_TEMPFAIL;
19840266059SGregory Neil Shapiro		}
19940266059SGregory Neil Shapiro		return SMFIS_REJECT;
20040266059SGregory Neil Shapiro	}
20140266059SGregory Neil Shapiro	if (fprintf(priv-&gt;mlfi_fp, "RCPT %s (%d argument%s)\n",
20240266059SGregory Neil Shapiro		    rcptaddr ? rcptaddr : "???", argc,
20394c01205SGregory Neil Shapiro		    (argc == 1) ? "" : "s") == EOF)
20494c01205SGregory Neil Shapiro	{
20540266059SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
20640266059SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
20740266059SGregory Neil Shapiro	}
20894c01205SGregory Neil Shapiro
20940266059SGregory Neil Shapiro	/* continue processing */
21040266059SGregory Neil Shapiro	return SMFIS_CONTINUE;
21140266059SGregory Neil Shapiro}
21240266059SGregory Neil Shapiro
21340266059SGregory Neil Shapirosfsistat
214d0cef73dSGregory Neil Shapiro<A href="xxfi_header.html">mlfi_header</A>(ctx, headerf, headerv)
21540266059SGregory Neil Shapiro	 SMFICTX *ctx;
21640266059SGregory Neil Shapiro	 char *headerf;
21740266059SGregory Neil Shapiro	 unsigned char *headerv;
21840266059SGregory Neil Shapiro{
21940266059SGregory Neil Shapiro	/* write the header to the log file */
22094c01205SGregory Neil Shapiro	if (fprintf(MLFIPRIV-&gt;mlfi_fp, "%s: %s\n", headerf, headerv) == EOF)
22194c01205SGregory Neil Shapiro	{
22294c01205SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
22394c01205SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
22494c01205SGregory Neil Shapiro	}
22540266059SGregory Neil Shapiro
22640266059SGregory Neil Shapiro	/* continue processing */
22740266059SGregory Neil Shapiro	return SMFIS_CONTINUE;
22840266059SGregory Neil Shapiro}
22940266059SGregory Neil Shapiro
23040266059SGregory Neil Shapirosfsistat
231d0cef73dSGregory Neil Shapiro<A href="xxfi_eoh.html">mlfi_eoh</A>(ctx)
23240266059SGregory Neil Shapiro	 SMFICTX *ctx;
23340266059SGregory Neil Shapiro{
23440266059SGregory Neil Shapiro	/* output the blank line between the header and the body */
23594c01205SGregory Neil Shapiro	if (fprintf(MLFIPRIV-&gt;mlfi_fp, "\n") == EOF)
23694c01205SGregory Neil Shapiro	{
23794c01205SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
23894c01205SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
23994c01205SGregory Neil Shapiro	}
24040266059SGregory Neil Shapiro
24140266059SGregory Neil Shapiro	/* continue processing */
24240266059SGregory Neil Shapiro	return SMFIS_CONTINUE;
24340266059SGregory Neil Shapiro}
24440266059SGregory Neil Shapiro
24540266059SGregory Neil Shapirosfsistat
246d0cef73dSGregory Neil Shapiro<A href="xxfi_body.html">mlfi_body</A>(ctx, bodyp, bodylen)
24740266059SGregory Neil Shapiro	 SMFICTX *ctx;
24840266059SGregory Neil Shapiro	 unsigned char *bodyp;
24940266059SGregory Neil Shapiro	 size_t bodylen;
25040266059SGregory Neil Shapiro{
25194c01205SGregory Neil Shapiro        struct mlfiPriv *priv = MLFIPRIV;
25294c01205SGregory Neil Shapiro
25340266059SGregory Neil Shapiro	/* output body block to log file */
25494c01205SGregory Neil Shapiro	if (fwrite(bodyp, bodylen, 1, priv-&gt;mlfi_fp) != 1)
25540266059SGregory Neil Shapiro	{
25640266059SGregory Neil Shapiro		/* write failed */
25794c01205SGregory Neil Shapiro		fprintf(stderr, "Couldn't write file %s: %s\n",
25894c01205SGregory Neil Shapiro			priv-&gt;mlfi_fname, strerror(errno));
25940266059SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
26040266059SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
26140266059SGregory Neil Shapiro	}
26240266059SGregory Neil Shapiro
26340266059SGregory Neil Shapiro	/* continue processing */
26440266059SGregory Neil Shapiro	return SMFIS_CONTINUE;
26540266059SGregory Neil Shapiro}
26640266059SGregory Neil Shapiro
26740266059SGregory Neil Shapirosfsistat
268d0cef73dSGregory Neil Shapiro<A href="xxfi_eom.html">mlfi_eom</A>(ctx)
26940266059SGregory Neil Shapiro	 SMFICTX *ctx;
27040266059SGregory Neil Shapiro{
27140266059SGregory Neil Shapiro	bool ok = TRUE;
27294c01205SGregory Neil Shapiro
27340266059SGregory Neil Shapiro	/* change recipients, if requested */
27494c01205SGregory Neil Shapiro	if (add != NULL)
275d0cef73dSGregory Neil Shapiro		ok = (<A href="smfi_addrcpt.html">smfi_addrcpt</A>(ctx, add) == MI_SUCCESS);
27640266059SGregory Neil Shapiro	return mlfi_cleanup(ctx, ok);
27740266059SGregory Neil Shapiro}
27840266059SGregory Neil Shapiro
27940266059SGregory Neil Shapirosfsistat
280d0cef73dSGregory Neil Shapiro<A href="xxfi_abort.html">mlfi_abort</A>(ctx)
28140266059SGregory Neil Shapiro	 SMFICTX *ctx;
28240266059SGregory Neil Shapiro{
28340266059SGregory Neil Shapiro	return mlfi_cleanup(ctx, FALSE);
28440266059SGregory Neil Shapiro}
28540266059SGregory Neil Shapiro
28640266059SGregory Neil Shapirosfsistat
28740266059SGregory Neil Shapiromlfi_cleanup(ctx, ok)
28840266059SGregory Neil Shapiro	 SMFICTX *ctx;
28940266059SGregory Neil Shapiro	 bool ok;
29040266059SGregory Neil Shapiro{
29140266059SGregory Neil Shapiro	sfsistat rstat = SMFIS_CONTINUE;
29240266059SGregory Neil Shapiro	struct mlfiPriv *priv = MLFIPRIV;
29340266059SGregory Neil Shapiro	char *p;
29440266059SGregory Neil Shapiro	char host[512];
29540266059SGregory Neil Shapiro	char hbuf[1024];
29640266059SGregory Neil Shapiro
29740266059SGregory Neil Shapiro	if (priv == NULL)
29840266059SGregory Neil Shapiro		return rstat;
29940266059SGregory Neil Shapiro
30040266059SGregory Neil Shapiro	/* close the archive file */
301*5b0945b5SGregory Neil Shapiro	if (priv-&gt;mlfi_fp != NULL &amp;&amp; fclose(priv-&gt;mlfi_fp) == EOF)
30240266059SGregory Neil Shapiro	{
30340266059SGregory Neil Shapiro		/* failed; we have to wait until later */
30440266059SGregory Neil Shapiro		fprintf(stderr, "Couldn't close archive file %s: %s\n",
30540266059SGregory Neil Shapiro			priv-&gt;mlfi_fname, strerror(errno));
30640266059SGregory Neil Shapiro		rstat = SMFIS_TEMPFAIL;
30740266059SGregory Neil Shapiro		(void) unlink(priv-&gt;mlfi_fname);
30840266059SGregory Neil Shapiro	}
30940266059SGregory Neil Shapiro	else if (ok)
31040266059SGregory Neil Shapiro	{
31140266059SGregory Neil Shapiro		/* add a header to the message announcing our presence */
31240266059SGregory Neil Shapiro		if (gethostname(host, sizeof host) &lt; 0)
31394c01205SGregory Neil Shapiro			snprintf(host, sizeof host, "localhost");
31440266059SGregory Neil Shapiro		p = strrchr(priv-&gt;mlfi_fname, '/');
31540266059SGregory Neil Shapiro		if (p == NULL)
31640266059SGregory Neil Shapiro			p = priv-&gt;mlfi_fname;
31740266059SGregory Neil Shapiro		else
31840266059SGregory Neil Shapiro			p++;
31940266059SGregory Neil Shapiro		snprintf(hbuf, sizeof hbuf, "%s@%s", p, host);
320d0cef73dSGregory Neil Shapiro		if (<A href="smfi_addheader.html">smfi_addheader</A>(ctx, "X-Archived", hbuf) != MI_SUCCESS)
32194c01205SGregory Neil Shapiro		{
32294c01205SGregory Neil Shapiro			/* failed; we have to wait until later */
32394c01205SGregory Neil Shapiro			fprintf(stderr,
32494c01205SGregory Neil Shapiro				"Couldn't add header: X-Archived: %s\n",
32594c01205SGregory Neil Shapiro				hbuf);
32694c01205SGregory Neil Shapiro			ok = FALSE;
32794c01205SGregory Neil Shapiro			rstat = SMFIS_TEMPFAIL;
32894c01205SGregory Neil Shapiro			(void) unlink(priv-&gt;mlfi_fname);
32994c01205SGregory Neil Shapiro		}
33040266059SGregory Neil Shapiro	}
33140266059SGregory Neil Shapiro	else
33240266059SGregory Neil Shapiro	{
33340266059SGregory Neil Shapiro		/* message was aborted -- delete the archive file */
33440266059SGregory Neil Shapiro		fprintf(stderr, "Message aborted.  Removing %s\n",
33540266059SGregory Neil Shapiro			priv-&gt;mlfi_fname);
33640266059SGregory Neil Shapiro		rstat = SMFIS_TEMPFAIL;
33740266059SGregory Neil Shapiro		(void) unlink(priv-&gt;mlfi_fname);
33840266059SGregory Neil Shapiro	}
33940266059SGregory Neil Shapiro
34040266059SGregory Neil Shapiro	/* release private memory */
34194c01205SGregory Neil Shapiro	if (priv-&gt;mlfi_fname != NULL)
34240266059SGregory Neil Shapiro		free(priv-&gt;mlfi_fname);
34340266059SGregory Neil Shapiro
34440266059SGregory Neil Shapiro	/* return status */
34540266059SGregory Neil Shapiro	return rstat;
34640266059SGregory Neil Shapiro}
34740266059SGregory Neil Shapiro
34840266059SGregory Neil Shapirosfsistat
349d0cef73dSGregory Neil Shapiro<A href="xxfi_close.html">mlfi_close</A>(ctx)
35040266059SGregory Neil Shapiro	 SMFICTX *ctx;
35140266059SGregory Neil Shapiro{
35240266059SGregory Neil Shapiro	struct mlfiPriv *priv = MLFIPRIV;
35394c01205SGregory Neil Shapiro
35494c01205SGregory Neil Shapiro	if (priv == NULL)
35594c01205SGregory Neil Shapiro		return SMFIS_CONTINUE;
35694c01205SGregory Neil Shapiro	if (priv-&gt;mlfi_connectfrom != NULL)
35740266059SGregory Neil Shapiro		free(priv-&gt;mlfi_connectfrom);
35894c01205SGregory Neil Shapiro	if (priv-&gt;mlfi_helofrom != NULL)
35940266059SGregory Neil Shapiro		free(priv-&gt;mlfi_helofrom);
36040266059SGregory Neil Shapiro	free(priv);
361d0cef73dSGregory Neil Shapiro	<A href="smfi_setpriv.html">smfi_setpriv</A>(ctx, NULL);
36240266059SGregory Neil Shapiro	return SMFIS_CONTINUE;
36340266059SGregory Neil Shapiro}
36440266059SGregory Neil Shapiro
365d0cef73dSGregory Neil Shapirosfsistat
366d0cef73dSGregory Neil Shapiro<A href="xxfi_unknown.html">mlfi_unknown</A>(ctx, cmd)
367d0cef73dSGregory Neil Shapiro	SMFICTX *ctx;
368d0cef73dSGregory Neil Shapiro	char *cmd;
369d0cef73dSGregory Neil Shapiro{
370d0cef73dSGregory Neil Shapiro	return SMFIS_CONTINUE;
371d0cef73dSGregory Neil Shapiro}
372d0cef73dSGregory Neil Shapiro
373d0cef73dSGregory Neil Shapirosfsistat
374d0cef73dSGregory Neil Shapiro<A href="xxfi_data.html">mlfi_data</A>(ctx)
375d0cef73dSGregory Neil Shapiro	SMFICTX *ctx;
376d0cef73dSGregory Neil Shapiro{
377d0cef73dSGregory Neil Shapiro	return SMFIS_CONTINUE;
378d0cef73dSGregory Neil Shapiro}
379d0cef73dSGregory Neil Shapiro
380d0cef73dSGregory Neil Shapirosfsistat
381d0cef73dSGregory Neil Shapiro<A href="xxfi_negotiate.html">mlfi_negotiate</A>(ctx, f0, f1, f2, f3, pf0, pf1, pf2, pf3)
382d0cef73dSGregory Neil Shapiro	SMFICTX *ctx;
383d0cef73dSGregory Neil Shapiro	unsigned long f0;
384d0cef73dSGregory Neil Shapiro	unsigned long f1;
385d0cef73dSGregory Neil Shapiro	unsigned long f2;
386d0cef73dSGregory Neil Shapiro	unsigned long f3;
387d0cef73dSGregory Neil Shapiro	unsigned long *pf0;
388d0cef73dSGregory Neil Shapiro	unsigned long *pf1;
389d0cef73dSGregory Neil Shapiro	unsigned long *pf2;
390d0cef73dSGregory Neil Shapiro	unsigned long *pf3;
391d0cef73dSGregory Neil Shapiro{
392d0cef73dSGregory Neil Shapiro	return SMFIS_ALL_OPTS;
393d0cef73dSGregory Neil Shapiro}
394d0cef73dSGregory Neil Shapiro
39540266059SGregory Neil Shapirostruct smfiDesc smfilter =
39640266059SGregory Neil Shapiro{
39740266059SGregory Neil Shapiro	"SampleFilter",	/* filter name */
39840266059SGregory Neil Shapiro	SMFI_VERSION,	/* version code -- do not change */
399e92d3f3fSGregory Neil Shapiro	SMFIF_ADDHDRS|SMFIF_ADDRCPT,
400e92d3f3fSGregory Neil Shapiro			/* flags */
401d0cef73dSGregory Neil Shapiro	<A href="xxfi_connect.html">mlfi_connect</A>,	/* connection info filter */
402d0cef73dSGregory Neil Shapiro	<A href="xxfi_helo.html">mlfi_helo</A>,	/* SMTP HELO command filter */
403d0cef73dSGregory Neil Shapiro	<A href="xxfi_envfrom.html">mlfi_envfrom</A>,	/* envelope sender filter */
404d0cef73dSGregory Neil Shapiro	<A href="xxfi_envrcpt.html">mlfi_envrcpt</A>,	/* envelope recipient filter */
405d0cef73dSGregory Neil Shapiro	<A href="xxfi_header.html">mlfi_header</A>,	/* header filter */
406d0cef73dSGregory Neil Shapiro	<A href="xxfi_eoh.html">mlfi_eoh</A>,	/* end of header */
407d0cef73dSGregory Neil Shapiro	<A href="xxfi_body.html">mlfi_body</A>,	/* body block filter */
408d0cef73dSGregory Neil Shapiro	<A href="xxfi_eom.html">mlfi_eom</A>,	/* end of message */
409d0cef73dSGregory Neil Shapiro	<A href="xxfi_abort.html">mlfi_abort</A>,	/* message aborted */
410d0cef73dSGregory Neil Shapiro	<A href="xxfi_close.html">mlfi_close</A>,	/* connection cleanup */
411d0cef73dSGregory Neil Shapiro	<A href="xxfi_unknown.html">mlfi_unknown</A>,	/* unknown SMTP commands */
412d0cef73dSGregory Neil Shapiro	<A href="xxfi_data.html">mlfi_data</A>,	/* DATA command */
413d0cef73dSGregory Neil Shapiro	<A href="xxfi_negotiate.html">mlfi_negotiate</A>	/* Once, at the start of each SMTP connection */
41440266059SGregory Neil Shapiro};
41540266059SGregory Neil Shapiro
41640266059SGregory Neil Shapirostatic void
41794c01205SGregory Neil Shapirousage(prog)
41894c01205SGregory Neil Shapiro	char *prog;
41940266059SGregory Neil Shapiro{
42040266059SGregory Neil Shapiro	fprintf(stderr,
421a7ec597cSGregory Neil Shapiro		"Usage: %s -p socket-addr [-t timeout] [-r reject-addr] [-a add-addr]\n",
42294c01205SGregory Neil Shapiro		prog);
42340266059SGregory Neil Shapiro}
42440266059SGregory Neil Shapiro
42540266059SGregory Neil Shapiroint
42640266059SGregory Neil Shapiromain(argc, argv)
42740266059SGregory Neil Shapiro	 int argc;
42894c01205SGregory Neil Shapiro	 char **argv;
42940266059SGregory Neil Shapiro{
430a7ec597cSGregory Neil Shapiro	bool setconn = FALSE;
43194c01205SGregory Neil Shapiro	int c;
43240266059SGregory Neil Shapiro	const char *args = "p:t:r:a:h";
43340266059SGregory Neil Shapiro	extern char *optarg;
43440266059SGregory Neil Shapiro
43540266059SGregory Neil Shapiro	/* Process command line options */
43694c01205SGregory Neil Shapiro	while ((c = getopt(argc, argv, args)) != -1)
43740266059SGregory Neil Shapiro	{
43840266059SGregory Neil Shapiro		switch (c)
43940266059SGregory Neil Shapiro		{
44040266059SGregory Neil Shapiro		  case 'p':
44140266059SGregory Neil Shapiro			if (optarg == NULL || *optarg == '\0')
44240266059SGregory Neil Shapiro			{
44340266059SGregory Neil Shapiro				(void) fprintf(stderr, "Illegal conn: %s\n",
44440266059SGregory Neil Shapiro					       optarg);
44540266059SGregory Neil Shapiro				exit(EX_USAGE);
44640266059SGregory Neil Shapiro			}
447d0cef73dSGregory Neil Shapiro			if (<A href="smfi_setconn.html">smfi_setconn</A>(optarg) == MI_FAILURE)
44840266059SGregory Neil Shapiro			{
44994c01205SGregory Neil Shapiro				(void) fprintf(stderr,
45094c01205SGregory Neil Shapiro					       "smfi_setconn failed\n");
45140266059SGregory Neil Shapiro				exit(EX_SOFTWARE);
45240266059SGregory Neil Shapiro			}
45394c01205SGregory Neil Shapiro
45440266059SGregory Neil Shapiro			/*
45594c01205SGregory Neil Shapiro			**  If we're using a local socket, make sure it
45694c01205SGregory Neil Shapiro			**  doesn't already exist.  Don't ever run this
45794c01205SGregory Neil Shapiro			**  code as root!!
45840266059SGregory Neil Shapiro			*/
45994c01205SGregory Neil Shapiro
46094c01205SGregory Neil Shapiro			if (strncasecmp(optarg, "unix:", 5) == 0)
46140266059SGregory Neil Shapiro				unlink(optarg + 5);
46294c01205SGregory Neil Shapiro			else if (strncasecmp(optarg, "local:", 6) == 0)
46340266059SGregory Neil Shapiro				unlink(optarg + 6);
464a7ec597cSGregory Neil Shapiro			setconn = TRUE;
46540266059SGregory Neil Shapiro			break;
46640266059SGregory Neil Shapiro
46740266059SGregory Neil Shapiro		  case 't':
46840266059SGregory Neil Shapiro			if (optarg == NULL || *optarg == '\0')
46940266059SGregory Neil Shapiro			{
47040266059SGregory Neil Shapiro				(void) fprintf(stderr, "Illegal timeout: %s\n",
47140266059SGregory Neil Shapiro					       optarg);
47240266059SGregory Neil Shapiro				exit(EX_USAGE);
47340266059SGregory Neil Shapiro			}
474d0cef73dSGregory Neil Shapiro			if (<A href="smfi_settimeout.html">smfi_settimeout</A>(atoi(optarg)) == MI_FAILURE)
47540266059SGregory Neil Shapiro			{
47694c01205SGregory Neil Shapiro				(void) fprintf(stderr,
47794c01205SGregory Neil Shapiro					       "smfi_settimeout failed\n");
47840266059SGregory Neil Shapiro				exit(EX_SOFTWARE);
47940266059SGregory Neil Shapiro			}
48040266059SGregory Neil Shapiro			break;
48140266059SGregory Neil Shapiro
48240266059SGregory Neil Shapiro		  case 'r':
48340266059SGregory Neil Shapiro			if (optarg == NULL)
48440266059SGregory Neil Shapiro			{
48594c01205SGregory Neil Shapiro				(void) fprintf(stderr,
48694c01205SGregory Neil Shapiro					       "Illegal reject rcpt: %s\n",
48740266059SGregory Neil Shapiro					       optarg);
48840266059SGregory Neil Shapiro				exit(EX_USAGE);
48940266059SGregory Neil Shapiro			}
49040266059SGregory Neil Shapiro			reject = optarg;
49140266059SGregory Neil Shapiro			break;
49240266059SGregory Neil Shapiro
49340266059SGregory Neil Shapiro		  case 'a':
49440266059SGregory Neil Shapiro			if (optarg == NULL)
49540266059SGregory Neil Shapiro			{
49694c01205SGregory Neil Shapiro				(void) fprintf(stderr,
49794c01205SGregory Neil Shapiro					       "Illegal add rcpt: %s\n",
49840266059SGregory Neil Shapiro					       optarg);
49940266059SGregory Neil Shapiro				exit(EX_USAGE);
50040266059SGregory Neil Shapiro			}
50140266059SGregory Neil Shapiro			add = optarg;
50240266059SGregory Neil Shapiro			smfilter.xxfi_flags |= SMFIF_ADDRCPT;
50340266059SGregory Neil Shapiro			break;
50494c01205SGregory Neil Shapiro
50540266059SGregory Neil Shapiro		  case 'h':
50640266059SGregory Neil Shapiro		  default:
50794c01205SGregory Neil Shapiro			usage(argv[0]);
50894c01205SGregory Neil Shapiro			exit(EX_USAGE);
50940266059SGregory Neil Shapiro		}
51040266059SGregory Neil Shapiro	}
511a7ec597cSGregory Neil Shapiro	if (!setconn)
512a7ec597cSGregory Neil Shapiro	{
513a7ec597cSGregory Neil Shapiro		fprintf(stderr, "%s: Missing required -p argument\n", argv[0]);
514a7ec597cSGregory Neil Shapiro		usage(argv[0]);
515a7ec597cSGregory Neil Shapiro		exit(EX_USAGE);
516a7ec597cSGregory Neil Shapiro	}
517d0cef73dSGregory Neil Shapiro	if (<A href="smfi_register.html">smfi_register</A>(smfilter) == MI_FAILURE)
51840266059SGregory Neil Shapiro	{
51940266059SGregory Neil Shapiro		fprintf(stderr, "smfi_register failed\n");
52040266059SGregory Neil Shapiro		exit(EX_UNAVAILABLE);
52140266059SGregory Neil Shapiro	}
522d0cef73dSGregory Neil Shapiro	return <A href="smfi_main.html">smfi_main</A>();
52340266059SGregory Neil Shapiro}
52440266059SGregory Neil Shapiro
52540266059SGregory Neil Shapiro/* eof */
52640266059SGregory Neil Shapiro
527d0cef73dSGregory Neil Shapiro</PRE>
528d0cef73dSGregory Neil Shapiro<HR size="1">
529d0cef73dSGregory Neil Shapiro<FONT size="-1">
5305dd76dd0SGregory Neil ShapiroCopyright (c) 2000-2004, 2006 Proofpoint, Inc. and its suppliers.
53140266059SGregory Neil ShapiroAll rights reserved.
532d0cef73dSGregory Neil Shapiro<BR>
53340266059SGregory Neil ShapiroBy using this file, you agree to the terms and conditions set
5345ef517c0SGregory Neil Shapiroforth in the LICENSE.
535d0cef73dSGregory Neil Shapiro</FONT>
536d0cef73dSGregory Neil Shapiro</BODY>
537d0cef73dSGregory Neil Shapiro</HTML>
538