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 <sys/types.h> 2594c01205SGregory Neil Shapiro#include <sys/stat.h> 2694c01205SGregory Neil Shapiro#include <errno.h> 2740266059SGregory Neil Shapiro#include <stdio.h> 2840266059SGregory Neil Shapiro#include <stdlib.h> 2940266059SGregory Neil Shapiro#include <string.h> 3040266059SGregory Neil Shapiro#include <sysexits.h> 3140266059SGregory Neil Shapiro#include <unistd.h> 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->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->mlfi_helofrom != NULL) 11540266059SGregory Neil Shapiro free(priv->mlfi_helofrom); 11640266059SGregory Neil Shapiro priv->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->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->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->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->mlfi_fp, "Connect from %s (%s)\n\n", 15894c01205SGregory Neil Shapiro priv->mlfi_helofrom, priv->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->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 && rcptaddr != NULL && 19194c01205SGregory Neil Shapiro (strcasecmp(rcptaddr, reject) == 0)) 19294c01205SGregory Neil Shapiro { 19394c01205SGregory Neil Shapiro if (fprintf(priv->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->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->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->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->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->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->mlfi_fp != NULL && fclose(priv->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->mlfi_fname, strerror(errno)); 30640266059SGregory Neil Shapiro rstat = SMFIS_TEMPFAIL; 30740266059SGregory Neil Shapiro (void) unlink(priv->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) < 0) 31394c01205SGregory Neil Shapiro snprintf(host, sizeof host, "localhost"); 31440266059SGregory Neil Shapiro p = strrchr(priv->mlfi_fname, '/'); 31540266059SGregory Neil Shapiro if (p == NULL) 31640266059SGregory Neil Shapiro p = priv->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->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->mlfi_fname); 33640266059SGregory Neil Shapiro rstat = SMFIS_TEMPFAIL; 33740266059SGregory Neil Shapiro (void) unlink(priv->mlfi_fname); 33840266059SGregory Neil Shapiro } 33940266059SGregory Neil Shapiro 34040266059SGregory Neil Shapiro /* release private memory */ 34194c01205SGregory Neil Shapiro if (priv->mlfi_fname != NULL) 34240266059SGregory Neil Shapiro free(priv->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->mlfi_connectfrom != NULL) 35740266059SGregory Neil Shapiro free(priv->mlfi_connectfrom); 35894c01205SGregory Neil Shapiro if (priv->mlfi_helofrom != NULL) 35940266059SGregory Neil Shapiro free(priv->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