Here's a patch to add "--accept-on-error/-A" as a command-line option
for clamav-milter.  Rather than tempfail we prefer to accept the
possibility of infect mail getting through rather than have all mail
be undeliverable.

Joe
--- ./clamav-milter/clamav-milter.c     2003-10-22 15:44:01.000000000 -0400
+++ ./clamav-milter/clamav-milter.c.working     2003-10-24 10:43:04.000000000 -0400
@@ -261,6 +261,7 @@
 static char            *strrcpy(char *dest, const char *source);
 
 static char    clamav_version[128];
+static int     cl_error = SMFIS_TEMPFAIL;
 static int     fflag = 0;      /* force a scan, whatever */
 static int     oflag = 0;      /* scan messages from our machine? */
 static int     lflag = 0;      /* scan messages from our site? */
@@ -314,6 +315,7 @@
        printf("\n\tclamav-milter version %s\n", CM_VERSION);
        puts("\tCopyright (C) 2003 Nigel Horne <[EMAIL PROTECTED]>\n");
 
+       puts("\t--accept-on-error\t\t-A\tOn error accept message rather than 
tempfail.");
        puts("\t--bounce\t\t-b\tSend a failure message to the sender.");
        puts("\t--config-file=FILE\t-c FILE\tRead configuration from FILE.");
        puts("\t--force-scan\tForce scan all messages (overrides (-o and -l).");
@@ -365,12 +367,15 @@
        for(;;) {
                int opt_index = 0;
 #ifdef CL_DEBUG
-               const char *args = "bc:flnopPqdhs:Vx:";
+               const char *args = "Abc:flnopPqdhs:Vx:";
 #else
-               const char *args = "bc:flnopPqdhs:V";
+               const char *args = "Abc:flnopPqdhs:V";
 #endif
                static struct option long_options[] = {
                        {
+                               "accept-on-error", 0, NULL, 'A'
+                       },
+                       {
                                "bounce", 0, NULL, 'b'
                        },
                        {
@@ -427,6 +432,9 @@
                        ret = long_options[opt_index].val;
 
                switch(ret) {
+                       case 'A':       /* accept on error */
+                               cl_error = SMFIS_ACCEPT;
+                               break;
                        case 'b':       /* bounce worms/viruses */
                                bflag++;
                                break;
@@ -764,7 +772,7 @@
                        if(regcomp(&reg, *possible, 0) != 0) {
                                if(use_syslog)
                                        syslog(LOG_ERR, "Couldn't parse local regexp");
-                               return SMFIS_TEMPFAIL;
+                               return cl_error;
                        }
 
                        rc = (regexec(&reg, remoteIP, 0, NULL, 0) == REG_NOMATCH) ? 0 
: 1;
@@ -897,11 +905,11 @@
 
                if((privdata->cmdSocket = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
                        perror("socket");
-                       return SMFIS_TEMPFAIL;
+                       return cl_error;
                }
                if(connect(privdata->cmdSocket, (struct sockaddr *)&server, 
sizeof(struct sockaddr_un)) < 0) {
                        perror(localSocket);
-                       return SMFIS_TEMPFAIL;
+                       return cl_error;
                }
        } else {
                struct sockaddr_in server;
@@ -913,11 +921,11 @@
 
                if((privdata->cmdSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
                        perror("socket");
-                       return SMFIS_TEMPFAIL;
+                       return cl_error;
                }
                if(connect(privdata->cmdSocket, (struct sockaddr *)&server, 
sizeof(struct sockaddr_in)) < 0) {
                        perror("connect");
-                       return SMFIS_TEMPFAIL;
+                       return cl_error;
                }
        }
 
@@ -930,7 +938,7 @@
                free(privdata);
                if(use_syslog)
                        syslog(LOG_ERR, "send failed to create socket");
-               return SMFIS_TEMPFAIL;
+               return cl_error;
        }
 
        shutdown(privdata->dataSocket, SHUT_RD);
@@ -942,7 +950,7 @@
                free(privdata);
                if(use_syslog)
                        syslog(LOG_ERR, "send failed to clamd");
-               return SMFIS_TEMPFAIL;
+               return cl_error;
        }
 
        shutdown(privdata->cmdSocket, SHUT_WR);
@@ -955,7 +963,7 @@
                free(privdata);
                if(use_syslog)
                        syslog(LOG_ERR, "recv failed from clamd getting PORT");
-               return SMFIS_TEMPFAIL;
+               return cl_error;
        }
        buf[nbytes] = '\0';
 #ifdef CL_DEBUG
@@ -972,7 +980,7 @@
                else
                        fprintf(stderr, "Expected port information from clamd, got 
'%s'\n",
                                buf);
-               return SMFIS_TEMPFAIL;
+               return cl_error;
        }
 
        memset((char *)&reply, 0, sizeof(struct sockaddr_in));
@@ -1005,7 +1013,7 @@
 #endif
                }
 
-               return SMFIS_TEMPFAIL;
+               return cl_error;
        }
 
        clamfi_send(privdata, 0, "From %s\n", argv[0]);
@@ -1014,7 +1022,7 @@
        privdata->from = strdup(argv[0]);
        privdata->to = NULL;
 
-       return (smfi_setpriv(ctx, privdata) == MI_SUCCESS) ? SMFIS_CONTINUE : 
SMFIS_TEMPFAIL;
+       return (smfi_setpriv(ctx, privdata) == MI_SUCCESS) ? SMFIS_CONTINUE : cl_error;
 }
 
 static sfsistat
@@ -1060,7 +1068,7 @@
 
        if(clamfi_send(privdata, 0, "%s: %s\n", headerf, headerv) < 0) {
                clamfi_cleanup(ctx);
-               return SMFIS_TEMPFAIL;
+               return cl_error;
        }
        return SMFIS_CONTINUE;
 }
@@ -1079,7 +1087,7 @@
 
        if(clamfi_send(privdata, 1, "\n") < 0) {
                clamfi_cleanup(ctx);
-               return SMFIS_TEMPFAIL;
+               return cl_error;
        }
 
        /*
@@ -1139,7 +1147,7 @@
 
        if(clamfi_send(privdata, len, (char *)bodyp) < 0) {
                clamfi_cleanup(ctx);
-               return SMFIS_TEMPFAIL;
+               return cl_error;
        }
        return SMFIS_CONTINUE;
 }
@@ -1295,7 +1303,7 @@
 
        clamfi_cleanup(ctx);
 
-       return SMFIS_TEMPFAIL;
+       return cl_error;
 }
 
 static sfsistat

Reply via email to