diff -u ../mimedefang-2.45/Changelog ../mimedefang-2.45-patched/Changelog
--- ../mimedefang-2.45/Changelog	Thu Sep 23 01:26:47 2004
+++ ../mimedefang-2.45-patched/Changelog	Thu Sep 30 14:41:02 2004
@@ -2,6 +2,10 @@
 *** NOTE INCOMPATIBILITY ** to see if anything has changed that will
 affect your filter.
 
+2004-09-30 Bill Maidment <bill@maidment.com.au>
+
+	* Added support for Command "csav" anti-virus.
+
 2004-09-22  David F. Skoll  <dfs@roaringpenguin.com>
 
 	* Version 2.45 RELEASED
diff -u ../mimedefang-2.45/README ../mimedefang-2.45-patched/README
--- ../mimedefang-2.45/README	Thu Sep 23 00:30:03 2004
+++ ../mimedefang-2.45-patched/README	Thu Sep 30 14:41:38 2004
@@ -233,6 +233,7 @@
   --disable-trend         Do not include support for Trend Filescanner/Interscan
   --disable-AvpLinux      Do not include support for AVP AvpLinux
   --disable-clamav        Do not include support for clamav
+  --disable-csav          Do not include support for Command Anti-Virus
   --disable-fsav          Do not include support for F-Secure Anti-Virus
   --disable-fprot         Do not include support for F-prot Anti-Virus
   --disable-sophie        Do not include support for Sophie
Common subdirectories: ../mimedefang-2.45/SpamAssassin and ../mimedefang-2.45-patched/SpamAssassin
diff -u ../mimedefang-2.45/configure ../mimedefang-2.45-patched/configure
--- ../mimedefang-2.45/configure	Thu Sep 23 00:51:46 2004
+++ ../mimedefang-2.45-patched/configure	Wed Sep 29 20:23:28 2004
@@ -308,7 +308,7 @@
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT AR INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA PERL PERLPREFIX PERLSITEPREFIX PERLVENDORPREFIX PERLINSTALLARCHLIB PERLINSTALLPRIVLIB PERLINSTALLBIN PERLINSTALLMAN1DIR PERLINSTALLMAN3DIR PERLINSTALLSCRIPT PERLINSTALLSITEARCH PERLINSTALLSITELIB PERLINSTALLDATA PERLINSTALLSITEDATA PERLINSTALLVENDORDATA PERLINSTALLCONF PERLINSTALLSITECONF PERLINSTALLVENDORCONF NM DEFANGUSER IP_HEADER CONFSUBDIR CLEANUP_DEFS SETLOGSOCK_UNIX HAVE_SPAM_ASSASSIN CPP EGREP USE_UNIX_SYSLOG USE_SYS_SYSLOG EMBPERLCFLAGS EMBPERLLDFLAGS EMBPERLLIBS EMBPERLOBJS EMBPERLDEFS MINCLUDE SPOOLDIR QDIR HBEDV VEXIRA NAI BDC SOPHOS TREND CLAMSCAN AVP AVP_KAVSCANNER AVP_KAVDAEMON AVP5 FSAV FPROT SOPHIE NVCC CLAMD TROPHIE LIBMILTER LIBSM SENDMAILPROG RM ENABLE_DEBUGGING PTHREAD_FLAG VERSION LIBS_WITHOUT_PTHREAD CONFDIR_EVAL LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT AR INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA PERL PERLPREFIX PERLSITEPREFIX PERLVENDORPREFIX PERLINSTALLARCHLIB PERLINSTALLPRIVLIB PERLINSTALLBIN PERLINSTALLMAN1DIR PERLINSTALLMAN3DIR PERLINSTALLSCRIPT PERLINSTALLSITEARCH PERLINSTALLSITELIB PERLINSTALLDATA PERLINSTALLSITEDATA PERLINSTALLVENDORDATA PERLINSTALLCONF PERLINSTALLSITECONF PERLINSTALLVENDORCONF NM DEFANGUSER IP_HEADER CONFSUBDIR CLEANUP_DEFS SETLOGSOCK_UNIX HAVE_SPAM_ASSASSIN CPP EGREP USE_UNIX_SYSLOG USE_SYS_SYSLOG EMBPERLCFLAGS EMBPERLLDFLAGS EMBPERLLIBS EMBPERLOBJS EMBPERLDEFS MINCLUDE SPOOLDIR QDIR HBEDV VEXIRA NAI BDC SOPHOS TREND CLAMSCAN AVP AVP_KAVSCANNER AVP_KAVDAEMON AVP5 CSAV FSAV FPROT SOPHIE NVCC CLAMD TROPHIE LIBMILTER LIBSM SENDMAILPROG RM ENABLE_DEBUGGING PTHREAD_FLAG VERSION LIBS_WITHOUT_PTHREAD CONFDIR_EVAL LIBOBJS LTLIBOBJS'
 ac_subst_files=''
 
 # Initialize some variables set by options.
@@ -857,6 +857,7 @@
   --disable-AvpLinux      Do not include support for AVP AvpLinux
   --disable-aveclient     Do not include support for AVP5 aveclient
   --disable-clamav        Do not include support for clamav
+  --disable-csav          Do not include support for CSAV Anti-Virus
   --disable-fsav          Do not include support for F-Secure Anti-Virus
   --disable-fprot         Do not include support for F-prot Anti-Virus
   --disable-sophie        Do not include support for Sophie
@@ -4904,6 +4905,13 @@
 else
   ac_cv_clamav=yes
 fi;
+# Check whether --enable-csav or --disable-csav was given.
+if test "${enable_csav+set}" = set; then
+  enableval="$enable_csav"
+  ac_cv_csav=$enableval
+else
+  ac_cv_csav=yes
+fi;
 # Check whether --enable-fsav or --disable-fsav was given.
 if test "${enable_fsav+set}" = set; then
   enableval="$enable_fsav"
@@ -5426,6 +5434,49 @@
 	AVP="$AVP_KAVSCANNER"
     fi
 
+    if test "$ac_cv_csav" = yes; then
+	# Extract the first word of "csav", so it can be a program name with args.
+set dummy csav; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_CSAV+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $CSAV in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_CSAV="$CSAV" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $ANTIVIR_PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_CSAV="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_path_CSAV" && ac_cv_path_CSAV="/bin/false"
+  ;;
+esac
+fi
+CSAV=$ac_cv_path_CSAV
+
+if test -n "$CSAV"; then
+  echo "$as_me:$LINENO: result: $CSAV" >&5
+echo "${ECHO_T}$CSAV" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    fi
+
     if test "$ac_cv_fsav" = yes; then
 	# Extract the first word of "fsav", so it can be a program name with args.
 set dummy fsav; ac_word=$2
@@ -5696,6 +5747,7 @@
 test -z "$AVP5" && AVP5=/bin/false
 test -z "$AVP_KAVDAEMON" && AVP_KAVDAEMON=/bin/false
 test -z "$AVP_KAVSCANNER" && AVP_KAVSCANNER=/bin/false
+test -z "$CSAV" && CSAV=/bin/false
 test -z "$FSAV" && FSAV=/bin/false
 test -z "$FPROT" && FPROT=/bin/false
 test -z "$SOPHIE" && SOPHIE=/bin/false
@@ -6654,6 +6706,7 @@
 s,@AVP_KAVSCANNER@,$AVP_KAVSCANNER,;t t
 s,@AVP_KAVDAEMON@,$AVP_KAVDAEMON,;t t
 s,@AVP5@,$AVP5,;t t
+s,@CSAV@,$CSAV,;t t
 s,@FSAV@,$FSAV,;t t
 s,@FPROT@,$FPROT,;t t
 s,@SOPHIE@,$SOPHIE,;t t
@@ -7238,6 +7291,17 @@
 	GOT_VIRUS_SCANNER=1
     fi
 
+    if test "$CSAV" = "/bin/false" ; then
+	if test "$ac_cv_csav" != "yes" ; then
+	    echo "CSAV     'csav'      NO (Disabled by configure command)"
+	else
+	    echo "CSAV     'csav'      NO (not found)"
+	fi
+    else
+	echo "CSAV     'csav'      YES - $CSAV"
+	GOT_VIRUS_SCANNER=1
+    fi
+
     if test "$FSAV" = "/bin/false" ; then
 	if test "$ac_cv_fsav" != "yes" ; then
 	    echo "FSAV     'fsav'      NO (Disabled by configure command)"
diff -u ../mimedefang-2.45/configure.in ../mimedefang-2.45-patched/configure.in
--- ../mimedefang-2.45/configure.in	Thu Sep 23 00:51:53 2004
+++ ../mimedefang-2.45-patched/configure.in	Wed Sep 29 20:23:31 2004
@@ -568,6 +568,10 @@
 	AVP="$AVP_KAVSCANNER"
     fi
 
+    if test "$ac_cv_csav" = yes; then
+	AC_PATH_PROG(CSAV,    csav, /bin/false, $ANTIVIR_PATH)
+    fi
+
     if test "$ac_cv_fsav" = yes; then
 	AC_PATH_PROG(FSAV,    fsav, /bin/false, $ANTIVIR_PATH)
     fi
@@ -604,6 +608,7 @@
 test -z "$AVP5" && AVP5=/bin/false
 test -z "$AVP_KAVDAEMON" && AVP_KAVDAEMON=/bin/false
 test -z "$AVP_KAVSCANNER" && AVP_KAVSCANNER=/bin/false
+test -z "$CSAV" && CSAV=/bin/false
 test -z "$FSAV" && FSAV=/bin/false
 test -z "$FPROT" && FPROT=/bin/false
 test -z "$SOPHIE" && SOPHIE=/bin/false
@@ -866,6 +871,17 @@
 	GOT_VIRUS_SCANNER=1
     fi
 
+    if test "$CSAV" = "/bin/false" ; then
+	if test "$ac_cv_csav" != "yes" ; then
+	    echo "CSAV     'csav'      NO (Disabled by configure command)"
+	else
+	    echo "CSAV     'csav'      NO (not found)"
+	fi
+    else
+	echo "CSAV     'csav'      YES - $CSAV"
+	GOT_VIRUS_SCANNER=1
+    fi
+
     if test "$FSAV" = "/bin/false" ; then
 	if test "$ac_cv_fsav" != "yes" ; then
 	    echo "FSAV     'fsav'      NO (Disabled by configure command)"
Common subdirectories: ../mimedefang-2.45/contrib and ../mimedefang-2.45-patched/contrib
Common subdirectories: ../mimedefang-2.45/examples and ../mimedefang-2.45-patched/examples
diff -u ../mimedefang-2.45/mimedefang-filter.5.in ../mimedefang-2.45-patched/mimedefang-filter.5.in
--- ../mimedefang-2.45/mimedefang-filter.5.in	Thu Sep 23 00:08:57 2004
+++ ../mimedefang-2.45-patched/mimedefang-filter.5.in	Thu Sep 30 14:39:21 2004
@@ -748,6 +748,9 @@
 $Features{"Virus:AVP5"} is the full path to Kaspersky "aveclient" if
 it is installed; 0 if it is not.
 
+$Features{"Virus:CSAV"} is the full path to Command csav if it is installed;
+0 if it is not.
+
 $Features{"Virus:FSAV"} is the full path to F-Secure fsav if it is installed;
 0 if it is not.
 
@@ -1715,6 +1718,8 @@
 .TP
 .B message_contains_virus_nvcc()
 .TP
+.B message_contains_virus_csav()
+.TP
 .B message_contains_virus_fsav()
 .TP
 .B message_contains_virus_hbedv()
@@ -1749,6 +1754,9 @@
 Bitdefender "bdc" - http://www.bitdefender.com/
 .TP
 .B fsav
+Command Anti-Virus - http://www.commandsoftware.com/
+.TP
+.B fsav
 F-Secure Anti-Virus - http://www.f-secure.com/
 .TP
 .B hbedv
@@ -1817,6 +1825,8 @@
 .TP
 .B entity_contains_virus_nvcc($entity)
 .TP
+.B entity_contains_virus_csav($entity)
+.TP
 .B entity_contains_virus_fsav($entity)
 .TP
 .B entity_contains_virus_hbedv($entity)
@@ -2212,6 +2222,10 @@
 
 .TP
 .B o
+Command csav (http://www.commandsoftware.com)
+
+.TP
+.B o
 F-Secure fsav (http://www.f-secure.com)
 
 .TP
diff -u ../mimedefang-2.45/mimedefang.pl.in ../mimedefang-2.45-patched/mimedefang.pl.in
--- ../mimedefang-2.45/mimedefang.pl.in	Wed Sep 22 11:50:35 2004
+++ ../mimedefang-2.45-patched/mimedefang.pl.in	Thu Sep 30 14:28:20 2004
@@ -115,6 +115,7 @@
 $Features{'Virus:SOPHOS'}   = ('@SOPHOS@' ne '/bin/false' ? '@SOPHOS@' : 0);
 $Features{'Virus:TREND'}    = ('@TREND@' ne '/bin/false' ? '@TREND@' : 0);
 $Features{'Virus:TROPHIE'}  = ('@TROPHIE@' ne '/bin/false' ? '@TROPHIE@' : 0);
+$Features{'Virus:CSAV'}     = ('@CSAV@' ne '/bin/false' ? '@CSAV@' : 0);
 
 $Features{'Path:SENDMAIL'}  = '@SENDMAILPROG@';
 $Features{'Path:QUARANTINEDIR'} = '@QDIR@';
@@ -2626,6 +2627,107 @@
 }
 
 #***********************************************************************
+# %PROCEDURE: entity_contains_virus_csav
+# %ARGUMENTS:
+#  entity -- a MIME entity
+# %RETURNS:
+#  1 if entity contains a virus as reported by Command Anti-Virus
+# %DESCRIPTION:
+#  Runs the Command Anti-Virus program. (http://www.commandsoftware.com)
+#***********************************************************************
+sub entity_contains_virus_csav ($) {
+
+    unless($Features{'Virus:CSAV'}) {
+	md_syslog('err', "$MsgID: Command Anti-Virus not installed on this system");
+	return (wantarray ? (1, 'not-installed', 'tempfail') : 1);
+    }
+
+    my($entity) = @_;
+    my($body) = $entity->bodyhandle;
+
+    if (!defined($body)) {
+	return (wantarray ? (0, 'ok', 'ok') : 0);
+    }
+
+    # Get filename
+    my($path) = $body->path;
+    if (!defined($path)) {
+	return (wantarray ? (999, 'swerr', 'tempfail') : 1);
+    }
+
+    # Run csav
+    my($code, $category, $action) =
+	run_virus_scanner($Features{'Virus:CSAV'} . " $path 2>&1");
+    if ($action ne 'proceed') {
+	return (wantarray ? ($code, $category, $action) : $code);
+    }
+
+    # csav return codes
+    return (wantarray ? interpret_csav_code($code) : $code);
+}
+
+#***********************************************************************
+# %PROCEDURE: message_contains_virus_csav
+# %ARGUMENTS:
+#  Nothing
+# %RETURNS:
+#  1 if any file in the working directory contains a virus
+# %DESCRIPTION:
+#  Runs the Command Anti-Virus program on the working directory
+#***********************************************************************
+sub message_contains_virus_csav () {
+
+    unless($Features{'Virus:CSAV'}) {
+	md_syslog('err', "$MsgID: Command Anti-Virus not installed on this system");
+	return (wantarray ? (1, 'not-installed', 'tempfail') : 1);
+    }
+
+    # Run csav
+    my($code, $category, $action) =
+	run_virus_scanner($Features{'Virus:CSAV'} . " ./Work 2>&1");
+    if ($action ne 'proceed') {
+	return (wantarray ? ($code, $category, $action) : $code);
+    }
+    # csav return codes
+    return (wantarray ? interpret_csav_code($code) : $code);
+}
+
+sub interpret_csav_code ($) {
+                            
+    my($code) = @_;
+    # OK
+    return ($code, 'ok', 'ok') if ($code == 50);
+
+    # Interrupted
+    return ($code, 'interrupted', 'tempfail') if ($code == 5);
+
+    # Out of memory
+    return ($code, 'swerr', 'tempfail') if ($code == 101);
+
+    # Suspicious files found
+    if ($code == 52) {
+	$VirusName = 'suspicious';
+	return ($code, 'suspicious', 'quarantine');
+    }
+
+    # Found a virus
+    if ($code == 51) {
+	$VirusName = $1 if ($CurrentVirusScannerMessage =~ m/infec.*\: (\S+)/i);
+	$VirusName = "unknown-CSAV-virus" if $VirusName eq "";
+	return ($code, 'virus', 'quarantine');
+    }
+
+    # Found a virus and disinfected
+    if ($code == 53) {
+	$VirusName = "unknown-CSAV-virus disinfected";
+	return ($code, 'virus', 'quarantine');
+    }
+
+    # Unknown exit code
+    return ($code, 'swerr', 'tempfail');
+}
+
+#***********************************************************************
 # %PROCEDURE: entity_contains_virus_fsav
 # %ARGUMENTS:
 #  entity -- a MIME entity
@@ -6480,6 +6582,11 @@
 	push @VirusScannerEntityRoutines, \&entity_contains_virus_fprot;
     }
 
+    if ($Features{'Virus:CSAV'}) {
+	push @VirusScannerMessageRoutines, \&message_contains_virus_csav;
+	push @VirusScannerEntityRoutines, \&entity_contains_virus_csav;
+    }
+
     if ($Features{'Virus:FSAV'}) {
 	push @VirusScannerMessageRoutines, \&message_contains_virus_fsav;
 	push @VirusScannerEntityRoutines, \&entity_contains_virus_fsav;
Common subdirectories: ../mimedefang-2.45/redhat and ../mimedefang-2.45-patched/redhat
Common subdirectories: ../mimedefang-2.45/tests and ../mimedefang-2.45-patched/tests
