xref: /freebsd/contrib/sendmail/libmilter/docs/sample.html (revision 94c01205742119acdf56dbbd22fc274e5e38cfd4)
140266059SGregory Neil Shapiro<html>
240266059SGregory Neil Shapiro<head><title>A Sample Filter</title></head>
340266059SGregory Neil Shapiro<body>
440266059SGregory Neil Shapiro<h1>A Sample Filter</h1>
540266059SGregory Neil Shapiro
640266059SGregory Neil ShapiroThe following sample logs each message to a separate temporary file,
740266059SGregory Neil Shapiroadds a recipient given with the -a flag, and rejects a disallowed
840266059SGregory Neil Shapirorecipient address given with the -r flag.  It recognizes the following
940266059SGregory Neil Shapirooptions:
1040266059SGregory Neil Shapiro<p>
1140266059SGregory Neil Shapiro<center>
1240266059SGregory Neil Shapiro<table border="1" cellpadding=2 cellspacing=1>
1340266059SGregory Neil Shapiro<tr><td><code>-p port</code></td><td>The port through which the MTA will connect to the filter.</td></tr>
1440266059SGregory Neil Shapiro<tr><td><code>-t sec</code></td><td>The timeout value.</td></tr>
1540266059SGregory Neil Shapiro<tr><td><code>-r addr</code></td><td>A recipient to reject.</td></tr>
1640266059SGregory Neil Shapiro<tr><td><code>-a addr</code></td><td>A recipient to add.</td></tr>
1740266059SGregory Neil Shapiro</table>
1840266059SGregory Neil Shapiro</center>
1940266059SGregory Neil Shapiro<hr>
2040266059SGregory Neil Shapiro<pre>
2194c01205SGregory Neil Shapiro#include &lt;sys/types.h&gt;
2294c01205SGregory Neil Shapiro#include &lt;sys/stat.h&gt;
2394c01205SGregory Neil Shapiro#include &lt;errno.h&gt;
2440266059SGregory Neil Shapiro#include &lt;stdio.h&gt;
2540266059SGregory Neil Shapiro#include &lt;stdlib.h&gt;
2640266059SGregory Neil Shapiro#include &lt;string.h&gt;
2740266059SGregory Neil Shapiro#include &lt;sysexits.h&gt;
2840266059SGregory Neil Shapiro#include &lt;unistd.h&gt;
2994c01205SGregory Neil Shapiro
3094c01205SGregory Neil Shapiro#include "libmilter/mfapi.h"
3194c01205SGregory Neil Shapiro
3240266059SGregory Neil Shapiro#ifndef bool
3394c01205SGregory Neil Shapiro# define bool	int
3440266059SGregory Neil Shapiro# define TRUE	1
3540266059SGregory Neil Shapiro# define FALSE	0
3694c01205SGregory Neil Shapiro#endif /* ! bool */
3740266059SGregory Neil Shapiro
3840266059SGregory Neil Shapiro
3940266059SGregory Neil Shapirostruct mlfiPriv
4040266059SGregory Neil Shapiro{
4140266059SGregory Neil Shapiro	char	*mlfi_fname;
4240266059SGregory Neil Shapiro	char	*mlfi_connectfrom;
4340266059SGregory Neil Shapiro	char	*mlfi_helofrom;
4440266059SGregory Neil Shapiro	FILE	*mlfi_fp;
4540266059SGregory Neil Shapiro};
4640266059SGregory Neil Shapiro
4740266059SGregory Neil Shapiro#define MLFIPRIV	((struct mlfiPriv *) <a href="smfi_getpriv.html">smfi_getpriv</a>(ctx))
4840266059SGregory Neil Shapiro
4940266059SGregory Neil Shapiroextern sfsistat		mlfi_cleanup(SMFICTX *, bool);
5094c01205SGregory Neil Shapiro
5140266059SGregory Neil Shapiro/* recipients to add and reject (set with -a and -r options) */
5294c01205SGregory Neil Shapirochar *add = NULL;
5394c01205SGregory Neil Shapirochar *reject = NULL;
5440266059SGregory Neil Shapiro
5540266059SGregory Neil Shapirosfsistat
5640266059SGregory Neil Shapiro<a href="xxfi_connect.html">mlfi_connect</a>(ctx, hostname, hostaddr)
5740266059SGregory Neil Shapiro	 SMFICTX *ctx;
5840266059SGregory Neil Shapiro	 char *hostname;
5940266059SGregory Neil Shapiro	 _SOCK_ADDR *hostaddr;
6040266059SGregory Neil Shapiro{
6140266059SGregory Neil Shapiro	struct mlfiPriv *priv;
6240266059SGregory Neil Shapiro	char *ident;
6340266059SGregory Neil Shapiro
6440266059SGregory Neil Shapiro	/* allocate some private memory */
6540266059SGregory Neil Shapiro	priv = malloc(sizeof *priv);
6640266059SGregory Neil Shapiro	if (priv == NULL)
6740266059SGregory Neil Shapiro	{
6840266059SGregory Neil Shapiro		/* can't accept this message right now */
6940266059SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
7040266059SGregory Neil Shapiro	}
7140266059SGregory Neil Shapiro	memset(priv, '\0', sizeof *priv);
7240266059SGregory Neil Shapiro
7340266059SGregory Neil Shapiro	/* save the private data */
7440266059SGregory Neil Shapiro	<a href="smfi_setpriv.html">smfi_setpriv</a>(ctx, priv);
7540266059SGregory Neil Shapiro
7640266059SGregory Neil Shapiro	ident = <a href="smfi_getsymval.html">smfi_getsymval</a>(ctx, "_");
7794c01205SGregory Neil Shapiro	if (ident == NULL)
7894c01205SGregory Neil Shapiro		ident = "???";
7994c01205SGregory Neil Shapiro	if ((priv-&gt;mlfi_connectfrom = strdup(ident)) == NULL)
8094c01205SGregory Neil Shapiro	{
8194c01205SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
8240266059SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
8340266059SGregory Neil Shapiro	}
8494c01205SGregory Neil Shapiro
8594c01205SGregory Neil Shapiro	/* continue processing */
8640266059SGregory Neil Shapiro	return SMFIS_CONTINUE;
8740266059SGregory Neil Shapiro}
8840266059SGregory Neil Shapiro
8940266059SGregory Neil Shapirosfsistat
9040266059SGregory Neil Shapiro<a href="xxfi_helo.html">mlfi_helo</a>(ctx, helohost)
9140266059SGregory Neil Shapiro	 SMFICTX *ctx;
9240266059SGregory Neil Shapiro	 char *helohost;
9340266059SGregory Neil Shapiro{
9494c01205SGregory Neil Shapiro	size_t len;
9540266059SGregory Neil Shapiro	char *tls;
9640266059SGregory Neil Shapiro	char *buf;
9740266059SGregory Neil Shapiro	struct mlfiPriv *priv = MLFIPRIV;
9894c01205SGregory Neil Shapiro
9940266059SGregory Neil Shapiro	tls = <a href="smfi_getsymval.html">smfi_getsymval</a>(ctx, "{tls_version}");
10094c01205SGregory Neil Shapiro	if (tls == NULL)
10194c01205SGregory Neil Shapiro		tls = "No TLS";
10294c01205SGregory Neil Shapiro	if (helohost == NULL)
10394c01205SGregory Neil Shapiro		helohost = "???";
10494c01205SGregory Neil Shapiro	len = strlen(tls) + strlen(helohost) + 3;
10594c01205SGregory Neil Shapiro	if ((buf = (char*) malloc(len)) == NULL)
10694c01205SGregory Neil Shapiro	{
10794c01205SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
10840266059SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
10940266059SGregory Neil Shapiro	}
11094c01205SGregory Neil Shapiro	snprintf(buf, len, "%s, %s", helohost, tls);
11194c01205SGregory Neil Shapiro	if (priv-&gt;mlfi_helofrom != NULL)
11240266059SGregory Neil Shapiro		free(priv-&gt;mlfi_helofrom);
11340266059SGregory Neil Shapiro	priv-&gt;mlfi_helofrom = buf;
11494c01205SGregory Neil Shapiro
11594c01205SGregory Neil Shapiro	/* continue processing */
11640266059SGregory Neil Shapiro	return SMFIS_CONTINUE;
11740266059SGregory Neil Shapiro}
11840266059SGregory Neil Shapiro
11940266059SGregory Neil Shapirosfsistat
12040266059SGregory Neil Shapiro<a href="xxfi_envfrom.html">mlfi_envfrom</a>(ctx, argv)
12140266059SGregory Neil Shapiro	 SMFICTX *ctx;
12240266059SGregory Neil Shapiro	 char **argv;
12340266059SGregory Neil Shapiro{
12440266059SGregory Neil Shapiro	struct mlfiPriv *priv = MLFIPRIV;
12540266059SGregory Neil Shapiro	char *mailaddr = <a href="smfi_getsymval.html">smfi_getsymval</a>(ctx, "{mail_addr}");
12640266059SGregory Neil Shapiro	int argc = 0;
12740266059SGregory Neil Shapiro
12840266059SGregory Neil Shapiro	/* open a file to store this message */
12994c01205SGregory Neil Shapiro	if ((priv-&gt;mlfi_fname = strdup("/tmp/msg.XXXXXX")) == NULL)
13094c01205SGregory Neil Shapiro	{
13194c01205SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
13240266059SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
13394c01205SGregory Neil Shapiro	}
13494c01205SGregory Neil Shapiro
13594c01205SGregory Neil Shapiro	if (mkstemp(priv-&gt;mlfi_fname) == -1)
13694c01205SGregory Neil Shapiro	{
13794c01205SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
13894c01205SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
13994c01205SGregory Neil Shapiro	}
14094c01205SGregory Neil Shapiro
14140266059SGregory Neil Shapiro	if ((priv-&gt;mlfi_fp = fopen(priv-&gt;mlfi_fname, "w+")) == NULL)
14240266059SGregory Neil Shapiro	{
14394c01205SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
14440266059SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
14540266059SGregory Neil Shapiro	}
14640266059SGregory Neil Shapiro
14740266059SGregory Neil Shapiro	/* count the arguments */
14894c01205SGregory Neil Shapiro	while (*argv++ != NULL)
14994c01205SGregory Neil Shapiro		++argc;
15094c01205SGregory Neil Shapiro
15140266059SGregory Neil Shapiro	/* log the connection information we stored earlier: */
15240266059SGregory Neil Shapiro	if (fprintf(priv-&gt;mlfi_fp, "Connect from %s (%s)\n\n",
15394c01205SGregory Neil Shapiro		    priv-&gt;mlfi_helofrom, priv-&gt;mlfi_connectfrom) == EOF)
15494c01205SGregory Neil Shapiro	{
15540266059SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
15640266059SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
15740266059SGregory Neil Shapiro	}
15840266059SGregory Neil Shapiro	/* log the sender */
15940266059SGregory Neil Shapiro	if (fprintf(priv-&gt;mlfi_fp, "FROM %s (%d argument%s)\n",
16040266059SGregory Neil Shapiro		    mailaddr ? mailaddr : "???", argc,
16194c01205SGregory Neil Shapiro		    (argc == 1) ? "" : "s") == EOF)
16294c01205SGregory Neil Shapiro	{
16340266059SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
16440266059SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
16540266059SGregory Neil Shapiro	}
16694c01205SGregory Neil Shapiro
16740266059SGregory Neil Shapiro	/* continue processing */
16840266059SGregory Neil Shapiro	return SMFIS_CONTINUE;
16940266059SGregory Neil Shapiro}
17040266059SGregory Neil Shapiro
17140266059SGregory Neil Shapirosfsistat
17240266059SGregory Neil Shapiro<a href="xxfi_envrcpt.html">mlfi_envrcpt</a>(ctx, argv)
17340266059SGregory Neil Shapiro	 SMFICTX *ctx;
17440266059SGregory Neil Shapiro	 char **argv;
17540266059SGregory Neil Shapiro{
17640266059SGregory Neil Shapiro	struct mlfiPriv *priv = MLFIPRIV;
17740266059SGregory Neil Shapiro	char *rcptaddr = <a href="smfi_getsymval.html">smfi_getsymval</a>(ctx, "{rcpt_addr}");
17840266059SGregory Neil Shapiro	int argc = 0;
17994c01205SGregory Neil Shapiro
18040266059SGregory Neil Shapiro	/* count the arguments */
18194c01205SGregory Neil Shapiro	while (*argv++ != NULL)
18294c01205SGregory Neil Shapiro		++argc;
18394c01205SGregory Neil Shapiro
18440266059SGregory Neil Shapiro	/* log this recipient */
18594c01205SGregory Neil Shapiro	if (reject != NULL && rcptaddr != NULL &&
18694c01205SGregory Neil Shapiro	    (strcasecmp(rcptaddr, reject) == 0))
18794c01205SGregory Neil Shapiro	{
18894c01205SGregory Neil Shapiro		if (fprintf(priv-&gt;mlfi_fp, "RCPT %s -- REJECTED\n",
18994c01205SGregory Neil Shapiro			    rcptaddr) == EOF)
19094c01205SGregory Neil Shapiro		{
19140266059SGregory Neil Shapiro			(void) mlfi_cleanup(ctx, FALSE);
19240266059SGregory Neil Shapiro			return SMFIS_TEMPFAIL;
19340266059SGregory Neil Shapiro		}
19440266059SGregory Neil Shapiro		return SMFIS_REJECT;
19540266059SGregory Neil Shapiro	}
19640266059SGregory Neil Shapiro	if (fprintf(priv-&gt;mlfi_fp, "RCPT %s (%d argument%s)\n",
19740266059SGregory Neil Shapiro		    rcptaddr ? rcptaddr : "???", argc,
19894c01205SGregory Neil Shapiro		    (argc == 1) ? "" : "s") == EOF)
19994c01205SGregory Neil Shapiro	{
20040266059SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
20140266059SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
20240266059SGregory Neil Shapiro	}
20394c01205SGregory Neil Shapiro
20440266059SGregory Neil Shapiro	/* continue processing */
20540266059SGregory Neil Shapiro	return SMFIS_CONTINUE;
20640266059SGregory Neil Shapiro}
20740266059SGregory Neil Shapiro
20840266059SGregory Neil Shapirosfsistat
20940266059SGregory Neil Shapiro<a href="xxfi_header.html">mlfi_header</a>(ctx, headerf, headerv)
21040266059SGregory Neil Shapiro	 SMFICTX *ctx;
21140266059SGregory Neil Shapiro	 char *headerf;
21240266059SGregory Neil Shapiro	 unsigned char *headerv;
21340266059SGregory Neil Shapiro{
21440266059SGregory Neil Shapiro	/* write the header to the log file */
21594c01205SGregory Neil Shapiro	if (fprintf(MLFIPRIV-&gt;mlfi_fp, "%s: %s\n", headerf, headerv) == EOF)
21694c01205SGregory Neil Shapiro	{
21794c01205SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
21894c01205SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
21994c01205SGregory Neil Shapiro	}
22040266059SGregory Neil Shapiro
22140266059SGregory Neil Shapiro	/* continue processing */
22240266059SGregory Neil Shapiro	return SMFIS_CONTINUE;
22340266059SGregory Neil Shapiro}
22440266059SGregory Neil Shapiro
22540266059SGregory Neil Shapirosfsistat
22640266059SGregory Neil Shapiro<a href="xxfi_eoh.html">mlfi_eoh</a>(ctx)
22740266059SGregory Neil Shapiro	 SMFICTX *ctx;
22840266059SGregory Neil Shapiro{
22940266059SGregory Neil Shapiro	/* output the blank line between the header and the body */
23094c01205SGregory Neil Shapiro	if (fprintf(MLFIPRIV-&gt;mlfi_fp, "\n") == EOF)
23194c01205SGregory Neil Shapiro	{
23294c01205SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
23394c01205SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
23494c01205SGregory Neil Shapiro	}
23540266059SGregory Neil Shapiro
23640266059SGregory Neil Shapiro	/* continue processing */
23740266059SGregory Neil Shapiro	return SMFIS_CONTINUE;
23840266059SGregory Neil Shapiro}
23940266059SGregory Neil Shapiro
24040266059SGregory Neil Shapirosfsistat
24140266059SGregory Neil Shapiro<a href="xxfi_body.html">mlfi_body</a>(ctx, bodyp, bodylen)
24240266059SGregory Neil Shapiro	 SMFICTX *ctx;
24340266059SGregory Neil Shapiro	 unsigned char *bodyp;
24440266059SGregory Neil Shapiro	 size_t bodylen;
24540266059SGregory Neil Shapiro{
24694c01205SGregory Neil Shapiro        struct mlfiPriv *priv = MLFIPRIV;
24794c01205SGregory Neil Shapiro
24840266059SGregory Neil Shapiro	/* output body block to log file */
24994c01205SGregory Neil Shapiro	if (fwrite(bodyp, bodylen, 1, priv-&gt;mlfi_fp) != 1)
25040266059SGregory Neil Shapiro	{
25140266059SGregory Neil Shapiro		/* write failed */
25294c01205SGregory Neil Shapiro		fprintf(stderr, "Couldn't write file %s: %s\n",
25394c01205SGregory Neil Shapiro			priv-&gt;mlfi_fname, strerror(errno));
25440266059SGregory Neil Shapiro		(void) mlfi_cleanup(ctx, FALSE);
25540266059SGregory Neil Shapiro		return SMFIS_TEMPFAIL;
25640266059SGregory Neil Shapiro	}
25740266059SGregory Neil Shapiro
25840266059SGregory Neil Shapiro	/* continue processing */
25940266059SGregory Neil Shapiro	return SMFIS_CONTINUE;
26040266059SGregory Neil Shapiro}
26140266059SGregory Neil Shapiro
26240266059SGregory Neil Shapirosfsistat
26340266059SGregory Neil Shapiro<a href="xxfi_eom.html">mlfi_eom</a>(ctx)
26440266059SGregory Neil Shapiro	 SMFICTX *ctx;
26540266059SGregory Neil Shapiro{
26640266059SGregory Neil Shapiro	bool ok = TRUE;
26794c01205SGregory Neil Shapiro
26840266059SGregory Neil Shapiro	/* change recipients, if requested */
26994c01205SGregory Neil Shapiro	if (add != NULL)
27094c01205SGregory Neil Shapiro		ok = (<a href="smfi_addrcpt.html">smfi_addrcpt</a>(ctx, add) == MI_SUCCESS);
27140266059SGregory Neil Shapiro	return mlfi_cleanup(ctx, ok);
27240266059SGregory Neil Shapiro}
27340266059SGregory Neil Shapiro
27440266059SGregory Neil Shapirosfsistat
27540266059SGregory Neil Shapiro<a href="xxfi_abort.html">mlfi_abort</a>(ctx)
27640266059SGregory Neil Shapiro	 SMFICTX *ctx;
27740266059SGregory Neil Shapiro{
27840266059SGregory Neil Shapiro	return mlfi_cleanup(ctx, FALSE);
27940266059SGregory Neil Shapiro}
28040266059SGregory Neil Shapiro
28140266059SGregory Neil Shapirosfsistat
28240266059SGregory Neil Shapiromlfi_cleanup(ctx, ok)
28340266059SGregory Neil Shapiro	 SMFICTX *ctx;
28440266059SGregory Neil Shapiro	 bool ok;
28540266059SGregory Neil Shapiro{
28640266059SGregory Neil Shapiro	sfsistat rstat = SMFIS_CONTINUE;
28740266059SGregory Neil Shapiro	struct mlfiPriv *priv = MLFIPRIV;
28840266059SGregory Neil Shapiro	char *p;
28940266059SGregory Neil Shapiro	char host[512];
29040266059SGregory Neil Shapiro	char hbuf[1024];
29140266059SGregory Neil Shapiro
29240266059SGregory Neil Shapiro	if (priv == NULL)
29340266059SGregory Neil Shapiro		return rstat;
29440266059SGregory Neil Shapiro
29540266059SGregory Neil Shapiro	/* close the archive file */
29640266059SGregory Neil Shapiro	if (priv-&gt;mlfi_fp != NULL && fclose(priv-&gt;mlfi_fp) == EOF)
29740266059SGregory Neil Shapiro	{
29840266059SGregory Neil Shapiro		/* failed; we have to wait until later */
29940266059SGregory Neil Shapiro		fprintf(stderr, "Couldn't close archive file %s: %s\n",
30040266059SGregory Neil Shapiro			priv-&gt;mlfi_fname, strerror(errno));
30140266059SGregory Neil Shapiro		rstat = SMFIS_TEMPFAIL;
30240266059SGregory Neil Shapiro		(void) unlink(priv-&gt;mlfi_fname);
30340266059SGregory Neil Shapiro	}
30440266059SGregory Neil Shapiro	else if (ok)
30540266059SGregory Neil Shapiro	{
30640266059SGregory Neil Shapiro		/* add a header to the message announcing our presence */
30740266059SGregory Neil Shapiro		if (gethostname(host, sizeof host) &lt; 0)
30894c01205SGregory Neil Shapiro			snprintf(host, sizeof host, "localhost");
30940266059SGregory Neil Shapiro		p = strrchr(priv-&gt;mlfi_fname, '/');
31040266059SGregory Neil Shapiro		if (p == NULL)
31140266059SGregory Neil Shapiro			p = priv-&gt;mlfi_fname;
31240266059SGregory Neil Shapiro		else
31340266059SGregory Neil Shapiro			p++;
31440266059SGregory Neil Shapiro		snprintf(hbuf, sizeof hbuf, "%s@%s", p, host);
31594c01205SGregory Neil Shapiro		if (<a href="smfi_addheader.html">smfi_addheader</a>(ctx, "X-Archived", hbuf) != MI_SUCCESS)
31694c01205SGregory Neil Shapiro		{
31794c01205SGregory Neil Shapiro			/* failed; we have to wait until later */
31894c01205SGregory Neil Shapiro			fprintf(stderr,
31994c01205SGregory Neil Shapiro				"Couldn't add header: X-Archived: %s\n",
32094c01205SGregory Neil Shapiro				hbuf);
32194c01205SGregory Neil Shapiro			ok = FALSE;
32294c01205SGregory Neil Shapiro			rstat = SMFIS_TEMPFAIL;
32394c01205SGregory Neil Shapiro			(void) unlink(priv-&gt;mlfi_fname);
32494c01205SGregory Neil Shapiro		}
32540266059SGregory Neil Shapiro	}
32640266059SGregory Neil Shapiro	else
32740266059SGregory Neil Shapiro	{
32840266059SGregory Neil Shapiro		/* message was aborted -- delete the archive file */
32940266059SGregory Neil Shapiro		fprintf(stderr, "Message aborted.  Removing %s\n",
33040266059SGregory Neil Shapiro			priv-&gt;mlfi_fname);
33140266059SGregory Neil Shapiro		rstat = SMFIS_TEMPFAIL;
33240266059SGregory Neil Shapiro		(void) unlink(priv-&gt;mlfi_fname);
33340266059SGregory Neil Shapiro	}
33440266059SGregory Neil Shapiro
33540266059SGregory Neil Shapiro	/* release private memory */
33694c01205SGregory Neil Shapiro	if (priv-&gt;mlfi_fname != NULL)
33740266059SGregory Neil Shapiro		free(priv-&gt;mlfi_fname);
33840266059SGregory Neil Shapiro
33940266059SGregory Neil Shapiro	/* return status */
34040266059SGregory Neil Shapiro	return rstat;
34140266059SGregory Neil Shapiro}
34240266059SGregory Neil Shapiro
34340266059SGregory Neil Shapirosfsistat
34440266059SGregory Neil Shapiro<a href="xxfi_close.html">mlfi_close</a>(ctx)
34540266059SGregory Neil Shapiro	 SMFICTX *ctx;
34640266059SGregory Neil Shapiro{
34740266059SGregory Neil Shapiro	struct mlfiPriv *priv = MLFIPRIV;
34894c01205SGregory Neil Shapiro
34994c01205SGregory Neil Shapiro	if (priv == NULL)
35094c01205SGregory Neil Shapiro		return SMFIS_CONTINUE;
35194c01205SGregory Neil Shapiro	if (priv-&gt;mlfi_connectfrom != NULL)
35240266059SGregory Neil Shapiro		free(priv-&gt;mlfi_connectfrom);
35394c01205SGregory Neil Shapiro	if (priv-&gt;mlfi_helofrom != NULL)
35440266059SGregory Neil Shapiro		free(priv-&gt;mlfi_helofrom);
35540266059SGregory Neil Shapiro	free(priv);
35640266059SGregory Neil Shapiro	<a href="smfi_setpriv.html">smfi_setpriv</a>(ctx, NULL);
35740266059SGregory Neil Shapiro	return SMFIS_CONTINUE;
35840266059SGregory Neil Shapiro}
35940266059SGregory Neil Shapiro
36040266059SGregory Neil Shapirostruct smfiDesc smfilter =
36140266059SGregory Neil Shapiro{
36240266059SGregory Neil Shapiro	"SampleFilter",	/* filter name */
36340266059SGregory Neil Shapiro	SMFI_VERSION,	/* version code -- do not change */
36440266059SGregory Neil Shapiro	SMFIF_ADDHDRS,	/* flags */
36540266059SGregory Neil Shapiro	<a href="xxfi_connect.html">mlfi_connect</a>,	/* connection info filter */
36640266059SGregory Neil Shapiro	<a href="xxfi_helo.html">mlfi_helo</a>,	/* SMTP HELO command filter */
36740266059SGregory Neil Shapiro	<a href="xxfi_envfrom.html">mlfi_envfrom</a>,	/* envelope sender filter */
36840266059SGregory Neil Shapiro	<a href="xxfi_envrcpt.html">mlfi_envrcpt</a>,	/* envelope recipient filter */
36940266059SGregory Neil Shapiro	<a href="xxfi_header.html">mlfi_header</a>,	/* header filter */
37040266059SGregory Neil Shapiro	<a href="xxfi_eoh.html">mlfi_eoh</a>,	/* end of header */
37140266059SGregory Neil Shapiro	<a href="xxfi_body.html">mlfi_body</a>,	/* body block filter */
37240266059SGregory Neil Shapiro	<a href="xxfi_eom.html">mlfi_eom</a>,	/* end of message */
37340266059SGregory Neil Shapiro	<a href="xxfi_abort.html">mlfi_abort</a>,	/* message aborted */
37440266059SGregory Neil Shapiro	<a href="xxfi_close.html">mlfi_close</a>,	/* connection cleanup */
37540266059SGregory Neil Shapiro};
37640266059SGregory Neil Shapiro
37740266059SGregory Neil Shapirostatic void
37894c01205SGregory Neil Shapirousage(prog)
37994c01205SGregory Neil Shapiro	char *prog;
38040266059SGregory Neil Shapiro{
38140266059SGregory Neil Shapiro	fprintf(stderr,
38294c01205SGregory Neil Shapiro		"Usage: %s [-p socket-addr] [-t timeout] [-r reject-addr] [-a add-addr]\n",
38394c01205SGregory Neil Shapiro		prog);
38440266059SGregory Neil Shapiro}
38540266059SGregory Neil Shapiro
38640266059SGregory Neil Shapiroint
38740266059SGregory Neil Shapiromain(argc, argv)
38840266059SGregory Neil Shapiro	 int argc;
38994c01205SGregory Neil Shapiro	 char **argv;
39040266059SGregory Neil Shapiro{
39194c01205SGregory Neil Shapiro	int c;
39240266059SGregory Neil Shapiro	const char *args = "p:t:r:a:h";
39340266059SGregory Neil Shapiro	extern char *optarg;
39440266059SGregory Neil Shapiro
39540266059SGregory Neil Shapiro	/* Process command line options */
39694c01205SGregory Neil Shapiro	while ((c = getopt(argc, argv, args)) != -1)
39740266059SGregory Neil Shapiro	{
39840266059SGregory Neil Shapiro		switch (c)
39940266059SGregory Neil Shapiro		{
40040266059SGregory Neil Shapiro		  case 'p':
40140266059SGregory Neil Shapiro			if (optarg == NULL || *optarg == '\0')
40240266059SGregory Neil Shapiro			{
40340266059SGregory Neil Shapiro				(void) fprintf(stderr, "Illegal conn: %s\n",
40440266059SGregory Neil Shapiro					       optarg);
40540266059SGregory Neil Shapiro				exit(EX_USAGE);
40640266059SGregory Neil Shapiro			}
40740266059SGregory Neil Shapiro			if (<a href="smfi_setconn.html">smfi_setconn</a>(optarg) == MI_FAILURE)
40840266059SGregory Neil Shapiro			{
40994c01205SGregory Neil Shapiro				(void) fprintf(stderr,
41094c01205SGregory Neil Shapiro					       "smfi_setconn failed\n");
41140266059SGregory Neil Shapiro				exit(EX_SOFTWARE);
41240266059SGregory Neil Shapiro			}
41394c01205SGregory Neil Shapiro
41440266059SGregory Neil Shapiro			/*
41594c01205SGregory Neil Shapiro			**  If we're using a local socket, make sure it
41694c01205SGregory Neil Shapiro			**  doesn't already exist.  Don't ever run this
41794c01205SGregory Neil Shapiro			**  code as root!!
41840266059SGregory Neil Shapiro			*/
41994c01205SGregory Neil Shapiro
42094c01205SGregory Neil Shapiro			if (strncasecmp(optarg, "unix:", 5) == 0)
42140266059SGregory Neil Shapiro				unlink(optarg + 5);
42294c01205SGregory Neil Shapiro			else if (strncasecmp(optarg, "local:", 6) == 0)
42340266059SGregory Neil Shapiro				unlink(optarg + 6);
42440266059SGregory Neil Shapiro			break;
42540266059SGregory Neil Shapiro
42640266059SGregory Neil Shapiro		  case 't':
42740266059SGregory Neil Shapiro			if (optarg == NULL || *optarg == '\0')
42840266059SGregory Neil Shapiro			{
42940266059SGregory Neil Shapiro				(void) fprintf(stderr, "Illegal timeout: %s\n",
43040266059SGregory Neil Shapiro					       optarg);
43140266059SGregory Neil Shapiro				exit(EX_USAGE);
43240266059SGregory Neil Shapiro			}
43340266059SGregory Neil Shapiro			if (<a href="smfi_settimeout.html">smfi_settimeout</a>(atoi(optarg)) == MI_FAILURE)
43440266059SGregory Neil Shapiro			{
43594c01205SGregory Neil Shapiro				(void) fprintf(stderr,
43694c01205SGregory Neil Shapiro					       "smfi_settimeout failed\n");
43740266059SGregory Neil Shapiro				exit(EX_SOFTWARE);
43840266059SGregory Neil Shapiro			}
43940266059SGregory Neil Shapiro			break;
44040266059SGregory Neil Shapiro
44140266059SGregory Neil Shapiro		  case 'r':
44240266059SGregory Neil Shapiro			if (optarg == NULL)
44340266059SGregory Neil Shapiro			{
44494c01205SGregory Neil Shapiro				(void) fprintf(stderr,
44594c01205SGregory Neil Shapiro					       "Illegal reject rcpt: %s\n",
44640266059SGregory Neil Shapiro					       optarg);
44740266059SGregory Neil Shapiro				exit(EX_USAGE);
44840266059SGregory Neil Shapiro			}
44940266059SGregory Neil Shapiro			reject = optarg;
45040266059SGregory Neil Shapiro			break;
45140266059SGregory Neil Shapiro
45240266059SGregory Neil Shapiro		  case 'a':
45340266059SGregory Neil Shapiro			if (optarg == NULL)
45440266059SGregory Neil Shapiro			{
45594c01205SGregory Neil Shapiro				(void) fprintf(stderr,
45694c01205SGregory Neil Shapiro					       "Illegal add rcpt: %s\n",
45740266059SGregory Neil Shapiro					       optarg);
45840266059SGregory Neil Shapiro				exit(EX_USAGE);
45940266059SGregory Neil Shapiro			}
46040266059SGregory Neil Shapiro			add = optarg;
46140266059SGregory Neil Shapiro			smfilter.xxfi_flags |= SMFIF_ADDRCPT;
46240266059SGregory Neil Shapiro			break;
46394c01205SGregory Neil Shapiro
46440266059SGregory Neil Shapiro		  case 'h':
46540266059SGregory Neil Shapiro		  default:
46694c01205SGregory Neil Shapiro			usage(argv[0]);
46794c01205SGregory Neil Shapiro			exit(EX_USAGE);
46840266059SGregory Neil Shapiro		}
46940266059SGregory Neil Shapiro	}
47040266059SGregory Neil Shapiro	if (<a href="smfi_register.html">smfi_register</a>(smfilter) == MI_FAILURE)
47140266059SGregory Neil Shapiro	{
47240266059SGregory Neil Shapiro		fprintf(stderr, "smfi_register failed\n");
47340266059SGregory Neil Shapiro		exit(EX_UNAVAILABLE);
47440266059SGregory Neil Shapiro	}
47594c01205SGregory Neil Shapiro	return <a href="smfi_main.html">smfi_main</a>();
47640266059SGregory Neil Shapiro}
47740266059SGregory Neil Shapiro
47840266059SGregory Neil Shapiro/* eof */
47940266059SGregory Neil Shapiro
48040266059SGregory Neil Shapiro</pre>
48140266059SGregory Neil Shapiro<hr size="1">
48240266059SGregory Neil Shapiro<font size="-1">
48394c01205SGregory Neil ShapiroCopyright (c) 2000-2002 Sendmail, Inc. and its suppliers.
48440266059SGregory Neil ShapiroAll rights reserved.
48540266059SGregory Neil Shapiro<br>
48640266059SGregory Neil ShapiroBy using this file, you agree to the terms and conditions set
48740266059SGregory Neil Shapiroforth in the <a href="LICENSE.txt">LICENSE</a>.
48840266059SGregory Neil Shapiro</font>
48940266059SGregory Neil Shapiro</body>
49040266059SGregory Neil Shapiro</html>
491