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 <sys/types.h> 2294c01205SGregory Neil Shapiro#include <sys/stat.h> 2394c01205SGregory Neil Shapiro#include <errno.h> 2440266059SGregory Neil Shapiro#include <stdio.h> 2540266059SGregory Neil Shapiro#include <stdlib.h> 2640266059SGregory Neil Shapiro#include <string.h> 2740266059SGregory Neil Shapiro#include <sysexits.h> 2840266059SGregory Neil Shapiro#include <unistd.h> 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->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->mlfi_helofrom != NULL) 11240266059SGregory Neil Shapiro free(priv->mlfi_helofrom); 11340266059SGregory Neil Shapiro priv->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->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->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->mlfi_fp = fopen(priv->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->mlfi_fp, "Connect from %s (%s)\n\n", 15394c01205SGregory Neil Shapiro priv->mlfi_helofrom, priv->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->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->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->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->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->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->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->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->mlfi_fp != NULL && fclose(priv->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->mlfi_fname, strerror(errno)); 30140266059SGregory Neil Shapiro rstat = SMFIS_TEMPFAIL; 30240266059SGregory Neil Shapiro (void) unlink(priv->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) < 0) 30894c01205SGregory Neil Shapiro snprintf(host, sizeof host, "localhost"); 30940266059SGregory Neil Shapiro p = strrchr(priv->mlfi_fname, '/'); 31040266059SGregory Neil Shapiro if (p == NULL) 31140266059SGregory Neil Shapiro p = priv->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->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->mlfi_fname); 33140266059SGregory Neil Shapiro rstat = SMFIS_TEMPFAIL; 33240266059SGregory Neil Shapiro (void) unlink(priv->mlfi_fname); 33340266059SGregory Neil Shapiro } 33440266059SGregory Neil Shapiro 33540266059SGregory Neil Shapiro /* release private memory */ 33694c01205SGregory Neil Shapiro if (priv->mlfi_fname != NULL) 33740266059SGregory Neil Shapiro free(priv->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->mlfi_connectfrom != NULL) 35240266059SGregory Neil Shapiro free(priv->mlfi_connectfrom); 35394c01205SGregory Neil Shapiro if (priv->mlfi_helofrom != NULL) 35440266059SGregory Neil Shapiro free(priv->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