#include "mfapi.h"  /* Milter-API  */
#include <stdio.h>  /* for fprintf */
#include <unistd.h> /* for getopt  */

/* Cleanup function */
extern sfsistat mlfi_cleanup(SMFICTX *, sfsistat);

/* End of message callback */
sfsistat mlfi_eom(SMFICTX *ctx)
{
       /* Remove Header, ignore any errors */
       smfi_chgheader(ctx, "Disposition-Notification-To", 1, NULL);

       /* Continue processing, accept mail in any case. */
       return mlfi_cleanup(ctx, SMFIS_ACCEPT);
}

/* Do cleanup, if any. */
sfsistat mlfi_cleanup(SMFICTX *ctx, sfsistat rc)
{
       return(rc);
}

/* Milter control block (1st three entries) and function table */
struct smfiDesc smfilter =
{
       "HeaderBuster",     /* filter name               */
       SMFI_VERSION,       /* version code              */
       SMFIF_CHGHDRS,      /* flags                     */
       NULL,               /* connection info filter    */
       NULL,               /* SMTP HELO command filter  */
       NULL,               /* envelope sender filter    */
       NULL,               /* envelope recipient filter */
       NULL,               /* header filter             */
       NULL,               /* end of header             */
       NULL,               /* body block filter         */
       mlfi_eom,           /* end of message            */
       NULL,               /* message aborted           */
       NULL                /* connection cleanup        */
};

int main(int argc, char *argv[])
{
   int c;
   const char *args = "p:";

   /* Process command line options */
   while ((c = getopt(argc, argv, args)) != -1) {
       switch (c) {
       case 'p':
           if (optarg == NULL || *optarg == '\0') {
               fprintf(stderr, "Illegal connection string: %s\n", optarg);
               exit(0);
           }

           /* Set the protocol */
           smfi_setconn(optarg);
           break;

       }
   }

   /* Register callbacks */
   if (smfi_register(smfilter) == MI_FAILURE) {
       fprintf(stderr, "smfi_register failed\n");
       exit(-1);
   }

   /* Become background process and hand over control
    * to milter by calling smfi_main()
    */
   if (fork() == 0) {
       return smfi_main();
   }

   /* Parent process exit */
   return 0;
}