diff -urN simscan-1.4.0/configure.in simscan-1.4.0-nod32/configure.in --- simscan-1.4.0/configure.in 2007-10-29 16:13:40.000000000 +0200 +++ simscan-1.4.0-nod32/configure.in 2009-04-28 11:44:40.000000000 +0300 @@ -92,6 +92,51 @@ esac #---------------------------------------------------------------------- +AC_ARG_ENABLE(eset, [ --enable-eset=y|n Turn on eset nod32 scanning. default yes.], + ENABLE_ESET="$enableval", + [ + ENABLE_ESET=yes + ] ) + +case $ENABLE_ESET in +1*|y*|Y*) + ENABLE_ESET=1 + AC_DEFINE([ENABLE_ESET], [], [enable eset nod32 scanning]) + + #---------------------------------------------------------------------- + + AC_MSG_CHECKING(whether we can locate the esets_cli program) + esets_cli="" + for f in /usr/local/bin/esets_cli /usr/bin/esets_cli /usr/pkg/bin/esets_cli + do + if test -f $f + then + esets_cli=$f + break + fi + done + + AC_ARG_ENABLE(esets_cli, + [ --enable-esets_cli=PATH Full path to esets_cli program.], + esets_cli="$enableval", + [ + if test "$esets_cli" = "" + then + AC_MSG_RESULT(no) + AC_MSG_ERROR([Unable to find your esets_cli program, specify --enable-esets_cli.]) + fi + ] + ) + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(ESET,"$esets_cli","esets_cli program") + VIRUSSCANNER=1 + ;; +*) + ENABLE_ESET=0 + ;; +esac + +#---------------------------------------------------------------------- AC_ARG_ENABLE(custom-smtp-reject, [ --enable-custom-smtp-reject=y|n Return smtp reject message with virus name.], ENABLE_CUSTOM_SMTP_REJECT="$enableval", @@ -524,6 +569,11 @@ ) #---------------------------------------------------------------------- + + + + +#---------------------------------------------------------------------- AC_ARG_ENABLE(ripmime, [ --enable-ripmime=PATH Full path to ripmime program.], ENABLE_RIPMIME="$enableval", @@ -758,6 +808,17 @@ ;; esac +case $ENABLE_ESET in + 1*|y*|Y*) + echo " esets_cli program = $esets_cli" + echo " eset nod32 scan = ON" + ;; + *) + echo " eset nod32 scan = OFF" + ;; +esac + + case $ENABLE_TROPHIE in 1*|y*|Y*) echo " trophie socket = $trophiesocket" diff -urN simscan-1.4.0/simscan.c simscan-1.4.0-nod32/simscan.c --- simscan-1.4.0/simscan.c 2007-10-29 16:15:05.000000000 +0200 +++ simscan-1.4.0-nod32/simscan.c 2009-04-28 13:59:00.000000000 +0300 @@ -170,6 +170,12 @@ int is_clam(char *clambuf); #endif +#ifdef ENABLE_ESET +/* NOD32 scanner */ +char *eset_arg[] = { "esets_cli", ".", NULL }; +int check_eset(); +#endif + /* Attachment scanning globals */ #ifdef ENABLE_ATTACH #define ATTACH_TOKENS " :\t\n\r" @@ -628,6 +634,35 @@ } #endif +#ifdef ENABLE_ESET + /* Run esets_cli, exit on errors */ + ret = check_eset(); + switch ( ret ) { + case -2: + if ( DebugFlag > 0 ) { fprintf(stderr, "simscan: esets disabled\n"); } + break; + case -1: + if ( DebugFlag > 0 ) { + fprintf(stderr, "simscan: fatal error executing esets_cli\n"); + } + exit_clean(EXIT_400); + break; + case 1: + case 2: + case 3: + FoundVirus=1; + if ( DebugFlag > 0 ) { + fprintf(stderr, "simscan: esets_cli detected a virus\n"); + } + break; + default: + if ( DebugFlag > 0 ) { + fprintf(stderr, "simscan: normal esets_cli return code: %d\n", ret); + } + break; + } + +#endif #ifdef VIRUSSCANNER /* check for viri, return error if found or a temporary problem */ if ( FoundVirus == 1 ) { @@ -2213,6 +2248,69 @@ #endif +#ifdef ENABLE_ESET +/* execute esets_cli virus scanner + 0 - no virus + 1 - defer + 2 - discard + 3 - reject + modified version of check_clam() + devane@gmail.com */ + +int check_eset() { + + int pid; + int rmstat; + int pim[2]; + + if ( DebugFlag > 0 ) { + fprintf(stderr, "simscan: calling esets_cli\n"); + } + + + if ( pipe(pim) == -1 ) { + perror("pipe"); + exit(EXIT_FAILURE); + } + + /* fork esets_cli */ + switch(pid = vfork()) { + case -1: + close(pim[0]); + close(pim[1]); + fprintf(stderr, "simscan: cannot vfork()"); + return(-1); + case 0: + close(pim[0]); + dup2(pim[1],1); + close(pim[1]); + execve(ESET, eset_arg, 0); + _exit(-1); + } + close(pim[1]); + dup2(pim[0],0); + close(pim[0]); + + /* wait for clamdscan to finish */ + if (waitpid(pid,&rmstat, 0) == -1) { + return(-1); + } + + /* check if the child died on a signal */ + if ( WIFSIGNALED(rmstat) ) return(-1); + + /* if it exited okay, return the status */ + if ( WIFEXITED(rmstat) ) { + return(WEXITSTATUS(rmstat)); + } + + /* should not reach here */ + fprintf(stderr, "simscan: hould not reach here\n"); + return(-1); +} + +#endif + #if HAVE_STRSEP!=1 char *strsep (char **pp, char *delim) {