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